diff --git a/dist/@testing-library/jest-dom.js b/dist/@testing-library/jest-dom.js index b3847b1..5652257 100644 --- a/dist/@testing-library/jest-dom.js +++ b/dist/@testing-library/jest-dom.js @@ -85,5 +85,5 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function T2(e,t){var r=e==null?null:typeof Symbol!="undefined"&&e[Symbol.iterator]||e["@@iterator"];if(r!=null){var a=[],n=!0,i=!1,l,s;try{for(r=r.call(e);!(n=(l=r.next()).done)&&(a.push(l.value),!(t&&a.length===t));n=!0);}catch(u){i=!0,s=u}finally{try{!n&&r.return!=null&&r.return()}finally{if(i)throw s}}return a}}function A2(e){if(Array.isArray(e))return e}function S2(e,t){var r=typeof Symbol!="undefined"&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=nb(e))||t&&e&&typeof e.length=="number"){r&&(e=r);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(c){throw c},f:n}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i=!0,l=!1,s;return{s:function(){r=r.call(e)},n:function(){var c=r.next();return i=c.done,c},e:function(c){l=!0,s=c},f:function(){try{!i&&r.return!=null&&r.return()}finally{if(l)throw s}}}}function nb(e,t){if(!!e){if(typeof e=="string")return ib(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return ib(e,t)}}function ib(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,a=new Array(t);r0&&re.push([Ui,nn])}var Ui,an,nn,Gi,zi,Wi,sn,Ki={entries:function(){return re},forEach:function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,a=S2(re),n;try{for(a.s();!(n=a.n()).done;){var i=Vi(n.value,2),l=i[0],s=i[1];t.call(r,s,l,re)}}catch(u){a.e(u)}finally{a.f()}},get:function(t){var r=re.find(function(a){return a[0]===t});return r&&r[1]},has:function(t){return!!Ki.get(t)},keys:function(){return re.map(function(t){var r=Vi(t,1),a=r[0];return a})},values:function(){return re.map(function(t){var r=Vi(t,2),a=r[1];return a})}},j2=(0,O2.default)(Ki,Ki.entries());on.default=j2});var lb=o($=>{"use strict";Object.defineProperty($,"__esModule",{value:!0});$.roles=$.roleElements=$.elementRoles=$.dom=$.aria=void 0;var H2=De(sp()),N2=De(up()),k2=De(Qa()),L2=De(tb()),I2=De(ob());function De(e){return e&&e.__esModule?e:{default:e}}var B2=H2.default;$.aria=B2;var F2=N2.default;$.dom=F2;var D2=k2.default;$.roles=D2;var V2=L2.default;$.elementRoles=V2;var $2=I2.default;$.roleElements=$2});var fb=o(Xi=>{"use strict";Object.defineProperty(Xi,"__esModule",{value:!0});Xi.toBeChecked=db;var ub=lb(),cb=j();function db(e){(0,cb.checkHtmlElement)(e,db,this);let t=()=>e.tagName.toLowerCase()==="input"&&["checkbox","radio"].includes(e.type),r=()=>pb(e.getAttribute("role"))&&["true","false"].includes(e.getAttribute("aria-checked"));if(!t()&&!r())return{pass:!1,message:()=>`only inputs with type="checkbox" or type="radio" or elements with ${U2()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`};let a=()=>t()?e.checked:e.getAttribute("aria-checked")==="true";return{pass:a(),message:()=>{let n=a()?"is":"is not";return[this.utils.matcherHint(`${this.isNot?".not":""}.toBeChecked`,"element",""),"",`Received element ${n} checked:`,` ${this.utils.printReceived(e.cloneNode(!1))}`].join(` `)}}}function U2(){return(0,cb.toSentence)(G2().map(e=>`role="${e}"`),{lastWordConnector:" or "})}function G2(){return ub.roles.keys().filter(pb)}function pb(e){var t;return((t=ub.roles.get(e))==null?void 0:t.props["aria-checked"])!==void 0}});var bb=o(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.toBePartiallyChecked=mb;var z2=j();function mb(e){(0,z2.checkHtmlElement)(e,mb,this);let t=()=>e.tagName.toLowerCase()==="input"&&e.type==="checkbox",r=()=>e.getAttribute("role")==="checkbox";if(!t()&&!r())return{pass:!1,message:()=>'only inputs with type="checkbox" or elements with role="checkbox" and a valid aria-checked attribute can be used with .toBePartiallyChecked(). Use .toHaveValue() instead'};let a=()=>{let n=e.getAttribute("aria-checked")==="mixed";return t()&&e.indeterminate||n};return{pass:a(),message:()=>{let n=a()?"is":"is not";return[this.utils.matcherHint(`${this.isNot?".not":""}.toBePartiallyChecked`,"element",""),"",`Received element ${n} partially checked:`,` ${this.utils.printReceived(e.cloneNode(!1))}`].join(` -`)}}}});var vb=o(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.toHaveDescription=hb;var ln=j();function hb(e,t){(0,ln.deprecate)("toHaveDescription","Please use toHaveAccessibleDescription."),(0,ln.checkHtmlElement)(e,hb,this);let r=t!==void 0,n=(e.getAttribute("aria-describedby")||"").split(/\s+/).filter(Boolean),i="";if(n.length>0){let l=e.ownerDocument,s=n.map(u=>l.getElementById(u)).filter(Boolean);i=(0,ln.normalize)(s.map(u=>u.textContent).join(" "))}return{pass:r?t instanceof RegExp?t.test(i):this.equals(i,t):Boolean(i),message:()=>{let l=this.isNot?"not to":"to";return(0,ln.getMessage)(this,this.utils.matcherHint(`${this.isNot?".not":""}.toHaveDescription`,"element",""),`Expected the element ${l} have description`,this.utils.printExpected(t),"Received",this.utils.printReceived(i))}}}});var gb=o(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.toHaveErrorMessage=yb;var un=j();function yb(e,t){if((0,un.checkHtmlElement)(e,yb,this),!e.hasAttribute("aria-invalid")||e.getAttribute("aria-invalid")==="false"){let l=this.isNot?".not":"";return{pass:!1,message:()=>(0,un.getMessage)(this,this.utils.matcherHint(`${l}.toHaveErrorMessage`,"element",""),"Expected the element to have invalid state indicated by",'aria-invalid="true"',"Received",e.hasAttribute("aria-invalid")?`aria-invalid="${e.getAttribute("aria-invalid")}"`:this.utils.printReceived(""))}}let r=t!==void 0,n=(e.getAttribute("aria-errormessage")||"").split(/\s+/).filter(Boolean),i="";if(n.length>0){let l=e.ownerDocument,s=n.map(u=>l.getElementById(u)).filter(Boolean);i=(0,un.normalize)(s.map(u=>u.textContent).join(" "))}return{pass:r?t instanceof RegExp?t.test(i):this.equals(i,t):Boolean(i),message:()=>{let l=this.isNot?"not to":"to";return(0,un.getMessage)(this,this.utils.matcherHint(`${this.isNot?".not":""}.toHaveErrorMessage`,"element",""),`Expected the element ${l} have error message`,this.utils.printExpected(t),"Received",this.utils.printReceived(i))}}}});var Rb=o(M=>{"use strict";Object.defineProperty(M,"__esModule",{value:!0});Object.defineProperty(M,"toBeChecked",{enumerable:!0,get:function(){return dT.toBeChecked}});Object.defineProperty(M,"toBeDisabled",{enumerable:!0,get:function(){return _b.toBeDisabled}});Object.defineProperty(M,"toBeEmpty",{enumerable:!0,get:function(){return X2.toBeEmpty}});Object.defineProperty(M,"toBeEmptyDOMElement",{enumerable:!0,get:function(){return Y2.toBeEmptyDOMElement}});Object.defineProperty(M,"toBeEnabled",{enumerable:!0,get:function(){return _b.toBeEnabled}});Object.defineProperty(M,"toBeInTheDOM",{enumerable:!0,get:function(){return W2.toBeInTheDOM}});Object.defineProperty(M,"toBeInTheDocument",{enumerable:!0,get:function(){return K2.toBeInTheDocument}});Object.defineProperty(M,"toBeInvalid",{enumerable:!0,get:function(){return qb.toBeInvalid}});Object.defineProperty(M,"toBePartiallyChecked",{enumerable:!0,get:function(){return pT.toBePartiallyChecked}});Object.defineProperty(M,"toBeRequired",{enumerable:!0,get:function(){return lT.toBeRequired}});Object.defineProperty(M,"toBeValid",{enumerable:!0,get:function(){return qb.toBeValid}});Object.defineProperty(M,"toBeVisible",{enumerable:!0,get:function(){return oT.toBeVisible}});Object.defineProperty(M,"toContainElement",{enumerable:!0,get:function(){return J2.toContainElement}});Object.defineProperty(M,"toContainHTML",{enumerable:!0,get:function(){return Q2.toContainHTML}});Object.defineProperty(M,"toHaveAccessibleDescription",{enumerable:!0,get:function(){return eT.toHaveAccessibleDescription}});Object.defineProperty(M,"toHaveAccessibleName",{enumerable:!0,get:function(){return tT.toHaveAccessibleName}});Object.defineProperty(M,"toHaveAttribute",{enumerable:!0,get:function(){return rT.toHaveAttribute}});Object.defineProperty(M,"toHaveClass",{enumerable:!0,get:function(){return aT.toHaveClass}});Object.defineProperty(M,"toHaveDescription",{enumerable:!0,get:function(){return fT.toHaveDescription}});Object.defineProperty(M,"toHaveDisplayValue",{enumerable:!0,get:function(){return cT.toHaveDisplayValue}});Object.defineProperty(M,"toHaveErrorMessage",{enumerable:!0,get:function(){return mT.toHaveErrorMessage}});Object.defineProperty(M,"toHaveFocus",{enumerable:!0,get:function(){return iT.toHaveFocus}});Object.defineProperty(M,"toHaveFormValues",{enumerable:!0,get:function(){return sT.toHaveFormValues}});Object.defineProperty(M,"toHaveStyle",{enumerable:!0,get:function(){return nT.toHaveStyle}});Object.defineProperty(M,"toHaveTextContent",{enumerable:!0,get:function(){return Z2.toHaveTextContent}});Object.defineProperty(M,"toHaveValue",{enumerable:!0,get:function(){return uT.toHaveValue}});var W2=Lu(),K2=Bu(),X2=Vu(),Y2=Uu(),J2=zu(),Q2=Ku(),Z2=Yu(),eT=yc(),tT=_c(),rT=Pc(),aT=Oc(),nT=sd(),iT=ld(),sT=Nd(),oT=Id(),_b=Gd(),lT=Wd(),qb=Jd(),uT=Zd(),cT=rp(),dT=fb(),pT=bb(),fT=vb(),mT=gb()});var Pb=o(()=>{"use strict";var bT=hT(Rb());function Cb(e){if(typeof WeakMap!="function")return null;var t=new WeakMap,r=new WeakMap;return(Cb=function(a){return a?r:t})(e)}function hT(e,t){if(!t&&e&&e.__esModule)return e;if(e===null||typeof e!="object"&&typeof e!="function")return{default:e};var r=Cb(t);if(r&&r.has(e))return r.get(e);var a={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(i!=="default"&&Object.prototype.hasOwnProperty.call(e,i)){var l=n?Object.getOwnPropertyDescriptor(e,i):null;l&&(l.get||l.set)?Object.defineProperty(a,i,l):a[i]=e[i]}return a.default=e,r&&r.set(e,a),a}window.jestLite?.core.expect.extend(bT)});"use strict";Pb(); +`)}}}});var vb=o(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.toHaveDescription=hb;var ln=j();function hb(e,t){(0,ln.deprecate)("toHaveDescription","Please use toHaveAccessibleDescription."),(0,ln.checkHtmlElement)(e,hb,this);let r=t!==void 0,n=(e.getAttribute("aria-describedby")||"").split(/\s+/).filter(Boolean),i="";if(n.length>0){let l=e.ownerDocument,s=n.map(u=>l.getElementById(u)).filter(Boolean);i=(0,ln.normalize)(s.map(u=>u.textContent).join(" "))}return{pass:r?t instanceof RegExp?t.test(i):this.equals(i,t):Boolean(i),message:()=>{let l=this.isNot?"not to":"to";return(0,ln.getMessage)(this,this.utils.matcherHint(`${this.isNot?".not":""}.toHaveDescription`,"element",""),`Expected the element ${l} have description`,this.utils.printExpected(t),"Received",this.utils.printReceived(i))}}}});var gb=o(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.toHaveErrorMessage=yb;var un=j();function yb(e,t){if((0,un.checkHtmlElement)(e,yb,this),!e.hasAttribute("aria-invalid")||e.getAttribute("aria-invalid")==="false"){let l=this.isNot?".not":"";return{pass:!1,message:()=>(0,un.getMessage)(this,this.utils.matcherHint(`${l}.toHaveErrorMessage`,"element",""),"Expected the element to have invalid state indicated by",'aria-invalid="true"',"Received",e.hasAttribute("aria-invalid")?`aria-invalid="${e.getAttribute("aria-invalid")}"`:this.utils.printReceived(""))}}let r=t!==void 0,n=(e.getAttribute("aria-errormessage")||"").split(/\s+/).filter(Boolean),i="";if(n.length>0){let l=e.ownerDocument,s=n.map(u=>l.getElementById(u)).filter(Boolean);i=(0,un.normalize)(s.map(u=>u.textContent).join(" "))}return{pass:r?t instanceof RegExp?t.test(i):this.equals(i,t):Boolean(i),message:()=>{let l=this.isNot?"not to":"to";return(0,un.getMessage)(this,this.utils.matcherHint(`${this.isNot?".not":""}.toHaveErrorMessage`,"element",""),`Expected the element ${l} have error message`,this.utils.printExpected(t),"Received",this.utils.printReceived(i))}}}});var Rb=o(M=>{"use strict";Object.defineProperty(M,"__esModule",{value:!0});Object.defineProperty(M,"toBeChecked",{enumerable:!0,get:function(){return dT.toBeChecked}});Object.defineProperty(M,"toBeDisabled",{enumerable:!0,get:function(){return _b.toBeDisabled}});Object.defineProperty(M,"toBeEmpty",{enumerable:!0,get:function(){return X2.toBeEmpty}});Object.defineProperty(M,"toBeEmptyDOMElement",{enumerable:!0,get:function(){return Y2.toBeEmptyDOMElement}});Object.defineProperty(M,"toBeEnabled",{enumerable:!0,get:function(){return _b.toBeEnabled}});Object.defineProperty(M,"toBeInTheDOM",{enumerable:!0,get:function(){return W2.toBeInTheDOM}});Object.defineProperty(M,"toBeInTheDocument",{enumerable:!0,get:function(){return K2.toBeInTheDocument}});Object.defineProperty(M,"toBeInvalid",{enumerable:!0,get:function(){return qb.toBeInvalid}});Object.defineProperty(M,"toBePartiallyChecked",{enumerable:!0,get:function(){return pT.toBePartiallyChecked}});Object.defineProperty(M,"toBeRequired",{enumerable:!0,get:function(){return lT.toBeRequired}});Object.defineProperty(M,"toBeValid",{enumerable:!0,get:function(){return qb.toBeValid}});Object.defineProperty(M,"toBeVisible",{enumerable:!0,get:function(){return oT.toBeVisible}});Object.defineProperty(M,"toContainElement",{enumerable:!0,get:function(){return J2.toContainElement}});Object.defineProperty(M,"toContainHTML",{enumerable:!0,get:function(){return Q2.toContainHTML}});Object.defineProperty(M,"toHaveAccessibleDescription",{enumerable:!0,get:function(){return eT.toHaveAccessibleDescription}});Object.defineProperty(M,"toHaveAccessibleName",{enumerable:!0,get:function(){return tT.toHaveAccessibleName}});Object.defineProperty(M,"toHaveAttribute",{enumerable:!0,get:function(){return rT.toHaveAttribute}});Object.defineProperty(M,"toHaveClass",{enumerable:!0,get:function(){return aT.toHaveClass}});Object.defineProperty(M,"toHaveDescription",{enumerable:!0,get:function(){return fT.toHaveDescription}});Object.defineProperty(M,"toHaveDisplayValue",{enumerable:!0,get:function(){return cT.toHaveDisplayValue}});Object.defineProperty(M,"toHaveErrorMessage",{enumerable:!0,get:function(){return mT.toHaveErrorMessage}});Object.defineProperty(M,"toHaveFocus",{enumerable:!0,get:function(){return iT.toHaveFocus}});Object.defineProperty(M,"toHaveFormValues",{enumerable:!0,get:function(){return sT.toHaveFormValues}});Object.defineProperty(M,"toHaveStyle",{enumerable:!0,get:function(){return nT.toHaveStyle}});Object.defineProperty(M,"toHaveTextContent",{enumerable:!0,get:function(){return Z2.toHaveTextContent}});Object.defineProperty(M,"toHaveValue",{enumerable:!0,get:function(){return uT.toHaveValue}});var W2=Lu(),K2=Bu(),X2=Vu(),Y2=Uu(),J2=zu(),Q2=Ku(),Z2=Yu(),eT=yc(),tT=_c(),rT=Pc(),aT=Oc(),nT=sd(),iT=ld(),sT=Nd(),oT=Id(),_b=Gd(),lT=Wd(),qb=Jd(),uT=Zd(),cT=rp(),dT=fb(),pT=bb(),fT=vb(),mT=gb()});var Pb=o(()=>{"use strict";var bT=hT(Rb());function Cb(e){if(typeof WeakMap!="function")return null;var t=new WeakMap,r=new WeakMap;return(Cb=function(a){return a?r:t})(e)}function hT(e,t){if(!t&&e&&e.__esModule)return e;if(e===null||typeof e!="object"&&typeof e!="function")return{default:e};var r=Cb(t);if(r&&r.has(e))return r.get(e);var a={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(i!=="default"&&Object.prototype.hasOwnProperty.call(e,i)){var l=n?Object.getOwnPropertyDescriptor(e,i):null;l&&(l.get||l.set)?Object.defineProperty(a,i,l):a[i]=e[i]}return a.default=e,r&&r.set(e,a),a}window.browserJest?.expect.extend(bT)});"use strict";Pb(); /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ diff --git a/dist/pug/pug.min.js b/dist/pug/pug.min.js index 8402547..2589eef 100644 --- a/dist/pug/pug.min.js +++ b/dist/pug/pug.min.js @@ -111,4 +111,4 @@ object-assign * @author Feross Aboukhadijeh * @license MIT */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0Blc2J1aWxkLXBsdWdpbnMvbm9kZS1nbG9iYWxzLXBvbHlmaWxsL192aXJ0dWFsLXByb2Nlc3MtcG9seWZpbGxfLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AZXNidWlsZC1wbHVnaW5zL25vZGUtZ2xvYmFscy1wb2x5ZmlsbC9CdWZmZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Blc2J1aWxkLXBsdWdpbnMvbm9kZS1nbG9iYWxzLXBvbHlmaWxsL19idWZmZXIuanMiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpmcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzLWNvbW1vbmpzOmZzIiwgIm5vZGUtbW9kdWxlcy1wb2x5ZmlsbHM6cGF0aCIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzLWNvbW1vbmpzOnBhdGgiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpidWZmZXIiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpwcm9jZXNzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3BvbHlmaWxscy9pbmhlcml0cy5qcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzOnV0aWwiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczphc3NlcnQiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxscy1jb21tb25qczphc3NlcnQiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWV4cHJlc3Npb24vbm9kZV9tb2R1bGVzL2Fjb3JuL2Rpc3QvYWNvcm4uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWV4cHJlc3Npb24vaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFzLXByb3RvL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMvc3JjL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9jYWxsQm91bmQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy10b3N0cmluZ3RhZy9zaGFtcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1wYXJzZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1lcnJvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWxleGVyL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Rva2VuLXN0cmVhbS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLXBhcnNlci9saWIvaW5saW5lLXRhZ3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1wYXJzZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy13YWxrL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctbG9hZC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZG9uZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZmluYWxseS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZXM2LWV4dGVuc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2FzYXAvYnJvd3Nlci1hc2FwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlL2xpYi9ub2RlLWV4dGVuc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb21pc2UvbGliL3N5bmNocm9ub3VzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlL2xpYi9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtcHJvbWlzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvanN0cmFuc2Zvcm1lci9pbmRleC5qcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzOm9zIiwgIm5vZGUtbW9kdWxlcy1wb2x5ZmlsbHMtY29tbW9uanM6b3MiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2hvbWVkaXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2NhbGxlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcGF0aC1wYXJzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcmVzb2x2ZS9saWIvbm9kZS1tb2R1bGVzLXBhdGhzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9ub3JtYWxpemUtb3B0aW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtY29yZS1tb2R1bGUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2FzeW5jLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9pcy1jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9zeW5jLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctZmlsdGVycy9saWIvcnVuLWZpbHRlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9sb2NhdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2UtZXJyb3IvY3JlZGVudGlhbHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL21vZHVsZS1lcnJvcnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL3RvLW5vZGUtZGVzY3JpcHRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL3N0YW5kYXJkLWVycm9ycy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2UtZXJyb3Ivc3RyaWN0LW1vZGUtZXJyb3JzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZS1lcnJvci9waXBlbGluZS1vcGVyYXRvci1lcnJvcnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL2VzdHJlZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdG9rZW5pemVyL2NvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3Rva2VuaXplci90eXBlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL2JhYmVsLWhlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllci9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL2JhYmVsLWhlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllci9zcmMva2V5d29yZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy91dGlsL3Njb3BlZmxhZ3MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3V0aWwvc2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvZmxvdy9zY29wZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2VyL2Jhc2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9jb21tZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC93aGl0ZXNwYWNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy90b2tlbml6ZXIvc3RhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9iYWJlbC1oZWxwZXItc3RyaW5nLXBhcnNlci9zcmMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3Rva2VuaXplci9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9jbGFzcy1zY29wZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9leHByZXNzaW9uLXNjb3BlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy91dGlsL3Byb2R1Y3Rpb24tcGFyYW1ldGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvdXRpbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2VyL25vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvZmxvdy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGx1Z2lucy9qc3gveGh0bWwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvanN4L2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3R5cGVzY3JpcHQvc2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9sdmFsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3R5cGVzY3JpcHQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvcGxhY2Vob2xkZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3Y4aW50cmluc2ljLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW4tdXRpbHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL29wdGlvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9leHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvc3RhdGVtZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3V0aWxzL3NoYWxsb3dFcXVhbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy91dGlscy9kZXByZWNhdGlvbldhcm5pbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9nZW5lcmF0ZWQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9tYXRjaGVzUGF0dGVybi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2J1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvcmVhY3QvaXNSZWFjdENvbXBvbmVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL3JlYWN0L2lzQ29tcGF0VGFnLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90by1mYXN0LXByb3BlcnRpZXMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1R5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1BsYWNlaG9sZGVyVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9rZXl3b3JkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzVmFsaWRJZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXN0cmluZy1wYXJzZXIvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnN0YW50cy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy91dGlscy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9jb3JlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2Zsb3cudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvZGVmaW5pdGlvbnMvanN4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL3BsYWNlaG9sZGVycy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9taXNjLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2V4cGVyaW1lbnRhbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy90eXBlc2NyaXB0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2RlcHJlY2F0ZWQtYWxpYXNlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL3ZhbGlkYXRlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3ZhbGlkYXRlTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9idWlsZGVycy9nZW5lcmF0ZWQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdXRpbHMvcmVhY3QvY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3JlYWN0L2J1aWxkQ2hpbGRyZW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc05vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvYXNzZXJ0cy9hc3NlcnROb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2Fzc2VydHMvZ2VuZXJhdGVkL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL2Zsb3cvY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvZmxvdy9yZW1vdmVUeXBlRHVwbGljYXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9idWlsZGVycy9mbG93L2NyZWF0ZUZsb3dVbmlvblR5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvbW9kaWZpY2F0aW9ucy90eXBlc2NyaXB0L3JlbW92ZVR5cGVEdXBsaWNhdGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3R5cGVzY3JpcHQvY3JlYXRlVFNVbmlvblR5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvYnVpbGRlcnMvZ2VuZXJhdGVkL3VwcGVyY2FzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jbG9uZS9jbG9uZU5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmVEZWVwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2Nsb25lL2Nsb25lRGVlcFdpdGhvdXRMb2MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmVXaXRob3V0TG9jLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2FkZENvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2FkZENvbW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdXRpbHMvaW5oZXJpdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb21tZW50cy9pbmhlcml0SW5uZXJDb21tZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb21tZW50cy9pbmhlcml0TGVhZGluZ0NvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2luaGVyaXRUcmFpbGluZ0NvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2luaGVyaXRzQ29tbWVudHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29tbWVudHMvcmVtb3ZlQ29tbWVudHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29uc3RhbnRzL2dlbmVyYXRlZC9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvQmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy9lbnN1cmVCbG9jay50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvSWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvQmluZGluZ0lkZW50aWZpZXJOYW1lLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvdG9Db21wdXRlZEtleS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy90cmF2ZXJzZS90cmF2ZXJzZUZhc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvbW9kaWZpY2F0aW9ucy9yZW1vdmVQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXAudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy90b0tleUFsaWFzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvU2VxdWVuY2VFeHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvdG9TdGF0ZW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy92YWx1ZVRvTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9tb2RpZmljYXRpb25zL2FwcGVuZFRvTWVtYmVyRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9tb2RpZmljYXRpb25zL2luaGVyaXRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9yZXRyaWV2ZXJzL2dldE91dGVyQmluZGluZ0lkZW50aWZpZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3RyYXZlcnNlL3RyYXZlcnNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNCaW5kaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNMZXQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc0Jsb2NrU2NvcGVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNJbW11dGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc05vZGVzRXF1aXZhbGVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzUmVmZXJlbmNlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzU2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1NwZWNpZmllckRlZmF1bHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1ZhbGlkRVMzSWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzVmFyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb25zdGFudGlub3BsZS9saWIvYmluYXJ5T3BlcmF0aW9uLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb25zdGFudGlub3BsZS9saWIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1maWx0ZXJzL2xpYi9oYW5kbGUtZmlsdGVycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWZpbHRlcnMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1saW5rZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2RvY3R5cGVzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvZGVwZW5kZW5jaWVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvaW50ZXJuYWxzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvc291cmNlcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLXJ1bnRpbWUvYnVpbGQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1ydW50aW1lL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9qcy1zdHJpbmdpZnkvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1hdHRycy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtd2Fsay9zcmMvZXhwbG9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtd2Fsay9zcmMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC1uZXZlci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvd2l0aC9zcmMvcmVmZXJlbmNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy93aXRoL3NyYy9nbG9iYWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy93aXRoL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWNvZGUtZ2VuL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS93cmFwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWcvbGliL2luZGV4LmpzIiwgIi4uLy4uL3ZlbmRvcl9tb2R1bGVzL2ltcG9ydHMvcHVnLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpXG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJylcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dFxudmFyIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXRcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dFxufVxuaWYgKHR5cGVvZiBnbG9iYWwuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0XG59XG5cbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMClcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoXG4gICAgICAgIChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJlxuICAgICAgICBzZXRUaW1lb3V0XG4gICAgKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpXG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoXG4gICAgICAgIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiZcbiAgICAgICAgY2xlYXJUaW1lb3V0XG4gICAgKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dFxuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcilcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpXG4gICAgICAgIH1cbiAgICB9XG59XG52YXIgcXVldWUgPSBbXVxudmFyIGRyYWluaW5nID0gZmFsc2VcbnZhciBjdXJyZW50UXVldWVcbnZhciBxdWV1ZUluZGV4ID0gLTFcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZVxuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTFcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKClcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKVxuICAgIGRyYWluaW5nID0gdHJ1ZVxuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aFxuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWVcbiAgICAgICAgcXVldWUgPSBbXVxuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xXG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aFxuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsXG4gICAgZHJhaW5pbmcgPSBmYWxzZVxuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KVxufVxuZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSlcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpXG4gICAgfVxufVxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW5cbiAgICB0aGlzLmFycmF5ID0gYXJyYXlcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpXG59XG52YXIgdGl0bGUgPSAnYnJvd3NlcidcbnZhciBwbGF0Zm9ybSA9ICdicm93c2VyJ1xudmFyIGJyb3dzZXIgPSB0cnVlXG52YXIgZW52ID0ge31cbnZhciBhcmd2ID0gW11cbnZhciB2ZXJzaW9uID0gJycgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnZhciB2ZXJzaW9ucyA9IHt9XG52YXIgcmVsZWFzZSA9IHt9XG52YXIgY29uZmlnID0ge31cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBvbiA9IG5vb3BcbnZhciBhZGRMaXN0ZW5lciA9IG5vb3BcbnZhciBvbmNlID0gbm9vcFxudmFyIG9mZiA9IG5vb3BcbnZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3BcbnZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wXG52YXIgZW1pdCA9IG5vb3BcblxuZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpXG59XG5cbmZ1bmN0aW9uIGN3ZCgpIHtcbiAgICByZXR1cm4gJy8nXG59XG5mdW5jdGlvbiBjaGRpcihkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpXG59XG5mdW5jdGlvbiB1bWFzaygpIHtcbiAgICByZXR1cm4gMFxufVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbC5wZXJmb3JtYW5jZSB8fCB7fVxudmFyIHBlcmZvcm1hbmNlTm93ID1cbiAgICBwZXJmb3JtYW5jZS5ub3cgfHxcbiAgICBwZXJmb3JtYW5jZS5tb3pOb3cgfHxcbiAgICBwZXJmb3JtYW5jZS5tc05vdyB8fFxuICAgIHBlcmZvcm1hbmNlLm9Ob3cgfHxcbiAgICBwZXJmb3JtYW5jZS53ZWJraXROb3cgfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgfVxuXG4vLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSAqIDFlLTNcbiAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKVxuICAgIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSAlIDEpICogMWU5KVxuICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgICAgICBzZWNvbmRzID0gc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzBdXG4gICAgICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXVxuICAgICAgICBpZiAobmFub3NlY29uZHMgPCAwKSB7XG4gICAgICAgICAgICBzZWNvbmRzLS1cbiAgICAgICAgICAgIG5hbm9zZWNvbmRzICs9IDFlOVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbc2Vjb25kcywgbmFub3NlY29uZHNdXG59XG5cbnZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKVxuICAgIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZVxuICAgIHJldHVybiBkaWYgLyAxMDAwXG59XG5cbmV4cG9ydCB2YXIgcHJvY2VzcyA9IHtcbiAgICBuZXh0VGljazogbmV4dFRpY2ssXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIGJyb3dzZXI6IGJyb3dzZXIsXG4gICAgZW52OiBlbnYsXG4gICAgYXJndjogYXJndixcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgIHZlcnNpb25zOiB2ZXJzaW9ucyxcbiAgICBvbjogb24sXG4gICAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICAgIG9uY2U6IG9uY2UsXG4gICAgb2ZmOiBvZmYsXG4gICAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICAgIHJlbW92ZUFsbExpc3RlbmVyczogcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICAgIGVtaXQ6IGVtaXQsXG4gICAgYmluZGluZzogYmluZGluZyxcbiAgICBjd2Q6IGN3ZCxcbiAgICBjaGRpcjogY2hkaXIsXG4gICAgdW1hc2s6IHVtYXNrLFxuICAgIGhydGltZTogaHJ0aW1lLFxuICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSxcbiAgICByZWxlYXNlOiByZWxlYXNlLFxuICAgIGNvbmZpZzogY29uZmlnLFxuICAgIHVwdGltZTogdXB0aW1lLFxufVxuXG4vLyByZXBsYWNlIHByb2Nlc3MuZW52LlZBUiB3aXRoIGRlZmluZVxuXG5jb25zdCBkZWZpbmVzID0ge1xuICBcImVudi5OT0RFX0VOVlwiOiBcInByb2R1Y3Rpb25cIixcbn1cbk9iamVjdC5rZXlzKGRlZmluZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoJy4nKVxuICAgIGxldCB0YXJnZXQgPSBwcm9jZXNzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlZyA9IHNlZ3NbaV1cbiAgICAgICAgaWYgKGkgPT09IHNlZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0W3NlZ10gPSBkZWZpbmVzW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtzZWddIHx8ICh0YXJnZXRbc2VnXSA9IHt9KVxuICAgICAgICB9XG4gICAgfVxufSlcbiIsICIvLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jYWx2aW5tZXRjYWxmL2J1ZmZlci1lczZcblxuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcbnZhciBpbml0ZWQgPSBmYWxzZVxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBpbml0ZWQgPSB0cnVlXG4gICAgdmFyIGNvZGUgPVxuICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gICAgICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxuICAgIH1cblxuICAgIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICAgIHJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xufVxuXG5mdW5jdGlvbiBiYXNlNjR0b0J5dGVBcnJheShiNjQpIHtcbiAgICBpZiAoIWluaXRlZCkge1xuICAgICAgICBpbml0KClcbiAgICB9XG4gICAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gICAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gICAgfVxuXG4gICAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gICAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gICAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gICAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICAgIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcblxuICAgIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICAgIGFyciA9IG5ldyBBcnIoKGxlbiAqIDMpIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICAgIHZhciBMID0gMFxuXG4gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgICAgICB0bXAgPVxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgICAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgICAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweGZmXG4gICAgICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4ZmZcbiAgICAgICAgYXJyW0wrK10gPSB0bXAgJiAweGZmXG4gICAgfVxuXG4gICAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgICAgICB0bXAgPVxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgICAgIGFycltMKytdID0gdG1wICYgMHhmZlxuICAgIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgICAgIHRtcCA9XG4gICAgICAgICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgICAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgICAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweGZmXG4gICAgICAgIGFycltMKytdID0gdG1wICYgMHhmZlxuICAgIH1cblxuICAgIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIGxvb2t1cFsobnVtID4+IDE4KSAmIDB4M2ZdICtcbiAgICAgICAgbG9va3VwWyhudW0gPj4gMTIpICYgMHgzZl0gK1xuICAgICAgICBsb29rdXBbKG51bSA+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgbG9va3VwW251bSAmIDB4M2ZdXG4gICAgKVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayh1aW50OCwgc3RhcnQsIGVuZCkge1xuICAgIHZhciB0bXBcbiAgICB2YXIgb3V0cHV0ID0gW11cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgICAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArIHVpbnQ4W2kgKyAyXVxuICAgICAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRmcm9tQnl0ZUFycmF5KHVpbnQ4KSB7XG4gICAgaWYgKCFpbml0ZWQpIHtcbiAgICAgICAgaW5pdCgpXG4gICAgfVxuICAgIHZhciB0bXBcbiAgICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gICAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gICAgdmFyIG91dHB1dCA9ICcnXG4gICAgdmFyIHBhcnRzID0gW11cbiAgICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAgIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBlbmNvZGVDaHVuayhcbiAgICAgICAgICAgICAgICB1aW50OCxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGkgKyBtYXhDaHVua0xlbmd0aCA+IGxlbjIgPyBsZW4yIDogaSArIG1heENodW5rTGVuZ3RoLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgICAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNmXVxuICAgICAgICBvdXRwdXQgKz0gJz09J1xuICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgICAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzZl1cbiAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzZl1cbiAgICAgICAgb3V0cHV0ICs9ICc9J1xuICAgIH1cblxuICAgIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG5cbnZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID1cbiAgICBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgOiB0cnVlXG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGgoKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID8gMHg3ZmZmZmZmZiA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aCkge1xuICAgIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgICB9XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgICAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgICAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB9XG5cbiAgICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGNhc2UuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gICAgfVxuICAgIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbihhcnIpIHtcbiAgICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICAgIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICAgIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXJcbiAgICApIHtcbiAgICAgICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICAgICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgICAgLy8gICB2YWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgLy8gfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gICAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYWxsb2ModGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpXG4gICAgaWYgKHNpemUgPD0gMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gICAgfVxuICAgIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAgICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgICAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24oc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlKHRoYXQsIHNpemUpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICB0aGF0W2ldID0gMFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gICAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgICAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgICAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICAgICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICAgIH1cblxuICAgIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgICB9XG4gICAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHNcIilcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kc1wiKVxuICAgIH1cblxuICAgIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICAgIH1cblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICAgICAgdGhhdCA9IGFycmF5XG4gICAgICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICAgICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gICAgfVxuICAgIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QodGhhdCwgb2JqKSB7XG4gICAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgICAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICAgICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICAgICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhhdFxuICAgICAgICB9XG5cbiAgICAgICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIGlmIChvYmopIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAgICAgICAnbGVuZ3RoJyBpbiBvYmpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicsXG4gICAgKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkKGxlbmd0aCkge1xuICAgIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAgIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICAgIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArXG4gICAgICAgICAgICAgICAga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArXG4gICAgICAgICAgICAgICAgJyBieXRlcycsXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNsb3dCdWZmZXIobGVuZ3RoKSB7XG4gICAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgIGxlbmd0aCA9IDBcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuQnVmZmVyLmlzQnVmZmVyID0gaXNCdWZmZXJcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIoYikge1xuICAgIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGEpIHx8ICFpbnRlcm5hbElzQnVmZmVyKGIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICAgIH1cblxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gICAgdmFyIHggPSBhLmxlbmd0aFxuICAgIHZhciB5ID0gYi5sZW5ndGhcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgICAgICB4ID0gYVtpXVxuICAgICAgICAgICAgeSA9IGJbaV1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICAgIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KGxpc3QsIGxlbmd0aCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gICAgfVxuXG4gICAgdmFyIGlcbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgICB2YXIgcG9zID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgICAgICB9XG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykge1xuICAgIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gICAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5cbiAgICAgICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAgIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAgIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAwXG4gICAgfVxuICAgIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gICAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAoZW5kIDw9IDApIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgICBlbmQgPj4+PSAwXG4gICAgc3RhcnQgPj4+PSAwXG5cbiAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwKGIsIG4sIG0pIHtcbiAgICB2YXIgaSA9IGJbbl1cbiAgICBiW25dID0gYlttXVxuICAgIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2KCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICAgIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICAgICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgICAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICAgICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoYikge1xuICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gICAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShcbiAgICB0YXJnZXQsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHRoaXNTdGFydCxcbiAgICB0aGlzRW5kLFxuKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnQgPSAwXG4gICAgfVxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICAgIH1cbiAgICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1N0YXJ0ID0gMFxuICAgIH1cbiAgICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgc3RhcnQgPCAwIHx8XG4gICAgICAgIGVuZCA+IHRhcmdldC5sZW5ndGggfHxcbiAgICAgICAgdGhpc1N0YXJ0IDwgMCB8fFxuICAgICAgICB0aGlzRW5kID4gdGhpcy5sZW5ndGhcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH1cbiAgICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBzdGFydCA+Pj49IDBcbiAgICBlbmQgPj4+PSAwXG4gICAgdGhpc1N0YXJ0ID4+Pj0gMFxuICAgIHRoaXNFbmQgPj4+PSAwXG5cbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gICAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gICAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICAgIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gICAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gICAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICAgICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgICAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgICBpZiAoeSA8IHgpIHJldHVybiAxXG4gICAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAgIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAgIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gICAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICAgICAgYnl0ZU9mZnNldCA9IDBcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICAgICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gICAgfVxuICAgIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICAgIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgICAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICAgICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiBidWZmZXIubGVuZ3RoIC0gMVxuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gICAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgICAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICAgICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICAgICAgZWxzZSByZXR1cm4gLTFcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdmFsXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgICBpZiAoaW50ZXJuYWxJc0J1ZmZlcih2YWwpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YWwgPSB2YWwgJiAweGZmIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGRpcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICAgIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbmNvZGluZyA9PT0gJ3VjczInIHx8XG4gICAgICAgICAgICBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fFxuICAgICAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYtMTZsZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgICAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICAgICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkKGJ1ZiwgaSkge1xuICAgICAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmW2ldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlcbiAgICBpZiAoZGlyKSB7XG4gICAgICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVhZChhcnIsIGkpID09PVxuICAgICAgICAgICAgICAgIHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICAgICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpXG4gICAgICAgICAgICBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gICAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICAgIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gICAgfVxuICAgIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcihcbiAgICAgICAgdXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSxcbiAgICAgICAgYnVmLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGxlbmd0aCxcbiAgICApXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoXG4gICAgICAgIHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksXG4gICAgICAgIGJ1ZixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBsZW5ndGgsXG4gICAgKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgICAgICBvZmZzZXQgPSAwXG4gICAgICAgIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICAgICAgb2Zmc2V0ID0gMFxuICAgICAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICAgIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJyxcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gICAgaWYgKFxuICAgICAgICAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8XG4gICAgICAgIG9mZnNldCA+IHRoaXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gICAgfVxuXG4gICAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICAgIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gICAgZm9yICg7Oykge1xuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAobG93ZXJlZENhc2UpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdCdWZmZXInLFxuICAgICAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMCksXG4gICAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBiYXNlNjRmcm9tQnl0ZUFycmF5KGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYmFzZTY0ZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICAgIHZhciByZXMgPSBbXVxuXG4gICAgdmFyIGkgPSBzdGFydFxuICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICAgICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICAgICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPVxuICAgICAgICAgICAgZmlyc3RCeXRlID4gMHhlZlxuICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgIDogZmlyc3RCeXRlID4gMHhkZlxuICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgIDogZmlyc3RCeXRlID4gMHhiZlxuICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgIDogMVxuXG4gICAgICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4YzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZpcnN0Qnl0ZSAmIDB4MWYpIDw8IDB4NikgfCAoc2Vjb25kQnl0ZSAmIDB4M2YpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZEJ5dGUgJiAweGMwKSA9PT0gMHg4MCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXJkQnl0ZSAmIDB4YzApID09PSAweDgwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmaXJzdEJ5dGUgJiAweGYpIDw8IDB4YykgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2Vjb25kQnl0ZSAmIDB4M2YpIDw8IDB4NikgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlyZEJ5dGUgJiAweDNmKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPiAweDdmZiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wQ29kZVBvaW50IDwgMHhkODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweGRmZmYpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZEJ5dGUgJiAweGMwKSA9PT0gMHg4MCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXJkQnl0ZSAmIDB4YzApID09PSAweDgwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZm91cnRoQnl0ZSAmIDB4YzApID09PSAweDgwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmaXJzdEJ5dGUgJiAweGYpIDw8IDB4MTIpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNlY29uZEJ5dGUgJiAweDNmKSA8PCAweGMpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRoaXJkQnl0ZSAmIDB4M2YpIDw8IDB4NikgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3VydGhCeXRlICYgMHgzZilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID4gMHhmZmZmICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDB4ZmZmZFxuICAgICAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgICAgICAgcmVzLnB1c2goKChjb2RlUG9pbnQgPj4+IDEwKSAmIDB4M2ZmKSB8IDB4ZDgwMClcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDB4ZGMwMCB8IChjb2RlUG9pbnQgJiAweDNmZilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICAgICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheShjb2RlUG9pbnRzKSB7XG4gICAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gICAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgdmFyIHJlcyA9ICcnXG4gICAgdmFyIGkgPSAwXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICAgICAgICBTdHJpbmcsXG4gICAgICAgICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIChpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSksXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByZXQgPSAnJ1xuICAgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N2YpXG4gICAgfVxuICAgIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHJldCA9ICcnXG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gICAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gICAgdmFyIG91dCA9ICcnXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgICB9XG4gICAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgdmFyIHJlcyA9ICcnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICAgIHN0YXJ0ID0gfn5zdGFydFxuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgKz0gbGVuXG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICAgICAgc3RhcnQgPSBsZW5cbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuXG4gICAgICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gICAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICAgICAgZW5kID0gbGVuXG4gICAgfVxuXG4gICAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gICAgdmFyIG5ld0J1ZlxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICAgICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgICAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0KG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgICBpZiAob2Zmc2V0ICUgMSAhPT0gMCB8fCBvZmZzZXQgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUoXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBpID0gMFxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFKFxuICAgIG9mZnNldCxcbiAgICBieXRlTGVuZ3RoLFxuICAgIG5vQXNzZXJ0LFxuKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgICB9XG5cbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gICAgdmFyIG11bCA9IDFcbiAgICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICAgIH1cblxuICAgIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHwgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDBcbiAgICApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgdGhpc1tvZmZzZXRdICogMHgxMDAwMDAwICtcbiAgICAgICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8ICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAzXSlcbiAgICApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBpID0gMFxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gICAgfVxuICAgIG11bCAqPSAweDgwXG5cbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICAgIH1cbiAgICBtdWwgKj0gMHg4MFxuXG4gICAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICAgIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICAgIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gdGhpc1tvZmZzZXRdXG4gICAgcmV0dXJuICgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gICAgcmV0dXJuIHZhbCAmIDB4ODAwMCA/IHZhbCB8IDB4ZmZmZjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICAgIHJldHVybiB2YWwgJiAweDgwMDAgPyB2YWwgfCAweGZmZmYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICAgIHJldHVybiAoXG4gICAgICAgIHRoaXNbb2Zmc2V0XSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG4gICAgKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgICByZXR1cm4gKFxuICAgICAgICAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXVxuICAgIClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiBpZWVlNzU0cmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIGllZWU3NTRyZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gaWVlZTc1NHJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIGllZWU3NTRyZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUoXG4gICAgdmFsdWUsXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gICAgfVxuXG4gICAgdmFyIG11bCA9IDFcbiAgICB2YXIgaSA9IDBcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmZcbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4ZmZcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUoXG4gICAgdmFsdWUsXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gICAgfVxuXG4gICAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICAgIHZhciBtdWwgPSAxXG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4ZmZcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID1cbiAgICAgICAgICAgICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAgICAgICAoKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4KVxuICAgIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDhcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAoKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSkgJiAweGZmXG4gICAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBieXRlTGVuZ3RoLFxuICAgIG5vQXNzZXJ0LFxuKSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gICAgfVxuXG4gICAgdmFyIGkgPSAwXG4gICAgdmFyIG11bCA9IDFcbiAgICB2YXIgc3ViID0gMFxuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICAgICAgICBzdWIgPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YikgJiAweGZmXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgYnl0ZUxlbmd0aCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBzdWIgPSAwXG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgICAgICAgc3ViID0gMVxuICAgICAgICB9XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIpICYgMHhmZlxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gICAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmZcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiA4XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4ZmZcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gOFxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjRcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICAgIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIGNoZWNrSUVFRTc1NChcbiAgICAgICAgICAgIGJ1ZixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgNCxcbiAgICAgICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOCxcbiAgICAgICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIClcbiAgICB9XG4gICAgaWVlZTc1NHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgICBjaGVja0lFRUU3NTQoXG4gICAgICAgICAgICBidWYsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIDgsXG4gICAgICAgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LFxuICAgICAgICAgICAgLTEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsXG4gICAgICAgIClcbiAgICB9XG4gICAgaWVlZTc1NHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICAgIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICAgIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gICAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gICAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gICAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gICAgfVxuICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAgIC8vIEFyZSB3ZSBvb2I/XG4gICAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgICAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICAgIH1cblxuICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICAgIHZhciBpXG5cbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAgICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgICAgICAgdGFyZ2V0U3RhcnQsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gICAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgICAgICAgIHN0YXJ0ID0gMFxuICAgICAgICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgICAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgdmFsID0gY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFsID0gdmFsICYgMjU1XG4gICAgfVxuXG4gICAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICAgIH1cblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gICAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICAgIHZhciBpXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgICAgICAgPyB2YWxcbiAgICAgICAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4oc3RyKSB7XG4gICAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gICAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAgIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAgIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICAgIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIgKyAnPSdcbiAgICB9XG4gICAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltKHN0cikge1xuICAgIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleChuKSB7XG4gICAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gICAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHtcbiAgICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gICAgdmFyIGNvZGVQb2ludFxuICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gICAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gICAgdmFyIGJ5dGVzID0gW11cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgICAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweGQ3ZmYgJiYgY29kZVBvaW50IDwgMHhlMDAwKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhkYmZmKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhlZiwgMHhiZiwgMHhiZClcbiAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgICAgIGNvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgKCgobGVhZFN1cnJvZ2F0ZSAtIDB4ZDgwMCkgPDwgMTApIHwgKGNvZGVQb2ludCAtIDB4ZGMwMCkpICtcbiAgICAgICAgICAgICAgICAweDEwMDAwXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgIH1cblxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgICAgIC8vIGVuY29kZSB1dGY4XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goKGNvZGVQb2ludCA+PiAweDYpIHwgMHhjMCwgKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MClcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgICAgICAgICAgKGNvZGVQb2ludCA+PiAweGMpIHwgMHhlMCxcbiAgICAgICAgICAgICAgICAoKGNvZGVQb2ludCA+PiAweDYpICYgMHgzZikgfCAweDgwLFxuICAgICAgICAgICAgICAgIChjb2RlUG9pbnQgJiAweDNmKSB8IDB4ODAsXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgICAgICAgICAoY29kZVBvaW50ID4+IDB4MTIpIHwgMHhmMCxcbiAgICAgICAgICAgICAgICAoKGNvZGVQb2ludCA+PiAweGMpICYgMHgzZikgfCAweDgwLFxuICAgICAgICAgICAgICAgICgoY29kZVBvaW50ID4+IDB4NikgJiAweDNmKSB8IDB4ODAsXG4gICAgICAgICAgICAgICAgKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMoc3RyKSB7XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZilcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzdHIsIHVuaXRzKSB7XG4gICAgdmFyIGMsIGhpLCBsb1xuICAgIHZhciBieXRlQXJyYXkgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgICAgICBoaSA9IGMgPj4gOFxuICAgICAgICBsbyA9IGMgJSAyNTZcbiAgICAgICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICAgIH1cblxuICAgIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhzdHIpIHtcbiAgICByZXR1cm4gYmFzZTY0dG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlcihzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGggfHwgaSA+PSBzcmMubGVuZ3RoKSBicmVha1xuICAgICAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgICB9XG4gICAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4odmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIHJldHVybiAoXG4gICAgICAgIG9iaiAhPSBudWxsICYmXG4gICAgICAgICghIW9iai5faXNCdWZmZXIgfHwgaXNGYXN0QnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikpXG4gICAgKVxufVxuXG5mdW5jdGlvbiBpc0Zhc3RCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgISFvYmouY29uc3RydWN0b3IgJiZcbiAgICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxuICAgIClcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbiAgICApXG59XG5cbmZ1bmN0aW9uIGllZWU3NTRyZWFkKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgICB2YXIgZSwgbVxuICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgICB2YXIgbkJpdHMgPSAtN1xuICAgIHZhciBpID0gaXNMRSA/IG5CeXRlcyAtIDEgOiAwXG4gICAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gICAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICAgIGkgKz0gZFxuXG4gICAgZSA9IHMgJiAoKDEgPDwgLW5CaXRzKSAtIDEpXG4gICAgcyA+Pj0gLW5CaXRzXG4gICAgbkJpdHMgKz0gZUxlblxuICAgIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgICBtID0gZSAmICgoMSA8PCAtbkJpdHMpIC0gMSlcbiAgICBlID4+PSAtbkJpdHNcbiAgICBuQml0cyArPSBtTGVuXG4gICAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICAgIGlmIChlID09PSAwKSB7XG4gICAgICAgIGUgPSAxIC0gZUJpYXNcbiAgICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICAgICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICAgICAgZSA9IGUgLSBlQmlhc1xuICAgIH1cbiAgICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5mdW5jdGlvbiBpZWVlNzU0d3JpdGUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgICB2YXIgZSwgbSwgY1xuICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMFxuICAgIHZhciBpID0gaXNMRSA/IDAgOiBuQnl0ZXMgLSAxXG4gICAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gICAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgICAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2Uge1xuICAgICAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICAgICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgICAgICAgZS0tXG4gICAgICAgICAgICBjICo9IDJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICAgICAgICBlKytcbiAgICAgICAgICAgIGMgLz0gMlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICAgICAgICBtID0gMFxuICAgICAgICAgICAgZSA9IGVNYXhcbiAgICAgICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICAgICAgICBlID0gZSArIGVCaWFzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgICAgICAgIGUgPSAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgICA7XG4gICAgICAgIG1MZW4gPj0gODtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOFxuICAgICkge31cblxuICAgIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgICBlTGVuICs9IG1MZW5cbiAgICBmb3IgKFxuICAgICAgICA7XG4gICAgICAgIGVMZW4gPiAwO1xuICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4XG4gICAgKSB7fVxuXG4gICAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCAiZXhwb3J0IHsgQnVmZmVyIH0gZnJvbSAnX25vZGUtYnVmZmVyLXBvbHlmaWxsXy5qcydcbiIsICJleHBvcnQgZGVmYXVsdCB7fTtcbiIsICJcbmNvbnN0IHBvbHlmaWxsID0gcmVxdWlyZSgnZnMnKVxuXG5pZiAocG9seWZpbGwgJiYgcG9seWZpbGwuZGVmYXVsdCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGwuZGVmYXVsdFxuICAgIGZvciAobGV0IGsgaW4gcG9seWZpbGwpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHNba10gPSBwb2x5ZmlsbFtrXVxuICAgIH1cbn0gZWxzZSBpZiAocG9seWZpbGwpICB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbFxufVxuXG5cbiIsICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiAnLyc7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShwYXRoKSB7XG4gIHZhciBpc1BhdGhBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNQYXRoQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzUGF0aEFic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzUGF0aEFic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydCBmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydCBmdW5jdGlvbiBqb2luKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gbm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn1cblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gIGZyb20gPSByZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSByZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59XG5cbmV4cG9ydCB2YXIgc2VwID0gJy8nO1xuZXhwb3J0IHZhciBkZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBleHRuYW1lKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0bmFtZTogZXh0bmFtZSxcbiAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICBkaXJuYW1lOiBkaXJuYW1lLFxuICBzZXA6IHNlcCxcbiAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gIHJlbGF0aXZlOiByZWxhdGl2ZSxcbiAgam9pbjogam9pbixcbiAgaXNBYnNvbHV0ZTogaXNBYnNvbHV0ZSxcbiAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gIHJlc29sdmU6IHJlc29sdmVcbn07XG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJyA/XG4gICAgZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9IDpcbiAgICBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG5pZiAocG9seWZpbGwgJiYgcG9seWZpbGwuZGVmYXVsdCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGwuZGVmYXVsdFxuICAgIGZvciAobGV0IGsgaW4gcG9seWZpbGwpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHNba10gPSBwb2x5ZmlsbFtrXVxuICAgIH1cbn0gZWxzZSBpZiAocG9seWZpbGwpICB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbFxufVxuXG5cbiIsICJ2YXIgbG9va3VwID0gW107XG52YXIgcmV2TG9va3VwID0gW107XG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5O1xudmFyIGluaXRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIGluaXRlZCA9IHRydWU7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV07XG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpO1xuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyO1xuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjM7XG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnI7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwO1xuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKTtcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlbjtcblxuICB2YXIgTCA9IDA7XG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRjtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGO1xuICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KTtcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkY7XG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpO1xuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkY7XG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXA7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pO1xuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciB0bXA7XG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGg7XG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpO1xuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdO1xuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdO1xuICAgIG91dHB1dCArPSAnPT0nO1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gJz0nO1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gLTc7XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDA7XG4gIHZhciBkID0gaXNMRSA/IC0xIDogMTtcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07XG5cbiAgaSArPSBkO1xuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpO1xuICBzID4+PSAoLW5CaXRzKTtcbiAgbkJpdHMgKz0gZUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKTtcbiAgZSA+Pj0gKC1uQml0cyk7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKTtcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKTtcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMDtcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG59XG5cbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbnZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwO1xuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHRydWU7XG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbnZhciBfa01heExlbmd0aCA9IGtNYXhMZW5ndGgoKTtcblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpO1xuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MjsgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIHJldHVybiBhcnJcbn07XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufTtcblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGU7XG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn07XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59O1xuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwO1xuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aCk7XG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZyk7XG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpO1xuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMDtcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1O1xuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoOyAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMDtcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbik7XG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKTtcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMDtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5CdWZmZXIuaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihhKSB8fCAhaW50ZXJuYWxJc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufTtcblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaTtcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgdmFyIHBvcyA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV07XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKTtcbiAgICBwb3MgKz0gYnVmLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59O1xuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlO1xuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXTtcbiAgYltuXSA9IGJbbV07XG4gIGJbbV0gPSBpO1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMyk7XG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpO1xuICB9XG4gIHJldHVybiB0aGlzXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KTtcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNik7XG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpO1xuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnO1xuICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVM7XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnO1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDA7XG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMDtcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMDtcbiAgZW5kID4+Pj0gMDtcbiAgdGhpc1N0YXJ0ID4+Pj0gMDtcbiAgdGhpc0VuZCA+Pj49IDA7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnQ7XG4gIHZhciB5ID0gZW5kIC0gc3RhcnQ7XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KTtcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZCk7XG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXTtcbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQ7XG4gICAgYnl0ZU9mZnNldCA9IDA7XG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZjtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDA7XG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OyAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXQ7XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwO1xuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKGludGVybmFsSXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGOyAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGg7XG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyO1xuICAgICAgYXJyTGVuZ3RoIC89IDI7XG4gICAgICB2YWxMZW5ndGggLz0gMjtcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGk7XG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xO1xuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXg7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGg7XG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn07XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDtcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXQ7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWQ7XG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgb2Zmc2V0ID0gMDtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBvZmZzZXQgPSAwO1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwO1xuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmc7XG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcbiAgdmFyIHJlcyA9IFtdO1xuXG4gIHZhciBpID0gc3RhcnQ7XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXTtcbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbDtcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDE7XG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50O1xuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRDtcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KTtcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDA7XG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGg7XG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJyc7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnO1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlbjtcblxuICB2YXIgb3V0ID0gJyc7XG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIHN0YXJ0ID0gfn5zdGFydDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuO1xuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuO1xuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuO1xuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwO1xuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlbjtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgdmFyIG5ld0J1ZjtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydDtcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn07XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgdmFyIG11bCA9IDE7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdO1xuICB2YXIgbXVsID0gMTtcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICB9XG4gIG11bCAqPSAweDgwO1xuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXTtcbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bDtcbiAgfVxuICBtdWwgKj0gMHg4MDtcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcblxuICByZXR1cm4gdmFsXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KTtcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOCk7XG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59O1xuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gIH1cblxuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDE7XG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMTtcbiAgdmFyIG11bCA9IDE7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMCk7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxO1xuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogODtcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZik7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDE7XG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmO1xuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMTtcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxO1xuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDE7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKTtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCk7XG4gIH1cbiAgd3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTtcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn07XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgpO1xuICB9XG4gIHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7XG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59O1xuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aDtcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwO1xuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydDtcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgdmFyIGk7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBsZW5cbn07XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kO1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTU7XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDA7XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7XG5cbiAgaWYgKCF2YWwpIHZhbCA9IDA7XG5cbiAgdmFyIGk7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKTtcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufTtcblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2c7XG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJyk7XG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9JztcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTtcbiAgdmFyIGNvZGVQb2ludDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbDtcbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7XG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG87XG4gIHZhciBieXRlQXJyYXkgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBoaSA9IGMgPj4gODtcbiAgICBsbyA9IGMgJSAyNTY7XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pO1xuICAgIGJ5dGVBcnJheS5wdXNoKGhpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIHRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXTtcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNGYXN0QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cblxuZXhwb3J0IHsgQnVmZmVyLCBJTlNQRUNUX01BWF9CWVRFUywgU2xvd0J1ZmZlciwgaXNCdWZmZXIsIF9rTWF4TGVuZ3RoIGFzIGtNYXhMZW5ndGggfTtcbiIsICIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuaWYgKHR5cGVvZiBnbG9iYWwuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xufVxuaWYgKHR5cGVvZiBnbG9iYWwuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xufVxuXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5mdW5jdGlvbiBuZXh0VGljayhmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufVxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnZhciB0aXRsZSA9ICdicm93c2VyJztcbnZhciBwbGF0Zm9ybSA9ICdicm93c2VyJztcbnZhciBicm93c2VyID0gdHJ1ZTtcbnZhciBlbnYgPSB7fTtcbnZhciBhcmd2ID0gW107XG52YXIgdmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xudmFyIHZlcnNpb25zID0ge307XG52YXIgcmVsZWFzZSA9IHt9O1xudmFyIGNvbmZpZyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIG9uID0gbm9vcDtcbnZhciBhZGRMaXN0ZW5lciA9IG5vb3A7XG52YXIgb25jZSA9IG5vb3A7XG52YXIgb2ZmID0gbm9vcDtcbnZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG52YXIgcmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnZhciBlbWl0ID0gbm9vcDtcblxuZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG5mdW5jdGlvbiBjd2QgKCkgeyByZXR1cm4gJy8nIH1cbmZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufWZ1bmN0aW9uIHVtYXNrKCkgeyByZXR1cm4gMDsgfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbC5wZXJmb3JtYW5jZSB8fCB7fTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9O1xuXG4vLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zO1xuICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKTtcbiAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcigoY2xvY2t0aW1lJTEpKjFlOSk7XG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF07XG4gICAgbmFub3NlY29uZHMgPSBuYW5vc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzFdO1xuICAgIGlmIChuYW5vc2Vjb25kczwwKSB7XG4gICAgICBzZWNvbmRzLS07XG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbc2Vjb25kcyxuYW5vc2Vjb25kc11cbn1cblxudmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbnZhciBicm93c2VyJDEgPSB7XG4gIG5leHRUaWNrOiBuZXh0VGljayxcbiAgdGl0bGU6IHRpdGxlLFxuICBicm93c2VyOiBicm93c2VyLFxuICBlbnY6IGVudixcbiAgYXJndjogYXJndixcbiAgdmVyc2lvbjogdmVyc2lvbixcbiAgdmVyc2lvbnM6IHZlcnNpb25zLFxuICBvbjogb24sXG4gIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lcixcbiAgb25jZTogb25jZSxcbiAgb2ZmOiBvZmYsXG4gIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcixcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG4gIGVtaXQ6IGVtaXQsXG4gIGJpbmRpbmc6IGJpbmRpbmcsXG4gIGN3ZDogY3dkLFxuICBjaGRpcjogY2hkaXIsXG4gIHVtYXNrOiB1bWFzayxcbiAgaHJ0aW1lOiBocnRpbWUsXG4gIHBsYXRmb3JtOiBwbGF0Zm9ybSxcbiAgcmVsZWFzZTogcmVsZWFzZSxcbiAgY29uZmlnOiBjb25maWcsXG4gIHVwdGltZTogdXB0aW1lXG59O1xuXG5leHBvcnQgZGVmYXVsdCBicm93c2VyJDE7XG5leHBvcnQgeyBhZGRMaXN0ZW5lciwgYXJndiwgYmluZGluZywgYnJvd3NlciwgY2hkaXIsIGNvbmZpZywgY3dkLCBlbWl0LCBlbnYsIGhydGltZSwgbmV4dFRpY2ssIG9mZiwgb24sIG9uY2UsIHBsYXRmb3JtLCByZWxlYXNlLCByZW1vdmVBbGxMaXN0ZW5lcnMsIHJlbW92ZUxpc3RlbmVyLCB0aXRsZSwgdW1hc2ssIHVwdGltZSwgdmVyc2lvbiwgdmVyc2lvbnMgfTtcbiIsICJcbnZhciBpbmhlcml0cztcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyl7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGluaGVyaXRzO1xuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQoZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnQgZnVuY3Rpb24gZGVidWdsb2coc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gMDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBfZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyKG1heWJlQnVmKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIobWF5YmVCdWYpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnQgZnVuY3Rpb24gbG9nKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG59XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmltcG9ydCBpbmhlcml0cyBmcm9tICcuL2luaGVyaXRzJztcbmV4cG9ydCB7aW5oZXJpdHN9XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0ZW5kKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzaWZ5KGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZm4oLi4uYXJndW1lbnRzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVyciAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pXG4gICAgfSlcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5oZXJpdHM6IGluaGVyaXRzLFxuICBfZXh0ZW5kOiBfZXh0ZW5kLFxuICBsb2c6IGxvZyxcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzRXJyb3I6IGlzRXJyb3IsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc1N5bWJvbDogaXNTeW1ib2wsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsXG4gIGlzTnVsbDogaXNOdWxsLFxuICBpc0Jvb2xlYW46IGlzQm9vbGVhbixcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaW5zcGVjdDogaW5zcGVjdCxcbiAgZGVwcmVjYXRlOiBkZXByZWNhdGUsXG4gIGZvcm1hdDogZm9ybWF0LFxuICBkZWJ1Z2xvZzogZGVidWdsb2dcbn1cbiIsICJcbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5pbXBvcnQge2lzQnVmZmVyfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHtpc1ByaW1pdGl2ZSwgaW5oZXJpdHMsIGlzRXJyb3IsIGlzRnVuY3Rpb24sIGlzUmVnRXhwLCBpc0RhdGUsIGluc3BlY3QgYXMgdXRpbEluc3BlY3R9IGZyb20gJ3V0aWwnO1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBfZnVuY3Rpb25zSGF2ZU5hbWVzO1xuZnVuY3Rpb24gZnVuY3Rpb25zSGF2ZU5hbWVzKCkge1xuICBpZiAodHlwZW9mIF9mdW5jdGlvbnNIYXZlTmFtZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIF9mdW5jdGlvbnNIYXZlTmFtZXM7XG4gIH1cbiAgcmV0dXJuIF9mdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbiAgfSgpKTtcbn1cbmZ1bmN0aW9uIHBUb1N0cmluZyAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cbmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpIHtcbiAgaWYgKGlzQnVmZmVyKGFycmJ1ZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmJ1Zik7XG4gIH1cbiAgaWYgKCFhcnJidWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFycmJ1ZiBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGFycmJ1Zi5idWZmZXIgJiYgYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbmZ1bmN0aW9uIGFzc2VydCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBvayk7XG59XG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcygpKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBBc3NlcnRpb25FcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG5pbmhlcml0cyhBc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMoKSB8fCAhaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWxJbnNwZWN0KHNvbWV0aGluZyk7XG4gIH1cbiAgdmFyIHJhd25hbWUgPSBnZXROYW1lKHNvbWV0aGluZyk7XG4gIHZhciBuYW1lID0gcmF3bmFtZSA/ICc6ICcgKyByYXduYW1lIDogJyc7XG4gIHJldHVybiAnW0Z1bmN0aW9uJyArICBuYW1lICsgJ10nO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuYWN0dWFsKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5leHBlY3RlZCksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5leHBvcnQgZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgb2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5leHBvcnQge29rIGFzIGFzc2VydH07XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0LmVxdWFsID0gZXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGVxdWFsKTtcbn1cblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdEVxdWFsID0gbm90RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBub3RFcXVhbCk7XG4gIH1cbn1cblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcbmFzc2VydC5kZWVwRXF1YWwgPSBkZWVwRXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGRlZXBFcXVhbCk7XG4gIH1cbn1cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBkZWVwU3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcFN0cmljdEVxdWFsJywgZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAoaXNEYXRlKGFjdHVhbCkgJiYgaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChhY3R1YWwpICYmIGlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKGlzUHJpbWl0aXZlKGEpIHx8IGlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IG5vdERlZXBFcXVhbDtcbmV4cG9ydCBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBub3REZWVwRXF1YWwpO1xuICB9XG59XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBzdHJpY3RFcXVhbDtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09Jywgc3RyaWN0RXF1YWwpO1xuICB9XG59XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gbm90U3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIG5vdFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUuICBUaGUgaW5zdGFuY2VvZiBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGFycm93IGZ1bmN0aW9ucy5cbiAgfVxuXG4gIGlmIChFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spIHtcbiAgdmFyIGVycm9yO1xuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodHlwZW9mIGJsb2NrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJibG9ja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgYWN0dWFsID0gX3RyeUJsb2NrKGJsb2NrKTtcblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB1c2VyUHJvdmlkZWRNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnO1xuICB2YXIgaXNVbndhbnRlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiBpc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcbmFzc2VydC50aHJvd3MgPSB0aHJvd3M7XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dzKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGRvZXNOb3RUaHJvdztcbmV4cG9ydCBmdW5jdGlvbiBkb2VzTm90VGhyb3coYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59XG5cbmFzc2VydC5pZkVycm9yID0gaWZFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBpZkVycm9yKGVycikge1xuICBpZiAoZXJyKSB0aHJvdyBlcnI7XG59XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmlmIChwb2x5ZmlsbCAmJiBwb2x5ZmlsbC5kZWZhdWx0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbC5kZWZhdWx0XG4gICAgZm9yIChsZXQgayBpbiBwb2x5ZmlsbCkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0c1trXSA9IHBvbHlmaWxsW2tdXG4gICAgfVxufSBlbHNlIGlmIChwb2x5ZmlsbCkgIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsXG59XG5cblxuIiwgIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5hY29ybiA9IHt9KSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgLy8gUmVzZXJ2ZWQgd29yZCBsaXN0cyBmb3IgdmFyaW91cyBkaWFsZWN0cyBvZiB0aGUgbGFuZ3VhZ2VcblxuICB2YXIgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgICAzOiBcImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBjaGFyIGNsYXNzIGRvdWJsZSBlbnVtIGV4cG9ydCBleHRlbmRzIGZpbmFsIGZsb2F0IGdvdG8gaW1wbGVtZW50cyBpbXBvcnQgaW50IGludGVyZmFjZSBsb25nIG5hdGl2ZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzaG9ydCBzdGF0aWMgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgdm9sYXRpbGVcIixcbiAgICA1OiBcImNsYXNzIGVudW0gZXh0ZW5kcyBzdXBlciBjb25zdCBleHBvcnQgaW1wb3J0XCIsXG4gICAgNjogXCJlbnVtXCIsXG4gICAgc3RyaWN0OiBcImltcGxlbWVudHMgaW50ZXJmYWNlIGxldCBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzdGF0aWMgeWllbGRcIixcbiAgICBzdHJpY3RCaW5kOiBcImV2YWwgYXJndW1lbnRzXCJcbiAgfTtcblxuICAvLyBBbmQgdGhlIGtleXdvcmRzXG5cbiAgdmFyIGVjbWE1QW5kTGVzc0tleXdvcmRzID0gXCJicmVhayBjYXNlIGNhdGNoIGNvbnRpbnVlIGRlYnVnZ2VyIGRlZmF1bHQgZG8gZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiByZXR1cm4gc3dpdGNoIHRocm93IHRyeSB2YXIgd2hpbGUgd2l0aCBudWxsIHRydWUgZmFsc2UgaW5zdGFuY2VvZiB0eXBlb2Ygdm9pZCBkZWxldGUgbmV3IGluIHRoaXNcIjtcblxuICB2YXIga2V5d29yZHMgPSB7XG4gICAgNTogZWNtYTVBbmRMZXNzS2V5d29yZHMsXG4gICAgXCI1bW9kdWxlXCI6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgZXhwb3J0IGltcG9ydFwiLFxuICAgIDY6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgY29uc3QgY2xhc3MgZXh0ZW5kcyBleHBvcnQgaW1wb3J0IHN1cGVyXCJcbiAgfTtcblxuICB2YXIga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4gIC8vICMjIENoYXJhY3RlciBjYXRlZ29yaWVzXG5cbiAgLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlXG4gIC8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlXG4gIC8vIGFyZSBvbmx5IGFwcGxpZWQgd2hlbiBhIGNoYXJhY3RlciBpcyBmb3VuZCB0byBhY3R1YWxseSBoYXZlIGFcbiAgLy8gY29kZSBwb2ludCBhYm92ZSAxMjguXG4gIC8vIEdlbmVyYXRlZCBieSBgYmluL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IFwiXFx4YWFcXHhiNVxceGJhXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyYzFcXHUwMmM2LVxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVjXFx1MDJlZVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3YS1cXHUwMzdkXFx1MDM3ZlxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTJmXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjAtXFx1MDU4OFxcdTA1ZDAtXFx1MDVlYVxcdTA1ZWYtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NmFcXHUwOGEwLVxcdTA4YjRcXHUwOGI2LVxcdTA4YzdcXHUwOTA0LVxcdTA5MzlcXHUwOTNkXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Y1xcdTA5OGZcXHUwOTkwXFx1MDk5My1cXHUwOWE4XFx1MDlhYS1cXHUwOWIwXFx1MDliMlxcdTA5YjYtXFx1MDliOVxcdTA5YmRcXHUwOWNlXFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWYwXFx1MDlmMVxcdTA5ZmNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWY5XFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzlcXHUwYzNkXFx1MGM1OC1cXHUwYzVhXFx1MGM2MFxcdTBjNjFcXHUwYzgwXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZjFcXHUwY2YyXFx1MGQwNC1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZFxcdTBkNGVcXHUwZDU0LVxcdTBkNTZcXHUwZDVmLVxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg2LVxcdTBlOGFcXHUwZThjLVxcdTBlYTNcXHUwZWE1XFx1MGVhNy1cXHUwZWIwXFx1MGViMlxcdTBlYjNcXHUwZWJkXFx1MGVjMC1cXHUwZWM0XFx1MGVjNlxcdTBlZGMtXFx1MGVkZlxcdTBmMDBcXHUwZjQwLVxcdTBmNDdcXHUwZjQ5LVxcdTBmNmNcXHUwZjg4LVxcdTBmOGNcXHUxMDAwLVxcdTEwMmFcXHUxMDNmXFx1MTA1MC1cXHUxMDU1XFx1MTA1YS1cXHUxMDVkXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2ZS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4ZVxcdTEwYTAtXFx1MTBjNVxcdTEwYzdcXHUxMGNkXFx1MTBkMC1cXHUxMGZhXFx1MTBmYy1cXHUxMjQ4XFx1MTI0YS1cXHUxMjRkXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNWEtXFx1MTI1ZFxcdTEyNjAtXFx1MTI4OFxcdTEyOGEtXFx1MTI4ZFxcdTEyOTAtXFx1MTJiMFxcdTEyYjItXFx1MTJiNVxcdTEyYjgtXFx1MTJiZVxcdTEyYzBcXHUxMmMyLVxcdTEyYzVcXHUxMmM4LVxcdTEyZDZcXHUxMmQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNWFcXHUxMzgwLVxcdTEzOGZcXHUxM2EwLVxcdTEzZjVcXHUxM2Y4LVxcdTEzZmRcXHUxNDAxLVxcdTE2NmNcXHUxNjZmLVxcdTE2N2ZcXHUxNjgxLVxcdTE2OWFcXHUxNmEwLVxcdTE2ZWFcXHUxNmVlLVxcdTE2ZjhcXHUxNzAwLVxcdTE3MGNcXHUxNzBlLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NmNcXHUxNzZlLVxcdTE3NzBcXHUxNzgwLVxcdTE3YjNcXHUxN2Q3XFx1MTdkY1xcdTE4MjAtXFx1MTg3OFxcdTE4ODAtXFx1MThhOFxcdTE4YWFcXHUxOGIwLVxcdTE4ZjVcXHUxOTAwLVxcdTE5MWVcXHUxOTUwLVxcdTE5NmRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5YWJcXHUxOWIwLVxcdTE5YzlcXHUxYTAwLVxcdTFhMTZcXHUxYTIwLVxcdTFhNTRcXHUxYWE3XFx1MWIwNS1cXHUxYjMzXFx1MWI0NS1cXHUxYjRiXFx1MWI4My1cXHUxYmEwXFx1MWJhZVxcdTFiYWZcXHUxYmJhLVxcdTFiZTVcXHUxYzAwLVxcdTFjMjNcXHUxYzRkLVxcdTFjNGZcXHUxYzVhLVxcdTFjN2RcXHUxYzgwLVxcdTFjODhcXHUxYzkwLVxcdTFjYmFcXHUxY2JkLVxcdTFjYmZcXHUxY2U5LVxcdTFjZWNcXHUxY2VlLVxcdTFjZjNcXHUxY2Y1XFx1MWNmNlxcdTFjZmFcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyYzJlXFx1MmMzMC1cXHUyYzVlXFx1MmM2MC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM2NcXHUzMDQxLVxcdTMwOTZcXHUzMDliLVxcdTMwOWZcXHUzMGExLVxcdTMwZmFcXHUzMGZjLVxcdTMwZmZcXHUzMTA1LVxcdTMxMmZcXHUzMTMxLVxcdTMxOGVcXHUzMWEwLVxcdTMxYmZcXHUzMWYwLVxcdTMxZmZcXHUzNDAwLVxcdTRkYmZcXHU0ZTAwLVxcdTlmZmNcXHVhMDAwLVxcdWE0OGNcXHVhNGQwLVxcdWE0ZmRcXHVhNTAwLVxcdWE2MGNcXHVhNjEwLVxcdWE2MWZcXHVhNjJhXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2N2YtXFx1YTY5ZFxcdWE2YTAtXFx1YTZlZlxcdWE3MTctXFx1YTcxZlxcdWE3MjItXFx1YTc4OFxcdWE3OGItXFx1YTdiZlxcdWE3YzItXFx1YTdjYVxcdWE3ZjUtXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyMlxcdWE4NDAtXFx1YTg3M1xcdWE4ODItXFx1YThiM1xcdWE4ZjItXFx1YThmN1xcdWE4ZmJcXHVhOGZkXFx1YThmZVxcdWE5MGEtXFx1YTkyNVxcdWE5MzAtXFx1YTk0NlxcdWE5NjAtXFx1YTk3Y1xcdWE5ODQtXFx1YTliMlxcdWE5Y2ZcXHVhOWUwLVxcdWE5ZTRcXHVhOWU2LVxcdWE5ZWZcXHVhOWZhLVxcdWE5ZmVcXHVhYTAwLVxcdWFhMjhcXHVhYTQwLVxcdWFhNDJcXHVhYTQ0LVxcdWFhNGJcXHVhYTYwLVxcdWFhNzZcXHVhYTdhXFx1YWE3ZS1cXHVhYWFmXFx1YWFiMVxcdWFhYjVcXHVhYWI2XFx1YWFiOS1cXHVhYWJkXFx1YWFjMFxcdWFhYzJcXHVhYWRiLVxcdWFhZGRcXHVhYWUwLVxcdWFhZWFcXHVhYWYyLVxcdWFhZjRcXHVhYjAxLVxcdWFiMDZcXHVhYjA5LVxcdWFiMGVcXHVhYjExLVxcdWFiMTZcXHVhYjIwLVxcdWFiMjZcXHVhYjI4LVxcdWFiMmVcXHVhYjMwLVxcdWFiNWFcXHVhYjVjLVxcdWFiNjlcXHVhYjcwLVxcdWFiZTJcXHVhYzAwLVxcdWQ3YTNcXHVkN2IwLVxcdWQ3YzZcXHVkN2NiLVxcdWQ3ZmJcXHVmOTAwLVxcdWZhNmRcXHVmYTcwLVxcdWZhZDlcXHVmYjAwLVxcdWZiMDZcXHVmYjEzLVxcdWZiMTdcXHVmYjFkXFx1ZmIxZi1cXHVmYjI4XFx1ZmIyYS1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDBcXHVmYjQxXFx1ZmI0M1xcdWZiNDRcXHVmYjQ2LVxcdWZiYjFcXHVmYmQzLVxcdWZkM2RcXHVmZDUwLVxcdWZkOGZcXHVmZDkyLVxcdWZkYzdcXHVmZGYwLVxcdWZkZmJcXHVmZTcwLVxcdWZlNzRcXHVmZTc2LVxcdWZlZmNcXHVmZjIxLVxcdWZmM2FcXHVmZjQxLVxcdWZmNWFcXHVmZjY2LVxcdWZmYmVcXHVmZmMyLVxcdWZmYzdcXHVmZmNhLVxcdWZmY2ZcXHVmZmQyLVxcdWZmZDdcXHVmZmRhLVxcdWZmZGNcIjtcbiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gXCJcXHUyMDBjXFx1MjAwZFxceGI3XFx1MDMwMC1cXHUwMzZmXFx1MDM4N1xcdTA0ODMtXFx1MDQ4N1xcdTA1OTEtXFx1MDViZFxcdTA1YmZcXHUwNWMxXFx1MDVjMlxcdTA1YzRcXHUwNWM1XFx1MDVjN1xcdTA2MTAtXFx1MDYxYVxcdTA2NGItXFx1MDY2OVxcdTA2NzBcXHUwNmQ2LVxcdTA2ZGNcXHUwNmRmLVxcdTA2ZTRcXHUwNmU3XFx1MDZlOFxcdTA2ZWEtXFx1MDZlZFxcdTA2ZjAtXFx1MDZmOVxcdTA3MTFcXHUwNzMwLVxcdTA3NGFcXHUwN2E2LVxcdTA3YjBcXHUwN2MwLVxcdTA3YzlcXHUwN2ViLVxcdTA3ZjNcXHUwN2ZkXFx1MDgxNi1cXHUwODE5XFx1MDgxYi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJkXFx1MDg1OS1cXHUwODViXFx1MDhkMy1cXHUwOGUxXFx1MDhlMy1cXHUwOTAzXFx1MDkzYS1cXHUwOTNjXFx1MDkzZS1cXHUwOTRmXFx1MDk1MS1cXHUwOTU3XFx1MDk2MlxcdTA5NjNcXHUwOTY2LVxcdTA5NmZcXHUwOTgxLVxcdTA5ODNcXHUwOWJjXFx1MDliZS1cXHUwOWM0XFx1MDljN1xcdTA5YzhcXHUwOWNiLVxcdTA5Y2RcXHUwOWQ3XFx1MDllMlxcdTA5ZTNcXHUwOWU2LVxcdTA5ZWZcXHUwOWZlXFx1MGEwMS1cXHUwYTAzXFx1MGEzY1xcdTBhM2UtXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNjYtXFx1MGE3MVxcdTBhNzVcXHUwYTgxLVxcdTBhODNcXHUwYWJjXFx1MGFiZS1cXHUwYWM1XFx1MGFjNy1cXHUwYWM5XFx1MGFjYi1cXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYWU2LVxcdTBhZWZcXHUwYWZhLVxcdTBhZmZcXHUwYjAxLVxcdTBiMDNcXHUwYjNjXFx1MGIzZS1cXHUwYjQ0XFx1MGI0N1xcdTBiNDhcXHUwYjRiLVxcdTBiNGRcXHUwYjU1LVxcdTBiNTdcXHUwYjYyXFx1MGI2M1xcdTBiNjYtXFx1MGI2ZlxcdTBiODJcXHUwYmJlLVxcdTBiYzJcXHUwYmM2LVxcdTBiYzhcXHUwYmNhLVxcdTBiY2RcXHUwYmQ3XFx1MGJlNi1cXHUwYmVmXFx1MGMwMC1cXHUwYzA0XFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGQwMC1cXHUwZDAzXFx1MGQzYlxcdTBkM2NcXHUwZDNlLVxcdTBkNDRcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgxLVxcdTBkODNcXHUwZGNhXFx1MGRjZi1cXHUwZGQ0XFx1MGRkNlxcdTBkZDgtXFx1MGRkZlxcdTBkZTYtXFx1MGRlZlxcdTBkZjJcXHUwZGYzXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlNTAtXFx1MGU1OVxcdTBlYjFcXHUwZWI0LVxcdTBlYmNcXHUwZWM4LVxcdTBlY2RcXHUwZWQwLVxcdTBlZDlcXHUwZjE4XFx1MGYxOVxcdTBmMjAtXFx1MGYyOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmM2VcXHUwZjNmXFx1MGY3MS1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjhkLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyYi1cXHUxMDNlXFx1MTA0MC1cXHUxMDQ5XFx1MTA1Ni1cXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA2Mi1cXHUxMDY0XFx1MTA2Ny1cXHUxMDZkXFx1MTA3MS1cXHUxMDc0XFx1MTA4Mi1cXHUxMDhkXFx1MTA4Zi1cXHUxMDlkXFx1MTM1ZC1cXHUxMzVmXFx1MTM2OS1cXHUxMzcxXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjQtXFx1MTdkM1xcdTE3ZGRcXHUxN2UwLVxcdTE3ZTlcXHUxODBiLVxcdTE4MGRcXHUxODEwLVxcdTE4MTlcXHUxOGE5XFx1MTkyMC1cXHUxOTJiXFx1MTkzMC1cXHUxOTNiXFx1MTk0Ni1cXHUxOTRmXFx1MTlkMC1cXHUxOWRhXFx1MWExNy1cXHUxYTFiXFx1MWE1NS1cXHUxYTVlXFx1MWE2MC1cXHUxYTdjXFx1MWE3Zi1cXHUxYTg5XFx1MWE5MC1cXHUxYTk5XFx1MWFiMC1cXHUxYWJkXFx1MWFiZlxcdTFhYzBcXHUxYjAwLVxcdTFiMDRcXHUxYjM0LVxcdTFiNDRcXHUxYjUwLVxcdTFiNTlcXHUxYjZiLVxcdTFiNzNcXHUxYjgwLVxcdTFiODJcXHUxYmExLVxcdTFiYWRcXHUxYmIwLVxcdTFiYjlcXHUxYmU2LVxcdTFiZjNcXHUxYzI0LVxcdTFjMzdcXHUxYzQwLVxcdTFjNDlcXHUxYzUwLVxcdTFjNTlcXHUxY2QwLVxcdTFjZDJcXHUxY2Q0LVxcdTFjZThcXHUxY2VkXFx1MWNmNFxcdTFjZjctXFx1MWNmOVxcdTFkYzAtXFx1MWRmOVxcdTFkZmItXFx1MWRmZlxcdTIwM2ZcXHUyMDQwXFx1MjA1NFxcdTIwZDAtXFx1MjBkY1xcdTIwZTFcXHUyMGU1LVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZDdmXFx1MmRlMC1cXHUyZGZmXFx1MzAyYS1cXHUzMDJmXFx1MzA5OVxcdTMwOWFcXHVhNjIwLVxcdWE2MjlcXHVhNjZmXFx1YTY3NC1cXHVhNjdkXFx1YTY5ZVxcdWE2OWZcXHVhNmYwXFx1YTZmMVxcdWE4MDJcXHVhODA2XFx1YTgwYlxcdWE4MjMtXFx1YTgyN1xcdWE4MmNcXHVhODgwXFx1YTg4MVxcdWE4YjQtXFx1YThjNVxcdWE4ZDAtXFx1YThkOVxcdWE4ZTAtXFx1YThmMVxcdWE4ZmYtXFx1YTkwOVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1M1xcdWE5ODAtXFx1YTk4M1xcdWE5YjMtXFx1YTljMFxcdWE5ZDAtXFx1YTlkOVxcdWE5ZTVcXHVhOWYwLVxcdWE5ZjlcXHVhYTI5LVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhNGRcXHVhYTUwLVxcdWFhNTlcXHVhYTdiLVxcdWFhN2RcXHVhYWIwXFx1YWFiMi1cXHVhYWI0XFx1YWFiN1xcdWFhYjhcXHVhYWJlXFx1YWFiZlxcdWFhYzFcXHVhYWViLVxcdWFhZWZcXHVhYWY1XFx1YWFmNlxcdWFiZTMtXFx1YWJlYVxcdWFiZWNcXHVhYmVkXFx1YWJmMC1cXHVhYmY5XFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyZlxcdWZlMzNcXHVmZTM0XFx1ZmU0ZC1cXHVmZTRmXFx1ZmYxMC1cXHVmZjE5XFx1ZmYzZlwiO1xuXG4gIHZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydCA9IG5ldyBSZWdFeHAoXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgXCJdXCIpO1xuICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cChcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBub25BU0NJSWlkZW50aWZpZXJDaGFycyArIFwiXVwiKTtcblxuICBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBudWxsO1xuXG4gIC8vIFRoZXNlIGFyZSBhIHJ1bi1sZW5ndGggYW5kIG9mZnNldCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAvLyA+MHhmZmZmIGNvZGUgcG9pbnRzIHRoYXQgYXJlIGEgdmFsaWQgcGFydCBvZiBpZGVudGlmaWVycy4gVGhlXG4gIC8vIG9mZnNldCBzdGFydHMgYXQgMHgxMDAwMCwgYW5kIGVhY2ggcGFpciBvZiBudW1iZXJzIHJlcHJlc2VudHMgYW5cbiAgLy8gb2Zmc2V0IHRvIHRoZSBuZXh0IHJhbmdlLCBhbmQgdGhlbiBhIHNpemUgb2YgdGhlIHJhbmdlLiBUaGV5IHdlcmVcbiAgLy8gZ2VuZXJhdGVkIGJ5IGJpbi9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbW1hLXNwYWNpbmdcbiAgdmFyIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzID0gWzAsMTEsMiwyNSwyLDE4LDIsMSwyLDE0LDMsMTMsMzUsMTIyLDcwLDUyLDI2OCwyOCw0LDQ4LDQ4LDMxLDE0LDI5LDYsMzcsMTEsMjksMywzNSw1LDcsMiw0LDQzLDE1NywxOSwzNSw1LDM1LDUsMzksOSw1MSwxNTcsMzEwLDEwLDIxLDExLDcsMTUzLDUsMywwLDIsNDMsMiwxLDQsMCwzLDIyLDExLDIyLDEwLDMwLDY2LDE4LDIsMSwxMSwyMSwxMSwyNSw3MSw1NSw3LDEsNjUsMCwxNiwzLDIsMiwyLDI4LDQzLDI4LDQsMjgsMzYsNywyLDI3LDI4LDUzLDExLDIxLDExLDE4LDE0LDE3LDExMSw3Miw1Niw1MCwxNCw1MCwxNCwzNSwzNDksNDEsNywxLDc5LDI4LDExLDAsOSwyMSwxMDcsMjAsMjgsMjIsMTMsNTIsNzYsNDQsMzMsMjQsMjcsMzUsMzAsMCwzLDAsOSwzNCw0LDAsMTMsNDcsMTUsMywyMiwwLDIsMCwzNiwxNywyLDI0LDg1LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMywyMSwyLDMxLDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsMTQsMCw3MiwyNiwyMzAsNDMsMTE3LDYzLDMyLDcsMywwLDMsNywyLDEsMiwyMywxNiwwLDIsMCw5NSw3LDMsMzgsMTcsMCwyLDAsMjksMCwxMSwzOSw4LDAsMjIsMCwxMiw0NSwyMCwwLDM1LDU2LDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDI2LDUsMiwxLDIsMzEsMTUsMCwzMjgsMTgsMTkwLDAsODAsOTIxLDEwMywxMTAsMTgsMTk1LDI3NDksMTA3MCw0MDUwLDU4Miw4NjM0LDU2OCw4LDMwLDExNCwyOSwxOSw0NywxNywzLDMyLDIwLDYsMTgsNjg5LDYzLDEyOSw3NCw2LDAsNjcsMTIsNjUsMSwyLDAsMjksNjEzNSw5LDEyMzcsNDMsOCw4OTUyLDI4Niw1MCwyLDE4LDMsOSwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsMjM1Nyw0NCwxMSw2LDE3LDAsMzcwLDQzLDEzMDEsMTk2LDYwLDY3LDgsMCwxMjA1LDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzE3LDM1LDQxNDgsMTIsMjIxLDMsNTc2MSwxNSw3NDcyLDMxMDQsNTQxLDE1MDcsNDkzOF07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbW1hLXNwYWNpbmdcbiAgdmFyIGFzdHJhbElkZW50aWZpZXJDb2RlcyA9IFs1MDksMCwyMjcsMCwxNTAsNCwyOTQsOSwxMzY4LDIsMiwxLDYsMyw0MSwyLDUsMCwxNjYsMSw1NzQsMyw5LDksMzcwLDEsMTU0LDEwLDE3NiwyLDU0LDE0LDMyLDksMTYsMyw0NiwxMCw1NCw5LDcsMiwzNywxMywyLDksNiwxLDQ1LDAsMTMsMiw0OSwxMyw5LDMsMiwxMSw4MywxMSw3LDAsMTYxLDExLDYsOSw3LDMsNTYsMSwyLDYsMywxLDMsMiwxMCwwLDExLDEsMyw2LDQsNCwxOTMsMTcsMTAsOSw1LDAsODIsMTksMTMsOSwyMTQsNiwzLDgsMjgsMSw4MywxNiwxNiw5LDgyLDEyLDksOSw4NCwxNCw1LDksMjQzLDE0LDE2Niw5LDcxLDUsMiwxLDMsMywyLDAsMiwxLDEzLDksMTIwLDYsMyw2LDQsMCwyOSw5LDQxLDYsMiwzLDksMCwxMCwxMCw0NywxNSw0MDYsNywyLDcsMTcsOSw1NywyMSwyLDEzLDEyMyw1LDQsMCwyLDEsMiw2LDIsMCw5LDksNDksNCwyLDEsMiw0LDksOSwzMzAsMywxOTMwNiw5LDEzNSw0LDYwLDYsMjYsOSwxMDE0LDAsMiw1NCw4LDMsODIsMCwxMiwxLDE5NjI4LDEsNTMxOSw0LDQsNSw5LDcsMyw2LDMxLDMsMTQ5LDIsMTQxOCw0OSw1MTMsNTQsNSw0OSw5LDAsMTUsMCwyMyw0LDIsMTQsMTM2MSw2LDIsMTYsMyw2LDIsMSwyLDQsMjYyLDYsMTAsOSw0MTksMTMsMTQ5NSw2LDExMCw2LDYsOSw0NzU5LDksNzg3NzE5LDIzOV07XG5cbiAgLy8gVGhpcyBoYXMgYSBjb21wbGV4aXR5IGxpbmVhciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGUuIFRoZVxuICAvLyBhc3N1bXB0aW9uIGlzIHRoYXQgbG9va2luZyB1cCBhc3RyYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGlzXG4gIC8vIHJhcmUuXG4gIGZ1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZSwgc2V0KSB7XG4gICAgdmFyIHBvcyA9IDB4MTAwMDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHBvcyArPSBzZXRbaV07XG4gICAgICBpZiAocG9zID4gY29kZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgcG9zICs9IHNldFtpICsgMV07XG4gICAgICBpZiAocG9zID49IGNvZGUpIHsgcmV0dXJuIHRydWUgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG4gIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsIGFzdHJhbCkge1xuICAgIGlmIChjb2RlIDwgNjUpIHsgcmV0dXJuIGNvZGUgPT09IDM2IH1cbiAgICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgICBpZiAoY29kZSA8IDk3KSB7IHJldHVybiBjb2RlID09PSA5NSB9XG4gICAgaWYgKGNvZGUgPCAxMjMpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSkgfVxuICAgIGlmIChhc3RyYWwgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpXG4gIH1cblxuICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG4gIGZ1bmN0aW9uIGlzSWRlbnRpZmllckNoYXIoY29kZSwgYXN0cmFsKSB7XG4gICAgaWYgKGNvZGUgPCA0OCkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICAgIGlmIChjb2RlIDwgNTgpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDwgNjUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgICBpZiAoY29kZSA8IDk3KSB7IHJldHVybiBjb2RlID09PSA5NSB9XG4gICAgaWYgKGNvZGUgPCAxMjMpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpIH1cbiAgICBpZiAoYXN0cmFsID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzKSB8fCBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJDb2RlcylcbiAgfVxuXG4gIC8vICMjIFRva2VuIHR5cGVzXG5cbiAgLy8gVGhlIGFzc2lnbm1lbnQgb2YgZmluZS1ncmFpbmVkLCBpbmZvcm1hdGlvbi1jYXJyeWluZyB0eXBlIG9iamVjdHNcbiAgLy8gYWxsb3dzIHRoZSB0b2tlbml6ZXIgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBhXG4gIC8vIHRva2VuIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjaGVhcCBmb3IgdGhlIHBhcnNlciB0byBsb29rIHVwLlxuXG4gIC8vIEFsbCB0b2tlbiB0eXBlIHZhcmlhYmxlcyBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUsIHRvIG1ha2UgdGhlbVxuICAvLyBlYXN5IHRvIHJlY29nbml6ZS5cblxuICAvLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gcmVndWxhclxuICAvLyBleHByZXNzaW9ucyBhbmQgZGl2aXNpb25zLiBJdCBpcyBzZXQgb24gYWxsIHRva2VuIHR5cGVzIHRoYXQgY2FuXG4gIC8vIGJlIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gKHRodXMsIGEgc2xhc2ggYWZ0ZXIgdGhlbSB3b3VsZCBiZSBhXG4gIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbikuXG4gIC8vXG4gIC8vIFRoZSBgc3RhcnRzRXhwcmAgcHJvcGVydHkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdG9rZW4gZW5kcyBhXG4gIC8vIGB5aWVsZGAgZXhwcmVzc2lvbi4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IGVpdGhlciBjYW5cbiAgLy8gZGlyZWN0bHkgc3RhcnQgYW4gZXhwcmVzc2lvbiAobGlrZSBhIHF1b3RhdGlvbiBtYXJrKSBvciBjYW5cbiAgLy8gY29udGludWUgYW4gZXhwcmVzc2lvbiAobGlrZSB0aGUgYm9keSBvZiBhIHN0cmluZykuXG4gIC8vXG4gIC8vIGBpc0xvb3BgIG1hcmtzIGEga2V5d29yZCBhcyBzdGFydGluZyBhIGxvb3AsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuICAvLyBjb250aW51ZSBqdW1wcyB0byB0aGF0IGxhYmVsLlxuXG4gIHZhciBUb2tlblR5cGUgPSBmdW5jdGlvbiBUb2tlblR5cGUobGFiZWwsIGNvbmYpIHtcbiAgICBpZiAoIGNvbmYgPT09IHZvaWQgMCApIGNvbmYgPSB7fTtcblxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLmtleXdvcmQgPSBjb25mLmtleXdvcmQ7XG4gICAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gICAgdGhpcy5zdGFydHNFeHByID0gISFjb25mLnN0YXJ0c0V4cHI7XG4gICAgdGhpcy5pc0xvb3AgPSAhIWNvbmYuaXNMb29wO1xuICAgIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gICAgdGhpcy5wcmVmaXggPSAhIWNvbmYucHJlZml4O1xuICAgIHRoaXMucG9zdGZpeCA9ICEhY29uZi5wb3N0Zml4O1xuICAgIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wIHx8IG51bGw7XG4gICAgdGhpcy51cGRhdGVDb250ZXh0ID0gbnVsbDtcbiAgfTtcblxuICBmdW5jdGlvbiBiaW5vcChuYW1lLCBwcmVjKSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlblR5cGUobmFtZSwge2JlZm9yZUV4cHI6IHRydWUsIGJpbm9wOiBwcmVjfSlcbiAgfVxuICB2YXIgYmVmb3JlRXhwciA9IHtiZWZvcmVFeHByOiB0cnVlfSwgc3RhcnRzRXhwciA9IHtzdGFydHNFeHByOiB0cnVlfTtcblxuICAvLyBNYXAga2V5d29yZCBuYW1lcyB0byB0b2tlbiB0eXBlcy5cblxuICB2YXIga2V5d29yZHMkMSA9IHt9O1xuXG4gIC8vIFN1Y2NpbmN0IGRlZmluaXRpb25zIG9mIGtleXdvcmQgdG9rZW4gdHlwZXNcbiAgZnVuY3Rpb24ga3cobmFtZSwgb3B0aW9ucykge1xuICAgIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gICAgb3B0aW9ucy5rZXl3b3JkID0gbmFtZTtcbiAgICByZXR1cm4ga2V5d29yZHMkMVtuYW1lXSA9IG5ldyBUb2tlblR5cGUobmFtZSwgb3B0aW9ucylcbiAgfVxuXG4gIHZhciB0eXBlcyA9IHtcbiAgICBudW06IG5ldyBUb2tlblR5cGUoXCJudW1cIiwgc3RhcnRzRXhwciksXG4gICAgcmVnZXhwOiBuZXcgVG9rZW5UeXBlKFwicmVnZXhwXCIsIHN0YXJ0c0V4cHIpLFxuICAgIHN0cmluZzogbmV3IFRva2VuVHlwZShcInN0cmluZ1wiLCBzdGFydHNFeHByKSxcbiAgICBuYW1lOiBuZXcgVG9rZW5UeXBlKFwibmFtZVwiLCBzdGFydHNFeHByKSxcbiAgICBlb2Y6IG5ldyBUb2tlblR5cGUoXCJlb2ZcIiksXG5cbiAgICAvLyBQdW5jdHVhdGlvbiB0b2tlbiB0eXBlcy5cbiAgICBicmFja2V0TDogbmV3IFRva2VuVHlwZShcIltcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcbiAgICBicmFja2V0UjogbmV3IFRva2VuVHlwZShcIl1cIiksXG4gICAgYnJhY2VMOiBuZXcgVG9rZW5UeXBlKFwie1wiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIGJyYWNlUjogbmV3IFRva2VuVHlwZShcIn1cIiksXG4gICAgcGFyZW5MOiBuZXcgVG9rZW5UeXBlKFwiKFwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIHBhcmVuUjogbmV3IFRva2VuVHlwZShcIilcIiksXG4gICAgY29tbWE6IG5ldyBUb2tlblR5cGUoXCIsXCIsIGJlZm9yZUV4cHIpLFxuICAgIHNlbWk6IG5ldyBUb2tlblR5cGUoXCI7XCIsIGJlZm9yZUV4cHIpLFxuICAgIGNvbG9uOiBuZXcgVG9rZW5UeXBlKFwiOlwiLCBiZWZvcmVFeHByKSxcbiAgICBkb3Q6IG5ldyBUb2tlblR5cGUoXCIuXCIpLFxuICAgIHF1ZXN0aW9uOiBuZXcgVG9rZW5UeXBlKFwiP1wiLCBiZWZvcmVFeHByKSxcbiAgICBxdWVzdGlvbkRvdDogbmV3IFRva2VuVHlwZShcIj8uXCIpLFxuICAgIGFycm93OiBuZXcgVG9rZW5UeXBlKFwiPT5cIiwgYmVmb3JlRXhwciksXG4gICAgdGVtcGxhdGU6IG5ldyBUb2tlblR5cGUoXCJ0ZW1wbGF0ZVwiKSxcbiAgICBpbnZhbGlkVGVtcGxhdGU6IG5ldyBUb2tlblR5cGUoXCJpbnZhbGlkVGVtcGxhdGVcIiksXG4gICAgZWxsaXBzaXM6IG5ldyBUb2tlblR5cGUoXCIuLi5cIiwgYmVmb3JlRXhwciksXG4gICAgYmFja1F1b3RlOiBuZXcgVG9rZW5UeXBlKFwiYFwiLCBzdGFydHNFeHByKSxcbiAgICBkb2xsYXJCcmFjZUw6IG5ldyBUb2tlblR5cGUoXCIke1wiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuXG4gICAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgICAvLyBwYXJzZXIgdXNlIHRoZW0gcHJvcGVybHkgKHRoZSBwcmVzZW5jZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzXG4gICAgLy8gd2hhdCBjYXRlZ29yaXplcyB0aGVtIGFzIG9wZXJhdG9ycykuXG4gICAgLy9cbiAgICAvLyBgYmlub3BgLCB3aGVuIHByZXNlbnQsIHNwZWNpZmllcyB0aGF0IHRoaXMgb3BlcmF0b3IgaXMgYSBiaW5hcnlcbiAgICAvLyBvcGVyYXRvciwgYW5kIHdpbGwgcmVmZXIgdG8gaXRzIHByZWNlZGVuY2UuXG4gICAgLy9cbiAgICAvLyBgcHJlZml4YCBhbmQgYHBvc3RmaXhgIG1hcmsgdGhlIG9wZXJhdG9yIGFzIGEgcHJlZml4IG9yIHBvc3RmaXhcbiAgICAvLyB1bmFyeSBvcGVyYXRvci5cbiAgICAvL1xuICAgIC8vIGBpc0Fzc2lnbmAgbWFya3MgYWxsIG9mIGA9YCwgYCs9YCwgYC09YCBldGNldGVyYSwgd2hpY2ggYWN0IGFzXG4gICAgLy8gYmluYXJ5IG9wZXJhdG9ycyB3aXRoIGEgdmVyeSBsb3cgcHJlY2VkZW5jZSwgdGhhdCBzaG91bGQgcmVzdWx0XG4gICAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgICBlcTogbmV3IFRva2VuVHlwZShcIj1cIiwge2JlZm9yZUV4cHI6IHRydWUsIGlzQXNzaWduOiB0cnVlfSksXG4gICAgYXNzaWduOiBuZXcgVG9rZW5UeXBlKFwiXz1cIiwge2JlZm9yZUV4cHI6IHRydWUsIGlzQXNzaWduOiB0cnVlfSksXG4gICAgaW5jRGVjOiBuZXcgVG9rZW5UeXBlKFwiKysvLS1cIiwge3ByZWZpeDogdHJ1ZSwgcG9zdGZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIHByZWZpeDogbmV3IFRva2VuVHlwZShcIiEvflwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgbG9naWNhbE9SOiBiaW5vcChcInx8XCIsIDEpLFxuICAgIGxvZ2ljYWxBTkQ6IGJpbm9wKFwiJiZcIiwgMiksXG4gICAgYml0d2lzZU9SOiBiaW5vcChcInxcIiwgMyksXG4gICAgYml0d2lzZVhPUjogYmlub3AoXCJeXCIsIDQpLFxuICAgIGJpdHdpc2VBTkQ6IGJpbm9wKFwiJlwiLCA1KSxcbiAgICBlcXVhbGl0eTogYmlub3AoXCI9PS8hPS89PT0vIT09XCIsIDYpLFxuICAgIHJlbGF0aW9uYWw6IGJpbm9wKFwiPC8+Lzw9Lz49XCIsIDcpLFxuICAgIGJpdFNoaWZ0OiBiaW5vcChcIjw8Lz4+Lz4+PlwiLCA4KSxcbiAgICBwbHVzTWluOiBuZXcgVG9rZW5UeXBlKFwiKy8tXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogOSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgbW9kdWxvOiBiaW5vcChcIiVcIiwgMTApLFxuICAgIHN0YXI6IGJpbm9wKFwiKlwiLCAxMCksXG4gICAgc2xhc2g6IGJpbm9wKFwiL1wiLCAxMCksXG4gICAgc3RhcnN0YXI6IG5ldyBUb2tlblR5cGUoXCIqKlwiLCB7YmVmb3JlRXhwcjogdHJ1ZX0pLFxuICAgIGNvYWxlc2NlOiBiaW5vcChcIj8/XCIsIDEpLFxuXG4gICAgLy8gS2V5d29yZCB0b2tlbiB0eXBlcy5cbiAgICBfYnJlYWs6IGt3KFwiYnJlYWtcIiksXG4gICAgX2Nhc2U6IGt3KFwiY2FzZVwiLCBiZWZvcmVFeHByKSxcbiAgICBfY2F0Y2g6IGt3KFwiY2F0Y2hcIiksXG4gICAgX2NvbnRpbnVlOiBrdyhcImNvbnRpbnVlXCIpLFxuICAgIF9kZWJ1Z2dlcjoga3coXCJkZWJ1Z2dlclwiKSxcbiAgICBfZGVmYXVsdDoga3coXCJkZWZhdWx0XCIsIGJlZm9yZUV4cHIpLFxuICAgIF9kbzoga3coXCJkb1wiLCB7aXNMb29wOiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlfSksXG4gICAgX2Vsc2U6IGt3KFwiZWxzZVwiLCBiZWZvcmVFeHByKSxcbiAgICBfZmluYWxseToga3coXCJmaW5hbGx5XCIpLFxuICAgIF9mb3I6IGt3KFwiZm9yXCIsIHtpc0xvb3A6IHRydWV9KSxcbiAgICBfZnVuY3Rpb246IGt3KFwiZnVuY3Rpb25cIiwgc3RhcnRzRXhwciksXG4gICAgX2lmOiBrdyhcImlmXCIpLFxuICAgIF9yZXR1cm46IGt3KFwicmV0dXJuXCIsIGJlZm9yZUV4cHIpLFxuICAgIF9zd2l0Y2g6IGt3KFwic3dpdGNoXCIpLFxuICAgIF90aHJvdzoga3coXCJ0aHJvd1wiLCBiZWZvcmVFeHByKSxcbiAgICBfdHJ5OiBrdyhcInRyeVwiKSxcbiAgICBfdmFyOiBrdyhcInZhclwiKSxcbiAgICBfY29uc3Q6IGt3KFwiY29uc3RcIiksXG4gICAgX3doaWxlOiBrdyhcIndoaWxlXCIsIHtpc0xvb3A6IHRydWV9KSxcbiAgICBfd2l0aDoga3coXCJ3aXRoXCIpLFxuICAgIF9uZXc6IGt3KFwibmV3XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX3RoaXM6IGt3KFwidGhpc1wiLCBzdGFydHNFeHByKSxcbiAgICBfc3VwZXI6IGt3KFwic3VwZXJcIiwgc3RhcnRzRXhwciksXG4gICAgX2NsYXNzOiBrdyhcImNsYXNzXCIsIHN0YXJ0c0V4cHIpLFxuICAgIF9leHRlbmRzOiBrdyhcImV4dGVuZHNcIiwgYmVmb3JlRXhwciksXG4gICAgX2V4cG9ydDoga3coXCJleHBvcnRcIiksXG4gICAgX2ltcG9ydDoga3coXCJpbXBvcnRcIiwgc3RhcnRzRXhwciksXG4gICAgX251bGw6IGt3KFwibnVsbFwiLCBzdGFydHNFeHByKSxcbiAgICBfdHJ1ZToga3coXCJ0cnVlXCIsIHN0YXJ0c0V4cHIpLFxuICAgIF9mYWxzZToga3coXCJmYWxzZVwiLCBzdGFydHNFeHByKSxcbiAgICBfaW46IGt3KFwiaW5cIiwge2JlZm9yZUV4cHI6IHRydWUsIGJpbm9wOiA3fSksXG4gICAgX2luc3RhbmNlb2Y6IGt3KFwiaW5zdGFuY2VvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgYmlub3A6IDd9KSxcbiAgICBfdHlwZW9mOiBrdyhcInR5cGVvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX3ZvaWQ6IGt3KFwidm9pZFwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX2RlbGV0ZToga3coXCJkZWxldGVcIiwge2JlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pXG4gIH07XG5cbiAgLy8gTWF0Y2hlcyBhIHdob2xlIGxpbmUgYnJlYWsgKHdoZXJlIENSTEYgaXMgY29uc2lkZXJlZCBhIHNpbmdsZVxuICAvLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy5cblxuICB2YXIgbGluZUJyZWFrID0gL1xcclxcbj98XFxufFxcdTIwMjh8XFx1MjAyOS87XG4gIHZhciBsaW5lQnJlYWtHID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCBcImdcIik7XG5cbiAgZnVuY3Rpb24gaXNOZXdMaW5lKGNvZGUsIGVjbWEyMDE5U3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IDEwIHx8IGNvZGUgPT09IDEzIHx8ICghZWNtYTIwMTlTdHJpbmcgJiYgKGNvZGUgPT09IDB4MjAyOCB8fCBjb2RlID09PSAweDIwMjkpKVxuICB9XG5cbiAgdmFyIG5vbkFTQ0lJd2hpdGVzcGFjZSA9IC9bXFx1MTY4MFxcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdWZlZmZdLztcblxuICB2YXIgc2tpcFdoaXRlU3BhY2UgPSAvKD86XFxzfFxcL1xcLy4qfFxcL1xcKlteXSo/XFwqXFwvKSovZztcblxuICB2YXIgcmVmID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093blByb3BlcnR5ID0gcmVmLmhhc093blByb3BlcnR5O1xuICB2YXIgdG9TdHJpbmcgPSByZWYudG9TdHJpbmc7XG5cbiAgLy8gQ2hlY2tzIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS5cblxuICBmdW5jdGlvbiBoYXMob2JqLCBwcm9wTmFtZSkge1xuICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcE5hbWUpXG4gIH1cblxuICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgKGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIChcbiAgICB0b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIlxuICApOyB9KTtcblxuICBmdW5jdGlvbiB3b3Jkc1JlZ2V4cCh3b3Jkcykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgd29yZHMucmVwbGFjZSgvIC9nLCBcInxcIikgKyBcIikkXCIpXG4gIH1cblxuICAvLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGZvciB0aGVcbiAgLy8gYHN0YXJ0TG9jYCBhbmQgYGVuZExvY2AgcHJvcGVydGllcy5cblxuICB2YXIgUG9zaXRpb24gPSBmdW5jdGlvbiBQb3NpdGlvbihsaW5lLCBjb2wpIHtcbiAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIHRoaXMuY29sdW1uID0gY29sO1xuICB9O1xuXG4gIFBvc2l0aW9uLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQgKG4pIHtcbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZSwgdGhpcy5jb2x1bW4gKyBuKVxuICB9O1xuXG4gIHZhciBTb3VyY2VMb2NhdGlvbiA9IGZ1bmN0aW9uIFNvdXJjZUxvY2F0aW9uKHAsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgaWYgKHAuc291cmNlRmlsZSAhPT0gbnVsbCkgeyB0aGlzLnNvdXJjZSA9IHAuc291cmNlRmlsZTsgfVxuICB9O1xuXG4gIC8vIFRoZSBgZ2V0TGluZUluZm9gIGZ1bmN0aW9uIGlzIG1vc3RseSB1c2VmdWwgd2hlbiB0aGVcbiAgLy8gYGxvY2F0aW9uc2Agb3B0aW9uIGlzIG9mZiAoZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpIGFuZCB5b3VcbiAgLy8gd2FudCB0byBmaW5kIHRoZSBsaW5lL2NvbHVtbiBwb3NpdGlvbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXJcbiAgLy8gb2Zmc2V0LiBgaW5wdXRgIHNob3VsZCBiZSB0aGUgY29kZSBzdHJpbmcgdGhhdCB0aGUgb2Zmc2V0IHJlZmVyc1xuICAvLyBpbnRvLlxuXG4gIGZ1bmN0aW9uIGdldExpbmVJbmZvKGlucHV0LCBvZmZzZXQpIHtcbiAgICBmb3IgKHZhciBsaW5lID0gMSwgY3VyID0gMDs7KSB7XG4gICAgICBsaW5lQnJlYWtHLmxhc3RJbmRleCA9IGN1cjtcbiAgICAgIHZhciBtYXRjaCA9IGxpbmVCcmVha0cuZXhlYyhpbnB1dCk7XG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPCBvZmZzZXQpIHtcbiAgICAgICAgKytsaW5lO1xuICAgICAgICBjdXIgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24obGluZSwgb2Zmc2V0IC0gY3VyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBmdXJ0aGVyIGNvbmZpZ3VyZVxuICAvLyB0aGUgcGFyc2VyIHByb2Nlc3MuIFRoZXNlIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIGBlY21hVmVyc2lvbmAgaW5kaWNhdGVzIHRoZSBFQ01BU2NyaXB0IHZlcnNpb24gdG8gcGFyc2UuIE11c3QgYmVcbiAgICAvLyBlaXRoZXIgMywgNSwgNiAoMjAxNSksIDcgKDIwMTYpLCA4ICgyMDE3KSwgOSAoMjAxOCksIG9yIDEwXG4gICAgLy8gKDIwMTkpLiBUaGlzIGluZmx1ZW5jZXMgc3VwcG9ydCBmb3Igc3RyaWN0IG1vZGUsIHRoZSBzZXQgb2ZcbiAgICAvLyByZXNlcnZlZCB3b3JkcywgYW5kIHN1cHBvcnQgZm9yIG5ldyBzeW50YXggZmVhdHVyZXMuIFRoZSBkZWZhdWx0XG4gICAgLy8gaXMgMTAuXG4gICAgZWNtYVZlcnNpb246IDEwLFxuICAgIC8vIGBzb3VyY2VUeXBlYCBpbmRpY2F0ZXMgdGhlIG1vZGUgdGhlIGNvZGUgc2hvdWxkIGJlIHBhcnNlZCBpbi5cbiAgICAvLyBDYW4gYmUgZWl0aGVyIGBcInNjcmlwdFwiYCBvciBgXCJtb2R1bGVcImAuIFRoaXMgaW5mbHVlbmNlcyBnbG9iYWxcbiAgICAvLyBzdHJpY3QgbW9kZSBhbmQgcGFyc2luZyBvZiBgaW1wb3J0YCBhbmQgYGV4cG9ydGAgZGVjbGFyYXRpb25zLlxuICAgIHNvdXJjZVR5cGU6IFwic2NyaXB0XCIsXG4gICAgLy8gYG9uSW5zZXJ0ZWRTZW1pY29sb25gIGNhbiBiZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyB3aGVuIGEgc2VtaWNvbG9uIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQuIEl0IHdpbGwgYmUgcGFzc2VkXG4gICAgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb21tYSBhcyBhbiBvZmZzZXQsIGFuZCBpZiBgbG9jYXRpb25zYCBpc1xuICAgIC8vIGVuYWJsZWQsIGl0IGlzIGdpdmVuIHRoZSBsb2NhdGlvbiBhcyBhIGB7bGluZSwgY29sdW1ufWAgb2JqZWN0XG4gICAgLy8gYXMgc2Vjb25kIGFyZ3VtZW50LlxuICAgIG9uSW5zZXJ0ZWRTZW1pY29sb246IG51bGwsXG4gICAgLy8gYG9uVHJhaWxpbmdDb21tYWAgaXMgc2ltaWxhciB0byBgb25JbnNlcnRlZFNlbWljb2xvbmAsIGJ1dCBmb3JcbiAgICAvLyB0cmFpbGluZyBjb21tYXMuXG4gICAgb25UcmFpbGluZ0NvbW1hOiBudWxsLFxuICAgIC8vIEJ5IGRlZmF1bHQsIHJlc2VydmVkIHdvcmRzIGFyZSBvbmx5IGVuZm9yY2VkIGlmIGVjbWFWZXJzaW9uID49IDUuXG4gICAgLy8gU2V0IGBhbGxvd1Jlc2VydmVkYCB0byBhIGJvb2xlYW4gdmFsdWUgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb25cbiAgICAvLyBhbiBvZmYuIFdoZW4gdGhpcyBvcHRpb24gaGFzIHRoZSB2YWx1ZSBcIm5ldmVyXCIsIHJlc2VydmVkIHdvcmRzXG4gICAgLy8gYW5kIGtleXdvcmRzIGNhbiBhbHNvIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5IG5hbWVzLlxuICAgIGFsbG93UmVzZXJ2ZWQ6IG51bGwsXG4gICAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gICAgLy8gZXJyb3IuXG4gICAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGZhbHNlLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgaW1wb3J0L2V4cG9ydCBzdGF0ZW1lbnRzIGFyZSBub3QgY29uc3RyYWluZWQgdG9cbiAgICAvLyBhcHBlYXJpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbS5cbiAgICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGZhbHNlLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgYXdhaXQgaWRlbnRpZmllcnMgYXJlIGFsbG93ZWQgdG8gYXBwZWFyIGF0IHRoZSB0b3AtbGV2ZWwgc2NvcGUsXG4gICAgLy8gYnV0IHRoZXkgYXJlIHN0aWxsIG5vdCBhbGxvd2VkIGluIG5vbi1hc3luYyBmdW5jdGlvbnMuXG4gICAgYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gICAgLy8gV2hlbiBlbmFibGVkLCBoYXNoYmFuZyBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiBmaWxlXG4gICAgLy8gaXMgYWxsb3dlZCBhbmQgdHJlYXRlZCBhcyBhIGxpbmUgY29tbWVudC5cbiAgICBhbGxvd0hhc2hCYW5nOiBmYWxzZSxcbiAgICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCBgbG9jYCBwcm9wZXJ0aWVzIGhvbGRpbmcgb2JqZWN0cyB3aXRoXG4gICAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBpbiBge2xpbmUsIGNvbHVtbn1gIGZvcm0gKHdpdGhcbiAgICAvLyBsaW5lIGJlaW5nIDEtYmFzZWQgYW5kIGNvbHVtbiAwLWJhc2VkKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5vZGVzLlxuICAgIGxvY2F0aW9uczogZmFsc2UsXG4gICAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvblRva2VuYCBvcHRpb24sIHdoaWNoIHdpbGxcbiAgICAvLyBjYXVzZSBBY29ybiB0byBjYWxsIHRoYXQgZnVuY3Rpb24gd2l0aCBvYmplY3QgaW4gdGhlIHNhbWVcbiAgICAvLyBmb3JtYXQgYXMgdG9rZW5zIHJldHVybmVkIGZyb20gYHRva2VuaXplcigpLmdldFRva2VuKClgLiBOb3RlXG4gICAgLy8gdGhhdCB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgdGhlIHBhcnNlciBmcm9tIHRoZVxuICAgIC8vIGNhbGxiYWNrXHUyMDE0dGhhdCB3aWxsIGNvcnJ1cHQgaXRzIGludGVybmFsIHN0YXRlLlxuICAgIG9uVG9rZW46IG51bGwsXG4gICAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvbkNvbW1lbnRgIG9wdGlvbiwgd2hpY2ggd2lsbFxuICAgIC8vIGNhdXNlIEFjb3JuIHRvIGNhbGwgdGhhdCBmdW5jdGlvbiB3aXRoIGAoYmxvY2ssIHRleHQsIHN0YXJ0LFxuICAgIC8vIGVuZClgIHBhcmFtZXRlcnMgd2hlbmV2ZXIgYSBjb21tZW50IGlzIHNraXBwZWQuIGBibG9ja2AgaXMgYVxuICAgIC8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgYSBibG9jayAoYC8qICovYCkgY29tbWVudCxcbiAgICAvLyBgdGV4dGAgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnQsIGFuZCBgc3RhcnRgIGFuZCBgZW5kYCBhcmVcbiAgICAvLyBjaGFyYWN0ZXIgb2Zmc2V0cyB0aGF0IGRlbm90ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tbWVudC5cbiAgICAvLyBXaGVuIHRoZSBgbG9jYXRpb25zYCBvcHRpb24gaXMgb24sIHR3byBtb3JlIHBhcmFtZXRlcnMgYXJlXG4gICAgLy8gcGFzc2VkLCB0aGUgZnVsbCBge2xpbmUsIGNvbHVtbn1gIGxvY2F0aW9ucyBvZiB0aGUgc3RhcnQgYW5kXG4gICAgLy8gZW5kIG9mIHRoZSBjb21tZW50cy4gTm90ZSB0aGF0IHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCB0aGVcbiAgICAvLyBwYXJzZXIgZnJvbSB0aGUgY2FsbGJhY2tcdTIwMTR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuXG4gICAgb25Db21tZW50OiBudWxsLFxuICAgIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgICAvLyBgc3RhcnRgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzIChkaXJlY3RseSBvbiB0aGUgbm9kZSwgcmF0aGVyIHRoYW5cbiAgICAvLyB0aGUgYGxvY2Agb2JqZWN0LCB3aGljaCBob2xkcyBsaW5lL2NvbHVtbiBkYXRhLiBUbyBhbHNvIGFkZCBhXG4gICAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgICAvLyBlbmRdYCBhcnJheSB3aXRoIHRoZSBzYW1lIG51bWJlcnMsIHNldCB0aGUgYHJhbmdlc2Agb3B0aW9uIHRvXG4gICAgLy8gYHRydWVgLlxuICAgIC8vXG4gICAgLy8gW3JhbmdlXTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1Njc4XG4gICAgcmFuZ2VzOiBmYWxzZSxcbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0byBwYXJzZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIEFTVCBieVxuICAgIC8vIHBhc3NpbmcgdGhlIHRyZWUgcHJvZHVjZWQgYnkgcGFyc2luZyB0aGUgZmlyc3QgZmlsZSBhc1xuICAgIC8vIGBwcm9ncmFtYCBvcHRpb24gaW4gc3Vic2VxdWVudCBwYXJzZXMuIFRoaXMgd2lsbCBhZGQgdGhlXG4gICAgLy8gdG9wbGV2ZWwgZm9ybXMgb2YgdGhlIHBhcnNlZCBmaWxlIHRvIHRoZSBgUHJvZ3JhbWAgKHRvcCkgbm9kZVxuICAgIC8vIG9mIGFuIGV4aXN0aW5nIHBhcnNlIHRyZWUuXG4gICAgcHJvZ3JhbTogbnVsbCxcbiAgICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCB5b3UgY2FuIHBhc3MgdGhpcyB0byByZWNvcmQgdGhlIHNvdXJjZVxuICAgIC8vIGZpbGUgaW4gZXZlcnkgbm9kZSdzIGBsb2NgIG9iamVjdC5cbiAgICBzb3VyY2VGaWxlOiBudWxsLFxuICAgIC8vIFRoaXMgdmFsdWUsIGlmIGdpdmVuLCBpcyBzdG9yZWQgaW4gZXZlcnkgbm9kZSwgd2hldGhlclxuICAgIC8vIGBsb2NhdGlvbnNgIGlzIG9uIG9yIG9mZi5cbiAgICBkaXJlY3RTb3VyY2VGaWxlOiBudWxsLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucyBhcmUgcmVwcmVzZW50ZWQgYnlcbiAgICAvLyAobm9uLXN0YW5kYXJkKSBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2Rlc1xuICAgIHByZXNlcnZlUGFyZW5zOiBmYWxzZVxuICB9O1xuXG4gIC8vIEludGVycHJldCBhbmQgZGVmYXVsdCBhbiBvcHRpb25zIG9iamVjdFxuXG4gIGZ1bmN0aW9uIGdldE9wdGlvbnMob3B0cykge1xuICAgIHZhciBvcHRpb25zID0ge307XG5cbiAgICBmb3IgKHZhciBvcHQgaW4gZGVmYXVsdE9wdGlvbnMpXG4gICAgICB7IG9wdGlvbnNbb3B0XSA9IG9wdHMgJiYgaGFzKG9wdHMsIG9wdCkgPyBvcHRzW29wdF0gOiBkZWZhdWx0T3B0aW9uc1tvcHRdOyB9XG5cbiAgICBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA+PSAyMDE1KVxuICAgICAgeyBvcHRpb25zLmVjbWFWZXJzaW9uIC09IDIwMDk7IH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgPT0gbnVsbClcbiAgICAgIHsgb3B0aW9ucy5hbGxvd1Jlc2VydmVkID0gb3B0aW9ucy5lY21hVmVyc2lvbiA8IDU7IH1cblxuICAgIGlmIChpc0FycmF5KG9wdGlvbnMub25Ub2tlbikpIHtcbiAgICAgIHZhciB0b2tlbnMgPSBvcHRpb25zLm9uVG9rZW47XG4gICAgICBvcHRpb25zLm9uVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHsgcmV0dXJuIHRva2Vucy5wdXNoKHRva2VuKTsgfTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob3B0aW9ucy5vbkNvbW1lbnQpKVxuICAgICAgeyBvcHRpb25zLm9uQ29tbWVudCA9IHB1c2hDb21tZW50KG9wdGlvbnMsIG9wdGlvbnMub25Db21tZW50KTsgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hDb21tZW50KG9wdGlvbnMsIGFycmF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGJsb2NrLCB0ZXh0LCBzdGFydCwgZW5kLCBzdGFydExvYywgZW5kTG9jKSB7XG4gICAgICB2YXIgY29tbWVudCA9IHtcbiAgICAgICAgdHlwZTogYmxvY2sgPyBcIkJsb2NrXCIgOiBcIkxpbmVcIixcbiAgICAgICAgdmFsdWU6IHRleHQsXG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmRcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgICAgIHsgY29tbWVudC5sb2MgPSBuZXcgU291cmNlTG9jYXRpb24odGhpcywgc3RhcnRMb2MsIGVuZExvYyk7IH1cbiAgICAgIGlmIChvcHRpb25zLnJhbmdlcylcbiAgICAgICAgeyBjb21tZW50LnJhbmdlID0gW3N0YXJ0LCBlbmRdOyB9XG4gICAgICBhcnJheS5wdXNoKGNvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggc2NvcGUgZ2V0cyBhIGJpdHNldCB0aGF0IG1heSBjb250YWluIHRoZXNlIGZsYWdzXG4gIHZhclxuICAgICAgU0NPUEVfVE9QID0gMSxcbiAgICAgIFNDT1BFX0ZVTkNUSU9OID0gMixcbiAgICAgIFNDT1BFX1ZBUiA9IFNDT1BFX1RPUCB8IFNDT1BFX0ZVTkNUSU9OLFxuICAgICAgU0NPUEVfQVNZTkMgPSA0LFxuICAgICAgU0NPUEVfR0VORVJBVE9SID0gOCxcbiAgICAgIFNDT1BFX0FSUk9XID0gMTYsXG4gICAgICBTQ09QRV9TSU1QTEVfQ0FUQ0ggPSAzMixcbiAgICAgIFNDT1BFX1NVUEVSID0gNjQsXG4gICAgICBTQ09QRV9ESVJFQ1RfU1VQRVIgPSAxMjg7XG5cbiAgZnVuY3Rpb24gZnVuY3Rpb25GbGFncyhhc3luYywgZ2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIFNDT1BFX0ZVTkNUSU9OIHwgKGFzeW5jID8gU0NPUEVfQVNZTkMgOiAwKSB8IChnZW5lcmF0b3IgPyBTQ09QRV9HRU5FUkFUT1IgOiAwKVxuICB9XG5cbiAgLy8gVXNlZCBpbiBjaGVja0xWYWwgYW5kIGRlY2xhcmVOYW1lIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhIGJpbmRpbmdcbiAgdmFyXG4gICAgICBCSU5EX05PTkUgPSAwLCAvLyBOb3QgYSBiaW5kaW5nXG4gICAgICBCSU5EX1ZBUiA9IDEsIC8vIFZhci1zdHlsZSBiaW5kaW5nXG4gICAgICBCSU5EX0xFWElDQUwgPSAyLCAvLyBMZXQtIG9yIGNvbnN0LXN0eWxlIGJpbmRpbmdcbiAgICAgIEJJTkRfRlVOQ1RJT04gPSAzLCAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgQklORF9TSU1QTEVfQ0FUQ0ggPSA0LCAvLyBTaW1wbGUgKGlkZW50aWZpZXIgcGF0dGVybikgY2F0Y2ggYmluZGluZ1xuICAgICAgQklORF9PVVRTSURFID0gNTsgLy8gU3BlY2lhbCBjYXNlIGZvciBmdW5jdGlvbiBuYW1lcyBhcyBib3VuZCBpbnNpZGUgdGhlIGZ1bmN0aW9uXG5cbiAgdmFyIFBhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihvcHRpb25zLCBpbnB1dCwgc3RhcnRQb3MpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLnNvdXJjZUZpbGUgPSBvcHRpb25zLnNvdXJjZUZpbGU7XG4gICAgdGhpcy5rZXl3b3JkcyA9IHdvcmRzUmVnZXhwKGtleXdvcmRzW29wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiA/IDYgOiBvcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCIgPyBcIjVtb2R1bGVcIiA6IDVdKTtcbiAgICB2YXIgcmVzZXJ2ZWQgPSBcIlwiO1xuICAgIGlmIChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgIT09IHRydWUpIHtcbiAgICAgIGZvciAodmFyIHYgPSBvcHRpb25zLmVjbWFWZXJzaW9uOzsgdi0tKVxuICAgICAgICB7IGlmIChyZXNlcnZlZCA9IHJlc2VydmVkV29yZHNbdl0pIHsgYnJlYWsgfSB9XG4gICAgICBpZiAob3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiKSB7IHJlc2VydmVkICs9IFwiIGF3YWl0XCI7IH1cbiAgICB9XG4gICAgdGhpcy5yZXNlcnZlZFdvcmRzID0gd29yZHNSZWdleHAocmVzZXJ2ZWQpO1xuICAgIHZhciByZXNlcnZlZFN0cmljdCA9IChyZXNlcnZlZCA/IHJlc2VydmVkICsgXCIgXCIgOiBcIlwiKSArIHJlc2VydmVkV29yZHMuc3RyaWN0O1xuICAgIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdCA9IHdvcmRzUmVnZXhwKHJlc2VydmVkU3RyaWN0KTtcbiAgICB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3RCaW5kID0gd29yZHNSZWdleHAocmVzZXJ2ZWRTdHJpY3QgKyBcIiBcIiArIHJlc2VydmVkV29yZHMuc3RyaWN0QmluZCk7XG4gICAgdGhpcy5pbnB1dCA9IFN0cmluZyhpbnB1dCk7XG5cbiAgICAvLyBVc2VkIHRvIHNpZ25hbCB0byBjYWxsZXJzIG9mIGByZWFkV29yZDFgIHdoZXRoZXIgdGhlIHdvcmRcbiAgICAvLyBjb250YWluZWQgYW55IGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd29yZHMgd2l0aFxuICAgIC8vIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMga2V5d29yZHMuXG4gICAgdGhpcy5jb250YWluc0VzYyA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHVwIHRva2VuIHN0YXRlXG5cbiAgICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC5cbiAgICBpZiAoc3RhcnRQb3MpIHtcbiAgICAgIHRoaXMucG9zID0gc3RhcnRQb3M7XG4gICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5wdXQubGFzdEluZGV4T2YoXCJcXG5cIiwgc3RhcnRQb3MgLSAxKSArIDE7XG4gICAgICB0aGlzLmN1ckxpbmUgPSB0aGlzLmlucHV0LnNsaWNlKDAsIHRoaXMubGluZVN0YXJ0KS5zcGxpdChsaW5lQnJlYWspLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLmxpbmVTdGFydCA9IDA7XG4gICAgICB0aGlzLmN1ckxpbmUgPSAxO1xuICAgIH1cblxuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gICAgLy8gSXRzIHR5cGVcbiAgICB0aGlzLnR5cGUgPSB0eXBlcy5lb2Y7XG4gICAgLy8gRm9yIHRva2VucyB0aGF0IGluY2x1ZGUgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZWlyIHR5cGUsIHRoZSB2YWx1ZVxuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIC8vIEl0cyBzdGFydCBhbmQgZW5kIG9mZnNldFxuICAgIHRoaXMuc3RhcnQgPSB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICAgIC8vIEFuZCwgaWYgbG9jYXRpb25zIGFyZSB1c2VkLCB0aGUge2xpbmUsIGNvbHVtbn0gb2JqZWN0XG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aG9zZSBvZmZzZXRzXG4gICAgdGhpcy5zdGFydExvYyA9IHRoaXMuZW5kTG9jID0gdGhpcy5jdXJQb3NpdGlvbigpO1xuXG4gICAgLy8gUG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91cyB0b2tlblxuICAgIHRoaXMubGFzdFRva0VuZExvYyA9IHRoaXMubGFzdFRva1N0YXJ0TG9jID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMubGFzdFRva0VuZCA9IHRoaXMucG9zO1xuXG4gICAgLy8gVGhlIGNvbnRleHQgc3RhY2sgaXMgdXNlZCB0byBzdXBlcmZpY2lhbGx5IHRyYWNrIHN5bnRhY3RpY1xuICAgIC8vIGNvbnRleHQgdG8gcHJlZGljdCB3aGV0aGVyIGEgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG93ZWQgaW4gYVxuICAgIC8vIGdpdmVuIHBvc2l0aW9uLlxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuaW5pdGlhbENvbnRleHQoKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcblxuICAgIC8vIEZpZ3VyZSBvdXQgaWYgaXQncyBhIG1vZHVsZSBjb2RlLlxuICAgIHRoaXMuaW5Nb2R1bGUgPSBvcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCI7XG4gICAgdGhpcy5zdHJpY3QgPSB0aGlzLmluTW9kdWxlIHx8IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMucG9zKTtcblxuICAgIC8vIFVzZWQgdG8gc2lnbmlmeSB0aGUgc3RhcnQgb2YgYSBwb3RlbnRpYWwgYXJyb3cgZnVuY3Rpb25cbiAgICB0aGlzLnBvdGVudGlhbEFycm93QXQgPSAtMTtcblxuICAgIC8vIFBvc2l0aW9ucyB0byBkZWxheWVkLWNoZWNrIHRoYXQgeWllbGQvYXdhaXQgZG9lcyBub3QgZXhpc3QgaW4gZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgIHRoaXMueWllbGRQb3MgPSB0aGlzLmF3YWl0UG9zID0gdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICAvLyBMYWJlbHMgaW4gc2NvcGUuXG4gICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAvLyBUaHVzLWZhciB1bmRlZmluZWQgZXhwb3J0cy5cbiAgICB0aGlzLnVuZGVmaW5lZEV4cG9ydHMgPSB7fTtcblxuICAgIC8vIElmIGVuYWJsZWQsIHNraXAgbGVhZGluZyBoYXNoYmFuZyBsaW5lLlxuICAgIGlmICh0aGlzLnBvcyA9PT0gMCAmJiBvcHRpb25zLmFsbG93SGFzaEJhbmcgJiYgdGhpcy5pbnB1dC5zbGljZSgwLCAyKSA9PT0gXCIjIVwiKVxuICAgICAgeyB0aGlzLnNraXBMaW5lQ29tbWVudCgyKTsgfVxuXG4gICAgLy8gU2NvcGUgdHJhY2tpbmcgZm9yIGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcyAoc2VlIHNjb3BlLmpzKVxuICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgIHRoaXMuZW50ZXJTY29wZShTQ09QRV9UT1ApO1xuXG4gICAgLy8gRm9yIFJlZ0V4cCB2YWxpZGF0aW9uXG4gICAgdGhpcy5yZWdleHBTdGF0ZSA9IG51bGw7XG4gIH07XG5cbiAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgaW5GdW5jdGlvbjogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbkdlbmVyYXRvcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbkFzeW5jOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGFsbG93U3VwZXI6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxsb3dEaXJlY3RTdXBlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSx0cmVhdEZ1bmN0aW9uc0FzVmFyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlICgpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMub3B0aW9ucy5wcm9ncmFtIHx8IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRvcExldmVsKG5vZGUpXG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmluRnVuY3Rpb24uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuY3VycmVudFZhclNjb3BlKCkuZmxhZ3MgJiBTQ09QRV9GVU5DVElPTikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5pbkdlbmVyYXRvci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0dFTkVSQVRPUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5pbkFzeW5jLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRWYXJTY29wZSgpLmZsYWdzICYgU0NPUEVfQVNZTkMpID4gMCB9O1xuICBwcm90b3R5cGVBY2Nlc3NvcnMuYWxsb3dTdXBlci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MgJiBTQ09QRV9TVVBFUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5hbGxvd0RpcmVjdFN1cGVyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy50cmVhdEZ1bmN0aW9uc0FzVmFyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodGhpcy5jdXJyZW50U2NvcGUoKSkgfTtcblxuICAvLyBTd2l0Y2ggdG8gYSBnZXR0ZXIgZm9yIDcuMC4wLlxuICBQYXJzZXIucHJvdG90eXBlLmluTm9uQXJyb3dGdW5jdGlvbiA9IGZ1bmN0aW9uIGluTm9uQXJyb3dGdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MgJiBTQ09QRV9GVU5DVElPTikgPiAwIH07XG5cbiAgUGFyc2VyLmV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZCAoKSB7XG4gICAgICB2YXIgcGx1Z2lucyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIHBsdWdpbnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHZhciBjbHMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgeyBjbHMgPSBwbHVnaW5zW2ldKGNscyk7IH1cbiAgICByZXR1cm4gY2xzXG4gIH07XG5cbiAgUGFyc2VyLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UgKGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpXG4gIH07XG5cbiAgUGFyc2VyLnBhcnNlRXhwcmVzc2lvbkF0ID0gZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uQXQgKGlucHV0LCBwb3MsIG9wdGlvbnMpIHtcbiAgICB2YXIgcGFyc2VyID0gbmV3IHRoaXMob3B0aW9ucywgaW5wdXQsIHBvcyk7XG4gICAgcGFyc2VyLm5leHRUb2tlbigpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VFeHByZXNzaW9uKClcbiAgfTtcblxuICBQYXJzZXIudG9rZW5pemVyID0gZnVuY3Rpb24gdG9rZW5pemVyIChpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgdGhpcyhvcHRpb25zLCBpbnB1dClcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggUGFyc2VyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgdmFyIHBwID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyAjIyBQYXJzZXIgdXRpbGl0aWVzXG5cbiAgdmFyIGxpdGVyYWwgPSAvXig/OicoKD86XFxcXC58W14nXFxcXF0pKj8pJ3xcIigoPzpcXFxcLnxbXlwiXFxcXF0pKj8pXCIpLztcbiAgcHAuc3RyaWN0RGlyZWN0aXZlID0gZnVuY3Rpb24oc3RhcnQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBzdHJpbmcgbGl0ZXJhbC5cbiAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGg7XG4gICAgICB2YXIgbWF0Y2ggPSBsaXRlcmFsLmV4ZWModGhpcy5pbnB1dC5zbGljZShzdGFydCkpO1xuICAgICAgaWYgKCFtYXRjaCkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgaWYgKChtYXRjaFsxXSB8fCBtYXRjaFsyXSkgPT09IFwidXNlIHN0cmljdFwiKSB7XG4gICAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB2YXIgc3BhY2VBZnRlciA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCksIGVuZCA9IHNwYWNlQWZ0ZXIuaW5kZXggKyBzcGFjZUFmdGVyWzBdLmxlbmd0aDtcbiAgICAgICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJBdChlbmQpO1xuICAgICAgICByZXR1cm4gbmV4dCA9PT0gXCI7XCIgfHwgbmV4dCA9PT0gXCJ9XCIgfHxcbiAgICAgICAgICAobGluZUJyZWFrLnRlc3Qoc3BhY2VBZnRlclswXSkgJiZcbiAgICAgICAgICAgISgvWyhgLlsrXFwtLyolPD49LD9eJl0vLnRlc3QobmV4dCkgfHwgbmV4dCA9PT0gXCIhXCIgJiYgdGhpcy5pbnB1dC5jaGFyQXQoZW5kICsgMSkgPT09IFwiPVwiKSlcbiAgICAgIH1cbiAgICAgIHN0YXJ0ICs9IG1hdGNoWzBdLmxlbmd0aDtcblxuICAgICAgLy8gU2tpcCBzZW1pY29sb24sIGlmIGFueS5cbiAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5pbnB1dFtzdGFydF0gPT09IFwiO1wiKVxuICAgICAgICB7IHN0YXJ0Kys7IH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUHJlZGljYXRlIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW5cbiAgLy8gdHlwZSwgYW5kIGlmIHllcywgY29uc3VtZXMgaXQgYXMgYSBzaWRlIGVmZmVjdC5cblxuICBwcC5lYXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH07XG5cbiAgLy8gVGVzdHMgd2hldGhlciBwYXJzZWQgdG9rZW4gaXMgYSBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgcHAuaXNDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy52YWx1ZSA9PT0gbmFtZSAmJiAhdGhpcy5jb250YWluc0VzY1xuICB9O1xuXG4gIC8vIENvbnN1bWVzIGNvbnRleHR1YWwga2V5d29yZCBpZiBwb3NzaWJsZS5cblxuICBwcC5lYXRDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghdGhpcy5pc0NvbnRleHR1YWwobmFtZSkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIC8vIEFzc2VydHMgdGhhdCBmb2xsb3dpbmcgdG9rZW4gaXMgZ2l2ZW4gY29udGV4dHVhbCBrZXl3b3JkLlxuXG4gIHBwLmV4cGVjdENvbnRleHR1YWwgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmVhdENvbnRleHR1YWwobmFtZSkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgfTtcblxuICAvLyBUZXN0IHdoZXRoZXIgYSBzZW1pY29sb24gY2FuIGJlIGluc2VydGVkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuXG4gIHBwLmNhbkluc2VydFNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzLmVvZiB8fFxuICAgICAgdGhpcy50eXBlID09PSB0eXBlcy5icmFjZVIgfHxcbiAgICAgIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSlcbiAgfTtcblxuICBwcC5pbnNlcnRTZW1pY29sb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKVxuICAgICAgICB7IHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKTsgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH07XG5cbiAgLy8gQ29uc3VtZSBhIHNlbWljb2xvbiwgb3IsIGZhaWxpbmcgdGhhdCwgc2VlIGlmIHdlIGFyZSBhbGxvd2VkIHRvXG4gIC8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG4gIHBwLnNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5lYXQodHlwZXMuc2VtaSkgJiYgIXRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgfTtcblxuICBwcC5hZnRlclRyYWlsaW5nQ29tbWEgPSBmdW5jdGlvbih0b2tUeXBlLCBub3ROZXh0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdG9rVHlwZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vblRyYWlsaW5nQ29tbWEpXG4gICAgICAgIHsgdGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSh0aGlzLmxhc3RUb2tTdGFydCwgdGhpcy5sYXN0VG9rU3RhcnRMb2MpOyB9XG4gICAgICBpZiAoIW5vdE5leHQpXG4gICAgICAgIHsgdGhpcy5uZXh0KCk7IH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9O1xuXG4gIC8vIEV4cGVjdCBhIHRva2VuIG9mIGEgZ2l2ZW4gdHlwZS4gSWYgZm91bmQsIGNvbnN1bWUgaXQsIG90aGVyd2lzZSxcbiAgLy8gcmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci5cblxuICBwcC5leHBlY3QgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdGhpcy5lYXQodHlwZSkgfHwgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH07XG5cbiAgLy8gUmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci5cblxuICBwcC51bmV4cGVjdGVkID0gZnVuY3Rpb24ocG9zKSB7XG4gICAgdGhpcy5yYWlzZShwb3MgIT0gbnVsbCA/IHBvcyA6IHRoaXMuc3RhcnQsIFwiVW5leHBlY3RlZCB0b2tlblwiKTtcbiAgfTtcblxuICBmdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXJyb3JzKCkge1xuICAgIHRoaXMuc2hvcnRoYW5kQXNzaWduID1cbiAgICB0aGlzLnRyYWlsaW5nQ29tbWEgPVxuICAgIHRoaXMucGFyZW50aGVzaXplZEFzc2lnbiA9XG4gICAgdGhpcy5wYXJlbnRoZXNpemVkQmluZCA9XG4gICAgdGhpcy5kb3VibGVQcm90byA9XG4gICAgICAtMTtcbiAgfVxuXG4gIHBwLmNoZWNrUGF0dGVybkVycm9ycyA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGlzQXNzaWduKSB7XG4gICAgaWYgKCFyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHJldHVybiB9XG4gICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA+IC0xKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hLCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICAgIHZhciBwYXJlbnMgPSBpc0Fzc2lnbiA/IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA6IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQ7XG4gICAgaWYgKHBhcmVucyA+IC0xKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShwYXJlbnMsIFwiUGFyZW50aGVzaXplZCBwYXR0ZXJuXCIpOyB9XG4gIH07XG5cbiAgcHAuY2hlY2tFeHByZXNzaW9uRXJyb3JzID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgYW5kVGhyb3cpIHtcbiAgICBpZiAoIXJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgc2hvcnRoYW5kQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ247XG4gICAgdmFyIGRvdWJsZVByb3RvID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90bztcbiAgICBpZiAoIWFuZFRocm93KSB7IHJldHVybiBzaG9ydGhhbmRBc3NpZ24gPj0gMCB8fCBkb3VibGVQcm90byA+PSAwIH1cbiAgICBpZiAoc2hvcnRoYW5kQXNzaWduID49IDApXG4gICAgICB7IHRoaXMucmFpc2Uoc2hvcnRoYW5kQXNzaWduLCBcIlNob3J0aGFuZCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBhcmUgdmFsaWQgb25seSBpbiBkZXN0cnVjdHVyaW5nIHBhdHRlcm5zXCIpOyB9XG4gICAgaWYgKGRvdWJsZVByb3RvID49IDApXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShkb3VibGVQcm90bywgXCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5XCIpOyB9XG4gIH07XG5cbiAgcHAuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMueWllbGRQb3MgJiYgKCF0aGlzLmF3YWl0UG9zIHx8IHRoaXMueWllbGRQb3MgPCB0aGlzLmF3YWl0UG9zKSlcbiAgICAgIHsgdGhpcy5yYWlzZSh0aGlzLnlpZWxkUG9zLCBcIllpZWxkIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZVwiKTsgfVxuICAgIGlmICh0aGlzLmF3YWl0UG9zKVxuICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRQb3MsIFwiQXdhaXQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgYSBkZWZhdWx0IHZhbHVlXCIpOyB9XG4gIH07XG5cbiAgcHAuaXNTaW1wbGVBc3NpZ25UYXJnZXQgPSBmdW5jdGlvbihleHByKSB7XG4gICAgaWYgKGV4cHIudHlwZSA9PT0gXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgICAgeyByZXR1cm4gdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByLmV4cHJlc3Npb24pIH1cbiAgICByZXR1cm4gZXhwci50eXBlID09PSBcIklkZW50aWZpZXJcIiB8fCBleHByLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiXG4gIH07XG5cbiAgdmFyIHBwJDEgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vICMjIyBTdGF0ZW1lbnQgcGFyc2luZ1xuXG4gIC8vIFBhcnNlIGEgcHJvZ3JhbS4gSW5pdGlhbGl6ZXMgdGhlIHBhcnNlciwgcmVhZHMgYW55IG51bWJlciBvZlxuICAvLyBzdGF0ZW1lbnRzLCBhbmQgd3JhcHMgdGhlbSBpbiBhIFByb2dyYW0gbm9kZS4gIE9wdGlvbmFsbHkgdGFrZXMgYVxuICAvLyBgcHJvZ3JhbWAgYXJndW1lbnQuICBJZiBwcmVzZW50LCB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIGFwcGVuZGVkXG4gIC8vIHRvIGl0cyBib2R5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgbm9kZS5cblxuICBwcCQxLnBhcnNlVG9wTGV2ZWwgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgICBpZiAoIW5vZGUuYm9keSkgeyBub2RlLmJvZHkgPSBbXTsgfVxuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLmVvZikge1xuICAgICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwsIHRydWUsIGV4cG9ydHMpO1xuICAgICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluTW9kdWxlKVxuICAgICAgeyBmb3IgKHZhciBpID0gMCwgbGlzdCA9IE9iamVjdC5rZXlzKHRoaXMudW5kZWZpbmVkRXhwb3J0cyk7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMudW5kZWZpbmVkRXhwb3J0c1tuYW1lXS5zdGFydCwgKFwiRXhwb3J0ICdcIiArIG5hbWUgKyBcIicgaXMgbm90IGRlZmluZWRcIikpO1xuICAgICAgICB9IH1cbiAgICB0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLnNvdXJjZVR5cGUgPSB0aGlzLm9wdGlvbnMuc291cmNlVHlwZTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUHJvZ3JhbVwiKVxuICB9O1xuXG4gIHZhciBsb29wTGFiZWwgPSB7a2luZDogXCJsb29wXCJ9LCBzd2l0Y2hMYWJlbCA9IHtraW5kOiBcInN3aXRjaFwifTtcblxuICBwcCQxLmlzTGV0ID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2IHx8ICF0aGlzLmlzQ29udGV4dHVhbChcImxldFwiKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHRoaXMucG9zO1xuICAgIHZhciBza2lwID0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KTtcbiAgICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGgsIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgICAvLyBGb3IgYW1iaWd1b3VzIGNhc2VzLCBkZXRlcm1pbmUgaWYgYSBMZXhpY2FsRGVjbGFyYXRpb24gKG9yIG9ubHkgYVxuICAgIC8vIFN0YXRlbWVudCkgaXMgYWxsb3dlZCBoZXJlLiBJZiBjb250ZXh0IGlzIG5vdCBlbXB0eSB0aGVuIG9ubHkgYSBTdGF0ZW1lbnRcbiAgICAvLyBpcyBhbGxvd2VkLiBIb3dldmVyLCBgbGV0IFtgIGlzIGFuIGV4cGxpY2l0IG5lZ2F0aXZlIGxvb2thaGVhZCBmb3JcbiAgICAvLyBFeHByZXNzaW9uU3RhdGVtZW50LCBzbyBzcGVjaWFsLWNhc2UgaXQgZmlyc3QuXG4gICAgaWYgKG5leHRDaCA9PT0gOTEpIHsgcmV0dXJuIHRydWUgfSAvLyAnWydcbiAgICBpZiAoY29udGV4dCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKG5leHRDaCA9PT0gMTIzKSB7IHJldHVybiB0cnVlIH0gLy8gJ3snXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KG5leHRDaCwgdHJ1ZSkpIHtcbiAgICAgIHZhciBwb3MgPSBuZXh0ICsgMTtcbiAgICAgIHdoaWxlIChpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MpLCB0cnVlKSkgeyArK3BvczsgfVxuICAgICAgdmFyIGlkZW50ID0gdGhpcy5pbnB1dC5zbGljZShuZXh0LCBwb3MpO1xuICAgICAgaWYgKCFrZXl3b3JkUmVsYXRpb25hbE9wZXJhdG9yLnRlc3QoaWRlbnQpKSB7IHJldHVybiB0cnVlIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gY2hlY2sgJ2FzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBmdW5jdGlvbidcbiAgLy8gLSAnYXN5bmMgLypmb28qLyBmdW5jdGlvbicgaXMgT0suXG4gIC8vIC0gJ2FzeW5jIC8qXFxuKi8gZnVuY3Rpb24nIGlzIGludmFsaWQuXG4gIHBwJDEuaXNBc3luY0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDggfHwgIXRoaXMuaXNDb250ZXh0dWFsKFwiYXN5bmNcIikpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSB0aGlzLnBvcztcbiAgICB2YXIgc2tpcCA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7XG4gICAgdmFyIG5leHQgPSB0aGlzLnBvcyArIHNraXBbMF0ubGVuZ3RoO1xuICAgIHJldHVybiAhbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgbmV4dCkpICYmXG4gICAgICB0aGlzLmlucHV0LnNsaWNlKG5leHQsIG5leHQgKyA4KSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAobmV4dCArIDggPT09IHRoaXMuaW5wdXQubGVuZ3RoIHx8ICFpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckF0KG5leHQgKyA4KSkpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAvL1xuICAvLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuICAvLyByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbC4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgbGlrZVxuICAvLyBgaWYgKGZvbykgL2JsYWgvLmV4ZWMoZm9vKWAsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuXG4gIC8vIGRvZXMgbm90IGhlbHAuXG5cbiAgcHAkMS5wYXJzZVN0YXRlbWVudCA9IGZ1bmN0aW9uKGNvbnRleHQsIHRvcExldmVsLCBleHBvcnRzKSB7XG4gICAgdmFyIHN0YXJ0dHlwZSA9IHRoaXMudHlwZSwgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGtpbmQ7XG5cbiAgICBpZiAodGhpcy5pc0xldChjb250ZXh0KSkge1xuICAgICAgc3RhcnR0eXBlID0gdHlwZXMuX3ZhcjtcbiAgICAgIGtpbmQgPSBcImxldFwiO1xuICAgIH1cblxuICAgIC8vIE1vc3QgdHlwZXMgb2Ygc3RhdGVtZW50cyBhcmUgcmVjb2duaXplZCBieSB0aGUga2V5d29yZCB0aGV5XG4gICAgLy8gc3RhcnQgd2l0aC4gTWFueSBhcmUgdHJpdmlhbCB0byBwYXJzZSwgc29tZSByZXF1aXJlIGEgYml0IG9mXG4gICAgLy8gY29tcGxleGl0eS5cblxuICAgIHN3aXRjaCAoc3RhcnR0eXBlKSB7XG4gICAgY2FzZSB0eXBlcy5fYnJlYWs6IGNhc2UgdHlwZXMuX2NvbnRpbnVlOiByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgc3RhcnR0eXBlLmtleXdvcmQpXG4gICAgY2FzZSB0eXBlcy5fZGVidWdnZXI6IHJldHVybiB0aGlzLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9kbzogcmV0dXJuIHRoaXMucGFyc2VEb1N0YXRlbWVudChub2RlKVxuICAgIGNhc2UgdHlwZXMuX2ZvcjogcmV0dXJuIHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9mdW5jdGlvbjpcbiAgICAgIC8vIEZ1bmN0aW9uIGFzIHNvbGUgYm9keSBvZiBlaXRoZXIgYW4gaWYgc3RhdGVtZW50IG9yIGEgbGFiZWxlZCBzdGF0ZW1lbnRcbiAgICAgIC8vIHdvcmtzLCBidXQgbm90IHdoZW4gaXQgaXMgcGFydCBvZiBhIGxhYmVsZWQgc3RhdGVtZW50IHRoYXQgaXMgdGhlIHNvbGVcbiAgICAgIC8vIGJvZHkgb2YgYW4gaWYgc3RhdGVtZW50LlxuICAgICAgaWYgKChjb250ZXh0ICYmICh0aGlzLnN0cmljdCB8fCBjb250ZXh0ICE9PSBcImlmXCIgJiYgY29udGV4dCAhPT0gXCJsYWJlbFwiKSkgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQobm9kZSwgZmFsc2UsICFjb250ZXh0KVxuICAgIGNhc2UgdHlwZXMuX2NsYXNzOlxuICAgICAgaWYgKGNvbnRleHQpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3Mobm9kZSwgdHJ1ZSlcbiAgICBjYXNlIHR5cGVzLl9pZjogcmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlKVxuICAgIGNhc2UgdHlwZXMuX3JldHVybjogcmV0dXJuIHRoaXMucGFyc2VSZXR1cm5TdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9zd2l0Y2g6IHJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fdGhyb3c6IHJldHVybiB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl90cnk6IHJldHVybiB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fY29uc3Q6IGNhc2UgdHlwZXMuX3ZhcjpcbiAgICAgIGtpbmQgPSBraW5kIHx8IHRoaXMudmFsdWU7XG4gICAgICBpZiAoY29udGV4dCAmJiBraW5kICE9PSBcInZhclwiKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVZhclN0YXRlbWVudChub2RlLCBraW5kKVxuICAgIGNhc2UgdHlwZXMuX3doaWxlOiByZXR1cm4gdGhpcy5wYXJzZVdoaWxlU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fd2l0aDogcmV0dXJuIHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5icmFjZUw6IHJldHVybiB0aGlzLnBhcnNlQmxvY2sodHJ1ZSwgbm9kZSlcbiAgICBjYXNlIHR5cGVzLnNlbWk6IHJldHVybiB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9leHBvcnQ6XG4gICAgY2FzZSB0eXBlcy5faW1wb3J0OlxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+IDEwICYmIHN0YXJ0dHlwZSA9PT0gdHlwZXMuX2ltcG9ydCkge1xuICAgICAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSB0aGlzLnBvcztcbiAgICAgICAgdmFyIHNraXAgPSBza2lwV2hpdGVTcGFjZS5leGVjKHRoaXMuaW5wdXQpO1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGgsIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgaWYgKG5leHRDaCA9PT0gNDAgfHwgbmV4dENoID09PSA0NikgLy8gJygnIG9yICcuJ1xuICAgICAgICAgIHsgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHRoaXMucGFyc2VFeHByZXNzaW9uKCkpIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlKSB7XG4gICAgICAgIGlmICghdG9wTGV2ZWwpXG4gICAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBvbmx5IGFwcGVhciBhdCB0aGUgdG9wIGxldmVsXCIpOyB9XG4gICAgICAgIGlmICghdGhpcy5pbk1vZHVsZSlcbiAgICAgICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IGFwcGVhciBvbmx5IHdpdGggJ3NvdXJjZVR5cGU6IG1vZHVsZSdcIik7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydHR5cGUgPT09IHR5cGVzLl9pbXBvcnQgPyB0aGlzLnBhcnNlSW1wb3J0KG5vZGUpIDogdGhpcy5wYXJzZUV4cG9ydChub2RlLCBleHBvcnRzKVxuXG4gICAgICAvLyBJZiB0aGUgc3RhdGVtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGF0ZW1lbnQga2V5d29yZCBvciBhXG4gICAgICAvLyBicmFjZSwgaXQncyBhbiBFeHByZXNzaW9uU3RhdGVtZW50IG9yIExhYmVsZWRTdGF0ZW1lbnQuIFdlXG4gICAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlXG4gICAgICAvLyBuZXh0IHRva2VuIGlzIGEgY29sb24gYW5kIHRoZSBleHByZXNzaW9uIHdhcyBhIHNpbXBsZVxuICAgICAgLy8gSWRlbnRpZmllciBub2RlLCB3ZSBzd2l0Y2ggdG8gaW50ZXJwcmV0aW5nIGl0IGFzIGEgbGFiZWwuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0aGlzLmlzQXN5bmNGdW5jdGlvbigpKSB7XG4gICAgICAgIGlmIChjb250ZXh0KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KG5vZGUsIHRydWUsICFjb250ZXh0KVxuICAgICAgfVxuXG4gICAgICB2YXIgbWF5YmVOYW1lID0gdGhpcy52YWx1ZSwgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICBpZiAoc3RhcnR0eXBlID09PSB0eXBlcy5uYW1lICYmIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgdGhpcy5lYXQodHlwZXMuY29sb24pKVxuICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlTGFiZWxlZFN0YXRlbWVudChub2RlLCBtYXliZU5hbWUsIGV4cHIsIGNvbnRleHQpIH1cbiAgICAgIGVsc2UgeyByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgZXhwcikgfVxuICAgIH1cbiAgfTtcblxuICBwcCQxLnBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGtleXdvcmQpIHtcbiAgICB2YXIgaXNCcmVhayA9IGtleXdvcmQgPT09IFwiYnJlYWtcIjtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAodGhpcy5lYXQodHlwZXMuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmxhYmVsID0gbnVsbDsgfVxuICAgIGVsc2UgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSkgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIGVsc2Uge1xuICAgICAgbm9kZS5sYWJlbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhbiBhY3R1YWwgZGVzdGluYXRpb24gdG8gYnJlYWsgb3JcbiAgICAvLyBjb250aW51ZSB0by5cbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGxhYiA9IHRoaXMubGFiZWxzW2ldO1xuICAgICAgaWYgKG5vZGUubGFiZWwgPT0gbnVsbCB8fCBsYWIubmFtZSA9PT0gbm9kZS5sYWJlbC5uYW1lKSB7XG4gICAgICAgIGlmIChsYWIua2luZCAhPSBudWxsICYmIChpc0JyZWFrIHx8IGxhYi5raW5kID09PSBcImxvb3BcIikpIHsgYnJlYWsgfVxuICAgICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IHRoaXMubGFiZWxzLmxlbmd0aCkgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiVW5zeW50YWN0aWMgXCIgKyBrZXl3b3JkKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgaXNCcmVhayA/IFwiQnJlYWtTdGF0ZW1lbnRcIiA6IFwiQ29udGludWVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRG9TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJkb1wiKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5fd2hpbGUpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpXG4gICAgICB7IHRoaXMuZWF0KHR5cGVzLnNlbWkpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLnNlbWljb2xvbigpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRvV2hpbGVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBEaXNhbWJpZ3VhdGluZyBiZXR3ZWVuIGEgYGZvcmAgYW5kIGEgYGZvcmAvYGluYCBvciBgZm9yYC9gb2ZgXG4gIC8vIGxvb3AgaXMgbm9uLXRyaXZpYWwuIEJhc2ljYWxseSwgd2UgaGF2ZSB0byBwYXJzZSB0aGUgaW5pdCBgdmFyYFxuICAvLyBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiwgZGlzYWxsb3dpbmcgdGhlIGBpbmAgb3BlcmF0b3IgKHNlZVxuICAvLyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgcGFyc2VFeHByZXNzaW9uYCksIGFuZCB0aGVuIGNoZWNrXG4gIC8vIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gaXMgYGluYCBvciBgb2ZgLiBXaGVuIHRoZXJlIGlzIG5vIGluaXRcbiAgLy8gcGFydCAoc2VtaWNvbG9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzKSwgaXRcbiAgLy8gaXMgYSByZWd1bGFyIGBmb3JgIGxvb3AuXG5cbiAgcHAkMS5wYXJzZUZvclN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB2YXIgYXdhaXRBdCA9ICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiAodGhpcy5pbkFzeW5jIHx8ICghdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uKSkgJiYgdGhpcy5lYXRDb250ZXh0dWFsKFwiYXdhaXRcIikpID8gdGhpcy5sYXN0VG9rU3RhcnQgOiAtMTtcbiAgICB0aGlzLmxhYmVscy5wdXNoKGxvb3BMYWJlbCk7XG4gICAgdGhpcy5lbnRlclNjb3BlKDApO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc2VtaSkge1xuICAgICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIG51bGwpXG4gICAgfVxuICAgIHZhciBpc0xldCA9IHRoaXMuaXNMZXQoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5fdmFyIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMuX2NvbnN0IHx8IGlzTGV0KSB7XG4gICAgICB2YXIgaW5pdCQxID0gdGhpcy5zdGFydE5vZGUoKSwga2luZCA9IGlzTGV0ID8gXCJsZXRcIiA6IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMucGFyc2VWYXIoaW5pdCQxLCB0cnVlLCBraW5kKTtcbiAgICAgIHRoaXMuZmluaXNoTm9kZShpbml0JDEsIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKTtcbiAgICAgIGlmICgodGhpcy50eXBlID09PSB0eXBlcy5faW4gfHwgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpKSAmJiBpbml0JDEuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5faW4pIHtcbiAgICAgICAgICAgIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gICAgICAgICAgfSBlbHNlIHsgbm9kZS5hd2FpdCA9IGF3YWl0QXQgPiAtMTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9ySW4obm9kZSwgaW5pdCQxKVxuICAgICAgfVxuICAgICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIGluaXQkMSlcbiAgICB9XG4gICAgdmFyIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICB2YXIgaW5pdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKHRydWUsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5faW4pIHtcbiAgICAgICAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgICAgICB9IGVsc2UgeyBub2RlLmF3YWl0ID0gYXdhaXRBdCA+IC0xOyB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShpbml0LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChpbml0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9ySW4obm9kZSwgaW5pdClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgaW5pdClcbiAgfTtcblxuICBwcCQxLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBpc0FzeW5jLCBkZWNsYXJhdGlvblBvc2l0aW9uKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLCBGVU5DX1NUQVRFTUVOVCB8IChkZWNsYXJhdGlvblBvc2l0aW9uID8gMCA6IEZVTkNfSEFOR0lOR19TVEFURU1FTlQpLCBmYWxzZSwgaXNBc3luYylcbiAgfTtcblxuICBwcCQxLnBhcnNlSWZTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIC8vIGFsbG93IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiBicmFuY2hlcywgYnV0IG9ubHkgaW4gbm9uLXN0cmljdCBtb2RlXG4gICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpO1xuICAgIG5vZGUuYWx0ZXJuYXRlID0gdGhpcy5lYXQodHlwZXMuX2Vsc2UpID8gdGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSWZTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlUmV0dXJuU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghdGhpcy5pbkZ1bmN0aW9uICYmICF0aGlzLm9wdGlvbnMuYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb24pXG4gICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCIncmV0dXJuJyBvdXRzaWRlIG9mIGZ1bmN0aW9uXCIpOyB9XG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICAvLyBJbiBgcmV0dXJuYCAoYW5kIGBicmVha2AvYGNvbnRpbnVlYCksIHRoZSBrZXl3b3JkcyB3aXRoXG4gICAgLy8gb3B0aW9uYWwgYXJndW1lbnRzLCB3ZSBlYWdlcmx5IGxvb2sgZm9yIGEgc2VtaWNvbG9uIG9yIHRoZVxuICAgIC8vIHBvc3NpYmlsaXR5IHRvIGluc2VydCBvbmUuXG5cbiAgICBpZiAodGhpcy5lYXQodHlwZXMuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmFyZ3VtZW50ID0gbnVsbDsgfVxuICAgIGVsc2UgeyBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTsgdGhpcy5zZW1pY29sb24oKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXR1cm5TdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlU3dpdGNoU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIG5vZGUuY2FzZXMgPSBbXTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICAgIHRoaXMubGFiZWxzLnB1c2goc3dpdGNoTGFiZWwpO1xuICAgIHRoaXMuZW50ZXJTY29wZSgwKTtcblxuICAgIC8vIFN0YXRlbWVudHMgdW5kZXIgbXVzdCBiZSBncm91cGVkIChieSBsYWJlbCkgaW4gU3dpdGNoQ2FzZVxuICAgIC8vIG5vZGVzLiBgY3VyYCBpcyB1c2VkIHRvIGtlZXAgdGhlIG5vZGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5XG4gICAgLy8gYWRkaW5nIHN0YXRlbWVudHMgdG8uXG5cbiAgICB2YXIgY3VyO1xuICAgIGZvciAodmFyIHNhd0RlZmF1bHQgPSBmYWxzZTsgdGhpcy50eXBlICE9PSB0eXBlcy5icmFjZVI7KSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5fY2FzZSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLl9kZWZhdWx0KSB7XG4gICAgICAgIHZhciBpc0Nhc2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzLl9jYXNlO1xuICAgICAgICBpZiAoY3VyKSB7IHRoaXMuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTsgfVxuICAgICAgICBub2RlLmNhc2VzLnB1c2goY3VyID0gdGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICAgIGN1ci5jb25zZXF1ZW50ID0gW107XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBpZiAoaXNDYXNlKSB7XG4gICAgICAgICAgY3VyLnRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzYXdEZWZhdWx0KSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLmxhc3RUb2tTdGFydCwgXCJNdWx0aXBsZSBkZWZhdWx0IGNsYXVzZXNcIik7IH1cbiAgICAgICAgICBzYXdEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICBjdXIudGVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29sb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjdXIpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgICAgY3VyLmNvbnNlcXVlbnQucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICBpZiAoY3VyKSB7IHRoaXMuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTsgfVxuICAgIHRoaXMubmV4dCgpOyAvLyBDbG9zaW5nIGJyYWNlXG4gICAgdGhpcy5sYWJlbHMucG9wKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN3aXRjaFN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAobGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsIHRoaXMuc3RhcnQpKSlcbiAgICAgIHsgdGhpcy5yYWlzZSh0aGlzLmxhc3RUb2tFbmQsIFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93XCIpOyB9XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhyb3dTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBSZXVzZWQgZW1wdHkgYXJyYXkgYWRkZWQgZm9yIG5vZGUgZmllbGRzIHRoYXQgYXJlIGFsd2F5cyBlbXB0eS5cblxuICB2YXIgZW1wdHkgPSBbXTtcblxuICBwcCQxLnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBub2RlLmhhbmRsZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9jYXRjaCkge1xuICAgICAgdmFyIGNsYXVzZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0eXBlcy5wYXJlbkwpKSB7XG4gICAgICAgIGNsYXVzZS5wYXJhbSA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgICAgICB2YXIgc2ltcGxlID0gY2xhdXNlLnBhcmFtLnR5cGUgPT09IFwiSWRlbnRpZmllclwiO1xuICAgICAgICB0aGlzLmVudGVyU2NvcGUoc2ltcGxlID8gU0NPUEVfU0lNUExFX0NBVENIIDogMCk7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGNsYXVzZS5wYXJhbSwgc2ltcGxlID8gQklORF9TSU1QTEVfQ0FUQ0ggOiBCSU5EX0xFWElDQUwpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDEwKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIGNsYXVzZS5wYXJhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW50ZXJTY29wZSgwKTtcbiAgICAgIH1cbiAgICAgIGNsYXVzZS5ib2R5ID0gdGhpcy5wYXJzZUJsb2NrKGZhbHNlKTtcbiAgICAgIHRoaXMuZXhpdFNjb3BlKCk7XG4gICAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICAgIH1cbiAgICBub2RlLmZpbmFsaXplciA9IHRoaXMuZWF0KHR5cGVzLl9maW5hbGx5KSA/IHRoaXMucGFyc2VCbG9jaygpIDogbnVsbDtcbiAgICBpZiAoIW5vZGUuaGFuZGxlciAmJiAhbm9kZS5maW5hbGl6ZXIpXG4gICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlXCIpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRyeVN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VWYXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBraW5kKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5wYXJzZVZhcihub2RlLCBmYWxzZSwga2luZCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VXaGlsZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gICAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aGlsZVwiKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2hpbGVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAodGhpcy5zdHJpY3QpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUub2JqZWN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aXRoXCIpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJXaXRoU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgcHAkMS5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VMYWJlbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgbWF5YmVOYW1lLCBleHByLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCA9IHRoaXMubGFiZWxzOyBpJDEgPCBsaXN0Lmxlbmd0aDsgaSQxICs9IDEpXG4gICAgICB7XG4gICAgICB2YXIgbGFiZWwgPSBsaXN0W2kkMV07XG5cbiAgICAgIGlmIChsYWJlbC5uYW1lID09PSBtYXliZU5hbWUpXG4gICAgICAgIHsgdGhpcy5yYWlzZShleHByLnN0YXJ0LCBcIkxhYmVsICdcIiArIG1heWJlTmFtZSArIFwiJyBpcyBhbHJlYWR5IGRlY2xhcmVkXCIpO1xuICAgIH0gfVxuICAgIHZhciBraW5kID0gdGhpcy50eXBlLmlzTG9vcCA/IFwibG9vcFwiIDogdGhpcy50eXBlID09PSB0eXBlcy5fc3dpdGNoID8gXCJzd2l0Y2hcIiA6IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGFiZWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGFiZWwkMSA9IHRoaXMubGFiZWxzW2ldO1xuICAgICAgaWYgKGxhYmVsJDEuc3RhdGVtZW50U3RhcnQgPT09IG5vZGUuc3RhcnQpIHtcbiAgICAgICAgLy8gVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzIGxhYmVscyBvbiB0aGlzIG5vZGVcbiAgICAgICAgbGFiZWwkMS5zdGF0ZW1lbnRTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIGxhYmVsJDEua2luZCA9IGtpbmQ7XG4gICAgICB9IGVsc2UgeyBicmVhayB9XG4gICAgfVxuICAgIHRoaXMubGFiZWxzLnB1c2goe25hbWU6IG1heWJlTmFtZSwga2luZDoga2luZCwgc3RhdGVtZW50U3RhcnQ6IHRoaXMuc3RhcnR9KTtcbiAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KGNvbnRleHQgPyBjb250ZXh0LmluZGV4T2YoXCJsYWJlbFwiKSA9PT0gLTEgPyBjb250ZXh0ICsgXCJsYWJlbFwiIDogY29udGV4dCA6IFwibGFiZWxcIik7XG4gICAgdGhpcy5sYWJlbHMucG9wKCk7XG4gICAgbm9kZS5sYWJlbCA9IGV4cHI7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkxhYmVsZWRTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGV4cHIpIHtcbiAgICBub2RlLmV4cHJlc3Npb24gPSBleHByO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBQYXJzZSBhIHNlbWljb2xvbi1lbmNsb3NlZCBibG9jayBvZiBzdGF0ZW1lbnRzLCBoYW5kbGluZyBgXCJ1c2VcbiAgLy8gc3RyaWN0XCJgIGRlY2xhcmF0aW9ucyB3aGVuIGBhbGxvd1N0cmljdGAgaXMgdHJ1ZSAodXNlZCBmb3JcbiAgLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxuICBwcCQxLnBhcnNlQmxvY2sgPSBmdW5jdGlvbihjcmVhdGVOZXdMZXhpY2FsU2NvcGUsIG5vZGUsIGV4aXRTdHJpY3QpIHtcbiAgICBpZiAoIGNyZWF0ZU5ld0xleGljYWxTY29wZSA9PT0gdm9pZCAwICkgY3JlYXRlTmV3TGV4aWNhbFNjb3BlID0gdHJ1ZTtcbiAgICBpZiAoIG5vZGUgPT09IHZvaWQgMCApIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuXG4gICAgbm9kZS5ib2R5ID0gW107XG4gICAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgICBpZiAoY3JlYXRlTmV3TGV4aWNhbFNjb3BlKSB7IHRoaXMuZW50ZXJTY29wZSgwKTsgfVxuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNlUikge1xuICAgICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpO1xuICAgICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gICAgfVxuICAgIGlmIChleGl0U3RyaWN0KSB7IHRoaXMuc3RyaWN0ID0gZmFsc2U7IH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAoY3JlYXRlTmV3TGV4aWNhbFNjb3BlKSB7IHRoaXMuZXhpdFNjb3BlKCk7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBQYXJzZSBhIHJlZ3VsYXIgYGZvcmAgbG9vcC4gVGhlIGRpc2FtYmlndWF0aW9uIGNvZGUgaW5cbiAgLy8gYHBhcnNlU3RhdGVtZW50YCB3aWxsIGFscmVhZHkgaGF2ZSBwYXJzZWQgdGhlIGluaXQgc3RhdGVtZW50IG9yXG4gIC8vIGV4cHJlc3Npb24uXG5cbiAgcHAkMS5wYXJzZUZvciA9IGZ1bmN0aW9uKG5vZGUsIGluaXQpIHtcbiAgICBub2RlLmluaXQgPSBpbml0O1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnNlbWkpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMudHlwZSA9PT0gdHlwZXMuc2VtaSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnNlbWkpO1xuICAgIG5vZGUudXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcy5wYXJlblIgPyBudWxsIDogdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBgZm9yYC9gaW5gIGFuZCBgZm9yYC9gb2ZgIGxvb3AsIHdoaWNoIGFyZSBhbG1vc3RcbiAgLy8gc2FtZSBmcm9tIHBhcnNlcidzIHBlcnNwZWN0aXZlLlxuXG4gIHBwJDEucGFyc2VGb3JJbiA9IGZ1bmN0aW9uKG5vZGUsIGluaXQpIHtcbiAgICB2YXIgaXNGb3JJbiA9IHRoaXMudHlwZSA9PT0gdHlwZXMuX2luO1xuICAgIHRoaXMubmV4dCgpO1xuXG4gICAgaWYgKFxuICAgICAgaW5pdC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiAmJlxuICAgICAgaW5pdC5kZWNsYXJhdGlvbnNbMF0uaW5pdCAhPSBudWxsICYmXG4gICAgICAoXG4gICAgICAgICFpc0ZvckluIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDggfHxcbiAgICAgICAgdGhpcy5zdHJpY3QgfHxcbiAgICAgICAgaW5pdC5raW5kICE9PSBcInZhclwiIHx8XG4gICAgICAgIGluaXQuZGVjbGFyYXRpb25zWzBdLmlkLnR5cGUgIT09IFwiSWRlbnRpZmllclwiXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBpbml0LnN0YXJ0LFxuICAgICAgICAoKGlzRm9ySW4gPyBcImZvci1pblwiIDogXCJmb3Itb2ZcIikgKyBcIiBsb29wIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG1heSBub3QgaGF2ZSBhbiBpbml0aWFsaXplclwiKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGluaXQudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICB0aGlzLnJhaXNlKGluaXQuc3RhcnQsIFwiSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItbG9vcFwiKTtcbiAgICB9XG4gICAgbm9kZS5sZWZ0ID0gaW5pdDtcbiAgICBub2RlLnJpZ2h0ID0gaXNGb3JJbiA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzRm9ySW4gPyBcIkZvckluU3RhdGVtZW50XCIgOiBcIkZvck9mU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy5cblxuICBwcCQxLnBhcnNlVmFyID0gZnVuY3Rpb24obm9kZSwgaXNGb3IsIGtpbmQpIHtcbiAgICBub2RlLmRlY2xhcmF0aW9ucyA9IFtdO1xuICAgIG5vZGUua2luZCA9IGtpbmQ7XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIGRlY2wgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgdGhpcy5wYXJzZVZhcklkKGRlY2wsIGtpbmQpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmVxKSkge1xuICAgICAgICBkZWNsLmluaXQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oaXNGb3IpO1xuICAgICAgfSBlbHNlIGlmIChraW5kID09PSBcImNvbnN0XCIgJiYgISh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfSBlbHNlIGlmIChkZWNsLmlkLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmICEoaXNGb3IgJiYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2luIHx8IHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpKSkge1xuICAgICAgICB0aGlzLnJhaXNlKHRoaXMubGFzdFRva0VuZCwgXCJDb21wbGV4IGJpbmRpbmcgcGF0dGVybnMgcmVxdWlyZSBhbiBpbml0aWFsaXphdGlvbiB2YWx1ZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY2wuaW5pdCA9IG51bGw7XG4gICAgICB9XG4gICAgICBub2RlLmRlY2xhcmF0aW9ucy5wdXNoKHRoaXMuZmluaXNoTm9kZShkZWNsLCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSk7XG4gICAgICBpZiAoIXRoaXMuZWF0KHR5cGVzLmNvbW1hKSkgeyBicmVhayB9XG4gICAgfVxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgcHAkMS5wYXJzZVZhcklkID0gZnVuY3Rpb24oZGVjbCwga2luZCkge1xuICAgIGRlY2wuaWQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICB0aGlzLmNoZWNrTFZhbChkZWNsLmlkLCBraW5kID09PSBcInZhclwiID8gQklORF9WQVIgOiBCSU5EX0xFWElDQUwsIGZhbHNlKTtcbiAgfTtcblxuICB2YXIgRlVOQ19TVEFURU1FTlQgPSAxLCBGVU5DX0hBTkdJTkdfU1RBVEVNRU5UID0gMiwgRlVOQ19OVUxMQUJMRV9JRCA9IDQ7XG5cbiAgLy8gUGFyc2UgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBsaXRlcmFsIChkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGBzdGF0ZW1lbnQgJiBGVU5DX1NUQVRFTUVOVGApLlxuXG4gIC8vIFJlbW92ZSBgYWxsb3dFeHByZXNzaW9uQm9keWAgZm9yIDcuMC4wLCBhcyBpdCBpcyBvbmx5IGNhbGxlZCB3aXRoIGZhbHNlXG4gIHBwJDEucGFyc2VGdW5jdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0YXRlbWVudCwgYWxsb3dFeHByZXNzaW9uQm9keSwgaXNBc3luYykge1xuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSB8fCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiAhaXNBc3luYykge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3RhciAmJiAoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIG5vZGUuZ2VuZXJhdG9yID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICAgIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgaWYgKHN0YXRlbWVudCAmIEZVTkNfU1RBVEVNRU5UKSB7XG4gICAgICBub2RlLmlkID0gKHN0YXRlbWVudCAmIEZVTkNfTlVMTEFCTEVfSUQpICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSA/IG51bGwgOiB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIGlmIChub2RlLmlkICYmICEoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcmVndWxhciBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbiBzbG9wcHkgbW9kZSwgdGhlbiBpdCBpc1xuICAgICAgICAvLyBzdWJqZWN0IHRvIEFubmV4IEIgc2VtYW50aWNzIChCSU5EX0ZVTkNUSU9OKS4gT3RoZXJ3aXNlLCB0aGUgYmluZGluZ1xuICAgICAgICAvLyBtb2RlIGRlcGVuZHMgb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBzY29wZSAoc2VlXG4gICAgICAgIC8vIHRyZWF0RnVuY3Rpb25zQXNWYXIpLlxuICAgICAgICB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsICh0aGlzLnN0cmljdCB8fCBub2RlLmdlbmVyYXRvciB8fCBub2RlLmFzeW5jKSA/IHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhciA/IEJJTkRfVkFSIDogQklORF9MRVhJQ0FMIDogQklORF9GVU5DVElPTik7IH1cbiAgICB9XG5cbiAgICB2YXIgb2xkWWllbGRQb3MgPSB0aGlzLnlpZWxkUG9zLCBvbGRBd2FpdFBvcyA9IHRoaXMuYXdhaXRQb3MsIG9sZEF3YWl0SWRlbnRQb3MgPSB0aGlzLmF3YWl0SWRlbnRQb3M7XG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhub2RlLmFzeW5jLCBub2RlLmdlbmVyYXRvcikpO1xuXG4gICAgaWYgKCEoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpKVxuICAgICAgeyBub2RlLmlkID0gdGhpcy50eXBlID09PSB0eXBlcy5uYW1lID8gdGhpcy5wYXJzZUlkZW50KCkgOiBudWxsOyB9XG5cbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCBhbGxvd0V4cHJlc3Npb25Cb2R5LCBmYWxzZSk7XG5cbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCAoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpID8gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VGdW5jdGlvblBhcmFtcyA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlbkwpO1xuICAgIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KHR5cGVzLnBhcmVuUiwgZmFsc2UsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KTtcbiAgICB0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpO1xuICB9O1xuXG4gIC8vIFBhcnNlIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbiAgcHAkMS5wYXJzZUNsYXNzID0gZnVuY3Rpb24obm9kZSwgaXNTdGF0ZW1lbnQpIHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIGVjbWEtMjYyIDE0LjYgQ2xhc3MgRGVmaW5pdGlvbnNcbiAgICAvLyBBIGNsYXNzIGRlZmluaXRpb24gaXMgYWx3YXlzIHN0cmljdCBtb2RlIGNvZGUuXG4gICAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0O1xuICAgIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcblxuICAgIHRoaXMucGFyc2VDbGFzc0lkKG5vZGUsIGlzU3RhdGVtZW50KTtcbiAgICB0aGlzLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICB2YXIgY2xhc3NCb2R5ID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB2YXIgaGFkQ29uc3RydWN0b3IgPSBmYWxzZTtcbiAgICBjbGFzc0JvZHkuYm9keSA9IFtdO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLmJyYWNlTCk7XG4gICAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHlwZXMuYnJhY2VSKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VDbGFzc0VsZW1lbnQobm9kZS5zdXBlckNsYXNzICE9PSBudWxsKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGNsYXNzQm9keS5ib2R5LnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiICYmIGVsZW1lbnQua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgICAgaWYgKGhhZENvbnN0cnVjdG9yKSB7IHRoaXMucmFpc2UoZWxlbWVudC5zdGFydCwgXCJEdXBsaWNhdGUgY29uc3RydWN0b3IgaW4gdGhlIHNhbWUgY2xhc3NcIik7IH1cbiAgICAgICAgICBoYWRDb25zdHJ1Y3RvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJpY3QgPSBvbGRTdHJpY3Q7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5maW5pc2hOb2RlKGNsYXNzQm9keSwgXCJDbGFzc0JvZHlcIik7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1N0YXRlbWVudCA/IFwiQ2xhc3NEZWNsYXJhdGlvblwiIDogXCJDbGFzc0V4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NFbGVtZW50ID0gZnVuY3Rpb24oY29uc3RydWN0b3JBbGxvd3NTdXBlcikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnNlbWkpKSB7IHJldHVybiBudWxsIH1cblxuICAgIHZhciBtZXRob2QgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHZhciB0cnlDb250ZXh0dWFsID0gZnVuY3Rpb24gKGssIG5vTGluZUJyZWFrKSB7XG4gICAgICBpZiAoIG5vTGluZUJyZWFrID09PSB2b2lkIDAgKSBub0xpbmVCcmVhayA9IGZhbHNlO1xuXG4gICAgICB2YXIgc3RhcnQgPSB0aGlzJDEuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcyQxLnN0YXJ0TG9jO1xuICAgICAgaWYgKCF0aGlzJDEuZWF0Q29udGV4dHVhbChrKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgaWYgKHRoaXMkMS50eXBlICE9PSB0eXBlcy5wYXJlbkwgJiYgKCFub0xpbmVCcmVhayB8fCAhdGhpcyQxLmNhbkluc2VydFNlbWljb2xvbigpKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICBpZiAobWV0aG9kLmtleSkgeyB0aGlzJDEudW5leHBlY3RlZCgpOyB9XG4gICAgICBtZXRob2QuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIG1ldGhvZC5rZXkgPSB0aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQsIHN0YXJ0TG9jKTtcbiAgICAgIG1ldGhvZC5rZXkubmFtZSA9IGs7XG4gICAgICB0aGlzJDEuZmluaXNoTm9kZShtZXRob2Qua2V5LCBcIklkZW50aWZpZXJcIik7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9O1xuXG4gICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgIG1ldGhvZC5zdGF0aWMgPSB0cnlDb250ZXh0dWFsKFwic3RhdGljXCIpO1xuICAgIHZhciBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR5cGVzLnN0YXIpO1xuICAgIHZhciBpc0FzeW5jID0gZmFsc2U7XG4gICAgaWYgKCFpc0dlbmVyYXRvcikge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIHRyeUNvbnRleHR1YWwoXCJhc3luY1wiLCB0cnVlKSkge1xuICAgICAgICBpc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgaXNHZW5lcmF0b3IgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiB0aGlzLmVhdCh0eXBlcy5zdGFyKTtcbiAgICAgIH0gZWxzZSBpZiAodHJ5Q29udGV4dHVhbChcImdldFwiKSkge1xuICAgICAgICBtZXRob2Qua2luZCA9IFwiZ2V0XCI7XG4gICAgICB9IGVsc2UgaWYgKHRyeUNvbnRleHR1YWwoXCJzZXRcIikpIHtcbiAgICAgICAgbWV0aG9kLmtpbmQgPSBcInNldFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1ldGhvZC5rZXkpIHsgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShtZXRob2QpOyB9XG4gICAgdmFyIGtleSA9IG1ldGhvZC5rZXk7XG4gICAgdmFyIGFsbG93c0RpcmVjdFN1cGVyID0gZmFsc2U7XG4gICAgaWYgKCFtZXRob2QuY29tcHV0ZWQgJiYgIW1ldGhvZC5zdGF0aWMgJiYgKGtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBrZXkubmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8XG4gICAgICAgIGtleS50eXBlID09PSBcIkxpdGVyYWxcIiAmJiBrZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikpIHtcbiAgICAgIGlmIChtZXRob2Qua2luZCAhPT0gXCJtZXRob2RcIikgeyB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGdldC9zZXQgbW9kaWZpZXJcIik7IH1cbiAgICAgIGlmIChpc0dlbmVyYXRvcikgeyB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvclwiKTsgfVxuICAgICAgaWYgKGlzQXN5bmMpIHsgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYXN5bmMgbWV0aG9kXCIpOyB9XG4gICAgICBtZXRob2Qua2luZCA9IFwiY29uc3RydWN0b3JcIjtcbiAgICAgIGFsbG93c0RpcmVjdFN1cGVyID0gY29uc3RydWN0b3JBbGxvd3NTdXBlcjtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZC5zdGF0aWMgJiYga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGtleS5uYW1lID09PSBcInByb3RvdHlwZVwiKSB7XG4gICAgICB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDbGFzc2VzIG1heSBub3QgaGF2ZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBwcm90b3R5cGVcIik7XG4gICAgfVxuICAgIHRoaXMucGFyc2VDbGFzc01ldGhvZChtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcik7XG4gICAgaWYgKG1ldGhvZC5raW5kID09PSBcImdldFwiICYmIG1ldGhvZC52YWx1ZS5wYXJhbXMubGVuZ3RoICE9PSAwKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnN0YXJ0LCBcImdldHRlciBzaG91bGQgaGF2ZSBubyBwYXJhbXNcIik7IH1cbiAgICBpZiAobWV0aG9kLmtpbmQgPT09IFwic2V0XCIgJiYgbWV0aG9kLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IDEpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUuc3RhcnQsIFwic2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtXCIpOyB9XG4gICAgaWYgKG1ldGhvZC5raW5kID09PSBcInNldFwiICYmIG1ldGhvZC52YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnBhcmFtc1swXS5zdGFydCwgXCJTZXR0ZXIgY2Fubm90IHVzZSByZXN0IHBhcmFtc1wiKTsgfVxuICAgIHJldHVybiBtZXRob2RcbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NNZXRob2QgPSBmdW5jdGlvbihtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcikge1xuICAgIG1ldGhvZC52YWx1ZSA9IHRoaXMucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsIGlzQXN5bmMsIGFsbG93c0RpcmVjdFN1cGVyKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG1ldGhvZCwgXCJNZXRob2REZWZpbml0aW9uXCIpXG4gIH07XG5cbiAgcHAkMS5wYXJzZUNsYXNzSWQgPSBmdW5jdGlvbihub2RlLCBpc1N0YXRlbWVudCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUpIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIGlmIChpc1N0YXRlbWVudClcbiAgICAgICAgeyB0aGlzLmNoZWNrTFZhbChub2RlLmlkLCBCSU5EX0xFWElDQUwsIGZhbHNlKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNTdGF0ZW1lbnQgPT09IHRydWUpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NTdXBlciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBub2RlLnN1cGVyQ2xhc3MgPSB0aGlzLmVhdCh0eXBlcy5fZXh0ZW5kcykgPyB0aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKSA6IG51bGw7XG4gIH07XG5cbiAgLy8gUGFyc2VzIG1vZHVsZSBleHBvcnQgZGVjbGFyYXRpb24uXG5cbiAgcHAkMS5wYXJzZUV4cG9ydCA9IGZ1bmN0aW9uKG5vZGUsIGV4cG9ydHMpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICAvLyBleHBvcnQgKiBmcm9tICcuLi4nXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnN0YXIpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDExKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSkge1xuICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBub2RlLmV4cG9ydGVkLm5hbWUsIHRoaXMubGFzdFRva1N0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmV4cG9ydGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZnJvbVwiKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLnN0cmluZykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIilcbiAgICB9XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLl9kZWZhdWx0KSkgeyAvLyBleHBvcnQgZGVmYXVsdCAuLi5cbiAgICAgIHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgXCJkZWZhdWx0XCIsIHRoaXMubGFzdFRva1N0YXJ0KTtcbiAgICAgIHZhciBpc0FzeW5jO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2Z1bmN0aW9uIHx8IChpc0FzeW5jID0gdGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgdmFyIGZOb2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGlmIChpc0FzeW5jKSB7IHRoaXMubmV4dCgpOyB9XG4gICAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlRnVuY3Rpb24oZk5vZGUsIEZVTkNfU1RBVEVNRU5UIHwgRlVOQ19OVUxMQUJMRV9JRCwgZmFsc2UsIGlzQXN5bmMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9jbGFzcykge1xuICAgICAgICB2YXIgY05vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUNsYXNzKGNOb2RlLCBcIm51bGxhYmxlSURcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpXG4gICAgfVxuICAgIC8vIGV4cG9ydCB2YXJ8Y29uc3R8bGV0fGZ1bmN0aW9ufGNsYXNzIC4uLlxuICAgIGlmICh0aGlzLnNob3VsZFBhcnNlRXhwb3J0U3RhdGVtZW50KCkpIHtcbiAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpO1xuICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIHsgdGhpcy5jaGVja1ZhcmlhYmxlRXhwb3J0KGV4cG9ydHMsIG5vZGUuZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgbm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lLCBub2RlLmRlY2xhcmF0aW9uLmlkLnN0YXJ0KTsgfVxuICAgICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgICBub2RlLnNvdXJjZSA9IG51bGw7XG4gICAgfSBlbHNlIHsgLy8gZXhwb3J0IHsgeCwgeSBhcyB6IH0gW2Zyb20gJy4uLiddXG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gbnVsbDtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IHRoaXMucGFyc2VFeHBvcnRTcGVjaWZpZXJzKGV4cG9ydHMpO1xuICAgICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbChcImZyb21cIikpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMuc3RyaW5nKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuc3BlY2lmaWVyczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAvLyBjaGVjayBmb3Iga2V5d29yZHMgdXNlZCBhcyBsb2NhbCBuYW1lc1xuICAgICAgICAgIHZhciBzcGVjID0gbGlzdFtpXTtcblxuICAgICAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKHNwZWMubG9jYWwpO1xuICAgICAgICAgIC8vIGNoZWNrIGlmIGV4cG9ydCBpcyBkZWZpbmVkXG4gICAgICAgICAgdGhpcy5jaGVja0xvY2FsRXhwb3J0KHNwZWMubG9jYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIilcbiAgfTtcblxuICBwcCQxLmNoZWNrRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgcG9zKSB7XG4gICAgaWYgKCFleHBvcnRzKSB7IHJldHVybiB9XG4gICAgaWYgKGhhcyhleHBvcnRzLCBuYW1lKSlcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHBvcywgXCJEdXBsaWNhdGUgZXhwb3J0ICdcIiArIG5hbWUgKyBcIidcIik7IH1cbiAgICBleHBvcnRzW25hbWVdID0gdHJ1ZTtcbiAgfTtcblxuICBwcCQxLmNoZWNrUGF0dGVybkV4cG9ydCA9IGZ1bmN0aW9uKGV4cG9ydHMsIHBhdCkge1xuICAgIHZhciB0eXBlID0gcGF0LnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwiSWRlbnRpZmllclwiKVxuICAgICAgeyB0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMsIHBhdC5uYW1lLCBwYXQuc3RhcnQpOyB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICB7IGZvciAodmFyIGkgPSAwLCBsaXN0ID0gcGF0LnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByb3AgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcHJvcCk7XG4gICAgICAgIH0gfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpXG4gICAgICB7IGZvciAodmFyIGkkMSA9IDAsIGxpc3QkMSA9IHBhdC5lbGVtZW50czsgaSQxIDwgbGlzdCQxLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgdmFyIGVsdCA9IGxpc3QkMVtpJDFdO1xuXG4gICAgICAgICAgaWYgKGVsdCkgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBlbHQpOyB9XG4gICAgICB9IH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBcIlByb3BlcnR5XCIpXG4gICAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC52YWx1ZSk7IH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG4gICAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC5sZWZ0KTsgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIilcbiAgICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LmFyZ3VtZW50KTsgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LmV4cHJlc3Npb24pOyB9XG4gIH07XG5cbiAgcHAkMS5jaGVja1ZhcmlhYmxlRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgZGVjbHMpIHtcbiAgICBpZiAoIWV4cG9ydHMpIHsgcmV0dXJuIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IGRlY2xzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICAgIHtcbiAgICAgIHZhciBkZWNsID0gbGlzdFtpXTtcblxuICAgICAgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgZGVjbC5pZCk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDEuc2hvdWxkUGFyc2VFeHBvcnRTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLmtleXdvcmQgPT09IFwidmFyXCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImNvbnN0XCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImNsYXNzXCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgIHRoaXMuaXNMZXQoKSB8fFxuICAgICAgdGhpcy5pc0FzeW5jRnVuY3Rpb24oKVxuICB9O1xuXG4gIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBleHBvcnRzLlxuXG4gIHBwJDEucGFyc2VFeHBvcnRTcGVjaWZpZXJzID0gZnVuY3Rpb24oZXhwb3J0cykge1xuICAgIHZhciBub2RlcyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgLy8gZXhwb3J0IHsgeCwgeSBhcyB6IH0gW2Zyb20gJy4uLiddXG4gICAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICBub2RlLmV4cG9ydGVkID0gdGhpcy5lYXRDb250ZXh0dWFsKFwiYXNcIikgPyB0aGlzLnBhcnNlSWRlbnQodHJ1ZSkgOiBub2RlLmxvY2FsO1xuICAgICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBub2RlLmV4cG9ydGVkLm5hbWUsIG5vZGUuZXhwb3J0ZWQuc3RhcnQpO1xuICAgICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIikpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXNcbiAgfTtcblxuICAvLyBQYXJzZXMgaW1wb3J0IGRlY2xhcmF0aW9uLlxuXG4gIHBwJDEucGFyc2VJbXBvcnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgLy8gaW1wb3J0ICcuLi4nXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3RyaW5nKSB7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBlbXB0eTtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJzKCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJmcm9tXCIpO1xuICAgICAgbm9kZS5zb3VyY2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGltcG9ydHMuXG5cbiAgcHAkMS5wYXJzZUltcG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZXMgPSBbXSwgZmlyc3QgPSB0cnVlO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUpIHtcbiAgICAgIC8vIGltcG9ydCBkZWZhdWx0T2JqLCB7IHgsIHkgYXMgeiB9IGZyb20gJy4uLidcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKG5vZGUubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIikpO1xuICAgICAgaWYgKCF0aGlzLmVhdCh0eXBlcy5jb21tYSkpIHsgcmV0dXJuIG5vZGVzIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3Rhcikge1xuICAgICAgdmFyIG5vZGUkMSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImFzXCIpO1xuICAgICAgbm9kZSQxLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChub2RlJDEubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpKTtcbiAgICAgIHJldHVybiBub2Rlc1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICAgIHdoaWxlICghdGhpcy5lYXQodHlwZXMuYnJhY2VSKSkge1xuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5jb21tYSk7XG4gICAgICAgIGlmICh0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5icmFjZVIpKSB7IGJyZWFrIH1cbiAgICAgIH0gZWxzZSB7IGZpcnN0ID0gZmFsc2U7IH1cblxuICAgICAgdmFyIG5vZGUkMiA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBub2RlJDIuaW1wb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKFwiYXNcIikpIHtcbiAgICAgICAgbm9kZSQyLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVW5yZXNlcnZlZChub2RlJDIuaW1wb3J0ZWQpO1xuICAgICAgICBub2RlJDIubG9jYWwgPSBub2RlJDIuaW1wb3J0ZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrTFZhbChub2RlJDIubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDIsIFwiSW1wb3J0U3BlY2lmaWVyXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzXG4gIH07XG5cbiAgLy8gU2V0IGBFeHByZXNzaW9uU3RhdGVtZW50I2RpcmVjdGl2ZWAgcHJvcGVydHkgZm9yIGRpcmVjdGl2ZSBwcm9sb2d1ZXMuXG4gIHBwJDEuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZSA9IGZ1bmN0aW9uKHN0YXRlbWVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoICYmIHRoaXMuaXNEaXJlY3RpdmVDYW5kaWRhdGUoc3RhdGVtZW50c1tpXSk7ICsraSkge1xuICAgICAgc3RhdGVtZW50c1tpXS5kaXJlY3RpdmUgPSBzdGF0ZW1lbnRzW2ldLmV4cHJlc3Npb24ucmF3LnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gIH07XG4gIHBwJDEuaXNEaXJlY3RpdmVDYW5kaWRhdGUgPSBmdW5jdGlvbihzdGF0ZW1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RhdGVtZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiICYmXG4gICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgdHlwZW9mIHN0YXRlbWVudC5leHByZXNzaW9uLnZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAvLyBSZWplY3QgcGFyZW50aGVzaXplZCBzdHJpbmdzLlxuICAgICAgKHRoaXMuaW5wdXRbc3RhdGVtZW50LnN0YXJ0XSA9PT0gXCJcXFwiXCIgfHwgdGhpcy5pbnB1dFtzdGF0ZW1lbnQuc3RhcnRdID09PSBcIidcIilcbiAgICApXG4gIH07XG5cbiAgdmFyIHBwJDIgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vIENvbnZlcnQgZXhpc3RpbmcgZXhwcmVzc2lvbiBhdG9tIHRvIGFzc2lnbmFibGUgcGF0dGVyblxuICAvLyBpZiBwb3NzaWJsZS5cblxuICBwcCQyLnRvQXNzaWduYWJsZSA9IGZ1bmN0aW9uKG5vZGUsIGlzQmluZGluZywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBub2RlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgaWYgKHRoaXMuaW5Bc3luYyAmJiBub2RlLm5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHByb3AgPSBsaXN0W2ldO1xuXG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHByb3AsIGlzQmluZGluZyk7XG4gICAgICAgICAgLy8gRWFybHkgZXJyb3I6XG4gICAgICAgICAgLy8gICBBc3NpZ25tZW50UmVzdFByb3BlcnR5W1lpZWxkLCBBd2FpdF0gOlxuICAgICAgICAgIC8vICAgICBgLi4uYCBEZXN0cnVjdHVyaW5nQXNzaWdubWVudFRhcmdldFtZaWVsZCwgQXdhaXRdXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIEl0IGlzIGEgU3ludGF4IEVycm9yIGlmIHxEZXN0cnVjdHVyaW5nQXNzaWdubWVudFRhcmdldHwgaXMgYW4gfEFycmF5TGl0ZXJhbHwgb3IgYW4gfE9iamVjdExpdGVyYWx8LlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiICYmXG4gICAgICAgICAgICAocHJvcC5hcmd1bWVudC50eXBlID09PSBcIkFycmF5UGF0dGVyblwiIHx8IHByb3AuYXJndW1lbnQudHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKHByb3AuYXJndW1lbnQuc3RhcnQsIFwiVW5leHBlY3RlZCB0b2tlblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIlByb3BlcnR5XCI6XG4gICAgICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgICAgIGlmIChub2RlLmtpbmQgIT09IFwiaW5pdFwiKSB7IHRoaXMucmFpc2Uobm9kZS5rZXkuc3RhcnQsIFwiT2JqZWN0IHBhdHRlcm4gY2FuJ3QgY29udGFpbiBnZXR0ZXIgb3Igc2V0dGVyXCIpOyB9XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUudmFsdWUsIGlzQmluZGluZyk7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgbm9kZS50eXBlID0gXCJBcnJheVBhdHRlcm5cIjtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGVMaXN0KG5vZGUuZWxlbWVudHMsIGlzQmluZGluZyk7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgIG5vZGUudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCwgaXNCaW5kaW5nKTtcbiAgICAgICAgaWYgKG5vZGUuYXJndW1lbnQudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKVxuICAgICAgICAgIHsgdGhpcy5yYWlzZShub2RlLmFyZ3VtZW50LnN0YXJ0LCBcIlJlc3QgZWxlbWVudHMgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlXCIpOyB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobm9kZS5vcGVyYXRvciAhPT0gXCI9XCIpIHsgdGhpcy5yYWlzZShub2RlLmxlZnQuZW5kLCBcIk9ubHkgJz0nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWUuXCIpOyB9XG4gICAgICAgIG5vZGUudHlwZSA9IFwiQXNzaWdubWVudFBhdHRlcm5cIjtcbiAgICAgICAgZGVsZXRlIG5vZGUub3BlcmF0b3I7XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUubGVmdCwgaXNCaW5kaW5nKTtcbiAgICAgICAgLy8gZmFsbHMgdGhyb3VnaCB0byBBc3NpZ25tZW50UGF0dGVyblxuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbiwgaXNCaW5kaW5nLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIkNoYWluRXhwcmVzc2lvblwiOlxuICAgICAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJPcHRpb25hbCBjaGFpbmluZyBjYW5ub3QgYXBwZWFyIGluIGxlZnQtaGFuZCBzaWRlXCIpO1xuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAoIWlzQmluZGluZykgeyBicmVhayB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJBc3NpZ25pbmcgdG8gcnZhbHVlXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyB0aGlzLmNoZWNrUGF0dGVybkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTsgfVxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgLy8gQ29udmVydCBsaXN0IG9mIGV4cHJlc3Npb24gYXRvbXMgdG8gYmluZGluZyBsaXN0LlxuXG4gIHBwJDIudG9Bc3NpZ25hYmxlTGlzdCA9IGZ1bmN0aW9uKGV4cHJMaXN0LCBpc0JpbmRpbmcpIHtcbiAgICB2YXIgZW5kID0gZXhwckxpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHZhciBlbHQgPSBleHByTGlzdFtpXTtcbiAgICAgIGlmIChlbHQpIHsgdGhpcy50b0Fzc2lnbmFibGUoZWx0LCBpc0JpbmRpbmcpOyB9XG4gICAgfVxuICAgIGlmIChlbmQpIHtcbiAgICAgIHZhciBsYXN0ID0gZXhwckxpc3RbZW5kIC0gMV07XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIGlzQmluZGluZyAmJiBsYXN0ICYmIGxhc3QudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiICYmIGxhc3QuYXJndW1lbnQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKGxhc3QuYXJndW1lbnQuc3RhcnQpOyB9XG4gICAgfVxuICAgIHJldHVybiBleHByTGlzdFxuICB9O1xuXG4gIC8vIFBhcnNlcyBzcHJlYWQgZWxlbWVudC5cblxuICBwcCQyLnBhcnNlU3ByZWFkID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKVxuICB9O1xuXG4gIHBwJDIucGFyc2VSZXN0QmluZGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIFJlc3RFbGVtZW50IGluc2lkZSBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBtdXN0IGJlIGFuIGlkZW50aWZpZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSlcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cblxuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXN0RWxlbWVudFwiKVxuICB9O1xuXG4gIC8vIFBhcnNlcyBsdmFsdWUgKGFzc2lnbmFibGUpIGF0b20uXG5cbiAgcHAkMi5wYXJzZUJpbmRpbmdBdG9tID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSB0eXBlcy5icmFja2V0TDpcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVBhdHRlcm5cIilcblxuICAgICAgY2FzZSB0eXBlcy5icmFjZUw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKHRydWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnQoKVxuICB9O1xuXG4gIHBwJDIucGFyc2VCaW5kaW5nTGlzdCA9IGZ1bmN0aW9uKGNsb3NlLCBhbGxvd0VtcHR5LCBhbGxvd1RyYWlsaW5nQ29tbWEpIHtcbiAgICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICAgIGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyB9XG4gICAgICBlbHNlIHsgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpOyB9XG4gICAgICBpZiAoYWxsb3dFbXB0eSAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hKSB7XG4gICAgICAgIGVsdHMucHVzaChudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkge1xuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmVsbGlwc2lzKSB7XG4gICAgICAgIHZhciByZXN0ID0gdGhpcy5wYXJzZVJlc3RCaW5kaW5nKCk7XG4gICAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0ocmVzdCk7XG4gICAgICAgIGVsdHMucHVzaChyZXN0KTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICAgICAgICB0aGlzLmV4cGVjdChjbG9zZSk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWxlbSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCwgdGhpcy5zdGFydExvYyk7XG4gICAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0oZWxlbSk7XG4gICAgICAgIGVsdHMucHVzaChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsdHNcbiAgfTtcblxuICBwcCQyLnBhcnNlQmluZGluZ0xpc3RJdGVtID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW1cbiAgfTtcblxuICAvLyBQYXJzZXMgYXNzaWdubWVudCBwYXR0ZXJuIGFyb3VuZCBnaXZlbiBhdG9tIGlmIHBvc3NpYmxlLlxuXG4gIHBwJDIucGFyc2VNYXliZURlZmF1bHQgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGxlZnQpIHtcbiAgICBsZWZ0ID0gbGVmdCB8fCB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiB8fCAhdGhpcy5lYXQodHlwZXMuZXEpKSB7IHJldHVybiBsZWZ0IH1cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICBub2RlLmxlZnQgPSBsZWZ0O1xuICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgfTtcblxuICAvLyBWZXJpZnkgdGhhdCBhIG5vZGUgaXMgYW4gbHZhbCBcdTIwMTQgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkXG4gIC8vIHRvLlxuICAvLyBiaW5kaW5nVHlwZSBjYW4gYmUgZWl0aGVyOlxuICAvLyAndmFyJyBpbmRpY2F0aW5nIHRoYXQgdGhlIGx2YWwgY3JlYXRlcyBhICd2YXInIGJpbmRpbmdcbiAgLy8gJ2xldCcgaW5kaWNhdGluZyB0aGF0IHRoZSBsdmFsIGNyZWF0ZXMgYSBsZXhpY2FsICgnbGV0JyBvciAnY29uc3QnKSBiaW5kaW5nXG4gIC8vICdub25lJyBpbmRpY2F0aW5nIHRoYXQgdGhlIGJpbmRpbmcgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGlsbGVnYWwgaWRlbnRpZmllcnMsIGJ1dCBub3QgZm9yIGR1cGxpY2F0ZSByZWZlcmVuY2VzXG5cbiAgcHAkMi5jaGVja0xWYWwgPSBmdW5jdGlvbihleHByLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKSB7XG4gICAgaWYgKCBiaW5kaW5nVHlwZSA9PT0gdm9pZCAwICkgYmluZGluZ1R5cGUgPSBCSU5EX05PTkU7XG5cbiAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfTEVYSUNBTCAmJiBleHByLm5hbWUgPT09IFwibGV0XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwibGV0IGlzIGRpc2FsbG93ZWQgYXMgYSBsZXhpY2FsbHkgYm91bmQgbmFtZVwiKTsgfVxuICAgICAgaWYgKHRoaXMuc3RyaWN0ICYmIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmQudGVzdChleHByLm5hbWUpKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCAoYmluZGluZ1R5cGUgPyBcIkJpbmRpbmcgXCIgOiBcIkFzc2lnbmluZyB0byBcIikgKyBleHByLm5hbWUgKyBcIiBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgICAgaWYgKGNoZWNrQ2xhc2hlcykge1xuICAgICAgICBpZiAoaGFzKGNoZWNrQ2xhc2hlcywgZXhwci5uYW1lKSlcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkFyZ3VtZW50IG5hbWUgY2xhc2hcIik7IH1cbiAgICAgICAgY2hlY2tDbGFzaGVzW2V4cHIubmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGJpbmRpbmdUeXBlICE9PSBCSU5EX05PTkUgJiYgYmluZGluZ1R5cGUgIT09IEJJTkRfT1VUU0lERSkgeyB0aGlzLmRlY2xhcmVOYW1lKGV4cHIubmFtZSwgYmluZGluZ1R5cGUsIGV4cHIuc3RhcnQpOyB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIkNoYWluRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwiT3B0aW9uYWwgY2hhaW5pbmcgY2Fubm90IGFwcGVhciBpbiBsZWZ0LWhhbmQgc2lkZVwiKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgaWYgKGJpbmRpbmdUeXBlKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkJpbmRpbmcgbWVtYmVyIGV4cHJlc3Npb25cIik7IH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBleHByLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMuY2hlY2tMVmFsKHByb3AsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgIH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiUHJvcGVydHlcIjpcbiAgICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLnZhbHVlLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgICBmb3IgKHZhciBpJDEgPSAwLCBsaXN0JDEgPSBleHByLmVsZW1lbnRzOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICB2YXIgZWxlbSA9IGxpc3QkMVtpJDFdO1xuXG4gICAgICBpZiAoZWxlbSkgeyB0aGlzLmNoZWNrTFZhbChlbGVtLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTsgfVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5sZWZ0LCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIuYXJndW1lbnQsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5leHByZXNzaW9uLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy5yYWlzZShleHByLnN0YXJ0LCAoYmluZGluZ1R5cGUgPyBcIkJpbmRpbmdcIiA6IFwiQXNzaWduaW5nIHRvXCIpICsgXCIgcnZhbHVlXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbFxuXG4gIHZhciBwcCQzID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyBDaGVjayBpZiBwcm9wZXJ0eSBuYW1lIGNsYXNoZXMgd2l0aCBhbHJlYWR5IGFkZGVkLlxuICAvLyBPYmplY3QvY2xhc3MgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgbm90IGFsbG93ZWQgdG8gY2xhc2ggXHUyMDE0XG4gIC8vIGVpdGhlciB3aXRoIGVhY2ggb3RoZXIgb3Igd2l0aCBhbiBpbml0IHByb3BlcnR5IFx1MjAxNCBhbmQgaW5cbiAgLy8gc3RyaWN0IG1vZGUsIGluaXQgcHJvcGVydGllcyBhcmUgYWxzbyBub3QgYWxsb3dlZCB0byBiZSByZXBlYXRlZC5cblxuICBwcCQzLmNoZWNrUHJvcENsYXNoID0gZnVuY3Rpb24ocHJvcCwgcHJvcEhhc2gsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgcHJvcC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIilcbiAgICAgIHsgcmV0dXJuIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgKHByb3AuY29tcHV0ZWQgfHwgcHJvcC5tZXRob2QgfHwgcHJvcC5zaG9ydGhhbmQpKVxuICAgICAgeyByZXR1cm4gfVxuICAgIHZhciBrZXkgPSBwcm9wLmtleTtcbiAgICB2YXIgbmFtZTtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgY2FzZSBcIklkZW50aWZpZXJcIjogbmFtZSA9IGtleS5uYW1lOyBicmVha1xuICAgIGNhc2UgXCJMaXRlcmFsXCI6IG5hbWUgPSBTdHJpbmcoa2V5LnZhbHVlKTsgYnJlYWtcbiAgICBkZWZhdWx0OiByZXR1cm5cbiAgICB9XG4gICAgdmFyIGtpbmQgPSBwcm9wLmtpbmQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJfX3Byb3RvX19cIiAmJiBraW5kID09PSBcImluaXRcIikge1xuICAgICAgICBpZiAocHJvcEhhc2gucHJvdG8pIHtcbiAgICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG8gPCAwKVxuICAgICAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG8gPSBrZXkuc3RhcnQ7IH1cbiAgICAgICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXQga2x1ZGdlLiBDYW4gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDYuMFxuICAgICAgICAgIH0gZWxzZSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShrZXkuc3RhcnQsIFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eVwiKTsgfVxuICAgICAgICB9XG4gICAgICAgIHByb3BIYXNoLnByb3RvID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBuYW1lID0gXCIkXCIgKyBuYW1lO1xuICAgIHZhciBvdGhlciA9IHByb3BIYXNoW25hbWVdO1xuICAgIGlmIChvdGhlcikge1xuICAgICAgdmFyIHJlZGVmaW5pdGlvbjtcbiAgICAgIGlmIChraW5kID09PSBcImluaXRcIikge1xuICAgICAgICByZWRlZmluaXRpb24gPSB0aGlzLnN0cmljdCAmJiBvdGhlci5pbml0IHx8IG90aGVyLmdldCB8fCBvdGhlci5zZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWRlZmluaXRpb24gPSBvdGhlci5pbml0IHx8IG90aGVyW2tpbmRdO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVmaW5pdGlvbilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCBcIlJlZGVmaW5pdGlvbiBvZiBwcm9wZXJ0eVwiKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdGhlciA9IHByb3BIYXNoW25hbWVdID0ge1xuICAgICAgICBpbml0OiBmYWxzZSxcbiAgICAgICAgZ2V0OiBmYWxzZSxcbiAgICAgICAgc2V0OiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgb3RoZXJba2luZF0gPSB0cnVlO1xuICB9O1xuXG4gIC8vICMjIyBFeHByZXNzaW9uIHBhcnNpbmdcblxuICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbiAgLy8gJ2F0b21pYycsIG5vbmRpdmlzaWJsZSBleHByZXNzaW9uIHR5cGVzIGF0IHRoZSBib3R0b20uIE1vc3Qgb2ZcbiAgLy8gdGhlIGZ1bmN0aW9ucyB3aWxsIHNpbXBseSBsZXQgdGhlIGZ1bmN0aW9uKHMpIGJlbG93IHRoZW0gcGFyc2UsXG4gIC8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwXG4gIC8vIHRoZSBBU1Qgbm9kZSB0aGF0IHRoZSBpbm5lciBwYXJzZXIgZ2F2ZSB0aGVtIGluIGFub3RoZXIgbm9kZS5cblxuICAvLyBQYXJzZSBhIGZ1bGwgZXhwcmVzc2lvbi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCB0b1xuICAvLyBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0YWxpemF0aW9uIGV4cHJlc3Npb25zKVxuICAvLyBhbmQgcHJvdmlkZSByZWZlcmVuY2UgZm9yIHN0b3JpbmcgJz0nIG9wZXJhdG9yIGluc2lkZSBzaG9ydGhhbmRcbiAgLy8gcHJvcGVydHkgYXNzaWdubWVudCBpbiBjb250ZXh0cyB3aGVyZSBib3RoIG9iamVjdCBleHByZXNzaW9uXG4gIC8vIGFuZCBvYmplY3QgcGF0dGVybiBtaWdodCBhcHBlYXIgKHNvIGl0J3MgcG9zc2libGUgdG8gcmFpc2VcbiAgLy8gZGVsYXllZCBzeW50YXggZXJyb3IgYXQgY29ycmVjdCBwb3NpdGlvbikuXG5cbiAgcHAkMy5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbZXhwcl07XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHlwZXMuY29tbWEpKSB7IG5vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpOyB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU2VxdWVuY2VFeHByZXNzaW9uXCIpXG4gICAgfVxuICAgIHJldHVybiBleHByXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZlxuICAvLyBvcGVyYXRvcnMgbGlrZSBgKz1gLlxuXG4gIHBwJDMucGFyc2VNYXliZUFzc2lnbiA9IGZ1bmN0aW9uKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGFmdGVyTGVmdFBhcnNlKSB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKFwieWllbGRcIikpIHtcbiAgICAgIGlmICh0aGlzLmluR2VuZXJhdG9yKSB7IHJldHVybiB0aGlzLnBhcnNlWWllbGQobm9JbikgfVxuICAgICAgLy8gVGhlIHRva2VuaXplciB3aWxsIGFzc3VtZSBhbiBleHByZXNzaW9uIGlzIGFsbG93ZWQgYWZ0ZXJcbiAgICAgIC8vIGB5aWVsZGAsIGJ1dCB0aGlzIGlzbid0IHRoYXQga2luZCBvZiB5aWVsZFxuICAgICAgZWxzZSB7IHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTsgfVxuICAgIH1cblxuICAgIHZhciBvd25EZXN0cnVjdHVyaW5nRXJyb3JzID0gZmFsc2UsIG9sZFBhcmVuQXNzaWduID0gLTEsIG9sZFRyYWlsaW5nQ29tbWEgPSAtMTtcbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgb2xkUGFyZW5Bc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ247XG4gICAgICBvbGRUcmFpbGluZ0NvbW1hID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hO1xuICAgICAgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICAgIG93bkRlc3RydWN0dXJpbmdFcnJvcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5wYXJlbkwgfHwgdGhpcy50eXBlID09PSB0eXBlcy5uYW1lKVxuICAgICAgeyB0aGlzLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXJ0OyB9XG4gICAgdmFyIGxlZnQgPSB0aGlzLnBhcnNlTWF5YmVDb25kaXRpb25hbChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBpZiAoYWZ0ZXJMZWZ0UGFyc2UpIHsgbGVmdCA9IGFmdGVyTGVmdFBhcnNlLmNhbGwodGhpcywgbGVmdCwgc3RhcnRQb3MsIHN0YXJ0TG9jKTsgfVxuICAgIGlmICh0aGlzLnR5cGUuaXNBc3NpZ24pIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlLmxlZnQgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmVxID8gdGhpcy50b0Fzc2lnbmFibGUobGVmdCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIDogbGVmdDtcbiAgICAgIGlmICghb3duRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvID0gLTE7XG4gICAgICB9XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ24gPj0gbm9kZS5sZWZ0LnN0YXJ0KVxuICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gLTE7IH0gLy8gcmVzZXQgYmVjYXVzZSBzaG9ydGhhbmQgZGVmYXVsdCB3YXMgdXNlZCBjb3JyZWN0bHlcbiAgICAgIHRoaXMuY2hlY2tMVmFsKGxlZnQpO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBub2RlLnJpZ2h0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvd25EZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpOyB9XG4gICAgfVxuICAgIGlmIChvbGRQYXJlbkFzc2lnbiA+IC0xKSB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IG9sZFBhcmVuQXNzaWduOyB9XG4gICAgaWYgKG9sZFRyYWlsaW5nQ29tbWEgPiAtMSkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSBvbGRUcmFpbGluZ0NvbW1hOyB9XG4gICAgcmV0dXJuIGxlZnRcbiAgfTtcblxuICAvLyBQYXJzZSBhIHRlcm5hcnkgY29uZGl0aW9uYWwgKGA/OmApIG9wZXJhdG9yLlxuXG4gIHBwJDMucGFyc2VNYXliZUNvbmRpdGlvbmFsID0gZnVuY3Rpb24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByT3BzKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnF1ZXN0aW9uKSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLnRlc3QgPSBleHByO1xuICAgICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5jb2xvbik7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihub0luKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIilcbiAgICB9XG4gICAgcmV0dXJuIGV4cHJcbiAgfTtcblxuICAvLyBTdGFydCB0aGUgcHJlY2VkZW5jZSBwYXJzZXIuXG5cbiAgcHAkMy5wYXJzZUV4cHJPcHMgPSBmdW5jdGlvbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZU1heWJlVW5hcnkocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZmFsc2UpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgcmV0dXJuIGV4cHIuc3RhcnQgPT09IHN0YXJ0UG9zICYmIGV4cHIudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiID8gZXhwciA6IHRoaXMucGFyc2VFeHByT3AoZXhwciwgc3RhcnRQb3MsIHN0YXJ0TG9jLCAtMSwgbm9JbilcbiAgfTtcblxuICAvLyBQYXJzZSBiaW5hcnkgb3BlcmF0b3JzIHdpdGggdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgcGFyc2luZ1xuICAvLyBhbGdvcml0aG0uIGBsZWZ0YCBpcyB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yLlxuICAvLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmRcbiAgLy8gZGVmZXIgZnVydGhlciBwYXJzZXIgdG8gb25lIG9mIGl0cyBjYWxsZXJzIHdoZW4gaXQgZW5jb3VudGVycyBhblxuICAvLyBvcGVyYXRvciB0aGF0IGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiB0aGUgc2V0IGl0IGlzIHBhcnNpbmcuXG5cbiAgcHAkMy5wYXJzZUV4cHJPcCA9IGZ1bmN0aW9uKGxlZnQsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBub0luKSB7XG4gICAgdmFyIHByZWMgPSB0aGlzLnR5cGUuYmlub3A7XG4gICAgaWYgKHByZWMgIT0gbnVsbCAmJiAoIW5vSW4gfHwgdGhpcy50eXBlICE9PSB0eXBlcy5faW4pKSB7XG4gICAgICBpZiAocHJlYyA+IG1pblByZWMpIHtcbiAgICAgICAgdmFyIGxvZ2ljYWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmxvZ2ljYWxPUiB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLmxvZ2ljYWxBTkQ7XG4gICAgICAgIHZhciBjb2FsZXNjZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuY29hbGVzY2U7XG4gICAgICAgIGlmIChjb2FsZXNjZSkge1xuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcHJlY2VkZW5jZSBvZiBgdHQuY29hbGVzY2VgIGFzIGVxdWFsIHRvIHRoZSByYW5nZSBvZiBsb2dpY2FsIGV4cHJlc3Npb25zLlxuICAgICAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBgbm9kZS5yaWdodGAgc2hvdWxkbid0IGNvbnRhaW4gbG9naWNhbCBleHByZXNzaW9ucyBpbiBvcmRlciB0byBjaGVjayB0aGUgbWl4ZWQgZXJyb3IuXG4gICAgICAgICAgcHJlYyA9IHR5cGVzLmxvZ2ljYWxBTkQuYmlub3A7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJPcCh0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIHN0YXJ0UG9zLCBzdGFydExvYywgcHJlYywgbm9Jbik7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5idWlsZEJpbmFyeShsZWZ0U3RhcnRQb3MsIGxlZnRTdGFydExvYywgbGVmdCwgcmlnaHQsIG9wLCBsb2dpY2FsIHx8IGNvYWxlc2NlKTtcbiAgICAgICAgaWYgKChsb2dpY2FsICYmIHRoaXMudHlwZSA9PT0gdHlwZXMuY29hbGVzY2UpIHx8IChjb2FsZXNjZSAmJiAodGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsT1IgfHwgdGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsQU5EKSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJMb2dpY2FsIGV4cHJlc3Npb25zIGFuZCBjb2FsZXNjZSBleHByZXNzaW9ucyBjYW5ub3QgYmUgbWl4ZWQuIFdyYXAgZWl0aGVyIGJ5IHBhcmVudGhlc2VzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXhwck9wKG5vZGUsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBub0luKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVmdFxuICB9O1xuXG4gIHBwJDMuYnVpbGRCaW5hcnkgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGxlZnQsIHJpZ2h0LCBvcCwgbG9naWNhbCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUubGVmdCA9IGxlZnQ7XG4gICAgbm9kZS5vcGVyYXRvciA9IG9wO1xuICAgIG5vZGUucmlnaHQgPSByaWdodDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGxvZ2ljYWwgPyBcIkxvZ2ljYWxFeHByZXNzaW9uXCIgOiBcIkJpbmFyeUV4cHJlc3Npb25cIilcbiAgfTtcblxuICAvLyBQYXJzZSB1bmFyeSBvcGVyYXRvcnMsIGJvdGggcHJlZml4IGFuZCBwb3N0Zml4LlxuXG4gIHBwJDMucGFyc2VNYXliZVVuYXJ5ID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgc2F3VW5hcnkpIHtcbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGV4cHI7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKFwiYXdhaXRcIikgJiYgKHRoaXMuaW5Bc3luYyB8fCAoIXRoaXMuaW5GdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbikpKSB7XG4gICAgICBleHByID0gdGhpcy5wYXJzZUF3YWl0KCk7XG4gICAgICBzYXdVbmFyeSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUucHJlZml4KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIHVwZGF0ZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuaW5jRGVjO1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlLnByZWZpeCA9IHRydWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCB0cnVlKTtcbiAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuICAgICAgaWYgKHVwZGF0ZSkgeyB0aGlzLmNoZWNrTFZhbChub2RlLmFyZ3VtZW50KTsgfVxuICAgICAgZWxzZSBpZiAodGhpcy5zdHJpY3QgJiYgbm9kZS5vcGVyYXRvciA9PT0gXCJkZWxldGVcIiAmJlxuICAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudC50eXBlID09PSBcIklkZW50aWZpZXJcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJEZWxldGluZyBsb2NhbCB2YXJpYWJsZSBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgICAgZWxzZSB7IHNhd1VuYXJ5ID0gdHJ1ZTsgfVxuICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCB1cGRhdGUgPyBcIlVwZGF0ZUV4cHJlc3Npb25cIiA6IFwiVW5hcnlFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgaWYgKHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKSB7IHJldHVybiBleHByIH1cbiAgICAgIHdoaWxlICh0aGlzLnR5cGUucG9zdGZpeCAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkge1xuICAgICAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgICBub2RlJDEub3BlcmF0b3IgPSB0aGlzLnZhbHVlO1xuICAgICAgICBub2RlJDEucHJlZml4ID0gZmFsc2U7XG4gICAgICAgIG5vZGUkMS5hcmd1bWVudCA9IGV4cHI7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiVXBkYXRlRXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNhd1VuYXJ5ICYmIHRoaXMuZWF0KHR5cGVzLnN0YXJzdGFyKSlcbiAgICAgIHsgcmV0dXJuIHRoaXMuYnVpbGRCaW5hcnkoc3RhcnRQb3MsIHN0YXJ0TG9jLCBleHByLCB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIFwiKipcIiwgZmFsc2UpIH1cbiAgICBlbHNlXG4gICAgICB7IHJldHVybiBleHByIH1cbiAgfTtcblxuICAvLyBQYXJzZSBjYWxsLCBkb3QsIGFuZCBgW11gLXN1YnNjcmlwdCBleHByZXNzaW9ucy5cblxuICBwcCQzLnBhcnNlRXhwclN1YnNjcmlwdHMgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJBdG9tKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmIChleHByLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiB0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva1N0YXJ0LCB0aGlzLmxhc3RUb2tFbmQpICE9PSBcIilcIilcbiAgICAgIHsgcmV0dXJuIGV4cHIgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlU3Vic2NyaXB0cyhleHByLCBzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzICYmIHJlc3VsdC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA+PSByZXN1bHQuc3RhcnQpIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gLTE7IH1cbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gLTE7IH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9O1xuXG4gIHBwJDMucGFyc2VTdWJzY3JpcHRzID0gZnVuY3Rpb24oYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzKSB7XG4gICAgdmFyIG1heWJlQXN5bmNBcnJvdyA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIGJhc2UudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICAgdGhpcy5sYXN0VG9rRW5kID09PSBiYXNlLmVuZCAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiBiYXNlLmVuZCAtIGJhc2Uuc3RhcnQgPT09IDUgJiZcbiAgICAgICAgdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID09PSBiYXNlLnN0YXJ0O1xuICAgIHZhciBvcHRpb25hbENoYWluZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzLCBtYXliZUFzeW5jQXJyb3csIG9wdGlvbmFsQ2hhaW5lZCk7XG5cbiAgICAgIGlmIChlbGVtZW50Lm9wdGlvbmFsKSB7IG9wdGlvbmFsQ2hhaW5lZCA9IHRydWU7IH1cbiAgICAgIGlmIChlbGVtZW50ID09PSBiYXNlIHx8IGVsZW1lbnQudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGlmIChvcHRpb25hbENoYWluZWQpIHtcbiAgICAgICAgICB2YXIgY2hhaW5Ob2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgICAgIGNoYWluTm9kZS5leHByZXNzaW9uID0gZWxlbWVudDtcbiAgICAgICAgICBlbGVtZW50ID0gdGhpcy5maW5pc2hOb2RlKGNoYWluTm9kZSwgXCJDaGFpbkV4cHJlc3Npb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgYmFzZSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VTdWJzY3JpcHQgPSBmdW5jdGlvbihiYXNlLCBzdGFydFBvcywgc3RhcnRMb2MsIG5vQ2FsbHMsIG1heWJlQXN5bmNBcnJvdywgb3B0aW9uYWxDaGFpbmVkKSB7XG4gICAgdmFyIG9wdGlvbmFsU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDExO1xuICAgIHZhciBvcHRpb25hbCA9IG9wdGlvbmFsU3VwcG9ydGVkICYmIHRoaXMuZWF0KHR5cGVzLnF1ZXN0aW9uRG90KTtcbiAgICBpZiAobm9DYWxscyAmJiBvcHRpb25hbCkgeyB0aGlzLnJhaXNlKHRoaXMubGFzdFRva1N0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIGNhbGxlZSBvZiBuZXcgZXhwcmVzc2lvbnNcIik7IH1cblxuICAgIHZhciBjb21wdXRlZCA9IHRoaXMuZWF0KHR5cGVzLmJyYWNrZXRMKTtcbiAgICBpZiAoY29tcHV0ZWQgfHwgKG9wdGlvbmFsICYmIHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5MICYmIHRoaXMudHlwZSAhPT0gdHlwZXMuYmFja1F1b3RlKSB8fCB0aGlzLmVhdCh0eXBlcy5kb3QpKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICAgIG5vZGUucHJvcGVydHkgPSBjb21wdXRlZCA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiB0aGlzLnBhcnNlSWRlbnQodGhpcy5vcHRpb25zLmFsbG93UmVzZXJ2ZWQgIT09IFwibmV2ZXJcIik7XG4gICAgICBub2RlLmNvbXB1dGVkID0gISFjb21wdXRlZDtcbiAgICAgIGlmIChjb21wdXRlZCkgeyB0aGlzLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7IH1cbiAgICAgIGlmIChvcHRpb25hbFN1cHBvcnRlZCkge1xuICAgICAgICBub2RlLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgICB9XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTWVtYmVyRXhwcmVzc2lvblwiKTtcbiAgICB9IGVsc2UgaWYgKCFub0NhbGxzICYmIHRoaXMuZWF0KHR5cGVzLnBhcmVuTCkpIHtcbiAgICAgIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnMsIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBvbGRBd2FpdElkZW50UG9zID0gdGhpcy5hd2FpdElkZW50UG9zO1xuICAgICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgICB0aGlzLmF3YWl0UG9zID0gMDtcbiAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IDA7XG4gICAgICB2YXIgZXhwckxpc3QgPSB0aGlzLnBhcnNlRXhwckxpc3QodHlwZXMucGFyZW5SLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgaWYgKG1heWJlQXN5bmNBcnJvdyAmJiAhb3B0aW9uYWwgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkgJiYgdGhpcy5lYXQodHlwZXMuYXJyb3cpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTtcbiAgICAgICAgaWYgKHRoaXMuYXdhaXRJZGVudFBvcyA+IDApXG4gICAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRJZGVudFBvcywgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgICAgdGhpcy55aWVsZFBvcyA9IG9sZFlpZWxkUG9zO1xuICAgICAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgZXhwckxpc3QsIHRydWUpXG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcyB8fCB0aGlzLnlpZWxkUG9zO1xuICAgICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zIHx8IHRoaXMuYXdhaXRQb3M7XG4gICAgICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zIHx8IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgICAgIHZhciBub2RlJDEgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlJDEuY2FsbGVlID0gYmFzZTtcbiAgICAgIG5vZGUkMS5hcmd1bWVudHMgPSBleHByTGlzdDtcbiAgICAgIGlmIChvcHRpb25hbFN1cHBvcnRlZCkge1xuICAgICAgICBub2RlJDEub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICAgIH1cbiAgICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSQxLCBcIkNhbGxFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5iYWNrUXVvdGUpIHtcbiAgICAgIGlmIChvcHRpb25hbCB8fCBvcHRpb25hbENoYWluZWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIHRhZyBvZiB0YWdnZWQgdGVtcGxhdGUgZXhwcmVzc2lvbnNcIik7XG4gICAgICB9XG4gICAgICB2YXIgbm9kZSQyID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZSQyLnRhZyA9IGJhc2U7XG4gICAgICBub2RlJDIucXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGUoe2lzVGFnZ2VkOiB0cnVlfSk7XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUkMiwgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHJldHVybiBiYXNlXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gYXRvbWljIGV4cHJlc3Npb24gXHUyMDE0IGVpdGhlciBhIHNpbmdsZSB0b2tlbiB0aGF0IGlzIGFuXG4gIC8vIGV4cHJlc3Npb24sIGFuIGV4cHJlc3Npb24gc3RhcnRlZCBieSBhIGtleXdvcmQgbGlrZSBgZnVuY3Rpb25gIG9yXG4gIC8vIGBuZXdgLCBvciBhbiBleHByZXNzaW9uIHdyYXBwZWQgaW4gcHVuY3R1YXRpb24gbGlrZSBgKClgLCBgW11gLFxuICAvLyBvciBge31gLlxuXG4gIHBwJDMucGFyc2VFeHByQXRvbSA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAvLyBJZiBhIGRpdmlzaW9uIG9wZXJhdG9yIGFwcGVhcnMgaW4gYW4gZXhwcmVzc2lvbiBwb3NpdGlvbiwgdGhlXG4gICAgLy8gdG9rZW5pemVyIGdvdCBjb25mdXNlZCwgYW5kIHdlIGZvcmNlIGl0IHRvIHJlYWQgYSByZWdleHAgaW5zdGVhZC5cbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5zbGFzaCkgeyB0aGlzLnJlYWRSZWdleHAoKTsgfVxuXG4gICAgdmFyIG5vZGUsIGNhbkJlQXJyb3cgPSB0aGlzLnBvdGVudGlhbEFycm93QXQgPT09IHRoaXMuc3RhcnQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIHR5cGVzLl9zdXBlcjpcbiAgICAgIGlmICghdGhpcy5hbGxvd1N1cGVyKVxuICAgICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInc3VwZXInIGtleXdvcmQgb3V0c2lkZSBhIG1ldGhvZFwiKTsgfVxuICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCAmJiAhdGhpcy5hbGxvd0RpcmVjdFN1cGVyKVxuICAgICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJzdXBlcigpIGNhbGwgb3V0c2lkZSBjb25zdHJ1Y3RvciBvZiBhIHN1YmNsYXNzXCIpOyB9XG4gICAgICAvLyBUaGUgYHN1cGVyYCBrZXl3b3JkIGNhbiBhcHBlYXIgYXQgYmVsb3c6XG4gICAgICAvLyBTdXBlclByb3BlcnR5OlxuICAgICAgLy8gICAgIHN1cGVyIFsgRXhwcmVzc2lvbiBdXG4gICAgICAvLyAgICAgc3VwZXIgLiBJZGVudGlmaWVyTmFtZVxuICAgICAgLy8gU3VwZXJDYWxsOlxuICAgICAgLy8gICAgIHN1cGVyICggQXJndW1lbnRzIClcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLmRvdCAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNrZXRMICYmIHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5MKVxuICAgICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3VwZXJcIilcblxuICAgIGNhc2UgdHlwZXMuX3RoaXM6XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRoaXNFeHByZXNzaW9uXCIpXG5cbiAgICBjYXNlIHR5cGVzLm5hbWU6XG4gICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGNvbnRhaW5zRXNjID0gdGhpcy5jb250YWluc0VzYztcbiAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VJZGVudChmYWxzZSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgIWNvbnRhaW5zRXNjICYmIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5fZnVuY3Rpb24pKVxuICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCAwLCBmYWxzZSwgdHJ1ZSkgfVxuICAgICAgaWYgKGNhbkJlQXJyb3cgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmFycm93KSlcbiAgICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgW2lkXSwgZmFsc2UpIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgJiYgIWNvbnRhaW5zRXNjKSB7XG4gICAgICAgICAgaWQgPSB0aGlzLnBhcnNlSWRlbnQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLmVhdCh0eXBlcy5hcnJvdykpXG4gICAgICAgICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBbaWRdLCB0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRcblxuICAgIGNhc2UgdHlwZXMucmVnZXhwOlxuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIG5vZGUgPSB0aGlzLnBhcnNlTGl0ZXJhbCh2YWx1ZS52YWx1ZSk7XG4gICAgICBub2RlLnJlZ2V4ID0ge3BhdHRlcm46IHZhbHVlLnBhdHRlcm4sIGZsYWdzOiB2YWx1ZS5mbGFnc307XG4gICAgICByZXR1cm4gbm9kZVxuXG4gICAgY2FzZSB0eXBlcy5udW06IGNhc2UgdHlwZXMuc3RyaW5nOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMudmFsdWUpXG5cbiAgICBjYXNlIHR5cGVzLl9udWxsOiBjYXNlIHR5cGVzLl90cnVlOiBjYXNlIHR5cGVzLl9mYWxzZTpcbiAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgbm9kZS52YWx1ZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuX251bGwgPyBudWxsIDogdGhpcy50eXBlID09PSB0eXBlcy5fdHJ1ZTtcbiAgICAgIG5vZGUucmF3ID0gdGhpcy50eXBlLmtleXdvcmQ7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG5cbiAgICBjYXNlIHR5cGVzLnBhcmVuTDpcbiAgICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQsIGV4cHIgPSB0aGlzLnBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb24oY2FuQmVBcnJvdyk7XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduIDwgMCAmJiAhdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByKSlcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IHN0YXJ0OyB9XG4gICAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kIDwgMClcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPSBzdGFydDsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cHJcblxuICAgIGNhc2UgdHlwZXMuYnJhY2tldEw6XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VFeHByTGlzdCh0eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyYXlFeHByZXNzaW9uXCIpXG5cbiAgICBjYXNlIHR5cGVzLmJyYWNlTDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKVxuXG4gICAgY2FzZSB0eXBlcy5fZnVuY3Rpb246XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLCAwKVxuXG4gICAgY2FzZSB0eXBlcy5fY2xhc3M6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNsYXNzKHRoaXMuc3RhcnROb2RlKCksIGZhbHNlKVxuXG4gICAgY2FzZSB0eXBlcy5fbmV3OlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VOZXcoKVxuXG4gICAgY2FzZSB0eXBlcy5iYWNrUXVvdGU6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVRlbXBsYXRlKClcblxuICAgIGNhc2UgdHlwZXMuX2ltcG9ydDpcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFeHBySW1wb3J0KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuZXhwZWN0ZWQoKVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cbiAgfTtcblxuICBwcCQzLnBhcnNlRXhwckltcG9ydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgIC8vIENvbnN1bWUgYGltcG9ydGAgYXMgYW4gaWRlbnRpZmllciBmb3IgYGltcG9ydC5tZXRhYC5cbiAgICAvLyBCZWNhdXNlIGB0aGlzLnBhcnNlSWRlbnQodHJ1ZSlgIGRvZXNuJ3QgY2hlY2sgZXNjYXBlIHNlcXVlbmNlcywgaXQgbmVlZHMgdGhlIGNoZWNrIG9mIGB0aGlzLmNvbnRhaW5zRXNjYC5cbiAgICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBpbXBvcnRcIik7IH1cbiAgICB2YXIgbWV0YSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSB0eXBlcy5wYXJlbkw6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUR5bmFtaWNJbXBvcnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLmRvdDpcbiAgICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydE1ldGEobm9kZSlcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VEeW5hbWljSW1wb3J0ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpOyAvLyBza2lwIGAoYFxuXG4gICAgLy8gUGFyc2Ugbm9kZS5zb3VyY2UuXG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcblxuICAgIC8vIFZlcmlmeSBlbmRpbmcuXG4gICAgaWYgKCF0aGlzLmVhdCh0eXBlcy5wYXJlblIpKSB7XG4gICAgICB2YXIgZXJyb3JQb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmNvbW1hKSAmJiB0aGlzLmVhdCh0eXBlcy5wYXJlblIpKSB7XG4gICAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShlcnJvclBvcywgXCJUcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZCBpbiBpbXBvcnQoKVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChlcnJvclBvcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEV4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQzLnBhcnNlSW1wb3J0TWV0YSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTsgLy8gc2tpcCBgLmBcblxuICAgIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcblxuICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IFwibWV0YVwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5wcm9wZXJ0eS5zdGFydCwgXCJUaGUgb25seSB2YWxpZCBtZXRhIHByb3BlcnR5IGZvciBpbXBvcnQgaXMgJ2ltcG9ydC5tZXRhJ1wiKTsgfVxuICAgIGlmIChjb250YWluc0VzYylcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiJ2ltcG9ydC5tZXRhJyBtdXN0IG5vdCBjb250YWluIGVzY2FwZWQgY2hhcmFjdGVyc1wiKTsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuc291cmNlVHlwZSAhPT0gXCJtb2R1bGVcIilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiQ2Fubm90IHVzZSAnaW1wb3J0Lm1ldGEnIG91dHNpZGUgYSBtb2R1bGVcIik7IH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZXRhUHJvcGVydHlcIilcbiAgfTtcblxuICBwcCQzLnBhcnNlTGl0ZXJhbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIG5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICBub2RlLnJhdyA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpO1xuICAgIGlmIChub2RlLnJhdy5jaGFyQ29kZUF0KG5vZGUucmF3Lmxlbmd0aCAtIDEpID09PSAxMTApIHsgbm9kZS5iaWdpbnQgPSBub2RlLnJhdy5zbGljZSgwLCAtMSkucmVwbGFjZSgvXy9nLCBcIlwiKTsgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVBhcmVuRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gICAgdmFyIHZhbCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtcbiAgICByZXR1cm4gdmFsXG4gIH07XG5cbiAgcHAkMy5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uID0gZnVuY3Rpb24oY2FuQmVBcnJvdykge1xuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYywgdmFsLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gODtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICB2YXIgaW5uZXJTdGFydFBvcyA9IHRoaXMuc3RhcnQsIGlubmVyU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgdmFyIGV4cHJMaXN0ID0gW10sIGZpcnN0ID0gdHJ1ZSwgbGFzdElzQ29tbWEgPSBmYWxzZTtcbiAgICAgIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnMsIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBzcHJlYWRTdGFydDtcbiAgICAgIHRoaXMueWllbGRQb3MgPSAwO1xuICAgICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgICAvLyBEbyBub3Qgc2F2ZSBhd2FpdElkZW50UG9zIHRvIGFsbG93IGNoZWNraW5nIGF3YWl0cyBuZXN0ZWQgaW4gcGFyYW1ldGVyc1xuICAgICAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5SKSB7XG4gICAgICAgIGZpcnN0ID8gZmlyc3QgPSBmYWxzZSA6IHRoaXMuZXhwZWN0KHR5cGVzLmNvbW1hKTtcbiAgICAgICAgaWYgKGFsbG93VHJhaWxpbmdDb21tYSAmJiB0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5wYXJlblIsIHRydWUpKSB7XG4gICAgICAgICAgbGFzdElzQ29tbWEgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgICAgIHNwcmVhZFN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMucGFyc2VQYXJlbkl0ZW0odGhpcy5wYXJzZVJlc3RCaW5kaW5nKCkpKTtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5jb21tYSkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpOyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdGhpcy5wYXJzZVBhcmVuSXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5uZXJFbmRQb3MgPSB0aGlzLnN0YXJ0LCBpbm5lckVuZExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuXG4gICAgICBpZiAoY2FuQmVBcnJvdyAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5hcnJvdykpIHtcbiAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZmFsc2UpO1xuICAgICAgICB0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpO1xuICAgICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQYXJlbkFycm93TGlzdChzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4cHJMaXN0Lmxlbmd0aCB8fCBsYXN0SXNDb21tYSkgeyB0aGlzLnVuZXhwZWN0ZWQodGhpcy5sYXN0VG9rU3RhcnQpOyB9XG4gICAgICBpZiAoc3ByZWFkU3RhcnQpIHsgdGhpcy51bmV4cGVjdGVkKHNwcmVhZFN0YXJ0KTsgfVxuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3MgfHwgdGhpcy55aWVsZFBvcztcbiAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcyB8fCB0aGlzLmF3YWl0UG9zO1xuXG4gICAgICBpZiAoZXhwckxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICB2YWwgPSB0aGlzLnN0YXJ0Tm9kZUF0KGlubmVyU3RhcnRQb3MsIGlubmVyU3RhcnRMb2MpO1xuICAgICAgICB2YWwuZXhwcmVzc2lvbnMgPSBleHByTGlzdDtcbiAgICAgICAgdGhpcy5maW5pc2hOb2RlQXQodmFsLCBcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBpbm5lckVuZFBvcywgaW5uZXJFbmRMb2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gZXhwckxpc3RbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXNlcnZlUGFyZW5zKSB7XG4gICAgICB2YXIgcGFyID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgcGFyLmV4cHJlc3Npb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHBhciwgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VQYXJlbkl0ZW0gPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1cbiAgfTtcblxuICBwcCQzLnBhcnNlUGFyZW5BcnJvd0xpc3QgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0KSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBleHByTGlzdClcbiAgfTtcblxuICAvLyBOZXcncyBwcmVjZWRlbmNlIGlzIHNsaWdodGx5IHRyaWNreS4gSXQgbXVzdCBhbGxvdyBpdHMgYXJndW1lbnQgdG9cbiAgLy8gYmUgYSBgW11gIG9yIGRvdCBzdWJzY3JpcHQgZXhwcmVzc2lvbiwgYnV0IG5vdCBhIGNhbGwgXHUyMDE0IGF0IGxlYXN0LFxuICAvLyBub3Qgd2l0aG91dCB3cmFwcGluZyBpdCBpbiBwYXJlbnRoZXNlcy4gVGh1cywgaXQgdXNlcyB0aGUgbm9DYWxsc1xuICAvLyBhcmd1bWVudCB0byBwYXJzZVN1YnNjcmlwdHMgdG8gcHJldmVudCBpdCBmcm9tIGNvbnN1bWluZyB0aGVcbiAgLy8gYXJndW1lbnQgbGlzdC5cblxuICB2YXIgZW1wdHkkMSA9IFtdO1xuXG4gIHBwJDMucGFyc2VOZXcgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBuZXdcIik7IH1cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdmFyIG1ldGEgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuZWF0KHR5cGVzLmRvdCkpIHtcbiAgICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgICB2YXIgY29udGFpbnNFc2MgPSB0aGlzLmNvbnRhaW5zRXNjO1xuICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IFwidGFyZ2V0XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUucHJvcGVydHkuc3RhcnQsIFwiVGhlIG9ubHkgdmFsaWQgbWV0YSBwcm9wZXJ0eSBmb3IgbmV3IGlzICduZXcudGFyZ2V0J1wiKTsgfVxuICAgICAgaWYgKGNvbnRhaW5zRXNjKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIiduZXcudGFyZ2V0JyBtdXN0IG5vdCBjb250YWluIGVzY2FwZWQgY2hhcmFjdGVyc1wiKTsgfVxuICAgICAgaWYgKCF0aGlzLmluTm9uQXJyb3dGdW5jdGlvbigpKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIiduZXcudGFyZ2V0JyBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9uc1wiKTsgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1ldGFQcm9wZXJ0eVwiKVxuICAgIH1cbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGlzSW1wb3J0ID0gdGhpcy50eXBlID09PSB0eXBlcy5faW1wb3J0O1xuICAgIG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZVN1YnNjcmlwdHModGhpcy5wYXJzZUV4cHJBdG9tKCksIHN0YXJ0UG9zLCBzdGFydExvYywgdHJ1ZSk7XG4gICAgaWYgKGlzSW1wb3J0ICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLnJhaXNlKHN0YXJ0UG9zLCBcIkNhbm5vdCB1c2UgbmV3IHdpdGggaW1wb3J0KClcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmVhdCh0eXBlcy5wYXJlbkwpKSB7IG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzLnBhcmVuUiwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgsIGZhbHNlKTsgfVxuICAgIGVsc2UgeyBub2RlLmFyZ3VtZW50cyA9IGVtcHR5JDE7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTmV3RXhwcmVzc2lvblwiKVxuICB9O1xuXG4gIC8vIFBhcnNlIHRlbXBsYXRlIGV4cHJlc3Npb24uXG5cbiAgcHAkMy5wYXJzZVRlbXBsYXRlRWxlbWVudCA9IGZ1bmN0aW9uKHJlZikge1xuICAgIHZhciBpc1RhZ2dlZCA9IHJlZi5pc1RhZ2dlZDtcblxuICAgIHZhciBlbGVtID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5pbnZhbGlkVGVtcGxhdGUpIHtcbiAgICAgIGlmICghaXNUYWdnZWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIFwiQmFkIGVzY2FwZSBzZXF1ZW5jZSBpbiB1bnRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXCIpO1xuICAgICAgfVxuICAgICAgZWxlbS52YWx1ZSA9IHtcbiAgICAgICAgcmF3OiB0aGlzLnZhbHVlLFxuICAgICAgICBjb29rZWQ6IG51bGxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICAgIHJhdzogdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKSxcbiAgICAgICAgY29va2VkOiB0aGlzLnZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICBlbGVtLnRhaWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmJhY2tRdW90ZTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGVsZW0sIFwiVGVtcGxhdGVFbGVtZW50XCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVRlbXBsYXRlID0gZnVuY3Rpb24ocmVmKSB7XG4gICAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICAgIHZhciBpc1RhZ2dlZCA9IHJlZi5pc1RhZ2dlZDsgaWYgKCBpc1RhZ2dlZCA9PT0gdm9pZCAwICkgaXNUYWdnZWQgPSBmYWxzZTtcblxuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmV4cHJlc3Npb25zID0gW107XG4gICAgdmFyIGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoe2lzVGFnZ2VkOiBpc1RhZ2dlZH0pO1xuICAgIG5vZGUucXVhc2lzID0gW2N1ckVsdF07XG4gICAgd2hpbGUgKCFjdXJFbHQudGFpbCkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuZW9mKSB7IHRoaXMucmFpc2UodGhpcy5wb3MsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlIGxpdGVyYWxcIik7IH1cbiAgICAgIHRoaXMuZXhwZWN0KHR5cGVzLmRvbGxhckJyYWNlTCk7XG4gICAgICBub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZUV4cHJlc3Npb24oKSk7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZVIpO1xuICAgICAgbm9kZS5xdWFzaXMucHVzaChjdXJFbHQgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KHtpc1RhZ2dlZDogaXNUYWdnZWR9KSk7XG4gICAgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIilcbiAgfTtcblxuICBwcCQzLmlzQXN5bmNQcm9wID0gZnVuY3Rpb24ocHJvcCkge1xuICAgIHJldHVybiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwcm9wLmtleS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgfHwgdGhpcy50eXBlID09PSB0eXBlcy5udW0gfHwgdGhpcy50eXBlID09PSB0eXBlcy5zdHJpbmcgfHwgdGhpcy50eXBlID09PSB0eXBlcy5icmFja2V0TCB8fCB0aGlzLnR5cGUua2V5d29yZCB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy50eXBlID09PSB0eXBlcy5zdGFyKSkgJiZcbiAgICAgICFsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gb2JqZWN0IGxpdGVyYWwgb3IgYmluZGluZyBwYXR0ZXJuLlxuXG4gIHBwJDMucGFyc2VPYmogPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGZpcnN0ID0gdHJ1ZSwgcHJvcEhhc2ggPSB7fTtcbiAgICBub2RlLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgdGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBwcm9wID0gdGhpcy5wYXJzZVByb3BlcnR5KGlzUGF0dGVybiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBpZiAoIWlzUGF0dGVybikgeyB0aGlzLmNoZWNrUHJvcENsYXNoKHByb3AsIHByb3BIYXNoLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTsgfVxuICAgICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgaXNQYXR0ZXJuID8gXCJPYmplY3RQYXR0ZXJuXCIgOiBcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQzLnBhcnNlUHJvcGVydHkgPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgcHJvcCA9IHRoaXMuc3RhcnROb2RlKCksIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2M7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHRoaXMuZWF0KHR5cGVzLmVsbGlwc2lzKSkge1xuICAgICAgaWYgKGlzUGF0dGVybikge1xuICAgICAgICBwcm9wLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUlkZW50KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJSZXN0RWxlbWVudFwiKVxuICAgICAgfVxuICAgICAgLy8gVG8gZGlzYWxsb3cgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIHZpYSBgdGhpcy50b0Fzc2lnbmFibGUoKWAuXG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5wYXJlbkwgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduIDwgMCkge1xuICAgICAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPCAwKSB7XG4gICAgICAgICAgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQmluZCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFBhcnNlIGFyZ3VtZW50LlxuICAgICAgcHJvcC5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICAvLyBUbyBkaXNhbGxvdyB0cmFpbGluZyBjb21tYSB2aWEgYHRoaXMudG9Bc3NpZ25hYmxlKClgLlxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPCAwKSB7XG4gICAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA9IHRoaXMuc3RhcnQ7XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2hcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJTcHJlYWRFbGVtZW50XCIpXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgcHJvcC5tZXRob2QgPSBmYWxzZTtcbiAgICAgIHByb3Auc2hvcnRoYW5kID0gZmFsc2U7XG4gICAgICBpZiAoaXNQYXR0ZXJuIHx8IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgICB9XG4gICAgICBpZiAoIWlzUGF0dGVybilcbiAgICAgICAgeyBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR5cGVzLnN0YXIpOyB9XG4gICAgfVxuICAgIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICBpZiAoIWlzUGF0dGVybiAmJiAhY29udGFpbnNFc2MgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgIWlzR2VuZXJhdG9yICYmIHRoaXMuaXNBc3luY1Byb3AocHJvcCkpIHtcbiAgICAgIGlzQXN5bmMgPSB0cnVlO1xuICAgICAgaXNHZW5lcmF0b3IgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiB0aGlzLmVhdCh0eXBlcy5zdGFyKTtcbiAgICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzQXN5bmMgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5VmFsdWUocHJvcCwgaXNQYXR0ZXJuLCBpc0dlbmVyYXRvciwgaXNBc3luYywgc3RhcnRQb3MsIHN0YXJ0TG9jLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBjb250YWluc0VzYyk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwcm9wLCBcIlByb3BlcnR5XCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbihwcm9wLCBpc1BhdHRlcm4sIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2MsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGNvbnRhaW5zRXNjKSB7XG4gICAgaWYgKChpc0dlbmVyYXRvciB8fCBpc0FzeW5jKSAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbG9uKVxuICAgICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLmNvbG9uKSkge1xuICAgICAgcHJvcC52YWx1ZSA9IGlzUGF0dGVybiA/IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCwgdGhpcy5zdGFydExvYykgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCkge1xuICAgICAgaWYgKGlzUGF0dGVybikgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgICBwcm9wLm1ldGhvZCA9IHRydWU7XG4gICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChpc0dlbmVyYXRvciwgaXNBc3luYyk7XG4gICAgfSBlbHNlIGlmICghaXNQYXR0ZXJuICYmICFjb250YWluc0VzYyAmJlxuICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgICAgIChwcm9wLmtleS5uYW1lID09PSBcImdldFwiIHx8IHByb3Aua2V5Lm5hbWUgPT09IFwic2V0XCIpICYmXG4gICAgICAgICAgICAgICAodGhpcy50eXBlICE9PSB0eXBlcy5jb21tYSAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNlUiAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmVxKSkge1xuICAgICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzQXN5bmMpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHByb3Aua2luZCA9IHByb3Aua2V5Lm5hbWU7XG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO1xuICAgICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNZXRob2QoZmFsc2UpO1xuICAgICAgdmFyIHBhcmFtQ291bnQgPSBwcm9wLmtpbmQgPT09IFwiZ2V0XCIgPyAwIDogMTtcbiAgICAgIGlmIChwcm9wLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IHBhcmFtQ291bnQpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcHJvcC52YWx1ZS5zdGFydDtcbiAgICAgICAgaWYgKHByb3Aua2luZCA9PT0gXCJnZXRcIilcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJnZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcGFyYW1zXCIpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJzZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1cIik7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9wLmtpbmQgPT09IFwic2V0XCIgJiYgcHJvcC52YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHByb3AudmFsdWUucGFyYW1zWzBdLnN0YXJ0LCBcIlNldHRlciBjYW5ub3QgdXNlIHJlc3QgcGFyYW1zXCIpOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzQXN5bmMpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKHByb3Aua2V5KTtcbiAgICAgIGlmIChwcm9wLmtleS5uYW1lID09PSBcImF3YWl0XCIgJiYgIXRoaXMuYXdhaXRJZGVudFBvcylcbiAgICAgICAgeyB0aGlzLmF3YWl0SWRlbnRQb3MgPSBzdGFydFBvczsgfVxuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLCBzdGFydExvYywgcHJvcC5rZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmVxICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduIDwgMClcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gdGhpcy5zdGFydDsgfVxuICAgICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdChzdGFydFBvcywgc3RhcnRMb2MsIHByb3Aua2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3AudmFsdWUgPSBwcm9wLmtleTtcbiAgICAgIH1cbiAgICAgIHByb3Auc2hvcnRoYW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihwcm9wKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBpZiAodGhpcy5lYXQodHlwZXMuYnJhY2tldEwpKSB7XG4gICAgICAgIHByb3AuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICBwcm9wLmtleSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7XG4gICAgICAgIHJldHVybiBwcm9wLmtleVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcC5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcC5rZXkgPSB0aGlzLnR5cGUgPT09IHR5cGVzLm51bSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy5wYXJzZUlkZW50KHRoaXMub3B0aW9ucy5hbGxvd1Jlc2VydmVkICE9PSBcIm5ldmVyXCIpXG4gIH07XG5cbiAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBmdW5jdGlvbiBub2RlLlxuXG4gIHBwJDMuaW5pdEZ1bmN0aW9uID0gZnVuY3Rpb24obm9kZSkge1xuICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikgeyBub2RlLmdlbmVyYXRvciA9IG5vZGUuZXhwcmVzc2lvbiA9IGZhbHNlOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KSB7IG5vZGUuYXN5bmMgPSBmYWxzZTsgfVxuICB9O1xuXG4gIC8vIFBhcnNlIG9iamVjdCBvciBjbGFzcyBtZXRob2QuXG5cbiAgcHAkMy5wYXJzZU1ldGhvZCA9IGZ1bmN0aW9uKGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd0RpcmVjdFN1cGVyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcblxuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNilcbiAgICAgIHsgbm9kZS5nZW5lcmF0b3IgPSBpc0dlbmVyYXRvcjsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICAgIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBub2RlLmdlbmVyYXRvcikgfCBTQ09QRV9TVVBFUiB8IChhbGxvd0RpcmVjdFN1cGVyID8gU0NPUEVfRElSRUNUX1NVUEVSIDogMCkpO1xuXG4gICAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTtcbiAgICBub2RlLnBhcmFtcyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5wYXJlblIsIGZhbHNlLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCk7XG4gICAgdGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTtcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGZhbHNlLCB0cnVlKTtcblxuICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gb2xkQXdhaXRJZGVudFBvcztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuXG5cbiAgcHAkMy5wYXJzZUFycm93RXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHBhcmFtcywgaXNBc3luYykge1xuICAgIHZhciBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcblxuICAgIHRoaXMuZW50ZXJTY29wZShmdW5jdGlvbkZsYWdzKGlzQXN5bmMsIGZhbHNlKSB8IFNDT1BFX0FSUk9XKTtcbiAgICB0aGlzLmluaXRGdW5jdGlvbihub2RlKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgpIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcblxuICAgIG5vZGUucGFyYW1zID0gdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJ1ZSk7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCB0cnVlLCBmYWxzZSk7XG5cbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgZnVuY3Rpb24gYm9keSBhbmQgY2hlY2sgcGFyYW1ldGVycy5cblxuICBwcCQzLnBhcnNlRnVuY3Rpb25Cb2R5ID0gZnVuY3Rpb24obm9kZSwgaXNBcnJvd0Z1bmN0aW9uLCBpc01ldGhvZCkge1xuICAgIHZhciBpc0V4cHJlc3Npb24gPSBpc0Fycm93RnVuY3Rpb24gJiYgdGhpcy50eXBlICE9PSB0eXBlcy5icmFjZUw7XG4gICAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0LCB1c2VTdHJpY3QgPSBmYWxzZTtcblxuICAgIGlmIChpc0V4cHJlc3Npb24pIHtcbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2hlY2tQYXJhbXMobm9kZSwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uU2ltcGxlID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgIXRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpO1xuICAgICAgaWYgKCFvbGRTdHJpY3QgfHwgbm9uU2ltcGxlKSB7XG4gICAgICAgIHVzZVN0cmljdCA9IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMuZW5kKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cmljdCBtb2RlIGZ1bmN0aW9uLCB2ZXJpZnkgdGhhdCBhcmd1bWVudCBuYW1lc1xuICAgICAgICAvLyBhcmUgbm90IHJlcGVhdGVkLCBhbmQgaXQgZG9lcyBub3QgdHJ5IHRvIGJpbmQgdGhlIHdvcmRzIGBldmFsYFxuICAgICAgICAvLyBvciBgYXJndW1lbnRzYC5cbiAgICAgICAgaWYgKHVzZVN0cmljdCAmJiBub25TaW1wbGUpXG4gICAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0XCIpOyB9XG4gICAgICB9XG4gICAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmBcbiAgICAgIC8vIGZsYWcgKHJlc3RvcmUgdGhlbSB0byB0aGVpciBvbGQgdmFsdWUgYWZ0ZXJ3YXJkcykuXG4gICAgICB2YXIgb2xkTGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICB0aGlzLmxhYmVscyA9IFtdO1xuICAgICAgaWYgKHVzZVN0cmljdCkgeyB0aGlzLnN0cmljdCA9IHRydWU7IH1cblxuICAgICAgLy8gQWRkIHRoZSBwYXJhbXMgdG8gdmFyRGVjbGFyZWROYW1lcyB0byBlbnN1cmUgdGhhdCBhbiBlcnJvciBpcyB0aHJvd25cbiAgICAgIC8vIGlmIGEgbGV0L2NvbnN0IGRlY2xhcmF0aW9uIGluIHRoZSBmdW5jdGlvbiBjbGFzaGVzIHdpdGggb25lIG9mIHRoZSBwYXJhbXMuXG4gICAgICB0aGlzLmNoZWNrUGFyYW1zKG5vZGUsICFvbGRTdHJpY3QgJiYgIXVzZVN0cmljdCAmJiAhaXNBcnJvd0Z1bmN0aW9uICYmICFpc01ldGhvZCAmJiB0aGlzLmlzU2ltcGxlUGFyYW1MaXN0KG5vZGUucGFyYW1zKSk7XG4gICAgICAvLyBFbnN1cmUgdGhlIGZ1bmN0aW9uIG5hbWUgaXNuJ3QgYSBmb3JiaWRkZW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSwgZS5nLiAnZXZhbCdcbiAgICAgIGlmICh0aGlzLnN0cmljdCAmJiBub2RlLmlkKSB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsIEJJTkRfT1VUU0lERSk7IH1cbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VCbG9jayhmYWxzZSwgdW5kZWZpbmVkLCB1c2VTdHJpY3QgJiYgIW9sZFN0cmljdCk7XG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZShub2RlLmJvZHkuYm9keSk7XG4gICAgICB0aGlzLmxhYmVscyA9IG9sZExhYmVscztcbiAgICB9XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgfTtcblxuICBwcCQzLmlzU2ltcGxlUGFyYW1MaXN0ID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBwYXJhbXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgICAgaWYgKHBhcmFtLnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSB7IHJldHVybiBmYWxzZVxuICAgIH0gfVxuICAgIHJldHVybiB0cnVlXG4gIH07XG5cbiAgLy8gQ2hlY2tzIGZ1bmN0aW9uIHBhcmFtcyBmb3IgdmFyaW91cyBkaXNhbGxvd2VkIHBhdHRlcm5zIHN1Y2ggYXMgdXNpbmcgXCJldmFsXCJcbiAgLy8gb3IgXCJhcmd1bWVudHNcIiBhbmQgZHVwbGljYXRlIHBhcmFtZXRlcnMuXG5cbiAgcHAkMy5jaGVja1BhcmFtcyA9IGZ1bmN0aW9uKG5vZGUsIGFsbG93RHVwbGljYXRlcykge1xuICAgIHZhciBuYW1lSGFzaCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5wYXJhbXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgICAgdGhpcy5jaGVja0xWYWwocGFyYW0sIEJJTkRfVkFSLCBhbGxvd0R1cGxpY2F0ZXMgPyBudWxsIDogbmFtZUhhc2gpO1xuICAgIH1cbiAgfTtcblxuICAvLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucywgYW5kIHJldHVybnMgdGhlbSBhc1xuICAvLyBhbiBhcnJheS4gYGNsb3NlYCBpcyB0aGUgdG9rZW4gdHlwZSB0aGF0IGVuZHMgdGhlIGxpc3QsIGFuZFxuICAvLyBgYWxsb3dFbXB0eWAgY2FuIGJlIHR1cm5lZCBvbiB0byBhbGxvdyBzdWJzZXF1ZW50IGNvbW1hcyB3aXRoXG4gIC8vIG5vdGhpbmcgaW4gYmV0d2VlbiB0aGVtIHRvIGJlIHBhcnNlZCBhcyBgbnVsbGAgKHdoaWNoIGlzIG5lZWRlZFxuICAvLyBmb3IgYXJyYXkgbGl0ZXJhbHMpLlxuXG4gIHBwJDMucGFyc2VFeHByTGlzdCA9IGZ1bmN0aW9uKGNsb3NlLCBhbGxvd1RyYWlsaW5nQ29tbWEsIGFsbG93RW1wdHksIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBlbHQgPSAodm9pZCAwKTtcbiAgICAgIGlmIChhbGxvd0VtcHR5ICYmIHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpXG4gICAgICAgIHsgZWx0ID0gbnVsbDsgfVxuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgICBlbHQgPSB0aGlzLnBhcnNlU3ByZWFkKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA8IDApXG4gICAgICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSB0aGlzLnN0YXJ0OyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgfVxuICAgICAgZWx0cy5wdXNoKGVsdCk7XG4gICAgfVxuICAgIHJldHVybiBlbHRzXG4gIH07XG5cbiAgcHAkMy5jaGVja1VucmVzZXJ2ZWQgPSBmdW5jdGlvbihyZWYpIHtcbiAgICB2YXIgc3RhcnQgPSByZWYuc3RhcnQ7XG4gICAgdmFyIGVuZCA9IHJlZi5lbmQ7XG4gICAgdmFyIG5hbWUgPSByZWYubmFtZTtcblxuICAgIGlmICh0aGlzLmluR2VuZXJhdG9yICYmIG5hbWUgPT09IFwieWllbGRcIilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2UgJ3lpZWxkJyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIGdlbmVyYXRvclwiKTsgfVxuICAgIGlmICh0aGlzLmluQXN5bmMgJiYgbmFtZSA9PT0gXCJhd2FpdFwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uXCIpOyB9XG4gICAgaWYgKHRoaXMua2V5d29yZHMudGVzdChuYW1lKSlcbiAgICAgIHsgdGhpcy5yYWlzZShzdGFydCwgKFwiVW5leHBlY3RlZCBrZXl3b3JkICdcIiArIG5hbWUgKyBcIidcIikpOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYgJiZcbiAgICAgIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCkuaW5kZXhPZihcIlxcXFxcIikgIT09IC0xKSB7IHJldHVybiB9XG4gICAgdmFyIHJlID0gdGhpcy5zdHJpY3QgPyB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3QgOiB0aGlzLnJlc2VydmVkV29yZHM7XG4gICAgaWYgKHJlLnRlc3QobmFtZSkpIHtcbiAgICAgIGlmICghdGhpcy5pbkFzeW5jICYmIG5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSBrZXl3b3JkICdhd2FpdCcgb3V0c2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKTsgfVxuICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCAoXCJUaGUga2V5d29yZCAnXCIgKyBuYW1lICsgXCInIGlzIHJlc2VydmVkXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGFyc2UgdGhlIG5leHQgdG9rZW4gYXMgYW4gaWRlbnRpZmllci4gSWYgYGxpYmVyYWxgIGlzIHRydWUgKHVzZWRcbiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvXG4gIC8vIGlkZW50aWZpZXJzLlxuXG4gIHBwJDMucGFyc2VJZGVudCA9IGZ1bmN0aW9uKGxpYmVyYWwsIGlzQmluZGluZykge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5uYW1lKSB7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtleXdvcmQpIHtcbiAgICAgIG5vZGUubmFtZSA9IHRoaXMudHlwZS5rZXl3b3JkO1xuXG4gICAgICAvLyBUbyBmaXggaHR0cHM6Ly9naXRodWIuY29tL2Fjb3JuanMvYWNvcm4vaXNzdWVzLzU3NVxuICAgICAgLy8gYGNsYXNzYCBhbmQgYGZ1bmN0aW9uYCBrZXl3b3JkcyBwdXNoIG5ldyBjb250ZXh0IGludG8gdGhpcy5jb250ZXh0LlxuICAgICAgLy8gQnV0IHRoZXJlIGlzIG5vIGNoYW5jZSB0byBwb3AgdGhlIGNvbnRleHQgaWYgdGhlIGtleXdvcmQgaXMgY29uc3VtZWQgYXMgYW4gaWRlbnRpZmllciBzdWNoIGFzIGEgcHJvcGVydHkgbmFtZS5cbiAgICAgIC8vIElmIHRoZSBwcmV2aW91cyB0b2tlbiBpcyBhIGRvdCwgdGhpcyBkb2VzIG5vdCBhcHBseSBiZWNhdXNlIHRoZSBjb250ZXh0LW1hbmFnaW5nIGNvZGUgYWxyZWFkeSBpZ25vcmVkIHRoZSBrZXl3b3JkXG4gICAgICBpZiAoKG5vZGUubmFtZSA9PT0gXCJjbGFzc1wiIHx8IG5vZGUubmFtZSA9PT0gXCJmdW5jdGlvblwiKSAmJlxuICAgICAgICAgICh0aGlzLmxhc3RUb2tFbmQgIT09IHRoaXMubGFzdFRva1N0YXJ0ICsgMSB8fCB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5sYXN0VG9rU3RhcnQpICE9PSA0NikpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gICAgdGhpcy5uZXh0KCEhbGliZXJhbCk7XG4gICAgdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSWRlbnRpZmllclwiKTtcbiAgICBpZiAoIWxpYmVyYWwpIHtcbiAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKG5vZGUpO1xuICAgICAgaWYgKG5vZGUubmFtZSA9PT0gXCJhd2FpdFwiICYmICF0aGlzLmF3YWl0SWRlbnRQb3MpXG4gICAgICAgIHsgdGhpcy5hd2FpdElkZW50UG9zID0gbm9kZS5zdGFydDsgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZVxuICB9O1xuXG4gIC8vIFBhcnNlcyB5aWVsZCBleHByZXNzaW9uIGluc2lkZSBnZW5lcmF0b3IuXG5cbiAgcHAkMy5wYXJzZVlpZWxkID0gZnVuY3Rpb24obm9Jbikge1xuICAgIGlmICghdGhpcy55aWVsZFBvcykgeyB0aGlzLnlpZWxkUG9zID0gdGhpcy5zdGFydDsgfVxuXG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnNlbWkgfHwgdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSB8fCAodGhpcy50eXBlICE9PSB0eXBlcy5zdGFyICYmICF0aGlzLnR5cGUuc3RhcnRzRXhwcikpIHtcbiAgICAgIG5vZGUuZGVsZWdhdGUgPSBmYWxzZTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmRlbGVnYXRlID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZUF3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmF3YWl0UG9zKSB7IHRoaXMuYXdhaXRQb3MgPSB0aGlzLnN0YXJ0OyB9XG5cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIGZhbHNlKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXdhaXRFeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgdmFyIHBwJDQgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByYWlzZSBleGNlcHRpb25zIG9uIHBhcnNlIGVycm9ycy4gSXRcbiAgLy8gdGFrZXMgYW4gb2Zmc2V0IGludGVnZXIgKGludG8gdGhlIGN1cnJlbnQgYGlucHV0YCkgdG8gaW5kaWNhdGVcbiAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvciwgYXR0YWNoZXMgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbmRcbiAgLy8gb2YgdGhlIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIHJhaXNlcyBhIGBTeW50YXhFcnJvcmAgd2l0aCB0aGF0XG4gIC8vIG1lc3NhZ2UuXG5cbiAgcHAkNC5yYWlzZSA9IGZ1bmN0aW9uKHBvcywgbWVzc2FnZSkge1xuICAgIHZhciBsb2MgPSBnZXRMaW5lSW5mbyh0aGlzLmlucHV0LCBwb3MpO1xuICAgIG1lc3NhZ2UgKz0gXCIgKFwiICsgbG9jLmxpbmUgKyBcIjpcIiArIGxvYy5jb2x1bW4gKyBcIilcIjtcbiAgICB2YXIgZXJyID0gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICAgIGVyci5wb3MgPSBwb3M7IGVyci5sb2MgPSBsb2M7IGVyci5yYWlzZWRBdCA9IHRoaXMucG9zO1xuICAgIHRocm93IGVyclxuICB9O1xuXG4gIHBwJDQucmFpc2VSZWNvdmVyYWJsZSA9IHBwJDQucmFpc2U7XG5cbiAgcHAkNC5jdXJQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuY3VyTGluZSwgdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydClcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBwJDUgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHZhciBTY29wZSA9IGZ1bmN0aW9uIFNjb3BlKGZsYWdzKSB7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIC8vIEEgbGlzdCBvZiB2YXItZGVjbGFyZWQgbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZVxuICAgIHRoaXMudmFyID0gW107XG4gICAgLy8gQSBsaXN0IG9mIGxleGljYWxseS1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gICAgdGhpcy5sZXhpY2FsID0gW107XG4gICAgLy8gQSBsaXN0IG9mIGxleGljYWxseS1kZWNsYXJlZCBGdW5jdGlvbkRlY2xhcmF0aW9uIG5hbWVzIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGVcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IFtdO1xuICB9O1xuXG4gIC8vIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUga2VlcCB0cmFjayBvZiBkZWNsYXJlZCB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUgaW4gb3JkZXIgdG8gZGV0ZWN0IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcy5cblxuICBwcCQ1LmVudGVyU2NvcGUgPSBmdW5jdGlvbihmbGFncykge1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKG5ldyBTY29wZShmbGFncykpO1xuICB9O1xuXG4gIHBwJDUuZXhpdFNjb3BlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vID4gQXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZ1bmN0aW9uLCBvciBzY3JpcHQsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhcmVcbiAgLy8gPiB0cmVhdGVkIGxpa2UgdmFyIGRlY2xhcmF0aW9ucyByYXRoZXIgdGhhbiBsaWtlIGxleGljYWwgZGVjbGFyYXRpb25zLlxuICBwcCQ1LnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlID0gZnVuY3Rpb24oc2NvcGUpIHtcbiAgICByZXR1cm4gKHNjb3BlLmZsYWdzICYgU0NPUEVfRlVOQ1RJT04pIHx8ICF0aGlzLmluTW9kdWxlICYmIChzY29wZS5mbGFncyAmIFNDT1BFX1RPUClcbiAgfTtcblxuICBwcCQ1LmRlY2xhcmVOYW1lID0gZnVuY3Rpb24obmFtZSwgYmluZGluZ1R5cGUsIHBvcykge1xuICAgIHZhciByZWRlY2xhcmVkID0gZmFsc2U7XG4gICAgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX0xFWElDQUwpIHtcbiAgICAgIHZhciBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlKCk7XG4gICAgICByZWRlY2xhcmVkID0gc2NvcGUubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTEgfHwgc2NvcGUuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZS52YXIuaW5kZXhPZihuYW1lKSA+IC0xO1xuICAgICAgc2NvcGUubGV4aWNhbC5wdXNoKG5hbWUpO1xuICAgICAgaWYgKHRoaXMuaW5Nb2R1bGUgJiYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVE9QKSlcbiAgICAgICAgeyBkZWxldGUgdGhpcy51bmRlZmluZWRFeHBvcnRzW25hbWVdOyB9XG4gICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSA9PT0gQklORF9TSU1QTEVfQ0FUQ0gpIHtcbiAgICAgIHZhciBzY29wZSQxID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICAgIHNjb3BlJDEubGV4aWNhbC5wdXNoKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfRlVOQ1RJT04pIHtcbiAgICAgIHZhciBzY29wZSQyID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICAgIGlmICh0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXIpXG4gICAgICAgIHsgcmVkZWNsYXJlZCA9IHNjb3BlJDIubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZWRlY2xhcmVkID0gc2NvcGUkMi5sZXhpY2FsLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZSQyLnZhci5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICAgIHNjb3BlJDIuZnVuY3Rpb25zLnB1c2gobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIHNjb3BlJDMgPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICAgIGlmIChzY29wZSQzLmxleGljYWwuaW5kZXhPZihuYW1lKSA+IC0xICYmICEoKHNjb3BlJDMuZmxhZ3MgJiBTQ09QRV9TSU1QTEVfQ0FUQ0gpICYmIHNjb3BlJDMubGV4aWNhbFswXSA9PT0gbmFtZSkgfHxcbiAgICAgICAgICAgICF0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHNjb3BlJDMpICYmIHNjb3BlJDMuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSkge1xuICAgICAgICAgIHJlZGVjbGFyZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUkMy52YXIucHVzaChuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5Nb2R1bGUgJiYgKHNjb3BlJDMuZmxhZ3MgJiBTQ09QRV9UT1ApKVxuICAgICAgICAgIHsgZGVsZXRlIHRoaXMudW5kZWZpbmVkRXhwb3J0c1tuYW1lXTsgfVxuICAgICAgICBpZiAoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1ZBUikgeyBicmVhayB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWRlY2xhcmVkKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShwb3MsIChcIklkZW50aWZpZXIgJ1wiICsgbmFtZSArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkXCIpKTsgfVxuICB9O1xuXG4gIHBwJDUuY2hlY2tMb2NhbEV4cG9ydCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgLy8gc2NvcGUuZnVuY3Rpb25zIG11c3QgYmUgZW1wdHkgYXMgTW9kdWxlIGNvZGUgaXMgYWx3YXlzIHN0cmljdC5cbiAgICBpZiAodGhpcy5zY29wZVN0YWNrWzBdLmxleGljYWwuaW5kZXhPZihpZC5uYW1lKSA9PT0gLTEgJiZcbiAgICAgICAgdGhpcy5zY29wZVN0YWNrWzBdLnZhci5pbmRleE9mKGlkLm5hbWUpID09PSAtMSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzW2lkLm5hbWVdID0gaWQ7XG4gICAgfVxuICB9O1xuXG4gIHBwJDUuY3VycmVudFNjb3BlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGVTdGFja1t0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMV1cbiAgfTtcblxuICBwcCQ1LmN1cnJlbnRWYXJTY29wZSA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTs7IGktLSkge1xuICAgICAgdmFyIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSKSB7IHJldHVybiBzY29wZSB9XG4gICAgfVxuICB9O1xuXG4gIC8vIENvdWxkIGJlIHVzZWZ1bCBmb3IgYHRoaXNgLCBgbmV3LnRhcmdldGAsIGBzdXBlcigpYCwgYHN1cGVyLnByb3BlcnR5YCwgYW5kIGBzdXBlcltwcm9wZXJ0eV1gLlxuICBwcCQ1LmN1cnJlbnRUaGlzU2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICAgIHZhciBzY29wZSA9IHRoaXMuc2NvcGVTdGFja1tpXTtcbiAgICAgIGlmIChzY29wZS5mbGFncyAmIFNDT1BFX1ZBUiAmJiAhKHNjb3BlLmZsYWdzICYgU0NPUEVfQVJST1cpKSB7IHJldHVybiBzY29wZSB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBOb2RlID0gZnVuY3Rpb24gTm9kZShwYXJzZXIsIHBvcywgbG9jKSB7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcbiAgICB0aGlzLnN0YXJ0ID0gcG9zO1xuICAgIHRoaXMuZW5kID0gMDtcbiAgICBpZiAocGFyc2VyLm9wdGlvbnMubG9jYXRpb25zKVxuICAgICAgeyB0aGlzLmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbihwYXJzZXIsIGxvYyk7IH1cbiAgICBpZiAocGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZSlcbiAgICAgIHsgdGhpcy5zb3VyY2VGaWxlID0gcGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZTsgfVxuICAgIGlmIChwYXJzZXIub3B0aW9ucy5yYW5nZXMpXG4gICAgICB7IHRoaXMucmFuZ2UgPSBbcG9zLCAwXTsgfVxuICB9O1xuXG4gIC8vIFN0YXJ0IGFuIEFTVCBub2RlLCBhdHRhY2hpbmcgYSBzdGFydCBvZmZzZXQuXG5cbiAgdmFyIHBwJDYgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHBwJDYuc3RhcnROb2RlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpXG4gIH07XG5cbiAgcHAkNi5zdGFydE5vZGVBdCA9IGZ1bmN0aW9uKHBvcywgbG9jKSB7XG4gICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHBvcywgbG9jKVxuICB9O1xuXG4gIC8vIEZpbmlzaCBhbiBBU1Qgbm9kZSwgYWRkaW5nIGB0eXBlYCBhbmQgYGVuZGAgcHJvcGVydGllcy5cblxuICBmdW5jdGlvbiBmaW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgICBub2RlLnR5cGUgPSB0eXBlO1xuICAgIG5vZGUuZW5kID0gcG9zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKVxuICAgICAgeyBub2RlLmxvYy5lbmQgPSBsb2M7IH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcylcbiAgICAgIHsgbm9kZS5yYW5nZVsxXSA9IHBvczsgfVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICBwcCQ2LmZpbmlzaE5vZGUgPSBmdW5jdGlvbihub2RlLCB0eXBlKSB7XG4gICAgcmV0dXJuIGZpbmlzaE5vZGVBdC5jYWxsKHRoaXMsIG5vZGUsIHR5cGUsIHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKVxuICB9O1xuXG4gIC8vIEZpbmlzaCBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXG5cbiAgcHAkNi5maW5pc2hOb2RlQXQgPSBmdW5jdGlvbihub2RlLCB0eXBlLCBwb3MsIGxvYykge1xuICAgIHJldHVybiBmaW5pc2hOb2RlQXQuY2FsbCh0aGlzLCBub2RlLCB0eXBlLCBwb3MsIGxvYylcbiAgfTtcblxuICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSByZWdleHAgY2FuIGFwcGVhciBhdCBhXG5cbiAgdmFyIFRva0NvbnRleHQgPSBmdW5jdGlvbiBUb2tDb250ZXh0KHRva2VuLCBpc0V4cHIsIHByZXNlcnZlU3BhY2UsIG92ZXJyaWRlLCBnZW5lcmF0b3IpIHtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy5pc0V4cHIgPSAhIWlzRXhwcjtcbiAgICB0aGlzLnByZXNlcnZlU3BhY2UgPSAhIXByZXNlcnZlU3BhY2U7XG4gICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlO1xuICAgIHRoaXMuZ2VuZXJhdG9yID0gISFnZW5lcmF0b3I7XG4gIH07XG5cbiAgdmFyIHR5cGVzJDEgPSB7XG4gICAgYl9zdGF0OiBuZXcgVG9rQ29udGV4dChcIntcIiwgZmFsc2UpLFxuICAgIGJfZXhwcjogbmV3IFRva0NvbnRleHQoXCJ7XCIsIHRydWUpLFxuICAgIGJfdG1wbDogbmV3IFRva0NvbnRleHQoXCIke1wiLCBmYWxzZSksXG4gICAgcF9zdGF0OiBuZXcgVG9rQ29udGV4dChcIihcIiwgZmFsc2UpLFxuICAgIHBfZXhwcjogbmV3IFRva0NvbnRleHQoXCIoXCIsIHRydWUpLFxuICAgIHFfdG1wbDogbmV3IFRva0NvbnRleHQoXCJgXCIsIHRydWUsIHRydWUsIGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLnRyeVJlYWRUZW1wbGF0ZVRva2VuKCk7IH0pLFxuICAgIGZfc3RhdDogbmV3IFRva0NvbnRleHQoXCJmdW5jdGlvblwiLCBmYWxzZSksXG4gICAgZl9leHByOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIHRydWUpLFxuICAgIGZfZXhwcl9nZW46IG5ldyBUb2tDb250ZXh0KFwiZnVuY3Rpb25cIiwgdHJ1ZSwgZmFsc2UsIG51bGwsIHRydWUpLFxuICAgIGZfZ2VuOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIGZhbHNlLCBmYWxzZSwgbnVsbCwgdHJ1ZSlcbiAgfTtcblxuICB2YXIgcHAkNyA9IFBhcnNlci5wcm90b3R5cGU7XG5cbiAgcHAkNy5pbml0aWFsQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbdHlwZXMkMS5iX3N0YXRdXG4gIH07XG5cbiAgcHAkNy5icmFjZUlzQmxvY2sgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLmN1ckNvbnRleHQoKTtcbiAgICBpZiAocGFyZW50ID09PSB0eXBlcyQxLmZfZXhwciB8fCBwYXJlbnQgPT09IHR5cGVzJDEuZl9zdGF0KVxuICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5jb2xvbiAmJiAocGFyZW50ID09PSB0eXBlcyQxLmJfc3RhdCB8fCBwYXJlbnQgPT09IHR5cGVzJDEuYl9leHByKSlcbiAgICAgIHsgcmV0dXJuICFwYXJlbnQuaXNFeHByIH1cblxuICAgIC8vIFRoZSBjaGVjayBmb3IgYHR0Lm5hbWUgJiYgZXhwckFsbG93ZWRgIGRldGVjdHMgd2hldGhlciB3ZSBhcmVcbiAgICAvLyBhZnRlciBhIGB5aWVsZGAgb3IgYG9mYCBjb25zdHJ1Y3QuIFNlZSB0aGUgYHVwZGF0ZUNvbnRleHRgIGZvclxuICAgIC8vIGB0dC5uYW1lYC5cbiAgICBpZiAocHJldlR5cGUgPT09IHR5cGVzLl9yZXR1cm4gfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy5leHByQWxsb3dlZClcbiAgICAgIHsgcmV0dXJuIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSkgfVxuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuX2Vsc2UgfHwgcHJldlR5cGUgPT09IHR5cGVzLnNlbWkgfHwgcHJldlR5cGUgPT09IHR5cGVzLmVvZiB8fCBwcmV2VHlwZSA9PT0gdHlwZXMucGFyZW5SIHx8IHByZXZUeXBlID09PSB0eXBlcy5hcnJvdylcbiAgICAgIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuYnJhY2VMKVxuICAgICAgeyByZXR1cm4gcGFyZW50ID09PSB0eXBlcyQxLmJfc3RhdCB9XG4gICAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5fdmFyIHx8IHByZXZUeXBlID09PSB0eXBlcy5fY29uc3QgfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuICF0aGlzLmV4cHJBbGxvd2VkXG4gIH07XG5cbiAgcHAkNy5pbkdlbmVyYXRvckNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dFtpXTtcbiAgICAgIGlmIChjb250ZXh0LnRva2VuID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHsgcmV0dXJuIGNvbnRleHQuZ2VuZXJhdG9yIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgcHAkNy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB2YXIgdXBkYXRlLCB0eXBlID0gdGhpcy50eXBlO1xuICAgIGlmICh0eXBlLmtleXdvcmQgJiYgcHJldlR5cGUgPT09IHR5cGVzLmRvdClcbiAgICAgIHsgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlOyB9XG4gICAgZWxzZSBpZiAodXBkYXRlID0gdHlwZS51cGRhdGVDb250ZXh0KVxuICAgICAgeyB1cGRhdGUuY2FsbCh0aGlzLCBwcmV2VHlwZSk7IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuZXhwckFsbG93ZWQgPSB0eXBlLmJlZm9yZUV4cHI7IH1cbiAgfTtcblxuICAvLyBUb2tlbi1zcGVjaWZpYyBjb250ZXh0IHVwZGF0ZSBjb2RlXG5cbiAgdHlwZXMucGFyZW5SLnVwZGF0ZUNvbnRleHQgPSB0eXBlcy5icmFjZVIudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbnRleHQubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgb3V0ID0gdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgIGlmIChvdXQgPT09IHR5cGVzJDEuYl9zdGF0ICYmIHRoaXMuY3VyQ29udGV4dCgpLnRva2VuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIG91dCA9IHRoaXMuY29udGV4dC5wb3AoKTtcbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9ICFvdXQuaXNFeHByO1xuICB9O1xuXG4gIHR5cGVzLmJyYWNlTC51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB0aGlzLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayhwcmV2VHlwZSkgPyB0eXBlcyQxLmJfc3RhdCA6IHR5cGVzJDEuYl9leHByKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgfTtcblxuICB0eXBlcy5kb2xsYXJCcmFjZUwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEuYl90bXBsKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgfTtcblxuICB0eXBlcy5wYXJlbkwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKHByZXZUeXBlKSB7XG4gICAgdmFyIHN0YXRlbWVudFBhcmVucyA9IHByZXZUeXBlID09PSB0eXBlcy5faWYgfHwgcHJldlR5cGUgPT09IHR5cGVzLl9mb3IgfHwgcHJldlR5cGUgPT09IHR5cGVzLl93aXRoIHx8IHByZXZUeXBlID09PSB0eXBlcy5fd2hpbGU7XG4gICAgdGhpcy5jb250ZXh0LnB1c2goc3RhdGVtZW50UGFyZW5zID8gdHlwZXMkMS5wX3N0YXQgOiB0eXBlcyQxLnBfZXhwcik7XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG4gIH07XG5cbiAgdHlwZXMuaW5jRGVjLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyB0b2tFeHByQWxsb3dlZCBzdGF5cyB1bmNoYW5nZWRcbiAgfTtcblxuICB0eXBlcy5fZnVuY3Rpb24udXBkYXRlQ29udGV4dCA9IHR5cGVzLl9jbGFzcy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICBpZiAocHJldlR5cGUuYmVmb3JlRXhwciAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuc2VtaSAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuX2Vsc2UgJiZcbiAgICAgICAgIShwcmV2VHlwZSA9PT0gdHlwZXMuX3JldHVybiAmJiBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpKSAmJlxuICAgICAgICAhKChwcmV2VHlwZSA9PT0gdHlwZXMuY29sb24gfHwgcHJldlR5cGUgPT09IHR5cGVzLmJyYWNlTCkgJiYgdGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDEuYl9zdGF0KSlcbiAgICAgIHsgdGhpcy5jb250ZXh0LnB1c2godHlwZXMkMS5mX2V4cHIpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLmZfc3RhdCk7IH1cbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7XG4gIH07XG5cbiAgdHlwZXMuYmFja1F1b3RlLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDEucV90bXBsKVxuICAgICAgeyB0aGlzLmNvbnRleHQucG9wKCk7IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEucV90bXBsKTsgfVxuICAgIHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTtcbiAgfTtcblxuICB0eXBlcy5zdGFyLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuX2Z1bmN0aW9uKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTtcbiAgICAgIGlmICh0aGlzLmNvbnRleHRbaW5kZXhdID09PSB0eXBlcyQxLmZfZXhwcilcbiAgICAgICAgeyB0aGlzLmNvbnRleHRbaW5kZXhdID0gdHlwZXMkMS5mX2V4cHJfZ2VuOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgdGhpcy5jb250ZXh0W2luZGV4XSA9IHR5cGVzJDEuZl9nZW47IH1cbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG4gIH07XG5cbiAgdHlwZXMubmFtZS51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB2YXIgYWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuZG90KSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJvZlwiICYmICF0aGlzLmV4cHJBbGxvd2VkIHx8XG4gICAgICAgICAgdGhpcy52YWx1ZSA9PT0gXCJ5aWVsZFwiICYmIHRoaXMuaW5HZW5lcmF0b3JDb250ZXh0KCkpXG4gICAgICAgIHsgYWxsb3dlZCA9IHRydWU7IH1cbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IGFsbG93ZWQ7XG4gIH07XG5cbiAgLy8gVGhpcyBmaWxlIGNvbnRhaW5zIFVuaWNvZGUgcHJvcGVydGllcyBleHRyYWN0ZWQgZnJvbSB0aGUgRUNNQVNjcmlwdFxuICAvLyBzcGVjaWZpY2F0aW9uLiBUaGUgbGlzdHMgYXJlIGV4dHJhY3RlZCBsaWtlIHNvOlxuICAvLyAkJCgnI3RhYmxlLWJpbmFyeS11bmljb2RlLXByb3BlcnRpZXMgPiBmaWd1cmUgPiB0YWJsZSA+IHRib2R5ID4gdHIgPiB0ZDpudGgtY2hpbGQoMSkgY29kZScpLm1hcChlbCA9PiBlbC5pbm5lclRleHQpXG5cbiAgLy8gI3RhYmxlLWJpbmFyeS11bmljb2RlLXByb3BlcnRpZXNcbiAgdmFyIGVjbWE5QmluYXJ5UHJvcGVydGllcyA9IFwiQVNDSUkgQVNDSUlfSGV4X0RpZ2l0IEFIZXggQWxwaGFiZXRpYyBBbHBoYSBBbnkgQXNzaWduZWQgQmlkaV9Db250cm9sIEJpZGlfQyBCaWRpX01pcnJvcmVkIEJpZGlfTSBDYXNlX0lnbm9yYWJsZSBDSSBDYXNlZCBDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCBDV0NGIENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIENXQ00gQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQgQ1dMIENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQgQ1dLQ0YgQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQgQ1dUIENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkIENXVSBEYXNoIERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQgREkgRGVwcmVjYXRlZCBEZXAgRGlhY3JpdGljIERpYSBFbW9qaSBFbW9qaV9Db21wb25lbnQgRW1vamlfTW9kaWZpZXIgRW1vamlfTW9kaWZpZXJfQmFzZSBFbW9qaV9QcmVzZW50YXRpb24gRXh0ZW5kZXIgRXh0IEdyYXBoZW1lX0Jhc2UgR3JfQmFzZSBHcmFwaGVtZV9FeHRlbmQgR3JfRXh0IEhleF9EaWdpdCBIZXggSURTX0JpbmFyeV9PcGVyYXRvciBJRFNCIElEU19UcmluYXJ5X09wZXJhdG9yIElEU1QgSURfQ29udGludWUgSURDIElEX1N0YXJ0IElEUyBJZGVvZ3JhcGhpYyBJZGVvIEpvaW5fQ29udHJvbCBKb2luX0MgTG9naWNhbF9PcmRlcl9FeGNlcHRpb24gTE9FIExvd2VyY2FzZSBMb3dlciBNYXRoIE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IE5DaGFyIFBhdHRlcm5fU3ludGF4IFBhdF9TeW4gUGF0dGVybl9XaGl0ZV9TcGFjZSBQYXRfV1MgUXVvdGF0aW9uX01hcmsgUU1hcmsgUmFkaWNhbCBSZWdpb25hbF9JbmRpY2F0b3IgUkkgU2VudGVuY2VfVGVybWluYWwgU1Rlcm0gU29mdF9Eb3R0ZWQgU0QgVGVybWluYWxfUHVuY3R1YXRpb24gVGVybSBVbmlmaWVkX0lkZW9ncmFwaCBVSWRlbyBVcHBlcmNhc2UgVXBwZXIgVmFyaWF0aW9uX1NlbGVjdG9yIFZTIFdoaXRlX1NwYWNlIHNwYWNlIFhJRF9Db250aW51ZSBYSURDIFhJRF9TdGFydCBYSURTXCI7XG4gIHZhciBlY21hMTBCaW5hcnlQcm9wZXJ0aWVzID0gZWNtYTlCaW5hcnlQcm9wZXJ0aWVzICsgXCIgRXh0ZW5kZWRfUGljdG9ncmFwaGljXCI7XG4gIHZhciBlY21hMTFCaW5hcnlQcm9wZXJ0aWVzID0gZWNtYTEwQmluYXJ5UHJvcGVydGllcztcbiAgdmFyIHVuaWNvZGVCaW5hcnlQcm9wZXJ0aWVzID0ge1xuICAgIDk6IGVjbWE5QmluYXJ5UHJvcGVydGllcyxcbiAgICAxMDogZWNtYTEwQmluYXJ5UHJvcGVydGllcyxcbiAgICAxMTogZWNtYTExQmluYXJ5UHJvcGVydGllc1xuICB9O1xuXG4gIC8vICN0YWJsZS11bmljb2RlLWdlbmVyYWwtY2F0ZWdvcnktdmFsdWVzXG4gIHZhciB1bmljb2RlR2VuZXJhbENhdGVnb3J5VmFsdWVzID0gXCJDYXNlZF9MZXR0ZXIgTEMgQ2xvc2VfUHVuY3R1YXRpb24gUGUgQ29ubmVjdG9yX1B1bmN0dWF0aW9uIFBjIENvbnRyb2wgQ2MgY250cmwgQ3VycmVuY3lfU3ltYm9sIFNjIERhc2hfUHVuY3R1YXRpb24gUGQgRGVjaW1hbF9OdW1iZXIgTmQgZGlnaXQgRW5jbG9zaW5nX01hcmsgTWUgRmluYWxfUHVuY3R1YXRpb24gUGYgRm9ybWF0IENmIEluaXRpYWxfUHVuY3R1YXRpb24gUGkgTGV0dGVyIEwgTGV0dGVyX051bWJlciBObCBMaW5lX1NlcGFyYXRvciBabCBMb3dlcmNhc2VfTGV0dGVyIExsIE1hcmsgTSBDb21iaW5pbmdfTWFyayBNYXRoX1N5bWJvbCBTbSBNb2RpZmllcl9MZXR0ZXIgTG0gTW9kaWZpZXJfU3ltYm9sIFNrIE5vbnNwYWNpbmdfTWFyayBNbiBOdW1iZXIgTiBPcGVuX1B1bmN0dWF0aW9uIFBzIE90aGVyIEMgT3RoZXJfTGV0dGVyIExvIE90aGVyX051bWJlciBObyBPdGhlcl9QdW5jdHVhdGlvbiBQbyBPdGhlcl9TeW1ib2wgU28gUGFyYWdyYXBoX1NlcGFyYXRvciBacCBQcml2YXRlX1VzZSBDbyBQdW5jdHVhdGlvbiBQIHB1bmN0IFNlcGFyYXRvciBaIFNwYWNlX1NlcGFyYXRvciBacyBTcGFjaW5nX01hcmsgTWMgU3Vycm9nYXRlIENzIFN5bWJvbCBTIFRpdGxlY2FzZV9MZXR0ZXIgTHQgVW5hc3NpZ25lZCBDbiBVcHBlcmNhc2VfTGV0dGVyIEx1XCI7XG5cbiAgLy8gI3RhYmxlLXVuaWNvZGUtc2NyaXB0LXZhbHVlc1xuICB2YXIgZWNtYTlTY3JpcHRWYWx1ZXMgPSBcIkFkbGFtIEFkbG0gQWhvbSBBaG9tIEFuYXRvbGlhbl9IaWVyb2dseXBocyBIbHV3IEFyYWJpYyBBcmFiIEFybWVuaWFuIEFybW4gQXZlc3RhbiBBdnN0IEJhbGluZXNlIEJhbGkgQmFtdW0gQmFtdSBCYXNzYV9WYWggQmFzcyBCYXRhayBCYXRrIEJlbmdhbGkgQmVuZyBCaGFpa3N1a2kgQmhrcyBCb3BvbW9mbyBCb3BvIEJyYWhtaSBCcmFoIEJyYWlsbGUgQnJhaSBCdWdpbmVzZSBCdWdpIEJ1aGlkIEJ1aGQgQ2FuYWRpYW5fQWJvcmlnaW5hbCBDYW5zIENhcmlhbiBDYXJpIENhdWNhc2lhbl9BbGJhbmlhbiBBZ2hiIENoYWttYSBDYWttIENoYW0gQ2hhbSBDaGVyb2tlZSBDaGVyIENvbW1vbiBaeXl5IENvcHRpYyBDb3B0IFFhYWMgQ3VuZWlmb3JtIFhzdXggQ3lwcmlvdCBDcHJ0IEN5cmlsbGljIEN5cmwgRGVzZXJldCBEc3J0IERldmFuYWdhcmkgRGV2YSBEdXBsb3lhbiBEdXBsIEVneXB0aWFuX0hpZXJvZ2x5cGhzIEVneXAgRWxiYXNhbiBFbGJhIEV0aGlvcGljIEV0aGkgR2VvcmdpYW4gR2VvciBHbGFnb2xpdGljIEdsYWcgR290aGljIEdvdGggR3JhbnRoYSBHcmFuIEdyZWVrIEdyZWsgR3VqYXJhdGkgR3VqciBHdXJtdWtoaSBHdXJ1IEhhbiBIYW5pIEhhbmd1bCBIYW5nIEhhbnVub28gSGFubyBIYXRyYW4gSGF0ciBIZWJyZXcgSGViciBIaXJhZ2FuYSBIaXJhIEltcGVyaWFsX0FyYW1haWMgQXJtaSBJbmhlcml0ZWQgWmluaCBRYWFpIEluc2NyaXB0aW9uYWxfUGFobGF2aSBQaGxpIEluc2NyaXB0aW9uYWxfUGFydGhpYW4gUHJ0aSBKYXZhbmVzZSBKYXZhIEthaXRoaSBLdGhpIEthbm5hZGEgS25kYSBLYXRha2FuYSBLYW5hIEtheWFoX0xpIEthbGkgS2hhcm9zaHRoaSBLaGFyIEtobWVyIEtobXIgS2hvamtpIEtob2ogS2h1ZGF3YWRpIFNpbmQgTGFvIExhb28gTGF0aW4gTGF0biBMZXBjaGEgTGVwYyBMaW1idSBMaW1iIExpbmVhcl9BIExpbmEgTGluZWFyX0IgTGluYiBMaXN1IExpc3UgTHljaWFuIEx5Y2kgTHlkaWFuIEx5ZGkgTWFoYWphbmkgTWFoaiBNYWxheWFsYW0gTWx5bSBNYW5kYWljIE1hbmQgTWFuaWNoYWVhbiBNYW5pIE1hcmNoZW4gTWFyYyBNYXNhcmFtX0dvbmRpIEdvbm0gTWVldGVpX01heWVrIE10ZWkgTWVuZGVfS2lrYWt1aSBNZW5kIE1lcm9pdGljX0N1cnNpdmUgTWVyYyBNZXJvaXRpY19IaWVyb2dseXBocyBNZXJvIE1pYW8gUGxyZCBNb2RpIE1vZGkgTW9uZ29saWFuIE1vbmcgTXJvIE1yb28gTXVsdGFuaSBNdWx0IE15YW5tYXIgTXltciBOYWJhdGFlYW4gTmJhdCBOZXdfVGFpX0x1ZSBUYWx1IE5ld2EgTmV3YSBOa28gTmtvbyBOdXNodSBOc2h1IE9naGFtIE9nYW0gT2xfQ2hpa2kgT2xjayBPbGRfSHVuZ2FyaWFuIEh1bmcgT2xkX0l0YWxpYyBJdGFsIE9sZF9Ob3J0aF9BcmFiaWFuIE5hcmIgT2xkX1Blcm1pYyBQZXJtIE9sZF9QZXJzaWFuIFhwZW8gT2xkX1NvdXRoX0FyYWJpYW4gU2FyYiBPbGRfVHVya2ljIE9ya2ggT3JpeWEgT3J5YSBPc2FnZSBPc2dlIE9zbWFueWEgT3NtYSBQYWhhd2hfSG1vbmcgSG1uZyBQYWxteXJlbmUgUGFsbSBQYXVfQ2luX0hhdSBQYXVjIFBoYWdzX1BhIFBoYWcgUGhvZW5pY2lhbiBQaG54IFBzYWx0ZXJfUGFobGF2aSBQaGxwIFJlamFuZyBSam5nIFJ1bmljIFJ1bnIgU2FtYXJpdGFuIFNhbXIgU2F1cmFzaHRyYSBTYXVyIFNoYXJhZGEgU2hyZCBTaGF2aWFuIFNoYXcgU2lkZGhhbSBTaWRkIFNpZ25Xcml0aW5nIFNnbncgU2luaGFsYSBTaW5oIFNvcmFfU29tcGVuZyBTb3JhIFNveW9tYm8gU295byBTdW5kYW5lc2UgU3VuZCBTeWxvdGlfTmFncmkgU3lsbyBTeXJpYWMgU3lyYyBUYWdhbG9nIFRnbGcgVGFnYmFud2EgVGFnYiBUYWlfTGUgVGFsZSBUYWlfVGhhbSBMYW5hIFRhaV9WaWV0IFRhdnQgVGFrcmkgVGFrciBUYW1pbCBUYW1sIFRhbmd1dCBUYW5nIFRlbHVndSBUZWx1IFRoYWFuYSBUaGFhIFRoYWkgVGhhaSBUaWJldGFuIFRpYnQgVGlmaW5hZ2ggVGZuZyBUaXJodXRhIFRpcmggVWdhcml0aWMgVWdhciBWYWkgVmFpaSBXYXJhbmdfQ2l0aSBXYXJhIFlpIFlpaWkgWmFuYWJhemFyX1NxdWFyZSBaYW5iXCI7XG4gIHZhciBlY21hMTBTY3JpcHRWYWx1ZXMgPSBlY21hOVNjcmlwdFZhbHVlcyArIFwiIERvZ3JhIERvZ3IgR3VuamFsYV9Hb25kaSBHb25nIEhhbmlmaV9Sb2hpbmd5YSBSb2hnIE1ha2FzYXIgTWFrYSBNZWRlZmFpZHJpbiBNZWRmIE9sZF9Tb2dkaWFuIFNvZ28gU29nZGlhbiBTb2dkXCI7XG4gIHZhciBlY21hMTFTY3JpcHRWYWx1ZXMgPSBlY21hMTBTY3JpcHRWYWx1ZXMgKyBcIiBFbHltYWljIEVseW0gTmFuZGluYWdhcmkgTmFuZCBOeWlha2VuZ19QdWFjaHVlX0htb25nIEhtbnAgV2FuY2hvIFdjaG9cIjtcbiAgdmFyIHVuaWNvZGVTY3JpcHRWYWx1ZXMgPSB7XG4gICAgOTogZWNtYTlTY3JpcHRWYWx1ZXMsXG4gICAgMTA6IGVjbWExMFNjcmlwdFZhbHVlcyxcbiAgICAxMTogZWNtYTExU2NyaXB0VmFsdWVzXG4gIH07XG5cbiAgdmFyIGRhdGEgPSB7fTtcbiAgZnVuY3Rpb24gYnVpbGRVbmljb2RlRGF0YShlY21hVmVyc2lvbikge1xuICAgIHZhciBkID0gZGF0YVtlY21hVmVyc2lvbl0gPSB7XG4gICAgICBiaW5hcnk6IHdvcmRzUmVnZXhwKHVuaWNvZGVCaW5hcnlQcm9wZXJ0aWVzW2VjbWFWZXJzaW9uXSArIFwiIFwiICsgdW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyksXG4gICAgICBub25CaW5hcnk6IHtcbiAgICAgICAgR2VuZXJhbF9DYXRlZ29yeTogd29yZHNSZWdleHAodW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyksXG4gICAgICAgIFNjcmlwdDogd29yZHNSZWdleHAodW5pY29kZVNjcmlwdFZhbHVlc1tlY21hVmVyc2lvbl0pXG4gICAgICB9XG4gICAgfTtcbiAgICBkLm5vbkJpbmFyeS5TY3JpcHRfRXh0ZW5zaW9ucyA9IGQubm9uQmluYXJ5LlNjcmlwdDtcblxuICAgIGQubm9uQmluYXJ5LmdjID0gZC5ub25CaW5hcnkuR2VuZXJhbF9DYXRlZ29yeTtcbiAgICBkLm5vbkJpbmFyeS5zYyA9IGQubm9uQmluYXJ5LlNjcmlwdDtcbiAgICBkLm5vbkJpbmFyeS5zY3ggPSBkLm5vbkJpbmFyeS5TY3JpcHRfRXh0ZW5zaW9ucztcbiAgfVxuICBidWlsZFVuaWNvZGVEYXRhKDkpO1xuICBidWlsZFVuaWNvZGVEYXRhKDEwKTtcbiAgYnVpbGRVbmljb2RlRGF0YSgxMSk7XG5cbiAgdmFyIHBwJDggPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHZhciBSZWdFeHBWYWxpZGF0aW9uU3RhdGUgPSBmdW5jdGlvbiBSZWdFeHBWYWxpZGF0aW9uU3RhdGUocGFyc2VyKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy52YWxpZEZsYWdzID0gXCJnaW1cIiArIChwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ID8gXCJ1eVwiIDogXCJcIikgKyAocGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSA/IFwic1wiIDogXCJcIik7XG4gICAgdGhpcy51bmljb2RlUHJvcGVydGllcyA9IGRhdGFbcGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgPyAxMSA6IHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uXTtcbiAgICB0aGlzLnNvdXJjZSA9IFwiXCI7XG4gICAgdGhpcy5mbGFncyA9IFwiXCI7XG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5zd2l0Y2hVID0gZmFsc2U7XG4gICAgdGhpcy5zd2l0Y2hOID0gZmFsc2U7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMubGFzdEludFZhbHVlID0gMDtcbiAgICB0aGlzLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gICAgdGhpcy5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgICB0aGlzLm51bUNhcHR1cmluZ1BhcmVucyA9IDA7XG4gICAgdGhpcy5tYXhCYWNrUmVmZXJlbmNlID0gMDtcbiAgICB0aGlzLmdyb3VwTmFtZXMgPSBbXTtcbiAgICB0aGlzLmJhY2tSZWZlcmVuY2VOYW1lcyA9IFtdO1xuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoc3RhcnQsIHBhdHRlcm4sIGZsYWdzKSB7XG4gICAgdmFyIHVuaWNvZGUgPSBmbGFncy5pbmRleE9mKFwidVwiKSAhPT0gLTE7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0IHwgMDtcbiAgICB0aGlzLnNvdXJjZSA9IHBhdHRlcm4gKyBcIlwiO1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLnN3aXRjaFUgPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgICB0aGlzLnN3aXRjaE4gPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOTtcbiAgfTtcblxuICBSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLnJhaXNlID0gZnVuY3Rpb24gcmFpc2UgKG1lc3NhZ2UpIHtcbiAgICB0aGlzLnBhcnNlci5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIChcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvXCIgKyAodGhpcy5zb3VyY2UpICsgXCIvOiBcIiArIG1lc3NhZ2UpKTtcbiAgfTtcblxuICAvLyBJZiB1IGZsYWcgaXMgZ2l2ZW4sIHRoaXMgcmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgaW5kZXggKGl0IGNvbWJpbmVzIGEgc3Vycm9nYXRlIHBhaXIpLlxuICAvLyBPdGhlcndpc2UsIHRoaXMgcmV0dXJucyB0aGUgY29kZSB1bml0IG9mIHRoZSBpbmRleCAoY2FuIGJlIGEgcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyKS5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIGF0IChpLCBmb3JjZVUpIHtcbiAgICAgIGlmICggZm9yY2VVID09PSB2b2lkIDAgKSBmb3JjZVUgPSBmYWxzZTtcblxuICAgIHZhciBzID0gdGhpcy5zb3VyY2U7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICBpZiAoaSA+PSBsKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKCEoZm9yY2VVIHx8IHRoaXMuc3dpdGNoVSkgfHwgYyA8PSAweEQ3RkYgfHwgYyA+PSAweEUwMDAgfHwgaSArIDEgPj0gbCkge1xuICAgICAgcmV0dXJuIGNcbiAgICB9XG4gICAgdmFyIG5leHQgPSBzLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIHJldHVybiBuZXh0ID49IDB4REMwMCAmJiBuZXh0IDw9IDB4REZGRiA/IChjIDw8IDEwKSArIG5leHQgLSAweDM1RkRDMDAgOiBjXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5uZXh0SW5kZXggPSBmdW5jdGlvbiBuZXh0SW5kZXggKGksIGZvcmNlVSkge1xuICAgICAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gICAgdmFyIHMgPSB0aGlzLnNvdXJjZTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIGlmIChpID49IGwpIHtcbiAgICAgIHJldHVybiBsXG4gICAgfVxuICAgIHZhciBjID0gcy5jaGFyQ29kZUF0KGkpLCBuZXh0O1xuICAgIGlmICghKGZvcmNlVSB8fCB0aGlzLnN3aXRjaFUpIHx8IGMgPD0gMHhEN0ZGIHx8IGMgPj0gMHhFMDAwIHx8IGkgKyAxID49IGwgfHxcbiAgICAgICAgKG5leHQgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4REMwMCB8fCBuZXh0ID4gMHhERkZGKSB7XG4gICAgICByZXR1cm4gaSArIDFcbiAgICB9XG4gICAgcmV0dXJuIGkgKyAyXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCAoZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5hdCh0aGlzLnBvcywgZm9yY2VVKVxuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUubG9va2FoZWFkID0gZnVuY3Rpb24gbG9va2FoZWFkIChmb3JjZVUpIHtcbiAgICAgIGlmICggZm9yY2VVID09PSB2b2lkIDAgKSBmb3JjZVUgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmF0KHRoaXMubmV4dEluZGV4KHRoaXMucG9zLCBmb3JjZVUpLCBmb3JjZVUpXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24gYWR2YW5jZSAoZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICB0aGlzLnBvcyA9IHRoaXMubmV4dEluZGV4KHRoaXMucG9zLCBmb3JjZVUpO1xuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUuZWF0ID0gZnVuY3Rpb24gZWF0IChjaCwgZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50KGZvcmNlVSkgPT09IGNoKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoZm9yY2VVKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvZGVQb2ludFRvU3RyaW5nKGNoKSB7XG4gICAgaWYgKGNoIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCkgfVxuICAgIGNoIC09IDB4MTAwMDA7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNoID4+IDEwKSArIDB4RDgwMCwgKGNoICYgMHgwM0ZGKSArIDB4REMwMClcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZmxhZ3MgcGFydCBvZiBhIGdpdmVuIFJlZ0V4cExpdGVyYWwuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVnRXhwVmFsaWRhdGlvblN0YXRlfSBzdGF0ZSBUaGUgc3RhdGUgdG8gdmFsaWRhdGUgUmVnRXhwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHBwJDgudmFsaWRhdGVSZWdFeHBGbGFncyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHZhbGlkRmxhZ3MgPSBzdGF0ZS52YWxpZEZsYWdzO1xuICAgIHZhciBmbGFncyA9IHN0YXRlLmZsYWdzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZsYWcgPSBmbGFncy5jaGFyQXQoaSk7XG4gICAgICBpZiAodmFsaWRGbGFncy5pbmRleE9mKGZsYWcpID09PSAtMSkge1xuICAgICAgICB0aGlzLnJhaXNlKHN0YXRlLnN0YXJ0LCBcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZsYWdcIik7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZ3MuaW5kZXhPZihmbGFnLCBpICsgMSkgPiAtMSkge1xuICAgICAgICB0aGlzLnJhaXNlKHN0YXRlLnN0YXJ0LCBcIkR1cGxpY2F0ZSByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ1wiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBwYXR0ZXJuIHBhcnQgb2YgYSBnaXZlbiBSZWdFeHBMaXRlcmFsLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlZ0V4cFZhbGlkYXRpb25TdGF0ZX0gc3RhdGUgVGhlIHN0YXRlIHRvIHZhbGlkYXRlIFJlZ0V4cC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcCQ4LnZhbGlkYXRlUmVnRXhwUGF0dGVybiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdGhpcy5yZWdleHBfcGF0dGVybihzdGF0ZSk7XG5cbiAgICAvLyBUaGUgZ29hbCBzeW1ib2wgZm9yIHRoZSBwYXJzZSBpcyB8UGF0dGVyblt+VSwgfk5dfC4gSWYgdGhlIHJlc3VsdCBvZlxuICAgIC8vIHBhcnNpbmcgY29udGFpbnMgYSB8R3JvdXBOYW1lfCwgcmVwYXJzZSB3aXRoIHRoZSBnb2FsIHN5bWJvbFxuICAgIC8vIHxQYXR0ZXJuW35VLCArTl18IGFuZCB1c2UgdGhpcyByZXN1bHQgaW5zdGVhZC4gVGhyb3cgYSAqU3ludGF4RXJyb3IqXG4gICAgLy8gZXhjZXB0aW9uIGlmIF9QXyBkaWQgbm90IGNvbmZvcm0gdG8gdGhlIGdyYW1tYXIsIGlmIGFueSBlbGVtZW50cyBvZiBfUF9cbiAgICAvLyB3ZXJlIG5vdCBtYXRjaGVkIGJ5IHRoZSBwYXJzZSwgb3IgaWYgYW55IEVhcmx5IEVycm9yIGNvbmRpdGlvbnMgZXhpc3QuXG4gICAgaWYgKCFzdGF0ZS5zd2l0Y2hOICYmIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHN0YXRlLmdyb3VwTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuc3dpdGNoTiA9IHRydWU7XG4gICAgICB0aGlzLnJlZ2V4cF9wYXR0ZXJuKHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUGF0dGVyblxuICBwcCQ4LnJlZ2V4cF9wYXR0ZXJuID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBzdGF0ZS5wb3MgPSAwO1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgPSAwO1xuICAgIHN0YXRlLm1heEJhY2tSZWZlcmVuY2UgPSAwO1xuICAgIHN0YXRlLmdyb3VwTmFtZXMubGVuZ3RoID0gMDtcbiAgICBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXMubGVuZ3RoID0gMDtcblxuICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcblxuICAgIGlmIChzdGF0ZS5wb3MgIT09IHN0YXRlLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2UgdGhlIHNhbWUgbWVzc2FnZXMgYXMgVjguXG4gICAgICBpZiAoc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJVbm1hdGNoZWQgJyknXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmVhdCgweDVEIC8qIF0gKi8pIHx8IHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUubWF4QmFja1JlZmVyZW5jZSA+IHN0YXRlLm51bUNhcHR1cmluZ1BhcmVucykge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbmFtZSA9IGxpc3RbaV07XG5cbiAgICAgIGlmIChzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCBjYXB0dXJlIHJlZmVyZW5jZWRcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLURpc2p1bmN0aW9uXG4gIHBwJDgucmVnZXhwX2Rpc2p1bmN0aW9uID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7XG4gICAgd2hpbGUgKHN0YXRlLmVhdCgweDdDIC8qIHwgKi8pKSB7XG4gICAgICB0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlLCB0cnVlKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJOb3RoaW5nIHRvIHJlcGVhdFwiKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIkxvbmUgcXVhbnRpZmllciBicmFja2V0c1wiKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQWx0ZXJuYXRpdmVcbiAgcHAkOC5yZWdleHBfYWx0ZXJuYXRpdmUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHdoaWxlIChzdGF0ZS5wb3MgPCBzdGF0ZS5zb3VyY2UubGVuZ3RoICYmIHRoaXMucmVnZXhwX2VhdFRlcm0oc3RhdGUpKVxuICAgICAgeyB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLVRlcm1cbiAgcHAkOC5yZWdleHBfZWF0VGVybSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdEFzc2VydGlvbihzdGF0ZSkpIHtcbiAgICAgIC8vIEhhbmRsZSBgUXVhbnRpZmlhYmxlQXNzZXJ0aW9uIFF1YW50aWZpZXJgIGFsdGVybmF0aXZlLlxuICAgICAgLy8gYHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZWAgaXMgdHJ1ZSBpZiB0aGUgbGFzdCBlYXRlbiBBc3NlcnRpb25cbiAgICAgIC8vIGlzIGEgUXVhbnRpZmlhYmxlQXNzZXJ0aW9uLlxuICAgICAgaWYgKHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSAmJiB0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlKSkge1xuICAgICAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2UgYXMgVjguXG4gICAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHF1YW50aWZpZXJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnN3aXRjaFUgPyB0aGlzLnJlZ2V4cF9lYXRBdG9tKHN0YXRlKSA6IHRoaXMucmVnZXhwX2VhdEV4dGVuZGVkQXRvbShzdGF0ZSkpIHtcbiAgICAgIHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXIoc3RhdGUpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQXNzZXJ0aW9uXG4gIHBwJDgucmVnZXhwX2VhdEFzc2VydGlvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICAgIHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSA9IGZhbHNlO1xuXG4gICAgLy8gXiwgJFxuICAgIGlmIChzdGF0ZS5lYXQoMHg1RSAvKiBeICovKSB8fCBzdGF0ZS5lYXQoMHgyNCAvKiAkICovKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBcXGIgXFxCXG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHN0YXRlLmVhdCgweDQyIC8qIEIgKi8pIHx8IHN0YXRlLmVhdCgweDYyIC8qIGIgKi8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICAvLyBMb29rYWhlYWQgLyBMb29rYmVoaW5kXG4gICAgaWYgKHN0YXRlLmVhdCgweDI4IC8qICggKi8pICYmIHN0YXRlLmVhdCgweDNGIC8qID8gKi8pKSB7XG4gICAgICB2YXIgbG9va2JlaGluZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5KSB7XG4gICAgICAgIGxvb2tiZWhpbmQgPSBzdGF0ZS5lYXQoMHgzQyAvKiA8ICovKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgzRCAvKiA9ICovKSB8fCBzdGF0ZS5lYXQoMHgyMSAvKiAhICovKSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG4gICAgICAgIGlmICghc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBncm91cFwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSAhbG9va2JlaGluZDtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1RdWFudGlmaWVyXG4gIHBwJDgucmVnZXhwX2VhdFF1YW50aWZpZXIgPSBmdW5jdGlvbihzdGF0ZSwgbm9FcnJvcikge1xuICAgIGlmICggbm9FcnJvciA9PT0gdm9pZCAwICkgbm9FcnJvciA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXJQcmVmaXgoc3RhdGUsIG5vRXJyb3IpKSB7XG4gICAgICBzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVF1YW50aWZpZXJQcmVmaXhcbiAgcHAkOC5yZWdleHBfZWF0UXVhbnRpZmllclByZWZpeCA9IGZ1bmN0aW9uKHN0YXRlLCBub0Vycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0YXRlLmVhdCgweDJBIC8qICogKi8pIHx8XG4gICAgICBzdGF0ZS5lYXQoMHgyQiAvKiArICovKSB8fFxuICAgICAgc3RhdGUuZWF0KDB4M0YgLyogPyAqLykgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEJyYWNlZFF1YW50aWZpZXIoc3RhdGUsIG5vRXJyb3IpXG4gICAgKVxuICB9O1xuICBwcCQ4LnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyID0gZnVuY3Rpb24oc3RhdGUsIG5vRXJyb3IpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgaWYgKHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pKSB7XG4gICAgICB2YXIgbWluID0gMCwgbWF4ID0gLTE7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpIHtcbiAgICAgICAgbWluID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICBpZiAoc3RhdGUuZWF0KDB4MkMgLyogLCAqLykgJiYgdGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpIHtcbiAgICAgICAgICBtYXggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pKSB7XG4gICAgICAgICAgLy8gU3ludGF4RXJyb3IgaW4gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3NlYy10ZXJtXG4gICAgICAgICAgaWYgKG1heCAhPT0gLTEgJiYgbWF4IDwgbWluICYmICFub0Vycm9yKSB7XG4gICAgICAgICAgICBzdGF0ZS5yYWlzZShcIm51bWJlcnMgb3V0IG9mIG9yZGVyIGluIHt9IHF1YW50aWZpZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmICFub0Vycm9yKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW5jb21wbGV0ZSBxdWFudGlmaWVyXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUF0b21cbiAgcHAkOC5yZWdleHBfZWF0QXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzKHN0YXRlKSB8fFxuICAgICAgc3RhdGUuZWF0KDB4MkUgLyogLiAqLykgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZShzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0VW5jYXB0dXJpbmdHcm91cChzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwKHN0YXRlKVxuICAgIClcbiAgfTtcbiAgcHAkOC5yZWdleHBfZWF0UmV2ZXJzZVNvbGlkdXNBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEF0b21Fc2NhcGUoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSAmJiBzdGF0ZS5lYXQoMHgzQSAvKiA6ICovKSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUucmFpc2UoXCJVbnRlcm1pbmF0ZWQgZ3JvdXBcIik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9ncm91cFNwZWNpZmllcihzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmN1cnJlbnQoKSA9PT0gMHgzRiAvKiA/ICovKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBncm91cFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHN0YXRlLnJhaXNlKFwiVW50ZXJtaW5hdGVkIGdyb3VwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItRXh0ZW5kZWRBdG9tXG4gIHBwJDgucmVnZXhwX2VhdEV4dGVuZGVkQXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0YXRlLmVhdCgweDJFIC8qIC4gKi8pIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRSZXZlcnNlU29saWR1c0F0b21Fc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyhzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDYXB0dXJpbmdHcm91cChzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyKHN0YXRlKVxuICAgIClcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSW52YWxpZEJyYWNlZFF1YW50aWZpZXJcbiAgcHAkOC5yZWdleHBfZWF0SW52YWxpZEJyYWNlZFF1YW50aWZpZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyKHN0YXRlLCB0cnVlKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJOb3RoaW5nIHRvIHJlcGVhdFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtU3ludGF4Q2hhcmFjdGVyXG4gIHBwJDgucmVnZXhwX2VhdFN5bnRheENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc1N5bnRheENoYXJhY3RlcihjaCkpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzU3ludGF4Q2hhcmFjdGVyKGNoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoID09PSAweDI0IC8qICQgKi8gfHxcbiAgICAgIGNoID49IDB4MjggLyogKCAqLyAmJiBjaCA8PSAweDJCIC8qICsgKi8gfHxcbiAgICAgIGNoID09PSAweDJFIC8qIC4gKi8gfHxcbiAgICAgIGNoID09PSAweDNGIC8qID8gKi8gfHxcbiAgICAgIGNoID49IDB4NUIgLyogWyAqLyAmJiBjaCA8PSAweDVFIC8qIF4gKi8gfHxcbiAgICAgIGNoID49IDB4N0IgLyogeyAqLyAmJiBjaCA8PSAweDdEIC8qIH0gKi9cbiAgICApXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1QYXR0ZXJuQ2hhcmFjdGVyXG4gIC8vIEJ1dCBlYXQgZWFnZXIuXG4gIHBwJDgucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGNoID0gMDtcbiAgICB3aGlsZSAoKGNoID0gc3RhdGUuY3VycmVudCgpKSAhPT0gLTEgJiYgIWlzU3ludGF4Q2hhcmFjdGVyKGNoKSkge1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1FeHRlbmRlZFBhdHRlcm5DaGFyYWN0ZXJcbiAgcHAkOC5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKFxuICAgICAgY2ggIT09IC0xICYmXG4gICAgICBjaCAhPT0gMHgyNCAvKiAkICovICYmXG4gICAgICAhKGNoID49IDB4MjggLyogKCAqLyAmJiBjaCA8PSAweDJCIC8qICsgKi8pICYmXG4gICAgICBjaCAhPT0gMHgyRSAvKiAuICovICYmXG4gICAgICBjaCAhPT0gMHgzRiAvKiA/ICovICYmXG4gICAgICBjaCAhPT0gMHg1QiAvKiBbICovICYmXG4gICAgICBjaCAhPT0gMHg1RSAvKiBeICovICYmXG4gICAgICBjaCAhPT0gMHg3QyAvKiB8ICovXG4gICAgKSB7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBHcm91cFNwZWNpZmllciA6OlxuICAvLyAgIFtlbXB0eV1cbiAgLy8gICBgP2AgR3JvdXBOYW1lXG4gIHBwJDgucmVnZXhwX2dyb3VwU3BlY2lmaWVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4M0YgLyogPyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRHcm91cE5hbWUoc3RhdGUpKSB7XG4gICAgICAgIGlmIChzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2Yoc3RhdGUubGFzdFN0cmluZ1ZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIkR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZ3JvdXBOYW1lcy5wdXNoKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGdyb3VwXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBHcm91cE5hbWUgOjpcbiAgLy8gICBgPGAgUmVnRXhwSWRlbnRpZmllck5hbWUgYD5gXG4gIC8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxuICBwcCQ4LnJlZ2V4cF9lYXRHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gICAgaWYgKHN0YXRlLmVhdCgweDNDIC8qIDwgKi8pKSB7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllck5hbWUoc3RhdGUpICYmIHN0YXRlLmVhdCgweDNFIC8qID4gKi8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2FwdHVyZSBncm91cCBuYW1lXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBSZWdFeHBJZGVudGlmaWVyTmFtZSA6OlxuICAvLyAgIFJlZ0V4cElkZW50aWZpZXJTdGFydFxuICAvLyAgIFJlZ0V4cElkZW50aWZpZXJOYW1lIFJlZ0V4cElkZW50aWZpZXJQYXJ0XG4gIC8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxuICBwcCQ4LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclN0YXJ0KHN0YXRlKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKHN0YXRlLmxhc3RJbnRWYWx1ZSk7XG4gICAgICB3aGlsZSAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclBhcnQoc3RhdGUpKSB7XG4gICAgICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSArPSBjb2RlUG9pbnRUb1N0cmluZyhzdGF0ZS5sYXN0SW50VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gUmVnRXhwSWRlbnRpZmllclN0YXJ0IDo6XG4gIC8vICAgVW5pY29kZUlEU3RhcnRcbiAgLy8gICBgJGBcbiAgLy8gICBgX2BcbiAgLy8gICBgXFxgIFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZVsrVV1cbiAgcHAkOC5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclN0YXJ0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGZvcmNlVSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMTtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KGZvcmNlVSk7XG4gICAgc3RhdGUuYWR2YW5jZShmb3JjZVUpO1xuXG4gICAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSwgZm9yY2VVKSkge1xuICAgICAgY2ggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cElkZW50aWZpZXJTdGFydChjaCkpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcbiAgZnVuY3Rpb24gaXNSZWdFeHBJZGVudGlmaWVyU3RhcnQoY2gpIHtcbiAgICByZXR1cm4gaXNJZGVudGlmaWVyU3RhcnQoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqL1xuICB9XG5cbiAgLy8gUmVnRXhwSWRlbnRpZmllclBhcnQgOjpcbiAgLy8gICBVbmljb2RlSURDb250aW51ZVxuICAvLyAgIGAkYFxuICAvLyAgIGBfYFxuICAvLyAgIGBcXGAgUmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlWytVXVxuICAvLyAgIDxaV05KPlxuICAvLyAgIDxaV0o+XG4gIHBwJDgucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJQYXJ0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGZvcmNlVSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMTtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KGZvcmNlVSk7XG4gICAgc3RhdGUuYWR2YW5jZShmb3JjZVUpO1xuXG4gICAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSwgZm9yY2VVKSkge1xuICAgICAgY2ggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cElkZW50aWZpZXJQYXJ0KGNoKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gY2g7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBmdW5jdGlvbiBpc1JlZ0V4cElkZW50aWZpZXJQYXJ0KGNoKSB7XG4gICAgcmV0dXJuIGlzSWRlbnRpZmllckNoYXIoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqLyB8fCBjaCA9PT0gMHgyMDBDIC8qIDxaV05KPiAqLyB8fCBjaCA9PT0gMHgyMDBEIC8qIDxaV0o+ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQXRvbUVzY2FwZVxuICBwcCQ4LnJlZ2V4cF9lYXRBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2V4cF9lYXRCYWNrUmVmZXJlbmNlKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpIHx8XG4gICAgICAoc3RhdGUuc3dpdGNoTiAmJiB0aGlzLnJlZ2V4cF9lYXRLR3JvdXBOYW1lKHN0YXRlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2UgYXMgVjguXG4gICAgICBpZiAoc3RhdGUuY3VycmVudCgpID09PSAweDYzIC8qIGMgKi8pIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHVuaWNvZGUgZXNjYXBlXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0RGVjaW1hbEVzY2FwZShzdGF0ZSkpIHtcbiAgICAgIHZhciBuID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgLy8gRm9yIFN5bnRheEVycm9yIGluIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNzZWMtYXRvbWVzY2FwZVxuICAgICAgICBpZiAobiA+IHN0YXRlLm1heEJhY2tSZWZlcmVuY2UpIHtcbiAgICAgICAgICBzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlID0gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG4gPD0gc3RhdGUubnVtQ2FwdHVyaW5nUGFyZW5zKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdEtHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHg2QiAvKiBrICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEdyb3VwTmFtZShzdGF0ZSkpIHtcbiAgICAgICAgc3RhdGUuYmFja1JlZmVyZW5jZU5hbWVzLnB1c2goc3RhdGUubGFzdFN0cmluZ1ZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCByZWZlcmVuY2VcIik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DaGFyYWN0ZXJFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q29udHJvbEVzY2FwZShzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENDb250cm9sTGV0dGVyKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0WmVybyhzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEhleEVzY2FwZVNlcXVlbmNlKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0UmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlKHN0YXRlLCBmYWxzZSkgfHxcbiAgICAgICghc3RhdGUuc3dpdGNoVSAmJiB0aGlzLnJlZ2V4cF9lYXRMZWdhY3lPY3RhbEVzY2FwZVNlcXVlbmNlKHN0YXRlKSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdElkZW50aXR5RXNjYXBlKHN0YXRlKVxuICAgIClcbiAgfTtcbiAgcHAkOC5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAoc3RhdGUuZWF0KDB4NjMgLyogYyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDb250cm9sTGV0dGVyKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBwcCQ4LnJlZ2V4cF9lYXRaZXJvID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuY3VycmVudCgpID09PSAweDMwIC8qIDAgKi8gJiYgIWlzRGVjaW1hbERpZ2l0KHN0YXRlLmxvb2thaGVhZCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q29udHJvbEVzY2FwZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChjaCA9PT0gMHg3NCAvKiB0ICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDA5OyAvKiBcXHQgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg2RSAvKiBuICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBBOyAvKiBcXG4gKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg3NiAvKiB2ICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBCOyAvKiBcXHYgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg2NiAvKiBmICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBDOyAvKiBcXGYgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg3MiAvKiByICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBEOyAvKiBcXHIgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xMZXR0ZXJcbiAgcHAkOC5yZWdleHBfZWF0Q29udHJvbExldHRlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc0NvbnRyb2xMZXR0ZXIoY2gpKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAlIDB4MjA7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcbiAgZnVuY3Rpb24gaXNDb250cm9sTGV0dGVyKGNoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg1QSAvKiBaICovKSB8fFxuICAgICAgKGNoID49IDB4NjEgLyogYSAqLyAmJiBjaCA8PSAweDdBIC8qIHogKi8pXG4gICAgKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlXG4gIHBwJDgucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZVUpIHtcbiAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIHN3aXRjaFUgPSBmb3JjZVUgfHwgc3RhdGUuc3dpdGNoVTtcblxuICAgIGlmIChzdGF0ZS5lYXQoMHg3NSAvKiB1ICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCA0KSkge1xuICAgICAgICB2YXIgbGVhZCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgICAgaWYgKHN3aXRjaFUgJiYgbGVhZCA+PSAweEQ4MDAgJiYgbGVhZCA8PSAweERCRkYpIHtcbiAgICAgICAgICB2YXIgbGVhZFN1cnJvZ2F0ZUVuZCA9IHN0YXRlLnBvcztcbiAgICAgICAgICBpZiAoc3RhdGUuZWF0KDB4NUMgLyogXFwgKi8pICYmIHN0YXRlLmVhdCgweDc1IC8qIHUgKi8pICYmIHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCA0KSkge1xuICAgICAgICAgICAgdmFyIHRyYWlsID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICAgICAgaWYgKHRyYWlsID49IDB4REMwMCAmJiB0cmFpbCA8PSAweERGRkYpIHtcbiAgICAgICAgICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUucG9zID0gbGVhZFN1cnJvZ2F0ZUVuZDtcbiAgICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBsZWFkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHN3aXRjaFUgJiZcbiAgICAgICAgc3RhdGUuZWF0KDB4N0IgLyogeyAqLykgJiZcbiAgICAgICAgdGhpcy5yZWdleHBfZWF0SGV4RGlnaXRzKHN0YXRlKSAmJlxuICAgICAgICBzdGF0ZS5lYXQoMHg3RCAvKiB9ICovKSAmJlxuICAgICAgICBpc1ZhbGlkVW5pY29kZShzdGF0ZS5sYXN0SW50VmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzd2l0Y2hVKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCB1bmljb2RlIGVzY2FwZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBmdW5jdGlvbiBpc1ZhbGlkVW5pY29kZShjaCkge1xuICAgIHJldHVybiBjaCA+PSAwICYmIGNoIDw9IDB4MTBGRkZGXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSWRlbnRpdHlFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0SWRlbnRpdHlFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmVhdCgweDJGIC8qIC8gKi8pKSB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MkY7IC8qIC8gKi9cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgICBpZiAoY2ggIT09IDB4NjMgLyogYyAqLyAmJiAoIXN0YXRlLnN3aXRjaE4gfHwgY2ggIT09IDB4NkIgLyogayAqLykpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRXNjYXBlXG4gIHBwJDgucmVnZXhwX2VhdERlY2ltYWxFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChjaCA+PSAweDMxIC8qIDEgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDEwICogc3RhdGUubGFzdEludFZhbHVlICsgKGNoIC0gMHgzMCAvKiAwICovKTtcbiAgICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgfSB3aGlsZSAoKGNoID0gc3RhdGUuY3VycmVudCgpKSA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2hhcmFjdGVyQ2xhc3NFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcblxuICAgIGlmIChpc0NoYXJhY3RlckNsYXNzRXNjYXBlKGNoKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gLTE7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlLnN3aXRjaFUgJiZcbiAgICAgIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmXG4gICAgICAoY2ggPT09IDB4NTAgLyogUCAqLyB8fCBjaCA9PT0gMHg3MCAvKiBwICovKVxuICAgICkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gLTE7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pICYmXG4gICAgICAgIHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbihzdGF0ZSkgJiZcbiAgICAgICAgc3RhdGUuZWF0KDB4N0QgLyogfSAqLylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzQ2hhcmFjdGVyQ2xhc3NFc2NhcGUoY2gpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2ggPT09IDB4NjQgLyogZCAqLyB8fFxuICAgICAgY2ggPT09IDB4NDQgLyogRCAqLyB8fFxuICAgICAgY2ggPT09IDB4NzMgLyogcyAqLyB8fFxuICAgICAgY2ggPT09IDB4NTMgLyogUyAqLyB8fFxuICAgICAgY2ggPT09IDB4NzcgLyogdyAqLyB8fFxuICAgICAgY2ggPT09IDB4NTcgLyogVyAqL1xuICAgIClcbiAgfVxuXG4gIC8vIFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eU5hbWUgYD1gIFVuaWNvZGVQcm9wZXJ0eVZhbHVlXG4gIC8vICAgTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG4gIHBwJDgucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gICAgLy8gVW5pY29kZVByb3BlcnR5TmFtZSBgPWAgVW5pY29kZVByb3BlcnR5VmFsdWVcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5TmFtZShzdGF0ZSkgJiYgc3RhdGUuZWF0KDB4M0QgLyogPSAqLykpIHtcbiAgICAgIHZhciBuYW1lID0gc3RhdGUubGFzdFN0cmluZ1ZhbHVlO1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlKHN0YXRlKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzdGF0ZS5sYXN0U3RyaW5nVmFsdWU7XG4gICAgICAgIHRoaXMucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZUFuZFZhbHVlKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuXG4gICAgLy8gTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZShzdGF0ZSkpIHtcbiAgICAgIHZhciBuYW1lT3JWYWx1ZSA9IHN0YXRlLmxhc3RTdHJpbmdWYWx1ZTtcbiAgICAgIHRoaXMucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUoc3RhdGUsIG5hbWVPclZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBwcCQ4LnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICAgIGlmICghaGFzKHN0YXRlLnVuaWNvZGVQcm9wZXJ0aWVzLm5vbkJpbmFyeSwgbmFtZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpOyB9XG4gICAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5ub25CaW5hcnlbbmFtZV0udGVzdCh2YWx1ZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSB2YWx1ZVwiKTsgfVxuICB9O1xuICBwcCQ4LnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIG5hbWVPclZhbHVlKSB7XG4gICAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5iaW5hcnkudGVzdChuYW1lT3JWYWx1ZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpOyB9XG4gIH07XG5cbiAgLy8gVW5pY29kZVByb3BlcnR5TmFtZSA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXJzXG4gIHBwJDgucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBjaCA9IDA7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICB3aGlsZSAoaXNVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKGNoKTtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxuICB9O1xuICBmdW5jdGlvbiBpc1VuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXIoY2gpIHtcbiAgICByZXR1cm4gaXNDb250cm9sTGV0dGVyKGNoKSB8fCBjaCA9PT0gMHg1RiAvKiBfICovXG4gIH1cblxuICAvLyBVbmljb2RlUHJvcGVydHlWYWx1ZSA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyc1xuICBwcCQ4LnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gMDtcbiAgICBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgPSBcIlwiO1xuICAgIHdoaWxlIChpc1VuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKGNoKTtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxuICB9O1xuICBmdW5jdGlvbiBpc1VuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyKGNoKSB7XG4gICAgcmV0dXJuIGlzVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcihjaCkgfHwgaXNEZWNpbWFsRGlnaXQoY2gpXG4gIH1cblxuICAvLyBMb25lVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUgOjpcbiAgLy8gICBVbmljb2RlUHJvcGVydHlWYWx1ZUNoYXJhY3RlcnNcbiAgcHAkOC5yZWdleHBfZWF0TG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5VmFsdWUoc3RhdGUpXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2hhcmFjdGVyQ2xhc3NcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3MgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHg1QiAvKiBbICovKSkge1xuICAgICAgc3RhdGUuZWF0KDB4NUUgLyogXiAqLyk7XG4gICAgICB0aGlzLnJlZ2V4cF9jbGFzc1JhbmdlcyhzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuZWF0KDB4NUQgLyogXSAqLykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIC8vIFVucmVhY2hhYmxlIHNpbmNlIGl0IHRocmV3IFwidW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiIGVycm9yIGJlZm9yZS5cbiAgICAgIHN0YXRlLnJhaXNlKFwiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2xhc3NSYW5nZXNcbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc1xuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1Ob25lbXB0eUNsYXNzUmFuZ2VzTm9EYXNoXG4gIHBwJDgucmVnZXhwX2NsYXNzUmFuZ2VzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB3aGlsZSAodGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgICAgdmFyIGxlZnQgPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICBpZiAoc3RhdGUuZWF0KDB4MkQgLyogLSAqLykgJiYgdGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgICAgICB2YXIgcmlnaHQgPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmIChsZWZ0ID09PSAtMSB8fCByaWdodCA9PT0gLTEpKSB7XG4gICAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xICYmIGxlZnQgPiByaWdodCkge1xuICAgICAgICAgIHN0YXRlLnJhaXNlKFwiUmFuZ2Ugb3V0IG9mIG9yZGVyIGluIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc0F0b21cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2xhc3NBdG9tTm9EYXNoXG4gIHBwJDgucmVnZXhwX2VhdENsYXNzQXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdENsYXNzRXNjYXBlKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgICAgICB2YXIgY2gkMSA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgICAgICAgaWYgKGNoJDEgPT09IDB4NjMgLyogYyAqLyB8fCBpc09jdGFsRGlnaXQoY2gkMSkpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2xhc3MgZXNjYXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBlc2NhcGVcIik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKGNoICE9PSAweDVEIC8qIF0gKi8pIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2xhc3NFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2xhc3NFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcblxuICAgIGlmIChzdGF0ZS5lYXQoMHg2MiAvKiBiICovKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwODsgLyogPEJTPiAqL1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3dpdGNoVSAmJiBzdGF0ZS5lYXQoMHgyRCAvKiAtICovKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgyRDsgLyogLSAqL1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLnN3aXRjaFUgJiYgc3RhdGUuZWF0KDB4NjMgLyogYyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDbGFzc0NvbnRyb2xMZXR0ZXIoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpXG4gICAgKVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DbGFzc0NvbnRyb2xMZXR0ZXJcbiAgcHAkOC5yZWdleHBfZWF0Q2xhc3NDb250cm9sTGV0dGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKGlzRGVjaW1hbERpZ2l0KGNoKSB8fCBjaCA9PT0gMHg1RiAvKiBfICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAlIDB4MjA7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhFc2NhcGVTZXF1ZW5jZVxuICBwcCQ4LnJlZ2V4cF9lYXRIZXhFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICAgIGlmIChzdGF0ZS5lYXQoMHg3OCAvKiB4ICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCAyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRGlnaXRzXG4gIHBwJDgucmVnZXhwX2VhdERlY2ltYWxEaWdpdHMgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICB2YXIgY2ggPSAwO1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgd2hpbGUgKGlzRGVjaW1hbERpZ2l0KGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMTAgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyAoY2ggLSAweDMwIC8qIDAgKi8pO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxuICB9O1xuICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhEaWdpdHNcbiAgcHAkOC5yZWdleHBfZWF0SGV4RGlnaXRzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGNoID0gMDtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICAgIHdoaWxlIChpc0hleERpZ2l0KGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMTYgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyBoZXhUb0ludChjaCk7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5wb3MgIT09IHN0YXJ0XG4gIH07XG4gIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNoID49IDB4MzAgLyogMCAqLyAmJiBjaCA8PSAweDM5IC8qIDkgKi8pIHx8XG4gICAgICAoY2ggPj0gMHg0MSAvKiBBICovICYmIGNoIDw9IDB4NDYgLyogRiAqLykgfHxcbiAgICAgIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKVxuICAgIClcbiAgfVxuICBmdW5jdGlvbiBoZXhUb0ludChjaCkge1xuICAgIGlmIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg0NiAvKiBGICovKSB7XG4gICAgICByZXR1cm4gMTAgKyAoY2ggLSAweDQxIC8qIEEgKi8pXG4gICAgfVxuICAgIGlmIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKSB7XG4gICAgICByZXR1cm4gMTAgKyAoY2ggLSAweDYxIC8qIGEgKi8pXG4gICAgfVxuICAgIHJldHVybiBjaCAtIDB4MzAgLyogMCAqL1xuICB9XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUxlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2VcbiAgLy8gQWxsb3dzIG9ubHkgMC0zNzcob2N0YWwpIGkuZS4gMC0yNTUoZGVjaW1hbCkuXG4gIHBwJDgucmVnZXhwX2VhdExlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSkge1xuICAgICAgdmFyIG4xID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdE9jdGFsRGlnaXQoc3RhdGUpKSB7XG4gICAgICAgIHZhciBuMiA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgICAgaWYgKG4xIDw9IDMgJiYgdGhpcy5yZWdleHBfZWF0T2N0YWxEaWdpdChzdGF0ZSkpIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMSAqIDY0ICsgbjIgKiA4ICsgc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IG4xICogOCArIG4yO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLU9jdGFsRGlnaXRcbiAgcHAkOC5yZWdleHBfZWF0T2N0YWxEaWdpdCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAtIDB4MzA7IC8qIDAgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzT2N0YWxEaWdpdChjaCkge1xuICAgIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzNyAvKiA3ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXg0RGlnaXRzXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleERpZ2l0XG4gIC8vIEFuZCBIZXhEaWdpdCBIZXhEaWdpdCBpbiBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhFc2NhcGVTZXF1ZW5jZVxuICBwcCQ4LnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cyA9IGZ1bmN0aW9uKHN0YXRlLCBsZW5ndGgpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgICBpZiAoIWlzSGV4RGlnaXQoY2gpKSB7XG4gICAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDE2ICogc3RhdGUubGFzdEludFZhbHVlICsgaGV4VG9JbnQoY2gpO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIC8vIE9iamVjdCB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRva2Vucy4gTm90ZSB0aGF0IG5vcm1hbGx5LCB0b2tlbnNcbiAgLy8gc2ltcGx5IGV4aXN0IGFzIHByb3BlcnRpZXMgb24gdGhlIHBhcnNlciBvYmplY3QuIFRoaXMgaXMgb25seVxuICAvLyB1c2VkIGZvciB0aGUgb25Ub2tlbiBjYWxsYmFjayBhbmQgdGhlIGV4dGVybmFsIHRva2VuaXplci5cblxuICB2YXIgVG9rZW4gPSBmdW5jdGlvbiBUb2tlbihwKSB7XG4gICAgdGhpcy50eXBlID0gcC50eXBlO1xuICAgIHRoaXMudmFsdWUgPSBwLnZhbHVlO1xuICAgIHRoaXMuc3RhcnQgPSBwLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gcC5lbmQ7XG4gICAgaWYgKHAub3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgICB7IHRoaXMubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKHAsIHAuc3RhcnRMb2MsIHAuZW5kTG9jKTsgfVxuICAgIGlmIChwLm9wdGlvbnMucmFuZ2VzKVxuICAgICAgeyB0aGlzLnJhbmdlID0gW3Auc3RhcnQsIHAuZW5kXTsgfVxuICB9O1xuXG4gIC8vICMjIFRva2VuaXplclxuXG4gIHZhciBwcCQ5ID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG5cbiAgcHAkOS5uZXh0ID0gZnVuY3Rpb24oaWdub3JlRXNjYXBlU2VxdWVuY2VJbktleXdvcmQpIHtcbiAgICBpZiAoIWlnbm9yZUVzY2FwZVNlcXVlbmNlSW5LZXl3b3JkICYmIHRoaXMudHlwZS5rZXl3b3JkICYmIHRoaXMuY29udGFpbnNFc2MpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCBcIkVzY2FwZSBzZXF1ZW5jZSBpbiBrZXl3b3JkIFwiICsgdGhpcy50eXBlLmtleXdvcmQpOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vblRva2VuKVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Ub2tlbihuZXcgVG9rZW4odGhpcykpOyB9XG5cbiAgICB0aGlzLmxhc3RUb2tFbmQgPSB0aGlzLmVuZDtcbiAgICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgdGhpcy5sYXN0VG9rRW5kTG9jID0gdGhpcy5lbmRMb2M7XG4gICAgdGhpcy5sYXN0VG9rU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gIH07XG5cbiAgcHAkOS5nZXRUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiBuZXcgVG9rZW4odGhpcylcbiAgfTtcblxuICAvLyBJZiB3ZSdyZSBpbiBhbiBFUzYgZW52aXJvbm1lbnQsIG1ha2UgcGFyc2VycyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICB7IHBwJDlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzJDEuZ2V0VG9rZW4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdG9rZW4udHlwZSA9PT0gdHlwZXMuZW9mLFxuICAgICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTsgfVxuXG4gIC8vIFRvZ2dsZSBzdHJpY3QgbW9kZS4gUmUtcmVhZHMgdGhlIG5leHQgbnVtYmVyIG9yIHN0cmluZyB0byBwbGVhc2VcbiAgLy8gcGVkYW50aWMgdGVzdHMgKGBcInVzZSBzdHJpY3RcIjsgMDEwO2Agc2hvdWxkIGZhaWwpLlxuXG4gIHBwJDkuY3VyQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRbdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDFdXG4gIH07XG5cbiAgLy8gUmVhZCBhIHNpbmdsZSB0b2tlbiwgdXBkYXRpbmcgdGhlIHBhcnNlciBvYmplY3QncyB0b2tlbi1yZWxhdGVkXG4gIC8vIHByb3BlcnRpZXMuXG5cbiAgcHAkOS5uZXh0VG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3VyQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuICAgIGlmICghY3VyQ29udGV4dCB8fCAhY3VyQ29udGV4dC5wcmVzZXJ2ZVNwYWNlKSB7IHRoaXMuc2tpcFNwYWNlKCk7IH1cblxuICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgeyB0aGlzLnN0YXJ0TG9jID0gdGhpcy5jdXJQb3NpdGlvbigpOyB9XG4gICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmVvZikgfVxuXG4gICAgaWYgKGN1ckNvbnRleHQub3ZlcnJpZGUpIHsgcmV0dXJuIGN1ckNvbnRleHQub3ZlcnJpZGUodGhpcykgfVxuICAgIGVsc2UgeyB0aGlzLnJlYWRUb2tlbih0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpOyB9XG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW4gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgLy8gSWRlbnRpZmllciBvciBrZXl3b3JkLiAnXFx1WFhYWCcgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIGluXG4gICAgLy8gaWRlbnRpZmllcnMsIHNvICdcXCcgYWxzbyBkaXNwYXRjaGVzIHRvIHRoYXQuXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB8fCBjb2RlID09PSA5MiAvKiAnXFwnICovKVxuICAgICAgeyByZXR1cm4gdGhpcy5yZWFkV29yZCgpIH1cblxuICAgIHJldHVybiB0aGlzLmdldFRva2VuRnJvbUNvZGUoY29kZSlcbiAgfTtcblxuICBwcCQ5LmZ1bGxDaGFyQ29kZUF0UG9zID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvZGUgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgIGlmIChjb2RlIDw9IDB4ZDdmZiB8fCBjb2RlID49IDB4ZTAwMCkgeyByZXR1cm4gY29kZSB9XG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICByZXR1cm4gKGNvZGUgPDwgMTApICsgbmV4dCAtIDB4MzVmZGMwMFxuICB9O1xuXG4gIHBwJDkuc2tpcEJsb2NrQ29tbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFydExvYyA9IHRoaXMub3B0aW9ucy5vbkNvbW1lbnQgJiYgdGhpcy5jdXJQb3NpdGlvbigpO1xuICAgIHZhciBzdGFydCA9IHRoaXMucG9zLCBlbmQgPSB0aGlzLmlucHV0LmluZGV4T2YoXCIqL1wiLCB0aGlzLnBvcyArPSAyKTtcbiAgICBpZiAoZW5kID09PSAtMSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zIC0gMiwgXCJVbnRlcm1pbmF0ZWQgY29tbWVudFwiKTsgfVxuICAgIHRoaXMucG9zID0gZW5kICsgMjtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgbGluZUJyZWFrRy5sYXN0SW5kZXggPSBzdGFydDtcbiAgICAgIHZhciBtYXRjaDtcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lQnJlYWtHLmV4ZWModGhpcy5pbnB1dCkpICYmIG1hdGNoLmluZGV4IDwgdGhpcy5wb3MpIHtcbiAgICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KHRydWUsIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQgKyAyLCBlbmQpLCBzdGFydCwgdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TG9jLCB0aGlzLmN1clBvc2l0aW9uKCkpOyB9XG4gIH07XG5cbiAgcHAkOS5za2lwTGluZUNvbW1lbnQgPSBmdW5jdGlvbihzdGFydFNraXApIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB2YXIgc3RhcnRMb2MgPSB0aGlzLm9wdGlvbnMub25Db21tZW50ICYmIHRoaXMuY3VyUG9zaXRpb24oKTtcbiAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKz0gc3RhcnRTa2lwKTtcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCAmJiAhaXNOZXdMaW5lKGNoKSkge1xuICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KGZhbHNlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgc3RhcnRTa2lwLCB0aGlzLnBvcyksIHN0YXJ0LCB0aGlzLnBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2MsIHRoaXMuY3VyUG9zaXRpb24oKSk7IH1cbiAgfTtcblxuICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBhbmQgYWZ0ZXIgZXZlcnkgdG9rZW4uIFNraXBzXG4gIC8vIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBhbmQuXG5cbiAgcHAkOS5za2lwU3BhY2UgPSBmdW5jdGlvbigpIHtcbiAgICBsb29wOiB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgIGNhc2UgMzI6IGNhc2UgMTYwOiAvLyAnICdcbiAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTApIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9XG4gICAgICBjYXNlIDEwOiBjYXNlIDgyMzI6IGNhc2UgODIzMzpcbiAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHtcbiAgICAgICAgICArK3RoaXMuY3VyTGluZTtcbiAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSkge1xuICAgICAgICBjYXNlIDQyOiAvLyAnKidcbiAgICAgICAgICB0aGlzLnNraXBCbG9ja0NvbW1lbnQoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWsgbG9vcFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY2ggPiA4ICYmIGNoIDwgMTQgfHwgY2ggPj0gNTc2MCAmJiBub25BU0NJSXdoaXRlc3BhY2UudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrIGxvb3BcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSB0b2tlbi4gU2V0cyBgZW5kYCwgYHZhbGAsIGFuZFxuICAvLyBtYWludGFpbnMgYGNvbnRleHRgIGFuZCBgZXhwckFsbG93ZWRgLCBhbmQgc2tpcHMgdGhlIHNwYWNlIGFmdGVyXG4gIC8vIHRoZSB0b2tlbiwgc28gdGhhdCB0aGUgbmV4dCBvbmUncyBgc3RhcnRgIHdpbGwgcG9pbnQgYXQgdGhlXG4gIC8vIHJpZ2h0IHBvc2l0aW9uLlxuXG4gIHBwJDkuZmluaXNoVG9rZW4gPSBmdW5jdGlvbih0eXBlLCB2YWwpIHtcbiAgICB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7IHRoaXMuZW5kTG9jID0gdGhpcy5jdXJQb3NpdGlvbigpOyB9XG4gICAgdmFyIHByZXZUeXBlID0gdGhpcy50eXBlO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcblxuICAgIHRoaXMudXBkYXRlQ29udGV4dChwcmV2VHlwZSk7XG4gIH07XG5cbiAgLy8gIyMjIFRva2VuIHJlYWRpbmdcblxuICAvLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBmZXRjaCB0aGUgbmV4dCB0b2tlbi4gSXRcbiAgLy8gaXMgc29tZXdoYXQgb2JzY3VyZSwgYmVjYXVzZSBpdCB3b3JrcyBpbiBjaGFyYWN0ZXIgY29kZXMgcmF0aGVyXG4gIC8vIHRoYW4gY2hhcmFjdGVycywgYW5kIGJlY2F1c2Ugb3BlcmF0b3IgcGFyc2luZyBoYXMgYmVlbiBpbmxpbmVkXG4gIC8vIGludG8gaXQuXG4gIC8vXG4gIC8vIEFsbCBpbiB0aGUgbmFtZSBvZiBzcGVlZC5cbiAgLy9cbiAgcHAkOS5yZWFkVG9rZW5fZG90ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSB7IHJldHVybiB0aGlzLnJlYWROdW1iZXIodHJ1ZSkgfVxuICAgIHZhciBuZXh0MiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBuZXh0ID09PSA0NiAmJiBuZXh0MiA9PT0gNDYpIHsgLy8gNDYgPSBkb3QgJy4nXG4gICAgICB0aGlzLnBvcyArPSAzO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuZWxsaXBzaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgICsrdGhpcy5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5kb3QpXG4gICAgfVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3NsYXNoID0gZnVuY3Rpb24oKSB7IC8vICcvJ1xuICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgaWYgKHRoaXMuZXhwckFsbG93ZWQpIHsgKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMucmVhZFJlZ2V4cCgpIH1cbiAgICBpZiAobmV4dCA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLCAyKSB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuc2xhc2gsIDEpXG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW5fbXVsdF9tb2R1bG9fZXhwID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnJSonXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICB2YXIgc2l6ZSA9IDE7XG4gICAgdmFyIHRva2VudHlwZSA9IGNvZGUgPT09IDQyID8gdHlwZXMuc3RhciA6IHR5cGVzLm1vZHVsbztcblxuICAgIC8vIGV4cG9uZW50aWF0aW9uIG9wZXJhdG9yICoqIGFuZCAqKj1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgY29kZSA9PT0gNDIgJiYgbmV4dCA9PT0gNDIpIHtcbiAgICAgICsrc2l6ZTtcbiAgICAgIHRva2VudHlwZSA9IHR5cGVzLnN0YXJzdGFyO1xuICAgICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIHNpemUgKyAxKSB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodG9rZW50eXBlLCBzaXplKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3BpcGVfYW1wID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnfCYnXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMikge1xuICAgICAgICB2YXIgbmV4dDIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgICAgICAgaWYgKG5leHQyID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDMpIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IHR5cGVzLmxvZ2ljYWxPUiA6IHR5cGVzLmxvZ2ljYWxBTkQsIDIpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDIpIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSAxMjQgPyB0eXBlcy5iaXR3aXNlT1IgOiB0eXBlcy5iaXR3aXNlQU5ELCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2NhcmV0ID0gZnVuY3Rpb24oKSB7IC8vICdeJ1xuICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwgMikgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmJpdHdpc2VYT1IsIDEpXG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW5fcGx1c19taW4gPSBmdW5jdGlvbihjb2RlKSB7IC8vICcrLSdcbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjb2RlKSB7XG4gICAgICBpZiAobmV4dCA9PT0gNDUgJiYgIXRoaXMuaW5Nb2R1bGUgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYyICYmXG4gICAgICAgICAgKHRoaXMubGFzdFRva0VuZCA9PT0gMCB8fCBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5wb3MpKSkpIHtcbiAgICAgICAgLy8gQSBgLS0+YCBsaW5lIGNvbW1lbnRcbiAgICAgICAgdGhpcy5za2lwTGluZUNvbW1lbnQoMyk7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRUb2tlbigpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5pbmNEZWMsIDIpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDIpIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5wbHVzTWluLCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2x0X2d0ID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnPD4nXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICB2YXIgc2l6ZSA9IDE7XG4gICAgaWYgKG5leHQgPT09IGNvZGUpIHtcbiAgICAgIHNpemUgPSBjb2RlID09PSA2MiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjIgPyAzIDogMjtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyBzaXplKSA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLCBzaXplICsgMSkgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYml0U2hpZnQsIHNpemUpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSAzMyAmJiBjb2RlID09PSA2MCAmJiAhdGhpcy5pbk1vZHVsZSAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNDUgJiZcbiAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMykgPT09IDQ1KSB7XG4gICAgICAvLyBgPCEtLWAsIGFuIFhNTC1zdHlsZSBjb21tZW50IHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgbGluZSBjb21tZW50XG4gICAgICB0aGlzLnNraXBMaW5lQ29tbWVudCg0KTtcbiAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW4oKVxuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gNjEpIHsgc2l6ZSA9IDI7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5yZWxhdGlvbmFsLCBzaXplKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2VxX2V4Y2wgPSBmdW5jdGlvbihjb2RlKSB7IC8vICc9ISdcbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5lcXVhbGl0eSwgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYxID8gMyA6IDIpIH1cbiAgICBpZiAoY29kZSA9PT0gNjEgJiYgbmV4dCA9PT0gNjIgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgLy8gJz0+J1xuICAgICAgdGhpcy5wb3MgKz0gMjtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmFycm93KVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSA2MSA/IHR5cGVzLmVxIDogdHlwZXMucHJlZml4LCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3F1ZXN0aW9uID0gZnVuY3Rpb24oKSB7IC8vICc/J1xuICAgIHZhciBlY21hVmVyc2lvbiA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjtcbiAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgICBpZiAobmV4dCA9PT0gNDYpIHtcbiAgICAgICAgdmFyIG5leHQyID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMik7XG4gICAgICAgIGlmIChuZXh0MiA8IDQ4IHx8IG5leHQyID4gNTcpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucXVlc3Rpb25Eb3QsIDIpIH1cbiAgICAgIH1cbiAgICAgIGlmIChuZXh0ID09PSA2Mykge1xuICAgICAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTIpIHtcbiAgICAgICAgICB2YXIgbmV4dDIkMSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgICAgICAgIGlmIChuZXh0MiQxID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDMpIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5jb2FsZXNjZSwgMilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucXVlc3Rpb24sIDEpXG4gIH07XG5cbiAgcHAkOS5nZXRUb2tlbkZyb21Db2RlID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWRcbiAgICAvLyBieSBhIGRpZ2l0IG9yIGFub3RoZXIgdHdvIGRvdHMuXG4gICAgY2FzZSA0NjogLy8gJy4nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZG90KClcblxuICAgIC8vIFB1bmN0dWF0aW9uIHRva2Vucy5cbiAgICBjYXNlIDQwOiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5wYXJlbkwpXG4gICAgY2FzZSA0MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucGFyZW5SKVxuICAgIGNhc2UgNTk6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnNlbWkpXG4gICAgY2FzZSA0NDogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuY29tbWEpXG4gICAgY2FzZSA5MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldEwpXG4gICAgY2FzZSA5MzogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldFIpXG4gICAgY2FzZSAxMjM6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJyYWNlTClcbiAgICBjYXNlIDEyNTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2VSKVxuICAgIGNhc2UgNTg6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmNvbG9uKVxuXG4gICAgY2FzZSA5NjogLy8gJ2AnXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNikgeyBicmVhayB9XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYmFja1F1b3RlKVxuXG4gICAgY2FzZSA0ODogLy8gJzAnXG4gICAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgICAgaWYgKG5leHQgPT09IDEyMCB8fCBuZXh0ID09PSA4OCkgeyByZXR1cm4gdGhpcy5yZWFkUmFkaXhOdW1iZXIoMTYpIH0gLy8gJzB4JywgJzBYJyAtIGhleCBudW1iZXJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgICBpZiAobmV4dCA9PT0gMTExIHx8IG5leHQgPT09IDc5KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcig4KSB9IC8vICcwbycsICcwTycgLSBvY3RhbCBudW1iZXJcbiAgICAgICAgaWYgKG5leHQgPT09IDk4IHx8IG5leHQgPT09IDY2KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcigyKSB9IC8vICcwYicsICcwQicgLSBiaW5hcnkgbnVtYmVyXG4gICAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGJlZ2lubmluZyB3aXRoIGEgZGlnaXQgaXMgYW4gaW50ZWdlciwgb2N0YWxcbiAgICAvLyBudW1iZXIsIG9yIGZsb2F0LlxuICAgIGNhc2UgNDk6IGNhc2UgNTA6IGNhc2UgNTE6IGNhc2UgNTI6IGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6IGNhc2UgNTc6IC8vIDEtOVxuICAgICAgcmV0dXJuIHRoaXMucmVhZE51bWJlcihmYWxzZSlcblxuICAgIC8vIFF1b3RlcyBwcm9kdWNlIHN0cmluZ3MuXG4gICAgY2FzZSAzNDogY2FzZSAzOTogLy8gJ1wiJywgXCInXCJcbiAgICAgIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoY29kZSlcblxuICAgIC8vIE9wZXJhdG9ycyBhcmUgcGFyc2VkIGlubGluZSBpbiB0aW55IHN0YXRlIG1hY2hpbmVzLiAnPScgKDYxKSBpc1xuICAgIC8vIG9mdGVuIHJlZmVycmVkIHRvLiBgZmluaXNoT3BgIHNpbXBseSBza2lwcyB0aGUgYW1vdW50IG9mXG4gICAgLy8gY2hhcmFjdGVycyBpdCBpcyBnaXZlbiBhcyBzZWNvbmQgYXJndW1lbnQsIGFuZCByZXR1cm5zIGEgdG9rZW5cbiAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9zbGFzaCgpXG5cbiAgICBjYXNlIDM3OiBjYXNlIDQyOiAvLyAnJSonXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fbXVsdF9tb2R1bG9fZXhwKGNvZGUpXG5cbiAgICBjYXNlIDEyNDogY2FzZSAzODogLy8gJ3wmJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BpcGVfYW1wKGNvZGUpXG5cbiAgICBjYXNlIDk0OiAvLyAnXidcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9jYXJldCgpXG5cbiAgICBjYXNlIDQzOiBjYXNlIDQ1OiAvLyAnKy0nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fcGx1c19taW4oY29kZSlcblxuICAgIGNhc2UgNjA6IGNhc2UgNjI6IC8vICc8PidcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9sdF9ndChjb2RlKVxuXG4gICAgY2FzZSA2MTogY2FzZSAzMzogLy8gJz0hJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2VxX2V4Y2woY29kZSlcblxuICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3F1ZXN0aW9uKClcblxuICAgIGNhc2UgMTI2OiAvLyAnfidcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLnByZWZpeCwgMSlcbiAgICB9XG5cbiAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICdcIiArIGNvZGVQb2ludFRvU3RyaW5nJDEoY29kZSkgKyBcIidcIik7XG4gIH07XG5cbiAgcHAkOS5maW5pc2hPcCA9IGZ1bmN0aW9uKHR5cGUsIHNpemUpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplKTtcbiAgICB0aGlzLnBvcyArPSBzaXplO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGUsIHN0cilcbiAgfTtcblxuICBwcCQ5LnJlYWRSZWdleHAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXNjYXBlZCwgaW5DbGFzcywgc3RhcnQgPSB0aGlzLnBvcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uXCIpOyB9XG4gICAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJBdCh0aGlzLnBvcyk7XG4gICAgICBpZiAobGluZUJyZWFrLnRlc3QoY2gpKSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTsgfVxuICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgIGlmIChjaCA9PT0gXCJbXCIpIHsgaW5DbGFzcyA9IHRydWU7IH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09IFwiXVwiICYmIGluQ2xhc3MpIHsgaW5DbGFzcyA9IGZhbHNlOyB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSBcIi9cIiAmJiAhaW5DbGFzcykgeyBicmVhayB9XG4gICAgICAgIGVzY2FwZWQgPSBjaCA9PT0gXCJcXFxcXCI7XG4gICAgICB9IGVsc2UgeyBlc2NhcGVkID0gZmFsc2U7IH1cbiAgICAgICsrdGhpcy5wb3M7XG4gICAgfVxuICAgIHZhciBwYXR0ZXJuID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpO1xuICAgICsrdGhpcy5wb3M7XG4gICAgdmFyIGZsYWdzU3RhcnQgPSB0aGlzLnBvcztcbiAgICB2YXIgZmxhZ3MgPSB0aGlzLnJlYWRXb3JkMSgpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5zRXNjKSB7IHRoaXMudW5leHBlY3RlZChmbGFnc1N0YXJ0KTsgfVxuXG4gICAgLy8gVmFsaWRhdGUgcGF0dGVyblxuICAgIHZhciBzdGF0ZSA9IHRoaXMucmVnZXhwU3RhdGUgfHwgKHRoaXMucmVnZXhwU3RhdGUgPSBuZXcgUmVnRXhwVmFsaWRhdGlvblN0YXRlKHRoaXMpKTtcbiAgICBzdGF0ZS5yZXNldChzdGFydCwgcGF0dGVybiwgZmxhZ3MpO1xuICAgIHRoaXMudmFsaWRhdGVSZWdFeHBGbGFncyhzdGF0ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVJlZ0V4cFBhdHRlcm4oc3RhdGUpO1xuXG4gICAgLy8gQ3JlYXRlIExpdGVyYWwjdmFsdWUgcHJvcGVydHkgdmFsdWUuXG4gICAgdmFyIHZhbHVlID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBFU1RyZWUgcmVxdWlyZXMgbnVsbCBpZiBpdCBmYWlsZWQgdG8gaW5zdGFudGlhdGUgUmVnRXhwIG9iamVjdC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2Jsb2IvYTI3MDAzYWRmNGZkN2JmYWQ0NGRlOWNlZjM3MmEyZWFjZDUyN2IxYy9lczUubWQjcmVnZXhwbGl0ZXJhbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnJlZ2V4cCwge3BhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncywgdmFsdWU6IHZhbHVlfSlcbiAgfTtcblxuICAvLyBSZWFkIGFuIGludGVnZXIgaW4gdGhlIGdpdmVuIHJhZGl4LiBSZXR1cm4gbnVsbCBpZiB6ZXJvIGRpZ2l0c1xuICAvLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuICAvLyB3aWxsIHJldHVybiBgbnVsbGAgdW5sZXNzIHRoZSBpbnRlZ2VyIGhhcyBleGFjdGx5IGBsZW5gIGRpZ2l0cy5cblxuICBwcCQ5LnJlYWRJbnQgPSBmdW5jdGlvbihyYWRpeCwgbGVuLCBtYXliZUxlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHtcbiAgICAvLyBgbGVuYCBpcyB1c2VkIGZvciBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcy4gSW4gdGhhdCBjYXNlLCBkaXNhbGxvdyBzZXBhcmF0b3JzLlxuICAgIHZhciBhbGxvd1NlcGFyYXRvcnMgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTIgJiYgbGVuID09PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBgbWF5YmVMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsYCBpcyB0cnVlIGlmIGl0IGRvZXNuJ3QgaGF2ZSBwcmVmaXggKDB4LDBvLDBiKVxuICAgIC8vIGFuZCBpc24ndCBmcmFjdGlvbiBwYXJ0IG5vciBleHBvbmVudCBwYXJ0LiBJbiB0aGF0IGNhc2UsIGlmIHRoZSBmaXJzdCBkaWdpdFxuICAgIC8vIGlzIHplcm8gdGhlbiBkaXNhbGxvdyBzZXBhcmF0b3JzLlxuICAgIHZhciBpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwgPSBtYXliZUxlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gNDg7XG5cbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcywgdG90YWwgPSAwLCBsYXN0Q29kZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpLCArK3RoaXMucG9zKSB7XG4gICAgICB2YXIgY29kZSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyksIHZhbCA9ICh2b2lkIDApO1xuXG4gICAgICBpZiAoYWxsb3dTZXBhcmF0b3JzICYmIGNvZGUgPT09IDk1KSB7XG4gICAgICAgIGlmIChpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zLCBcIk51bWVyaWMgc2VwYXJhdG9yIGlzIG5vdCBhbGxvd2VkIGluIGxlZ2FjeSBvY3RhbCBudW1lcmljIGxpdGVyYWxzXCIpOyB9XG4gICAgICAgIGlmIChsYXN0Q29kZSA9PT0gOTUpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zLCBcIk51bWVyaWMgc2VwYXJhdG9yIG11c3QgYmUgZXhhY3RseSBvbmUgdW5kZXJzY29yZVwiKTsgfVxuICAgICAgICBpZiAoaSA9PT0gMCkgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5wb3MsIFwiTnVtZXJpYyBzZXBhcmF0b3IgaXMgbm90IGFsbG93ZWQgYXQgdGhlIGZpcnN0IG9mIGRpZ2l0c1wiKTsgfVxuICAgICAgICBsYXN0Q29kZSA9IGNvZGU7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjb2RlID49IDk3KSB7IHZhbCA9IGNvZGUgLSA5NyArIDEwOyB9IC8vIGFcbiAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNjUpIHsgdmFsID0gY29kZSAtIDY1ICsgMTA7IH0gLy8gQVxuICAgICAgZWxzZSBpZiAoY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3KSB7IHZhbCA9IGNvZGUgLSA0ODsgfSAvLyAwLTlcbiAgICAgIGVsc2UgeyB2YWwgPSBJbmZpbml0eTsgfVxuICAgICAgaWYgKHZhbCA+PSByYWRpeCkgeyBicmVhayB9XG4gICAgICBsYXN0Q29kZSA9IGNvZGU7XG4gICAgICB0b3RhbCA9IHRvdGFsICogcmFkaXggKyB2YWw7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93U2VwYXJhdG9ycyAmJiBsYXN0Q29kZSA9PT0gOTUpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zIC0gMSwgXCJOdW1lcmljIHNlcGFyYXRvciBpcyBub3QgYWxsb3dlZCBhdCB0aGUgbGFzdCBvZiBkaWdpdHNcIik7IH1cbiAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRoaXMucG9zIC0gc3RhcnQgIT09IGxlbikgeyByZXR1cm4gbnVsbCB9XG5cbiAgICByZXR1cm4gdG90YWxcbiAgfTtcblxuICBmdW5jdGlvbiBzdHJpbmdUb051bWJlcihzdHIsIGlzTGVnYWN5T2N0YWxOdW1lcmljTGl0ZXJhbCkge1xuICAgIGlmIChpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChzdHIsIDgpXG4gICAgfVxuXG4gICAgLy8gYHBhcnNlRmxvYXQodmFsdWUpYCBzdG9wcyBwYXJzaW5nIGF0IHRoZSBmaXJzdCBudW1lcmljIHNlcGFyYXRvciB0aGVuIHJldHVybnMgYSB3cm9uZyB2YWx1ZS5cbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCBcIlwiKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQmlnSW50KHN0cikge1xuICAgIGlmICh0eXBlb2YgQmlnSW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gYEJpZ0ludCh2YWx1ZSlgIHRocm93cyBzeW50YXggZXJyb3IgaWYgdGhlIHN0cmluZyBjb250YWlucyBudW1lcmljIHNlcGFyYXRvcnMuXG4gICAgcmV0dXJuIEJpZ0ludChzdHIucmVwbGFjZSgvXy9nLCBcIlwiKSlcbiAgfVxuXG4gIHBwJDkucmVhZFJhZGl4TnVtYmVyID0gZnVuY3Rpb24ocmFkaXgpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB0aGlzLnBvcyArPSAyOyAvLyAweFxuICAgIHZhciB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQgKyAyLCBcIkV4cGVjdGVkIG51bWJlciBpbiByYWRpeCBcIiArIHJhZGl4KTsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gMTEwKSB7XG4gICAgICB2YWwgPSBzdHJpbmdUb0JpZ0ludCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpO1xuICAgICAgKyt0aGlzLnBvcztcbiAgICB9IGVsc2UgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSkpIHsgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLm51bSwgdmFsKVxuICB9O1xuXG4gIC8vIFJlYWQgYW4gaW50ZWdlciwgb2N0YWwgaW50ZWdlciwgb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuXG4gIHBwJDkucmVhZE51bWJlciA9IGZ1bmN0aW9uKHN0YXJ0c1dpdGhEb3QpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICBpZiAoIXN0YXJ0c1dpdGhEb3QgJiYgdGhpcy5yZWFkSW50KDEwLCB1bmRlZmluZWQsIHRydWUpID09PSBudWxsKSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgICB2YXIgb2N0YWwgPSB0aGlzLnBvcyAtIHN0YXJ0ID49IDIgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gNDg7XG4gICAgaWYgKG9jdGFsICYmIHRoaXMuc3RyaWN0KSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgaWYgKCFvY3RhbCAmJiAhc3RhcnRzV2l0aERvdCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgJiYgbmV4dCA9PT0gMTEwKSB7XG4gICAgICB2YXIgdmFsJDEgPSBzdHJpbmdUb0JpZ0ludCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpO1xuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIGlmIChpc0lkZW50aWZpZXJTdGFydCh0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpKSB7IHRoaXMucmFpc2UodGhpcy5wb3MsIFwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXJcIik7IH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLm51bSwgdmFsJDEpXG4gICAgfVxuICAgIGlmIChvY3RhbCAmJiAvWzg5XS8udGVzdCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpKSB7IG9jdGFsID0gZmFsc2U7IH1cbiAgICBpZiAobmV4dCA9PT0gNDYgJiYgIW9jdGFsKSB7IC8vICcuJ1xuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIHRoaXMucmVhZEludCgxMCk7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICB9XG4gICAgaWYgKChuZXh0ID09PSA2OSB8fCBuZXh0ID09PSAxMDEpICYmICFvY3RhbCkgeyAvLyAnZUUnXG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpO1xuICAgICAgaWYgKG5leHQgPT09IDQzIHx8IG5leHQgPT09IDQ1KSB7ICsrdGhpcy5wb3M7IH0gLy8gJystJ1xuICAgICAgaWYgKHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJJbnZhbGlkIG51bWJlclwiKTsgfVxuICAgIH1cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIklkZW50aWZpZXIgZGlyZWN0bHkgYWZ0ZXIgbnVtYmVyXCIpOyB9XG5cbiAgICB2YXIgdmFsID0gc3RyaW5nVG9OdW1iZXIodGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpLCBvY3RhbCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMubnVtLCB2YWwpXG4gIH07XG5cbiAgLy8gUmVhZCBhIHN0cmluZyB2YWx1ZSwgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaC1lc2NhcGVzLlxuXG4gIHBwJDkucmVhZENvZGVQb2ludCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyksIGNvZGU7XG5cbiAgICBpZiAoY2ggPT09IDEyMykgeyAvLyAneydcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICB2YXIgY29kZVBvcyA9ICsrdGhpcy5wb3M7XG4gICAgICBjb2RlID0gdGhpcy5yZWFkSGV4Q2hhcih0aGlzLmlucHV0LmluZGV4T2YoXCJ9XCIsIHRoaXMucG9zKSAtIHRoaXMucG9zKTtcbiAgICAgICsrdGhpcy5wb3M7XG4gICAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB7IHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKGNvZGVQb3MsIFwiQ29kZSBwb2ludCBvdXQgb2YgYm91bmRzXCIpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKDQpO1xuICAgIH1cbiAgICByZXR1cm4gY29kZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvZGVQb2ludFRvU3RyaW5nJDEoY29kZSkge1xuICAgIC8vIFVURi0xNiBEZWNvZGluZ1xuICAgIGlmIChjb2RlIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSB9XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4RDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4REMwMClcbiAgfVxuXG4gIHBwJDkucmVhZFN0cmluZyA9IGZ1bmN0aW9uKHF1b3RlKSB7XG4gICAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSArK3RoaXMucG9zO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHsgYnJlYWsgfVxuICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXFwnXG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgb3V0ICs9IHRoaXMucmVhZEVzY2FwZWRDaGFyKGZhbHNlKTtcbiAgICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzTmV3TGluZShjaCwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDEwKSkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcysrKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5zdHJpbmcsIG91dClcbiAgfTtcblxuICAvLyBSZWFkcyB0ZW1wbGF0ZSBzdHJpbmcgdG9rZW5zLlxuXG4gIHZhciBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUiA9IHt9O1xuXG4gIHBwJDkudHJ5UmVhZFRlbXBsYXRlVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluVGVtcGxhdGVFbGVtZW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWFkVG1wbFRva2VuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyID09PSBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUikge1xuICAgICAgICB0aGlzLnJlYWRJbnZhbGlkVGVtcGxhdGVUb2tlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pblRlbXBsYXRlRWxlbWVudCA9IGZhbHNlO1xuICB9O1xuXG4gIHBwJDkuaW52YWxpZFN0cmluZ1Rva2VuID0gZnVuY3Rpb24ocG9zaXRpb24sIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5pblRlbXBsYXRlRWxlbWVudCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgdGhyb3cgSU5WQUxJRF9URU1QTEFURV9FU0NBUEVfRVJST1JcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yYWlzZShwb3NpdGlvbiwgbWVzc2FnZSk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDkucmVhZFRtcGxUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBcIlwiLCBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7IH1cbiAgICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgICBpZiAoY2ggPT09IDk2IHx8IGNoID09PSAzNiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTIzKSB7IC8vICdgJywgJyR7J1xuICAgICAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMuc3RhcnQgJiYgKHRoaXMudHlwZSA9PT0gdHlwZXMudGVtcGxhdGUgfHwgdGhpcy50eXBlID09PSB0eXBlcy5pbnZhbGlkVGVtcGxhdGUpKSB7XG4gICAgICAgICAgaWYgKGNoID09PSAzNikge1xuICAgICAgICAgICAgdGhpcy5wb3MgKz0gMjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmRvbGxhckJyYWNlTClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJhY2tRdW90ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy50ZW1wbGF0ZSwgb3V0KVxuICAgICAgfVxuICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXFwnXG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgb3V0ICs9IHRoaXMucmVhZEVzY2FwZWRDaGFyKHRydWUpO1xuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICB9IGVsc2UgaWYgKGlzTmV3TGluZShjaCkpIHtcbiAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7ICsrdGhpcy5wb3M7IH1cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBvdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgfVxuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZWFkcyBhIHRlbXBsYXRlIHRva2VuIHRvIHNlYXJjaCBmb3IgdGhlIGVuZCwgd2l0aG91dCB2YWxpZGF0aW5nIGFueSBlc2NhcGUgc2VxdWVuY2VzXG4gIHBwJDkucmVhZEludmFsaWRUZW1wbGF0ZVRva2VuID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICg7IHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGg7IHRoaXMucG9zKyspIHtcbiAgICAgIHN3aXRjaCAodGhpcy5pbnB1dFt0aGlzLnBvc10pIHtcbiAgICAgIGNhc2UgXCJcXFxcXCI6XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCIkXCI6XG4gICAgICAgIGlmICh0aGlzLmlucHV0W3RoaXMucG9zICsgMV0gIT09IFwie1wiKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiYFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5pbnZhbGlkVGVtcGxhdGUsIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpKVxuXG4gICAgICAvLyBubyBkZWZhdWx0XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7XG4gIH07XG5cbiAgLy8gVXNlZCB0byByZWFkIGVzY2FwZWQgY2hhcmFjdGVyc1xuXG4gIHBwJDkucmVhZEVzY2FwZWRDaGFyID0gZnVuY3Rpb24oaW5UZW1wbGF0ZSkge1xuICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMucG9zKTtcbiAgICArK3RoaXMucG9zO1xuICAgIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIDExMDogcmV0dXJuIFwiXFxuXCIgLy8gJ24nIC0+ICdcXG4nXG4gICAgY2FzZSAxMTQ6IHJldHVybiBcIlxcclwiIC8vICdyJyAtPiAnXFxyJ1xuICAgIGNhc2UgMTIwOiByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRIZXhDaGFyKDIpKSAvLyAneCdcbiAgICBjYXNlIDExNzogcmV0dXJuIGNvZGVQb2ludFRvU3RyaW5nJDEodGhpcy5yZWFkQ29kZVBvaW50KCkpIC8vICd1J1xuICAgIGNhc2UgMTE2OiByZXR1cm4gXCJcXHRcIiAvLyAndCcgLT4gJ1xcdCdcbiAgICBjYXNlIDk4OiByZXR1cm4gXCJcXGJcIiAvLyAnYicgLT4gJ1xcYidcbiAgICBjYXNlIDExODogcmV0dXJuIFwiXFx1MDAwYlwiIC8vICd2JyAtPiAnXFx1MDAwYidcbiAgICBjYXNlIDEwMjogcmV0dXJuIFwiXFxmXCIgLy8gJ2YnIC0+ICdcXGYnXG4gICAgY2FzZSAxMzogaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7ICsrdGhpcy5wb3M7IH0gLy8gJ1xcclxcbidcbiAgICBjYXNlIDEwOiAvLyAnIFxcbidcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7IHRoaXMubGluZVN0YXJ0ID0gdGhpcy5wb3M7ICsrdGhpcy5jdXJMaW5lOyB9XG4gICAgICByZXR1cm4gXCJcIlxuICAgIGNhc2UgNTY6XG4gICAgY2FzZSA1NzpcbiAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBjb2RlUG9zID0gdGhpcy5wb3MgLSAxO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKFxuICAgICAgICAgIGNvZGVQb3MsXG4gICAgICAgICAgXCJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiB0ZW1wbGF0ZSBzdHJpbmdcIlxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaCA+PSA0OCAmJiBjaCA8PSA1NSkge1xuICAgICAgICB2YXIgb2N0YWxTdHIgPSB0aGlzLmlucHV0LnN1YnN0cih0aGlzLnBvcyAtIDEsIDMpLm1hdGNoKC9eWzAtN10rLylbMF07XG4gICAgICAgIHZhciBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgICAgaWYgKG9jdGFsID4gMjU1KSB7XG4gICAgICAgICAgb2N0YWxTdHIgPSBvY3RhbFN0ci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gb2N0YWxTdHIubGVuZ3RoIC0gMTtcbiAgICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoKG9jdGFsU3RyICE9PSBcIjBcIiB8fCBjaCA9PT0gNTYgfHwgY2ggPT09IDU3KSAmJiAodGhpcy5zdHJpY3QgfHwgaW5UZW1wbGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLmludmFsaWRTdHJpbmdUb2tlbihcbiAgICAgICAgICAgIHRoaXMucG9zIC0gMSAtIG9jdGFsU3RyLmxlbmd0aCxcbiAgICAgICAgICAgIGluVGVtcGxhdGVcbiAgICAgICAgICAgICAgPyBcIk9jdGFsIGxpdGVyYWwgaW4gdGVtcGxhdGUgc3RyaW5nXCJcbiAgICAgICAgICAgICAgOiBcIk9jdGFsIGxpdGVyYWwgaW4gc3RyaWN0IG1vZGVcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2N0YWwpXG4gICAgICB9XG4gICAgICBpZiAoaXNOZXdMaW5lKGNoKSkge1xuICAgICAgICAvLyBVbmljb2RlIG5ldyBsaW5lIGNoYXJhY3RlcnMgYWZ0ZXIgXFwgZ2V0IHJlbW92ZWQgZnJvbSBvdXRwdXQgaW4gYm90aFxuICAgICAgICAvLyB0ZW1wbGF0ZSBsaXRlcmFscyBhbmQgc3RyaW5nc1xuICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpXG4gICAgfVxuICB9O1xuXG4gIC8vIFVzZWQgdG8gcmVhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyAoJ1xceCcsICdcXHUnLCAnXFxVJykuXG5cbiAgcHAkOS5yZWFkSGV4Q2hhciA9IGZ1bmN0aW9uKGxlbikge1xuICAgIHZhciBjb2RlUG9zID0gdGhpcy5wb3M7XG4gICAgdmFyIG4gPSB0aGlzLnJlYWRJbnQoMTYsIGxlbik7XG4gICAgaWYgKG4gPT09IG51bGwpIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oY29kZVBvcywgXCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZVwiKTsgfVxuICAgIHJldHVybiBuXG4gIH07XG5cbiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiBTZXRzIGB0aGlzLmNvbnRhaW5zRXNjYFxuICAvLyB0byB3aGV0aGVyIHRoZSB3b3JkIGNvbnRhaW5lZCBhICdcXHUnIGVzY2FwZS5cbiAgLy9cbiAgLy8gSW5jcmVtZW50YWxseSBhZGRzIG9ubHkgZXNjYXBlZCBjaGFycywgYWRkaW5nIG90aGVyIGNodW5rcyBhcy1pc1xuICAvLyBhcyBhIG1pY3JvLW9wdGltaXphdGlvbi5cblxuICBwcCQ5LnJlYWRXb3JkMSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgICB2YXIgd29yZCA9IFwiXCIsIGZpcnN0ID0gdHJ1ZSwgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgIHZhciBhc3RyYWwgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gdGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpO1xuICAgICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gsIGFzdHJhbCkpIHtcbiAgICAgICAgdGhpcy5wb3MgKz0gY2ggPD0gMHhmZmZmID8gMSA6IDI7XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSA5MikgeyAvLyBcIlxcXCJcbiAgICAgICAgdGhpcy5jb250YWluc0VzYyA9IHRydWU7XG4gICAgICAgIHdvcmQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICAgIHZhciBlc2NTdGFydCA9IHRoaXMucG9zO1xuICAgICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpICE9PSAxMTcpIC8vIFwidVwiXG4gICAgICAgICAgeyB0aGlzLmludmFsaWRTdHJpbmdUb2tlbih0aGlzLnBvcywgXCJFeHBlY3RpbmcgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgXFxcXHVYWFhYXCIpOyB9XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIHZhciBlc2MgPSB0aGlzLnJlYWRDb2RlUG9pbnQoKTtcbiAgICAgICAgaWYgKCEoZmlyc3QgPyBpc0lkZW50aWZpZXJTdGFydCA6IGlzSWRlbnRpZmllckNoYXIpKGVzYywgYXN0cmFsKSlcbiAgICAgICAgICB7IHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKGVzY1N0YXJ0LCBcIkludmFsaWQgVW5pY29kZSBlc2NhcGVcIik7IH1cbiAgICAgICAgd29yZCArPSBjb2RlUG9pbnRUb1N0cmluZyQxKGVzYyk7XG4gICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBmaXJzdCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gd29yZCArIHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpXG4gIH07XG5cbiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQgdG9rZW4uIFdpbGwgY2hlY2sgZm9yIHJlc2VydmVkXG4gIC8vIHdvcmRzIHdoZW4gbmVjZXNzYXJ5LlxuXG4gIHBwJDkucmVhZFdvcmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgd29yZCA9IHRoaXMucmVhZFdvcmQxKCk7XG4gICAgdmFyIHR5cGUgPSB0eXBlcy5uYW1lO1xuICAgIGlmICh0aGlzLmtleXdvcmRzLnRlc3Qod29yZCkpIHtcbiAgICAgIHR5cGUgPSBrZXl3b3JkcyQxW3dvcmRdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlLCB3b3JkKVxuICB9O1xuXG4gIC8vIEFjb3JuIGlzIGEgdGlueSwgZmFzdCBKYXZhU2NyaXB0IHBhcnNlciB3cml0dGVuIGluIEphdmFTY3JpcHQuXG5cbiAgdmFyIHZlcnNpb24gPSBcIjcuNC4xXCI7XG5cbiAgUGFyc2VyLmFjb3JuID0ge1xuICAgIFBhcnNlcjogUGFyc2VyLFxuICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgZGVmYXVsdE9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICAgIFBvc2l0aW9uOiBQb3NpdGlvbixcbiAgICBTb3VyY2VMb2NhdGlvbjogU291cmNlTG9jYXRpb24sXG4gICAgZ2V0TGluZUluZm86IGdldExpbmVJbmZvLFxuICAgIE5vZGU6IE5vZGUsXG4gICAgVG9rZW5UeXBlOiBUb2tlblR5cGUsXG4gICAgdG9rVHlwZXM6IHR5cGVzLFxuICAgIGtleXdvcmRUeXBlczoga2V5d29yZHMkMSxcbiAgICBUb2tDb250ZXh0OiBUb2tDb250ZXh0LFxuICAgIHRva0NvbnRleHRzOiB0eXBlcyQxLFxuICAgIGlzSWRlbnRpZmllckNoYXI6IGlzSWRlbnRpZmllckNoYXIsXG4gICAgaXNJZGVudGlmaWVyU3RhcnQ6IGlzSWRlbnRpZmllclN0YXJ0LFxuICAgIFRva2VuOiBUb2tlbixcbiAgICBpc05ld0xpbmU6IGlzTmV3TGluZSxcbiAgICBsaW5lQnJlYWs6IGxpbmVCcmVhayxcbiAgICBsaW5lQnJlYWtHOiBsaW5lQnJlYWtHLFxuICAgIG5vbkFTQ0lJd2hpdGVzcGFjZTogbm9uQVNDSUl3aGl0ZXNwYWNlXG4gIH07XG5cbiAgLy8gVGhlIG1haW4gZXhwb3J0ZWQgaW50ZXJmYWNlICh1bmRlciBgc2VsZi5hY29ybmAgd2hlbiBpbiB0aGVcbiAgLy8gYnJvd3NlcikgaXMgYSBgcGFyc2VgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb2RlIHN0cmluZyBhbmRcbiAgLy8gcmV0dXJucyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBhcyBzcGVjaWZpZWQgYnkgW01vemlsbGEgcGFyc2VyXG4gIC8vIEFQSV1bYXBpXS5cbiAgLy9cbiAgLy8gW2FwaV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvU3BpZGVyTW9ua2V5L1BhcnNlcl9BUElcblxuICBmdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBQYXJzZXIucGFyc2UoaW5wdXQsIG9wdGlvbnMpXG4gIH1cblxuICAvLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHBhcnNlIGEgc2luZ2xlIGV4cHJlc3Npb24gYXQgYSBnaXZlblxuICAvLyBvZmZzZXQgaW4gYSBzdHJpbmcuIFVzZWZ1bCBmb3IgcGFyc2luZyBtaXhlZC1sYW5ndWFnZSBmb3JtYXRzXG4gIC8vIHRoYXQgZW1iZWQgSmF2YVNjcmlwdCBleHByZXNzaW9ucy5cblxuICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFBhcnNlci5wYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gQWNvcm4gaXMgb3JnYW5pemVkIGFzIGEgdG9rZW5pemVyIGFuZCBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlci5cbiAgLy8gVGhlIGB0b2tlbml6ZXJgIGV4cG9ydCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci5cblxuICBmdW5jdGlvbiB0b2tlbml6ZXIoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gUGFyc2VyLnRva2VuaXplcihpbnB1dCwgb3B0aW9ucylcbiAgfVxuXG4gIGV4cG9ydHMuTm9kZSA9IE5vZGU7XG4gIGV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuICBleHBvcnRzLlBvc2l0aW9uID0gUG9zaXRpb247XG4gIGV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjtcbiAgZXhwb3J0cy5Ub2tDb250ZXh0ID0gVG9rQ29udGV4dDtcbiAgZXhwb3J0cy5Ub2tlbiA9IFRva2VuO1xuICBleHBvcnRzLlRva2VuVHlwZSA9IFRva2VuVHlwZTtcbiAgZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICBleHBvcnRzLmdldExpbmVJbmZvID0gZ2V0TGluZUluZm87XG4gIGV4cG9ydHMuaXNJZGVudGlmaWVyQ2hhciA9IGlzSWRlbnRpZmllckNoYXI7XG4gIGV4cG9ydHMuaXNJZGVudGlmaWVyU3RhcnQgPSBpc0lkZW50aWZpZXJTdGFydDtcbiAgZXhwb3J0cy5pc05ld0xpbmUgPSBpc05ld0xpbmU7XG4gIGV4cG9ydHMua2V5d29yZFR5cGVzID0ga2V5d29yZHMkMTtcbiAgZXhwb3J0cy5saW5lQnJlYWsgPSBsaW5lQnJlYWs7XG4gIGV4cG9ydHMubGluZUJyZWFrRyA9IGxpbmVCcmVha0c7XG4gIGV4cG9ydHMubm9uQVNDSUl3aGl0ZXNwYWNlID0gbm9uQVNDSUl3aGl0ZXNwYWNlO1xuICBleHBvcnRzLnBhcnNlID0gcGFyc2U7XG4gIGV4cG9ydHMucGFyc2VFeHByZXNzaW9uQXQgPSBwYXJzZUV4cHJlc3Npb25BdDtcbiAgZXhwb3J0cy50b2tDb250ZXh0cyA9IHR5cGVzJDE7XG4gIGV4cG9ydHMudG9rVHlwZXMgPSB0eXBlcztcbiAgZXhwb3J0cy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7XG4gIGV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsICIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGFjb3JuID0gcmVxdWlyZSgnYWNvcm4nKTtcbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFeHByZXNzaW9uO1xuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICB0aHJvdzogZmFsc2UsXG4gIHN0cmljdDogZmFsc2UsXG4gIGxpbmVDb21tZW50OiBmYWxzZVxufTtcblxuZnVuY3Rpb24gaXNFeHByZXNzaW9uKHNyYywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb2JqZWN0QXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBhY29ybi5QYXJzZXIob3B0aW9ucywgc3JjLCAwKTtcblxuICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuICAgICAgcGFyc2VyLnN0cmljdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmxpbmVDb21tZW50KSB7XG4gICAgICBwYXJzZXIuc2tpcExpbmVDb21tZW50ID0gZnVuY3Rpb24gKHN0YXJ0U2tpcCkge1xuICAgICAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCAnTGluZSBjb21tZW50cyBub3QgYWxsb3dlZCBpbiBhbiBleHByZXNzaW9uJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAocGFyc2VyLnR5cGUgIT09IGFjb3JuLnRva1R5cGVzLmVvZikge1xuICAgICAgcGFyc2VyLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgaWYgKCFvcHRpb25zLnRocm93KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhyb3cgZXg7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb28gJiYgISh7IF9fcHJvdG9fXzogbnVsbCB9IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIGhhc1Byb3RvID0gcmVxdWlyZSgnaGFzLXByb3RvJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IChcblx0aGFzUHJvdG9cblx0XHQ/IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cdFx0OiBudWxsXG4pO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG5cbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7IC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcblx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHN0cmluZywgMCwgMSk7XG5cdHZhciBsYXN0ID0gJHN0clNsaWNlKHN0cmluZywgLTEpO1xuXHRpZiAoZmlyc3QgPT09ICclJyAmJiBsYXN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgJyk7XG5cdH0gZWxzZSBpZiAobGFzdCA9PT0gJyUnICYmIGZpcnN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgJyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9IFtdO1xuXHQkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpY05hbWUgPSBuYW1lO1xuXHR2YXIgYWxpYXM7XG5cdGlmIChoYXNPd24oTEVHQUNZX0FMSUFTRVMsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0YWxpYXMgPSBMRUdBQ1lfQUxJQVNFU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpbnRyaW5zaWNOYW1lID0gJyUnICsgYWxpYXNbMF0gKyAnJSc7XG5cdH1cblxuXHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0dmFyIHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IG5lZWRzRXZhbCkge1xuXHRcdFx0dmFsdWUgPSBkb0V2YWwoaW50cmluc2ljTmFtZSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRuYW1lOiBpbnRyaW5zaWNOYW1lLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxuXG5cdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0aWYgKCRleGVjKC9eJT9bXiVdKiU/JC8sIG5hbWUpID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZScpO1xuXHR9XG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHQkZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyB2YWx1ZTogMSB9KTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGRlZmluZVByb3BlcnR5XG5cdFx0JGRlZmluZVByb3BlcnR5ID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRpZiAoJGdPUEQgJiYgJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dmFyIGRlc2MgPSAkZ09QRChmdW5jLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHQvLyBvcmlnaW5hbCBsZW5ndGgsIHBsdXMgdGhlIHJlY2VpdmVyLCBtaW51cyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgKGFmdGVyIHRoZSByZWNlaXZlcilcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZnVuYyxcblx0XHRcdFx0J2xlbmd0aCcsXG5cdFx0XHRcdHsgdmFsdWU6IDEgKyAkbWF4KDAsIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSkgfVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZ1bmM7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzVG9TdHJpbmdUYWdTaGFtcygpIHtcblx0cmV0dXJuIGhhc1N5bWJvbHMoKSAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBoYXM7XG52YXIgJGV4ZWM7XG52YXIgaXNSZWdleE1hcmtlcjtcbnZhciBiYWRTdHJpbmdpZmllcjtcblxuaWYgKGhhc1RvU3RyaW5nVGFnKSB7XG5cdGhhcyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eScpO1xuXHQkZXhlYyA9IGNhbGxCb3VuZCgnUmVnRXhwLnByb3RvdHlwZS5leGVjJyk7XG5cdGlzUmVnZXhNYXJrZXIgPSB7fTtcblxuXHR2YXIgdGhyb3dSZWdleE1hcmtlciA9IGZ1bmN0aW9uICgpIHtcblx0XHR0aHJvdyBpc1JlZ2V4TWFya2VyO1xuXHR9O1xuXHRiYWRTdHJpbmdpZmllciA9IHtcblx0XHR0b1N0cmluZzogdGhyb3dSZWdleE1hcmtlcixcblx0XHR2YWx1ZU9mOiB0aHJvd1JlZ2V4TWFya2VyXG5cdH07XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgPT09ICdzeW1ib2wnKSB7XG5cdFx0YmFkU3RyaW5naWZpZXJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHRocm93UmVnZXhNYXJrZXI7XG5cdH1cbn1cblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcblxubW9kdWxlLmV4cG9ydHMgPSBoYXNUb1N0cmluZ1RhZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0PyBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHZhbHVlLCAnbGFzdEluZGV4Jyk7XG5cdFx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRcdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdCRleGVjKHZhbHVlLCBiYWRTdHJpbmdpZmllcik7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGUgPT09IGlzUmVnZXhNYXJrZXI7XG5cdFx0fVxuXHR9XG5cdDogZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdC8vIEluIG9sZGVyIGJyb3dzZXJzLCB0eXBlb2YgcmVnZXggaW5jb3JyZWN0bHkgcmV0dXJucyAnZnVuY3Rpb24nXG5cdFx0aWYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqSXNSZWdleCA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG5cbmV4cG9ydHMgPSAobW9kdWxlLmV4cG9ydHMgPSBwYXJzZSk7XG5cbnZhciBUT0tFTl9UWVBFUyA9IGV4cG9ydHMuVE9LRU5fVFlQRVMgPSB7XG4gIExJTkVfQ09NTUVOVDogJy8vJyxcbiAgQkxPQ0tfQ09NTUVOVDogJy8qKi8nLFxuICBTSU5HTEVfUVVPVEU6ICdcXCcnLFxuICBET1VCTEVfUVVPVEU6ICdcIicsXG4gIFRFTVBMQVRFX1FVT1RFOiAnYCcsXG4gIFJFR0VYUDogJy8vZydcbn1cblxudmFyIEJSQUNLRVRTID0gZXhwb3J0cy5CUkFDS0VUUyA9IHtcbiAgJygnOiAnKScsXG4gICd7JzogJ30nLFxuICAnWyc6ICddJ1xufTtcbnZhciBCUkFDS0VUU19SRVZFUlNFRCA9IHtcbiAgJyknOiAnKCcsXG4gICd9JzogJ3snLFxuICAnXSc6ICdbJ1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2Uoc3JjLCBzdGF0ZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgc3RhdGUgPSBzdGF0ZSB8fCBleHBvcnRzLmRlZmF1bHRTdGF0ZSgpO1xuICB2YXIgc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZCB8fCBzcmMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBzdGFydDtcbiAgd2hpbGUgKGluZGV4IDwgZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlQ2hhcihzcmNbaW5kZXhdLCBzdGF0ZSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGV4LmluZGV4ID0gaW5kZXg7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydHMucGFyc2VVbnRpbCA9IHBhcnNlVW50aWw7XG5mdW5jdGlvbiBwYXJzZVVudGlsKHNyYywgZGVsaW1pdGVyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHZhciBpbmRleCA9IHN0YXJ0O1xuICB2YXIgc3RhdGUgPSBleHBvcnRzLmRlZmF1bHRTdGF0ZSgpO1xuICB3aGlsZSAoaW5kZXggPCBzcmMubGVuZ3RoKSB7XG4gICAgaWYgKChvcHRpb25zLmlnbm9yZU5lc3RpbmcgfHwgIXN0YXRlLmlzTmVzdGluZyhvcHRpb25zKSkgJiYgbWF0Y2hlcyhzcmMsIGRlbGltaXRlciwgaW5kZXgpKSB7XG4gICAgICB2YXIgZW5kID0gaW5kZXg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgIGVuZDogZW5kLFxuICAgICAgICBzcmM6IHNyYy5zdWJzdHJpbmcoc3RhcnQsIGVuZClcbiAgICAgIH07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBwYXJzZUNoYXIoc3JjW2luZGV4XSwgc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBleC5pbmRleCA9IGluZGV4O1xuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICAgIGluZGV4Kys7XG4gIH1cbiAgdmFyIGVyciA9IG5ldyBFcnJvcignVGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdhcyByZWFjaGVkIHdpdGggbm8gY2xvc2luZyBicmFja2V0IGZvdW5kLicpO1xuICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCc7XG4gIGVyci5pbmRleCA9IGluZGV4O1xuICB0aHJvdyBlcnI7XG59XG5cbmV4cG9ydHMucGFyc2VDaGFyID0gcGFyc2VDaGFyO1xuZnVuY3Rpb24gcGFyc2VDaGFyKGNoYXJhY3Rlciwgc3RhdGUpIHtcbiAgaWYgKGNoYXJhY3Rlci5sZW5ndGggIT09IDEpIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdDaGFyYWN0ZXIgbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMScpO1xuICAgIGVyci5uYW1lID0gJ0ludmFsaWRBcmd1bWVudEVycm9yJztcbiAgICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOkNIQVJfTEVOR1RIX05PVF9PTkUnO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBzdGF0ZSA9IHN0YXRlIHx8IGV4cG9ydHMuZGVmYXVsdFN0YXRlKCk7XG4gIHN0YXRlLnNyYyArPSBjaGFyYWN0ZXI7XG4gIHZhciB3YXNDb21tZW50ID0gc3RhdGUuaXNDb21tZW50KCk7XG4gIHZhciBsYXN0Q2hhciA9IHN0YXRlLmhpc3RvcnkgPyBzdGF0ZS5oaXN0b3J5WzBdIDogJyc7XG5cblxuICBpZiAoc3RhdGUucmVnZXhwU3RhcnQpIHtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnLycgfHwgY2hhcmFjdGVyID09ICcqJykge1xuICAgICAgc3RhdGUuc3RhY2sucG9wKCk7XG4gICAgfVxuICAgIHN0YXRlLnJlZ2V4cFN0YXJ0ID0gZmFsc2U7XG4gIH1cbiAgc3dpdGNoIChzdGF0ZS5jdXJyZW50KCkpIHtcbiAgICBjYXNlIFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVDpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBUT0tFTl9UWVBFUy5CTE9DS19DT01NRU5UOlxuICAgICAgaWYgKHN0YXRlLmxhc3RDaGFyID09PSAnKicgJiYgY2hhcmFjdGVyID09PSAnLycpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucG9wKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlNJTkdMRV9RVU9URTpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXCcnICYmICFzdGF0ZS5lc2NhcGVkKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVE9LRU5fVFlQRVMuRE9VQkxFX1FVT1RFOlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1wiJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlRFTVBMQVRFX1FVT1RFOlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ2AnICYmICFzdGF0ZS5lc2NhcGVkKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgICBzdGF0ZS5oYXNEb2xsYXIgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLmhhc0RvbGxhciA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICckJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5oYXNEb2xsYXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICd7JyAmJiBzdGF0ZS5oYXNEb2xsYXIpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChCUkFDS0VUU1tjaGFyYWN0ZXJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaGFzRG9sbGFyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlJFR0VYUDpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICcvJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKGNoYXJhY3RlciBpbiBCUkFDS0VUUykge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKEJSQUNLRVRTW2NoYXJhY3Rlcl0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgaW4gQlJBQ0tFVFNfUkVWRVJTRUQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmN1cnJlbnQoKSAhPT0gY2hhcmFjdGVyKSB7XG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBTeW50YXhFcnJvcignTWlzbWF0Y2hlZCBCcmFja2V0OiAnICsgY2hhcmFjdGVyKTtcbiAgICAgICAgICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOk1JU01BVENIRURfQlJBQ0tFVCc7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9O1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAobGFzdENoYXIgPT09ICcvJyAmJiBjaGFyYWN0ZXIgPT09ICcvJykge1xuICAgICAgICAvLyBEb24ndCBpbmNsdWRlIGNvbW1lbnRzIGluIGhpc3RvcnlcbiAgICAgICAgc3RhdGUuaGlzdG9yeSA9IHN0YXRlLmhpc3Rvcnkuc3Vic3RyKDEpO1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVCk7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RDaGFyID09PSAnLycgJiYgY2hhcmFjdGVyID09PSAnKicpIHtcbiAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBjb21tZW50IGluIGhpc3RvcnlcbiAgICAgICAgc3RhdGUuaGlzdG9yeSA9IHN0YXRlLmhpc3Rvcnkuc3Vic3RyKDEpO1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLkJMT0NLX0NPTU1FTlQpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcvJyAmJiBpc1JlZ2V4cChzdGF0ZS5oaXN0b3J5KSkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLlJFR0VYUCk7XG4gICAgICAgIC8vIE4uQi4gaWYgdGhlIG5leHQgY2hhcmFjdGVyIHR1cm5zIG91dCB0byBiZSBhIGAqYCBvciBhIGAvYFxuICAgICAgICAvLyAgICAgIHRoZW4gdGhpcyBpc24ndCBhY3R1YWxseSBhIHJlZ2V4cFxuICAgICAgICBzdGF0ZS5yZWdleHBTdGFydCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJ1xcJycpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChUT0tFTl9UWVBFUy5TSU5HTEVfUVVPVEUpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChUT0tFTl9UWVBFUy5ET1VCTEVfUVVPVEUpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdgJykge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLlRFTVBMQVRFX1FVT1RFKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmICghc3RhdGUuaXNDb21tZW50KCkgJiYgIXdhc0NvbW1lbnQpIHtcbiAgICBzdGF0ZS5oaXN0b3J5ID0gY2hhcmFjdGVyICsgc3RhdGUuaGlzdG9yeTtcbiAgfVxuICBzdGF0ZS5sYXN0Q2hhciA9IGNoYXJhY3RlcjsgLy8gc3RvcmUgbGFzdCBjaGFyYWN0ZXIgZm9yIGVuZGluZyBibG9jayBjb21tZW50c1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydHMuZGVmYXVsdFN0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN0YXRlKCkgfTtcbmZ1bmN0aW9uIFN0YXRlKCkge1xuICB0aGlzLnN0YWNrID0gW107XG5cbiAgdGhpcy5yZWdleHBTdGFydCA9IGZhbHNlO1xuICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcbiAgdGhpcy5oYXNEb2xsYXIgPSBmYWxzZTtcblxuICB0aGlzLnNyYyA9ICcnO1xuICB0aGlzLmhpc3RvcnkgPSAnJ1xuICB0aGlzLmxhc3RDaGFyID0gJydcbn1cblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xufTtcblN0YXRlLnByb3RvdHlwZS5pc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLmN1cnJlbnQoKSA9PT0gVE9LRU5fVFlQRVMuU0lOR0xFX1FVT1RFIHx8XG4gICAgdGhpcy5jdXJyZW50KCkgPT09IFRPS0VOX1RZUEVTLkRPVUJMRV9RVU9URSB8fFxuICAgIHRoaXMuY3VycmVudCgpID09PSBUT0tFTl9UWVBFUy5URU1QTEFURV9RVU9URVxuICApO1xufVxuU3RhdGUucHJvdG90eXBlLmlzQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VycmVudCgpID09PSBUT0tFTl9UWVBFUy5MSU5FX0NPTU1FTlQgfHwgdGhpcy5jdXJyZW50KCkgPT09IFRPS0VOX1RZUEVTLkJMT0NLX0NPTU1FTlQ7XG59XG5TdGF0ZS5wcm90b3R5cGUuaXNOZXN0aW5nID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYgKFxuICAgIG9wdHMgJiYgb3B0cy5pZ25vcmVMaW5lQ29tbWVudCAmJlxuICAgIHRoaXMuc3RhY2subGVuZ3RoID09PSAxICYmIHRoaXMuc3RhY2tbMF0gPT09IFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVFxuICApIHtcbiAgICAvLyBpZiB3ZSBhcmUgb25seSBpbnNpZGUgYSBsaW5lIGNvbW1lbnQsIGFuZCBsaW5lIGNvbW1lbnRzIGFyZSBpZ25vcmVkXG4gICAgLy8gZG9uJ3QgY291bnQgaXQgYXMgbmVzdGluZ1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gISF0aGlzLnN0YWNrLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyhzdHIsIG1hdGNoZXIsIGkpIHtcbiAgaWYgKG9iaklzUmVnZXgobWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci50ZXN0KHN0ci5zdWJzdHIoaSB8fCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoaSB8fCAwLCBtYXRjaGVyLmxlbmd0aCkgPT09IG1hdGNoZXI7XG4gIH1cbn1cblxuZXhwb3J0cy5pc1B1bmN0dWF0b3IgPSBpc1B1bmN0dWF0b3JcbmZ1bmN0aW9uIGlzUHVuY3R1YXRvcihjKSB7XG4gIGlmICghYykgcmV0dXJuIHRydWU7IC8vIHRoZSBzdGFydCBvZiBhIHN0cmluZyBpcyBhIHB1bmN0dWF0b3JcbiAgdmFyIGNvZGUgPSBjLmNoYXJDb2RlQXQoMClcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDQ2OiAgIC8vIC4gZG90XG4gICAgY2FzZSA0MDogICAvLyAoIG9wZW4gYnJhY2tldFxuICAgIGNhc2UgNDE6ICAgLy8gKSBjbG9zZSBicmFja2V0XG4gICAgY2FzZSA1OTogICAvLyA7IHNlbWljb2xvblxuICAgIGNhc2UgNDQ6ICAgLy8gLCBjb21tYVxuICAgIGNhc2UgMTIzOiAgLy8geyBvcGVuIGN1cmx5IGJyYWNlXG4gICAgY2FzZSAxMjU6ICAvLyB9IGNsb3NlIGN1cmx5IGJyYWNlXG4gICAgY2FzZSA5MTogICAvLyBbXG4gICAgY2FzZSA5MzogICAvLyBdXG4gICAgY2FzZSA1ODogICAvLyA6XG4gICAgY2FzZSA2MzogICAvLyA/XG4gICAgY2FzZSAxMjY6ICAvLyB+XG4gICAgY2FzZSAzNzogICAvLyAlXG4gICAgY2FzZSAzODogICAvLyAmXG4gICAgY2FzZSA0MjogICAvLyAqOlxuICAgIGNhc2UgNDM6ICAgLy8gK1xuICAgIGNhc2UgNDU6ICAgLy8gLVxuICAgIGNhc2UgNDc6ICAgLy8gL1xuICAgIGNhc2UgNjA6ICAgLy8gPFxuICAgIGNhc2UgNjI6ICAgLy8gPlxuICAgIGNhc2UgOTQ6ICAgLy8gXlxuICAgIGNhc2UgMTI0OiAgLy8gfFxuICAgIGNhc2UgMzM6ICAgLy8gIVxuICAgIGNhc2UgNjE6ICAgLy8gPVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnRzLmlzS2V5d29yZCA9IGlzS2V5d29yZFxuZnVuY3Rpb24gaXNLZXl3b3JkKGlkKSB7XG4gIHJldHVybiAoaWQgPT09ICdpZicpIHx8IChpZCA9PT0gJ2luJykgfHwgKGlkID09PSAnZG8nKSB8fCAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fFxuICAgICAgICAgKGlkID09PSAndHJ5JykgfHwgKGlkID09PSAnbGV0JykgfHwgKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgIChpZCA9PT0gJ3ZvaWQnKSB8fCAoaWQgPT09ICd3aXRoJykgfHwgKGlkID09PSAnZW51bScpIHx8IChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAoaWQgPT09ICd0aHJvdycpIHx8IChpZCA9PT0gJ2NvbnN0JykgfHwgKGlkID09PSAneWllbGQnKSB8fCAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJykgfHxcbiAgICAgICAgIChpZCA9PT0gJ3JldHVybicpIHx8IChpZCA9PT0gJ3R5cGVvZicpIHx8IChpZCA9PT0gJ2RlbGV0ZScpIHx8IChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8XG4gICAgICAgICAoaWQgPT09ICdpbXBvcnQnKSB8fCAoaWQgPT09ICdkZWZhdWx0JykgfHwgKGlkID09PSAnZmluYWxseScpIHx8IChpZCA9PT0gJ2V4dGVuZHMnKSB8fCAoaWQgPT09ICdmdW5jdGlvbicpIHx8XG4gICAgICAgICAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJykgfHwgKGlkID09PSAncGFja2FnZScpIHx8IChpZCA9PT0gJ3ByaXZhdGUnKSB8fCAoaWQgPT09ICdpbnRlcmZhY2UnKSB8fFxuICAgICAgICAgKGlkID09PSAnaW5zdGFuY2VvZicpIHx8IChpZCA9PT0gJ2ltcGxlbWVudHMnKSB8fCAoaWQgPT09ICdwcm90ZWN0ZWQnKSB8fCAoaWQgPT09ICdwdWJsaWMnKSB8fCAoaWQgPT09ICdzdGF0aWMnKTtcbn1cblxuZnVuY3Rpb24gaXNSZWdleHAoaGlzdG9yeSkge1xuICAvL2NvdWxkIGJlIHN0YXJ0IG9mIHJlZ2V4cCBvciBkaXZpZGUgc2lnblxuXG4gIGhpc3RvcnkgPSBoaXN0b3J5LnJlcGxhY2UoL15cXHMqLywgJycpO1xuXG4gIC8vdW5sZXNzIGl0cyBhbiBgaWZgLCBgd2hpbGVgLCBgZm9yYCBvciBgd2l0aGAgaXQncyBhIGRpdmlkZSwgc28gd2UgYXNzdW1lIGl0J3MgYSBkaXZpZGVcbiAgaWYgKGhpc3RvcnlbMF0gPT09ICcpJykgcmV0dXJuIGZhbHNlO1xuICAvL3VubGVzcyBpdCdzIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiwgaXQncyBhIHJlZ2V4cCwgc28gd2UgYXNzdW1lIGl0J3MgYSByZWdleHBcbiAgaWYgKGhpc3RvcnlbMF0gPT09ICd9JykgcmV0dXJuIHRydWU7XG4gIC8vYW55IHB1bmN0dWF0aW9uIG1lYW5zIGl0J3MgYSByZWdleHBcbiAgaWYgKGlzUHVuY3R1YXRvcihoaXN0b3J5WzBdKSkgcmV0dXJuIHRydWU7XG4gIC8vaWYgdGhlIGxhc3QgdGhpbmcgd2FzIGEga2V5d29yZCB0aGVuIGl0IG11c3QgYmUgYSByZWdleHAgKGUuZy4gYHR5cGVvZiAvZm9vL2ApXG4gIGlmICgvXlxcdytcXGIvLnRlc3QoaGlzdG9yeSkgJiYgaXNLZXl3b3JkKC9eXFx3K1xcYi8uZXhlYyhoaXN0b3J5KVswXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpKSkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBtYWtlRXJyb3I7XG5mdW5jdGlvbiBtYWtlRXJyb3IoY29kZSwgbWVzc2FnZSwgb3B0aW9ucykge1xuICB2YXIgbGluZSA9IG9wdGlvbnMubGluZTtcbiAgdmFyIGNvbHVtbiA9IG9wdGlvbnMuY29sdW1uO1xuICB2YXIgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lO1xuICB2YXIgc3JjID0gb3B0aW9ucy5zcmM7XG4gIHZhciBmdWxsTWVzc2FnZTtcbiAgdmFyIGxvY2F0aW9uID0gbGluZSArIChjb2x1bW4gPyAnOicgKyBjb2x1bW4gOiAnJyk7XG4gIGlmIChzcmMgJiYgbGluZSA+PSAxICYmIGxpbmUgPD0gc3JjLnNwbGl0KCdcXG4nKS5sZW5ndGgpIHtcbiAgICB2YXIgbGluZXMgPSBzcmMuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBzdGFydCA9IE1hdGgubWF4KGxpbmUgLSAzLCAwKTtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBsaW5lICsgMyk7XG4gICAgLy8gRXJyb3IgY29udGV4dFxuICAgIHZhciBjb250ZXh0ID0gbGluZXNcbiAgICAgIC5zbGljZShzdGFydCwgZW5kKVxuICAgICAgLm1hcChmdW5jdGlvbih0ZXh0LCBpKSB7XG4gICAgICAgIHZhciBjdXJyID0gaSArIHN0YXJ0ICsgMTtcbiAgICAgICAgdmFyIHByZWFtYmxlID0gKGN1cnIgPT0gbGluZSA/ICcgID4gJyA6ICcgICAgJykgKyBjdXJyICsgJ3wgJztcbiAgICAgICAgdmFyIG91dCA9IHByZWFtYmxlICsgdGV4dDtcbiAgICAgICAgaWYgKGN1cnIgPT09IGxpbmUgJiYgY29sdW1uID4gMCkge1xuICAgICAgICAgIG91dCArPSAnXFxuJztcbiAgICAgICAgICBvdXQgKz0gQXJyYXkocHJlYW1ibGUubGVuZ3RoICsgY29sdW1uKS5qb2luKCctJykgKyAnXic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgZnVsbE1lc3NhZ2UgPVxuICAgICAgKGZpbGVuYW1lIHx8ICdQdWcnKSArICc6JyArIGxvY2F0aW9uICsgJ1xcbicgKyBjb250ZXh0ICsgJ1xcblxcbicgKyBtZXNzYWdlO1xuICB9IGVsc2Uge1xuICAgIGZ1bGxNZXNzYWdlID0gKGZpbGVuYW1lIHx8ICdQdWcnKSArICc6JyArIGxvY2F0aW9uICsgJ1xcblxcbicgKyBtZXNzYWdlO1xuICB9XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoZnVsbE1lc3NhZ2UpO1xuICBlcnIuY29kZSA9ICdQVUc6JyArIGNvZGU7XG4gIGVyci5tc2cgPSBtZXNzYWdlO1xuICBlcnIubGluZSA9IGxpbmU7XG4gIGVyci5jb2x1bW4gPSBjb2x1bW47XG4gIGVyci5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICBlcnIuc3JjID0gc3JjO1xuICBlcnIudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1zZzogdGhpcy5tc2csXG4gICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGVycjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBpc0V4cHJlc3Npb24gPSByZXF1aXJlKCdpcy1leHByZXNzaW9uJyk7XG52YXIgY2hhcmFjdGVyUGFyc2VyID0gcmVxdWlyZSgnY2hhcmFjdGVyLXBhcnNlcicpO1xudmFyIGVycm9yID0gcmVxdWlyZSgncHVnLWVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGV4O1xubW9kdWxlLmV4cG9ydHMuTGV4ZXIgPSBMZXhlcjtcbmZ1bmN0aW9uIGxleChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIGxleGVyID0gbmV3IExleGVyKHN0ciwgb3B0aW9ucyk7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxleGVyLmdldFRva2VucygpKSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgTGV4ZXJgIHdpdGggdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gTGV4ZXIoc3RyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnRXhwZWN0ZWQgc291cmNlIGNvZGUgdG8gYmUgYSBzdHJpbmcgYnV0IGdvdCBcIicgKyB0eXBlb2Ygc3RyICsgJ1wiJ1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdFeHBlY3RlZCBcIm9wdGlvbnNcIiB0byBiZSBhbiBvYmplY3QgYnV0IGdvdCBcIicgKyB0eXBlb2Ygb3B0aW9ucyArICdcIidcbiAgICApO1xuICB9XG4gIC8vU3RyaXAgYW55IFVURi04IEJPTSBvZmYgb2YgdGhlIHN0YXJ0IG9mIGBzdHJgLCBpZiBpdCBleGlzdHMuXG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgdGhpcy5pbnB1dCA9IHN0ci5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcbiAgdGhpcy5vcmlnaW5hbElucHV0ID0gdGhpcy5pbnB1dDtcbiAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIHRoaXMuaW50ZXJwb2xhdGVkID0gb3B0aW9ucy5pbnRlcnBvbGF0ZWQgfHwgZmFsc2U7XG4gIHRoaXMubGluZW5vID0gb3B0aW9ucy5zdGFydGluZ0xpbmUgfHwgMTtcbiAgdGhpcy5jb2xubyA9IG9wdGlvbnMuc3RhcnRpbmdDb2x1bW4gfHwgMTtcbiAgdGhpcy5wbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zIHx8IFtdO1xuICB0aGlzLmluZGVudFN0YWNrID0gWzBdO1xuICB0aGlzLmluZGVudFJlID0gbnVsbDtcbiAgLy8gSWYgI3t9LCAhe30gb3IgI1tdIHN5bnRheCBpcyBhbGxvd2VkIHdoZW4gYWRkaW5nIHRleHRcbiAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCA9IHRydWU7XG4gIHRoaXMud2hpdGVzcGFjZVJlID0gL1sgXFxuXFx0XS87XG5cbiAgdGhpcy50b2tlbnMgPSBbXTtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIExleGVyIHByb3RvdHlwZS5cbiAqL1xuXG5MZXhlci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBMZXhlcixcblxuICBlcnJvcjogZnVuY3Rpb24oY29kZSwgbWVzc2FnZSkge1xuICAgIHZhciBlcnIgPSBlcnJvcihjb2RlLCBtZXNzYWdlLCB7XG4gICAgICBsaW5lOiB0aGlzLmxpbmVubyxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2xubyxcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgc3JjOiB0aGlzLm9yaWdpbmFsSW5wdXQsXG4gICAgfSk7XG4gICAgdGhyb3cgZXJyO1xuICB9LFxuXG4gIGFzc2VydDogZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgICBpZiAoIXZhbHVlKSB0aGlzLmVycm9yKCdBU1NFUlRfRkFJTEVEJywgbWVzc2FnZSk7XG4gIH0sXG5cbiAgaXNFeHByZXNzaW9uOiBmdW5jdGlvbihleHApIHtcbiAgICByZXR1cm4gaXNFeHByZXNzaW9uKGV4cCwge1xuICAgICAgdGhyb3c6IHRydWUsXG4gICAgfSk7XG4gIH0sXG5cbiAgYXNzZXJ0RXhwcmVzc2lvbjogZnVuY3Rpb24oZXhwLCBub1Rocm93KSB7XG4gICAgLy90aGlzIHZlcmlmaWVzIHRoYXQgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaXMgdmFsaWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignaXNFeHByZXNzaW9uJywgZXhwKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAobm9UaHJvdykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBub3QgY29taW5nIGZyb20gYWNvcm5cbiAgICAgIGlmICghZXgubG9jKSB0aHJvdyBleDtcblxuICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKGV4LmxvYy5saW5lIC0gMSk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihleC5sb2MuY29sdW1uKTtcbiAgICAgIHZhciBtc2cgPVxuICAgICAgICAnU3ludGF4IEVycm9yOiAnICsgZXgubWVzc2FnZS5yZXBsYWNlKC8gXFwoWzAtOV0rOlswLTldK1xcKSQvLCAnJyk7XG4gICAgICB0aGlzLmVycm9yKCdTWU5UQVhfRVJST1InLCBtc2cpO1xuICAgIH1cbiAgfSxcblxuICBhc3NlcnROZXN0aW5nQ29ycmVjdDogZnVuY3Rpb24oZXhwKSB7XG4gICAgLy90aGlzIHZlcmlmaWVzIHRoYXQgY29kZSBpcyBwcm9wZXJseSBuZXN0ZWQsIGJ1dCBhbGxvd3NcbiAgICAvL2ludmFsaWQgSmF2YVNjcmlwdCBzdWNoIGFzIHRoZSBjb250ZW50cyBvZiBgYXR0cmlidXRlc2BcbiAgICB2YXIgcmVzID0gY2hhcmFjdGVyUGFyc2VyKGV4cCk7XG4gICAgaWYgKHJlcy5pc05lc3RpbmcoKSkge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ0lOQ09SUkVDVF9ORVNUSU5HJyxcbiAgICAgICAgJ05lc3RpbmcgbXVzdCBtYXRjaCBvbiBleHByZXNzaW9uIGAnICsgZXhwICsgJ2AnXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgdG9rZW4gd2l0aCB0aGUgZ2l2ZW4gYHR5cGVgIGFuZCBgdmFsYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICB0b2s6IGZ1bmN0aW9uKHR5cGUsIHZhbCkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbG9jOiB7XG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgbGluZTogdGhpcy5saW5lbm8sXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmNvbG5vLFxuICAgICAgICB9LFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgcmVzLnZhbCA9IHZhbDtcblxuICAgIHJldHVybiByZXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4ncyBgbG9jLmVuZGAgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0b2tcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIHRva0VuZDogZnVuY3Rpb24odG9rKSB7XG4gICAgdG9rLmxvYy5lbmQgPSB7XG4gICAgICBsaW5lOiB0aGlzLmxpbmVubyxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2xubyxcbiAgICB9O1xuICAgIHJldHVybiB0b2s7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBgdGhpcy5saW5lbm9gIGFuZCByZXNldCBgdGhpcy5jb2xub2AuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmNyZW1lbnRcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGluY3JlbWVudExpbmU6IGZ1bmN0aW9uKGluY3JlbWVudCkge1xuICAgIHRoaXMubGluZW5vICs9IGluY3JlbWVudDtcbiAgICBpZiAoaW5jcmVtZW50KSB0aGlzLmNvbG5vID0gMTtcbiAgfSxcblxuICAvKipcbiAgICogSW5jcmVtZW50IGB0aGlzLmNvbG5vYC5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluY3JlbWVudFxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgaW5jcmVtZW50Q29sdW1uOiBmdW5jdGlvbihpbmNyZW1lbnQpIHtcbiAgICB0aGlzLmNvbG5vICs9IGluY3JlbWVudDtcbiAgfSxcblxuICAvKipcbiAgICogQ29uc3VtZSB0aGUgZ2l2ZW4gYGxlbmAgb2YgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGNvbnN1bWU6IGZ1bmN0aW9uKGxlbikge1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cihsZW4pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBgdHlwZWAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4cGAuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgc2NhbjogZnVuY3Rpb24ocmVnZXhwLCB0eXBlKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSByZWdleHAuZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGg7XG4gICAgICB2YXIgdmFsID0gY2FwdHVyZXNbMV07XG4gICAgICB2YXIgZGlmZiA9IGxlbiAtICh2YWwgPyB2YWwubGVuZ3RoIDogMCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2sodHlwZSwgdmFsKTtcbiAgICAgIHRoaXMuY29uc3VtZShsZW4pO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oZGlmZik7XG4gICAgICByZXR1cm4gdG9rO1xuICAgIH1cbiAgfSxcbiAgc2NhbkVuZE9mTGluZTogZnVuY3Rpb24ocmVnZXhwLCB0eXBlKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSByZWdleHAuZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHZhciB3aGl0ZXNwYWNlTGVuZ3RoID0gMDtcbiAgICAgIHZhciB3aGl0ZXNwYWNlO1xuICAgICAgdmFyIHRvaztcbiAgICAgIGlmICgod2hpdGVzcGFjZSA9IC9eKFsgXSspKFteIF0qKS8uZXhlYyhjYXB0dXJlc1swXSkpKSB7XG4gICAgICAgIHdoaXRlc3BhY2VMZW5ndGggPSB3aGl0ZXNwYWNlWzFdLmxlbmd0aDtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4od2hpdGVzcGFjZUxlbmd0aCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3SW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cihjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgaWYgKG5ld0lucHV0WzBdID09PSAnOicpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ld0lucHV0O1xuICAgICAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCBjYXB0dXJlc1sxXSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIHdoaXRlc3BhY2VMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgfVxuICAgICAgaWYgKC9eWyBcXHRdKihcXG58JCkvLnRlc3QobmV3SW5wdXQpKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBuZXdJbnB1dC5zdWJzdHIoL15bIFxcdF0qLy5leGVjKG5ld0lucHV0KVswXS5sZW5ndGgpO1xuICAgICAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCBjYXB0dXJlc1sxXSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIHdoaXRlc3BhY2VMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleE9mIGAoYCBvciBge2Agb3IgYFtgIC8gYClgIG9yIGB9YCBvciBgXWAgZGVsaW1pdGVycy5cbiAgICpcbiAgICogTWFrZSBzdXJlIHRoYXQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGNvbG5vIGlzIGF0IHRoZSBjaGFyYWN0ZXJcbiAgICogaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBiZWdpbm5pbmcuXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGJyYWNrZXRFeHByZXNzaW9uOiBmdW5jdGlvbihza2lwKSB7XG4gICAgc2tpcCA9IHNraXAgfHwgMDtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0W3NraXBdO1xuICAgIGFzc2VydChcbiAgICAgIHN0YXJ0ID09PSAnKCcgfHwgc3RhcnQgPT09ICd7JyB8fCBzdGFydCA9PT0gJ1snLFxuICAgICAgJ1RoZSBzdGFydCBjaGFyYWN0ZXIgc2hvdWxkIGJlIFwiKFwiLCBcIntcIiBvciBcIltcIidcbiAgICApO1xuICAgIHZhciBlbmQgPSBjaGFyYWN0ZXJQYXJzZXIuQlJBQ0tFVFNbc3RhcnRdO1xuICAgIHZhciByYW5nZTtcbiAgICB0cnkge1xuICAgICAgcmFuZ2UgPSBjaGFyYWN0ZXJQYXJzZXIucGFyc2VVbnRpbCh0aGlzLmlucHV0LCBlbmQsIHtzdGFydDogc2tpcCArIDF9KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4LmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGlkeCA9IGV4LmluZGV4O1xuICAgICAgICAvLyBzdGFydGluZyBmcm9tIHRoaXMuaW5wdXRbc2tpcF1cbiAgICAgICAgdmFyIHRtcCA9IHRoaXMuaW5wdXQuc3Vic3RyKHNraXApLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICAvLyBzdGFydGluZyBmcm9tIHRoaXMuaW5wdXRbMF1cbiAgICAgICAgdmFyIG5leHROZXdsaW5lID0gdG1wICsgc2tpcDtcbiAgICAgICAgdmFyIHB0ciA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPiBuZXh0TmV3bGluZSAmJiB0bXAgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKDEpO1xuICAgICAgICAgIGlkeCAtPSBuZXh0TmV3bGluZSArIDE7XG4gICAgICAgICAgcHRyICs9IG5leHROZXdsaW5lICsgMTtcbiAgICAgICAgICB0bXAgPSBuZXh0TmV3bGluZSA9IHRoaXMuaW5wdXQuc3Vic3RyKHB0cikuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbihpZHgpO1xuICAgICAgfVxuICAgICAgaWYgKGV4LmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCcpIHtcbiAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAnTk9fRU5EX0JSQUNLRVQnLFxuICAgICAgICAgICdUaGUgZW5kIG9mIHRoZSBzdHJpbmcgcmVhY2hlZCB3aXRoIG5vIGNsb3NpbmcgYnJhY2tldCAnICtcbiAgICAgICAgICAgIGVuZCArXG4gICAgICAgICAgICAnIGZvdW5kLidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXguY29kZSA9PT0gJ0NIQVJBQ1RFUl9QQVJTRVI6TUlTTUFUQ0hFRF9CUkFDS0VUJykge1xuICAgICAgICB0aGlzLmVycm9yKCdCUkFDS0VUX01JU01BVENIJywgZXgubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9LFxuXG4gIHNjYW5JbmRlbnRhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzLCByZTtcblxuICAgIC8vIGVzdGFibGlzaGVkIHJlZ2V4cFxuICAgIGlmICh0aGlzLmluZGVudFJlKSB7XG4gICAgICBjYXB0dXJlcyA9IHRoaXMuaW5kZW50UmUuZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgIC8vIGRldGVybWluZSByZWdleHBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGFic1xuICAgICAgcmUgPSAvXlxcbihcXHQqKSAqLztcbiAgICAgIGNhcHR1cmVzID0gcmUuZXhlYyh0aGlzLmlucHV0KTtcblxuICAgICAgLy8gc3BhY2VzXG4gICAgICBpZiAoY2FwdHVyZXMgJiYgIWNhcHR1cmVzWzFdLmxlbmd0aCkge1xuICAgICAgICByZSA9IC9eXFxuKCAqKS87XG4gICAgICAgIGNhcHR1cmVzID0gcmUuZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgIH1cblxuICAgICAgLy8gZXN0YWJsaXNoZWRcbiAgICAgIGlmIChjYXB0dXJlcyAmJiBjYXB0dXJlc1sxXS5sZW5ndGgpIHRoaXMuaW5kZW50UmUgPSByZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FwdHVyZXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGVuZC1vZi1zb3VyY2UuXG4gICAqL1xuXG4gIGVvczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaW5wdXQubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW50ZXJwb2xhdGVkKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnTk9fRU5EX0JSQUNLRVQnLFxuICAgICAgICAnRW5kIG9mIGxpbmUgd2FzIHJlYWNoZWQgd2l0aCBubyBjbG9zaW5nIGJyYWNrZXQgZm9yIGludGVycG9sYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IHRoaXMuaW5kZW50U3RhY2tbaV07IGkrKykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0aGlzLnRvaygnb3V0ZGVudCcpKSk7XG4gICAgfVxuICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodGhpcy50b2soJ2VvcycpKSk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJsYW5rIGxpbmUuXG4gICAqL1xuXG4gIGJsYW5rOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eXFxuWyBcXHRdKlxcbi8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29tbWVudC5cbiAgICovXG5cbiAgY29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXlxcL1xcLygtKT8oW15cXG5dKikvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnY29tbWVudCcsIGNhcHR1cmVzWzJdKTtcbiAgICAgIHRvay5idWZmZXIgPSAnLScgIT0gY2FwdHVyZXNbMV07XG4gICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gdG9rLmJ1ZmZlcjtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGlwZWxlc3NUZXh0Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludGVycG9sYXRlZCB0YWcuXG4gICAqL1xuXG4gIGludGVycG9sYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICgvXiNcXHsvLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHZhciBtYXRjaCA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oMSk7XG4gICAgICB0aGlzLmNvbnN1bWUobWF0Y2guZW5kICsgMSk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJ2ludGVycG9sYXRpb24nLCBtYXRjaC5zcmMpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMik7IC8vICcjeydcbiAgICAgIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihtYXRjaC5zcmMpO1xuXG4gICAgICB2YXIgc3BsaXR0ZWQgPSBtYXRjaC5zcmMuc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGxpbmVzID0gc3BsaXR0ZWQubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZShsaW5lcyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihzcGxpdHRlZFtsaW5lc10ubGVuZ3RoICsgMSk7IC8vICsgMSBcdTIxOTIgJ30nXG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBUYWcuXG4gICAqL1xuXG4gIHRhZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuXG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKFxcdyg/OlstOlxcd10qXFx3KT8pLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIHRvayxcbiAgICAgICAgbmFtZSA9IGNhcHR1cmVzWzFdLFxuICAgICAgICBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGg7XG4gICAgICB0aGlzLmNvbnN1bWUobGVuKTtcbiAgICAgIHRvayA9IHRoaXMudG9rKCd0YWcnLCBuYW1lKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGxlbik7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXIuXG4gICAqL1xuXG4gIGZpbHRlcjogZnVuY3Rpb24ob3B0cykge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL146KFtcXHdcXC1dKykvLCAnZmlsdGVyJyk7XG4gICAgdmFyIGluSW5jbHVkZSA9IG9wdHMgJiYgb3B0cy5pbkluY2x1ZGU7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tFbmQodG9rKTtcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJzJyk7XG4gICAgICBpZiAoIWluSW5jbHVkZSkge1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3BpcGVsZXNzVGV4dCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEb2N0eXBlLlxuICAgKi9cblxuICBkb2N0eXBlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc2NhbkVuZE9mTGluZSgvXmRvY3R5cGUgKihbXlxcbl0qKS8sICdkb2N0eXBlJyk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQobm9kZSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJZC5cbiAgICovXG5cbiAgaWQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL14jKFtcXHctXSspLywgJ2lkJyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tFbmQodG9rKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoL14jLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnSU5WQUxJRF9JRCcsXG4gICAgICAgICdcIicgK1xuICAgICAgICAgIC8uW14gXFx0XFwoXFwjXFwuXFw6XSovLmV4ZWModGhpcy5pbnB1dC5zdWJzdHIoMSkpWzBdICtcbiAgICAgICAgICAnXCIgaXMgbm90IGEgdmFsaWQgSUQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENsYXNzLlxuICAgKi9cblxuICBjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL15cXC4oW19hLXowLTlcXC1dKltfYS16XVtfYS16MC05XFwtXSopL2ksICdjbGFzcycpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHRvay52YWwubGVuZ3RoKTtcbiAgICAgIHRoaXMudG9rRW5kKHRvayk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKC9eXFwuW19hLXowLTlcXC1dKy9pLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdJTlZBTElEX0NMQVNTX05BTUUnLFxuICAgICAgICAnQ2xhc3MgbmFtZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBsZXR0ZXIgb3IgdW5kZXJzY29yZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoL15cXC4vLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdJTlZBTElEX0NMQVNTX05BTUUnLFxuICAgICAgICAnXCInICtcbiAgICAgICAgICAvLlteIFxcdFxcKFxcI1xcLlxcOl0qLy5leGVjKHRoaXMuaW5wdXQuc3Vic3RyKDEpKVswXSArXG4gICAgICAgICAgJ1wiIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuICBDbGFzcyBuYW1lcyBjYW4gb25seSBjb250YWluIFwiX1wiLCBcIi1cIiwgYS16IGFuZCAwLTksIGFuZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG9mIFwiX1wiLCBvciBhLXonXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVGV4dC5cbiAgICovXG4gIGVuZEludGVycG9sYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmludGVycG9sYXRlZCAmJiB0aGlzLmlucHV0WzBdID09PSAnXScpIHtcbiAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cigxKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICBhZGRUZXh0OiBmdW5jdGlvbih0eXBlLCB2YWx1ZSwgcHJlZml4LCBlc2NhcGVkKSB7XG4gICAgdmFyIHRvaztcbiAgICBpZiAodmFsdWUgKyBwcmVmaXggPT09ICcnKSByZXR1cm47XG4gICAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuICAgIGVzY2FwZWQgPSBlc2NhcGVkIHx8IDA7XG4gICAgdmFyIGluZGV4T2ZFbmQgPSB0aGlzLmludGVycG9sYXRlZCA/IHZhbHVlLmluZGV4T2YoJ10nKSA6IC0xO1xuICAgIHZhciBpbmRleE9mU3RhcnQgPSB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID8gdmFsdWUuaW5kZXhPZignI1snKSA6IC0xO1xuICAgIHZhciBpbmRleE9mRXNjYXBlZCA9IHRoaXMuaW50ZXJwb2xhdGlvbkFsbG93ZWQgPyB2YWx1ZS5pbmRleE9mKCdcXFxcI1snKSA6IC0xO1xuICAgIHZhciBtYXRjaE9mU3RyaW5nSW50ZXJwID0gLyhcXFxcKT8oWyMhXSl7KCg/Oi58XFxuKSopJC8uZXhlYyh2YWx1ZSk7XG4gICAgdmFyIGluZGV4T2ZTdHJpbmdJbnRlcnAgPVxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCAmJiBtYXRjaE9mU3RyaW5nSW50ZXJwXG4gICAgICAgID8gbWF0Y2hPZlN0cmluZ0ludGVycC5pbmRleFxuICAgICAgICA6IEluZmluaXR5O1xuXG4gICAgaWYgKGluZGV4T2ZFbmQgPT09IC0xKSBpbmRleE9mRW5kID0gSW5maW5pdHk7XG4gICAgaWYgKGluZGV4T2ZTdGFydCA9PT0gLTEpIGluZGV4T2ZTdGFydCA9IEluZmluaXR5O1xuICAgIGlmIChpbmRleE9mRXNjYXBlZCA9PT0gLTEpIGluZGV4T2ZFc2NhcGVkID0gSW5maW5pdHk7XG5cbiAgICBpZiAoXG4gICAgICBpbmRleE9mRXNjYXBlZCAhPT0gSW5maW5pdHkgJiZcbiAgICAgIGluZGV4T2ZFc2NhcGVkIDwgaW5kZXhPZkVuZCAmJlxuICAgICAgaW5kZXhPZkVzY2FwZWQgPCBpbmRleE9mU3RhcnQgJiZcbiAgICAgIGluZGV4T2ZFc2NhcGVkIDwgaW5kZXhPZlN0cmluZ0ludGVycFxuICAgICkge1xuICAgICAgcHJlZml4ID0gcHJlZml4ICsgdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4T2ZFc2NhcGVkKSArICcjWyc7XG4gICAgICByZXR1cm4gdGhpcy5hZGRUZXh0KFxuICAgICAgICB0eXBlLFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoaW5kZXhPZkVzY2FwZWQgKyAzKSxcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBlc2NhcGVkICsgMVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaW5kZXhPZlN0YXJ0ICE9PSBJbmZpbml0eSAmJlxuICAgICAgaW5kZXhPZlN0YXJ0IDwgaW5kZXhPZkVuZCAmJlxuICAgICAgaW5kZXhPZlN0YXJ0IDwgaW5kZXhPZkVzY2FwZWQgJiZcbiAgICAgIGluZGV4T2ZTdGFydCA8IGluZGV4T2ZTdHJpbmdJbnRlcnBcbiAgICApIHtcbiAgICAgIHRvayA9IHRoaXMudG9rKHR5cGUsIHByZWZpeCArIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mU3RhcnQpKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHByZWZpeC5sZW5ndGggKyBpbmRleE9mU3RhcnQgKyBlc2NhcGVkKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0b2sgPSB0aGlzLnRvaygnc3RhcnQtcHVnLWludGVycG9sYXRpb24nKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDIpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHZhbHVlLnN1YnN0cihpbmRleE9mU3RhcnQgKyAyKSwge1xuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgaW50ZXJwb2xhdGVkOiB0cnVlLFxuICAgICAgICBzdGFydGluZ0xpbmU6IHRoaXMubGluZW5vLFxuICAgICAgICBzdGFydGluZ0NvbHVtbjogdGhpcy5jb2xubyxcbiAgICAgICAgcGx1Z2luczogdGhpcy5wbHVnaW5zLFxuICAgICAgfSk7XG4gICAgICB2YXIgaW50ZXJwb2xhdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW50ZXJwb2xhdGVkID0gY2hpbGQuZ2V0VG9rZW5zKCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXguY29kZSAmJiAvXlBVRzovLnRlc3QoZXguY29kZSkpIHtcbiAgICAgICAgICB0aGlzLmNvbG5vID0gZXguY29sdW1uO1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXguY29kZS5zdWJzdHIoNCksIGV4Lm1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbG5vID0gY2hpbGQuY29sbm87XG4gICAgICB0aGlzLnRva2VucyA9IHRoaXMudG9rZW5zLmNvbmNhdChpbnRlcnBvbGF0ZWQpO1xuICAgICAgdG9rID0gdGhpcy50b2soJ2VuZC1wdWctaW50ZXJwb2xhdGlvbicpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5hZGRUZXh0KHR5cGUsIGNoaWxkLmlucHV0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaW5kZXhPZkVuZCAhPT0gSW5maW5pdHkgJiZcbiAgICAgIGluZGV4T2ZFbmQgPCBpbmRleE9mU3RhcnQgJiZcbiAgICAgIGluZGV4T2ZFbmQgPCBpbmRleE9mRXNjYXBlZCAmJlxuICAgICAgaW5kZXhPZkVuZCA8IGluZGV4T2ZTdHJpbmdJbnRlcnBcbiAgICApIHtcbiAgICAgIGlmIChwcmVmaXggKyB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXhPZkVuZCkpIHtcbiAgICAgICAgdGhpcy5hZGRUZXh0KHR5cGUsIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mRW5kKSwgcHJlZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbnB1dCA9IHZhbHVlLnN1YnN0cih2YWx1ZS5pbmRleE9mKCddJykgKyAxKSArIHRoaXMuaW5wdXQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleE9mU3RyaW5nSW50ZXJwICE9PSBJbmZpbml0eSkge1xuICAgICAgaWYgKG1hdGNoT2ZTdHJpbmdJbnRlcnBbMV0pIHtcbiAgICAgICAgcHJlZml4ID1cbiAgICAgICAgICBwcmVmaXggK1xuICAgICAgICAgIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mU3RyaW5nSW50ZXJwKSArXG4gICAgICAgICAgbWF0Y2hPZlN0cmluZ0ludGVycFsyXSArXG4gICAgICAgICAgJ3snO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRUZXh0KFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKGluZGV4T2ZTdHJpbmdJbnRlcnAgKyAzKSxcbiAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgZXNjYXBlZCArIDFcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhciBiZWZvcmUgPSB2YWx1ZS5zdWJzdHIoMCwgaW5kZXhPZlN0cmluZ0ludGVycCk7XG4gICAgICBpZiAocHJlZml4IHx8IGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUgPSBwcmVmaXggKyBiZWZvcmU7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKHR5cGUsIGJlZm9yZSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGJlZm9yZS5sZW5ndGggKyBlc2NhcGVkKTtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3QgPSBtYXRjaE9mU3RyaW5nSW50ZXJwWzNdO1xuICAgICAgdmFyIHJhbmdlO1xuICAgICAgdG9rID0gdGhpcy50b2soJ2ludGVycG9sYXRlZC1jb2RlJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJhbmdlID0gY2hhcmFjdGVyUGFyc2VyLnBhcnNlVW50aWwocmVzdCwgJ30nKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmIChleC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oZXguaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleC5jb2RlID09PSAnQ0hBUkFDVEVSX1BBUlNFUjpFTkRfT0ZfU1RSSU5HX1JFQUNIRUQnKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICdOT19FTkRfQlJBQ0tFVCcsXG4gICAgICAgICAgICAnRW5kIG9mIGxpbmUgd2FzIHJlYWNoZWQgd2l0aCBubyBjbG9zaW5nIGJyYWNrZXQgZm9yIGludGVycG9sYXRpb24uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXguY29kZSA9PT0gJ0NIQVJBQ1RFUl9QQVJTRVI6TUlTTUFUQ0hFRF9CUkFDS0VUJykge1xuICAgICAgICAgIHRoaXMuZXJyb3IoJ0JSQUNLRVRfTUlTTUFUQ0gnLCBleC5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdG9rLm11c3RFc2NhcGUgPSBtYXRjaE9mU3RyaW5nSW50ZXJwWzJdID09PSAnIyc7XG4gICAgICB0b2suYnVmZmVyID0gdHJ1ZTtcbiAgICAgIHRvay52YWwgPSByYW5nZS5zcmM7XG4gICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24ocmFuZ2Uuc3JjKTtcblxuICAgICAgaWYgKHJhbmdlLmVuZCArIDEgPCByZXN0Lmxlbmd0aCkge1xuICAgICAgICByZXN0ID0gcmVzdC5zdWJzdHIocmFuZ2UuZW5kICsgMSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHJhbmdlLmVuZCArIDEpO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICB0aGlzLmFkZFRleHQodHlwZSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbihyZXN0Lmxlbmd0aCk7XG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwcmVmaXggKyB2YWx1ZTtcbiAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCB2YWx1ZSk7XG4gICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odmFsdWUubGVuZ3RoICsgZXNjYXBlZCk7XG4gICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgfSxcblxuICB0ZXh0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID1cbiAgICAgIHRoaXMuc2NhbigvXig/OlxcfCA/fCApKFteXFxuXSspLywgJ3RleHQnKSB8fFxuICAgICAgdGhpcy5zY2FuKC9eKCApLywgJ3RleHQnKSB8fFxuICAgICAgdGhpcy5zY2FuKC9eXFx8KCA/KS8sICd0ZXh0Jyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy5hZGRUZXh0KCd0ZXh0JywgdG9rLnZhbCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgdGV4dEh0bWw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL14oPFteXFxuXSopLywgJ3RleHQtaHRtbCcpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMuYWRkVGV4dCgndGV4dC1odG1sJywgdG9rLnZhbCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERvdC5cbiAgICovXG5cbiAgZG90OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuICAgIGlmICgodG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eXFwuLywgJ2RvdCcpKSkge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3BpcGVsZXNzVGV4dCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFeHRlbmRzLlxuICAgKi9cblxuICBleHRlbmRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuKC9eZXh0ZW5kcz8oPz0gfCR8XFxuKS8sICdleHRlbmRzJyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIGlmICghdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGF0aCcpKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ05PX0VYVEVORFNfUEFUSCcsICdtaXNzaW5nIHBhdGggZm9yIGV4dGVuZHMnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9eZXh0ZW5kcz9cXGIvKSkge1xuICAgICAgdGhpcy5lcnJvcignTUFMRk9STUVEX0VYVEVORFMnLCAnbWFsZm9ybWVkIGV4dGVuZHMnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJsb2NrIHByZXBlbmQuXG4gICAqL1xuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoKGNhcHR1cmVzID0gL14oPzpibG9jayArKT9wcmVwZW5kICsoW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB2YXIgbmFtZSA9IGNhcHR1cmVzWzFdLnRyaW0oKTtcbiAgICAgIHZhciBjb21tZW50ID0gJyc7XG4gICAgICBpZiAobmFtZS5pbmRleE9mKCcvLycpICE9PSAtMSkge1xuICAgICAgICBjb21tZW50ID1cbiAgICAgICAgICAnLy8nICtcbiAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAuc3BsaXQoJy8vJylcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLmpvaW4oJy8vJyk7XG4gICAgICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcvLycpWzBdLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgICAgdmFyIHRvayA9IHRoaXMudG9rKCdibG9jaycsIG5hbWUpO1xuICAgICAgdmFyIGxlbiA9IGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoO1xuICAgICAgd2hpbGUgKHRoaXMud2hpdGVzcGFjZVJlLnRlc3QodGhpcy5pbnB1dC5jaGFyQXQobGVuIC0gMSkpKSBsZW4tLTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGxlbik7XG4gICAgICB0b2subW9kZSA9ICdwcmVwZW5kJztcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGgpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGggLSBsZW4pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jayBhcHBlbmQuXG4gICAqL1xuXG4gIGFwcGVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXig/OmJsb2NrICspP2FwcGVuZCArKFteXFxuXSspLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIG5hbWUgPSBjYXB0dXJlc1sxXS50cmltKCk7XG4gICAgICB2YXIgY29tbWVudCA9ICcnO1xuICAgICAgaWYgKG5hbWUuaW5kZXhPZignLy8nKSAhPT0gLTEpIHtcbiAgICAgICAgY29tbWVudCA9XG4gICAgICAgICAgJy8vJyArXG4gICAgICAgICAgbmFtZVxuICAgICAgICAgICAgLnNwbGl0KCcvLycpXG4gICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgIC5qb2luKCcvLycpO1xuICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLy8nKVswXS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnYmxvY2snLCBuYW1lKTtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGggLSBjb21tZW50Lmxlbmd0aDtcbiAgICAgIHdoaWxlICh0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHRoaXMuaW5wdXQuY2hhckF0KGxlbiAtIDEpKSkgbGVuLS07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihsZW4pO1xuICAgICAgdG9rLm1vZGUgPSAnYXBwZW5kJztcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGgpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGggLSBsZW4pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jay5cbiAgICovXG5cbiAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoKGNhcHR1cmVzID0gL15ibG9jayArKFteXFxuXSspLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIG5hbWUgPSBjYXB0dXJlc1sxXS50cmltKCk7XG4gICAgICB2YXIgY29tbWVudCA9ICcnO1xuICAgICAgaWYgKG5hbWUuaW5kZXhPZignLy8nKSAhPT0gLTEpIHtcbiAgICAgICAgY29tbWVudCA9XG4gICAgICAgICAgJy8vJyArXG4gICAgICAgICAgbmFtZVxuICAgICAgICAgICAgLnNwbGl0KCcvLycpXG4gICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgIC5qb2luKCcvLycpO1xuICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLy8nKVswXS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnYmxvY2snLCBuYW1lKTtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGggLSBjb21tZW50Lmxlbmd0aDtcbiAgICAgIHdoaWxlICh0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHRoaXMuaW5wdXQuY2hhckF0KGxlbiAtIDEpKSkgbGVuLS07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihsZW4pO1xuICAgICAgdG9rLm1vZGUgPSAncmVwbGFjZSc7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5jb25zdW1lKGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoIC0gbGVuKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWl4aW4gQmxvY2suXG4gICAqL1xuXG4gIG1peGluQmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2s7XG4gICAgaWYgKCh0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL15ibG9jay8sICdtaXhpbi1ibG9jaycpKSkge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogWWllbGQuXG4gICAqL1xuXG4gIHlpZWxkOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eeWllbGQvLCAneWllbGQnKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJbmNsdWRlLlxuICAgKi9cblxuICBpbmNsdWRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuKC9eaW5jbHVkZSg/PTp8IHwkfFxcbikvLCAnaW5jbHVkZScpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB3aGlsZSAodGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZmlsdGVyJywge2luSW5jbHVkZTogdHJ1ZX0pKTtcbiAgICAgIGlmICghdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGF0aCcpKSB7XG4gICAgICAgIGlmICgvXlteIFxcbl0rLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbW9yZSB0ZXh0XG4gICAgICAgICAgdGhpcy5mYWlsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgbm90XG4gICAgICAgICAgdGhpcy5lcnJvcignTk9fSU5DTFVERV9QQVRIJywgJ21pc3NpbmcgcGF0aCBmb3IgaW5jbHVkZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NhbigvXmluY2x1ZGVcXGIvKSkge1xuICAgICAgdGhpcy5lcnJvcignTUFMRk9STUVEX0lOQ0xVREUnLCAnbWFsZm9ybWVkIGluY2x1ZGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhdGhcbiAgICovXG5cbiAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuc2NhbkVuZE9mTGluZSgvXiAoW15cXG5dKykvLCAncGF0aCcpO1xuICAgIGlmICh0b2sgJiYgKHRvay52YWwgPSB0b2sudmFsLnRyaW0oKSkpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhc2UuXG4gICAqL1xuXG4gIGNhc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL15jYXNlICsoW15cXG5dKykvLCAnY2FzZScpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKC10b2sudmFsLmxlbmd0aCk7XG4gICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24odG9rLnZhbCk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbih0b2sudmFsLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYW4oL15jYXNlXFxiLykpIHtcbiAgICAgIHRoaXMuZXJyb3IoJ05PX0NBU0VfRVhQUkVTU0lPTicsICdtaXNzaW5nIGV4cHJlc3Npb24gZm9yIGNhc2UnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoZW4uXG4gICAqL1xuXG4gIHdoZW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL153aGVuICsoW146XFxuXSspLywgJ3doZW4nKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB2YXIgcGFyc2VyID0gY2hhcmFjdGVyUGFyc2VyKHRvay52YWwpO1xuICAgICAgd2hpbGUgKHBhcnNlci5pc05lc3RpbmcoKSB8fCBwYXJzZXIuaXNTdHJpbmcoKSkge1xuICAgICAgICB2YXIgcmVzdCA9IC86KFteOlxcbl0rKS8uZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgICAgaWYgKCFyZXN0KSBicmVhaztcblxuICAgICAgICB0b2sudmFsICs9IHJlc3RbMF07XG4gICAgICAgIHRoaXMuY29uc3VtZShyZXN0WzBdLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHJlc3RbMF0ubGVuZ3RoKTtcbiAgICAgICAgcGFyc2VyID0gY2hhcmFjdGVyUGFyc2VyKHRvay52YWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigtdG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHRvay52YWwpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9ed2hlblxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKCdOT19XSEVOX0VYUFJFU1NJT04nLCAnbWlzc2luZyBleHByZXNzaW9uIGZvciB3aGVuJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0LlxuICAgKi9cblxuICBkZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eZGVmYXVsdC8sICdkZWZhdWx0Jyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9eZGVmYXVsdFxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnREVGQVVMVF9XSVRIX0VYUFJFU1NJT04nLFxuICAgICAgICAnZGVmYXVsdCBzaG91bGQgbm90IGhhdmUgYW4gZXhwcmVzc2lvbidcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDYWxsIG1peGluLlxuICAgKi9cblxuICBjYWxsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rLCBjYXB0dXJlcywgaW5jcmVtZW50O1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXlxcKyhcXHMqKSgoWy1cXHddKyl8KCNcXHspKS8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIC8vIHRyeSB0byBjb25zdW1lIHNpbXBsZSBvciBpbnRlcnBvbGF0ZWQgY2FsbFxuICAgICAgaWYgKGNhcHR1cmVzWzNdKSB7XG4gICAgICAgIC8vIHNpbXBsZSBjYWxsXG4gICAgICAgIGluY3JlbWVudCA9IGNhcHR1cmVzWzBdLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb25zdW1lKGluY3JlbWVudCk7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCdjYWxsJywgY2FwdHVyZXNbM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW50ZXJwb2xhdGVkIGNhbGxcbiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5icmFja2V0RXhwcmVzc2lvbigyICsgY2FwdHVyZXNbMV0ubGVuZ3RoKTtcbiAgICAgICAgaW5jcmVtZW50ID0gbWF0Y2guZW5kICsgMTtcbiAgICAgICAgdGhpcy5jb25zdW1lKGluY3JlbWVudCk7XG4gICAgICAgIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihtYXRjaC5zcmMpO1xuICAgICAgICB0b2sgPSB0aGlzLnRvaygnY2FsbCcsICcjeycgKyBtYXRjaC5zcmMgKyAnfScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihpbmNyZW1lbnQpO1xuXG4gICAgICB0b2suYXJncyA9IG51bGw7XG4gICAgICAvLyBDaGVjayBmb3IgYXJncyAobm90IGF0dHJpYnV0ZXMpXG4gICAgICBpZiAoKGNhcHR1cmVzID0gL14gKlxcKC8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5icmFja2V0RXhwcmVzc2lvbihjYXB0dXJlc1swXS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKCEvXlxccypbLVxcd10rICo9Ly50ZXN0KHJhbmdlLnNyYykpIHtcbiAgICAgICAgICAvLyBub3QgYXR0cmlidXRlc1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgIHRoaXMuY29uc3VtZShyYW5nZS5lbmQgKyAxKTtcbiAgICAgICAgICB0b2suYXJncyA9IHJhbmdlLnNyYztcbiAgICAgICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24oJ1snICsgdG9rLmFyZ3MgKyAnXScpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRvay5hcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodG9rLmFyZ3NbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWl4aW4uXG4gICAqL1xuXG4gIG1peGluOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9ebWl4aW4gKyhbLVxcd10rKSg/OiAqXFwoKC4qKVxcKSk/ICovLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnbWl4aW4nLCBjYXB0dXJlc1sxXSk7XG4gICAgICB0b2suYXJncyA9IGNhcHR1cmVzWzJdIHx8IG51bGw7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29uZGl0aW9uYWwuXG4gICAqL1xuXG4gIGNvbmRpdGlvbmFsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKGlmfHVubGVzc3xlbHNlIGlmfGVsc2UpXFxiKFteXFxuXSopLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdGhpcy5jb25zdW1lKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB2YXIgdHlwZSA9IGNhcHR1cmVzWzFdLnJlcGxhY2UoLyAvZywgJy0nKTtcbiAgICAgIHZhciBqcyA9IGNhcHR1cmVzWzJdICYmIGNhcHR1cmVzWzJdLnRyaW0oKTtcbiAgICAgIC8vIHR5cGUgY2FuIGJlIFwiaWZcIiwgXCJlbHNlLWlmXCIgYW5kIFwiZWxzZVwiXG4gICAgICB2YXIgdG9rID0gdGhpcy50b2sodHlwZSwganMpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0ganMubGVuZ3RoKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2lmJzpcbiAgICAgICAgY2FzZSAnZWxzZS1pZic6XG4gICAgICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5sZXNzJzpcbiAgICAgICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24oanMpO1xuICAgICAgICAgIHRvay52YWwgPSAnISgnICsganMgKyAnKSc7XG4gICAgICAgICAgdG9rLnR5cGUgPSAnaWYnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlbHNlJzpcbiAgICAgICAgICBpZiAoanMpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICdFTFNFX0NPTkRJVElPTicsXG4gICAgICAgICAgICAgICdgZWxzZWAgY2Fubm90IGhhdmUgYSBjb25kaXRpb24sIHBlcmhhcHMgeW91IG1lYW50IGBlbHNlIGlmYCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oanMubGVuZ3RoKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoaWxlLlxuICAgKi9cblxuICB3aGlsZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzLCB0b2s7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9ed2hpbGUgKyhbXlxcbl0rKS8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzFdKTtcbiAgICAgIHRvayA9IHRoaXMudG9rKCd3aGlsZScsIGNhcHR1cmVzWzFdKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYW4oL153aGlsZVxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKCdOT19XSElMRV9FWFBSRVNTSU9OJywgJ21pc3NpbmcgZXhwcmVzc2lvbiBmb3Igd2hpbGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVhY2guXG4gICAqL1xuXG4gIGVhY2g6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoXG4gICAgICAoY2FwdHVyZXMgPSAvXig/OmVhY2h8Zm9yKSArKFthLXpBLVpfJF1bXFx3JF0qKSg/OiAqLCAqKFthLXpBLVpfJF1bXFx3JF0qKSk/ICogaW4gKihbXlxcbl0rKS8uZXhlYyhcbiAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdmFyIHRvayA9IHRoaXMudG9rKCdlYWNoJywgY2FwdHVyZXNbMV0pO1xuICAgICAgdG9rLmtleSA9IGNhcHR1cmVzWzJdIHx8IG51bGw7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1szXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzNdKTtcbiAgICAgIHRvay5jb2RlID0gY2FwdHVyZXNbM107XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1szXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gL15lYWNoXFxiLy5leGVjKHRoaXMuaW5wdXQpID8gJ2VhY2gnIDogJ2Zvcic7XG4gICAgaWYgKHRoaXMuc2NhbigvXig/OmVhY2h8Zm9yKVxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnTUFMRk9STUVEX0VBQ0gnLFxuICAgICAgICAnVGhpcyBgJyArXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgJ2AgaGFzIGEgc3ludGF4IGVycm9yLiBgJyArXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgJ2Agc3RhdGVtZW50cyBzaG91bGQgYmUgb2YgdGhlIGZvcm06IGAnICtcbiAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAnIFZBUklBQkxFX05BTUUgb2YgSlNfRVhQUkVTU0lPTmAnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAoY2FwdHVyZXMgPSAvXi0gKig/OmVhY2h8Zm9yKSArKFthLXpBLVpfJF1bXFx3JF0qKSg/OiAqLCAqKFthLXpBLVpfJF1bXFx3JF0qKSk/ICtpbiArKFteXFxuXSspLy5leGVjKFxuICAgICAgICB0aGlzLmlucHV0XG4gICAgICApKVxuICAgICkge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ01BTEZPUk1FRF9FQUNIJyxcbiAgICAgICAgJ1B1ZyBlYWNoIGFuZCBmb3Igc2hvdWxkIG5vIGxvbmdlciBiZSBwcmVmaXhlZCB3aXRoIGEgZGFzaCAoXCItXCIpLiBUaGV5IGFyZSBwdWcga2V5d29yZHMgYW5kIG5vdCBwYXJ0IG9mIEphdmFTY3JpcHQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVhY2hPZi5cbiAgICovXG5cbiAgZWFjaE9mOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKD86ZWFjaHxmb3IpICguKj8pIG9mICooW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnZWFjaE9mJywgY2FwdHVyZXNbMV0pO1xuICAgICAgdG9rLnZhbHVlID0gY2FwdHVyZXNbMV07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzJdKTtcbiAgICAgIHRvay5jb2RlID0gY2FwdHVyZXNbMl07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhKFxuICAgICAgICAgIC9eW2EtekEtWl8kXVtcXHckXSokLy50ZXN0KHRvay52YWx1ZS50cmltKCkpIHx8XG4gICAgICAgICAgL15cXFsgKlthLXpBLVpfJF1bXFx3JF0qICpcXCwgKlthLXpBLVpfJF1bXFx3JF0qICpcXF0kLy50ZXN0KFxuICAgICAgICAgICAgdG9rLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ01BTEZPUk1FRF9FQUNIX09GX0xWQUwnLFxuICAgICAgICAgICdUaGUgdmFsdWUgdmFyaWFibGUgZm9yIGVhY2ggbXVzdCBlaXRoZXIgYmUgYSB2YWxpZCBpZGVudGlmaWVyIChlLmcuIGBpdGVtYCkgb3IgYSBwYWlyIG9mIGlkZW50aWZpZXJzIGluIHNxdWFyZSBicmFja2V0cyAoZS5nLiBgW2tleSwgdmFsdWVdYCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKGNhcHR1cmVzID0gL14tICooPzplYWNofGZvcikgKyhbYS16QS1aXyRdW1xcdyRdKikoPzogKiwgKihbYS16QS1aXyRdW1xcdyRdKikpPyArb2YgKyhbXlxcbl0rKS8uZXhlYyhcbiAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdNQUxGT1JNRURfRUFDSCcsXG4gICAgICAgICdQdWcgZWFjaCBhbmQgZm9yIHNob3VsZCBub3QgYmUgcHJlZml4ZWQgd2l0aCBhIGRhc2ggKFwiLVwiKS4gVGhleSBhcmUgcHVnIGtleXdvcmRzIGFuZCBub3QgcGFydCBvZiBKYXZhU2NyaXB0LidcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb2RlLlxuICAgKi9cblxuICBjb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKCE/PXwtKVsgXFx0XSooW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB2YXIgZmxhZ3MgPSBjYXB0dXJlc1sxXTtcbiAgICAgIHZhciBjb2RlID0gY2FwdHVyZXNbMl07XG4gICAgICB2YXIgc2hvcnRlbmVkID0gMDtcbiAgICAgIGlmICh0aGlzLmludGVycG9sYXRlZCkge1xuICAgICAgICB2YXIgcGFyc2VkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZCA9IGNoYXJhY3RlclBhcnNlci5wYXJzZVVudGlsKGNvZGUsICddJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29kZS5sZW5ndGggKyBlcnIuaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICdOT19FTkRfQlJBQ0tFVCcsXG4gICAgICAgICAgICAgICdFbmQgb2YgbGluZSB3YXMgcmVhY2hlZCB3aXRoIG5vIGNsb3NpbmcgYnJhY2tldCBmb3IgaW50ZXJwb2xhdGlvbi4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOk1JU01BVENIRURfQlJBQ0tFVCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoJ0JSQUNLRVRfTUlTTUFUQ0gnLCBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2hvcnRlbmVkID0gY29kZS5sZW5ndGggLSBwYXJzZWQuZW5kO1xuICAgICAgICBjb2RlID0gcGFyc2VkLnNyYztcbiAgICAgIH1cbiAgICAgIHZhciBjb25zdW1lZCA9IGNhcHR1cmVzWzBdLmxlbmd0aCAtIHNob3J0ZW5lZDtcbiAgICAgIHRoaXMuY29uc3VtZShjb25zdW1lZCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJ2NvZGUnLCBjb2RlKTtcbiAgICAgIHRvay5tdXN0RXNjYXBlID0gZmxhZ3MuY2hhckF0KDApID09PSAnPSc7XG4gICAgICB0b2suYnVmZmVyID0gZmxhZ3MuY2hhckF0KDApID09PSAnPScgfHwgZmxhZ3MuY2hhckF0KDEpID09PSAnPSc7XG5cbiAgICAgIC8vIHAgI1shPSAgICBhYmNdIGhleVxuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIG9yaWdpbmFsIGNvbG5vXG4gICAgICAvLyAgICAgLS0tLS0tLS0tLS0tLS0gY2FwdHVyZXNbMF1cbiAgICAgIC8vICAgICAgICAgICAtLS0tLS0tLSBjYXB0dXJlc1syXVxuICAgICAgLy8gICAgIC0tLS0tLSAgICAgICAgIGNhcHR1cmVzWzBdIC0gY2FwdHVyZXNbMl1cbiAgICAgIC8vICAgICAgICAgICBeICAgICAgICBhZnRlciBjb2xub1xuXG4gICAgICAvLyA9ICAgYWJjXG4gICAgICAvLyBeICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgY29sbm9cbiAgICAgIC8vIC0tLS0tLS0gICAgICAgICAgICBjYXB0dXJlc1swXVxuICAgICAgLy8gICAgIC0tLSAgICAgICAgICAgIGNhcHR1cmVzWzJdXG4gICAgICAvLyAtLS0tICAgICAgICAgICAgICAgY2FwdHVyZXNbMF0gLSBjYXB0dXJlc1syXVxuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIGFmdGVyIGNvbG5vXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgaWYgKHRvay5idWZmZXIpIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihjb2RlKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcblxuICAgICAgLy8gcCAjWyE9ICAgIGFiY10gaGV5XG4gICAgICAvLyAgICAgICAgICAgXiAgICAgICAgb3JpZ2luYWwgY29sbm9cbiAgICAgIC8vICAgICAgICAgICAgICAtLS0tLSBzaG9ydGVuZWRcbiAgICAgIC8vICAgICAgICAgICAtLS0gICAgICBjb2RlXG4gICAgICAvLyAgICAgICAgICAgICAgXiAgICAgYWZ0ZXIgY29sbm9cblxuICAgICAgLy8gPSAgIGFiY1xuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIG9yaWdpbmFsIGNvbG5vXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgc2hvcnRlbmVkXG4gICAgICAvLyAgICAgLS0tICAgICAgICAgICAgY29kZVxuICAgICAgLy8gICAgICAgIF4gICAgICAgICAgIGFmdGVyIGNvbG5vXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjb2RlLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jayBjb2RlLlxuICAgKi9cbiAgYmxvY2tDb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuICAgIGlmICgodG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eLS8sICdibG9ja2NvZGUnKSkpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdwaXBlbGVzc1RleHQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQXR0cmlidXRlIE5hbWUuXG4gICAqL1xuICBhdHRyaWJ1dGU6IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBxdW90ZSA9ICcnO1xuICAgIHZhciBxdW90ZVJlID0gL1snXCJdLztcbiAgICB2YXIga2V5ID0gJyc7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBjb25zdW1lIGFsbCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUga2V5XG4gICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHN0cltpXSkpIGJyZWFrO1xuICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGkgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgdG9rID0gdGhpcy50b2soJ2F0dHJpYnV0ZScpO1xuXG4gICAgLy8gcXVvdGU/XG4gICAgaWYgKHF1b3RlUmUudGVzdChzdHJbaV0pKSB7XG4gICAgICBxdW90ZSA9IHN0cltpXTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGxvb3BpbmcgdGhyb3VnaCB0aGUga2V5XG4gICAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdW90ZSkge1xuICAgICAgICBpZiAoc3RyW2ldID09PSBxdW90ZSkge1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSB8fFxuICAgICAgICAgIHN0cltpXSA9PT0gJyEnIHx8XG4gICAgICAgICAgc3RyW2ldID09PSAnPScgfHxcbiAgICAgICAgICBzdHJbaV0gPT09ICcsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBrZXkgKz0gc3RyW2ldO1xuXG4gICAgICBpZiAoc3RyW2ldID09PSAnXFxuJykge1xuICAgICAgICB0aGlzLmluY3JlbWVudExpbmUoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbigxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0b2submFtZSA9IGtleTtcblxuICAgIHZhciB2YWx1ZVJlc3BvbnNlID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZShzdHIuc3Vic3RyKGkpKTtcblxuICAgIGlmICh2YWx1ZVJlc3BvbnNlLnZhbCkge1xuICAgICAgdG9rLnZhbCA9IHZhbHVlUmVzcG9uc2UudmFsO1xuICAgICAgdG9rLm11c3RFc2NhcGUgPSB2YWx1ZVJlc3BvbnNlLm11c3RFc2NhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdhcyBhIGJvb2xlYW4gYXR0cmlidXRlIChleDogYGlucHV0KGRpc2FibGVkKWApXG4gICAgICB0b2sudmFsID0gdHJ1ZTtcbiAgICAgIHRvay5tdXN0RXNjYXBlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdHIgPSB2YWx1ZVJlc3BvbnNlLnJlbWFpbmluZ1NvdXJjZTtcblxuICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoaSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZSBWYWx1ZS5cbiAgICovXG4gIGF0dHJpYnV0ZVZhbHVlOiBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcXVvdGVSZSA9IC9bJ1wiXS87XG4gICAgdmFyIHZhbCA9ICcnO1xuICAgIHZhciBkb25lLCBpLCB4O1xuICAgIHZhciBlc2NhcGVBdHRyID0gdHJ1ZTtcbiAgICB2YXIgc3RhdGUgPSBjaGFyYWN0ZXJQYXJzZXIuZGVmYXVsdFN0YXRlKCk7XG4gICAgdmFyIGNvbCA9IHRoaXMuY29sbm87XG4gICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVubztcblxuICAgIC8vIGNvbnN1bWUgYWxsIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBlcXVhbHMgc2lnblxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbaV0pKSBicmVhaztcbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIGxpbmUrKztcbiAgICAgICAgY29sID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge3JlbWFpbmluZ1NvdXJjZTogc3RyfTtcbiAgICB9XG5cbiAgICBpZiAoc3RyW2ldID09PSAnIScpIHtcbiAgICAgIGVzY2FwZUF0dHIgPSBmYWxzZTtcbiAgICAgIGNvbCsrO1xuICAgICAgaSsrO1xuICAgICAgaWYgKHN0cltpXSAhPT0gJz0nKVxuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX0tFWV9DSEFSQUNURVInLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGNoYXJhY3RlciAnICsgc3RyW2ldICsgJyBleHBlY3RlZCBgPWAnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpXSAhPT0gJz0nKSB7XG4gICAgICAvLyBjaGVjayBmb3IgYW50aS1wYXR0ZXJuIGBkaXYoXCJmb29cImJhcilgXG4gICAgICBpZiAoaSA9PT0gMCAmJiBzdHIgJiYgIXRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyWzBdKSAmJiBzdHJbMF0gIT09ICcsJykge1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX0tFWV9DSEFSQUNURVInLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGNoYXJhY3RlciAnICsgc3RyWzBdICsgJyBleHBlY3RlZCBgPWAnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3JlbWFpbmluZ1NvdXJjZTogc3RyfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpbmVubyA9IGxpbmU7XG4gICAgdGhpcy5jb2xubyA9IGNvbCArIDE7XG4gICAgaSsrO1xuXG4gICAgLy8gY29uc3VtZSBhbGwgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIHZhbHVlXG4gICAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbaV0pKSBicmVhaztcbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpbmUgPSB0aGlzLmxpbmVubztcbiAgICBjb2wgPSB0aGlzLmNvbG5vO1xuXG4gICAgLy8gc3RhcnQgbG9vcGluZyB0aHJvdWdoIHRoZSB2YWx1ZVxuICAgIGZvciAoOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBpZiB0aGUgY2hhcmFjdGVyIGlzIGluIGEgc3RyaW5nIG9yIGluIHBhcmVudGhlc2VzL2JyYWNrZXRzL2JyYWNlc1xuICAgICAgaWYgKCEoc3RhdGUuaXNOZXN0aW5nKCkgfHwgc3RhdGUuaXNTdHJpbmcoKSkpIHtcbiAgICAgICAgaWYgKHRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSkge1xuICAgICAgICAgIGRvbmUgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlclxuICAgICAgICAgIGZvciAoeCA9IGk7IHggPCBzdHIubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbeF0pKSB7XG4gICAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgSmF2YVNjcmlwdCBwdW5jdHVhdG9yLCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzXG4gICAgICAgICAgICAgIC8vIGEgcGFydCBvZiB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgY29uc3QgaXNOb3RQdW5jdHVhdG9yID0gIWNoYXJhY3RlclBhcnNlci5pc1B1bmN0dWF0b3Ioc3RyW3hdKTtcbiAgICAgICAgICAgICAgY29uc3QgaXNRdW90ZSA9IHF1b3RlUmUudGVzdChzdHJbeF0pO1xuICAgICAgICAgICAgICBjb25zdCBpc0NvbG9uID0gc3RyW3hdID09PSAnOic7XG4gICAgICAgICAgICAgIGNvbnN0IGlzU3ByZWFkT3BlcmF0b3IgPVxuICAgICAgICAgICAgICAgIHN0clt4XSArIHN0clt4ICsgMV0gKyBzdHJbeCArIDJdID09PSAnLi4uJztcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc05vdFB1bmN0dWF0b3IgfHwgaXNRdW90ZSB8fCBpc0NvbG9uIHx8IGlzU3ByZWFkT3BlcmF0b3IpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHZhbCwgdHJ1ZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBlbHNlIGlzIHdoaXRlc3BhY2UsIHJldHVybiBub3cgc28gbGFzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAvLyBkb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgICBpZiAoZG9uZSB8fCB4ID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIHdoaXRlc3BhY2UgYW5kIHRoZSBjaGFyYWN0ZXIgaXMgbm90ICcsJywgdGhlXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBkaWQgbm90IGVuZC5cbiAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnICYmIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbih2YWwsIHRydWUpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RhdGUgPSBjaGFyYWN0ZXJQYXJzZXIucGFyc2VDaGFyKHN0cltpXSwgc3RhdGUpO1xuICAgICAgdmFsICs9IHN0cltpXTtcblxuICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgbGluZSsrO1xuICAgICAgICBjb2wgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHZhbCk7XG5cbiAgICB0aGlzLmxpbmVubyA9IGxpbmU7XG4gICAgdGhpcy5jb2xubyA9IGNvbDtcblxuICAgIHJldHVybiB7dmFsOiB2YWwsIG11c3RFc2NhcGU6IGVzY2FwZUF0dHIsIHJlbWFpbmluZ1NvdXJjZTogc3RyLnN1YnN0cihpKX07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMuXG4gICAqL1xuXG4gIGF0dHJzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuXG4gICAgaWYgKCcoJyA9PSB0aGlzLmlucHV0LmNoYXJBdCgwKSkge1xuICAgICAgdG9rID0gdGhpcy50b2soJ3N0YXJ0LWF0dHJpYnV0ZXMnKTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oKS5lbmQ7XG4gICAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zdWJzdHIoMSwgaW5kZXggLSAxKTtcblxuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5hc3NlcnROZXN0aW5nQ29ycmVjdChzdHIpO1xuICAgICAgdGhpcy5jb25zdW1lKGluZGV4ICsgMSk7XG5cbiAgICAgIHdoaWxlIChzdHIpIHtcbiAgICAgICAgc3RyID0gdGhpcy5hdHRyaWJ1dGUoc3RyKTtcbiAgICAgIH1cblxuICAgICAgdG9rID0gdGhpcy50b2soJ2VuZC1hdHRyaWJ1dGVzJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigxKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqICZhdHRyaWJ1dGVzIGJsb2NrXG4gICAqL1xuICBhdHRyaWJ1dGVzQmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmICgvXiZhdHRyaWJ1dGVzXFxiLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICB2YXIgY29uc3VtZWQgPSAxMTtcbiAgICAgIHRoaXMuY29uc3VtZShjb25zdW1lZCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJyZhdHRyaWJ1dGVzJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjb25zdW1lZCk7XG4gICAgICB2YXIgYXJncyA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oKTtcbiAgICAgIGNvbnN1bWVkID0gYXJncy5lbmQgKyAxO1xuICAgICAgdGhpcy5jb25zdW1lKGNvbnN1bWVkKTtcbiAgICAgIHRvay52YWwgPSBhcmdzLnNyYztcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNvbnN1bWVkKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluZGVudCB8IE91dGRlbnQgfCBOZXdsaW5lLlxuICAgKi9cblxuICBpbmRlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcyA9IHRoaXMuc2NhbkluZGVudGF0aW9uKCk7XG4gICAgdmFyIHRvaztcblxuICAgIGlmIChjYXB0dXJlcykge1xuICAgICAgdmFyIGluZGVudHMgPSBjYXB0dXJlc1sxXS5sZW5ndGg7XG5cbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIHRoaXMuY29uc3VtZShpbmRlbnRzICsgMSk7XG5cbiAgICAgIGlmICgnICcgPT0gdGhpcy5pbnB1dFswXSB8fCAnXFx0JyA9PSB0aGlzLmlucHV0WzBdKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ0lOVkFMSURfSU5ERU5UQVRJT04nLFxuICAgICAgICAgICdJbnZhbGlkIGluZGVudGF0aW9uLCB5b3UgY2FuIHVzZSB0YWJzIG9yIHNwYWNlcyBidXQgbm90IGJvdGgnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJsYW5rIGxpbmVcbiAgICAgIGlmICgnXFxuJyA9PSB0aGlzLmlucHV0WzBdKSB7XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbkFsbG93ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tFbmQodGhpcy50b2soJ25ld2xpbmUnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG91dGRlbnRcbiAgICAgIGlmIChpbmRlbnRzIDwgdGhpcy5pbmRlbnRTdGFja1swXSkge1xuICAgICAgICB2YXIgb3V0ZGVudF9jb3VudCA9IDA7XG4gICAgICAgIHdoaWxlICh0aGlzLmluZGVudFN0YWNrWzBdID4gaW5kZW50cykge1xuICAgICAgICAgIGlmICh0aGlzLmluZGVudFN0YWNrWzFdIDwgaW5kZW50cykge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgJ0lOQ09OU0lTVEVOVF9JTkRFTlRBVElPTicsXG4gICAgICAgICAgICAgICdJbmNvbnNpc3RlbnQgaW5kZW50YXRpb24uIEV4cGVjdGluZyBlaXRoZXIgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRTdGFja1sxXSArXG4gICAgICAgICAgICAgICAgJyBvciAnICtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFN0YWNrWzBdICtcbiAgICAgICAgICAgICAgICAnIHNwYWNlcy90YWJzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dGRlbnRfY291bnQrKztcbiAgICAgICAgICB0aGlzLmluZGVudFN0YWNrLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG91dGRlbnRfY291bnQtLSkge1xuICAgICAgICAgIHRoaXMuY29sbm8gPSAxO1xuICAgICAgICAgIHRvayA9IHRoaXMudG9rKCdvdXRkZW50Jyk7XG4gICAgICAgICAgdGhpcy5jb2xubyA9IHRoaXMuaW5kZW50U3RhY2tbMF0gKyAxO1xuICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW5kZW50XG4gICAgICB9IGVsc2UgaWYgKGluZGVudHMgJiYgaW5kZW50cyAhPSB0aGlzLmluZGVudFN0YWNrWzBdKSB7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCdpbmRlbnQnLCBpbmRlbnRzKTtcbiAgICAgICAgdGhpcy5jb2xubyA9IDEgKyBpbmRlbnRzO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICB0aGlzLmluZGVudFN0YWNrLnVuc2hpZnQoaW5kZW50cyk7XG4gICAgICAgIC8vIG5ld2xpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCduZXdsaW5lJyk7XG4gICAgICAgIHRoaXMuY29sbm8gPSAxICsgTWF0aC5taW4odGhpcy5pbmRlbnRTdGFja1swXSB8fCAwLCBpbmRlbnRzKTtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgcGlwZWxlc3NUZXh0OiBmdW5jdGlvbiBwaXBlbGVzc1RleHQoaW5kZW50cykge1xuICAgIHdoaWxlICh0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdibGFuaycpKTtcblxuICAgIHZhciBjYXB0dXJlcyA9IHRoaXMuc2NhbkluZGVudGF0aW9uKCk7XG5cbiAgICBpbmRlbnRzID0gaW5kZW50cyB8fCAoY2FwdHVyZXMgJiYgY2FwdHVyZXNbMV0ubGVuZ3RoKTtcbiAgICBpZiAoaW5kZW50cyA+IHRoaXMuaW5kZW50U3RhY2tbMF0pIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodGhpcy50b2soJ3N0YXJ0LXBpcGVsZXNzLXRleHQnKSkpO1xuICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgdmFyIHRva2VuX2luZGVudCA9IFtdO1xuICAgICAgdmFyIGlzTWF0Y2g7XG4gICAgICAvLyBJbmRleCBpbiB0aGlzLmlucHV0LiBDYW4ndCB1c2UgdGhpcy5jb25zdW1lIGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCB0b1xuICAgICAgLy8gcmV0cnkgbGV4aW5nIHRoZSBibG9jay5cbiAgICAgIHZhciBzdHJpbmdQdHIgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICAvLyB0ZXh0IGhhcyBgXFxuYCBhcyBhIHByZWZpeFxuICAgICAgICB2YXIgaSA9IHRoaXMuaW5wdXQuc3Vic3RyKHN0cmluZ1B0ciArIDEpLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICBpZiAoLTEgPT0gaSkgaSA9IHRoaXMuaW5wdXQubGVuZ3RoIC0gc3RyaW5nUHRyIC0gMTtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuaW5wdXQuc3Vic3RyKHN0cmluZ1B0ciArIDEsIGkpO1xuICAgICAgICB2YXIgbGluZUNhcHR1cmVzID0gdGhpcy5pbmRlbnRSZS5leGVjKCdcXG4nICsgc3RyKTtcbiAgICAgICAgdmFyIGxpbmVJbmRlbnRzID0gbGluZUNhcHR1cmVzICYmIGxpbmVDYXB0dXJlc1sxXS5sZW5ndGg7XG4gICAgICAgIGlzTWF0Y2ggPSBsaW5lSW5kZW50cyA+PSBpbmRlbnRzO1xuICAgICAgICB0b2tlbl9pbmRlbnQucHVzaChpc01hdGNoKTtcbiAgICAgICAgaXNNYXRjaCA9IGlzTWF0Y2ggfHwgIXN0ci50cmltKCk7XG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgLy8gY29uc3VtZSB0ZXN0IGFsb25nIHdpdGggYFxcbmAgcHJlZml4IGlmIG1hdGNoXG4gICAgICAgICAgc3RyaW5nUHRyICs9IHN0ci5sZW5ndGggKyAxO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoaW5kZW50cykpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVJbmRlbnRzID4gdGhpcy5pbmRlbnRTdGFja1swXSkge1xuICAgICAgICAgIC8vIGxpbmUgaXMgaW5kZW50ZWQgbGVzcyB0aGFuIHRoZSBmaXJzdCBsaW5lIGJ1dCBpcyBzdGlsbCBpbmRlbnRlZFxuICAgICAgICAgIC8vIG5lZWQgdG8gcmV0cnkgbGV4aW5nIHRoZSB0ZXh0IGJsb2NrXG4gICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG4gICAgICAgICAgcmV0dXJuIHBpcGVsZXNzVGV4dC5jYWxsKHRoaXMsIGxpbmVDYXB0dXJlc1sxXS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLmlucHV0Lmxlbmd0aCAtIHN0cmluZ1B0ciAmJiBpc01hdGNoKTtcbiAgICAgIHRoaXMuY29uc3VtZShzdHJpbmdQdHIpO1xuICAgICAgd2hpbGUgKHRoaXMuaW5wdXQubGVuZ3RoID09PSAwICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPT09ICcnKVxuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICB0b2tlbnMuZm9yRWFjaChcbiAgICAgICAgZnVuY3Rpb24odG9rZW4sIGkpIHtcbiAgICAgICAgICB2YXIgdG9rO1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgICAgICBpZiAoaSAhPT0gMCkgdG9rID0gdGhpcy50b2soJ25ld2xpbmUnKTtcbiAgICAgICAgICBpZiAodG9rZW5faW5kZW50W2ldKSB0aGlzLmluY3JlbWVudENvbHVtbihpbmRlbnRzKTtcbiAgICAgICAgICBpZiAodG9rKSB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICAgIHRoaXMuYWRkVGV4dCgndGV4dCcsIHRva2VuKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICApO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0aGlzLnRvaygnZW5kLXBpcGVsZXNzLXRleHQnKSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTbGFzaC5cbiAgICovXG5cbiAgc2xhc2g6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL15cXC8vLCAnc2xhc2gnKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiAnOidcbiAgICovXG5cbiAgY29sb246IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL146ICsvLCAnOicpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgZmFpbDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5lcnJvcihcbiAgICAgICdVTkVYUEVDVEVEX1RFWFQnLFxuICAgICAgJ3VuZXhwZWN0ZWQgdGV4dCBcIicgKyB0aGlzLmlucHV0LnN1YnN0cigwLCA1KSArICdcIidcbiAgICApO1xuICB9LFxuXG4gIGNhbGxMZXhlckZ1bmN0aW9uOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIHJlc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdC5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuICAgIHZhciBwbHVnaW5BcmdzID0gW3RoaXNdLmNvbmNhdChyZXN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBsdWdpbiA9IHRoaXMucGx1Z2luc1tpXTtcbiAgICAgIGlmIChwbHVnaW5bZnVuY10gJiYgcGx1Z2luW2Z1bmNdLmFwcGx5KHBsdWdpbiwgcGx1Z2luQXJncykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzW2Z1bmNdLmFwcGx5KHRoaXMsIHJlc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBhZHZhbmNlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYmxhbmsnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZW9zJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2VuZEludGVycG9sYXRpb24nKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigneWllbGQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZG9jdHlwZScpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbnRlcnBvbGF0aW9uJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2Nhc2UnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignd2hlbicpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdkZWZhdWx0JykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2V4dGVuZHMnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYXBwZW5kJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3ByZXBlbmQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYmxvY2snKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignbWl4aW5CbG9jaycpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbmNsdWRlJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ21peGluJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2NhbGwnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY29uZGl0aW9uYWwnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZWFjaE9mJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2VhY2gnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignd2hpbGUnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigndGFnJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2ZpbHRlcicpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdibG9ja0NvZGUnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY29kZScpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpZCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdkb3QnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY2xhc3NOYW1lJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJzJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJpYnV0ZXNCbG9jaycpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbmRlbnQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigndGV4dCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCd0ZXh0SHRtbCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdjb21tZW50JykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3NsYXNoJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2NvbG9uJykgfHxcbiAgICAgIHRoaXMuZmFpbCgpXG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRva2VucyBmb3IgdGhlIGN1cnJlbnQgZmlsZVxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXkuPFRva2VuPn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGdldFRva2VuczogZnVuY3Rpb24oKSB7XG4gICAgd2hpbGUgKCF0aGlzLmVuZGVkKSB7XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdhZHZhbmNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfSxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXJyb3IgPSByZXF1aXJlKCdwdWctZXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpcENvbW1lbnRzO1xuXG5mdW5jdGlvbiB1bmV4cGVjdGVkVG9rZW4odHlwZSwgb2NjYXNpb24sIGZpbGVuYW1lLCBsaW5lKSB7XG4gIHZhciBtc2cgPSAnYCcgKyB0eXBlICsgJ2AgZW5jb3VudGVyZWQgd2hlbiAnICsgb2NjYXNpb247XG4gIHRocm93IGVycm9yKCdVTkVYUEVDVEVEX1RPS0VOJywgbXNnLCB7ZmlsZW5hbWU6IGZpbGVuYW1lLCBsaW5lOiBsaW5lfSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRGVmYXVsdDogc3RyaXAgdW5idWZmZXJlZCBjb21tZW50cyBhbmQgbGVhdmUgYnVmZmVyZWQgb25lcyBhbG9uZVxuICB2YXIgc3RyaXBVbmJ1ZmZlcmVkID0gb3B0aW9ucy5zdHJpcFVuYnVmZmVyZWQgIT09IGZhbHNlO1xuICB2YXIgc3RyaXBCdWZmZXJlZCA9IG9wdGlvbnMuc3RyaXBCdWZmZXJlZCA9PT0gdHJ1ZTtcbiAgdmFyIGZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZTtcblxuICB2YXIgb3V0ID0gW107XG4gIC8vIElmIHdlIGhhdmUgZW5jb3VudGVyZWQgYSBjb21tZW50IHRva2VuIGFuZCBhcmUgbm90IHN1cmUgaWYgd2UgaGF2ZSBnb3R0ZW5cbiAgLy8gb3V0IG9mIHRoZSBjb21tZW50IG9yIG5vdFxuICB2YXIgaW5Db21tZW50ID0gZmFsc2U7XG4gIC8vIElmIHdlIGFyZSBzdXJlIHRoYXQgd2UgYXJlIGluIGEgYmxvY2sgY29tbWVudCBhbmQgYWxsIHRva2VucyBleGNlcHRcbiAgLy8gYGVuZC1waXBlbGVzcy10ZXh0YCBzaG91bGQgYmUgaWdub3JlZFxuICB2YXIgaW5QaXBlbGVzc1RleHQgPSBmYWxzZTtcblxuICByZXR1cm4gaW5wdXQuZmlsdGVyKGZ1bmN0aW9uKHRvaykge1xuICAgIHN3aXRjaCAodG9rLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICBpZiAoaW5Db21tZW50KSB7XG4gICAgICAgICAgdW5leHBlY3RlZFRva2VuKFxuICAgICAgICAgICAgJ2NvbW1lbnQnLFxuICAgICAgICAgICAgJ2FscmVhZHkgaW4gYSBjb21tZW50JyxcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgdG9rLmxpbmVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluQ29tbWVudCA9IHRvay5idWZmZXIgPyBzdHJpcEJ1ZmZlcmVkIDogc3RyaXBVbmJ1ZmZlcmVkO1xuICAgICAgICAgIHJldHVybiAhaW5Db21tZW50O1xuICAgICAgICB9XG4gICAgICBjYXNlICdzdGFydC1waXBlbGVzcy10ZXh0JzpcbiAgICAgICAgaWYgKCFpbkNvbW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoaW5QaXBlbGVzc1RleHQpIHtcbiAgICAgICAgICB1bmV4cGVjdGVkVG9rZW4oXG4gICAgICAgICAgICAnc3RhcnQtcGlwZWxlc3MtdGV4dCcsXG4gICAgICAgICAgICAnYWxyZWFkeSBpbiBwaXBlbGVzcyB0ZXh0IG1vZGUnLFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICB0b2subGluZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaW5QaXBlbGVzc1RleHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICdlbmQtcGlwZWxlc3MtdGV4dCc6XG4gICAgICAgIGlmICghaW5Db21tZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpblBpcGVsZXNzVGV4dCkge1xuICAgICAgICAgIHVuZXhwZWN0ZWRUb2tlbihcbiAgICAgICAgICAgICdlbmQtcGlwZWxlc3MtdGV4dCcsXG4gICAgICAgICAgICAnbm90IGluIHBpcGVsZXNzIHRleHQgbW9kZScsXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIHRvay5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpblBpcGVsZXNzVGV4dCA9IGZhbHNlO1xuICAgICAgICBpbkNvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgYSBgdGV4dGAgcmlnaHQgYWZ0ZXIgYGNvbW1lbnRgIGJ1dCBiZWZvcmVcbiAgICAgIC8vIGBzdGFydC1waXBlbGVzcy10ZXh0YC4gVHJlYXQgaXQgYWNjb3JkaW5nbHkuXG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmV0dXJuICFpbkNvbW1lbnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW5QaXBlbGVzc1RleHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaW5Db21tZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRva2VuU3RyZWFtO1xuZnVuY3Rpb24gVG9rZW5TdHJlYW0odG9rZW5zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9rZW5zIG11c3QgYmUgcGFzc2VkIHRvIFRva2VuU3RyZWFtIGFzIGFuIGFycmF5LicpO1xuICB9XG4gIHRoaXMuX3Rva2VucyA9IHRva2Vucztcbn1cblRva2VuU3RyZWFtLnByb3RvdHlwZS5sb29rYWhlYWQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgaWYgKHRoaXMuX3Rva2Vucy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiBhIHN0cmVhbScpO1xuICB9XG4gIHJldHVybiB0aGlzLl90b2tlbnNbaW5kZXhdO1xufTtcblRva2VuU3RyZWFtLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fdG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCB0aGUgZW5kIG9mIGEgc3RyZWFtJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3Rva2Vuc1swXTtcbn07XG5Ub2tlblN0cmVhbS5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3Rva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiBhIHN0cmVhbScpO1xuICB9XG4gIHJldHVybiB0aGlzLl90b2tlbnMuc2hpZnQoKTtcbn07XG5Ub2tlblN0cmVhbS5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgdGhpcy5fdG9rZW5zLnVuc2hpZnQodG9rZW4pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAnYScsXG4gICdhYmJyJyxcbiAgJ2Fjcm9ueW0nLFxuICAnYicsXG4gICdicicsXG4gICdjb2RlJyxcbiAgJ2VtJyxcbiAgJ2ZvbnQnLFxuICAnaScsXG4gICdpbWcnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdtYXAnLFxuICAnc2FtcCcsXG4gICdzbWFsbCcsXG4gICdzcGFuJyxcbiAgJ3N0cm9uZycsXG4gICdzdWInLFxuICAnc3VwJyxcbl07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgVG9rZW5TdHJlYW0gPSByZXF1aXJlKCd0b2tlbi1zdHJlYW0nKTtcbnZhciBlcnJvciA9IHJlcXVpcmUoJ3B1Zy1lcnJvcicpO1xudmFyIGlubGluZVRhZ3MgPSByZXF1aXJlKCcuL2xpYi9pbmxpbmUtdGFncycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuZnVuY3Rpb24gcGFyc2UodG9rZW5zLCBvcHRpb25zKSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKHRva2Vucywgb3B0aW9ucyk7XG4gIHZhciBhc3QgPSBwYXJzZXIucGFyc2UoKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXN0KSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgUGFyc2VyYCB3aXRoIHRoZSBnaXZlbiBpbnB1dCBgc3RyYCBhbmQgYGZpbGVuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFBhcnNlcih0b2tlbnMsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0V4cGVjdGVkIHRva2VucyB0byBiZSBhbiBBcnJheSBidXQgZ290IFwiJyArIHR5cGVvZiB0b2tlbnMgKyAnXCInXG4gICAgKTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0V4cGVjdGVkIFwib3B0aW9uc1wiIHRvIGJlIGFuIG9iamVjdCBidXQgZ290IFwiJyArIHR5cGVvZiBvcHRpb25zICsgJ1wiJ1xuICAgICk7XG4gIH1cbiAgdGhpcy50b2tlbnMgPSBuZXcgVG9rZW5TdHJlYW0odG9rZW5zKTtcbiAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIHRoaXMuc3JjID0gb3B0aW9ucy5zcmM7XG4gIHRoaXMuaW5NaXhpbiA9IDA7XG4gIHRoaXMucGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucyB8fCBbXTtcbn1cblxuLyoqXG4gKiBQYXJzZXIgcHJvdG90eXBlLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBTYXZlIG9yaWdpbmFsIGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yOiBQYXJzZXIsXG5cbiAgZXJyb3I6IGZ1bmN0aW9uKGNvZGUsIG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdmFyIGVyciA9IGVycm9yKGNvZGUsIG1lc3NhZ2UsIHtcbiAgICAgIGxpbmU6IHRva2VuLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2tlbi5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICBzcmM6IHRoaXMuc3JjLFxuICAgIH0pO1xuICAgIHRocm93IGVycjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBuZXh0IHRva2VuIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgYWR2YW5jZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmFkdmFuY2UoKTtcbiAgfSxcblxuICAvKipcbiAgICogU2luZ2xlIHRva2VuIGxvb2thaGVhZC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgcGVlazogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLnBlZWsoKTtcbiAgfSxcblxuICAvKipcbiAgICogYG5gIHRva2VuIGxvb2thaGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgbG9va2FoZWFkOiBmdW5jdGlvbihuKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmxvb2thaGVhZChuKTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgaW5wdXQgcmV0dXJuaW5nIGEgc3RyaW5nIG9mIGpzIGZvciBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYmxvY2sgPSB0aGlzLmVtcHR5QmxvY2soMCk7XG5cbiAgICB3aGlsZSAoJ2VvcycgIT0gdGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgaWYgKCduZXdsaW5lJyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIGlmICgndGV4dC1odG1sJyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICAgIGJsb2NrLm5vZGVzID0gYmxvY2subm9kZXMuY29uY2F0KHRoaXMucGFyc2VUZXh0SHRtbCgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgICAgaWYgKGV4cHIpIHtcbiAgICAgICAgICBpZiAoZXhwci50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgICAgICBibG9jay5ub2RlcyA9IGJsb2NrLm5vZGVzLmNvbmNhdChleHByLm5vZGVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2subm9kZXMucHVzaChleHByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmxvY2s7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4cGVjdCB0aGUgZ2l2ZW4gdHlwZSwgb3IgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgZXhwZWN0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ0lOVkFMSURfVE9LRU4nLFxuICAgICAgICAnZXhwZWN0ZWQgXCInICsgdHlwZSArICdcIiwgYnV0IGdvdCBcIicgKyB0aGlzLnBlZWsoKS50eXBlICsgJ1wiJyxcbiAgICAgICAgdGhpcy5wZWVrKClcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGdpdmVuIGB0eXBlYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGFjY2VwdDogZnVuY3Rpb24odHlwZSkge1xuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9LFxuXG4gIGluaXRCbG9jazogZnVuY3Rpb24obGluZSwgbm9kZXMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoKGxpbmUgfCAwKSAhPT0gbGluZSkgdGhyb3cgbmV3IEVycm9yKCdgbGluZWAgaXMgbm90IGFuIGludGVnZXInKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2Bub2Rlc2AgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9jaycsXG4gICAgICBub2Rlczogbm9kZXMsXG4gICAgICBsaW5lOiBsaW5lLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfSxcblxuICBlbXB0eUJsb2NrOiBmdW5jdGlvbihsaW5lKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdEJsb2NrKGxpbmUsIFtdKTtcbiAgfSxcblxuICBydW5QbHVnaW46IGZ1bmN0aW9uKGNvbnRleHQsIHRvaykge1xuICAgIHZhciByZXN0ID0gW3RoaXNdO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0LnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG4gICAgdmFyIHBsdWdpbkNvbnRleHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbHVnaW4gPSB0aGlzLnBsdWdpbnNbaV07XG4gICAgICBpZiAocGx1Z2luW2NvbnRleHRdICYmIHBsdWdpbltjb250ZXh0XVt0b2sudHlwZV0pIHtcbiAgICAgICAgaWYgKHBsdWdpbkNvbnRleHQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ011bHRpcGxlIHBsdWdpbiBoYW5kbGVycyBmb3VuZCBmb3IgY29udGV4dCAnICtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29udGV4dCkgK1xuICAgICAgICAgICAgICAnLCB0b2tlbiB0eXBlICcgK1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0b2sudHlwZSlcbiAgICAgICAgICApO1xuICAgICAgICBwbHVnaW5Db250ZXh0ID0gcGx1Z2luW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGx1Z2luQ29udGV4dClcbiAgICAgIHJldHVybiBwbHVnaW5Db250ZXh0W3Rvay50eXBlXS5hcHBseShwbHVnaW5Db250ZXh0LCByZXN0KTtcbiAgfSxcblxuICAvKipcbiAgICogICB0YWdcbiAgICogfCBkb2N0eXBlXG4gICAqIHwgbWl4aW5cbiAgICogfCBpbmNsdWRlXG4gICAqIHwgZmlsdGVyXG4gICAqIHwgY29tbWVudFxuICAgKiB8IHRleHRcbiAgICogfCB0ZXh0LWh0bWxcbiAgICogfCBkb3RcbiAgICogfCBlYWNoXG4gICAqIHwgY29kZVxuICAgKiB8IHlpZWxkXG4gICAqIHwgaWRcbiAgICogfCBjbGFzc1xuICAgKiB8IGludGVycG9sYXRpb25cbiAgICovXG5cbiAgcGFyc2VFeHByOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVGFnKCk7XG4gICAgICBjYXNlICdtaXhpbic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTWl4aW4oKTtcbiAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCbG9jaygpO1xuICAgICAgY2FzZSAnbWl4aW4tYmxvY2snOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU1peGluQmxvY2soKTtcbiAgICAgIGNhc2UgJ2Nhc2UnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNhc2UoKTtcbiAgICAgIGNhc2UgJ2V4dGVuZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4dGVuZHMoKTtcbiAgICAgIGNhc2UgJ2luY2x1ZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUluY2x1ZGUoKTtcbiAgICAgIGNhc2UgJ2RvY3R5cGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURvY3R5cGUoKTtcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRmlsdGVyKCk7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb21tZW50KCk7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGNhc2UgJ2ludGVycG9sYXRlZC1jb2RlJzpcbiAgICAgIGNhc2UgJ3N0YXJ0LXB1Zy1pbnRlcnBvbGF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUZXh0KHtibG9jazogdHJ1ZX0pO1xuICAgICAgY2FzZSAndGV4dC1odG1sJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdEJsb2NrKHRoaXMucGVlaygpLmxvYy5zdGFydC5saW5lLCB0aGlzLnBhcnNlVGV4dEh0bWwoKSk7XG4gICAgICBjYXNlICdkb3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURvdCgpO1xuICAgICAgY2FzZSAnZWFjaCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRWFjaCgpO1xuICAgICAgY2FzZSAnZWFjaE9mJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFYWNoT2YoKTtcbiAgICAgIGNhc2UgJ2NvZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNvZGUoKTtcbiAgICAgIGNhc2UgJ2Jsb2NrY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2tDb2RlKCk7XG4gICAgICBjYXNlICdpZic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgIGNhc2UgJ3doaWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VXaGlsZSgpO1xuICAgICAgY2FzZSAnY2FsbCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2FsbCgpO1xuICAgICAgY2FzZSAnaW50ZXJwb2xhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlSW50ZXJwb2xhdGlvbigpO1xuICAgICAgY2FzZSAneWllbGQnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVlpZWxkKCk7XG4gICAgICBjYXNlICdpZCc6XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIGlmICghdGhpcy5wZWVrKCkubG9jLnN0YXJ0KSBkZWJ1Z2dlcjtcbiAgICAgICAgdGhpcy50b2tlbnMuZGVmZXIoe1xuICAgICAgICAgIHR5cGU6ICd0YWcnLFxuICAgICAgICAgIHZhbDogJ2RpdicsXG4gICAgICAgICAgbG9jOiB0aGlzLnBlZWsoKS5sb2MsXG4gICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBwbHVnaW5SZXN1bHQgPSB0aGlzLnJ1blBsdWdpbignZXhwcmVzc2lvblRva2VucycsIHRoaXMucGVlaygpKTtcbiAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgcmV0dXJuIHBsdWdpblJlc3VsdDtcbiAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAnSU5WQUxJRF9UT0tFTicsXG4gICAgICAgICAgJ3VuZXhwZWN0ZWQgdG9rZW4gXCInICsgdGhpcy5wZWVrKCkudHlwZSArICdcIicsXG4gICAgICAgICAgdGhpcy5wZWVrKClcbiAgICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VEb3Q6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGV4dEJsb2NrKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRleHRcbiAgICovXG5cbiAgcGFyc2VUZXh0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIHRhZ3MgPSBbXTtcbiAgICB2YXIgbGluZW5vID0gdGhpcy5wZWVrKCkubG9jLnN0YXJ0LmxpbmU7XG4gICAgdmFyIG5leHRUb2sgPSB0aGlzLnBlZWsoKTtcbiAgICBsb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChuZXh0VG9rLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ludGVycG9sYXRlZC1jb2RlJzpcbiAgICAgICAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2RlJyxcbiAgICAgICAgICAgIHZhbDogdG9rLnZhbCxcbiAgICAgICAgICAgIGJ1ZmZlcjogdG9rLmJ1ZmZlcixcbiAgICAgICAgICAgIG11c3RFc2NhcGU6IHRvay5tdXN0RXNjYXBlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIGlzSW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMuYmxvY2spIGJyZWFrIGxvb3A7XG4gICAgICAgICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHZhciBuZXh0VHlwZSA9IHRoaXMucGVlaygpLnR5cGU7XG4gICAgICAgICAgaWYgKG5leHRUeXBlID09PSAndGV4dCcgfHwgbmV4dFR5cGUgPT09ICdpbnRlcnBvbGF0ZWQtY29kZScpIHtcbiAgICAgICAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdmFsOiAnXFxuJyxcbiAgICAgICAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhcnQtcHVnLWludGVycG9sYXRpb24nOlxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRhZ3MucHVzaCh0aGlzLnBhcnNlRXhwcigpKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCgnZW5kLXB1Zy1pbnRlcnBvbGF0aW9uJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKCd0ZXh0VG9rZW5zJywgbmV4dFRvaywgdGFncyk7XG4gICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgYnJlYWs7XG4gICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgIH1cbiAgICAgIG5leHRUb2sgPSB0aGlzLnBlZWsoKTtcbiAgICB9XG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAxKSByZXR1cm4gdGFnc1swXTtcbiAgICBlbHNlIHJldHVybiB0aGlzLmluaXRCbG9jayhsaW5lbm8sIHRhZ3MpO1xuICB9LFxuXG4gIHBhcnNlVGV4dEh0bWw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciBjdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICd0ZXh0LWh0bWwnOlxuICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdmFsOiB0ZXh0LnZhbCxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgICAgIGxpbmU6IHRleHQubG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogdGV4dC5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgICBpc0h0bWw6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnZhbCArPSAnXFxuJyArIHRleHQudmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaW5kZW50JzpcbiAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgICAgICAgYmxvY2subm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0h0bWwpIHtcbiAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS52YWwgKz0gJ1xcbicgKyBub2RlLnZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb2RlJzpcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgbm9kZXMucHVzaCh0aGlzLnBhcnNlQ29kZSh0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlcztcbiAgfSxcblxuICAvKipcbiAgICogICAnOicgZXhwclxuICAgKiB8IGJsb2NrXG4gICAqL1xuXG4gIHBhcnNlQmxvY2tFeHBhbnNpb246IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmFjY2VwdCgnOicpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgIHJldHVybiBleHByLnR5cGUgPT09ICdCbG9jaydcbiAgICAgICAgPyBleHByXG4gICAgICAgIDogdGhpcy5pbml0QmxvY2sodG9rLmxvYy5zdGFydC5saW5lLCBbZXhwcl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5ibG9jaygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogY2FzZVxuICAgKi9cblxuICBwYXJzZUNhc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnY2FzZScpO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0Nhc2UnLFxuICAgICAgZXhwcjogdG9rLnZhbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSArIDEpO1xuICAgIHRoaXMuZXhwZWN0KCdpbmRlbnQnKTtcbiAgICB3aGlsZSAoJ291dGRlbnQnICE9IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3doZW4nOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZVdoZW4oKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZURlZmF1bHQoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKCdjYXNlVG9rZW5zJywgdGhpcy5wZWVrKCksIGJsb2NrKTtcbiAgICAgICAgICBpZiAocGx1Z2luUmVzdWx0KSBicmVhaztcbiAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgJ0lOVkFMSURfVE9LRU4nLFxuICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgdG9rZW4gXCInICtcbiAgICAgICAgICAgICAgdGhpcy5wZWVrKCkudHlwZSArXG4gICAgICAgICAgICAgICdcIiwgZXhwZWN0ZWQgXCJ3aGVuXCIsIFwiZGVmYXVsdFwiIG9yIFwibmV3bGluZVwiJyxcbiAgICAgICAgICAgIHRoaXMucGVlaygpXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5leHBlY3QoJ291dGRlbnQnKTtcblxuICAgIG5vZGUuYmxvY2sgPSBibG9jaztcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuXG4gIC8qKlxuICAgKiB3aGVuXG4gICAqL1xuXG4gIHBhcnNlV2hlbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCd3aGVuJyk7XG4gICAgaWYgKHRoaXMucGVlaygpLnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ1doZW4nLFxuICAgICAgICBleHByOiB0b2sudmFsLFxuICAgICAgICBibG9jazogdGhpcy5wYXJzZUJsb2NrRXhwYW5zaW9uKCksXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdXaGVuJyxcbiAgICAgICAgZXhwcjogdG9rLnZhbCxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGRlZmF1bHRcbiAgICovXG5cbiAgcGFyc2VEZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5leHBlY3QoJ2RlZmF1bHQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1doZW4nLFxuICAgICAgZXhwcjogJ2RlZmF1bHQnLFxuICAgICAgYmxvY2s6IHRoaXMucGFyc2VCbG9ja0V4cGFuc2lvbigpLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvZGVcbiAgICovXG5cbiAgcGFyc2VDb2RlOiBmdW5jdGlvbihub0Jsb2NrKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdjb2RlJyk7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIHRvay5tdXN0RXNjYXBlID09PSAnYm9vbGVhbicsXG4gICAgICAnUGxlYXNlIHVwZGF0ZSB0byB0aGUgbmV3ZXN0IHZlcnNpb24gb2YgcHVnLWxleGVyLidcbiAgICApO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0NvZGUnLFxuICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgYnVmZmVyOiB0b2suYnVmZmVyLFxuICAgICAgbXVzdEVzY2FwZTogdG9rLm11c3RFc2NhcGUgIT09IGZhbHNlLFxuICAgICAgaXNJbmxpbmU6ICEhbm9CbG9jayxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICAgIC8vIHRvZG86IHdoeSBpcyB0aGlzIGhlcmU/ICBJdCBzZWVtcyBsaWtlIGEgaGFja3kgd29ya2Fyb3VuZFxuICAgIGlmIChub2RlLnZhbC5tYXRjaCgvXiAqZWxzZS8pKSBub2RlLmRlYnVnID0gZmFsc2U7XG5cbiAgICBpZiAobm9CbG9jaykgcmV0dXJuIG5vZGU7XG5cbiAgICB2YXIgYmxvY2s7XG5cbiAgICAvLyBoYW5kbGUgYmxvY2tcbiAgICBibG9jayA9ICdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGU7XG4gICAgaWYgKGJsb2NrKSB7XG4gICAgICBpZiAodG9rLmJ1ZmZlcikge1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdCTE9DS19JTl9CVUZGRVJFRF9DT0RFJyxcbiAgICAgICAgICAnQnVmZmVyZWQgY29kZSBjYW5ub3QgaGF2ZSBhIGJsb2NrIGF0dGFjaGVkIHRvIGl0JyxcbiAgICAgICAgICB0aGlzLnBlZWsoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbm9kZS5ibG9jayA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcbiAgcGFyc2VDb25kaXRpb25hbDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdpZicpO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0NvbmRpdGlvbmFsJyxcbiAgICAgIHRlc3Q6IHRvay52YWwsXG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGFsdGVybmF0ZTogbnVsbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgLy8gaGFuZGxlIGJsb2NrXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIG5vZGUuY29uc2VxdWVudCA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSBub2RlO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ25ld2xpbmUnKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KCduZXdsaW5lJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09ICdlbHNlLWlmJykge1xuICAgICAgICB0b2sgPSB0aGlzLmV4cGVjdCgnZWxzZS1pZicpO1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmFsdGVybmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiAnQ29uZGl0aW9uYWwnLFxuICAgICAgICAgIHRlc3Q6IHRvay52YWwsXG4gICAgICAgICAgY29uc2VxdWVudDogdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSksXG4gICAgICAgICAgYWx0ZXJuYXRlOiBudWxsLFxuICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoJ2luZGVudCcgPT0gdGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICAgIGN1cnJlbnROb2RlLmNvbnNlcXVlbnQgPSB0aGlzLmJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ2Vsc2UnKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KCdlbHNlJyk7XG4gICAgICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnaW5kZW50Jykge1xuICAgICAgICAgIGN1cnJlbnROb2RlLmFsdGVybmF0ZSA9IHRoaXMuYmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBwYXJzZVdoaWxlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5leHBlY3QoJ3doaWxlJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnV2hpbGUnLFxuICAgICAgdGVzdDogdG9rLnZhbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgLy8gaGFuZGxlIGJsb2NrXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIG5vZGUuYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYmxvY2sgPSB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcblxuICAvKipcbiAgICogYmxvY2sgY29kZVxuICAgKi9cblxuICBwYXJzZUJsb2NrQ29kZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdibG9ja2NvZGUnKTtcbiAgICB2YXIgbGluZSA9IHRvay5sb2Muc3RhcnQubGluZTtcbiAgICB2YXIgY29sdW1uID0gdG9rLmxvYy5zdGFydC5jb2x1bW47XG4gICAgdmFyIGJvZHkgPSB0aGlzLnBlZWsoKTtcbiAgICB2YXIgdGV4dCA9ICcnO1xuICAgIGlmIChib2R5LnR5cGUgPT09ICdzdGFydC1waXBlbGVzcy10ZXh0Jykge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB3aGlsZSAodGhpcy5wZWVrKCkudHlwZSAhPT0gJ2VuZC1waXBlbGVzcy10ZXh0Jykge1xuICAgICAgICB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgc3dpdGNoICh0b2sudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgdGV4dCArPSB0b2sudmFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICB0ZXh0ICs9ICdcXG4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBwbHVnaW5SZXN1bHQgPSB0aGlzLnJ1blBsdWdpbignYmxvY2tDb2RlVG9rZW5zJywgdG9rLCB0b2spO1xuICAgICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkge1xuICAgICAgICAgICAgICB0ZXh0ICs9IHBsdWdpblJlc3VsdDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAnSU5WQUxJRF9UT0tFTicsXG4gICAgICAgICAgICAgICdVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICcgKyB0b2sudHlwZSxcbiAgICAgICAgICAgICAgdG9rXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdDb2RlJyxcbiAgICAgIHZhbDogdGV4dCxcbiAgICAgIGJ1ZmZlcjogZmFsc2UsXG4gICAgICBtdXN0RXNjYXBlOiBmYWxzZSxcbiAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBjb21tZW50XG4gICAqL1xuXG4gIHBhcnNlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdjb21tZW50Jyk7XG4gICAgdmFyIGJsb2NrO1xuICAgIGlmICgoYmxvY2sgPSB0aGlzLnBhcnNlVGV4dEJsb2NrKCkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnQmxvY2tDb21tZW50JyxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBibG9jazogYmxvY2ssXG4gICAgICAgIGJ1ZmZlcjogdG9rLmJ1ZmZlcixcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdDb21tZW50JyxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBidWZmZXI6IHRvay5idWZmZXIsXG4gICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogZG9jdHlwZVxuICAgKi9cblxuICBwYXJzZURvY3R5cGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZG9jdHlwZScpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRG9jdHlwZScsXG4gICAgICB2YWw6IHRvay52YWwsXG4gICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUluY2x1ZGVGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgdmFyIGF0dHJzID0gW107XG5cbiAgICBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ3N0YXJ0LWF0dHJpYnV0ZXMnKSB7XG4gICAgICBhdHRycyA9IHRoaXMuYXR0cnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0luY2x1ZGVGaWx0ZXInLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaWx0ZXIgYXR0cnM/IHRleHQtYmxvY2tcbiAgICovXG5cbiAgcGFyc2VGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgdmFyIGJsb2NrLFxuICAgICAgYXR0cnMgPSBbXTtcblxuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnc3RhcnQtYXR0cmlidXRlcycpIHtcbiAgICAgIGF0dHJzID0gdGhpcy5hdHRycygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHZhciB0ZXh0VG9rZW4gPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGJsb2NrID0gdGhpcy5pbml0QmxvY2sodGV4dFRva2VuLmxvYy5zdGFydC5saW5lLCBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgdmFsOiB0ZXh0VG9rZW4udmFsLFxuICAgICAgICAgIGxpbmU6IHRleHRUb2tlbi5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICBjb2x1bW46IHRleHRUb2tlbi5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgYmxvY2sgPSB0aGlzLmluaXRCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUsIFt0aGlzLnBhcnNlRmlsdGVyKCldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmxvY2sgPSB0aGlzLnBhcnNlVGV4dEJsb2NrKCkgfHwgdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdGaWx0ZXInLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBlYWNoIGJsb2NrXG4gICAqL1xuXG4gIHBhcnNlRWFjaDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdlYWNoJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnRWFjaCcsXG4gICAgICBvYmo6IHRvay5jb2RlLFxuICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAga2V5OiB0b2sua2V5LFxuICAgICAgYmxvY2s6IHRoaXMuYmxvY2soKSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09ICdlbHNlJykge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG5cbiAgcGFyc2VFYWNoT2Y6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZWFjaE9mJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnRWFjaE9mJyxcbiAgICAgIG9iajogdG9rLmNvZGUsXG4gICAgICB2YWw6IHRvay52YWwsXG4gICAgICBibG9jazogdGhpcy5ibG9jaygpLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG4gIC8qKlxuICAgKiAnZXh0ZW5kcycgbmFtZVxuICAgKi9cblxuICBwYXJzZUV4dGVuZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZXh0ZW5kcycpO1xuICAgIHZhciBwYXRoID0gdGhpcy5leHBlY3QoJ3BhdGgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0V4dGVuZHMnLFxuICAgICAgZmlsZToge1xuICAgICAgICB0eXBlOiAnRmlsZVJlZmVyZW5jZScsXG4gICAgICAgIHBhdGg6IHBhdGgudmFsLnRyaW0oKSxcbiAgICAgICAgbGluZTogcGF0aC5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgY29sdW1uOiBwYXRoLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgfSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiAnYmxvY2snIG5hbWUgYmxvY2tcbiAgICovXG5cbiAgcGFyc2VCbG9jazogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdibG9jaycpO1xuXG4gICAgdmFyIG5vZGUgPVxuICAgICAgJ2luZGVudCcgPT0gdGhpcy5wZWVrKCkudHlwZVxuICAgICAgICA/IHRoaXMuYmxvY2soKVxuICAgICAgICA6IHRoaXMuZW1wdHlCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUpO1xuICAgIG5vZGUudHlwZSA9ICdOYW1lZEJsb2NrJztcbiAgICBub2RlLm5hbWUgPSB0b2sudmFsLnRyaW0oKTtcbiAgICBub2RlLm1vZGUgPSB0b2subW9kZTtcbiAgICBub2RlLmxpbmUgPSB0b2subG9jLnN0YXJ0LmxpbmU7XG4gICAgbm9kZS5jb2x1bW4gPSB0b2subG9jLnN0YXJ0LmNvbHVtbjtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuXG4gIHBhcnNlTWl4aW5CbG9jazogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdtaXhpbi1ibG9jaycpO1xuICAgIGlmICghdGhpcy5pbk1peGluKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnQkxPQ0tfT1VUSVNERV9NSVhJTicsXG4gICAgICAgICdBbm9ueW1vdXMgYmxvY2tzIGFyZSBub3QgYWxsb3dlZCB1bmxlc3MgdGhleSBhcmUgcGFydCBvZiBhIG1peGluLicsXG4gICAgICAgIHRva1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNaXhpbkJsb2NrJyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIHBhcnNlWWllbGQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgneWllbGQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1lpZWxkQmxvY2snLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGluY2x1ZGUgYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlSW5jbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdpbmNsdWRlJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnSW5jbHVkZScsXG4gICAgICBmaWxlOiB7XG4gICAgICAgIHR5cGU6ICdGaWxlUmVmZXJlbmNlJyxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICB9LFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gICAgdmFyIGZpbHRlcnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIGZpbHRlcnMucHVzaCh0aGlzLnBhcnNlSW5jbHVkZUZpbHRlcigpKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSB0aGlzLmV4cGVjdCgncGF0aCcpO1xuXG4gICAgbm9kZS5maWxlLnBhdGggPSBwYXRoLnZhbC50cmltKCk7XG4gICAgbm9kZS5maWxlLmxpbmUgPSBwYXRoLmxvYy5zdGFydC5saW5lO1xuICAgIG5vZGUuZmlsZS5jb2x1bW4gPSBwYXRoLmxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBpZiAoXG4gICAgICAoL1xcLmphZGUkLy50ZXN0KG5vZGUuZmlsZS5wYXRoKSB8fCAvXFwucHVnJC8udGVzdChub2RlLmZpbGUucGF0aCkpICYmXG4gICAgICAhZmlsdGVycy5sZW5ndGhcbiAgICApIHtcbiAgICAgIG5vZGUuYmxvY2sgPVxuICAgICAgICAnaW5kZW50JyA9PSB0aGlzLnBlZWsoKS50eXBlXG4gICAgICAgICAgPyB0aGlzLmJsb2NrKClcbiAgICAgICAgICA6IHRoaXMuZW1wdHlCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUpO1xuICAgICAgaWYgKC9cXC5qYWRlJC8udGVzdChub2RlLmZpbGUucGF0aCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIHRoaXMuZmlsZW5hbWUgK1xuICAgICAgICAgICAgJywgbGluZSAnICtcbiAgICAgICAgICAgIHRvay5sb2Muc3RhcnQubGluZSArXG4gICAgICAgICAgICAnOlxcblRoZSAuamFkZSBleHRlbnNpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC5wdWcgZm9yIFwiJyArXG4gICAgICAgICAgICBub2RlLmZpbGUucGF0aCArXG4gICAgICAgICAgICAnXCIuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnR5cGUgPSAnUmF3SW5jbHVkZSc7XG4gICAgICBub2RlLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09ICdpbmRlbnQnKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ1JBV19JTkNMVURFX0JMT0NLJyxcbiAgICAgICAgICAnUmF3IGluY2x1c2lvbiBjYW5ub3QgY29udGFpbiBhIGJsb2NrJyxcbiAgICAgICAgICB0aGlzLnBlZWsoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsbCBpZGVudCBibG9ja1xuICAgKi9cblxuICBwYXJzZUNhbGw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnY2FsbCcpO1xuICAgIHZhciBuYW1lID0gdG9rLnZhbDtcbiAgICB2YXIgYXJncyA9IHRvay5hcmdzO1xuICAgIHZhciBtaXhpbiA9IHtcbiAgICAgIHR5cGU6ICdNaXhpbicsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgYXJnczogYXJncyxcbiAgICAgIGJsb2NrOiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGNhbGw6IHRydWUsXG4gICAgICBhdHRyczogW10sXG4gICAgICBhdHRyaWJ1dGVCbG9ja3M6IFtdLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG5cbiAgICB0aGlzLnRhZyhtaXhpbik7XG4gICAgaWYgKG1peGluLmNvZGUpIHtcbiAgICAgIG1peGluLmJsb2NrLm5vZGVzLnB1c2gobWl4aW4uY29kZSk7XG4gICAgICBkZWxldGUgbWl4aW4uY29kZTtcbiAgICB9XG4gICAgaWYgKG1peGluLmJsb2NrLm5vZGVzLmxlbmd0aCA9PT0gMCkgbWl4aW4uYmxvY2sgPSBudWxsO1xuICAgIHJldHVybiBtaXhpbjtcbiAgfSxcblxuICAvKipcbiAgICogbWl4aW4gYmxvY2tcbiAgICovXG5cbiAgcGFyc2VNaXhpbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdtaXhpbicpO1xuICAgIHZhciBuYW1lID0gdG9rLnZhbDtcbiAgICB2YXIgYXJncyA9IHRvay5hcmdzO1xuXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHRoaXMuaW5NaXhpbisrO1xuICAgICAgdmFyIG1peGluID0ge1xuICAgICAgICB0eXBlOiAnTWl4aW4nLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICBibG9jazogdGhpcy5ibG9jaygpLFxuICAgICAgICBjYWxsOiBmYWxzZSxcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgICB0aGlzLmluTWl4aW4tLTtcbiAgICAgIHJldHVybiBtaXhpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ01JWElOX1dJVEhPVVRfQk9EWScsXG4gICAgICAgICdNaXhpbiAnICsgbmFtZSArICcgZGVjbGFyZWQgd2l0aG91dCBib2R5JyxcbiAgICAgICAgdG9rXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogaW5kZW50ICh0ZXh0IHwgbmV3bGluZSkqIG91dGRlbnRcbiAgICovXG5cbiAgcGFyc2VUZXh0QmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmFjY2VwdCgnc3RhcnQtcGlwZWxlc3MtdGV4dCcpO1xuICAgIGlmICghdG9rKSByZXR1cm47XG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgd2hpbGUgKHRoaXMucGVlaygpLnR5cGUgIT09ICdlbmQtcGlwZWxlc3MtdGV4dCcpIHtcbiAgICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHN3aXRjaCAodG9rLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgICAgdmFsOiAnXFxuJyxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhcnQtcHVnLWludGVycG9sYXRpb24nOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZUV4cHIoKSk7XG4gICAgICAgICAgdGhpcy5leHBlY3QoJ2VuZC1wdWctaW50ZXJwb2xhdGlvbicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpbnRlcnBvbGF0ZWQtY29kZSc6XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnQ29kZScsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBidWZmZXI6IHRvay5idWZmZXIsXG4gICAgICAgICAgICBtdXN0RXNjYXBlOiB0b2subXVzdEVzY2FwZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICBpc0lubGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXIgcGx1Z2luUmVzdWx0ID0gdGhpcy5ydW5QbHVnaW4oJ3RleHRCbG9ja1Rva2VucycsIHRvaywgYmxvY2ssIHRvayk7XG4gICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgYnJlYWs7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICdJTlZBTElEX1RPS0VOJyxcbiAgICAgICAgICAgICdVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICcgKyB0b2sudHlwZSxcbiAgICAgICAgICAgIHRva1xuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBibG9jaztcbiAgfSxcblxuICAvKipcbiAgICogaW5kZW50IGV4cHIqIG91dGRlbnRcbiAgICovXG5cbiAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnaW5kZW50Jyk7XG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgd2hpbGUgKCdvdXRkZW50JyAhPSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICBpZiAoJ25ld2xpbmUnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9IGVsc2UgaWYgKCd0ZXh0LWh0bWwnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgICAgYmxvY2subm9kZXMgPSBibG9jay5ub2Rlcy5jb25jYXQodGhpcy5wYXJzZVRleHRIdG1sKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcigpO1xuICAgICAgICBpZiAoZXhwci50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgICAgYmxvY2subm9kZXMgPSBibG9jay5ub2Rlcy5jb25jYXQoZXhwci5ub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaChleHByKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnb3V0ZGVudCcpO1xuICAgIHJldHVybiBibG9jaztcbiAgfSxcblxuICAvKipcbiAgICogaW50ZXJwb2xhdGlvbiAoYXR0cnMgfCBjbGFzcyB8IGlkKSogKHRleHQgfCBjb2RlIHwgJzonKT8gbmV3bGluZSogYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlSW50ZXJwb2xhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIHZhciB0YWcgPSB7XG4gICAgICB0eXBlOiAnSW50ZXJwb2xhdGVkVGFnJyxcbiAgICAgIGV4cHI6IHRvay52YWwsXG4gICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICBibG9jazogdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSksXG4gICAgICBhdHRyczogW10sXG4gICAgICBhdHRyaWJ1dGVCbG9ja3M6IFtdLFxuICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy50YWcodGFnLCB7c2VsZkNsb3NpbmdBbGxvd2VkOiB0cnVlfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRhZyAoYXR0cnMgfCBjbGFzcyB8IGlkKSogKHRleHQgfCBjb2RlIHwgJzonKT8gbmV3bGluZSogYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlVGFnOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHRhZyA9IHtcbiAgICAgIHR5cGU6ICdUYWcnLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIHNlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgIGJsb2NrOiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGF0dHJzOiBbXSxcbiAgICAgIGF0dHJpYnV0ZUJsb2NrczogW10sXG4gICAgICBpc0lubGluZTogaW5saW5lVGFncy5pbmRleE9mKHRvay52YWwpICE9PSAtMSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMudGFnKHRhZywge3NlbGZDbG9zaW5nQWxsb3dlZDogdHJ1ZX0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0YWcuXG4gICAqL1xuXG4gIHRhZzogZnVuY3Rpb24odGFnLCBvcHRpb25zKSB7XG4gICAgdmFyIHNlZW5BdHRycyA9IGZhbHNlO1xuICAgIHZhciBhdHRyaWJ1dGVOYW1lcyA9IFtdO1xuICAgIHZhciBzZWxmQ2xvc2luZ0FsbG93ZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuc2VsZkNsb3NpbmdBbGxvd2VkO1xuICAgIC8vIChhdHRycyB8IGNsYXNzIHwgaWQpKlxuICAgIG91dDogd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICdpZCc6XG4gICAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgaWYgKHRvay50eXBlID09PSAnaWQnKSB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5kZXhPZignaWQnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAnRFVQTElDQVRFX0lEJyxcbiAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGF0dHJpYnV0ZSBcImlkXCIgaXMgbm90IGFsbG93ZWQuJyxcbiAgICAgICAgICAgICAgICB0b2tcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWVzLnB1c2goJ2lkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhZy5hdHRycy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHRvay50eXBlLFxuICAgICAgICAgICAgdmFsOiBcIidcIiArIHRvay52YWwgKyBcIidcIixcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICAgIG11c3RFc2NhcGU6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlICdzdGFydC1hdHRyaWJ1dGVzJzpcbiAgICAgICAgICBpZiAoc2VlbkF0dHJzKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWUgK1xuICAgICAgICAgICAgICAgICcsIGxpbmUgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5wZWVrKCkubG9jLnN0YXJ0LmxpbmUgK1xuICAgICAgICAgICAgICAgICc6XFxuWW91IHNob3VsZCBub3QgaGF2ZSBwdWcgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VlbkF0dHJzID0gdHJ1ZTtcbiAgICAgICAgICB0YWcuYXR0cnMgPSB0YWcuYXR0cnMuY29uY2F0KHRoaXMuYXR0cnMoYXR0cmlidXRlTmFtZXMpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAnJmF0dHJpYnV0ZXMnOlxuICAgICAgICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB0YWcuYXR0cmlidXRlQmxvY2tzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ0F0dHJpYnV0ZUJsb2NrJyxcbiAgICAgICAgICAgIHZhbDogdG9rLnZhbCxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXIgcGx1Z2luUmVzdWx0ID0gdGhpcy5ydW5QbHVnaW4oXG4gICAgICAgICAgICAndGFnQXR0cmlidXRlVG9rZW5zJyxcbiAgICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwbHVnaW5SZXN1bHQpIGJyZWFrO1xuICAgICAgICAgIGJyZWFrIG91dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjaGVjayBpbW1lZGlhdGUgJy4nXG4gICAgaWYgKCdkb3QnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHRhZy50ZXh0T25seSA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICAvLyAodGV4dCB8IGNvZGUgfCAnOicpP1xuICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBjYXNlICdpbnRlcnBvbGF0ZWQtY29kZSc6XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5wYXJzZVRleHQoKTtcbiAgICAgICAgaWYgKHRleHQudHlwZSA9PT0gJ0Jsb2NrJykge1xuICAgICAgICAgIHRhZy5ibG9jay5ub2Rlcy5wdXNoLmFwcGx5KHRhZy5ibG9jay5ub2RlcywgdGV4dC5ub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2RlJzpcbiAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZUNvZGUodHJ1ZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzonOlxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcigpO1xuICAgICAgICB0YWcuYmxvY2sgPVxuICAgICAgICAgIGV4cHIudHlwZSA9PT0gJ0Jsb2NrJyA/IGV4cHIgOiB0aGlzLmluaXRCbG9jayh0YWcubGluZSwgW2V4cHJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgIGNhc2UgJ2luZGVudCc6XG4gICAgICBjYXNlICdvdXRkZW50JzpcbiAgICAgIGNhc2UgJ2Vvcyc6XG4gICAgICBjYXNlICdzdGFydC1waXBlbGVzcy10ZXh0JzpcbiAgICAgIGNhc2UgJ2VuZC1wdWctaW50ZXJwb2xhdGlvbic6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2xhc2gnOlxuICAgICAgICBpZiAoc2VsZkNsb3NpbmdBbGxvd2VkKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGFnLnNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKFxuICAgICAgICAgICd0YWdUb2tlbnMnLFxuICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwbHVnaW5SZXN1bHQpIGJyZWFrO1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX1RPS0VOJyxcbiAgICAgICAgICAnVW5leHBlY3RlZCB0b2tlbiBgJyArXG4gICAgICAgICAgICB0aGlzLnBlZWsoKS50eXBlICtcbiAgICAgICAgICAgICdgIGV4cGVjdGVkIGB0ZXh0YCwgYGludGVycG9sYXRlZC1jb2RlYCwgYGNvZGVgLCBgOmAnICtcbiAgICAgICAgICAgIChzZWxmQ2xvc2luZ0FsbG93ZWQgPyAnLCBgc2xhc2hgJyA6ICcnKSArXG4gICAgICAgICAgICAnLCBgbmV3bGluZWAgb3IgYGVvc2AnLFxuICAgICAgICAgIHRoaXMucGVlaygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbmV3bGluZSpcbiAgICB3aGlsZSAoJ25ld2xpbmUnID09IHRoaXMucGVlaygpLnR5cGUpIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgLy8gYmxvY2s/XG4gICAgaWYgKHRhZy50ZXh0T25seSkge1xuICAgICAgdGFnLmJsb2NrID0gdGhpcy5wYXJzZVRleHRCbG9jaygpIHx8IHRoaXMuZW1wdHlCbG9jayh0YWcubGluZSk7XG4gICAgfSBlbHNlIGlmICgnaW5kZW50JyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmxvY2subm9kZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2goYmxvY2subm9kZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWc7XG4gIH0sXG5cbiAgYXR0cnM6IGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgdGhpcy5leHBlY3QoJ3N0YXJ0LWF0dHJpYnV0ZXMnKTtcblxuICAgIHZhciBhdHRycyA9IFtdO1xuICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICB3aGlsZSAodG9rLnR5cGUgPT09ICdhdHRyaWJ1dGUnKSB7XG4gICAgICBpZiAodG9rLm5hbWUgIT09ICdjbGFzcycgJiYgYXR0cmlidXRlTmFtZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluZGV4T2YodG9rLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAnRFVQTElDQVRFX0FUVFJJQlVURScsXG4gICAgICAgICAgICAnRHVwbGljYXRlIGF0dHJpYnV0ZSBcIicgKyB0b2submFtZSArICdcIiBpcyBub3QgYWxsb3dlZC4nLFxuICAgICAgICAgICAgdG9rXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVOYW1lcy5wdXNoKHRvay5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGF0dHJzLnB1c2goe1xuICAgICAgICBuYW1lOiB0b2submFtZSxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICBtdXN0RXNjYXBlOiB0b2subXVzdEVzY2FwZSAhPT0gZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICB0aGlzLnRva2Vucy5kZWZlcih0b2spO1xuICAgIHRoaXMuZXhwZWN0KCdlbmQtYXR0cmlidXRlcycpO1xuICAgIHJldHVybiBhdHRycztcbiAgfSxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdhbGtBU1Q7XG5mdW5jdGlvbiB3YWxrQVNUKGFzdCwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucykge1xuICBpZiAoYWZ0ZXIgJiYgdHlwZW9mIGFmdGVyID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0gYWZ0ZXI7XG4gICAgYWZ0ZXIgPSBudWxsO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHtpbmNsdWRlRGVwZW5kZW5jaWVzOiBmYWxzZX07XG4gIHZhciBwYXJlbnRzID0gKG9wdGlvbnMucGFyZW50cyA9IG9wdGlvbnMucGFyZW50cyB8fCBbXSk7XG5cbiAgdmFyIHJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHJlcGxhY2VtZW50KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZW1lbnQpICYmICFyZXBsYWNlLmFycmF5QWxsb3dlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IGlmIHRoZSBsYXN0IHBhcmVudCBpcyBhIEJsb2NrIG9yIE5hbWVkQmxvY2snXG4gICAgICApO1xuICAgIH1cbiAgICBhc3QgPSByZXBsYWNlbWVudDtcbiAgfTtcbiAgcmVwbGFjZS5hcnJheUFsbG93ZWQgPVxuICAgIHBhcmVudHNbMF0gJiZcbiAgICAoL14oTmFtZWQpP0Jsb2NrJC8udGVzdChwYXJlbnRzWzBdLnR5cGUpIHx8XG4gICAgICAocGFyZW50c1swXS50eXBlID09PSAnUmF3SW5jbHVkZScgJiYgYXN0LnR5cGUgPT09ICdJbmNsdWRlRmlsdGVyJykpO1xuXG4gIGlmIChiZWZvcmUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmVmb3JlKGFzdCwgcmVwbGFjZSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBhc3Q7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFzdCkpIHtcbiAgICAgIC8vIHJldHVybiByaWdodCBoZXJlIHRvIHNraXAgYWZ0ZXIoKSBjYWxsIG9uIGFycmF5XG4gICAgICByZXR1cm4gd2Fsa0FuZE1lcmdlTm9kZXMoYXN0KTtcbiAgICB9XG4gIH1cblxuICBwYXJlbnRzLnVuc2hpZnQoYXN0KTtcblxuICBzd2l0Y2ggKGFzdC50eXBlKSB7XG4gICAgY2FzZSAnTmFtZWRCbG9jayc6XG4gICAgY2FzZSAnQmxvY2snOlxuICAgICAgYXN0Lm5vZGVzID0gd2Fsa0FuZE1lcmdlTm9kZXMoYXN0Lm5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Nhc2UnOlxuICAgIGNhc2UgJ0ZpbHRlcic6XG4gICAgY2FzZSAnTWl4aW4nOlxuICAgIGNhc2UgJ1RhZyc6XG4gICAgY2FzZSAnSW50ZXJwb2xhdGVkVGFnJzpcbiAgICBjYXNlICdXaGVuJzpcbiAgICBjYXNlICdDb2RlJzpcbiAgICBjYXNlICdXaGlsZSc6XG4gICAgICBpZiAoYXN0LmJsb2NrKSB7XG4gICAgICAgIGFzdC5ibG9jayA9IHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VhY2gnOlxuICAgICAgaWYgKGFzdC5ibG9jaykge1xuICAgICAgICBhc3QuYmxvY2sgPSB3YWxrQVNUKGFzdC5ibG9jaywgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAoYXN0LmFsdGVybmF0ZSkge1xuICAgICAgICBhc3QuYWx0ZXJuYXRlID0gd2Fsa0FTVChhc3QuYWx0ZXJuYXRlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VhY2hPZic6XG4gICAgICBpZiAoYXN0LmJsb2NrKSB7XG4gICAgICAgIGFzdC5ibG9jayA9IHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0NvbmRpdGlvbmFsJzpcbiAgICAgIGlmIChhc3QuY29uc2VxdWVudCkge1xuICAgICAgICBhc3QuY29uc2VxdWVudCA9IHdhbGtBU1QoYXN0LmNvbnNlcXVlbnQsIGJlZm9yZSwgYWZ0ZXIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKGFzdC5hbHRlcm5hdGUpIHtcbiAgICAgICAgYXN0LmFsdGVybmF0ZSA9IHdhbGtBU1QoYXN0LmFsdGVybmF0ZSwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdJbmNsdWRlJzpcbiAgICAgIHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIHdhbGtBU1QoYXN0LmZpbGUsIGJlZm9yZSwgYWZ0ZXIsIG9wdGlvbnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXh0ZW5kcyc6XG4gICAgICB3YWxrQVNUKGFzdC5maWxlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1Jhd0luY2x1ZGUnOlxuICAgICAgYXN0LmZpbHRlcnMgPSB3YWxrQW5kTWVyZ2VOb2Rlcyhhc3QuZmlsdGVycyk7XG4gICAgICB3YWxrQVNUKGFzdC5maWxlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0F0dHJzJzpcbiAgICBjYXNlICdCbG9ja0NvbW1lbnQnOlxuICAgIGNhc2UgJ0NvbW1lbnQnOlxuICAgIGNhc2UgJ0RvY3R5cGUnOlxuICAgIGNhc2UgJ0luY2x1ZGVGaWx0ZXInOlxuICAgIGNhc2UgJ01peGluQmxvY2snOlxuICAgIGNhc2UgJ1lpZWxkQmxvY2snOlxuICAgIGNhc2UgJ1RleHQnOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmlsZVJlZmVyZW5jZSc6XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVwZW5kZW5jaWVzICYmIGFzdC5hc3QpIHtcbiAgICAgICAgd2Fsa0FTVChhc3QuYXN0LCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbm9kZSB0eXBlICcgKyBhc3QudHlwZSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHBhcmVudHMuc2hpZnQoKTtcblxuICBhZnRlciAmJiBhZnRlcihhc3QsIHJlcGxhY2UpO1xuICByZXR1cm4gYXN0O1xuXG4gIGZ1bmN0aW9uIHdhbGtBbmRNZXJnZU5vZGVzKG5vZGVzKSB7XG4gICAgcmV0dXJuIG5vZGVzLnJlZHVjZShmdW5jdGlvbihub2Rlcywgbm9kZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHdhbGtBU1Qobm9kZSwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5jb25jYXQocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoW3Jlc3VsdF0pO1xuICAgICAgfVxuICAgIH0sIFtdKTtcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHdhbGsgPSByZXF1aXJlKCdwdWctd2FsaycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb2FkO1xuZnVuY3Rpb24gbG9hZChhc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGNsb25lIHRoZSBhc3RcbiAgYXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhc3QpKTtcbiAgcmV0dXJuIHdhbGsoYXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUuc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSAnSW5jbHVkZScgfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAnUmF3SW5jbHVkZScgfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAnRXh0ZW5kcydcbiAgICAgICkge1xuICAgICAgICB2YXIgZmlsZSA9IG5vZGUuZmlsZTtcbiAgICAgICAgaWYgKGZpbGUudHlwZSAhPT0gJ0ZpbGVSZWZlcmVuY2UnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmaWxlLnR5cGUgdG8gYmUgXCJGaWxlUmVmZXJlbmNlXCInKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCwgc3RyLCByYXc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aCA9IG9wdGlvbnMucmVzb2x2ZShmaWxlLnBhdGgsIGZpbGUuZmlsZW5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgIGZpbGUuZnVsbFBhdGggPSBwYXRoO1xuICAgICAgICAgIHJhdyA9IG9wdGlvbnMucmVhZChwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICBzdHIgPSByYXcudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBleC5tZXNzYWdlICs9ICdcXG4gICAgYXQgJyArIG5vZGUuZmlsZW5hbWUgKyAnIGxpbmUgJyArIG5vZGUubGluZTtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgICBmaWxlLnN0ciA9IHN0cjtcbiAgICAgICAgZmlsZS5yYXcgPSByYXc7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdFeHRlbmRzJyB8fCBub2RlLnR5cGUgPT09ICdJbmNsdWRlJykge1xuICAgICAgICAgIGZpbGUuYXN0ID0gbG9hZC5zdHJpbmcoXG4gICAgICAgICAgICBzdHIsXG4gICAgICAgICAgICBhc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhdGgsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5sb2FkLnN0cmluZyA9IGZ1bmN0aW9uIGxvYWRTdHJpbmcoc3JjLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBhc3NpZ24oZ2V0T3B0aW9ucyhvcHRpb25zKSwge1xuICAgIHNyYzogc3JjLFxuICB9KTtcbiAgdmFyIHRva2VucyA9IG9wdGlvbnMubGV4KHNyYywgb3B0aW9ucyk7XG4gIHZhciBhc3QgPSBvcHRpb25zLnBhcnNlKHRva2Vucywgb3B0aW9ucyk7XG4gIHJldHVybiBsb2FkKGFzdCwgb3B0aW9ucyk7XG59O1xubG9hZC5maWxlID0gZnVuY3Rpb24gbG9hZEZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGFzc2lnbihnZXRPcHRpb25zKG9wdGlvbnMpLCB7XG4gICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICB9KTtcbiAgdmFyIHN0ciA9IG9wdGlvbnMucmVhZChmaWxlbmFtZSkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgcmV0dXJuIGxvYWQuc3RyaW5nKHN0ciwgb3B0aW9ucyk7XG59O1xuXG5sb2FkLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGZpbGVuYW1lLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgZmlsZW5hbWUgPSBmaWxlbmFtZS50cmltKCk7XG4gIGlmIChmaWxlbmFtZVswXSAhPT0gJy8nICYmICFzb3VyY2UpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3RoZSBcImZpbGVuYW1lXCIgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBpbmNsdWRlcyBhbmQgZXh0ZW5kcyB3aXRoIFwicmVsYXRpdmVcIiBwYXRocydcbiAgICApO1xuXG4gIGlmIChmaWxlbmFtZVswXSA9PT0gJy8nICYmICFvcHRpb25zLmJhc2VkaXIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3RoZSBcImJhc2VkaXJcIiBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdXNlIGluY2x1ZGVzIGFuZCBleHRlbmRzIHdpdGggXCJhYnNvbHV0ZVwiIHBhdGhzJ1xuICAgICk7XG5cbiAgZmlsZW5hbWUgPSBwYXRoLmpvaW4oXG4gICAgZmlsZW5hbWVbMF0gPT09ICcvJyA/IG9wdGlvbnMuYmFzZWRpciA6IHBhdGguZGlybmFtZShzb3VyY2UudHJpbSgpKSxcbiAgICBmaWxlbmFtZVxuICApO1xuXG4gIHJldHVybiBmaWxlbmFtZTtcbn07XG5sb2FkLnJlYWQgPSBmdW5jdGlvbiByZWFkKGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUpO1xufTtcblxubG9hZC52YWxpZGF0ZU9wdGlvbnMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmxleCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMubGV4IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdGlvbnMucGFyc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnBhcnNlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucy5yZXNvbHZlICYmIHR5cGVvZiBvcHRpb25zLnJlc29sdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnJlc29sdmUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChvcHRpb25zLnJlYWQgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMucmVhZCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIGxvYWQudmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYXNzaWduKFxuICAgIHtcbiAgICAgIHJlc29sdmU6IGxvYWQucmVzb2x2ZSxcbiAgICAgIHJlYWQ6IGxvYWQucmVhZCxcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cblxuLyogZ2xvYmFscyBzZWxmICovXG52YXIgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogc2VsZjtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgaGF2ZSBoaWdoIHByaW9yaXR5IGFuZCB3b3JrXG4vLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5pZiAodHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG5cbi8vIE1lc3NhZ2VDaGFubmVscyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBnaXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIEhUTUxcbi8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuXG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbn0gZWxzZSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGZsdXNoKTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLlxuLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4vLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc1x1MjAxOXNcbi8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxucmF3QXNhcC5yZXF1ZXN0Rmx1c2ggPSByZXF1ZXN0Rmx1c2g7XG5cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgdG9nZ2xlID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5cbi8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcblxuLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbi8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4vLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4vLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbi8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4vLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbi8vIGNsb3N1cmUuXG4vLyBOZXZlciBmb3JnZXQuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4vLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbi8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4vLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4vLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cblxuLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4vLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4vLyBldmVuIHRoZW4uXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgdmFyIGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4vLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuLy8gaXRzIGV4aXN0ZW5jZS5cbnJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbi8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4vLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbi8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbi8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcC9yYXcnKTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFN0YXRlczpcbi8vXG4vLyAwIC0gcGVuZGluZ1xuLy8gMSAtIGZ1bGZpbGxlZCB3aXRoIF92YWx1ZVxuLy8gMiAtIHJlamVjdGVkIHdpdGggX3ZhbHVlXG4vLyAzIC0gYWRvcHRlZCB0aGUgc3RhdGUgb2YgYW5vdGhlciBwcm9taXNlLCBfdmFsdWVcbi8vXG4vLyBvbmNlIHRoZSBzdGF0ZSBpcyBubyBsb25nZXIgcGVuZGluZyAoMCkgaXQgaXMgaW1tdXRhYmxlXG5cbi8vIEFsbCBgX2AgcHJlZml4ZWQgcHJvcGVydGllcyB3aWxsIGJlIHJlZHVjZWQgdG8gYF97cmFuZG9tIG51bWJlcn1gXG4vLyBhdCBidWlsZCB0aW1lIHRvIG9iZnVzY2F0ZSB0aGVtIGFuZCBkaXNjb3VyYWdlIHRoZWlyIHVzZS5cbi8vIFdlIGRvbid0IHVzZSBzeW1ib2xzIG9yIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBmdWxseSBoaWRlIHRoZW1cbi8vIGJlY2F1c2UgdGhlIHBlcmZvcm1hbmNlIGlzbid0IGdvb2QgZW5vdWdoLlxuXG5cbi8vIHRvIGF2b2lkIHVzaW5nIHRyeS9jYXRjaCBpbnNpZGUgY3JpdGljYWwgZnVuY3Rpb25zLCB3ZVxuLy8gZXh0cmFjdCB0aGVtIHRvIGhlcmUuXG52YXIgTEFTVF9FUlJPUiA9IG51bGw7XG52YXIgSVNfRVJST1IgPSB7fTtcbmZ1bmN0aW9uIGdldFRoZW4ob2JqKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9iai50aGVuO1xuICB9IGNhdGNoIChleCkge1xuICAgIExBU1RfRVJST1IgPSBleDtcbiAgICByZXR1cm4gSVNfRVJST1I7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5Q2FsbE9uZShmbiwgYSkge1xuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICBMQVNUX0VSUk9SID0gZXg7XG4gICAgcmV0dXJuIElTX0VSUk9SO1xuICB9XG59XG5mdW5jdGlvbiB0cnlDYWxsVHdvKGZuLCBhLCBiKSB7XG4gIHRyeSB7XG4gICAgZm4oYSwgYik7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgTEFTVF9FUlJPUiA9IGV4O1xuICAgIHJldHVybiBJU19FUlJPUjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbmZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICB9XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIGNvbnN0cnVjdG9yXFwncyBhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG4gIHRoaXMuXzQwID0gMDtcbiAgdGhpcy5fNjUgPSAwO1xuICB0aGlzLl81NSA9IG51bGw7XG4gIHRoaXMuXzcyID0gbnVsbDtcbiAgaWYgKGZuID09PSBub29wKSByZXR1cm47XG4gIGRvUmVzb2x2ZShmbiwgdGhpcyk7XG59XG5Qcm9taXNlLl8zNyA9IG51bGw7XG5Qcm9taXNlLl84NyA9IG51bGw7XG5Qcm9taXNlLl82MSA9IG5vb3A7XG5cblByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICBpZiAodGhpcy5jb25zdHJ1Y3RvciAhPT0gUHJvbWlzZSkge1xuICAgIHJldHVybiBzYWZlVGhlbih0aGlzLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH1cbiAgdmFyIHJlcyA9IG5ldyBQcm9taXNlKG5vb3ApO1xuICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHJlcykpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gc2FmZVRoZW4oc2VsZiwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgcmV0dXJuIG5ldyBzZWxmLmNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVzID0gbmV3IFByb21pc2Uobm9vcCk7XG4gICAgcmVzLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICBoYW5kbGUoc2VsZiwgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHJlcykpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZShzZWxmLCBkZWZlcnJlZCkge1xuICB3aGlsZSAoc2VsZi5fNjUgPT09IDMpIHtcbiAgICBzZWxmID0gc2VsZi5fNTU7XG4gIH1cbiAgaWYgKFByb21pc2UuXzM3KSB7XG4gICAgUHJvbWlzZS5fMzcoc2VsZik7XG4gIH1cbiAgaWYgKHNlbGYuXzY1ID09PSAwKSB7XG4gICAgaWYgKHNlbGYuXzQwID09PSAwKSB7XG4gICAgICBzZWxmLl80MCA9IDE7XG4gICAgICBzZWxmLl83MiA9IGRlZmVycmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VsZi5fNDAgPT09IDEpIHtcbiAgICAgIHNlbGYuXzQwID0gMjtcbiAgICAgIHNlbGYuXzcyID0gW3NlbGYuXzcyLCBkZWZlcnJlZF07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbGYuXzcyLnB1c2goZGVmZXJyZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICBoYW5kbGVSZXNvbHZlZChzZWxmLCBkZWZlcnJlZCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlc29sdmVkKHNlbGYsIGRlZmVycmVkKSB7XG4gIGFzYXAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNiID0gc2VsZi5fNjUgPT09IDEgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgICBpZiAoc2VsZi5fNjUgPT09IDEpIHtcbiAgICAgICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCBzZWxmLl81NSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoZGVmZXJyZWQucHJvbWlzZSwgc2VsZi5fNTUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmV0ID0gdHJ5Q2FsbE9uZShjYiwgc2VsZi5fNTUpO1xuICAgIGlmIChyZXQgPT09IElTX0VSUk9SKSB7XG4gICAgICByZWplY3QoZGVmZXJyZWQucHJvbWlzZSwgTEFTVF9FUlJPUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoZGVmZXJyZWQucHJvbWlzZSwgcmV0KTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICAvLyBQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtc3BlYyN0aGUtcHJvbWlzZS1yZXNvbHV0aW9uLXByb2NlZHVyZVxuICBpZiAobmV3VmFsdWUgPT09IHNlbGYpIHtcbiAgICByZXR1cm4gcmVqZWN0KFxuICAgICAgc2VsZixcbiAgICAgIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuJylcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBuZXdWYWx1ZSAmJlxuICAgICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJylcbiAgKSB7XG4gICAgdmFyIHRoZW4gPSBnZXRUaGVuKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhlbiA9PT0gSVNfRVJST1IpIHtcbiAgICAgIHJldHVybiByZWplY3Qoc2VsZiwgTEFTVF9FUlJPUik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoZW4gPT09IHNlbGYudGhlbiAmJlxuICAgICAgbmV3VmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlXG4gICAgKSB7XG4gICAgICBzZWxmLl82NSA9IDM7XG4gICAgICBzZWxmLl81NSA9IG5ld1ZhbHVlO1xuICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRvUmVzb2x2ZSh0aGVuLmJpbmQobmV3VmFsdWUpLCBzZWxmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgc2VsZi5fNjUgPSAxO1xuICBzZWxmLl81NSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIHJlamVjdChzZWxmLCBuZXdWYWx1ZSkge1xuICBzZWxmLl82NSA9IDI7XG4gIHNlbGYuXzU1ID0gbmV3VmFsdWU7XG4gIGlmIChQcm9taXNlLl84Nykge1xuICAgIFByb21pc2UuXzg3KHNlbGYsIG5ld1ZhbHVlKTtcbiAgfVxuICBmaW5hbGUoc2VsZik7XG59XG5mdW5jdGlvbiBmaW5hbGUoc2VsZikge1xuICBpZiAoc2VsZi5fNDAgPT09IDEpIHtcbiAgICBoYW5kbGUoc2VsZiwgc2VsZi5fNzIpO1xuICAgIHNlbGYuXzcyID0gbnVsbDtcbiAgfVxuICBpZiAoc2VsZi5fNDAgPT09IDIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuXzcyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGUoc2VsZiwgc2VsZi5fNzJbaV0pO1xuICAgIH1cbiAgICBzZWxmLl83MiA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvbWlzZSl7XG4gIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nID8gb25SZWplY3RlZCA6IG51bGw7XG4gIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG59XG5cbi8qKlxuICogVGFrZSBhIHBvdGVudGlhbGx5IG1pc2JlaGF2aW5nIHJlc29sdmVyIGZ1bmN0aW9uIGFuZCBtYWtlIHN1cmVcbiAqIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGFyZSBvbmx5IGNhbGxlZCBvbmNlLlxuICpcbiAqIE1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgYXN5bmNocm9ueS5cbiAqL1xuZnVuY3Rpb24gZG9SZXNvbHZlKGZuLCBwcm9taXNlKSB7XG4gIHZhciBkb25lID0gZmFsc2U7XG4gIHZhciByZXMgPSB0cnlDYWxsVHdvKGZuLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgfSk7XG4gIGlmICghZG9uZSAmJiByZXMgPT09IElTX0VSUk9SKSB7XG4gICAgZG9uZSA9IHRydWU7XG4gICAgcmVqZWN0KHByb21pc2UsIExBU1RfRVJST1IpO1xuICB9XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5Qcm9taXNlLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIHZhciBzZWxmID0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMudGhlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGhpcztcbiAgc2VsZi50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9LCAwKTtcbiAgfSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFByb21pc2UgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vL1RoaXMgZmlsZSBjb250YWlucyB0aGUgRVM2IGV4dGVuc2lvbnMgdG8gdGhlIGNvcmUgUHJvbWlzZXMvQSsgQVBJXG5cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnLi9jb3JlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcblxuLyogU3RhdGljIEZ1bmN0aW9ucyAqL1xuXG52YXIgVFJVRSA9IHZhbHVlUHJvbWlzZSh0cnVlKTtcbnZhciBGQUxTRSA9IHZhbHVlUHJvbWlzZShmYWxzZSk7XG52YXIgTlVMTCA9IHZhbHVlUHJvbWlzZShudWxsKTtcbnZhciBVTkRFRklORUQgPSB2YWx1ZVByb21pc2UodW5kZWZpbmVkKTtcbnZhciBaRVJPID0gdmFsdWVQcm9taXNlKDApO1xudmFyIEVNUFRZU1RSSU5HID0gdmFsdWVQcm9taXNlKCcnKTtcblxuZnVuY3Rpb24gdmFsdWVQcm9taXNlKHZhbHVlKSB7XG4gIHZhciBwID0gbmV3IFByb21pc2UoUHJvbWlzZS5fNjEpO1xuICBwLl82NSA9IDE7XG4gIHAuXzU1ID0gdmFsdWU7XG4gIHJldHVybiBwO1xufVxuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiB2YWx1ZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBOVUxMO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFVOREVGSU5FRDtcbiAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gVFJVRTtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIEZBTFNFO1xuICBpZiAodmFsdWUgPT09IDApIHJldHVybiBaRVJPO1xuICBpZiAodmFsdWUgPT09ICcnKSByZXR1cm4gRU1QVFlTVFJJTkc7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0aGVuID0gdmFsdWUudGhlbjtcbiAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UodGhlbi5iaW5kKHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdChleCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlUHJvbWlzZSh2YWx1ZSk7XG59O1xuXG5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgdmFyIHJlbWFpbmluZyA9IGFyZ3MubGVuZ3RoO1xuICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgIGlmICh2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBQcm9taXNlICYmIHZhbC50aGVuID09PSBQcm9taXNlLnByb3RvdHlwZS50aGVuKSB7XG4gICAgICAgICAgd2hpbGUgKHZhbC5fNjUgPT09IDMpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5fNTU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWwuXzY1ID09PSAxKSByZXR1cm4gcmVzKGksIHZhbC5fNTUpO1xuICAgICAgICAgIGlmICh2YWwuXzY1ID09PSAyKSByZWplY3QodmFsLl81NSk7XG4gICAgICAgICAgdmFsLnRoZW4oZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBwID0gbmV3IFByb21pc2UodGhlbi5iaW5kKHZhbCkpO1xuICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXJnc1tpXSA9IHZhbDtcbiAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICByZXNvbHZlKGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyhpLCBhcmdzW2ldKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWplY3QodmFsdWUpO1xuICB9KTtcbn07XG5cblByb21pc2UucmFjZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7XG4gICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKiBQcm90b3R5cGUgTWV0aG9kcyAqL1xuXG5Qcm9taXNlLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG59O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlbi9wcm9taXNlIHNwZWNpZmljIGV4dGVuc2lvbnMgdGhhdCBhcmUgb25seSB1c2VmdWxcbi8vIGZvciBub2RlLmpzIGludGVyb3BcblxudmFyIFByb21pc2UgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbi8qIFN0YXRpYyBGdW5jdGlvbnMgKi9cblxuUHJvbWlzZS5kZW5vZGVpZnkgPSBmdW5jdGlvbiAoZm4sIGFyZ3VtZW50Q291bnQpIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBhcmd1bWVudENvdW50ID09PSAnbnVtYmVyJyAmJiBhcmd1bWVudENvdW50ICE9PSBJbmZpbml0eVxuICApIHtcbiAgICByZXR1cm4gZGVub2RlaWZ5V2l0aENvdW50KGZuLCBhcmd1bWVudENvdW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVub2RlaWZ5V2l0aG91dENvdW50KGZuKTtcbiAgfVxufTtcblxudmFyIGNhbGxiYWNrRm4gPSAoXG4gICdmdW5jdGlvbiAoZXJyLCByZXMpIHsnICtcbiAgJ2lmIChlcnIpIHsgcmooZXJyKTsgfSBlbHNlIHsgcnMocmVzKTsgfScgK1xuICAnfSdcbik7XG5mdW5jdGlvbiBkZW5vZGVpZnlXaXRoQ291bnQoZm4sIGFyZ3VtZW50Q291bnQpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKyspIHtcbiAgICBhcmdzLnB1c2goJ2EnICsgaSk7XG4gIH1cbiAgdmFyIGJvZHkgPSBbXG4gICAgJ3JldHVybiBmdW5jdGlvbiAoJyArIGFyZ3Muam9pbignLCcpICsgJykgeycsXG4gICAgJ3ZhciBzZWxmID0gdGhpczsnLFxuICAgICdyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJzLCByaikgeycsXG4gICAgJ3ZhciByZXMgPSBmbi5jYWxsKCcsXG4gICAgWydzZWxmJ10uY29uY2F0KGFyZ3MpLmNvbmNhdChbY2FsbGJhY2tGbl0pLmpvaW4oJywnKSxcbiAgICAnKTsnLFxuICAgICdpZiAocmVzICYmJyxcbiAgICAnKHR5cGVvZiByZXMgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHJlcyA9PT0gXCJmdW5jdGlvblwiKSAmJicsXG4gICAgJ3R5cGVvZiByZXMudGhlbiA9PT0gXCJmdW5jdGlvblwiJyxcbiAgICAnKSB7cnMocmVzKTt9JyxcbiAgICAnfSk7JyxcbiAgICAnfTsnXG4gIF0uam9pbignJyk7XG4gIHJldHVybiBGdW5jdGlvbihbJ1Byb21pc2UnLCAnZm4nXSwgYm9keSkoUHJvbWlzZSwgZm4pO1xufVxuZnVuY3Rpb24gZGVub2RlaWZ5V2l0aG91dENvdW50KGZuKSB7XG4gIHZhciBmbkxlbmd0aCA9IE1hdGgubWF4KGZuLmxlbmd0aCAtIDEsIDMpO1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZuTGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzLnB1c2goJ2EnICsgaSk7XG4gIH1cbiAgdmFyIGJvZHkgPSBbXG4gICAgJ3JldHVybiBmdW5jdGlvbiAoJyArIGFyZ3Muam9pbignLCcpICsgJykgeycsXG4gICAgJ3ZhciBzZWxmID0gdGhpczsnLFxuICAgICd2YXIgYXJnczsnLFxuICAgICd2YXIgYXJnTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsnLFxuICAgICdpZiAoYXJndW1lbnRzLmxlbmd0aCA+ICcgKyBmbkxlbmd0aCArICcpIHsnLFxuICAgICdhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggKyAxKTsnLFxuICAgICdmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeycsXG4gICAgJ2FyZ3NbaV0gPSBhcmd1bWVudHNbaV07JyxcbiAgICAnfScsXG4gICAgJ30nLFxuICAgICdyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJzLCByaikgeycsXG4gICAgJ3ZhciBjYiA9ICcgKyBjYWxsYmFja0ZuICsgJzsnLFxuICAgICd2YXIgcmVzOycsXG4gICAgJ3N3aXRjaCAoYXJnTGVuZ3RoKSB7JyxcbiAgICBhcmdzLmNvbmNhdChbJ2V4dHJhJ10pLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICdjYXNlICcgKyAoaW5kZXgpICsgJzonICtcbiAgICAgICAgJ3JlcyA9IGZuLmNhbGwoJyArIFsnc2VsZiddLmNvbmNhdChhcmdzLnNsaWNlKDAsIGluZGV4KSkuY29uY2F0KCdjYicpLmpvaW4oJywnKSArICcpOycgK1xuICAgICAgICAnYnJlYWs7J1xuICAgICAgKTtcbiAgICB9KS5qb2luKCcnKSxcbiAgICAnZGVmYXVsdDonLFxuICAgICdhcmdzW2FyZ0xlbmd0aF0gPSBjYjsnLFxuICAgICdyZXMgPSBmbi5hcHBseShzZWxmLCBhcmdzKTsnLFxuICAgICd9JyxcbiAgICBcbiAgICAnaWYgKHJlcyAmJicsXG4gICAgJyh0eXBlb2YgcmVzID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiByZXMgPT09IFwiZnVuY3Rpb25cIikgJiYnLFxuICAgICd0eXBlb2YgcmVzLnRoZW4gPT09IFwiZnVuY3Rpb25cIicsXG4gICAgJykge3JzKHJlcyk7fScsXG4gICAgJ30pOycsXG4gICAgJ307J1xuICBdLmpvaW4oJycpO1xuXG4gIHJldHVybiBGdW5jdGlvbihcbiAgICBbJ1Byb21pc2UnLCAnZm4nXSxcbiAgICBib2R5XG4gICkoUHJvbWlzZSwgZm4pO1xufVxuXG5Qcm9taXNlLm5vZGVpZnkgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgdmFyIGNhbGxiYWNrID1cbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgPyBhcmdzLnBvcCgpIDogbnVsbDtcbiAgICB2YXIgY3R4ID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykubm9kZWlmeShjYWxsYmFjaywgY3R4KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjdHgsIGV4KTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblByb21pc2UucHJvdG90eXBlLm5vZGVpZnkgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHJldHVybiB0aGlzO1xuXG4gIHRoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBudWxsLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5Qcm9taXNlLmVuYWJsZVN5bmNocm9ub3VzID0gZnVuY3Rpb24gKCkge1xuICBQcm9taXNlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpID09IDA7XG4gIH07XG5cbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNGdWxmaWxsZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpID09IDE7XG4gIH07XG5cbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXRlKCkgPT0gMjtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fNjUgPT09IDMpIHtcbiAgICAgIHJldHVybiB0aGlzLl81NS5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0Z1bGZpbGxlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSB2YWx1ZSBvZiBhbiB1bmZ1bGZpbGxlZCBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl81NTtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRSZWFzb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuXzY1ID09PSAzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fNTUuZ2V0UmVhc29uKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzUmVqZWN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgcmVqZWN0aW9uIHJlYXNvbiBvZiBhIG5vbi1yZWplY3RlZCBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl81NTtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fNjUgPT09IDMpIHtcbiAgICAgIHJldHVybiB0aGlzLl81NS5nZXRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fNjUgPT09IC0xIHx8IHRoaXMuXzY1ID09PSAtMikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuXzY1O1xuICB9O1xufTtcblxuUHJvbWlzZS5kaXNhYmxlU3luY2hyb25vdXMgPSBmdW5jdGlvbigpIHtcbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNQZW5kaW5nID0gdW5kZWZpbmVkO1xuICBQcm9taXNlLnByb3RvdHlwZS5pc0Z1bGZpbGxlZCA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSB1bmRlZmluZWQ7XG4gIFByb21pc2UucHJvdG90eXBlLmdldFJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuZ2V0U3RhdGUgPSB1bmRlZmluZWQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcbnJlcXVpcmUoJy4vZG9uZS5qcycpO1xucmVxdWlyZSgnLi9maW5hbGx5LmpzJyk7XG5yZXF1aXJlKCcuL2VzNi1leHRlbnNpb25zLmpzJyk7XG5yZXF1aXJlKCcuL25vZGUtZXh0ZW5zaW9ucy5qcycpO1xucmVxdWlyZSgnLi9zeW5jaHJvbm91cy5qcycpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYicpXG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpc1Byb21pc2U7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gaXNQcm9taXNlO1xuXG5mdW5jdGlvbiBpc1Byb21pc2Uob2JqKSB7XG4gIHJldHVybiAhIW9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBQcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJ2lzLXByb21pc2UnKTtcblxudmFyIHRyID0gKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRyYW5zZm9ybWVyKSB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpO1xufSk7XG50ci5UcmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyO1xudHIubm9ybWFsaXplRm4gPSBub3JtYWxpemVGbjtcbnRyLm5vcm1hbGl6ZUZuQXN5bmMgPSBub3JtYWxpemVGbkFzeW5jO1xudHIubm9ybWFsaXplID0gbm9ybWFsaXplO1xudHIubm9ybWFsaXplQXN5bmMgPSBub3JtYWxpemVBc3luYztcbmlmIChmcy5yZWFkRmlsZSkge1xuICB0ci5yZWFkRmlsZSA9IFByb21pc2UuZGVub2RlaWZ5KGZzLnJlYWRGaWxlKTtcbiAgdHIucmVhZEZpbGVTeW5jID0gZnMucmVhZEZpbGVTeW5jO1xufSBlbHNlIHtcbiAgdHIucmVhZEZpbGUgPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBFcnJvcignZnMucmVhZEZpbGUgdW5zdXBwb3J0ZWQnKTsgfTtcbiAgdHIucmVhZEZpbGVTeW5jID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ZzLnJlYWRGaWxlU3luYyB1bnN1cHBvcnRlZCcpOyB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGbihyZXN1bHQpIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4ge2ZuOiByZXN1bHQsIGRlcGVuZGVuY2llczogW119O1xuICB9IGVsc2UgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LmZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCdkZXBlbmRlbmNpZXMnIGluIHJlc3VsdCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdC5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzdWx0IHNob3VsZCBoYXZlIGEgZGVwZW5kZW5jaWVzIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXknKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXN1bHQgb2JqZWN0IGZyb20gdHJhbnNmb3JtLicpO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVGbkFzeW5jKHJlc3VsdCwgY2IpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgJiYgaXNQcm9taXNlKHJlc3VsdC5mbikpIHtcbiAgICAgIHJldHVybiByZXN1bHQuZm4udGhlbihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmVzdWx0LmZuID0gZm47XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSkudGhlbih0ci5ub3JtYWxpemVGbikubm9kZWlmeShjYik7XG59XG5mdW5jdGlvbiBub3JtYWxpemUocmVzdWx0KSB7XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7Ym9keTogcmVzdWx0LCBkZXBlbmRlbmNpZXM6IFtdfTtcbiAgfSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdC5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICgnZGVwZW5kZW5jaWVzJyBpbiByZXN1bHQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VsdCBzaG91bGQgaGF2ZSBhIGRlcGVuZGVuY2llcyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzdWx0IG9iamVjdCBmcm9tIHRyYW5zZm9ybS4nKTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQXN5bmMocmVzdWx0LCBjYikge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdCAmJiBpc1Byb21pc2UocmVzdWx0LmJvZHkpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmJvZHkudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICByZXN1bHQuYm9keSA9IGJvZHk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSkudGhlbih0ci5ub3JtYWxpemUpLm5vZGVpZnkoY2IpO1xufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1lcih0cikge1xuICBhc3NlcnQodHIsICdUcmFuc2Zvcm1lciBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBhc3NlcnQodHlwZW9mIHRyLm5hbWUgPT09ICdzdHJpbmcnLCAnVHJhbnNmb3JtZXIgbXVzdCBoYXZlIGEgbmFtZScpO1xuICBhc3NlcnQodHlwZW9mIHRyLm91dHB1dEZvcm1hdCA9PT0gJ3N0cmluZycsICdUcmFuc2Zvcm1lciBtdXN0IGhhdmUgYW4gb3V0cHV0IGZvcm1hdCcpO1xuICBhc3NlcnQoW1xuICAgICdjb21waWxlJyxcbiAgICAnY29tcGlsZUFzeW5jJyxcbiAgICAnY29tcGlsZUZpbGUnLFxuICAgICdjb21waWxlRmlsZUFzeW5jJyxcbiAgICAnY29tcGlsZUNsaWVudCcsXG4gICAgJ2NvbXBpbGVDbGllbnRBc3luYycsXG4gICAgJ2NvbXBpbGVGaWxlQ2xpZW50JyxcbiAgICAnY29tcGlsZUZpbGVDbGllbnRBc3luYycsXG4gICAgJ3JlbmRlcicsXG4gICAgJ3JlbmRlckFzeW5jJyxcbiAgICAncmVuZGVyRmlsZScsXG4gICAgJ3JlbmRlckZpbGVBc3luYydcbiAgXS5zb21lKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRyW21ldGhvZF0gPT09ICdmdW5jdGlvbic7XG4gIH0pLCAnVHJhbnNmb3JtZXIgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3Qgb25lIG9mIHRoZSBwb3RlbnRpYWwgbWV0aG9kcy4nKTtcbiAgdGhpcy5fdHIgPSB0cjtcbiAgdGhpcy5uYW1lID0gdGhpcy5fdHIubmFtZTtcbiAgdGhpcy5vdXRwdXRGb3JtYXQgPSB0aGlzLl90ci5vdXRwdXRGb3JtYXQ7XG4gIHRoaXMuaW5wdXRGb3JtYXRzID0gdGhpcy5fdHIuaW5wdXRGb3JtYXRzIHx8IFt0aGlzLm5hbWVdO1xufVxuXG52YXIgZmFsbGJhY2tzID0ge1xuICBjb21waWxlOiBbJ2NvbXBpbGUnLCAncmVuZGVyJ10sXG4gIGNvbXBpbGVBc3luYzogWydjb21waWxlQXN5bmMnLCAnY29tcGlsZScsICdyZW5kZXInXSxcbiAgY29tcGlsZUZpbGU6IFsnY29tcGlsZUZpbGUnLCAnY29tcGlsZScsICdyZW5kZXJGaWxlJywgJ3JlbmRlciddLFxuICBjb21waWxlRmlsZUFzeW5jOiBbXG4gICAgJ2NvbXBpbGVGaWxlQXN5bmMnLCAnY29tcGlsZUZpbGUnLCAnY29tcGlsZUFzeW5jJywgJ2NvbXBpbGUnLFxuICAgICdyZW5kZXJGaWxlJywgJ3JlbmRlcidcbiAgXSxcbiAgY29tcGlsZUNsaWVudDogWydjb21waWxlQ2xpZW50J10sXG4gIGNvbXBpbGVDbGllbnRBc3luYzogWydjb21waWxlQ2xpZW50QXN5bmMnLCAnY29tcGlsZUNsaWVudCddLFxuICBjb21waWxlRmlsZUNsaWVudDogWydjb21waWxlRmlsZUNsaWVudCcsICdjb21waWxlQ2xpZW50J10sXG4gIGNvbXBpbGVGaWxlQ2xpZW50QXN5bmM6IFtcbiAgICAnY29tcGlsZUZpbGVDbGllbnRBc3luYycsICdjb21waWxlRmlsZUNsaWVudCcsICdjb21waWxlQ2xpZW50QXN5bmMnLCAnY29tcGlsZUNsaWVudCdcbiAgXSxcbiAgcmVuZGVyOiBbJ3JlbmRlcicsICdjb21waWxlJ10sXG4gIHJlbmRlckFzeW5jOiBbJ3JlbmRlckFzeW5jJywgJ3JlbmRlcicsICdjb21waWxlQXN5bmMnLCAnY29tcGlsZSddLFxuICByZW5kZXJGaWxlOiBbJ3JlbmRlckZpbGUnLCAncmVuZGVyJywgJ2NvbXBpbGVGaWxlJywgJ2NvbXBpbGUnXSxcbiAgcmVuZGVyRmlsZUFzeW5jOiBbXG4gICAgJ3JlbmRlckZpbGVBc3luYycsICdyZW5kZXJGaWxlJywgJ3JlbmRlckFzeW5jJywgJ3JlbmRlcicsXG4gICAgJ2NvbXBpbGVGaWxlQXN5bmMnLCAnY29tcGlsZUZpbGUnLCAnY29tcGlsZUFzeW5jJywgJ2NvbXBpbGUnXG4gIF1cbn07XG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZS5faGFzTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMuX3RyW21ldGhvZF0gPT09ICdmdW5jdGlvbic7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNhbiA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgcmV0dXJuIGZhbGxiYWNrc1ttZXRob2RdLnNvbWUoZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNNZXRob2QobWV0aG9kKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbi8qIENPTVBJTEUgKi9cblxuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5faGFzTWV0aG9kKCdjb21waWxlJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlcicpKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm46IGZ1bmN0aW9uIChsb2NhbHMpIHtcbiAgICAgICAgICByZXR1cm4gdHIubm9ybWFsaXplKF90aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpKS5ib2R5O1xuICAgICAgICB9LFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5jYW4oJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25vdXMgY29tcGlsYXRpb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgcGxhaW4gc3RyaW5ncycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsYXRpb24nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuKHRoaXMuX3RyLmNvbXBpbGUoc3RyLCBvcHRpb25zKSk7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVBc3luYycpKSB7IC8vIGNvbXBpbGVGaWxlKiB8fCByZW5kZXJGaWxlKiB8fCByZW5kZXJBc3luYyB8fCBjb21waWxlKkNsaWVudCpcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBwbGFpbiBzdHJpbmdzJykpLm5vZGVpZnkoY2IpO1xuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuQXN5bmModGhpcy5fdHIuY29tcGlsZUFzeW5jKHN0ciwgb3B0aW9ucyksIGNiKTtcbiAgfSBlbHNlIHsgLy8gcmVuZGVyIHx8IGNvbXBpbGVcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0aGlzLmNvbXBpbGUoc3RyLCBvcHRpb25zKSwgY2IpO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVGaWxlID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVGaWxlJykpIHsgLy8gY29tcGlsZSpDbGllbnQqIHx8IGNvbXBpbGUqQXN5bmMgfHwgcmVuZGVyKkFzeW5jXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHN5bmNocm9ub3VzIGNvbXBpbGF0aW9uJyk7XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVGbih0aGlzLl90ci5jb21waWxlRmlsZShmaWxlbmFtZSwgb3B0aW9ucykpO1xuICB9IGVsc2UgaWYgKHRoaXMuX2hhc01ldGhvZCgncmVuZGVyRmlsZScpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuKGZ1bmN0aW9uIChsb2NhbHMpIHtcbiAgICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIucmVuZGVyRmlsZShmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzKSkuYm9keTtcbiAgICB9LmJpbmQodGhpcykpO1xuICB9IGVsc2UgeyAvLyByZW5kZXIgfHwgY29tcGlsZVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdGhpcy5jb21waWxlKHRyLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKSwgb3B0aW9ucyk7XG4gIH1cbn07XG5UcmFuc2Zvcm1lci5wcm90b3R5cGUuY29tcGlsZUZpbGVBc3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgb3B0aW9ucywgY2IpIHtcbiAgaWYgKCF0aGlzLmNhbignY29tcGlsZUZpbGVBc3luYycpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxhdGlvbicpKTtcbiAgfVxuICBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlRmlsZUFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0aGlzLl90ci5jb21waWxlRmlsZUFzeW5jKGZpbGVuYW1lLCBvcHRpb25zKSwgY2IpO1xuICB9IGVsc2UgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSB8fCB0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVGbkFzeW5jKHRoaXMuY29tcGlsZUZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpLCBjYik7XG4gIH0gZWxzZSB7IC8vIGNvbXBpbGVBc3luYyB8fCBjb21waWxlIHx8IHJlbmRlclxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0ci5yZWFkRmlsZShmaWxlbmFtZSwgJ3V0ZjgnKS50aGVuKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIGlmICh0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ci5jb21waWxlQXN5bmMoc3RyLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7IC8vIGNvbXBpbGUgfHwgcmVuZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGUoc3RyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpLCBjYik7XG4gIH1cbn07XG5cbi8qIENPTVBJTEUgQ0xJRU5UICovXG5cblxuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVDbGllbnQgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVDbGllbnQnKSkge1xuICAgIGlmICh0aGlzLmNhbignY29tcGlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQgc3luY2hyb25vdXNseS4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQgZnJvbSBhIHN0cmluZy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBmb3IgdGhlIGNsaWVudCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHIubm9ybWFsaXplKHRoaXMuX3RyLmNvbXBpbGVDbGllbnQoc3RyLCBvcHRpb25zKSk7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVDbGllbnRBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVDbGllbnRBc3luYycpKSB7XG4gICAgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50IGZyb20gYSBzdHJpbmcuJykpLm5vZGVpZnkoY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBmb3IgdGhlIGNsaWVudCcpKS5ub2RlaWZ5KGNiKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUNsaWVudEFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIuY29tcGlsZUNsaWVudEFzeW5jKHN0ciwgb3B0aW9ucyksIGNiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpLCBjYik7XG4gIH1cbn07XG5UcmFuc2Zvcm1lci5wcm90b3R5cGUuY29tcGlsZUZpbGVDbGllbnQgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCF0aGlzLmNhbignY29tcGlsZUZpbGVDbGllbnQnKSkge1xuICAgIGlmICh0aGlzLmNhbignY29tcGlsZUZpbGVDbGllbnRBc3luYycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50IHN5bmNocm9ub3VzbHkuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGVDbGllbnQnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIuY29tcGlsZUZpbGVDbGllbnQoZmlsZW5hbWUsIG9wdGlvbnMpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5maWxlbmFtZSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh0aGlzLl90ci5jb21waWxlQ2xpZW50KHRyLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKSwgb3B0aW9ucykpO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVGaWxlQ2xpZW50QXN5bmMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVGaWxlQ2xpZW50QXN5bmMnKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50JykpLm5vZGVpZnkoY2IpXG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGVDbGllbnRBc3luYycpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuX3RyLmNvbXBpbGVGaWxlQ2xpZW50QXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlRmlsZUNsaWVudCcpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuX3RyLmNvbXBpbGVGaWxlQ2xpZW50KGZpbGVuYW1lLCBvcHRpb25zKSwgY2IpO1xuICB9IGVsc2Uge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModHIucmVhZEZpbGUoZmlsZW5hbWUsICd1dGY4JykudGhlbihmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlQ2xpZW50QXN5bmMnKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHIuY29tcGlsZUNsaWVudEFzeW5jKHN0ciwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHIuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0uYmluZCh0aGlzKSksIGNiKTtcbiAgfVxufTtcblxuLyogUkVOREVSICovXG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zLCBsb2NhbHMpIHtcbiAgaWYgKCF0aGlzLmNhbigncmVuZGVyJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlckFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdyZW5kZXJGaWxlQXN5bmMnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyBmcm9tIGEgc3RyaW5nLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgcmVuZGVyaW5nJyk7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlcicpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh0aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29tcGlsZWQgPSB0ci5ub3JtYWxpemVGbih0aGlzLl90ci5jb21waWxlKHN0ciwgb3B0aW9ucykpO1xuICAgIHZhciBib2R5ID0gY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh7Ym9keTogYm9keSwgZGVwZW5kZW5jaWVzOiBjb21waWxlZC5kZXBlbmRlbmNpZXN9KTtcbiAgfVxufTtcblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXJBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGxvY2FscywgY2IpIHtcbiAgaWYgKHR5cGVvZiBsb2NhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGxvY2FscztcbiAgICBsb2NhbHMgPSBvcHRpb25zO1xuICB9XG4gIGlmICghdGhpcy5jYW4oJ3JlbmRlckFzeW5jJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlckZpbGVBc3luYycpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyBmcm9tIGEgc3RyaW5nLicpKS5ub2RlaWZ5KGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcnKSkubm9kZWlmeShjYik7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIucmVuZGVyQXN5bmMoc3RyLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXInKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuY29tcGlsZUFzeW5jKHN0ciwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoY29tcGlsZWQpIHtcbiAgICAgIHJldHVybiB7Ym9keTogY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpLCBkZXBlbmRlbmNpZXM6IGNvbXBpbGVkLmRlcGVuZGVuY2llc307XG4gICAgfSksIGNiKTtcbiAgfVxufTtcblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXJGaWxlID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBvcHRpb25zLCBsb2NhbHMpIHtcbiAgaWYgKCF0aGlzLmNhbigncmVuZGVyRmlsZScpKSB7IC8vICpBc3luYywgKkNsaWVudFxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIucmVuZGVyRmlsZShmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzKSk7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXInKSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplKHRoaXMuX3RyLnJlbmRlcih0ci5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsICd1dGY4JyksIG9wdGlvbnMsIGxvY2FscykpO1xuICB9IGVsc2UgeyAvLyBjb21waWxlIHx8IGNvbXBpbGVGaWxlXG4gICAgdmFyIGNvbXBpbGVkID0gdGhpcy5jb21waWxlRmlsZShmaWxlbmFtZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh7Ym9keTogY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpLCBkZXBlbmRlbmNpZXM6IGNvbXBpbGVkLmRlcGVuZGVuY2llc30pO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLnJlbmRlckZpbGVBc3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzLCBjYikge1xuICBpZiAoIXRoaXMuY2FuKCdyZW5kZXJGaWxlQXN5bmMnKSkgeyAvLyAqQ2xpZW50XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbG9jYWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBsb2NhbHM7XG4gICAgbG9jYWxzID0gb3B0aW9ucztcbiAgfVxuICBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXJGaWxlQXN5bmMnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXJGaWxlQXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMsIGxvY2FscyksIGNiKTtcbiAgfSBlbHNlIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXJGaWxlKGZpbGVuYW1lLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlJykgfHwgdGhpcy5faGFzTWV0aG9kKCdjb21waWxlQXN5bmMnKVxuICAgICAgICAgICAgIHx8IHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSB8fCB0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVGaWxlQXN5bmMnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLmNvbXBpbGVGaWxlQXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKGNvbXBpbGVkKSB7XG4gICAgICByZXR1cm4ge2JvZHk6IGNvbXBpbGVkLmZuKGxvY2FscyB8fCBvcHRpb25zKSwgZGVwZW5kZW5jaWVzOiBjb21waWxlZC5kZXBlbmRlbmNpZXN9O1xuICAgIH0pLCBjYik7XG4gIH0gZWxzZSB7IC8vIHJlbmRlciB8fCByZW5kZXJBc3luY1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModHIucmVhZEZpbGUoZmlsZW5hbWUsICd1dGY4JykudGhlbihmdW5jdGlvbiAoc3RyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJBc3luYyhzdHIsIG9wdGlvbnMsIGxvY2Fscyk7XG4gICAgfS5iaW5kKHRoaXMpKSwgY2IpO1xuICB9XG59O1xuIiwgIi8qXG5UaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuQ29weXJpZ2h0IChjKSAyMDE2IENvZGVyUHVwcHlcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcblNPRlRXQVJFLlxuXG4qL1xudmFyIF9lbmRpYW5uZXNzO1xuZXhwb3J0IGZ1bmN0aW9uIGVuZGlhbm5lc3MoKSB7XG4gIGlmICh0eXBlb2YgX2VuZGlhbm5lc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGEgPSBuZXcgQXJyYXlCdWZmZXIoMik7XG4gICAgdmFyIGIgPSBuZXcgVWludDhBcnJheShhKTtcbiAgICB2YXIgYyA9IG5ldyBVaW50MTZBcnJheShhKTtcbiAgICBiWzBdID0gMTtcbiAgICBiWzFdID0gMjtcbiAgICBpZiAoY1swXSA9PT0gMjU4KSB7XG4gICAgICBfZW5kaWFubmVzcyA9ICdCRSc7XG4gICAgfSBlbHNlIGlmIChjWzBdID09PSA1MTMpe1xuICAgICAgX2VuZGlhbm5lc3MgPSAnTEUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBmaWd1cmUgb3V0IGVuZGlhbmVzcycpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2VuZGlhbm5lc3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBob3N0bmFtZSgpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWwubG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5sb2NhdGlvbi5ob3N0bmFtZVxuICB9IGVsc2UgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZGF2ZygpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXB0aW1lKCkge1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyZWVtZW0oKSB7XG4gIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG90YWxtZW0oKSB7XG4gIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3B1cygpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZSgpIHtcbiAgcmV0dXJuICdCcm93c2VyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2UgKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbC5uYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5uYXZpZ2F0b3IuYXBwVmVyc2lvbjtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXR3b3JrSW50ZXJmYWNlcygpe31cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXR3b3JrSW50ZXJmYWNlcygpe31cblxuZXhwb3J0IGZ1bmN0aW9uIGFyY2goKSB7XG4gIHJldHVybiAnamF2YXNjcmlwdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybSgpIHtcbiAgcmV0dXJuICdicm93c2VyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRtcERpcigpIHtcbiAgcmV0dXJuICcvdG1wJztcbn1cbmV4cG9ydCB2YXIgdG1wZGlyID0gdG1wRGlyO1xuXG5leHBvcnQgdmFyIEVPTCA9ICdcXG4nO1xuZXhwb3J0IGRlZmF1bHQge1xuICBFT0w6IEVPTCxcbiAgdG1wZGlyOiB0bXBkaXIsXG4gIHRtcERpcjogdG1wRGlyLFxuICBuZXR3b3JrSW50ZXJmYWNlczpuZXR3b3JrSW50ZXJmYWNlcyxcbiAgZ2V0TmV0d29ya0ludGVyZmFjZXM6IGdldE5ldHdvcmtJbnRlcmZhY2VzLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICB0eXBlOiB0eXBlLFxuICBjcHVzOiBjcHVzLFxuICB0b3RhbG1lbTogdG90YWxtZW0sXG4gIGZyZWVtZW06IGZyZWVtZW0sXG4gIHVwdGltZTogdXB0aW1lLFxuICBsb2FkYXZnOiBsb2FkYXZnLFxuICBob3N0bmFtZTogaG9zdG5hbWUsXG4gIGVuZGlhbm5lc3M6IGVuZGlhbm5lc3MsXG59XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ29zJylcblxuaWYgKHBvbHlmaWxsICYmIHBvbHlmaWxsLmRlZmF1bHQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsLmRlZmF1bHRcbiAgICBmb3IgKGxldCBrIGluIHBvbHlmaWxsKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzW2tdID0gcG9seWZpbGxba11cbiAgICB9XG59IGVsc2UgaWYgKHBvbHlmaWxsKSAge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGxcbn1cblxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3MgPSByZXF1aXJlKCdvcycpO1xuXG4vLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9vcy1ob21lZGlyL2Jsb2IvMTFlMDg5ZjQ3NTRkYjM4YmI1MzVlNWE4NDE2MzIwYzQ0NDZlOGNmZC9pbmRleC5qc1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9zLmhvbWVkaXIgfHwgZnVuY3Rpb24gaG9tZWRpcigpIHtcbiAgICB2YXIgaG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgdmFyIHVzZXIgPSBwcm9jZXNzLmVudi5MT0dOQU1FIHx8IHByb2Nlc3MuZW52LlVTRVIgfHwgcHJvY2Vzcy5lbnYuTE5BTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUk5BTUU7XG5cbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUgfHwgcHJvY2Vzcy5lbnYuSE9NRURSSVZFICsgcHJvY2Vzcy5lbnYuSE9NRVBBVEggfHwgaG9tZSB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICAgICByZXR1cm4gaG9tZSB8fCAodXNlciA/ICcvVXNlcnMvJyArIHVzZXIgOiBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICByZXR1cm4gaG9tZSB8fCAocHJvY2Vzcy5nZXR1aWQoKSA9PT0gMCA/ICcvcm9vdCcgOiAodXNlciA/ICcvaG9tZS8nICsgdXNlciA6IG51bGwpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1leHRyYS1wYXJlbnNcbiAgICB9XG5cbiAgICByZXR1cm4gaG9tZSB8fCBudWxsO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBzZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC93aWtpL0phdmFTY3JpcHRTdGFja1RyYWNlQXBpXG4gICAgdmFyIG9yaWdQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnVuY3Rpb24gKF8sIHN0YWNrKSB7IHJldHVybiBzdGFjazsgfTtcbiAgICB2YXIgc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ1ByZXBhcmVTdGFja1RyYWNlO1xuICAgIHJldHVybiBzdGFja1syXS5nZXRGaWxlTmFtZSgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vLyBSZWdleCB0byBzcGxpdCBhIHdpbmRvd3MgcGF0aCBpbnRvIGludG8gW2Rpciwgcm9vdCwgYmFzZW5hbWUsIG5hbWUsIGV4dF1cbnZhciBzcGxpdFdpbmRvd3NSZSA9XG4gICAgL14oKCg/OlthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXStbXlxcXFxcXC9dKyk/W1xcXFxcXC9dPykoPzpbXlxcXFxcXC9dKltcXFxcXFwvXSkqKSgoXFwuezEsMn18W15cXFxcXFwvXSs/fCkoXFwuW14uXFwvXFxcXF0qfCkpW1xcXFxcXC9dKiQvO1xuXG52YXIgd2luMzIgPSB7fTtcblxuZnVuY3Rpb24gd2luMzJTcGxpdFBhdGgoZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0V2luZG93c1JlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufVxuXG53aW4zMi5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gd2luMzJTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA1KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm9vdDogYWxsUGFydHNbMV0sXG4gICAgZGlyOiBhbGxQYXJ0c1swXSA9PT0gYWxsUGFydHNbMV0gPyBhbGxQYXJ0c1swXSA6IGFsbFBhcnRzWzBdLnNsaWNlKDAsIC0xKSxcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcbiAgICBleHQ6IGFsbFBhcnRzWzRdLFxuICAgIG5hbWU6IGFsbFBhcnRzWzNdXG4gIH07XG59O1xuXG5cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtkaXIsIHJvb3QsIGJhc2VuYW1lLCBuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKChcXC8/KSg/OlteXFwvXSpcXC8pKikoKFxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSlbXFwvXSokLztcbnZhciBwb3NpeCA9IHt9O1xuXG5cbmZ1bmN0aW9uIHBvc2l4U3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn1cblxuXG5wb3NpeC5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gcG9zaXhTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA1KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIFxuICByZXR1cm4ge1xuICAgIHJvb3Q6IGFsbFBhcnRzWzFdLFxuICAgIGRpcjogYWxsUGFydHNbMF0uc2xpY2UoMCwgLTEpLFxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxuICAgIGV4dDogYWxsUGFydHNbNF0sXG4gICAgbmFtZTogYWxsUGFydHNbM10sXG4gIH07XG59O1xuXG5cbmlmIChpc1dpbmRvd3MpXG4gIG1vZHVsZS5leHBvcnRzID0gd2luMzIucGFyc2U7XG5lbHNlIC8qIHBvc2l4ICovXG4gIG1vZHVsZS5leHBvcnRzID0gcG9zaXgucGFyc2U7XG5cbm1vZHVsZS5leHBvcnRzLnBvc2l4ID0gcG9zaXgucGFyc2U7XG5tb2R1bGUuZXhwb3J0cy53aW4zMiA9IHdpbjMyLnBhcnNlO1xuIiwgInZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHBhcnNlID0gcGF0aC5wYXJzZSB8fCByZXF1aXJlKCdwYXRoLXBhcnNlJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcblxudmFyIGdldE5vZGVNb2R1bGVzRGlycyA9IGZ1bmN0aW9uIGdldE5vZGVNb2R1bGVzRGlycyhhYnNvbHV0ZVN0YXJ0LCBtb2R1bGVzKSB7XG4gICAgdmFyIHByZWZpeCA9ICcvJztcbiAgICBpZiAoKC9eKFtBLVphLXpdOikvKS50ZXN0KGFic29sdXRlU3RhcnQpKSB7XG4gICAgICAgIHByZWZpeCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoKC9eXFxcXFxcXFwvKS50ZXN0KGFic29sdXRlU3RhcnQpKSB7XG4gICAgICAgIHByZWZpeCA9ICdcXFxcXFxcXCc7XG4gICAgfVxuXG4gICAgdmFyIHBhdGhzID0gW2Fic29sdXRlU3RhcnRdO1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZShhYnNvbHV0ZVN0YXJ0KTtcbiAgICB3aGlsZSAocGFyc2VkLmRpciAhPT0gcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXJzZWQuZGlyKTtcbiAgICAgICAgcGFyc2VkID0gcGFyc2UocGFyc2VkLmRpcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhzLnJlZHVjZShmdW5jdGlvbiAoZGlycywgYVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGRpcnMuY29uY2F0KG1vZHVsZXMubWFwKGZ1bmN0aW9uIChtb2R1bGVEaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUocHJlZml4LCBhUGF0aCwgbW9kdWxlRGlyKTtcbiAgICAgICAgfSkpO1xuICAgIH0sIFtdKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9kZU1vZHVsZXNQYXRocyhzdGFydCwgb3B0cywgcmVxdWVzdCkge1xuICAgIHZhciBtb2R1bGVzID0gb3B0cyAmJiBvcHRzLm1vZHVsZURpcmVjdG9yeVxuICAgICAgICA/IFtdLmNvbmNhdChvcHRzLm1vZHVsZURpcmVjdG9yeSlcbiAgICAgICAgOiBbJ25vZGVfbW9kdWxlcyddO1xuXG4gICAgaWYgKG9wdHMgJiYgdHlwZW9mIG9wdHMucGF0aHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMucGF0aHMoXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXROb2RlTW9kdWxlc0RpcnMoc3RhcnQsIG1vZHVsZXMpOyB9LFxuICAgICAgICAgICAgb3B0c1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBkaXJzID0gZ2V0Tm9kZU1vZHVsZXNEaXJzKHN0YXJ0LCBtb2R1bGVzKTtcbiAgICByZXR1cm4gb3B0cyAmJiBvcHRzLnBhdGhzID8gZGlycy5jb25jYXQob3B0cy5wYXRocykgOiBkaXJzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh4LCBvcHRzKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWxlIGlzIHB1cnBvc2VmdWxseSBhIHBhc3N0aHJvdWdoLiBJdCdzIGV4cGVjdGVkIHRoYXQgdGhpcmQtcGFydHlcbiAgICAgKiBlbnZpcm9ubWVudHMgd2lsbCBvdmVycmlkZSBpdCBhdCBydW50aW1lIGluIG9yZGVyIHRvIGluamVjdCBzcGVjaWFsIGxvZ2ljXG4gICAgICogaW50byBgcmVzb2x2ZWAgKGJ5IG1hbmlwdWxhdGluZyB0aGUgb3B0aW9ucykuIE9uZSBzdWNoIGV4YW1wbGUgaXMgdGhlIFBuUFxuICAgICAqIGNvZGUgcGF0aCBpbiBZYXJuLlxuICAgICAqL1xuXG4gICAgcmV0dXJuIG9wdHMgfHwge307XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xuXG5mdW5jdGlvbiBzcGVjaWZpZXJJbmNsdWRlZChjdXJyZW50LCBzcGVjaWZpZXIpIHtcblx0dmFyIG5vZGVQYXJ0cyA9IGN1cnJlbnQuc3BsaXQoJy4nKTtcblx0dmFyIHBhcnRzID0gc3BlY2lmaWVyLnNwbGl0KCcgJyk7XG5cdHZhciBvcCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1swXSA6ICc9Jztcblx0dmFyIHZlcnNpb25QYXJ0cyA9IChwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0gOiBwYXJ0c1swXSkuc3BsaXQoJy4nKTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IDM7ICsraSkge1xuXHRcdHZhciBjdXIgPSBwYXJzZUludChub2RlUGFydHNbaV0gfHwgMCwgMTApO1xuXHRcdHZhciB2ZXIgPSBwYXJzZUludCh2ZXJzaW9uUGFydHNbaV0gfHwgMCwgMTApO1xuXHRcdGlmIChjdXIgPT09IHZlcikge1xuXHRcdFx0Y29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG5cdFx0fVxuXHRcdGlmIChvcCA9PT0gJzwnKSB7XG5cdFx0XHRyZXR1cm4gY3VyIDwgdmVyO1xuXHRcdH1cblx0XHRpZiAob3AgPT09ICc+PScpIHtcblx0XHRcdHJldHVybiBjdXIgPj0gdmVyO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIG9wID09PSAnPj0nO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmFuZ2UoY3VycmVudCwgcmFuZ2UpIHtcblx0dmFyIHNwZWNpZmllcnMgPSByYW5nZS5zcGxpdCgvID8mJiA/Lyk7XG5cdGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwZWNpZmllcnMubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoIXNwZWNpZmllckluY2x1ZGVkKGN1cnJlbnQsIHNwZWNpZmllcnNbaV0pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2ZXJzaW9uSW5jbHVkZWQobm9kZVZlcnNpb24sIHNwZWNpZmllclZhbHVlKSB7XG5cdGlmICh0eXBlb2Ygc3BlY2lmaWVyVmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdHJldHVybiBzcGVjaWZpZXJWYWx1ZTtcblx0fVxuXG5cdHZhciBjdXJyZW50ID0gdHlwZW9mIG5vZGVWZXJzaW9uID09PSAndW5kZWZpbmVkJ1xuXHRcdD8gcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGVcblx0XHQ6IG5vZGVWZXJzaW9uO1xuXG5cdGlmICh0eXBlb2YgY3VycmVudCAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlOyAvLyByZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlOyAvLyB0aHJvdyBuZXcgVHlwZUVycm9yKHR5cGVvZiBub2RlVmVyc2lvbiA9PT0gJ3VuZGVmaW5lZCcgPyAnVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IG5vZGUgdmVyc2lvbicgOiAnSWYgcHJvdmlkZWQsIGEgdmFsaWQgbm9kZSB2ZXJzaW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblxuXHRpZiAoc3BlY2lmaWVyVmFsdWUgJiYgdHlwZW9mIHNwZWNpZmllclZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY2lmaWVyVmFsdWUubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChtYXRjaGVzUmFuZ2UoY3VycmVudCwgc3BlY2lmaWVyVmFsdWVbaV0pKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIG1hdGNoZXNSYW5nZShjdXJyZW50LCBzcGVjaWZpZXJWYWx1ZSk7XG59XG5cbnZhciBkYXRhID0gcmVxdWlyZSgnLi9jb3JlLmpzb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NvcmUoeCwgbm9kZVZlcnNpb24pIHtcblx0cmV0dXJuIGhhcyhkYXRhLCB4KSAmJiB2ZXJzaW9uSW5jbHVkZWQobm9kZVZlcnNpb24sIGRhdGFbeF0pO1xufTtcbiIsICJ2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIGdldEhvbWVkaXIgPSByZXF1aXJlKCcuL2hvbWVkaXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGNhbGxlciA9IHJlcXVpcmUoJy4vY2FsbGVyJyk7XG52YXIgbm9kZU1vZHVsZXNQYXRocyA9IHJlcXVpcmUoJy4vbm9kZS1tb2R1bGVzLXBhdGhzJyk7XG52YXIgbm9ybWFsaXplT3B0aW9ucyA9IHJlcXVpcmUoJy4vbm9ybWFsaXplLW9wdGlvbnMnKTtcbnZhciBpc0NvcmUgPSByZXF1aXJlKCdpcy1jb3JlLW1vZHVsZScpO1xuXG52YXIgcmVhbHBhdGhGUyA9IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicgJiYgZnMucmVhbHBhdGggJiYgdHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWxwYXRoLm5hdGl2ZSA6IGZzLnJlYWxwYXRoO1xuXG52YXIgaG9tZWRpciA9IGdldEhvbWVkaXIoKTtcbnZhciBkZWZhdWx0UGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIsICcubm9kZV9tb2R1bGVzJyksXG4gICAgICAgIHBhdGguam9pbihob21lZGlyLCAnLm5vZGVfbGlicmFyaWVzJylcbiAgICBdO1xufTtcblxudmFyIGRlZmF1bHRJc0ZpbGUgPSBmdW5jdGlvbiBpc0ZpbGUoZmlsZSwgY2IpIHtcbiAgICBmcy5zdGF0KGZpbGUsIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBzdGF0LmlzRmlsZSgpIHx8IHN0YXQuaXNGSUZPKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXJyLmNvZGUgPT09ICdFTk9URElSJykgcmV0dXJuIGNiKG51bGwsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfSk7XG59O1xuXG52YXIgZGVmYXVsdElzRGlyID0gZnVuY3Rpb24gaXNEaXJlY3RvcnkoZGlyLCBjYikge1xuICAgIGZzLnN0YXQoZGlyLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgc3RhdC5pc0RpcmVjdG9yeSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnIHx8IGVyci5jb2RlID09PSAnRU5PVERJUicpIHJldHVybiBjYihudWxsLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH0pO1xufTtcblxudmFyIGRlZmF1bHRSZWFscGF0aCA9IGZ1bmN0aW9uIHJlYWxwYXRoKHgsIGNiKSB7XG4gICAgcmVhbHBhdGhGUyh4LCBmdW5jdGlvbiAocmVhbHBhdGhFcnIsIHJlYWxQYXRoKSB7XG4gICAgICAgIGlmIChyZWFscGF0aEVyciAmJiByZWFscGF0aEVyci5jb2RlICE9PSAnRU5PRU5UJykgY2IocmVhbHBhdGhFcnIpO1xuICAgICAgICBlbHNlIGNiKG51bGwsIHJlYWxwYXRoRXJyID8geCA6IHJlYWxQYXRoKTtcbiAgICB9KTtcbn07XG5cbnZhciBtYXliZVJlYWxwYXRoID0gZnVuY3Rpb24gbWF5YmVSZWFscGF0aChyZWFscGF0aCwgeCwgb3B0cywgY2IpIHtcbiAgICBpZiAob3B0cyAmJiBvcHRzLnByZXNlcnZlU3ltbGlua3MgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlYWxwYXRoKHgsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjYihudWxsLCB4KTtcbiAgICB9XG59O1xuXG52YXIgZGVmYXVsdFJlYWRQYWNrYWdlID0gZnVuY3Rpb24gZGVmYXVsdFJlYWRQYWNrYWdlKHJlYWRGaWxlLCBwa2dmaWxlLCBjYikge1xuICAgIHJlYWRGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChyZWFkRmlsZUVyciwgYm9keSkge1xuICAgICAgICBpZiAocmVhZEZpbGVFcnIpIGNiKHJlYWRGaWxlRXJyKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBwa2cgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICAgICAgICAgIGNiKG51bGwsIHBrZyk7XG4gICAgICAgICAgICB9IGNhdGNoIChqc29uRXJyKSB7XG4gICAgICAgICAgICAgICAgY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbnZhciBnZXRQYWNrYWdlQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKSB7XG4gICAgdmFyIGRpcnMgPSBub2RlTW9kdWxlc1BhdGhzKHN0YXJ0LCBvcHRzLCB4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlyc1tpXSA9IHBhdGguam9pbihkaXJzW2ldLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmUoeCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgY2IgPSBjYWxsYmFjaztcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0cztcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdQYXRoIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wdHMgPSBub3JtYWxpemVPcHRpb25zKHgsIG9wdHMpO1xuXG4gICAgdmFyIGlzRmlsZSA9IG9wdHMuaXNGaWxlIHx8IGRlZmF1bHRJc0ZpbGU7XG4gICAgdmFyIGlzRGlyZWN0b3J5ID0gb3B0cy5pc0RpcmVjdG9yeSB8fCBkZWZhdWx0SXNEaXI7XG4gICAgdmFyIHJlYWRGaWxlID0gb3B0cy5yZWFkRmlsZSB8fCBmcy5yZWFkRmlsZTtcbiAgICB2YXIgcmVhbHBhdGggPSBvcHRzLnJlYWxwYXRoIHx8IGRlZmF1bHRSZWFscGF0aDtcbiAgICB2YXIgcmVhZFBhY2thZ2UgPSBvcHRzLnJlYWRQYWNrYWdlIHx8IGRlZmF1bHRSZWFkUGFja2FnZTtcbiAgICBpZiAob3B0cy5yZWFkRmlsZSAmJiBvcHRzLnJlYWRQYWNrYWdlKSB7XG4gICAgICAgIHZhciBjb25mbGljdEVyciA9IG5ldyBUeXBlRXJyb3IoJ2ByZWFkRmlsZWAgYW5kIGByZWFkUGFja2FnZWAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4nKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2IoY29uZmxpY3RFcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHBhY2thZ2VJdGVyYXRvciA9IG9wdHMucGFja2FnZUl0ZXJhdG9yO1xuXG4gICAgdmFyIGV4dGVuc2lvbnMgPSBvcHRzLmV4dGVuc2lvbnMgfHwgWycuanMnXTtcbiAgICB2YXIgaW5jbHVkZUNvcmVNb2R1bGVzID0gb3B0cy5pbmNsdWRlQ29yZU1vZHVsZXMgIT09IGZhbHNlO1xuICAgIHZhciBiYXNlZGlyID0gb3B0cy5iYXNlZGlyIHx8IHBhdGguZGlybmFtZShjYWxsZXIoKSk7XG4gICAgdmFyIHBhcmVudCA9IG9wdHMuZmlsZW5hbWUgfHwgYmFzZWRpcjtcblxuICAgIG9wdHMucGF0aHMgPSBvcHRzLnBhdGhzIHx8IGRlZmF1bHRQYXRocygpO1xuXG4gICAgLy8gZW5zdXJlIHRoYXQgYGJhc2VkaXJgIGlzIGFuIGFic29sdXRlIHBhdGggYXQgdGhpcyBwb2ludCwgcmVzb2x2aW5nIGFnYWluc3QgdGhlIHByb2Nlc3MnIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICB2YXIgYWJzb2x1dGVTdGFydCA9IHBhdGgucmVzb2x2ZShiYXNlZGlyKTtcblxuICAgIG1heWJlUmVhbHBhdGgoXG4gICAgICAgIHJlYWxwYXRoLFxuICAgICAgICBhYnNvbHV0ZVN0YXJ0LFxuICAgICAgICBvcHRzLFxuICAgICAgICBmdW5jdGlvbiAoZXJyLCByZWFsU3RhcnQpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgICAgICBlbHNlIGluaXQocmVhbFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGZ1bmN0aW9uIGluaXQoYmFzZWRpcikge1xuICAgICAgICBpZiAoKC9eKD86XFwuXFwuPyg/OlxcL3wkKXxcXC98KFtBLVphLXpdOik/Wy9cXFxcXSkvKS50ZXN0KHgpKSB7XG4gICAgICAgICAgICByZXMgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgeCk7XG4gICAgICAgICAgICBpZiAoeCA9PT0gJy4nIHx8IHggPT09ICcuLicgfHwgeC5zbGljZSgtMSkgPT09ICcvJykgcmVzICs9ICcvJztcbiAgICAgICAgICAgIGlmICgoL1xcLyQvKS50ZXN0KHgpICYmIHJlcyA9PT0gYmFzZWRpcikge1xuICAgICAgICAgICAgICAgIGxvYWRBc0RpcmVjdG9yeShyZXMsIG9wdHMucGFja2FnZSwgb25maWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSBsb2FkQXNGaWxlKHJlcywgb3B0cy5wYWNrYWdlLCBvbmZpbGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVDb3JlTW9kdWxlcyAmJiBpc0NvcmUoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCB4KTtcbiAgICAgICAgfSBlbHNlIGxvYWROb2RlTW9kdWxlcyh4LCBiYXNlZGlyLCBmdW5jdGlvbiAoZXJyLCBuLCBwa2cpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgICAgICBlbHNlIGlmIChuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1heWJlUmVhbHBhdGgocmVhbHBhdGgsIG4sIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlYWxOKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihudWxsLCByZWFsTiwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlRXJyb3IgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFcnJvci5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuICAgICAgICAgICAgICAgIGNiKG1vZHVsZUVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25maWxlKGVyciwgbSwgcGtnKSB7XG4gICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgIGVsc2UgaWYgKG0pIGNiKG51bGwsIG0sIHBrZyk7XG4gICAgICAgIGVsc2UgbG9hZEFzRGlyZWN0b3J5KHJlcywgZnVuY3Rpb24gKGVyciwgZCwgcGtnKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSBjYihlcnIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoZCkge1xuICAgICAgICAgICAgICAgIG1heWJlUmVhbHBhdGgocmVhbHBhdGgsIGQsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlYWxEKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihudWxsLCByZWFsRCwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlRXJyb3IgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFcnJvci5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuICAgICAgICAgICAgICAgIGNiKG1vZHVsZUVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZEFzRmlsZSh4LCB0aGVQYWNrYWdlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbG9hZEFzRmlsZVBhY2thZ2UgPSB0aGVQYWNrYWdlO1xuICAgICAgICB2YXIgY2IgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBsb2FkQXNGaWxlUGFja2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2IgPSBsb2FkQXNGaWxlUGFja2FnZTtcbiAgICAgICAgICAgIGxvYWRBc0ZpbGVQYWNrYWdlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4dHMgPSBbJyddLmNvbmNhdChleHRlbnNpb25zKTtcbiAgICAgICAgbG9hZChleHRzLCB4LCBsb2FkQXNGaWxlUGFja2FnZSk7XG5cbiAgICAgICAgZnVuY3Rpb24gbG9hZChleHRzLCB4LCBsb2FkUGFja2FnZSkge1xuICAgICAgICAgICAgaWYgKGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm4gY2IobnVsbCwgdW5kZWZpbmVkLCBsb2FkUGFja2FnZSk7XG4gICAgICAgICAgICB2YXIgZmlsZSA9IHggKyBleHRzWzBdO1xuXG4gICAgICAgICAgICB2YXIgcGtnID0gbG9hZFBhY2thZ2U7XG4gICAgICAgICAgICBpZiAocGtnKSBvbnBrZyhudWxsLCBwa2cpO1xuICAgICAgICAgICAgZWxzZSBsb2FkcGtnKHBhdGguZGlybmFtZShmaWxlKSwgb25wa2cpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbnBrZyhlcnIsIHBrZ18sIGRpcikge1xuICAgICAgICAgICAgICAgIHBrZyA9IHBrZ187XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGRpciAmJiBwa2cgJiYgb3B0cy5wYXRoRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZmlsZSA9IHBhdGgucmVsYXRpdmUoZGlyLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHJmaWxlLnNsaWNlKDAsIHJmaWxlLmxlbmd0aCAtIGV4dHNbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBvcHRzLnBhdGhGaWx0ZXIocGtnLCB4LCByZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocikgcmV0dXJuIGxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBbJyddLmNvbmNhdChleHRlbnNpb25zLnNsaWNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGRpciwgciksXG4gICAgICAgICAgICAgICAgICAgICAgICBwa2dcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNGaWxlKGZpbGUsIG9uZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb25leChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGV4KSByZXR1cm4gY2IobnVsbCwgZmlsZSwgcGtnKTtcbiAgICAgICAgICAgICAgICBsb2FkKGV4dHMuc2xpY2UoMSksIHgsIHBrZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkcGtnKGRpciwgY2IpIHtcbiAgICAgICAgaWYgKGRpciA9PT0gJycgfHwgZGlyID09PSAnLycpIHJldHVybiBjYihudWxsKTtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgKC9eXFx3OlsvXFxcXF0qJC8pLnRlc3QoZGlyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoL1svXFxcXF1ub2RlX21vZHVsZXNbL1xcXFxdKiQvKS50ZXN0KGRpcikpIHJldHVybiBjYihudWxsKTtcblxuICAgICAgICBtYXliZVJlYWxwYXRoKHJlYWxwYXRoLCBkaXIsIG9wdHMsIGZ1bmN0aW9uICh1bndyYXBFcnIsIHBrZ2Rpcikge1xuICAgICAgICAgICAgaWYgKHVud3JhcEVycikgcmV0dXJuIGxvYWRwa2cocGF0aC5kaXJuYW1lKGRpciksIGNiKTtcbiAgICAgICAgICAgIHZhciBwa2dmaWxlID0gcGF0aC5qb2luKHBrZ2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgICAgaXNGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gb24gZXJyLCBleCBpcyBmYWxzZVxuICAgICAgICAgICAgICAgIGlmICghZXgpIHJldHVybiBsb2FkcGtnKHBhdGguZGlybmFtZShkaXIpLCBjYik7XG5cbiAgICAgICAgICAgICAgICByZWFkUGFja2FnZShyZWFkRmlsZSwgcGtnZmlsZSwgZnVuY3Rpb24gKGVyciwgcGtnUGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgY2IoZXJyKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgcGtnID0gcGtnUGFyYW07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAmJiBvcHRzLnBhY2thZ2VGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9IG9wdHMucGFja2FnZUZpbHRlcihwa2csIHBrZ2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNiKG51bGwsIHBrZywgZGlyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNEaXJlY3RvcnkoeCwgbG9hZEFzRGlyZWN0b3J5UGFja2FnZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNiID0gY2FsbGJhY2s7XG4gICAgICAgIHZhciBmcGtnID0gbG9hZEFzRGlyZWN0b3J5UGFja2FnZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmcGtnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYiA9IGZwa2c7XG4gICAgICAgICAgICBmcGtnID0gb3B0cy5wYWNrYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF5YmVSZWFscGF0aChyZWFscGF0aCwgeCwgb3B0cywgZnVuY3Rpb24gKHVud3JhcEVyciwgcGtnZGlyKSB7XG4gICAgICAgICAgICBpZiAodW53cmFwRXJyKSByZXR1cm4gY2IodW53cmFwRXJyKTtcbiAgICAgICAgICAgIHZhciBwa2dmaWxlID0gcGF0aC5qb2luKHBrZ2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgICAgaXNGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKCFleCkgcmV0dXJuIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBmcGtnLCBjYik7XG5cbiAgICAgICAgICAgICAgICByZWFkUGFja2FnZShyZWFkRmlsZSwgcGtnZmlsZSwgZnVuY3Rpb24gKGVyciwgcGtnUGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHBrZyA9IHBrZ1BhcmFtO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwa2cgJiYgb3B0cy5wYWNrYWdlRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSBvcHRzLnBhY2thZ2VGaWx0ZXIocGtnLCBwa2dmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwa2cgJiYgcGtnLm1haW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGtnLm1haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1haW5FcnJvciA9IG5ldyBUeXBlRXJyb3IoJ3BhY2thZ2UgXHUyMDFDJyArIHBrZy5uYW1lICsgJ1x1MjAxRCBgbWFpbmAgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5FcnJvci5jb2RlID0gJ0lOVkFMSURfUEFDS0FHRV9NQUlOJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IobWFpbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa2cubWFpbiA9PT0gJy4nIHx8IHBrZy5tYWluID09PSAnLi8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLm1haW4gPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEFzRmlsZShwYXRoLnJlc29sdmUoeCwgcGtnLm1haW4pLCBwa2csIGZ1bmN0aW9uIChlcnIsIG0sIHBrZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSByZXR1cm4gY2IobnVsbCwgbSwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZykgcmV0dXJuIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBwa2csIGNiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXIgPSBwYXRoLnJlc29sdmUoeCwgcGtnLm1haW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBc0RpcmVjdG9yeShkaXIsIHBrZywgZnVuY3Rpb24gKGVyciwgbiwgcGtnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgcmV0dXJuIGNiKG51bGwsIG4sIHBrZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBwa2csIGNiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbG9hZEFzRmlsZShwYXRoLmpvaW4oeCwgJy9pbmRleCcpLCBwa2csIGNiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzRGlycyhjYiwgZGlycykge1xuICAgICAgICBpZiAoZGlycy5sZW5ndGggPT09IDApIHJldHVybiBjYihudWxsLCB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZGlyID0gZGlyc1swXTtcblxuICAgICAgICBpc0RpcmVjdG9yeShwYXRoLmRpcm5hbWUoZGlyKSwgaXNkaXIpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGlzZGlyKGVyciwgaXNkaXIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgaWYgKCFpc2RpcikgcmV0dXJuIHByb2Nlc3NEaXJzKGNiLCBkaXJzLnNsaWNlKDEpKTtcbiAgICAgICAgICAgIGxvYWRBc0ZpbGUoZGlyLCBvcHRzLnBhY2thZ2UsIG9uZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbmZpbGUoZXJyLCBtLCBwa2cpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgaWYgKG0pIHJldHVybiBjYihudWxsLCBtLCBwa2cpO1xuICAgICAgICAgICAgbG9hZEFzRGlyZWN0b3J5KGRpciwgb3B0cy5wYWNrYWdlLCBvbmRpcik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbmRpcihlcnIsIG4sIHBrZykge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICBpZiAobikgcmV0dXJuIGNiKG51bGwsIG4sIHBrZyk7XG4gICAgICAgICAgICBwcm9jZXNzRGlycyhjYiwgZGlycy5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbG9hZE5vZGVNb2R1bGVzKHgsIHN0YXJ0LCBjYikge1xuICAgICAgICB2YXIgdGh1bmsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRQYWNrYWdlQ2FuZGlkYXRlcyh4LCBzdGFydCwgb3B0cyk7IH07XG4gICAgICAgIHByb2Nlc3NEaXJzKFxuICAgICAgICAgICAgY2IsXG4gICAgICAgICAgICBwYWNrYWdlSXRlcmF0b3IgPyBwYWNrYWdlSXRlcmF0b3IoeCwgc3RhcnQsIHRodW5rLCBvcHRzKSA6IHRodW5rKClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQ29yZU1vZHVsZSA9IHJlcXVpcmUoJ2lzLWNvcmUtbW9kdWxlJyk7XG52YXIgZGF0YSA9IHJlcXVpcmUoJy4vY29yZS5qc29uJyk7XG5cbnZhciBjb3JlID0ge307XG5mb3IgKHZhciBtb2QgaW4gZGF0YSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBtb2QpKSB7XG4gICAgICAgIGNvcmVbbW9kXSA9IGlzQ29yZU1vZHVsZShtb2QpO1xuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gY29yZTtcbiIsICJ2YXIgaXNDb3JlTW9kdWxlID0gcmVxdWlyZSgnaXMtY29yZS1tb2R1bGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NvcmUoeCkge1xuICAgIHJldHVybiBpc0NvcmVNb2R1bGUoeCk7XG59O1xuIiwgInZhciBpc0NvcmUgPSByZXF1aXJlKCdpcy1jb3JlLW1vZHVsZScpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGdldEhvbWVkaXIgPSByZXF1aXJlKCcuL2hvbWVkaXInKTtcbnZhciBjYWxsZXIgPSByZXF1aXJlKCcuL2NhbGxlcicpO1xudmFyIG5vZGVNb2R1bGVzUGF0aHMgPSByZXF1aXJlKCcuL25vZGUtbW9kdWxlcy1wYXRocycpO1xudmFyIG5vcm1hbGl6ZU9wdGlvbnMgPSByZXF1aXJlKCcuL25vcm1hbGl6ZS1vcHRpb25zJyk7XG5cbnZhciByZWFscGF0aEZTID0gcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJyAmJiBmcy5yZWFscGF0aFN5bmMgJiYgdHlwZW9mIGZzLnJlYWxwYXRoU3luYy5uYXRpdmUgPT09ICdmdW5jdGlvbicgPyBmcy5yZWFscGF0aFN5bmMubmF0aXZlIDogZnMucmVhbHBhdGhTeW5jO1xuXG52YXIgaG9tZWRpciA9IGdldEhvbWVkaXIoKTtcbnZhciBkZWZhdWx0UGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIsICcubm9kZV9tb2R1bGVzJyksXG4gICAgICAgIHBhdGguam9pbihob21lZGlyLCAnLm5vZGVfbGlicmFyaWVzJylcbiAgICBdO1xufTtcblxudmFyIGRlZmF1bHRJc0ZpbGUgPSBmdW5jdGlvbiBpc0ZpbGUoZmlsZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBzdGF0ID0gZnMuc3RhdFN5bmMoZmlsZSwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAmJiAoZS5jb2RlID09PSAnRU5PRU5UJyB8fCBlLmNvZGUgPT09ICdFTk9URElSJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuICEhc3RhdCAmJiAoc3RhdC5pc0ZpbGUoKSB8fCBzdGF0LmlzRklGTygpKTtcbn07XG5cbnZhciBkZWZhdWx0SXNEaXIgPSBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXIpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgc3RhdCA9IGZzLnN0YXRTeW5jKGRpciwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAmJiAoZS5jb2RlID09PSAnRU5PRU5UJyB8fCBlLmNvZGUgPT09ICdFTk9URElSJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuICEhc3RhdCAmJiBzdGF0LmlzRGlyZWN0b3J5KCk7XG59O1xuXG52YXIgZGVmYXVsdFJlYWxwYXRoU3luYyA9IGZ1bmN0aW9uIHJlYWxwYXRoU3luYyh4KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlYWxwYXRoRlMoeCk7XG4gICAgfSBjYXRjaCAocmVhbHBhdGhFcnIpIHtcbiAgICAgICAgaWYgKHJlYWxwYXRoRXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICB0aHJvdyByZWFscGF0aEVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbnZhciBtYXliZVJlYWxwYXRoU3luYyA9IGZ1bmN0aW9uIG1heWJlUmVhbHBhdGhTeW5jKHJlYWxwYXRoU3luYywgeCwgb3B0cykge1xuICAgIGlmIChvcHRzICYmIG9wdHMucHJlc2VydmVTeW1saW5rcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlYWxwYXRoU3luYyh4KTtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG52YXIgZGVmYXVsdFJlYWRQYWNrYWdlU3luYyA9IGZ1bmN0aW9uIGRlZmF1bHRSZWFkUGFja2FnZVN5bmMocmVhZEZpbGVTeW5jLCBwa2dmaWxlKSB7XG4gICAgdmFyIGJvZHkgPSByZWFkRmlsZVN5bmMocGtnZmlsZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHBrZyA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgIHJldHVybiBwa2c7XG4gICAgfSBjYXRjaCAoanNvbkVycikge31cbn07XG5cbnZhciBnZXRQYWNrYWdlQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKSB7XG4gICAgdmFyIGRpcnMgPSBub2RlTW9kdWxlc1BhdGhzKHN0YXJ0LCBvcHRzLCB4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlyc1tpXSA9IHBhdGguam9pbihkaXJzW2ldLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmVTeW5jKHgsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdGggbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgdmFyIG9wdHMgPSBub3JtYWxpemVPcHRpb25zKHgsIG9wdGlvbnMpO1xuXG4gICAgdmFyIGlzRmlsZSA9IG9wdHMuaXNGaWxlIHx8IGRlZmF1bHRJc0ZpbGU7XG4gICAgdmFyIHJlYWRGaWxlU3luYyA9IG9wdHMucmVhZEZpbGVTeW5jIHx8IGZzLnJlYWRGaWxlU3luYztcbiAgICB2YXIgaXNEaXJlY3RvcnkgPSBvcHRzLmlzRGlyZWN0b3J5IHx8IGRlZmF1bHRJc0RpcjtcbiAgICB2YXIgcmVhbHBhdGhTeW5jID0gb3B0cy5yZWFscGF0aFN5bmMgfHwgZGVmYXVsdFJlYWxwYXRoU3luYztcbiAgICB2YXIgcmVhZFBhY2thZ2VTeW5jID0gb3B0cy5yZWFkUGFja2FnZVN5bmMgfHwgZGVmYXVsdFJlYWRQYWNrYWdlU3luYztcbiAgICBpZiAob3B0cy5yZWFkRmlsZVN5bmMgJiYgb3B0cy5yZWFkUGFja2FnZVN5bmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYHJlYWRGaWxlU3luY2AgYW5kIGByZWFkUGFja2FnZVN5bmNgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJyk7XG4gICAgfVxuICAgIHZhciBwYWNrYWdlSXRlcmF0b3IgPSBvcHRzLnBhY2thZ2VJdGVyYXRvcjtcblxuICAgIHZhciBleHRlbnNpb25zID0gb3B0cy5leHRlbnNpb25zIHx8IFsnLmpzJ107XG4gICAgdmFyIGluY2x1ZGVDb3JlTW9kdWxlcyA9IG9wdHMuaW5jbHVkZUNvcmVNb2R1bGVzICE9PSBmYWxzZTtcbiAgICB2YXIgYmFzZWRpciA9IG9wdHMuYmFzZWRpciB8fCBwYXRoLmRpcm5hbWUoY2FsbGVyKCkpO1xuICAgIHZhciBwYXJlbnQgPSBvcHRzLmZpbGVuYW1lIHx8IGJhc2VkaXI7XG5cbiAgICBvcHRzLnBhdGhzID0gb3B0cy5wYXRocyB8fCBkZWZhdWx0UGF0aHMoKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IGBiYXNlZGlyYCBpcyBhbiBhYnNvbHV0ZSBwYXRoIGF0IHRoaXMgcG9pbnQsIHJlc29sdmluZyBhZ2FpbnN0IHRoZSBwcm9jZXNzJyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgdmFyIGFic29sdXRlU3RhcnQgPSBtYXliZVJlYWxwYXRoU3luYyhyZWFscGF0aFN5bmMsIHBhdGgucmVzb2x2ZShiYXNlZGlyKSwgb3B0cyk7XG5cbiAgICBpZiAoKC9eKD86XFwuXFwuPyg/OlxcL3wkKXxcXC98KFtBLVphLXpdOik/Wy9cXFxcXSkvKS50ZXN0KHgpKSB7XG4gICAgICAgIHZhciByZXMgPSBwYXRoLnJlc29sdmUoYWJzb2x1dGVTdGFydCwgeCk7XG4gICAgICAgIGlmICh4ID09PSAnLicgfHwgeCA9PT0gJy4uJyB8fCB4LnNsaWNlKC0xKSA9PT0gJy8nKSByZXMgKz0gJy8nO1xuICAgICAgICB2YXIgbSA9IGxvYWRBc0ZpbGVTeW5jKHJlcykgfHwgbG9hZEFzRGlyZWN0b3J5U3luYyhyZXMpO1xuICAgICAgICBpZiAobSkgcmV0dXJuIG1heWJlUmVhbHBhdGhTeW5jKHJlYWxwYXRoU3luYywgbSwgb3B0cyk7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlQ29yZU1vZHVsZXMgJiYgaXNDb3JlKHgpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuID0gbG9hZE5vZGVNb2R1bGVzU3luYyh4LCBhYnNvbHV0ZVN0YXJ0KTtcbiAgICAgICAgaWYgKG4pIHJldHVybiBtYXliZVJlYWxwYXRoU3luYyhyZWFscGF0aFN5bmMsIG4sIG9wdHMpO1xuICAgIH1cblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICBlcnIuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcbiAgICB0aHJvdyBlcnI7XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNGaWxlU3luYyh4KSB7XG4gICAgICAgIHZhciBwa2cgPSBsb2FkcGtnKHBhdGguZGlybmFtZSh4KSk7XG5cbiAgICAgICAgaWYgKHBrZyAmJiBwa2cuZGlyICYmIHBrZy5wa2cgJiYgb3B0cy5wYXRoRmlsdGVyKSB7XG4gICAgICAgICAgICB2YXIgcmZpbGUgPSBwYXRoLnJlbGF0aXZlKHBrZy5kaXIsIHgpO1xuICAgICAgICAgICAgdmFyIHIgPSBvcHRzLnBhdGhGaWx0ZXIocGtnLnBrZywgeCwgcmZpbGUpO1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgICB4ID0gcGF0aC5yZXNvbHZlKHBrZy5kaXIsIHIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGaWxlKHgpKSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpbGUgPSB4ICsgZXh0ZW5zaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRwa2coZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPT09ICcnIHx8IGRpciA9PT0gJy8nKSByZXR1cm47XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmICgvXlxcdzpbL1xcXFxdKiQvKS50ZXN0KGRpcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKC9bL1xcXFxdbm9kZV9tb2R1bGVzWy9cXFxcXSokLykudGVzdChkaXIpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHBrZ2ZpbGUgPSBwYXRoLmpvaW4obWF5YmVSZWFscGF0aFN5bmMocmVhbHBhdGhTeW5jLCBkaXIsIG9wdHMpLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICAgICAgaWYgKCFpc0ZpbGUocGtnZmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkcGtnKHBhdGguZGlybmFtZShkaXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwa2cgPSByZWFkUGFja2FnZVN5bmMocmVhZEZpbGVTeW5jLCBwa2dmaWxlKTtcblxuICAgICAgICBpZiAocGtnICYmIG9wdHMucGFja2FnZUZpbHRlcikge1xuICAgICAgICAgICAgLy8gdjIgd2lsbCBwYXNzIHBrZ2ZpbGVcbiAgICAgICAgICAgIHBrZyA9IG9wdHMucGFja2FnZUZpbHRlcihwa2csIC8qcGtnZmlsZSwqLyBkaXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNwYWNlZC1jb21tZW50XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBwa2c6IHBrZywgZGlyOiBkaXIgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNEaXJlY3RvcnlTeW5jKHgpIHtcbiAgICAgICAgdmFyIHBrZ2ZpbGUgPSBwYXRoLmpvaW4obWF5YmVSZWFscGF0aFN5bmMocmVhbHBhdGhTeW5jLCB4LCBvcHRzKSwgJy9wYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGlzRmlsZShwa2dmaWxlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcGtnID0gcmVhZFBhY2thZ2VTeW5jKHJlYWRGaWxlU3luYywgcGtnZmlsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICBpZiAocGtnICYmIG9wdHMucGFja2FnZUZpbHRlcikge1xuICAgICAgICAgICAgICAgIC8vIHYyIHdpbGwgcGFzcyBwa2dmaWxlXG4gICAgICAgICAgICAgICAgcGtnID0gb3B0cy5wYWNrYWdlRmlsdGVyKHBrZywgLypwa2dmaWxlLCovIHgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNwYWNlZC1jb21tZW50XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwa2cgJiYgcGtnLm1haW4pIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBrZy5tYWluICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFpbkVycm9yID0gbmV3IFR5cGVFcnJvcigncGFja2FnZSBcdTIwMUMnICsgcGtnLm5hbWUgKyAnXHUyMDFEIGBtYWluYCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIG1haW5FcnJvci5jb2RlID0gJ0lOVkFMSURfUEFDS0FHRV9NQUlOJztcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbWFpbkVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGtnLm1haW4gPT09ICcuJyB8fCBwa2cubWFpbiA9PT0gJy4vJykge1xuICAgICAgICAgICAgICAgICAgICBwa2cubWFpbiA9ICdpbmRleCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbG9hZEFzRmlsZVN5bmMocGF0aC5yZXNvbHZlKHgsIHBrZy5tYWluKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtKSByZXR1cm4gbTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBsb2FkQXNEaXJlY3RvcnlTeW5jKHBhdGgucmVzb2x2ZSh4LCBwa2cubWFpbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobikgcmV0dXJuIG47XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2FkQXNGaWxlU3luYyhwYXRoLmpvaW4oeCwgJy9pbmRleCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTm9kZU1vZHVsZXNTeW5jKHgsIHN0YXJ0KSB7XG4gICAgICAgIHZhciB0aHVuayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKTsgfTtcbiAgICAgICAgdmFyIGRpcnMgPSBwYWNrYWdlSXRlcmF0b3IgPyBwYWNrYWdlSXRlcmF0b3IoeCwgc3RhcnQsIHRodW5rLCBvcHRzKSA6IHRodW5rKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gZGlyc1tpXTtcbiAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeShwYXRoLmRpcm5hbWUoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IGxvYWRBc0ZpbGVTeW5jKGRpcik7XG4gICAgICAgICAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICAgICAgICAgIHZhciBuID0gbG9hZEFzRGlyZWN0b3J5U3luYyhkaXIpO1xuICAgICAgICAgICAgICAgIGlmIChuKSByZXR1cm4gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCAidmFyIGFzeW5jID0gcmVxdWlyZSgnLi9saWIvYXN5bmMnKTtcbmFzeW5jLmNvcmUgPSByZXF1aXJlKCcuL2xpYi9jb3JlJyk7XG5hc3luYy5pc0NvcmUgPSByZXF1aXJlKCcuL2xpYi9pcy1jb3JlJyk7XG5hc3luYy5zeW5jID0gcmVxdWlyZSgnLi9saWIvc3luYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGpzdHJhbnNmb3JtZXIgPSByZXF1aXJlKCdqc3RyYW5zZm9ybWVyJyk7XG52YXIgcmVzb2x2ZSA9IHJlcXVpcmUoJ3Jlc29sdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXI7XG5cbmZ1bmN0aW9uIGdldE1pbmlmeVRyYW5zZm9ybWVyTmFtZShvdXRwdXRGb3JtYXQpIHtcbiAgc3dpdGNoIChvdXRwdXRGb3JtYXQpIHtcbiAgICBjYXNlICdqcyc6XG4gICAgICByZXR1cm4gJ3VnbGlmeS1qcyc7XG4gICAgY2FzZSAnY3NzJzpcbiAgICAgIHJldHVybiAnY2xlYW4tY3NzJztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXIobmFtZSwgc3RyLCBvcHRpb25zLCBjdXJyZW50RGlyZWN0b3J5LCBmdW5jTmFtZSkge1xuICBmdW5jTmFtZSA9IGZ1bmNOYW1lIHx8ICdyZW5kZXInO1xuICB2YXIgdHJQYXRoO1xuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICB0clBhdGggPSByZXNvbHZlLnN5bmMoJ2pzdHJhbnNmb3JtZXItJyArIG5hbWUsIHtcbiAgICAgICAgYmFzZWRpcjogY3VycmVudERpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnanN0cmFuc2Zvcm1lci0nICsgbmFtZSk7XG4gICAgfVxuICB9IGNhdGNoIChleCkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3Vua25vd24gZmlsdGVyIFwiOicgKyBuYW1lICsgJ1wiJyk7XG4gICAgZXJyLmNvZGUgPSAnVU5LTk9XTl9GSUxURVInO1xuICAgIHRocm93IGVycjtcbiAgfVxuICB2YXIgdHIgPSBqc3RyYW5zZm9ybWVyKHJlcXVpcmUodHJQYXRoKSk7XG4gIC8vIFRPRE86IHdlIG1heSB3YW50IHRvIGFkZCBhIHdheSBmb3IgcGVvcGxlIHRvIHNlcGFyYXRlbHkgc3BlY2lmeSBcImxvY2Fsc1wiXG4gIHZhciByZXN1bHQgPSB0cltmdW5jTmFtZV0oc3RyLCBvcHRpb25zLCBvcHRpb25zKS5ib2R5O1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm1pbmlmeSkge1xuICAgIHZhciBtaW5pZnlUcmFuZm9ybWVyID0gZ2V0TWluaWZ5VHJhbnNmb3JtZXJOYW1lKHRyLm91dHB1dEZvcm1hdCk7XG4gICAgaWYgKG1pbmlmeVRyYW5mb3JtZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbHRlcihtaW5pZnlUcmFuZm9ybWVyLCByZXN1bHQsIG51bGwsIGN1cnJlbnREaXJlY3RvcnkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgLy8gYmV0dGVyIHRvIGZhaWwgdG8gbWluaWZ5IHRoYW4gb3V0cHV0IG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJleHBvcnQgdHlwZSBQb3MgPSB7XG4gIHN0YXJ0OiBudW1iZXI7XG59O1xuXG4vLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGZvciB0aGVcbi8vIGBzdGFydExvY2AgYW5kIGBlbmRMb2NgIHByb3BlcnRpZXMuXG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbiB7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29sdW1uOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobGluZTogbnVtYmVyLCBjb2w6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2w7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTb3VyY2VMb2NhdGlvbiB7XG4gIHN0YXJ0OiBQb3NpdGlvbjtcbiAgZW5kOiBQb3NpdGlvbjtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgaWRlbnRpZmllck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3Ioc3RhcnQ6IFBvc2l0aW9uLCBlbmQ/OiBQb3NpdGlvbikge1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAvLyAobWF5IHN0YXJ0IGFzIG51bGwsIGJ1dCBpbml0aWFsaXplZCBsYXRlcilcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxufVxuXG4vKipcbiAqIGNyZWF0ZXMgYSBuZXcgcG9zaXRpb24gd2l0aCBhIG5vbi16ZXJvIGNvbHVtbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGJlIHVzZWQgd2hlbiB3ZSBjcmVhdGUgQVNUIG5vZGUgb3V0IG9mIHRoZSB0b2tlblxuICogYm91bmRhcmllcywgc3VjaCBhcyBUZW1wbGF0ZUVsZW1lbnQgZW5kcyBiZWZvcmUgdHQudGVtcGxhdGVOb25UYWlsLiBUaGlzXG4gKiBmdW5jdGlvbiBkb2VzIG5vdCBza2lwIHdoaXRlc3BhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KFxuICBwb3NpdGlvbjogUG9zaXRpb24sXG4gIGNvbHVtbk9mZnNldDogbnVtYmVyLFxuKSB7XG4gIGNvbnN0IHsgbGluZSwgY29sdW1uLCBpbmRleCB9ID0gcG9zaXRpb247XG4gIHJldHVybiBuZXcgUG9zaXRpb24obGluZSwgY29sdW1uICsgY29sdW1uT2Zmc2V0LCBpbmRleCArIGNvbHVtbk9mZnNldCk7XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVudW0gUGFyc2VFcnJvckNvZGUge1xuICBTeW50YXhFcnJvciA9IFwiQkFCRUxfUEFSU0VSX1NZTlRBWF9FUlJPUlwiLFxuICBTb3VyY2VUeXBlTW9kdWxlRXJyb3IgPSBcIkJBQkVMX1BBUlNFUl9TT1VSQ0VUWVBFX01PRFVMRV9SRVFVSVJFRFwiLFxufVxuXG5leHBvcnQgdHlwZSBTeW50YXhQbHVnaW4gPVxuICB8IFwiZmxvd1wiXG4gIHwgXCJ0eXBlc2NyaXB0XCJcbiAgfCBcImpzeFwiXG4gIHwgXCJwaXBlbGluZU9wZXJhdG9yXCJcbiAgfCBcInBsYWNlaG9sZGVyc1wiO1xuXG5leHBvcnQgdHlwZSBUb01lc3NhZ2U8RXJyb3JEZXRhaWxzPiA9IChzZWxmOiBFcnJvckRldGFpbHMpID0+IHN0cmluZztcblxuZXhwb3J0IHR5cGUgUGFyc2VFcnJvckNyZWRlbnRpYWxzPEVycm9yRGV0YWlscz4gPSB7XG4gIGNvZGU6IFBhcnNlRXJyb3JDb2RlO1xuICByZWFzb25Db2RlOiBzdHJpbmc7XG4gIHN5bnRheFBsdWdpbj86IFN5bnRheFBsdWdpbjtcbiAgdG9NZXNzYWdlOiBUb01lc3NhZ2U8RXJyb3JEZXRhaWxzPjtcbn07XG5cbmNvbnN0IHJlZmxlY3QgPSAoa2V5czogc3RyaW5nW10sIGxhc3QgPSBrZXlzLmxlbmd0aCAtIDEpID0+ICh7XG4gIGdldCh0aGlzOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIGtleXMucmVkdWNlKFxuICAgICAgKG9iamVjdCwga2V5KSA9PlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBzaG91bGQgaW5kZXggb2JqZWN0XG4gICAgICAgIG9iamVjdFtrZXldLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9LFxuICBzZXQodGhpczogdW5rbm93biwgdmFsdWU6IHVua25vd24pIHtcbiAgICBrZXlzLnJlZHVjZShcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IHNob3VsZCBpbmRleCBpdGVtXG4gICAgICAoaXRlbSwga2V5LCBpKSA9PiAoaSA9PT0gbGFzdCA/IChpdGVtW2tleV0gPSB2YWx1ZSkgOiBpdGVtW2tleV0pLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9LFxufSk7XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gPFQ+KFxuICBjb25zdHJ1Y3RvcjogbmV3ICgpID0+IFQsXG4gIHByb3BlcnRpZXM6IGFueSxcbiAgZGVzY3JpcHRvcnM6IGFueSxcbikgPT5cbiAgT2JqZWN0LmtleXMoZGVzY3JpcHRvcnMpXG4gICAgLm1hcChrZXkgPT4gW2tleSwgZGVzY3JpcHRvcnNba2V5XV0pXG4gICAgLmZpbHRlcigoWywgZGVzY3JpcHRvcl0pID0+ICEhZGVzY3JpcHRvcilcbiAgICAubWFwKChba2V5LCBkZXNjcmlwdG9yXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgdHlwZW9mIGRlc2NyaXB0b3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IsIGVudW1lcmFibGU6IGZhbHNlIH1cbiAgICAgICAgOiB0eXBlb2YgZGVzY3JpcHRvci5yZWZsZWN0ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8geyAuLi5kZXNjcmlwdG9yLCAuLi5yZWZsZWN0KGRlc2NyaXB0b3IucmVmbGVjdC5zcGxpdChcIi5cIikpIH1cbiAgICAgICAgOiBkZXNjcmlwdG9yLFxuICAgIF0pXG4gICAgLnJlZHVjZShcbiAgICAgIChpbnN0YW5jZSwgW2tleSwgZGVzY3JpcHRvcl0pID0+XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgIH0pLFxuICAgICAgT2JqZWN0LmFzc2lnbihuZXcgY29uc3RydWN0b3IoKSwgcHJvcGVydGllcyksXG4gICAgKTtcblxuZXhwb3J0IHsgaW5zdGFudGlhdGUgfTtcbiIsICJpbXBvcnQgeyBQYXJzZUVycm9yQ29kZSB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEltcG9ydE1ldGFPdXRzaWRlTW9kdWxlOiB7XG4gICAgbWVzc2FnZTogYGltcG9ydC5tZXRhIG1heSBhcHBlYXIgb25seSB3aXRoICdzb3VyY2VUeXBlOiBcIm1vZHVsZVwiJ2AsXG4gICAgY29kZTogUGFyc2VFcnJvckNvZGUuU291cmNlVHlwZU1vZHVsZUVycm9yLFxuICB9LFxuICBJbXBvcnRPdXRzaWRlTW9kdWxlOiB7XG4gICAgbWVzc2FnZTogYCdpbXBvcnQnIGFuZCAnZXhwb3J0JyBtYXkgYXBwZWFyIG9ubHkgd2l0aCAnc291cmNlVHlwZTogXCJtb2R1bGVcIidgLFxuICAgIGNvZGU6IFBhcnNlRXJyb3JDb2RlLlNvdXJjZVR5cGVNb2R1bGVFcnJvcixcbiAgfSxcbn07XG4iLCAiY29uc3QgTm9kZURlc2NyaXB0aW9ucyA9IHtcbiAgQXJyYXlQYXR0ZXJuOiBcImFycmF5IGRlc3RydWN0dXJpbmcgcGF0dGVyblwiLFxuICBBc3NpZ25tZW50RXhwcmVzc2lvbjogXCJhc3NpZ25tZW50IGV4cHJlc3Npb25cIixcbiAgQXNzaWdubWVudFBhdHRlcm46IFwiYXNzaWdubWVudCBleHByZXNzaW9uXCIsXG4gIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBcImFycm93IGZ1bmN0aW9uIGV4cHJlc3Npb25cIixcbiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBcImNvbmRpdGlvbmFsIGV4cHJlc3Npb25cIixcbiAgQ2F0Y2hDbGF1c2U6IFwiY2F0Y2ggY2xhdXNlXCIsXG4gIEZvck9mU3RhdGVtZW50OiBcImZvci1vZiBzdGF0ZW1lbnRcIixcbiAgRm9ySW5TdGF0ZW1lbnQ6IFwiZm9yLWluIHN0YXRlbWVudFwiLFxuICBGb3JTdGF0ZW1lbnQ6IFwiZm9yLWxvb3BcIixcbiAgRm9ybWFsUGFyYW1ldGVyczogXCJmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdFwiLFxuICBJZGVudGlmaWVyOiBcImlkZW50aWZpZXJcIixcbiAgSW1wb3J0U3BlY2lmaWVyOiBcImltcG9ydCBzcGVjaWZpZXJcIixcbiAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogXCJpbXBvcnQgZGVmYXVsdCBzcGVjaWZpZXJcIixcbiAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiBcImltcG9ydCBuYW1lc3BhY2Ugc3BlY2lmaWVyXCIsXG4gIE9iamVjdFBhdHRlcm46IFwib2JqZWN0IGRlc3RydWN0dXJpbmcgcGF0dGVyblwiLFxuICBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjogXCJwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25cIixcbiAgUmVzdEVsZW1lbnQ6IFwicmVzdCBlbGVtZW50XCIsXG4gIFVwZGF0ZUV4cHJlc3Npb246IHtcbiAgICB0cnVlOiBcInByZWZpeCBvcGVyYXRpb25cIixcbiAgICBmYWxzZTogXCJwb3N0Zml4IG9wZXJhdGlvblwiLFxuICB9LFxuICBWYXJpYWJsZURlY2xhcmF0b3I6IFwidmFyaWFibGUgZGVjbGFyYXRpb25cIixcbiAgWWllbGRFeHByZXNzaW9uOiBcInlpZWxkIGV4cHJlc3Npb25cIixcbn07XG5cbnR5cGUgTm9kZVR5cGVzV2l0aERlc2NyaXB0aW9ucyA9IGtleW9mIE9taXQ8XG4gIHR5cGVvZiBOb2RlRGVzY3JpcHRpb25zLFxuICBcIlVwZGF0ZUV4cHJlc3Npb25cIlxuPjtcblxudHlwZSBOb2RlV2l0aERlc2NyaXB0aW9uID1cbiAgfCB7XG4gICAgICB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIjtcbiAgICAgIHByZWZpeDogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogTm9kZVR5cGVzV2l0aERlc2NyaXB0aW9ucztcbiAgICB9O1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yIHByZWZpeCBpcyBzcGVjaWZpZWQgb25seSB3aGVuIHR5cGUgaXMgVXBkYXRlRXhwcmVzc2lvblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmZ1c2luZy1hcnJvd1xuY29uc3QgdG9Ob2RlRGVzY3JpcHRpb24gPSAoeyB0eXBlLCBwcmVmaXggfTogTm9kZVdpdGhEZXNjcmlwdGlvbikgPT5cbiAgdHlwZSA9PT0gXCJVcGRhdGVFeHByZXNzaW9uXCJcbiAgICA/IE5vZGVEZXNjcmlwdGlvbnMuVXBkYXRlRXhwcmVzc2lvbltTdHJpbmcocHJlZml4KSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIl1cbiAgICA6IE5vZGVEZXNjcmlwdGlvbnNbdHlwZV07XG5cbmV4cG9ydCBkZWZhdWx0IHRvTm9kZURlc2NyaXB0aW9uO1xuIiwgImltcG9ydCB0b05vZGVEZXNjcmlwdGlvbiBmcm9tIFwiLi90by1ub2RlLWRlc2NyaXB0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIExWYWxBbmNlc3RvciA9XG4gIHwgeyB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIjsgcHJlZml4OiBib29sZWFuIH1cbiAgfCB7XG4gICAgICB0eXBlOlxuICAgICAgICB8IFwiQXJyYXlQYXR0ZXJuXCJcbiAgICAgICAgfCBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIkNhdGNoQ2xhdXNlXCJcbiAgICAgICAgfCBcIkZvck9mU3RhdGVtZW50XCJcbiAgICAgICAgfCBcIkZvcm1hbFBhcmFtZXRlcnNcIlxuICAgICAgICB8IFwiRm9ySW5TdGF0ZW1lbnRcIlxuICAgICAgICB8IFwiRm9yU3RhdGVtZW50XCJcbiAgICAgICAgfCBcIkltcG9ydFNwZWNpZmllclwiXG4gICAgICAgIHwgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIlxuICAgICAgICB8IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiXG4gICAgICAgIHwgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiXG4gICAgICAgIHwgXCJPYmplY3RQYXR0ZXJuXCJcbiAgICAgICAgfCBcIlJlc3RFbGVtZW50XCJcbiAgICAgICAgfCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiO1xuICAgIH07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgQWNjZXNzb3JJc0dlbmVyYXRvcjogKHsga2luZCB9OiB7IGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIH0pID0+XG4gICAgYEEgJHtraW5kfXRlciBjYW5ub3QgYmUgYSBnZW5lcmF0b3IuYCxcbiAgQXJndW1lbnRzSW5DbGFzczpcbiAgICBcIidhcmd1bWVudHMnIGlzIG9ubHkgYWxsb3dlZCBpbiBmdW5jdGlvbnMgYW5kIGNsYXNzIG1ldGhvZHMuXCIsXG4gIEFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQ6XG4gICAgXCJBc3luYyBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdGhlIHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9jay5cIixcbiAgQXdhaXRCaW5kaW5nSWRlbnRpZmllcjpcbiAgICBcIkNhbiBub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb24uXCIsXG4gIEF3YWl0QmluZGluZ0lkZW50aWZpZXJJblN0YXRpY0Jsb2NrOlxuICAgIFwiQ2FuIG5vdCB1c2UgJ2F3YWl0JyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIHN0YXRpYyBibG9jay5cIixcbiAgQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyOlxuICAgIFwiJ2F3YWl0JyBpcyBub3QgYWxsb3dlZCBpbiBhc3luYyBmdW5jdGlvbiBwYXJhbWV0ZXJzLlwiLFxuICBBd2FpdFVzaW5nTm90SW5Bc3luY0NvbnRleHQ6XG4gICAgXCInYXdhaXQgdXNpbmcnIGlzIG9ubHkgYWxsb3dlZCB3aXRoaW4gYXN5bmMgZnVuY3Rpb25zIGFuZCBhdCB0aGUgdG9wIGxldmVscyBvZiBtb2R1bGVzLlwiLFxuICBBd2FpdE5vdEluQXN5bmNDb250ZXh0OlxuICAgIFwiJ2F3YWl0JyBpcyBvbmx5IGFsbG93ZWQgd2l0aGluIGFzeW5jIGZ1bmN0aW9ucyBhbmQgYXQgdGhlIHRvcCBsZXZlbHMgb2YgbW9kdWxlcy5cIixcbiAgQXdhaXROb3RJbkFzeW5jRnVuY3Rpb246IFwiJ2F3YWl0JyBpcyBvbmx5IGFsbG93ZWQgd2l0aGluIGFzeW5jIGZ1bmN0aW9ucy5cIixcbiAgQmFkR2V0dGVyQXJpdHk6IFwiQSAnZ2V0JyBhY2Nlc3NvciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVycy5cIixcbiAgQmFkU2V0dGVyQXJpdHk6IFwiQSAnc2V0JyBhY2Nlc3NvciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZm9ybWFsIHBhcmFtZXRlci5cIixcbiAgQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjpcbiAgICBcIkEgJ3NldCcgYWNjZXNzb3IgZnVuY3Rpb24gYXJndW1lbnQgbXVzdCBub3QgYmUgYSByZXN0IHBhcmFtZXRlci5cIixcbiAgQ29uc3RydWN0b3JDbGFzc0ZpZWxkOiBcIkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgZmllbGQgbmFtZWQgJ2NvbnN0cnVjdG9yJy5cIixcbiAgQ29uc3RydWN0b3JDbGFzc1ByaXZhdGVGaWVsZDpcbiAgICBcIkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJy5cIixcbiAgQ29uc3RydWN0b3JJc0FjY2Vzc29yOiBcIkNsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYWNjZXNzb3IuXCIsXG4gIENvbnN0cnVjdG9ySXNBc3luYzogXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvbi5cIixcbiAgQ29uc3RydWN0b3JJc0dlbmVyYXRvcjogXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvci5cIixcbiAgRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXI6ICh7XG4gICAga2luZCxcbiAgfToge1xuICAgIGtpbmQ6IFwiY29uc3RcIiB8IFwiZGVzdHJ1Y3R1cmluZ1wiO1xuICB9KSA9PiBgTWlzc2luZyBpbml0aWFsaXplciBpbiAke2tpbmR9IGRlY2xhcmF0aW9uLmAsXG4gIERlY29yYXRvckFyZ3VtZW50c091dHNpZGVQYXJlbnRoZXNlczpcbiAgICBcIkRlY29yYXRvciBhcmd1bWVudHMgbXVzdCBiZSBtb3ZlZCBpbnNpZGUgcGFyZW50aGVzZXM6IHVzZSAnQChkZWNvcmF0b3IoYXJncykpJyBpbnN0ZWFkIG9mICdAKGRlY29yYXRvcikoYXJncyknLlwiLFxuICBEZWNvcmF0b3JCZWZvcmVFeHBvcnQ6XG4gICAgXCJEZWNvcmF0b3JzIG11c3QgYmUgcGxhY2VkICpiZWZvcmUqIHRoZSAnZXhwb3J0JyBrZXl3b3JkLiBSZW1vdmUgdGhlICdkZWNvcmF0b3JzQmVmb3JlRXhwb3J0OiB0cnVlJyBvcHRpb24gdG8gdXNlIHRoZSAnZXhwb3J0IEBkZWNvcmF0b3IgY2xhc3Mge30nIHN5bnRheC5cIixcbiAgRGVjb3JhdG9yc0JlZm9yZUFmdGVyRXhwb3J0OlxuICAgIFwiRGVjb3JhdG9ycyBjYW4gYmUgcGxhY2VkICplaXRoZXIqIGJlZm9yZSBvciBhZnRlciB0aGUgJ2V4cG9ydCcga2V5d29yZCwgYnV0IG5vdCBpbiBib3RoIGxvY2F0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLlwiLFxuICBEZWNvcmF0b3JDb25zdHJ1Y3RvcjpcbiAgICBcIkRlY29yYXRvcnMgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgY29uc3RydWN0b3IuIERpZCB5b3UgbWVhbiAnQGRlYyBjbGFzcyB7IC4uLiB9Jz9cIixcbiAgRGVjb3JhdG9yRXhwb3J0Q2xhc3M6XG4gICAgXCJEZWNvcmF0b3JzIG11c3QgYmUgcGxhY2VkICphZnRlciogdGhlICdleHBvcnQnIGtleXdvcmQuIFJlbW92ZSB0aGUgJ2RlY29yYXRvcnNCZWZvcmVFeHBvcnQ6IGZhbHNlJyBvcHRpb24gdG8gdXNlIHRoZSAnQGRlY29yYXRvciBleHBvcnQgY2xhc3Mge30nIHN5bnRheC5cIixcbiAgRGVjb3JhdG9yU2VtaWNvbG9uOiBcIkRlY29yYXRvcnMgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYSBzZW1pY29sb24uXCIsXG4gIERlY29yYXRvclN0YXRpY0Jsb2NrOiBcIkRlY29yYXRvcnMgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgc3RhdGljIGJsb2NrLlwiLFxuICBEZWxldGVQcml2YXRlRmllbGQ6IFwiRGVsZXRpbmcgYSBwcml2YXRlIGZpZWxkIGlzIG5vdCBhbGxvd2VkLlwiLFxuICBEZXN0cnVjdHVyZU5hbWVkSW1wb3J0OlxuICAgIFwiRVMyMDE1IG5hbWVkIGltcG9ydHMgZG8gbm90IGRlc3RydWN0dXJlLiBVc2UgYW5vdGhlciBzdGF0ZW1lbnQgZm9yIGRlc3RydWN0dXJpbmcgYWZ0ZXIgdGhlIGltcG9ydC5cIixcbiAgRHVwbGljYXRlQ29uc3RydWN0b3I6IFwiRHVwbGljYXRlIGNvbnN0cnVjdG9yIGluIHRoZSBzYW1lIGNsYXNzLlwiLFxuICBEdXBsaWNhdGVEZWZhdWx0RXhwb3J0OiBcIk9ubHkgb25lIGRlZmF1bHQgZXhwb3J0IGFsbG93ZWQgcGVyIG1vZHVsZS5cIixcbiAgRHVwbGljYXRlRXhwb3J0OiAoeyBleHBvcnROYW1lIH06IHsgZXhwb3J0TmFtZTogc3RyaW5nIH0pID0+XG4gICAgYFxcYCR7ZXhwb3J0TmFtZX1cXGAgaGFzIGFscmVhZHkgYmVlbiBleHBvcnRlZC4gRXhwb3J0ZWQgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUuYCxcbiAgRHVwbGljYXRlUHJvdG86IFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eS5cIixcbiAgRHVwbGljYXRlUmVnRXhwRmxhZ3M6IFwiRHVwbGljYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnLlwiLFxuICBFbGVtZW50QWZ0ZXJSZXN0OiBcIlJlc3QgZWxlbWVudCBtdXN0IGJlIGxhc3QgZWxlbWVudC5cIixcbiAgRXNjYXBlZENoYXJOb3RBbklkZW50aWZpZXI6IFwiSW52YWxpZCBVbmljb2RlIGVzY2FwZS5cIixcbiAgRXhwb3J0QmluZGluZ0lzU3RyaW5nOiAoe1xuICAgIGxvY2FsTmFtZSxcbiAgICBleHBvcnROYW1lLFxuICB9OiB7XG4gICAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gICAgZXhwb3J0TmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBcXGBmcm9tXFxgLlxcbi0gRGlkIHlvdSBtZWFuIFxcYGV4cG9ydCB7ICcke2xvY2FsTmFtZX0nIGFzICcke2V4cG9ydE5hbWV9JyB9IGZyb20gJ3NvbWUtbW9kdWxlJ1xcYD9gLFxuICBFeHBvcnREZWZhdWx0RnJvbUFzSWRlbnRpZmllcjpcbiAgICBcIidmcm9tJyBpcyBub3QgYWxsb3dlZCBhcyBhbiBpZGVudGlmaWVyIGFmdGVyICdleHBvcnQgZGVmYXVsdCcuXCIsXG5cbiAgRm9ySW5PZkxvb3BJbml0aWFsaXplcjogKHtcbiAgICB0eXBlLFxuICB9OiB7XG4gICAgdHlwZTogXCJGb3JJblN0YXRlbWVudFwiIHwgXCJGb3JPZlN0YXRlbWVudFwiO1xuICB9KSA9PlxuICAgIGAnJHtcbiAgICAgIHR5cGUgPT09IFwiRm9ySW5TdGF0ZW1lbnRcIiA/IFwiZm9yLWluXCIgOiBcImZvci1vZlwiXG4gICAgfScgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuYCxcbiAgRm9ySW5Vc2luZzogXCJGb3ItaW4gbG9vcCBtYXkgbm90IHN0YXJ0IHdpdGggJ3VzaW5nJyBkZWNsYXJhdGlvbi5cIixcblxuICBGb3JPZkFzeW5jOiBcIlRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGZvci1vZiBsb29wIG1heSBub3QgYmUgJ2FzeW5jJy5cIixcbiAgRm9yT2ZMZXQ6IFwiVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgZm9yLW9mIGxvb3AgbWF5IG5vdCBzdGFydCB3aXRoICdsZXQnLlwiLFxuICBHZW5lcmF0b3JJblNpbmdsZVN0YXRlbWVudENvbnRleHQ6XG4gICAgXCJHZW5lcmF0b3JzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AgbGV2ZWwgb3IgaW5zaWRlIGEgYmxvY2suXCIsXG5cbiAgSWxsZWdhbEJyZWFrQ29udGludWU6ICh7XG4gICAgdHlwZSxcbiAgfToge1xuICAgIHR5cGU6IFwiQnJlYWtTdGF0ZW1lbnRcIiB8IFwiQ29udGludWVTdGF0ZW1lbnRcIjtcbiAgfSkgPT4gYFVuc3ludGFjdGljICR7dHlwZSA9PT0gXCJCcmVha1N0YXRlbWVudFwiID8gXCJicmVha1wiIDogXCJjb250aW51ZVwifS5gLFxuXG4gIElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmU6XG4gICAgXCJJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0LlwiLFxuICBJbGxlZ2FsUmV0dXJuOiBcIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb24uXCIsXG4gIEltcG9ydEF0dHJpYnV0ZXNVc2VBc3NlcnQ6XG4gICAgXCJUaGUgYGFzc2VydGAga2V5d29yZCBpbiBpbXBvcnQgYXR0cmlidXRlcyBpcyBkZXByZWNhdGVkIGFuZCBpdCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYHdpdGhgIGtleXdvcmQuIFlvdSBjYW4gZW5hYmxlIHRoZSBgZGVwcmVjYXRlZEFzc2VydFN5bnRheDogdHJ1ZWAgb3B0aW9uIGluIHRoZSBpbXBvcnQgYXR0cmlidXRlcyBwbHVnaW4gdG8gc3VwcHJlc3MgdGhpcyBlcnJvci5cIixcbiAgSW1wb3J0QmluZGluZ0lzU3RyaW5nOiAoeyBpbXBvcnROYW1lIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nIH0pID0+XG4gICAgYEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gaW1wb3J0ZWQgYmluZGluZy5cXG4tIERpZCB5b3UgbWVhbiBcXGBpbXBvcnQgeyBcIiR7aW1wb3J0TmFtZX1cIiBhcyBmb28gfVxcYD9gLFxuICBJbXBvcnRDYWxsQXJndW1lbnRUcmFpbGluZ0NvbW1hOlxuICAgIFwiVHJhaWxpbmcgY29tbWEgaXMgZGlzYWxsb3dlZCBpbnNpZGUgaW1wb3J0KC4uLikgYXJndW1lbnRzLlwiLFxuICBJbXBvcnRDYWxsQXJpdHk6ICh7IG1heEFyZ3VtZW50Q291bnQgfTogeyBtYXhBcmd1bWVudENvdW50OiAxIHwgMiB9KSA9PlxuICAgIGBcXGBpbXBvcnQoKVxcYCByZXF1aXJlcyBleGFjdGx5ICR7XG4gICAgICBtYXhBcmd1bWVudENvdW50ID09PSAxID8gXCJvbmUgYXJndW1lbnRcIiA6IFwib25lIG9yIHR3byBhcmd1bWVudHNcIlxuICAgIH0uYCxcbiAgSW1wb3J0Q2FsbE5vdE5ld0V4cHJlc3Npb246IFwiQ2Fubm90IHVzZSBuZXcgd2l0aCBpbXBvcnQoLi4uKS5cIixcbiAgSW1wb3J0Q2FsbFNwcmVhZEFyZ3VtZW50OiBcImAuLi5gIGlzIG5vdCBhbGxvd2VkIGluIGBpbXBvcnQoKWAuXCIsXG4gIEltcG9ydEpTT05CaW5kaW5nTm90RGVmYXVsdDpcbiAgICBcIkEgSlNPTiBtb2R1bGUgY2FuIG9ubHkgYmUgaW1wb3J0ZWQgd2l0aCBgZGVmYXVsdGAuXCIsXG4gIEltcG9ydFJlZmxlY3Rpb25IYXNBc3NlcnRpb246IFwiYGltcG9ydCBtb2R1bGUgeGAgY2Fubm90IGhhdmUgYXNzZXJ0aW9ucy5cIixcbiAgSW1wb3J0UmVmbGVjdGlvbk5vdEJpbmRpbmc6XG4gICAgJ09ubHkgYGltcG9ydCBtb2R1bGUgeCBmcm9tIFwiLi9tb2R1bGVcImAgaXMgdmFsaWQuJyxcbiAgSW5jb21wYXRpYmxlUmVnRXhwVVZGbGFnczpcbiAgICBcIlRoZSAndScgYW5kICd2JyByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgY2Fubm90IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZS5cIixcbiAgSW52YWxpZEJpZ0ludExpdGVyYWw6IFwiSW52YWxpZCBCaWdJbnRMaXRlcmFsLlwiLFxuICBJbnZhbGlkQ29kZVBvaW50OiBcIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kcy5cIixcbiAgSW52YWxpZENvdmVySW5pdGlhbGl6ZWROYW1lOiBcIkludmFsaWQgc2hvcnRoYW5kIHByb3BlcnR5IGluaXRpYWxpemVyLlwiLFxuICBJbnZhbGlkRGVjaW1hbDogXCJJbnZhbGlkIGRlY2ltYWwuXCIsXG4gIEludmFsaWREaWdpdDogKHsgcmFkaXggfTogeyByYWRpeDogbnVtYmVyIH0pID0+XG4gICAgYEV4cGVjdGVkIG51bWJlciBpbiByYWRpeCAke3JhZGl4fS5gLFxuICBJbnZhbGlkRXNjYXBlU2VxdWVuY2U6IFwiQmFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UuXCIsXG4gIEludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlOiBcIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHRlbXBsYXRlLlwiLFxuICBJbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZDogKHsgcmVzZXJ2ZWRXb3JkIH06IHsgcmVzZXJ2ZWRXb3JkOiBzdHJpbmcgfSkgPT5cbiAgICBgRXNjYXBlIHNlcXVlbmNlIGluIGtleXdvcmQgJHtyZXNlcnZlZFdvcmR9LmAsXG4gIEludmFsaWRJZGVudGlmaWVyOiAoeyBpZGVudGlmaWVyTmFtZSB9OiB7IGlkZW50aWZpZXJOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgSW52YWxpZCBpZGVudGlmaWVyICR7aWRlbnRpZmllck5hbWV9LmAsXG4gIEludmFsaWRMaHM6ICh7IGFuY2VzdG9yIH06IHsgYW5jZXN0b3I6IExWYWxBbmNlc3RvciB9KSA9PlxuICAgIGBJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluICR7dG9Ob2RlRGVzY3JpcHRpb24oYW5jZXN0b3IpfS5gLFxuICBJbnZhbGlkTGhzQmluZGluZzogKHsgYW5jZXN0b3IgfTogeyBhbmNlc3RvcjogTFZhbEFuY2VzdG9yIH0pID0+XG4gICAgYEJpbmRpbmcgaW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiAke3RvTm9kZURlc2NyaXB0aW9uKGFuY2VzdG9yKX0uYCxcbiAgSW52YWxpZE51bWJlcjogXCJJbnZhbGlkIG51bWJlci5cIixcbiAgSW52YWxpZE9yTWlzc2luZ0V4cG9uZW50OlxuICAgIFwiRmxvYXRpbmctcG9pbnQgbnVtYmVycyByZXF1aXJlIGEgdmFsaWQgZXhwb25lbnQgYWZ0ZXIgdGhlICdlJy5cIixcbiAgSW52YWxpZE9yVW5leHBlY3RlZFRva2VuOiAoeyB1bmV4cGVjdGVkIH06IHsgdW5leHBlY3RlZDogc3RyaW5nIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke3VuZXhwZWN0ZWR9Jy5gLFxuICBJbnZhbGlkUGFyZW50aGVzaXplZEFzc2lnbm1lbnQ6IFwiSW52YWxpZCBwYXJlbnRoZXNpemVkIGFzc2lnbm1lbnQgcGF0dGVybi5cIixcbiAgSW52YWxpZFByaXZhdGVGaWVsZFJlc29sdXRpb246ICh7XG4gICAgaWRlbnRpZmllck5hbWUsXG4gIH06IHtcbiAgICBpZGVudGlmaWVyTmFtZTogc3RyaW5nO1xuICB9KSA9PiBgUHJpdmF0ZSBuYW1lICMke2lkZW50aWZpZXJOYW1lfSBpcyBub3QgZGVmaW5lZC5gLFxuICBJbnZhbGlkUHJvcGVydHlCaW5kaW5nUGF0dGVybjogXCJCaW5kaW5nIG1lbWJlciBleHByZXNzaW9uLlwiLFxuICBJbnZhbGlkUmVjb3JkUHJvcGVydHk6XG4gICAgXCJPbmx5IHByb3BlcnRpZXMgYW5kIHNwcmVhZCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiByZWNvcmQgZGVmaW5pdGlvbnMuXCIsXG4gIEludmFsaWRSZXN0QXNzaWdubWVudFBhdHRlcm46IFwiSW52YWxpZCByZXN0IG9wZXJhdG9yJ3MgYXJndW1lbnQuXCIsXG4gIExhYmVsUmVkZWNsYXJhdGlvbjogKHsgbGFiZWxOYW1lIH06IHsgbGFiZWxOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgTGFiZWwgJyR7bGFiZWxOYW1lfScgaXMgYWxyZWFkeSBkZWNsYXJlZC5gLFxuICBMZXRJbkxleGljYWxCaW5kaW5nOlxuICAgIFwiJ2xldCcgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhIG5hbWUgaW4gJ2xldCcgb3IgJ2NvbnN0JyBkZWNsYXJhdGlvbnMuXCIsXG4gIExpbmVUZXJtaW5hdG9yQmVmb3JlQXJyb3c6IFwiTm8gbGluZSBicmVhayBpcyBhbGxvd2VkIGJlZm9yZSAnPT4nLlwiLFxuICBNYWxmb3JtZWRSZWdFeHBGbGFnczogXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnLlwiLFxuICBNaXNzaW5nQ2xhc3NOYW1lOiBcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZC5cIixcbiAgTWlzc2luZ0VxSW5Bc3NpZ25tZW50OlxuICAgIFwiT25seSAnPScgb3BlcmF0b3IgY2FuIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgZGVmYXVsdCB2YWx1ZS5cIixcbiAgTWlzc2luZ1NlbWljb2xvbjogXCJNaXNzaW5nIHNlbWljb2xvbi5cIixcbiAgTWlzc2luZ1BsdWdpbjogKHsgbWlzc2luZ1BsdWdpbiB9OiB7IG1pc3NpbmdQbHVnaW46IFtzdHJpbmddIH0pID0+XG4gICAgYFRoaXMgZXhwZXJpbWVudGFsIHN5bnRheCByZXF1aXJlcyBlbmFibGluZyB0aGUgcGFyc2VyIHBsdWdpbjogJHttaXNzaW5nUGx1Z2luXG4gICAgICAubWFwKG5hbWUgPT4gSlNPTi5zdHJpbmdpZnkobmFtZSkpXG4gICAgICAuam9pbihcIiwgXCIpfS5gLFxuICAvLyBGSVhNRTogV291bGQgYmUgbmljZSB0byBtYWtlIHRoaXMgXCJtaXNzaW5nUGx1Z2luc1wiIGluc3RlYWQuXG4gIC8vIEFsc28sIHNlZW1zIGxpa2Ugd2UgY2FuIGRyb3AgdGhlIFwiKHMpXCIgZnJvbSB0aGUgbWVzc2FnZSBhbmQganVzdCBtYWtlIGl0IFwic1wiLlxuICBNaXNzaW5nT25lT2ZQbHVnaW5zOiAoeyBtaXNzaW5nUGx1Z2luIH06IHsgbWlzc2luZ1BsdWdpbjogc3RyaW5nW10gfSkgPT5cbiAgICBgVGhpcyBleHBlcmltZW50YWwgc3ludGF4IHJlcXVpcmVzIGVuYWJsaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcnNlciBwbHVnaW4ocyk6ICR7bWlzc2luZ1BsdWdpblxuICAgICAgLm1hcChuYW1lID0+IEpTT04uc3RyaW5naWZ5KG5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKX0uYCxcbiAgTWlzc2luZ1VuaWNvZGVFc2NhcGU6IFwiRXhwZWN0aW5nIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlIFxcXFx1WFhYWC5cIixcbiAgTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbDpcbiAgICBcIk51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnMuXCIsXG4gIE1vZHVsZUF0dHJpYnV0ZURpZmZlcmVudEZyb21UeXBlOlxuICAgIFwiVGhlIG9ubHkgYWNjZXB0ZWQgbW9kdWxlIGF0dHJpYnV0ZSBpcyBgdHlwZWAuXCIsXG4gIE1vZHVsZUF0dHJpYnV0ZUludmFsaWRWYWx1ZTpcbiAgICBcIk9ubHkgc3RyaW5nIGxpdGVyYWxzIGFyZSBhbGxvd2VkIGFzIG1vZHVsZSBhdHRyaWJ1dGUgdmFsdWVzLlwiLFxuICBNb2R1bGVBdHRyaWJ1dGVzV2l0aER1cGxpY2F0ZUtleXM6ICh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pID0+XG4gICAgYER1cGxpY2F0ZSBrZXkgXCIke2tleX1cIiBpcyBub3QgYWxsb3dlZCBpbiBtb2R1bGUgYXR0cmlidXRlcy5gLFxuICBNb2R1bGVFeHBvcnROYW1lSGFzTG9uZVN1cnJvZ2F0ZTogKHtcbiAgICBzdXJyb2dhdGVDaGFyQ29kZSxcbiAgfToge1xuICAgIHN1cnJvZ2F0ZUNoYXJDb2RlOiBudW1iZXI7XG4gIH0pID0+XG4gICAgYEFuIGV4cG9ydCBuYW1lIGNhbm5vdCBpbmNsdWRlIGEgbG9uZSBzdXJyb2dhdGUsIGZvdW5kICdcXFxcdSR7c3Vycm9nYXRlQ2hhckNvZGUudG9TdHJpbmcoXG4gICAgICAxNixcbiAgICApfScuYCxcbiAgTW9kdWxlRXhwb3J0VW5kZWZpbmVkOiAoeyBsb2NhbE5hbWUgfTogeyBsb2NhbE5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFeHBvcnQgJyR7bG9jYWxOYW1lfScgaXMgbm90IGRlZmluZWQuYCxcbiAgTXVsdGlwbGVEZWZhdWx0c0luU3dpdGNoOiBcIk11bHRpcGxlIGRlZmF1bHQgY2xhdXNlcy5cIixcbiAgTmV3bGluZUFmdGVyVGhyb3c6IFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93LlwiLFxuICBOb0NhdGNoT3JGaW5hbGx5OiBcIk1pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UuXCIsXG4gIE51bWJlcklkZW50aWZpZXI6IFwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXIuXCIsXG4gIE51bWVyaWNTZXBhcmF0b3JJbkVzY2FwZVNlcXVlbmNlOlxuICAgIFwiTnVtZXJpYyBzZXBhcmF0b3JzIGFyZSBub3QgYWxsb3dlZCBpbnNpZGUgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIG9yIGhleCBlc2NhcGUgc2VxdWVuY2VzLlwiLFxuICBPYnNvbGV0ZUF3YWl0U3RhcjpcbiAgICBcIidhd2FpdConIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb25zIHByb3Bvc2FsLiBVc2UgUHJvbWlzZS5hbGwoKSBpbnN0ZWFkLlwiLFxuICBPcHRpb25hbENoYWluaW5nTm9OZXc6XG4gICAgXCJDb25zdHJ1Y3RvcnMgaW4vYWZ0ZXIgYW4gT3B0aW9uYWwgQ2hhaW4gYXJlIG5vdCBhbGxvd2VkLlwiLFxuICBPcHRpb25hbENoYWluaW5nTm9UZW1wbGF0ZTpcbiAgICBcIlRhZ2dlZCBUZW1wbGF0ZSBMaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gb3B0aW9uYWxDaGFpbi5cIixcbiAgT3ZlcnJpZGVPbkNvbnN0cnVjdG9yOlxuICAgIFwiJ292ZXJyaWRlJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uXCIsXG4gIFBhcmFtRHVwZTogXCJBcmd1bWVudCBuYW1lIGNsYXNoLlwiLFxuICBQYXR0ZXJuSGFzQWNjZXNzb3I6IFwiT2JqZWN0IHBhdHRlcm4gY2FuJ3QgY29udGFpbiBnZXR0ZXIgb3Igc2V0dGVyLlwiLFxuICBQYXR0ZXJuSGFzTWV0aG9kOiBcIk9iamVjdCBwYXR0ZXJuIGNhbid0IGNvbnRhaW4gbWV0aG9kcy5cIixcbiAgUHJpdmF0ZUluRXhwZWN0ZWRJbjogKHsgaWRlbnRpZmllck5hbWUgfTogeyBpZGVudGlmaWVyTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYFByaXZhdGUgbmFtZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBwcm9wZXJ0eSBhY2Nlc3NlcyAoXFxgb2JqLiMke2lkZW50aWZpZXJOYW1lfVxcYCkgb3IgaW4gXFxgaW5cXGAgZXhwcmVzc2lvbnMgKFxcYCMke2lkZW50aWZpZXJOYW1lfSBpbiBvYmpcXGApLmAsXG4gIFByaXZhdGVOYW1lUmVkZWNsYXJhdGlvbjogKHsgaWRlbnRpZmllck5hbWUgfTogeyBpZGVudGlmaWVyTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYER1cGxpY2F0ZSBwcml2YXRlIG5hbWUgIyR7aWRlbnRpZmllck5hbWV9LmAsXG4gIFJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlOlxuICAgIFwiUmVjb3JkIGV4cHJlc3Npb25zIGVuZGluZyB3aXRoICd8fScgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2JhcicuXCIsXG4gIFJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RTdGFydFN5bnRheFR5cGU6XG4gICAgXCJSZWNvcmQgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAne3wnIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdiYXInLlwiLFxuICBSZWNvcmRFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZTpcbiAgICBcIlJlY29yZCBleHByZXNzaW9ucyBzdGFydGluZyB3aXRoICcjeycgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2hhc2gnLlwiLFxuICBSZWNvcmROb1Byb3RvOiBcIidfX3Byb3RvX18nIGlzIG5vdCBhbGxvd2VkIGluIFJlY29yZCBleHByZXNzaW9ucy5cIixcbiAgUmVzdFRyYWlsaW5nQ29tbWE6IFwiVW5leHBlY3RlZCB0cmFpbGluZyBjb21tYSBhZnRlciByZXN0IGVsZW1lbnQuXCIsXG4gIFNsb3BweUZ1bmN0aW9uOlxuICAgIFwiSW4gbm9uLXN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwgb3IgaW5zaWRlIGEgYmxvY2suXCIsXG4gIFNsb3BweUZ1bmN0aW9uQW5uZXhCOlxuICAgIFwiSW4gbm9uLXN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwsIGluc2lkZSBhIGJsb2NrLCBvciBhcyB0aGUgYm9keSBvZiBhbiBpZiBzdGF0ZW1lbnQuXCIsXG4gIFN0YXRpY1Byb3RvdHlwZTogXCJDbGFzc2VzIG1heSBub3QgaGF2ZSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlLlwiLFxuICBTdXBlck5vdEFsbG93ZWQ6XG4gICAgXCJgc3VwZXIoKWAgaXMgb25seSB2YWxpZCBpbnNpZGUgYSBjbGFzcyBjb25zdHJ1Y3RvciBvZiBhIHN1YmNsYXNzLiBNYXliZSBhIHR5cG8gaW4gdGhlIG1ldGhvZCBuYW1lICgnY29uc3RydWN0b3InKSBvciBub3QgZXh0ZW5kaW5nIGFub3RoZXIgY2xhc3M/XCIsXG4gIFN1cGVyUHJpdmF0ZUZpZWxkOiBcIlByaXZhdGUgZmllbGRzIGNhbid0IGJlIGFjY2Vzc2VkIG9uIHN1cGVyLlwiLFxuICBUcmFpbGluZ0RlY29yYXRvcjogXCJEZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBlbGVtZW50LlwiLFxuICBUdXBsZUV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgZW5kaW5nIHdpdGggJ3xdJyBhcmUgb25seSBhbGxvd2VkIHdoZW4gdGhlICdzeW50YXhUeXBlJyBvcHRpb24gb2YgdGhlICdyZWNvcmRBbmRUdXBsZScgcGx1Z2luIGlzIHNldCB0byAnYmFyJy5cIixcbiAgVHVwbGVFeHByZXNzaW9uQmFySW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAnW3wnIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdiYXInLlwiLFxuICBUdXBsZUV4cHJlc3Npb25IYXNoSW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAnI1snIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdoYXNoJy5cIixcbiAgVW5leHBlY3RlZEFyZ3VtZW50UGxhY2Vob2xkZXI6IFwiVW5leHBlY3RlZCBhcmd1bWVudCBwbGFjZWhvbGRlci5cIixcbiAgVW5leHBlY3RlZEF3YWl0QWZ0ZXJQaXBlbGluZUJvZHk6XG4gICAgJ1VuZXhwZWN0ZWQgXCJhd2FpdFwiIGFmdGVyIHBpcGVsaW5lIGJvZHk7IGF3YWl0IG11c3QgaGF2ZSBwYXJlbnRoZXNlcyBpbiBtaW5pbWFsIHByb3Bvc2FsLicsXG4gIFVuZXhwZWN0ZWREaWdpdEFmdGVySGFzaDogXCJVbmV4cGVjdGVkIGRpZ2l0IGFmdGVyIGhhc2ggdG9rZW4uXCIsXG4gIFVuZXhwZWN0ZWRJbXBvcnRFeHBvcnQ6XG4gICAgXCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwuXCIsXG4gIFVuZXhwZWN0ZWRLZXl3b3JkOiAoeyBrZXl3b3JkIH06IHsga2V5d29yZDogc3RyaW5nIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQga2V5d29yZCAnJHtrZXl3b3JkfScuYCxcbiAgVW5leHBlY3RlZExlYWRpbmdEZWNvcmF0b3I6XG4gICAgXCJMZWFkaW5nIGRlY29yYXRvcnMgbXVzdCBiZSBhdHRhY2hlZCB0byBhIGNsYXNzIGRlY2xhcmF0aW9uLlwiLFxuICBVbmV4cGVjdGVkTGV4aWNhbERlY2xhcmF0aW9uOlxuICAgIFwiTGV4aWNhbCBkZWNsYXJhdGlvbiBjYW5ub3QgYXBwZWFyIGluIGEgc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0LlwiLFxuICBVbmV4cGVjdGVkTmV3VGFyZ2V0OlxuICAgIFwiYG5ldy50YXJnZXRgIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb25zIG9yIGNsYXNzIHByb3BlcnRpZXMuXCIsXG4gIFVuZXhwZWN0ZWROdW1lcmljU2VwYXJhdG9yOlxuICAgIFwiQSBudW1lcmljIHNlcGFyYXRvciBpcyBvbmx5IGFsbG93ZWQgYmV0d2VlbiB0d28gZGlnaXRzLlwiLFxuICBVbmV4cGVjdGVkUHJpdmF0ZUZpZWxkOiBcIlVuZXhwZWN0ZWQgcHJpdmF0ZSBuYW1lLlwiLFxuICBVbmV4cGVjdGVkUmVzZXJ2ZWRXb3JkOiAoeyByZXNlcnZlZFdvcmQgfTogeyByZXNlcnZlZFdvcmQ6IHN0cmluZyB9KSA9PlxuICAgIGBVbmV4cGVjdGVkIHJlc2VydmVkIHdvcmQgJyR7cmVzZXJ2ZWRXb3JkfScuYCxcbiAgVW5leHBlY3RlZFN1cGVyOiBcIidzdXBlcicgaXMgb25seSBhbGxvd2VkIGluIG9iamVjdCBtZXRob2RzIGFuZCBjbGFzc2VzLlwiLFxuICBVbmV4cGVjdGVkVG9rZW46ICh7XG4gICAgZXhwZWN0ZWQsXG4gICAgdW5leHBlY3RlZCxcbiAgfToge1xuICAgIGV4cGVjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICB1bmV4cGVjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgfSkgPT5cbiAgICBgVW5leHBlY3RlZCB0b2tlbiR7dW5leHBlY3RlZCA/IGAgJyR7dW5leHBlY3RlZH0nLmAgOiBcIlwifSR7XG4gICAgICBleHBlY3RlZCA/IGAsIGV4cGVjdGVkIFwiJHtleHBlY3RlZH1cImAgOiBcIlwiXG4gICAgfWAsXG4gIFVuZXhwZWN0ZWRUb2tlblVuYXJ5RXhwb25lbnRpYXRpb246XG4gICAgXCJJbGxlZ2FsIGV4cHJlc3Npb24uIFdyYXAgbGVmdCBoYW5kIHNpZGUgb3IgZW50aXJlIGV4cG9uZW50aWF0aW9uIGluIHBhcmVudGhlc2VzLlwiLFxuICBVbmV4cGVjdGVkVXNpbmdEZWNsYXJhdGlvbjpcbiAgICBcIlVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCBhcHBlYXIgaW4gdGhlIHRvcCBsZXZlbCB3aGVuIHNvdXJjZSB0eXBlIGlzIGBzY3JpcHRgLlwiLFxuICBVbnN1cHBvcnRlZEJpbmQ6IFwiQmluZGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIG9iamVjdCBwcm9wZXJ0eS5cIixcbiAgVW5zdXBwb3J0ZWREZWNvcmF0b3JFeHBvcnQ6XG4gICAgXCJBIGRlY29yYXRlZCBleHBvcnQgbXVzdCBleHBvcnQgYSBjbGFzcyBkZWNsYXJhdGlvbi5cIixcbiAgVW5zdXBwb3J0ZWREZWZhdWx0RXhwb3J0OlxuICAgIFwiT25seSBleHByZXNzaW9ucywgZnVuY3Rpb25zIG9yIGNsYXNzZXMgYXJlIGFsbG93ZWQgYXMgdGhlIGBkZWZhdWx0YCBleHBvcnQuXCIsXG4gIFVuc3VwcG9ydGVkSW1wb3J0OlxuICAgIFwiYGltcG9ydGAgY2FuIG9ubHkgYmUgdXNlZCBpbiBgaW1wb3J0KClgIG9yIGBpbXBvcnQubWV0YWAuXCIsXG4gIFVuc3VwcG9ydGVkTWV0YVByb3BlcnR5OiAoe1xuICAgIHRhcmdldCxcbiAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWUsXG4gIH06IHtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgfSkgPT5cbiAgICBgVGhlIG9ubHkgdmFsaWQgbWV0YSBwcm9wZXJ0eSBmb3IgJHt0YXJnZXR9IGlzICR7dGFyZ2V0fS4ke29ubHlWYWxpZFByb3BlcnR5TmFtZX0uYCxcbiAgVW5zdXBwb3J0ZWRQYXJhbWV0ZXJEZWNvcmF0b3I6XG4gICAgXCJEZWNvcmF0b3JzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY29yYXRlIHBhcmFtZXRlcnMuXCIsXG4gIFVuc3VwcG9ydGVkUHJvcGVydHlEZWNvcmF0b3I6XG4gICAgXCJEZWNvcmF0b3JzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY29yYXRlIG9iamVjdCBsaXRlcmFsIHByb3BlcnRpZXMuXCIsXG4gIFVuc3VwcG9ydGVkU3VwZXI6XG4gICAgXCInc3VwZXInIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBjYWxscyAoaS5lLiBzdXBlcigpKSBvciBpbiBwcm9wZXJ0eSBhY2Nlc3NlcyAoaS5lLiBzdXBlci5wcm9wIG9yIHN1cGVyW3Byb3BdKS5cIixcbiAgVW50ZXJtaW5hdGVkQ29tbWVudDogXCJVbnRlcm1pbmF0ZWQgY29tbWVudC5cIixcbiAgVW50ZXJtaW5hdGVkUmVnRXhwOiBcIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24uXCIsXG4gIFVudGVybWluYXRlZFN0cmluZzogXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50LlwiLFxuICBVbnRlcm1pbmF0ZWRUZW1wbGF0ZTogXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGUuXCIsXG4gIFVzaW5nRGVjbGFyYXRpb25IYXNCaW5kaW5nUGF0dGVybjpcbiAgICBcIlVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIGRlc3RydWN0dXJpbmcgcGF0dGVybnMuXCIsXG4gIFZhclJlZGVjbGFyYXRpb246ICh7IGlkZW50aWZpZXJOYW1lIH06IHsgaWRlbnRpZmllck5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBJZGVudGlmaWVyICcke2lkZW50aWZpZXJOYW1lfScgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZC5gLFxuICBZaWVsZEJpbmRpbmdJZGVudGlmaWVyOlxuICAgIFwiQ2FuIG5vdCB1c2UgJ3lpZWxkJyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIGdlbmVyYXRvci5cIixcbiAgWWllbGRJblBhcmFtZXRlcjogXCJZaWVsZCBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGZvcm1hbCBwYXJhbWV0ZXJzLlwiLFxuICBaZXJvRGlnaXROdW1lcmljU2VwYXJhdG9yOlxuICAgIFwiTnVtZXJpYyBzZXBhcmF0b3IgY2FuIG5vdCBiZSB1c2VkIGFmdGVyIGxlYWRpbmcgMC5cIixcbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICBTdHJpY3REZWxldGU6IFwiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGUuXCIsXG5cbiAgLy8gYHJlZmVyZW5jZU5hbWVgIGlzIHRoZSBTdHJpbmdWYWx1ZVsxXSBvZiBhbiBJZGVudGlmaWVyUmVmZXJlbmNlWzJdLCB3aGljaFxuICAvLyBpcyByZXByZXNlbnRlZCBhcyBqdXN0IGFuIGBJZGVudGlmaWVyYFszXSBpbiB0aGUgQmFiZWwgQVNULlxuICAvLyAxLiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0YXRpYy1zZW1hbnRpY3Mtc3RyaW5ndmFsdWVcbiAgLy8gMi4gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtSWRlbnRpZmllclJlZmVyZW5jZVxuICAvLyAzLiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLXBhcnNlci9hc3Qvc3BlYy5tZCNpZGVudGlmaWVyXG4gIFN0cmljdEV2YWxBcmd1bWVudHM6ICh7IHJlZmVyZW5jZU5hbWUgfTogeyByZWZlcmVuY2VOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgQXNzaWduaW5nIHRvICcke3JlZmVyZW5jZU5hbWV9JyBpbiBzdHJpY3QgbW9kZS5gLFxuXG4gIC8vIGBiaW5kaW5nTmFtZWAgaXMgdGhlIFN0cmluZ1ZhbHVlWzFdIG9mIGEgQmluZGluZ0lkZW50aWZpZXJbMl0sIHdoaWNoIGlzXG4gIC8vIHJlcHJlc2VudGVkIGFzIGp1c3QgYW4gYElkZW50aWZpZXJgWzNdIGluIHRoZSBCYWJlbCBBU1QuXG4gIC8vIDEuIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RhdGljLXNlbWFudGljcy1zdHJpbmd2YWx1ZVxuICAvLyAyLiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nSWRlbnRpZmllclxuICAvLyAzLiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLXBhcnNlci9hc3Qvc3BlYy5tZCNpZGVudGlmaWVyXG4gIFN0cmljdEV2YWxBcmd1bWVudHNCaW5kaW5nOiAoeyBiaW5kaW5nTmFtZSB9OiB7IGJpbmRpbmdOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgQmluZGluZyAnJHtiaW5kaW5nTmFtZX0nIGluIHN0cmljdCBtb2RlLmAsXG5cbiAgU3RyaWN0RnVuY3Rpb246XG4gICAgXCJJbiBzdHJpY3QgbW9kZSBjb2RlLCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdG9wIGxldmVsIG9yIGluc2lkZSBhIGJsb2NrLlwiLFxuXG4gIFN0cmljdE51bWVyaWNFc2NhcGU6IFwiVGhlIG9ubHkgdmFsaWQgbnVtZXJpYyBlc2NhcGUgaW4gc3RyaWN0IG1vZGUgaXMgJ1xcXFwwJy5cIixcblxuICBTdHJpY3RPY3RhbExpdGVyYWw6IFwiTGVnYWN5IG9jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZS5cIixcblxuICBTdHJpY3RXaXRoOiBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZS5cIixcbn07XG4iLCAiaW1wb3J0IHRvTm9kZURlc2NyaXB0aW9uIGZyb20gXCIuL3RvLW5vZGUtZGVzY3JpcHRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFVucGFyZW50aGVzaXplZFBpcGVCb2R5RGVzY3JpcHRpb25zID0gbmV3IFNldChbXG4gIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIixcbiAgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLFxuICBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiLFxuICBcIllpZWxkRXhwcmVzc2lvblwiLFxuXSBhcyBjb25zdCk7XG5cbnR5cGUgR2V0U2V0TWVtYmVyVHlwZTxUIGV4dGVuZHMgU2V0PGFueT4+ID0gVCBleHRlbmRzIFNldDxpbmZlciBNPlxuICA/IE1cbiAgOiB1bmtub3duO1xuXG50eXBlIFVucGFyZW50aGVzaXplZFBpcGVCb2R5VHlwZXMgPSBHZXRTZXRNZW1iZXJUeXBlPFxuICB0eXBlb2YgVW5wYXJlbnRoZXNpemVkUGlwZUJvZHlEZXNjcmlwdGlvbnNcbj47XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gVGhpcyBlcnJvciBpcyBvbmx5IHVzZWQgYnkgdGhlIHNtYXJ0LW1peCBwcm9wb3NhbFxuICBQaXBlQm9keUlzVGlnaHRlcjpcbiAgICBcIlVuZXhwZWN0ZWQgeWllbGQgYWZ0ZXIgcGlwZWxpbmUgYm9keTsgYW55IHlpZWxkIGV4cHJlc3Npb24gYWN0aW5nIGFzIEhhY2stc3R5bGUgcGlwZSBib2R5IG11c3QgYmUgcGFyZW50aGVzaXplZCBkdWUgdG8gaXRzIGxvb3NlIG9wZXJhdG9yIHByZWNlZGVuY2UuXCIsXG4gIFBpcGVUb3BpY1JlcXVpcmVzSGFja1BpcGVzOlxuICAgICdUb3BpYyByZWZlcmVuY2UgaXMgdXNlZCwgYnV0IHRoZSBwaXBlbGluZU9wZXJhdG9yIHBsdWdpbiB3YXMgbm90IHBhc3NlZCBhIFwicHJvcG9zYWxcIjogXCJoYWNrXCIgb3IgXCJzbWFydFwiIG9wdGlvbi4nLFxuICBQaXBlVG9waWNVbmJvdW5kOlxuICAgIFwiVG9waWMgcmVmZXJlbmNlIGlzIHVuYm91bmQ7IGl0IG11c3QgYmUgaW5zaWRlIGEgcGlwZSBib2R5LlwiLFxuICBQaXBlVG9waWNVbmNvbmZpZ3VyZWRUb2tlbjogKHsgdG9rZW4gfTogeyB0b2tlbjogc3RyaW5nIH0pID0+XG4gICAgYEludmFsaWQgdG9waWMgdG9rZW4gJHt0b2tlbn0uIEluIG9yZGVyIHRvIHVzZSAke3Rva2VufSBhcyBhIHRvcGljIHJlZmVyZW5jZSwgdGhlIHBpcGVsaW5lT3BlcmF0b3IgcGx1Z2luIG11c3QgYmUgY29uZmlndXJlZCB3aXRoIHsgXCJwcm9wb3NhbFwiOiBcImhhY2tcIiwgXCJ0b3BpY1Rva2VuXCI6IFwiJHt0b2tlbn1cIiB9LmAsXG4gIFBpcGVUb3BpY1VudXNlZDpcbiAgICBcIkhhY2stc3R5bGUgcGlwZSBib2R5IGRvZXMgbm90IGNvbnRhaW4gYSB0b3BpYyByZWZlcmVuY2U7IEhhY2stc3R5bGUgcGlwZXMgbXVzdCB1c2UgdG9waWMgYXQgbGVhc3Qgb25jZS5cIixcbiAgUGlwZVVucGFyZW50aGVzaXplZEJvZHk6ICh7IHR5cGUgfTogeyB0eXBlOiBVbnBhcmVudGhlc2l6ZWRQaXBlQm9keVR5cGVzIH0pID0+XG4gICAgYEhhY2stc3R5bGUgcGlwZSBib2R5IGNhbm5vdCBiZSBhbiB1bnBhcmVudGhlc2l6ZWQgJHt0b05vZGVEZXNjcmlwdGlvbih7XG4gICAgICB0eXBlLFxuICAgIH0pfTsgcGxlYXNlIHdyYXAgaXQgaW4gcGFyZW50aGVzZXMuYCxcblxuICAvLyBNZXNzYWdlcyB3aG9zZSBjb2RlcyBzdGFydCB3aXRoIFx1MjAxQ1BpcGVsaW5lXHUyMDFEIG9yIFx1MjAxQ1ByaW1hcnlUb3BpY1x1MjAxRFxuICAvLyBhcmUgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIC8vIHdpdGggdGhlIGRlcHJlY2F0ZWQgc21hcnQtbWl4IHBpcGUgb3BlcmF0b3IgcHJvcG9zYWwgcGx1Z2luLlxuICAvLyBUaGV5IGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbi5cbiAgUGlwZWxpbmVCb2R5Tm9BcnJvdzpcbiAgICAnVW5leHBlY3RlZCBhcnJvdyBcIj0+XCIgYWZ0ZXIgcGlwZWxpbmUgYm9keTsgYXJyb3cgZnVuY3Rpb24gaW4gcGlwZWxpbmUgYm9keSBtdXN0IGJlIHBhcmVudGhlc2l6ZWQuJyxcbiAgUGlwZWxpbmVCb2R5U2VxdWVuY2VFeHByZXNzaW9uOlxuICAgIFwiUGlwZWxpbmUgYm9keSBtYXkgbm90IGJlIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIGV4cHJlc3Npb24uXCIsXG4gIFBpcGVsaW5lSGVhZFNlcXVlbmNlRXhwcmVzc2lvbjpcbiAgICBcIlBpcGVsaW5lIGhlYWQgc2hvdWxkIG5vdCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBleHByZXNzaW9uLlwiLFxuICBQaXBlbGluZVRvcGljVW51c2VkOlxuICAgIFwiUGlwZWxpbmUgaXMgaW4gdG9waWMgc3R5bGUgYnV0IGRvZXMgbm90IHVzZSB0b3BpYyByZWZlcmVuY2UuXCIsXG4gIFByaW1hcnlUb3BpY05vdEFsbG93ZWQ6XG4gICAgXCJUb3BpYyByZWZlcmVuY2Ugd2FzIHVzZWQgaW4gYSBsZXhpY2FsIGNvbnRleHQgd2l0aG91dCB0b3BpYyBiaW5kaW5nLlwiLFxuICBQcmltYXJ5VG9waWNSZXF1aXJlc1NtYXJ0UGlwZWxpbmU6XG4gICAgJ1RvcGljIHJlZmVyZW5jZSBpcyB1c2VkLCBidXQgdGhlIHBpcGVsaW5lT3BlcmF0b3IgcGx1Z2luIHdhcyBub3QgcGFzc2VkIGEgXCJwcm9wb3NhbFwiOiBcImhhY2tcIiBvciBcInNtYXJ0XCIgb3B0aW9uLicsXG59O1xuIiwgImltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGUsXG4gIFBhcnNlRXJyb3JDb2RlLFxuICB0eXBlIFBhcnNlRXJyb3JDcmVkZW50aWFscyxcbiAgdHlwZSBUb01lc3NhZ2UsXG4gIHR5cGUgU3ludGF4UGx1Z2luLFxufSBmcm9tIFwiLi9wYXJzZS1lcnJvci9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi9wYXJzZXIvbm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gQmFiZWwgdXNlcyBcIm5vcm1hbFwiIFN5bnRheEVycm9ycyBmb3IgaXQncyBlcnJvcnMsIGJ1dCBhZGRzIHNvbWUgZXh0cmFcbi8vIGZ1bmN0aW9uYWxpdHkuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBkZWZpbmVkIGluIHRoZVxuLy8gYFBhcnNlRXJyb3JTcGVjaWZpY2F0aW9uYCBpbnRlcmZhY2UgYmVsb3cuIFdlIG1heSBjaG9vc2UgdG8gY2hhbmdlIHRvIHNvbWVkYXlcbi8vIGdpdmUgb3VyIGVycm9ycyB0aGVpciBvd24gZnVsbC1ibG93biBjbGFzcywgYnV0IHVudGlsIHRoZW4gdGhpcyBhbGxvdyB1cyB0b1xuLy8ga2VlcCBhbGwgdGhlIGRlc2lyYWJsZSBwcm9wZXJ0aWVzIG9mIFN5bnRheEVycm9ycyAobGlrZSB0aGVpciBuYW1lIGluIHN0YWNrXG4vLyB0cmFjZXMsIGV0Yy4pLCBhbmQgYWxzbyBhbGxvd3MgdXMgdG8gcHVudCBvbiBhbnkgcHVibGljbHkgZmFjaW5nXG4vLyBjbGFzcy1oaWVyYXJjaHkgZGVjaXNpb25zIHVudGlsIEJhYmVsIDguXG5pbnRlcmZhY2UgUGFyc2VFcnJvclNwZWNpZmljYXRpb248RXJyb3JEZXRhaWxzPiB7XG4gIC8vIExvb2ssIHRoZXNlICpjb3VsZCogYmUgcmVhZG9ubHksIGJ1dCB0aGVuIEZsb3cgY29tcGxhaW5zIHdoZW4gd2UgaW5pdGlhbGx5XG4gIC8vIHNldCB0aGVtLiBXZSBjb3VsZCBkbyBhIHdob2xlIGRhbmNlIGFuZCBtYWtlIGEgc3BlY2lhbCBpbnRlcmZhY2UgdGhhdCdzIG5vdFxuICAvLyByZWFkb25seSBmb3Igd2hlbiB3ZSBjcmVhdGUgdGhlIGVycm9yLCB0aGVuIGNhc3QgaXQgdG8gdGhlIHJlYWRvbmx5XG4gIC8vIGludGVyZmFjZSBmb3IgcHVibGljIHVzZSwgYnV0IHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBkaWRuJ3QgaGF2ZSB0aGVtXG4gIC8vIGFzIHJlYWRvbmx5LCBzbyBsZXQncyBqdXN0IG5vdCB3b3JyeSBhYm91dCBpdCBmb3Igbm93LlxuICBjb2RlOiBQYXJzZUVycm9yQ29kZTtcbiAgcmVhc29uQ29kZTogc3RyaW5nO1xuICBzeW50YXhQbHVnaW4/OiBTeW50YXhQbHVnaW47XG4gIG1pc3NpbmdQbHVnaW4/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgbG9jOiBQb3NpdGlvbjtcbiAgZGV0YWlsczogRXJyb3JEZXRhaWxzO1xuXG4gIC8vIFdlIHNob3VsZCBjb25zaWRlciByZW1vdmluZyB0aGlzIGFzIGl0IG5vdyBqdXN0IGNvbnRhaW5zIHRoZSBzYW1lXG4gIC8vIGluZm9ybWF0aW9uIGFzIGBsb2MuaW5kZXhgLlxuICAvLyBwb3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgUGFyc2VFcnJvcjxFcnJvckRldGFpbHM+ID0gU3ludGF4RXJyb3IgJlxuICBQYXJzZUVycm9yU3BlY2lmaWNhdGlvbjxFcnJvckRldGFpbHM+O1xuXG4vLyBCeSBgUGFyc2VFcnJvckNvbnN0cnVjdG9yYCwgd2UgbWVhbiBzb21ldGhpbmcgbGlrZSB0aGUgbmV3LWxlc3Mgc3R5bGVcbi8vIGBFcnJvckNvbnN0cnVjdG9yYFsxXSwgc2luY2UgYFBhcnNlRXJyb3JgJ3MgYXJlIG5vdCB0aGVtc2VsdmVzIGFjdHVhbGx5XG4vLyBzZXBhcmF0ZSBjbGFzc2VzIGZyb20gYFN5bnRheEVycm9yYCdzLlxuLy9cbi8vIDEuIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL3Y0LjUuNS9saWIvbGliLmVzNS5kLnRzI0wxMDI3XG5leHBvcnQgdHlwZSBQYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzPiA9IChhOiB7XG4gIGxvYzogUG9zaXRpb247XG4gIGRldGFpbHM6IEVycm9yRGV0YWlscztcbn0pID0+IFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPjtcblxuZnVuY3Rpb24gdG9QYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzIGV4dGVuZHMgb2JqZWN0Pih7XG4gIHRvTWVzc2FnZSxcbiAgLi4ucHJvcGVydGllc1xufTogUGFyc2VFcnJvckNyZWRlbnRpYWxzPEVycm9yRGV0YWlscz4pOiBQYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzPiB7XG4gIHR5cGUgQ29uc3RydWN0b3JBcmd1bWVudCA9IHtcbiAgICBsb2M6IFBvc2l0aW9uO1xuICAgIGRldGFpbHM6IEVycm9yRGV0YWlscztcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0b3IoeyBsb2MsIGRldGFpbHMgfTogQ29uc3RydWN0b3JBcmd1bWVudCkge1xuICAgIHJldHVybiBpbnN0YW50aWF0ZShcbiAgICAgIFN5bnRheEVycm9yLFxuICAgICAgeyAuLi5wcm9wZXJ0aWVzLCBsb2MgfSxcbiAgICAgIHtcbiAgICAgICAgY2xvbmUoXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBsb2M/OiBQb3NpdGlvbjtcbiAgICAgICAgICAgIGRldGFpbHM/OiBFcnJvckRldGFpbHM7XG4gICAgICAgICAgfSA9IHt9LFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsb2MgPSAob3ZlcnJpZGVzLmxvYyB8fCB7fSkgYXMgUGFydGlhbDxQb3NpdGlvbj47XG4gICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgICAgIGxvYzogbmV3IFBvc2l0aW9uKFxuICAgICAgICAgICAgICBcImxpbmVcIiBpbiBsb2MgPyBsb2MubGluZSA6IHRoaXMubG9jLmxpbmUsXG4gICAgICAgICAgICAgIFwiY29sdW1uXCIgaW4gbG9jID8gbG9jLmNvbHVtbiA6IHRoaXMubG9jLmNvbHVtbixcbiAgICAgICAgICAgICAgXCJpbmRleFwiIGluIGxvYyA/IGxvYy5pbmRleCA6IHRoaXMubG9jLmluZGV4LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRldGFpbHM6IHsgLi4udGhpcy5kZXRhaWxzLCAuLi5vdmVycmlkZXMuZGV0YWlscyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXRhaWxzOiB7IHZhbHVlOiBkZXRhaWxzLCBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgZ2V0KHRoaXM6IENvbnN0cnVjdG9yQXJndW1lbnQpOiBzdHJpbmcge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RvTWVzc2FnZSh0aGlzLmRldGFpbHMpfSAoJHt0aGlzLmxvYy5saW5lfToke1xuICAgICAgICAgICAgICB0aGlzLmxvYy5jb2x1bW5cbiAgICAgICAgICAgIH0pYDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJtZXNzYWdlXCIsIHsgdmFsdWUgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zOiB7IHJlZmxlY3Q6IFwibG9jLmluZGV4XCIsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICAgICAgbWlzc2luZ1BsdWdpbjogXCJtaXNzaW5nUGx1Z2luXCIgaW4gZGV0YWlscyAmJiB7XG4gICAgICAgICAgcmVmbGVjdDogXCJkZXRhaWxzLm1pc3NpbmdQbHVnaW5cIixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApIGFzIFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPjtcbiAgfTtcbn1cblxudHlwZSBQYXJzZUVycm9yVGVtcGxhdGUgPVxuICB8IHN0cmluZ1xuICB8IFRvTWVzc2FnZTxhbnk+XG4gIHwgeyBtZXNzYWdlOiBzdHJpbmcgfCBUb01lc3NhZ2U8YW55PiB9O1xuXG50eXBlIFBhcnNlRXJyb3JUZW1wbGF0ZXMgPSB7IFtyZWFzb25Db2RlOiBzdHJpbmddOiBQYXJzZUVycm9yVGVtcGxhdGUgfTtcblxuLy8gVGhpcyBpcyB0aGUgdGVtcGxhdGVkIGZvcm0gb2YgYFBhcnNlRXJyb3JFbnVtYC5cbi8vXG4vLyBOb3RlOiBXZSBjb3VsZCBmYWN0b3Igb3V0IHRoZSByZXR1cm4gdHlwZSBjYWxjdWxhdGlvbiBpbnRvIHNvbWV0aGluZyBsaWtlXG4vLyBgUGFyc2VFcnJvckNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBQYXJzZUVycm9yVGVtcGxhdGVzPmAsIGFuZCB0aGVuIHdlIGNvdWxkXG4vLyByZXVzZSBpdCBpbiB0aGUgbm9uLXRlbXBsYXRlZCBmb3JtIG9mIGBQYXJzZUVycm9yRW51bWAsIGJ1dCBUeXBlU2NyaXB0XG4vLyBkb2Vzbid0IHNlZW0gdG8gZHJpbGwgZG93biB0aGF0IGZhciB3aGVuIHNob3dpbmcgeW91IHRoZSBjb21wdXRlZCB0eXBlIG9mXG4vLyBhbiBvYmplY3QgaW4gYW4gZWRpdG9yLCBzbyB3ZSdsbCBsZWF2ZSBpdCBpbmxpbmVkIGZvciBub3cuXG5leHBvcnQgZnVuY3Rpb24gUGFyc2VFcnJvckVudW0oYTogVGVtcGxhdGVTdHJpbmdzQXJyYXkpOiA8XG4gIFQgZXh0ZW5kcyBQYXJzZUVycm9yVGVtcGxhdGVzLFxuPihcbiAgcGFyc2VFcnJvclRlbXBsYXRlczogVCxcbikgPT4ge1xuICBbSyBpbiBrZXlvZiBUXTogUGFyc2VFcnJvckNvbnN0cnVjdG9yPFxuICAgIFRbS10gZXh0ZW5kcyB7IG1lc3NhZ2U6IHN0cmluZyB8IFRvTWVzc2FnZTxhbnk+IH1cbiAgICAgID8gVFtLXVtcIm1lc3NhZ2VcIl0gZXh0ZW5kcyBUb01lc3NhZ2U8YW55PlxuICAgICAgICA/IFBhcmFtZXRlcnM8VFtLXVtcIm1lc3NhZ2VcIl0+WzBdXG4gICAgICAgIDoge31cbiAgICAgIDogVFtLXSBleHRlbmRzIFRvTWVzc2FnZTxhbnk+XG4gICAgICA/IFBhcmFtZXRlcnM8VFtLXT5bMF1cbiAgICAgIDoge31cbiAgPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBQYXJzZUVycm9yRW51bTxUIGV4dGVuZHMgUGFyc2VFcnJvclRlbXBsYXRlcz4oXG4gIHBhcnNlRXJyb3JUZW1wbGF0ZXM6IFQsXG4gIHN5bnRheFBsdWdpbj86IFN5bnRheFBsdWdpbixcbik6IHtcbiAgW0sgaW4ga2V5b2YgVF06IFBhcnNlRXJyb3JDb25zdHJ1Y3RvcjxcbiAgICBUW0tdIGV4dGVuZHMgeyBtZXNzYWdlOiBzdHJpbmcgfCBUb01lc3NhZ2U8YW55PiB9XG4gICAgICA/IFRbS11bXCJtZXNzYWdlXCJdIGV4dGVuZHMgVG9NZXNzYWdlPGFueT5cbiAgICAgICAgPyBQYXJhbWV0ZXJzPFRbS11bXCJtZXNzYWdlXCJdPlswXVxuICAgICAgICA6IHt9XG4gICAgICA6IFRbS10gZXh0ZW5kcyBUb01lc3NhZ2U8YW55PlxuICAgICAgPyBQYXJhbWV0ZXJzPFRbS10+WzBdXG4gICAgICA6IHt9XG4gID47XG59O1xuXG4vLyBZb3UgY2FsbCBgUGFyc2VFcnJvckVudW1gIHdpdGggYSBtYXBwaW5nIGZyb20gYFJlYXNvbkNvZGVgJ3MgdG8gZWl0aGVyOlxuLy9cbi8vIDEuIGEgc3RhdGljIGVycm9yIG1lc3NhZ2UsXG4vLyAyLiBgdG9NZXNzYWdlYCBmdW5jdGlvbnMgdGhhdCBkZWZpbmUgYWRkaXRpb25hbCBuZWNlc3NhcnkgYGRldGFpbHNgIG5lZWRlZCBieVxuLy8gICAgdGhlIGBQYXJzZUVycm9yYCwgb3Jcbi8vIDMuIE9iamVjdHMgdGhhdCBjb250YWluIGEgYG1lc3NhZ2VgIG9mIG9uZSBvZiB0aGUgYWJvdmUgYW5kIG92ZXJyaWRkZW4gYGNvZGVgXG4vLyAgICBhbmQvb3IgYHJlYXNvbkNvZGVgOlxuLy9cbi8vIFBhcnNlRXJyb3JFbnVtIGBvcHRpb25hbFN5bnRheFBsdWdpbmAgKHtcbi8vICAgRXJyb3JXaXRoU3RhdGljTWVzc2FnZTogXCJtZXNzYWdlXCIsXG4vLyAgIEVycm9yV2l0aER5bmFtaWNNZXNzYWdlOiAoeyB0eXBlIH0gOiB7IHR5cGU6IHN0cmluZyB9KSA9PiBgJHt0eXBlfWApLFxuLy8gICBFcnJvcldpdGhPdmVycmlkZGVuQ29kZUFuZE9yUmVhc29uQ29kZToge1xuLy8gICAgIG1lc3NhZ2U6ICh7IHR5cGUgfTogeyB0eXBlOiBzdHJpbmcgfSkgPT4gYCR7dHlwZX1gKSxcbi8vICAgICBjb2RlOiBQYXJzZUVycm9yQ29kZS5Tb3VyY2VUeXBlTW9kdWxlRXJyb3IsXG4vLyAgICAgLi4uKEJBQkVMXzhfQlJFQUtJTkcgPyB7IH0gOiB7IHJlYXNvbkNvZGU6IFwiQ3VzdG9tRXJyb3JSZWFzb25Db2RlXCIgfSlcbi8vICAgfVxuLy8gfSk7XG4vL1xuZXhwb3J0IGZ1bmN0aW9uIFBhcnNlRXJyb3JFbnVtKFxuICBhcmd1bWVudDogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBQYXJzZUVycm9yVGVtcGxhdGVzLFxuICBzeW50YXhQbHVnaW4/OiBTeW50YXhQbHVnaW4sXG4pIHtcbiAgLy8gSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhbiBhcnJheSwgdGhhdCBtZWFucyB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGEgdGFnZ2VkXG4gIC8vIHRlbXBsYXRlIGxpdGVyYWwuIEV4dHJhY3QgdGhlIHN5bnRheFBsdWdpbiBmcm9tIHRoaXMsIGFuZCBjYWxsIGFnYWluIGluXG4gIC8vIHRoZSBcIm5vcm1hbGl6ZWRcIiBmb3JtLlxuICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudCkpIHtcbiAgICByZXR1cm4gKHBhcnNlRXJyb3JUZW1wbGF0ZXM6IFBhcnNlRXJyb3JUZW1wbGF0ZXMpID0+XG4gICAgICBQYXJzZUVycm9yRW51bShwYXJzZUVycm9yVGVtcGxhdGVzLCBhcmd1bWVudFswXSk7XG4gIH1cblxuICBjb25zdCBQYXJzZUVycm9yQ29uc3RydWN0b3JzID0ge30gYXMgUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBQYXJzZUVycm9yQ29uc3RydWN0b3I8dW5rbm93bj5cbiAgPjtcblxuICBmb3IgKGNvbnN0IHJlYXNvbkNvZGUgb2YgT2JqZWN0LmtleXMoYXJndW1lbnQpKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSAoYXJndW1lbnQgYXMgUGFyc2VFcnJvclRlbXBsYXRlcylbcmVhc29uQ29kZV07XG4gICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPVxuICAgICAgdHlwZW9mIHRlbXBsYXRlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8geyBtZXNzYWdlOiAoKSA9PiB0ZW1wbGF0ZSB9XG4gICAgICAgIDogdHlwZW9mIHRlbXBsYXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyB7IG1lc3NhZ2U6IHRlbXBsYXRlIH1cbiAgICAgICAgOiB0ZW1wbGF0ZTtcbiAgICBjb25zdCB0b01lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/ICgpID0+IG1lc3NhZ2UgOiBtZXNzYWdlO1xuXG4gICAgUGFyc2VFcnJvckNvbnN0cnVjdG9yc1tyZWFzb25Db2RlXSA9IHRvUGFyc2VFcnJvckNvbnN0cnVjdG9yKHtcbiAgICAgIGNvZGU6IFBhcnNlRXJyb3JDb2RlLlN5bnRheEVycm9yLFxuICAgICAgcmVhc29uQ29kZSxcbiAgICAgIHRvTWVzc2FnZSxcbiAgICAgIC4uLihzeW50YXhQbHVnaW4gPyB7IHN5bnRheFBsdWdpbiB9IDoge30pLFxuICAgICAgLi4ucmVzdCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBQYXJzZUVycm9yQ29uc3RydWN0b3JzO1xufVxuXG5leHBvcnQgdHlwZSBSYWlzZVByb3BlcnRpZXM8RXJyb3JEZXRhaWxzPiA9IHtcbiAgYXQ6IFBvc2l0aW9uIHwgVW5kb25lPE5vZGU+O1xufSAmIEVycm9yRGV0YWlscztcblxuaW1wb3J0IE1vZHVsZUVycm9ycyBmcm9tIFwiLi9wYXJzZS1lcnJvci9tb2R1bGUtZXJyb3JzXCI7XG5pbXBvcnQgU3RhbmRhcmRFcnJvcnMgZnJvbSBcIi4vcGFyc2UtZXJyb3Ivc3RhbmRhcmQtZXJyb3JzXCI7XG5pbXBvcnQgU3RyaWN0TW9kZUVycm9ycyBmcm9tIFwiLi9wYXJzZS1lcnJvci9zdHJpY3QtbW9kZS1lcnJvcnNcIjtcbmltcG9ydCBQaXBlbGluZU9wZXJhdG9yRXJyb3JzIGZyb20gXCIuL3BhcnNlLWVycm9yL3BpcGVsaW5lLW9wZXJhdG9yLWVycm9yc1wiO1xuXG5leHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAuLi5QYXJzZUVycm9yRW51bShNb2R1bGVFcnJvcnMpLFxuICAuLi5QYXJzZUVycm9yRW51bShTdGFuZGFyZEVycm9ycyksXG4gIC4uLlBhcnNlRXJyb3JFbnVtKFN0cmljdE1vZGVFcnJvcnMpLFxuICAuLi5QYXJzZUVycm9yRW51bWBwaXBlbGluZU9wZXJhdG9yYChQaXBlbGluZU9wZXJhdG9yRXJyb3JzKSxcbn07XG5cbmV4cG9ydCB0eXBlIHsgTFZhbEFuY2VzdG9yIH0gZnJvbSBcIi4vcGFyc2UtZXJyb3Ivc3RhbmRhcmQtZXJyb3JzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3BhcnNlLWVycm9yL2NyZWRlbnRpYWxzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBUb2tlblR5cGUgfSBmcm9tIFwiLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4uL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uRXJyb3JzIH0gZnJvbSBcIi4uL3BhcnNlci91dGlsXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgYXMgTm9kZVR5cGUsIE5vZGVCYXNlLCBGaWxlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vcGFyc2VyL25vZGVcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1R5cGVzIH0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnR5IH0gPSBPYmplY3Q7XG5jb25zdCB0b1VuZW51bWVyYWJsZSA9IChvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcpID0+XG4gIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqZWN0W2tleV0gfSk7XG5cbmZ1bmN0aW9uIHRvRVNUcmVlTG9jYXRpb24obm9kZTogYW55KSB7XG4gIG5vZGUubG9jLnN0YXJ0ICYmIHRvVW5lbnVtZXJhYmxlKG5vZGUubG9jLnN0YXJ0LCBcImluZGV4XCIpO1xuICBub2RlLmxvYy5lbmQgJiYgdG9VbmVudW1lcmFibGUobm9kZS5sb2MuZW5kLCBcImluZGV4XCIpO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzczogdHlwZW9mIFBhcnNlcikgPT5cbiAgY2xhc3MgRVNUcmVlUGFyc2VyTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFyc2VyIHtcbiAgICBwYXJzZSgpOiBGaWxlIHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0b0VTVHJlZUxvY2F0aW9uKHN1cGVyLnBhcnNlKCkpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRva2Vucykge1xuICAgICAgICBmaWxlLnRva2VucyA9IGZpbGUudG9rZW5zLm1hcCh0b0VTVHJlZUxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBFU1RyZWUgcGx1Z2luIGNoYW5nZXMgbm9kZSB0eXBlc1xuICAgIHBhcnNlUmVnRXhwTGl0ZXJhbCh7IHBhdHRlcm4sIGZsYWdzIH0pOiBOLkVzdHJlZVJlZ0V4cExpdGVyYWwge1xuICAgICAgbGV0IHJlZ2V4OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlc2UgZmxhZ3MgdmFsdWUgd2lsbFxuICAgICAgICAvLyBiZSBudWxsIGFzIHRoZSByZWdleCBjYW4ndCBiZSByZXByZXNlbnRlZCBuYXRpdmVseS5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbDxOLkVzdHJlZVJlZ0V4cExpdGVyYWw+KHJlZ2V4KTtcbiAgICAgIG5vZGUucmVnZXggPSB7IHBhdHRlcm4sIGZsYWdzIH07XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRVNUcmVlIHBsdWdpbiBjaGFuZ2VzIG5vZGUgdHlwZXNcbiAgICBwYXJzZUJpZ0ludExpdGVyYWwodmFsdWU6IGFueSk6IE4uTm9kZSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9lczIwMjAubWQjYmlnaW50bGl0ZXJhbFxuICAgICAgbGV0IGJpZ0ludDogQmlnSW50IHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludCA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYmlnSW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbDxOLkVzdHJlZUJpZ0ludExpdGVyYWw+KGJpZ0ludCk7XG4gICAgICBub2RlLmJpZ2ludCA9IFN0cmluZyhub2RlLnZhbHVlIHx8IHZhbHVlKTtcblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBFU1RyZWUgcGx1Z2luIGNoYW5nZXMgbm9kZSB0eXBlc1xuICAgIHBhcnNlRGVjaW1hbExpdGVyYWwodmFsdWU6IGFueSk6IE4uTm9kZSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9leHBlcmltZW50YWwvZGVjaW1hbC5tZFxuICAgICAgLy8gdG9kbzogdXNlIEJpZ0RlY2ltYWwgd2hlbiBub2RlIHN1cHBvcnRzIGl0LlxuICAgICAgY29uc3QgZGVjaW1hbDogbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5lc3RyZWVQYXJzZUxpdGVyYWwoZGVjaW1hbCk7XG4gICAgICBub2RlLmRlY2ltYWwgPSBTdHJpbmcobm9kZS52YWx1ZSB8fCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGVzdHJlZVBhcnNlTGl0ZXJhbDxUIGV4dGVuZHMgTi5Ob2RlPih2YWx1ZTogYW55KSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8VD4odmFsdWUsIFwiTGl0ZXJhbFwiKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgcGFyc2VTdHJpbmdMaXRlcmFsKHZhbHVlOiBhbnkpOiBOLk5vZGUge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwYXJzZU51bWVyaWNMaXRlcmFsKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgcGFyc2VOdWxsTGl0ZXJhbCgpOiBOLk5vZGUge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKG51bGwpO1xuICAgIH1cblxuICAgIHBhcnNlQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pOiBOLkJvb2xlYW5MaXRlcmFsIHtcbiAgICAgIHJldHVybiB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ2FzdCBhIERpcmVjdGl2ZSB0byBhbiBFeHByZXNzaW9uU3RhdGVtZW50LiBNdXRhdGVzIHRoZSBpbnB1dCBEaXJlY3RpdmUuXG4gICAgZGlyZWN0aXZlVG9TdG10KGRpcmVjdGl2ZTogTi5EaXJlY3RpdmUpOiBOLkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGRpcmVjdGl2ZS52YWx1ZSBhcyBhbnkgYXMgTi5Fc3RyZWVMaXRlcmFsO1xuICAgICAgZGVsZXRlIGRpcmVjdGl2ZS52YWx1ZTtcblxuICAgICAgZXhwcmVzc2lvbi50eXBlID0gXCJMaXRlcmFsXCI7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE4uRXN0cmVlTGl0ZXJhbC5yYXcgaXMgbm90IGRlZmluZWQuXG4gICAgICBleHByZXNzaW9uLnJhdyA9IGV4cHJlc3Npb24uZXh0cmEucmF3O1xuICAgICAgZXhwcmVzc2lvbi52YWx1ZSA9IGV4cHJlc3Npb24uZXh0cmEuZXhwcmVzc2lvblZhbHVlO1xuXG4gICAgICBjb25zdCBzdG10ID0gZGlyZWN0aXZlIGFzIGFueSBhcyBOLkV4cHJlc3Npb25TdGF0ZW1lbnQ7XG4gICAgICBzdG10LnR5cGUgPSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjtcbiAgICAgIHN0bXQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE4uRXhwcmVzc2lvblN0YXRlbWVudC5kaXJlY3RpdmUgaXMgbm90IGRlZmluZWRcbiAgICAgIHN0bXQuZGlyZWN0aXZlID0gZXhwcmVzc2lvbi5leHRyYS5yYXdWYWx1ZTtcblxuICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZXh0cmE7XG5cbiAgICAgIHJldHVybiBzdG10O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBpbml0RnVuY3Rpb24obm9kZTogTi5Cb2RpbGVzc0Z1bmN0aW9uT3JNZXRob2RCYXNlLCBpc0FzeW5jOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBzdXBlci5pbml0RnVuY3Rpb24obm9kZSwgaXNBc3luYyk7XG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjaGVja0RlY2xhcmF0aW9uKG5vZGU6IE4uUGF0dGVybiB8IE4uT2JqZWN0UHJvcGVydHkpOiB2b2lkIHtcbiAgICAgIGlmIChub2RlICE9IG51bGwgJiYgdGhpcy5pc09iamVjdFByb3BlcnR5KG5vZGUpKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIHR5cGluZ3NcbiAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKChub2RlIGFzIHVua25vd24gYXMgTi5Fc3RyZWVQcm9wZXJ0eSkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VwZXIuY2hlY2tEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPYmplY3RPckNsYXNzTWV0aG9kUGFyYW1zKG1ldGhvZDogTi5PYmplY3RNZXRob2QgfCBOLkNsYXNzTWV0aG9kKSB7XG4gICAgICByZXR1cm4gKG1ldGhvZCBhcyBhbnkgYXMgTi5Fc3RyZWVQcm9wZXJ0eSB8IE4uRXN0cmVlTWV0aG9kRGVmaW5pdGlvbilcbiAgICAgICAgLnZhbHVlLnBhcmFtcztcbiAgICB9XG5cbiAgICBpc1ZhbGlkRGlyZWN0aXZlKHN0bXQ6IE4uU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdG10LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiICYmXG4gICAgICAgIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgICB0eXBlb2Ygc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICFzdG10LmV4cHJlc3Npb24uZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VCbG9ja0JvZHkoXG4gICAgICBub2RlOiBOLkJsb2NrU3RhdGVtZW50TGlrZSxcbiAgICAgIGFsbG93RGlyZWN0aXZlczogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICAgIGVuZDogVG9rZW5UeXBlLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlPzogKGhhc1N0cmljdE1vZGVEaXJlY3RpdmU6IGJvb2xlYW4pID0+IHZvaWQsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZUJsb2NrQm9keShcbiAgICAgICAgbm9kZSxcbiAgICAgICAgYWxsb3dEaXJlY3RpdmVzLFxuICAgICAgICB0b3BMZXZlbCxcbiAgICAgICAgZW5kLFxuICAgICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXJlY3RpdmVTdGF0ZW1lbnRzID0gbm9kZS5kaXJlY3RpdmVzLm1hcChkID0+XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlVG9TdG10KGQpLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0cmVlIHBsdWdpbiB0eXBpbmdzXG4gICAgICBub2RlLmJvZHkgPSBkaXJlY3RpdmVTdGF0ZW1lbnRzLmNvbmNhdChub2RlLmJvZHkpO1xuICAgICAgZGVsZXRlIG5vZGUuZGlyZWN0aXZlcztcbiAgICB9XG5cbiAgICBwdXNoQ2xhc3NNZXRob2QoXG4gICAgICBjbGFzc0JvZHk6IE4uQ2xhc3NCb2R5LFxuICAgICAgbWV0aG9kOiBOLkNsYXNzTWV0aG9kLFxuICAgICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgICAgaXNDb25zdHJ1Y3RvcjogYm9vbGVhbixcbiAgICAgIGFsbG93c0RpcmVjdFN1cGVyOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgdGhpcy5wYXJzZU1ldGhvZChcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIsXG4gICAgICAgIFwiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBpZiAobWV0aG9kLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgICBtZXRob2QudmFsdWUudHlwZVBhcmFtZXRlcnMgPSBtZXRob2QudHlwZVBhcmFtZXRlcnM7XG4gICAgICAgIGRlbGV0ZSBtZXRob2QudHlwZVBhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgICBjbGFzc0JvZHkuYm9keS5wdXNoKG1ldGhvZCk7XG4gICAgfVxuXG4gICAgcGFyc2VQcml2YXRlTmFtZSgpOiBhbnkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlUHJpdmF0ZU5hbWUoKTtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UHJpdmF0ZU5hbWVUb1ByaXZhdGVJZGVudGlmaWVyKG5vZGUpO1xuICAgIH1cblxuICAgIGNvbnZlcnRQcml2YXRlTmFtZVRvUHJpdmF0ZUlkZW50aWZpZXIoXG4gICAgICBub2RlOiBOLlByaXZhdGVOYW1lLFxuICAgICk6IE4uRXN0cmVlUHJpdmF0ZUlkZW50aWZpZXIge1xuICAgICAgY29uc3QgbmFtZSA9IHN1cGVyLmdldFByaXZhdGVOYW1lU1Yobm9kZSk7XG4gICAgICBub2RlID0gbm9kZSBhcyBhbnk7XG4gICAgICBkZWxldGUgbm9kZS5pZDtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS50eXBlID0gXCJQcml2YXRlSWRlbnRpZmllclwiO1xuICAgICAgcmV0dXJuIG5vZGUgYXMgdW5rbm93biBhcyBOLkVzdHJlZVByaXZhdGVJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIGlzUHJpdmF0ZU5hbWUobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFBsdWdpbk9wdGlvbihcImVzdHJlZVwiLCBcImNsYXNzRmVhdHVyZXNcIikpIHtcbiAgICAgICAgICByZXR1cm4gc3VwZXIuaXNQcml2YXRlTmFtZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJQcml2YXRlSWRlbnRpZmllclwiO1xuICAgIH1cblxuICAgIGdldFByaXZhdGVOYW1lU1Yobm9kZTogTi5Ob2RlKTogc3RyaW5nIHtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcml2YXRlTmFtZVNWKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5uYW1lO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIG1heSBvdmVycmlkZSBpbnRlcmZhY2VzXG4gICAgcGFyc2VMaXRlcmFsPFQgZXh0ZW5kcyBOLkxpdGVyYWw+KHZhbHVlOiBhbnksIHR5cGU6IFRbXCJ0eXBlXCJdKTogVCB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VMaXRlcmFsPFQ+KHZhbHVlLCB0eXBlKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRpbmcgQVNUIHR5cGVzXG4gICAgICBub2RlLnJhdyA9IG5vZGUuZXh0cmEucmF3O1xuICAgICAgZGVsZXRlIG5vZGUuZXh0cmE7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25Cb2R5KFxuICAgICAgbm9kZTogTi5GdW5jdGlvbixcbiAgICAgIGFsbG93RXhwcmVzc2lvbj86IGJvb2xlYW4gfCBudWxsLFxuICAgICAgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGFsbG93RXhwcmVzc2lvbiwgaXNNZXRob2QpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gbm9kZS5ib2R5LnR5cGUgIT09IFwiQmxvY2tTdGF0ZW1lbnRcIjtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsdWdpbiBtYXkgb3ZlcnJpZGUgaW50ZXJmYWNlc1xuICAgIHBhcnNlTWV0aG9kPFxuICAgICAgVCBleHRlbmRzIE4uQ2xhc3NQcml2YXRlTWV0aG9kIHwgTi5PYmplY3RNZXRob2QgfCBOLkNsYXNzTWV0aG9kLFxuICAgID4oXG4gICAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgaW5DbGFzc1Njb3BlOiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogTi5Fc3RyZWVNZXRob2REZWZpbml0aW9uIHtcbiAgICAgIGxldCBmdW5jTm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uTWV0aG9kTGlrZT4oKTtcbiAgICAgIGZ1bmNOb2RlLmtpbmQgPSBub2RlLmtpbmQ7IC8vIHByb3ZpZGUga2luZCwgc28gc3VwZXIgbWV0aG9kIGNvcnJlY3RseSBzZXRzIHN0YXRlXG4gICAgICBmdW5jTm9kZSA9IHN1cGVyLnBhcnNlTWV0aG9kKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGZ1bmNOb2RlLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dEaXJlY3RTdXBlcixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaW5DbGFzc1Njb3BlLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgZnVuY05vZGUudHlwZSA9IFwiRnVuY3Rpb25FeHByZXNzaW9uXCI7XG4gICAgICBkZWxldGUgZnVuY05vZGUua2luZDtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS52YWx1ZSA9IGZ1bmNOb2RlO1xuICAgICAgaWYgKHR5cGUgPT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpIHtcbiAgICAgICAgbm9kZS5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYXN0IG1ldGhvZHMgdG8gZXN0cmVlIHR5cGVzXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXN0cmVlTWV0aG9kRGVmaW5pdGlvbj4sXG4gICAgICAgIFwiTWV0aG9kRGVmaW5pdGlvblwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJvcGVydHkoLi4uYXJnczogW04uQ2xhc3NQcm9wZXJ0eV0pOiBhbnkge1xuICAgICAgY29uc3QgcHJvcGVydHlOb2RlID0gc3VwZXIucGFyc2VDbGFzc1Byb3BlcnR5KC4uLmFyZ3MpIGFzIGFueTtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3BlcnR5Tm9kZS50eXBlID0gXCJQcm9wZXJ0eURlZmluaXRpb25cIjtcbiAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eSguLi5hcmdzOiBbTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eV0pOiBhbnkge1xuICAgICAgY29uc3QgcHJvcGVydHlOb2RlID0gc3VwZXIucGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eSguLi5hcmdzKSBhcyBhbnk7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFBsdWdpbk9wdGlvbihcImVzdHJlZVwiLCBcImNsYXNzRmVhdHVyZXNcIikpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcGVydHlOb2RlIGFzIE4uRXN0cmVlUHJvcGVydHlEZWZpbml0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wZXJ0eU5vZGUudHlwZSA9IFwiUHJvcGVydHlEZWZpbml0aW9uXCI7XG4gICAgICBwcm9wZXJ0eU5vZGUuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VPYmplY3RNZXRob2QoXG4gICAgICBwcm9wOiBOLk9iamVjdE1ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgKTogTi5PYmplY3RNZXRob2QgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGNvbnN0IG5vZGU6IE4uRXN0cmVlUHJvcGVydHkgPSBzdXBlci5wYXJzZU9iamVjdE1ldGhvZChcbiAgICAgICAgcHJvcCxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzUGF0dGVybixcbiAgICAgICAgaXNBY2Nlc3NvcixcbiAgICAgICkgYXMgYW55O1xuXG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlLnR5cGUgPSBcIlByb3BlcnR5XCI7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkgYXMgTi5DbGFzc01ldGhvZCkua2luZCA9PT0gXCJtZXRob2RcIikge1xuICAgICAgICAgIG5vZGUua2luZCA9IFwiaW5pdFwiO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2hvcnRoYW5kID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlIGFzIGFueTtcbiAgICB9XG5cbiAgICBwYXJzZU9iamVjdFByb3BlcnR5KFxuICAgICAgcHJvcDogTi5PYmplY3RQcm9wZXJ0eSxcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBpc1BhdHRlcm46IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5PYmplY3RQcm9wZXJ0eSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgY29uc3Qgbm9kZTogTi5Fc3RyZWVQcm9wZXJ0eSA9IHN1cGVyLnBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIHByb3AsXG4gICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApIGFzIGFueTtcblxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgbm9kZS5raW5kID0gXCJpbml0XCI7XG4gICAgICAgIG5vZGUudHlwZSA9IFwiUHJvcGVydHlcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGUgYXMgYW55O1xuICAgIH1cblxuICAgIGlzVmFsaWRMVmFsKFxuICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgaXNVbnBhcmVudGhlc2l6ZWRJbkFzc2lnbjogYm9vbGVhbixcbiAgICAgIGJpbmRpbmc6IEJpbmRpbmdUeXBlcyxcbiAgICApIHtcbiAgICAgIHJldHVybiB0eXBlID09PSBcIlByb3BlcnR5XCJcbiAgICAgICAgPyBcInZhbHVlXCJcbiAgICAgICAgOiBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1VucGFyZW50aGVzaXplZEluQXNzaWduLCBiaW5kaW5nKTtcbiAgICB9XG5cbiAgICBpc0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmIHRoaXMuaXNPYmplY3RQcm9wZXJ0eShub2RlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Fzc2lnbmFibGUobm9kZS52YWx1ZSwgaXNCaW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5pc0Fzc2lnbmFibGUobm9kZSwgaXNCaW5kaW5nKTtcbiAgICB9XG5cbiAgICB0b0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0xIUzogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmIHRoaXMuaXNPYmplY3RQcm9wZXJ0eShub2RlKSkge1xuICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IG5vZGU7XG4gICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZU5hbWUoa2V5KSkge1xuICAgICAgICAgIHRoaXMuY2xhc3NTY29wZS51c2VQcml2YXRlTmFtZShcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihrZXkpLFxuICAgICAgICAgICAga2V5LmxvYy5zdGFydCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHZhbHVlLCBpc0xIUyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKFxuICAgICAgcHJvcDogTi5Ob2RlLFxuICAgICAgaXNMYXN0OiBib29sZWFuLFxuICAgICAgaXNMSFM6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICBpZiAocHJvcC5raW5kID09PSBcImdldFwiIHx8IHByb3Aua2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXR0ZXJuSGFzQWNjZXNzb3IsIHsgYXQ6IHByb3Aua2V5IH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wLm1ldGhvZCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXR0ZXJuSGFzTWV0aG9kLCB7IGF0OiBwcm9wLmtleSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKHByb3AsIGlzTGFzdCwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaENhbGxFeHByZXNzaW9uPFQgZXh0ZW5kcyBOLkNhbGxFeHByZXNzaW9uIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uPihcbiAgICAgIHVuZmluaXNoZWQ6IFVuZG9uZTxUPixcbiAgICAgIG9wdGlvbmFsOiBib29sZWFuLFxuICAgICk6IFQge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLmZpbmlzaENhbGxFeHByZXNzaW9uKHVuZmluaXNoZWQsIG9wdGlvbmFsKTtcblxuICAgICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0XCIpIHtcbiAgICAgICAgKG5vZGUgYXMgTi5Ob2RlIGFzIE4uRXN0cmVlSW1wb3J0RXhwcmVzc2lvbikudHlwZSA9IFwiSW1wb3J0RXhwcmVzc2lvblwiO1xuICAgICAgICAobm9kZSBhcyBOLk5vZGUgYXMgTi5Fc3RyZWVJbXBvcnRFeHByZXNzaW9uKS5zb3VyY2UgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXR0cmlidXRlc1wiKSB8fFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICAobm9kZSBhcyBOLk5vZGUgYXMgTi5Fc3RyZWVJbXBvcnRFeHByZXNzaW9uKS5hdHRyaWJ1dGVzID1cbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzFdID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJndW1lbnRzIGlzbid0IG9wdGlvbmFsIGluIHRoZSB0eXBlIGRlZmluaXRpb25cbiAgICAgICAgZGVsZXRlIG5vZGUuYXJndW1lbnRzO1xuICAgICAgICAvLyBjYWxsZWUgaXNuJ3Qgb3B0aW9uYWwgaW4gdGhlIHR5cGUgZGVmaW5pdGlvblxuICAgICAgICBkZWxldGUgbm9kZS5jYWxsZWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHRvUmVmZXJlbmNlZEFyZ3VtZW50cyhcbiAgICAgIG5vZGU6XG4gICAgICAgIHwgTi5DYWxsRXhwcmVzc2lvblxuICAgICAgICB8IE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvblxuICAgICAgICB8IE4uRXN0cmVlSW1wb3J0RXhwcmVzc2lvbixcbiAgICAgIC8qIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLCAqL1xuICAgICkge1xuICAgICAgLy8gSW1wb3J0RXhwcmVzc2lvbnMgZG8gbm90IGhhdmUgYW4gYXJndW1lbnRzIGFycmF5LlxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJJbXBvcnRFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci50b1JlZmVyZW5jZWRBcmd1bWVudHMobm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQoXG4gICAgICB1bmZpbmlzaGVkOiBVbmRvbmU8Ti5BbnlFeHBvcnQ+LFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKSB7XG4gICAgICBjb25zdCBleHBvcnRTdGFydExvYyA9IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jO1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlRXhwb3J0KHVuZmluaXNoZWQsIGRlY29yYXRvcnMpO1xuXG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG11dGF0aW5nIEFTVCB0eXBlc1xuICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICAgIG5vZGUuc3BlY2lmaWVyc1swXS50eXBlID09PSBcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG11dGF0aW5nIEFTVCB0eXBlc1xuICAgICAgICAgICAgbm9kZS50eXBlID0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSBub2RlLnNwZWNpZmllcnNbMF0uZXhwb3J0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgbm9kZS5zcGVjaWZpZXJzO1xuICAgICAgICAgIH1cblxuICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBkZWNsYXJhdGlvbiB9ID0gbm9kZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb24/LnR5cGUgPT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiICYmXG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmRlY29yYXRvcnM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgLy8gZGVjb3JhdG9yIGNvbWVzIGJlZm9yZSBleHBvcnRcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc3RhcnQgPT09IG5vZGUuc3RhcnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggRVNMaW50J3Mga2V5d29yZC1zcGFjaW5nIHJ1bGUsIHdoaWNoIGFzc3VtZXMgdGhhdCBhblxuICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWNsYXJhdGlvbiBtdXN0IHN0YXJ0IHdpdGggZXhwb3J0LlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9pc3N1ZXMvMTUwODVcbiAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHJlc2V0IGV4cG9ydCBkZWNsYXJhdGlvbidzIHN0YXJ0IHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgZXhwb3J0IHRva2VuXG4gICAgICAgICAgICAgICAgZXhwb3J0U3RhcnRMb2MsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgICAgbm9DYWxsczogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICAgICkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlU3Vic2NyaXB0KGJhc2UsIHN0YXJ0TG9jLCBub0NhbGxzLCBzdGF0ZSk7XG5cbiAgICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2Jsb2IvbWFzdGVyL2VzMjAyMC5tZCNjaGFpbmV4cHJlc3Npb25cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS50eXBlID0gbm9kZS50eXBlLnN1YnN0cmluZyg4KTsgLy8gc3RyaXAgT3B0aW9uYWwgcHJlZml4XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnN0b3ApIHtcbiAgICAgICAgICBjb25zdCBjaGFpbiA9IHRoaXMuc3RhcnROb2RlQXROb2RlKG5vZGUpO1xuICAgICAgICAgIGNoYWluLmV4cHJlc3Npb24gPSBub2RlO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoY2hhaW4sIFwiQ2hhaW5FeHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBub2RlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiIHx8XG4gICAgICAgIG5vZGUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBoYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkNoYWluRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuaGFzUHJvcGVydHlBc1ByaXZhdGVOYW1lKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igb3ZlcnJpZGUgaW50ZXJmYWNlc1xuICAgIGlzT2JqZWN0UHJvcGVydHkobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlByb3BlcnR5XCIgJiYgbm9kZS5raW5kID09PSBcImluaXRcIiAmJiAhbm9kZS5tZXRob2Q7XG4gICAgfVxuXG4gICAgaXNPYmplY3RNZXRob2Qobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbm9kZS5tZXRob2QgfHwgbm9kZS5raW5kID09PSBcImdldFwiIHx8IG5vZGUua2luZCA9PT0gXCJzZXRcIjtcbiAgICB9XG5cbiAgICBmaW5pc2hOb2RlQXQ8VCBleHRlbmRzIE5vZGVUeXBlPihcbiAgICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgZW5kTG9jOiBQb3NpdGlvbixcbiAgICApOiBUIHtcbiAgICAgIHJldHVybiB0b0VTVHJlZUxvY2F0aW9uKHN1cGVyLmZpbmlzaE5vZGVBdChub2RlLCB0eXBlLCBlbmRMb2MpKTtcbiAgICB9XG5cbiAgICByZXNldFN0YXJ0TG9jYXRpb24obm9kZTogTi5Ob2RlLCBzdGFydExvYzogUG9zaXRpb24pIHtcbiAgICAgIHN1cGVyLnJlc2V0U3RhcnRMb2NhdGlvbihub2RlLCBzdGFydExvYyk7XG4gICAgICB0b0VTVHJlZUxvY2F0aW9uKG5vZGUpO1xuICAgIH1cblxuICAgIHJlc2V0RW5kTG9jYXRpb24oXG4gICAgICBub2RlOiBOb2RlQmFzZSxcbiAgICAgIGVuZExvYzogUG9zaXRpb24gPSB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5yZXNldEVuZExvY2F0aW9uKG5vZGUsIGVuZExvYyk7XG4gICAgICB0b0VTVHJlZUxvY2F0aW9uKG5vZGUpO1xuICAgIH1cbiAgfTtcbiIsICIvLyBUaGUgdG9rZW4gY29udGV4dCBpcyB1c2VkIGluIEpTWCBwbHVnaW4gdG8gdHJhY2tcbi8vIGpzeCB0YWcgLyBqc3ggdGV4dCAvIG5vcm1hbCBKYXZhU2NyaXB0IGV4cHJlc3Npb25cblxuZXhwb3J0IGNsYXNzIFRva0NvbnRleHQge1xuICBjb25zdHJ1Y3Rvcih0b2tlbjogc3RyaW5nLCBwcmVzZXJ2ZVNwYWNlPzogYm9vbGVhbikge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB0aGlzLnByZXNlcnZlU3BhY2UgPSAhIXByZXNlcnZlU3BhY2U7XG4gIH1cblxuICB0b2tlbjogc3RyaW5nO1xuICBwcmVzZXJ2ZVNwYWNlOiBib29sZWFuO1xufVxuXG5jb25zdCB0eXBlczoge1xuICBba2V5OiBzdHJpbmddOiBUb2tDb250ZXh0O1xufSA9IHtcbiAgYnJhY2U6IG5ldyBUb2tDb250ZXh0KFwie1wiKSwgLy8gbm9ybWFsIEphdmFTY3JpcHQgZXhwcmVzc2lvblxuICBqX29UYWc6IG5ldyBUb2tDb250ZXh0KFwiPHRhZ1wiKSwgLy8gSlNYIG9wZW5pbmcgdGFnXG4gIGpfY1RhZzogbmV3IFRva0NvbnRleHQoXCI8L3RhZ1wiKSwgLy8gSlNYIGNsb3NpbmcgdGFnXG4gIGpfZXhwcjogbmV3IFRva0NvbnRleHQoXCI8dGFnPi4uLjwvdGFnPlwiLCB0cnVlKSwgLy8gSlNYIGV4cHJlc3Npb25zXG59O1xuXG5pZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgdHlwZXMudGVtcGxhdGUgPSBuZXcgVG9rQ29udGV4dChcImBcIiwgdHJ1ZSk7XG59XG5cbmV4cG9ydCB7IHR5cGVzIH07XG4iLCAiaW1wb3J0IHsgdHlwZXMgYXMgdGMsIHR5cGUgVG9rQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbi8vICMjIFRva2VuIHR5cGVzXG5cbi8vIFRoZSBhc3NpZ25tZW50IG9mIGZpbmUtZ3JhaW5lZCwgaW5mb3JtYXRpb24tY2FycnlpbmcgdHlwZSBvYmplY3RzXG4vLyBhbGxvd3MgdGhlIHRva2VuaXplciB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGFcbi8vIHRva2VuIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjaGVhcCBmb3IgdGhlIHBhcnNlciB0byBsb29rIHVwLlxuXG4vLyBBbGwgdG9rZW4gdHlwZSB2YXJpYWJsZXMgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlLCB0byBtYWtlIHRoZW1cbi8vIGVhc3kgdG8gcmVjb2duaXplLlxuXG4vLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gMSkgYmluYXJ5XG4vLyBleHByZXNzaW9uICg8KSBhbmQgSlNYIFRhZyBzdGFydCAoPG5hbWU+KTsgMikgb2JqZWN0IGxpdGVyYWwgYW5kIEpTWFxuLy8gdGV4dHMuIEl0IGlzIHNldCBvbiB0aGUgYHVwZGF0ZUNvbnRleHRgIGZ1bmN0aW9uIGluIHRoZSBKU1ggcGx1Z2luLlxuXG4vLyBUaGUgYHN0YXJ0c0V4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhwcmVzc2lvblxuLy8gbWF5IGJlIHRoZSBcdTIwMUNhcmd1bWVudFx1MjAxRCBzdWJleHByZXNzaW9uIG9mIGEgYHlpZWxkYCBleHByZXNzaW9uIG9yXG4vLyBgeWllbGRgIHN0YXRlbWVudC4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IG1heSBiZSBhdCB0aGVcbi8vIHN0YXJ0IG9mIGEgc3ViZXhwcmVzc2lvbi5cblxuLy8gYGlzTG9vcGAgbWFya3MgYSBrZXl3b3JkIGFzIHN0YXJ0aW5nIGEgbG9vcCwgd2hpY2ggaXMgaW1wb3J0YW50XG4vLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuLy8gY29udGludWUganVtcHMgdG8gdGhhdCBsYWJlbC5cblxuY29uc3QgYmVmb3JlRXhwciA9IHRydWU7XG5jb25zdCBzdGFydHNFeHByID0gdHJ1ZTtcbmNvbnN0IGlzTG9vcCA9IHRydWU7XG5jb25zdCBpc0Fzc2lnbiA9IHRydWU7XG5jb25zdCBwcmVmaXggPSB0cnVlO1xuY29uc3QgcG9zdGZpeCA9IHRydWU7XG5cbnR5cGUgVG9rZW5PcHRpb25zID0ge1xuICBrZXl3b3JkPzogc3RyaW5nO1xuICBiZWZvcmVFeHByPzogYm9vbGVhbjtcbiAgc3RhcnRzRXhwcj86IGJvb2xlYW47XG4gIHJpZ2h0QXNzb2NpYXRpdmU/OiBib29sZWFuO1xuICBpc0xvb3A/OiBib29sZWFuO1xuICBpc0Fzc2lnbj86IGJvb2xlYW47XG4gIHByZWZpeD86IGJvb2xlYW47XG4gIHBvc3RmaXg/OiBib29sZWFuO1xuICBiaW5vcD86IG51bWJlciB8IG51bGw7XG59O1xuXG4vLyBJbnRlcm5hbGx5IHRoZSB0b2tlbml6ZXIgc3RvcmVzIHRva2VuIGFzIGEgbnVtYmVyXG5leHBvcnQgdHlwZSBUb2tlblR5cGUgPSBudW1iZXI7XG5cbi8vIFRoZSBgRXhwb3J0ZWRUb2tlblR5cGVgIGlzIGV4cG9ydGVkIHZpYSBgdG9rVHlwZXNgIGFuZCBhY2Nlc3NpYmxlXG4vLyB3aGVuIGB0b2tlbnM6IHRydWVgIGlzIGVuYWJsZWQuIFVubGlrZSBpbnRlcm5hbCB0b2tlbiB0eXBlLCBpdCBwcm92aWRlc1xuLy8gbWV0YWRhdGEgb2YgdGhlIHRva2Vucy5cbmV4cG9ydCBjbGFzcyBFeHBvcnRlZFRva2VuVHlwZSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIGJlZm9yZUV4cHI6IGJvb2xlYW47XG4gIHN0YXJ0c0V4cHI6IGJvb2xlYW47XG4gIHJpZ2h0QXNzb2NpYXRpdmU6IGJvb2xlYW47XG4gIGlzTG9vcDogYm9vbGVhbjtcbiAgaXNBc3NpZ246IGJvb2xlYW47XG4gIHByZWZpeDogYm9vbGVhbjtcbiAgcG9zdGZpeDogYm9vbGVhbjtcbiAgYmlub3A6IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIC8vIHRvZG8oQmFiZWwgOCk6IHJlbW92ZSB1cGRhdGVDb250ZXh0IGZyb20gZXhwb3NlZCB0b2tlbiBsYXlvdXRcbiAgZGVjbGFyZSB1cGRhdGVDb250ZXh0OlxuICAgIHwgKChjb250ZXh0OiBBcnJheTxUb2tDb250ZXh0PikgPT4gdm9pZClcbiAgICB8IHVuZGVmaW5lZFxuICAgIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nLCBjb25mOiBUb2tlbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLmtleXdvcmQgPSBjb25mLmtleXdvcmQ7XG4gICAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gICAgdGhpcy5zdGFydHNFeHByID0gISFjb25mLnN0YXJ0c0V4cHI7XG4gICAgdGhpcy5yaWdodEFzc29jaWF0aXZlID0gISFjb25mLnJpZ2h0QXNzb2NpYXRpdmU7XG4gICAgdGhpcy5pc0xvb3AgPSAhIWNvbmYuaXNMb29wO1xuICAgIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gICAgdGhpcy5wcmVmaXggPSAhIWNvbmYucHJlZml4O1xuICAgIHRoaXMucG9zdGZpeCA9ICEhY29uZi5wb3N0Zml4O1xuICAgIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wICE9IG51bGwgPyBjb25mLmJpbm9wIDogbnVsbDtcbiAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIEEgbWFwIGZyb20ga2V5d29yZC9rZXl3b3JkLWxpa2Ugc3RyaW5nIHZhbHVlIHRvIHRoZSB0b2tlbiB0eXBlXG5leHBvcnQgY29uc3Qga2V5d29yZHMgPSBuZXcgTWFwPHN0cmluZywgVG9rZW5UeXBlPigpO1xuXG5mdW5jdGlvbiBjcmVhdGVLZXl3b3JkKG5hbWU6IHN0cmluZywgb3B0aW9uczogVG9rZW5PcHRpb25zID0ge30pOiBUb2tlblR5cGUge1xuICBvcHRpb25zLmtleXdvcmQgPSBuYW1lO1xuICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKG5hbWUsIG9wdGlvbnMpO1xuICBrZXl3b3Jkcy5zZXQobmFtZSwgdG9rZW4pO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJpbm9wKG5hbWU6IHN0cmluZywgYmlub3A6IG51bWJlcikge1xuICByZXR1cm4gY3JlYXRlVG9rZW4obmFtZSwgeyBiZWZvcmVFeHByLCBiaW5vcCB9KTtcbn1cblxubGV0IHRva2VuVHlwZUNvdW50ZXIgPSAtMTtcbmV4cG9ydCBjb25zdCB0b2tlblR5cGVzOiBFeHBvcnRlZFRva2VuVHlwZVtdID0gW107XG5jb25zdCB0b2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcbmNvbnN0IHRva2VuQmlub3BzOiBudW1iZXJbXSA9IFtdO1xuY29uc3QgdG9rZW5CZWZvcmVFeHByczogYm9vbGVhbltdID0gW107XG5jb25zdCB0b2tlblN0YXJ0c0V4cHJzOiBib29sZWFuW10gPSBbXTtcbmNvbnN0IHRva2VuUHJlZml4ZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG5mdW5jdGlvbiBjcmVhdGVUb2tlbihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFRva2VuT3B0aW9ucyA9IHt9KTogVG9rZW5UeXBlIHtcbiAgKyt0b2tlblR5cGVDb3VudGVyO1xuICB0b2tlbkxhYmVscy5wdXNoKG5hbWUpO1xuICB0b2tlbkJpbm9wcy5wdXNoKG9wdGlvbnMuYmlub3AgPz8gLTEpO1xuICB0b2tlbkJlZm9yZUV4cHJzLnB1c2gob3B0aW9ucy5iZWZvcmVFeHByID8/IGZhbHNlKTtcbiAgdG9rZW5TdGFydHNFeHBycy5wdXNoKG9wdGlvbnMuc3RhcnRzRXhwciA/PyBmYWxzZSk7XG4gIHRva2VuUHJlZml4ZXMucHVzaChvcHRpb25zLnByZWZpeCA/PyBmYWxzZSk7XG4gIHRva2VuVHlwZXMucHVzaChuZXcgRXhwb3J0ZWRUb2tlblR5cGUobmFtZSwgb3B0aW9ucykpO1xuXG4gIHJldHVybiB0b2tlblR5cGVDb3VudGVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXl3b3JkTGlrZShcbiAgbmFtZTogc3RyaW5nLFxuICBvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSxcbik6IFRva2VuVHlwZSB7XG4gICsrdG9rZW5UeXBlQ291bnRlcjtcbiAga2V5d29yZHMuc2V0KG5hbWUsIHRva2VuVHlwZUNvdW50ZXIpO1xuICB0b2tlbkxhYmVscy5wdXNoKG5hbWUpO1xuICB0b2tlbkJpbm9wcy5wdXNoKG9wdGlvbnMuYmlub3AgPz8gLTEpO1xuICB0b2tlbkJlZm9yZUV4cHJzLnB1c2gob3B0aW9ucy5iZWZvcmVFeHByID8/IGZhbHNlKTtcbiAgdG9rZW5TdGFydHNFeHBycy5wdXNoKG9wdGlvbnMuc3RhcnRzRXhwciA/PyBmYWxzZSk7XG4gIHRva2VuUHJlZml4ZXMucHVzaChvcHRpb25zLnByZWZpeCA/PyBmYWxzZSk7XG4gIC8vIEluIHRoZSBleHBvcnRlZCB0b2tlbiB0eXBlLCB3ZSBzZXQgdGhlIGxhYmVsIGFzIFwibmFtZVwiIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggQmFiZWwgN1xuICB0b2tlblR5cGVzLnB1c2gobmV3IEV4cG9ydGVkVG9rZW5UeXBlKFwibmFtZVwiLCBvcHRpb25zKSk7XG5cbiAgcmV0dXJuIHRva2VuVHlwZUNvdW50ZXI7XG59XG5cbi8vIEZvciBwZXJmb3JtYW5jZSB0aGUgdG9rZW4gdHlwZSBoZWxwZXJzIGRlcGVuZCBvbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyBvcmRlci5cbi8vIFdoZW4gYWRkaW5nIG5ldyB0b2tlbiB0eXBlcywgcGxlYXNlIGFsc28gY2hlY2sgaWYgdGhlIHRva2VuIGhlbHBlcnMgbmVlZCB1cGRhdGUuXG5cbmV4cG9ydCB0eXBlIEludGVybmFsVG9rZW5UeXBlcyA9IHR5cGVvZiB0dDtcblxuZXhwb3J0IGNvbnN0IHR0ID0ge1xuICAvLyBQdW5jdHVhdGlvbiB0b2tlbiB0eXBlcy5cbiAgYnJhY2tldEw6IGNyZWF0ZVRva2VuKFwiW1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNrZXRIYXNoTDogY3JlYXRlVG9rZW4oXCIjW1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNrZXRCYXJMOiBjcmVhdGVUb2tlbihcIlt8XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2tldFI6IGNyZWF0ZVRva2VuKFwiXVwiKSxcbiAgYnJhY2tldEJhclI6IGNyZWF0ZVRva2VuKFwifF1cIiksXG4gIGJyYWNlTDogY3JlYXRlVG9rZW4oXCJ7XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2VCYXJMOiBjcmVhdGVUb2tlbihcInt8XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2VIYXNoTDogY3JlYXRlVG9rZW4oXCIje1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNlUjogY3JlYXRlVG9rZW4oXCJ9XCIpLFxuICBicmFjZUJhclI6IGNyZWF0ZVRva2VuKFwifH1cIiksXG4gIHBhcmVuTDogY3JlYXRlVG9rZW4oXCIoXCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgcGFyZW5SOiBjcmVhdGVUb2tlbihcIilcIiksXG4gIGNvbW1hOiBjcmVhdGVUb2tlbihcIixcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBzZW1pOiBjcmVhdGVUb2tlbihcIjtcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBjb2xvbjogY3JlYXRlVG9rZW4oXCI6XCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgZG91YmxlQ29sb246IGNyZWF0ZVRva2VuKFwiOjpcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBkb3Q6IGNyZWF0ZVRva2VuKFwiLlwiKSxcbiAgcXVlc3Rpb246IGNyZWF0ZVRva2VuKFwiP1wiLCB7IGJlZm9yZUV4cHIgfSksXG4gIHF1ZXN0aW9uRG90OiBjcmVhdGVUb2tlbihcIj8uXCIpLFxuICBhcnJvdzogY3JlYXRlVG9rZW4oXCI9PlwiLCB7IGJlZm9yZUV4cHIgfSksXG4gIHRlbXBsYXRlOiBjcmVhdGVUb2tlbihcInRlbXBsYXRlXCIpLFxuICBlbGxpcHNpczogY3JlYXRlVG9rZW4oXCIuLi5cIiwgeyBiZWZvcmVFeHByIH0pLFxuICBiYWNrUXVvdGU6IGNyZWF0ZVRva2VuKFwiYFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIGRvbGxhckJyYWNlTDogY3JlYXRlVG9rZW4oXCIke1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0OiBpc1RlbXBsYXRlXG4gIHRlbXBsYXRlVGFpbDogY3JlYXRlVG9rZW4oXCIuLi5gXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgdGVtcGxhdGVOb25UYWlsOiBjcmVhdGVUb2tlbihcIi4uLiR7XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RlbXBsYXRlXG4gIGF0OiBjcmVhdGVUb2tlbihcIkBcIiksXG4gIGhhc2g6IGNyZWF0ZVRva2VuKFwiI1wiLCB7IHN0YXJ0c0V4cHIgfSksXG5cbiAgLy8gU3BlY2lhbCBoYXNoYmFuZyB0b2tlbi5cbiAgaW50ZXJwcmV0ZXJEaXJlY3RpdmU6IGNyZWF0ZVRva2VuKFwiIyEuLi5cIiksXG5cbiAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgLy8gcGFyc2VyIHVzZSB0aGVtIHByb3Blcmx5ICh0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgcHJvcGVydGllcyBpc1xuICAvLyB3aGF0IGNhdGVnb3JpemVzIHRoZW0gYXMgb3BlcmF0b3JzKS5cbiAgLy9cbiAgLy8gYGJpbm9wYCwgd2hlbiBwcmVzZW50LCBzcGVjaWZpZXMgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIGEgYmluYXJ5XG4gIC8vIG9wZXJhdG9yLCBhbmQgd2lsbCByZWZlciB0byBpdHMgcHJlY2VkZW5jZS5cbiAgLy9cbiAgLy8gYHByZWZpeGAgYW5kIGBwb3N0Zml4YCBtYXJrIHRoZSBvcGVyYXRvciBhcyBhIHByZWZpeCBvciBwb3N0Zml4XG4gIC8vIHVuYXJ5IG9wZXJhdG9yLlxuICAvL1xuICAvLyBgaXNBc3NpZ25gIG1hcmtzIGFsbCBvZiBgPWAsIGArPWAsIGAtPWAgZXRjZXRlcmEsIHdoaWNoIGFjdCBhc1xuICAvLyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYSB2ZXJ5IGxvdyBwcmVjZWRlbmNlLCB0aGF0IHNob3VsZCByZXN1bHRcbiAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgLy8gc3RhcnQ6IGlzQXNzaWduXG4gIGVxOiBjcmVhdGVUb2tlbihcIj1cIiwgeyBiZWZvcmVFeHByLCBpc0Fzc2lnbiB9KSxcbiAgYXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIHNsYXNoQXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIC8vIFRoZXNlIGFyZSBvbmx5IG5lZWRlZCB0byBzdXBwb3J0ICUgYW5kIF4gYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gIC8vIFdoZW4gdGhlIHByb3Bvc2FsIHNldHRsZXMgb24gYSB0b2tlbiwgdGhlIG90aGVycyBjYW4gYmUgbWVyZ2VkIHdpdGhcbiAgLy8gdHQuYXNzaWduLlxuICB4b3JBc3NpZ246IGNyZWF0ZVRva2VuKFwiXz1cIiwgeyBiZWZvcmVFeHByLCBpc0Fzc2lnbiB9KSxcbiAgbW9kdWxvQXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIC8vIGVuZDogaXNBc3NpZ25cblxuICBpbmNEZWM6IGNyZWF0ZVRva2VuKFwiKysvLS1cIiwgeyBwcmVmaXgsIHBvc3RmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIGJhbmc6IGNyZWF0ZVRva2VuKFwiIVwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcbiAgdGlsZGU6IGNyZWF0ZVRva2VuKFwiflwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcblxuICAvLyBNb3JlIHBvc3NpYmxlIHRvcGljIHRva2Vucy5cbiAgLy8gV2hlbiB0aGUgcHJvcG9zYWwgc2V0dGxlcyBvbiBhIHRva2VuLCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgbWF5IGJlIHJlbW92ZWQuXG4gIGRvdWJsZUNhcmV0OiBjcmVhdGVUb2tlbihcIl5eXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgZG91YmxlQXQ6IGNyZWF0ZVRva2VuKFwiQEBcIiwgeyBzdGFydHNFeHByIH0pLFxuXG4gIC8vIHN0YXJ0OiBpc0Jpbm9wXG4gIHBpcGVsaW5lOiBjcmVhdGVCaW5vcChcInw+XCIsIDApLFxuICBudWxsaXNoQ29hbGVzY2luZzogY3JlYXRlQmlub3AoXCI/P1wiLCAxKSxcbiAgbG9naWNhbE9SOiBjcmVhdGVCaW5vcChcInx8XCIsIDEpLFxuICBsb2dpY2FsQU5EOiBjcmVhdGVCaW5vcChcIiYmXCIsIDIpLFxuICBiaXR3aXNlT1I6IGNyZWF0ZUJpbm9wKFwifFwiLCAzKSxcbiAgYml0d2lzZVhPUjogY3JlYXRlQmlub3AoXCJeXCIsIDQpLFxuICBiaXR3aXNlQU5EOiBjcmVhdGVCaW5vcChcIiZcIiwgNSksXG4gIGVxdWFsaXR5OiBjcmVhdGVCaW5vcChcIj09LyE9Lz09PS8hPT1cIiwgNiksXG4gIGx0OiBjcmVhdGVCaW5vcChcIjwvPi88PS8+PVwiLCA3KSxcbiAgZ3Q6IGNyZWF0ZUJpbm9wKFwiPC8+Lzw9Lz49XCIsIDcpLFxuICByZWxhdGlvbmFsOiBjcmVhdGVCaW5vcChcIjwvPi88PS8+PVwiLCA3KSxcbiAgYml0U2hpZnQ6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBiaXRTaGlmdEw6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBiaXRTaGlmdFI6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBwbHVzTWluOiBjcmVhdGVUb2tlbihcIisvLVwiLCB7IGJlZm9yZUV4cHIsIGJpbm9wOiA5LCBwcmVmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0c0V4cHI6IHJlcXVpcmVkIGJ5IHY4aW50cmluc2ljIHBsdWdpblxuICBtb2R1bG86IGNyZWF0ZVRva2VuKFwiJVwiLCB7IGJpbm9wOiAxMCwgc3RhcnRzRXhwciB9KSxcbiAgLy8gdW5zZXQgYGJlZm9yZUV4cHJgIGFzIGl0IGNhbiBiZSBgZnVuY3Rpb24gKmBcbiAgc3RhcjogY3JlYXRlVG9rZW4oXCIqXCIsIHsgYmlub3A6IDEwIH0pLFxuICBzbGFzaDogY3JlYXRlQmlub3AoXCIvXCIsIDEwKSxcbiAgZXhwb25lbnQ6IGNyZWF0ZVRva2VuKFwiKipcIiwge1xuICAgIGJlZm9yZUV4cHIsXG4gICAgYmlub3A6IDExLFxuICAgIHJpZ2h0QXNzb2NpYXRpdmU6IHRydWUsXG4gIH0pLFxuXG4gIC8vIEtleXdvcmRzXG4gIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgcGFja2FnZXMvYmFiZWwtaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9rZXl3b3JkLmpzXG4gIC8vIHdoZW4gbmV3IGtleXdvcmRzIGFyZSBhZGRlZFxuICAvLyBzdGFydDogaXNMaXRlcmFsUHJvcGVydHlOYW1lXG4gIC8vIHN0YXJ0OiBpc0tleXdvcmRcbiAgX2luOiBjcmVhdGVLZXl3b3JkKFwiaW5cIiwgeyBiZWZvcmVFeHByLCBiaW5vcDogNyB9KSxcbiAgX2luc3RhbmNlb2Y6IGNyZWF0ZUtleXdvcmQoXCJpbnN0YW5jZW9mXCIsIHsgYmVmb3JlRXhwciwgYmlub3A6IDcgfSksXG4gIC8vIGVuZDogaXNCaW5vcFxuICBfYnJlYWs6IGNyZWF0ZUtleXdvcmQoXCJicmVha1wiKSxcbiAgX2Nhc2U6IGNyZWF0ZUtleXdvcmQoXCJjYXNlXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2NhdGNoOiBjcmVhdGVLZXl3b3JkKFwiY2F0Y2hcIiksXG4gIF9jb250aW51ZTogY3JlYXRlS2V5d29yZChcImNvbnRpbnVlXCIpLFxuICBfZGVidWdnZXI6IGNyZWF0ZUtleXdvcmQoXCJkZWJ1Z2dlclwiKSxcbiAgX2RlZmF1bHQ6IGNyZWF0ZUtleXdvcmQoXCJkZWZhdWx0XCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2Vsc2U6IGNyZWF0ZUtleXdvcmQoXCJlbHNlXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2ZpbmFsbHk6IGNyZWF0ZUtleXdvcmQoXCJmaW5hbGx5XCIpLFxuICBfZnVuY3Rpb246IGNyZWF0ZUtleXdvcmQoXCJmdW5jdGlvblwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9pZjogY3JlYXRlS2V5d29yZChcImlmXCIpLFxuICBfcmV0dXJuOiBjcmVhdGVLZXl3b3JkKFwicmV0dXJuXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX3N3aXRjaDogY3JlYXRlS2V5d29yZChcInN3aXRjaFwiKSxcbiAgX3Rocm93OiBjcmVhdGVLZXl3b3JkKFwidGhyb3dcIiwgeyBiZWZvcmVFeHByLCBwcmVmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIF90cnk6IGNyZWF0ZUtleXdvcmQoXCJ0cnlcIiksXG4gIF92YXI6IGNyZWF0ZUtleXdvcmQoXCJ2YXJcIiksXG4gIF9jb25zdDogY3JlYXRlS2V5d29yZChcImNvbnN0XCIpLFxuICBfd2l0aDogY3JlYXRlS2V5d29yZChcIndpdGhcIiksXG4gIF9uZXc6IGNyZWF0ZUtleXdvcmQoXCJuZXdcIiwgeyBiZWZvcmVFeHByLCBzdGFydHNFeHByIH0pLFxuICBfdGhpczogY3JlYXRlS2V5d29yZChcInRoaXNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc3VwZXI6IGNyZWF0ZUtleXdvcmQoXCJzdXBlclwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9jbGFzczogY3JlYXRlS2V5d29yZChcImNsYXNzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2V4dGVuZHM6IGNyZWF0ZUtleXdvcmQoXCJleHRlbmRzXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2V4cG9ydDogY3JlYXRlS2V5d29yZChcImV4cG9ydFwiKSxcbiAgX2ltcG9ydDogY3JlYXRlS2V5d29yZChcImltcG9ydFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9udWxsOiBjcmVhdGVLZXl3b3JkKFwibnVsbFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF90cnVlOiBjcmVhdGVLZXl3b3JkKFwidHJ1ZVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9mYWxzZTogY3JlYXRlS2V5d29yZChcImZhbHNlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX3R5cGVvZjogY3JlYXRlS2V5d29yZChcInR5cGVvZlwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcbiAgX3ZvaWQ6IGNyZWF0ZUtleXdvcmQoXCJ2b2lkXCIsIHsgYmVmb3JlRXhwciwgcHJlZml4LCBzdGFydHNFeHByIH0pLFxuICBfZGVsZXRlOiBjcmVhdGVLZXl3b3JkKFwiZGVsZXRlXCIsIHsgYmVmb3JlRXhwciwgcHJlZml4LCBzdGFydHNFeHByIH0pLFxuICAvLyBzdGFydDogaXNMb29wXG4gIF9kbzogY3JlYXRlS2V5d29yZChcImRvXCIsIHsgaXNMb29wLCBiZWZvcmVFeHByIH0pLFxuICBfZm9yOiBjcmVhdGVLZXl3b3JkKFwiZm9yXCIsIHsgaXNMb29wIH0pLFxuICBfd2hpbGU6IGNyZWF0ZUtleXdvcmQoXCJ3aGlsZVwiLCB7IGlzTG9vcCB9KSxcbiAgLy8gZW5kOiBpc0xvb3BcbiAgLy8gZW5kOiBpc0tleXdvcmRcblxuICAvLyBQcmltYXJ5IGxpdGVyYWxzXG4gIC8vIHN0YXJ0OiBpc0lkZW50aWZpZXJcbiAgX2FzOiBjcmVhdGVLZXl3b3JkTGlrZShcImFzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2Fzc2VydDogY3JlYXRlS2V5d29yZExpa2UoXCJhc3NlcnRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfYXN5bmM6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYXN5bmNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfYXdhaXQ6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYXdhaXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZnJvbTogY3JlYXRlS2V5d29yZExpa2UoXCJmcm9tXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2dldDogY3JlYXRlS2V5d29yZExpa2UoXCJnZXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfbGV0OiBjcmVhdGVLZXl3b3JkTGlrZShcImxldFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9tZXRhOiBjcmVhdGVLZXl3b3JkTGlrZShcIm1ldGFcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfb2Y6IGNyZWF0ZUtleXdvcmRMaWtlKFwib2ZcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc2VudDogY3JlYXRlS2V5d29yZExpa2UoXCJzZW50XCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX3NldDogY3JlYXRlS2V5d29yZExpa2UoXCJzZXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc3RhdGljOiBjcmVhdGVLZXl3b3JkTGlrZShcInN0YXRpY1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF91c2luZzogY3JlYXRlS2V5d29yZExpa2UoXCJ1c2luZ1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF95aWVsZDogY3JlYXRlS2V5d29yZExpa2UoXCJ5aWVsZFwiLCB7IHN0YXJ0c0V4cHIgfSksXG5cbiAgLy8gRmxvdyBhbmQgVHlwZVNjcmlwdCBLZXl3b3JkbGlrZVxuICBfYXNzZXJ0czogY3JlYXRlS2V5d29yZExpa2UoXCJhc3NlcnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2NoZWNrczogY3JlYXRlS2V5d29yZExpa2UoXCJjaGVja3NcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZXhwb3J0czogY3JlYXRlS2V5d29yZExpa2UoXCJleHBvcnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2dsb2JhbDogY3JlYXRlS2V5d29yZExpa2UoXCJnbG9iYWxcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaW1wbGVtZW50czogY3JlYXRlS2V5d29yZExpa2UoXCJpbXBsZW1lbnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2ludHJpbnNpYzogY3JlYXRlS2V5d29yZExpa2UoXCJpbnRyaW5zaWNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaW5mZXI6IGNyZWF0ZUtleXdvcmRMaWtlKFwiaW5mZXJcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaXM6IGNyZWF0ZUtleXdvcmRMaWtlKFwiaXNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfbWl4aW5zOiBjcmVhdGVLZXl3b3JkTGlrZShcIm1peGluc1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9wcm90bzogY3JlYXRlS2V5d29yZExpa2UoXCJwcm90b1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9yZXF1aXJlOiBjcmVhdGVLZXl3b3JkTGlrZShcInJlcXVpcmVcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc2F0aXNmaWVzOiBjcmVhdGVLZXl3b3JkTGlrZShcInNhdGlzZmllc1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0OiBpc1RTVHlwZU9wZXJhdG9yXG4gIF9rZXlvZjogY3JlYXRlS2V5d29yZExpa2UoXCJrZXlvZlwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9yZWFkb25seTogY3JlYXRlS2V5d29yZExpa2UoXCJyZWFkb25seVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF91bmlxdWU6IGNyZWF0ZUtleXdvcmRMaWtlKFwidW5pcXVlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RTVHlwZU9wZXJhdG9yXG4gIC8vIHN0YXJ0OiBpc1RTRGVjbGFyYXRpb25TdGFydFxuICBfYWJzdHJhY3Q6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYWJzdHJhY3RcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZGVjbGFyZTogY3JlYXRlS2V5d29yZExpa2UoXCJkZWNsYXJlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2VudW06IGNyZWF0ZUtleXdvcmRMaWtlKFwiZW51bVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9tb2R1bGU6IGNyZWF0ZUtleXdvcmRMaWtlKFwibW9kdWxlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX25hbWVzcGFjZTogY3JlYXRlS2V5d29yZExpa2UoXCJuYW1lc3BhY2VcIiwgeyBzdGFydHNFeHByIH0pLFxuICAvLyBzdGFydDogaXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWVcbiAgX2ludGVyZmFjZTogY3JlYXRlS2V5d29yZExpa2UoXCJpbnRlcmZhY2VcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfdHlwZTogY3JlYXRlS2V5d29yZExpa2UoXCJ0eXBlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RTRGVjbGFyYXRpb25TdGFydFxuICBfb3BhcXVlOiBjcmVhdGVLZXl3b3JkTGlrZShcIm9wYXF1ZVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIC8vIGVuZDogaXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWVcbiAgbmFtZTogY3JlYXRlVG9rZW4oXCJuYW1lXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc0lkZW50aWZpZXJcblxuICBzdHJpbmc6IGNyZWF0ZVRva2VuKFwic3RyaW5nXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgbnVtOiBjcmVhdGVUb2tlbihcIm51bVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIGJpZ2ludDogY3JlYXRlVG9rZW4oXCJiaWdpbnRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBkZWNpbWFsOiBjcmVhdGVUb2tlbihcImRlY2ltYWxcIiwgeyBzdGFydHNFeHByIH0pLFxuICAvLyBlbmQ6IGlzTGl0ZXJhbFByb3BlcnR5TmFtZVxuICByZWdleHA6IGNyZWF0ZVRva2VuKFwicmVnZXhwXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgcHJpdmF0ZU5hbWU6IGNyZWF0ZVRva2VuKFwiI25hbWVcIiwgeyBzdGFydHNFeHByIH0pLFxuICBlb2Y6IGNyZWF0ZVRva2VuKFwiZW9mXCIpLFxuXG4gIC8vIGpzeCBwbHVnaW5cbiAganN4TmFtZTogY3JlYXRlVG9rZW4oXCJqc3hOYW1lXCIpLFxuICBqc3hUZXh0OiBjcmVhdGVUb2tlbihcImpzeFRleHRcIiwgeyBiZWZvcmVFeHByOiB0cnVlIH0pLFxuICBqc3hUYWdTdGFydDogY3JlYXRlVG9rZW4oXCJqc3hUYWdTdGFydFwiLCB7IHN0YXJ0c0V4cHI6IHRydWUgfSksXG4gIGpzeFRhZ0VuZDogY3JlYXRlVG9rZW4oXCJqc3hUYWdFbmRcIiksXG5cbiAgLy8gcGxhY2Vob2xkZXIgcGx1Z2luXG4gIHBsYWNlaG9sZGVyOiBjcmVhdGVUb2tlbihcIiUlXCIsIHsgc3RhcnRzRXhwcjogdHJ1ZSB9KSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzSWRlbnRpZmllcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5fYXMgJiYgdG9rZW4gPD0gdHQubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuS2V5d29yZE9ySWRlbnRpZmllcklzS2V5d29yZCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIC8vIHdlIGNhbiByZW1vdmUgdGhlIHRva2VuID49IHR0Ll9pbiBjaGVjayB3aGVuIHdlXG4gIC8vIGtub3cgYSB0b2tlbiBpcyBlaXRoZXIga2V5d29yZCBvciBpZGVudGlmaWVyXG4gIHJldHVybiB0b2tlbiA8PSB0dC5fd2hpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5faW4gJiYgdG9rZW4gPD0gdHQubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0Ll9pbiAmJiB0b2tlbiA8PSB0dC5kZWNpbWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Db21lc0JlZm9yZUV4cHJlc3Npb24odG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW5CZWZvcmVFeHByc1t0b2tlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlblN0YXJ0c0V4cHJzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNBc3NpZ25tZW50KHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0LmVxICYmIHRva2VuIDw9IHR0Lm1vZHVsb0Fzc2lnbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWUodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2ludGVyZmFjZSAmJiB0b2tlbiA8PSB0dC5fb3BhcXVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc0xvb3AodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2RvICYmIHRva2VuIDw9IHR0Ll93aGlsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNLZXl3b3JkKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0Ll9pbiAmJiB0b2tlbiA8PSB0dC5fd2hpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzT3BlcmF0b3IodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQucGlwZWxpbmUgJiYgdG9rZW4gPD0gdHQuX2luc3RhbmNlb2Y7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzUG9zdGZpeCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA9PT0gdHQuaW5jRGVjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1ByZWZpeCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlblByZWZpeGVzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNUU1R5cGVPcGVyYXRvcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5fa2V5b2YgJiYgdG9rZW4gPD0gdHQuX3VuaXF1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNUU0RlY2xhcmF0aW9uU3RhcnQodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2Fic3RyYWN0ICYmIHRva2VuIDw9IHR0Ll90eXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5MYWJlbE5hbWUodG9rZW46IFRva2VuVHlwZSk6IHN0cmluZyB7XG4gIHJldHVybiB0b2tlbkxhYmVsc1t0b2tlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbk9wZXJhdG9yUHJlY2VkZW5jZSh0b2tlbjogVG9rZW5UeXBlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRva2VuQmlub3BzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNCaW5hcnlPcGVyYXRvcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbkJpbm9wc1t0b2tlbl0gIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1JpZ2h0QXNzb2NpYXRpdmUodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPT09IHR0LmV4cG9uZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1RlbXBsYXRlKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0LnRlbXBsYXRlVGFpbCAmJiB0b2tlbiA8PSB0dC50ZW1wbGF0ZU5vblRhaWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBvcnRlZFRva2VuKHRva2VuOiBUb2tlblR5cGUpOiBFeHBvcnRlZFRva2VuVHlwZSB7XG4gIHJldHVybiB0b2tlblR5cGVzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVG9rZW5UeXBlKG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm51bWJlclwiO1xufVxuXG5pZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgdG9rZW5UeXBlc1t0dC5icmFjZVJdLnVwZGF0ZUNvbnRleHQgPSBjb250ZXh0ID0+IHtcbiAgICBjb250ZXh0LnBvcCgpO1xuICB9O1xuXG4gIHRva2VuVHlwZXNbdHQuYnJhY2VMXS51cGRhdGVDb250ZXh0ID1cbiAgICB0b2tlblR5cGVzW3R0LmJyYWNlSGFzaExdLnVwZGF0ZUNvbnRleHQgPVxuICAgIHRva2VuVHlwZXNbdHQuZG9sbGFyQnJhY2VMXS51cGRhdGVDb250ZXh0ID1cbiAgICAgIGNvbnRleHQgPT4ge1xuICAgICAgICBjb250ZXh0LnB1c2godGMuYnJhY2UpO1xuICAgICAgfTtcblxuICB0b2tlblR5cGVzW3R0LmJhY2tRdW90ZV0udXBkYXRlQ29udGV4dCA9IGNvbnRleHQgPT4ge1xuICAgIGlmIChjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV0gPT09IHRjLnRlbXBsYXRlKSB7XG4gICAgICBjb250ZXh0LnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LnB1c2godGMudGVtcGxhdGUpO1xuICAgIH1cbiAgfTtcblxuICB0b2tlblR5cGVzW3R0LmpzeFRhZ1N0YXJ0XS51cGRhdGVDb250ZXh0ID0gY29udGV4dCA9PiB7XG4gICAgY29udGV4dC5wdXNoKHRjLmpfZXhwciwgdGMual9vVGFnKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyAjIyBDaGFyYWN0ZXIgY2F0ZWdvcmllc1xuXG4vLyBCaWcgdWdseSByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggY2hhcmFjdGVycyBpbiB0aGVcbi8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlXG4vLyBhcmUgb25seSBhcHBsaWVkIHdoZW4gYSBjaGFyYWN0ZXIgaXMgZm91bmQgdG8gYWN0dWFsbHkgaGF2ZSBhXG4vLyBjb2RlIHBvaW50IGJldHdlZW4gMHg4MCBhbmQgMHhmZmZmLlxuLy8gR2VuZXJhdGVkIGJ5IGBzY3JpcHRzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmxldCBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gXCJcXHhhYVxceGI1XFx4YmFcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJjMVxcdTAyYzYtXFx1MDJkMVxcdTAyZTAtXFx1MDJlNFxcdTAyZWNcXHUwMmVlXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdhLVxcdTAzN2RcXHUwMzdmXFx1MDM4NlxcdTAzODgtXFx1MDM4YVxcdTAzOGNcXHUwMzhlLVxcdTAzYTFcXHUwM2EzLVxcdTAzZjVcXHUwM2Y3LVxcdTA0ODFcXHUwNDhhLVxcdTA1MmZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MC1cXHUwNTg4XFx1MDVkMC1cXHUwNWVhXFx1MDVlZi1cXHUwNWYyXFx1MDYyMC1cXHUwNjRhXFx1MDY2ZVxcdTA2NmZcXHUwNjcxLVxcdTA2ZDNcXHUwNmQ1XFx1MDZlNVxcdTA2ZTZcXHUwNmVlXFx1MDZlZlxcdTA2ZmEtXFx1MDZmY1xcdTA2ZmZcXHUwNzEwXFx1MDcxMi1cXHUwNzJmXFx1MDc0ZC1cXHUwN2E1XFx1MDdiMVxcdTA3Y2EtXFx1MDdlYVxcdTA3ZjRcXHUwN2Y1XFx1MDdmYVxcdTA4MDAtXFx1MDgxNVxcdTA4MWFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4NjAtXFx1MDg2YVxcdTA4NzAtXFx1MDg4N1xcdTA4ODktXFx1MDg4ZVxcdTA4YTAtXFx1MDhjOVxcdTA5MDQtXFx1MDkzOVxcdTA5M2RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThjXFx1MDk4ZlxcdTA5OTBcXHUwOTkzLVxcdTA5YThcXHUwOWFhLVxcdTA5YjBcXHUwOWIyXFx1MDliNi1cXHUwOWI5XFx1MDliZFxcdTA5Y2VcXHUwOWRjXFx1MDlkZFxcdTA5ZGYtXFx1MDllMVxcdTA5ZjBcXHUwOWYxXFx1MDlmY1xcdTBhMDUtXFx1MGEwYVxcdTBhMGZcXHUwYTEwXFx1MGExMy1cXHUwYTI4XFx1MGEyYS1cXHUwYTMwXFx1MGEzMlxcdTBhMzNcXHUwYTM1XFx1MGEzNlxcdTBhMzhcXHUwYTM5XFx1MGE1OS1cXHUwYTVjXFx1MGE1ZVxcdTBhNzItXFx1MGE3NFxcdTBhODUtXFx1MGE4ZFxcdTBhOGYtXFx1MGE5MVxcdTBhOTMtXFx1MGFhOFxcdTBhYWEtXFx1MGFiMFxcdTBhYjJcXHUwYWIzXFx1MGFiNS1cXHUwYWI5XFx1MGFiZFxcdTBhZDBcXHUwYWUwXFx1MGFlMVxcdTBhZjlcXHUwYjA1LVxcdTBiMGNcXHUwYjBmXFx1MGIxMFxcdTBiMTMtXFx1MGIyOFxcdTBiMmEtXFx1MGIzMFxcdTBiMzJcXHUwYjMzXFx1MGIzNS1cXHUwYjM5XFx1MGIzZFxcdTBiNWNcXHUwYjVkXFx1MGI1Zi1cXHUwYjYxXFx1MGI3MVxcdTBiODNcXHUwYjg1LVxcdTBiOGFcXHUwYjhlLVxcdTBiOTBcXHUwYjkyLVxcdTBiOTVcXHUwYjk5XFx1MGI5YVxcdTBiOWNcXHUwYjllXFx1MGI5ZlxcdTBiYTNcXHUwYmE0XFx1MGJhOC1cXHUwYmFhXFx1MGJhZS1cXHUwYmI5XFx1MGJkMFxcdTBjMDUtXFx1MGMwY1xcdTBjMGUtXFx1MGMxMFxcdTBjMTItXFx1MGMyOFxcdTBjMmEtXFx1MGMzOVxcdTBjM2RcXHUwYzU4LVxcdTBjNWFcXHUwYzVkXFx1MGM2MFxcdTBjNjFcXHUwYzgwXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGRcXHUwY2RlXFx1MGNlMFxcdTBjZTFcXHUwY2YxXFx1MGNmMlxcdTBkMDQtXFx1MGQwY1xcdTBkMGUtXFx1MGQxMFxcdTBkMTItXFx1MGQzYVxcdTBkM2RcXHUwZDRlXFx1MGQ1NC1cXHUwZDU2XFx1MGQ1Zi1cXHUwZDYxXFx1MGQ3YS1cXHUwZDdmXFx1MGQ4NS1cXHUwZDk2XFx1MGQ5YS1cXHUwZGIxXFx1MGRiMy1cXHUwZGJiXFx1MGRiZFxcdTBkYzAtXFx1MGRjNlxcdTBlMDEtXFx1MGUzMFxcdTBlMzJcXHUwZTMzXFx1MGU0MC1cXHUwZTQ2XFx1MGU4MVxcdTBlODJcXHUwZTg0XFx1MGU4Ni1cXHUwZThhXFx1MGU4Yy1cXHUwZWEzXFx1MGVhNVxcdTBlYTctXFx1MGViMFxcdTBlYjJcXHUwZWIzXFx1MGViZFxcdTBlYzAtXFx1MGVjNFxcdTBlYzZcXHUwZWRjLVxcdTBlZGZcXHUwZjAwXFx1MGY0MC1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY4OC1cXHUwZjhjXFx1MTAwMC1cXHUxMDJhXFx1MTAzZlxcdTEwNTAtXFx1MTA1NVxcdTEwNWEtXFx1MTA1ZFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNmUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOGVcXHUxMGEwLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTBmYVxcdTEwZmMtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y1XFx1MTNmOC1cXHUxM2ZkXFx1MTQwMS1cXHUxNjZjXFx1MTY2Zi1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmVhXFx1MTZlZS1cXHUxNmY4XFx1MTcwMC1cXHUxNzExXFx1MTcxZi1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZjXFx1MTc2ZS1cXHUxNzcwXFx1MTc4MC1cXHUxN2IzXFx1MTdkN1xcdTE3ZGNcXHUxODIwLVxcdTE4NzhcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFlXFx1MTk1MC1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTliMC1cXHUxOWM5XFx1MWEwMC1cXHUxYTE2XFx1MWEyMC1cXHUxYTU0XFx1MWFhN1xcdTFiMDUtXFx1MWIzM1xcdTFiNDUtXFx1MWI0Y1xcdTFiODMtXFx1MWJhMFxcdTFiYWVcXHUxYmFmXFx1MWJiYS1cXHUxYmU1XFx1MWMwMC1cXHUxYzIzXFx1MWM0ZC1cXHUxYzRmXFx1MWM1YS1cXHUxYzdkXFx1MWM4MC1cXHUxYzg4XFx1MWM5MC1cXHUxY2JhXFx1MWNiZC1cXHUxY2JmXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YzXFx1MWNmNVxcdTFjZjZcXHUxY2ZhXFx1MWQwMC1cXHUxZGJmXFx1MWUwMC1cXHUxZjE1XFx1MWYxOC1cXHUxZjFkXFx1MWYyMC1cXHUxZjQ1XFx1MWY0OC1cXHUxZjRkXFx1MWY1MC1cXHUxZjU3XFx1MWY1OVxcdTFmNWJcXHUxZjVkXFx1MWY1Zi1cXHUxZjdkXFx1MWY4MC1cXHUxZmI0XFx1MWZiNi1cXHUxZmJjXFx1MWZiZVxcdTFmYzItXFx1MWZjNFxcdTFmYzYtXFx1MWZjY1xcdTFmZDAtXFx1MWZkM1xcdTFmZDYtXFx1MWZkYlxcdTFmZTAtXFx1MWZlY1xcdTFmZjItXFx1MWZmNFxcdTFmZjYtXFx1MWZmY1xcdTIwNzFcXHUyMDdmXFx1MjA5MC1cXHUyMDljXFx1MjEwMlxcdTIxMDdcXHUyMTBhLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFkXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyYS1cXHUyMTM5XFx1MjEzYy1cXHUyMTNmXFx1MjE0NS1cXHUyMTQ5XFx1MjE0ZVxcdTIxNjAtXFx1MjE4OFxcdTJjMDAtXFx1MmNlNFxcdTJjZWItXFx1MmNlZVxcdTJjZjJcXHUyY2YzXFx1MmQwMC1cXHUyZDI1XFx1MmQyN1xcdTJkMmRcXHUyZDMwLVxcdTJkNjdcXHUyZDZmXFx1MmQ4MC1cXHUyZDk2XFx1MmRhMC1cXHUyZGE2XFx1MmRhOC1cXHUyZGFlXFx1MmRiMC1cXHUyZGI2XFx1MmRiOC1cXHUyZGJlXFx1MmRjMC1cXHUyZGM2XFx1MmRjOC1cXHUyZGNlXFx1MmRkMC1cXHUyZGQ2XFx1MmRkOC1cXHUyZGRlXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNjXFx1MzA0MS1cXHUzMDk2XFx1MzA5Yi1cXHUzMDlmXFx1MzBhMS1cXHUzMGZhXFx1MzBmYy1cXHUzMGZmXFx1MzEwNS1cXHUzMTJmXFx1MzEzMS1cXHUzMThlXFx1MzFhMC1cXHUzMWJmXFx1MzFmMC1cXHUzMWZmXFx1MzQwMC1cXHU0ZGJmXFx1NGUwMC1cXHVhNDhjXFx1YTRkMC1cXHVhNGZkXFx1YTUwMC1cXHVhNjBjXFx1YTYxMC1cXHVhNjFmXFx1YTYyYVxcdWE2MmJcXHVhNjQwLVxcdWE2NmVcXHVhNjdmLVxcdWE2OWRcXHVhNmEwLVxcdWE2ZWZcXHVhNzE3LVxcdWE3MWZcXHVhNzIyLVxcdWE3ODhcXHVhNzhiLVxcdWE3Y2FcXHVhN2QwXFx1YTdkMVxcdWE3ZDNcXHVhN2Q1LVxcdWE3ZDlcXHVhN2YyLVxcdWE4MDFcXHVhODAzLVxcdWE4MDVcXHVhODA3LVxcdWE4MGFcXHVhODBjLVxcdWE4MjJcXHVhODQwLVxcdWE4NzNcXHVhODgyLVxcdWE4YjNcXHVhOGYyLVxcdWE4ZjdcXHVhOGZiXFx1YThmZFxcdWE4ZmVcXHVhOTBhLVxcdWE5MjVcXHVhOTMwLVxcdWE5NDZcXHVhOTYwLVxcdWE5N2NcXHVhOTg0LVxcdWE5YjJcXHVhOWNmXFx1YTllMC1cXHVhOWU0XFx1YTllNi1cXHVhOWVmXFx1YTlmYS1cXHVhOWZlXFx1YWEwMC1cXHVhYTI4XFx1YWE0MC1cXHVhYTQyXFx1YWE0NC1cXHVhYTRiXFx1YWE2MC1cXHVhYTc2XFx1YWE3YVxcdWFhN2UtXFx1YWFhZlxcdWFhYjFcXHVhYWI1XFx1YWFiNlxcdWFhYjktXFx1YWFiZFxcdWFhYzBcXHVhYWMyXFx1YWFkYi1cXHVhYWRkXFx1YWFlMC1cXHVhYWVhXFx1YWFmMi1cXHVhYWY0XFx1YWIwMS1cXHVhYjA2XFx1YWIwOS1cXHVhYjBlXFx1YWIxMS1cXHVhYjE2XFx1YWIyMC1cXHVhYjI2XFx1YWIyOC1cXHVhYjJlXFx1YWIzMC1cXHVhYjVhXFx1YWI1Yy1cXHVhYjY5XFx1YWI3MC1cXHVhYmUyXFx1YWMwMC1cXHVkN2EzXFx1ZDdiMC1cXHVkN2M2XFx1ZDdjYi1cXHVkN2ZiXFx1ZjkwMC1cXHVmYTZkXFx1ZmE3MC1cXHVmYWQ5XFx1ZmIwMC1cXHVmYjA2XFx1ZmIxMy1cXHVmYjE3XFx1ZmIxZFxcdWZiMWYtXFx1ZmIyOFxcdWZiMmEtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwXFx1ZmI0MVxcdWZiNDNcXHVmYjQ0XFx1ZmI0Ni1cXHVmYmIxXFx1ZmJkMy1cXHVmZDNkXFx1ZmQ1MC1cXHVmZDhmXFx1ZmQ5Mi1cXHVmZGM3XFx1ZmRmMC1cXHVmZGZiXFx1ZmU3MC1cXHVmZTc0XFx1ZmU3Ni1cXHVmZWZjXFx1ZmYyMS1cXHVmZjNhXFx1ZmY0MS1cXHVmZjVhXFx1ZmY2Ni1cXHVmZmJlXFx1ZmZjMi1cXHVmZmM3XFx1ZmZjYS1cXHVmZmNmXFx1ZmZkMi1cXHVmZmQ3XFx1ZmZkYS1cXHVmZmRjXCI7XG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmxldCBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IFwiXFx1MjAwY1xcdTIwMGRcXHhiN1xcdTAzMDAtXFx1MDM2ZlxcdTAzODdcXHUwNDgzLVxcdTA0ODdcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NjlcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZi1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNmYwLVxcdTA2ZjlcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdjMC1cXHUwN2M5XFx1MDdlYi1cXHUwN2YzXFx1MDdmZFxcdTA4MTYtXFx1MDgxOVxcdTA4MWItXFx1MDgyM1xcdTA4MjUtXFx1MDgyN1xcdTA4MjktXFx1MDgyZFxcdTA4NTktXFx1MDg1YlxcdTA4OTgtXFx1MDg5ZlxcdTA4Y2EtXFx1MDhlMVxcdTA4ZTMtXFx1MDkwM1xcdTA5M2EtXFx1MDkzY1xcdTA5M2UtXFx1MDk0ZlxcdTA5NTEtXFx1MDk1N1xcdTA5NjJcXHUwOTYzXFx1MDk2Ni1cXHUwOTZmXFx1MDk4MS1cXHUwOTgzXFx1MDliY1xcdTA5YmUtXFx1MDljNFxcdTA5YzdcXHUwOWM4XFx1MDljYi1cXHUwOWNkXFx1MDlkN1xcdTA5ZTJcXHUwOWUzXFx1MDllNi1cXHUwOWVmXFx1MDlmZVxcdTBhMDEtXFx1MGEwM1xcdTBhM2NcXHUwYTNlLVxcdTBhNDJcXHUwYTQ3XFx1MGE0OFxcdTBhNGItXFx1MGE0ZFxcdTBhNTFcXHUwYTY2LVxcdTBhNzFcXHUwYTc1XFx1MGE4MS1cXHUwYTgzXFx1MGFiY1xcdTBhYmUtXFx1MGFjNVxcdTBhYzctXFx1MGFjOVxcdTBhY2ItXFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGFlNi1cXHUwYWVmXFx1MGFmYS1cXHUwYWZmXFx1MGIwMS1cXHUwYjAzXFx1MGIzY1xcdTBiM2UtXFx1MGI0NFxcdTBiNDdcXHUwYjQ4XFx1MGI0Yi1cXHUwYjRkXFx1MGI1NS1cXHUwYjU3XFx1MGI2MlxcdTBiNjNcXHUwYjY2LVxcdTBiNmZcXHUwYjgyXFx1MGJiZS1cXHUwYmMyXFx1MGJjNi1cXHUwYmM4XFx1MGJjYS1cXHUwYmNkXFx1MGJkN1xcdTBiZTYtXFx1MGJlZlxcdTBjMDAtXFx1MGMwNFxcdTBjM2NcXHUwYzNlLVxcdTBjNDRcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGM2Ni1cXHUwYzZmXFx1MGM4MS1cXHUwYzgzXFx1MGNiY1xcdTBjYmUtXFx1MGNjNFxcdTBjYzYtXFx1MGNjOFxcdTBjY2EtXFx1MGNjZFxcdTBjZDVcXHUwY2Q2XFx1MGNlMlxcdTBjZTNcXHUwY2U2LVxcdTBjZWZcXHUwY2YzXFx1MGQwMC1cXHUwZDAzXFx1MGQzYlxcdTBkM2NcXHUwZDNlLVxcdTBkNDRcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgxLVxcdTBkODNcXHUwZGNhXFx1MGRjZi1cXHUwZGQ0XFx1MGRkNlxcdTBkZDgtXFx1MGRkZlxcdTBkZTYtXFx1MGRlZlxcdTBkZjJcXHUwZGYzXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlNTAtXFx1MGU1OVxcdTBlYjFcXHUwZWI0LVxcdTBlYmNcXHUwZWM4LVxcdTBlY2VcXHUwZWQwLVxcdTBlZDlcXHUwZjE4XFx1MGYxOVxcdTBmMjAtXFx1MGYyOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmM2VcXHUwZjNmXFx1MGY3MS1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjhkLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyYi1cXHUxMDNlXFx1MTA0MC1cXHUxMDQ5XFx1MTA1Ni1cXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA2Mi1cXHUxMDY0XFx1MTA2Ny1cXHUxMDZkXFx1MTA3MS1cXHUxMDc0XFx1MTA4Mi1cXHUxMDhkXFx1MTA4Zi1cXHUxMDlkXFx1MTM1ZC1cXHUxMzVmXFx1MTM2OS1cXHUxMzcxXFx1MTcxMi1cXHUxNzE1XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjQtXFx1MTdkM1xcdTE3ZGRcXHUxN2UwLVxcdTE3ZTlcXHUxODBiLVxcdTE4MGRcXHUxODBmLVxcdTE4MTlcXHUxOGE5XFx1MTkyMC1cXHUxOTJiXFx1MTkzMC1cXHUxOTNiXFx1MTk0Ni1cXHUxOTRmXFx1MTlkMC1cXHUxOWRhXFx1MWExNy1cXHUxYTFiXFx1MWE1NS1cXHUxYTVlXFx1MWE2MC1cXHUxYTdjXFx1MWE3Zi1cXHUxYTg5XFx1MWE5MC1cXHUxYTk5XFx1MWFiMC1cXHUxYWJkXFx1MWFiZi1cXHUxYWNlXFx1MWIwMC1cXHUxYjA0XFx1MWIzNC1cXHUxYjQ0XFx1MWI1MC1cXHUxYjU5XFx1MWI2Yi1cXHUxYjczXFx1MWI4MC1cXHUxYjgyXFx1MWJhMS1cXHUxYmFkXFx1MWJiMC1cXHUxYmI5XFx1MWJlNi1cXHUxYmYzXFx1MWMyNC1cXHUxYzM3XFx1MWM0MC1cXHUxYzQ5XFx1MWM1MC1cXHUxYzU5XFx1MWNkMC1cXHUxY2QyXFx1MWNkNC1cXHUxY2U4XFx1MWNlZFxcdTFjZjRcXHUxY2Y3LVxcdTFjZjlcXHUxZGMwLVxcdTFkZmZcXHUyMDNmXFx1MjA0MFxcdTIwNTRcXHUyMGQwLVxcdTIwZGNcXHUyMGUxXFx1MjBlNS1cXHUyMGYwXFx1MmNlZi1cXHUyY2YxXFx1MmQ3ZlxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTYyMC1cXHVhNjI5XFx1YTY2ZlxcdWE2NzQtXFx1YTY3ZFxcdWE2OWVcXHVhNjlmXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODIzLVxcdWE4MjdcXHVhODJjXFx1YTg4MFxcdWE4ODFcXHVhOGI0LVxcdWE4YzVcXHVhOGQwLVxcdWE4ZDlcXHVhOGUwLVxcdWE4ZjFcXHVhOGZmLVxcdWE5MDlcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTNcXHVhOTgwLVxcdWE5ODNcXHVhOWIzLVxcdWE5YzBcXHVhOWQwLVxcdWE5ZDlcXHVhOWU1XFx1YTlmMC1cXHVhOWY5XFx1YWEyOS1cXHVhYTM2XFx1YWE0M1xcdWFhNGNcXHVhYTRkXFx1YWE1MC1cXHVhYTU5XFx1YWE3Yi1cXHVhYTdkXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWFlYi1cXHVhYWVmXFx1YWFmNVxcdWFhZjZcXHVhYmUzLVxcdWFiZWFcXHVhYmVjXFx1YWJlZFxcdWFiZjAtXFx1YWJmOVxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMmZcXHVmZTMzXFx1ZmUzNFxcdWZlNGQtXFx1ZmU0ZlxcdWZmMTAtXFx1ZmYxOVxcdWZmM2ZcIjtcblxuY29uc3Qgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQgPSBuZXcgUmVnRXhwKFxuICBcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBcIl1cIixcbik7XG5jb25zdCBub25BU0NJSWlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKFxuICBcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBub25BU0NJSWlkZW50aWZpZXJDaGFycyArIFwiXVwiLFxuKTtcblxubm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gbnVsbDtcblxuLy8gVGhlc2UgYXJlIGEgcnVuLWxlbmd0aCBhbmQgb2Zmc2V0LWVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4vLyA+MHhmZmZmIGNvZGUgcG9pbnRzIHRoYXQgYXJlIGEgdmFsaWQgcGFydCBvZiBpZGVudGlmaWVycy4gVGhlXG4vLyBvZmZzZXQgc3RhcnRzIGF0IDB4MTAwMDAsIGFuZCBlYWNoIHBhaXIgb2YgbnVtYmVycyByZXByZXNlbnRzIGFuXG4vLyBvZmZzZXQgdG8gdGhlIG5leHQgcmFuZ2UsIGFuZCB0aGVuIGEgc2l6ZSBvZiB0aGUgcmFuZ2UuIFRoZXkgd2VyZVxuLy8gZ2VuZXJhdGVkIGJ5IGBzY3JpcHRzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuLyogcHJldHRpZXItaWdub3JlICovXG5jb25zdCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcyA9IFswLDExLDIsMjUsMiwxOCwyLDEsMiwxNCwzLDEzLDM1LDEyMiw3MCw1MiwyNjgsMjgsNCw0OCw0OCwzMSwxNCwyOSw2LDM3LDExLDI5LDMsMzUsNSw3LDIsNCw0MywxNTcsMTksMzUsNSwzNSw1LDM5LDksNTEsMTMsMTAsMiwxNCwyLDYsMiwxLDIsMTAsMiwxNCwyLDYsMiwxLDY4LDMxMCwxMCwyMSwxMSw3LDI1LDUsMiw0MSwyLDgsNzAsNSwzLDAsMiw0MywyLDEsNCwwLDMsMjIsMTEsMjIsMTAsMzAsNjYsMTgsMiwxLDExLDIxLDExLDI1LDcxLDU1LDcsMSw2NSwwLDE2LDMsMiwyLDIsMjgsNDMsMjgsNCwyOCwzNiw3LDIsMjcsMjgsNTMsMTEsMjEsMTEsMTgsMTQsMTcsMTExLDcyLDU2LDUwLDE0LDUwLDE0LDM1LDM0OSw0MSw3LDEsNzksMjgsMTEsMCw5LDIxLDQzLDE3LDQ3LDIwLDI4LDIyLDEzLDUyLDU4LDEsMywwLDE0LDQ0LDMzLDI0LDI3LDM1LDMwLDAsMywwLDksMzQsNCwwLDEzLDQ3LDE1LDMsMjIsMCwyLDAsMzYsMTcsMiwyNCwyMCwxLDY0LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMywyMSwyLDMxLDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsMTQsMCw3MiwyNiwzOCw2LDE4Niw0MywxMTcsNjMsMzIsNywzLDAsMyw3LDIsMSwyLDIzLDE2LDAsMiwwLDk1LDcsMywzOCwxNywwLDIsMCwyOSwwLDExLDM5LDgsMCwyMiwwLDEyLDQ1LDIwLDAsMTksNzIsMjY0LDgsMiwzNiwxOCwwLDUwLDI5LDExMyw2LDIsMSwyLDM3LDIyLDAsMjYsNSwyLDEsMiwzMSwxNSwwLDMyOCwxOCwxNiwwLDIsMTIsMiwzMywxMjUsMCw4MCw5MjEsMTAzLDExMCwxOCwxOTUsMjYzNyw5NiwxNiwxMDcxLDE4LDUsNDAyNiw1ODIsODYzNCw1NjgsOCwzMCwxOCw3OCwxOCwyOSwxOSw0NywxNywzLDMyLDIwLDYsMTgsNjg5LDYzLDEyOSw3NCw2LDAsNjcsMTIsNjUsMSwyLDAsMjksNjEzNSw5LDEyMzcsNDMsOCw4OTM2LDMsMiw2LDIsMSwyLDI5MCwxNiwwLDMwLDIsMywwLDE1LDMsOSwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsMTg0NSwzMCw3LDUsMjYyLDYxLDE0Nyw0NCwxMSw2LDE3LDAsMzIyLDI5LDE5LDQzLDQ4NSwyNyw3NTcsNiwyLDMsMiwxLDIsMTQsMiwxOTYsNjAsNjcsOCwwLDEyMDUsMywyLDI2LDIsMSwyLDAsMywwLDIsOSwyLDMsMiwwLDIsMCw3LDAsNSwwLDIsMCwyLDAsMiwyLDIsMSwyLDAsMywwLDIsMCwyLDAsMiwwLDIsMCwyLDEsMiwwLDMsMywyLDYsMiwzLDIsMywyLDAsMiw5LDIsMTYsNiwyLDIsNCwyLDE2LDQ0MjEsNDI3MTksMzMsNDE1Myw3LDIyMSwzLDU3NjEsMTUsNzQ3MiwzMTA0LDU0MSwxNTA3LDQ5MzgsNiw0MTkxXTtcbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3QgYXN0cmFsSWRlbnRpZmllckNvZGVzID0gWzUwOSwwLDIyNywwLDE1MCw0LDI5NCw5LDEzNjgsMiwyLDEsNiwzLDQxLDIsNSwwLDE2NiwxLDU3NCwzLDksOSwzNzAsMSw4MSwyLDcxLDEwLDUwLDMsMTIzLDIsNTQsMTQsMzIsMTAsMywxLDExLDMsNDYsMTAsOCwwLDQ2LDksNywyLDM3LDEzLDIsOSw2LDEsNDUsMCwxMywyLDQ5LDEzLDksMywyLDExLDgzLDExLDcsMCwzLDAsMTU4LDExLDYsOSw3LDMsNTYsMSwyLDYsMywxLDMsMiwxMCwwLDExLDEsMyw2LDQsNCwxOTMsMTcsMTAsOSw1LDAsODIsMTksMTMsOSwyMTQsNiwzLDgsMjgsMSw4MywxNiwxNiw5LDgyLDEyLDksOSw4NCwxNCw1LDksMjQzLDE0LDE2Niw5LDcxLDUsMiwxLDMsMywyLDAsMiwxLDEzLDksMTIwLDYsMyw2LDQsMCwyOSw5LDQxLDYsMiwzLDksMCwxMCwxMCw0NywxNSw0MDYsNywyLDcsMTcsOSw1NywyMSwyLDEzLDEyMyw1LDQsMCwyLDEsMiw2LDIsMCw5LDksNDksNCwyLDEsMiw0LDksOSwzMzAsMywxMCwxLDIsMCw0OSw2LDQsNCwxNCw5LDUzNTEsMCw3LDE0LDEzODM1LDksODcsOSwzOSw0LDYwLDYsMjYsOSwxMDE0LDAsMiw1NCw4LDMsODIsMCwxMiwxLDE5NjI4LDEsNDcwNiw0NSwzLDIyLDU0Myw0LDQsNSw5LDcsMyw2LDMxLDMsMTQ5LDIsMTQxOCw0OSw1MTMsNTQsNSw0OSw5LDAsMTUsMCwyMyw0LDIsMTQsMTM2MSw2LDIsMTYsMyw2LDIsMSwyLDQsMTAxLDAsMTYxLDYsMTAsOSwzNTcsMCw2MiwxMyw0OTksMTMsOTgzLDYsMTEwLDYsNiw5LDQ3NTksOSw3ODc3MTksMjM5XTtcblxuLy8gVGhpcyBoYXMgYSBjb21wbGV4aXR5IGxpbmVhciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGUuIFRoZVxuLy8gYXNzdW1wdGlvbiBpcyB0aGF0IGxvb2tpbmcgdXAgYXN0cmFsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBpc1xuLy8gcmFyZS5cbmZ1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZTogbnVtYmVyLCBzZXQ6IHJlYWRvbmx5IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIGxldCBwb3MgPSAweDEwMDAwO1xuICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gc2V0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7XG4gICAgcG9zICs9IHNldFtpXTtcbiAgICBpZiAocG9zID4gY29kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcG9zICs9IHNldFtpICsgMV07XG4gICAgaWYgKHBvcyA+PSBjb2RlKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLnVwcGVyY2FzZUEpIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMuZG9sbGFyU2lnbjtcbiAgaWYgKGNvZGUgPD0gY2hhckNvZGVzLnVwcGVyY2FzZVopIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy5sb3dlcmNhc2VBKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLnVuZGVyc2NvcmU7XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy5sb3dlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPD0gMHhmZmZmKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvZGUgPj0gMHhhYSAmJiBub25BU0NJSWlkZW50aWZpZXJTdGFydC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2Rlcyk7XG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyBwYXJ0IG9mIGFuIGlkZW50aWZpZXIuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWZpZXJDaGFyKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy5kaWdpdDApIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMuZG9sbGFyU2lnbjtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMuY29sb24pIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMubG93ZXJjYXNlQSkgcmV0dXJuIGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMubG93ZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikge1xuICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzKSB8fFxuICAgIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllckNvZGVzKVxuICApO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWVcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpZmllck5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21hc3Rlcjp2OC9zcmMvYnVpbHRpbnMvYnVpbHRpbnMtc3RyaW5nLWdlbi5jYztsPTE0NTU7ZHJjPTIyMWUzMzFiNDlkZmVmYWRiYzZmYTQwYjBjNjhlNmY5NzYwNmQwYjM7YnB2PTA7YnB0PTFcbiAgICAvLyBXZSByZWltcGxlbWVudCBgY29kZVBvaW50QXRgIGJlY2F1c2UgYGNvZGVQb2ludEF0YCBpcyBhIFY4IGJ1aWx0aW4gd2hpY2ggaXMgbm90IGlubGluZWQgYnkgVHVyYm9GYW4gKGFzIG9mIE05MSlcbiAgICAvLyBzaW5jZSBgbmFtZWAgaXMgbW9zdGx5IEFTQ0lJLCBhbiBpbmxpbmVkIGBjaGFyQ29kZUF0YCB3aW5zIGhlcmVcbiAgICBsZXQgY3AgPSBuYW1lLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKChjcCAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiBpICsgMSA8IG5hbWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0cmFpbCA9IG5hbWUuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgaWYgKCh0cmFpbCAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjcCA9IDB4MTAwMDAgKyAoKGNwICYgMHgzZmYpIDw8IDEwKSArICh0cmFpbCAmIDB4M2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICAgIGlmICghaXNJZGVudGlmaWVyU3RhcnQoY3ApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc0lkZW50aWZpZXJDaGFyKGNwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gIWlzRmlyc3Q7XG59XG4iLCAiY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAga2V5d29yZDogW1xuICAgIFwiYnJlYWtcIixcbiAgICBcImNhc2VcIixcbiAgICBcImNhdGNoXCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiZGVidWdnZXJcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRvXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJmaW5hbGx5XCIsXG4gICAgXCJmb3JcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJpZlwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInRocm93XCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInZhclwiLFxuICAgIFwiY29uc3RcIixcbiAgICBcIndoaWxlXCIsXG4gICAgXCJ3aXRoXCIsXG4gICAgXCJuZXdcIixcbiAgICBcInRoaXNcIixcbiAgICBcInN1cGVyXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiZXh0ZW5kc1wiLFxuICAgIFwiZXhwb3J0XCIsXG4gICAgXCJpbXBvcnRcIixcbiAgICBcIm51bGxcIixcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJpblwiLFxuICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgIFwidHlwZW9mXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJkZWxldGVcIixcbiAgXSxcbiAgc3RyaWN0OiBbXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcImxldFwiLFxuICAgIFwicGFja2FnZVwiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJwdWJsaWNcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwieWllbGRcIixcbiAgXSxcbiAgc3RyaWN0QmluZDogW1wiZXZhbFwiLCBcImFyZ3VtZW50c1wiXSxcbn07XG5jb25zdCBrZXl3b3JkcyA9IG5ldyBTZXQocmVzZXJ2ZWRXb3Jkcy5rZXl3b3JkKTtcbmNvbnN0IHJlc2VydmVkV29yZHNTdHJpY3RTZXQgPSBuZXcgU2V0KHJlc2VydmVkV29yZHMuc3RyaWN0KTtcbmNvbnN0IHJlc2VydmVkV29yZHNTdHJpY3RCaW5kU2V0ID0gbmV3IFNldChyZXNlcnZlZFdvcmRzLnN0cmljdEJpbmQpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBub24tc3RyaWN0IG1vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZywgaW5Nb2R1bGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChpbk1vZHVsZSAmJiB3b3JkID09PSBcImF3YWl0XCIpIHx8IHdvcmQgPT09IFwiZW51bVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBub24tYmluZGluZyBzdHJpY3QgbW9kZVxuICpcbiAqIEluY2x1ZGVzIG5vbi1zdHJpY3QgcmVzZXJ2ZWQgd29yZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZywgaW5Nb2R1bGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUmVzZXJ2ZWRXb3JkKHdvcmQsIGluTW9kdWxlKSB8fCByZXNlcnZlZFdvcmRzU3RyaWN0U2V0Lmhhcyh3b3JkKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gYmluZGluZyBzdHJpY3QgbW9kZSwgYnV0IGl0IGlzIGFsbG93ZWQgYXNcbiAqIGEgbm9ybWFsIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmRTZXQuaGFzKHdvcmQpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBiaW5kaW5nIHN0cmljdCBtb2RlXG4gKlxuICogSW5jbHVkZXMgbm9uLXN0cmljdCByZXNlcnZlZCB3b3JkcyBhbmQgbm9uLWJpbmRpbmcgc3RyaWN0IHJlc2VydmVkIHdvcmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQoXG4gIHdvcmQ6IHN0cmluZyxcbiAgaW5Nb2R1bGU6IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1N0cmljdFJlc2VydmVkV29yZCh3b3JkLCBpbk1vZHVsZSkgfHwgaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCh3b3JkKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLZXl3b3JkKHdvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5d29yZHMuaGFzKHdvcmQpO1xufVxuIiwgIi8qIGVzbGludCBtYXgtbGVuOiAwICovXG5cbmltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJTdGFydCB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbmV4cG9ydCB7XG4gIGlzSWRlbnRpZmllclN0YXJ0LFxuICBpc0lkZW50aWZpZXJDaGFyLFxuICBpc1Jlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkLFxuICBpc1N0cmljdFJlc2VydmVkV29yZCxcbiAgaXNLZXl3b3JkLFxufSBmcm9tIFwiQGJhYmVsL2hlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllclwiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4vLyBUZXN0IHdoZXRoZXIgYSBjdXJyZW50IHN0YXRlIGNoYXJhY3RlciBjb2RlIGFuZCBuZXh0IGNoYXJhY3RlciBjb2RlIGlzIEBcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlcmF0b3JTdGFydChcbiAgY3VycmVudDogbnVtYmVyLFxuICBuZXh0OiBudW1iZXIsXG4gIG5leHQyOiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdXJyZW50ID09PSBjaGFyQ29kZXMuYXRTaWduICYmXG4gICAgbmV4dCA9PT0gY2hhckNvZGVzLmF0U2lnbiAmJlxuICAgIGlzSWRlbnRpZmllclN0YXJ0KG5leHQyKVxuICApO1xufVxuXG4vLyBUaGlzIGlzIHRoZSBjb21wcmVoZW5zaXZlIHNldCBvZiBKYXZhU2NyaXB0IHJlc2VydmVkIHdvcmRzXG4vLyBJZiBhIHdvcmQgaXMgaW4gdGhpcyBzZXQsIGl0IGNvdWxkIGJlIGEgcmVzZXJ2ZWQgd29yZCxcbi8vIGRlcGVuZGluZyBvbiBzb3VyY2VUeXBlL3N0cmljdE1vZGUvYmluZGluZyBpbmZvLiBJbiBvdGhlciB3b3Jkc1xuLy8gaWYgYSB3b3JkIGlzIG5vdCBpbiB0aGlzIHNldCwgaXQgaXMgbm90IGEgcmVzZXJ2ZWQgd29yZCB1bmRlclxuLy8gYW55IGNpcmN1bXN0YW5jZS5cbmNvbnN0IHJlc2VydmVkV29yZExpa2VTZXQgPSBuZXcgU2V0KFtcbiAgXCJicmVha1wiLFxuICBcImNhc2VcIixcbiAgXCJjYXRjaFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZG9cIixcbiAgXCJlbHNlXCIsXG4gIFwiZmluYWxseVwiLFxuICBcImZvclwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwiaWZcIixcbiAgXCJyZXR1cm5cIixcbiAgXCJzd2l0Y2hcIixcbiAgXCJ0aHJvd1wiLFxuICBcInRyeVwiLFxuICBcInZhclwiLFxuICBcImNvbnN0XCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aXRoXCIsXG4gIFwibmV3XCIsXG4gIFwidGhpc1wiLFxuICBcInN1cGVyXCIsXG4gIFwiY2xhc3NcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZXhwb3J0XCIsXG4gIFwiaW1wb3J0XCIsXG4gIFwibnVsbFwiLFxuICBcInRydWVcIixcbiAgXCJmYWxzZVwiLFxuICBcImluXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcInR5cGVvZlwiLFxuICBcInZvaWRcIixcbiAgXCJkZWxldGVcIixcbiAgLy8gc3RyaWN0XG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxldFwiLFxuICBcInBhY2thZ2VcIixcbiAgXCJwcml2YXRlXCIsXG4gIFwicHJvdGVjdGVkXCIsXG4gIFwicHVibGljXCIsXG4gIFwic3RhdGljXCIsXG4gIFwieWllbGRcIixcbiAgLy8gc3RyaWN0QmluZFxuICBcImV2YWxcIixcbiAgXCJhcmd1bWVudHNcIixcbiAgLy8gcmVzZXJ2ZWRXb3JrTGlrZVxuICBcImVudW1cIixcbiAgXCJhd2FpdFwiLFxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW5CZVJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc2VydmVkV29yZExpa2VTZXQuaGFzKHdvcmQpO1xufVxuIiwgIi8vIEVhY2ggc2NvcGUgZ2V0cyBhIGJpdHNldCB0aGF0IG1heSBjb250YWluIHRoZXNlIGZsYWdzXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCBjb25zdCBTQ09QRV9PVEhFUiAgICAgICAgPSAwYjAwMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9QUk9HUkFNICAgICAgPSAwYjAwMDAwMDAwMSxcbiAgICAgICAgICAgICBTQ09QRV9GVU5DVElPTiAgICAgPSAwYjAwMDAwMDAxMCxcbiAgICAgICAgICAgICBTQ09QRV9BUlJPVyAgICAgICAgPSAwYjAwMDAwMDEwMCxcbiAgICAgICAgICAgICBTQ09QRV9TSU1QTEVfQ0FUQ0ggPSAwYjAwMDAwMTAwMCxcbiAgICAgICAgICAgICBTQ09QRV9TVVBFUiAgICAgICAgPSAwYjAwMDAxMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9ESVJFQ1RfU1VQRVIgPSAwYjAwMDEwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9DTEFTUyAgICAgICAgPSAwYjAwMTAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9TVEFUSUNfQkxPQ0sgPSAwYjAxMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9UU19NT0RVTEUgICAgPSAwYjEwMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9WQVIgPSBTQ09QRV9QUk9HUkFNIHwgU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9TVEFUSUNfQkxPQ0sgfCBTQ09QRV9UU19NT0RVTEU7XG5cbmV4cG9ydCB0eXBlIFNjb3BlRmxhZ3MgPVxuICB8IHR5cGVvZiBTQ09QRV9PVEhFUlxuICB8IHR5cGVvZiBTQ09QRV9QUk9HUkFNXG4gIHwgdHlwZW9mIFNDT1BFX0ZVTkNUSU9OXG4gIHwgdHlwZW9mIFNDT1BFX1ZBUlxuICB8IHR5cGVvZiBTQ09QRV9BUlJPV1xuICB8IHR5cGVvZiBTQ09QRV9TSU1QTEVfQ0FUQ0hcbiAgfCB0eXBlb2YgU0NPUEVfU1VQRVJcbiAgfCB0eXBlb2YgU0NPUEVfRElSRUNUX1NVUEVSXG4gIHwgdHlwZW9mIFNDT1BFX0NMQVNTXG4gIHwgdHlwZW9mIFNDT1BFX1NUQVRJQ19CTE9DSztcblxuLy8gVGhlc2UgZmxhZ3MgYXJlIG1lYW50IHRvIGJlIF9vbmx5XyB1c2VkIGluc2lkZSB0aGUgU2NvcGUgY2xhc3MgKG9yIHN1YmNsYXNzZXMpLlxuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgY29uc3QgQklORF9LSU5EX1ZBTFVFICAgICAgICAgICAgPSAwYjAwMDAwMDBfMDAwMF8wMSxcbiAgICAgICAgICAgICBCSU5EX0tJTkRfVFlQRSAgICAgICAgICAgICA9IDBiMDAwMDAwMF8wMDAwXzEwLFxuICAgICAgICAgICAgIC8vIFVzZWQgaW4gY2hlY2tMVmFsIGFuZCBkZWNsYXJlTmFtZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYSBiaW5kaW5nXG4gICAgICAgICAgICAgQklORF9TQ09QRV9WQVIgICAgICAgICAgICAgPSAwYjAwMDAwMDBfMDAwMV8wMCwgLy8gVmFyLXN0eWxlIGJpbmRpbmdcbiAgICAgICAgICAgICBCSU5EX1NDT1BFX0xFWElDQUwgICAgICAgICA9IDBiMDAwMDAwMF8wMDEwXzAwLCAvLyBMZXQtIG9yIGNvbnN0LXN0eWxlIGJpbmRpbmdcbiAgICAgICAgICAgICBCSU5EX1NDT1BFX0ZVTkNUSU9OICAgICAgICA9IDBiMDAwMDAwMF8wMTAwXzAwLCAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgICAgICAgIEJJTkRfU0NPUEVfT1VUU0lERSAgICAgICAgID0gMGIwMDAwMDAwXzEwMDBfMDAsIC8vIFNwZWNpYWwgY2FzZSBmb3IgZnVuY3Rpb24gbmFtZXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kIGluc2lkZSB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAvLyBNaXNjIGZsYWdzXG4gICAgICAgICAgICAgQklORF9GTEFHU19OT05FICAgICAgICAgICAgPSAwYjAwMDAwMDAxXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19DTEFTUyAgICAgICAgICAgPSAwYjAwMDAwMDEwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19FTlVNICAgICAgICAgPSAwYjAwMDAwMTAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19DT05TVF9FTlVNICAgPSAwYjAwMDAxMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19FWFBPUlRfT05MWSAgPSAwYjAwMDEwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19GTE9XX0RFQ0xBUkVfRk4gPSAwYjAwMTAwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19JTVBPUlQgICAgICAgPSAwYjAxMDAwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgLy8gV2hldGhlciBcImxldFwiIHNob3VsZCBiZSBhbGxvd2VkIGluIGJvdW5kIG5hbWVzIGluIHNsb3BweSBtb2RlXG4gICAgICAgICAgICAgQklORF9GTEFHU19OT19MRVRfSU5fTEVYSUNBTCA9IDBiMTAwMDAwMDBfMDAwMF8wMDtcblxuLy8gVGhlc2UgZmxhZ3MgYXJlIG1lYW50IHRvIGJlIF9vbmx5XyB1c2VkIGJ5IFNjb3BlIGNvbnN1bWVyc1xuLy8gcHJldHRpZXItaWdub3JlXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgaXMgdmFsdWU/ICAgIHwgICAgaXMgdHlwZT8gICAgfCAgICAgIHNjb3BlICAgICAgICAgIHwgICAgbWlzYyBmbGFncyAgICAqL1xuZXhwb3J0IGNvbnN0IEJJTkRfQ0xBU1MgICAgICAgICA9IEJJTkRfS0lORF9WQUxVRSB8IEJJTkRfS0lORF9UWVBFIHwgQklORF9TQ09QRV9MRVhJQ0FMICB8IEJJTkRfRkxBR1NfQ0xBU1N8QklORF9GTEFHU19OT19MRVRfSU5fTEVYSUNBTCxcbiAgICAgICAgICAgICBCSU5EX0xFWElDQUwgICAgICAgPSBCSU5EX0tJTkRfVkFMVUUgfCAwICAgICAgICAgICAgICB8IEJJTkRfU0NPUEVfTEVYSUNBTCAgfCBCSU5EX0ZMQUdTX05PX0xFVF9JTl9MRVhJQ0FMLFxuICAgICAgICAgICAgIEJJTkRfQ0FUQ0hfUEFSQU0gICA9IEJJTkRfS0lORF9WQUxVRSB8IDAgICAgICAgICAgICAgIHwgQklORF9TQ09QRV9MRVhJQ0FMICB8IDAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICBCSU5EX1ZBUiAgICAgICAgICAgPSBCSU5EX0tJTkRfVkFMVUUgfCAwICAgICAgICAgICAgICB8IEJJTkRfU0NPUEVfVkFSICAgICAgfCAwICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgQklORF9GVU5DVElPTiAgICAgID0gQklORF9LSU5EX1ZBTFVFIHwgMCAgICAgICAgICAgICAgfCBCSU5EX1NDT1BFX0ZVTkNUSU9OIHwgMCAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfVFNfSU5URVJGQUNFICA9IDAgICAgICAgICAgICAgICB8IEJJTkRfS0lORF9UWVBFIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfQ0xBU1MgICxcbiAgICAgICAgICAgICBCSU5EX1RTX1RZUEUgICAgICAgPSAwICAgICAgICAgICAgICAgfCBCSU5EX0tJTkRfVFlQRSB8IDAgICAgICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgQklORF9UU19FTlVNICAgICAgID0gQklORF9LSU5EX1ZBTFVFIHwgQklORF9LSU5EX1RZUEUgfCBCSU5EX1NDT1BFX0xFWElDQUwgIHwgQklORF9GTEFHU19UU19FTlVNfEJJTkRfRkxBR1NfTk9fTEVUX0lOX0xFWElDQUwsXG4gICAgICAgICAgICAgQklORF9UU19BTUJJRU5UICAgID0gMCAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZLFxuICAgICAgICAgICAgIC8vIFRoZXNlIGJpbmRpbmdzIGRvbid0IGludHJvZHVjZSBhbnl0aGluZyBpbiB0aGUgc2NvcGUuIFRoZXkgYXJlIHVzZWQgZm9yIGFzc2lnbm1lbnRzIGFuZFxuICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zIElEcy5cbiAgICAgICAgICAgICBCSU5EX05PTkUgICAgICAgICAgPSAwICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgfCBCSU5EX0ZMQUdTX05PTkUgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfT1VUU0lERSAgICAgICA9IEJJTkRfS0lORF9WQUxVRSB8IDAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfTk9ORSAgICAgICAgICAsXG5cbiAgICAgICAgICAgICBCSU5EX1RTX0NPTlNUX0VOVU0gPSBCSU5EX1RTX0VOVU0gICAgfCBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfVFNfTkFNRVNQQUNFICA9IDAgICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfVFNfRVhQT1JUX09OTFksXG4gICAgICAgICAgICAgQklORF9UU19UWVBFX0lNUE9SVD0gMCAgICAgICAgICAgICAgIHwgQklORF9LSU5EX1RZUEUgfCAwICAgICAgICAgICAgICAgICAgIHwgQklORF9GTEFHU19UU19JTVBPUlQgICAgICxcblxuICAgICAgICAgICAgIEJJTkRfRkxPV19ERUNMQVJFX0ZOID0gQklORF9GTEFHU19GTE9XX0RFQ0xBUkVfRk47XG5cbmV4cG9ydCB0eXBlIEJpbmRpbmdUeXBlcyA9XG4gIHwgdHlwZW9mIEJJTkRfTk9ORVxuICB8IHR5cGVvZiBCSU5EX09VVFNJREVcbiAgfCB0eXBlb2YgQklORF9WQVJcbiAgfCB0eXBlb2YgQklORF9MRVhJQ0FMXG4gIHwgdHlwZW9mIEJJTkRfQ0xBU1NcbiAgfCB0eXBlb2YgQklORF9GVU5DVElPTlxuICB8IHR5cGVvZiBCSU5EX1RTX0lOVEVSRkFDRVxuICB8IHR5cGVvZiBCSU5EX1RTX1RZUEVcbiAgfCB0eXBlb2YgQklORF9UU19FTlVNXG4gIHwgdHlwZW9mIEJJTkRfVFNfQU1CSUVOVFxuICB8IHR5cGVvZiBCSU5EX1RTX05BTUVTUEFDRTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgY29uc3QgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQyA9IDBiMV8wMCxcbiAgICAgICAgICAgICBDTEFTU19FTEVNRU5UX0tJTkRfR0VUVEVSID0gMGIwXzEwLFxuICAgICAgICAgICAgIENMQVNTX0VMRU1FTlRfS0lORF9TRVRURVIgPSAwYjBfMDEsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9LSU5EX0FDQ0VTU09SID0gQ0xBU1NfRUxFTUVOVF9LSU5EX0dFVFRFUiB8IENMQVNTX0VMRU1FTlRfS0lORF9TRVRURVI7XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IGNvbnN0IENMQVNTX0VMRU1FTlRfU1RBVElDX0dFVFRFUiAgID0gQ0xBU1NfRUxFTUVOVF9LSU5EX0dFVFRFUiB8IENMQVNTX0VMRU1FTlRfRkxBR19TVEFUSUMsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSICAgPSBDTEFTU19FTEVNRU5UX0tJTkRfU0VUVEVSIHwgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQyxcbiAgICAgICAgICAgICBDTEFTU19FTEVNRU5UX0lOU1RBTkNFX0dFVFRFUiA9IENMQVNTX0VMRU1FTlRfS0lORF9HRVRURVIsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9TRVRURVIgPSBDTEFTU19FTEVNRU5UX0tJTkRfU0VUVEVSLFxuICAgICAgICAgICAgIENMQVNTX0VMRU1FTlRfT1RIRVIgICAgICAgICAgID0gMDtcblxuZXhwb3J0IHR5cGUgQ2xhc3NFbGVtZW50VHlwZXMgPVxuICB8IHR5cGVvZiBDTEFTU19FTEVNRU5UX1NUQVRJQ19HRVRURVJcbiAgfCB0eXBlb2YgQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfR0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfU0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfT1RIRVI7XG4iLCAiaW1wb3J0IHtcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0RJUkVDVF9TVVBFUixcbiAgU0NPUEVfRlVOQ1RJT04sXG4gIFNDT1BFX1NJTVBMRV9DQVRDSCxcbiAgU0NPUEVfU1VQRVIsXG4gIFNDT1BFX1BST0dSQU0sXG4gIFNDT1BFX1ZBUixcbiAgU0NPUEVfQ0xBU1MsXG4gIFNDT1BFX1NUQVRJQ19CTE9DSyxcbiAgQklORF9TQ09QRV9GVU5DVElPTixcbiAgQklORF9TQ09QRV9WQVIsXG4gIEJJTkRfU0NPUEVfTEVYSUNBTCxcbiAgQklORF9LSU5EX1ZBTFVFLFxuICB0eXBlIFNjb3BlRmxhZ3MsXG4gIHR5cGUgQmluZGluZ1R5cGVzLFxufSBmcm9tIFwiLi9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vbG9jYXRpb25cIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgVG9rZW5pemVyIGZyb20gXCIuLi90b2tlbml6ZXJcIjtcblxuLy8gU3RhcnQgYW4gQVNUIG5vZGUsIGF0dGFjaGluZyBhIHN0YXJ0IG9mZnNldC5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGRlY2xhcmUgZmxhZ3M6IFNjb3BlRmxhZ3M7XG4gIC8vIEEgc2V0IG9mIHZhci1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIHZhcjogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8vIEEgc2V0IG9mIGxleGljYWxseS1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIGxleGljYWw6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvLyBBIHNldCBvZiBsZXhpY2FsbHktZGVjbGFyZWQgRnVuY3Rpb25EZWNsYXJhdGlvbiBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIGZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoZmxhZ3M6IFNjb3BlRmxhZ3MpIHtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIH1cbn1cblxuLy8gVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBrZWVwIHRyYWNrIG9mIGRlY2xhcmVkIHZhcmlhYmxlcyBpbiB0aGVcbi8vIGN1cnJlbnQgc2NvcGUgaW4gb3JkZXIgdG8gZGV0ZWN0IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcy5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3BlSGFuZGxlcjxJU2NvcGUgZXh0ZW5kcyBTY29wZSA9IFNjb3BlPiB7XG4gIHBhcnNlcjogVG9rZW5pemVyO1xuICBzY29wZVN0YWNrOiBBcnJheTxJU2NvcGU+ID0gW107XG4gIGluTW9kdWxlOiBib29sZWFuO1xuICB1bmRlZmluZWRFeHBvcnRzOiBNYXA8c3RyaW5nLCBQb3NpdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocGFyc2VyOiBUb2tlbml6ZXIsIGluTW9kdWxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5pbk1vZHVsZSA9IGluTW9kdWxlO1xuICB9XG5cbiAgZ2V0IGluVG9wTGV2ZWwoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRTY29wZSgpLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkgPiAwO1xuICB9XG4gIGdldCBpbkZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGVGbGFncygpICYgU0NPUEVfRlVOQ1RJT04pID4gMDtcbiAgfVxuICBnZXQgYWxsb3dTdXBlcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFRoaXNTY29wZUZsYWdzKCkgJiBTQ09QRV9TVVBFUikgPiAwO1xuICB9XG4gIGdldCBhbGxvd0RpcmVjdFN1cGVyKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwO1xuICB9XG4gIGdldCBpbkNsYXNzKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0NMQVNTKSA+IDA7XG4gIH1cbiAgZ2V0IGluQ2xhc3NBbmROb3RJbk5vbkFycm93RnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLmN1cnJlbnRUaGlzU2NvcGVGbGFncygpO1xuICAgIHJldHVybiAoZmxhZ3MgJiBTQ09QRV9DTEFTUykgPiAwICYmIChmbGFncyAmIFNDT1BFX0ZVTkNUSU9OKSA9PT0gMDtcbiAgfVxuICBnZXQgaW5TdGF0aWNCbG9jaygpIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IDsgaS0tKSB7XG4gICAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICBpZiAoZmxhZ3MgJiBTQ09QRV9TVEFUSUNfQkxPQ0spIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZ3MgJiAoU0NPUEVfVkFSIHwgU0NPUEVfQ0xBU1MpKSB7XG4gICAgICAgIC8vIGZ1bmN0aW9uIGJvZHksIG1vZHVsZSBib2R5LCBjbGFzcyBwcm9wZXJ0eSBpbml0aWFsaXplcnNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgaW5Ob25BcnJvd0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0ZVTkNUSU9OKSA+IDA7XG4gIH1cbiAgZ2V0IHRyZWF0RnVuY3Rpb25zQXNWYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodGhpcy5jdXJyZW50U2NvcGUoKSk7XG4gIH1cblxuICBjcmVhdGVTY29wZShmbGFnczogU2NvcGVGbGFncyk6IFNjb3BlIHtcbiAgICByZXR1cm4gbmV3IFNjb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGVudGVyKGZsYWdzOiBTY29wZUZsYWdzKSB7XG4gICAgLyo6OiArY3JlYXRlU2NvcGU6IChmbGFnczogU2NvcGVGbGFncykgPT4gSVNjb3BlOyAqL1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBtZXRob2Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gICAgdGhpcy5zY29wZVN0YWNrLnB1c2godGhpcy5jcmVhdGVTY29wZShmbGFncykpO1xuICB9XG5cbiAgZXhpdCgpOiBTY29wZUZsYWdzIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gc2NvcGUuZmxhZ3M7XG4gIH1cblxuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyA+IEF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmdW5jdGlvbiwgb3Igc2NyaXB0LCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlXG4gIC8vID4gdHJlYXRlZCBsaWtlIHZhciBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gbGlrZSBsZXhpY2FsIGRlY2xhcmF0aW9ucy5cbiAgdHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUoc2NvcGU6IElTY29wZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHNjb3BlLmZsYWdzICYgKFNDT1BFX0ZVTkNUSU9OIHwgU0NPUEVfU1RBVElDX0JMT0NLKSB8fFxuICAgICAgKCF0aGlzLnBhcnNlci5pbk1vZHVsZSAmJiBzY29wZS5mbGFncyAmIFNDT1BFX1BST0dSQU0pXG4gICAgKTtcbiAgfVxuXG4gIGRlY2xhcmVOYW1lKG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcywgbG9jOiBQb3NpdGlvbikge1xuICAgIGxldCBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlKCk7XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9MRVhJQ0FMIHx8IGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9GVU5DVElPTikge1xuICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcblxuICAgICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9GVU5DVElPTikge1xuICAgICAgICBzY29wZS5mdW5jdGlvbnMuYWRkKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NvcGUubGV4aWNhbC5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfU0NPUEVfTEVYSUNBTCkge1xuICAgICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfU0NPUEVfVkFSKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgICB0aGlzLmNoZWNrUmVkZWNsYXJhdGlvbkluU2NvcGUoc2NvcGUsIG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuICAgICAgICBzY29wZS52YXIuYWRkKG5hbWUpO1xuICAgICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGFyc2VyLmluTW9kdWxlICYmIHNjb3BlLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICBtYXliZUV4cG9ydERlZmluZWQoc2NvcGU6IElTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFyc2VyLmluTW9kdWxlICYmIHNjb3BlLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICBjaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKFxuICAgIHNjb3BlOiBJU2NvcGUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMsXG4gICAgbG9jOiBQb3NpdGlvbixcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuVmFyUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICBhdDogbG9jLFxuICAgICAgICBpZGVudGlmaWVyTmFtZTogbmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVkZWNsYXJlZEluU2NvcGUoXG4gICAgc2NvcGU6IElTY29wZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcyxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCEoYmluZGluZ1R5cGUgJiBCSU5EX0tJTkRfVkFMVUUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX1NDT1BFX0xFWElDQUwpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNjb3BlLmxleGljYWwuaGFzKG5hbWUpIHx8XG4gICAgICAgIHNjb3BlLmZ1bmN0aW9ucy5oYXMobmFtZSkgfHxcbiAgICAgICAgc2NvcGUudmFyLmhhcyhuYW1lKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX1NDT1BFX0ZVTkNUSU9OKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzY29wZS5sZXhpY2FsLmhhcyhuYW1lKSB8fFxuICAgICAgICAoIXRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUoc2NvcGUpICYmIHNjb3BlLnZhci5oYXMobmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAoc2NvcGUubGV4aWNhbC5oYXMobmFtZSkgJiZcbiAgICAgICAgLy8gQW5uZXggQi4zLjRcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy12YXJpYWJsZXN0YXRlbWVudHMtaW4tY2F0Y2gtYmxvY2tzXG4gICAgICAgICEoXG4gICAgICAgICAgc2NvcGUuZmxhZ3MgJiBTQ09QRV9TSU1QTEVfQ0FUQ0ggJiZcbiAgICAgICAgICBzY29wZS5sZXhpY2FsLnZhbHVlcygpLm5leHQoKS52YWx1ZSA9PT0gbmFtZVxuICAgICAgICApKSB8fFxuICAgICAgKCF0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHNjb3BlKSAmJiBzY29wZS5mdW5jdGlvbnMuaGFzKG5hbWUpKVxuICAgICk7XG4gIH1cblxuICBjaGVja0xvY2FsRXhwb3J0KGlkOiBOLklkZW50aWZpZXIpIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGlkO1xuICAgIGNvbnN0IHRvcExldmVsU2NvcGUgPSB0aGlzLnNjb3BlU3RhY2tbMF07XG4gICAgaWYgKFxuICAgICAgIXRvcExldmVsU2NvcGUubGV4aWNhbC5oYXMobmFtZSkgJiZcbiAgICAgICF0b3BMZXZlbFNjb3BlLnZhci5oYXMobmFtZSkgJiZcbiAgICAgIC8vIEluIHN0cmljdCBtb2RlLCBzY29wZS5mdW5jdGlvbnMgd2lsbCBhbHdheXMgYmUgZW1wdHkuXG4gICAgICAvLyBNb2R1bGVzIGFyZSBzdHJpY3QgYnkgZGVmYXVsdCwgYnV0IHRoZSBgc2NyaXB0TW9kZWAgb3B0aW9uXG4gICAgICAvLyBjYW4gb3ZlcndyaXRlIHRoaXMgYmVoYXZpb3IuXG4gICAgICAhdG9wTGV2ZWxTY29wZS5mdW5jdGlvbnMuaGFzKG5hbWUpXG4gICAgKSB7XG4gICAgICB0aGlzLnVuZGVmaW5lZEV4cG9ydHMuc2V0KG5hbWUsIGlkLmxvYy5zdGFydCk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFNjb3BlKCk6IElTY29wZSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGVTdGFja1t0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBjdXJyZW50VmFyU2NvcGVGbGFncygpOiBTY29wZUZsYWdzIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IDsgaS0tKSB7XG4gICAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICBpZiAoZmxhZ3MgJiBTQ09QRV9WQVIpIHtcbiAgICAgICAgcmV0dXJuIGZsYWdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvdWxkIGJlIHVzZWZ1bCBmb3IgYGFyZ3VtZW50c2AsIGB0aGlzYCwgYG5ldy50YXJnZXRgLCBgc3VwZXIoKWAsIGBzdXBlci5wcm9wZXJ0eWAsIGFuZCBgc3VwZXJbcHJvcGVydHldYC5cbiAgY3VycmVudFRoaXNTY29wZUZsYWdzKCk6IFNjb3BlRmxhZ3Mge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgOyBpLS0pIHtcbiAgICAgIGNvbnN0IHsgZmxhZ3MgfSA9IHRoaXMuc2NvcGVTdGFja1tpXTtcbiAgICAgIGlmIChmbGFncyAmIChTQ09QRV9WQVIgfCBTQ09QRV9DTEFTUykgJiYgIShmbGFncyAmIFNDT1BFX0FSUk9XKSkge1xuICAgICAgICByZXR1cm4gZmxhZ3M7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgU2NvcGVIYW5kbGVyLCB7IFNjb3BlIH0gZnJvbSBcIi4uLy4uL3V0aWwvc2NvcGVcIjtcbmltcG9ydCB7XG4gIEJJTkRfRkxBR1NfRkxPV19ERUNMQVJFX0ZOLFxuICB0eXBlIFNjb3BlRmxhZ3MsXG4gIHR5cGUgQmluZGluZ1R5cGVzLFxufSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8vIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvYmxvYi8yM2FlYjJhMmVmNmViNDI0MWNlMTc4ZmRlNWQ4ZjE3YzVmNzQ3ZmI1L3NyYy90eXBpbmcvZW52Lm1sI0w1MzYtTDU4NFxuY2xhc3MgRmxvd1Njb3BlIGV4dGVuZHMgU2NvcGUge1xuICAvLyBkZWNsYXJlIGZ1bmN0aW9uIGZvbygpOiB0eXBlO1xuICBkZWNsYXJlRnVuY3Rpb25zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxvd1Njb3BlSGFuZGxlciBleHRlbmRzIFNjb3BlSGFuZGxlcjxGbG93U2NvcGU+IHtcbiAgY3JlYXRlU2NvcGUoZmxhZ3M6IFNjb3BlRmxhZ3MpOiBGbG93U2NvcGUge1xuICAgIHJldHVybiBuZXcgRmxvd1Njb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGRlY2xhcmVOYW1lKG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcywgbG9jOiBQb3NpdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX0ZMT1dfREVDTEFSRV9GTikge1xuICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcbiAgICAgIHRoaXMubWF5YmVFeHBvcnREZWZpbmVkKHNjb3BlLCBuYW1lKTtcbiAgICAgIHNjb3BlLmRlY2xhcmVGdW5jdGlvbnMuYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmRlY2xhcmVOYW1lKG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuICB9XG5cbiAgaXNSZWRlY2xhcmVkSW5TY29wZShcbiAgICBzY29wZTogRmxvd1Njb3BlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc3VwZXIuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfRkxPV19ERUNMQVJFX0ZOKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhc2NvcGUuZGVjbGFyZUZ1bmN0aW9ucy5oYXMobmFtZSkgJiZcbiAgICAgICAgKHNjb3BlLmxleGljYWwuaGFzKG5hbWUpIHx8IHNjb3BlLmZ1bmN0aW9ucy5oYXMobmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoZWNrTG9jYWxFeHBvcnQoaWQ6IE4uSWRlbnRpZmllcikge1xuICAgIGlmICghdGhpcy5zY29wZVN0YWNrWzBdLmRlY2xhcmVGdW5jdGlvbnMuaGFzKGlkLm5hbWUpKSB7XG4gICAgICBzdXBlci5jaGVja0xvY2FsRXhwb3J0KGlkKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5zTWFwIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIFNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9zY29wZVwiO1xuaW1wb3J0IHR5cGUgRXhwcmVzc2lvblNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgdHlwZSBDbGFzc1Njb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9jbGFzcy1zY29wZVwiO1xuaW1wb3J0IHR5cGUgUHJvZHVjdGlvblBhcmFtZXRlckhhbmRsZXIgZnJvbSBcIi4uL3V0aWwvcHJvZHVjdGlvbi1wYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VyUGx1Z2luV2l0aE9wdGlvbnMsXG4gIFBsdWdpbkNvbmZpZyxcbiAgUGx1Z2luT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGluZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVBhcnNlciB7XG4gIC8vIFByb3BlcnRpZXMgc2V0IGJ5IGNvbnN0cnVjdG9yIGluIGluZGV4LmpzXG4gIGRlY2xhcmUgb3B0aW9uczogT3B0aW9ucztcbiAgZGVjbGFyZSBpbk1vZHVsZTogYm9vbGVhbjtcbiAgZGVjbGFyZSBzY29wZTogU2NvcGVIYW5kbGVyPGFueT47XG4gIGRlY2xhcmUgY2xhc3NTY29wZTogQ2xhc3NTY29wZUhhbmRsZXI7XG4gIGRlY2xhcmUgcHJvZFBhcmFtOiBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlcjtcbiAgZGVjbGFyZSBleHByZXNzaW9uU2NvcGU6IEV4cHJlc3Npb25TY29wZUhhbmRsZXI7XG4gIGRlY2xhcmUgcGx1Z2luczogUGx1Z2luc01hcDtcbiAgZGVjbGFyZSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgLy8gTmFtZXMgb2YgZXhwb3J0cyBzdG9yZS4gYGRlZmF1bHRgIGlzIHN0b3JlZCBhcyBhIG5hbWUgZm9yIGJvdGhcbiAgLy8gYGV4cG9ydCBkZWZhdWx0IGZvbztgIGFuZCBgZXhwb3J0IHsgZm9vIGFzIGRlZmF1bHQgfTtgLlxuICBkZWNsYXJlIGV4cG9ydGVkSWRlbnRpZmllcnM6IFNldDxzdHJpbmc+O1xuICBzYXdVbmFtYmlndW91c0VTTTogYm9vbGVhbiA9IGZhbHNlO1xuICBhbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBJbml0aWFsaXplZCBieSBUb2tlbml6ZXJcbiAgZGVjbGFyZSBzdGF0ZTogU3RhdGU7XG4gIC8vIGlucHV0IGFuZCBsZW5ndGggYXJlIG5vdCBpbiBzdGF0ZSBhcyB0aGV5IGFyZSBjb25zdGFudCBhbmQgd2UgZG9cbiAgLy8gbm90IHdhbnQgdG8gZXZlciBjb3B5IHRoZW0sIHdoaWNoIGhhcHBlbnMgaWYgc3RhdGUgZ2V0cyBjbG9uZWRcbiAgZGVjbGFyZSBpbnB1dDogc3RyaW5nO1xuICBkZWNsYXJlIGxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIFRoaXMgbWV0aG9kIGFjY2VwdHMgZWl0aGVyIGEgc3RyaW5nIChwbHVnaW4gbmFtZSkgb3IgYW4gYXJyYXkgcGFpclxuICAvLyAocGx1Z2luIG5hbWUgYW5kIG9wdGlvbnMgb2JqZWN0KS4gSWYgYW4gb3B0aW9ucyBvYmplY3QgaXMgZ2l2ZW4sXG4gIC8vIHRoZW4gZWFjaCB2YWx1ZSBpcyBub24tcmVjdXJzaXZlbHkgY2hlY2tlZCBmb3IgaWRlbnRpdHkgd2l0aCB0aGF0XG4gIC8vIHBsdWdpblx1MjAxOXMgYWN0dWFsIG9wdGlvbiB2YWx1ZS5cbiAgaGFzUGx1Z2luKHBsdWdpbkNvbmZpZzogUGx1Z2luQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW5Db25maWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbkNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5PcHRpb25zXSA9IHBsdWdpbkNvbmZpZztcbiAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4ocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0dWFsT3B0aW9ucyA9IHRoaXMucGx1Z2lucy5nZXQocGx1Z2luTmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhcbiAgICAgICAgcGx1Z2luT3B0aW9ucyxcbiAgICAgICkgYXMgKGtleW9mIHR5cGVvZiBwbHVnaW5PcHRpb25zKVtdKSB7XG4gICAgICAgIGlmIChhY3R1YWxPcHRpb25zPy5ba2V5XSAhPT0gcGx1Z2luT3B0aW9uc1trZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRQbHVnaW5PcHRpb248XG4gICAgUGx1Z2luTmFtZSBleHRlbmRzIFBhcnNlclBsdWdpbldpdGhPcHRpb25zWzBdLFxuICAgIE9wdGlvbk5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+LFxuICA+KHBsdWdpbjogUGx1Z2luTmFtZSwgbmFtZTogT3B0aW9uTmFtZSkge1xuICAgIHJldHVybiAodGhpcy5wbHVnaW5zLmdldChwbHVnaW4pIGFzIG51bGwgfCBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+KT8uW1xuICAgICAgbmFtZVxuICAgIF07XG4gIH1cbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IEJhc2VQYXJzZXIgZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50LCBOb2RlLCBJZGVudGlmaWVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5cbi8qKlxuICogQSB3aGl0ZXNwYWNlIHRva2VuIGNvbnRhaW5pbmcgY29tbWVudHNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWVudFdoaXRlc3BhY2UgPSB7XG4gIC8qKlxuICAgKiB0aGUgc3RhcnQgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW4uXG4gICAqL1xuICBzdGFydDogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGVuZCBvZiB0aGUgd2hpdGVzcGFjZSB0b2tlbi5cbiAgICovXG4gIGVuZDogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGNvbnRhaW5pbmcgY29tbWVudHNcbiAgICovXG4gIGNvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgLyoqXG4gICAqIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgQVNUIG5vZGUgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW5cbiAgICovXG4gIGxlYWRpbmdOb2RlOiBOb2RlIHwgbnVsbDtcbiAgLyoqXG4gICAqIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgQVNUIG5vZGUgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW5cbiAgICovXG4gIHRyYWlsaW5nTm9kZTogTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiB0aGUgaW5uZXJtb3N0IEFTVCBub2RlIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2Ugd2l0aCBtaW5pbWFsIHNpemUgKHxlbmQgLSBzdGFydHwpXG4gICAqL1xuICBjb250YWluaW5nTm9kZTogTm9kZSB8IG51bGw7XG59O1xuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIHRyYWlsaW5nQ29tbWVudHMgb3IgYXNzaWduIGNvbW1lbnRzIHRvIGJlXG4gKiB0cmFpbGluZ0NvbW1lbnRzLiBOZXcgY29tbWVudHMgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIG9sZCBjb21tZW50c1xuICogYmVjYXVzZSB0aGUgY29tbWVudFN0YWNrIGlzIGVudW1lcmF0ZWQgcmV2ZXJzZWx5LlxuICovXG5mdW5jdGlvbiBzZXRUcmFpbGluZ0NvbW1lbnRzKG5vZGU6IFVuZG9uZTxOb2RlPiwgY29tbWVudHM6IEFycmF5PENvbW1lbnQ+KSB7XG4gIGlmIChub2RlLnRyYWlsaW5nQ29tbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5vZGUudHJhaWxpbmdDb21tZW50cyA9IGNvbW1lbnRzO1xuICB9IGVsc2Uge1xuICAgIG5vZGUudHJhaWxpbmdDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIGxlYWRpbmdDb21tZW50cyBvciBhc3NpZ24gY29tbWVudHMgdG8gYmVcbiAqIGxlYWRpbmdDb21tZW50cy4gTmV3IGNvbW1lbnRzIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSBvbGQgY29tbWVudHNcbiAqIGJlY2F1c2UgdGhlIGNvbW1lbnRTdGFjayBpcyBlbnVtZXJhdGVkIHJldmVyc2VseS5cbiAqL1xuZnVuY3Rpb24gc2V0TGVhZGluZ0NvbW1lbnRzKG5vZGU6IFVuZG9uZTxOb2RlPiwgY29tbWVudHM6IEFycmF5PENvbW1lbnQ+KSB7XG4gIGlmIChub2RlLmxlYWRpbmdDb21tZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBjb21tZW50cztcbiAgfSBlbHNlIHtcbiAgICBub2RlLmxlYWRpbmdDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIGlubmVyQ29tbWVudHMgb3IgYXNzaWduIGNvbW1lbnRzIHRvIGJlXG4gKiBpbm5lckNvbW1lbnRzLiBOZXcgY29tbWVudHMgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIG9sZCBjb21tZW50c1xuICogYmVjYXVzZSB0aGUgY29tbWVudFN0YWNrIGlzIGVudW1lcmF0ZWQgcmV2ZXJzZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5uZXJDb21tZW50cyhcbiAgbm9kZTogVW5kb25lPE5vZGU+LFxuICBjb21tZW50cz86IEFycmF5PENvbW1lbnQ+LFxuKSB7XG4gIGlmIChub2RlLmlubmVyQ29tbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5vZGUuaW5uZXJDb21tZW50cyA9IGNvbW1lbnRzO1xuICB9IGVsc2Uge1xuICAgIG5vZGUuaW5uZXJDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIG5vZGUgYW5kIGVsZW1lbnRzIGFycmF5LCBpZiBlbGVtZW50cyBoYXMgbm9uLW51bGwgZWxlbWVudCxcbiAqIG1lcmdlIGNvbW1lbnRzIHRvIGl0cyB0cmFpbGluZ0NvbW1lbnRzLCBvdGhlcndpc2UgbWVyZ2UgY29tbWVudHNcbiAqIHRvIG5vZGUncyBpbm5lckNvbW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFkanVzdElubmVyQ29tbWVudHMoXG4gIG5vZGU6IFVuZG9uZTxOb2RlPixcbiAgZWxlbWVudHM6IEFycmF5PE5vZGU+LFxuICBjb21tZW50V1M6IENvbW1lbnRXaGl0ZXNwYWNlLFxuKSB7XG4gIGxldCBsYXN0RWxlbWVudCA9IG51bGw7XG4gIGxldCBpID0gZWxlbWVudHMubGVuZ3RoO1xuICB3aGlsZSAobGFzdEVsZW1lbnQgPT09IG51bGwgJiYgaSA+IDApIHtcbiAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnRzWy0taV07XG4gIH1cbiAgaWYgKGxhc3RFbGVtZW50ID09PSBudWxsIHx8IGxhc3RFbGVtZW50LnN0YXJ0ID4gY29tbWVudFdTLnN0YXJ0KSB7XG4gICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjb21tZW50V1MuY29tbWVudHMpO1xuICB9IGVsc2Uge1xuICAgIHNldFRyYWlsaW5nQ29tbWVudHMobGFzdEVsZW1lbnQsIGNvbW1lbnRXUy5jb21tZW50cyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tbWVudHNQYXJzZXIgZXh0ZW5kcyBCYXNlUGFyc2VyIHtcbiAgYWRkQ29tbWVudChjb21tZW50OiBDb21tZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsZW5hbWUpIGNvbW1lbnQubG9jLmZpbGVuYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICB0aGlzLnN0YXRlLmNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBuZXdseSBjcmVhdGVkIEFTVCBub2RlIF9uXywgYXR0YWNoIF9uXyB0byBhIGNvbW1lbnQgd2hpdGVzcGFjZSBfd18gaWYgYXBwbGljYWJsZVxuICAgKiB7QHNlZSB7QGxpbmsgQ29tbWVudFdoaXRlc3BhY2V9fVxuICAgKi9cbiAgcHJvY2Vzc0NvbW1lbnQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNvbW1lbnRTdGFja0xlbmd0aCA9IGNvbW1lbnRTdGFjay5sZW5ndGg7XG4gICAgaWYgKGNvbW1lbnRTdGFja0xlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGxldCBpID0gY29tbWVudFN0YWNrTGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0Q29tbWVudFdTID0gY29tbWVudFN0YWNrW2ldO1xuXG4gICAgaWYgKGxhc3RDb21tZW50V1Muc3RhcnQgPT09IG5vZGUuZW5kKSB7XG4gICAgICBsYXN0Q29tbWVudFdTLmxlYWRpbmdOb2RlID0gbm9kZTtcbiAgICAgIGktLTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXJ0OiBub2RlU3RhcnQgfSA9IG5vZGU7XG4gICAgLy8gaW52YXJpYW50OiBmb3IgYWxsIDAgPD0gaiA8PSBpLCBsZXQgYyA9IGNvbW1lbnRTdGFja1tqXSwgYyBtdXN0IHNhdGlzZnkgYy5lbmQgPCBub2RlLmVuZFxuICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY29tbWVudFdTID0gY29tbWVudFN0YWNrW2ldO1xuICAgICAgY29uc3QgY29tbWVudEVuZCA9IGNvbW1lbnRXUy5lbmQ7XG4gICAgICBpZiAoY29tbWVudEVuZCA+IG5vZGVTdGFydCkge1xuICAgICAgICAvLyBieSBkZWZpbml0aW9uIG9mIGNvbW1lbnRXaGl0ZVNwYWNlLCB0aGlzIGltcGxpZXMgY29tbWVudFdTLnN0YXJ0ID4gbm9kZVN0YXJ0XG4gICAgICAgIC8vIHNvIG5vZGUgY2FuIGJlIGEgY29udGFpbmluZ05vZGUgY2FuZGlkYXRlLiBBdCB0aGlzIHRpbWUgd2UgY2FuIGZpbmFsaXplIHRoZSBjb21tZW50XG4gICAgICAgIC8vIHdoaXRlc3BhY2UsIGJlY2F1c2VcbiAgICAgICAgLy8gMSkgaXRzIGxlYWRpbmdOb2RlIG9yIHRyYWlsaW5nTm9kZSwgaWYgZXhpc3RzLCB3aWxsIG5vdCBjaGFuZ2VcbiAgICAgICAgLy8gMikgaXRzIGNvbnRhaW5pbmdOb2RlIGhhdmUgYmVlbiBhc3NpZ25lZCBhbmQgd2lsbCBub3QgY2hhbmdlIGJlY2F1c2UgaXQgaXMgdGhlXG4gICAgICAgIC8vICAgIGlubmVybW9zdCBtaW5pbWFsLXNpemVkIEFTVCBub2RlXG4gICAgICAgIGNvbW1lbnRXUy5jb250YWluaW5nTm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuZmluYWxpemVDb21tZW50KGNvbW1lbnRXUyk7XG4gICAgICAgIGNvbW1lbnRTdGFjay5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29tbWVudEVuZCA9PT0gbm9kZVN0YXJ0KSB7XG4gICAgICAgICAgY29tbWVudFdTLnRyYWlsaW5nTm9kZSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcCB0aGUgbG9vcCB3aGVuIGNvbW1lbnRFbmQgPD0gbm9kZVN0YXJ0XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gdGhlIGNvbW1lbnRzIG9mIGNvbW1lbnQgd2hpdGVzcGFjZXMgdG8gcmVsYXRlZCBBU1Qgbm9kZXMuXG4gICAqIEFsc28gYWRqdXN0IGlubmVyQ29tbWVudHMgZm9sbG93aW5nIHRyYWlsaW5nIGNvbW1hLlxuICAgKi9cbiAgZmluYWxpemVDb21tZW50KGNvbW1lbnRXUzogQ29tbWVudFdoaXRlc3BhY2UpIHtcbiAgICBjb25zdCB7IGNvbW1lbnRzIH0gPSBjb21tZW50V1M7XG4gICAgaWYgKGNvbW1lbnRXUy5sZWFkaW5nTm9kZSAhPT0gbnVsbCB8fCBjb21tZW50V1MudHJhaWxpbmdOb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoY29tbWVudFdTLmxlYWRpbmdOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIHNldFRyYWlsaW5nQ29tbWVudHMoY29tbWVudFdTLmxlYWRpbmdOb2RlLCBjb21tZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWVudFdTLnRyYWlsaW5nTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBzZXRMZWFkaW5nQ29tbWVudHMoY29tbWVudFdTLnRyYWlsaW5nTm9kZSwgY29tbWVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKjo6IGludmFyaWFudChjb21tZW50V1MuY29udGFpbmluZ05vZGUgIT09IG51bGwpICovXG4gICAgICBjb25zdCB7IGNvbnRhaW5pbmdOb2RlOiBub2RlLCBzdGFydDogY29tbWVudFN0YXJ0IH0gPSBjb21tZW50V1M7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KGNvbW1lbnRTdGFydCAtIDEpID09PSBjaGFyQ29kZXMuY29tbWEpIHtcbiAgICAgICAgLy8gSWYgYSBjb21tZW50V2hpdGVzcGFjZSBmb2xsb3dzIGEgY29tbWEgYW5kIHRoZSBjb250YWluaW5nTm9kZSBhbGxvd3NcbiAgICAgICAgLy8gbGlzdCBzdHJ1Y3R1cmVzIHdpdGggdHJhaWxpbmcgY29tbWEsIG1lcmdlIGl0IHRvIHRoZSB0cmFpbGluZ0NvbW1lbnRcbiAgICAgICAgLy8gb2YgdGhlIGxhc3Qgbm9uLW51bGwgbGlzdCBlbGVtZW50XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgICAgIGNhc2UgXCJSZWNvcmRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUucHJvcGVydGllcywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUuYXJndW1lbnRzLCBjb21tZW50V1MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICAgICAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgICAgICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgICAgICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICAgICAgICAgIGFkanVzdElubmVyQ29tbWVudHMobm9kZSwgbm9kZS5wYXJhbXMsIGNvbW1lbnRXUyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgICAgIGNhc2UgXCJUdXBsZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIGFkanVzdElubmVyQ29tbWVudHMobm9kZSwgbm9kZS5lbGVtZW50cywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkltcG9ydERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUuc3BlY2lmaWVycywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHNldElubmVyQ29tbWVudHMobm9kZSwgY29tbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjb21tZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyByZW1haW5pbmcgY29tbWVudFN0YWNrIGFuZCBhcHBsaWVzIGZpbmFsaXplQ29tbWVudFxuICAgKiB0byBlYWNoIGNvbW1lbnQgd2hpdGVzcGFjZS4gVXNlZCBvbmx5IGluIHBhcnNlRXhwcmVzc2lvblxuICAgKiB3aGVyZSB0aGUgdG9wIGxldmVsIEFTVCBub2RlIGlzIF9ub3RfIFByb2dyYW1cbiAgICoge0BzZWUge0BsaW5rIENvbW1lbnRzUGFyc2VyI2ZpbmFsaXplQ29tbWVudH19XG4gICAqL1xuICBmaW5hbGl6ZVJlbWFpbmluZ0NvbW1lbnRzKCkge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGZvciAobGV0IGkgPSBjb21tZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuZmluYWxpemVDb21tZW50KGNvbW1lbnRTdGFja1tpXSk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUuY29tbWVudFN0YWNrID0gW107XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pcnJlZ3VsYXItd2hpdGVzcGFjZSAqL1xuICAvKipcbiAgICogUmVzZXQgcHJldmlvdXMgbm9kZSB0cmFpbGluZyBjb21tZW50cy4gVXNlZCBpbiBvYmplY3QgLyBjbGFzc1xuICAgKiBwcm9wZXJ0eSBwYXJzaW5nLiBXZSBwYXJzZSBgYXN5bmNgLCBgc3RhdGljYCwgYHNldGAgYW5kIGBnZXRgXG4gICAqIGFzIGFuIGlkZW50aWZpZXIgYnV0IG1heSByZWludGVycHJldCBpdCBpbnRvIGFuIGFzeW5jL3N0YXRpYy9hY2Nlc3NvclxuICAgKiBtZXRob2QgbGF0ZXIuIEluIHRoaXMgY2FzZSB0aGUgaWRlbnRpZmllciBpcyBub3QgcGFydCBvZiB0aGUgQVNUIGFuZCB3ZVxuICAgKiBzaG91bGQgc3luYyB0aGUga25vd2xlZGdlIHRvIGNvbW1lbnRTdGFja3NcbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gcGFyc2luZ1xuICAgKiBgYGBcbiAgICogYXN5bmMgLyogMSAqXHUyMDBCLyBmdW5jdGlvbiBmKCkge31cbiAgICogYGBgXG4gICAqIHRoZSBjb21tZW50IHdoaXRlc3BhY2UgYC8qIDEgKlx1MjAwQi9gIGhhcyBsZWFkaW5nIG5vZGUgSWRlbnRpZmllcihhc3luYykuIFdoZW5cbiAgICogd2Ugc2VlIHRoZSBmdW5jdGlvbiB0b2tlbiwgd2UgY3JlYXRlIGEgRnVuY3Rpb24gbm9kZSBhbmQgbWFyayBgLyogMSAqXHUyMDBCL2AgYXNcbiAgICogaW5uZXIgY29tbWVudHMuIFNvIGAvKiAxICpcdTIwMEIvYCBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgSWRlbnRpZmllciBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZSB0aGUgbGFzdCBmaW5pc2hlZCBBU1Qgbm9kZSBfYmVmb3JlXyBjdXJyZW50IHRva2VuXG4gICAqL1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWlycmVndWxhci13aGl0ZXNwYWNlICovXG4gIHJlc2V0UHJldmlvdXNOb2RlVHJhaWxpbmdDb21tZW50cyhub2RlOiBOb2RlKSB7XG4gICAgY29uc3QgeyBjb21tZW50U3RhY2sgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGNvbW1lbnRTdGFjaztcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY29tbWVudFdTID0gY29tbWVudFN0YWNrW2xlbmd0aCAtIDFdO1xuICAgIGlmIChjb21tZW50V1MubGVhZGluZ05vZGUgPT09IG5vZGUpIHtcbiAgICAgIGNvbW1lbnRXUy5sZWFkaW5nTm9kZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8taXJyZWd1bGFyLXdoaXRlc3BhY2UgKi9cbiAgLyoqXG4gICAqIFJlc2V0IHByZXZpb3VzIG5vZGUgbGVhZGluZyBjb21tZW50cywgYXNzdW1pbmcgdGhhdCBgbm9kZWAgaXMgYVxuICAgKiBzaW5nbGUtdG9rZW4gbm9kZS4gVXNlZCBpbiBpbXBvcnQgcGhhc2UgbW9kaWZpZXJzIHBhcnNpbmcuIFdlIHBhcnNlXG4gICAqIGBtb2R1bGVgIGluIGBpbXBvcnQgbW9kdWxlIGZvbyBmcm9tIC4uLmAgYXMgYW4gaWRlbnRpZmllciBidXQgbWF5XG4gICAqIHJlaW50ZXJwcmV0IGl0IGludG8gYSBwaGFzZSBtb2RpZmllciBsYXRlci4gSW4gdGhpcyBjYXNlIHRoZSBpZGVudGlmaWVyIGlzXG4gICAqIG5vdCBwYXJ0IG9mIHRoZSBBU1QgYW5kIHdlIHNob3VsZCBzeW5jIHRoZSBrbm93bGVkZ2UgdG8gY29tbWVudFN0YWNrc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBwYXJzaW5nXG4gICAqIGBgYFxuICAgKiBpbXBvcnQgLyogMSAqXHUyMDBCLyBtb2R1bGUgYSBmcm9tIFwiYVwiO1xuICAgKiBgYGBcbiAgICogdGhlIGNvbW1lbnQgd2hpdGVzcGFjZSBgLyogMSAqXHUyMDBCL2AgaGFzIHRyYWlsaW5nIG5vZGUgSWRlbnRpZmllcihtb2R1bGUpLiBXaGVuXG4gICAqIHdlIHNlZSB0aGF0IGBtb2R1bGVgIGlzIG5vdCBhIGRlZmF1bHQgaW1wb3J0IGJpbmRpbmcsIHdlIG1hcmsgYC8qIDEgKlx1MjAwQi9gIGFzXG4gICAqIGlubmVyIGNvbW1lbnRzIG9mIHRoZSBJbXBvcnREZWNsYXJhdGlvbi4gU28gYC8qIDEgKlx1MjAwQi9gIHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tXG4gICAqIHRoZSBJZGVudGlmaWVyIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIHRoZSBsYXN0IGZpbmlzaGVkIEFTVCBub2RlIF9iZWZvcmVfIGN1cnJlbnQgdG9rZW5cbiAgICovXG4gIC8qIGVzbGludC1lbmFibGUgbm8taXJyZWd1bGFyLXdoaXRlc3BhY2UgKi9cbiAgcmVzZXRQcmV2aW91c0lkZW50aWZpZXJMZWFkaW5nQ29tbWVudHMobm9kZTogSWRlbnRpZmllcikge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBjb21tZW50U3RhY2s7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKGNvbW1lbnRTdGFja1tsZW5ndGggLSAxXS50cmFpbGluZ05vZGUgPT09IG5vZGUpIHtcbiAgICAgIGNvbW1lbnRTdGFja1tsZW5ndGggLSAxXS50cmFpbGluZ05vZGUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDIgJiYgY29tbWVudFN0YWNrW2xlbmd0aCAtIDJdLnRyYWlsaW5nTm9kZSA9PT0gbm9kZSkge1xuICAgICAgY29tbWVudFN0YWNrW2xlbmd0aCAtIDJdLnRyYWlsaW5nTm9kZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIG5vZGUgdG8gdGhlIGNvbW1lbnQgd2hpdGVzcGFjZXMgcmlnaHQgYmVmb3JlL2FmdGVyXG4gICAqIHRoZSBnaXZlbiByYW5nZS5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIHRvIHByb3Blcmx5IGF0dGFjaCBjb21tZW50cyBhcm91bmQgcGFyZW50aGVzaXplZFxuICAgKiBleHByZXNzaW9ucyBhcyBsZWFkaW5nL3RyYWlsaW5nIGNvbW1lbnRzIG9mIHRoZSBpbm5lciBleHByZXNzaW9uLlxuICAgKi9cbiAgdGFrZVN1cnJvdW5kaW5nQ29tbWVudHMobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGNvbW1lbnRTdGFjayB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjb21tZW50U3RhY2tMZW5ndGggPSBjb21tZW50U3RhY2subGVuZ3RoO1xuICAgIGlmIChjb21tZW50U3RhY2tMZW5ndGggPT09IDApIHJldHVybjtcbiAgICBsZXQgaSA9IGNvbW1lbnRTdGFja0xlbmd0aCAtIDE7XG5cbiAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbW1lbnRXUyA9IGNvbW1lbnRTdGFja1tpXTtcbiAgICAgIGNvbnN0IGNvbW1lbnRFbmQgPSBjb21tZW50V1MuZW5kO1xuICAgICAgY29uc3QgY29tbWVudFN0YXJ0ID0gY29tbWVudFdTLnN0YXJ0O1xuXG4gICAgICBpZiAoY29tbWVudFN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgY29tbWVudFdTLmxlYWRpbmdOb2RlID0gbm9kZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tbWVudEVuZCA9PT0gc3RhcnQpIHtcbiAgICAgICAgY29tbWVudFdTLnRyYWlsaW5nTm9kZSA9IG5vZGU7XG4gICAgICB9IGVsc2UgaWYgKGNvbW1lbnRFbmQgPCBzdGFydCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyBNYXRjaGVzIGEgd2hvbGUgbGluZSBicmVhayAod2hlcmUgQ1JMRiBpcyBjb25zaWRlcmVkIGEgc2luZ2xlXG4vLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy5cbmV4cG9ydCBjb25zdCBsaW5lQnJlYWsgPSAvXFxyXFxuP3xbXFxuXFx1MjAyOFxcdTIwMjldLztcbmV4cG9ydCBjb25zdCBsaW5lQnJlYWtHID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCBcImdcIik7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpbmUtdGVybWluYXRvcnNcbmV4cG9ydCBmdW5jdGlvbiBpc05ld0xpbmUoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVGZWVkOlxuICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgY2FzZSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBza2lwV2hpdGVTcGFjZSA9IC8oPzpcXHN8XFwvXFwvLip8XFwvXFwqW15dKj9cXCpcXC8pKi9nO1xuXG5leHBvcnQgY29uc3Qgc2tpcFdoaXRlU3BhY2VJbkxpbmUgPVxuICAvKD86W15cXFNcXG5cXHJcXHUyMDI4XFx1MjAyOV18XFwvXFwvLip8XFwvXFwqLio/XFwqXFwvKSovZztcblxuLy8gU2tpcCB3aGl0ZXNwYWNlIGFuZCBzaW5nbGUtbGluZSBjb21tZW50cywgaW5jbHVkaW5nIC8qIG5vIG5ld2xpbmUgaGVyZSAqLy5cbi8vIEFmdGVyIHRoaXMgUmVnRXhwIG1hdGNoZXMsIGl0cyBsYXN0SW5kZXggcG9pbnRzIHRvIGEgbGluZSB0ZXJtaW5hdG9yLCBvclxuLy8gdGhlIHN0YXJ0IG9mIG11bHRpLWxpbmUgY29tbWVudCAod2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBsaW5lIHRlcm1pbmF0b3IpLFxuLy8gb3IgdGhlIGVuZCBvZiBzdHJpbmcuXG5leHBvcnQgY29uc3Qgc2tpcFdoaXRlU3BhY2VUb0xpbmVCcmVhayA9IG5ldyBSZWdFeHAoXG4gIC8vIFVuZm9ydHVuYXRlbHkgSlMgZG9lc24ndCBzdXBwb3J0IFBlcmwncyBhdG9taWMgLyg/PnBhdHRlcm4pLyBvclxuICAvLyBwb3NzZXNzaXZlIHF1YW50aWZpZXJzLCBzbyB3ZSB1c2UgYSB0cmljayB0byBwcmV2ZW50IGJhY2t0cmFja2luZ1xuICAvLyB3aGVuIHRoZSBsb29rLWFoZWFkIGZvciBsaW5lIHRlcm1pbmF0b3IgZmFpbHMuXG4gIFwiKD89KFwiICtcbiAgICAvLyBDYXB0dXJlIHRoZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGluc2lkZVxuICAgIC8vIGEgbG9vay1haGVhZCBhc3NlcnRpb24sIGFuZCB0aGVuIHJlLW1hdGNoIHRoZSBncm91cCBhcyBhIHVuaXQuXG4gICAgc2tpcFdoaXRlU3BhY2VJbkxpbmUuc291cmNlICtcbiAgICBcIikpXFxcXDFcIiArXG4gICAgLy8gTG9vay1haGVhZCBmb3IgZWl0aGVyIGxpbmUgdGVybWluYXRvciwgc3RhcnQgb2YgbXVsdGktbGluZSBjb21tZW50LFxuICAgIC8vIG9yIGVuZCBvZiBzdHJpbmcuXG4gICAgLyg/PVtcXG5cXHJcXHUyMDI4XFx1MjAyOV18XFwvXFwqKD8hLio/XFwqXFwvKXwkKS8uc291cmNlLFxuICBcInlcIiwgLy8gc3RpY2t5XG4pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aGl0ZS1zcGFjZVxuZXhwb3J0IGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAweDAwMDk6IC8vIENIQVJBQ1RFUiBUQUJVTEFUSU9OXG4gICAgY2FzZSAweDAwMGI6IC8vIExJTkUgVEFCVUxBVElPTlxuICAgIGNhc2UgMHgwMDBjOiAvLyBGT1JNIEZFRURcbiAgICBjYXNlIGNoYXJDb2Rlcy5zcGFjZTpcbiAgICBjYXNlIGNoYXJDb2Rlcy5ub25CcmVha2luZ1NwYWNlOlxuICAgIGNhc2UgY2hhckNvZGVzLm9naGFtU3BhY2VNYXJrOlxuICAgIGNhc2UgMHgyMDAwOiAvLyBFTiBRVUFEXG4gICAgY2FzZSAweDIwMDE6IC8vIEVNIFFVQURcbiAgICBjYXNlIDB4MjAwMjogLy8gRU4gU1BBQ0VcbiAgICBjYXNlIDB4MjAwMzogLy8gRU0gU1BBQ0VcbiAgICBjYXNlIDB4MjAwNDogLy8gVEhSRUUtUEVSLUVNIFNQQUNFXG4gICAgY2FzZSAweDIwMDU6IC8vIEZPVVItUEVSLUVNIFNQQUNFXG4gICAgY2FzZSAweDIwMDY6IC8vIFNJWC1QRVItRU0gU1BBQ0VcbiAgICBjYXNlIDB4MjAwNzogLy8gRklHVVJFIFNQQUNFXG4gICAgY2FzZSAweDIwMDg6IC8vIFBVTkNUVUFUSU9OIFNQQUNFXG4gICAgY2FzZSAweDIwMDk6IC8vIFRISU4gU1BBQ0VcbiAgICBjYXNlIDB4MjAwYTogLy8gSEFJUiBTUEFDRVxuICAgIGNhc2UgMHgyMDJmOiAvLyBOQVJST1cgTk8tQlJFQUsgU1BBQ0VcbiAgICBjYXNlIDB4MjA1ZjogLy8gTUVESVVNIE1BVEhFTUFUSUNBTCBTUEFDRVxuICAgIGNhc2UgMHgzMDAwOiAvLyBJREVPR1JBUEhJQyBTUEFDRVxuICAgIGNhc2UgMHhmZWZmOiAvLyBaRVJPIFdJRFRIIE5PLUJSRUFLIFNQQUNFXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50V2hpdGVzcGFjZSB9IGZyb20gXCIuLi9wYXJzZXIvY29tbWVudHNcIjtcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcblxuaW1wb3J0IHsgdHlwZXMgYXMgY3QsIHR5cGUgVG9rQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IHR0LCB0eXBlIFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5cbmV4cG9ydCB0eXBlIERlZmVycmVkU3RyaWN0RXJyb3IgPVxuICB8IHR5cGVvZiBFcnJvcnMuU3RyaWN0TnVtZXJpY0VzY2FwZVxuICB8IHR5cGVvZiBFcnJvcnMuU3RyaWN0T2N0YWxMaXRlcmFsO1xuXG50eXBlIFRvcGljQ29udGV4dFN0YXRlID0ge1xuICAvLyBXaGVuIGEgdG9waWMgYmluZGluZyBoYXMgYmVlbiBjdXJyZW50bHkgZXN0YWJsaXNoZWQsXG4gIC8vIHRoZW4gdGhpcyBpcyAxLiBPdGhlcndpc2UsIGl0IGlzIDAuIFRoaXMgaXMgZm9yd2FyZHMgY29tcGF0aWJsZVxuICAvLyB3aXRoIGEgZnV0dXJlIHBsdWdpbiBmb3IgbXVsdGlwbGUgbGV4aWNhbCB0b3BpY3MuXG4gIG1heE51bU9mUmVzb2x2YWJsZVRvcGljczogbnVtYmVyO1xuICAvLyBXaGVuIGEgdG9waWMgYmluZGluZyBoYXMgYmVlbiBjdXJyZW50bHkgZXN0YWJsaXNoZWQsIGFuZCBpZiB0aGF0IGJpbmRpbmdcbiAgLy8gaGFzIGJlZW4gdXNlZCBhcyBhIHRvcGljIHJlZmVyZW5jZSBgI2AsIHRoZW4gdGhpcyBpcyAwLiBPdGhlcndpc2UsIGl0IGlzXG4gIC8vIGBudWxsYC4gVGhpcyBpcyBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGggYSBmdXR1cmUgcGx1Z2luIGZvciBtdWx0aXBsZVxuICAvLyBsZXhpY2FsIHRvcGljcy5cbiAgbWF4VG9waWNJbmRleDogbnVsbCB8IDA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0ZSB7XG4gIHN0cmljdDogYm9vbGVhbjtcbiAgY3VyTGluZTogbnVtYmVyO1xuICBsaW5lU3RhcnQ6IG51bWJlcjtcblxuICAvLyBBbmQsIGlmIGxvY2F0aW9ucyBhcmUgdXNlZCwgdGhlIHtsaW5lLCBjb2x1bW59IG9iamVjdFxuICAvLyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIG9mZnNldHNcbiAgc3RhcnRMb2M6IFBvc2l0aW9uO1xuICBlbmRMb2M6IFBvc2l0aW9uO1xuXG4gIGluaXQoeyBzdHJpY3RNb2RlLCBzb3VyY2VUeXBlLCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uIH06IE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnN0cmljdCA9XG4gICAgICBzdHJpY3RNb2RlID09PSBmYWxzZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogc3RyaWN0TW9kZSA9PT0gdHJ1ZVxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBzb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiO1xuXG4gICAgdGhpcy5jdXJMaW5lID0gc3RhcnRMaW5lO1xuICAgIHRoaXMubGluZVN0YXJ0ID0gLXN0YXJ0Q29sdW1uO1xuICAgIHRoaXMuc3RhcnRMb2MgPSB0aGlzLmVuZExvYyA9IG5ldyBQb3NpdGlvbihzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCAwKTtcbiAgfVxuXG4gIGVycm9yczogUGFyc2VFcnJvcjxhbnk+W10gPSBbXTtcblxuICAvLyBVc2VkIHRvIHNpZ25pZnkgdGhlIHN0YXJ0IG9mIGEgcG90ZW50aWFsIGFycm93IGZ1bmN0aW9uXG4gIHBvdGVudGlhbEFycm93QXQ6IG51bWJlciA9IC0xO1xuXG4gIC8vIFVzZWQgdG8gc2lnbmlmeSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiB3aGljaCBsb29rcyBsaWtlIGFcbiAgLy8gdHlwZWQgYXJyb3cgZnVuY3Rpb24sIGJ1dCBpdCBpc24ndFxuICAvLyBlLmcuIGEgPyAoYikgOiBjID0+IGRcbiAgLy8gICAgICAgICAgXlxuICBub0Fycm93QXQ6IG51bWJlcltdID0gW107XG5cbiAgLy8gVXNlZCB0byBzaWduaWZ5IHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uIHdob3NlIHBhcmFtcywgaWYgaXQgbG9va3MgbGlrZVxuICAvLyBhbiBhcnJvdyBmdW5jdGlvbiwgc2hvdWxkbid0IGJlIGNvbnZlcnRlZCB0byBhc3NpZ25hYmxlIG5vZGVzLlxuICAvLyBUaGlzIGlzIHVzZWQgdG8gZGVmZXIgdGhlIHZhbGlkYXRpb24gb2YgdHlwZWQgYXJyb3cgZnVuY3Rpb25zIGluc2lkZVxuICAvLyBjb25kaXRpb25hbCBleHByZXNzaW9ucy5cbiAgLy8gZS5nLiBhID8gKGIpIDogYyA9PiBkXG4gIC8vICAgICAgICAgIF5cbiAgbm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdDogbnVtYmVyW10gPSBbXTtcblxuICAvLyBGbGFncyB0byB0cmFja1xuICBtYXliZUluQXJyb3dQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIGluVHlwZTogYm9vbGVhbiA9IGZhbHNlO1xuICBub0Fub25GdW5jdGlvblR5cGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaGFzRmxvd0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNBbWJpZW50Q29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBpbkFic3RyYWN0Q2xhc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRm9yIHRoZSBIYWNrLXN0eWxlIHBpcGVsaW5lcyBwbHVnaW5cbiAgdG9waWNDb250ZXh0OiBUb3BpY0NvbnRleHRTdGF0ZSA9IHtcbiAgICBtYXhOdW1PZlJlc29sdmFibGVUb3BpY3M6IDAsXG4gICAgbWF4VG9waWNJbmRleDogbnVsbCxcbiAgfTtcblxuICAvLyBGb3IgdGhlIEYjLXN0eWxlIHBpcGVsaW5lcyBwbHVnaW5cbiAgc29sb0F3YWl0OiBib29sZWFuID0gZmFsc2U7XG4gIGluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gTGFiZWxzIGluIHNjb3BlLlxuICBsYWJlbHM6IEFycmF5PHtcbiAgICBraW5kOiBcImxvb3BcIiB8IFwic3dpdGNoXCIgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXRlbWVudFN0YXJ0PzogbnVtYmVyO1xuICB9PiA9IFtdO1xuXG4gIC8vIENvbW1lbnQgc3RvcmUgZm9yIFByb2dyYW0uY29tbWVudHNcbiAgY29tbWVudHM6IEFycmF5PE4uQ29tbWVudD4gPSBbXTtcblxuICAvLyBDb21tZW50IGF0dGFjaG1lbnQgc3RvcmVcbiAgY29tbWVudFN0YWNrOiBBcnJheTxDb21tZW50V2hpdGVzcGFjZT4gPSBbXTtcblxuICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC5cbiAgcG9zOiBudW1iZXIgPSAwO1xuXG4gIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gIC8vIEl0cyB0eXBlXG4gIHR5cGU6IFRva2VuVHlwZSA9IHR0LmVvZjtcblxuICAvLyBGb3IgdG9rZW5zIHRoYXQgaW5jbHVkZSBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlaXIgdHlwZSwgdGhlIHZhbHVlXG4gIHZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIC8vIEl0cyBzdGFydCBhbmQgZW5kIG9mZnNldFxuICBzdGFydDogbnVtYmVyID0gMDtcbiAgZW5kOiBudW1iZXIgPSAwO1xuXG4gIC8vIFBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJldmlvdXMgdG9rZW5cbiAgLy8gdGhpcyBpcyBpbml0aWFsaXplZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHNlY29uZCB0b2tlbi5cbiAgbGFzdFRva0VuZExvYzogUG9zaXRpb24gPSBudWxsO1xuICAvLyB0aGlzIGlzIGluaXRpYWxpemVkIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2Vjb25kIHRva2VuLlxuICBsYXN0VG9rU3RhcnRMb2M6IFBvc2l0aW9uID0gbnVsbDtcbiAgbGFzdFRva1N0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8vIFRoZSBjb250ZXh0IHN0YWNrIGlzIHVzZWQgdG8gdHJhY2sgd2hldGhlciB0aGUgYXBvc3Ryb3BoZSBcImBcIiBzdGFydHNcbiAgLy8gb3IgZW5kcyBhIHN0cmluZyB0ZW1wbGF0ZVxuICBjb250ZXh0OiBBcnJheTxUb2tDb250ZXh0PiA9IFtjdC5icmFjZV07XG4gIC8vIFVzZWQgdG8gdHJhY2sgd2hldGhlciBhIEpTWCBlbGVtZW50IGlzIGFsbG93ZWQgdG8gZm9ybVxuICBjYW5TdGFydEpTWEVsZW1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFVzZWQgdG8gc2lnbmFsIHRvIGNhbGxlcnMgb2YgYHJlYWRXb3JkMWAgd2hldGhlciB0aGUgd29yZFxuICAvLyBjb250YWluZWQgYW55IGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd29yZHMgd2l0aFxuICAvLyBlc2NhcGUgc2VxdWVuY2VzIG11c3Qgbm90IGJlIGludGVycHJldGVkIGFzIGtleXdvcmRzLlxuICBjb250YWluc0VzYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFVzZWQgdG8gdHJhY2sgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VzIGluIHRlbXBsYXRlIGxpdGVyYWxzLFxuICAvLyB0aGF0IG11c3QgYmUgcmVwb3J0ZWQgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCB0YWdnZWQuXG4gIGZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zOiBudWxsIHwgUG9zaXRpb24gPSBudWxsO1xuXG4gIC8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byB0cmFjayB0aGUgZm9sbG93aW5nIGVycm9yc1xuICAvLyAtIFN0cmljdE51bWVyaWNFc2NhcGVcbiAgLy8gLSBTdHJpY3RPY3RhbExpdGVyYWxcbiAgLy9cbiAgLy8gaW4gYSBsaXRlcmFsIHRoYXQgb2NjdXJzIHByaW9yIHRvL2ltbWVkaWF0ZWx5IGFmdGVyIGEgXCJ1c2Ugc3RyaWN0XCIgZGlyZWN0aXZlLlxuXG4gIC8vIHRvZG8oSkxId3VuZyk6IHNldCBzdHJpY3RFcnJvcnMgdG8gbnVsbCBhbmQgYXZvaWQgcmVjb3JkaW5nIHN0cmluZyBlcnJvcnNcbiAgLy8gYWZ0ZXIgYSBub24tZGlyZWN0aXZlIGlzIHBhcnNlZFxuICBzdHJpY3RFcnJvcnM6IE1hcDxudW1iZXIsIFtEZWZlcnJlZFN0cmljdEVycm9yLCBQb3NpdGlvbl0+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIFRva2VucyBsZW5ndGggaW4gdG9rZW4gc3RvcmVcbiAgdG9rZW5zTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gIGN1clBvc2l0aW9uKCk6IFBvc2l0aW9uIHtcbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuY3VyTGluZSwgdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydCwgdGhpcy5wb3MpO1xuICB9XG5cbiAgY2xvbmUoc2tpcEFycmF5cz86IGJvb2xlYW4pOiBTdGF0ZSB7XG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcykgYXMgKGtleW9mIFN0YXRlKVtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgbGV0IHZhbCA9IHRoaXNba2V5XTtcblxuICAgICAgaWYgKCFza2lwQXJyYXlzICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWwgPSB2YWwuc2xpY2UoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB2YWwgbXVzdCBjb25mb3JtIHRvIFNba2V5XVxuICAgICAgc3RhdGVba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9va2FoZWFkU3RhdGUgPSB7XG4gIHBvczogbnVtYmVyO1xuICB2YWx1ZTogYW55O1xuICB0eXBlOiBUb2tlblR5cGU7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICBjb250ZXh0OiBUb2tDb250ZXh0W107XG4gIHN0YXJ0TG9jOiBQb3NpdGlvbjtcbiAgbGFzdFRva0VuZExvYzogUG9zaXRpb247XG4gIGN1ckxpbmU6IG51bWJlcjtcbiAgbGluZVN0YXJ0OiBudW1iZXI7XG4gIGN1clBvc2l0aW9uOiAoKSA9PiBQb3NpdGlvbjtcbiAgLyogVXNlZCBvbmx5IGluIHJlYWRUb2tlbl9tdWx0X21vZHVsbyAqL1xuICBpblR5cGU6IGJvb2xlYW47XG4gIC8vIFRoZXNlIGJvb2xlYW4gcHJvcGVydGllcyBhcmUgbm90IGluaXRpYWxpemVkIGluIGNyZWF0ZUxvb2thaGVhZFN0YXRlKClcbiAgLy8gaW5zdGVhZCB0aGV5IHdpbGwgb25seSBiZSBzZXQgYnkgdGhlIHRva2VuaXplclxuICBjb250YWluc0VzYz86IGJvb2xlYW47XG59O1xuIiwgImltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGNvZGVzIGFyZSBmb3JiaWRkZW4gZnJvbSBiZWluZ1xuLy8gYW4gaW1tZWRpYXRlIHNpYmxpbmcgb2YgTnVtZXJpY0xpdGVyYWxTZXBhcmF0b3IgX1xuY29uc3QgZm9yYmlkZGVuTnVtZXJpY1NlcGFyYXRvclNpYmxpbmdzID0ge1xuICBkZWNCaW5PY3Q6IG5ldyBTZXQ8bnVtYmVyPihbXG4gICAgY2hhckNvZGVzLmRvdCxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlQixcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlRSxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlTyxcbiAgICBjaGFyQ29kZXMudW5kZXJzY29yZSwgLy8gbXVsdGlwbGUgc2VwYXJhdG9ycyBhcmUgbm90IGFsbG93ZWRcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlQixcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlRSxcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlTyxcbiAgXSksXG4gIGhleDogbmV3IFNldDxudW1iZXI+KFtcbiAgICBjaGFyQ29kZXMuZG90LFxuICAgIGNoYXJDb2Rlcy51cHBlcmNhc2VYLFxuICAgIGNoYXJDb2Rlcy51bmRlcnNjb3JlLCAvLyBtdWx0aXBsZSBzZXBhcmF0b3JzIGFyZSBub3QgYWxsb3dlZFxuICAgIGNoYXJDb2Rlcy5sb3dlcmNhc2VYLFxuICBdKSxcbn07XG5cbmNvbnN0IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nID0ge1xuICAvLyAwIC0gMVxuICBiaW46IChjaDogbnVtYmVyKSA9PiBjaCA9PT0gY2hhckNvZGVzLmRpZ2l0MCB8fCBjaCA9PT0gY2hhckNvZGVzLmRpZ2l0MSxcblxuICAvLyAwIC0gN1xuICBvY3Q6IChjaDogbnVtYmVyKSA9PiBjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDcsXG5cbiAgLy8gMCAtIDlcbiAgZGVjOiAoY2g6IG51bWJlcikgPT4gY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ5LFxuXG4gIC8vIDAgLSA5LCBBIC0gRiwgYSAtIGYsXG4gIGhleDogKGNoOiBudW1iZXIpID0+XG4gICAgKGNoID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgY2ggPD0gY2hhckNvZGVzLmRpZ2l0OSkgfHxcbiAgICAoY2ggPj0gY2hhckNvZGVzLnVwcGVyY2FzZUEgJiYgY2ggPD0gY2hhckNvZGVzLnVwcGVyY2FzZUYpIHx8XG4gICAgKGNoID49IGNoYXJDb2Rlcy5sb3dlcmNhc2VBICYmIGNoIDw9IGNoYXJDb2Rlcy5sb3dlcmNhc2VGKSxcbn07XG5cbmV4cG9ydCB0eXBlIFN0cmluZ0NvbnRlbnRzRXJyb3JIYW5kbGVycyA9IEVzY2FwZWRDaGFyRXJyb3JIYW5kbGVycyAmIHtcbiAgdW50ZXJtaW5hdGVkKFxuICAgIGluaXRpYWxQb3M6IG51bWJlcixcbiAgICBpbml0aWFsTGluZVN0YXJ0OiBudW1iZXIsXG4gICAgaW5pdGlhbEN1ckxpbmU6IG51bWJlcixcbiAgKTogdm9pZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nQ29udGVudHMoXG4gIHR5cGU6IFwic2luZ2xlXCIgfCBcImRvdWJsZVwiIHwgXCJ0ZW1wbGF0ZVwiLFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgZXJyb3JzOiBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgaW5pdGlhbFBvcyA9IHBvcztcbiAgY29uc3QgaW5pdGlhbExpbmVTdGFydCA9IGxpbmVTdGFydDtcbiAgY29uc3QgaW5pdGlhbEN1ckxpbmUgPSBjdXJMaW5lO1xuXG4gIGxldCBvdXQgPSBcIlwiO1xuICBsZXQgZmlyc3RJbnZhbGlkTG9jID0gbnVsbDtcbiAgbGV0IGNodW5rU3RhcnQgPSBwb3M7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBpbnB1dDtcbiAgZm9yICg7Oykge1xuICAgIGlmIChwb3MgPj0gbGVuZ3RoKSB7XG4gICAgICBlcnJvcnMudW50ZXJtaW5hdGVkKGluaXRpYWxQb3MsIGluaXRpYWxMaW5lU3RhcnQsIGluaXRpYWxDdXJMaW5lKTtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmIChpc1N0cmluZ0VuZCh0eXBlLCBjaCwgaW5wdXQsIHBvcykpIHtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgb3V0ICs9IGlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHBvcyk7XG4gICAgICBjb25zdCByZXMgPSByZWFkRXNjYXBlZENoYXIoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgdHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApO1xuICAgICAgaWYgKHJlcy5jaCA9PT0gbnVsbCAmJiAhZmlyc3RJbnZhbGlkTG9jKSB7XG4gICAgICAgIGZpcnN0SW52YWxpZExvYyA9IHsgcG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSByZXMuY2g7XG4gICAgICB9XG4gICAgICAoeyBwb3MsIGxpbmVTdGFydCwgY3VyTGluZSB9ID0gcmVzKTtcbiAgICAgIGNodW5rU3RhcnQgPSBwb3M7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoID09PSBjaGFyQ29kZXMubGluZVNlcGFyYXRvciB8fFxuICAgICAgY2ggPT09IGNoYXJDb2Rlcy5wYXJhZ3JhcGhTZXBhcmF0b3JcbiAgICApIHtcbiAgICAgICsrcG9zO1xuICAgICAgKytjdXJMaW5lO1xuICAgICAgbGluZVN0YXJ0ID0gcG9zO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IGNoYXJDb2Rlcy5saW5lRmVlZCB8fCBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuKSB7XG4gICAgICBpZiAodHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpICsgXCJcXG5cIjtcbiAgICAgICAgKytwb3M7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuICYmXG4gICAgICAgICAgaW5wdXQuY2hhckNvZGVBdChwb3MpID09PSBjaGFyQ29kZXMubGluZUZlZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgKytwb3M7XG4gICAgICAgIH1cbiAgICAgICAgKytjdXJMaW5lO1xuICAgICAgICBjaHVua1N0YXJ0ID0gbGluZVN0YXJ0ID0gcG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnVudGVybWluYXRlZChpbml0aWFsUG9zLCBpbml0aWFsTGluZVN0YXJ0LCBpbml0aWFsQ3VyTGluZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICsrcG9zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgID8geyBwb3MsIHN0cjogb3V0LCBmaXJzdEludmFsaWRMb2MsIGxpbmVTdGFydCwgY3VyTGluZSB9XG4gICAgOiB7XG4gICAgICAgIHBvcyxcbiAgICAgICAgc3RyOiBvdXQsXG4gICAgICAgIGZpcnN0SW52YWxpZExvYyxcbiAgICAgICAgbGluZVN0YXJ0LFxuICAgICAgICBjdXJMaW5lLFxuICAgICAgICBjb250YWluc0ludmFsaWQ6ICEhZmlyc3RJbnZhbGlkTG9jLFxuICAgICAgfTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdFbmQoXG4gIHR5cGU6IFwic2luZ2xlXCIgfCBcImRvdWJsZVwiIHwgXCJ0ZW1wbGF0ZVwiLFxuICBjaDogbnVtYmVyLFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbikge1xuICBpZiAodHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoID09PSBjaGFyQ29kZXMuZ3JhdmVBY2NlbnQgfHxcbiAgICAgIChjaCA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ24gJiZcbiAgICAgICAgaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBjaCA9PT0gKHR5cGUgPT09IFwiZG91YmxlXCIgPyBjaGFyQ29kZXMucXVvdGF0aW9uTWFyayA6IGNoYXJDb2Rlcy5hcG9zdHJvcGhlKVxuICApO1xufVxuXG50eXBlIEVzY2FwZWRDaGFyRXJyb3JIYW5kbGVycyA9IEhleENoYXJFcnJvckhhbmRsZXJzICZcbiAgQ29kZVBvaW50RXJyb3JIYW5kbGVycyAmIHtcbiAgICBzdHJpY3ROdW1lcmljRXNjYXBlKHBvczogbnVtYmVyLCBsaW5lU3RhcnQ6IG51bWJlciwgY3VyTGluZTogbnVtYmVyKTogdm9pZDtcbiAgfTtcblxuZnVuY3Rpb24gcmVhZEVzY2FwZWRDaGFyKFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgaW5UZW1wbGF0ZTogYm9vbGVhbixcbiAgZXJyb3JzOiBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgdGhyb3dPbkludmFsaWQgPSAhaW5UZW1wbGF0ZTtcbiAgcG9zKys7IC8vIHNraXAgJ1xcJ1xuXG4gIGNvbnN0IHJlcyA9IChjaDogc3RyaW5nIHwgbnVsbCkgPT4gKHsgcG9zLCBjaCwgbGluZVN0YXJ0LCBjdXJMaW5lIH0pO1xuXG4gIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MrKyk7XG4gIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VOOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcblwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VSOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcclwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VYOiB7XG4gICAgICBsZXQgY29kZTtcbiAgICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgMixcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApKTtcbiAgICAgIHJldHVybiByZXMoY29kZSA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgICB9XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVToge1xuICAgICAgbGV0IGNvZGU7XG4gICAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRDb2RlUG9pbnQoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICkpO1xuICAgICAgcmV0dXJuIHJlcyhjb2RlID09PSBudWxsID8gbnVsbCA6IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpKTtcbiAgICB9XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVDpcbiAgICAgIHJldHVybiByZXMoXCJcXHRcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlQjpcbiAgICAgIHJldHVybiByZXMoXCJcXGJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVjpcbiAgICAgIHJldHVybiByZXMoXCJcXHUwMDBiXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZUY6XG4gICAgICByZXR1cm4gcmVzKFwiXFxmXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocG9zKSA9PT0gY2hhckNvZGVzLmxpbmVGZWVkKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVGZWVkOlxuICAgICAgbGluZVN0YXJ0ID0gcG9zO1xuICAgICAgKytjdXJMaW5lO1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgY2FzZSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yOlxuICAgICAgcmV0dXJuIHJlcyhcIlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDg6XG4gICAgY2FzZSBjaGFyQ29kZXMuZGlnaXQ5OlxuICAgICAgaWYgKGluVGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHJlcyhudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy5zdHJpY3ROdW1lcmljRXNjYXBlKHBvcyAtIDEsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDcpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3MgLSAxO1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0LnNsaWNlKHN0YXJ0UG9zLCBwb3MgKyAyKS5tYXRjaCgvXlswLTddKy8pITtcblxuICAgICAgICBsZXQgb2N0YWxTdHIgPSBtYXRjaFswXTtcblxuICAgICAgICBsZXQgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICAgIGlmIChvY3RhbCA+IDI1NSkge1xuICAgICAgICAgIG9jdGFsU3RyID0gb2N0YWxTdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgIG9jdGFsID0gcGFyc2VJbnQob2N0YWxTdHIsIDgpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyArPSBvY3RhbFN0ci5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgb2N0YWxTdHIgIT09IFwiMFwiIHx8XG4gICAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmRpZ2l0OCB8fFxuICAgICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5kaWdpdDlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGluVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXMobnVsbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5zdHJpY3ROdW1lcmljRXNjYXBlKHN0YXJ0UG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXMoU3RyaW5nLmZyb21DaGFyQ29kZShvY3RhbCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgfVxufVxuXG50eXBlIEhleENoYXJFcnJvckhhbmRsZXJzID0gSW50RXJyb3JIYW5kbGVycyAmIHtcbiAgaW52YWxpZEVzY2FwZVNlcXVlbmNlKHBvczogbnVtYmVyLCBsaW5lU3RhcnQ6IG51bWJlciwgY3VyTGluZTogbnVtYmVyKTogdm9pZDtcbn07XG5cbi8vIFVzZWQgdG8gcmVhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyAoJ1xceCcsICdcXHUnKS5cbmZ1bmN0aW9uIHJlYWRIZXhDaGFyKFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgbGVuOiBudW1iZXIsXG4gIGZvcmNlTGVuOiBib29sZWFuLFxuICB0aHJvd09uSW52YWxpZDogYm9vbGVhbixcbiAgZXJyb3JzOiBIZXhDaGFyRXJyb3JIYW5kbGVycyxcbikge1xuICBjb25zdCBpbml0aWFsUG9zID0gcG9zO1xuICBsZXQgbjtcbiAgKHsgbiwgcG9zIH0gPSByZWFkSW50KFxuICAgIGlucHV0LFxuICAgIHBvcyxcbiAgICBsaW5lU3RhcnQsXG4gICAgY3VyTGluZSxcbiAgICAxNixcbiAgICBsZW4sXG4gICAgZm9yY2VMZW4sXG4gICAgZmFsc2UsXG4gICAgZXJyb3JzLFxuICAgIC8qIGJhaWxPbkVycm9yICovICF0aHJvd09uSW52YWxpZCxcbiAgKSk7XG4gIGlmIChuID09PSBudWxsKSB7XG4gICAgaWYgKHRocm93T25JbnZhbGlkKSB7XG4gICAgICBlcnJvcnMuaW52YWxpZEVzY2FwZVNlcXVlbmNlKGluaXRpYWxQb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcyA9IGluaXRpYWxQb3MgLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjb2RlOiBuLCBwb3MgfTtcbn1cblxuZXhwb3J0IHR5cGUgSW50RXJyb3JIYW5kbGVycyA9IHtcbiAgbnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICApOiB2b2lkO1xuICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcihcbiAgICBwb3M6IG51bWJlcixcbiAgICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgICBjdXJMaW5lOiBudW1iZXIsXG4gICk6IHZvaWQ7XG4gIC8vIEl0IGNhbiByZXR1cm4gXCJ0cnVlXCIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3Igd2FzIGhhbmRsZWRcbiAgLy8gYW5kIHRoZSBpbnQgcGFyc2luZyBzaG91bGQgY29udGludWUuXG4gIGludmFsaWREaWdpdChcbiAgICBwb3M6IG51bWJlcixcbiAgICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgICBjdXJMaW5lOiBudW1iZXIsXG4gICAgcmFkaXg6IG51bWJlcixcbiAgKTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW50KFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgcmFkaXg6IG51bWJlcixcbiAgbGVuOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGZvcmNlTGVuOiBib29sZWFuLFxuICBhbGxvd051bVNlcGFyYXRvcjogYm9vbGVhbiB8IFwiYmFpbFwiLFxuICBlcnJvcnM6IEludEVycm9ySGFuZGxlcnMsXG4gIGJhaWxPbkVycm9yOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcG9zO1xuICBjb25zdCBmb3JiaWRkZW5TaWJsaW5ncyA9XG4gICAgcmFkaXggPT09IDE2XG4gICAgICA/IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncy5oZXhcbiAgICAgIDogZm9yYmlkZGVuTnVtZXJpY1NlcGFyYXRvclNpYmxpbmdzLmRlY0Jpbk9jdDtcbiAgY29uc3QgaXNBbGxvd2VkU2libGluZyA9XG4gICAgcmFkaXggPT09IDE2XG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLmhleFxuICAgICAgOiByYWRpeCA9PT0gMTBcbiAgICAgID8gaXNBbGxvd2VkTnVtZXJpY1NlcGFyYXRvclNpYmxpbmcuZGVjXG4gICAgICA6IHJhZGl4ID09PSA4XG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLm9jdFxuICAgICAgOiBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5iaW47XG5cbiAgbGV0IGludmFsaWQgPSBmYWxzZTtcbiAgbGV0IHRvdGFsID0gMDtcblxuICBmb3IgKGxldCBpID0gMCwgZSA9IGxlbiA9PSBudWxsID8gSW5maW5pdHkgOiBsZW47IGkgPCBlOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgIGxldCB2YWw7XG5cbiAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLnVuZGVyc2NvcmUgJiYgYWxsb3dOdW1TZXBhcmF0b3IgIT09IFwiYmFpbFwiKSB7XG4gICAgICBjb25zdCBwcmV2ID0gaW5wdXQuY2hhckNvZGVBdChwb3MgLSAxKTtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpO1xuXG4gICAgICBpZiAoIWFsbG93TnVtU2VwYXJhdG9yKSB7XG4gICAgICAgIGlmIChiYWlsT25FcnJvcikgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gICAgICAgIGVycm9ycy5udW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZShwb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBOdW1iZXIuaXNOYU4obmV4dCkgfHxcbiAgICAgICAgIWlzQWxsb3dlZFNpYmxpbmcobmV4dCkgfHxcbiAgICAgICAgZm9yYmlkZGVuU2libGluZ3MuaGFzKHByZXYpIHx8XG4gICAgICAgIGZvcmJpZGRlblNpYmxpbmdzLmhhcyhuZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChiYWlsT25FcnJvcikgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gICAgICAgIGVycm9ycy51bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcihwb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElnbm9yZSB0aGlzIF8gY2hhcmFjdGVyXG4gICAgICArK3BvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjb2RlID49IGNoYXJDb2Rlcy5sb3dlcmNhc2VBKSB7XG4gICAgICB2YWwgPSBjb2RlIC0gY2hhckNvZGVzLmxvd2VyY2FzZUEgKyBjaGFyQ29kZXMubGluZUZlZWQ7XG4gICAgfSBlbHNlIGlmIChjb2RlID49IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSB7XG4gICAgICB2YWwgPSBjb2RlIC0gY2hhckNvZGVzLnVwcGVyY2FzZUEgKyBjaGFyQ29kZXMubGluZUZlZWQ7XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZXMuaXNEaWdpdChjb2RlKSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy5kaWdpdDA7IC8vIDAtOVxuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSBJbmZpbml0eTtcbiAgICB9XG4gICAgaWYgKHZhbCA+PSByYWRpeCkge1xuICAgICAgLy8gSWYgd2UgZm91bmQgYSBkaWdpdCB3aGljaCBpcyB0b28gYmlnLCBlcnJvcnMuaW52YWxpZERpZ2l0IGNhbiByZXR1cm4gdHJ1ZSB0byBhdm9pZFxuICAgICAgLy8gYnJlYWtpbmcgdGhlIGxvb3AgKHRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgcmVjb3ZlcnkpLlxuICAgICAgaWYgKHZhbCA8PSA5ICYmIGJhaWxPbkVycm9yKSB7XG4gICAgICAgIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsIDw9IDkgJiZcbiAgICAgICAgZXJyb3JzLmludmFsaWREaWdpdChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSwgcmFkaXgpXG4gICAgICApIHtcbiAgICAgICAgdmFsID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoZm9yY2VMZW4pIHtcbiAgICAgICAgdmFsID0gMDtcbiAgICAgICAgaW52YWxpZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgKytwb3M7XG4gICAgdG90YWwgPSB0b3RhbCAqIHJhZGl4ICsgdmFsO1xuICB9XG4gIGlmIChwb3MgPT09IHN0YXJ0IHx8IChsZW4gIT0gbnVsbCAmJiBwb3MgLSBzdGFydCAhPT0gbGVuKSB8fCBpbnZhbGlkKSB7XG4gICAgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gIH1cblxuICByZXR1cm4geyBuOiB0b3RhbCwgcG9zIH07XG59XG5cbmV4cG9ydCB0eXBlIENvZGVQb2ludEVycm9ySGFuZGxlcnMgPSBIZXhDaGFyRXJyb3JIYW5kbGVycyAmIHtcbiAgaW52YWxpZENvZGVQb2ludChwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvZGVQb2ludChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIHRocm93T25JbnZhbGlkOiBib29sZWFuLFxuICBlcnJvcnM6IENvZGVQb2ludEVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgY2ggPSBpbnB1dC5jaGFyQ29kZUF0KHBvcyk7XG4gIGxldCBjb2RlO1xuXG4gIGlmIChjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlKSB7XG4gICAgKytwb3M7XG4gICAgKHsgY29kZSwgcG9zIH0gPSByZWFkSGV4Q2hhcihcbiAgICAgIGlucHV0LFxuICAgICAgcG9zLFxuICAgICAgbGluZVN0YXJ0LFxuICAgICAgY3VyTGluZSxcbiAgICAgIGlucHV0LmluZGV4T2YoXCJ9XCIsIHBvcykgLSBwb3MsXG4gICAgICB0cnVlLFxuICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICBlcnJvcnMsXG4gICAgKSk7XG4gICAgKytwb3M7XG4gICAgaWYgKGNvZGUgIT09IG51bGwgJiYgY29kZSA+IDB4MTBmZmZmKSB7XG4gICAgICBpZiAodGhyb3dPbkludmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLmludmFsaWRDb2RlUG9pbnQocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogbnVsbCwgcG9zIH07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICBpbnB1dCxcbiAgICAgIHBvcyxcbiAgICAgIGxpbmVTdGFydCxcbiAgICAgIGN1ckxpbmUsXG4gICAgICA0LFxuICAgICAgZmFsc2UsXG4gICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgIGVycm9ycyxcbiAgICApKTtcbiAgfVxuICByZXR1cm4geyBjb2RlLCBwb3MgfTtcbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7XG4gIFBvc2l0aW9uLFxuICBTb3VyY2VMb2NhdGlvbixcbiAgY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0LFxufSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IENvbW1lbnRzUGFyc2VyLCB7IHR5cGUgQ29tbWVudFdoaXRlc3BhY2UgfSBmcm9tIFwiLi4vcGFyc2VyL2NvbW1lbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyU3RhcnQsIGlzSWRlbnRpZmllckNoYXIgfSBmcm9tIFwiLi4vdXRpbC9pZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICB0b2tlbklzS2V5d29yZCxcbiAgdG9rZW5MYWJlbE5hbWUsXG4gIHR0LFxuICBrZXl3b3JkcyBhcyBrZXl3b3JkVHlwZXMsXG4gIHR5cGUgVG9rZW5UeXBlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgRXJyb3JzLFxuICB0eXBlIFBhcnNlRXJyb3IsXG4gIHR5cGUgUGFyc2VFcnJvckNvbnN0cnVjdG9yLFxuICB0eXBlIFJhaXNlUHJvcGVydGllcyxcbn0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQge1xuICBsaW5lQnJlYWtHLFxuICBpc05ld0xpbmUsXG4gIGlzV2hpdGVzcGFjZSxcbiAgc2tpcFdoaXRlU3BhY2UsXG4gIHNraXBXaGl0ZVNwYWNlSW5MaW5lLFxufSBmcm9tIFwiLi4vdXRpbC93aGl0ZXNwYWNlXCI7XG5pbXBvcnQgU3RhdGUgZnJvbSBcIi4vc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgTG9va2FoZWFkU3RhdGUsIERlZmVycmVkU3RyaWN0RXJyb3IgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuXG5pbXBvcnQge1xuICByZWFkSW50LFxuICByZWFkQ29kZVBvaW50LFxuICByZWFkU3RyaW5nQ29udGVudHMsXG4gIHR5cGUgSW50RXJyb3JIYW5kbGVycyxcbiAgdHlwZSBDb2RlUG9pbnRFcnJvckhhbmRsZXJzLFxuICB0eXBlIFN0cmluZ0NvbnRlbnRzRXJyb3JIYW5kbGVycyxcbn0gZnJvbSBcIkBiYWJlbC9oZWxwZXItc3RyaW5nLXBhcnNlclwiO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5cbmZ1bmN0aW9uIGJ1aWxkUG9zaXRpb24ocG9zOiBudW1iZXIsIGxpbmVTdGFydDogbnVtYmVyLCBjdXJMaW5lOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQb3NpdGlvbihjdXJMaW5lLCBwb3MgLSBsaW5lU3RhcnQsIHBvcyk7XG59XG5cbmNvbnN0IFZBTElEX1JFR0VYX0ZMQUdTID0gbmV3IFNldChbXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VHLFxuICBjaGFyQ29kZXMubG93ZXJjYXNlTSxcbiAgY2hhckNvZGVzLmxvd2VyY2FzZVMsXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VJLFxuICBjaGFyQ29kZXMubG93ZXJjYXNlWSxcbiAgY2hhckNvZGVzLmxvd2VyY2FzZVUsXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VELFxuICBjaGFyQ29kZXMubG93ZXJjYXNlVixcbl0pO1xuXG4vLyBPYmplY3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0b2tlbnMuIE5vdGUgdGhhdCBub3JtYWxseSwgdG9rZW5zXG4vLyBzaW1wbHkgZXhpc3QgYXMgcHJvcGVydGllcyBvbiB0aGUgcGFyc2VyIG9iamVjdC4gVGhpcyBpcyBvbmx5XG4vLyB1c2VkIGZvciB0aGUgb25Ub2tlbiBjYWxsYmFjayBhbmQgdGhlIGV4dGVybmFsIHRva2VuaXplci5cblxuZXhwb3J0IGNsYXNzIFRva2VuIHtcbiAgY29uc3RydWN0b3Ioc3RhdGU6IFN0YXRlKSB7XG4gICAgdGhpcy50eXBlID0gc3RhdGUudHlwZTtcbiAgICB0aGlzLnZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdGhpcy5zdGFydCA9IHN0YXRlLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gc3RhdGUuZW5kO1xuICAgIHRoaXMubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXRlLnN0YXJ0TG9jLCBzdGF0ZS5lbmRMb2MpO1xuICB9XG5cbiAgZGVjbGFyZSB0eXBlOiBUb2tlblR5cGU7XG4gIGRlY2xhcmUgdmFsdWU6IGFueTtcbiAgZGVjbGFyZSBzdGFydDogbnVtYmVyO1xuICBkZWNsYXJlIGVuZDogbnVtYmVyO1xuICBkZWNsYXJlIGxvYzogU291cmNlTG9jYXRpb247XG59XG5cbi8vICMjIFRva2VuaXplclxuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBUb2tlbml6ZXIgZXh0ZW5kcyBDb21tZW50c1BhcnNlciB7XG4gIGlzTG9va2FoZWFkOiBib29sZWFuO1xuXG4gIC8vIFRva2VuIHN0b3JlLlxuICB0b2tlbnM6IEFycmF5PFRva2VuIHwgTi5Db21tZW50PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMsIGlucHV0OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUoKTtcbiAgICB0aGlzLnN0YXRlLmluaXQob3B0aW9ucyk7XG4gICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMuaXNMb29rYWhlYWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1c2hUb2tlbih0b2tlbjogVG9rZW4gfCBOLkNvbW1lbnQpIHtcbiAgICAvLyBQb3Agb3V0IGludmFsaWQgdG9rZW5zIHRyYXBwZWQgYnkgdHJ5LWNhdGNoIHBhcnNpbmcuXG4gICAgLy8gVGhvc2UgcGFyc2luZyBicmFuY2hlcyBhcmUgbWFpbmx5IGNyZWF0ZWQgYnkgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zLlxuICAgIHRoaXMudG9rZW5zLmxlbmd0aCA9IHRoaXMuc3RhdGUudG9rZW5zTGVuZ3RoO1xuICAgIHRoaXMudG9rZW5zLnB1c2godG9rZW4pO1xuICAgICsrdGhpcy5zdGF0ZS50b2tlbnNMZW5ndGg7XG4gIH1cblxuICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrS2V5d29yZEVzY2FwZXMoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRva2Vucykge1xuICAgICAgdGhpcy5wdXNoVG9rZW4obmV3IFRva2VuKHRoaXMuc3RhdGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCA9IHRoaXMuc3RhdGUuc3RhcnQ7XG4gICAgdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jID0gdGhpcy5zdGF0ZS5lbmRMb2M7XG4gICAgdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gIH1cblxuICBlYXQodHlwZTogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWF0Y2godHlwZSkpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBjdXJyZW50IHRva2VuIG1hdGNoZXMgZ2l2ZW4gdHlwZVxuICAgKi9cbiAgbWF0Y2godHlwZTogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUudHlwZSA9PT0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMb29rYWhlYWRTdGF0ZSBmcm9tIGN1cnJlbnQgcGFyc2VyIHN0YXRlXG4gICAqL1xuICBjcmVhdGVMb29rYWhlYWRTdGF0ZShzdGF0ZTogU3RhdGUpOiBMb29rYWhlYWRTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvczogc3RhdGUucG9zLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB0eXBlOiBzdGF0ZS50eXBlLFxuICAgICAgc3RhcnQ6IHN0YXRlLnN0YXJ0LFxuICAgICAgZW5kOiBzdGF0ZS5lbmQsXG4gICAgICBjb250ZXh0OiBbdGhpcy5jdXJDb250ZXh0KCldLFxuICAgICAgaW5UeXBlOiBzdGF0ZS5pblR5cGUsXG4gICAgICBzdGFydExvYzogc3RhdGUuc3RhcnRMb2MsXG4gICAgICBsYXN0VG9rRW5kTG9jOiBzdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgY3VyTGluZTogc3RhdGUuY3VyTGluZSxcbiAgICAgIGxpbmVTdGFydDogc3RhdGUubGluZVN0YXJ0LFxuICAgICAgY3VyUG9zaXRpb246IHN0YXRlLmN1clBvc2l0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogbG9va2FoZWFkIHBlZWtzIHRoZSBuZXh0IHRva2VuLCBza2lwcGluZyBjaGFuZ2VzIHRvIHRva2VuIGNvbnRleHQgYW5kXG4gICAqIGNvbW1lbnQgc3RhY2suIEZvciBwZXJmb3JtYW5jZSBpdCByZXR1cm5zIGEgbGltaXRlZCBMb29rYWhlYWRTdGF0ZVxuICAgKiBpbnN0ZWFkIG9mIGZ1bGwgcGFyc2VyIHN0YXRlLlxuICAgKlxuICAgKiBUaGUgeyBjb2x1bW4sIGxpbmUgfSBMb2MgaW5mbyBpcyBub3QgaW5jbHVkZWQgaW4gbG9va2FoZWFkIHNpbmNlIHN1Y2ggdXNhZ2VcbiAgICogaXMgcmFyZS4gQWx0aG91Z2ggaXQgbWF5IHJldHVybiBvdGhlciBsb2NhdGlvbiBwcm9wZXJ0aWVzIGUuZy4gYGN1ckxpbmVgIGFuZFxuICAgKiBgbGluZVN0YXJ0YCwgdGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGxpc3RlZCBpbiB0aGUgTG9va2FoZWFkU3RhdGUgaW50ZXJmYWNlXG4gICAqIGFuZCB0aHVzIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBfTk9UXyByZWxpYWJsZS5cbiAgICpcbiAgICogVGhlIHRva2VuaXplciBzaG91bGQgbWFrZSBiZXN0IGVmZm9ydHMgdG8gYXZvaWQgdXNpbmcgYW55IHBhcnNlciBzdGF0ZVxuICAgKiBvdGhlciB0aGFuIHRob3NlIGRlZmluZWQgaW4gTG9va2FoZWFkU3RhdGVcbiAgICovXG4gIGxvb2thaGVhZCgpOiBMb29rYWhlYWRTdGF0ZSB7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZvciBwZXJmb3JtYW5jZSB3ZSB1c2UgYSBzaW1wbGlmaWVkIHRva2VuaXplciBzdGF0ZSBzdHJ1Y3R1cmVcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5jcmVhdGVMb29rYWhlYWRTdGF0ZShvbGQpO1xuXG4gICAgdGhpcy5pc0xvb2thaGVhZCA9IHRydWU7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB0aGlzLmlzTG9va2FoZWFkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjdXJyID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnN0YXRlID0gb2xkO1xuICAgIHJldHVybiBjdXJyO1xuICB9XG5cbiAgbmV4dFRva2VuU3RhcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW5TdGFydFNpbmNlKHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIG5leHRUb2tlblN0YXJ0U2luY2UocG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHBvcztcbiAgICByZXR1cm4gc2tpcFdoaXRlU3BhY2UudGVzdCh0aGlzLmlucHV0KSA/IHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA6IHBvcztcbiAgfVxuXG4gIGxvb2thaGVhZENoYXJDb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLm5leHRUb2tlblN0YXJ0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gbmV4dFRva2VuLCBidXQgaXQgd2lsbCBzdG9wIGF0IGxpbmUgYnJlYWsgd2hlbiBpdCBpcyBzZWVuIGJlZm9yZSB0aGUgbmV4dCB0b2tlblxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0b2tlbiBzdGFydCBvciBsaW5lIGJyZWFrLCB3aGljaGV2ZXIgaXMgc2VlbiBmaXJzdC5cbiAgICogQG1lbWJlcm9mIFRva2VuaXplclxuICAgKi9cbiAgbmV4dFRva2VuSW5MaW5lU3RhcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydFNpbmNlKHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIG5leHRUb2tlbkluTGluZVN0YXJ0U2luY2UocG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHNraXBXaGl0ZVNwYWNlSW5MaW5lLmxhc3RJbmRleCA9IHBvcztcbiAgICByZXR1cm4gc2tpcFdoaXRlU3BhY2VJbkxpbmUudGVzdCh0aGlzLmlucHV0KVxuICAgICAgPyBza2lwV2hpdGVTcGFjZUluTGluZS5sYXN0SW5kZXhcbiAgICAgIDogcG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gbG9va2FoZWFkQ2hhckNvZGUsIGJ1dCBpdCB3aWxsIHJldHVybiB0aGUgY2hhciBjb2RlIG9mIGxpbmUgYnJlYWsgaWYgaXQgaXNcbiAgICogc2VlbiBiZWZvcmUgdGhlIG5leHQgdG9rZW5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gY2hhciBjb2RlIG9mIHRoZSBuZXh0IHRva2VuIHN0YXJ0IG9yIGxpbmUgYnJlYWssIHdoaWNoZXZlciBpcyBzZWVuIGZpcnN0LlxuICAgKiBAbWVtYmVyb2YgVG9rZW5pemVyXG4gICAqL1xuICBsb29rYWhlYWRJbkxpbmVDaGFyQ29kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydCgpKTtcbiAgfVxuXG4gIGNvZGVQb2ludEF0UG9zKHBvczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb25cbiAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFzdGVyOnY4L3NyYy9idWlsdGlucy9idWlsdGlucy1zdHJpbmctZ2VuLmNjO2w9MTQ1NTtkcmM9MjIxZTMzMWI0OWRmZWZhZGJjNmZhNDBiMGM2OGU2Zjk3NjA2ZDBiMzticHY9MDticHQ9MVxuICAgIC8vIFdlIHJlaW1wbGVtZW50IGBjb2RlUG9pbnRBdGAgYmVjYXVzZSBgY29kZVBvaW50QXRgIGlzIGEgVjggYnVpbHRpbiB3aGljaCBpcyBub3QgaW5saW5lZCBieSBUdXJib0ZhbiAoYXMgb2YgTTkxKVxuICAgIC8vIHNpbmNlIGBpbnB1dGAgaXMgbW9zdGx5IEFTQ0lJLCBhbiBpbmxpbmVkIGBjaGFyQ29kZUF0YCB3aW5zIGhlcmVcbiAgICBsZXQgY3AgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoKGNwICYgMHhmYzAwKSA9PT0gMHhkODAwICYmICsrcG9zIDwgdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRyYWlsID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoKHRyYWlsICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGNwID0gMHgxMDAwMCArICgoY3AgJiAweDNmZikgPDwgMTApICsgKHRyYWlsICYgMHgzZmYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3A7XG4gIH1cblxuICAvLyBUb2dnbGUgc3RyaWN0IG1vZGUuIFJlLXJlYWRzIHRoZSBuZXh0IG51bWJlciBvciBzdHJpbmcgdG8gcGxlYXNlXG4gIC8vIHBlZGFudGljIHRlc3RzIChgXCJ1c2Ugc3RyaWN0XCI7IDAxMDtgIHNob3VsZCBmYWlsKS5cblxuICBzZXRTdHJpY3Qoc3RyaWN0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zdHJpY3QgPSBzdHJpY3Q7XG4gICAgaWYgKHN0cmljdCkge1xuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgZm9yIGFueSBzdHJpbmcgZGVjaW1hbCBlc2NhcGUgZm91bmQgYmVmb3JlL2ltbWVkaWF0ZWx5XG4gICAgICAvLyBhZnRlciBhIFwidXNlIHN0cmljdFwiIGRpcmVjdGl2ZS4gU3RyaWN0IG1vZGUgd2lsbCBiZSBzZXQgYXQgcGFyc2VcbiAgICAgIC8vIHRpbWUgZm9yIGFueSBsaXRlcmFscyB0aGF0IG9jY3VyIGFmdGVyIHRoZSBuZXh0IG5vZGUgb2YgdGhlIHN0cmljdFxuICAgICAgLy8gZGlyZWN0aXZlLlxuICAgICAgdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuZm9yRWFjaCgoW3RvUGFyc2VFcnJvciwgYXRdKSA9PlxuICAgICAgICB0aGlzLnJhaXNlKHRvUGFyc2VFcnJvciwgeyBhdCB9KSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0YXRlLnN0cmljdEVycm9ycy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGN1ckNvbnRleHQoKTogVG9rQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuY29udGV4dFt0aGlzLnN0YXRlLmNvbnRleHQubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBSZWFkIGEgc2luZ2xlIHRva2VuLCB1cGRhdGluZyB0aGUgcGFyc2VyIG9iamVjdCdzIHRva2VuLXJlbGF0ZWQgcHJvcGVydGllcy5cbiAgbmV4dFRva2VuKCk6IHZvaWQge1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIGlmICghdGhpcy5pc0xvb2thaGVhZCkgdGhpcy5zdGF0ZS5zdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuZW9mKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdldFRva2VuRnJvbUNvZGUodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykpO1xuICB9XG5cbiAgLy8gU2tpcHMgYSBibG9jayBjb21tZW50LCB3aG9zZSBlbmQgaXMgbWFya2VkIGJ5IGNvbW1lbnRFbmQuXG4gIC8vICotLyBpcyB1c2VkIGJ5IHRoZSBGbG93IHBsdWdpbiwgd2hlbiBwYXJzaW5nIGJsb2NrIGNvbW1lbnRzIG5lc3RlZFxuICAvLyBpbnNpZGUgRmxvdyBjb21tZW50cy5cbiAgc2tpcEJsb2NrQ29tbWVudChjb21tZW50RW5kOiBcIiovXCIgfCBcIiotL1wiKTogTi5Db21tZW50QmxvY2sgfCB1bmRlZmluZWQge1xuICAgIGxldCBzdGFydExvYztcbiAgICBpZiAoIXRoaXMuaXNMb29rYWhlYWQpIHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dC5pbmRleE9mKGNvbW1lbnRFbmQsIHN0YXJ0ICsgMik7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIGhhdmUgdG8gY2FsbCB0aGlzIGFnYWluIGhlcmUgYmVjYXVzZSBzdGFydExvYyBtYXkgbm90IGJlIHNldC4uLlxuICAgICAgLy8gVGhpcyBzZWVtcyB0byBiZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9jb21taXQvYWNmMmExMDg5OWY2OTZhOGFhZjM0ZGY3OGJmOTcyNWI1ZWE3ZjJkYVxuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkQ29tbWVudCwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBlbmQgKyBjb21tZW50RW5kLmxlbmd0aDtcbiAgICBsaW5lQnJlYWtHLmxhc3RJbmRleCA9IHN0YXJ0ICsgMjtcbiAgICB3aGlsZSAobGluZUJyZWFrRy50ZXN0KHRoaXMuaW5wdXQpICYmIGxpbmVCcmVha0cubGFzdEluZGV4IDw9IGVuZCkge1xuICAgICAgKyt0aGlzLnN0YXRlLmN1ckxpbmU7XG4gICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCA9IGxpbmVCcmVha0cubGFzdEluZGV4O1xuICAgIH1cblxuICAgIC8vIElmIHdlIGFyZSBkb2luZyBhIGxvb2thaGVhZCByaWdodCBub3cgd2UgbmVlZCB0byBhZHZhbmNlIHRoZSBwb3NpdGlvbiAoYWJvdmUgY29kZSlcbiAgICAvLyBidXQgd2UgZG8gbm90IHdhbnQgdG8gcHVzaCB0aGUgY29tbWVudCB0byB0aGUgc3RhdGUuXG4gICAgaWYgKHRoaXMuaXNMb29rYWhlYWQpIHJldHVybjtcbiAgICAvKjo6IGludmFyaWFudChzdGFydExvYykgKi9cblxuICAgIGNvbnN0IGNvbW1lbnQ6IE4uQ29tbWVudEJsb2NrID0ge1xuICAgICAgdHlwZTogXCJDb21tZW50QmxvY2tcIixcbiAgICAgIHZhbHVlOiB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgZW5kKSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kOiBlbmQgKyBjb21tZW50RW5kLmxlbmd0aCxcbiAgICAgIGxvYzogbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXJ0TG9jLCB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkpLFxuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbnMpIHRoaXMucHVzaFRva2VuKGNvbW1lbnQpO1xuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgc2tpcExpbmVDb21tZW50KHN0YXJ0U2tpcDogbnVtYmVyKTogTi5Db21tZW50TGluZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBsZXQgc3RhcnRMb2M7XG4gICAgaWYgKCF0aGlzLmlzTG9va2FoZWFkKSBzdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBsZXQgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKHRoaXMuc3RhdGUucG9zICs9IHN0YXJ0U2tpcCkpO1xuICAgIGlmICh0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICB3aGlsZSAoIWlzTmV3TGluZShjaCkgJiYgKyt0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBhcmUgZG9pbmcgYSBsb29rYWhlYWQgcmlnaHQgbm93IHdlIG5lZWQgdG8gYWR2YW5jZSB0aGUgcG9zaXRpb24gKGFib3ZlIGNvZGUpXG4gICAgLy8gYnV0IHdlIGRvIG5vdCB3YW50IHRvIHB1c2ggdGhlIGNvbW1lbnQgdG8gdGhlIHN0YXRlLlxuICAgIGlmICh0aGlzLmlzTG9va2FoZWFkKSByZXR1cm47XG4gICAgLyo6OiBpbnZhcmlhbnQoc3RhcnRMb2MpICovXG5cbiAgICBjb25zdCBlbmQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQgKyBzdGFydFNraXAsIGVuZCk7XG5cbiAgICBjb25zdCBjb21tZW50OiBOLkNvbW1lbnRMaW5lID0ge1xuICAgICAgdHlwZTogXCJDb21tZW50TGluZVwiLFxuICAgICAgdmFsdWUsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZCxcbiAgICAgIGxvYzogbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXJ0TG9jLCB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkpLFxuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbnMpIHRoaXMucHVzaFRva2VuKGNvbW1lbnQpO1xuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgYW5kIGFmdGVyIGV2ZXJ5IHRva2VuLiBTa2lwc1xuICAvLyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgYW5kLlxuXG4gIHNraXBTcGFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzcGFjZVN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgY29uc3QgY29tbWVudHMgPSBbXTtcbiAgICBsb29wOiB3aGlsZSAodGhpcy5zdGF0ZS5wb3MgPCB0aGlzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIGNoYXJDb2Rlcy5zcGFjZTpcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMubm9uQnJlYWtpbmdTcGFjZTpcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMudGFiOlxuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMubGluZUZlZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgfVxuICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMubGluZUZlZWQ6XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLnBhcmFncmFwaFNlcGFyYXRvcjpcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5jdXJMaW5lO1xuICAgICAgICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjaGFyQ29kZXMuc2xhc2g6XG4gICAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKSkge1xuICAgICAgICAgICAgY2FzZSBjaGFyQ29kZXMuYXN0ZXJpc2s6IHtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcEJsb2NrQ29tbWVudChcIiovXCIpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBjaGFyQ29kZXMuc2xhc2g6IHtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNoKSkge1xuICAgICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5kYXNoICYmXG4gICAgICAgICAgICAhdGhpcy5pbk1vZHVsZSAmJlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFubmV4QlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gY2hhckNvZGVzLmRhc2ggJiZcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDIpID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gJiZcbiAgICAgICAgICAgICAgKHNwYWNlU3RhcnQgPT09IDAgfHwgdGhpcy5zdGF0ZS5saW5lU3RhcnQgPiBzcGFjZVN0YXJ0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEEgYC0tPmAgbGluZSBjb21tZW50XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLnNraXBMaW5lQ29tbWVudCgzKTtcbiAgICAgICAgICAgICAgaWYgKGNvbW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF0dGFjaENvbW1lbnQpIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNoID09PSBjaGFyQ29kZXMubGVzc1RoYW4gJiZcbiAgICAgICAgICAgICF0aGlzLmluTW9kdWxlICYmXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYW5uZXhCXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrICYmXG4gICAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAyKSA9PT0gY2hhckNvZGVzLmRhc2ggJiZcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDMpID09PSBjaGFyQ29kZXMuZGFzaFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIGA8IS0tYCwgYW4gWE1MLXN0eWxlIGNvbW1lbnQgdGhhdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lIGNvbW1lbnRcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcExpbmVDb21tZW50KDQpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuc3RhdGUucG9zO1xuICAgICAgY29uc3QgY29tbWVudFdoaXRlc3BhY2U6IENvbW1lbnRXaGl0ZXNwYWNlID0ge1xuICAgICAgICBzdGFydDogc3BhY2VTdGFydCxcbiAgICAgICAgZW5kLFxuICAgICAgICBjb21tZW50cyxcbiAgICAgICAgbGVhZGluZ05vZGU6IG51bGwsXG4gICAgICAgIHRyYWlsaW5nTm9kZTogbnVsbCxcbiAgICAgICAgY29udGFpbmluZ05vZGU6IG51bGwsXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0ZS5jb21tZW50U3RhY2sucHVzaChjb21tZW50V2hpdGVzcGFjZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgdG9rZW4uIFNldHMgYGVuZGAsIGB2YWxgLCBhbmRcbiAgLy8gbWFpbnRhaW5zIGBjb250ZXh0YCBhbmQgYGNhblN0YXJ0SlNYRWxlbWVudGAsIGFuZCBza2lwcyB0aGUgc3BhY2UgYWZ0ZXJcbiAgLy8gdGhlIHRva2VuLCBzbyB0aGF0IHRoZSBuZXh0IG9uZSdzIGBzdGFydGAgd2lsbCBwb2ludCBhdCB0aGVcbiAgLy8gcmlnaHQgcG9zaXRpb24uXG5cbiAgZmluaXNoVG9rZW4odHlwZTogVG9rZW5UeXBlLCB2YWw/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmVuZCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIHRoaXMuc3RhdGUuZW5kTG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGNvbnN0IHByZXZUeXBlID0gdGhpcy5zdGF0ZS50eXBlO1xuICAgIHRoaXMuc3RhdGUudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHZhbDtcblxuICAgIGlmICghdGhpcy5pc0xvb2thaGVhZCkge1xuICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHByZXZUeXBlKTtcbiAgICB9XG4gIH1cblxuICByZXBsYWNlVG9rZW4odHlwZTogVG9rZW5UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS50eXBlID0gdHlwZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBwcmV2VHlwZSBvZiB1cGRhdGVDb250ZXh0IGlzIHJlcXVpcmVkXG4gICAgLy8gb25seSB3aGVuIHRoZSBuZXcgdHlwZSBpcyB0dC5zbGFzaC90dC5qc3hUYWdFbmRcbiAgICB0aGlzLnVwZGF0ZUNvbnRleHQoKTtcbiAgfVxuXG4gIC8vICMjIyBUb2tlbiByZWFkaW5nXG5cbiAgLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gZmV0Y2ggdGhlIG5leHQgdG9rZW4uIEl0XG4gIC8vIGlzIHNvbWV3aGF0IG9ic2N1cmUsIGJlY2F1c2UgaXQgd29ya3MgaW4gY2hhcmFjdGVyIGNvZGVzIHJhdGhlclxuICAvLyB0aGFuIGNoYXJhY3RlcnMsIGFuZCBiZWNhdXNlIG9wZXJhdG9yIHBhcnNpbmcgaGFzIGJlZW4gaW5saW5lZFxuICAvLyBpbnRvIGl0LlxuICAvL1xuICAvLyBBbGwgaW4gdGhlIG5hbWUgb2Ygc3BlZWQuXG5cbiAgLy8gbnVtYmVyIHNpZ24gaXMgXCIjXCJcbiAgcmVhZFRva2VuX251bWJlclNpZ24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUucG9zID09PSAwICYmIHRoaXMucmVhZFRva2VuX2ludGVycHJldGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9zID0gdGhpcy5zdGF0ZS5wb3MgKyAxO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHRQb3MpO1xuICAgIGlmIChuZXh0ID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dCA8PSBjaGFyQ29kZXMuZGlnaXQ5KSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkRGlnaXRBZnRlckhhc2gsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSB8fFxuICAgICAgKG5leHQgPT09IGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldCAmJiB0aGlzLmhhc1BsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpKVxuICAgICkge1xuICAgICAgLy8gV2hlbiB3ZSBzZWUgYCN7YCwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgaGFzaCByZWNvcmQuXG4gICAgICAvLyBIb3dldmVyIHdlIGRvbid0IHllbGwgYXQgYCNbYCBzaW5jZSB1c2VycyBtYXkgaW50ZW5kIHRvIHVzZSBcImNvbXB1dGVkIHByaXZhdGUgZmllbGRzXCIsXG4gICAgICAvLyB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgc3BlYy4gVGhyb3dpbmcgZXhwZWN0aW5nIHJlY29yZEFuZFR1cGxlIGlzXG4gICAgICAvLyBtaXNsZWFkaW5nXG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpO1xuICAgICAgaWYgKHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwicmVjb3JkQW5kVHVwbGVcIiwgXCJzeW50YXhUeXBlXCIpID09PSBcImJhclwiKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoXG4gICAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlXG4gICAgICAgICAgICA/IEVycm9ycy5SZWNvcmRFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZVxuICAgICAgICAgICAgOiBFcnJvcnMuVHVwbGVFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICB7IGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2UpIHtcbiAgICAgICAgLy8gI3tcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFjZUhhc2hMKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICNbXG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2tldEhhc2hMKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSWRlbnRpZmllclN0YXJ0KG5leHQpKSB7XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5wcml2YXRlTmFtZSwgdGhpcy5yZWFkV29yZDEobmV4dCkpO1xuICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQucHJpdmF0ZU5hbWUsIHRoaXMucmVhZFdvcmQxKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0Lmhhc2gsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRUb2tlbl9kb3QoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dCA8PSBjaGFyQ29kZXMuZGlnaXQ5KSB7XG4gICAgICB0aGlzLnJlYWROdW1iZXIodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmRvdCAmJlxuICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikgPT09IGNoYXJDb2Rlcy5kb3RcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDM7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmVsbGlwc2lzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuZG90KTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fc2xhc2goKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuc2xhc2hBc3NpZ24sIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LnNsYXNoLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5faW50ZXJwcmV0ZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3RhdGUucG9zICE9PSAwIHx8IHRoaXMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG4gICAgaWYgKGNoICE9PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIHRoaXMuc3RhdGUucG9zICs9IDE7XG5cbiAgICB3aGlsZSAoIWlzTmV3TGluZShjaCkgJiYgKyt0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgdGhpcy5zdGF0ZS5wb3MpO1xuXG4gICAgdGhpcy5maW5pc2hUb2tlbih0dC5pbnRlcnByZXRlckRpcmVjdGl2ZSwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZWFkVG9rZW5fbXVsdF9tb2R1bG8oY29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gJyUnIG9yICcqJ1xuICAgIGxldCB0eXBlID0gY29kZSA9PT0gY2hhckNvZGVzLmFzdGVyaXNrID8gdHQuc3RhciA6IHR0Lm1vZHVsbztcbiAgICBsZXQgd2lkdGggPSAxO1xuICAgIGxldCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG5cbiAgICAvLyBFeHBvbmVudGlhdGlvbiBvcGVyYXRvciAnKionXG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5hc3RlcmlzayAmJiBuZXh0ID09PSBjaGFyQ29kZXMuYXN0ZXJpc2spIHtcbiAgICAgIHdpZHRoKys7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMik7XG4gICAgICB0eXBlID0gdHQuZXhwb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gJyU9JyBvciAnKj0nXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbyAmJiAhdGhpcy5zdGF0ZS5pblR5cGUpIHtcbiAgICAgIHdpZHRoKys7XG4gICAgICAvLyBgdHQubW9kdWxvQXNzaWduYCBpcyBvbmx5IG5lZWRlZCB0byBzdXBwb3J0ICUgYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gICAgICAvLyBJZiB0aGUgcHJvcG9zYWwgZW5kcyB1cCBjaG9vc2luZyBhIGRpZmZlcmVudCB0b2tlbixcbiAgICAgIC8vIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCB0dC5hc3NpZ24uXG4gICAgICB0eXBlID0gY29kZSA9PT0gY2hhckNvZGVzLnBlcmNlbnRTaWduID8gdHQubW9kdWxvQXNzaWduIDogdHQuYXNzaWduO1xuICAgIH1cblxuICAgIHRoaXMuZmluaXNoT3AodHlwZSwgd2lkdGgpO1xuICB9XG5cbiAgcmVhZFRva2VuX3BpcGVfYW1wKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vICd8fCcgJyYmJyAnfHw9JyAnJiY9J1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcblxuICAgIGlmIChuZXh0ID09PSBjb2RlKSB7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKFxuICAgICAgICAgIGNvZGUgPT09IGNoYXJDb2Rlcy52ZXJ0aWNhbEJhciA/IHR0LmxvZ2ljYWxPUiA6IHR0LmxvZ2ljYWxBTkQsXG4gICAgICAgICAgMixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyKSB7XG4gICAgICAvLyAnfD4nXG4gICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuKSB7XG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQucGlwZWxpbmUsIDIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyAnfH0nXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnJpZ2h0Q3VybHlCcmFjZVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlLCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2VCYXJSKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyAnfF0nXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlR1cGxlRXhwcmVzc2lvbkJhckluY29ycmVjdEVuZFN5bnRheFR5cGUsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFja2V0QmFyUik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maW5pc2hPcChcbiAgICAgIGNvZGUgPT09IGNoYXJDb2Rlcy52ZXJ0aWNhbEJhciA/IHR0LmJpdHdpc2VPUiA6IHR0LmJpdHdpc2VBTkQsXG4gICAgICAxLFxuICAgICk7XG4gIH1cblxuICByZWFkVG9rZW5fY2FyZXQoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuXG4gICAgLy8gJ149J1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8gJiYgIXRoaXMuc3RhdGUuaW5UeXBlKSB7XG4gICAgICAvLyBgdHQueG9yQXNzaWduYCBpcyBvbmx5IG5lZWRlZCB0byBzdXBwb3J0IF4gYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gICAgICAvLyBJZiB0aGUgcHJvcG9zYWwgZW5kcyB1cCBjaG9vc2luZyBhIGRpZmZlcmVudCB0b2tlbixcbiAgICAgIC8vIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCB0dC5hc3NpZ24uXG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LnhvckFzc2lnbiwgMik7XG4gICAgfVxuICAgIC8vICdeXidcbiAgICBlbHNlIGlmIChcbiAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5jYXJldCAmJlxuICAgICAgLy8gSWYgdGhlIF5eIHRva2VuIGlzIG5vdCBlbmFibGVkLCB3ZSBkb24ndCB0aHJvdyBidXQgcGFyc2UgdHdvIHNpbmdsZSBec1xuICAgICAgLy8gYmVjYXVzZSBpdCBjb3VsZCBiZSBhIF4gaGFjayB0b2tlbiBmb2xsb3dlZCBieSBhIF4gYmluYXJ5IG9wZXJhdG9yLlxuICAgICAgdGhpcy5oYXNQbHVnaW4oW1xuICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgeyBwcm9wb3NhbDogXCJoYWNrXCIsIHRvcGljVG9rZW46IFwiXl5cIiB9LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuZG91YmxlQ2FyZXQsIDIpO1xuXG4gICAgICAvLyBgXl5eYCBpcyBmb3JiaWRkZW4gYW5kIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gICAgICBjb25zdCBsb29rYWhlYWRDaCA9IHRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGxvb2thaGVhZENoID09PSBjaGFyQ29kZXMuY2FyZXQpIHtcbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vICdeJ1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5iaXR3aXNlWE9SLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fYXRTaWduKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcblxuICAgIC8vICdAQCdcbiAgICBpZiAoXG4gICAgICBuZXh0ID09PSBjaGFyQ29kZXMuYXRTaWduICYmXG4gICAgICB0aGlzLmhhc1BsdWdpbihbXG4gICAgICAgIFwicGlwZWxpbmVPcGVyYXRvclwiLFxuICAgICAgICB7IHByb3Bvc2FsOiBcImhhY2tcIiwgdG9waWNUb2tlbjogXCJAQFwiIH0sXG4gICAgICBdKVxuICAgICkge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5kb3VibGVBdCwgMik7XG4gICAgfVxuICAgIC8vICdAJ1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5hdCwgMSk7XG4gICAgfVxuICB9XG5cbiAgcmVhZFRva2VuX3BsdXNfbWluKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vICcrLSdcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG5cbiAgICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5pbmNEZWMsIDIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuYXNzaWduLCAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5wbHVzTWluLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fbHQoKTogdm9pZCB7XG4gICAgLy8gJzwnXG4gICAgY29uc3QgeyBwb3MgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKTtcblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubGVzc1RoYW4pIHtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zICsgMikgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoT3AodHQuYml0U2hpZnRMLCAyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAvLyA8PVxuICAgICAgdGhpcy5maW5pc2hPcCh0dC5yZWxhdGlvbmFsLCAyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaE9wKHR0Lmx0LCAxKTtcbiAgfVxuXG4gIHJlYWRUb2tlbl9ndCgpOiB2b2lkIHtcbiAgICAvLyAnPidcbiAgICBjb25zdCB7IHBvcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpO1xuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5ncmVhdGVyVGhhbikge1xuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAyKSA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuID8gMyA6IDI7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIHNpemUpID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5hc3NpZ24sIHNpemUgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5maW5pc2hPcCh0dC5iaXRTaGlmdFIsIHNpemUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIC8vIDw9IHwgPj1cbiAgICAgIHRoaXMuZmluaXNoT3AodHQucmVsYXRpb25hbCwgMik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maW5pc2hPcCh0dC5ndCwgMSk7XG4gIH1cblxuICByZWFkVG9rZW5fZXFfZXhjbChjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyAnPSEnXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AoXG4gICAgICAgIHR0LmVxdWFsaXR5LFxuICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAyKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICAgICAgPyAzXG4gICAgICAgICAgOiAyLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbyAmJiBuZXh0ID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4pIHtcbiAgICAgIC8vICc9PidcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmFycm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hPcChjb2RlID09PSBjaGFyQ29kZXMuZXF1YWxzVG8gPyB0dC5lcSA6IHR0LmJhbmcsIDEpO1xuICB9XG5cbiAgcmVhZFRva2VuX3F1ZXN0aW9uKCk6IHZvaWQge1xuICAgIC8vICc/J1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcbiAgICBjb25zdCBuZXh0MiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDIpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMucXVlc3Rpb25NYXJrKSB7XG4gICAgICBpZiAobmV4dDIgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICAvLyAnPz89J1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAnPz8nXG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQubnVsbGlzaENvYWxlc2NpbmcsIDIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBuZXh0ID09PSBjaGFyQ29kZXMuZG90ICYmXG4gICAgICAhKG5leHQyID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dDIgPD0gY2hhckNvZGVzLmRpZ2l0OSlcbiAgICApIHtcbiAgICAgIC8vICcuJyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXJcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnF1ZXN0aW9uRG90KTtcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQucXVlc3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldFRva2VuRnJvbUNvZGUoY29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAvLyBUaGUgaW50ZXJwcmV0YXRpb24gb2YgYSBkb3QgZGVwZW5kcyBvbiB3aGV0aGVyIGl0IGlzIGZvbGxvd2VkXG4gICAgICAvLyBieSBhIGRpZ2l0IG9yIGFub3RoZXIgdHdvIGRvdHMuXG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmRvdDpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fZG90KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIFB1bmN0dWF0aW9uIHRva2Vucy5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlZnRQYXJlbnRoZXNpczpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5wYXJlbkwpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzOlxuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnBhcmVuUik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLnNlbWljb2xvbjpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5zZW1pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBjaGFyQ29kZXMuY29tbWE6XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuY29tbWEpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShcbiAgICAgICAgICAgICAgRXJyb3JzLlR1cGxlRXhwcmVzc2lvbkJhckluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFt8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNrZXRCYXJMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2tldEwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldDpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFja2V0Uik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5oYXNQbHVnaW4oXCJyZWNvcmRBbmRUdXBsZVwiKSAmJlxuICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMudmVydGljYWxCYXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwicmVjb3JkQW5kVHVwbGVcIiwgXCJzeW50YXhUeXBlXCIpICE9PSBcImJhclwiKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKFxuICAgICAgICAgICAgICBFcnJvcnMuUmVjb3JkRXhwcmVzc2lvbkJhckluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHt8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlQmFyTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlTCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlOlxuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlUik7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBjaGFyQ29kZXMuY29sb246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmhhc1BsdWdpbihcImZ1bmN0aW9uQmluZFwiKSAmJlxuICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMuY29sb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5kb3VibGVDb2xvbiwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmNvbG9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnF1ZXN0aW9uTWFyazpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fcXVlc3Rpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5ncmF2ZUFjY2VudDpcbiAgICAgICAgdGhpcy5yZWFkVGVtcGxhdGVUb2tlbigpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmRpZ2l0MDoge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG4gICAgICAgIC8vICcweCcsICcwWCcgLSBoZXggbnVtYmVyXG4gICAgICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlWCB8fCBuZXh0ID09PSBjaGFyQ29kZXMudXBwZXJjYXNlWCkge1xuICAgICAgICAgIHRoaXMucmVhZFJhZGl4TnVtYmVyKDE2KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gJzBvJywgJzBPJyAtIG9jdGFsIG51bWJlclxuICAgICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZU8gfHwgbmV4dCA9PT0gY2hhckNvZGVzLnVwcGVyY2FzZU8pIHtcbiAgICAgICAgICB0aGlzLnJlYWRSYWRpeE51bWJlcig4KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gJzBiJywgJzBCJyAtIGJpbmFyeSBudW1iZXJcbiAgICAgICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VCIHx8IG5leHQgPT09IGNoYXJDb2Rlcy51cHBlcmNhc2VCKSB7XG4gICAgICAgICAgdGhpcy5yZWFkUmFkaXhOdW1iZXIoMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbnl0aGluZyBlbHNlIGJlZ2lubmluZyB3aXRoIGEgZGlnaXQgaXMgYW4gaW50ZWdlciwgb2N0YWxcbiAgICAgIC8vIG51bWJlciwgb3IgZmxvYXQuIChmYWxsIHRocm91Z2gpXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDE6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDI6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDM6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDQ6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDU6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDY6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDc6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDg6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDk6XG4gICAgICAgIHRoaXMucmVhZE51bWJlcihmYWxzZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gUXVvdGVzIHByb2R1Y2Ugc3RyaW5ncy5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnF1b3RhdGlvbk1hcms6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5hcG9zdHJvcGhlOlxuICAgICAgICB0aGlzLnJlYWRTdHJpbmcoY29kZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gT3BlcmF0b3JzIGFyZSBwYXJzZWQgaW5saW5lIGluIHRpbnkgc3RhdGUgbWFjaGluZXMuICc9JyAoY2hhckNvZGVzLmVxdWFsc1RvKSBpc1xuICAgICAgLy8gb2Z0ZW4gcmVmZXJyZWQgdG8uIGBmaW5pc2hPcGAgc2ltcGx5IHNraXBzIHRoZSBhbW91bnQgb2ZcbiAgICAgIC8vIGNoYXJhY3RlcnMgaXQgaXMgZ2l2ZW4gYXMgc2Vjb25kIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhIHRva2VuXG4gICAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnNsYXNoOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9zbGFzaCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnBlcmNlbnRTaWduOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuYXN0ZXJpc2s6XG4gICAgICAgIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnZlcnRpY2FsQmFyOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuYW1wZXJzYW5kOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9waXBlX2FtcChjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5jYXJldDpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fY2FyZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5wbHVzU2lnbjpcbiAgICAgIGNhc2UgY2hhckNvZGVzLmRhc2g6XG4gICAgICAgIHRoaXMucmVhZFRva2VuX3BsdXNfbWluKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlc3NUaGFuOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9sdCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmdyZWF0ZXJUaGFuOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9ndCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmVxdWFsc1RvOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9lcV9leGNsKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnRpbGRlOlxuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LnRpbGRlLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5hdFNpZ246XG4gICAgICAgIHRoaXMucmVhZFRva2VuX2F0U2lnbigpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLm51bWJlclNpZ246XG4gICAgICAgIHRoaXMucmVhZFRva2VuX251bWJlclNpZ24oKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5iYWNrc2xhc2g6XG4gICAgICAgIHRoaXMucmVhZFdvcmQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY29kZSkpIHtcbiAgICAgICAgICB0aGlzLnJlYWRXb3JkKGNvZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRPclVuZXhwZWN0ZWRUb2tlbiwge1xuICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIHVuZXhwZWN0ZWQ6IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpLFxuICAgIH0pO1xuICB9XG5cbiAgZmluaXNoT3AodHlwZTogVG9rZW5UeXBlLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhdGUucG9zLCB0aGlzLnN0YXRlLnBvcyArIHNpemUpO1xuICAgIHRoaXMuc3RhdGUucG9zICs9IHNpemU7XG4gICAgdGhpcy5maW5pc2hUb2tlbih0eXBlLCBzdHIpO1xuICB9XG5cbiAgcmVhZFJlZ2V4cCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnN0YXJ0ICsgMTtcbiAgICBsZXQgZXNjYXBlZCwgaW5DbGFzcztcbiAgICBsZXQgeyBwb3MgfSA9IHRoaXMuc3RhdGU7XG4gICAgZm9yICg7IDsgKytwb3MpIHtcbiAgICAgIGlmIChwb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gRklYTUU6IGV4cGxhaW5cbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkUmVnRXhwLCB7XG4gICAgICAgICAgYXQ6IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChzdGFydExvYywgMSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICAgIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVudGVybWluYXRlZFJlZ0V4cCwge1xuICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIDEpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjaCA9PT0gY2hhckNvZGVzLmxlZnRTcXVhcmVCcmFja2V0KSB7XG4gICAgICAgICAgaW5DbGFzcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IGNoYXJDb2Rlcy5yaWdodFNxdWFyZUJyYWNrZXQgJiYgaW5DbGFzcykge1xuICAgICAgICAgIGluQ2xhc3MgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLnNsYXNoICYmICFpbkNsYXNzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZCA9IGNoID09PSBjaGFyQ29kZXMuYmFja3NsYXNoO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgcG9zKTtcbiAgICArK3BvcztcblxuICAgIGxldCBtb2RzID0gXCJcIjtcblxuICAgIGNvbnN0IG5leHRQb3MgPSAoKSA9PlxuICAgICAgLy8gKHBvcyArIDEpICsgMSAtIHN0YXJ0XG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIHBvcyArIDIgLSBzdGFydCk7XG5cbiAgICB3aGlsZSAocG9zIDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNwID0gdGhpcy5jb2RlUG9pbnRBdFBvcyhwb3MpO1xuICAgICAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3AgPiAweGZmZmYsIHRoZSBsb29wIHdpbGwgZWl0aGVyIHRocm93IG9yIGJyZWFrIGJlY2F1c2Ugd2UgY2hlY2sgb24gY3BcbiAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKTtcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBWQUxJRF9SRUdFWF9GTEFHUy5oYXMgc2hvdWxkIGFjY2VwdCBleHBhbmRlZCB0eXBlOiBudW1iZXJcbiAgICAgIGlmIChWQUxJRF9SRUdFWF9GTEFHUy5oYXMoY3ApKSB7XG4gICAgICAgIGlmIChjcCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZVYpIHtcbiAgICAgICAgICBpZiAobW9kcy5pbmNsdWRlcyhcInVcIikpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkluY29tcGF0aWJsZVJlZ0V4cFVWRmxhZ3MsIHsgYXQ6IG5leHRQb3MoKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VVKSB7XG4gICAgICAgICAgaWYgKG1vZHMuaW5jbHVkZXMoXCJ2XCIpKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbmNvbXBhdGlibGVSZWdFeHBVVkZsYWdzLCB7IGF0OiBuZXh0UG9zKCkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RzLmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRHVwbGljYXRlUmVnRXhwRmxhZ3MsIHsgYXQ6IG5leHRQb3MoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0lkZW50aWZpZXJDaGFyKGNwKSB8fCBjcCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5NYWxmb3JtZWRSZWdFeHBGbGFncywgeyBhdDogbmV4dFBvcygpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgICsrcG9zO1xuICAgICAgbW9kcyArPSBjaGFyO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcztcblxuICAgIHRoaXMuZmluaXNoVG9rZW4odHQucmVnZXhwLCB7XG4gICAgICBwYXR0ZXJuOiBjb250ZW50LFxuICAgICAgZmxhZ3M6IG1vZHMsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGFuIGludGVnZXIgaW4gdGhlIGdpdmVuIHJhZGl4LiBSZXR1cm4gbnVsbCBpZiB6ZXJvIGRpZ2l0c1xuICAvLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuICAvLyB3aWxsIHJldHVybiBgbnVsbGAgdW5sZXNzIHRoZSBpbnRlZ2VyIGhhcyBleGFjdGx5IGBsZW5gIGRpZ2l0cy5cbiAgLy8gV2hlbiBgZm9yY2VMZW5gIGlzIGB0cnVlYCwgaXQgbWVhbnMgdGhhdCB3ZSBhbHJlYWR5IGtub3cgdGhhdCBpbiBjYXNlXG4gIC8vIG9mIGEgbWFsZm9ybWVkIG51bWJlciB3ZSBoYXZlIHRvIHNraXAgYGxlbmAgY2hhcmFjdGVycyBhbnl3YXksIGluc3RlYWRcbiAgLy8gb2YgYmFpbGluZyBvdXQgZWFybHkuIEZvciBleGFtcGxlLCBpbiBcIlxcdXsxMjNafVwiIHdlIHdhbnQgdG8gcmVhZCB1cCB0byB9XG4gIC8vIGFueXdheSwgd2hpbGUgaW4gXCJcXHUwMFpcIiB3ZSB3aWxsIHN0b3AgYXQgWiBpbnN0ZWFkIG9mIGNvbnN1bWluZyBmb3VyXG4gIC8vIGNoYXJhY3RlcnMgKGFuZCB0aHVzIHRoZSBjbG9zaW5nIHF1b3RlKS5cblxuICByZWFkSW50KFxuICAgIHJhZGl4OiBudW1iZXIsXG4gICAgbGVuPzogbnVtYmVyLFxuICAgIGZvcmNlTGVuOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWxsb3dOdW1TZXBhcmF0b3I6IGJvb2xlYW4gfCBcImJhaWxcIiA9IHRydWUsXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHsgbiwgcG9zIH0gPSByZWFkSW50KFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zLFxuICAgICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQsXG4gICAgICB0aGlzLnN0YXRlLmN1ckxpbmUsXG4gICAgICByYWRpeCxcbiAgICAgIGxlbixcbiAgICAgIGZvcmNlTGVuLFxuICAgICAgYWxsb3dOdW1TZXBhcmF0b3IsXG4gICAgICB0aGlzLmVycm9ySGFuZGxlcnNfcmVhZEludCxcbiAgICAgIC8qIGJhaWxPbkVycm9yICovIGZhbHNlLFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBwb3M7XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICByZWFkUmFkaXhOdW1iZXIocmFkaXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGxldCBpc0JpZ0ludCA9IGZhbHNlO1xuXG4gICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjsgLy8gMHhcbiAgICBjb25zdCB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZERpZ2l0LCB7XG4gICAgICAgIC8vIE51bWVyaWMgbGl0ZXJhbHMgY2FuJ3QgaGF2ZSBuZXdsaW5lcywgc28gdGhpcyBpcyBzYWZlIHRvIGRvLlxuICAgICAgICBhdDogY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KHN0YXJ0TG9jLCAyKSxcbiAgICAgICAgcmFkaXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZU4pIHtcbiAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpc0JpZ0ludCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlTSkge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZERlY2ltYWwsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGVQb2ludEF0UG9zKHRoaXMuc3RhdGUucG9zKSkpIHtcbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLk51bWJlcklkZW50aWZpZXIsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0JpZ0ludCkge1xuICAgICAgY29uc3Qgc3RyID0gdGhpcy5pbnB1dFxuICAgICAgICAuc2xpY2Uoc3RhcnRMb2MuaW5kZXgsIHRoaXMuc3RhdGUucG9zKVxuICAgICAgICAucmVwbGFjZSgvW19uXS9nLCBcIlwiKTtcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYmlnaW50LCBzdHIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmluaXNoVG9rZW4odHQubnVtLCB2YWwpO1xuICB9XG5cbiAgLy8gUmVhZCBhbiBpbnRlZ2VyLCBvY3RhbCBpbnRlZ2VyLCBvciBmbG9hdGluZy1wb2ludCBudW1iZXIuXG5cbiAgcmVhZE51bWJlcihzdGFydHNXaXRoRG90OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBsZXQgaXNGbG9hdCA9IGZhbHNlO1xuICAgIGxldCBpc0JpZ0ludCA9IGZhbHNlO1xuICAgIGxldCBpc0RlY2ltYWwgPSBmYWxzZTtcbiAgICBsZXQgaGFzRXhwb25lbnQgPSBmYWxzZTtcbiAgICBsZXQgaXNPY3RhbCA9IGZhbHNlO1xuXG4gICAgaWYgKCFzdGFydHNXaXRoRG90ICYmIHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWROdW1iZXIsIHsgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSB9KTtcbiAgICB9XG4gICAgY29uc3QgaGFzTGVhZGluZ1plcm8gPVxuICAgICAgdGhpcy5zdGF0ZS5wb3MgLSBzdGFydCA+PSAyICYmXG4gICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQoc3RhcnQpID09PSBjaGFyQ29kZXMuZGlnaXQwO1xuXG4gICAgaWYgKGhhc0xlYWRpbmdaZXJvKSB7XG4gICAgICBjb25zdCBpbnRlZ2VyID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgdGhpcy5yZWNvcmRTdHJpY3RNb2RlRXJyb3JzKEVycm9ycy5TdHJpY3RPY3RhbExpdGVyYWwsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLnN0cmljdCkge1xuICAgICAgICAvLyBkaXNhbGxvdyBudW1lcmljIHNlcGFyYXRvcnMgaW4gbm9uIG9jdGFsIGRlY2ltYWxzIGFuZCBsZWdhY3kgb2N0YWwgbGlrZXNcbiAgICAgICAgY29uc3QgdW5kZXJzY29yZVBvcyA9IGludGVnZXIuaW5kZXhPZihcIl9cIik7XG4gICAgICAgIGlmICh1bmRlcnNjb3JlUG9zID4gMCkge1xuICAgICAgICAgIC8vIE51bWVyaWMgbGl0ZXJhbHMgY2FuJ3QgaGF2ZSBuZXdsaW5lcywgc28gdGhpcyBpcyBzYWZlIHRvIGRvLlxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlplcm9EaWdpdE51bWVyaWNTZXBhcmF0b3IsIHtcbiAgICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIHVuZGVyc2NvcmVQb3MpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpc09jdGFsID0gaGFzTGVhZGluZ1plcm8gJiYgIS9bODldLy50ZXN0KGludGVnZXIpO1xuICAgIH1cblxuICAgIGxldCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmRvdCAmJiAhaXNPY3RhbCkge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMucmVhZEludCgxMCk7XG4gICAgICBpc0Zsb2F0ID0gdHJ1ZTtcbiAgICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChuZXh0ID09PSBjaGFyQ29kZXMudXBwZXJjYXNlRSB8fCBuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlRSkgJiZcbiAgICAgICFpc09jdGFsXG4gICAgKSB7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5wbHVzU2lnbiB8fCBuZXh0ID09PSBjaGFyQ29kZXMuZGFzaCkge1xuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZE9yTWlzc2luZ0V4cG9uZW50LCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIGlzRmxvYXQgPSB0cnVlO1xuICAgICAgaGFzRXhwb25lbnQgPSB0cnVlO1xuICAgICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VOKSB7XG4gICAgICAvLyBkaXNhbGxvdyBmbG9hdHMsIGxlZ2FjeSBvY3RhbCBzeW50YXggYW5kIG5vbiBvY3RhbCBkZWNpbWFsc1xuICAgICAgLy8gbmV3IHN0eWxlIG9jdGFsIChcIjBvXCIpIGlzIGhhbmRsZWQgaW4gdGhpcy5yZWFkUmFkaXhOdW1iZXJcbiAgICAgIGlmIChpc0Zsb2F0IHx8IGhhc0xlYWRpbmdaZXJvKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRCaWdJbnRMaXRlcmFsLCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpc0JpZ0ludCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VNKSB7XG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcImRlY2ltYWxcIiwgdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpKTtcbiAgICAgIGlmIChoYXNFeHBvbmVudCB8fCBoYXNMZWFkaW5nWmVybykge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRGVjaW1hbCwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgICB9XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgaXNEZWNpbWFsID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5OdW1iZXJJZGVudGlmaWVyLCB7XG4gICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgXCJfXCIgZm9yIG51bWVyaWMgbGl0ZXJhbCBzZXBhcmF0b3IsIGFuZCB0cmFpbGluZyBgbWAgb3IgYG5gXG4gICAgY29uc3Qgc3RyID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5zdGF0ZS5wb3MpLnJlcGxhY2UoL1tfbW5dL2csIFwiXCIpO1xuXG4gICAgaWYgKGlzQmlnSW50KSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJpZ2ludCwgc3RyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNEZWNpbWFsKSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmRlY2ltYWwsIHN0cik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gaXNPY3RhbCA/IHBhcnNlSW50KHN0ciwgOCkgOiBwYXJzZUZsb2F0KHN0cik7XG4gICAgdGhpcy5maW5pc2hUb2tlbih0dC5udW0sIHZhbCk7XG4gIH1cblxuICAvLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuXG5cbiAgcmVhZENvZGVQb2ludCh0aHJvd09uSW52YWxpZDogYm9vbGVhbik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHsgY29kZSwgcG9zIH0gPSByZWFkQ29kZVBvaW50KFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zLFxuICAgICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQsXG4gICAgICB0aGlzLnN0YXRlLmN1ckxpbmUsXG4gICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyc19yZWFkQ29kZVBvaW50LFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBwb3M7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICByZWFkU3RyaW5nKHF1b3RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0ciwgcG9zLCBjdXJMaW5lLCBsaW5lU3RhcnQgfSA9IHJlYWRTdHJpbmdDb250ZW50cyhcbiAgICAgIHF1b3RlID09PSBjaGFyQ29kZXMucXVvdGF0aW9uTWFyayA/IFwiZG91YmxlXCIgOiBcInNpbmdsZVwiLFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zICsgMSwgLy8gc2tpcCB0aGUgcXVvdGVcbiAgICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0LFxuICAgICAgdGhpcy5zdGF0ZS5jdXJMaW5lLFxuICAgICAgdGhpcy5lcnJvckhhbmRsZXJzX3JlYWRTdHJpbmdDb250ZW50c19zdHJpbmcsXG4gICAgKTtcbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcyArIDE7IC8vIHNraXAgdGhlIHF1b3RlXG4gICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgdGhpcy5zdGF0ZS5jdXJMaW5lID0gY3VyTGluZTtcbiAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnN0cmluZywgc3RyKTtcbiAgfVxuXG4gIC8vIFJlYWRzIHRlbXBsYXRlIGNvbnRpbnVhdGlvbiBgfS4uLmBcbiAgcmVhZFRlbXBsYXRlQ29udGludWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQobnVsbCwgdHQuYnJhY2VSKTtcbiAgICB9XG4gICAgLy8gcmV3aW5kIHBvcyB0byBgfWBcbiAgICB0aGlzLnN0YXRlLnBvcy0tO1xuICAgIHRoaXMucmVhZFRlbXBsYXRlVG9rZW4oKTtcbiAgfVxuXG4gIC8vIFJlYWRzIHRlbXBsYXRlIHN0cmluZyB0b2tlbnMuXG4gIHJlYWRUZW1wbGF0ZVRva2VuKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB0aGlzLmlucHV0W3RoaXMuc3RhdGUucG9zXTtcbiAgICBjb25zdCB7IHN0ciwgZmlyc3RJbnZhbGlkTG9jLCBwb3MsIGN1ckxpbmUsIGxpbmVTdGFydCB9ID1cbiAgICAgIHJlYWRTdHJpbmdDb250ZW50cyhcbiAgICAgICAgXCJ0ZW1wbGF0ZVwiLFxuICAgICAgICB0aGlzLmlucHV0LFxuICAgICAgICB0aGlzLnN0YXRlLnBvcyArIDEsIC8vIHNraXAgJ2AnIG9yIGB9YFxuICAgICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCxcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJMaW5lLFxuICAgICAgICB0aGlzLmVycm9ySGFuZGxlcnNfcmVhZFN0cmluZ0NvbnRlbnRzX3RlbXBsYXRlLFxuICAgICAgKTtcbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcyArIDE7IC8vIHNraXAgJ2AnIG9yIGAkYFxuICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgIHRoaXMuc3RhdGUuY3VyTGluZSA9IGN1ckxpbmU7XG5cbiAgICBpZiAoZmlyc3RJbnZhbGlkTG9jKSB7XG4gICAgICB0aGlzLnN0YXRlLmZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zID0gbmV3IFBvc2l0aW9uKFxuICAgICAgICBmaXJzdEludmFsaWRMb2MuY3VyTGluZSxcbiAgICAgICAgZmlyc3RJbnZhbGlkTG9jLnBvcyAtIGZpcnN0SW52YWxpZExvYy5saW5lU3RhcnQsXG4gICAgICAgIGZpcnN0SW52YWxpZExvYy5wb3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlucHV0LmNvZGVQb2ludEF0KHBvcykgPT09IGNoYXJDb2Rlcy5ncmF2ZUFjY2VudCkge1xuICAgICAgdGhpcy5maW5pc2hUb2tlbihcbiAgICAgICAgdHQudGVtcGxhdGVUYWlsLFxuICAgICAgICBmaXJzdEludmFsaWRMb2MgPyBudWxsIDogb3BlbmluZyArIHN0ciArIFwiYFwiLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5wb3MrKzsgLy8gc2tpcCAneydcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4oXG4gICAgICAgIHR0LnRlbXBsYXRlTm9uVGFpbCxcbiAgICAgICAgZmlyc3RJbnZhbGlkTG9jID8gbnVsbCA6IG9wZW5pbmcgKyBzdHIgKyBcIiR7XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZFN0cmljdE1vZGVFcnJvcnMoXG4gICAgdG9QYXJzZUVycm9yOiBEZWZlcnJlZFN0cmljdEVycm9yLFxuICAgIHsgYXQgfTogeyBhdDogUG9zaXRpb24gfSxcbiAgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhdC5pbmRleDtcblxuICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiAhdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuaGFzKGluZGV4KSkge1xuICAgICAgdGhpcy5yYWlzZSh0b1BhcnNlRXJyb3IsIHsgYXQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUuc3RyaWN0RXJyb3JzLnNldChpbmRleCwgW3RvUGFyc2VFcnJvciwgYXRdKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFkIGFuIGlkZW50aWZpZXIsIGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcuIFNldHMgYHRoaXMuc3RhdGUuY29udGFpbnNFc2NgXG4gIC8vIHRvIHdoZXRoZXIgdGhlIHdvcmQgY29udGFpbmVkIGEgJ1xcdScgZXNjYXBlLlxuICAvL1xuICAvLyBJbmNyZW1lbnRhbGx5IGFkZHMgb25seSBlc2NhcGVkIGNoYXJzLCBhZGRpbmcgb3RoZXIgY2h1bmtzIGFzLWlzXG4gIC8vIGFzIGEgbWljcm8tb3B0aW1pemF0aW9uLlxuICAvL1xuICAvLyBXaGVuIGBmaXJzdENvZGVgIGlzIGdpdmVuLCBpdCBhc3N1bWVzIGl0IGlzIGFsd2F5cyBhbiBpZGVudGlmaWVyIHN0YXJ0IGFuZFxuICAvLyB3aWxsIHNraXAgcmVhZGluZyBzdGFydCBwb3NpdGlvbiBhZ2FpblxuXG4gIHJlYWRXb3JkMShmaXJzdENvZGU/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRoaXMuc3RhdGUuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgICBsZXQgd29yZCA9IFwiXCI7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBsZXQgY2h1bmtTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIGlmIChmaXJzdENvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gZmlyc3RDb2RlIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaCA9IHRoaXMuY29kZVBvaW50QXRQb3ModGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gpKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IGNoIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjID0gdHJ1ZTtcblxuICAgICAgICB3b3JkICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgICBjb25zdCBlc2NTdGFydCA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllckNoZWNrID1cbiAgICAgICAgICB0aGlzLnN0YXRlLnBvcyA9PT0gc3RhcnQgPyBpc0lkZW50aWZpZXJTdGFydCA6IGlzSWRlbnRpZmllckNoYXI7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMuc3RhdGUucG9zKSAhPT0gY2hhckNvZGVzLmxvd2VyY2FzZVUpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5NaXNzaW5nVW5pY29kZUVzY2FwZSwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3MgLSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgY29uc3QgZXNjID0gdGhpcy5yZWFkQ29kZVBvaW50KHRydWUpO1xuICAgICAgICBpZiAoZXNjICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKCFpZGVudGlmaWVyQ2hlY2soZXNjKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRXNjYXBlZENoYXJOb3RBbklkZW50aWZpZXIsIHsgYXQ6IGVzY1N0YXJ0IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdvcmQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoZXNjKTtcbiAgICAgICAgfVxuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmQgKyB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIC8vIFJlYWQgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkIHRva2VuLiBXaWxsIGNoZWNrIGZvciByZXNlcnZlZFxuICAvLyB3b3JkcyB3aGVuIG5lY2Vzc2FyeS5cblxuICByZWFkV29yZChmaXJzdENvZGU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JkID0gdGhpcy5yZWFkV29yZDEoZmlyc3RDb2RlKTtcbiAgICBjb25zdCB0eXBlID0ga2V5d29yZFR5cGVzLmdldCh3b3JkKTtcbiAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBXZSBkb24ndCB1c2Ugd29yZCBhcyBzdGF0ZS52YWx1ZSBoZXJlIGJlY2F1c2Ugd29yZCBpcyBhIGR5bmFtaWMgc3RyaW5nXG4gICAgICAvLyB3aGlsZSB0b2tlbiBsYWJlbCBpcyBhIHNoYXJlZCBjb25zdGFudCBzdHJpbmdcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHlwZSwgdG9rZW5MYWJlbE5hbWUodHlwZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0Lm5hbWUsIHdvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrS2V5d29yZEVzY2FwZXMoKTogdm9pZCB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0b2tlbklzS2V5d29yZCh0eXBlKSAmJiB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZCwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgcmVzZXJ2ZWRXb3JkOiB0b2tlbkxhYmVsTmFtZSh0eXBlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSYWlzZSBhIGBQYXJzZUVycm9yYCBnaXZlbiB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcy4gSWYgcGFzc2VkIGFcbiAgICogYFBvc2l0aW9uYCBmb3IgdGhlIGBhdGAgcHJvcGVydHksIHJhaXNlcyB0aGUgYFBhcnNlRXJyb3JgIGF0IHRoYXQgbG9jYXRpb24uXG4gICAqIE90aGVyd2lzZSwgaWYgcGFzc2VkIGEgYE5vZGVgLCByYWlzZXMgdGhlIGBQYXJzZUVycm9yYCBhdCB0aGUgc3RhcnRcbiAgICogbG9jYXRpb24gb2YgdGhhdCBgTm9kZWAuXG4gICAqXG4gICAqIElmIGBlcnJvclJlY292ZXJ5YCBpcyBgdHJ1ZWAsIHRoZSBlcnJvciBpcyBwdXNoZWQgdG8gdGhlIGVycm9ycyBhcnJheSBhbmRcbiAgICogcmV0dXJuZWQuIElmIGBlcnJvclJlY292ZXJ5YCBpcyBgZmFsc2VgLCB0aGUgZXJyb3IgaXMgaW5zdGVhZCB0aHJvd24uXG4gICAqL1xuICByYWlzZTxFcnJvckRldGFpbHM+KFxuICAgIHRvUGFyc2VFcnJvcjogUGFyc2VFcnJvckNvbnN0cnVjdG9yPEVycm9yRGV0YWlscz4sXG4gICAgcmFpc2VQcm9wZXJ0aWVzOiBSYWlzZVByb3BlcnRpZXM8RXJyb3JEZXRhaWxzPixcbiAgKTogUGFyc2VFcnJvcjxFcnJvckRldGFpbHM+IHtcbiAgICBjb25zdCB7IGF0LCAuLi5kZXRhaWxzIH0gPSByYWlzZVByb3BlcnRpZXM7XG4gICAgY29uc3QgbG9jID0gYXQgaW5zdGFuY2VvZiBQb3NpdGlvbiA/IGF0IDogYXQubG9jLnN0YXJ0O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSBkZXRhaWxzIHR5cGluZ1xuICAgIGNvbnN0IGVycm9yID0gdG9QYXJzZUVycm9yKHsgbG9jLCBkZXRhaWxzIH0pO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZXJyb3JSZWNvdmVyeSkgdGhyb3cgZXJyb3I7XG4gICAgaWYgKCF0aGlzLmlzTG9va2FoZWFkKSB0aGlzLnN0YXRlLmVycm9ycy5wdXNoKGVycm9yKTtcblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgZXJyb3JSZWNvdmVyeWAgaXMgYGZhbHNlYCwgdGhpcyBtZXRob2QgYmVoYXZlcyBpZGVudGljYWxseSB0byBgcmFpc2VgLlxuICAgKiBJZiBgZXJyb3JSZWNvdmVyeWAgaXMgYHRydWVgLCB0aGlzIG1ldGhvZCB3aWxsIGZpcnN0IHNlZSBpZiB0aGVyZSBpc1xuICAgKiBhbHJlYWR5IGFuIGVycm9yIHN0b3JlZCBhdCB0aGUgc2FtZSBgUG9zaXRpb25gLCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGVcbiAgICogb25lIGdlbmVyYXRlZCBoZXJlLlxuICAgKi9cbiAgcmFpc2VPdmVyd3JpdGU8RXJyb3JEZXRhaWxzPihcbiAgICB0b1BhcnNlRXJyb3I6IFBhcnNlRXJyb3JDb25zdHJ1Y3RvcjxFcnJvckRldGFpbHM+LFxuICAgIHJhaXNlUHJvcGVydGllczogUmFpc2VQcm9wZXJ0aWVzPEVycm9yRGV0YWlscz4sXG4gICk6IFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPiB8IG5ldmVyIHtcbiAgICBjb25zdCB7IGF0LCAuLi5kZXRhaWxzIH0gPSByYWlzZVByb3BlcnRpZXM7XG4gICAgY29uc3QgbG9jID0gYXQgaW5zdGFuY2VvZiBQb3NpdGlvbiA/IGF0IDogYXQubG9jLnN0YXJ0O1xuICAgIGNvbnN0IHBvcyA9IGxvYy5pbmRleDtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLnN0YXRlLmVycm9ycztcblxuICAgIGZvciAobGV0IGkgPSBlcnJvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVycm9yID0gZXJyb3JzW2ldO1xuICAgICAgaWYgKGVycm9yLmxvYy5pbmRleCA9PT0gcG9zKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSBkZXRhaWxzIHR5cGluZ1xuICAgICAgICByZXR1cm4gKGVycm9yc1tpXSA9IHRvUGFyc2VFcnJvcih7IGxvYywgZGV0YWlscyB9KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IubG9jLmluZGV4IDwgcG9zKSBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYWlzZSh0b1BhcnNlRXJyb3IsIHJhaXNlUHJvcGVydGllcyk7XG4gIH1cblxuICAvLyB1cGRhdGVDb250ZXh0IGlzIHVzZWQgYnkgdGhlIGpzeCBwbHVnaW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB1cGRhdGVDb250ZXh0KHByZXZUeXBlOiBUb2tlblR5cGUpOiB2b2lkIHt9XG5cbiAgLy8gUmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci4gQ2FuIHRha2UgdGhlIGV4cGVjdGVkIHRva2VuIHR5cGUuXG4gIHVuZXhwZWN0ZWQobG9jPzogUG9zaXRpb24gfCBudWxsLCB0eXBlPzogVG9rZW5UeXBlKTogdm9pZCB7XG4gICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFRva2VuLCB7XG4gICAgICBleHBlY3RlZDogdHlwZSA/IHRva2VuTGFiZWxOYW1lKHR5cGUpIDogbnVsbCxcbiAgICAgIGF0OiBsb2MgIT0gbnVsbCA/IGxvYyA6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgfSk7XG4gIH1cblxuICBleHBlY3RQbHVnaW4ocGx1Z2luTmFtZTogUGx1Z2luLCBsb2M/OiBQb3NpdGlvbik6IHRydWUge1xuICAgIGlmICh0aGlzLmhhc1BsdWdpbihwbHVnaW5OYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ1BsdWdpbiwge1xuICAgICAgYXQ6IGxvYyAhPSBudWxsID8gbG9jIDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgIG1pc3NpbmdQbHVnaW46IFtwbHVnaW5OYW1lXSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGVjdE9uZVBsdWdpbihwbHVnaW5OYW1lczogUGx1Z2luW10pOiB2b2lkIHtcbiAgICBpZiAoIXBsdWdpbk5hbWVzLnNvbWUobmFtZSA9PiB0aGlzLmhhc1BsdWdpbihuYW1lKSkpIHtcbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLk1pc3NpbmdPbmVPZlBsdWdpbnMsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIG1pc3NpbmdQbHVnaW46IHBsdWdpbk5hbWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3JCdWlsZGVyKGVycm9yOiBQYXJzZUVycm9yQ29uc3RydWN0b3I8e30+KSB7XG4gICAgcmV0dXJuIChwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5yYWlzZShlcnJvciwge1xuICAgICAgICBhdDogYnVpbGRQb3NpdGlvbihwb3MsIGxpbmVTdGFydCwgY3VyTGluZSksXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZXJyb3JIYW5kbGVyc19yZWFkSW50OiBJbnRFcnJvckhhbmRsZXJzID0ge1xuICAgIGludmFsaWREaWdpdDogKHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lLCByYWRpeCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXJyb3JSZWNvdmVyeSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRGlnaXQsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgICByYWRpeCxcbiAgICAgIH0pO1xuICAgICAgLy8gQ29udGludWUgcGFyc2luZyB0aGUgbnVtYmVyIGFzIGlmIHRoZXJlIHdhcyBubyBpbnZhbGlkIGRpZ2l0LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBudW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZTogdGhpcy5lcnJvckJ1aWxkZXIoXG4gICAgICBFcnJvcnMuTnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UsXG4gICAgKSxcbiAgICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcjogdGhpcy5lcnJvckJ1aWxkZXIoXG4gICAgICBFcnJvcnMuVW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IsXG4gICAgKSxcbiAgfTtcblxuICBlcnJvckhhbmRsZXJzX3JlYWRDb2RlUG9pbnQ6IENvZGVQb2ludEVycm9ySGFuZGxlcnMgPSB7XG4gICAgLi4udGhpcy5lcnJvckhhbmRsZXJzX3JlYWRJbnQsXG4gICAgaW52YWxpZEVzY2FwZVNlcXVlbmNlOiB0aGlzLmVycm9yQnVpbGRlcihFcnJvcnMuSW52YWxpZEVzY2FwZVNlcXVlbmNlKSxcbiAgICBpbnZhbGlkQ29kZVBvaW50OiB0aGlzLmVycm9yQnVpbGRlcihFcnJvcnMuSW52YWxpZENvZGVQb2ludCksXG4gIH07XG5cbiAgZXJyb3JIYW5kbGVyc19yZWFkU3RyaW5nQ29udGVudHNfc3RyaW5nOiBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMgPSB7XG4gICAgLi4udGhpcy5lcnJvckhhbmRsZXJzX3JlYWRDb2RlUG9pbnQsXG4gICAgc3RyaWN0TnVtZXJpY0VzY2FwZTogKHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZFN0cmljdE1vZGVFcnJvcnMoRXJyb3JzLlN0cmljdE51bWVyaWNFc2NhcGUsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1bnRlcm1pbmF0ZWQ6IChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSkgPT4ge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkU3RyaW5nLCB7XG4gICAgICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgYXQgdGhlIHN0cmluZyBxdW90ZVxuICAgICAgICBhdDogYnVpbGRQb3NpdGlvbihwb3MgLSAxLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICBlcnJvckhhbmRsZXJzX3JlYWRTdHJpbmdDb250ZW50c190ZW1wbGF0ZTogU3RyaW5nQ29udGVudHNFcnJvckhhbmRsZXJzID0ge1xuICAgIC4uLnRoaXMuZXJyb3JIYW5kbGVyc19yZWFkQ29kZVBvaW50LFxuICAgIHN0cmljdE51bWVyaWNFc2NhcGU6IHRoaXMuZXJyb3JCdWlsZGVyKEVycm9ycy5TdHJpY3ROdW1lcmljRXNjYXBlKSxcbiAgICB1bnRlcm1pbmF0ZWQ6IChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSkgPT4ge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkVGVtcGxhdGUsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQge1xuICBDTEFTU19FTEVNRU5UX0tJTkRfQUNDRVNTT1IsXG4gIENMQVNTX0VMRU1FTlRfRkxBR19TVEFUSUMsXG4gIHR5cGUgQ2xhc3NFbGVtZW50VHlwZXMsXG59IGZyb20gXCIuL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9sb2NhdGlvblwiO1xuaW1wb3J0IHsgRXJyb3JzIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBUb2tlbml6ZXIgZnJvbSBcIi4uL3Rva2VuaXplclwiO1xuXG5leHBvcnQgY2xhc3MgQ2xhc3NTY29wZSB7XG4gIC8vIEEgbGlzdCBvZiBwcml2YXRlIG5hbWVkIGRlY2xhcmVkIGluIHRoZSBjdXJyZW50IGNsYXNzXG4gIHByaXZhdGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gQSBsaXN0IG9mIHByaXZhdGUgZ2V0dGVycyBvZiBzZXR0ZXJzIHdpdGhvdXQgdGhlaXIgY291bnRlcnBhcnRcbiAgbG9uZUFjY2Vzc29yczogTWFwPHN0cmluZywgQ2xhc3NFbGVtZW50VHlwZXM+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIEEgbGlzdCBvZiBwcml2YXRlIG5hbWVzIHVzZWQgYmVmb3JlIGJlaW5nIGRlZmluZWQsIG1hcHBpbmcgdG9cbiAgLy8gdGhlaXIgcG9zaXRpb24uXG4gIHVuZGVmaW5lZFByaXZhdGVOYW1lczogTWFwPHN0cmluZywgUG9zaXRpb24+ID0gbmV3IE1hcCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFzc1Njb3BlSGFuZGxlciB7XG4gIHBhcnNlcjogVG9rZW5pemVyO1xuICBzdGFjazogQXJyYXk8Q2xhc3NTY29wZT4gPSBbXTtcbiAgdW5kZWZpbmVkUHJpdmF0ZU5hbWVzOiBNYXA8c3RyaW5nLCBQb3NpdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocGFyc2VyOiBUb2tlbml6ZXIpIHtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgfVxuXG4gIGN1cnJlbnQoKTogQ2xhc3NTY29wZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIGVudGVyKCkge1xuICAgIHRoaXMuc3RhY2sucHVzaChuZXcgQ2xhc3NTY29wZSgpKTtcbiAgfVxuXG4gIGV4aXQoKSB7XG4gICAgY29uc3Qgb2xkQ2xhc3NTY29wZSA9IHRoaXMuc3RhY2sucG9wKCk7XG5cbiAgICAvLyBNaWdyYXRlIHRoZSB1c2FnZSBvZiBub3QgeWV0IGRlZmluZWQgcHJpdmF0ZSBuYW1lcyB0byB0aGUgb3V0ZXJcbiAgICAvLyBjbGFzcyBzY29wZSwgb3IgcmFpc2UgYW4gZXJyb3IgaWYgd2UgcmVhY2hlZCB0aGUgdG9wLWxldmVsIHNjb3BlLlxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudCgpO1xuXG4gICAgLy8gQXJyYXkuZnJvbSBpcyBuZWVkZWQgYmVjYXVzZSB0aGlzIGlzIGNvbXBpbGVkIHRvIGFuIGFycmF5LWxpa2UgZm9yIGxvb3BcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBsb2NdIG9mIEFycmF5LmZyb20ob2xkQ2xhc3NTY29wZS51bmRlZmluZWRQcml2YXRlTmFtZXMpKSB7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgIGN1cnJlbnQudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLnNldChuYW1lLCBsb2MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuSW52YWxpZFByaXZhdGVGaWVsZFJlc29sdXRpb24sIHtcbiAgICAgICAgICBhdDogbG9jLFxuICAgICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWNsYXJlUHJpdmF0ZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBDbGFzc0VsZW1lbnRUeXBlcyxcbiAgICBsb2M6IFBvc2l0aW9uLFxuICApIHtcbiAgICBjb25zdCB7IHByaXZhdGVOYW1lcywgbG9uZUFjY2Vzc29ycywgdW5kZWZpbmVkUHJpdmF0ZU5hbWVzIH0gPVxuICAgICAgdGhpcy5jdXJyZW50KCk7XG4gICAgbGV0IHJlZGVmaW5lZCA9IHByaXZhdGVOYW1lcy5oYXMobmFtZSk7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgJiBDTEFTU19FTEVNRU5UX0tJTkRfQUNDRVNTT1IpIHtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gcmVkZWZpbmVkICYmIGxvbmVBY2Nlc3NvcnMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgIGNvbnN0IG9sZFN0YXRpYyA9IGFjY2Vzc29yICYgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQztcbiAgICAgICAgY29uc3QgbmV3U3RhdGljID0gZWxlbWVudFR5cGUgJiBDTEFTU19FTEVNRU5UX0ZMQUdfU1RBVElDO1xuXG4gICAgICAgIGNvbnN0IG9sZEtpbmQgPSBhY2Nlc3NvciAmIENMQVNTX0VMRU1FTlRfS0lORF9BQ0NFU1NPUjtcbiAgICAgICAgY29uc3QgbmV3S2luZCA9IGVsZW1lbnRUeXBlICYgQ0xBU1NfRUxFTUVOVF9LSU5EX0FDQ0VTU09SO1xuXG4gICAgICAgIC8vIFRoZSBwcml2YXRlIG5hbWUgY2FuIGJlIGR1cGxpY2F0ZWQgb25seSBpZiBpdCBpcyB1c2VkIGJ5XG4gICAgICAgIC8vIHR3byBhY2Nlc3NvcnMgd2l0aCBkaWZmZXJlbnQga2luZCAoZ2V0IGFuZCBzZXQpLCBhbmQgaWZcbiAgICAgICAgLy8gdGhleSBoYXZlIHRoZSBzYW1lIHBsYWNlbWVudCAoc3RhdGljIG9yIG5vdCkuXG4gICAgICAgIHJlZGVmaW5lZCA9IG9sZEtpbmQgPT09IG5ld0tpbmQgfHwgb2xkU3RhdGljICE9PSBuZXdTdGF0aWM7XG5cbiAgICAgICAgaWYgKCFyZWRlZmluZWQpIGxvbmVBY2Nlc3NvcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIGlmICghcmVkZWZpbmVkKSB7XG4gICAgICAgIGxvbmVBY2Nlc3NvcnMuc2V0KG5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVkZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuUHJpdmF0ZU5hbWVSZWRlY2xhcmF0aW9uLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZU5hbWVzLmFkZChuYW1lKTtcbiAgICB1bmRlZmluZWRQcml2YXRlTmFtZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgdXNlUHJpdmF0ZU5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFBvc2l0aW9uKSB7XG4gICAgbGV0IGNsYXNzU2NvcGU7XG4gICAgZm9yIChjbGFzc1Njb3BlIG9mIHRoaXMuc3RhY2spIHtcbiAgICAgIGlmIChjbGFzc1Njb3BlLnByaXZhdGVOYW1lcy5oYXMobmFtZSkpIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xhc3NTY29wZSkge1xuICAgICAgY2xhc3NTY29wZS51bmRlZmluZWRQcml2YXRlTmFtZXMuc2V0KG5hbWUsIGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvcC1sZXZlbFxuICAgICAgdGhpcy5wYXJzZXIucmFpc2UoRXJyb3JzLkludmFsaWRQcml2YXRlRmllbGRSZXNvbHV0aW9uLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgRXJyb3JzLCB0eXBlIFBhcnNlRXJyb3JDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuL2xvY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIFRva2VuaXplciBmcm9tIFwiLi4vdG9rZW5pemVyXCI7XG5cbi8qKlxuICogQG1vZHVsZSB1dGlsL2V4cHJlc3Npb24tc2NvcGVcblxuRXhwcmVzc2lvblNjb3BlIGlzIHVzZWQgdG8gdHJhY2sgZGVjbGFyYXRpb24gZXJyb3JzIGluIHRoZXNlIGFtYmlndW91cyBwYXR0ZXJuczpcblxuLSBDb3ZlclBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQW5kQXJyb3dQYXJhbWV0ZXJMaXN0XG4gIGUuZy4gd2UgZG9uJ3Qga25vdyBpZiBgKHsgeCB9KWAgaXMgYW4gcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG9yIGFuXG4gIGFycm93IGZ1bmN0aW9uIHBhcmFtZXRlcnMgdW50aWwgd2Ugc2VlIGFuIGA9PmAgYWZ0ZXIgYClgLlxuXG4tIENvdmVyQ2FsbEV4cHJlc3Npb25BbmRBc3luY0Fycm93SGVhZFxuICBlLmcuIHdlIGRvbid0IGtub3cgaWYgYGFzeW5jKHsgeCB9KWAgaXMgYSBjYWxsIGV4cHJlc3Npb24gb3IgYW4gYXN5bmMgYXJyb3dcbiAgZnVuY3Rpb24gcGFyYW1ldGVycyB1bnRpbCB3ZSBzZWUgYW4gYD0+YCBhZnRlciBgKWBcblxuVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBlcnJvcnMgKEBzZWUgcGFyc2VyLWVycm9ycy9zdGFuZGFyZCkgd2lsbCBiZSByZWNvcmRlZCBpblxuc29tZSBleHByZXNzaW9uIHNjb3BlcyBhbmQgdGhyb3duIGxhdGVyIHdoZW4gd2Uga25vdyB3aGF0IHRoZSBhbWJpZ3VvdXMgcGF0dGVybiBpc1xuXG4tIEF3YWl0QmluZGluZ0lkZW50aWZpZXJcbi0gQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyXG4tIFlpZWxkSW5QYXJhbWV0ZXJcbi0gSW52YWxpZFBhcmVudGhlc2l6ZWRBc3NpZ25tZW50IHdoZW4gcGFyZW50aGVzaXplZCBpcyBhbiBpZGVudGlmaWVyXG5cblRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCBleHByZXNzaW9uIHNjb3BlXG4tIEV4cHJlc3Npb25cbiAgQSBnZW5lcmFsIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBwcm9ncmFtIC8gZnVuY3Rpb24gYm9keSAvIHN0YXRpYyBibG9jay4gTm8gZXJyb3JzXG4gIHdpbGwgYmUgcmVjb3JkZWQgbm9yIHRocm93biBpbiB0aGlzIHNjb3BlLlxuXG4tIE1heWJlQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICBBIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBhbWJpZ3VvdXMgYXJyb3cgaGVhZCBlLmcuIGAoeClgLiBFcnJvcnMgd2lsbCBiZSByZWNvcmRlZFxuICBhbG9uZ3NpZGUgcGFyZW50IHNjb3BlcyBhbmQgdGhyb3duIHdoZW4gYEV4cHJlc3Npb25TY29wZUhhbmRsZXIjdmFsaWRhdGVBc1BhdHRlcm5gXG4gIGlzIGNhbGxlZC5cblxuLSBNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICBBIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBhbWJpZ3VvdXMgYXN5bmMgYXJyb3cgaGVhZCBlLmcuIGBhc3luYyh4KWAuIEVycm9ycyB3aWxsXG4gIGJlIHJlY29yZGVkIGFsb25nc2lkZSBwYXJlbnQgc2NvcGVzIGFuZCB0aHJvd24gd2hlblxuICBgRXhwcmVzc2lvblNjb3BlSGFuZGxlciN2YWxpZGF0ZUFzUGF0dGVybmAgaXMgY2FsbGVkLlxuXG4tIFBhcmFtZXRlckRlY2xhcmF0aW9uXG4gIEEgc2NvcGUgdGhhdCByZXByZXNlbnRzIHVuYW1iaWd1b3VzIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYGZ1bmN0aW9uKHgpYC4gRXJyb3JzXG4gIHJlY29yZGVkIGluIHRoaXMgc2NvcGUgd2lsbCBiZSB0aHJvd24gaW1tZWRpYXRlbHkuIE5vIGVycm9ycyB3aWxsIGJlIHJlY29yZGVkIGluXG4gIHRoaXMgc2NvcGUuXG5cbi8vIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUZBdkVwOUVVSy1HOGtIZkRJRW9fMzg1SHMyU1VCQ1liSjVILU5uTHZxOE18VjggRXhwcmVzc2lvbiBTY29wZSBkZXNpZ24gZG9jc31cbiAqL1xuXG5jb25zdCBrRXhwcmVzc2lvbiA9IDAsXG4gIGtNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24gPSAxLFxuICBrTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb24gPSAyLFxuICBrUGFyYW1ldGVyRGVjbGFyYXRpb24gPSAzO1xuXG50eXBlIEV4cHJlc3Npb25TY29wZVR5cGUgPSAwIHwgMSB8IDIgfCAzO1xuXG5jbGFzcyBFeHByZXNzaW9uU2NvcGUge1xuICB0eXBlOiBFeHByZXNzaW9uU2NvcGVUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IEV4cHJlc3Npb25TY29wZVR5cGUgPSBrRXhwcmVzc2lvbikge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBjYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKTogdGhpcyBpcyBBcnJvd0hlYWRQYXJzaW5nU2NvcGUge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnR5cGUgPT09IGtNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8fFxuICAgICAgdGhpcy50eXBlID09PSBrTWF5YmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGlzQ2VydGFpbmx5UGFyYW1ldGVyRGVjbGFyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0ga1BhcmFtZXRlckRlY2xhcmF0aW9uO1xuICB9XG59XG5cbnR5cGUgQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3IgPVxuICB8IHR5cGVvZiBFcnJvcnMuQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyXG4gIHwgdHlwZW9mIEVycm9ycy5ZaWVsZEluUGFyYW1ldGVyO1xudHlwZSBBcnJvd0hlYWRQYXJzaW5nRGVjbGFyYXRpb25FcnJvciA9XG4gIHwgQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3JcbiAgfCB0eXBlb2YgRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudFxuICB8IHR5cGVvZiBFcnJvcnMuQXdhaXRCaW5kaW5nSWRlbnRpZmllcjtcblxuY2xhc3MgQXJyb3dIZWFkUGFyc2luZ1Njb3BlIGV4dGVuZHMgRXhwcmVzc2lvblNjb3BlIHtcbiAgZGVjbGFyYXRpb25FcnJvcnM6IE1hcDxudW1iZXIsIFtQYXJzZUVycm9yQ29uc3RydWN0b3I8e30+LCBQb3NpdGlvbl0+ID1cbiAgICBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHR5cGU6IDEgfCAyKSB7XG4gICAgc3VwZXIodHlwZSk7XG4gIH1cbiAgcmVjb3JkRGVjbGFyYXRpb25FcnJvcihcbiAgICBQYXJzaW5nRXJyb3JDbGFzczogUGFyc2VFcnJvckNvbnN0cnVjdG9yPHt9PixcbiAgICB7XG4gICAgICBhdCxcbiAgICB9OiB7XG4gICAgICBhdDogUG9zaXRpb247XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhdC5pbmRleDtcblxuICAgIHRoaXMuZGVjbGFyYXRpb25FcnJvcnMuc2V0KGluZGV4LCBbUGFyc2luZ0Vycm9yQ2xhc3MsIGF0XSk7XG4gIH1cbiAgY2xlYXJEZWNsYXJhdGlvbkVycm9yKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9uRXJyb3JzLmRlbGV0ZShpbmRleCk7XG4gIH1cbiAgaXRlcmF0ZUVycm9ycyhcbiAgICBpdGVyYXRvcjogKGE6IFtBcnJvd0hlYWRQYXJzaW5nRGVjbGFyYXRpb25FcnJvciwgUG9zaXRpb25dKSA9PiB2b2lkLFxuICApIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9uRXJyb3JzLmZvckVhY2goaXRlcmF0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cHJlc3Npb25TY29wZUhhbmRsZXIge1xuICBwYXJzZXI6IFRva2VuaXplcjtcbiAgc3RhY2s6IEFycmF5PEV4cHJlc3Npb25TY29wZT4gPSBbbmV3IEV4cHJlc3Npb25TY29wZSgpXTtcblxuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFRva2VuaXplcikge1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICB9XG4gIGVudGVyKHNjb3BlOiBFeHByZXNzaW9uU2NvcGUpIHtcbiAgICB0aGlzLnN0YWNrLnB1c2goc2NvcGUpO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBsaWtlbHkgcGFyYW1ldGVyIGluaXRpYWxpemVyIGVycm9yc1xuICAgKlxuICAgKiBXaGVuIGN1cnJlbnQgc2NvcGUgaXMgYSBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgdGhlIGVycm9yIHdpbGwgYmUgdGhyb3duIGltbWVkaWF0ZWx5LFxuICAgKiBvdGhlcndpc2UgaXQgd2lsbCBiZSByZWNvcmRlZCB0byBhbnkgYW5jZXN0cnkgTWF5YmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uIGFuZFxuICAgKiBNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbiBzY29wZSB1bnRpbCBhbiBFeHByZXNzaW9uIHNjb3BlIGlzIHNlZW4uXG4gICAqL1xuICByZWNvcmRQYXJhbWV0ZXJJbml0aWFsaXplckVycm9yKFxuICAgIHRvUGFyc2VFcnJvcjogQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3IsXG4gICAge1xuICAgICAgYXQ6IG5vZGUsXG4gICAgfToge1xuICAgICAgYXQ6IE5vZGU7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luID0geyBhdDogbm9kZS5sb2Muc3RhcnQgfTtcbiAgICBjb25zdCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBsZXQgc2NvcGU6IEV4cHJlc3Npb25TY29wZSA9IHN0YWNrW2ldO1xuICAgIHdoaWxlICghc2NvcGUuaXNDZXJ0YWlubHlQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICBpZiAoc2NvcGUuY2FuQmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uKCkpIHtcbiAgICAgICAgc2NvcGUucmVjb3JkRGVjbGFyYXRpb25FcnJvcih0b1BhcnNlRXJyb3IsIG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKjo6IGludmFyaWFudChzY29wZS50eXBlID09IGtFeHByZXNzaW9uKSAqL1xuICAgICAgICAvLyBUeXBlLUV4cHJlc3Npb24gaXMgdGhlIGJvdW5kYXJ5IHdoZXJlIGluaXRpYWxpemVyIGVycm9yIGNhbiBwb3B1bGF0ZSB0b1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzY29wZSA9IHN0YWNrWy0taV07XG4gICAgfVxuICAgIHRoaXMucGFyc2VyLnJhaXNlKHRvUGFyc2VFcnJvciwgb3JpZ2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgZXJyb3JzIHRoYXQgbXVzdCBiZSB0aHJvd24gaWYgdGhlIGN1cnJlbnQgcGF0dGVybiBlbmRzIHVwIGJlaW5nIGFuIGFycm93XG4gICAqIGZ1bmN0aW9uIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIHRvIHJlY29yZCBwYXJlbnRoZXNpemVkIGlkZW50aWZpZXJzLCBhbmQgdG8gcmVjb3JkXG4gICAqIFwiYSBhcyBUXCIgYW5kIFwiPFQ+IGFcIiB0eXBlIGFzc2VydGlvbnMgd2hlbiBwYXJzaW5nIHR5cGVzY3JpcHQuXG4gICAqXG4gICAqIEEgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIChvciB0eXBlIGFzc2VydGlvbikgaW4gTEhTIGNhbiBiZSBhbWJpZ3VvdXMgYmVjYXVzZSB0aGUgYXNzaWdubWVudFxuICAgKiBjYW4gYmUgdHJhbnNmb3JtZWQgdG8gYW4gYXNzaWduYWJsZSBsYXRlciwgYnV0IG5vdCB2aWNlIHZlcnNhOlxuICAgKiBGb3IgZXhhbXBsZSwgaW4gYChbKGEpID0gW11dID0gW10pID0+IHt9YCwgd2UgdGhpbmsgYChhKSA9IFtdYCBpcyBhbiBMSFMgaW4gYFsoYSkgPSBbXV1gLFxuICAgKiBhbiBMSFMgd2l0aGluIGBbKGEpID0gW11dID0gW11gLiBIb3dldmVyIHRoZSBMSFMgY2hhaW4gaXMgdGhlbiB0cmFuc2Zvcm1lZCBieSB0b0Fzc2lnbmFibGUsXG4gICAqIGFuZCB3ZSBzaG91bGQgdGhyb3cgYXNzaWdubWVudCBgKGEpYCwgd2hpY2ggaXMgb25seSB2YWxpZCBpbiBMSFMuIEhlbmNlIHdlIHJlY29yZCB0aGVcbiAgICogbG9jYXRpb24gb2YgcGFyZW50aGVzaXplZCBgKGEpYCB0byBjdXJyZW50IHNjb3BlIGlmIGl0IGlzIG9uZSBvZiBNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICogYW5kIE1heWJlQXN5bmNBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uXG4gICAqXG4gICAqIFVubGlrZSBgcmVjb3JkUGFyYW1ldGVySW5pdGlhbGl6ZXJFcnJvcmAsIHdlIGRvbid0IHJlY29yZCB0byBhbmNlc3RyeSBzY29wZSBiZWNhdXNlIHdlXG4gICAqIHZhbGlkYXRlIGFycm93IGhlYWQgcGFyc2luZyBzY29wZSBiZWZvcmUgZXhpdCwgYW5kIHRoZW4gdGhlIExIUyB3aWxsIGJlIHVuYW1iaWd1b3VzOlxuICAgKiBGb3IgZXhhbXBsZSwgaW4gYCggeCA9ICggWyhhKSA9IFtdXSA9IFtdICkgKSA9PiB7fWAsIHdlIHNob3VsZCBub3QgcmVjb3JkIGAoYSlgIGluIGAoIHggPSAuLi4gKSA9PmBcbiAgICogYXJyb3cgc2NvcGUgYmVjYXVzZSB3aGVuIHdlIGZpbmlzaCBwYXJzaW5nIGAoIFsoYSkgPSBbXV0gPSBbXSApYCwgaXQgaXMgYW4gdW5hbWJpZ3VvdXMgYXNzaWdubWVudFxuICAgKiBleHByZXNzaW9uIGFuZCBjYW4gbm90IGJlIGNhc3QgdG8gcGF0dGVyblxuICAgKi9cbiAgcmVjb3JkQXJyb3dQYXJhbWV0ZXJCaW5kaW5nRXJyb3IoXG4gICAgZXJyb3I6IFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcjx7fT4sXG4gICAge1xuICAgICAgYXQ6IG5vZGUsXG4gICAgfToge1xuICAgICAgYXQ6IE5vZGU7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBzdGFjayB9ID0gdGhpcztcbiAgICBjb25zdCBzY29wZTogRXhwcmVzc2lvblNjb3BlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgb3JpZ2luID0geyBhdDogbm9kZS5sb2Muc3RhcnQgfTtcbiAgICBpZiAoc2NvcGUuaXNDZXJ0YWlubHlQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShlcnJvciwgb3JpZ2luKTtcbiAgICB9IGVsc2UgaWYgKHNjb3BlLmNhbkJlQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICBzY29wZS5yZWNvcmREZWNsYXJhdGlvbkVycm9yKGVycm9yLCBvcmlnaW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBsaWtlbHkgYXN5bmMgYXJyb3cgcGFyYW1ldGVyIGVycm9yc1xuICAgKlxuICAgKiBFcnJvcnMgd2lsbCBiZSByZWNvcmRlZCB0byBhbnkgYW5jZXN0cnkgTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICogc2NvcGUgdW50aWwgYW4gRXhwcmVzc2lvbiBzY29wZSBpcyBzZWVuLlxuICAgKi9cbiAgcmVjb3JkQXN5bmNBcnJvd1BhcmFtZXRlcnNFcnJvcih7IGF0IH06IHsgYXQ6IFBvc2l0aW9uIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBsZXQgc2NvcGU6IEV4cHJlc3Npb25TY29wZSA9IHN0YWNrW2ldO1xuICAgIHdoaWxlIChzY29wZS5jYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKSkge1xuICAgICAgaWYgKHNjb3BlLnR5cGUgPT09IGtNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbikge1xuICAgICAgICBzY29wZS5yZWNvcmREZWNsYXJhdGlvbkVycm9yKEVycm9ycy5Bd2FpdEJpbmRpbmdJZGVudGlmaWVyLCB7IGF0IH0pO1xuICAgICAgfVxuICAgICAgc2NvcGUgPSBzdGFja1stLWldO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQXNQYXR0ZXJuKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc3RhY2sgfSA9IHRoaXM7XG4gICAgY29uc3QgY3VycmVudFNjb3BlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCFjdXJyZW50U2NvcGUuY2FuQmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uKCkpIHJldHVybjtcbiAgICBjdXJyZW50U2NvcGUuaXRlcmF0ZUVycm9ycygoW3RvUGFyc2VFcnJvciwgbG9jXSkgPT4ge1xuICAgICAgdGhpcy5wYXJzZXIucmFpc2UodG9QYXJzZUVycm9yLCB7IGF0OiBsb2MgfSk7XG4gICAgICAvLyBpdGVyYXRlIGZyb20gcGFyZW50IHNjb3BlXG4gICAgICBsZXQgaSA9IHN0YWNrLmxlbmd0aCAtIDI7XG4gICAgICBsZXQgc2NvcGUgPSBzdGFja1tpXTtcbiAgICAgIHdoaWxlIChzY29wZS5jYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKSkge1xuICAgICAgICBzY29wZS5jbGVhckRlY2xhcmF0aW9uRXJyb3IobG9jLmluZGV4KTtcbiAgICAgICAgc2NvcGUgPSBzdGFja1stLWldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdQYXJhbWV0ZXJEZWNsYXJhdGlvblNjb3BlKCkge1xuICByZXR1cm4gbmV3IEV4cHJlc3Npb25TY29wZShrUGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3QXJyb3dIZWFkU2NvcGUoKSB7XG4gIHJldHVybiBuZXcgQXJyb3dIZWFkUGFyc2luZ1Njb3BlKGtNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3QXN5bmNBcnJvd1Njb3BlKCkge1xuICByZXR1cm4gbmV3IEFycm93SGVhZFBhcnNpbmdTY29wZShrTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3RXhwcmVzc2lvblNjb3BlKCkge1xuICByZXR1cm4gbmV3IEV4cHJlc3Npb25TY29wZSgpO1xufVxuIiwgImV4cG9ydCBjb25zdCAvLyBJbml0aWFsIFBhcmFtZXRlciBmbGFnc1xuICBQQVJBTSA9IDBiMDAwMCxcbiAgLy8gdHJhY2sgW1lpZWxkXSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuICBQQVJBTV9ZSUVMRCA9IDBiMDAwMSxcbiAgLy8gdHJhY2sgW0F3YWl0XSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuICBQQVJBTV9BV0FJVCA9IDBiMDAxMCxcbiAgLy8gdHJhY2sgW1JldHVybl0gcHJvZHVjdGlvbiBwYXJhbWV0ZXJcbiAgUEFSQU1fUkVUVVJOID0gMGIwMTAwLFxuICBQQVJBTV9JTiA9IDBiMTAwMDsgLy8gdHJhY2sgW0luXSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuXG4vLyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlciBpcyBhIHN0YWNrIGZhc2hpb25lZCBwcm9kdWN0aW9uIHBhcmFtZXRlciB0cmFja2VyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdyYW1tYXItbm90YXRpb25cbi8vIFRoZSB0cmFja2VkIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYWJvdmUuXG4vL1xuLy8gV2hlbmV2ZXIgWytBd2FpdF0vWytZaWVsZF0gYXBwZWFycyBpbiB0aGUgcmlnaHQtaGFuZCBzaWRlcyBvZiBhIHByb2R1Y3Rpb24sXG4vLyB3ZSBtdXN0IGVudGVyIGEgbmV3IHRyYWNraW5nIHN0YWNrLiBGb3IgZXhhbXBsZSB3aGVuIHBhcnNpbmdcbi8vXG4vLyBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gW1lpZWxkLCBBd2FpdF06XG4vLyAgIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBmdW5jdGlvbiBCaW5kaW5nSWRlbnRpZmllcls/WWllbGQsID9Bd2FpdF1cbi8vICAgICAoIEZvcm1hbFBhcmFtZXRlcnNbfllpZWxkLCArQXdhaXRdICkgeyBBc3luY0Z1bmN0aW9uQm9keSB9XG4vL1xuLy8gd2UgbXVzdCBmb2xsb3cgc3VjaCBwcm9jZXNzOlxuLy9cbi8vIDEuIHBhcnNlIGFzeW5jIGtleXdvcmRcbi8vIDIuIHBhcnNlIGZ1bmN0aW9uIGtleXdvcmRcbi8vIDMuIHBhcnNlIGJpbmRpbmdJZGVudGlmaWVyIDw9IGluaGVyaXQgY3VycmVudCBwYXJhbWV0ZXJzOiBbP0F3YWl0XVxuLy8gNC4gZW50ZXIgbmV3IHN0YWNrIHdpdGggKFBBUkFNX0FXQUlUKVxuLy8gNS4gcGFyc2UgZm9ybWFsIHBhcmFtZXRlcnMgPD0gbXVzdCBoYXZlIFtBd2FpdF0gcGFyYW1ldGVyIFsrQXdhaXRdXG4vLyA2LiBwYXJzZSBmdW5jdGlvbiBib2R5XG4vLyA3LiBleGl0IGN1cnJlbnQgc3RhY2tcblxuZXhwb3J0IHR5cGUgUGFyYW1LaW5kID0gbnVtYmVyO1xuXG4vLyB0b2RvKGZsb3ctPnRzKSAtIGNoZWNrIGlmIG1vcmUgZ3JhbnVsYXIgdHlwZSBjYW4gYmUgdXNlZCxcbi8vICB0eXBlIGJlbG93IGlzIG5vdCBnb29kIGJlY2F1c2UgdGhpbmdzIGxpa2UgUEFSQU1fQVdBSVR8UEFSQU1fWUlFTEQgYXJlIG5vdCBpbmNsdWRlZFxuLy8gZXhwb3J0IHR5cGUgUGFyYW1LaW5kID1cbi8vICAgfCB0eXBlb2YgUEFSQU1cbi8vICAgfCB0eXBlb2YgUEFSQU1fQVdBSVRcbi8vICAgfCB0eXBlb2YgUEFSQU1fSU5cbi8vICAgfCB0eXBlb2YgUEFSQU1fUkVUVVJOXG4vLyAgIHwgdHlwZW9mIFBBUkFNX1lJRUxEO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlciB7XG4gIHN0YWNrczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICBlbnRlcihmbGFnczogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFja3MucHVzaChmbGFncyk7XG4gIH1cblxuICBleGl0KCkge1xuICAgIHRoaXMuc3RhY2tzLnBvcCgpO1xuICB9XG5cbiAgY3VycmVudEZsYWdzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tzW3RoaXMuc3RhY2tzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ2V0IGhhc0F3YWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50RmxhZ3MoKSAmIFBBUkFNX0FXQUlUKSA+IDA7XG4gIH1cblxuICBnZXQgaGFzWWllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fWUlFTEQpID4gMDtcbiAgfVxuXG4gIGdldCBoYXNSZXR1cm4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fUkVUVVJOKSA+IDA7XG4gIH1cblxuICBnZXQgaGFzSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fSU4pID4gMDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25GbGFncyhcbiAgaXNBc3luYzogYm9vbGVhbixcbiAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4pOiBQYXJhbUtpbmQge1xuICByZXR1cm4gKGlzQXN5bmMgPyBQQVJBTV9BV0FJVCA6IDApIHwgKGlzR2VuZXJhdG9yID8gUEFSQU1fWUlFTEQgOiAwKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7XG4gIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lLFxuICB0dCxcbiAgdHlwZSBUb2tlblR5cGUsXG59IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCBUb2tlbml6ZXIgZnJvbSBcIi4uL3Rva2VuaXplclwiO1xuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBFc3RyZWVQcm9wZXJ0eURlZmluaXRpb24sIE5vZGUsIE9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBsaW5lQnJlYWssIHNraXBXaGl0ZVNwYWNlVG9MaW5lQnJlYWsgfSBmcm9tIFwiLi4vdXRpbC93aGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJDaGFyIH0gZnJvbSBcIi4uL3V0aWwvaWRlbnRpZmllclwiO1xuaW1wb3J0IENsYXNzU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL2NsYXNzLXNjb3BlXCI7XG5pbXBvcnQgRXhwcmVzc2lvblNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgeyBTQ09QRV9QUk9HUkFNIH0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuaW1wb3J0IFByb2R1Y3Rpb25QYXJhbWV0ZXJIYW5kbGVyLCB7XG4gIFBBUkFNX0FXQUlULFxuICBQQVJBTSxcbn0gZnJvbSBcIi4uL3V0aWwvcHJvZHVjdGlvbi1wYXJhbWV0ZXJcIjtcbmltcG9ydCB7XG4gIEVycm9ycyxcbiAgdHlwZSBQYXJzZUVycm9yLFxuICB0eXBlIFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL3Njb3BlXCI7XG5cbnR5cGUgVHJ5UGFyc2U8Tm9kZSwgRXJyb3IsIFRocm93biwgQWJvcnRlZCwgRmFpbFN0YXRlPiA9IHtcbiAgbm9kZTogTm9kZTtcbiAgZXJyb3I6IEVycm9yO1xuICB0aHJvd246IFRocm93bjtcbiAgYWJvcnRlZDogQWJvcnRlZDtcbiAgZmFpbFN0YXRlOiBGYWlsU3RhdGU7XG59O1xuXG4vLyAjIyBQYXJzZXIgdXRpbGl0aWVzXG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFV0aWxQYXJzZXIgZXh0ZW5kcyBUb2tlbml6ZXIge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIHBhcnNlci9pbmRleC5qc1xuICBhYnN0cmFjdCBnZXRTY29wZUhhbmRsZXIoKTogeyBuZXcgKC4uLmFyZ3M6IGFueSk6IFNjb3BlSGFuZGxlciB9O1xuXG4gIGFkZEV4dHJhKFxuICAgIG5vZGU6IFBhcnRpYWw8Tm9kZT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBlbnVtZXJhYmxlOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYSA9IChub2RlLmV4dHJhID0gbm9kZS5leHRyYSB8fCB7fSk7XG4gICAgaWYgKGVudW1lcmFibGUpIHtcbiAgICAgIGV4dHJhW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4dHJhLCBrZXksIHsgZW51bWVyYWJsZSwgdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdHMgd2hldGhlciBwYXJzZWQgdG9rZW4gaXMgYSBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgaXNDb250ZXh0dWFsKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS50eXBlID09PSB0b2tlbiAmJiAhdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgfVxuXG4gIGlzVW5wYXJzZWRDb250ZXh0dWFsKG5hbWVTdGFydDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYW1lRW5kID0gbmFtZVN0YXJ0ICsgbmFtZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaW5wdXQuc2xpY2UobmFtZVN0YXJ0LCBuYW1lRW5kKSA9PT0gbmFtZSkge1xuICAgICAgY29uc3QgbmV4dENoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KG5hbWVFbmQpO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGlzSWRlbnRpZmllckNoYXIobmV4dENoKSB8fFxuICAgICAgICAvLyBjaGVjayBpZiBgbmV4dENoIGlzIGJldHdlZW4gMHhkODAwIC0gMHhkYmZmLFxuICAgICAgICAvLyBpZiBgbmV4dENoYCBpcyBOYU4sIGBOYU4gJiAweGZjMDBgIGlzIDAsIHRoZSBmdW5jdGlvblxuICAgICAgICAvLyByZXR1cm5zIHRydWVcbiAgICAgICAgKG5leHRDaCAmIDB4ZmMwMCkgPT09IDB4ZDgwMFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNMb29rYWhlYWRDb250ZXh0dWFsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgcmV0dXJuIHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgbmFtZSk7XG4gIH1cblxuICAvLyBDb25zdW1lcyBjb250ZXh0dWFsIGtleXdvcmQgaWYgcG9zc2libGUuXG5cbiAgZWF0Q29udGV4dHVhbCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHRva2VuKSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQXNzZXJ0cyB0aGF0IGZvbGxvd2luZyB0b2tlbiBpcyBnaXZlbiBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgZXhwZWN0Q29udGV4dHVhbChcbiAgICB0b2tlbjogVG9rZW5UeXBlLFxuICAgIHRvUGFyc2VFcnJvcj86IFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcjxhbnk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWF0Q29udGV4dHVhbCh0b2tlbikpIHtcbiAgICAgIGlmICh0b1BhcnNlRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKHRvUGFyc2VFcnJvciwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdCB3aGV0aGVyIGEgc2VtaWNvbG9uIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi5cblxuICBjYW5JbnNlcnRTZW1pY29sb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubWF0Y2godHQuZW9mKSB8fFxuICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZVIpIHx8XG4gICAgICB0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpXG4gICAgKTtcbiAgfVxuXG4gIGhhc1ByZWNlZGluZ0xpbmVCcmVhaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGluZUJyZWFrLnRlc3QoXG4gICAgICB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhdGUubGFzdFRva0VuZExvYy5pbmRleCwgdGhpcy5zdGF0ZS5zdGFydCksXG4gICAgKTtcbiAgfVxuXG4gIGhhc0ZvbGxvd2luZ0xpbmVCcmVhaygpOiBib29sZWFuIHtcbiAgICBza2lwV2hpdGVTcGFjZVRvTGluZUJyZWFrLmxhc3RJbmRleCA9IHRoaXMuc3RhdGUuZW5kO1xuICAgIHJldHVybiBza2lwV2hpdGVTcGFjZVRvTGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dCk7XG4gIH1cblxuICBpc0xpbmVUZXJtaW5hdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVhdCh0dC5zZW1pKSB8fCB0aGlzLmNhbkluc2VydFNlbWljb2xvbigpO1xuICB9XG5cbiAgLy8gQ29uc3VtZSBhIHNlbWljb2xvbiwgb3IsIGZhaWxpbmcgdGhhdCwgc2VlIGlmIHdlIGFyZSBhbGxvd2VkIHRvXG4gIC8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG4gIHNlbWljb2xvbihhbGxvd0FzaTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoYWxsb3dBc2kgPyB0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSA6IHRoaXMuZWF0KHR0LnNlbWkpKSByZXR1cm47XG4gICAgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ1NlbWljb2xvbiwgeyBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jIH0pO1xuICB9XG5cbiAgLy8gRXhwZWN0IGEgdG9rZW4gb2YgYSBnaXZlbiB0eXBlLiBJZiBmb3VuZCwgY29uc3VtZSBpdCwgb3RoZXJ3aXNlLFxuICAvLyByYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yIGF0IGdpdmVuIHBvcy5cblxuICBleHBlY3QodHlwZTogVG9rZW5UeXBlLCBsb2M/OiBQb3NpdGlvbiB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVhdCh0eXBlKSB8fCB0aGlzLnVuZXhwZWN0ZWQobG9jLCB0eXBlKTtcbiAgfVxuXG4gIC8vIHRyeVBhcnNlIHdpbGwgY2xvbmUgcGFyc2VyIHN0YXRlLlxuICAvLyBJdCBpcyBleHBlbnNpdmUgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbnNcbiAgdHJ5UGFyc2U8VCBleHRlbmRzIE5vZGUgfCBSZWFkb25seUFycmF5PE5vZGU+PihcbiAgICBmbjogKGFib3J0OiAobm9kZT86IFQpID0+IG5ldmVyKSA9PiBULFxuICAgIG9sZFN0YXRlOiBTdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKSxcbiAgKTpcbiAgICB8IFRyeVBhcnNlPFQsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbD5cbiAgICB8IFRyeVBhcnNlPFQgfCBudWxsLCBQYXJzZUVycm9yPGFueT4sIGJvb2xlYW4sIGZhbHNlLCBTdGF0ZT5cbiAgICB8IFRyeVBhcnNlPFQgfCBudWxsLCBudWxsLCBmYWxzZSwgdHJ1ZSwgU3RhdGU+IHtcbiAgICBjb25zdCBhYm9ydFNpZ25hbDoge1xuICAgICAgbm9kZTogVCB8IG51bGw7XG4gICAgfSA9IHsgbm9kZTogbnVsbCB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlID0gZm4oKG5vZGUgPSBudWxsKSA9PiB7XG4gICAgICAgIGFib3J0U2lnbmFsLm5vZGUgPSBub2RlO1xuICAgICAgICB0aHJvdyBhYm9ydFNpZ25hbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3JzLmxlbmd0aCA+IG9sZFN0YXRlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmFpbFN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICAvLyB0b2tlbnNMZW5ndGggc2hvdWxkIGJlIHByZXNlcnZlZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkgbW9kZVxuICAgICAgICAvLyBzaW5jZSB0aGUgcGFyc2VyIGRvZXMgbm90IGhhbHQgYW5kIHdpbGwgaW5zdGVhZCBwYXJzZSB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHRva2Vuc1xuICAgICAgICB0aGlzLnN0YXRlLnRva2Vuc0xlbmd0aCA9IGZhaWxTdGF0ZS50b2tlbnNMZW5ndGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBlcnJvcjogZmFpbFN0YXRlLmVycm9yc1tvbGRTdGF0ZS5lcnJvcnMubGVuZ3RoXSxcbiAgICAgICAgICB0aHJvd246IGZhbHNlLFxuICAgICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGZhaWxTdGF0ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIHRocm93bjogZmFsc2UsXG4gICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICBmYWlsU3RhdGU6IG51bGwsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBmYWlsU3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYXN0aW5nIGdlbmVyYWwgc3ludGF4IGVycm9yIHRvIHBhcnNlIGVycm9yXG4gICAgICAgIHJldHVybiB7IG5vZGU6IG51bGwsIGVycm9yLCB0aHJvd246IHRydWUsIGFib3J0ZWQ6IGZhbHNlLCBmYWlsU3RhdGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvciA9PT0gYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBhYm9ydFNpZ25hbC5ub2RlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHRocm93bjogZmFsc2UsXG4gICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICBmYWlsU3RhdGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRXhwcmVzc2lvbkVycm9ycyhcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBhbmRUaHJvdzogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKCFyZWZFeHByZXNzaW9uRXJyb3JzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qge1xuICAgICAgc2hvcnRoYW5kQXNzaWduTG9jLFxuICAgICAgZG91YmxlUHJvdG9Mb2MsXG4gICAgICBwcml2YXRlS2V5TG9jLFxuICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzTG9jLFxuICAgIH0gPSByZWZFeHByZXNzaW9uRXJyb3JzO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID1cbiAgICAgICEhc2hvcnRoYW5kQXNzaWduTG9jIHx8XG4gICAgICAhIWRvdWJsZVByb3RvTG9jIHx8XG4gICAgICAhIW9wdGlvbmFsUGFyYW1ldGVyc0xvYyB8fFxuICAgICAgISFwcml2YXRlS2V5TG9jO1xuXG4gICAgaWYgKCFhbmRUaHJvdykge1xuICAgICAgcmV0dXJuIGhhc0Vycm9ycztcbiAgICB9XG5cbiAgICBpZiAoc2hvcnRoYW5kQXNzaWduTG9jICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRDb3ZlckluaXRpYWxpemVkTmFtZSwge1xuICAgICAgICBhdDogc2hvcnRoYW5kQXNzaWduTG9jLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRvdWJsZVByb3RvTG9jICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZVByb3RvLCB7IGF0OiBkb3VibGVQcm90b0xvYyB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJpdmF0ZUtleUxvYyAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkUHJpdmF0ZUZpZWxkLCB7IGF0OiBwcml2YXRlS2V5TG9jIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25hbFBhcmFtZXRlcnNMb2MgIT0gbnVsbCkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKG9wdGlvbmFsUGFyYW1ldGVyc0xvYyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgY3VycmVudCB0b2tlbiBpcyBhIGxpdGVyYWwgcHJvcGVydHkgbmFtZVxuICAgKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1MaXRlcmFsUHJvcGVydHlOYW1lXG4gICAqIExpdGVyYWxQcm9wZXJ0eU5hbWU6XG4gICAqICAgSWRlbnRpZmllck5hbWVcbiAgICogICBTdHJpbmdMaXRlcmFsXG4gICAqICAgTnVtZXJpY0xpdGVyYWxcbiAgICogICBCaWdJbnRMaXRlcmFsXG4gICAqL1xuICBpc0xpdGVyYWxQcm9wZXJ0eU5hbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiBnaXZlbiBub2RlIGlzIGEgUHJpdmF0ZU5hbWVcbiAgICogd2lsbCBiZSBvdmVycmlkZGVuIGluIEVTVHJlZSBwbHVnaW5cbiAgICovXG4gIGlzUHJpdmF0ZU5hbWUobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiUHJpdmF0ZU5hbWVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBvZiBhIGdpdmVuIHByaXZhdGUgbmFtZVxuICAgKiBXSVRIT1VUIGAjYFxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0YXRpYy1zZW1hbnRpY3Mtc3RyaW5ndmFsdWV9XG4gICAqL1xuICBnZXRQcml2YXRlTmFtZVNWKG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBub2RlLmlkLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgaXMgYSBtZW1iZXIvb3B0aW9uYWwgY2hhaW4gdGhhdFxuICAgKiBjb250YWlucyBhIHByaXZhdGUgbmFtZSBhcyBpdHMgcHJvcGVydHlcbiAgICogSXQgaXMgb3ZlcnJpZGRlbiBpbiBFU1RyZWUgcGx1Z2luXG4gICAqL1xuICBoYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAobm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpICYmXG4gICAgICB0aGlzLmlzUHJpdmF0ZU5hbWUobm9kZS5wcm9wZXJ0eSlcbiAgICApO1xuICB9XG5cbiAgaXNPYmplY3RQcm9wZXJ0eShcbiAgICBub2RlOiBOb2RlLFxuICApOiBub2RlIGlzIE9iamVjdFByb3BlcnR5IHwgRXN0cmVlUHJvcGVydHlEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCI7XG4gIH1cblxuICBpc09iamVjdE1ldGhvZChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJPYmplY3RNZXRob2RcIjtcbiAgfVxuXG4gIGluaXRpYWxpemVTY29wZXMoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGluTW9kdWxlOiBib29sZWFuID0gdGhpcy5vcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCIsXG4gICk6ICgpID0+IHZvaWQge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBvbGRMYWJlbHMgPSB0aGlzLnN0YXRlLmxhYmVscztcbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IFtdO1xuXG4gICAgY29uc3Qgb2xkRXhwb3J0ZWRJZGVudGlmaWVycyA9IHRoaXMuZXhwb3J0ZWRJZGVudGlmaWVycztcbiAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBpbml0aWFsaXplIHNjb3Blc1xuICAgIGNvbnN0IG9sZEluTW9kdWxlID0gdGhpcy5pbk1vZHVsZTtcbiAgICB0aGlzLmluTW9kdWxlID0gaW5Nb2R1bGU7XG5cbiAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc2NvcGU7XG4gICAgY29uc3QgU2NvcGVIYW5kbGVyID0gdGhpcy5nZXRTY29wZUhhbmRsZXIoKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlSGFuZGxlcih0aGlzLCBpbk1vZHVsZSk7XG5cbiAgICBjb25zdCBvbGRQcm9kUGFyYW0gPSB0aGlzLnByb2RQYXJhbTtcbiAgICB0aGlzLnByb2RQYXJhbSA9IG5ldyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlcigpO1xuXG4gICAgY29uc3Qgb2xkQ2xhc3NTY29wZSA9IHRoaXMuY2xhc3NTY29wZTtcbiAgICB0aGlzLmNsYXNzU2NvcGUgPSBuZXcgQ2xhc3NTY29wZUhhbmRsZXIodGhpcyk7XG5cbiAgICBjb25zdCBvbGRFeHByZXNzaW9uU2NvcGUgPSB0aGlzLmV4cHJlc3Npb25TY29wZTtcbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZSA9IG5ldyBFeHByZXNzaW9uU2NvcGVIYW5kbGVyKHRoaXMpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIFJldmVydCBzdGF0ZVxuICAgICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBvbGRMYWJlbHM7XG4gICAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMgPSBvbGRFeHBvcnRlZElkZW50aWZpZXJzO1xuXG4gICAgICAvLyBSZXZlcnQgc2NvcGVzXG4gICAgICB0aGlzLmluTW9kdWxlID0gb2xkSW5Nb2R1bGU7XG4gICAgICB0aGlzLnNjb3BlID0gb2xkU2NvcGU7XG4gICAgICB0aGlzLnByb2RQYXJhbSA9IG9sZFByb2RQYXJhbTtcbiAgICAgIHRoaXMuY2xhc3NTY29wZSA9IG9sZENsYXNzU2NvcGU7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZSA9IG9sZEV4cHJlc3Npb25TY29wZTtcbiAgICB9O1xuICB9XG5cbiAgZW50ZXJJbml0aWFsU2NvcGVzKCkge1xuICAgIGxldCBwYXJhbUZsYWdzID0gUEFSQU07XG4gICAgaWYgKHRoaXMuaW5Nb2R1bGUpIHtcbiAgICAgIHBhcmFtRmxhZ3MgfD0gUEFSQU1fQVdBSVQ7XG4gICAgfVxuICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfUFJPR1JBTSk7XG4gICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIocGFyYW1GbGFncyk7XG4gIH1cblxuICBjaGVja0Rlc3RydWN0dXJpbmdQcml2YXRlKHJlZkV4cHJlc3Npb25FcnJvcnM6IEV4cHJlc3Npb25FcnJvcnMpIHtcbiAgICBjb25zdCB7IHByaXZhdGVLZXlMb2MgfSA9IHJlZkV4cHJlc3Npb25FcnJvcnM7XG4gICAgaWYgKHByaXZhdGVLZXlMb2MgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZGVzdHJ1Y3R1cmluZ1ByaXZhdGVcIiwgcHJpdmF0ZUtleUxvYyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIEV4cHJlc3Npb25FcnJvcnMgaXMgYSBjb250ZXh0IHN0cnVjdCB1c2VkIHRvIHRyYWNrIGFtYmlndW91cyBwYXR0ZXJuc1xuICogV2hlbiB3ZSBhcmUgc3VyZSB0aGUgcGFyc2VkIHBhdHRlcm4gaXMgYSBSSFMsIHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBhIHBhdHRlcm4sXG4gKiB3ZSB3aWxsIHRocm93IG9uIHRoaXMgcG9zaXRpb24gb24gaW52YWxpZCBhc3NpZ24gc3ludGF4LCBvdGhlcndpc2UgaXQgd2lsbCBiZSByZXNldCB0byAtMVxuICpcbiAqIFR5cGVzIG9mIEV4cHJlc3Npb25FcnJvcnM6XG4gKlxuICogLSAqKnNob3J0aGFuZEFzc2lnbkxvYyoqOiB0cmFjayBpbml0aWFsaXplciBgPWAgcG9zaXRpb25cbiAqIC0gKipkb3VibGVQcm90b0xvYyoqOiB0cmFjayB0aGUgZHVwbGljYXRlIGBfX3Byb3RvX19gIGtleSBwb3NpdGlvblxuICogLSAqKnByaXZhdGVLZXkqKjogdHJhY2sgcHJpdmF0ZSBrZXkgYCNwYCBwb3NpdGlvblxuICogLSAqKm9wdGlvbmFsUGFyYW1ldGVyc0xvYyoqOiB0cmFjayB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIChgP2ApLlxuICogSXQncyBvbmx5IHVzZWQgYnkgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uRXJyb3JzIHtcbiAgc2hvcnRoYW5kQXNzaWduTG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICBkb3VibGVQcm90b0xvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZUtleUxvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgb3B0aW9uYWxQYXJhbWV0ZXJzTG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xufVxuIiwgImltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IFV0aWxQYXJzZXIgZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIHR5cGUgUG9zaXRpb24gfSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50LCBOb2RlIGFzIE5vZGVUeXBlLCBOb2RlQmFzZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0LlxuXG5jbGFzcyBOb2RlIGltcGxlbWVudHMgTm9kZUJhc2Uge1xuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFBhcnNlciwgcG9zOiBudW1iZXIsIGxvYzogUG9zaXRpb24pIHtcbiAgICB0aGlzLnN0YXJ0ID0gcG9zO1xuICAgIHRoaXMuZW5kID0gMDtcbiAgICB0aGlzLmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbihsb2MpO1xuICAgIGlmIChwYXJzZXI/Lm9wdGlvbnMucmFuZ2VzKSB0aGlzLnJhbmdlID0gW3BvcywgMF07XG4gICAgaWYgKHBhcnNlcj8uZmlsZW5hbWUpIHRoaXMubG9jLmZpbGVuYW1lID0gcGFyc2VyLmZpbGVuYW1lO1xuICB9XG5cbiAgdHlwZTogc3RyaW5nID0gXCJcIjtcbiAgZGVjbGFyZSBzdGFydDogbnVtYmVyO1xuICBkZWNsYXJlIGVuZDogbnVtYmVyO1xuICBkZWNsYXJlIGxvYzogU291cmNlTG9jYXRpb247XG4gIGRlY2xhcmUgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIGRlY2xhcmUgbGVhZGluZ0NvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSB0cmFpbGluZ0NvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSBpbm5lckNvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSBleHRyYToge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cbmNvbnN0IE5vZGVQcm90b3R5cGUgPSBOb2RlLnByb3RvdHlwZTtcblxuaWYgKCFwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgX19jbG9uZSBpcyBub3QgZGVmaW5lZCBpbiBOb2RlIHByb3RvdHlwZVxuICBOb2RlUHJvdG90eXBlLl9fY2xvbmUgPSBmdW5jdGlvbiAoKTogTm9kZSB7XG4gICAgY29uc3QgbmV3Tm9kZSA9IG5ldyBOb2RlKHVuZGVmaW5lZCwgdGhpcy5zdGFydCwgdGhpcy5sb2Muc3RhcnQpO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKSBhcyAoa2V5b2YgTm9kZSlbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIC8vIERvIG5vdCBjbG9uZSBjb21tZW50cyB0aGF0IGFyZSBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBub2RlXG4gICAgICBpZiAoXG4gICAgICAgIGtleSAhPT0gXCJsZWFkaW5nQ29tbWVudHNcIiAmJlxuICAgICAgICBrZXkgIT09IFwidHJhaWxpbmdDb21tZW50c1wiICYmXG4gICAgICAgIGtleSAhPT0gXCJpbm5lckNvbW1lbnRzXCJcbiAgICAgICkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNsb25pbmcgdGhpcyB0byBuZXdOb2RlXG4gICAgICAgIG5ld05vZGVba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Tm9kZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xvbmVQbGFjZWhvbGRlcihub2RlOiBhbnkpOiBhbnkge1xuICByZXR1cm4gY2xvbmVJZGVudGlmaWVyKG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVJZGVudGlmaWVyKG5vZGU6IGFueSk6IGFueSB7XG4gIC8vIFdlIGRvbid0IG5lZWQgdG8gY2xvbmUgYHR5cGVBbm5vdGF0aW9uc2AgYW5kIGBvcHRpb25hbGA6IGJlY2F1c2VcbiAgLy8gY2xvbmVJZGVudGlmaWVyIGlzIG9ubHkgdXNlZCBpbiBvYmplY3Qgc2hvcnRoYW5kIGFuZCBuYW1lZCBpbXBvcnQvZXhwb3J0LlxuICAvLyBOZWl0aGVyIG9mIHRoZW0gYWxsb3cgdHlwZSBhbm5vdGF0aW9ucyBhZnRlciB0aGUgaWRlbnRpZmllciBvciBvcHRpb25hbCBpZGVudGlmaWVyXG4gIGNvbnN0IHsgdHlwZSwgc3RhcnQsIGVuZCwgbG9jLCByYW5nZSwgZXh0cmEsIG5hbWUgfSA9IG5vZGU7XG4gIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoTm9kZVByb3RvdHlwZSk7XG4gIGNsb25lZC50eXBlID0gdHlwZTtcbiAgY2xvbmVkLnN0YXJ0ID0gc3RhcnQ7XG4gIGNsb25lZC5lbmQgPSBlbmQ7XG4gIGNsb25lZC5sb2MgPSBsb2M7XG4gIGNsb25lZC5yYW5nZSA9IHJhbmdlO1xuICBjbG9uZWQuZXh0cmEgPSBleHRyYTtcbiAgY2xvbmVkLm5hbWUgPSBuYW1lO1xuICBpZiAodHlwZSA9PT0gXCJQbGFjZWhvbGRlclwiKSB7XG4gICAgY2xvbmVkLmV4cGVjdGVkTm9kZSA9IG5vZGUuZXhwZWN0ZWROb2RlO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVN0cmluZ0xpdGVyYWwobm9kZTogYW55KTogYW55IHtcbiAgY29uc3QgeyB0eXBlLCBzdGFydCwgZW5kLCBsb2MsIHJhbmdlLCBleHRyYSB9ID0gbm9kZTtcbiAgaWYgKHR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIikge1xuICAgIHJldHVybiBjbG9uZVBsYWNlaG9sZGVyKG5vZGUpO1xuICB9XG4gIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoTm9kZVByb3RvdHlwZSk7XG4gIGNsb25lZC50eXBlID0gdHlwZTtcbiAgY2xvbmVkLnN0YXJ0ID0gc3RhcnQ7XG4gIGNsb25lZC5lbmQgPSBlbmQ7XG4gIGNsb25lZC5sb2MgPSBsb2M7XG4gIGNsb25lZC5yYW5nZSA9IHJhbmdlO1xuICBpZiAobm9kZS5yYXcgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGVzdHJlZSBzZXQgbm9kZS5yYXcgaW5zdGVhZCBvZiBub2RlLmV4dHJhXG4gICAgY2xvbmVkLnJhdyA9IG5vZGUucmF3O1xuICB9IGVsc2Uge1xuICAgIGNsb25lZC5leHRyYSA9IGV4dHJhO1xuICB9XG4gIGNsb25lZC52YWx1ZSA9IG5vZGUudmFsdWU7XG4gIHJldHVybiBjbG9uZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFVuZG9uZTxUIGV4dGVuZHMgTm9kZVR5cGU+ID0gT21pdDxULCBcInR5cGVcIj47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb2RlVXRpbHMgZXh0ZW5kcyBVdGlsUGFyc2VyIHtcbiAgc3RhcnROb2RlPFQgZXh0ZW5kcyBOb2RlVHlwZT4oKTogVW5kb25lPFQ+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhc3QgTm9kZSBhcyBVbmRvbmU8VD5cbiAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5zdGF0ZS5zdGFydCwgdGhpcy5zdGF0ZS5zdGFydExvYyk7XG4gIH1cblxuICBzdGFydE5vZGVBdDxUIGV4dGVuZHMgTm9kZVR5cGU+KGxvYzogUG9zaXRpb24pOiBVbmRvbmU8VD4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBOb2RlIGFzIFVuZG9uZTxUPlxuICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCBsb2MuaW5kZXgsIGxvYyk7XG4gIH1cblxuICAvKiogU3RhcnQgYSBuZXcgbm9kZSB3aXRoIGEgcHJldmlvdXMgbm9kZSdzIGxvY2F0aW9uLiAqL1xuICBzdGFydE5vZGVBdE5vZGU8VCBleHRlbmRzIE5vZGVUeXBlPih0eXBlOiBVbmRvbmU8Tm9kZVR5cGU+KTogVW5kb25lPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFydE5vZGVBdCh0eXBlLmxvYy5zdGFydCk7XG4gIH1cblxuICAvLyBGaW5pc2ggYW4gQVNUIG5vZGUsIGFkZGluZyBgdHlwZWAgYW5kIGBlbmRgIHByb3BlcnRpZXMuXG5cbiAgZmluaXNoTm9kZTxUIGV4dGVuZHMgTm9kZVR5cGU+KG5vZGU6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0pOiBUIHtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jKTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXG5cbiAgZmluaXNoTm9kZUF0PFQgZXh0ZW5kcyBOb2RlVHlwZT4oXG4gICAgbm9kZTogT21pdDxULCBcInR5cGVcIj4sXG4gICAgdHlwZTogVFtcInR5cGVcIl0sXG4gICAgZW5kTG9jOiBQb3NpdGlvbixcbiAgKTogVCB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBub2RlLmVuZCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJEbyBub3QgY2FsbCBmaW5pc2hOb2RlKigpIHR3aWNlIG9uIHRoZSBzYW1lIG5vZGUuXCIgK1xuICAgICAgICAgIFwiIEluc3RlYWQgdXNlIHJlc2V0RW5kTG9jYXRpb24oKSBvciBjaGFuZ2UgdHlwZSBkaXJlY3RseS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlcyBBU1QgdHlwaW5nc1xuICAgIG5vZGUudHlwZSA9IHR5cGU7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzIEFTVCB0eXBpbmdzXG4gICAgbm9kZS5lbmQgPSBlbmRMb2MuaW5kZXg7XG4gICAgbm9kZS5sb2MuZW5kID0gZW5kTG9jO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSBub2RlLnJhbmdlWzFdID0gZW5kTG9jLmluZGV4O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgdGhpcy5wcm9jZXNzQ29tbWVudChub2RlIGFzIFQpO1xuICAgIHJldHVybiBub2RlIGFzIFQ7XG4gIH1cblxuICByZXNldFN0YXJ0TG9jYXRpb24obm9kZTogTm9kZUJhc2UsIHN0YXJ0TG9jOiBQb3NpdGlvbik6IHZvaWQge1xuICAgIG5vZGUuc3RhcnQgPSBzdGFydExvYy5pbmRleDtcbiAgICBub2RlLmxvYy5zdGFydCA9IHN0YXJ0TG9jO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSBub2RlLnJhbmdlWzBdID0gc3RhcnRMb2MuaW5kZXg7XG4gIH1cblxuICByZXNldEVuZExvY2F0aW9uKFxuICAgIG5vZGU6IE5vZGVCYXNlLFxuICAgIGVuZExvYzogUG9zaXRpb24gPSB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICk6IHZvaWQge1xuICAgIG5vZGUuZW5kID0gZW5kTG9jLmluZGV4O1xuICAgIG5vZGUubG9jLmVuZCA9IGVuZExvYztcbiAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgbm9kZS5yYW5nZVsxXSA9IGVuZExvYy5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhcnQgbG9jYXRpb24gb2Ygbm9kZSB0byB0aGUgc3RhcnQgbG9jYXRpb24gb2YgbG9jYXRpb25Ob2RlXG4gICAqL1xuICByZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShub2RlOiBOb2RlQmFzZSwgbG9jYXRpb25Ob2RlOiBOb2RlQmFzZSk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uKG5vZGUsIGxvY2F0aW9uTm9kZS5sb2Muc3RhcnQpO1xuICB9XG59XG4iLCAiLyo6OiBkZWNsYXJlIHZhciBpbnZhcmlhbnQ7ICovXG5cbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi4vLi4vcGFyc2VyXCI7XG5pbXBvcnQge1xuICB0b2tlbklzSWRlbnRpZmllcixcbiAgdG9rZW5Jc0tleXdvcmQsXG4gIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyLFxuICB0b2tlbklzTGl0ZXJhbFByb3BlcnR5TmFtZSxcbiAgdG9rZW5MYWJlbE5hbWUsXG4gIHR0LFxuICB0eXBlIFRva2VuVHlwZSxcbiAgdG9rZW5Jc0Zsb3dJbnRlcmZhY2VPclR5cGVPck9wYXF1ZSxcbn0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgeyB0eXBlcyBhcyB0YyB9IGZyb20gXCIuLi8uLi90b2tlbml6ZXIvY29udGV4dFwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB7IGlzSXRlcmF0b3JTdGFydCB9IGZyb20gXCIuLi8uLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCBGbG93U2NvcGVIYW5kbGVyIGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQge1xuICBCSU5EX0xFWElDQUwsXG4gIEJJTkRfVkFSLFxuICBCSU5EX0ZVTkNUSU9OLFxuICBCSU5EX0ZMT1dfREVDTEFSRV9GTixcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0ZVTkNUSU9OLFxuICBTQ09QRV9PVEhFUixcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG59IGZyb20gXCIuLi8uLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZVN0YXRlbWVudEZsYWcgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL3N0YXRlbWVudFwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuLi8uLi9wYXJzZXIvbm9kZVwiO1xuXG5jb25zdCByZXNlcnZlZFR5cGVzID0gbmV3IFNldChbXG4gIFwiX1wiLFxuICBcImFueVwiLFxuICBcImJvb2xcIixcbiAgXCJib29sZWFuXCIsXG4gIFwiZW1wdHlcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJpbnRlcmZhY2VcIixcbiAgXCJtaXhlZFwiLFxuICBcIm51bGxcIixcbiAgXCJudW1iZXJcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJ0cnVlXCIsXG4gIFwidHlwZW9mXCIsXG4gIFwidm9pZFwiLFxuXSk7XG5cbi8qIGVzbGludCBzb3J0LWtleXM6IFwiZXJyb3JcIiAqL1xuLy8gVGhlIEVycm9ycyBrZXkgZm9sbG93cyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9ibG9iL21hc3Rlci9zcmMvcGFyc2VyL3BhcnNlX2Vycm9yLm1sIHVubGVzcyBpdCBkb2VzIG5vdCBleGlzdFxuY29uc3QgRmxvd0Vycm9ycyA9IFBhcnNlRXJyb3JFbnVtYGZsb3dgKHtcbiAgQW1iaWd1b3VzQ29uZGl0aW9uYWxBcnJvdzpcbiAgICBcIkFtYmlndW91cyBleHByZXNzaW9uOiB3cmFwIHRoZSBhcnJvdyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXMgdG8gZGlzYW1iaWd1YXRlLlwiLFxuICBBbWJpZ3VvdXNEZWNsYXJlTW9kdWxlS2luZDpcbiAgICBcIkZvdW5kIGJvdGggYGRlY2xhcmUgbW9kdWxlLmV4cG9ydHNgIGFuZCBgZGVjbGFyZSBleHBvcnRgIGluIHRoZSBzYW1lIG1vZHVsZS4gTW9kdWxlcyBjYW4gb25seSBoYXZlIDEgc2luY2UgdGhleSBhcmUgZWl0aGVyIGFuIEVTIG1vZHVsZSBvciB0aGV5IGFyZSBhIENvbW1vbkpTIG1vZHVsZS5cIixcbiAgLy8gVE9ETzogV2hlbiB3ZSBnZXQgcHJvcGVyIHN0cmluZyBlbnVtcyBpbiB0eXBlc2NyaXB0IG1ha2UgdGhpcyBSZXNlcnZlZFR5cGUuXG4gIC8vIE5vdCByZWFsbHkgd29ydGggaXQgdG8gZG8gdGhlIHdob2xlICRWYWx1ZXMgZGFuY2Ugd2l0aCByZXNlcnZlZFR5cGVzIHNldC5cbiAgQXNzaWduUmVzZXJ2ZWRUeXBlOiAoeyByZXNlcnZlZFR5cGUgfTogeyByZXNlcnZlZFR5cGU6IHN0cmluZyB9KSA9PlxuICAgIGBDYW5ub3Qgb3ZlcndyaXRlIHJlc2VydmVkIHR5cGUgJHtyZXNlcnZlZFR5cGV9LmAsXG4gIERlY2xhcmVDbGFzc0VsZW1lbnQ6XG4gICAgXCJUaGUgYGRlY2xhcmVgIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBjbGFzcyBmaWVsZHMuXCIsXG4gIERlY2xhcmVDbGFzc0ZpZWxkSW5pdGlhbGl6ZXI6XG4gICAgXCJJbml0aWFsaXplcnMgYXJlIG5vdCBhbGxvd2VkIGluIGZpZWxkcyB3aXRoIHRoZSBgZGVjbGFyZWAgbW9kaWZpZXIuXCIsXG4gIER1cGxpY2F0ZURlY2xhcmVNb2R1bGVFeHBvcnRzOlxuICAgIFwiRHVwbGljYXRlIGBkZWNsYXJlIG1vZHVsZS5leHBvcnRzYCBzdGF0ZW1lbnQuXCIsXG4gIEVudW1Cb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQ6ICh7XG4gICAgbWVtYmVyTmFtZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBCb29sZWFuIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLiBVc2UgZWl0aGVyIFxcYCR7bWVtYmVyTmFtZX0gPSB0cnVlLFxcYCBvciBcXGAke21lbWJlck5hbWV9ID0gZmFsc2UsXFxgIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bUR1cGxpY2F0ZU1lbWJlck5hbWU6ICh7XG4gICAgbWVtYmVyTmFtZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBFbnVtIG1lbWJlciBuYW1lcyBuZWVkIHRvIGJlIHVuaXF1ZSwgYnV0IHRoZSBuYW1lIFxcYCR7bWVtYmVyTmFtZX1cXGAgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGJlZm9yZSBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG4gIEVudW1JbmNvbnNpc3RlbnRNZW1iZXJWYWx1ZXM6ICh7IGVudW1OYW1lIH06IHsgZW51bU5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFbnVtIFxcYCR7ZW51bU5hbWV9XFxgIGhhcyBpbmNvbnNpc3RlbnQgbWVtYmVyIGluaXRpYWxpemVycy4gRWl0aGVyIHVzZSBubyBpbml0aWFsaXplcnMsIG9yIGNvbnNpc3RlbnRseSB1c2UgbGl0ZXJhbHMgKGVpdGhlciBib29sZWFucywgbnVtYmVycywgb3Igc3RyaW5ncykgZm9yIGFsbCBtZW1iZXIgaW5pdGlhbGl6ZXJzLmAsXG4gIEVudW1JbnZhbGlkRXhwbGljaXRUeXBlOiAoe1xuICAgIGludmFsaWRFbnVtVHlwZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIGludmFsaWRFbnVtVHlwZTogc3RyaW5nO1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYEVudW0gdHlwZSBcXGAke2ludmFsaWRFbnVtVHlwZX1cXGAgaXMgbm90IHZhbGlkLiBVc2Ugb25lIG9mIFxcYGJvb2xlYW5cXGAsIFxcYG51bWJlclxcYCwgXFxgc3RyaW5nXFxgLCBvciBcXGBzeW1ib2xcXGAgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBFbnVtSW52YWxpZEV4cGxpY2l0VHlwZVVua25vd25TdXBwbGllZDogKHtcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFN1cHBsaWVkIGVudW0gdHlwZSBpcyBub3QgdmFsaWQuIFVzZSBvbmUgb2YgXFxgYm9vbGVhblxcYCwgXFxgbnVtYmVyXFxgLCBcXGBzdHJpbmdcXGAsIG9yIFxcYHN5bWJvbFxcYCBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG5cbiAgLy8gVE9ETzogV2hlbiBtb3ZpbmcgdG8gdHlwZXNjcmlwdCwgd2Ugc2hvdWxkIGVpdGhlciBoYXZlIGVhY2ggb2YgdGhlXG4gIC8vIGZvbGxvd2luZyBlcnJvcnMgb25seSBhY2NlcHQgdGhlIHNwZWNpZmljIHN0cmluZ3MgdGhleSB3YW50OlxuICAvL1xuICAvLyAuLi5QcmltYXJ5VHlwZTogZXhwbGljaXRUeXBlOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiXG4gIC8vIC4uLlN5bWJvbFR5cGU6IGV4cGxpY2l0VHlwZTogXCJzeW1ib2xcIlxuICAvLyAuLi5Vbmtub3duVHlwZTogZXhwbGljaXRUeXBlOiBudWxsXG4gIC8vXG4gIC8vIE9yLCBhbHRlcm5hdGl2ZWx5LCBtZXJnZSB0aGVzZSB0aHJlZSBlcnJvcnMgdG9nZXRoZXIgaW50byBvbmVcbiAgLy8gYEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJgIGVycm9yIHRoYXQgY2FuIGFjY2VwdCBgRW51bUV4cGxpY2l0VHlwZWBcbiAgLy8gd2l0aG91dCBhbHRlcmF0aW9uLCBhbmQgdGhlbiBqdXN0IGhhdmUgaXRzIG1lc3NhZ2UgY2hhbmdlIGJhc2VkIG9uIHRoZVxuICAvLyBleHBsaWNpdFR5cGUuXG4gIEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJQcmltYXJ5VHlwZTogKHtcbiAgICBlbnVtTmFtZSxcbiAgICBtZW1iZXJOYW1lLFxuICAgIGV4cGxpY2l0VHlwZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgbWVtYmVyTmFtZTogc3RyaW5nO1xuICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgfSkgPT5cbiAgICBgRW51bSBcXGAke2VudW1OYW1lfVxcYCBoYXMgdHlwZSBcXGAke2V4cGxpY2l0VHlwZX1cXGAsIHNvIHRoZSBpbml0aWFsaXplciBvZiBcXGAke21lbWJlck5hbWV9XFxgIG5lZWRzIHRvIGJlIGEgJHtleHBsaWNpdFR5cGV9IGxpdGVyYWwuYCxcbiAgRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclN5bWJvbFR5cGU6ICh7XG4gICAgZW51bU5hbWUsXG4gICAgbWVtYmVyTmFtZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgbWVtYmVyTmFtZTogc3RyaW5nO1xuICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgfSkgPT5cbiAgICBgU3ltYm9sIGVudW0gbWVtYmVycyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuIFVzZSBcXGAke21lbWJlck5hbWV9LFxcYCBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG4gIEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJVbmtub3duVHlwZTogKHtcbiAgICBlbnVtTmFtZSxcbiAgICBtZW1iZXJOYW1lLFxuICB9OiB7XG4gICAgZW51bU5hbWU6IHN0cmluZztcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmc7XG4gICAgZXhwbGljaXRUeXBlOiBFbnVtRXhwbGljaXRUeXBlO1xuICB9KSA9PlxuICAgIGBUaGUgZW51bSBtZW1iZXIgaW5pdGlhbGl6ZXIgZm9yIFxcYCR7bWVtYmVyTmFtZX1cXGAgbmVlZHMgdG8gYmUgYSBsaXRlcmFsIChlaXRoZXIgYSBib29sZWFuLCBudW1iZXIsIG9yIHN0cmluZykgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBFbnVtSW52YWxpZE1lbWJlck5hbWU6ICh7XG4gICAgZW51bU5hbWUsXG4gICAgbWVtYmVyTmFtZSxcbiAgICBzdWdnZXN0aW9uLFxuICB9OiB7XG4gICAgZW51bU5hbWU6IHN0cmluZztcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmc7XG4gICAgc3VnZ2VzdGlvbjogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBFbnVtIG1lbWJlciBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBsb3dlcmNhc2UgJ2EnIHRocm91Z2ggJ3onLiBJbnN0ZWFkIG9mIHVzaW5nIFxcYCR7bWVtYmVyTmFtZX1cXGAsIGNvbnNpZGVyIHVzaW5nIFxcYCR7c3VnZ2VzdGlvbn1cXGAsIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bU51bWJlck1lbWJlck5vdEluaXRpYWxpemVkOiAoe1xuICAgIGVudW1OYW1lLFxuICAgIG1lbWJlck5hbWUsXG4gIH06IHtcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgfSkgPT5cbiAgICBgTnVtYmVyIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLCBlLmcuIFxcYCR7bWVtYmVyTmFtZX0gPSAxXFxgIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bVN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQ6ICh7XG4gICAgZW51bU5hbWUsXG4gIH06IHtcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBTdHJpbmcgZW51bSBtZW1iZXJzIG5lZWQgdG8gY29uc2lzdGVudGx5IGVpdGhlciBhbGwgdXNlIGluaXRpYWxpemVycywgb3IgdXNlIG5vIGluaXRpYWxpemVycywgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBHZXR0ZXJNYXlOb3RIYXZlVGhpc1BhcmFtOiBcIkEgZ2V0dGVyIGNhbm5vdCBoYXZlIGEgYHRoaXNgIHBhcmFtZXRlci5cIixcbiAgSW1wb3J0UmVmbGVjdGlvbkhhc0ltcG9ydFR5cGU6XG4gICAgXCJBbiBgaW1wb3J0IG1vZHVsZWAgZGVjbGFyYXRpb24gY2FuIG5vdCB1c2UgYHR5cGVgIG9yIGB0eXBlb2ZgIGtleXdvcmQuXCIsXG4gIEltcG9ydFR5cGVTaG9ydGhhbmRPbmx5SW5QdXJlSW1wb3J0OlxuICAgIFwiVGhlIGB0eXBlYCBhbmQgYHR5cGVvZmAga2V5d29yZHMgb24gbmFtZWQgaW1wb3J0cyBjYW4gb25seSBiZSB1c2VkIG9uIHJlZ3VsYXIgYGltcG9ydGAgc3RhdGVtZW50cy4gSXQgY2Fubm90IGJlIHVzZWQgd2l0aCBgaW1wb3J0IHR5cGVgIG9yIGBpbXBvcnQgdHlwZW9mYCBzdGF0ZW1lbnRzLlwiLFxuICBJbmV4YWN0SW5zaWRlRXhhY3Q6XG4gICAgXCJFeHBsaWNpdCBpbmV4YWN0IHN5bnRheCBjYW5ub3QgYXBwZWFyIGluc2lkZSBhbiBleHBsaWNpdCBleGFjdCBvYmplY3QgdHlwZS5cIixcbiAgSW5leGFjdEluc2lkZU5vbk9iamVjdDpcbiAgICBcIkV4cGxpY2l0IGluZXhhY3Qgc3ludGF4IGNhbm5vdCBhcHBlYXIgaW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGRlZmluaXRpb25zLlwiLFxuICBJbmV4YWN0VmFyaWFuY2U6IFwiRXhwbGljaXQgaW5leGFjdCBzeW50YXggY2Fubm90IGhhdmUgdmFyaWFuY2UuXCIsXG4gIEludmFsaWROb25UeXBlSW1wb3J0SW5EZWNsYXJlTW9kdWxlOlxuICAgIFwiSW1wb3J0cyB3aXRoaW4gYSBgZGVjbGFyZSBtb2R1bGVgIGJvZHkgbXVzdCBhbHdheXMgYmUgYGltcG9ydCB0eXBlYCBvciBgaW1wb3J0IHR5cGVvZmAuXCIsXG4gIE1pc3NpbmdUeXBlUGFyYW1EZWZhdWx0OlxuICAgIFwiVHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gbmVlZHMgYSBkZWZhdWx0LCBzaW5jZSBhIHByZWNlZGluZyB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBoYXMgYSBkZWZhdWx0LlwiLFxuICBOZXN0ZWREZWNsYXJlTW9kdWxlOlxuICAgIFwiYGRlY2xhcmUgbW9kdWxlYCBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgYW5vdGhlciBgZGVjbGFyZSBtb2R1bGVgLlwiLFxuICBOZXN0ZWRGbG93Q29tbWVudDogXCJDYW5ub3QgaGF2ZSBhIGZsb3cgY29tbWVudCBpbnNpZGUgYW5vdGhlciBmbG93IGNvbW1lbnQuXCIsXG4gIFBhdHRlcm5Jc09wdGlvbmFsOiB7XG4gICAgbWVzc2FnZTpcbiAgICAgIFwiQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuXCIsXG4gICAgLy8gRm9yIGNvbnNpc3RlbmN5IGluIFR5cGVTY3JpcHQgYW5kIEZsb3cgZXJyb3IgY29kZXNcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8geyByZWFzb25Db2RlOiBcIk9wdGlvbmFsQmluZGluZ1BhdHRlcm5cIiB9XG4gICAgICA6IHt9KSxcbiAgfSxcbiAgU2V0dGVyTWF5Tm90SGF2ZVRoaXNQYXJhbTogXCJBIHNldHRlciBjYW5ub3QgaGF2ZSBhIGB0aGlzYCBwYXJhbWV0ZXIuXCIsXG4gIFNwcmVhZFZhcmlhbmNlOiBcIlNwcmVhZCBwcm9wZXJ0aWVzIGNhbm5vdCBoYXZlIHZhcmlhbmNlLlwiLFxuICBUaGlzUGFyYW1Bbm5vdGF0aW9uUmVxdWlyZWQ6XG4gICAgXCJBIHR5cGUgYW5ub3RhdGlvbiBpcyByZXF1aXJlZCBmb3IgdGhlIGB0aGlzYCBwYXJhbWV0ZXIuXCIsXG4gIFRoaXNQYXJhbUJhbm5lZEluQ29uc3RydWN0b3I6XG4gICAgXCJDb25zdHJ1Y3RvcnMgY2Fubm90IGhhdmUgYSBgdGhpc2AgcGFyYW1ldGVyOyBjb25zdHJ1Y3RvcnMgZG9uJ3QgYmluZCBgdGhpc2AgbGlrZSBvdGhlciBmdW5jdGlvbnMuXCIsXG4gIFRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWw6IFwiVGhlIGB0aGlzYCBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsLlwiLFxuICBUaGlzUGFyYW1NdXN0QmVGaXJzdDpcbiAgICBcIlRoZSBgdGhpc2AgcGFyYW1ldGVyIG11c3QgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhcmFtZXRlci5cIixcbiAgVGhpc1BhcmFtTm9EZWZhdWx0OiBcIlRoZSBgdGhpc2AgcGFyYW1ldGVyIG1heSBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuXCIsXG4gIFR5cGVCZWZvcmVJbml0aWFsaXplcjpcbiAgICBcIlR5cGUgYW5ub3RhdGlvbnMgbXVzdCBjb21lIGJlZm9yZSBkZWZhdWx0IGFzc2lnbm1lbnRzLCBlLmcuIGluc3RlYWQgb2YgYGFnZSA9IDI1OiBudW1iZXJgIHVzZSBgYWdlOiBudW1iZXIgPSAyNWAuXCIsXG4gIFR5cGVDYXN0SW5QYXR0ZXJuOlxuICAgIFwiVGhlIHR5cGUgY2FzdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkIHRvIGJlIHdyYXBwZWQgd2l0aCBwYXJlbnRoZXNpcy5cIixcbiAgVW5leHBlY3RlZEV4cGxpY2l0SW5leGFjdEluT2JqZWN0OlxuICAgIFwiRXhwbGljaXQgaW5leGFjdCBzeW50YXggbXVzdCBhcHBlYXIgYXQgdGhlIGVuZCBvZiBhbiBpbmV4YWN0IG9iamVjdC5cIixcbiAgVW5leHBlY3RlZFJlc2VydmVkVHlwZTogKHsgcmVzZXJ2ZWRUeXBlIH06IHsgcmVzZXJ2ZWRUeXBlOiBzdHJpbmcgfSkgPT5cbiAgICBgVW5leHBlY3RlZCByZXNlcnZlZCB0eXBlICR7cmVzZXJ2ZWRUeXBlfS5gLFxuICBVbmV4cGVjdGVkUmVzZXJ2ZWRVbmRlcnNjb3JlOlxuICAgIFwiYF9gIGlzIG9ubHkgYWxsb3dlZCBhcyBhIHR5cGUgYXJndW1lbnQgdG8gY2FsbCBvciBuZXcuXCIsXG4gIFVuZXhwZWN0ZWRTcGFjZUJldHdlZW5Nb2R1bG9DaGVja3M6XG4gICAgXCJTcGFjZXMgYmV0d2VlbiBgJWAgYW5kIGBjaGVja3NgIGFyZSBub3QgYWxsb3dlZCBoZXJlLlwiLFxuICBVbmV4cGVjdGVkU3ByZWFkVHlwZTpcbiAgICBcIlNwcmVhZCBvcGVyYXRvciBjYW5ub3QgYXBwZWFyIGluIGNsYXNzIG9yIGludGVyZmFjZSBkZWZpbml0aW9ucy5cIixcbiAgVW5leHBlY3RlZFN1YnRyYWN0aW9uT3BlcmFuZDpcbiAgICAnVW5leHBlY3RlZCB0b2tlbiwgZXhwZWN0ZWQgXCJudW1iZXJcIiBvciBcImJpZ2ludFwiLicsXG4gIFVuZXhwZWN0ZWRUb2tlbkFmdGVyVHlwZVBhcmFtZXRlcjpcbiAgICBcIkV4cGVjdGVkIGFuIGFycm93IGZ1bmN0aW9uIGFmdGVyIHRoaXMgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uXCIsXG4gIFVuZXhwZWN0ZWRUeXBlUGFyYW1ldGVyQmVmb3JlQXN5bmNBcnJvd0Z1bmN0aW9uOlxuICAgIFwiVHlwZSBwYXJhbWV0ZXJzIG11c3QgY29tZSBhZnRlciB0aGUgYXN5bmMga2V5d29yZCwgZS5nLiBpbnN0ZWFkIG9mIGA8VD4gYXN5bmMgKCkgPT4ge31gLCB1c2UgYGFzeW5jIDxUPigpID0+IHt9YC5cIixcbiAgVW5zdXBwb3J0ZWREZWNsYXJlRXhwb3J0S2luZDogKHtcbiAgICB1bnN1cHBvcnRlZEV4cG9ydEtpbmQsXG4gICAgc3VnZ2VzdGlvbixcbiAgfToge1xuICAgIHVuc3VwcG9ydGVkRXhwb3J0S2luZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb246IHN0cmluZztcbiAgfSkgPT5cbiAgICBgXFxgZGVjbGFyZSBleHBvcnQgJHt1bnN1cHBvcnRlZEV4cG9ydEtpbmR9XFxgIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBcXGAke3N1Z2dlc3Rpb259XFxgIGluc3RlYWQuYCxcbiAgVW5zdXBwb3J0ZWRTdGF0ZW1lbnRJbkRlY2xhcmVNb2R1bGU6XG4gICAgXCJPbmx5IGRlY2xhcmVzIGFuZCB0eXBlIGltcG9ydHMgYXJlIGFsbG93ZWQgaW5zaWRlIGRlY2xhcmUgbW9kdWxlLlwiLFxuICBVbnRlcm1pbmF0ZWRGbG93Q29tbWVudDogXCJVbnRlcm1pbmF0ZWQgZmxvdy1jb21tZW50LlwiLFxufSk7XG4vKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWtleXMgKi9cblxuZnVuY3Rpb24gaXNFc01vZHVsZVR5cGUoYm9keUVsZW1lbnQ6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGJvZHlFbGVtZW50LnR5cGUgPT09IFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIgfHxcbiAgICAoYm9keUVsZW1lbnQudHlwZSA9PT0gXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIiAmJlxuICAgICAgKCFib2R5RWxlbWVudC5kZWNsYXJhdGlvbiB8fFxuICAgICAgICAoYm9keUVsZW1lbnQuZGVjbGFyYXRpb24udHlwZSAhPT0gXCJUeXBlQWxpYXNcIiAmJlxuICAgICAgICAgIGJvZHlFbGVtZW50LmRlY2xhcmF0aW9uLnR5cGUgIT09IFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIikpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNUeXBlSW1wb3J0S2luZChub2RlOiBOLk5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgfHwgbm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVvZlwiO1xufVxuXG5jb25zdCBleHBvcnRTdWdnZXN0aW9ucyA9IHtcbiAgY29uc3Q6IFwiZGVjbGFyZSBleHBvcnQgdmFyXCIsXG4gIGxldDogXCJkZWNsYXJlIGV4cG9ydCB2YXJcIixcbiAgdHlwZTogXCJleHBvcnQgdHlwZVwiLFxuICBpbnRlcmZhY2U6IFwiZXhwb3J0IGludGVyZmFjZVwiLFxufTtcblxuLy8gTGlrZSBBcnJheSNmaWx0ZXIsIGJ1dCByZXR1cm5zIGEgdHVwbGUgWyBhY2NlcHRlZEVsZW1lbnRzLCBkaXNjYXJkZWRFbGVtZW50cyBdXG5mdW5jdGlvbiBwYXJ0aXRpb248VD4oXG4gIGxpc3Q6IFRbXSxcbiAgdGVzdDogKGM6IFQsIGI6IG51bWJlciwgYTogVFtdKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbik6IFtUW10sIFRbXV0ge1xuICBjb25zdCBsaXN0MTogVFtdID0gW107XG4gIGNvbnN0IGxpc3QyOiBUW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgKHRlc3QobGlzdFtpXSwgaSwgbGlzdCkgPyBsaXN0MSA6IGxpc3QyKS5wdXNoKGxpc3RbaV0pO1xuICB9XG4gIHJldHVybiBbbGlzdDEsIGxpc3QyXTtcbn1cblxuY29uc3QgRkxPV19QUkFHTUFfUkVHRVggPSAvXFwqP1xccypAKCg/Om5vKT9mbG93KVxcYi87XG5cbi8vIEZsb3cgZW51bXMgdHlwZXNcbnR5cGUgRW51bUV4cGxpY2l0VHlwZSA9IG51bGwgfCBcImJvb2xlYW5cIiB8IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJzeW1ib2xcIjtcblxudHlwZSBFbnVtQ29udGV4dCA9IHtcbiAgZW51bU5hbWU6IHN0cmluZztcbiAgZXhwbGljaXRUeXBlOiBFbnVtRXhwbGljaXRUeXBlO1xuICBtZW1iZXJOYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEVudW1NZW1iZXJJbml0ID1cbiAgfCB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiO1xuICAgICAgbG9jOiBQb3NpdGlvbjtcbiAgICAgIHZhbHVlOiBOLk5vZGU7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgICAgdmFsdWU6IE4uTm9kZTtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJib29sZWFuXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgICAgdmFsdWU6IE4uTm9kZTtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJpbnZhbGlkXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcIm5vbmVcIjtcbiAgICAgIGxvYzogUG9zaXRpb247XG4gICAgfTtcblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IHR5cGVvZiBQYXJzZXIpID0+XG4gIGNsYXNzIEZsb3dQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgQGZsb3cvQG5vZmxvdyBwcmFnbWEuIEluaXRpYWxseSB1bmRlZmluZWQsIHRyYW5zaXRpb25zXG4gICAgLy8gdG8gXCJAZmxvd1wiIG9yIFwiQG5vZmxvd1wiIGlmIHdlIHNlZSBhIHByYWdtYS4gVHJhbnNpdGlvbnMgdG8gbnVsbCBpZiB3ZSBhcmVcbiAgICAvLyBwYXN0IHRoZSBpbml0aWFsIGNvbW1lbnQuXG4gICAgZmxvd1ByYWdtYTogdm9pZCB8IG51bGwgfCBcImZsb3dcIiB8IFwibm9mbG93XCIgPSB1bmRlZmluZWQ7XG5cbiAgICBnZXRTY29wZUhhbmRsZXIoKToge1xuICAgICAgbmV3ICguLi5hcmdzOiBhbnkpOiBGbG93U2NvcGVIYW5kbGVyO1xuICAgIH0ge1xuICAgICAgcmV0dXJuIEZsb3dTY29wZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VUeXBlcygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBsdWdpbk9wdGlvbihcImZsb3dcIiwgXCJhbGxcIikgfHwgdGhpcy5mbG93UHJhZ21hID09PSBcImZsb3dcIjtcbiAgICB9XG5cbiAgICBzaG91bGRQYXJzZUVudW1zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJmbG93XCIsIFwiZW51bXNcIik7XG4gICAgfVxuXG4gICAgZmluaXNoVG9rZW4odHlwZTogVG9rZW5UeXBlLCB2YWw6IGFueSk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlICE9PSB0dC5zdHJpbmcgJiZcbiAgICAgICAgdHlwZSAhPT0gdHQuc2VtaSAmJlxuICAgICAgICB0eXBlICE9PSB0dC5pbnRlcnByZXRlckRpcmVjdGl2ZVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmZpbmlzaFRva2VuKHR5cGUsIHZhbCk7XG4gICAgfVxuXG4gICAgYWRkQ29tbWVudChjb21tZW50OiBOLkNvbW1lbnQpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUcnkgdG8gcGFyc2UgYSBmbG93IHByYWdtYS5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEZMT1dfUFJBR01BX1JFR0VYLmV4ZWMoY29tbWVudC52YWx1ZSk7XG4gICAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzWzFdID09PSBcImZsb3dcIikge1xuICAgICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IFwiZmxvd1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZXNbMV0gPT09IFwibm9mbG93XCIpIHtcbiAgICAgICAgICB0aGlzLmZsb3dQcmFnbWEgPSBcIm5vZmxvd1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZmxvdyBwcmFnbWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmFkZENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHRvaz86IFRva2VuVHlwZSk6IE4uRmxvd1R5cGUge1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG4gICAgICB0aGlzLmV4cGVjdCh0b2sgfHwgdHQuY29sb24pO1xuXG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVByZWRpY2F0ZSgpOiBOLkZsb3dQcmVkaWNhdGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBjb25zdCBtb2R1bG9Mb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCBgJWBcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fY2hlY2tzKTtcbiAgICAgIC8vIEZvcmNlICclJyBhbmQgJ2NoZWNrcycgdG8gYmUgYWRqYWNlbnRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCA+IG1vZHVsb0xvYy5pbmRleCArIDEpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRTcGFjZUJldHdlZW5Nb2R1bG9DaGVja3MsIHtcbiAgICAgICAgICBhdDogbW9kdWxvTG9jLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVhdCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSBzdXBlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVkUHJlZGljYXRlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkluZmVycmVkUHJlZGljYXRlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpOiBbXG4gICAgICBOLkZsb3dUeXBlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIE4uRmxvd1ByZWRpY2F0ZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgXSB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgIGxldCBwcmVkaWNhdGUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQubW9kdWxvKSkge1xuICAgICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgICAgcHJlZGljYXRlID0gdGhpcy5mbG93UGFyc2VQcmVkaWNhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSBvbGRJblR5cGU7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lm1vZHVsbykpIHtcbiAgICAgICAgICBwcmVkaWNhdGUgPSB0aGlzLmZsb3dQYXJzZVByZWRpY2F0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIHByZWRpY2F0ZV07XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRGVjbGFyZUNsYXNzKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVDbGFzcz4sXG4gICAgKTogTi5GbG93RGVjbGFyZUNsYXNzIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZSwgLyppc0NsYXNzKi8gdHJ1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUNsYXNzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVGdW5jdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlRnVuY3Rpb24+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVGdW5jdGlvbiB7XG4gICAgICB0aGlzLm5leHQoKTtcblxuICAgICAgY29uc3QgaWQgPSAobm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCkpO1xuXG4gICAgICBjb25zdCB0eXBlTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBjb25zdCB0eXBlQ29udGFpbmVyID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHR5cGVOb2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVOb2RlLnR5cGVQYXJhbWV0ZXJzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcbiAgICAgIGNvbnN0IHRtcCA9IHRoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW1zKCk7XG4gICAgICB0eXBlTm9kZS5wYXJhbXMgPSB0bXAucGFyYW1zO1xuICAgICAgdHlwZU5vZGUucmVzdCA9IHRtcC5yZXN0O1xuICAgICAgdHlwZU5vZGUudGhpcyA9IHRtcC5fdGhpcztcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAgIFt0eXBlTm9kZS5yZXR1cm5UeXBlLCBub2RlLnByZWRpY2F0ZV0gPVxuICAgICAgICB0aGlzLmZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpO1xuXG4gICAgICB0eXBlQ29udGFpbmVyLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgICB0eXBlTm9kZSxcbiAgICAgICAgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICApO1xuXG4gICAgICBpZC50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmluaXNoTm9kZSh0eXBlQ29udGFpbmVyLCBcIlR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oaWQpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShcbiAgICAgICAgbm9kZS5pZC5uYW1lLFxuICAgICAgICBCSU5EX0ZMT1dfREVDTEFSRV9GTixcbiAgICAgICAgbm9kZS5pZC5sb2Muc3RhcnQsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmUoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93RGVjbGFyZT4sXG4gICAgICBpbnNpZGVNb2R1bGU/OiBib29sZWFuLFxuICAgICk6IE4uRmxvd0RlY2xhcmUge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlQ2xhc3Mobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuX2Z1bmN0aW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlRnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuX3ZhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRGVjbGFyZVZhcmlhYmxlKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX21vZHVsZSkpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVNb2R1bGVFeHBvcnRzKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpbnNpZGVNb2R1bGUpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5OZXN0ZWREZWNsYXJlTW9kdWxlLCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlTW9kdWxlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlVHlwZUFsaWFzKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fb3BhcXVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlT3BhcXVlVHlwZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2ludGVyZmFjZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRGVjbGFyZUludGVyZmFjZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5fZXhwb3J0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24obm9kZSwgaW5zaWRlTW9kdWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVWYXJpYWJsZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlVmFyaWFibGU+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVWYXJpYWJsZSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0YWJsZUlkZW50aWZpZXIoXG4gICAgICAgIC8qYWxsb3dQcmltaXRpdmVPdmVycmlkZSovIHRydWUsXG4gICAgICApO1xuICAgICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShub2RlLmlkLm5hbWUsIEJJTkRfVkFSLCBub2RlLmlkLmxvYy5zdGFydCk7XG4gICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVWYXJpYWJsZVwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VEZWNsYXJlTW9kdWxlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVNb2R1bGU+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVNb2R1bGUge1xuICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0cmluZykpIHtcbiAgICAgICAgbm9kZS5pZCA9IHN1cGVyLnBhcnNlRXhwckF0b20oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5Tm9kZSA9IChub2RlLmJvZHkgPSB0aGlzLnN0YXJ0Tm9kZSgpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJvZHkgPSAoYm9keU5vZGUuYm9keSA9IFtdKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgICB3aGlsZSAoIXRoaXMubWF0Y2godHQuYnJhY2VSKSkge1xuICAgICAgICBsZXQgYm9keU5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkltcG9ydERlY2xhcmF0aW9uPigpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9pbXBvcnQpKSB7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkgJiYgIXRoaXMubWF0Y2godHQuX3R5cGVvZikpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5JbnZhbGlkTm9uVHlwZUltcG9ydEluRGVjbGFyZU1vZHVsZSwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucGFyc2VJbXBvcnQoYm9keU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcbiAgICAgICAgICAgIHR0Ll9kZWNsYXJlLFxuICAgICAgICAgICAgRmxvd0Vycm9ycy5VbnN1cHBvcnRlZFN0YXRlbWVudEluRGVjbGFyZU1vZHVsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICBib2R5Tm9kZSA9IHRoaXMuZmxvd1BhcnNlRGVjbGFyZShib2R5Tm9kZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5LnB1c2goYm9keU5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNjb3BlLmV4aXQoKTtcblxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIkJsb2NrU3RhdGVtZW50XCIpO1xuXG4gICAgICBsZXQga2luZDogXCJDb21tb25KU1wiIHwgXCJFU1wiIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFzTW9kdWxlRXhwb3J0ID0gZmFsc2U7XG4gICAgICBib2R5LmZvckVhY2goYm9keUVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoaXNFc01vZHVsZVR5cGUoYm9keUVsZW1lbnQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiQ29tbW9uSlNcIikge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0RlY2xhcmVNb2R1bGVLaW5kLCB7XG4gICAgICAgICAgICAgIGF0OiBib2R5RWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBraW5kID0gXCJFU1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGJvZHlFbGVtZW50LnR5cGUgPT09IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIikge1xuICAgICAgICAgIGlmIChoYXNNb2R1bGVFeHBvcnQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5EdXBsaWNhdGVEZWNsYXJlTW9kdWxlRXhwb3J0cywge1xuICAgICAgICAgICAgICBhdDogYm9keUVsZW1lbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiRVNcIikge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0RlY2xhcmVNb2R1bGVLaW5kLCB7XG4gICAgICAgICAgICAgIGF0OiBib2R5RWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBraW5kID0gXCJDb21tb25KU1wiO1xuICAgICAgICAgIGhhc01vZHVsZUV4cG9ydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBub2RlLmtpbmQgPSBraW5kIHx8IFwiQ29tbW9uSlNcIjtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJEZWNsYXJlTW9kdWxlXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVFeHBvcnREZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24+LFxuICAgICAgaW5zaWRlTW9kdWxlPzogYm9vbGVhbiB8IG51bGwsXG4gICAgKTogTi5GbG93RGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIHtcbiAgICAgIHRoaXMuZXhwZWN0KHR0Ll9leHBvcnQpO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQuX2RlZmF1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHwgdGhpcy5tYXRjaCh0dC5fY2xhc3MpKSB7XG4gICAgICAgICAgLy8gZGVjbGFyZSBleHBvcnQgZGVmYXVsdCBjbGFzcyAuLi5cbiAgICAgICAgICAvLyBkZWNsYXJlIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIC4uLlxuICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLmZsb3dQYXJzZURlY2xhcmUodGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGVjbGFyZSBleHBvcnQgZGVmYXVsdCBbdHlwZV07XG4gICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuX2NvbnN0KSB8fFxuICAgICAgICAgIHRoaXMuaXNMZXQoKSB8fFxuICAgICAgICAgICgodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpIHx8IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSAmJlxuICAgICAgICAgICAgIWluc2lkZU1vZHVsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnN0YXRlLnZhbHVlIGFzXG4gICAgICAgICAgICB8IFwiY29uc3RcIlxuICAgICAgICAgICAgfCBcImxldFwiXG4gICAgICAgICAgICB8IFwidHlwZVwiXG4gICAgICAgICAgICB8IFwiaW50ZXJmYWNlXCI7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuc3VwcG9ydGVkRGVjbGFyZUV4cG9ydEtpbmQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgdW5zdXBwb3J0ZWRFeHBvcnRLaW5kOiBsYWJlbCxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb246IGV4cG9ydFN1Z2dlc3Rpb25zW2xhYmVsXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll92YXIpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IHZhciAuLi5cbiAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHwgLy8gZGVjbGFyZSBleHBvcnQgZnVuY3Rpb24gLi4uXG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5fY2xhc3MpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IGNsYXNzIC4uLlxuICAgICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9vcGFxdWUpIC8vIGRlY2xhcmUgZXhwb3J0IG9wYXF1ZSAuLlxuICAgICAgICApIHtcbiAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5mbG93UGFyc2VEZWNsYXJlKHRoaXMuc3RhcnROb2RlKCkpO1xuICAgICAgICAgIG5vZGUuZGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpIHx8IC8vIGRlY2xhcmUgZXhwb3J0ICogZnJvbSAnJ1xuICAgICAgICAgIHRoaXMubWF0Y2godHQuYnJhY2VMKSB8fCAvLyBkZWNsYXJlIGV4cG9ydCB7fSAuLi5cbiAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSB8fCAvLyBkZWNsYXJlIGV4cG9ydCBpbnRlcmZhY2UgLi4uXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IHR5cGUgLi4uXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX29wYXF1ZSkgLy8gZGVjbGFyZSBleHBvcnQgb3BhcXVlIHR5cGUgLi4uXG4gICAgICAgICkge1xuICAgICAgICAgIG5vZGUgPSB0aGlzLnBhcnNlRXhwb3J0KFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5FeHBvcnRBbGxEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgICAvKiBkZWNvcmF0b3JzICovIG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIikge1xuICAgICAgICAgICAgbm9kZS50eXBlID0gXCJFeHBvcnREZWNsYXJhdGlvblwiO1xuICAgICAgICAgICAgbm9kZS5kZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBkZWxldGUgbm9kZS5leHBvcnRLaW5kO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vZGUudHlwZSA9IFwiRGVjbGFyZVwiICsgbm9kZS50eXBlO1xuXG4gICAgICAgICAgcmV0dXJuIG5vZGUgYXMgTi5Ob2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVNb2R1bGVFeHBvcnRzKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVNb2R1bGVFeHBvcnRzPixcbiAgICApOiBOLkZsb3dEZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fZXhwb3J0cyk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVUeXBlQWxpYXMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93RGVjbGFyZVR5cGVBbGlhcz4sXG4gICAgKTogTi5GbG93RGVjbGFyZVR5cGVBbGlhcyB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IGZpbmlzaGVkID0gdGhpcy5mbG93UGFyc2VUeXBlQWxpYXMobm9kZSk7XG4gICAgICAvLyBEb24ndCBkbyBmaW5pc2hOb2RlIGFzIHdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBjb21tZW50cyB0d2ljZVxuICAgICAgZmluaXNoZWQudHlwZSA9IFwiRGVjbGFyZVR5cGVBbGlhc1wiO1xuICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVPcGFxdWVUeXBlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVPcGFxdWVUeXBlPixcbiAgICApOiBOLkZsb3dEZWNsYXJlT3BhcXVlVHlwZSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IGZpbmlzaGVkID0gdGhpcy5mbG93UGFyc2VPcGFxdWVUeXBlKG5vZGUsIHRydWUpO1xuICAgICAgLy8gRG9uJ3QgZG8gZmluaXNoTm9kZSBhcyB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgY29tbWVudHMgdHdpY2VcbiAgICAgIGZpbmlzaGVkLnR5cGUgPSBcIkRlY2xhcmVPcGFxdWVUeXBlXCI7XG4gICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRGVjbGFyZUludGVyZmFjZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlSW50ZXJmYWNlPixcbiAgICApOiBOLkZsb3dEZWNsYXJlSW50ZXJmYWNlIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZSwgLyogaXNDbGFzcyAqLyBmYWxzZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUludGVyZmFjZVwiKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlcmZhY2VzXG5cbiAgICBmbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmU+LCBpc0NsYXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyAhaXNDbGFzcyxcbiAgICAgICAgLyogZGVjbGFyYXRpb24gKi8gdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUoXG4gICAgICAgIG5vZGUuaWQubmFtZSxcbiAgICAgICAgaXNDbGFzcyA/IEJJTkRfRlVOQ1RJT04gOiBCSU5EX0xFWElDQUwsXG4gICAgICAgIG5vZGUuaWQubG9jLnN0YXJ0LFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuZXh0ZW5kcyA9IFtdO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQuX2V4dGVuZHMpKSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBub2RlLmV4dGVuZHMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKSk7XG4gICAgICAgIH0gd2hpbGUgKCFpc0NsYXNzICYmIHRoaXMuZWF0KHR0LmNvbW1hKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NsYXNzKSB7XG4gICAgICAgIG5vZGUuaW1wbGVtZW50cyA9IFtdO1xuICAgICAgICBub2RlLm1peGlucyA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX21peGlucykpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBub2RlLm1peGlucy5wdXNoKHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlRXh0ZW5kcygpKTtcbiAgICAgICAgICB9IHdoaWxlICh0aGlzLmVhdCh0dC5jb21tYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5faW1wbGVtZW50cykpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBub2RlLmltcGxlbWVudHMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKSk7XG4gICAgICAgICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICBhbGxvd1N0YXRpYzogaXNDbGFzcyxcbiAgICAgICAgYWxsb3dFeGFjdDogZmFsc2UsXG4gICAgICAgIGFsbG93U3ByZWFkOiBmYWxzZSxcbiAgICAgICAgYWxsb3dQcm90bzogaXNDbGFzcyxcbiAgICAgICAgYWxsb3dJbmV4YWN0OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKTogTi5GbG93SW50ZXJmYWNlRXh0ZW5kcyB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgbm9kZS5pZCA9IHRoaXMuZmxvd1BhcnNlUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcmZhY2VFeHRlbmRzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyZmFjZShub2RlOiBVbmRvbmU8Ti5GbG93SW50ZXJmYWNlPik6IE4uRmxvd0ludGVyZmFjZSB7XG4gICAgICB0aGlzLmZsb3dQYXJzZUludGVyZmFjZWlzaChub2RlLCAvKiBpc0NsYXNzICovIGZhbHNlKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjaGVja05vdFVuZGVyc2NvcmUod29yZDogc3RyaW5nKSB7XG4gICAgICBpZiAod29yZCA9PT0gXCJfXCIpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRSZXNlcnZlZFVuZGVyc2NvcmUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tSZXNlcnZlZFR5cGUod29yZDogc3RyaW5nLCBzdGFydExvYzogUG9zaXRpb24sIGRlY2xhcmF0aW9uPzogYm9vbGVhbikge1xuICAgICAgaWYgKCFyZXNlcnZlZFR5cGVzLmhhcyh3b3JkKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBkZWNsYXJhdGlvblxuICAgICAgICAgID8gRmxvd0Vycm9ycy5Bc3NpZ25SZXNlcnZlZFR5cGVcbiAgICAgICAgICA6IEZsb3dFcnJvcnMuVW5leHBlY3RlZFJlc2VydmVkVHlwZSxcbiAgICAgICAge1xuICAgICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAgICByZXNlcnZlZFR5cGU6IHdvcmQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKFxuICAgICAgbGliZXJhbD86IGJvb2xlYW4sXG4gICAgICBkZWNsYXJhdGlvbj86IGJvb2xlYW4sXG4gICAgKTogTi5JZGVudGlmaWVyIHtcbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFR5cGUoXG4gICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIGRlY2xhcmF0aW9uLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcihsaWJlcmFsKTtcbiAgICB9XG5cbiAgICAvLyBUeXBlIGFsaWFzZXNcblxuICAgIGZsb3dQYXJzZVR5cGVBbGlhcyhub2RlOiBVbmRvbmU8Ti5GbG93VHlwZUFsaWFzPik6IE4uRmxvd1R5cGVBbGlhcyB7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyBmYWxzZSxcbiAgICAgICAgLyogZGVjbGFyYXRpb24gKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjb3BlLmRlY2xhcmVOYW1lKG5vZGUuaWQubmFtZSwgQklORF9MRVhJQ0FMLCBub2RlLmlkLmxvYy5zdGFydCk7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJpZ2h0ID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIodHQuZXEpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVBbGlhc1wiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VPcGFxdWVUeXBlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd09wYXF1ZVR5cGU+LFxuICAgICAgZGVjbGFyZTogYm9vbGVhbixcbiAgICApOiBOLkZsb3dPcGFxdWVUeXBlIHtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fdHlwZSk7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyB0cnVlLFxuICAgICAgICAvKiBkZWNsYXJhdGlvbiAqLyB0cnVlLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUobm9kZS5pZC5uYW1lLCBCSU5EX0xFWElDQUwsIG5vZGUuaWQubG9jLnN0YXJ0KTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBzdXBlcnR5cGVcbiAgICAgIG5vZGUuc3VwZXJ0eXBlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICBub2RlLnN1cGVydHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHR0LmNvbG9uKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5pbXBsdHlwZSA9IG51bGw7XG4gICAgICBpZiAoIWRlY2xhcmUpIHtcbiAgICAgICAgbm9kZS5pbXBsdHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHR0LmVxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJPcGFxdWVUeXBlXCIpO1xuICAgIH1cblxuICAgIC8vIFR5cGUgYW5ub3RhdGlvbnNcblxuICAgIGZsb3dQYXJzZVR5cGVQYXJhbWV0ZXIocmVxdWlyZURlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IE4uVHlwZVBhcmFtZXRlciB7XG4gICAgICBjb25zdCBub2RlU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlUGFyYW1ldGVyPigpO1xuXG4gICAgICBjb25zdCB2YXJpYW5jZSA9IHRoaXMuZmxvd1BhcnNlVmFyaWFuY2UoKTtcblxuICAgICAgY29uc3QgaWRlbnQgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0YWJsZUlkZW50aWZpZXIoKTtcbiAgICAgIG5vZGUubmFtZSA9IGlkZW50Lm5hbWU7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgIG5vZGUudmFyaWFuY2UgPSB2YXJpYW5jZTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlc1xuICAgICAgbm9kZS5ib3VuZCA9IGlkZW50LnR5cGVBbm5vdGF0aW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5lcSkpIHtcbiAgICAgICAgdGhpcy5lYXQodHQuZXEpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgbm9kZS5kZWZhdWx0ID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVxdWlyZURlZmF1bHQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuTWlzc2luZ1R5cGVQYXJhbURlZmF1bHQsIHsgYXQ6IG5vZGVTdGFydExvYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVHlwZVBhcmFtZXRlclwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTogTi5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+KCk7XG4gICAgICBub2RlLnBhcmFtcyA9IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG5cbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiB0aGlzIGNvbmRpdGlvbiBpcyBhbHJlYWR5IGNoZWNrZWQgYXQgYWxsIGNhbGwgc2l0ZXNcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVmYXVsdFJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlciA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlcihkZWZhdWx0UmVxdWlyZWQpO1xuXG4gICAgICAgIG5vZGUucGFyYW1zLnB1c2godHlwZVBhcmFtZXRlcik7XG5cbiAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXIuZGVmYXVsdCkge1xuICAgICAgICAgIGRlZmF1bHRSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQuZ3QpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICghdGhpcy5tYXRjaCh0dC5ndCkpO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpOiBOLlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uPigpO1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICBub2RlLnBhcmFtcyA9IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0Lmx0KTtcbiAgICAgIGNvbnN0IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZSA9IHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5ndCkpIHtcbiAgICAgICAgbm9kZS5wYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZVR5cGUoKSk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5ndCkpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gb2xkTm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uQ2FsbE9yTmV3KCk6IE4uVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KCk7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIG5vZGUucGFyYW1zID0gW107XG5cbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcblxuICAgICAgdGhpcy5leHBlY3QodHQubHQpO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0Lmd0KSkge1xuICAgICAgICBub2RlLnBhcmFtcy5wdXNoKHRoaXMuZmxvd1BhcnNlVHlwZU9ySW1wbGljaXRJbnN0YW50aWF0aW9uKCkpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQuZ3QpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCh0dC5ndCk7XG5cbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gb2xkSW5UeXBlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlSW50ZXJmYWNlVHlwZSgpOiBOLkZsb3dJbnRlcmZhY2VUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkZsb3dJbnRlcmZhY2VUeXBlPigpO1xuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpO1xuXG4gICAgICBub2RlLmV4dGVuZHMgPSBbXTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5fZXh0ZW5kcykpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG5vZGUuZXh0ZW5kcy5wdXNoKHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlRXh0ZW5kcygpKTtcbiAgICAgICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5ib2R5ID0gdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlKHtcbiAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICBhbGxvd0V4YWN0OiBmYWxzZSxcbiAgICAgICAgYWxsb3dTcHJlYWQ6IGZhbHNlLFxuICAgICAgICBhbGxvd1Byb3RvOiBmYWxzZSxcbiAgICAgICAgYWxsb3dJbmV4YWN0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Lm51bSkgfHwgdGhpcy5tYXRjaCh0dC5zdHJpbmcpXG4gICAgICAgID8gc3VwZXIucGFyc2VFeHByQXRvbSgpXG4gICAgICAgIDogdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZUluZGV4ZXIoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZUluZGV4ZXI+LFxuICAgICAgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgICB2YXJpYW5jZT86IE4uRmxvd1ZhcmlhbmNlIHwgbnVsbCxcbiAgICApOiBOLkZsb3dPYmplY3RUeXBlSW5kZXhlciB7XG4gICAgICBub2RlLnN0YXRpYyA9IGlzU3RhdGljO1xuXG4gICAgICAvLyBOb3RlOiBicmFja2V0TCBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkXG4gICAgICBpZiAodGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5jb2xvbikge1xuICAgICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuICAgICAgICBub2RlLmtleSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmlkID0gbnVsbDtcbiAgICAgICAgbm9kZS5rZXkgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgbm9kZS52YXJpYW5jZSA9IHZhcmlhbmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiT2JqZWN0VHlwZUluZGV4ZXJcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZUludGVybmFsU2xvdChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dPYmplY3RUeXBlSW50ZXJuYWxTbG90PixcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICk6IE4uRmxvd09iamVjdFR5cGVJbnRlcm5hbFNsb3Qge1xuICAgICAgbm9kZS5zdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgIC8vIE5vdGU6IGJvdGggYnJhY2tldEwgaGF2ZSBhbHJlYWR5IGJlZW4gY29uc3VtZWRcbiAgICAgIG5vZGUuaWQgPSB0aGlzLmZsb3dQYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIG5vZGUubWV0aG9kID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IGZhbHNlO1xuICAgICAgICBub2RlLnZhbHVlID0gdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlTWV0aG9kaXNoKFxuICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXQobm9kZS5sb2Muc3RhcnQpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5tZXRob2QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uPixcbiAgICApOiBOLkZsb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIG5vZGUucGFyYW1zID0gW107XG4gICAgICBub2RlLnJlc3QgPSBudWxsO1xuICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICBub2RlLnRoaXMgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgbm9kZS50aGlzID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbSgvKiBmaXJzdCAqLyB0cnVlKTtcbiAgICAgICAgLy8gbWF0Y2ggRmxvdyBwYXJzZXIgYmVoYXZpb3JcbiAgICAgICAgbm9kZS50aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikgJiYgIXRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIG5vZGUucGFyYW1zLnB1c2godGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbShmYWxzZSkpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lYXQodHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIG5vZGUucmVzdCA9IHRoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW0oZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZU9iamVjdFR5cGVDYWxsUHJvcGVydHkoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4sXG4gICAgICBpc1N0YXRpYzogYm9vbGVhbixcbiAgICApOiBOLkZsb3dPYmplY3RUeXBlQ2FsbFByb3BlcnR5IHtcbiAgICAgIGNvbnN0IHZhbHVlTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBub2RlLnN0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgbm9kZS52YWx1ZSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaCh2YWx1ZU5vZGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZSh7XG4gICAgICBhbGxvd1N0YXRpYyxcbiAgICAgIGFsbG93RXhhY3QsXG4gICAgICBhbGxvd1NwcmVhZCxcbiAgICAgIGFsbG93UHJvdG8sXG4gICAgICBhbGxvd0luZXhhY3QsXG4gICAgfToge1xuICAgICAgYWxsb3dTdGF0aWM6IGJvb2xlYW47XG4gICAgICBhbGxvd0V4YWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTcHJlYWQ6IGJvb2xlYW47XG4gICAgICBhbGxvd1Byb3RvOiBib29sZWFuO1xuICAgICAgYWxsb3dJbmV4YWN0OiBib29sZWFuO1xuICAgIH0pOiBOLkZsb3dPYmplY3RUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcblxuICAgICAgY29uc3Qgbm9kZVN0YXJ0ID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgbm9kZVN0YXJ0LmNhbGxQcm9wZXJ0aWVzID0gW107XG4gICAgICBub2RlU3RhcnQucHJvcGVydGllcyA9IFtdO1xuICAgICAgbm9kZVN0YXJ0LmluZGV4ZXJzID0gW107XG4gICAgICBub2RlU3RhcnQuaW50ZXJuYWxTbG90cyA9IFtdO1xuXG4gICAgICBsZXQgZW5kRGVsaW07XG4gICAgICBsZXQgZXhhY3Q7XG4gICAgICBsZXQgaW5leGFjdCA9IGZhbHNlO1xuICAgICAgaWYgKGFsbG93RXhhY3QgJiYgdGhpcy5tYXRjaCh0dC5icmFjZUJhckwpKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlQmFyTCk7XG4gICAgICAgIGVuZERlbGltID0gdHQuYnJhY2VCYXJSO1xuICAgICAgICBleGFjdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgICAgICBlbmREZWxpbSA9IHR0LmJyYWNlUjtcbiAgICAgICAgZXhhY3QgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0LmV4YWN0ID0gZXhhY3Q7XG5cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaChlbmREZWxpbSkpIHtcbiAgICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XG4gICAgICAgIGxldCBwcm90b1N0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgaW5leGFjdFN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgICBpZiAoYWxsb3dQcm90byAmJiB0aGlzLmlzQ29udGV4dHVhbCh0dC5fcHJvdG8pKSB7XG4gICAgICAgICAgY29uc3QgbG9va2FoZWFkID0gdGhpcy5sb29rYWhlYWQoKTtcblxuICAgICAgICAgIGlmIChsb29rYWhlYWQudHlwZSAhPT0gdHQuY29sb24gJiYgbG9va2FoZWFkLnR5cGUgIT09IHR0LnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIHByb3RvU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgYWxsb3dTdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsb3dTdGF0aWMgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX3N0YXRpYykpIHtcbiAgICAgICAgICBjb25zdCBsb29rYWhlYWQgPSB0aGlzLmxvb2thaGVhZCgpO1xuXG4gICAgICAgICAgLy8gc3RhdGljIGlzIGEgdmFsaWQgaWRlbnRpZmllciBuYW1lXG4gICAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlICE9PSB0dC5jb2xvbiAmJiBsb29rYWhlYWQudHlwZSAhPT0gdHQucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgaXNTdGF0aWMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhcmlhbmNlID0gdGhpcy5mbG93UGFyc2VWYXJpYW5jZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQocHJvdG9TdGFydExvYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQodmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVTdGFydC5pbnRlcm5hbFNsb3RzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZUludGVybmFsU2xvdChub2RlLCBpc1N0YXRpYyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlU3RhcnQuaW5kZXhlcnMucHVzaChcbiAgICAgICAgICAgICAgdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlSW5kZXhlcihub2RlLCBpc1N0YXRpYywgdmFyaWFuY2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5wYXJlbkwpIHx8IHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgICAgaWYgKHByb3RvU3RhcnRMb2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHByb3RvU3RhcnRMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZCh2YXJpYW5jZS5sb2Muc3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlU3RhcnQuY2FsbFByb3BlcnRpZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eShub2RlLCBpc1N0YXRpYyksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQga2luZCA9IFwiaW5pdFwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9nZXQpIHx8IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBsb29rYWhlYWQgPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAgICAgaWYgKHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKGxvb2thaGVhZC50eXBlKSkge1xuICAgICAgICAgICAgICBraW5kID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvcE9ySW5leGFjdCA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZVByb3BlcnR5KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGlzU3RhdGljLFxuICAgICAgICAgICAgcHJvdG9TdGFydExvYyxcbiAgICAgICAgICAgIHZhcmlhbmNlLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGFsbG93U3ByZWFkLFxuICAgICAgICAgICAgYWxsb3dJbmV4YWN0ID8/ICFleGFjdCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByb3BPckluZXhhY3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGluZXhhY3QgPSB0cnVlO1xuICAgICAgICAgICAgaW5leGFjdFN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVTdGFydC5wcm9wZXJ0aWVzLnB1c2gocHJvcE9ySW5leGFjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93T2JqZWN0VHlwZVNlbWljb2xvbigpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbmV4YWN0U3RhcnRMb2MgJiZcbiAgICAgICAgICAhdGhpcy5tYXRjaCh0dC5icmFjZVIpICYmXG4gICAgICAgICAgIXRoaXMubWF0Y2godHQuYnJhY2VCYXJSKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW5leHBlY3RlZEV4cGxpY2l0SW5leGFjdEluT2JqZWN0LCB7XG4gICAgICAgICAgICBhdDogaW5leGFjdFN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KGVuZERlbGltKTtcblxuICAgICAgLyogVGhlIGluZXhhY3QgZmxhZyBzaG91bGQgb25seSBiZSBhZGRlZCBvbiBPYmplY3RUeXBlQW5ub3RhdGlvbnMgdGhhdFxuICAgICAgICogYXJlIG5vdCB0aGUgYm9keSBvZiBhbiBpbnRlcmZhY2UsIGRlY2xhcmUgaW50ZXJmYWNlLCBvciBkZWNsYXJlIGNsYXNzLlxuICAgICAgICogU2luY2Ugc3ByZWFkcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCB0eXBlcywgY2hlY2tpbmcgdGhhdCBpc1xuICAgICAgICogc3VmZmljaWVudCBoZXJlLlxuICAgICAgICovXG4gICAgICBpZiAoYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgbm9kZVN0YXJ0LmluZXhhY3QgPSBpbmV4YWN0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXQgPSB0aGlzLmZpbmlzaE5vZGUobm9kZVN0YXJ0LCBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VPYmplY3RUeXBlUHJvcGVydHkoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZVByb3BlcnR5IHwgTi5GbG93T2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5PixcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICAgcHJvdG9TdGFydExvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgICAgdmFyaWFuY2U6IE4uRmxvd1ZhcmlhbmNlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGtpbmQ6IHN0cmluZyxcbiAgICAgIGFsbG93U3ByZWFkOiBib29sZWFuLFxuICAgICAgYWxsb3dJbmV4YWN0OiBib29sZWFuLFxuICAgICk6IE4uRmxvd09iamVjdFR5cGVQcm9wZXJ0eSB8IE4uRmxvd09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eSB8IG51bGwge1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmVsbGlwc2lzKSkge1xuICAgICAgICBjb25zdCBpc0luZXhhY3RUb2tlbiA9XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5jb21tYSkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnNlbWkpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZVIpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZUJhclIpO1xuXG4gICAgICAgIGlmIChpc0luZXhhY3RUb2tlbikge1xuICAgICAgICAgIGlmICghYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5JbmV4YWN0SW5zaWRlTm9uT2JqZWN0LCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93SW5leGFjdCkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkluZXhhY3RJbnNpZGVFeGFjdCwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuSW5leGFjdFZhcmlhbmNlLCB7IGF0OiB2YXJpYW5jZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW5leHBlY3RlZFNwcmVhZFR5cGUsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHByb3RvU3RhcnRMb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5TcHJlYWRWYXJpYW5jZSwgeyBhdDogdmFyaWFuY2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmtleSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcbiAgICAgICAgbm9kZS5zdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgICAgbm9kZS5wcm90byA9IHByb3RvU3RhcnRMb2MgIT0gbnVsbDtcbiAgICAgICAgbm9kZS5raW5kID0ga2luZDtcblxuICAgICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpIHx8IHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2QgcHJvcGVydHlcbiAgICAgICAgICBub2RlLm1ldGhvZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQocHJvdG9TdGFydExvYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHZhcmlhbmNlLmxvYy5zdGFydCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9kZS52YWx1ZSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaChcbiAgICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXQobm9kZS5sb2Muc3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZ2V0XCIgfHwga2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5mbG93Q2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKiBEZWNsYXJlZCBjbGFzc2VzL2ludGVyZmFjZXMgZG8gbm90IGFsbG93IHNwcmVhZCAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFhbGxvd1NwcmVhZCAmJlxuICAgICAgICAgICAgbm9kZS5rZXkubmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgICBub2RlLnZhbHVlLnRoaXNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1CYW5uZWRJbkNvbnN0cnVjdG9yLCB7XG4gICAgICAgICAgICAgIGF0OiBub2RlLnZhbHVlLnRoaXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGtpbmQgIT09IFwiaW5pdFwiKSB0aGlzLnVuZXhwZWN0ZWQoKTtcblxuICAgICAgICAgIG5vZGUubWV0aG9kID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgICAgIG5vZGUudmFyaWFuY2UgPSB2YXJpYW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgc2ltaWxhciB0byBjaGVja0dldHRlclNldHRlclBhcmFtcywgYnV0IGFzXG4gICAgLy8gQGJhYmVsL3BhcnNlciB1c2VzIG5vbiBlc3RyZWUgcHJvcGVydGllcyB3ZSBjYW5ub3QgcmV1c2UgaXQgaGVyZVxuICAgIGZsb3dDaGVja0dldHRlclNldHRlclBhcmFtcyhcbiAgICAgIHByb3BlcnR5OiBVbmRvbmU8XG4gICAgICAgIE4uRmxvd09iamVjdFR5cGVQcm9wZXJ0eSB8IE4uRmxvd09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVxuICAgICAgPixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSBwcm9wZXJ0eS5raW5kID09PSBcImdldFwiID8gMCA6IDE7XG4gICAgICBjb25zdCBsZW5ndGggPVxuICAgICAgICBwcm9wZXJ0eS52YWx1ZS5wYXJhbXMubGVuZ3RoICsgKHByb3BlcnR5LnZhbHVlLnJlc3QgPyAxIDogMCk7XG5cbiAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS50aGlzKSB7XG4gICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgcHJvcGVydHkua2luZCA9PT0gXCJnZXRcIlxuICAgICAgICAgICAgPyBGbG93RXJyb3JzLkdldHRlck1heU5vdEhhdmVUaGlzUGFyYW1cbiAgICAgICAgICAgIDogRmxvd0Vycm9ycy5TZXR0ZXJNYXlOb3RIYXZlVGhpc1BhcmFtLFxuICAgICAgICAgIHsgYXQ6IHByb3BlcnR5LnZhbHVlLnRoaXMgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbmd0aCAhPT0gcGFyYW1Db3VudCkge1xuICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgIHByb3BlcnR5LmtpbmQgPT09IFwiZ2V0XCJcbiAgICAgICAgICAgID8gRXJyb3JzLkJhZEdldHRlckFyaXR5XG4gICAgICAgICAgICA6IEVycm9ycy5CYWRTZXR0ZXJBcml0eSxcbiAgICAgICAgICB7IGF0OiBwcm9wZXJ0eSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkua2luZCA9PT0gXCJzZXRcIiAmJiBwcm9wZXJ0eS52YWx1ZS5yZXN0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlclJlc3RQYXJhbWV0ZXIsIHsgYXQ6IHByb3BlcnR5IH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dPYmplY3RUeXBlU2VtaWNvbG9uKCk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5lYXQodHQuc2VtaSkgJiZcbiAgICAgICAgIXRoaXMuZWF0KHR0LmNvbW1hKSAmJlxuICAgICAgICAhdGhpcy5tYXRjaCh0dC5icmFjZVIpICYmXG4gICAgICAgICF0aGlzLm1hdGNoKHR0LmJyYWNlQmFyUilcbiAgICAgICkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93UGFyc2VRdWFsaWZpZWRUeXBlSWRlbnRpZmllcihcbiAgICAgIHN0YXJ0TG9jPzogUG9zaXRpb24sXG4gICAgICBpZD86IE4uSWRlbnRpZmllcixcbiAgICApOiBOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllciB7XG4gICAgICBzdGFydExvYyA/Pz0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCBub2RlOiBOLklkZW50aWZpZXIgfCBOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllciA9XG4gICAgICAgIGlkIHx8IHRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIodHJ1ZSk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5kb3QpKSB7XG4gICAgICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFydE5vZGVBdDxOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllcj4oc3RhcnRMb2MpO1xuICAgICAgICBub2RlMi5xdWFsaWZpY2F0aW9uID0gbm9kZTtcbiAgICAgICAgbm9kZTIuaWQgPSB0aGlzLmZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKHRydWUpO1xuICAgICAgICBub2RlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUyLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VHZW5lcmljVHlwZShcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIGlkOiBOLklkZW50aWZpZXIsXG4gICAgKTogTi5GbG93R2VuZXJpY1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcblxuICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VRdWFsaWZpZWRUeXBlSWRlbnRpZmllcihzdGFydExvYywgaWQpO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlb2ZUeXBlKCk6IE4uRmxvd1R5cGVvZlR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQuX3R5cGVvZik7XG4gICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5mbG93UGFyc2VQcmltYXJ5VHlwZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR1cGxlVHlwZSgpOiBOLkZsb3dUdXBsZVR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgbm9kZS50eXBlcyA9IFtdO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldEwpO1xuICAgICAgLy8gV2UgYWxsb3cgdHJhaWxpbmcgY29tbWFzXG4gICAgICB3aGlsZSAodGhpcy5zdGF0ZS5wb3MgPCB0aGlzLmxlbmd0aCAmJiAhdGhpcy5tYXRjaCh0dC5icmFja2V0UikpIHtcbiAgICAgICAgbm9kZS50eXBlcy5wdXNoKHRoaXMuZmxvd1BhcnNlVHlwZSgpKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2tldFIpKSBicmVhaztcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldFIpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR1cGxlVHlwZUFubm90YXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW0oZmlyc3Q6IGJvb2xlYW4pOiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbSB7XG4gICAgICBsZXQgbmFtZSA9IG51bGw7XG4gICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgIGxldCB0eXBlQW5ub3RhdGlvbiA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93RnVuY3Rpb25UeXBlUGFyYW0+KCk7XG4gICAgICBjb25zdCBsaCA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgICBjb25zdCBpc1RoaXMgPSB0aGlzLnN0YXRlLnR5cGUgPT09IHR0Ll90aGlzO1xuXG4gICAgICBpZiAobGgudHlwZSA9PT0gdHQuY29sb24gfHwgbGgudHlwZSA9PT0gdHQucXVlc3Rpb24pIHtcbiAgICAgICAgaWYgKGlzVGhpcyAmJiAhZmlyc3QpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVGhpc1BhcmFtTXVzdEJlRmlyc3QsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKGlzVGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzVGhpcykge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWwsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB9XG4gICAgICBub2RlLm5hbWUgPSBuYW1lO1xuICAgICAgbm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9uO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpO1xuICAgIH1cblxuICAgIHJlaW50ZXJwcmV0VHlwZUFzRnVuY3Rpb25UeXBlUGFyYW0oXG4gICAgICB0eXBlOiBOLkZsb3dUeXBlLFxuICAgICk6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHR5cGUubG9jLnN0YXJ0KTtcbiAgICAgIG5vZGUubmFtZSA9IG51bGw7XG4gICAgICBub2RlLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdHlwZTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVQYXJhbVwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMocGFyYW1zOiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbVtdID0gW10pOiB7XG4gICAgICBwYXJhbXM6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtW107XG4gICAgICByZXN0OiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbSB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICBfdGhpczogTi5GbG93RnVuY3Rpb25UeXBlUGFyYW0gfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIH0ge1xuICAgICAgbGV0IHJlc3Q6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgX3RoaXM6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgX3RoaXMgPSB0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKC8qIGZpcnN0ICovIHRydWUpO1xuICAgICAgICAvLyBtYXRjaCBGbG93IHBhcnNlciBiZWhhdmlvclxuICAgICAgICBfdGhpcy5uYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5wYXJlblIpICYmICF0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgICBwYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKGZhbHNlKSk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5wYXJlblIpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lYXQodHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIHJlc3QgPSB0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhcmFtcywgcmVzdCwgX3RoaXMgfTtcbiAgICB9XG5cbiAgICBmbG93SWRlbnRUb1R5cGVBbm5vdGF0aW9uKFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd1R5cGVBbm5vdGF0aW9uPixcbiAgICAgIGlkOiBOLklkZW50aWZpZXIsXG4gICAgKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgc3dpdGNoIChpZC5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQW55VHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSBcImJvb2xcIjpcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJtaXhlZFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJlbXB0eVwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVtYmVyVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKTtcblxuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5jaGVja05vdFVuZGVyc2NvcmUoaWQubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlR2VuZXJpY1R5cGUoc3RhcnRMb2MsIGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcGFyc2luZyBvZiB0eXBlcyByb3VnaGx5IHBhcmFsbGVscyB0aGUgcGFyc2luZyBvZiBleHByZXNzaW9ucywgYW5kXG4gICAgLy8gcHJpbWFyeSB0eXBlcyBhcmUga2luZCBvZiBsaWtlIHByaW1hcnkgZXhwcmVzc2lvbnMuLi50aGV5J3JlIHRoZVxuICAgIC8vIHByaW1pdGl2ZXMgd2l0aCB3aGljaCBvdGhlciB0eXBlcyBhcmUgY29uc3RydWN0ZWQuXG4gICAgZmxvd1BhcnNlUHJpbWFyeVR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBsZXQgdG1wO1xuICAgICAgbGV0IHR5cGU7XG4gICAgICBsZXQgaXNHcm91cGVkVHlwZSA9IGZhbHNlO1xuICAgICAgY29uc3Qgb2xkTm9Bbm9uRnVuY3Rpb25UeXBlID0gdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dFeGFjdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1NwcmVhZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93UHJvdG86IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dJbmV4YWN0OiB0cnVlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgdHQuYnJhY2VCYXJMOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dFeGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93U3ByZWFkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dQcm90bzogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0luZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgdHQuYnJhY2tldEw6XG4gICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgICAgICB0eXBlID0gdGhpcy5mbG93UGFyc2VUdXBsZVR5cGUoKTtcbiAgICAgICAgICB0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSA9IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZTtcbiAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICBjYXNlIHR0Lmx0OlxuICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKTtcbiAgICAgICAgICBub2RlLnBhcmFtcyA9IHRtcC5wYXJhbXM7XG4gICAgICAgICAgbm9kZS5yZXN0ID0gdG1wLnJlc3Q7XG4gICAgICAgICAgbm9kZS50aGlzID0gdG1wLl90aGlzO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5hcnJvdyk7XG5cbiAgICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQucGFyZW5MOlxuICAgICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYWN0dWFsbHkgYSBncm91cGVkIHR5cGVcbiAgICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSAmJiAhdGhpcy5tYXRjaCh0dC5lbGxpcHNpcykpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpIHx8IHRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb29rYWhlYWQoKS50eXBlO1xuICAgICAgICAgICAgICBpc0dyb3VwZWRUeXBlID0gdG9rZW4gIT09IHR0LnF1ZXN0aW9uICYmIHRva2VuICE9PSB0dC5jb2xvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlzR3JvdXBlZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0dyb3VwZWRUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgdHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBvbGROb0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgICAgICAgIC8vIEEgYCxgIG9yIGEgYCkgPT5gIG1lYW5zIHRoaXMgaXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHR5cGVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgfHxcbiAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoKHR0LmNvbW1hKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLm1hdGNoKHR0LnBhcmVuUikgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5hcnJvdylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG4gICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRWF0IGEgY29tbWEgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgICAgICAgIHRoaXMuZWF0KHR0LmNvbW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoW1xuICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0VHlwZUFzRnVuY3Rpb25UeXBlUGFyYW0odHlwZSksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2RlLnBhcmFtcyA9IHRtcC5wYXJhbXM7XG4gICAgICAgICAgbm9kZS5yZXN0ID0gdG1wLnJlc3Q7XG4gICAgICAgICAgbm9kZS50aGlzID0gdG1wLl90aGlzO1xuXG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmFycm93KTtcblxuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuXG4gICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKTtcblxuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgICAgIFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICBub2RlLnZhbHVlID0gdGhpcy5tYXRjaCh0dC5fdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4sXG4gICAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgdHQucGx1c01pbjpcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQubnVtKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWxBdE5vZGU8Ti5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgICAgIC10aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICAgIFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYmlnaW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWxBdE5vZGU8Ti5CaWdJbnRMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgICAgIC10aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICAgIFwiQmlnSW50TGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRTdWJ0cmFjdGlvbk9wZXJhbmQsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIHR0Lm51bTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgdHQuYmlnaW50OlxuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICBcIkJpZ0ludExpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgY2FzZSB0dC5fdm9pZDpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQuX251bGw6XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSB0dC5fdGhpczpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQuc3RhcjpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSB0dC5fdHlwZW9mOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGVvZlR5cGUoKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICh0b2tlbklzS2V5d29yZCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRva2VuTGFiZWxOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJZGVudGlmaWVyKG5vZGUgYXMgVW5kb25lPE4uSWRlbnRpZmllcj4sIGxhYmVsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VJbnRlcmZhY2VUeXBlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dJZGVudFRvVHlwZUFubm90YXRpb24oXG4gICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB0aGlzLnBhcnNlSWRlbnRpZmllcigpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVBvc3RmaXhUeXBlKCk6IE4uRmxvd1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCB0eXBlID0gdGhpcy5mbG93UGFyc2VQcmltYXJ5VHlwZSgpO1xuICAgICAgbGV0IHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgKHRoaXMubWF0Y2godHQuYnJhY2tldEwpIHx8IHRoaXMubWF0Y2godHQucXVlc3Rpb25Eb3QpKSAmJlxuICAgICAgICAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSB0aGlzLmVhdCh0dC5xdWVzdGlvbkRvdCk7XG4gICAgICAgIHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MgPSBzZWVuT3B0aW9uYWxJbmRleGVkQWNjZXNzIHx8IG9wdGlvbmFsO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICAgIGlmICghb3B0aW9uYWwgJiYgdGhpcy5tYXRjaCh0dC5icmFja2V0UikpIHtcbiAgICAgICAgICBub2RlLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBdYFxuICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUub2JqZWN0VHlwZSA9IHR5cGU7XG4gICAgICAgICAgbm9kZS5pbmRleFR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICAgICAgaWYgKHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MpIHtcbiAgICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGU8Ti5GbG93T3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZT4oXG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlPE4uRmxvd0luZGV4ZWRBY2Nlc3NUeXBlPihcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlUHJlZml4VHlwZSgpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVBvc3RmaXhUeXBlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlQW5vbkZ1bmN0aW9uV2l0aG91dFBhcmVucygpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpO1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSAmJiB0aGlzLmVhdCh0dC5hcnJvdykpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYSB0eXBlIGVycm9yLiBQYXNzaW5nIGluIGEgU291cmNlTG9jYXRpb24sIGFuZCBpdCBleHBlY3RzIGEgUG9zaXRpb24uXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHBhcmFtLmxvYy5zdGFydCk7XG4gICAgICAgIG5vZGUucGFyYW1zID0gW3RoaXMucmVpbnRlcnByZXRUeXBlQXNGdW5jdGlvblR5cGVQYXJhbShwYXJhbSldO1xuICAgICAgICBub2RlLnJlc3QgPSBudWxsO1xuICAgICAgICBub2RlLnRoaXMgPSBudWxsO1xuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmFtO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyc2VjdGlvblR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLmVhdCh0dC5iaXR3aXNlQU5EKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZsb3dQYXJzZUFub25GdW5jdGlvbldpdGhvdXRQYXJlbnMoKTtcbiAgICAgIG5vZGUudHlwZXMgPSBbdHlwZV07XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHQuYml0d2lzZUFORCkpIHtcbiAgICAgICAgbm9kZS50eXBlcy5wdXNoKHRoaXMuZmxvd1BhcnNlQW5vbkZ1bmN0aW9uV2l0aG91dFBhcmVucygpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnR5cGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHR5cGVcbiAgICAgICAgOiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VVbmlvblR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLmVhdCh0dC5iaXR3aXNlT1IpO1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZmxvd1BhcnNlSW50ZXJzZWN0aW9uVHlwZSgpO1xuICAgICAgbm9kZS50eXBlcyA9IFt0eXBlXTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5iaXR3aXNlT1IpKSB7XG4gICAgICAgIG5vZGUudHlwZXMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyc2VjdGlvblR5cGUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS50eXBlcy5sZW5ndGggPT09IDFcbiAgICAgICAgPyB0eXBlXG4gICAgICAgIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVW5pb25UeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlKCk6IE4uRmxvd1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG9sZEluVHlwZSA9IHRoaXMuc3RhdGUuaW5UeXBlO1xuICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSB0cnVlO1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZmxvd1BhcnNlVW5pb25UeXBlKCk7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVPckltcGxpY2l0SW5zdGFudGlhdGlvbigpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS50eXBlID09PSB0dC5uYW1lICYmIHRoaXMuc3RhdGUudmFsdWUgPT09IFwiX1wiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUdlbmVyaWNUeXBlKHN0YXJ0TG9jLCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93VHlwZUFubm90YXRpb24+KCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlQW5ub3RhdGFibGVJZGVudGlmaWVyKFxuICAgICAgYWxsb3dQcmltaXRpdmVPdmVycmlkZT86IGJvb2xlYW4sXG4gICAgKTogTi5JZGVudGlmaWVyIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gYWxsb3dQcmltaXRpdmVPdmVycmlkZVxuICAgICAgICA/IHRoaXMucGFyc2VJZGVudGlmaWVyKClcbiAgICAgICAgOiB0aGlzLmZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgaWRlbnQudHlwZUFubm90YXRpb24gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihpZGVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRlbnQ7XG4gICAgfVxuXG4gICAgdHlwZUNhc3RUb1BhcmFtZXRlcihub2RlOiBOLk5vZGUpOiBOLk5vZGUge1xuICAgICAgbm9kZS5leHByZXNzaW9uLnR5cGVBbm5vdGF0aW9uID0gbm9kZS50eXBlQW5ub3RhdGlvbjtcblxuICAgICAgdGhpcy5yZXNldEVuZExvY2F0aW9uKG5vZGUuZXhwcmVzc2lvbiwgbm9kZS50eXBlQW5ub3RhdGlvbi5sb2MuZW5kKTtcblxuICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VWYXJpYW5jZSgpOiBOLkZsb3dWYXJpYW5jZSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgbGV0IHZhcmlhbmNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBsdXNNaW4pKSB7XG4gICAgICAgIHZhcmlhbmNlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93VmFyaWFuY2U+KCk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlID09PSBcIitcIikge1xuICAgICAgICAgIHZhcmlhbmNlLmtpbmQgPSBcInBsdXNcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYW5jZS5raW5kID0gXCJtaW51c1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHZhcmlhbmNlLCBcIlZhcmlhbmNlXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhcmlhbmNlO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBwYXJzZUZ1bmN0aW9uQm9keShcbiAgICAgIG5vZGU6IE4uRnVuY3Rpb24sXG4gICAgICBhbGxvd0V4cHJlc3Npb25Cb2R5PzogYm9vbGVhbiB8IG51bGwsXG4gICAgICBpc01ldGhvZDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKGFsbG93RXhwcmVzc2lvbkJvZHkpIHtcbiAgICAgICAgdGhpcy5mb3J3YXJkTm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdChub2RlLCAoKSA9PlxuICAgICAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIHRydWUsIGlzTWV0aG9kKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCBmYWxzZSwgaXNNZXRob2QpO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoPFxuICAgICAgVCBleHRlbmRzXG4gICAgICAgIHwgTi5GdW5jdGlvblxuICAgICAgICB8IE4uVFNEZWNsYXJlTWV0aG9kXG4gICAgICAgIHwgTi5UU0RlY2xhcmVGdW5jdGlvblxuICAgICAgICB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgID4obm9kZTogVW5kb25lPFQ+LCB0eXBlOiBUW1widHlwZVwiXSwgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgICBbXG4gICAgICAgICAgdHlwZU5vZGUudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwcmVkaWNhdGUgbWF5IG5vdCBleGlzdFxuICAgICAgICAgIG5vZGUucHJlZGljYXRlLFxuICAgICAgICBdID0gdGhpcy5mbG93UGFyc2VUeXBlQW5kUHJlZGljYXRlSW5pdGlhbGlzZXIoKTtcblxuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0eXBlTm9kZS50eXBlQW5ub3RhdGlvblxuICAgICAgICAgID8gdGhpcy5maW5pc2hOb2RlKHR5cGVOb2RlLCBcIlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2gobm9kZSwgdHlwZSwgaXNNZXRob2QpO1xuICAgIH1cblxuICAgIC8vIGludGVyZmFjZXMgYW5kIGVudW1zXG4gICAgcGFyc2VTdGF0ZW1lbnRMaWtlKGZsYWdzOiBQYXJzZVN0YXRlbWVudEZsYWcpOiBOLlN0YXRlbWVudCB7XG4gICAgICAvLyBzdHJpY3QgbW9kZSBoYW5kbGluZyBvZiBgaW50ZXJmYWNlYCBzaW5jZSBpdCdzIGEgcmVzZXJ2ZWQgd29yZFxuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RyaWN0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIGNvbnN0IGxvb2thaGVhZCA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgICAgIGlmICh0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcihsb29rYWhlYWQudHlwZSkpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93SW50ZXJmYWNlPigpO1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUludGVyZmFjZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZFBhcnNlRW51bXMoKSAmJiB0aGlzLmlzQ29udGV4dHVhbCh0dC5fZW51bSkpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VFbnVtRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG10ID0gc3VwZXIucGFyc2VTdGF0ZW1lbnRMaWtlKGZsYWdzKTtcbiAgICAgIC8vIFdlIHdpbGwgcGFyc2UgYSBmbG93IHByYWdtYSBpbiBhbnkgY29tbWVudCBiZWZvcmUgdGhlIGZpcnN0IHN0YXRlbWVudC5cbiAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1ZhbGlkRGlyZWN0aXZlKHN0bXQpKSB7XG4gICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RtdDtcbiAgICB9XG5cbiAgICAvLyBkZWNsYXJlcywgaW50ZXJmYWNlcyBhbmQgdHlwZSBhbGlhc2VzXG4gICAgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uU3RhdGVtZW50LFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uU3RhdGVtZW50IHtcbiAgICAgIGlmIChleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgIGlmIChleHByLm5hbWUgPT09IFwiZGVjbGFyZVwiKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYXRjaCh0dC5fY2xhc3MpIHx8XG4gICAgICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpIHx8XG4gICAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHxcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuX3ZhcikgfHxcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuX2V4cG9ydClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgICAgaWYgKGV4cHIubmFtZSA9PT0gXCJpbnRlcmZhY2VcIikge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUludGVyZmFjZShub2RlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV4cHIubmFtZSA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VUeXBlQWxpYXMobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChleHByLm5hbWUgPT09IFwib3BhcXVlXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VPcGFxdWVUeXBlKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBleHByLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICAvLyBleHBvcnQgdHlwZVxuICAgIHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuSXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWUodHlwZSkgfHxcbiAgICAgICAgKHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpICYmIHR5cGUgPT09IHR0Ll9lbnVtKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCk7XG4gICAgfVxuXG4gICAgaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbklzRmxvd0ludGVyZmFjZU9yVHlwZU9yT3BhcXVlKHR5cGUpIHx8XG4gICAgICAgICh0aGlzLnNob3VsZFBhcnNlRW51bXMoKSAmJiB0eXBlID09PSB0dC5fZW51bSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLmlzRXhwb3J0RGVmYXVsdFNwZWNpZmllcigpO1xuICAgIH1cblxuICAgIHBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKTogTi5FeHByZXNzaW9uIHwgTi5EZWNsYXJhdGlvbiB7XG4gICAgICBpZiAodGhpcy5zaG91bGRQYXJzZUVudW1zKCkgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX2VudW0pKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5xdWVzdGlvbikpIHJldHVybiBleHByO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgLy8gVGhlc2UgdG9rZW5zIGNhbm5vdCBzdGFydCBhbiBleHByZXNzaW9uLCBzbyBpZiBvbmUgb2YgdGhlbSBmb2xsb3dzXG4gICAgICAgIC8vID8gdGhlbiB3ZSBhcmUgcHJvYmFibHkgaW4gYW4gYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVycyBsaXN0IGFuZCB3ZVxuICAgICAgICAvLyBkb24ndCBwYXJzZSB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRDaCA9PT0gY2hhckNvZGVzLmNvbW1hIHx8IC8vIChhPywgYikgPT4gY1xuICAgICAgICAgIG5leHRDaCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvIHx8IC8vIChhPyA9IGIpID0+IGNcbiAgICAgICAgICBuZXh0Q2ggPT09IGNoYXJDb2Rlcy5jb2xvbiB8fCAvLyAoYT86IGIpID0+IGNcbiAgICAgICAgICBuZXh0Q2ggPT09IGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzIC8vIChhPykgPT4gY1xuICAgICAgICApIHtcbiAgICAgICAgICAvKjo6IGludmFyaWFudChyZWZFeHByZXNzaW9uRXJyb3JzICE9IG51bGwpICovXG4gICAgICAgICAgdGhpcy5zZXRPcHRpb25hbFBhcmFtZXRlcnNFcnJvcihyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTm9BcnJvd0F0ID0gdGhpcy5zdGF0ZS5ub0Fycm93QXQ7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBsZXQgeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKTtcbiAgICAgIGxldCBbdmFsaWQsIGludmFsaWRdID0gdGhpcy5nZXRBcnJvd0xpa2VFeHByZXNzaW9ucyhjb25zZXF1ZW50KTtcblxuICAgICAgaWYgKGZhaWxlZCB8fCBpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9BcnJvd0F0ID0gWy4uLm9yaWdpbmFsTm9BcnJvd0F0XTtcblxuICAgICAgICBpZiAoaW52YWxpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd0F0ID0gbm9BcnJvd0F0O1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnZhbGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBub0Fycm93QXQucHVzaChpbnZhbGlkW2ldLnN0YXJ0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAoeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKSk7XG4gICAgICAgICAgW3ZhbGlkLCBpbnZhbGlkXSA9IHRoaXMuZ2V0QXJyb3dMaWtlRXhwcmVzc2lvbnMoY29uc2VxdWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFpbGVkICYmIHZhbGlkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgcG9zc2libGUgY29ycmVjdCB3YXlzIG9mIHBhcnNpbmcsIHRocm93IGFuXG4gICAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgICAgLy8gZS5nLiAgIFNvdXJjZTogYSA/IChiKTogYyA9PiAoZCk6IGUgPT4gZlxuICAgICAgICAgIC8vICAgICAgUmVzdWx0IDE6IGEgPyBiIDogKGMgPT4gKChkKTogZSA9PiBmKSlcbiAgICAgICAgICAvLyAgICAgIFJlc3VsdCAyOiBhID8gKChiKTogYyA9PiBkKSA6IChlID0+IGYpXG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0NvbmRpdGlvbmFsQXJyb3csIHtcbiAgICAgICAgICAgIGF0OiBzdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmYWlsZWQgJiYgdmFsaWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgIG5vQXJyb3dBdC5wdXNoKHZhbGlkWzBdLnN0YXJ0KTtcbiAgICAgICAgICB0aGlzLnN0YXRlLm5vQXJyb3dBdCA9IG5vQXJyb3dBdDtcbiAgICAgICAgICAoeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRBcnJvd0xpa2VFeHByZXNzaW9ucyhjb25zZXF1ZW50LCB0cnVlKTtcblxuICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93QXQgPSBvcmlnaW5hbE5vQXJyb3dBdDtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcblxuICAgICAgbm9kZS50ZXN0ID0gZXhwcjtcbiAgICAgIG5vZGUuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMuZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQobm9kZSwgKCkgPT5cbiAgICAgICAgdGhpcy5wYXJzZU1heWJlQXNzaWduKHVuZGVmaW5lZCwgdW5kZWZpbmVkKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIik7XG4gICAgfVxuXG4gICAgdHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKToge1xuICAgICAgY29uc2VxdWVudDogTi5FeHByZXNzaW9uO1xuICAgICAgZmFpbGVkOiBib29sZWFuO1xuICAgIH0ge1xuICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnB1c2godGhpcy5zdGF0ZS5zdGFydCk7XG5cbiAgICAgIGNvbnN0IGNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgICBjb25zdCBmYWlsZWQgPSAhdGhpcy5tYXRjaCh0dC5jb2xvbik7XG5cbiAgICAgIHRoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5wb3AoKTtcblxuICAgICAgcmV0dXJuIHsgY29uc2VxdWVudCwgZmFpbGVkIH07XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gZXhwcmVzc2lvbiwgd2Fsa3MgdGhyb3VnaCBvdXQgaXRzIGFycm93IGZ1bmN0aW9ucyB3aG9zZSBib2R5IGlzXG4gICAgLy8gYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3VnaCBvdXQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIEl0IHJldHVybnMgZXZlcnlcbiAgICAvLyBmdW5jdGlvbiB3aGljaCBoYXMgYmVlbiBwYXJzZWQgd2l0aCBhIHJldHVybiB0eXBlIGJ1dCBjb3VsZCBoYXZlIGJlZW5cbiAgICAvLyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLlxuICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc2VwYXJhdGVkIGludG8gdHdvIGFycmF5czogb25lIGNvbnRhaW5pbmcgdGhlIG9uZXNcbiAgICAvLyB3aG9zZSBwYXJhbWV0ZXJzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYXNzaWduYWJsZSBsaXN0cywgb25lIGNvbnRhaW5pbmcgdGhlXG4gICAgLy8gb3RoZXJzLlxuICAgIGdldEFycm93TGlrZUV4cHJlc3Npb25zKFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uLFxuICAgICAgZGlzYWxsb3dJbnZhbGlkPzogYm9vbGVhbixcbiAgICApOiBbTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbltdLCBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uW11dIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gW25vZGVdO1xuICAgICAgY29uc3QgYXJyb3dzOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uW10gPSBbXTtcblxuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIikge1xuICAgICAgICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzIHx8ICFub2RlLnJldHVyblR5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXJyb3cgZXhwcmVzc2lvbiB3aXRob3V0IGFtYmlndWl0eSwgc28gY2hlY2sgaXRzIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICB0aGlzLmZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIGFycm93cy5wdXNoKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKG5vZGUuYm9keSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChub2RlLmNvbnNlcXVlbnQpO1xuICAgICAgICAgIHN0YWNrLnB1c2gobm9kZS5hbHRlcm5hdGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhbGxvd0ludmFsaWQpIHtcbiAgICAgICAgYXJyb3dzLmZvckVhY2gobm9kZSA9PiB0aGlzLmZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlKSk7XG4gICAgICAgIHJldHVybiBbYXJyb3dzLCBbXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0aXRpb24oYXJyb3dzLCBub2RlID0+XG4gICAgICAgIG5vZGUucGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHRoaXMuaXNBc3NpZ25hYmxlKHBhcmFtLCB0cnVlKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3QoXG4gICAgICAgIC8vIG5vZGUucGFyYW1zIGlzIEV4cHJlc3Npb25bXSBpbnN0ZWFkIG9mICRSZWFkT25seUFycmF5PFBhdHRlcm4+IGJlY2F1c2UgaXRcbiAgICAgICAgLy8gaGFzIG5vdCBiZWVuIGNvbnZlcnRlZCB5ZXQuXG4gICAgICAgIG5vZGUucGFyYW1zIGFzIGFueSBhcyBOLkV4cHJlc3Npb25bXSxcbiAgICAgICAgbm9kZS5leHRyYT8udHJhaWxpbmdDb21tYUxvYyxcbiAgICAgICAgLyogaXNMSFMgKi8gZmFsc2UsXG4gICAgICApO1xuICAgICAgLy8gRW50ZXIgc2NvcGUsIGFzIGNoZWNrUGFyYW1zIGRlZmluZXMgYmluZGluZ3NcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9BUlJPVyk7XG4gICAgICAvLyBVc2Ugc3VwZXIncyBtZXRob2QgdG8gZm9yY2UgdGhlIHBhcmFtZXRlcnMgdG8gYmUgY2hlY2tlZFxuICAgICAgc3VwZXIuY2hlY2tQYXJhbXMobm9kZSwgZmFsc2UsIHRydWUpO1xuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgfVxuXG4gICAgZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQ8VD4oXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICAgIHBhcnNlOiAoKSA9PiBULFxuICAgICk6IFQge1xuICAgICAgbGV0IHJlc3VsdDogVDtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQuaW5kZXhPZihub2RlLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnB1c2godGhpcy5zdGF0ZS5zdGFydCk7XG4gICAgICAgIHJlc3VsdCA9IHBhcnNlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcnNlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcGFyc2VQYXJlbkl0ZW0oXG4gICAgICBub2RlOiBOLkV4cHJlc3Npb24sXG5cbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgbm9kZSA9IHN1cGVyLnBhcnNlUGFyZW5JdGVtKG5vZGUsIHN0YXJ0TG9jKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIC8vIEluY2x1ZGUgcXVlc3Rpb25tYXJrIGluIGxvY2F0aW9uIG9mIG5vZGVcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHRoaXMuZmluaXNoTm9kZSgpIGFzIG90aGVyd2lzZSB3ZSBtaWdodCBwcm9jZXNzIGNvbW1lbnRzIHR3aWNlIGFuZFxuICAgICAgICAvLyBpbmNsdWRlIGFscmVhZHkgY29uc3VtZWQgcGFyZW5zXG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDYXN0Tm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgICB0eXBlQ2FzdE5vZGUuZXhwcmVzc2lvbiA9IG5vZGU7XG4gICAgICAgIHR5cGVDYXN0Tm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHR5cGVDYXN0Tm9kZSwgXCJUeXBlQ2FzdEV4cHJlc3Npb25cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGFzc2VydE1vZHVsZU5vZGVBbGxvd2VkKG5vZGU6IE4uTm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICAobm9kZS50eXBlID09PSBcIkltcG9ydERlY2xhcmF0aW9uXCIgJiZcbiAgICAgICAgICAobm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVcIiB8fCBub2RlLmltcG9ydEtpbmQgPT09IFwidHlwZW9mXCIpKSB8fFxuICAgICAgICAobm9kZS50eXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiAmJlxuICAgICAgICAgIG5vZGUuZXhwb3J0S2luZCA9PT0gXCJ0eXBlXCIpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09IFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIiAmJiBub2RlLmV4cG9ydEtpbmQgPT09IFwidHlwZVwiKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFsbG93IEZsb3d0eXBlIGltcG9ydHMgYW5kIGV4cG9ydHMgaW4gYWxsIGNvbmRpdGlvbnMgYmVjYXVzZVxuICAgICAgICAvLyBGbG93IGl0c2VsZiBkb2VzIG5vdCBjYXJlIGFib3V0ICdzb3VyY2VUeXBlJy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5hc3NlcnRNb2R1bGVOb2RlQWxsb3dlZChub2RlKTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICAgICk6IE4uRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkpIHtcbiAgICAgICAgbm9kZS5leHBvcnRLaW5kID0gXCJ0eXBlXCI7XG5cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2VMKSkge1xuICAgICAgICAgIC8vIGV4cG9ydCB0eXBlIHsgZm9vLCBiYXIgfTtcbiAgICAgICAgICBub2RlLnNwZWNpZmllcnMgPSB0aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhcbiAgICAgICAgICAgIC8qIGlzSW5UeXBlRXhwb3J0ICovIHRydWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdXBlci5wYXJzZUV4cG9ydEZyb20obm9kZSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXhwb3J0IHR5cGUgRm9vID0gQmFyO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlVHlwZUFsaWFzKGRlY2xhcmF0aW9uTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX29wYXF1ZSkpIHtcbiAgICAgICAgbm9kZS5leHBvcnRLaW5kID0gXCJ0eXBlXCI7XG5cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIC8vIGV4cG9ydCBvcGFxdWUgdHlwZSBGb28gPSBCYXI7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9wYXF1ZVR5cGUoZGVjbGFyYXRpb25Ob2RlLCBmYWxzZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbk5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlKGRlY2xhcmF0aW9uTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9lbnVtKSkge1xuICAgICAgICBub2RlLmV4cG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VFbnVtRGVjbGFyYXRpb24oZGVjbGFyYXRpb25Ob2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVhdEV4cG9ydFN0YXIobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAoc3VwZXIuZWF0RXhwb3J0U3Rhcihub2RlKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5zdGFyKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWF5YmVQYXJzZUV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcihub2RlOiBOLk5vZGUpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2MgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBoYXNOYW1lc3BhY2UgPSBzdXBlci5tYXliZVBhcnNlRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyKG5vZGUpO1xuICAgICAgaWYgKGhhc05hbWVzcGFjZSAmJiBub2RlLmV4cG9ydEtpbmQgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChzdGFydExvYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzTmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NJZChcbiAgICAgIG5vZGU6IE4uQ2xhc3MsXG4gICAgICBpc1N0YXRlbWVudDogYm9vbGVhbixcbiAgICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuIHwgbnVsbCxcbiAgICApIHtcbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NJZChub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc01lbWJlcihcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZW1iZXI6IGFueSxcbiAgICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2MgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2RlY2xhcmUpKSB7XG4gICAgICAgIGlmIChzdXBlci5wYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKGNsYXNzQm9keSwgbWVtYmVyKSkge1xuICAgICAgICAgIC8vICdkZWNsYXJlJyBpcyBhIGNsYXNzIGVsZW1lbnQgbmFtZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlci5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucGFyc2VDbGFzc01lbWJlcihjbGFzc0JvZHksIG1lbWJlciwgc3RhdGUpO1xuXG4gICAgICBpZiAobWVtYmVyLmRlY2xhcmUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1lbWJlci50eXBlICE9PSBcIkNsYXNzUHJvcGVydHlcIiAmJlxuICAgICAgICAgIG1lbWJlci50eXBlICE9PSBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIgJiZcbiAgICAgICAgICBtZW1iZXIudHlwZSAhPT0gXCJQcm9wZXJ0eURlZmluaXRpb25cIiAvLyBVc2VkIGJ5IGVzdHJlZSBwbHVnaW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkRlY2xhcmVDbGFzc0VsZW1lbnQsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci52YWx1ZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5EZWNsYXJlQ2xhc3NGaWVsZEluaXRpYWxpemVyLCB7XG4gICAgICAgICAgICBhdDogbWVtYmVyLnZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNJdGVyYXRvcih3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB3b3JkID09PSBcIml0ZXJhdG9yXCIgfHwgd29yZCA9PT0gXCJhc3luY0l0ZXJhdG9yXCI7XG4gICAgfVxuXG4gICAgcmVhZEl0ZXJhdG9yKCk6IHZvaWQge1xuICAgICAgY29uc3Qgd29yZCA9IHN1cGVyLnJlYWRXb3JkMSgpO1xuICAgICAgY29uc3QgZnVsbFdvcmQgPSBcIkBAXCIgKyB3b3JkO1xuXG4gICAgICAvLyBBbGxvdyBAQGl0ZXJhdG9yIGFuZCBAQGFzeW5jSXRlcmF0b3IgYXMgYSBpZGVudGlmaWVyIG9ubHkgaW5zaWRlIHR5cGVcbiAgICAgIGlmICghdGhpcy5pc0l0ZXJhdG9yKHdvcmQpIHx8ICF0aGlzLnN0YXRlLmluVHlwZSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkSWRlbnRpZmllciwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IGZ1bGxXb3JkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5uYW1lLCBmdWxsV29yZCk7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgaW5zaWRlIGZsb3cgdHlwZXMsIHdlIGJ5cGFzcyB0aGUganN4IHBhcnNlciBwbHVnaW5cbiAgICBnZXRUb2tlbkZyb21Db2RlKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSAmJiBuZXh0ID09PSBjaGFyQ29kZXMudmVydGljYWxCYXIpIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5icmFjZUJhckwsIDIpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgJiZcbiAgICAgICAgKGNvZGUgPT09IGNoYXJDb2Rlcy5ncmVhdGVyVGhhbiB8fCBjb2RlID09PSBjaGFyQ29kZXMubGVzc1RoYW4pXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcChjb2RlID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gPyB0dC5ndCA6IHR0Lmx0LCAxKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pblR5cGUgJiYgY29kZSA9PT0gY2hhckNvZGVzLnF1ZXN0aW9uTWFyaykge1xuICAgICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmRvdCkge1xuICAgICAgICAgIHRoaXMuZmluaXNoT3AodHQucXVlc3Rpb25Eb3QsIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsbG93IGRvdWJsZSBudWxsYWJsZSB0eXBlcyBpbiBGbG93OiA/P3N0cmluZ1xuICAgICAgICAgIHRoaXMuZmluaXNoT3AodHQucXVlc3Rpb24sIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc0l0ZXJhdG9yU3RhcnQoY29kZSwgbmV4dCwgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjsgLy8gZWF0IFwiQEBcIlxuICAgICAgICB0aGlzLnJlYWRJdGVyYXRvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VwZXIuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzQmluZGluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3VwZXIuaXNBc3NpZ25hYmxlKG5vZGUsIGlzQmluZGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9Bc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICAhaXNMSFMgJiZcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgbm9kZS5sZWZ0LnR5cGUgPT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCJcbiAgICAgICkge1xuICAgICAgICBub2RlLmxlZnQgPSB0aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIobm9kZS5sZWZ0KTtcbiAgICAgIH1cbiAgICAgIHN1cGVyLnRvQXNzaWduYWJsZShub2RlLCBpc0xIUyk7XG4gICAgfVxuXG4gICAgLy8gdHVybiB0eXBlIGNhc3RzIHRoYXQgd2UgZm91bmQgaW4gZnVuY3Rpb24gcGFyYW1ldGVyIGhlYWQgaW50byB0eXBlIGFubm90YXRlZCBwYXJhbXNcbiAgICB0b0Fzc2lnbmFibGVMaXN0KFxuICAgICAgZXhwckxpc3Q6IE4uRXhwcmVzc2lvbltdLFxuICAgICAgdHJhaWxpbmdDb21tYUxvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgICAgaXNMSFM6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBleHByTGlzdFtpXTtcbiAgICAgICAgaWYgKGV4cHI/LnR5cGUgPT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBleHByTGlzdFtpXSA9IHRoaXMudHlwZUNhc3RUb1BhcmFtZXRlcihleHByKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3VwZXIudG9Bc3NpZ25hYmxlTGlzdChleHByTGlzdCwgdHJhaWxpbmdDb21tYUxvYywgaXNMSFMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYSBsaXN0IG9mIG5vZGVzLCBmcm9tIHNvbWV0aGluZyBsaWtlIGEgY2FsbCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvIGZpbHRlciB0aGVcbiAgICAvLyB0eXBlIGNhc3RzIHRoYXQgd2UndmUgZm91bmQgdGhhdCBhcmUgaWxsZWdhbCBpbiB0aGlzIGNvbnRleHRcbiAgICB0b1JlZmVyZW5jZWRMaXN0KFxuICAgICAgZXhwckxpc3Q6IFJlYWRvbmx5QXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgICBpc1BhcmVudGhlc2l6ZWRFeHByPzogYm9vbGVhbixcbiAgICApOiBSZWFkb25seUFycmF5PE4uRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGw+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGV4cHJMaXN0W2ldO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhwciAmJlxuICAgICAgICAgIGV4cHIudHlwZSA9PT0gXCJUeXBlQ2FzdEV4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICFleHByLmV4dHJhPy5wYXJlbnRoZXNpemVkICYmXG4gICAgICAgICAgKGV4cHJMaXN0Lmxlbmd0aCA+IDEgfHwgIWlzUGFyZW50aGVzaXplZEV4cHIpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UeXBlQ2FzdEluUGF0dGVybiwge1xuICAgICAgICAgICAgYXQ6IGV4cHIudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cHJMaXN0O1xuICAgIH1cblxuICAgIHBhcnNlQXJyYXlMaWtlKFxuICAgICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICAgIGNhbkJlUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzVHVwbGU6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5BcnJheUV4cHJlc3Npb24gfCBOLlR1cGxlRXhwcmVzc2lvbiB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VBcnJheUxpa2UoXG4gICAgICAgIGNsb3NlLFxuICAgICAgICBjYW5CZVBhdHRlcm4sXG4gICAgICAgIGlzVHVwbGUsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuXG4gICAgICAvLyBUaGlzIGNvdWxkIGJlIGFuIGFycmF5IHBhdHRlcm46XG4gICAgICAvLyAgIChbYTogc3RyaW5nLCBiOiBzdHJpbmddKSA9PiB7fVxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCBoYXZlIHRvIGNhbGwgdG9SZWZlcmVuY2VkTGlzdC4gV2Ugd2lsbFxuICAgICAgLy8gY2FsbCBpdCwgaWYgbmVlZGVkLCB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgaXQgaXMgYSBwYXJlbnRoZXNpemVkXG4gICAgICAvLyBleHByZXNzaW9uIGJ5IGNhbGxpbmcgdG9SZWZlcmVuY2VkTGlzdERlZXAuXG4gICAgICBpZiAoY2FuQmVQYXR0ZXJuICYmICF0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy50b1JlZmVyZW5jZWRMaXN0KG5vZGUuZWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkTFZhbCh0eXBlOiBzdHJpbmcsIGlzUGFyZW50aGVzaXplZDogYm9vbGVhbiwgYmluZGluZzogQmluZGluZ1R5cGVzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiIHx8XG4gICAgICAgIHN1cGVyLmlzVmFsaWRMVmFsKHR5cGUsIGlzUGFyZW50aGVzaXplZCwgYmluZGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcGFyc2UgY2xhc3MgcHJvcGVydHkgdHlwZSBhbm5vdGF0aW9uc1xuICAgIHBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlOiBOLkNsYXNzUHJvcGVydHkpOiBOLkNsYXNzUHJvcGVydHkge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUNsYXNzUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eShcbiAgICAgIG5vZGU6IE4uQ2xhc3NQcml2YXRlUHJvcGVydHksXG4gICAgKTogTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQ2xhc3NQcml2YXRlUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGN1cnJlbnRseSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgYSBjbGFzcyBtZXRob2Qgd291bGQgYXBwZWFyXG4gICAgaXNDbGFzc01ldGhvZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Lmx0KSB8fCBzdXBlci5pc0NsYXNzTWV0aG9kKCk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGN1cnJlbnRseSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgYSBjbGFzcyBwcm9wZXJ0eSB3b3VsZCBhcHBlYXJcbiAgICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuaXNDbGFzc1Byb3BlcnR5KCk7XG4gICAgfVxuXG4gICAgaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2Q6IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJvcGVydHkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhdGhpcy5tYXRjaCh0dC5jb2xvbikgJiYgc3VwZXIuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2QpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHR5cGUgcGFyYW1ldGVycyBmb3IgY2xhc3MgbWV0aG9kc1xuICAgIHB1c2hDbGFzc01ldGhvZChcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZXRob2Q6IE4uQ2xhc3NNZXRob2QsXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dzRGlyZWN0U3VwZXI6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoKG1ldGhvZCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgobWV0aG9kIGFzIGFueSkudmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSAobWV0aG9kIGFzIGFueSkudmFyaWFuY2U7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbWV0aG9kLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucHVzaENsYXNzTWV0aG9kKFxuICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzQ29uc3RydWN0b3IsXG4gICAgICAgIGFsbG93c0RpcmVjdFN1cGVyLFxuICAgICAgKTtcblxuICAgICAgaWYgKG1ldGhvZC5wYXJhbXMgJiYgaXNDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXRob2QucGFyYW1zO1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5pc1RoaXNQYXJhbShwYXJhbXNbMF0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbUJhbm5lZEluQ29uc3RydWN0b3IsIHsgYXQ6IG1ldGhvZCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc3RyZWUgc3VwcG9ydFxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUyBkb2VzIG5vdCBrbm93IGFib3V0IHRoZSBmYWNlIHRoYXQgZXN0cmVlIGNhbiByZXBsYWNlIENsYXNzTWV0aG9kIHdpdGggTWV0aG9kRGVmaW5pdGlvblxuICAgICAgICBtZXRob2QudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiZcbiAgICAgICAgaXNDb25zdHJ1Y3RvciAmJlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGVzdHJlZVxuICAgICAgICBtZXRob2QudmFsdWUucGFyYW1zXG4gICAgICApIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBlc3RyZWVcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbWV0aG9kLnZhbHVlLnBhcmFtcztcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwICYmIHRoaXMuaXNUaGlzUGFyYW0ocGFyYW1zWzBdKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1CYW5uZWRJbkNvbnN0cnVjdG9yLCB7IGF0OiBtZXRob2QgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoQ2xhc3NQcml2YXRlTWV0aG9kKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1ldGhvZDogTi5DbGFzc1ByaXZhdGVNZXRob2QsXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoKG1ldGhvZCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgobWV0aG9kIGFzIGFueSkudmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSAobWV0aG9kIGFzIGFueSkudmFyaWFuY2U7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbWV0aG9kLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIG1ldGhvZCwgaXNHZW5lcmF0b3IsIGlzQXN5bmMpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIGEgdGhlIHN1cGVyIGNsYXNzIHR5cGUgcGFyYW1ldGVycyBhbmQgaW1wbGVtZW50c1xuICAgIHBhcnNlQ2xhc3NTdXBlcihub2RlOiBOLkNsYXNzKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZUNsYXNzU3VwZXIobm9kZSk7XG4gICAgICBpZiAobm9kZS5zdXBlckNsYXNzICYmIHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUuc3VwZXJUeXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW1wbGVtZW50cykpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGNvbnN0IGltcGxlbWVudGVkOiBOLkZsb3dDbGFzc0ltcGxlbWVudHNbXSA9IChub2RlLmltcGxlbWVudHMgPSBbXSk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcigvKmxpYmVyYWwqLyB0cnVlKTtcbiAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBsZW1lbnRlZC5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkNsYXNzSW1wbGVtZW50c1wiKSk7XG4gICAgICAgIH0gd2hpbGUgKHRoaXMuZWF0KHR0LmNvbW1hKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNoZWNrR2V0dGVyU2V0dGVyUGFyYW1zKG1ldGhvZCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcbiAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pICYmIG1ldGhvZC5raW5kID09PSBcImdldFwiKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkdldHRlck1heU5vdEhhdmVUaGlzUGFyYW0sIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlNldHRlck1heU5vdEhhdmVUaGlzUGFyYW0sIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihcbiAgICAgIG5vZGU6IE4uT2JqZWN0T3JDbGFzc01lbWJlciB8IE4uQ2xhc3NNZW1iZXIsXG4gICAgKTogdm9pZCB7XG4gICAgICBub2RlLnZhcmlhbmNlID0gdGhpcy5mbG93UGFyc2VWYXJpYW5jZSgpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHR5cGUgcGFyYW1ldGVycyBmb3Igb2JqZWN0IG1ldGhvZCBzaG9ydGhhbmRcbiAgICBwYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5PYmplY3RNZXRob2QgfCBOLk9iamVjdFByb3BlcnR5IHtcbiAgICAgIGlmICgocHJvcCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgocHJvcCBhcyBhbnkpLnZhcmlhbmNlLmxvYy5zdGFydCk7XG4gICAgICB9XG4gICAgICBkZWxldGUgKHByb3AgYXMgYW55KS52YXJpYW5jZTtcblxuICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzO1xuXG4gICAgICAvLyBtZXRob2Qgc2hvcnRoYW5kXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgJiYgIWlzQWNjZXNzb3IpIHtcbiAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5MKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlT2JqUHJvcFZhbHVlKFxuICAgICAgICBwcm9wLFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzUGF0dGVybixcbiAgICAgICAgaXNBY2Nlc3NvcixcbiAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICk7XG5cbiAgICAgIC8vIGFkZCB0eXBlUGFyYW1ldGVycyBpZiB3ZSBmb3VuZCB0aGVtXG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgKHJlc3VsdC52YWx1ZSB8fCByZXN1bHQpLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMocGFyYW06IE4uUGF0dGVybik6IE4uUGF0dGVybiB7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIGlmIChwYXJhbS50eXBlICE9PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5QYXR0ZXJuSXNPcHRpb25hbCwgeyBhdDogcGFyYW0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWwsIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgKHBhcmFtIGFzIGFueSBhcyBOLklkZW50aWZpZXIpLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RoaXNQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbUFubm90YXRpb25SZXF1aXJlZCwgeyBhdDogcGFyYW0gfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmVxKSAmJiB0aGlzLmlzVGhpc1BhcmFtKHBhcmFtKSkge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVGhpc1BhcmFtTm9EZWZhdWx0LCB7IGF0OiBwYXJhbSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNldEVuZExvY2F0aW9uKHBhcmFtKTtcbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG5cbiAgICBwYXJzZU1heWJlRGVmYXVsdChcbiAgICAgIHN0YXJ0TG9jPzogUG9zaXRpb24gfCBudWxsLFxuICAgICAgbGVmdD86IE4uUGF0dGVybiB8IG51bGwsXG4gICAgKTogTi5QYXR0ZXJuIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdXBlci5wYXJzZU1heWJlRGVmYXVsdChzdGFydExvYywgbGVmdCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgJiZcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiAmJlxuICAgICAgICBub2RlLnJpZ2h0LnN0YXJ0IDwgbm9kZS50eXBlQW5ub3RhdGlvbi5zdGFydFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UeXBlQmVmb3JlSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgICBhdDogbm9kZS50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICAgIHN1cGVyLmNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlKTtcbiAgICAgIGlmIChub2RlLm1vZHVsZSAmJiBub2RlLmltcG9ydEtpbmQgIT09IFwidmFsdWVcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuSW1wb3J0UmVmbGVjdGlvbkhhc0ltcG9ydFR5cGUsIHtcbiAgICAgICAgICBhdDogbm9kZS5zcGVjaWZpZXJzWzBdLmxvYy5zdGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbDxcbiAgICAgIFQgZXh0ZW5kc1xuICAgICAgICB8IE4uSW1wb3J0U3BlY2lmaWVyXG4gICAgICAgIHwgTi5JbXBvcnREZWZhdWx0U3BlY2lmaWVyXG4gICAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gICAgPihub2RlOiBOLkltcG9ydERlY2xhcmF0aW9uLCBzcGVjaWZpZXI6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0pOiB2b2lkIHtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IGhhc1R5cGVJbXBvcnRLaW5kKG5vZGUpXG4gICAgICAgID8gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgICAgIC8qIGxpYmVyYWwgKi8gdHJ1ZSxcbiAgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uICovIHRydWUsXG4gICAgICAgICAgKVxuICAgICAgICA6IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgIG5vZGUuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKHNwZWNpZmllciwgdHlwZSkpO1xuICAgIH1cblxuICAgIGlzUG90ZW50aWFsSW1wb3J0UGhhc2UoaXNFeHBvcnQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIGlmIChzdXBlci5pc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpKSB7XG4gICAgICAgIGlmICghaXNFeHBvcnQpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgcmV0dXJuIGNoID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2UgfHwgY2ggPT09IGNoYXJDb2Rlcy5hc3RlcmlzaztcbiAgICAgIH1cbiAgICAgIHJldHVybiAhaXNFeHBvcnQgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGVvZik7XG4gICAgfVxuXG4gICAgYXBwbHlJbXBvcnRQaGFzZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgICAgIGlzRXhwb3J0OiBib29sZWFuLFxuICAgICAgcGhhc2U6IHN0cmluZyB8IG51bGwsXG4gICAgICBsb2M/OiBQb3NpdGlvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLmFwcGx5SW1wb3J0UGhhc2Uobm9kZSwgaXNFeHBvcnQsIHBoYXNlLCBsb2MpO1xuICAgICAgaWYgKGlzRXhwb3J0KSB7XG4gICAgICAgIGlmICghcGhhc2UgJiYgdGhpcy5tYXRjaCh0dC5fZGVmYXVsdCkpIHtcbiAgICAgICAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIG91ciBUUyBBU1QgYW5kIGFsd2F5cyBhZGQgLmV4cG9ydEtpbmRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKG5vZGUgYXMgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uKS5leHBvcnRLaW5kID1cbiAgICAgICAgICBwaGFzZSA9PT0gXCJ0eXBlXCIgPyBwaGFzZSA6IFwidmFsdWVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gXCJ0eXBlXCIgJiYgdGhpcy5tYXRjaCh0dC5zdGFyKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgIChub2RlIGFzIE4uSW1wb3J0RGVjbGFyYXRpb24pLmltcG9ydEtpbmQgPVxuICAgICAgICAgIHBoYXNlID09PSBcInR5cGVcIiB8fCBwaGFzZSA9PT0gXCJ0eXBlb2ZcIiA/IHBoYXNlIDogXCJ2YWx1ZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIGltcG9ydC10eXBlL3R5cGVvZiBzaG9ydGhhbmRcbiAgICBwYXJzZUltcG9ydFNwZWNpZmllcihcbiAgICAgIHNwZWNpZmllcjogYW55LFxuICAgICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgfCB1bmRlZmluZWQsXG4gICAgKTogTi5JbXBvcnRTcGVjaWZpZXIge1xuICAgICAgY29uc3QgZmlyc3RJZGVudCA9IHNwZWNpZmllci5pbXBvcnRlZDtcblxuICAgICAgbGV0IHNwZWNpZmllclR5cGVLaW5kID0gbnVsbDtcbiAgICAgIGlmIChmaXJzdElkZW50LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgIGlmIChmaXJzdElkZW50Lm5hbWUgPT09IFwidHlwZVwiKSB7XG4gICAgICAgICAgc3BlY2lmaWVyVHlwZUtpbmQgPSBcInR5cGVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChmaXJzdElkZW50Lm5hbWUgPT09IFwidHlwZW9mXCIpIHtcbiAgICAgICAgICBzcGVjaWZpZXJUeXBlS2luZCA9IFwidHlwZW9mXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGlzQmluZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hcykgJiYgIXRoaXMuaXNMb29rYWhlYWRDb250ZXh0dWFsKFwiYXNcIikpIHtcbiAgICAgICAgY29uc3QgYXNfaWRlbnQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWNpZmllclR5cGVLaW5kICE9PSBudWxsICYmXG4gICAgICAgICAgIXRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYGltcG9ydCB7dHlwZSBhcyAsYCBvciBgaW1wb3J0IHt0eXBlIGFzIH1gXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gYXNfaWRlbnQ7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBzcGVjaWZpZXJUeXBlS2luZDtcbiAgICAgICAgICBzcGVjaWZpZXIubG9jYWwgPSBjbG9uZUlkZW50aWZpZXIoYXNfaWRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGBpbXBvcnQge3R5cGUgYXMgZm9vYFxuICAgICAgICAgIHNwZWNpZmllci5pbXBvcnRlZCA9IGZpcnN0SWRlbnQ7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBudWxsO1xuICAgICAgICAgIHNwZWNpZmllci5sb2NhbCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzcGVjaWZpZXJUeXBlS2luZCAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYGltcG9ydCB7dHlwZSBmb29gXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBzcGVjaWZpZXJUeXBlS2luZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW1wb3J0ZWRJc1N0cmluZykge1xuICAgICAgICAgICAgLyo6OiBpbnZhcmlhbnQoZmlyc3RJZGVudCBpbnN0YW5jZW9mIE4uU3RyaW5nTGl0ZXJhbCkgKi9cbiAgICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydEJpbmRpbmdJc1N0cmluZywge1xuICAgICAgICAgICAgICBhdDogc3BlY2lmaWVyLFxuICAgICAgICAgICAgICBpbXBvcnROYW1lOiBmaXJzdElkZW50LnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qOjogaW52YXJpYW50KGZpcnN0SWRlbnQgaW5zdGFuY2VvZiBOLk5vZGUpICovXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gZmlyc3RJZGVudDtcbiAgICAgICAgICBzcGVjaWZpZXIuaW1wb3J0S2luZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgICAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQmluZGluZyA9IHRydWU7XG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsID0gY2xvbmVJZGVudGlmaWVyKHNwZWNpZmllci5pbXBvcnRlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWVySXNUeXBlSW1wb3J0ID0gaGFzVHlwZUltcG9ydEtpbmQoc3BlY2lmaWVyKTtcblxuICAgICAgaWYgKGlzSW5UeXBlT25seUltcG9ydCAmJiBzcGVjaWZpZXJJc1R5cGVJbXBvcnQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkltcG9ydFR5cGVTaG9ydGhhbmRPbmx5SW5QdXJlSW1wb3J0LCB7XG4gICAgICAgICAgYXQ6IHNwZWNpZmllcixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0luVHlwZU9ubHlJbXBvcnQgfHwgc3BlY2lmaWVySXNUeXBlSW1wb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFR5cGUoXG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsLm5hbWUsXG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsLmxvYy5zdGFydCxcbiAgICAgICAgICAvKiBkZWNsYXJhdGlvbiAqLyB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCaW5kaW5nICYmICFpc0luVHlwZU9ubHlJbXBvcnQgJiYgIXNwZWNpZmllcklzVHlwZUltcG9ydCkge1xuICAgICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgICAgICAgIHNwZWNpZmllci5sb2NhbC5uYW1lLFxuICAgICAgICAgIHNwZWNpZmllci5sb2Muc3RhcnQsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hJbXBvcnRTcGVjaWZpZXIoc3BlY2lmaWVyLCBcIkltcG9ydFNwZWNpZmllclwiKTtcbiAgICB9XG5cbiAgICBwYXJzZUJpbmRpbmdBdG9tKCk6IE4uUGF0dGVybiB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0Ll90aGlzOlxuICAgICAgICAgIC8vIFwidGhpc1wiIG1heSBiZSB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlciwgc28gYWxsb3cgaXQuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJZGVudGlmaWVyKC8qIGxpYmVyYWwgKi8gdHJ1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZSBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlcnMgLSBmdW5jdGlvbiBmb288VD4oKSB7fVxuICAgIHBhcnNlRnVuY3Rpb25QYXJhbXMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBraW5kIG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgY29uc3Qga2luZCA9IG5vZGUua2luZDtcbiAgICAgIGlmIChraW5kICE9PSBcImdldFwiICYmIGtpbmQgIT09IFwic2V0XCIgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG4gICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUsIGlzQ29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIGZsb3cgdHlwZSBhbm5vdGF0aW9ucyBvbiB2YXJpYWJsZSBkZWNsYXJhdG9yIGhlYWRzIC0gbGV0IGZvbzogc3RyaW5nID0gYmFyXG4gICAgcGFyc2VWYXJJZChcbiAgICAgIGRlY2w6IE4uVmFyaWFibGVEZWNsYXJhdG9yLFxuICAgICAga2luZDogXCJ2YXJcIiB8IFwibGV0XCIgfCBcImNvbnN0XCIsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZVZhcklkKGRlY2wsIGtpbmQpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgIGRlY2wuaWQudHlwZUFubm90YXRpb24gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihkZWNsLmlkKTsgLy8gc2V0IGVuZCBwb3NpdGlvbiB0byBlbmQgb2YgdHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSByZXR1cm4gdHlwZSBvZiBhbiBhc3luYyBhcnJvdyBmdW5jdGlvbiAtIGxldCBmb28gPSAoYXN5bmMgKCk6IG51bWJlciA9PiB7fSk7XG4gICAgcGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKFxuICAgICAgbm9kZTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbixcbiAgICAgIGNhbGw6IE4uQ2FsbEV4cHJlc3Npb24sXG4gICAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgY29uc3Qgb2xkTm9Bbm9uRnVuY3Rpb25UeXBlID0gdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7XG4gICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gb2xkTm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKG5vZGUsIGNhbGwpO1xuICAgIH1cblxuICAgIC8vIHRvZG8gZGVzY3JpcHRpb25cbiAgICBzaG91bGRQYXJzZUFzeW5jQXJyb3coKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuc2hvdWxkUGFyc2VBc3luY0Fycm93KCk7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byBzdXBwb3J0IHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBmb3IgYXJyb3cgZnVuY3Rpb25zLiBUaGlzXG4gICAgLy8gaXMgdHJpY2t5LiBUaGVyZSBhcmUgdGhyZWUgc2l0dWF0aW9ucyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgIC8vXG4gICAgLy8gMS4gVGhpcyBpcyBlaXRoZXIgSlNYIG9yIGFuIGFycm93IGZ1bmN0aW9uLiBXZSdsbCB0cnkgSlNYIGZpcnN0LiBJZiB0aGF0XG4gICAgLy8gICAgZmFpbHMsIHdlJ2xsIHRyeSBhbiBhcnJvdyBmdW5jdGlvbi4gSWYgdGhhdCBmYWlscywgd2UnbGwgdGhyb3cgdGhlIEpTWFxuICAgIC8vICAgIGVycm9yLlxuICAgIC8vIDIuIFRoaXMgaXMgYW4gYXJyb3cgZnVuY3Rpb24uIFdlJ2xsIHBhcnNlIHRoZSB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbixcbiAgICAvLyAgICBwYXJzZSB0aGUgcmVzdCwgbWFrZSBzdXJlIHRoZSByZXN0IGlzIGFuIGFycm93IGZ1bmN0aW9uLCBhbmQgZ28gZnJvbVxuICAgIC8vICAgIHRoZXJlXG4gICAgLy8gMy4gVGhpcyBpcyBuZWl0aGVyLiBKdXN0IGNhbGwgdGhlIHN1cGVyIG1ldGhvZFxuICAgIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBsZXQgc3RhdGUgPSBudWxsO1xuXG4gICAgICBsZXQganN4O1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmXG4gICAgICAgICh0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSlcbiAgICAgICkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcblxuICAgICAgICBqc3ggPSB0aGlzLnRyeVBhcnNlKFxuICAgICAgICAgICgpID0+IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24ocmVmRXhwcmVzc2lvbkVycm9ycywgYWZ0ZXJMZWZ0UGFyc2UpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qOjogaW52YXJpYW50KCFqc3guYWJvcnRlZCkgKi9cbiAgICAgICAgLyo6OiBpbnZhcmlhbnQoanN4Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgICAgaWYgKCFqc3guZXJyb3IpIHJldHVybiBqc3gubm9kZTtcblxuICAgICAgICAvLyBSZW1vdmUgYHRjLmpfZXhwcmAgYW5kIGB0Yy5qX29UYWdgIGZyb20gY29udGV4dCBhZGRlZFxuICAgICAgICAvLyBieSBwYXJzaW5nIGBqc3hUYWdTdGFydGAgdG8gc3RvcCB0aGUgSlNYIHBsdWdpbiBmcm9tXG4gICAgICAgIC8vIG1lc3Npbmcgd2l0aCB0aGUgdG9rZW5zXG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dCA9PT0gdGMual9vVGFnIHx8IGN1cnJlbnRDb250ZXh0ID09PSB0Yy5qX2V4cHIpIHtcbiAgICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChqc3g/LmVycm9yIHx8IHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHN0YXRlID0gc3RhdGUgfHwgdGhpcy5zdGF0ZS5jbG9uZSgpO1xuXG4gICAgICAgIGxldCB0eXBlUGFyYW1ldGVyczogTi5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247XG5cbiAgICAgICAgY29uc3QgYXJyb3cgPSB0aGlzLnRyeVBhcnNlKGFib3J0ID0+IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG5cbiAgICAgICAgICBjb25zdCBhcnJvd0V4cHJlc3Npb24gPSB0aGlzLmZvcndhcmROb0Fycm93UGFyYW1zQ29udmVyc2lvbkF0KFxuICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgICAgICAgICBhZnRlckxlZnRQYXJzZSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHJlc3VsdCwgdHlwZVBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyA8VD4oKCkgPT4ge30pO1xuICAgICAgICAgIC8vIDxUPigoKSA9PiB7fTogYW55KTtcbiAgICAgICAgICBpZiAoYXJyb3dFeHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkKSBhYm9ydCgpO1xuXG4gICAgICAgICAgLy8gVGhlIGFib3ZlIGNhbiByZXR1cm4gYSBUeXBlQ2FzdEV4cHJlc3Npb24gd2hlbiB0aGUgYXJyb3dcbiAgICAgICAgICAvLyBleHByZXNzaW9uIGlzIG5vdCB3cmFwcGVkIGluIHBhcmVucy4gU2VlIGFsc28gYHRoaXMucGFyc2VQYXJlbkl0ZW1gLlxuICAgICAgICAgIC8vICg8VD4oKSA9PiB7fTogYW55KTtcbiAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5tYXliZVVud3JhcFR5cGVDYXN0RXhwcmVzc2lvbihhcnJvd0V4cHJlc3Npb24pO1xuXG4gICAgICAgICAgaWYgKGV4cHIudHlwZSAhPT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKSBhYm9ydCgpO1xuXG4gICAgICAgICAgZXhwci50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuICAgICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUoZXhwciwgdHlwZVBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgcmV0dXJuIGFycm93RXhwcmVzc2lvbjtcbiAgICAgICAgfSwgc3RhdGUpO1xuXG4gICAgICAgIGxldCBhcnJvd0V4cHJlc3Npb246XG4gICAgICAgICAgfCBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uXG4gICAgICAgICAgfCBOLlR5cGVDYXN0RXhwcmVzc2lvblxuICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgICAgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYXJyb3cubm9kZSAmJlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgdGhpcy5tYXliZVVud3JhcFR5cGVDYXN0RXhwcmVzc2lvbihhcnJvdy5ub2RlKS50eXBlID09PVxuICAgICAgICAgICAgXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICghYXJyb3cuZXJyb3IgJiYgIWFycm93LmFib3J0ZWQpIHtcbiAgICAgICAgICAgIC8vIDxUPiBhc3luYyAoKSA9PiB7fVxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHRyeVBhcnNlIHR5cGluZ3NcbiAgICAgICAgICAgIGlmIChhcnJvdy5ub2RlLmFzeW5jKSB7XG4gICAgICAgICAgICAgIC8qOjogaW52YXJpYW50KHR5cGVQYXJhbWV0ZXJzKSAqL1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgICAgICAgIEZsb3dFcnJvcnMuVW5leHBlY3RlZFR5cGVQYXJhbWV0ZXJCZWZvcmVBc3luY0Fycm93RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgeyBhdDogdHlwZVBhcmFtZXRlcnMgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gYXJyb3cubm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICAgIGFycm93RXhwcmVzc2lvbiA9IGFycm93Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgYm90aCBKU1ggYW5kIEZsb3cgcGFyc2luZyBhdHRlbXB0cyBmYWlsZWQuXG4gICAgICAgIC8vIEdpdmUgdGhlIHByZWNlZGVuY2UgdG8gdGhlIEpTWCBlcnJvciwgZXhjZXB0IGlmIEpTWCBoYWQgYW5cbiAgICAgICAgLy8gdW5yZWNvdmVyYWJsZSBlcnJvciB3aGlsZSBGbG93IGRpZG4ndC5cbiAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIHJlY292ZXJhYmxlLCB3ZSBjYW4gb25seSByZS1yZXBvcnQgaXQgaWYgdGhlcmUgaXNcbiAgICAgICAgLy8gYSBub2RlIHdlIGNhbiByZXR1cm4uXG5cbiAgICAgICAgaWYgKGpzeD8ubm9kZSkge1xuICAgICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5mYWlsU3RhdGUpICovXG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IGpzeC5mYWlsU3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGpzeC5ub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycm93RXhwcmVzc2lvbikge1xuICAgICAgICAgIC8qOjogaW52YXJpYW50KGFycm93LmZhaWxTdGF0ZSkgKi9cbiAgICAgICAgICB0aGlzLnN0YXRlID0gYXJyb3cuZmFpbFN0YXRlO1xuICAgICAgICAgIHJldHVybiBhcnJvd0V4cHJlc3Npb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanN4Py50aHJvd24pIHRocm93IGpzeC5lcnJvcjtcbiAgICAgICAgaWYgKGFycm93LnRocm93bikgdGhyb3cgYXJyb3cuZXJyb3I7XG5cbiAgICAgICAgLyo6OiBpbnZhcmlhbnQodHlwZVBhcmFtZXRlcnMpICovXG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRmxvd0Vycm9ycy5VbmV4cGVjdGVkVG9rZW5BZnRlclR5cGVQYXJhbWV0ZXIsIHtcbiAgICAgICAgICBhdDogdHlwZVBhcmFtZXRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIHJldHVybiB0eXBlcyBmb3IgYXJyb3cgZnVuY3Rpb25zXG4gICAgcGFyc2VBcnJvdyhcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgICApOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHJ5UGFyc2UoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZSA9IHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IHR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHR5cGVOb2RlLnR5cGVBbm5vdGF0aW9uLFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAoZGVzdHJ1Y3R1cmluZyBub3Qgc3VwcG9ydGVkIHlldClcbiAgICAgICAgICAgIG5vZGUucHJlZGljYXRlLFxuICAgICAgICAgIF0gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpO1xuXG4gICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBvbGROb0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LmFycm93KSkgdGhpcy51bmV4cGVjdGVkKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHlwZU5vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQudGhyb3duKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLyo6OiBpbnZhcmlhbnQocmVzdWx0Lm5vZGUpICovXG5cbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG5cbiAgICAgICAgLy8gYXNzaWduIGFmdGVyIGl0IGlzIGNsZWFyIGl0IGlzIGFuIGFycm93XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgbm9kZS5yZXR1cm5UeXBlID0gcmVzdWx0Lm5vZGUudHlwZUFubm90YXRpb25cbiAgICAgICAgICA/IHRoaXMuZmluaXNoTm9kZShyZXN1bHQubm9kZSwgXCJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQXJyb3cobm9kZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VBcnJvdyhwYXJhbXM6IEFycmF5PE4uTm9kZT4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmNvbG9uKSB8fCBzdXBlci5zaG91bGRQYXJzZUFycm93KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgICBub2RlOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uLFxuICAgICAgcGFyYW1zOiBOLlBhdHRlcm5bXSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQuaW5kZXhPZihub2RlLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgbm9kZS5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlci5zZXRBcnJvd0Z1bmN0aW9uUGFyYW1ldGVycyhub2RlLCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrUGFyYW1zKFxuICAgICAgbm9kZTogTi5GdW5jdGlvbixcbiAgICAgIGFsbG93RHVwbGljYXRlczogYm9vbGVhbixcbiAgICAgIGlzQXJyb3dGdW5jdGlvbj86IGJvb2xlYW4gfCBudWxsLFxuICAgICAgc3RyaWN0TW9kZUNoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICBpc0Fycm93RnVuY3Rpb24gJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LmluZGV4T2Yobm9kZS5zdGFydCkgIT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhlIGB0aGlzYCBwYXJhbSBpcyBmaXJzdCwgaWYgaXQgZXhpc3RzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVGhpc1BhcmFtKG5vZGUucGFyYW1zW2ldKSAmJiBpID4gMCkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1NdXN0QmVGaXJzdCwgeyBhdDogbm9kZS5wYXJhbXNbaV0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3VwZXIuY2hlY2tQYXJhbXMoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGFsbG93RHVwbGljYXRlcyxcbiAgICAgICAgaXNBcnJvd0Z1bmN0aW9uLFxuICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93OiBib29sZWFuKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uKFxuICAgICAgICBjYW5CZUFycm93ICYmIHRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2YodGhpcy5zdGF0ZS5zdGFydCkgPT09IC0xLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZVN1YnNjcmlwdHMoXG4gICAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG5cbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIG5vQ2FsbHM/OiBib29sZWFuIHwgbnVsbCxcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgaWYgKFxuICAgICAgICBiYXNlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgIGJhc2UubmFtZSA9PT0gXCJhc3luY1wiICYmXG4gICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2Yoc3RhcnRMb2MuaW5kZXgpICE9PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcbiAgICAgICAgbm9kZS5jYWxsZWUgPSBiYXNlO1xuICAgICAgICBub2RlLmFyZ3VtZW50cyA9IHN1cGVyLnBhcnNlQ2FsbEV4cHJlc3Npb25Bcmd1bWVudHModHQucGFyZW5SLCBmYWxzZSk7XG4gICAgICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGJhc2UudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICAgdGhpcy5tYXRjaCh0dC5sdClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgYXJyb3cgPSB0aGlzLnRyeVBhcnNlKFxuICAgICAgICAgIGFib3J0ID0+IHRoaXMucGFyc2VBc3luY0Fycm93V2l0aFR5cGVQYXJhbWV0ZXJzKHN0YXJ0TG9jKSB8fCBhYm9ydCgpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qOjogaW52YXJpYW50KGFycm93Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHRyeVBhcnNlIHR5cGluZ3NcbiAgICAgICAgaWYgKCFhcnJvdy5lcnJvciAmJiAhYXJyb3cuYWJvcnRlZCkgcmV0dXJuIGFycm93Lm5vZGU7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cnlQYXJzZShcbiAgICAgICAgICAoKSA9PiBzdXBlci5wYXJzZVN1YnNjcmlwdHMoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQubm9kZSAmJiAhcmVzdWx0LmVycm9yKSByZXR1cm4gcmVzdWx0Lm5vZGU7XG5cbiAgICAgICAgaWYgKGFycm93Lm5vZGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gYXJyb3cuZmFpbFN0YXRlO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgcmV0dXJuIGFycm93Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0Lm5vZGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gcmVzdWx0LmZhaWxTdGF0ZTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBhcnJvdy5lcnJvciB8fCByZXN1bHQuZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVN1YnNjcmlwdHMoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMpO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIHN1YnNjcmlwdFN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnF1ZXN0aW9uRG90KSAmJiB0aGlzLmlzTG9va2FoZWFkVG9rZW5fbHQoKSkge1xuICAgICAgICBzdWJzY3JpcHRTdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vQ2FsbHMpIHtcbiAgICAgICAgICBzdWJzY3JpcHRTdGF0ZS5zdG9wID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5PcHRpb25hbENhbGxFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICAgIG5vZGUuY2FsbGVlID0gYmFzZTtcbiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICBub2RlLmFyZ3VtZW50cyA9IHRoaXMucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyh0dC5wYXJlblIsIGZhbHNlKTtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKG5vZGUsIC8qIG9wdGlvbmFsICovIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghbm9DYWxscyAmJiB0aGlzLnNob3VsZFBhcnNlVHlwZXMoKSAmJiB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxcbiAgICAgICAgICBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24gfCBOLkNhbGxFeHByZXNzaW9uXG4gICAgICAgID4oc3RhcnRMb2MpO1xuICAgICAgICBub2RlLmNhbGxlZSA9IGJhc2U7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cnlQYXJzZSgoKSA9PiB7XG4gICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzID1cbiAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25DYWxsT3JOZXcoKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICAgIG5vZGUuYXJndW1lbnRzID0gc3VwZXIucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyh0dC5wYXJlblIsIGZhbHNlKTtcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0U3RhdGUub3B0aW9uYWxDaGFpbk1lbWJlcikge1xuICAgICAgICAgICAgKG5vZGUgYXMgVW5kb25lPE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4pLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdFN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5ub2RlKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5ub2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVN1YnNjcmlwdChcbiAgICAgICAgYmFzZSxcblxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgbm9DYWxscyxcbiAgICAgICAgc3Vic2NyaXB0U3RhdGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlTmV3Q2FsbGVlKG5vZGU6IE4uTmV3RXhwcmVzc2lvbik6IHZvaWQge1xuICAgICAgc3VwZXIucGFyc2VOZXdDYWxsZWUobm9kZSk7XG5cbiAgICAgIGxldCB0YXJncyA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zaG91bGRQYXJzZVR5cGVzKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgdGFyZ3MgPSB0aGlzLnRyeVBhcnNlKCgpID0+XG4gICAgICAgICAgdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbkNhbGxPck5ldygpLFxuICAgICAgICApLm5vZGU7XG4gICAgICB9XG4gICAgICBub2RlLnR5cGVBcmd1bWVudHMgPSB0YXJncztcbiAgICB9XG5cbiAgICBwYXJzZUFzeW5jQXJyb3dXaXRoVHlwZVBhcmFtZXRlcnMoXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgdGhpcy5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUsIGZhbHNlKTtcbiAgICAgIGlmICghdGhpcy5wYXJzZUFycm93KG5vZGUpKSByZXR1cm47XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBcnJvd0V4cHJlc3Npb24oXG4gICAgICAgIG5vZGUsXG4gICAgICAgIC8qIHBhcmFtcyAqLyB1bmRlZmluZWQsXG4gICAgICAgIC8qIGlzQXN5bmMgKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgICAgaWYgKFxuICAgICAgICBjb2RlID09PSBjaGFyQ29kZXMuYXN0ZXJpc2sgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnNsYXNoICYmXG4gICAgICAgIHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnN0YXRlLmhhc0Zsb3dDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGUpO1xuICAgIH1cblxuICAgIHJlYWRUb2tlbl9waXBlX2FtcChjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyICYmXG4gICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5yaWdodEN1cmx5QnJhY2VcbiAgICAgICkge1xuICAgICAgICAvLyAnfH0nXG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQuYnJhY2VCYXJSLCAyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5yZWFkVG9rZW5fcGlwZV9hbXAoY29kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VUb3BMZXZlbChmaWxlOiBOLkZpbGUsIHByb2dyYW06IE4uUHJvZ3JhbSk6IE4uRmlsZSB7XG4gICAgICBjb25zdCBmaWxlTm9kZSA9IHN1cGVyLnBhcnNlVG9wTGV2ZWwoZmlsZSwgcHJvZ3JhbSk7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCkge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW50ZXJtaW5hdGVkRmxvd0NvbW1lbnQsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWxlTm9kZTtcbiAgICB9XG5cbiAgICBza2lwQmxvY2tDb21tZW50KCk6IE4uQ29tbWVudEJsb2NrIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImZsb3dDb21tZW50c1wiKSAmJiB0aGlzLnNraXBGbG93Q29tbWVudCgpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmhhc0Zsb3dDb21tZW50KSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLk5lc3RlZEZsb3dDb21tZW50LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc0Zsb3dDb21tZW50Q29tcGxldGlvbigpO1xuICAgICAgICBjb25zdCBjb21tZW50U2tpcCA9IHRoaXMuc2tpcEZsb3dDb21tZW50KCk7XG4gICAgICAgIGlmIChjb21tZW50U2tpcCkge1xuICAgICAgICAgIHRoaXMuc3RhdGUucG9zICs9IGNvbW1lbnRTa2lwO1xuICAgICAgICAgIHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnNraXBCbG9ja0NvbW1lbnQodGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCA/IFwiKi0vXCIgOiBcIiovXCIpO1xuICAgIH1cblxuICAgIHNraXBGbG93Q29tbWVudCgpOiBudW1iZXIgfCBmYWxzZSB7XG4gICAgICBjb25zdCB7IHBvcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGxldCBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlID0gMjtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgW2NoYXJDb2Rlcy5zcGFjZSwgY2hhckNvZGVzLnRhYl0uaW5jbHVkZXMoXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0ZXN0aW5nIHdoZXRoZXIgYSBudW1iZXIgaXMgaW5jbHVkZWRcbiAgICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zICsgc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSksXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlKys7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoMiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zKTtcbiAgICAgIGNvbnN0IGNoMyA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zICsgMSk7XG5cbiAgICAgIGlmIChjaDIgPT09IGNoYXJDb2Rlcy5jb2xvbiAmJiBjaDMgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIDI7IC8vIGNoZWNrIGZvciAvKjo6XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaW5wdXQuc2xpY2UoXG4gICAgICAgICAgc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIHBvcyxcbiAgICAgICAgICBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zICsgMTIsXG4gICAgICAgICkgPT09IFwiZmxvdy1pbmNsdWRlXCJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIDEyOyAvLyBjaGVjayBmb3IgLypmbG93LWluY2x1ZGVcbiAgICAgIH1cbiAgICAgIGlmIChjaDIgPT09IGNoYXJDb2Rlcy5jb2xvbiAmJiBjaDMgIT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZTsgLy8gY2hlY2sgZm9yIC8qOiwgYWR2YW5jZSB1cCB0byA6XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzRmxvd0NvbW1lbnRDb21wbGV0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dC5pbmRleE9mKFwiKi9cIiwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkQ29tbWVudCwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZsb3cgZW51bSBwYXJzaW5nXG5cbiAgICBmbG93RW51bUVycm9yQm9vbGVhbk1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIG1lbWJlck5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICAgIH0sXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUJvb2xlYW5NZW1iZXJOb3RJbml0aWFsaXplZCwge1xuICAgICAgICBhdDogbG9jLFxuICAgICAgICBtZW1iZXJOYW1lLFxuICAgICAgICBlbnVtTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsb3dFbnVtRXJyb3JJbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXIoXG4gICAgICBsb2M6IFBvc2l0aW9uLFxuICAgICAgZW51bUNvbnRleHQ6IEVudW1Db250ZXh0LFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmFpc2UoXG4gICAgICAgICFlbnVtQ29udGV4dC5leHBsaWNpdFR5cGVcbiAgICAgICAgICA/IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclVua25vd25UeXBlXG4gICAgICAgICAgOiBlbnVtQ29udGV4dC5leHBsaWNpdFR5cGUgPT09IFwic3ltYm9sXCJcbiAgICAgICAgICA/IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclN5bWJvbFR5cGVcbiAgICAgICAgICA6IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclByaW1hcnlUeXBlLFxuICAgICAgICB7XG4gICAgICAgICAgYXQ6IGxvYyxcbiAgICAgICAgICAuLi5lbnVtQ29udGV4dCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZmxvd0VudW1FcnJvck51bWJlck1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIG1lbWJlck5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICAgIH0sXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bU51bWJlck1lbWJlck5vdEluaXRpYWxpemVkLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGVudW1OYW1lLFxuICAgICAgICBtZW1iZXJOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxvd0VudW1FcnJvclN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQoXG4gICAgICBub2RlOiBOLk5vZGUsXG4gICAgICB7XG4gICAgICAgIGVudW1OYW1lLFxuICAgICAgfToge1xuICAgICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICApOiB2b2lkIHtcbiAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5FbnVtU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZCwge1xuICAgICAgICBhdDogbm9kZSxcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmbG93RW51bU1lbWJlckluaXQoKTogRW51bU1lbWJlckluaXQge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgY29uc3QgZW5kT2ZJbml0ID0gKCkgPT4gdGhpcy5tYXRjaCh0dC5jb21tYSkgfHwgdGhpcy5tYXRjaCh0dC5icmFjZVIpO1xuICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSB0dC5udW06IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID0gdGhpcy5wYXJzZU51bWVyaWNMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgICAgIGlmIChlbmRPZkluaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJudW1iZXJcIiwgbG9jOiBsaXRlcmFsLmxvYy5zdGFydCwgdmFsdWU6IGxpdGVyYWwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbnZhbGlkXCIsIGxvYzogc3RhcnRMb2MgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHR0LnN0cmluZzoge1xuICAgICAgICAgIGNvbnN0IGxpdGVyYWwgPSB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICAgICAgICBpZiAoZW5kT2ZJbml0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIGxvYzogbGl0ZXJhbC5sb2Muc3RhcnQsIHZhbHVlOiBsaXRlcmFsIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW52YWxpZFwiLCBsb2M6IHN0YXJ0TG9jIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSB0dC5fdHJ1ZTpcbiAgICAgICAgY2FzZSB0dC5fZmFsc2U6IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID0gdGhpcy5wYXJzZUJvb2xlYW5MaXRlcmFsKHRoaXMubWF0Y2godHQuX3RydWUpKTtcbiAgICAgICAgICBpZiAoZW5kT2ZJbml0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgICBsb2M6IGxpdGVyYWwubG9jLnN0YXJ0LFxuICAgICAgICAgICAgICB2YWx1ZTogbGl0ZXJhbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW52YWxpZFwiLCBsb2M6IHN0YXJ0TG9jIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImludmFsaWRcIiwgbG9jOiBzdGFydExvYyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dFbnVtTWVtYmVyUmF3KCk6IHtcbiAgICAgIGlkOiBOLk5vZGU7XG4gICAgICBpbml0OiBFbnVtTWVtYmVySW5pdDtcbiAgICB9IHtcbiAgICAgIGNvbnN0IGxvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgY29uc3QgaW5pdCA9IHRoaXMuZWF0KHR0LmVxKVxuICAgICAgICA/IHRoaXMuZmxvd0VudW1NZW1iZXJJbml0KClcbiAgICAgICAgOiB7IHR5cGU6IFwibm9uZVwiIGFzIGNvbnN0LCBsb2MgfTtcbiAgICAgIHJldHVybiB7IGlkLCBpbml0IH07XG4gICAgfVxuXG4gICAgZmxvd0VudW1DaGVja0V4cGxpY2l0VHlwZU1pc21hdGNoKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIGNvbnRleHQ6IEVudW1Db250ZXh0LFxuICAgICAgZXhwZWN0ZWRUeXBlOiBFbnVtRXhwbGljaXRUeXBlLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgeyBleHBsaWNpdFR5cGUgfSA9IGNvbnRleHQ7XG4gICAgICBpZiAoZXhwbGljaXRUeXBlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChleHBsaWNpdFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JJbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXIobG9jLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93RW51bU1lbWJlcnMoe1xuICAgICAgZW51bU5hbWUsXG4gICAgICBleHBsaWNpdFR5cGUsXG4gICAgfToge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgICB9KToge1xuICAgICAgbWVtYmVyczoge1xuICAgICAgICBib29sZWFuTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgbnVtYmVyTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgc3RyaW5nTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgZGVmYXVsdGVkTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgIH07XG4gICAgICBoYXNVbmtub3duTWVtYmVyczogYm9vbGVhbjtcbiAgICB9IHtcbiAgICAgIGNvbnN0IHNlZW5OYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgYm9vbGVhbk1lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIG51bWJlck1lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIHN0cmluZ01lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIGRlZmF1bHRlZE1lbWJlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIGxldCBoYXNVbmtub3duTWVtYmVycyA9IGZhbHNlO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmVsbGlwc2lzKSkge1xuICAgICAgICAgIGhhc1Vua25vd25NZW1iZXJzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZW1iZXJOb2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgY29uc3QgeyBpZCwgaW5pdCB9ID0gdGhpcy5mbG93RW51bU1lbWJlclJhdygpO1xuICAgICAgICBjb25zdCBtZW1iZXJOYW1lID0gaWQubmFtZTtcbiAgICAgICAgaWYgKG1lbWJlck5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoL15bYS16XS8udGVzdChtZW1iZXJOYW1lKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5FbnVtSW52YWxpZE1lbWJlck5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBpZCxcbiAgICAgICAgICAgIG1lbWJlck5hbWUsXG4gICAgICAgICAgICBzdWdnZXN0aW9uOiBtZW1iZXJOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBtZW1iZXJOYW1lLnNsaWNlKDEpLFxuICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZW5OYW1lcy5oYXMobWVtYmVyTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUR1cGxpY2F0ZU1lbWJlck5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBpZCxcbiAgICAgICAgICAgIG1lbWJlck5hbWUsXG4gICAgICAgICAgICBlbnVtTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuTmFtZXMuYWRkKG1lbWJlck5hbWUpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0geyBlbnVtTmFtZSwgZXhwbGljaXRUeXBlLCBtZW1iZXJOYW1lIH07XG4gICAgICAgIG1lbWJlck5vZGUuaWQgPSBpZDtcbiAgICAgICAgc3dpdGNoIChpbml0LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgICAgICB0aGlzLmZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaChcbiAgICAgICAgICAgICAgaW5pdC5sb2MsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1lbWJlck5vZGUuaW5pdCA9IGluaXQudmFsdWU7XG4gICAgICAgICAgICBtZW1iZXJzLmJvb2xlYW5NZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTm9kZShtZW1iZXJOb2RlLCBcIkVudW1Cb29sZWFuTWVtYmVyXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICAgIHRoaXMuZmxvd0VudW1DaGVja0V4cGxpY2l0VHlwZU1pc21hdGNoKGluaXQubG9jLCBjb250ZXh0LCBcIm51bWJlclwiKTtcbiAgICAgICAgICAgIG1lbWJlck5vZGUuaW5pdCA9IGluaXQudmFsdWU7XG4gICAgICAgICAgICBtZW1iZXJzLm51bWJlck1lbWJlcnMucHVzaChcbiAgICAgICAgICAgICAgdGhpcy5maW5pc2hOb2RlKG1lbWJlck5vZGUsIFwiRW51bU51bWJlck1lbWJlclwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiB7XG4gICAgICAgICAgICB0aGlzLmZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaChpbml0LmxvYywgY29udGV4dCwgXCJzdHJpbmdcIik7XG4gICAgICAgICAgICBtZW1iZXJOb2RlLmluaXQgPSBpbml0LnZhbHVlO1xuICAgICAgICAgICAgbWVtYmVycy5zdHJpbmdNZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTm9kZShtZW1iZXJOb2RlLCBcIkVudW1TdHJpbmdNZW1iZXJcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJpbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZmxvd0VudW1FcnJvckludmFsaWRNZW1iZXJJbml0aWFsaXplcihpbml0LmxvYywgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJub25lXCI6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXhwbGljaXRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93RW51bUVycm9yQm9vbGVhbk1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgICAgICAgICAgICAgaW5pdC5sb2MsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JOdW1iZXJNZW1iZXJOb3RJbml0aWFsaXplZChpbml0LmxvYywgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaE5vZGUobWVtYmVyTm9kZSwgXCJFbnVtRGVmYXVsdGVkTWVtYmVyXCIpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1lbWJlcnMsIGhhc1Vua25vd25NZW1iZXJzIH07XG4gICAgfVxuXG4gICAgZmxvd0VudW1TdHJpbmdNZW1iZXJzKFxuICAgICAgaW5pdGlhbGl6ZWRNZW1iZXJzOiBBcnJheTxOLk5vZGU+LFxuICAgICAgZGVmYXVsdGVkTWVtYmVyczogQXJyYXk8Ti5Ob2RlPixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICB9LFxuICAgICk6IEFycmF5PE4uTm9kZT4ge1xuICAgICAgaWYgKGluaXRpYWxpemVkTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRlZE1lbWJlcnM7XG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRlZE1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplZE1lbWJlcnM7XG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRlZE1lbWJlcnMubGVuZ3RoID4gaW5pdGlhbGl6ZWRNZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBpbml0aWFsaXplZE1lbWJlcnMpIHtcbiAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JTdHJpbmdNZW1iZXJJbmNvbnNpc3RlbnRseUluaXRhaWxpemVkKG1lbWJlciwge1xuICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRlZE1lbWJlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBkZWZhdWx0ZWRNZW1iZXJzKSB7XG4gICAgICAgICAgdGhpcy5mbG93RW51bUVycm9yU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZChtZW1iZXIsIHtcbiAgICAgICAgICAgIGVudW1OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplZE1lbWJlcnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmxvd0VudW1QYXJzZUV4cGxpY2l0VHlwZSh7XG4gICAgICBlbnVtTmFtZSxcbiAgICB9OiB7XG4gICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgIH0pOiBFbnVtRXhwbGljaXRUeXBlIHtcbiAgICAgIGlmICghdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9vZikpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLkVudW1JbnZhbGlkRXhwbGljaXRUeXBlVW5rbm93blN1cHBsaWVkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgIT09IFwiYm9vbGVhblwiICYmXG4gICAgICAgIHZhbHVlICE9PSBcIm51bWJlclwiICYmXG4gICAgICAgIHZhbHVlICE9PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHZhbHVlICE9PSBcInN5bWJvbFwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkVudW1JbnZhbGlkRXhwbGljaXRUeXBlLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgaW52YWxpZEVudW1UeXBlOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmbG93RW51bUJvZHkobm9kZTogVW5kb25lPE4uTm9kZT4sIGlkOiBOLk5vZGUpOiBOLk5vZGUge1xuICAgICAgY29uc3QgZW51bU5hbWUgPSBpZC5uYW1lO1xuICAgICAgY29uc3QgbmFtZUxvYyA9IGlkLmxvYy5zdGFydDtcbiAgICAgIGNvbnN0IGV4cGxpY2l0VHlwZSA9IHRoaXMuZmxvd0VudW1QYXJzZUV4cGxpY2l0VHlwZSh7IGVudW1OYW1lIH0pO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcbiAgICAgIGNvbnN0IHsgbWVtYmVycywgaGFzVW5rbm93bk1lbWJlcnMgfSA9IHRoaXMuZmxvd0VudW1NZW1iZXJzKHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIGV4cGxpY2l0VHlwZSxcbiAgICAgIH0pO1xuICAgICAgbm9kZS5oYXNVbmtub3duTWVtYmVycyA9IGhhc1Vua25vd25NZW1iZXJzO1xuXG4gICAgICBzd2l0Y2ggKGV4cGxpY2l0VHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLmJvb2xlYW5NZW1iZXJzO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1Cb29sZWFuQm9keVwiKTtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLm51bWJlck1lbWJlcnM7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bU51bWJlckJvZHlcIik7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICBub2RlLmV4cGxpY2l0VHlwZSA9IHRydWU7XG4gICAgICAgICAgbm9kZS5tZW1iZXJzID0gdGhpcy5mbG93RW51bVN0cmluZ01lbWJlcnMoXG4gICAgICAgICAgICBtZW1iZXJzLnN0cmluZ01lbWJlcnMsXG4gICAgICAgICAgICBtZW1iZXJzLmRlZmF1bHRlZE1lbWJlcnMsXG4gICAgICAgICAgICB7IGVudW1OYW1lIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbnVtU3RyaW5nQm9keVwiKTtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIG5vZGUubWVtYmVycyA9IG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycztcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbnVtU3ltYm9sQm9keVwiKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIGBleHBsaWNpdFR5cGVgIGlzIGBudWxsYFxuICAgICAgICAgIGNvbnN0IGVtcHR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgbm9kZS5tZW1iZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1TdHJpbmdCb2R5XCIpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5leHBsaWNpdFR5cGUgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGJvb2xzTGVuID0gbWVtYmVycy5ib29sZWFuTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbnVtc0xlbiA9IG1lbWJlcnMubnVtYmVyTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgc3Ryc0xlbiA9IG1lbWJlcnMuc3RyaW5nTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdGVkTGVuID0gbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghYm9vbHNMZW4gJiYgIW51bXNMZW4gJiYgIXN0cnNMZW4gJiYgIWRlZmF1bHRlZExlbikge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghYm9vbHNMZW4gJiYgIW51bXNMZW4pIHtcbiAgICAgICAgICAgIG5vZGUubWVtYmVycyA9IHRoaXMuZmxvd0VudW1TdHJpbmdNZW1iZXJzKFxuICAgICAgICAgICAgICBtZW1iZXJzLnN0cmluZ01lbWJlcnMsXG4gICAgICAgICAgICAgIG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycyxcbiAgICAgICAgICAgICAgeyBlbnVtTmFtZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bVN0cmluZ0JvZHlcIik7XG4gICAgICAgICAgfSBlbHNlIGlmICghbnVtc0xlbiAmJiAhc3Ryc0xlbiAmJiBib29sc0xlbiA+PSBkZWZhdWx0ZWRMZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycykge1xuICAgICAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JCb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQobWVtYmVyLmxvYy5zdGFydCwge1xuICAgICAgICAgICAgICAgIGVudW1OYW1lLFxuICAgICAgICAgICAgICAgIG1lbWJlck5hbWU6IG1lbWJlci5pZC5uYW1lLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUubWVtYmVycyA9IG1lbWJlcnMuYm9vbGVhbk1lbWJlcnM7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1Cb29sZWFuQm9keVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFib29sc0xlbiAmJiAhc3Ryc0xlbiAmJiBudW1zTGVuID49IGRlZmF1bHRlZExlbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmxvd0VudW1FcnJvck51bWJlck1lbWJlck5vdEluaXRpYWxpemVkKG1lbWJlci5sb2Muc3RhcnQsIHtcbiAgICAgICAgICAgICAgICBlbnVtTmFtZSxcbiAgICAgICAgICAgICAgICBtZW1iZXJOYW1lOiBtZW1iZXIuaWQubmFtZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLm51bWJlck1lbWJlcnM7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1OdW1iZXJCb2R5XCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUluY29uc2lzdGVudE1lbWJlclZhbHVlcywge1xuICAgICAgICAgICAgICBhdDogbmFtZUxvYyxcbiAgICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbihub2RlOiBVbmRvbmU8Ti5Ob2RlPik6IE4uTm9kZSB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBub2RlLmlkID0gaWQ7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZsb3dFbnVtQm9keSh0aGlzLnN0YXJ0Tm9kZSgpLCBpZCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bURlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IHRva2VuIGlzIGEgdHQubHRcbiAgICBpc0xvb2thaGVhZFRva2VuX2x0KCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmV4dFRva2VuU3RhcnQoKTtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCkgPT09IGNoYXJDb2Rlcy5sZXNzVGhhbikge1xuICAgICAgICBjb25zdCBhZnRlck5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCArIDEpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGFmdGVyTmV4dCAhPT0gY2hhckNvZGVzLmxlc3NUaGFuICYmIGFmdGVyTmV4dCAhPT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWF5YmVVbndyYXBUeXBlQ2FzdEV4cHJlc3Npb24obm9kZTogTi5Ob2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiID8gbm9kZS5leHByZXNzaW9uIDogbm9kZTtcbiAgICB9XG4gIH07XG4iLCAiY29uc3QgZW50aXRpZXM6IHtcbiAgX19wcm90b19fOiBudWxsO1xuICBbbmFtZTogc3RyaW5nXTogc3RyaW5nO1xufSA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBxdW90OiBcIlxcdTAwMjJcIixcbiAgYW1wOiBcIiZcIixcbiAgYXBvczogXCJcXHUwMDI3XCIsXG4gIGx0OiBcIjxcIixcbiAgZ3Q6IFwiPlwiLFxuICBuYnNwOiBcIlxcdTAwQTBcIixcbiAgaWV4Y2w6IFwiXFx1MDBBMVwiLFxuICBjZW50OiBcIlxcdTAwQTJcIixcbiAgcG91bmQ6IFwiXFx1MDBBM1wiLFxuICBjdXJyZW46IFwiXFx1MDBBNFwiLFxuICB5ZW46IFwiXFx1MDBBNVwiLFxuICBicnZiYXI6IFwiXFx1MDBBNlwiLFxuICBzZWN0OiBcIlxcdTAwQTdcIixcbiAgdW1sOiBcIlxcdTAwQThcIixcbiAgY29weTogXCJcXHUwMEE5XCIsXG4gIG9yZGY6IFwiXFx1MDBBQVwiLFxuICBsYXF1bzogXCJcXHUwMEFCXCIsXG4gIG5vdDogXCJcXHUwMEFDXCIsXG4gIHNoeTogXCJcXHUwMEFEXCIsXG4gIHJlZzogXCJcXHUwMEFFXCIsXG4gIG1hY3I6IFwiXFx1MDBBRlwiLFxuICBkZWc6IFwiXFx1MDBCMFwiLFxuICBwbHVzbW46IFwiXFx1MDBCMVwiLFxuICBzdXAyOiBcIlxcdTAwQjJcIixcbiAgc3VwMzogXCJcXHUwMEIzXCIsXG4gIGFjdXRlOiBcIlxcdTAwQjRcIixcbiAgbWljcm86IFwiXFx1MDBCNVwiLFxuICBwYXJhOiBcIlxcdTAwQjZcIixcbiAgbWlkZG90OiBcIlxcdTAwQjdcIixcbiAgY2VkaWw6IFwiXFx1MDBCOFwiLFxuICBzdXAxOiBcIlxcdTAwQjlcIixcbiAgb3JkbTogXCJcXHUwMEJBXCIsXG4gIHJhcXVvOiBcIlxcdTAwQkJcIixcbiAgZnJhYzE0OiBcIlxcdTAwQkNcIixcbiAgZnJhYzEyOiBcIlxcdTAwQkRcIixcbiAgZnJhYzM0OiBcIlxcdTAwQkVcIixcbiAgaXF1ZXN0OiBcIlxcdTAwQkZcIixcbiAgQWdyYXZlOiBcIlxcdTAwQzBcIixcbiAgQWFjdXRlOiBcIlxcdTAwQzFcIixcbiAgQWNpcmM6IFwiXFx1MDBDMlwiLFxuICBBdGlsZGU6IFwiXFx1MDBDM1wiLFxuICBBdW1sOiBcIlxcdTAwQzRcIixcbiAgQXJpbmc6IFwiXFx1MDBDNVwiLFxuICBBRWxpZzogXCJcXHUwMEM2XCIsXG4gIENjZWRpbDogXCJcXHUwMEM3XCIsXG4gIEVncmF2ZTogXCJcXHUwMEM4XCIsXG4gIEVhY3V0ZTogXCJcXHUwMEM5XCIsXG4gIEVjaXJjOiBcIlxcdTAwQ0FcIixcbiAgRXVtbDogXCJcXHUwMENCXCIsXG4gIElncmF2ZTogXCJcXHUwMENDXCIsXG4gIElhY3V0ZTogXCJcXHUwMENEXCIsXG4gIEljaXJjOiBcIlxcdTAwQ0VcIixcbiAgSXVtbDogXCJcXHUwMENGXCIsXG4gIEVUSDogXCJcXHUwMEQwXCIsXG4gIE50aWxkZTogXCJcXHUwMEQxXCIsXG4gIE9ncmF2ZTogXCJcXHUwMEQyXCIsXG4gIE9hY3V0ZTogXCJcXHUwMEQzXCIsXG4gIE9jaXJjOiBcIlxcdTAwRDRcIixcbiAgT3RpbGRlOiBcIlxcdTAwRDVcIixcbiAgT3VtbDogXCJcXHUwMEQ2XCIsXG4gIHRpbWVzOiBcIlxcdTAwRDdcIixcbiAgT3NsYXNoOiBcIlxcdTAwRDhcIixcbiAgVWdyYXZlOiBcIlxcdTAwRDlcIixcbiAgVWFjdXRlOiBcIlxcdTAwREFcIixcbiAgVWNpcmM6IFwiXFx1MDBEQlwiLFxuICBVdW1sOiBcIlxcdTAwRENcIixcbiAgWWFjdXRlOiBcIlxcdTAwRERcIixcbiAgVEhPUk46IFwiXFx1MDBERVwiLFxuICBzemxpZzogXCJcXHUwMERGXCIsXG4gIGFncmF2ZTogXCJcXHUwMEUwXCIsXG4gIGFhY3V0ZTogXCJcXHUwMEUxXCIsXG4gIGFjaXJjOiBcIlxcdTAwRTJcIixcbiAgYXRpbGRlOiBcIlxcdTAwRTNcIixcbiAgYXVtbDogXCJcXHUwMEU0XCIsXG4gIGFyaW5nOiBcIlxcdTAwRTVcIixcbiAgYWVsaWc6IFwiXFx1MDBFNlwiLFxuICBjY2VkaWw6IFwiXFx1MDBFN1wiLFxuICBlZ3JhdmU6IFwiXFx1MDBFOFwiLFxuICBlYWN1dGU6IFwiXFx1MDBFOVwiLFxuICBlY2lyYzogXCJcXHUwMEVBXCIsXG4gIGV1bWw6IFwiXFx1MDBFQlwiLFxuICBpZ3JhdmU6IFwiXFx1MDBFQ1wiLFxuICBpYWN1dGU6IFwiXFx1MDBFRFwiLFxuICBpY2lyYzogXCJcXHUwMEVFXCIsXG4gIGl1bWw6IFwiXFx1MDBFRlwiLFxuICBldGg6IFwiXFx1MDBGMFwiLFxuICBudGlsZGU6IFwiXFx1MDBGMVwiLFxuICBvZ3JhdmU6IFwiXFx1MDBGMlwiLFxuICBvYWN1dGU6IFwiXFx1MDBGM1wiLFxuICBvY2lyYzogXCJcXHUwMEY0XCIsXG4gIG90aWxkZTogXCJcXHUwMEY1XCIsXG4gIG91bWw6IFwiXFx1MDBGNlwiLFxuICBkaXZpZGU6IFwiXFx1MDBGN1wiLFxuICBvc2xhc2g6IFwiXFx1MDBGOFwiLFxuICB1Z3JhdmU6IFwiXFx1MDBGOVwiLFxuICB1YWN1dGU6IFwiXFx1MDBGQVwiLFxuICB1Y2lyYzogXCJcXHUwMEZCXCIsXG4gIHV1bWw6IFwiXFx1MDBGQ1wiLFxuICB5YWN1dGU6IFwiXFx1MDBGRFwiLFxuICB0aG9ybjogXCJcXHUwMEZFXCIsXG4gIHl1bWw6IFwiXFx1MDBGRlwiLFxuICBPRWxpZzogXCJcXHUwMTUyXCIsXG4gIG9lbGlnOiBcIlxcdTAxNTNcIixcbiAgU2Nhcm9uOiBcIlxcdTAxNjBcIixcbiAgc2Nhcm9uOiBcIlxcdTAxNjFcIixcbiAgWXVtbDogXCJcXHUwMTc4XCIsXG4gIGZub2Y6IFwiXFx1MDE5MlwiLFxuICBjaXJjOiBcIlxcdTAyQzZcIixcbiAgdGlsZGU6IFwiXFx1MDJEQ1wiLFxuICBBbHBoYTogXCJcXHUwMzkxXCIsXG4gIEJldGE6IFwiXFx1MDM5MlwiLFxuICBHYW1tYTogXCJcXHUwMzkzXCIsXG4gIERlbHRhOiBcIlxcdTAzOTRcIixcbiAgRXBzaWxvbjogXCJcXHUwMzk1XCIsXG4gIFpldGE6IFwiXFx1MDM5NlwiLFxuICBFdGE6IFwiXFx1MDM5N1wiLFxuICBUaGV0YTogXCJcXHUwMzk4XCIsXG4gIElvdGE6IFwiXFx1MDM5OVwiLFxuICBLYXBwYTogXCJcXHUwMzlBXCIsXG4gIExhbWJkYTogXCJcXHUwMzlCXCIsXG4gIE11OiBcIlxcdTAzOUNcIixcbiAgTnU6IFwiXFx1MDM5RFwiLFxuICBYaTogXCJcXHUwMzlFXCIsXG4gIE9taWNyb246IFwiXFx1MDM5RlwiLFxuICBQaTogXCJcXHUwM0EwXCIsXG4gIFJobzogXCJcXHUwM0ExXCIsXG4gIFNpZ21hOiBcIlxcdTAzQTNcIixcbiAgVGF1OiBcIlxcdTAzQTRcIixcbiAgVXBzaWxvbjogXCJcXHUwM0E1XCIsXG4gIFBoaTogXCJcXHUwM0E2XCIsXG4gIENoaTogXCJcXHUwM0E3XCIsXG4gIFBzaTogXCJcXHUwM0E4XCIsXG4gIE9tZWdhOiBcIlxcdTAzQTlcIixcbiAgYWxwaGE6IFwiXFx1MDNCMVwiLFxuICBiZXRhOiBcIlxcdTAzQjJcIixcbiAgZ2FtbWE6IFwiXFx1MDNCM1wiLFxuICBkZWx0YTogXCJcXHUwM0I0XCIsXG4gIGVwc2lsb246IFwiXFx1MDNCNVwiLFxuICB6ZXRhOiBcIlxcdTAzQjZcIixcbiAgZXRhOiBcIlxcdTAzQjdcIixcbiAgdGhldGE6IFwiXFx1MDNCOFwiLFxuICBpb3RhOiBcIlxcdTAzQjlcIixcbiAga2FwcGE6IFwiXFx1MDNCQVwiLFxuICBsYW1iZGE6IFwiXFx1MDNCQlwiLFxuICBtdTogXCJcXHUwM0JDXCIsXG4gIG51OiBcIlxcdTAzQkRcIixcbiAgeGk6IFwiXFx1MDNCRVwiLFxuICBvbWljcm9uOiBcIlxcdTAzQkZcIixcbiAgcGk6IFwiXFx1MDNDMFwiLFxuICByaG86IFwiXFx1MDNDMVwiLFxuICBzaWdtYWY6IFwiXFx1MDNDMlwiLFxuICBzaWdtYTogXCJcXHUwM0MzXCIsXG4gIHRhdTogXCJcXHUwM0M0XCIsXG4gIHVwc2lsb246IFwiXFx1MDNDNVwiLFxuICBwaGk6IFwiXFx1MDNDNlwiLFxuICBjaGk6IFwiXFx1MDNDN1wiLFxuICBwc2k6IFwiXFx1MDNDOFwiLFxuICBvbWVnYTogXCJcXHUwM0M5XCIsXG4gIHRoZXRhc3ltOiBcIlxcdTAzRDFcIixcbiAgdXBzaWg6IFwiXFx1MDNEMlwiLFxuICBwaXY6IFwiXFx1MDNENlwiLFxuICBlbnNwOiBcIlxcdTIwMDJcIixcbiAgZW1zcDogXCJcXHUyMDAzXCIsXG4gIHRoaW5zcDogXCJcXHUyMDA5XCIsXG4gIHp3bmo6IFwiXFx1MjAwQ1wiLFxuICB6d2o6IFwiXFx1MjAwRFwiLFxuICBscm06IFwiXFx1MjAwRVwiLFxuICBybG06IFwiXFx1MjAwRlwiLFxuICBuZGFzaDogXCJcXHUyMDEzXCIsXG4gIG1kYXNoOiBcIlxcdTIwMTRcIixcbiAgbHNxdW86IFwiXFx1MjAxOFwiLFxuICByc3F1bzogXCJcXHUyMDE5XCIsXG4gIHNicXVvOiBcIlxcdTIwMUFcIixcbiAgbGRxdW86IFwiXFx1MjAxQ1wiLFxuICByZHF1bzogXCJcXHUyMDFEXCIsXG4gIGJkcXVvOiBcIlxcdTIwMUVcIixcbiAgZGFnZ2VyOiBcIlxcdTIwMjBcIixcbiAgRGFnZ2VyOiBcIlxcdTIwMjFcIixcbiAgYnVsbDogXCJcXHUyMDIyXCIsXG4gIGhlbGxpcDogXCJcXHUyMDI2XCIsXG4gIHBlcm1pbDogXCJcXHUyMDMwXCIsXG4gIHByaW1lOiBcIlxcdTIwMzJcIixcbiAgUHJpbWU6IFwiXFx1MjAzM1wiLFxuICBsc2FxdW86IFwiXFx1MjAzOVwiLFxuICByc2FxdW86IFwiXFx1MjAzQVwiLFxuICBvbGluZTogXCJcXHUyMDNFXCIsXG4gIGZyYXNsOiBcIlxcdTIwNDRcIixcbiAgZXVybzogXCJcXHUyMEFDXCIsXG4gIGltYWdlOiBcIlxcdTIxMTFcIixcbiAgd2VpZXJwOiBcIlxcdTIxMThcIixcbiAgcmVhbDogXCJcXHUyMTFDXCIsXG4gIHRyYWRlOiBcIlxcdTIxMjJcIixcbiAgYWxlZnN5bTogXCJcXHUyMTM1XCIsXG4gIGxhcnI6IFwiXFx1MjE5MFwiLFxuICB1YXJyOiBcIlxcdTIxOTFcIixcbiAgcmFycjogXCJcXHUyMTkyXCIsXG4gIGRhcnI6IFwiXFx1MjE5M1wiLFxuICBoYXJyOiBcIlxcdTIxOTRcIixcbiAgY3JhcnI6IFwiXFx1MjFCNVwiLFxuICBsQXJyOiBcIlxcdTIxRDBcIixcbiAgdUFycjogXCJcXHUyMUQxXCIsXG4gIHJBcnI6IFwiXFx1MjFEMlwiLFxuICBkQXJyOiBcIlxcdTIxRDNcIixcbiAgaEFycjogXCJcXHUyMUQ0XCIsXG4gIGZvcmFsbDogXCJcXHUyMjAwXCIsXG4gIHBhcnQ6IFwiXFx1MjIwMlwiLFxuICBleGlzdDogXCJcXHUyMjAzXCIsXG4gIGVtcHR5OiBcIlxcdTIyMDVcIixcbiAgbmFibGE6IFwiXFx1MjIwN1wiLFxuICBpc2luOiBcIlxcdTIyMDhcIixcbiAgbm90aW46IFwiXFx1MjIwOVwiLFxuICBuaTogXCJcXHUyMjBCXCIsXG4gIHByb2Q6IFwiXFx1MjIwRlwiLFxuICBzdW06IFwiXFx1MjIxMVwiLFxuICBtaW51czogXCJcXHUyMjEyXCIsXG4gIGxvd2FzdDogXCJcXHUyMjE3XCIsXG4gIHJhZGljOiBcIlxcdTIyMUFcIixcbiAgcHJvcDogXCJcXHUyMjFEXCIsXG4gIGluZmluOiBcIlxcdTIyMUVcIixcbiAgYW5nOiBcIlxcdTIyMjBcIixcbiAgYW5kOiBcIlxcdTIyMjdcIixcbiAgb3I6IFwiXFx1MjIyOFwiLFxuICBjYXA6IFwiXFx1MjIyOVwiLFxuICBjdXA6IFwiXFx1MjIyQVwiLFxuICBpbnQ6IFwiXFx1MjIyQlwiLFxuICB0aGVyZTQ6IFwiXFx1MjIzNFwiLFxuICBzaW06IFwiXFx1MjIzQ1wiLFxuICBjb25nOiBcIlxcdTIyNDVcIixcbiAgYXN5bXA6IFwiXFx1MjI0OFwiLFxuICBuZTogXCJcXHUyMjYwXCIsXG4gIGVxdWl2OiBcIlxcdTIyNjFcIixcbiAgbGU6IFwiXFx1MjI2NFwiLFxuICBnZTogXCJcXHUyMjY1XCIsXG4gIHN1YjogXCJcXHUyMjgyXCIsXG4gIHN1cDogXCJcXHUyMjgzXCIsXG4gIG5zdWI6IFwiXFx1MjI4NFwiLFxuICBzdWJlOiBcIlxcdTIyODZcIixcbiAgc3VwZTogXCJcXHUyMjg3XCIsXG4gIG9wbHVzOiBcIlxcdTIyOTVcIixcbiAgb3RpbWVzOiBcIlxcdTIyOTdcIixcbiAgcGVycDogXCJcXHUyMkE1XCIsXG4gIHNkb3Q6IFwiXFx1MjJDNVwiLFxuICBsY2VpbDogXCJcXHUyMzA4XCIsXG4gIHJjZWlsOiBcIlxcdTIzMDlcIixcbiAgbGZsb29yOiBcIlxcdTIzMEFcIixcbiAgcmZsb29yOiBcIlxcdTIzMEJcIixcbiAgbGFuZzogXCJcXHUyMzI5XCIsXG4gIHJhbmc6IFwiXFx1MjMyQVwiLFxuICBsb3o6IFwiXFx1MjVDQVwiLFxuICBzcGFkZXM6IFwiXFx1MjY2MFwiLFxuICBjbHViczogXCJcXHUyNjYzXCIsXG4gIGhlYXJ0czogXCJcXHUyNjY1XCIsXG4gIGRpYW1zOiBcIlxcdTI2NjZcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgZGVmYXVsdCBlbnRpdGllcztcbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG5pbXBvcnQgWEhUTUxFbnRpdGllcyBmcm9tIFwiLi94aHRtbFwiO1xuaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuLi8uLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHtcbiAgdG9rZW5Db21lc0JlZm9yZUV4cHJlc3Npb24sXG4gIHRva2VuSXNLZXl3b3JkLFxuICB0b2tlbkxhYmVsTmFtZSxcbiAgdHlwZSBUb2tlblR5cGUsXG4gIHR0LFxufSBmcm9tIFwiLi4vLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFRva0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vdG9rZW5pemVyL2NvbnRleHRcIjtcbmltcG9ydCB7IHR5cGVzIGFzIHRjIH0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJDaGFyLCBpc0lkZW50aWZpZXJTdGFydCB9IGZyb20gXCIuLi8uLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHsgaXNOZXdMaW5lIH0gZnJvbSBcIi4uLy4uL3V0aWwvd2hpdGVzcGFjZVwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL25vZGVcIjtcblxuLyogZXNsaW50IHNvcnQta2V5czogXCJlcnJvclwiICovXG5jb25zdCBKc3hFcnJvcnMgPSBQYXJzZUVycm9yRW51bWBqc3hgKHtcbiAgQXR0cmlidXRlSXNFbXB0eTpcbiAgICBcIkpTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uLlwiLFxuICBNaXNzaW5nQ2xvc2luZ1RhZ0VsZW1lbnQ6ICh7IG9wZW5pbmdUYWdOYW1lIH06IHsgb3BlbmluZ1RhZ05hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPCR7b3BlbmluZ1RhZ05hbWV9Pi5gLFxuICBNaXNzaW5nQ2xvc2luZ1RhZ0ZyYWdtZW50OiBcIkV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8Pi5cIixcbiAgVW5leHBlY3RlZFNlcXVlbmNlRXhwcmVzc2lvbjpcbiAgICBcIlNlcXVlbmNlIGV4cHJlc3Npb25zIGNhbm5vdCBiZSBkaXJlY3RseSBuZXN0ZWQgaW5zaWRlIEpTWC4gRGlkIHlvdSBtZWFuIHRvIHdyYXAgaXQgaW4gcGFyZW50aGVzZXMgKC4uLik/XCIsXG4gIC8vIEZJWE1FOiBVbmlmeSB3aXRoIEVycm9ycy5VbmV4cGVjdGVkVG9rZW5cbiAgVW5leHBlY3RlZFRva2VuOiAoe1xuICAgIHVuZXhwZWN0ZWQsXG4gICAgSFRNTEVudGl0eSxcbiAgfToge1xuICAgIHVuZXhwZWN0ZWQ6IHN0cmluZztcbiAgICBIVE1MRW50aXR5OiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQgdG9rZW4gXFxgJHt1bmV4cGVjdGVkfVxcYC4gRGlkIHlvdSBtZWFuIFxcYCR7SFRNTEVudGl0eX1cXGAgb3IgXFxgeycke3VuZXhwZWN0ZWR9J31cXGA/YCxcbiAgVW5zdXBwb3J0ZWRKc3hWYWx1ZTpcbiAgICBcIkpTWCB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIGFuIGV4cHJlc3Npb24gb3IgYSBxdW90ZWQgSlNYIHRleHQuXCIsXG4gIFVudGVybWluYXRlZEpzeENvbnRlbnQ6IFwiVW50ZXJtaW5hdGVkIEpTWCBjb250ZW50cy5cIixcbiAgVW53cmFwcGVkQWRqYWNlbnRKU1hFbGVtZW50czpcbiAgICBcIkFkamFjZW50IEpTWCBlbGVtZW50cyBtdXN0IGJlIHdyYXBwZWQgaW4gYW4gZW5jbG9zaW5nIHRhZy4gRGlkIHlvdSB3YW50IGEgSlNYIGZyYWdtZW50IDw+Li4uPC8+P1wiLFxufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIHNvcnQta2V5cyAqL1xuXG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdD86IE4uSlNYRWxlbWVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iamVjdFxuICAgID8gb2JqZWN0LnR5cGUgPT09IFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIgfHxcbiAgICAgICAgb2JqZWN0LnR5cGUgPT09IFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCJcbiAgICA6IGZhbHNlO1xufVxuXG4vLyBUcmFuc2Zvcm1zIEpTWCBlbGVtZW50IG5hbWUgdG8gc3RyaW5nLlxuXG5mdW5jdGlvbiBnZXRRdWFsaWZpZWRKU1hOYW1lKFxuICBvYmplY3Q6IE4uSlNYSWRlbnRpZmllciB8IE4uSlNYTmFtZXNwYWNlZE5hbWUgfCBOLkpTWE1lbWJlckV4cHJlc3Npb24sXG4pOiBzdHJpbmcge1xuICBpZiAob2JqZWN0LnR5cGUgPT09IFwiSlNYSWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIG9iamVjdC5uYW1lO1xuICB9XG5cbiAgaWYgKG9iamVjdC50eXBlID09PSBcIkpTWE5hbWVzcGFjZWROYW1lXCIpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm5hbWVzcGFjZS5uYW1lICsgXCI6XCIgKyBvYmplY3QubmFtZS5uYW1lO1xuICB9XG5cbiAgaWYgKG9iamVjdC50eXBlID09PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikge1xuICAgIHJldHVybiAoXG4gICAgICBnZXRRdWFsaWZpZWRKU1hOYW1lKG9iamVjdC5vYmplY3QpICtcbiAgICAgIFwiLlwiICtcbiAgICAgIGdldFF1YWxpZmllZEpTWE5hbWUob2JqZWN0LnByb3BlcnR5KVxuICAgICk7XG4gIH1cblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGhhZCB1bmV4cGVjdGVkIHR5cGU6IFwiICsgb2JqZWN0LnR5cGUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElKU1hQYXJzZXJNaXhpbiB7XG4gIGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgbm9kZTogTi5KU1hPcGVuaW5nRWxlbWVudCxcbiAgKTogTi5KU1hPcGVuaW5nRWxlbWVudDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IHR5cGVvZiBQYXJzZXIpID0+XG4gIGNsYXNzIEpTWFBhcnNlck1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFBhcnNlciwgSUpTWFBhcnNlck1peGluIHtcbiAgICAvLyBSZWFkcyBpbmxpbmUgSlNYIGNvbnRlbnRzIHRva2VuLlxuXG4gICAganN4UmVhZFRva2VuKCk6IHZvaWQge1xuICAgICAgbGV0IG91dCA9IFwiXCI7XG4gICAgICBsZXQgY2h1bmtTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbnRlcm1pbmF0ZWRKc3hDb250ZW50LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcblxuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMubGVzc1RoYW46XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2U6XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPT09IHRoaXMuc3RhdGUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgaWYgKGNoID09PSBjaGFyQ29kZXMubGVzc1RoYW4gJiYgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGFnU3RhcnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGV4dCwgb3V0KTtcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgIGNhc2UgY2hhckNvZGVzLmFtcGVyc2FuZDpcbiAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgIG91dCArPSB0aGlzLmpzeFJlYWRFbnRpdHkoKTtcbiAgICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMuZ3JlYXRlclRoYW46XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlOlxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShKc3hFcnJvcnMuVW5leHBlY3RlZFRva2VuLCB7XG4gICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICAgICAgICB1bmV4cGVjdGVkOiB0aGlzLmlucHV0W3RoaXMuc3RhdGUucG9zXSxcbiAgICAgICAgICAgICAgICBIVE1MRW50aXR5OlxuICAgICAgICAgICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5yaWdodEN1cmx5QnJhY2UgPyBcIiZyYnJhY2U7XCIgOiBcIiZndDtcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgICAgb3V0ICs9IHRoaXMuanN4UmVhZE5ld0xpbmUodHJ1ZSk7XG4gICAgICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBqc3hSZWFkTmV3TGluZShub3JtYWxpemVDUkxGOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICAgIGxldCBvdXQ7XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgaWYgKFxuICAgICAgICBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcykgPT09IGNoYXJDb2Rlcy5saW5lRmVlZFxuICAgICAgKSB7XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIG91dCA9IG5vcm1hbGl6ZUNSTEYgPyBcIlxcblwiIDogXCJcXHJcXG5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgfVxuICAgICAgKyt0aGlzLnN0YXRlLmN1ckxpbmU7XG4gICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuXG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGpzeFJlYWRTdHJpbmcocXVvdGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgbGV0IG91dCA9IFwiXCI7XG4gICAgICBsZXQgY2h1bmtTdGFydCA9ICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBvcyA+PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVudGVybWluYXRlZFN0cmluZywge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIGJyZWFrO1xuICAgICAgICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5hbXBlcnNhbmQpIHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnN0YXRlLnBvcyk7XG4gICAgICAgICAgb3V0ICs9IHRoaXMuanN4UmVhZEVudGl0eSgpO1xuICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfSBlbHNlIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgICAgIG91dCArPSB0aGlzLmpzeFJlYWROZXdMaW5lKGZhbHNlKTtcbiAgICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MrKyk7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnN0cmluZywgb3V0KTtcbiAgICB9XG5cbiAgICBqc3hSZWFkRW50aXR5KCk6IHN0cmluZyB7XG4gICAgICBjb25zdCBzdGFydFBvcyA9ICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpZiAodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykgPT09IGNoYXJDb2Rlcy5udW1iZXJTaWduKSB7XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG5cbiAgICAgICAgbGV0IHJhZGl4ID0gMTA7XG4gICAgICAgIGlmICh0aGlzLmNvZGVQb2ludEF0UG9zKHRoaXMuc3RhdGUucG9zKSA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZVgpIHtcbiAgICAgICAgICByYWRpeCA9IDE2O1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSB0aGlzLnJlYWRJbnQoXG4gICAgICAgICAgcmFkaXgsXG4gICAgICAgICAgLyogbGVuICovIHVuZGVmaW5lZCxcbiAgICAgICAgICAvKiBmb3JjZUxlbiAqLyBmYWxzZSxcbiAgICAgICAgICAvKiBhbGxvd051bVNlcGFyYXRvciAqLyBcImJhaWxcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvZGVQb2ludCAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMuY29kZVBvaW50QXRQb3ModGhpcy5zdGF0ZS5wb3MpID09PSBjaGFyQ29kZXMuc2VtaWNvbG9uXG4gICAgICAgICkge1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCBzZW1pID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBjb3VudCsrIDwgMTAgJiZcbiAgICAgICAgICB0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoICYmXG4gICAgICAgICAgIShzZW1pID0gdGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykgPT0gY2hhckNvZGVzLnNlbWljb2xvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZW1pKSB7XG4gICAgICAgICAgY29uc3QgZGVzYyA9IHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnRQb3MsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBYSFRNTEVudGl0aWVzW2Rlc2NdO1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG5cbiAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSB2YWxpZCBlbnRpdHlcbiAgICAgIHRoaXMuc3RhdGUucG9zID0gc3RhcnRQb3M7XG4gICAgICByZXR1cm4gXCImXCI7XG4gICAgfVxuXG4gICAgLy8gUmVhZCBhIEpTWCBpZGVudGlmaWVyICh2YWxpZCB0YWcgb3IgYXR0cmlidXRlIG5hbWUpLlxuICAgIC8vXG4gICAgLy8gT3B0aW1pemVkIHZlcnNpb24gc2luY2UgSlNYIGlkZW50aWZpZXJzIGNhblwidCBjb250YWluXG4gICAgLy8gZXNjYXBlIGNoYXJhY3RlcnMgYW5kIHNvIGNhbiBiZSByZWFkIGFzIHNpbmdsZSBzbGljZS5cbiAgICAvLyBBbHNvIGFzc3VtZXMgdGhhdCBmaXJzdCBjaGFyYWN0ZXIgd2FzIGFscmVhZHkgY2hlY2tlZFxuICAgIC8vIGJ5IGlzSWRlbnRpZmllclN0YXJ0IGluIHJlYWRUb2tlbi5cblxuICAgIGpzeFJlYWRXb3JkKCk6IHZvaWQge1xuICAgICAgbGV0IGNoO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnN0YXRlLnBvcyk7XG4gICAgICB9IHdoaWxlIChpc0lkZW50aWZpZXJDaGFyKGNoKSB8fCBjaCA9PT0gY2hhckNvZGVzLmRhc2gpO1xuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5qc3hOYW1lLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnN0YXRlLnBvcykpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5leHQgdG9rZW4gYXMgSlNYIGlkZW50aWZpZXJcblxuICAgIGpzeFBhcnNlSWRlbnRpZmllcigpOiBOLkpTWElkZW50aWZpZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5qc3hOYW1lKSkge1xuICAgICAgICBub2RlLm5hbWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbklzS2V5d29yZCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgIG5vZGUubmFtZSA9IHRva2VuTGFiZWxOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWElkZW50aWZpZXJcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgbmFtZXNwYWNlZCBpZGVudGlmaWVyLlxuXG4gICAganN4UGFyc2VOYW1lc3BhY2VkTmFtZSgpOiBOLkpTWE5hbWVzcGFjZWROYW1lIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmpzeFBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgaWYgKCF0aGlzLmVhdCh0dC5jb2xvbikpIHJldHVybiBuYW1lO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBub2RlLm5hbWVzcGFjZSA9IG5hbWU7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmpzeFBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWE5hbWVzcGFjZWROYW1lXCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBlbGVtZW50IG5hbWUgaW4gYW55IGZvcm0gLSBuYW1lc3BhY2VkLCBtZW1iZXJcbiAgICAvLyBvciBzaW5nbGUgaWRlbnRpZmllci5cblxuICAgIGpzeFBhcnNlRWxlbWVudE5hbWUoKTpcbiAgICAgIHwgTi5KU1hJZGVudGlmaWVyXG4gICAgICB8IE4uSlNYTmFtZXNwYWNlZE5hbWVcbiAgICAgIHwgTi5KU1hNZW1iZXJFeHByZXNzaW9uIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCBub2RlID0gdGhpcy5qc3hQYXJzZU5hbWVzcGFjZWROYW1lKCk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkpTWE5hbWVzcGFjZWROYW1lXCIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHQuZG90KSkge1xuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICAgIG5ld05vZGUub2JqZWN0ID0gbm9kZTtcbiAgICAgICAgbmV3Tm9kZS5wcm9wZXJ0eSA9IHRoaXMuanN4UGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIG5vZGUgPSB0aGlzLmZpbmlzaE5vZGUobmV3Tm9kZSwgXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGFueSB0eXBlIG9mIEpTWCBhdHRyaWJ1dGUgdmFsdWUuXG5cbiAgICBqc3hQYXJzZUF0dHJpYnV0ZVZhbHVlKCk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBsZXQgbm9kZTtcbiAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICAgIHRoaXMuc2V0Q29udGV4dCh0Yy5icmFjZSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgbm9kZSA9IHRoaXMuanN4UGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKG5vZGUsIHRjLmpfb1RhZyk7XG4gICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi50eXBlID09PSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5BdHRyaWJ1dGVJc0VtcHR5LCB7IGF0OiBub2RlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9kZTtcblxuICAgICAgICBjYXNlIHR0LmpzeFRhZ1N0YXJ0OlxuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbnN1cHBvcnRlZEpzeFZhbHVlLCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKU1hFbXB0eUV4cHJlc3Npb24gaXMgdW5pcXVlIHR5cGUgc2luY2UgaXQgZG9lc24ndCBhY3R1YWxseSBwYXJzZSBhbnl0aGluZyxcbiAgICAvLyBhbmQgc28gaXQgc2hvdWxkIHN0YXJ0IGF0IHRoZSBlbmQgb2YgbGFzdCByZWFkIHRva2VuIChsZWZ0IGJyYWNlKSBhbmQgZmluaXNoXG4gICAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBvbmUgKHJpZ2h0IGJyYWNlKS5cblxuICAgIGpzeFBhcnNlRW1wdHlFeHByZXNzaW9uKCk6IE4uSlNYRW1wdHlFeHByZXNzaW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHRoaXMuc3RhdGUubGFzdFRva0VuZExvYyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQobm9kZSwgXCJKU1hFbXB0eUV4cHJlc3Npb25cIiwgdGhpcy5zdGF0ZS5zdGFydExvYyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgSlNYIHNwcmVhZCBjaGlsZFxuXG4gICAganN4UGFyc2VTcHJlYWRDaGlsZChub2RlOiBVbmRvbmU8Ti5KU1hTcHJlYWRDaGlsZD4pOiBOLkpTWFNwcmVhZENoaWxkIHtcbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlbGxpcHNpc1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuc2V0Q29udGV4dCh0Yy5qX2V4cHIpO1xuICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWFNwcmVhZENoaWxkXCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBKU1ggZXhwcmVzc2lvbiBlbmNsb3NlZCBpbnRvIGN1cmx5IGJyYWNrZXRzLlxuXG4gICAganN4UGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKFxuICAgICAgbm9kZTogVW5kb25lPE4uSlNYRXhwcmVzc2lvbkNvbnRhaW5lcj4sXG4gICAgICBwcmV2aW91c0NvbnRleHQ6IFRva0NvbnRleHQsXG4gICAgKTogTi5KU1hFeHByZXNzaW9uQ29udGFpbmVyIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5qc3hQYXJzZUVtcHR5RXhwcmVzc2lvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBleHByZXNzaW9uLnR5cGUgPT09IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgICAgICFleHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbmV4cGVjdGVkU2VxdWVuY2VFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIGF0OiBleHByZXNzaW9uLmV4cHJlc3Npb25zWzFdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q29udGV4dChwcmV2aW91c0NvbnRleHQpO1xuICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGZvbGxvd2luZyBKU1ggYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpci5cblxuICAgIGpzeFBhcnNlQXR0cmlidXRlKCk6IE4uSlNYQXR0cmlidXRlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2VMKSkge1xuICAgICAgICB0aGlzLnNldENvbnRleHQodGMuYnJhY2UpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuZWxsaXBzaXMpO1xuICAgICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgICAgICB0aGlzLnNldENvbnRleHQodGMual9vVGFnKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpO1xuICAgICAgfVxuICAgICAgbm9kZS5uYW1lID0gdGhpcy5qc3hQYXJzZU5hbWVzcGFjZWROYW1lKCk7XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5lYXQodHQuZXEpID8gdGhpcy5qc3hQYXJzZUF0dHJpYnV0ZVZhbHVlKCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEF0dHJpYnV0ZVwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgSlNYIG9wZW5pbmcgdGFnIHN0YXJ0aW5nIGFmdGVyIFwiPFwiLlxuXG4gICAganN4UGFyc2VPcGVuaW5nRWxlbWVudEF0KHN0YXJ0TG9jOiBQb3NpdGlvbik6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5KU1hPcGVuaW5nRWxlbWVudCB8IE4uSlNYT3BlbmluZ0ZyYWdtZW50PihcbiAgICAgICAgc3RhcnRMb2MsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmpzeFRhZ0VuZCkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJKU1hPcGVuaW5nRnJhZ21lbnRcIik7XG4gICAgICB9XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmpzeFBhcnNlRWxlbWVudE5hbWUoKTtcbiAgICAgIHJldHVybiB0aGlzLmpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uSlNYT3BlbmluZ0VsZW1lbnQ+LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBqc3hQYXJzZU9wZW5pbmdFbGVtZW50QWZ0ZXJOYW1lKFxuICAgICAgbm9kZTogVW5kb25lPE4uSlNYT3BlbmluZ0VsZW1lbnQ+LFxuICAgICk6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgY29uc3QgYXR0cmlidXRlczogTi5KU1hBdHRyaWJ1dGVbXSA9IFtdO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnNsYXNoKSAmJiAhdGhpcy5tYXRjaCh0dC5qc3hUYWdFbmQpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaCh0aGlzLmpzeFBhcnNlQXR0cmlidXRlKCkpO1xuICAgICAgfVxuICAgICAgbm9kZS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgIG5vZGUuc2VsZkNsb3NpbmcgPSB0aGlzLmVhdCh0dC5zbGFzaCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5qc3hUYWdFbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWE9wZW5pbmdFbGVtZW50XCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBKU1ggY2xvc2luZyB0YWcgc3RhcnRpbmcgYWZ0ZXIgXCI8L1wiLlxuXG4gICAganN4UGFyc2VDbG9zaW5nRWxlbWVudEF0KHN0YXJ0TG9jOiBQb3NpdGlvbik6IE4uSlNYQ2xvc2luZ0VsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmpzeFRhZ0VuZCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWENsb3NpbmdGcmFnbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIG5vZGUubmFtZSA9IHRoaXMuanN4UGFyc2VFbGVtZW50TmFtZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQuanN4VGFnRW5kKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJKU1hDbG9zaW5nRWxlbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgZW50aXJlIEpTWCBlbGVtZW50LCBpbmNsdWRpbmcgaXRcInMgb3BlbmluZyB0YWdcbiAgICAvLyAoc3RhcnRpbmcgYWZ0ZXIgXCI8XCIpLCBhdHRyaWJ1dGVzLCBjb250ZW50cyBhbmQgY2xvc2luZyB0YWcuXG5cbiAgICBqc3hQYXJzZUVsZW1lbnRBdChzdGFydExvYzogUG9zaXRpb24pOiBOLkpTWEVsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgIGNvbnN0IG9wZW5pbmdFbGVtZW50ID0gdGhpcy5qc3hQYXJzZU9wZW5pbmdFbGVtZW50QXQoc3RhcnRMb2MpO1xuICAgICAgbGV0IGNsb3NpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgICAgaWYgKCFvcGVuaW5nRWxlbWVudC5zZWxmQ2xvc2luZykge1xuICAgICAgICBjb250ZW50czogZm9yICg7Oykge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIHR0LmpzeFRhZ1N0YXJ0OlxuICAgICAgICAgICAgICBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5lYXQodHQuc2xhc2gpKSB7XG4gICAgICAgICAgICAgICAgY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmpzeFBhcnNlQ2xvc2luZ0VsZW1lbnRBdChzdGFydExvYyk7XG4gICAgICAgICAgICAgICAgYnJlYWsgY29udGVudHM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmpzeFBhcnNlRWxlbWVudEF0KHN0YXJ0TG9jKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIHR0LmpzeFRleHQ6XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZUV4cHJBdG9tKCkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSB0dC5icmFjZUw6IHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPFxuICAgICAgICAgICAgICAgIE4uSlNYU3ByZWFkQ2hpbGQgfCBOLkpTWEV4cHJlc3Npb25Db250YWluZXJcbiAgICAgICAgICAgICAgPigpO1xuICAgICAgICAgICAgICB0aGlzLnNldENvbnRleHQodGMuYnJhY2UpO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmpzeFBhcnNlU3ByZWFkQ2hpbGQobm9kZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLmpzeFBhcnNlRXhwcmVzc2lvbkNvbnRhaW5lcihub2RlLCB0Yy5qX2V4cHIpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzRnJhZ21lbnQob3BlbmluZ0VsZW1lbnQpICYmXG4gICAgICAgICAgIWlzRnJhZ21lbnQoY2xvc2luZ0VsZW1lbnQpICYmXG4gICAgICAgICAgY2xvc2luZ0VsZW1lbnQgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShKc3hFcnJvcnMuTWlzc2luZ0Nsb3NpbmdUYWdGcmFnbWVudCwge1xuICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0ZyYWdtZW50KG9wZW5pbmdFbGVtZW50KSAmJiBpc0ZyYWdtZW50KGNsb3NpbmdFbGVtZW50KSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoSnN4RXJyb3JzLk1pc3NpbmdDbG9zaW5nVGFnRWxlbWVudCwge1xuICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgICAgb3BlbmluZ1RhZ05hbWU6IGdldFF1YWxpZmllZEpTWE5hbWUob3BlbmluZ0VsZW1lbnQubmFtZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRnJhZ21lbnQob3BlbmluZ0VsZW1lbnQpICYmICFpc0ZyYWdtZW50KGNsb3NpbmdFbGVtZW50KSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGdldFF1YWxpZmllZEpTWE5hbWUoY2xvc2luZ0VsZW1lbnQubmFtZSkgIT09XG4gICAgICAgICAgICBnZXRRdWFsaWZpZWRKU1hOYW1lKG9wZW5pbmdFbGVtZW50Lm5hbWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5NaXNzaW5nQ2xvc2luZ1RhZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgICAgICBvcGVuaW5nVGFnTmFtZTogZ2V0UXVhbGlmaWVkSlNYTmFtZShvcGVuaW5nRWxlbWVudC5uYW1lKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNGcmFnbWVudChvcGVuaW5nRWxlbWVudCkpIHtcbiAgICAgICAgbm9kZS5vcGVuaW5nRnJhZ21lbnQgPSBvcGVuaW5nRWxlbWVudDtcbiAgICAgICAgbm9kZS5jbG9zaW5nRnJhZ21lbnQgPSBjbG9zaW5nRWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUub3BlbmluZ0VsZW1lbnQgPSBvcGVuaW5nRWxlbWVudDtcbiAgICAgICAgbm9kZS5jbG9zaW5nRWxlbWVudCA9IGNsb3NpbmdFbGVtZW50O1xuICAgICAgfVxuICAgICAgbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoSnN4RXJyb3JzLlVud3JhcHBlZEFkamFjZW50SlNYRWxlbWVudHMsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0ZyYWdtZW50KG9wZW5pbmdFbGVtZW50KVxuICAgICAgICA/IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEZyYWdtZW50XCIpXG4gICAgICAgIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSlNYRWxlbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgZW50aXJlIEpTWCBlbGVtZW50IGZyb20gY3VycmVudCBwb3NpdGlvbi5cblxuICAgIGpzeFBhcnNlRWxlbWVudCgpOiBOLkpTWEVsZW1lbnQge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnRBdChzdGFydExvYyk7XG4gICAgfVxuXG4gICAgc2V0Q29udGV4dChuZXdDb250ZXh0OiBUb2tDb250ZXh0KSB7XG4gICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV0gPSBuZXdDb250ZXh0O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBwYXJzZUV4cHJBdG9tKHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5qc3hUZXh0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSwgXCJKU1hUZXh0XCIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMubWF0Y2godHQubHQpICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcykgIT09IGNoYXJDb2Rlcy5leGNsYW1hdGlvbk1hcmtcbiAgICAgICkge1xuICAgICAgICAvLyBJbiBjYXNlIHdlIGVuY291bnRlciBhbiBsdCB0b2tlbiBoZXJlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzdGFydCBvZlxuICAgICAgICAvLyBqc3ggYXMgdGhlIGx0IHNpZ24gaXMgbm90IGFsbG93ZWQgaW4gcGxhY2VzIHRoYXQgZXhwZWN0IGFuIGV4cHJlc3Npb25cbiAgICAgICAgdGhpcy5yZXBsYWNlVG9rZW4odHQuanN4VGFnU3RhcnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cHJBdG9tKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNraXBTcGFjZSgpIHtcbiAgICAgIGNvbnN0IGN1ckNvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQoKTtcbiAgICAgIGlmICghY3VyQ29udGV4dC5wcmVzZXJ2ZVNwYWNlKSBzdXBlci5za2lwU3BhY2UoKTtcbiAgICB9XG5cbiAgICBnZXRUb2tlbkZyb21Db2RlKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuXG4gICAgICBpZiAoY29udGV4dCA9PT0gdGMual9leHByKSB7XG4gICAgICAgIHRoaXMuanN4UmVhZFRva2VuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRleHQgPT09IHRjLmpfb1RhZyB8fCBjb250ZXh0ID09PSB0Yy5qX2NUYWcpIHtcbiAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUpKSB7XG4gICAgICAgICAgdGhpcy5qc3hSZWFkV29yZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4pIHtcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGFnRW5kKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGNvZGUgPT09IGNoYXJDb2Rlcy5xdW90YXRpb25NYXJrIHx8IGNvZGUgPT09IGNoYXJDb2Rlcy5hcG9zdHJvcGhlKSAmJlxuICAgICAgICAgIGNvbnRleHQgPT09IHRjLmpfb1RhZ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmpzeFJlYWRTdHJpbmcoY29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLmxlc3NUaGFuICYmXG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpICE9PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrXG4gICAgICApIHtcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5qc3hUYWdTdGFydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VwZXIuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDb250ZXh0KHByZXZUeXBlOiBUb2tlblR5cGUpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHsgY29udGV4dCwgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmICh0eXBlID09PSB0dC5zbGFzaCAmJiBwcmV2VHlwZSA9PT0gdHQuanN4VGFnU3RhcnQpIHtcbiAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIEpTWCBleHByIC0+IEpTWCBvcGVuIHRhZyAtPiAuLi4gYW55bW9yZVxuICAgICAgICAvLyByZWNvbnNpZGVyIGFzIGNsb3NpbmcgdGFnIGNvbnRleHRcbiAgICAgICAgY29udGV4dC5zcGxpY2UoLTIsIDIsIHRjLmpfY1RhZyk7XG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LmpzeFRhZ1N0YXJ0KSB7XG4gICAgICAgIC8vIHN0YXJ0IG9wZW5pbmcgdGFnIGNvbnRleHRcbiAgICAgICAgY29udGV4dC5wdXNoKHRjLmpfb1RhZyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LmpzeFRhZ0VuZCkge1xuICAgICAgICBjb25zdCBvdXQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICgob3V0ID09PSB0Yy5qX29UYWcgJiYgcHJldlR5cGUgPT09IHR0LnNsYXNoKSB8fCBvdXQgPT09IHRjLmpfY1RhZykge1xuICAgICAgICAgIGNvbnRleHQucG9wKCk7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPVxuICAgICAgICAgICAgY29udGV4dFtjb250ZXh0Lmxlbmd0aCAtIDFdID09PSB0Yy5qX2V4cHI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRDb250ZXh0KHRjLmpfZXhwcik7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLmNhblN0YXJ0SlNYRWxlbWVudCA9IHRva2VuQ29tZXNCZWZvcmVFeHByZXNzaW9uKHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiIsICJpbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCBTY29wZUhhbmRsZXIsIHsgU2NvcGUgfSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZVwiO1xuaW1wb3J0IHtcbiAgQklORF9LSU5EX1RZUEUsXG4gIEJJTkRfRkxBR1NfVFNfRU5VTSxcbiAgQklORF9GTEFHU19UU19DT05TVF9FTlVNLFxuICBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZLFxuICBCSU5EX0tJTkRfVkFMVUUsXG4gIEJJTkRfRkxBR1NfQ0xBU1MsXG4gIHR5cGUgU2NvcGVGbGFncyxcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIEJJTkRfRkxBR1NfVFNfSU1QT1JULFxuICBTQ09QRV9UU19NT0RVTEUsXG59IGZyb20gXCIuLi8uLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuXG5jbGFzcyBUeXBlU2NyaXB0U2NvcGUgZXh0ZW5kcyBTY29wZSB7XG4gIHR5cGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBlbnVtcyAod2hpY2ggYXJlIGFsc28gaW4gLnR5cGVzKVxuICBlbnVtczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gY29uc3QgZW51bXMgKHdoaWNoIGFyZSBhbHNvIGluIC5lbnVtcyBhbmQgLnR5cGVzKVxuICBjb25zdEVudW1zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBjbGFzc2VzICh3aGljaCBhcmUgYWxzbyBpbiAubGV4aWNhbCkgYW5kIGludGVyZmFjZSAod2hpY2ggYXJlIGFsc28gaW4gLnR5cGVzKVxuICBjbGFzc2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBuYW1lc3BhY2VzIGFuZCBhbWJpZW50IGZ1bmN0aW9ucyAob3IgY2xhc3NlcykgYXJlIHRvbyBkaWZmaWN1bHQgdG8gdHJhY2ssXG4gIC8vIGVzcGVjaWFsbHkgd2l0aG91dCB0eXBlIGFuYWx5c2lzLlxuICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZW0gYW55d2F5LCB0byBhdm9pZCBcIlggaXMgbm90IGRlZmluZWRcIiBlcnJvcnNcbiAgLy8gd2hlbiBleHBvcnRpbmcgdGhlbS5cbiAgZXhwb3J0T25seUJpbmRpbmdzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbn1cblxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzk3NjYjZGlzY3Vzc2lvbl9yMjY4OTIwNzMwIGZvciBhblxuLy8gZXhwbGFuYXRpb24gb2YgaG93IHR5cGVzY3JpcHQgaGFuZGxlcyBzY29wZS5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFNjb3BlSGFuZGxlciBleHRlbmRzIFNjb3BlSGFuZGxlcjxUeXBlU2NyaXB0U2NvcGU+IHtcbiAgaW1wb3J0c1N0YWNrOiBTZXQ8c3RyaW5nPltdID0gW107XG5cbiAgY3JlYXRlU2NvcGUoZmxhZ3M6IFNjb3BlRmxhZ3MpOiBUeXBlU2NyaXB0U2NvcGUge1xuICAgIHRoaXMuaW1wb3J0c1N0YWNrLnB1c2gobmV3IFNldCgpKTsgLy8gQWx3YXlzIGtlZXAgdGhlIHRvcC1sZXZlbCBzY29wZSBmb3IgZXhwb3J0IGNoZWNrcy5cblxuICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFNjb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGVudGVyKGZsYWdzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZmxhZ3MgPT0gU0NPUEVfVFNfTU9EVUxFKSB7XG4gICAgICB0aGlzLmltcG9ydHNTdGFjay5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuXG4gICAgc3VwZXIuZW50ZXIoZmxhZ3MpO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICBjb25zdCBmbGFncyA9IHN1cGVyLmV4aXQoKTtcblxuICAgIGlmIChmbGFncyA9PSBTQ09QRV9UU19NT0RVTEUpIHtcbiAgICAgIHRoaXMuaW1wb3J0c1N0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIGhhc0ltcG9ydChuYW1lOiBzdHJpbmcsIGFsbG93U2hhZG93PzogYm9vbGVhbikge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMuaW1wb3J0c1N0YWNrLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbXBvcnRzU3RhY2tbbGVuIC0gMV0uaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd1NoYWRvdyAmJiBsZW4gPiAxKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRzU3RhY2tbaV0uaGFzKG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVjbGFyZU5hbWUobmFtZTogc3RyaW5nLCBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLCBsb2M6IFBvc2l0aW9uKSB7XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9GTEFHU19UU19JTVBPUlQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0ltcG9ydChuYW1lLCB0cnVlKSkge1xuICAgICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuVmFyUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICAgIGF0OiBsb2MsXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5pbXBvcnRzU3RhY2tbdGhpcy5pbXBvcnRzU3RhY2subGVuZ3RoIC0gMV0uYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZKSB7XG4gICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG4gICAgICBzY29wZS5leHBvcnRPbmx5QmluZGluZ3MuYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmRlY2xhcmVOYW1lKG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuXG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1RZUEUpIHtcbiAgICAgIGlmICghKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1ZBTFVFKSkge1xuICAgICAgICAvLyBcIlZhbHVlXCIgYmluZGluZ3MgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGUgc3VwZXJjbGFzcy5cbiAgICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcbiAgICAgICAgdGhpcy5tYXliZUV4cG9ydERlZmluZWQoc2NvcGUsIG5hbWUpO1xuICAgICAgfVxuICAgICAgc2NvcGUudHlwZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VOVU0pIHNjb3BlLmVudW1zLmFkZChuYW1lKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0pIHNjb3BlLmNvbnN0RW51bXMuYWRkKG5hbWUpO1xuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfQ0xBU1MpIHNjb3BlLmNsYXNzZXMuYWRkKG5hbWUpO1xuICB9XG5cbiAgaXNSZWRlY2xhcmVkSW5TY29wZShcbiAgICBzY29wZTogVHlwZVNjcmlwdFNjb3BlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc2NvcGUuZW51bXMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VOVU0pIHtcbiAgICAgICAgLy8gRW51bXMgY2FuIGJlIG1lcmdlZCB3aXRoIG90aGVyIGVudW1zIGlmIHRoZXkgYXJlIGJvdGhcbiAgICAgICAgLy8gIGNvbnN0IG9yIGJvdGggbm9uLWNvbnN0LlxuICAgICAgICBjb25zdCBpc0NvbnN0ID0gISEoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0pO1xuICAgICAgICBjb25zdCB3YXNDb25zdCA9IHNjb3BlLmNvbnN0RW51bXMuaGFzKG5hbWUpO1xuICAgICAgICByZXR1cm4gaXNDb25zdCAhPT0gd2FzQ29uc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9GTEFHU19DTEFTUyAmJiBzY29wZS5jbGFzc2VzLmhhcyhuYW1lKSkge1xuICAgICAgaWYgKHNjb3BlLmxleGljYWwuaGFzKG5hbWUpKSB7XG4gICAgICAgIC8vIENsYXNzZXMgY2FuIGJlIG1lcmdlZCB3aXRoIGludGVyZmFjZXNcbiAgICAgICAgcmV0dXJuICEhKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1ZBTFVFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVyZmFjZSBjYW4gYmUgbWVyZ2VkIHdpdGggb3RoZXIgY2xhc3NlcyBvciBpbnRlcmZhY2VzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1RZUEUgJiYgc2NvcGUudHlwZXMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpO1xuICB9XG5cbiAgY2hlY2tMb2NhbEV4cG9ydChpZDogTi5JZGVudGlmaWVyKSB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSBpZDtcblxuICAgIGlmICh0aGlzLmhhc0ltcG9ydChuYW1lKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGVuID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgaWYgKHNjb3BlLnR5cGVzLmhhcyhuYW1lKSB8fCBzY29wZS5leHBvcnRPbmx5QmluZGluZ3MuaGFzKG5hbWUpKSByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIuY2hlY2tMb2NhbEV4cG9ydChpZCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHsgdHQsIHR5cGUgVG9rZW5UeXBlIH0gZnJvbSBcIi4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUge1xuICBBc3NpZ25tZW50UGF0dGVybixcbiAgVFNQYXJhbWV0ZXJQcm9wZXJ0eSxcbiAgRGVjb3JhdG9yLFxuICBFeHByZXNzaW9uLFxuICBJZGVudGlmaWVyLFxuICBOb2RlLFxuICBQYXR0ZXJuLFxuICBSZXN0RWxlbWVudCxcbiAgU3ByZWFkRWxlbWVudCxcbiAgT2JqZWN0T3JDbGFzc01lbWJlcixcbiAgQ2xhc3NNZW1iZXIsXG4gIE9iamVjdE1lbWJlcixcbiAgVHNOYW1lZFR5cGVFbGVtZW50QmFzZSxcbiAgUHJpdmF0ZU5hbWUsXG4gIE9iamVjdEV4cHJlc3Npb24sXG4gIE9iamVjdFBhdHRlcm4sXG4gIEFycmF5RXhwcmVzc2lvbixcbiAgQXJyYXlQYXR0ZXJuLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUG9zLCBQb3NpdGlvbiB9IGZyb20gXCIuLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQge1xuICBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkLFxuICBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQsXG59IGZyb20gXCIuLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCB7IE5vZGVVdGlscywgdHlwZSBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5pbXBvcnQge1xuICB0eXBlIEJpbmRpbmdUeXBlcyxcbiAgQklORF9OT05FLFxuICBCSU5EX0ZMQUdTX05PX0xFVF9JTl9MRVhJQ0FMLFxufSBmcm9tIFwiLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25FcnJvcnMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBFcnJvcnMsIHR5cGUgTFZhbEFuY2VzdG9yIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgZ2V0T3duID0gPFQgZXh0ZW5kcyB7fT4ob2JqZWN0OiBULCBrZXk6IGtleW9mIFQpID0+XG4gIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBvYmplY3Rba2V5XTtcblxuY29uc3QgdW53cmFwUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSAobm9kZTogTm9kZSk6IE5vZGUgPT4ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCJcbiAgICA/IHVud3JhcFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbilcbiAgICA6IG5vZGU7XG59O1xuXG5leHBvcnQgY29uc3QgZW51bSBQYXJzZUJpbmRpbmdMaXN0RmxhZ3Mge1xuICBBTExPV19FTVBUWSA9IDEgPDwgMCxcbiAgSVNfRlVOQ1RJT05fUEFSQU1TID0gMSA8PCAxLFxuICBJU19DT05TVFJVQ1RPUl9QQVJBTVMgPSAxIDw8IDIsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIExWYWxQYXJzZXIgZXh0ZW5kcyBOb2RlVXRpbHMge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIGV4cHJlc3Npb24uanNcbiAgYWJzdHJhY3QgcGFyc2VJZGVudGlmaWVyKGxpYmVyYWw/OiBib29sZWFuKTogSWRlbnRpZmllcjtcbiAgYWJzdHJhY3QgcGFyc2VNYXliZUFzc2lnbihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWZ0ZXJMZWZ0UGFyc2U/OiBGdW5jdGlvbixcbiAgICByZWZOZWVkc0Fycm93UG9zPzogUG9zIHwgbnVsbCxcbiAgKTogRXhwcmVzc2lvbjtcblxuICBhYnN0cmFjdCBwYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWZ0ZXJMZWZ0UGFyc2U/OiBGdW5jdGlvbixcbiAgICByZWZOZWVkc0Fycm93UG9zPzogUG9zIHwgbnVsbCxcbiAgKTogRXhwcmVzc2lvbjtcblxuICBhYnN0cmFjdCBwYXJzZU9iamVjdExpa2U8VCBleHRlbmRzIE9iamVjdFBhdHRlcm4gfCBPYmplY3RFeHByZXNzaW9uPihcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICBpc1JlY29yZD86IGJvb2xlYW4sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMsXG4gICk6IFQ7XG4gIGFic3RyYWN0IHBhcnNlT2JqUHJvcFZhbHVlKFxuICAgIHByb3A6IGFueSxcbiAgICBzdGFydExvYzogUG9zaXRpb24gfCBudWxsLFxuICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiB2b2lkO1xuICBhYnN0cmFjdCBwYXJzZVByb3BlcnR5TmFtZShcbiAgICBwcm9wOiBPYmplY3RPckNsYXNzTWVtYmVyIHwgQ2xhc3NNZW1iZXIgfCBUc05hbWVkVHlwZUVsZW1lbnRCYXNlLFxuICApOiBFeHByZXNzaW9uIHwgSWRlbnRpZmllcjtcbiAgYWJzdHJhY3QgcGFyc2VQcml2YXRlTmFtZSgpOiBQcml2YXRlTmFtZTtcbiAgLy8gRm9yd2FyZC1kZWNsYXJhdGlvbjogZGVmaW5lZCBpbiBzdGF0ZW1lbnQuanNcbiAgYWJzdHJhY3QgcGFyc2VEZWNvcmF0b3IoKTogRGVjb3JhdG9yO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGV4aXN0aW5nIGV4cHJlc3Npb24gYXRvbSB0byBhc3NpZ25hYmxlIHBhdHRlcm5cbiAgICogaWYgcG9zc2libGUuIEFsc28gY2hlY2tzIGludmFsaWQgZGVzdHJ1Y3R1cmluZyB0YXJnZXRzOlxuICAgKlxuICAgKiAtIFBhcmVudGhlc2l6ZWQgRGVzdHJ1Y3R1cmluZyBwYXR0ZXJuc1xuICAgKiAtIFJlc3RFbGVtZW50IGlzIG5vdCB0aGUgbGFzdCBlbGVtZW50XG4gICAqIC0gTWlzc2luZyBgPWAgaW4gYXNzaWdubWVudCBwYXR0ZXJuXG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBcImlzQXNzaWduYWJsZVwiIG1ldGhvZC5cbiAgICogV2hlbiB0aGlzIG9uZSBpcyB1cGRhdGVkLCBwbGVhc2UgY2hlY2sgaWYgYWxzbyB0aGF0IG9uZSBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZSBUaGUgZXhwcmVzc2lvbiBhdG9tXG4gICAqIEBwYXJhbSBpc0xIUyBXaGV0aGVyIHdlIGFyZSBwYXJzaW5nIGEgTGVmdEhhbmRTaWRlRXhwcmVzc2lvbi5cbiAgICogICAgICAgICAgICAgIElmIGlzTEhTIGlzIGB0cnVlYCwgdGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgYWxsb3dlZDogYFsoYSldID0gWzBdYCwgYFsoYS5iKV0gPSBbMF1gXG4gICAqICAgICAgICAgICAgICBJZiBpc0xIUyBpcyBgZmFsc2VgLCB3ZSBhcmUgaW4gYW4gYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVycyBsaXN0LlxuICAgKi9cbiAgdG9Bc3NpZ25hYmxlKG5vZGU6IE5vZGUsIGlzTEhTOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBsZXQgcGFyZW50aGVzaXplZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZS50eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIgfHwgbm9kZS5leHRyYT8ucGFyZW50aGVzaXplZCkge1xuICAgICAgcGFyZW50aGVzaXplZCA9IHVud3JhcFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGUpO1xuICAgICAgaWYgKGlzTEhTKSB7XG4gICAgICAgIC8vIGFuIExIUyBjYW4gYmUgcmVpbnRlcnByZXRlZCB0byBhIGJpbmRpbmcgcGF0dGVybiBidXQgbm90IHZpY2UgdmVyc2EuXG4gICAgICAgIC8vIHRoZXJlZm9yZSBhIHBhcmVudGhlc2l6ZWQgaWRlbnRpZmllciBpcyBhbWJpZ3VvdXMgdW50aWwgd2UgYXJlIHN1cmUgaXQgaXMgYW4gYXNzaWdubWVudCBleHByZXNzaW9uXG4gICAgICAgIC8vIGkuZS4gYChbKGEpID0gW11dID0gW10pID0+IHt9YFxuICAgICAgICAvLyBzZWUgYWxzbyBgcmVjb3JkQXJyb3dQYXJhbWV0ZXJCaW5kaW5nRXJyb3JgIHNpZ25hdHVyZSBpbiBwYWNrYWdlcy9iYWJlbC1wYXJzZXIvc3JjL3V0aWwvZXhwcmVzc2lvbi1zY29wZS5qc1xuICAgICAgICBpZiAocGFyZW50aGVzaXplZC50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFycm93UGFyYW1ldGVyQmluZGluZ0Vycm9yKFxuICAgICAgICAgICAgRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudCxcbiAgICAgICAgICAgIHsgYXQ6IG5vZGUgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudGhlc2l6ZWQudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAvLyBBIHBhcmVudGhlc2l6ZWQgbWVtYmVyIGV4cHJlc3Npb24gY2FuIGJlIGluIExIUyBidXQgbm90IGluIHBhdHRlcm4uXG4gICAgICAgICAgLy8gSWYgdGhlIExIUyBpcyBsYXRlciBpbnRlcnByZXRlZCBhcyBhIHBhdHRlcm4sIGBjaGVja0xWYWxgIHdpbGwgdGhyb3cgZm9yIG1lbWJlciBleHByZXNzaW9uIGJpbmRpbmdcbiAgICAgICAgICAvLyBpLmUuIGAoWyhhLmIpID0gW11dID0gW10pID0+IHt9YFxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZFBhcmVudGhlc2l6ZWRBc3NpZ25tZW50LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBsZXQgaSA9IDAsIGxlbmd0aCA9IG5vZGUucHJvcGVydGllcy5sZW5ndGgsIGxhc3QgPSBsZW5ndGggLSAxO1xuICAgICAgICAgIGkgPCBsZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBub2RlLnByb3BlcnRpZXNbaV07XG4gICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gbGFzdDtcbiAgICAgICAgICB0aGlzLnRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKHByb3AsIGlzTGFzdCwgaXNMSFMpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNMYXN0ICYmXG4gICAgICAgICAgICBwcm9wLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIiAmJlxuICAgICAgICAgICAgbm9kZS5leHRyYT8udHJhaWxpbmdDb21tYUxvY1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgYXQ6IG5vZGUuZXh0cmEudHJhaWxpbmdDb21tYUxvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk9iamVjdFByb3BlcnR5XCI6IHtcbiAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBub2RlO1xuICAgICAgICBpZiAodGhpcy5pc1ByaXZhdGVOYW1lKGtleSkpIHtcbiAgICAgICAgICB0aGlzLmNsYXNzU2NvcGUudXNlUHJpdmF0ZU5hbWUoXG4gICAgICAgICAgICB0aGlzLmdldFByaXZhdGVOYW1lU1Yoa2V5KSxcbiAgICAgICAgICAgIGtleS5sb2Muc3RhcnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZSh2YWx1ZSwgaXNMSFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbnRlcm5hbCBAYmFiZWwvcGFyc2VyIGVycm9yICh0aGlzIGlzIGEgYnVnLCBwbGVhc2UgcmVwb3J0IGl0KS5cIiArXG4gICAgICAgICAgICBcIiBTcHJlYWRFbGVtZW50IHNob3VsZCBiZSBjb252ZXJ0ZWQgYnkgLnRvQXNzaWduYWJsZSdzIGNhbGxlci5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIkFycmF5RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIkFycmF5UGF0dGVyblwiO1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3QoXG4gICAgICAgICAgbm9kZS5lbGVtZW50cyxcbiAgICAgICAgICBub2RlLmV4dHJhPy50cmFpbGluZ0NvbW1hTG9jLFxuICAgICAgICAgIGlzTEhTLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmIChub2RlLm9wZXJhdG9yICE9PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1pc3NpbmdFcUluQXNzaWdubWVudCwgeyBhdDogbm9kZS5sZWZ0LmxvYy5lbmQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnR5cGUgPSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI7XG4gICAgICAgIGRlbGV0ZSBub2RlLm9wZXJhdG9yO1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmxlZnQsIGlzTEhTKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgICAvKjo6aW52YXJpYW50IChwYXJlbnRoZXNpemVkICE9PSB1bmRlZmluZWQpICovXG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHBhcmVudGhlc2l6ZWQsIGlzTEhTKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBXZSBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggdGhpcyBub2RlLiBJdCB3aWxsXG4gICAgICAvLyBiZSByZXBvcnRlZCBieSBhIGxhdGVyIGNhbGwgdG8gY2hlY2tMVmFsXG4gICAgfVxuICB9XG5cbiAgdG9Bc3NpZ25hYmxlT2JqZWN0RXhwcmVzc2lvblByb3AoXG4gICAgcHJvcDogTm9kZSxcbiAgICBpc0xhc3Q6IGJvb2xlYW4sXG4gICAgaXNMSFM6IGJvb2xlYW4sXG4gICkge1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiT2JqZWN0TWV0aG9kXCIpIHtcbiAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgIHByb3Aua2luZCA9PT0gXCJnZXRcIiB8fCBwcm9wLmtpbmQgPT09IFwic2V0XCJcbiAgICAgICAgICA/IEVycm9ycy5QYXR0ZXJuSGFzQWNjZXNzb3JcbiAgICAgICAgICA6IEVycm9ycy5QYXR0ZXJuSGFzTWV0aG9kLFxuICAgICAgICB7IGF0OiBwcm9wLmtleSB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByb3AudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpIHtcbiAgICAgIHByb3AudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgIGNvbnN0IGFyZyA9IHByb3AuYXJndW1lbnQ7XG4gICAgICB0aGlzLmNoZWNrVG9SZXN0Q29udmVyc2lvbihhcmcsIC8qIGFsbG93UGF0dGVybiAqLyBmYWxzZSk7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShhcmcsIGlzTEhTKTtcblxuICAgICAgaWYgKCFpc0xhc3QpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWEsIHsgYXQ6IHByb3AgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHByb3AsIGlzTEhTKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb252ZXJ0IGxpc3Qgb2YgZXhwcmVzc2lvbiBhdG9tcyB0byBiaW5kaW5nIGxpc3QuXG5cbiAgdG9Bc3NpZ25hYmxlTGlzdChcbiAgICBleHByTGlzdDogRXhwcmVzc2lvbltdLFxuICAgIHRyYWlsaW5nQ29tbWFMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBpc0xIUzogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZW5kID0gZXhwckxpc3QubGVuZ3RoIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSBleHByTGlzdFtpXTtcbiAgICAgIGlmICghZWx0KSBjb250aW51ZTtcblxuICAgICAgaWYgKGVsdC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIikge1xuICAgICAgICBlbHQudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgICAgY29uc3QgYXJnID0gZWx0LmFyZ3VtZW50O1xuICAgICAgICB0aGlzLmNoZWNrVG9SZXN0Q29udmVyc2lvbihhcmcsIC8qIGFsbG93UGF0dGVybiAqLyB0cnVlKTtcbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUoYXJnLCBpc0xIUyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShlbHQsIGlzTEhTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsdC50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgICAgaWYgKGkgPCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5SZXN0VHJhaWxpbmdDb21tYSwgeyBhdDogZWx0IH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWlsaW5nQ29tbWFMb2MpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5SZXN0VHJhaWxpbmdDb21tYSwgeyBhdDogdHJhaWxpbmdDb21tYUxvYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQXNzaWduYWJsZShub2RlOiBOb2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGNhc2UgXCJPYmplY3RFeHByZXNzaW9uXCI6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG5vZGUucHJvcGVydGllcy5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gKG5vZGUucHJvcGVydGllcyBhcyBPYmplY3RFeHByZXNzaW9uW1wicHJvcGVydGllc1wiXSkuZXZlcnkoXG4gICAgICAgICAgKHByb3AsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHByb3AudHlwZSAhPT0gXCJPYmplY3RNZXRob2RcIiAmJlxuICAgICAgICAgICAgICAoaSA9PT0gbGFzdCB8fCBwcm9wLnR5cGUgIT09IFwiU3ByZWFkRWxlbWVudFwiKSAmJlxuICAgICAgICAgICAgICB0aGlzLmlzQXNzaWduYWJsZShwcm9wKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUudmFsdWUpO1xuXG4gICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCk7XG5cbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIChub2RlIGFzIEFycmF5RXhwcmVzc2lvbikuZWxlbWVudHMuZXZlcnkoXG4gICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50ID09PSBudWxsIHx8IHRoaXMuaXNBc3NpZ25hYmxlKGVsZW1lbnQpLFxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUub3BlcmF0b3IgPT09IFwiPVwiO1xuXG4gICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbik7XG5cbiAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiAhaXNCaW5kaW5nO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBsaXN0IG9mIGV4cHJlc3Npb24gYXRvbXMgdG8gYSBsaXN0IG9mXG5cbiAgdG9SZWZlcmVuY2VkTGlzdChcbiAgICBleHByTGlzdDogUmVhZG9ubHlBcnJheTxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLFxuICApOiBSZWFkb25seUFycmF5PEV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgcmV0dXJuIGV4cHJMaXN0O1xuICB9XG5cbiAgdG9SZWZlcmVuY2VkTGlzdERlZXAoXG4gICAgZXhwckxpc3Q6IFJlYWRvbmx5QXJyYXk8RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGw+LFxuICAgIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3QoZXhwckxpc3QsIGlzUGFyZW50aGVzaXplZEV4cHIpO1xuXG4gICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJMaXN0KSB7XG4gICAgICBpZiAoZXhwcj8udHlwZSA9PT0gXCJBcnJheUV4cHJlc3Npb25cIikge1xuICAgICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3REZWVwKGV4cHIuZWxlbWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBzcHJlYWQgZWxlbWVudC5cblxuICBwYXJzZVNwcmVhZChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBTcHJlYWRFbGVtZW50IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8U3ByZWFkRWxlbWVudD4oKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJpbmRpbmdSZXN0UHJvcGVydHlcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1Jlc3RFbGVtZW50XG4gIHBhcnNlUmVzdEJpbmRpbmcodGhpczogUGFyc2VyKTogUmVzdEVsZW1lbnQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxSZXN0RWxlbWVudD4oKTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAuLi5gXG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXN0RWxlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBsdmFsdWUgKGFzc2lnbmFibGUpIGF0b20uXG4gIHBhcnNlQmluZGluZ0F0b20odGhpczogUGFyc2VyKTogUGF0dGVybiB7XG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1BhdHRlcm5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgY2FzZSB0dC5icmFja2V0TDoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8QXJyYXlQYXR0ZXJuPigpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogRml4bWU6IFRTUGFyYW1ldGVyUHJvcGVydHkgY2FuIG5vdCBiZSBhc3NpZ25lZCB0byBub2RlLmVsZW1lbnRzXG4gICAgICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlQmluZGluZ0xpc3QoXG4gICAgICAgICAgdHQuYnJhY2tldFIsXG4gICAgICAgICAgY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldCxcbiAgICAgICAgICBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuQUxMT1dfRU1QVFksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVBhdHRlcm5cIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU9iamVjdExpa2UodHQuYnJhY2VSLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nSWRlbnRpZmllclxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ0VsZW1lbnRMaXN0XG4gIHBhcnNlQmluZGluZ0xpc3QoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgY2xvc2VDaGFyQ29kZTogKHR5cGVvZiBjaGFyQ29kZXMpW2tleW9mIHR5cGVvZiBjaGFyQ29kZXNdLFxuICAgIGZsYWdzOiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MsXG4gICk6IEFycmF5PFBhdHRlcm4gfCBUU1BhcmFtZXRlclByb3BlcnR5PiB7XG4gICAgY29uc3QgYWxsb3dFbXB0eSA9IGZsYWdzICYgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLkFMTE9XX0VNUFRZO1xuXG4gICAgY29uc3QgZWx0czogQXJyYXk8UGF0dGVybiB8IFRTUGFyYW1ldGVyUHJvcGVydHk+ID0gW107XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dFbXB0eSAmJiB0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgICBlbHRzLnB1c2gobnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5lbGxpcHNpcykpIHtcbiAgICAgICAgZWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyh0aGlzLnBhcnNlUmVzdEJpbmRpbmcoKSwgZmxhZ3MpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tDb21tYUFmdGVyUmVzdChjbG9zZUNoYXJDb2RlKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KGNsb3NlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5hdCkgJiYgdGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRQYXJhbWV0ZXJEZWNvcmF0b3IsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludmFyaWFudDogaGFzUGx1Z2luKFwiZGVjb3JhdG9ycy1sZWdhY3lcIilcbiAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWx0cy5wdXNoKHRoaXMucGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW0oZmxhZ3MsIGRlY29yYXRvcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsdHM7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nUmVzdFByb3BlcnR5XG4gIHBhcnNlQmluZGluZ1Jlc3RQcm9wZXJ0eShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcHJvcDogVW5kb25lPFJlc3RFbGVtZW50PixcbiAgKTogUmVzdEVsZW1lbnQge1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJy4uLidcbiAgICAvLyBEb24ndCB1c2UgcGFyc2VSZXN0QmluZGluZygpIGFzIHdlIG9ubHkgYWxsb3cgSWRlbnRpZmllciBoZXJlLlxuICAgIHByb3AuYXJndW1lbnQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIHRoaXMuY2hlY2tDb21tYUFmdGVyUmVzdChjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiUmVzdEVsZW1lbnRcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nUHJvcGVydHlcbiAgcGFyc2VCaW5kaW5nUHJvcGVydHkodGhpczogUGFyc2VyKTogT2JqZWN0TWVtYmVyIHwgUmVzdEVsZW1lbnQge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnN0YXJ0Tm9kZTxPYmplY3RNZW1iZXIgfCBSZXN0RWxlbWVudD4oKTtcbiAgICBjb25zdCB7IHR5cGUsIHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0eXBlID09PSB0dC5lbGxpcHNpcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VCaW5kaW5nUmVzdFByb3BlcnR5KHByb3AgYXMgVW5kb25lPFJlc3RFbGVtZW50Pik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSB0dC5wcml2YXRlTmFtZSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJkZXN0cnVjdHVyaW5nUHJpdmF0ZVwiLCBzdGFydExvYyk7XG4gICAgICB0aGlzLmNsYXNzU2NvcGUudXNlUHJpdmF0ZU5hbWUodGhpcy5zdGF0ZS52YWx1ZSwgc3RhcnRMb2MpO1xuICAgICAgKHByb3AgYXMgVW5kb25lPE9iamVjdE1lbWJlcj4pLmtleSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3AgYXMgVW5kb25lPE9iamVjdE1lbWJlcj4pO1xuICAgIH1cbiAgICAocHJvcCBhcyBVbmRvbmU8T2JqZWN0TWVtYmVyPikubWV0aG9kID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgICBwcm9wIGFzIFVuZG9uZTxPYmplY3RNZW1iZXI+LFxuICAgICAgc3RhcnRMb2MsXG4gICAgICBmYWxzZSAvKiBpc0dlbmVyYXRvciAqLyxcbiAgICAgIGZhbHNlIC8qIGlzQXN5bmMgKi8sXG4gICAgICB0cnVlIC8qIGlzUGF0dGVybiAqLyxcbiAgICAgIGZhbHNlIC8qIGlzQWNjZXNzb3IgKi8sXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgIGRlY29yYXRvcnM6IERlY29yYXRvcltdLFxuICApOiBQYXR0ZXJuIHwgVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQoKTtcbiAgICB0aGlzLnBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMobGVmdCwgZmxhZ3MpO1xuICAgIGNvbnN0IGVsdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQobGVmdC5sb2Muc3RhcnQsIGxlZnQpO1xuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgbGVmdC5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICB9XG4gICAgcmV0dXJuIGVsdDtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgZmxvdy90eXBlc2NyaXB0IHBsdWdpbiB0byBhZGQgdHlwZSBhbm5vdGF0aW9ucyB0byBiaW5kaW5nIGVsZW1lbnRzXG4gIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMoXG4gICAgcGFyYW06IFBhdHRlcm4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGZsYWdzOiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MsXG4gICk6IFBhdHRlcm4ge1xuICAgIHJldHVybiBwYXJhbTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBhc3NpZ25tZW50IHBhdHRlcm4gYXJvdW5kIGdpdmVuIGF0b20gaWYgcG9zc2libGUuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJpbmRpbmdFbGVtZW50XG4gIHBhcnNlTWF5YmVEZWZhdWx0KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBzdGFydExvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgICBsZWZ0PzogUGF0dGVybiB8IG51bGwsXG4gICk6IFBhdHRlcm4ge1xuICAgIHN0YXJ0TG9jID8/PSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGxlZnQgPSBsZWZ0ID8/IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIGlmICghdGhpcy5lYXQodHQuZXEpKSByZXR1cm4gbGVmdDtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PEFzc2lnbm1lbnRQYXR0ZXJuPihzdGFydExvYyk7XG4gICAgbm9kZS5sZWZ0ID0gbGVmdDtcbiAgICBub2RlLnJpZ2h0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBc3NpZ25tZW50UGF0dGVyblwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGluZm9ybWF0aW9uIHVzZSBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgTm9kZSBvZiBhIGdpdmVuIHR5cGUgaXMgYW4gTFZhbCxcbiAgICogcG9zc2libHkgZ2l2ZW4gY2VydGFpbiBhZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFN1YmNsYXNzZXIgbm90ZXM6IFRoaXMgbWV0aG9kIGhhcyBraW5kIG9mIGEgbG90IG9mIG1peGVkLCBidXQgcmVsYXRlZCxcbiAgICogcmVzcG9uc2liaWxpdGllcy4gSWYgd2UgY2FuIGRlZmluaXRpdmVseSBkZXRlcm1pbmUgd2l0aCB0aGUgaW5mb3JtYXRpb25cbiAgICogcHJvdmlkZWQgdGhhdCB0aGlzIGVpdGhlciAqaXMqIG9yICppc24ndCogYSB2YWxpZCBgTFZhbGAsIHRoZW4gdGhlIHJldHVyblxuICAgKiB2YWx1ZSBpcyBlYXN5OiBqdXN0IHJldHVybiBgdHJ1ZWAgb3IgYGZhbHNlYC4gSG93ZXZlciwgaWYgaXQgaXMgYSB2YWxpZFxuICAgKiBMVmFsICphbmNlc3RvciosIGFuZCB0aHVzIGl0cyBkZXNjZW5kYW50cyBtdXN0IGJlIHN1YnNlcXVlbnRseSB2aXNpdGVkIHRvXG4gICAqIGNvbnRpbnVlIHRoZSBcImludmVzdGlnYXRpb25cIiwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSByZWxldmFudFxuICAgKiBjaGlsZCBrZXkgYXMgYSBgc3RyaW5nYC4gSW4gc29tZSBzcGVjaWFsIGNhc2VzLCB5b3UgYWRkaXRpb25hbGx5IHdhbnQgdG9cbiAgICogY29udmV5IHRoYXQgdGhpcyBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgcGFyZW50aGVzaXplZC4gSW5cbiAgICogdGhhdCBjYXNlLCBhIHR1cGxlIG9mIFtrZXk6IHN0cmluZywgcGFyZW50aGVzaXplZDogYm9vbGVhbl0gaXMgcmV0dXJuZWQuXG4gICAqIFRoZSBgc3RyaW5nYC1vbmx5IHJldHVybiBvcHRpb24gaXMgYWN0dWFsbHkganVzdCBhIHNob3J0aGFuZCBmb3I6XG4gICAqIGBba2V5OiBzdHJpbmcsIHBhcmVudGhlc2l6ZWQ6IGZhbHNlXWAuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIEEgTm9kZSBgdHlwZWAgc3RyaW5nXG4gICAqIEBwYXJhbSBpc1VucGFyZW50aGVzaXplZEluQXNzaWduXG4gICAqICAgICAgICBXaGV0aGVyIHRoZSBub2RlIGluIHF1ZXN0aW9uIGlzIHVucGFyZW50aGVzaXplZCBhbmQgaXRzIHBhcmVudFxuICAgKiAgICAgICAgaXMgZWl0aGVyIGFuIGFzc2lnbm1lbnQgcGF0dGVybiBvciBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSBiaW5kaW5nXG4gICAqICAgICAgICBUaGUgYmluZGluZyBvcGVyYXRpb24gdGhhdCBpcyBiZWluZyBjb25zaWRlcmVkIGZvciB0aGlzIHBvdGVudGlhbFxuICAgKiAgICAgICAgTFZhbC5cbiAgICogQHJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGRldGVybWluZSB3aGV0aGVyIHRoZSBub2RlXG4gICAqICAgICAgICAgIHR5cGUgaW4gcXVlc3Rpb24gY2FuIGJlIHRyZWF0ZWQgYXMgYW4gYExWYWxgLlxuICAgKiAgICAgICAgICBBIGBzdHJpbmdgIGtleSB0byB0cmF2ZXJzZSBpZiB3ZSBtdXN0IGNoZWNrIHRoaXMgY2hpbGQuXG4gICAqICAgICAgICAgIEEgYFtzdHJpbmcsIGJvb2xlYW5dYCB0dXBsZSBpZiB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgY2hpbGQgYW5kXG4gICAqICAgICAgICAgIHRyZWF0IGlzIGFzIHBhcmVudGhlc2l6ZWQuXG4gICAqL1xuICBpc1ZhbGlkTFZhbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGlzVW5wYXJlbnRoZXNpemVkSW5Bc3NpZ246IGJvb2xlYW4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGJpbmRpbmc6IEJpbmRpbmdUeXBlcyxcbiAgKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE93bihcbiAgICAgIHtcbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IFwibGVmdFwiLFxuICAgICAgICBSZXN0RWxlbWVudDogXCJhcmd1bWVudFwiLFxuICAgICAgICBPYmplY3RQcm9wZXJ0eTogXCJ2YWx1ZVwiLFxuICAgICAgICBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjogXCJleHByZXNzaW9uXCIsXG4gICAgICAgIEFycmF5UGF0dGVybjogXCJlbGVtZW50c1wiLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBcInByb3BlcnRpZXNcIixcbiAgICAgIH0sXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSBzdHJpbmcgdG8gZW51bVxuICAgICAgdHlwZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYW4gbHZhbCAoc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvKS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gaW4gcXVlc3Rpb24gdG8gY2hlY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIEEgc2V0IG9mIG9wdGlvbnMgZGVzY3JpYmVkIGJlbG93LlxuICAgKiBAcGFyYW0gb3B0aW9ucy5pblxuICAgKiAgICAgICAgVGhlIHJlbGV2YW50IGFuY2VzdG9yIHRvIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVycm9yXG4gICAqICAgICAgICBpZiB0aGUgY2hlY2sgZmFpbHMuXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbmRpbmdcbiAgICogICAgICAgIFRoZSBkZXNpcmVkIGJpbmRpbmcgdHlwZS4gSWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgYW4gaWRlbnRpZmllclxuICAgKiAgICAgICAgYW5kIGBiaW5kaW5nYCBpcyBub3QgYEJJTkRfTk9ORWAsIGBjaGVja0xWYWxgIHdpbGwgcmVnaXN0ZXIgYmluZGluZ1xuICAgKiAgICAgICAgdG8gdGhlIHBhcnNlciBzY29wZSBTZWUgYWxzbyBgc3JjL3V0aWwvc2NvcGVmbGFncy5qc2BcbiAgICogQHBhcmFtIG9wdGlvbnMuY2hlY2tDbGFzaGVzXG4gICAqICAgICAgICBBbiBvcHRpb25hbCBzdHJpbmcgc2V0IHRvIGNoZWNrIGlmIGFuIGlkZW50aWZpZXIgbmFtZSBpcyBpbmNsdWRlZC5cbiAgICogICAgICAgIGBjaGVja0xWYWxgIHdpbGwgYWRkIGNoZWNrZWQgaWRlbnRpZmllciBuYW1lIHRvIGBjaGVja0NsYXNoZXNgIEl0IGlzXG4gICAqICAgICAgICB1c2VkIGluIHRyYWNraW5nIGR1cGxpY2F0ZXMgaW4gZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzLiBJZiBpdCBpc1xuICAgKiAgICAgICAgZmFsc2UsIGBjaGVja0xWYWxgIHdpbGwgc2tpcCBkdXBsaWNhdGUgY2hlY2tzXG4gICAqIEBwYXJhbSBvcHRpb25zLnN0cmljdE1vZGVDaGFuZ2VkXG4gICAqICAgICAgICBXaGV0aGVyIGFuIGlkZW50aWZpZXIgaGFzIGJlZW4gcGFyc2VkIGluIGEgc2xvcHB5IGNvbnRleHQgYnV0IHNob3VsZFxuICAgKiAgICAgICAgYmUgcmVpbnRlcnByZXRlZCBhcyBzdHJpY3QtbW9kZS4gZS5nLiBgKGFyZ3VtZW50cykgPT4geyBcInVzZSBzdHJpY3QgXCJ9YFxuICAgKiBAcGFyYW0gb3B0aW9ucy5oYXNQYXJlbnRoZXNpemVkQW5jZXN0b3JcbiAgICogICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGludGVybmFsbHkgZHVyaW5nIHJlY3Vyc2l2ZSBjYWxscywgYW5kIHlvdSBzaG91bGRcbiAgICogICAgICAgIG5vdCBoYXZlIHRvIHNldCBpdCB5b3Vyc2VsZi5cbiAgICovXG5cbiAgY2hlY2tMVmFsKFxuICAgIGV4cHJlc3Npb246IEV4cHJlc3Npb24gfCBPYmplY3RNZW1iZXIgfCBSZXN0RWxlbWVudCxcbiAgICB7XG4gICAgICBpbjogYW5jZXN0b3IsXG4gICAgICBiaW5kaW5nID0gQklORF9OT05FLFxuICAgICAgY2hlY2tDbGFzaGVzID0gZmFsc2UsXG4gICAgICBzdHJpY3RNb2RlQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgaW46IExWYWxBbmNlc3RvcjtcbiAgICAgIGJpbmRpbmc/OiBCaW5kaW5nVHlwZXM7XG4gICAgICBjaGVja0NsYXNoZXM/OiBTZXQ8c3RyaW5nPiB8IGZhbHNlO1xuICAgICAgc3RyaWN0TW9kZUNoYW5nZWQ/OiBib29sZWFuO1xuICAgICAgaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eXBlID0gZXhwcmVzc2lvbi50eXBlO1xuXG4gICAgLy8gSWYgd2UgZmluZCBoZXJlIGFuIE9iamVjdE1ldGhvZCwgaXQncyBiZWNhdXNlIHRoaXMgd2FzIG9yaWdpbmFsbHlcbiAgICAvLyBhbiBPYmplY3RFeHByZXNzaW9uIHdoaWNoIGhhcyB0aGVuIGJlZW4gY29udmVydGVkLlxuICAgIC8vIHRvQXNzaWduYWJsZSBhbHJlYWR5IHJlcG9ydGVkIHRoaXMgZXJyb3Igd2l0aCBhIG5pY2VyIG1lc3NhZ2UuXG4gICAgaWYgKHRoaXMuaXNPYmplY3RNZXRob2QoZXhwcmVzc2lvbikpIHJldHVybjtcblxuICAgIGlmICh0eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgaWYgKGJpbmRpbmcgIT09IEJJTkRfTk9ORSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkUHJvcGVydHlCaW5kaW5nUGF0dGVybiwgeyBhdDogZXhwcmVzc2lvbiB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgIHRoaXMuY2hlY2tJZGVudGlmaWVyKFxuICAgICAgICBleHByZXNzaW9uIGFzIElkZW50aWZpZXIsXG4gICAgICAgIGJpbmRpbmcsXG4gICAgICAgIHN0cmljdE1vZGVDaGFuZ2VkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeyBuYW1lIH0gPSBleHByZXNzaW9uIGFzIElkZW50aWZpZXI7XG5cbiAgICAgIGlmIChjaGVja0NsYXNoZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrQ2xhc2hlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXJhbUR1cGUsIHsgYXQ6IGV4cHJlc3Npb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2tDbGFzaGVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRpdHkgPSB0aGlzLmlzVmFsaWRMVmFsKFxuICAgICAgdHlwZSxcbiAgICAgICEoaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yIHx8IGV4cHJlc3Npb24uZXh0cmE/LnBhcmVudGhlc2l6ZWQpICYmXG4gICAgICAgIGFuY2VzdG9yLnR5cGUgPT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIixcbiAgICAgIGJpbmRpbmcsXG4gICAgKTtcblxuICAgIGlmICh2YWxpZGl0eSA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIGlmICh2YWxpZGl0eSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IFBhcnNlRXJyb3JDbGFzcyA9XG4gICAgICAgIGJpbmRpbmcgPT09IEJJTkRfTk9ORSA/IEVycm9ycy5JbnZhbGlkTGhzIDogRXJyb3JzLkludmFsaWRMaHNCaW5kaW5nO1xuXG4gICAgICB0aGlzLnJhaXNlKFBhcnNlRXJyb3JDbGFzcywgeyBhdDogZXhwcmVzc2lvbiwgYW5jZXN0b3IgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl0gPSBBcnJheS5pc0FycmF5KHZhbGlkaXR5KVxuICAgICAgPyB2YWxpZGl0eVxuICAgICAgOiBbdmFsaWRpdHksIHR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIl07XG4gICAgY29uc3QgbmV4dEFuY2VzdG9yID1cbiAgICAgIHR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIgfHxcbiAgICAgIHR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiIHx8XG4gICAgICB0eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgPyAoeyB0eXBlIH0gYXMgY29uc3QpXG4gICAgICAgIDogYW5jZXN0b3I7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtYXkgbm90IGluZGV4IGV4cHJlc3Npb24uXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBbXS5jb25jYXQoZXhwcmVzc2lvbltrZXldKSkge1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGNoaWxkLCB7XG4gICAgICAgICAgaW46IG5leHRBbmNlc3RvcixcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICAgIGNoZWNrQ2xhc2hlcyxcbiAgICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgICAgICBoYXNQYXJlbnRoZXNpemVkQW5jZXN0b3I6IGlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrSWRlbnRpZmllcihcbiAgICBhdDogSWRlbnRpZmllcixcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICAgIHN0cmljdE1vZGVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuc3RyaWN0ICYmXG4gICAgICAoc3RyaWN0TW9kZUNoYW5nZWRcbiAgICAgICAgPyBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQoYXQubmFtZSwgdGhpcy5pbk1vZHVsZSlcbiAgICAgICAgOiBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkKGF0Lm5hbWUpKVxuICAgICkge1xuICAgICAgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX05PTkUpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3RyaWN0RXZhbEFyZ3VtZW50cywgeyBhdCwgcmVmZXJlbmNlTmFtZTogYXQubmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlN0cmljdEV2YWxBcmd1bWVudHNCaW5kaW5nLCB7XG4gICAgICAgICAgYXQsXG4gICAgICAgICAgYmluZGluZ05hbWU6IGF0Lm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfTk9fTEVUX0lOX0xFWElDQUwgJiYgYXQubmFtZSA9PT0gXCJsZXRcIikge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuTGV0SW5MZXhpY2FsQmluZGluZywgeyBhdCB9KTtcbiAgICB9XG5cbiAgICBpZiAoIShiaW5kaW5nVHlwZSAmIEJJTkRfTk9ORSkpIHtcbiAgICAgIHRoaXMuZGVjbGFyZU5hbWVGcm9tSWRlbnRpZmllcihhdCwgYmluZGluZ1R5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGRlY2xhcmVOYW1lRnJvbUlkZW50aWZpZXIoaWRlbnRpZmllcjogSWRlbnRpZmllciwgYmluZGluZzogQmluZGluZ1R5cGVzKSB7XG4gICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShpZGVudGlmaWVyLm5hbWUsIGJpbmRpbmcsIGlkZW50aWZpZXIubG9jLnN0YXJ0KTtcbiAgfVxuXG4gIGNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlOiBOb2RlLCBhbGxvd1BhdHRlcm46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgIHRoaXMuY2hlY2tUb1Jlc3RDb252ZXJzaW9uKG5vZGUuZXhwcmVzc2lvbiwgYWxsb3dQYXR0ZXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAoYWxsb3dQYXR0ZXJuKSBicmVhaztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRSZXN0QXNzaWdubWVudFBhdHRlcm4sIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDb21tYUFmdGVyUmVzdChcbiAgICBjbG9zZTogKHR5cGVvZiBjaGFyQ29kZXMpW2tleW9mIHR5cGVvZiBjaGFyQ29kZXNdLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yYWlzZShcbiAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2xvc2VcbiAgICAgICAgPyBFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWFcbiAgICAgICAgOiBFcnJvcnMuRWxlbWVudEFmdGVyUmVzdCxcbiAgICAgIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uLy4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHtcbiAgdG9rZW5Jc0lkZW50aWZpZXIsXG4gIHRva2VuSXNUU0RlY2xhcmF0aW9uU3RhcnQsXG4gIHRva2VuSXNUU1R5cGVPcGVyYXRvcixcbiAgdG9rZW5PcGVyYXRvclByZWNlZGVuY2UsXG4gIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyLFxuICB0dCxcbiAgdHlwZSBUb2tlblR5cGUsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdG9rZW5DYW5TdGFydEV4cHJlc3Npb24sXG59IGZyb20gXCIuLi8uLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGVzIGFzIHRjIH0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldCB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4uLy4uL3BhcnNlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIFNDT1BFX1RTX01PRFVMRSxcbiAgU0NPUEVfT1RIRVIsXG4gIEJJTkRfVFNfRU5VTSxcbiAgQklORF9UU19DT05TVF9FTlVNLFxuICBCSU5EX1RTX1RZUEUsXG4gIEJJTkRfVFNfSU5URVJGQUNFLFxuICBCSU5EX1RTX0FNQklFTlQsXG4gIEJJTkRfVFNfTkFNRVNQQUNFLFxuICBCSU5EX1RTX1RZUEVfSU1QT1JULFxuICBCSU5EX0NMQVNTLFxuICBCSU5EX05PTkUsXG4gIEJJTkRfRkxBR1NfVFNfSU1QT1JULFxufSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgVHlwZVNjcmlwdFNjb3BlSGFuZGxlciBmcm9tIFwiLi9zY29wZVwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZVN0YXRlbWVudEZsYWcgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL3N0YXRlbWVudFwiO1xuaW1wb3J0IHsgUEFSQU0gfSBmcm9tIFwiLi4vLi4vdXRpbC9wcm9kdWN0aW9uLXBhcmFtZXRlclwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuLi8uLi9wYXJzZXIvbm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBQYXR0ZXJuIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgSUpTWFBhcnNlck1peGluIH0gZnJvbSBcIi4uL2pzeFwiO1xuaW1wb3J0IHsgUGFyc2VCaW5kaW5nTGlzdEZsYWdzIH0gZnJvbSBcIi4uLy4uL3BhcnNlci9sdmFsXCI7XG5cbmNvbnN0IGdldE93biA9IDxUIGV4dGVuZHMge30+KG9iamVjdDogVCwga2V5OiBrZXlvZiBUKSA9PlxuICBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgb2JqZWN0W2tleV07XG5cbnR5cGUgVHNNb2RpZmllciA9XG4gIHwgXCJyZWFkb25seVwiXG4gIHwgXCJhYnN0cmFjdFwiXG4gIHwgXCJkZWNsYXJlXCJcbiAgfCBcInN0YXRpY1wiXG4gIHwgXCJvdmVycmlkZVwiXG4gIHwgXCJjb25zdFwiXG4gIHwgTi5BY2Nlc3NpYmlsaXR5XG4gIHwgTi5WYXJpYW5jZUFubm90YXRpb25zO1xuXG5mdW5jdGlvbiBub25OdWxsPFQ+KHg/OiBUIHwgbnVsbCk6IFQge1xuICBpZiAoeCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkICR7eH0gdmFsdWUuYCk7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIGFzc2VydCh4OiBib29sZWFuKTogdm9pZCB7XG4gIGlmICgheCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFzc2VydCBmYWlsXCIpO1xuICB9XG59XG5cbnR5cGUgUGFyc2luZ0NvbnRleHQgPVxuICB8IFwiRW51bU1lbWJlcnNcIlxuICB8IFwiSGVyaXRhZ2VDbGF1c2VFbGVtZW50XCJcbiAgfCBcIlR1cGxlRWxlbWVudFR5cGVzXCJcbiAgfCBcIlR5cGVNZW1iZXJzXCJcbiAgfCBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIjtcblxudHlwZSBNb2RpZmllckJhc2UgPSB7XG4gIGFjY2Vzc2liaWxpdHk/OiBOLkFjY2Vzc2liaWxpdHk7XG59ICYge1xuICBba2V5IGluIFRzTW9kaWZpZXJdPzogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG4vKiBlc2xpbnQgc29ydC1rZXlzOiBcImVycm9yXCIgKi9cbmNvbnN0IFRTRXJyb3JzID0gUGFyc2VFcnJvckVudW1gdHlwZXNjcmlwdGAoe1xuICBBYnN0cmFjdE1ldGhvZEhhc0ltcGxlbWVudGF0aW9uOiAoeyBtZXRob2ROYW1lIH06IHsgbWV0aG9kTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYE1ldGhvZCAnJHttZXRob2ROYW1lfScgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gYmVjYXVzZSBpdCBpcyBtYXJrZWQgYWJzdHJhY3QuYCxcbiAgQWJzdHJhY3RQcm9wZXJ0eUhhc0luaXRpYWxpemVyOiAoe1xuICAgIHByb3BlcnR5TmFtZSxcbiAgfToge1xuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBQcm9wZXJ0eSAnJHtwcm9wZXJ0eU5hbWV9JyBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplciBiZWNhdXNlIGl0IGlzIG1hcmtlZCBhYnN0cmFjdC5gLFxuICBBY2Nlc29yQ2Fubm90RGVjbGFyZVRoaXNQYXJhbWV0ZXI6XG4gICAgXCInZ2V0JyBhbmQgJ3NldCcgYWNjZXNzb3JzIGNhbm5vdCBkZWNsYXJlICd0aGlzJyBwYXJhbWV0ZXJzLlwiLFxuICBBY2Nlc29yQ2Fubm90SGF2ZVR5cGVQYXJhbWV0ZXJzOiBcIkFuIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHR5cGUgcGFyYW1ldGVycy5cIixcbiAgQWNjZXNzb3JDYW5ub3RCZU9wdGlvbmFsOlxuICAgIFwiQW4gJ2FjY2Vzc29yJyBwcm9wZXJ0eSBjYW5ub3QgYmUgZGVjbGFyZWQgb3B0aW9uYWwuXCIsXG4gIENsYXNzTWV0aG9kSGFzRGVjbGFyZTogXCJDbGFzcyBtZXRob2RzIGNhbm5vdCBoYXZlIHRoZSAnZGVjbGFyZScgbW9kaWZpZXIuXCIsXG4gIENsYXNzTWV0aG9kSGFzUmVhZG9ubHk6IFwiQ2xhc3MgbWV0aG9kcyBjYW5ub3QgaGF2ZSB0aGUgJ3JlYWRvbmx5JyBtb2RpZmllci5cIixcbiAgQ29uc3RJbml0aWFpbGl6ZXJNdXN0QmVTdHJpbmdPck51bWVyaWNMaXRlcmFsT3JMaXRlcmFsRW51bVJlZmVyZW5jZTpcbiAgICBcIkEgJ2NvbnN0JyBpbml0aWFsaXplciBpbiBhbiBhbWJpZW50IGNvbnRleHQgbXVzdCBiZSBhIHN0cmluZyBvciBudW1lcmljIGxpdGVyYWwgb3IgbGl0ZXJhbCBlbnVtIHJlZmVyZW5jZS5cIixcbiAgQ29uc3RydWN0b3JIYXNUeXBlUGFyYW1ldGVyczpcbiAgICBcIlR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uXCIsXG4gIERlY2xhcmVBY2Nlc3NvcjogKHsga2luZCB9OiB7IGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIH0pID0+XG4gICAgYCdkZWNsYXJlJyBpcyBub3QgYWxsb3dlZCBpbiAke2tpbmR9dGVycy5gLFxuICBEZWNsYXJlQ2xhc3NGaWVsZEhhc0luaXRpYWxpemVyOlxuICAgIFwiSW5pdGlhbGl6ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiBhbWJpZW50IGNvbnRleHRzLlwiLFxuICBEZWNsYXJlRnVuY3Rpb25IYXNJbXBsZW1lbnRhdGlvbjpcbiAgICBcIkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzLlwiLFxuICBEdXBsaWNhdGVBY2Nlc3NpYmlsaXR5TW9kaWZpZXI6XG4gICAgLy8gYEFjY2Vzc2liaWxpdHkgbW9kaWZpZXIgYWxyZWFkeSBzZWVuOiAke21vZGlmaWVyfWAgd291bGQgYmUgbW9yZSBoZWxwZnVsLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAoeyBtb2RpZmllciB9OiB7IG1vZGlmaWVyOiBOLkFjY2Vzc2liaWxpdHkgfSkgPT5cbiAgICAgIGBBY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGFscmVhZHkgc2Vlbi5gLFxuICBEdXBsaWNhdGVNb2RpZmllcjogKHsgbW9kaWZpZXIgfTogeyBtb2RpZmllcjogVHNNb2RpZmllciB9KSA9PlxuICAgIGBEdXBsaWNhdGUgbW9kaWZpZXI6ICcke21vZGlmaWVyfScuYCxcbiAgLy8gYHRva2VuYCBtYXRjaGVzIHRoZSB0ZXJtaW5vbG9neSB1c2VkIGJ5IHR5cGVzY3JpcHQ6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vc3JjL2NvbXBpbGVyL3R5cGVzLnRzI0wyOTE1XG4gIEVtcHR5SGVyaXRhZ2VDbGF1c2VUeXBlOiAoeyB0b2tlbiB9OiB7IHRva2VuOiBcImV4dGVuZHNcIiB8IFwiaW1wbGVtZW50c1wiIH0pID0+XG4gICAgYCcke3Rva2VufScgbGlzdCBjYW5ub3QgYmUgZW1wdHkuYCxcbiAgRW1wdHlUeXBlQXJndW1lbnRzOiBcIlR5cGUgYXJndW1lbnQgbGlzdCBjYW5ub3QgYmUgZW1wdHkuXCIsXG4gIEVtcHR5VHlwZVBhcmFtZXRlcnM6IFwiVHlwZSBwYXJhbWV0ZXIgbGlzdCBjYW5ub3QgYmUgZW1wdHkuXCIsXG4gIEV4cGVjdGVkQW1iaWVudEFmdGVyRXhwb3J0RGVjbGFyZTpcbiAgICBcIidleHBvcnQgZGVjbGFyZScgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBhbWJpZW50IGRlY2xhcmF0aW9uLlwiLFxuICBJbXBvcnRBbGlhc0hhc0ltcG9ydFR5cGU6IFwiQW4gaW1wb3J0IGFsaWFzIGNhbiBub3QgdXNlICdpbXBvcnQgdHlwZScuXCIsXG4gIEltcG9ydFJlZmxlY3Rpb25IYXNJbXBvcnRUeXBlOlxuICAgIFwiQW4gYGltcG9ydCBtb2R1bGVgIGRlY2xhcmF0aW9uIGNhbiBub3QgdXNlIGB0eXBlYCBtb2RpZmllclwiLFxuICBJbmNvbXBhdGlibGVNb2RpZmllcnM6ICh7XG4gICAgbW9kaWZpZXJzLFxuICB9OiB7XG4gICAgbW9kaWZpZXJzOiBbVHNNb2RpZmllciwgVHNNb2RpZmllcl07XG4gIH0pID0+XG4gICAgYCcke21vZGlmaWVyc1swXX0nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJyR7bW9kaWZpZXJzWzFdfScgbW9kaWZpZXIuYCxcbiAgSW5kZXhTaWduYXR1cmVIYXNBYnN0cmFjdDpcbiAgICBcIkluZGV4IHNpZ25hdHVyZXMgY2Fubm90IGhhdmUgdGhlICdhYnN0cmFjdCcgbW9kaWZpZXIuXCIsXG4gIEluZGV4U2lnbmF0dXJlSGFzQWNjZXNzaWJpbGl0eTogKHtcbiAgICBtb2RpZmllcixcbiAgfToge1xuICAgIG1vZGlmaWVyOiBOLkFjY2Vzc2liaWxpdHk7XG4gIH0pID0+XG4gICAgYEluZGV4IHNpZ25hdHVyZXMgY2Fubm90IGhhdmUgYW4gYWNjZXNzaWJpbGl0eSBtb2RpZmllciAoJyR7bW9kaWZpZXJ9JykuYCxcbiAgSW5kZXhTaWduYXR1cmVIYXNEZWNsYXJlOlxuICAgIFwiSW5kZXggc2lnbmF0dXJlcyBjYW5ub3QgaGF2ZSB0aGUgJ2RlY2xhcmUnIG1vZGlmaWVyLlwiLFxuICBJbmRleFNpZ25hdHVyZUhhc092ZXJyaWRlOlxuICAgIFwiJ292ZXJyaWRlJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGFuIGluZGV4IHNpZ25hdHVyZS5cIixcbiAgSW5kZXhTaWduYXR1cmVIYXNTdGF0aWM6XG4gICAgXCJJbmRleCBzaWduYXR1cmVzIGNhbm5vdCBoYXZlIHRoZSAnc3RhdGljJyBtb2RpZmllci5cIixcbiAgSW5pdGlhbGl6ZXJOb3RBbGxvd2VkSW5BbWJpZW50Q29udGV4dDpcbiAgICBcIkluaXRpYWxpemVycyBhcmUgbm90IGFsbG93ZWQgaW4gYW1iaWVudCBjb250ZXh0cy5cIixcbiAgSW52YWxpZE1vZGlmaWVyT25UeXBlTWVtYmVyOiAoeyBtb2RpZmllciB9OiB7IG1vZGlmaWVyOiBUc01vZGlmaWVyIH0pID0+XG4gICAgYCcke21vZGlmaWVyfScgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIHR5cGUgbWVtYmVyLmAsXG4gIEludmFsaWRNb2RpZmllck9uVHlwZVBhcmFtZXRlcjogKHsgbW9kaWZpZXIgfTogeyBtb2RpZmllcjogVHNNb2RpZmllciB9KSA9PlxuICAgIGAnJHttb2RpZmllcn0nIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlci5gLFxuICBJbnZhbGlkTW9kaWZpZXJPblR5cGVQYXJhbWV0ZXJQb3NpdGlvbnM6ICh7XG4gICAgbW9kaWZpZXIsXG4gIH06IHtcbiAgICBtb2RpZmllcjogVHNNb2RpZmllcjtcbiAgfSkgPT5cbiAgICBgJyR7bW9kaWZpZXJ9JyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcy5gLFxuICBJbnZhbGlkTW9kaWZpZXJzT3JkZXI6ICh7XG4gICAgb3JkZXJlZE1vZGlmaWVycyxcbiAgfToge1xuICAgIG9yZGVyZWRNb2RpZmllcnM6IFtUc01vZGlmaWVyLCBUc01vZGlmaWVyXTtcbiAgfSkgPT5cbiAgICBgJyR7b3JkZXJlZE1vZGlmaWVyc1swXX0nIG1vZGlmaWVyIG11c3QgcHJlY2VkZSAnJHtvcmRlcmVkTW9kaWZpZXJzWzFdfScgbW9kaWZpZXIuYCxcbiAgSW52YWxpZFByb3BlcnR5QWNjZXNzQWZ0ZXJJbnN0YW50aWF0aW9uRXhwcmVzc2lvbjpcbiAgICBcIkludmFsaWQgcHJvcGVydHkgYWNjZXNzIGFmdGVyIGFuIGluc3RhbnRpYXRpb24gZXhwcmVzc2lvbi4gXCIgK1xuICAgIFwiWW91IGNhbiBlaXRoZXIgd3JhcCB0aGUgaW5zdGFudGlhdGlvbiBleHByZXNzaW9uIGluIHBhcmVudGhlc2VzLCBvciBkZWxldGUgdGhlIHR5cGUgYXJndW1lbnRzLlwiLFxuICBJbnZhbGlkVHVwbGVNZW1iZXJMYWJlbDpcbiAgICBcIlR1cGxlIG1lbWJlcnMgbXVzdCBiZSBsYWJlbGVkIHdpdGggYSBzaW1wbGUgaWRlbnRpZmllci5cIixcbiAgTWlzc2luZ0ludGVyZmFjZU5hbWU6XG4gICAgXCInaW50ZXJmYWNlJyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyLlwiLFxuICBNaXhlZExhYmVsZWRBbmRVbmxhYmVsZWRFbGVtZW50czpcbiAgICBcIlR1cGxlIG1lbWJlcnMgbXVzdCBhbGwgaGF2ZSBuYW1lcyBvciBhbGwgbm90IGhhdmUgbmFtZXMuXCIsXG4gIE5vbkFic3RyYWN0Q2xhc3NIYXNBYnN0cmFjdE1ldGhvZDpcbiAgICBcIkFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5cIixcbiAgTm9uQ2xhc3NNZXRob2RQcm9wZXJ0eUhhc0Fic3RyYWN0TW9kaWZlcjpcbiAgICBcIidhYnN0cmFjdCcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgY2xhc3MsIG1ldGhvZCwgb3IgcHJvcGVydHkgZGVjbGFyYXRpb24uXCIsXG4gIE9wdGlvbmFsVHlwZUJlZm9yZVJlcXVpcmVkOlxuICAgIFwiQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5cIixcbiAgT3ZlcnJpZGVOb3RJblN1YkNsYXNzOlxuICAgIFwiVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLlwiLFxuICBQYXR0ZXJuSXNPcHRpb25hbDpcbiAgICBcIkEgYmluZGluZyBwYXR0ZXJuIHBhcmFtZXRlciBjYW5ub3QgYmUgb3B0aW9uYWwgaW4gYW4gaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlLlwiLFxuICBQcml2YXRlRWxlbWVudEhhc0Fic3RyYWN0OlxuICAgIFwiUHJpdmF0ZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSB0aGUgJ2Fic3RyYWN0JyBtb2RpZmllci5cIixcbiAgUHJpdmF0ZUVsZW1lbnRIYXNBY2Nlc3NpYmlsaXR5OiAoe1xuICAgIG1vZGlmaWVyLFxuICB9OiB7XG4gICAgbW9kaWZpZXI6IE4uQWNjZXNzaWJpbGl0eTtcbiAgfSkgPT5cbiAgICBgUHJpdmF0ZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSBhbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyICgnJHttb2RpZmllcn0nKS5gLFxuICBSZWFkb25seUZvck1ldGhvZFNpZ25hdHVyZTpcbiAgICBcIidyZWFkb25seScgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgcHJvcGVydHkgZGVjbGFyYXRpb24gb3IgaW5kZXggc2lnbmF0dXJlLlwiLFxuICBSZXNlcnZlZEFycm93VHlwZVBhcmFtOlxuICAgIFwiVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gQWRkIGEgdHJhaWxpbmcgY29tbWEsIGFzIGluIGA8VCw+KCkgPT4gLi4uYC5cIixcbiAgUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uOlxuICAgIFwiVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gVXNlIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnN0ZWFkLlwiLFxuICAvLyBUT0RPOiBBY2Nlc29yIC0+IEFjY2Vzc29yXG4gIFNldEFjY2Vzb3JDYW5ub3RIYXZlT3B0aW9uYWxQYXJhbWV0ZXI6XG4gICAgXCJBICdzZXQnIGFjY2Vzc29yIGNhbm5vdCBoYXZlIGFuIG9wdGlvbmFsIHBhcmFtZXRlci5cIixcbiAgU2V0QWNjZXNvckNhbm5vdEhhdmVSZXN0UGFyYW1ldGVyOlxuICAgIFwiQSAnc2V0JyBhY2Nlc3NvciBjYW5ub3QgaGF2ZSByZXN0IHBhcmFtZXRlci5cIixcbiAgU2V0QWNjZXNvckNhbm5vdEhhdmVSZXR1cm5UeXBlOlxuICAgIFwiQSAnc2V0JyBhY2Nlc3NvciBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlIGFubm90YXRpb24uXCIsXG4gIFNpbmdsZVR5cGVQYXJhbWV0ZXJXaXRob3V0VHJhaWxpbmdDb21tYTogKHtcbiAgICB0eXBlUGFyYW1ldGVyTmFtZSxcbiAgfToge1xuICAgIHR5cGVQYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFNpbmdsZSB0eXBlIHBhcmFtZXRlciAke3R5cGVQYXJhbWV0ZXJOYW1lfSBzaG91bGQgaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLiBFeGFtcGxlIHVzYWdlOiA8JHt0eXBlUGFyYW1ldGVyTmFtZX0sPi5gLFxuICBTdGF0aWNCbG9ja0Nhbm5vdEhhdmVNb2RpZmllcjpcbiAgICBcIlN0YXRpYyBjbGFzcyBibG9ja3MgY2Fubm90IGhhdmUgYW55IG1vZGlmaWVyLlwiLFxuICBUdXBsZU9wdGlvbmFsQWZ0ZXJUeXBlOlxuICAgIFwiQSBsYWJlbGVkIHR1cGxlIG9wdGlvbmFsIGVsZW1lbnQgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyBhIHF1ZXN0aW9uIG1hcmsgYWZ0ZXIgdGhlIG5hbWUgYW5kIGJlZm9yZSB0aGUgY29sb24gKGBuYW1lPzogdHlwZWApLCByYXRoZXIgdGhhbiBhZnRlciB0aGUgdHlwZSAoYG5hbWU6IHR5cGU/YCkuXCIsXG4gIFR5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ246XG4gICAgXCJUeXBlIGFubm90YXRpb25zIG11c3QgY29tZSBiZWZvcmUgZGVmYXVsdCBhc3NpZ25tZW50cywgZS5nLiBpbnN0ZWFkIG9mIGBhZ2UgPSAyNTogbnVtYmVyYCB1c2UgYGFnZTogbnVtYmVyID0gMjVgLlwiLFxuICBUeXBlSW1wb3J0Q2Fubm90U3BlY2lmeURlZmF1bHRBbmROYW1lZDpcbiAgICBcIkEgdHlwZS1vbmx5IGltcG9ydCBjYW4gc3BlY2lmeSBhIGRlZmF1bHQgaW1wb3J0IG9yIG5hbWVkIGJpbmRpbmdzLCBidXQgbm90IGJvdGguXCIsXG4gIFR5cGVNb2RpZmllcklzVXNlZEluVHlwZUV4cG9ydHM6XG4gICAgXCJUaGUgJ3R5cGUnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIG9uIGEgbmFtZWQgZXhwb3J0IHdoZW4gJ2V4cG9ydCB0eXBlJyBpcyB1c2VkIG9uIGl0cyBleHBvcnQgc3RhdGVtZW50LlwiLFxuICBUeXBlTW9kaWZpZXJJc1VzZWRJblR5cGVJbXBvcnRzOlxuICAgIFwiVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGltcG9ydCB3aGVuICdpbXBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgaW1wb3J0IHN0YXRlbWVudC5cIixcbiAgVW5leHBlY3RlZFBhcmFtZXRlck1vZGlmaWVyOlxuICAgIFwiQSBwYXJhbWV0ZXIgcHJvcGVydHkgaXMgb25seSBhbGxvd2VkIGluIGEgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb24uXCIsXG4gIFVuZXhwZWN0ZWRSZWFkb25seTpcbiAgICBcIidyZWFkb25seScgdHlwZSBtb2RpZmllciBpcyBvbmx5IHBlcm1pdHRlZCBvbiBhcnJheSBhbmQgdHVwbGUgbGl0ZXJhbCB0eXBlcy5cIixcbiAgVW5leHBlY3RlZFR5cGVBbm5vdGF0aW9uOiBcIkRpZCBub3QgZXhwZWN0IGEgdHlwZSBhbm5vdGF0aW9uIGhlcmUuXCIsXG4gIFVuZXhwZWN0ZWRUeXBlQ2FzdEluUGFyYW1ldGVyOiBcIlVuZXhwZWN0ZWQgdHlwZSBjYXN0IGluIHBhcmFtZXRlciBwb3NpdGlvbi5cIixcbiAgVW5zdXBwb3J0ZWRJbXBvcnRUeXBlQXJndW1lbnQ6XG4gICAgXCJBcmd1bWVudCBpbiBhIHR5cGUgaW1wb3J0IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC5cIixcbiAgVW5zdXBwb3J0ZWRQYXJhbWV0ZXJQcm9wZXJ0eUtpbmQ6XG4gICAgXCJBIHBhcmFtZXRlciBwcm9wZXJ0eSBtYXkgbm90IGJlIGRlY2xhcmVkIHVzaW5nIGEgYmluZGluZyBwYXR0ZXJuLlwiLFxuICBVbnN1cHBvcnRlZFNpZ25hdHVyZVBhcmFtZXRlcktpbmQ6ICh7IHR5cGUgfTogeyB0eXBlOiBzdHJpbmcgfSkgPT5cbiAgICBgTmFtZSBpbiBhIHNpZ25hdHVyZSBtdXN0IGJlIGFuIElkZW50aWZpZXIsIE9iamVjdFBhdHRlcm4gb3IgQXJyYXlQYXR0ZXJuLCBpbnN0ZWFkIGdvdCAke3R5cGV9LmAsXG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgc29ydC1rZXlzICovXG5cbi8vIERvZXNuJ3QgaGFuZGxlIFwidm9pZFwiIG9yIFwibnVsbFwiIGJlY2F1c2UgdGhvc2UgYXJlIGtleXdvcmRzLCBub3QgaWRlbnRpZmllcnMuXG4vLyBJdCBhbHNvIGRvZXNuJ3QgaGFuZGxlIFwiaW50cmluc2ljXCIsIHNpbmNlIHVzdWFsbHkgaXQncyBub3QgYSBrZXl3b3JkLlxuZnVuY3Rpb24ga2V5d29yZFR5cGVGcm9tTmFtZSh2YWx1ZTogc3RyaW5nKTogTi5Uc0tleXdvcmRUeXBlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJUU0FueUtleXdvcmRcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiVFNCb29sZWFuS2V5d29yZFwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcIlRTQmlnSW50S2V5d29yZFwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiVFNOZXZlcktleXdvcmRcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJUU051bWJlcktleXdvcmRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICByZXR1cm4gXCJUU09iamVjdEtleXdvcmRcIjtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJUU1N0cmluZ0tleXdvcmRcIjtcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICByZXR1cm4gXCJUU1N5bWJvbEtleXdvcmRcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJUU1VuZGVmaW5lZEtleXdvcmRcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiVFNVbmtub3duS2V5d29yZFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRzSXNBY2Nlc3NNb2RpZmllcihtb2RpZmllcjogc3RyaW5nKTogbW9kaWZpZXIgaXMgTi5BY2Nlc3NpYmlsaXR5IHtcbiAgcmV0dXJuIChcbiAgICBtb2RpZmllciA9PT0gXCJwcml2YXRlXCIgfHwgbW9kaWZpZXIgPT09IFwicHVibGljXCIgfHwgbW9kaWZpZXIgPT09IFwicHJvdGVjdGVkXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gdHNJc1ZhcmlhbmNlQW5ub3RhdGlvbnMoXG4gIG1vZGlmaWVyOiBzdHJpbmcsXG4pOiBtb2RpZmllciBpcyBOLlZhcmlhbmNlQW5ub3RhdGlvbnMge1xuICByZXR1cm4gbW9kaWZpZXIgPT09IFwiaW5cIiB8fCBtb2RpZmllciA9PT0gXCJvdXRcIjtcbn1cblxudHlwZSBDbGFzc1dpdGhNaXhpbjxcbiAgVCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55KSA9PiBhbnksXG4gIE0gZXh0ZW5kcyBvYmplY3QsXG4+ID0gVCBleHRlbmRzIG5ldyAoLi4uYXJnczogaW5mZXIgUCkgPT4gaW5mZXIgSVxuICA/IG5ldyAoLi4uYXJnczogUCkgPT4gSSAmIE1cbiAgOiBuZXZlcjtcblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IENsYXNzV2l0aE1peGluPHR5cGVvZiBQYXJzZXIsIElKU1hQYXJzZXJNaXhpbj4pID0+XG4gIGNsYXNzIFR5cGVTY3JpcHRQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIGdldFNjb3BlSGFuZGxlcigpOiB7XG4gICAgICBuZXcgKC4uLmFyZ3M6IGFueSk6IFR5cGVTY3JpcHRTY29wZUhhbmRsZXI7XG4gICAgfSB7XG4gICAgICByZXR1cm4gVHlwZVNjcmlwdFNjb3BlSGFuZGxlcjtcbiAgICB9XG5cbiAgICB0c0lzSWRlbnRpZmllcigpOiBib29sZWFuIHtcbiAgICAgIC8vIFRPRE86IGFjdHVhbGx5IGEgYml0IG1vcmUgY29tcGxleCBpbiBUeXBlU2NyaXB0LCBidXQgc2hvdWxkbid0IG1hdHRlci5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE1MDA4XG4gICAgICByZXR1cm4gdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKTtcbiAgICB9XG5cbiAgICB0c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5tYXRjaCh0dC5icmFja2V0TCkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNlTCkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5lbGxpcHNpcykgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnByaXZhdGVOYW1lKSB8fFxuICAgICAgICAgIHRoaXMuaXNMaXRlcmFsUHJvcGVydHlOYW1lKCkpICYmXG4gICAgICAgICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzTmV4dFRva2VuQ2FuRm9sbG93TW9kaWZpZXIoKSB7XG4gICAgICAvLyBOb3RlOiBUeXBlU2NyaXB0J3MgaW1wbGVtZW50YXRpb24gaXMgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2VcbiAgICAgIC8vIG1vcmUgdGhpbmdzIGFyZSBjb25zaWRlcmVkIG1vZGlmaWVycyB0aGVyZS5cbiAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBoYW5kbGVzIG1vZGlmaWVycyBub3QgaGFuZGxlZCBieSBAYmFiZWwvcGFyc2VyIGl0c2VsZi4gQW5kIFwic3RhdGljXCIuXG4gICAgICAvLyBUT0RPOiBXb3VsZCBiZSBuaWNlIHRvIGF2b2lkIGxvb2thaGVhZC4gV2FudCBhIGhhc0xpbmVCcmVha1VwTmV4dCgpIG1ldGhvZC4uLlxuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy50c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKTtcbiAgICB9XG5cbiAgICAvKiogUGFyc2VzIGEgbW9kaWZpZXIgbWF0Y2hpbmcgb25lIHRoZSBnaXZlbiBtb2RpZmllciBuYW1lcy4gKi9cbiAgICB0c1BhcnNlTW9kaWZpZXI8VCBleHRlbmRzIFRzTW9kaWZpZXI+KFxuICAgICAgYWxsb3dlZE1vZGlmaWVyczogVFtdLFxuICAgICAgc3RvcE9uU3RhcnRPZkNsYXNzU3RhdGljQmxvY2s/OiBib29sZWFuLFxuICAgICk6IFQgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS50eXBlICE9PSB0dC5faW4gJiZcbiAgICAgICAgdGhpcy5zdGF0ZS50eXBlICE9PSB0dC5fY29uc3RcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RpZmllciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBpZiAoYWxsb3dlZE1vZGlmaWVycy5pbmRleE9mKG1vZGlmaWVyKSAhPT0gLTEpIHtcbiAgICAgICAgaWYgKHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrICYmIHRoaXMudHNJc1N0YXJ0T2ZTdGF0aWNCbG9ja3MoKSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudHNUcnlQYXJzZSh0aGlzLnRzTmV4dFRva2VuQ2FuRm9sbG93TW9kaWZpZXIuYmluZCh0aGlzKSkpIHtcbiAgICAgICAgICByZXR1cm4gbW9kaWZpZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIFBhcnNlcyBhIGxpc3Qgb2YgbW9kaWZpZXJzLCBpbiBhbnkgb3JkZXIuXG4gICAgICogIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgb3JkZXIsIHlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lczpcbiAgICAgKiAgICB0aGlzLnRzUGFyc2VNb2RpZmllcnMoeyBtb2RpZmllZDogbm9kZSwgYWxsb3dlZE1vZGlmaWVyczogW1wicHVibGljXCJdIH0pO1xuICAgICAqICAgIHRoaXMudHNQYXJzZU1vZGlmaWVycyh7IG1vZGlmaWVkOiBub2RlLCBhbGxvd2VkTW9kaWZpZXJzOiBbXCJhYnN0cmFjdFwiLCBcInJlYWRvbmx5XCJdIH0pO1xuICAgICAqL1xuICAgIHRzUGFyc2VNb2RpZmllcnM8TiBleHRlbmRzIE1vZGlmaWVyQmFzZT4oXG4gICAgICB7XG4gICAgICAgIGFsbG93ZWRNb2RpZmllcnMsXG4gICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnMsXG4gICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrLFxuICAgICAgICBlcnJvclRlbXBsYXRlID0gVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlTWVtYmVyLFxuICAgICAgfToge1xuICAgICAgICBhbGxvd2VkTW9kaWZpZXJzOiByZWFkb25seSBUc01vZGlmaWVyW107XG4gICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM/OiBUc01vZGlmaWVyW107XG4gICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrPzogYm9vbGVhbjtcbiAgICAgICAgZXJyb3JUZW1wbGF0ZT86IHR5cGVvZiBUU0Vycm9ycy5JbnZhbGlkTW9kaWZpZXJPblR5cGVNZW1iZXI7XG4gICAgICB9LFxuICAgICAgbW9kaWZpZWQ6IE4sXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBlbmZvcmNlT3JkZXIgPSAoXG4gICAgICAgIGxvYzogUG9zaXRpb24sXG4gICAgICAgIG1vZGlmaWVyOiBUc01vZGlmaWVyLFxuICAgICAgICBiZWZvcmU6IFRzTW9kaWZpZXIsXG4gICAgICAgIGFmdGVyOiBUc01vZGlmaWVyLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChtb2RpZmllciA9PT0gYmVmb3JlICYmIG1vZGlmaWVkW2FmdGVyXSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyc09yZGVyLCB7XG4gICAgICAgICAgICBhdDogbG9jLFxuICAgICAgICAgICAgb3JkZXJlZE1vZGlmaWVyczogW2JlZm9yZSwgYWZ0ZXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgaW5jb21wYXRpYmxlID0gKFxuICAgICAgICBsb2M6IFBvc2l0aW9uLFxuICAgICAgICBtb2RpZmllcjogVHNNb2RpZmllcixcbiAgICAgICAgbW9kMTogVHNNb2RpZmllcixcbiAgICAgICAgbW9kMjogVHNNb2RpZmllcixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKG1vZGlmaWVkW21vZDFdICYmIG1vZGlmaWVyID09PSBtb2QyKSB8fFxuICAgICAgICAgIChtb2RpZmllZFttb2QyXSAmJiBtb2RpZmllciA9PT0gbW9kMSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmNvbXBhdGlibGVNb2RpZmllcnMsIHtcbiAgICAgICAgICAgIGF0OiBsb2MsXG4gICAgICAgICAgICBtb2RpZmllcnM6IFttb2QxLCBtb2QyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCB7IHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBtb2RpZmllcjogVHNNb2RpZmllciB8IHVuZGVmaW5lZCB8IG51bGwgPSB0aGlzLnRzUGFyc2VNb2RpZmllcihcbiAgICAgICAgICBhbGxvd2VkTW9kaWZpZXJzLmNvbmNhdChkaXNhbGxvd2VkTW9kaWZpZXJzID8/IFtdKSxcbiAgICAgICAgICBzdG9wT25TdGFydE9mQ2xhc3NTdGF0aWNCbG9jayxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW1vZGlmaWVyKSBicmVhaztcblxuICAgICAgICBpZiAodHNJc0FjY2Vzc01vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgIGlmIChtb2RpZmllZC5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkR1cGxpY2F0ZUFjY2Vzc2liaWxpdHlNb2RpZmllciwge1xuICAgICAgICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgICAgICAgIG1vZGlmaWVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIG1vZGlmaWVyLCBcIm92ZXJyaWRlXCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgbW9kaWZpZXIsIFwic3RhdGljXCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgbW9kaWZpZXIsIFwicmVhZG9ubHlcIik7XG5cbiAgICAgICAgICAgIG1vZGlmaWVkLmFjY2Vzc2liaWxpdHkgPSBtb2RpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHNJc1ZhcmlhbmNlQW5ub3RhdGlvbnMobW9kaWZpZXIpKSB7XG4gICAgICAgICAgaWYgKG1vZGlmaWVkW21vZGlmaWVyXSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EdXBsaWNhdGVNb2RpZmllciwgeyBhdDogc3RhcnRMb2MsIG1vZGlmaWVyIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZFttb2RpZmllcl0gPSB0cnVlO1xuXG4gICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJpblwiLCBcIm91dFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kaWZpZWQsIG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EdXBsaWNhdGVNb2RpZmllciwgeyBhdDogc3RhcnRMb2MsIG1vZGlmaWVyIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmZvcmNlT3JkZXIoc3RhcnRMb2MsIG1vZGlmaWVyLCBcInN0YXRpY1wiLCBcInJlYWRvbmx5XCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJzdGF0aWNcIiwgXCJvdmVycmlkZVwiKTtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIFwib3ZlcnJpZGVcIiwgXCJyZWFkb25seVwiKTtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIFwiYWJzdHJhY3RcIiwgXCJvdmVycmlkZVwiKTtcblxuICAgICAgICAgICAgaW5jb21wYXRpYmxlKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJkZWNsYXJlXCIsIFwib3ZlcnJpZGVcIik7XG4gICAgICAgICAgICBpbmNvbXBhdGlibGUoc3RhcnRMb2MsIG1vZGlmaWVyLCBcInN0YXRpY1wiLCBcImFic3RyYWN0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZFttb2RpZmllcl0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc2FsbG93ZWRNb2RpZmllcnM/LmluY2x1ZGVzKG1vZGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoZXJyb3JUZW1wbGF0ZSwge1xuICAgICAgICAgICAgYXQ6IHN0YXJ0TG9jLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0lzTGlzdFRlcm1pbmF0b3Ioa2luZDogUGFyc2luZ0NvbnRleHQpOiBib29sZWFuIHtcbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIFwiRW51bU1lbWJlcnNcIjpcbiAgICAgICAgY2FzZSBcIlR5cGVNZW1iZXJzXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQuYnJhY2VSKTtcbiAgICAgICAgY2FzZSBcIkhlcml0YWdlQ2xhdXNlRWxlbWVudFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmJyYWNlTCk7XG4gICAgICAgIGNhc2UgXCJUdXBsZUVsZW1lbnRUeXBlc1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmJyYWNrZXRSKTtcbiAgICAgICAgY2FzZSBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5ndCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZUxpc3Q8VCBleHRlbmRzIE4uTm9kZT4oXG4gICAgICBraW5kOiBQYXJzaW5nQ29udGV4dCxcbiAgICAgIHBhcnNlRWxlbWVudDogKCkgPT4gVCxcbiAgICApOiBUW10ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgICAgIHdoaWxlICghdGhpcy50c0lzTGlzdFRlcm1pbmF0b3Ioa2luZCkpIHtcbiAgICAgICAgLy8gU2tpcHBpbmcgXCJwYXJzZUxpc3RFbGVtZW50XCIgZnJvbSB0aGUgVFMgc291cmNlIHNpbmNlIHRoYXQncyBqdXN0IGZvciBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VFbGVtZW50KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlRGVsaW1pdGVkTGlzdDxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICAgIGtpbmQ6IFBhcnNpbmdDb250ZXh0LFxuICAgICAgcGFyc2VFbGVtZW50OiAoKSA9PiBULFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHtcbiAgICAgIHJldHVybiBub25OdWxsKFxuICAgICAgICB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0V29ya2VyKFxuICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgcGFyc2VFbGVtZW50LFxuICAgICAgICAgIC8qIGV4cGVjdFN1Y2Nlc3MgKi8gdHJ1ZSxcbiAgICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiAhZXhwZWN0U3VjY2VzcywgcmV0dXJucyB1bmRlZmluZWQgaW5zdGVhZCBvZiBmYWlsaW5nIHRvIHBhcnNlLlxuICAgICAqIElmIGV4cGVjdFN1Y2Nlc3MsIHBhcnNlRWxlbWVudCBzaG91bGQgYWx3YXlzIHJldHVybiBhIGRlZmluZWQgdmFsdWUuXG4gICAgICovXG4gICAgdHNQYXJzZURlbGltaXRlZExpc3RXb3JrZXI8VCBleHRlbmRzIE4uTm9kZT4oXG4gICAgICBraW5kOiBQYXJzaW5nQ29udGV4dCxcbiAgICAgIHBhcnNlRWxlbWVudDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBleHBlY3RTdWNjZXNzOiBib29sZWFuLFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgIGxldCB0cmFpbGluZ0NvbW1hUG9zID0gLTE7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMudHNJc0xpc3RUZXJtaW5hdG9yKGtpbmQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdHJhaWxpbmdDb21tYVBvcyA9IC0xO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJzZUVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmNvbW1hKSkge1xuICAgICAgICAgIHRyYWlsaW5nQ29tbWFQb3MgPSB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRzSXNMaXN0VGVybWluYXRvcihraW5kKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cGVjdFN1Y2Nlc3MpIHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIGFib3V0IGEgbWlzc2luZyBjb21tYVxuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmVHJhaWxpbmdDb21tYVBvcykge1xuICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLnZhbHVlID0gdHJhaWxpbmdDb21tYVBvcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlQnJhY2tldGVkTGlzdDxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICAgIGtpbmQ6IFBhcnNpbmdDb250ZXh0LFxuICAgICAgcGFyc2VFbGVtZW50OiAoKSA9PiBULFxuICAgICAgYnJhY2tldDogYm9vbGVhbixcbiAgICAgIHNraXBGaXJzdFRva2VuOiBib29sZWFuLFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHtcbiAgICAgIGlmICghc2tpcEZpcnN0VG9rZW4pIHtcbiAgICAgICAgaWYgKGJyYWNrZXQpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQubHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHNQYXJzZURlbGltaXRlZExpc3QoXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHBhcnNlRWxlbWVudCxcbiAgICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcyxcbiAgICAgICk7XG5cbiAgICAgIGlmIChicmFja2V0KSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0Lmd0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW1wb3J0VHlwZSgpOiBOLlRzSW1wb3J0VHlwZSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0ltcG9ydFR5cGU+KCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5faW1wb3J0KTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkSW1wb3J0VHlwZUFyZ3VtZW50LCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB0byBlc3RyZWUgd2UgY2Fubm90IGNhbGwgcGFyc2VMaXRlcmFsIGRpcmVjdGx5IGhlcmVcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBzdXBlci5wYXJzZUV4cHJBdG9tKCkgYXMgTi5TdHJpbmdMaXRlcmFsO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgdGhlIGVudGl0eSBuYW1lIHdpbGwgYWN0dWFsbHkgaXRzZWxmIGJlIGFcbiAgICAgICAgLy8gcXVhbGlmaWVyLCBzbyBhbGxvdyBpdCB0byBiZSBhIHJlc2VydmVkIHdvcmQgYXMgd2VsbC5cbiAgICAgICAgbm9kZS5xdWFsaWZpZXIgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0ltcG9ydFR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUVudGl0eU5hbWUoYWxsb3dSZXNlcnZlZFdvcmRzOiBib29sZWFuID0gdHJ1ZSk6IE4uVHNFbnRpdHlOYW1lIHtcbiAgICAgIGxldCBlbnRpdHk6IE4uVHNFbnRpdHlOYW1lID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoYWxsb3dSZXNlcnZlZFdvcmRzKTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5kb3QpKSB7XG4gICAgICAgIGNvbnN0IG5vZGU6IFVuZG9uZTxOLlRzUXVhbGlmaWVkTmFtZT4gPVxuICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXROb2RlPE4uVHNRdWFsaWZpZWROYW1lPihlbnRpdHkpO1xuICAgICAgICBub2RlLmxlZnQgPSBlbnRpdHk7XG4gICAgICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcihhbGxvd1Jlc2VydmVkV29yZHMpO1xuICAgICAgICBlbnRpdHkgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1F1YWxpZmllZE5hbWVcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlUmVmZXJlbmNlKCk6IE4uVHNUeXBlUmVmZXJlbmNlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVJlZmVyZW5jZT4oKTtcbiAgICAgIG5vZGUudHlwZU5hbWUgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICBpZiAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVSZWZlcmVuY2VcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVRoaXNUeXBlUHJlZGljYXRlKGxoczogTi5Uc1RoaXNUeXBlKTogTi5Uc1R5cGVQcmVkaWNhdGUge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc1R5cGVQcmVkaWNhdGU+KGxocyk7XG4gICAgICBub2RlLnBhcmFtZXRlck5hbWUgPSBsaHM7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZUFubm90YXRpb24oLyogZWF0Q29sb24gKi8gZmFsc2UpO1xuICAgICAgbm9kZS5hc3NlcnRzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUHJlZGljYXRlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUaGlzVHlwZU5vZGUoKTogTi5Uc1RoaXNUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVGhpc1R5cGU+KCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1RoaXNUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlUXVlcnkoKTogTi5Uc1R5cGVRdWVyeSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVRdWVyeT4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0Ll90eXBlb2YpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2ltcG9ydCkpIHtcbiAgICAgICAgbm9kZS5leHByTmFtZSA9IHRoaXMudHNQYXJzZUltcG9ydFR5cGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuZXhwck5hbWUgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVRdWVyeVwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW5PdXRNb2RpZmllcnMgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJpblwiLCBcIm91dFwiXSxcbiAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcbiAgICAgICAgXCJjb25zdFwiLFxuICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgXCJyZWFkb25seVwiLFxuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICBdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZUNvbnN0TW9kaWZpZXIgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJjb25zdFwiXSxcbiAgICAgIC8vIGZvciBiZXR0ZXIgZXJyb3IgcmVjb3ZlcnlcbiAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcImluXCIsIFwib3V0XCJdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyUG9zaXRpb25zLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZUluT3V0Q29uc3RNb2RpZmllcnMgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJpblwiLCBcIm91dFwiLCBcImNvbnN0XCJdLFxuICAgICAgZGlzYWxsb3dlZE1vZGlmaWVyczogW1xuICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgXCJyZWFkb25seVwiLFxuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICBdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZVR5cGVQYXJhbWV0ZXIoXG4gICAgICBwYXJzZU1vZGlmaWVyczogKG5vZGU6IFVuZG9uZTxOLlRzVHlwZVBhcmFtZXRlcj4pID0+IHZvaWQsXG4gICAgKTogTi5Uc1R5cGVQYXJhbWV0ZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyPigpO1xuXG4gICAgICBwYXJzZU1vZGlmaWVycyhub2RlKTtcblxuICAgICAgbm9kZS5uYW1lID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlck5hbWUoKTtcbiAgICAgIG5vZGUuY29uc3RyYWludCA9IHRoaXMudHNFYXRUaGVuUGFyc2VUeXBlKHR0Ll9leHRlbmRzKTtcbiAgICAgIG5vZGUuZGVmYXVsdCA9IHRoaXMudHNFYXRUaGVuUGFyc2VUeXBlKHR0LmVxKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVQYXJhbWV0ZXJcIik7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgcGFyc2VNb2RpZmllcnM6IChub2RlOiBOLlRzVHlwZVBhcmFtZXRlcikgPT4gdm9pZCxcbiAgICApOiBOLlRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJzKHBhcnNlTW9kaWZpZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZVBhcmFtZXRlcnMocGFyc2VNb2RpZmllcnM6IChub2RlOiBOLlRzVHlwZVBhcmFtZXRlcikgPT4gdm9pZCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+KCk7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWZUcmFpbGluZ0NvbW1hUG9zID0geyB2YWx1ZTogLTEgfTtcblxuICAgICAgbm9kZS5wYXJhbXMgPSB0aGlzLnRzUGFyc2VCcmFja2V0ZWRMaXN0KFxuICAgICAgICBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIixcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlUGFyYW1ldGVyLmJpbmQodGhpcywgcGFyc2VNb2RpZmllcnMpLFxuICAgICAgICAvKiBicmFja2V0ICovIGZhbHNlLFxuICAgICAgICAvKiBza2lwRmlyc3RUb2tlbiAqLyB0cnVlLFxuICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLFxuICAgICAgKTtcbiAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5FbXB0eVR5cGVQYXJhbWV0ZXJzLCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZlRyYWlsaW5nQ29tbWFQb3MudmFsdWUgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuYWRkRXh0cmEobm9kZSwgXCJ0cmFpbGluZ0NvbW1hXCIsIHJlZlRyYWlsaW5nQ29tbWFQb3MudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IEluIFR5cGVTY3JpcHQgaW1wbGVtZW50YXRpb24gd2UgbXVzdCBwcm92aWRlIGB5aWVsZENvbnRleHRgIGFuZCBgYXdhaXRDb250ZXh0YCxcbiAgICAvLyBidXQgaGVyZSBpdCdzIGFsd2F5cyBmYWxzZSwgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdHlwZXMuXG4gICAgdHNGaWxsU2lnbmF0dXJlKFxuICAgICAgcmV0dXJuVG9rZW46IFRva2VuVHlwZSxcbiAgICAgIHNpZ25hdHVyZTogVW5kb25lPE4uVHNTaWduYXR1cmVEZWNsYXJhdGlvbj4sXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBcnJvdyBmbnMgKm11c3QqIGhhdmUgcmV0dXJuIHRva2VuIChgPT5gKS4gTm9ybWFsIGZ1bmN0aW9ucyBjYW4gb21pdCBpdC5cbiAgICAgIGNvbnN0IHJldHVyblRva2VuUmVxdWlyZWQgPSByZXR1cm5Ub2tlbiA9PT0gdHQuYXJyb3c7XG5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9pc3N1ZXMvOTIzMVxuICAgICAgY29uc3QgcGFyYW1zS2V5ID0gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IFwicGFyYW1zXCIgOiBcInBhcmFtZXRlcnNcIjtcbiAgICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgID8gXCJyZXR1cm5UeXBlXCJcbiAgICAgICAgOiBcInR5cGVBbm5vdGF0aW9uXCI7XG5cbiAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBzaWduYXR1cmVbcGFyYW1zS2V5XSA9IHRoaXMudHNQYXJzZUJpbmRpbmdMaXN0Rm9yU2lnbmF0dXJlKCk7XG4gICAgICBpZiAocmV0dXJuVG9rZW5SZXF1aXJlZCkge1xuICAgICAgICBzaWduYXR1cmVbcmV0dXJuVHlwZUtleV0gPVxuICAgICAgICAgIHRoaXMudHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKHJldHVyblRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChyZXR1cm5Ub2tlbikpIHtcbiAgICAgICAgc2lnbmF0dXJlW3JldHVyblR5cGVLZXldID1cbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlT3JUeXBlUHJlZGljYXRlQW5ub3RhdGlvbihyZXR1cm5Ub2tlbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZUJpbmRpbmdMaXN0Rm9yU2lnbmF0dXJlKCk6IEFycmF5PFxuICAgICAgTi5JZGVudGlmaWVyIHwgTi5SZXN0RWxlbWVudCB8IE4uT2JqZWN0UGF0dGVybiB8IE4uQXJyYXlQYXR0ZXJuXG4gICAgPiB7XG4gICAgICBjb25zdCBsaXN0ID0gc3VwZXIucGFyc2VCaW5kaW5nTGlzdChcbiAgICAgICAgdHQucGFyZW5SLFxuICAgICAgICBjaGFyQ29kZXMucmlnaHRQYXJlbnRoZXNpcyxcbiAgICAgICAgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0ZVTkNUSU9OX1BBUkFNUyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IHR5cGUgfSA9IHBhdHRlcm47XG4gICAgICAgIGlmICh0eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgfHwgdHlwZSA9PT0gXCJUU1BhcmFtZXRlclByb3BlcnR5XCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkU2lnbmF0dXJlUGFyYW1ldGVyS2luZCwge1xuICAgICAgICAgICAgYXQ6IHBhdHRlcm4sXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdCBhcyBFeGNsdWRlPFxuICAgICAgICAodHlwZW9mIGxpc3QpWzBdLFxuICAgICAgICBOLkFzc2lnbm1lbnRQYXR0ZXJuIHwgTi5UU1BhcmFtZXRlclByb3BlcnR5XG4gICAgICA+W107XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVNZW1iZXJTZW1pY29sb24oKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuZWF0KHR0LmNvbW1hKSAmJiAhdGhpcy5pc0xpbmVUZXJtaW5hdG9yKCkpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuc2VtaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZVNpZ25hdHVyZU1lbWJlcihcbiAgICAgIGtpbmQ6IFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIiB8IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgICAgbm9kZTogVW5kb25lPFxuICAgICAgICBOLlRzQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uIHwgTi5Uc0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXG4gICAgICA+LFxuICAgICk6IE4uVHNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24gfCBOLlRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICAgICAgdGhpcy50c0ZpbGxTaWduYXR1cmUodHQuY29sb24sIG5vZGUpO1xuICAgICAgdGhpcy50c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBraW5kKTtcbiAgICB9XG5cbiAgICB0c0lzVW5hbWJpZ3VvdXNseUluZGV4U2lnbmF0dXJlKCkge1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIFNraXAgJ3snXG4gICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQuY29sb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VJbmRleFNpZ25hdHVyZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzSW5kZXhTaWduYXR1cmU+LFxuICAgICk6IE4uVHNJbmRleFNpZ25hdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoXG4gICAgICAgICEoXG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFja2V0TCkgJiZcbiAgICAgICAgICB0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1VuYW1iaWd1b3VzbHlJbmRleFNpZ25hdHVyZS5iaW5kKHRoaXMpKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBpZC50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oaWQpOyAvLyBzZXQgZW5kIHBvc2l0aW9uIHRvIGVuZCBvZiB0eXBlXG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIG5vZGUucGFyYW1ldGVycyA9IFtpZF07XG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgaWYgKHR5cGUpIG5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgdGhpcy50c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTSW5kZXhTaWduYXR1cmVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUoXG4gICAgICBub2RlOiBOLlRzUHJvcGVydHlTaWduYXR1cmUgfCBOLlRzTWV0aG9kU2lnbmF0dXJlLFxuICAgICAgcmVhZG9ubHk6IGJvb2xlYW4sXG4gICAgKTogTi5Uc1Byb3BlcnR5U2lnbmF0dXJlIHwgTi5Uc01ldGhvZFNpZ25hdHVyZSB7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSBub2RlLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG5vZGVBbnk6IGFueSA9IG5vZGU7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkgfHwgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5SZWFkb25seUZvck1ldGhvZFNpZ25hdHVyZSwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRob2Q6IE4uVHNNZXRob2RTaWduYXR1cmUgPSBub2RlQW55O1xuICAgICAgICBpZiAobWV0aG9kLmtpbmQgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFjY2Vzb3JDYW5ub3RIYXZlVHlwZVBhcmFtZXRlcnMsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50c0ZpbGxTaWduYXR1cmUodHQuY29sb24sIG1ldGhvZCk7XG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVNZW1iZXJTZW1pY29sb24oKTtcbiAgICAgICAgY29uc3QgcGFyYW1zS2V5ID0gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICAgID8gXCJwYXJhbXNcIlxuICAgICAgICAgIDogXCJwYXJhbWV0ZXJzXCI7XG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgICAgPyBcInJldHVyblR5cGVcIlxuICAgICAgICAgIDogXCJ0eXBlQW5ub3RhdGlvblwiO1xuICAgICAgICBpZiAobWV0aG9kLmtpbmQgPT09IFwiZ2V0XCIpIHtcbiAgICAgICAgICBpZiAobWV0aG9kW3BhcmFtc0tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQmFkR2V0dGVyQXJpdHksIHsgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVGhpc1BhcmFtKG1ldGhvZFtwYXJhbXNLZXldWzBdKSkge1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFjY2Vzb3JDYW5ub3REZWNsYXJlVGhpc1BhcmFtZXRlciwge1xuICAgICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2Qua2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICAgIGlmIChtZXRob2RbcGFyYW1zS2V5XS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlckFyaXR5LCB7IGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gbWV0aG9kW3BhcmFtc0tleV1bMF07XG4gICAgICAgICAgICBpZiAodGhpcy5pc1RoaXNQYXJhbShmaXJzdFBhcmFtZXRlcikpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5BY2Nlc29yQ2Fubm90RGVjbGFyZVRoaXNQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmlyc3RQYXJhbWV0ZXIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgICAgZmlyc3RQYXJhbWV0ZXIub3B0aW9uYWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlNldEFjY2Vzb3JDYW5ub3RIYXZlT3B0aW9uYWxQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFBhcmFtZXRlci50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TZXRBY2Nlc29yQ2Fubm90SGF2ZVJlc3RQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGhvZFtyZXR1cm5UeXBlS2V5XSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TZXRBY2Nlc29yQ2Fubm90SGF2ZVJldHVyblR5cGUsIHtcbiAgICAgICAgICAgICAgYXQ6IG1ldGhvZFtyZXR1cm5UeXBlS2V5XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXRob2Qua2luZCA9IFwibWV0aG9kXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShtZXRob2QsIFwiVFNNZXRob2RTaWduYXR1cmVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eTogTi5Uc1Byb3BlcnR5U2lnbmF0dXJlID0gbm9kZUFueTtcbiAgICAgICAgaWYgKHJlYWRvbmx5KSBwcm9wZXJ0eS5yZWFkb25seSA9IHRydWU7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgICBpZiAodHlwZSkgcHJvcGVydHkudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlTWVtYmVyU2VtaWNvbG9uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcGVydHksIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZU1lbWJlcigpOiBOLlRzVHlwZUVsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZTogYW55ID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlU2lnbmF0dXJlTWVtYmVyKFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIiwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9uZXcpKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5zdGFydE5vZGU8Ti5JZGVudGlmaWVyPigpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VTaWduYXR1cmVNZW1iZXIoXG4gICAgICAgICAgICBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmtleSA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihpZCwgXCJuZXdcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUobm9kZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHNQYXJzZU1vZGlmaWVycyhcbiAgICAgICAge1xuICAgICAgICAgIGFsbG93ZWRNb2RpZmllcnM6IFtcInJlYWRvbmx5XCJdLFxuICAgICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcbiAgICAgICAgICAgIFwiZGVjbGFyZVwiLFxuICAgICAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICAgICAgXCJwcml2YXRlXCIsXG4gICAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgICAgXCJwdWJsaWNcIixcbiAgICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMudHNUcnlQYXJzZUluZGV4U2lnbmF0dXJlKG5vZGUpO1xuICAgICAgaWYgKGlkeCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgfVxuXG4gICAgICBzdXBlci5wYXJzZVByb3BlcnR5TmFtZShub2RlKTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5vZGUuY29tcHV0ZWQgJiZcbiAgICAgICAgbm9kZS5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgKG5vZGUua2V5Lm5hbWUgPT09IFwiZ2V0XCIgfHwgbm9kZS5rZXkubmFtZSA9PT0gXCJzZXRcIikgJiZcbiAgICAgICAgdGhpcy50c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKVxuICAgICAgKSB7XG4gICAgICAgIG5vZGUua2luZCA9IG5vZGUua2V5Lm5hbWU7XG4gICAgICAgIHN1cGVyLnBhcnNlUHJvcGVydHlOYW1lKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUobm9kZSwgISFub2RlLnJlYWRvbmx5KTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUxpdGVyYWwoKTogTi5Uc1R5cGVMaXRlcmFsIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZUxpdGVyYWw+KCk7XG4gICAgICBub2RlLm1lbWJlcnMgPSB0aGlzLnRzUGFyc2VPYmplY3RUeXBlTWVtYmVycygpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZUxpdGVyYWxcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZU9iamVjdFR5cGVNZW1iZXJzKCk6IEFycmF5PE4uVHNUeXBlRWxlbWVudD4ge1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLnRzUGFyc2VMaXN0KFxuICAgICAgICBcIlR5cGVNZW1iZXJzXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVNZW1iZXIuYmluZCh0aGlzKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgfVxuXG4gICAgdHNJc1N0YXJ0T2ZNYXBwZWRUeXBlKCk6IGJvb2xlYW4ge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAodGhpcy5lYXQodHQucGx1c01pbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9yZWFkb25seSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3JlYWRvbmx5KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoIXRoaXMudHNJc0lkZW50aWZpZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Ll9pbik7XG4gICAgfVxuXG4gICAgdHNQYXJzZU1hcHBlZFR5cGVQYXJhbWV0ZXIoKTogTi5Uc1R5cGVQYXJhbWV0ZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyPigpO1xuICAgICAgbm9kZS5uYW1lID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlck5hbWUoKTtcbiAgICAgIG5vZGUuY29uc3RyYWludCA9IHRoaXMudHNFeHBlY3RUaGVuUGFyc2VUeXBlKHR0Ll9pbik7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUGFyYW1ldGVyXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNYXBwZWRUeXBlKCk6IE4uVHNNYXBwZWRUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTWFwcGVkVHlwZT4oKTtcblxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGx1c01pbikpIHtcbiAgICAgICAgbm9kZS5yZWFkb25seSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX3JlYWRvbmx5KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9yZWFkb25seSkpIHtcbiAgICAgICAgbm9kZS5yZWFkb25seSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRMKTtcbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlciA9IHRoaXMudHNQYXJzZU1hcHBlZFR5cGVQYXJhbWV0ZXIoKTtcbiAgICAgIG5vZGUubmFtZVR5cGUgPSB0aGlzLmVhdENvbnRleHR1YWwodHQuX2FzKSA/IHRoaXMudHNQYXJzZVR5cGUoKSA6IG51bGw7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGx1c01pbikpIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICBub2RlLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNUcnlQYXJzZVR5cGUoKTtcbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNNYXBwZWRUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUdXBsZVR5cGUoKTogTi5Uc1R1cGxlVHlwZSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R1cGxlVHlwZT4oKTtcbiAgICAgIG5vZGUuZWxlbWVudFR5cGVzID0gdGhpcy50c1BhcnNlQnJhY2tldGVkTGlzdChcbiAgICAgICAgXCJUdXBsZUVsZW1lbnRUeXBlc1wiLFxuICAgICAgICB0aGlzLnRzUGFyc2VUdXBsZUVsZW1lbnRUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIC8qIGJyYWNrZXQgKi8gdHJ1ZSxcbiAgICAgICAgLyogc2tpcEZpcnN0VG9rZW4gKi8gZmFsc2UsXG4gICAgICApO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgZWxlbWVudFR5cGVzIHRvIGVuc3VyZSB0aGF0IG5vIG1hbmRhdG9yeSBlbGVtZW50c1xuICAgICAgLy8gZm9sbG93IG9wdGlvbmFsIGVsZW1lbnRzXG4gICAgICBsZXQgc2Vlbk9wdGlvbmFsRWxlbWVudCA9IGZhbHNlO1xuICAgICAgbGV0IGxhYmVsZWRFbGVtZW50czogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICAgICAgbm9kZS5lbGVtZW50VHlwZXMuZm9yRWFjaChlbGVtZW50Tm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gZWxlbWVudE5vZGU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlZW5PcHRpb25hbEVsZW1lbnQgJiZcbiAgICAgICAgICB0eXBlICE9PSBcIlRTUmVzdFR5cGVcIiAmJlxuICAgICAgICAgIHR5cGUgIT09IFwiVFNPcHRpb25hbFR5cGVcIiAmJlxuICAgICAgICAgICEodHlwZSA9PT0gXCJUU05hbWVkVHVwbGVNZW1iZXJcIiAmJiBlbGVtZW50Tm9kZS5vcHRpb25hbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5PcHRpb25hbFR5cGVCZWZvcmVSZXF1aXJlZCwge1xuICAgICAgICAgICAgYXQ6IGVsZW1lbnROb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2Vlbk9wdGlvbmFsRWxlbWVudCB8fD1cbiAgICAgICAgICAodHlwZSA9PT0gXCJUU05hbWVkVHVwbGVNZW1iZXJcIiAmJiBlbGVtZW50Tm9kZS5vcHRpb25hbCkgfHxcbiAgICAgICAgICB0eXBlID09PSBcIlRTT3B0aW9uYWxUeXBlXCI7XG5cbiAgICAgICAgLy8gV2hlbiBjaGVja2luZyBsYWJlbHMsIGNoZWNrIHRoZSBhcmd1bWVudCBvZiB0aGUgc3ByZWFkIG9wZXJhdG9yXG4gICAgICAgIGxldCBjaGVja1R5cGUgPSB0eXBlO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJUU1Jlc3RUeXBlXCIpIHtcbiAgICAgICAgICBlbGVtZW50Tm9kZSA9IGVsZW1lbnROb2RlLnR5cGVBbm5vdGF0aW9uO1xuICAgICAgICAgIGNoZWNrVHlwZSA9IGVsZW1lbnROb2RlLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhYmVsZWQgPSBjaGVja1R5cGUgPT09IFwiVFNOYW1lZFR1cGxlTWVtYmVyXCI7XG4gICAgICAgIGxhYmVsZWRFbGVtZW50cyA/Pz0gaXNMYWJlbGVkO1xuICAgICAgICBpZiAobGFiZWxlZEVsZW1lbnRzICE9PSBpc0xhYmVsZWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLk1peGVkTGFiZWxlZEFuZFVubGFiZWxlZEVsZW1lbnRzLCB7XG4gICAgICAgICAgICBhdDogZWxlbWVudE5vZGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUdXBsZVR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR1cGxlRWxlbWVudFR5cGUoKTogTi5Uc05hbWVkVHVwbGVNZW1iZXIgfCBOLlRzVHlwZSB7XG4gICAgICAvLyBwYXJzZXMgYC4uLlRzVHlwZVtdYFxuXG4gICAgICBjb25zdCB7IHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICBjb25zdCByZXN0ID0gdGhpcy5lYXQodHQuZWxsaXBzaXMpO1xuXG4gICAgICBsZXQgbGFiZWxlZDogYm9vbGVhbjtcbiAgICAgIGxldCBsYWJlbDogTi5JZGVudGlmaWVyO1xuICAgICAgbGV0IG9wdGlvbmFsOiBib29sZWFuO1xuICAgICAgbGV0IHR5cGU6IE4uVHNOYW1lZFR1cGxlTWVtYmVyIHwgTi5Uc1R5cGU7XG5cbiAgICAgIGNvbnN0IGlzV29yZCA9IHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICBjb25zdCBjaEFmdGVyV29yZCA9IGlzV29yZCA/IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA6IG51bGw7XG4gICAgICBpZiAoY2hBZnRlcldvcmQgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICBsYWJlbGVkID0gdHJ1ZTtcbiAgICAgICAgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgbGFiZWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgfSBlbHNlIGlmIChjaEFmdGVyV29yZCA9PT0gY2hhckNvZGVzLnF1ZXN0aW9uTWFyaykge1xuICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgY29uc3Qgd29yZE5hbWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgICBjb25zdCB0eXBlT3JMYWJlbCA9IHRoaXMudHNQYXJzZU5vbkFycmF5VHlwZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICAgIGxhYmVsZWQgPSB0cnVlO1xuICAgICAgICAgIGxhYmVsID0gdGhpcy5jcmVhdGVJZGVudGlmaWVyKFxuICAgICAgICAgICAgdGhpcy5zdGFydE5vZGVBdDxOLklkZW50aWZpZXI+KHN0YXJ0TG9jKSxcbiAgICAgICAgICAgIHdvcmROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucXVlc3Rpb24pO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhYmVsZWQgPSBmYWxzZTtcbiAgICAgICAgICB0eXBlID0gdHlwZU9yTGFiZWw7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucXVlc3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICBvcHRpb25hbCA9IHRoaXMuZWF0KHR0LnF1ZXN0aW9uKTtcbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlIChsYWJlbGVkID09PSB0cnVlKSBjb3VsZCBiZSBvbmx5IGluIGludmFsaWQgbGFiZWwuXG4gICAgICAgIC8vIEUuZy4gW3gueTp0eXBlXVxuICAgICAgICAvLyBBbiBlcnJvciBpcyByYWlzZWQgd2hpbGUgcHJvY2Vzc2luZyBub2RlLlxuICAgICAgICBsYWJlbGVkID0gdGhpcy5lYXQodHQuY29sb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFiZWxlZCkge1xuICAgICAgICBsZXQgbGFiZWxlZE5vZGU6IFVuZG9uZTxOLlRzTmFtZWRUdXBsZU1lbWJlcj47XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgIGxhYmVsZWROb2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc05hbWVkVHVwbGVNZW1iZXI+KGxhYmVsKTtcbiAgICAgICAgICBsYWJlbGVkTm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgIGxhYmVsZWROb2RlLmxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgbGFiZWxlZE5vZGUuZWxlbWVudFR5cGUgPSB0eXBlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgICAgbGFiZWxlZE5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5UdXBsZU9wdGlvbmFsQWZ0ZXJUeXBlLCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYWJlbGVkTm9kZSA9IHRoaXMuc3RhcnROb2RlQXROb2RlPE4uVHNOYW1lZFR1cGxlTWVtYmVyPih0eXBlKTtcbiAgICAgICAgICBsYWJlbGVkTm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW52YWxpZFR1cGxlTWVtYmVyTGFiZWwsIHsgYXQ6IHR5cGUgfSk7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGlzIHByb2R1Y2VzIGFuIGludmFsaWQgQVNULCBidXQgYXQgbGVhc3Qgd2UgZG9uJ3QgZHJvcFxuICAgICAgICAgIC8vIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgaW52YWxpZCBzb3VyY2UuXG4gICAgICAgICAgbGFiZWxlZE5vZGUubGFiZWwgPSB0eXBlO1xuICAgICAgICAgIGxhYmVsZWROb2RlLmVsZW1lbnRUeXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobGFiZWxlZE5vZGUsIFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCkge1xuICAgICAgICBjb25zdCBvcHRpb25hbFR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc09wdGlvbmFsVHlwZT4odHlwZSk7XG4gICAgICAgIG9wdGlvbmFsVHlwZU5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlKG9wdGlvbmFsVHlwZU5vZGUsIFwiVFNPcHRpb25hbFR5cGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgIGNvbnN0IHJlc3ROb2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlRzUmVzdFR5cGU+KHN0YXJ0TG9jKTtcbiAgICAgICAgcmVzdE5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlKHJlc3ROb2RlLCBcIlRTUmVzdFR5cGVcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHRzUGFyc2VQYXJlbnRoZXNpemVkVHlwZSgpOiBOLlRzUGFyZW50aGVzaXplZFR5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNQYXJlbnRoZXNpemVkVHlwZT4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VGdW5jdGlvbk9yQ29uc3RydWN0b3JUeXBlKFxuICAgICAgdHlwZTogXCJUU0Z1bmN0aW9uVHlwZVwiIHwgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgICAgYWJzdHJhY3Q/OiBib29sZWFuLFxuICAgICk6IE4uVHNGdW5jdGlvbk9yQ29uc3RydWN0b3JUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxcbiAgICAgICAgTi5Uc0Z1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUgfCBOLlRzQ29uc3RydWN0b3JUeXBlXG4gICAgICA+KCk7XG4gICAgICBpZiAodHlwZSA9PT0gXCJUU0NvbnN0cnVjdG9yVHlwZVwiKSB7XG4gICAgICAgIChub2RlIGFzIFVuZG9uZTxOLlRzQ29uc3RydWN0b3JUeXBlPikuYWJzdHJhY3QgPSAhIWFic3RyYWN0O1xuICAgICAgICBpZiAoYWJzdHJhY3QpIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBuZXdgXG4gICAgICB9XG4gICAgICB0aGlzLnRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0KCgpID0+XG4gICAgICAgIHRoaXMudHNGaWxsU2lnbmF0dXJlKHR0LmFycm93LCBub2RlKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIHR5cGUpO1xuICAgIH1cblxuICAgIHRzUGFyc2VMaXRlcmFsVHlwZU5vZGUoKTogTi5Uc0xpdGVyYWxUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTGl0ZXJhbFR5cGU+KCk7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0Lm51bTpcbiAgICAgICAgY2FzZSB0dC5iaWdpbnQ6XG4gICAgICAgIGNhc2UgdHQuc3RyaW5nOlxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB0byBlc3RyZWUgd2UgY2Fubm90IGNhbGwgcGFyc2VMaXRlcmFsIGRpcmVjdGx5IGhlcmVcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgbm9kZS5saXRlcmFsID0gc3VwZXIucGFyc2VFeHByQXRvbSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTGl0ZXJhbFR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVRlbXBsYXRlTGl0ZXJhbFR5cGUoKTogTi5Uc1R5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNMaXRlcmFsVHlwZT4oKTtcbiAgICAgIG5vZGUubGl0ZXJhbCA9IHN1cGVyLnBhcnNlVGVtcGxhdGUoZmFsc2UpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTGl0ZXJhbFR5cGVcIik7XG4gICAgfVxuXG4gICAgcGFyc2VUZW1wbGF0ZVN1YnN0aXR1dGlvbigpOiBOLlRzVHlwZSB8IE4uTm9kZSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5pblR5cGUpIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VUZW1wbGF0ZVN1YnN0aXR1dGlvbigpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUaGlzVHlwZU9yVGhpc1R5cGVQcmVkaWNhdGUoKTogTi5Uc1RoaXNUeXBlIHwgTi5Uc1R5cGVQcmVkaWNhdGUge1xuICAgICAgY29uc3QgdGhpc0tleXdvcmQgPSB0aGlzLnRzUGFyc2VUaGlzVHlwZU5vZGUoKTtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faXMpICYmICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUaGlzVHlwZVByZWRpY2F0ZSh0aGlzS2V5d29yZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpc0tleXdvcmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZU5vbkFycmF5VHlwZSgpOiBOLlRzVHlwZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgY2FzZSB0dC5udW06XG4gICAgICAgIGNhc2UgdHQuYmlnaW50OlxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTGl0ZXJhbFR5cGVOb2RlKCk7XG4gICAgICAgIGNhc2UgdHQucGx1c01pbjpcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTGl0ZXJhbFR5cGU+KCk7XG4gICAgICAgICAgICBjb25zdCBuZXh0VG9rZW4gPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAgICAgaWYgKG5leHRUb2tlbi50eXBlICE9PSB0dC5udW0gJiYgbmV4dFRva2VuLnR5cGUgIT09IHR0LmJpZ2ludCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHBhcnNlTWF5YmVVbmFyeSBtdXN0IHJldHVybnMgdW5hcnkgZXhwcmVzc2lvblxuICAgICAgICAgICAgbm9kZS5saXRlcmFsID0gdGhpcy5wYXJzZU1heWJlVW5hcnkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0xpdGVyYWxUeXBlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0dC5fdGhpczpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVGhpc1R5cGVPclRoaXNUeXBlUHJlZGljYXRlKCk7XG4gICAgICAgIGNhc2UgdHQuX3R5cGVvZjpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHlwZVF1ZXJ5KCk7XG4gICAgICAgIGNhc2UgdHQuX2ltcG9ydDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlSW1wb3J0VHlwZSgpO1xuICAgICAgICBjYXNlIHR0LmJyYWNlTDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c0xvb2tBaGVhZCh0aGlzLnRzSXNTdGFydE9mTWFwcGVkVHlwZS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgPyB0aGlzLnRzUGFyc2VNYXBwZWRUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy50c1BhcnNlVHlwZUxpdGVyYWwoKTtcbiAgICAgICAgY2FzZSB0dC5icmFja2V0TDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHVwbGVUeXBlKCk7XG4gICAgICAgIGNhc2UgdHQucGFyZW5MOlxuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jcmVhdGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRFeHRyYSh0eXBlLCBcInBhcmVudGhlc2l6ZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkRXh0cmEodHlwZSwgXCJwYXJlblN0YXJ0XCIsIHN0YXJ0TG9jLmluZGV4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVBhcmVudGhlc2l6ZWRUeXBlKCk7XG4gICAgICAgIGNhc2UgdHQudGVtcGxhdGVOb25UYWlsOlxuICAgICAgICBjYXNlIHR0LnRlbXBsYXRlVGFpbDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVGVtcGxhdGVMaXRlcmFsVHlwZSgpO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRva2VuSXNJZGVudGlmaWVyKHR5cGUpIHx8XG4gICAgICAgICAgICB0eXBlID09PSB0dC5fdm9pZCB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gdHQuX251bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gdHQuX3ZvaWRcbiAgICAgICAgICAgICAgICA/IFwiVFNWb2lkS2V5d29yZFwiXG4gICAgICAgICAgICAgICAgOiB0eXBlID09PSB0dC5fbnVsbFxuICAgICAgICAgICAgICAgID8gXCJUU051bGxLZXl3b3JkXCJcbiAgICAgICAgICAgICAgICA6IGtleXdvcmRUeXBlRnJvbU5hbWUodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5vZGVUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpICE9PSBjaGFyQ29kZXMuZG90XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNLZXl3b3JkVHlwZT4oKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgbm9kZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVSZWZlcmVuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZUFycmF5VHlwZU9ySGlnaGVyKCk6IE4uVHNUeXBlIHtcbiAgICAgIGxldCB0eXBlID0gdGhpcy50c1BhcnNlTm9uQXJyYXlUeXBlKCk7XG4gICAgICB3aGlsZSAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5lYXQodHQuYnJhY2tldEwpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNrZXRSKSkge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzQXJyYXlUeXBlPih0eXBlKTtcbiAgICAgICAgICBub2RlLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICAgICAgdHlwZSA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTQXJyYXlUeXBlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzSW5kZXhlZEFjY2Vzc1R5cGU+KHR5cGUpO1xuICAgICAgICAgIG5vZGUub2JqZWN0VHlwZSA9IHR5cGU7XG4gICAgICAgICAgbm9kZS5pbmRleFR5cGUgPSB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldFIpO1xuICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZU9wZXJhdG9yKCk6IE4uVHNUeXBlT3BlcmF0b3Ige1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlT3BlcmF0b3I+KCk7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IG9wZXJhdG9yXG4gICAgICBub2RlLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yT3JIaWdoZXIoKTtcblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcInJlYWRvbmx5XCIpIHtcbiAgICAgICAgdGhpcy50c0NoZWNrVHlwZUFubm90YXRpb25Gb3JSZWFkT25seShcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZU9wZXJhdG9yXCIpO1xuICAgIH1cblxuICAgIHRzQ2hlY2tUeXBlQW5ub3RhdGlvbkZvclJlYWRPbmx5KG5vZGU6IE4uTm9kZSkge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGVBbm5vdGF0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgICAgIGNhc2UgXCJUU0FycmF5VHlwZVwiOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuZXhwZWN0ZWRSZWFkb25seSwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlSW5mZXJUeXBlKCk6IE4uVHNJbmZlclR5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNJbmZlclR5cGU+KCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2luZmVyKTtcbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVBhcmFtZXRlcj4oKTtcbiAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSA9IHRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJOYW1lKCk7XG4gICAgICB0eXBlUGFyYW1ldGVyLmNvbnN0cmFpbnQgPSB0aGlzLnRzVHJ5UGFyc2UoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RyYWludEZvckluZmVyVHlwZSgpLFxuICAgICAgKTtcbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlciA9IHRoaXMuZmluaXNoTm9kZSh0eXBlUGFyYW1ldGVyLCBcIlRTVHlwZVBhcmFtZXRlclwiKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0luZmVyVHlwZVwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlQ29uc3RyYWludEZvckluZmVyVHlwZSgpIHtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5fZXh0ZW5kcykpIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludCA9IHRoaXMudHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlKCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCB8fFxuICAgICAgICAgICF0aGlzLm1hdGNoKHR0LnF1ZXN0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29uc3RyYWludDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlT3BlcmF0b3JPckhpZ2hlcigpOiBOLlRzVHlwZSB7XG4gICAgICBjb25zdCBpc1R5cGVPcGVyYXRvciA9XG4gICAgICAgIHRva2VuSXNUU1R5cGVPcGVyYXRvcih0aGlzLnN0YXRlLnR5cGUpICYmICF0aGlzLnN0YXRlLmNvbnRhaW5zRXNjO1xuICAgICAgcmV0dXJuIGlzVHlwZU9wZXJhdG9yXG4gICAgICAgID8gdGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yKClcbiAgICAgICAgOiB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW5mZXIpXG4gICAgICAgID8gdGhpcy50c1BhcnNlSW5mZXJUeXBlKClcbiAgICAgICAgOiB0aGlzLnRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0KCgpID0+XG4gICAgICAgICAgICB0aGlzLnRzUGFyc2VBcnJheVR5cGVPckhpZ2hlcigpLFxuICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgdHNQYXJzZVVuaW9uT3JJbnRlcnNlY3Rpb25UeXBlKFxuICAgICAga2luZDogXCJUU1VuaW9uVHlwZVwiIHwgXCJUU0ludGVyc2VjdGlvblR5cGVcIixcbiAgICAgIHBhcnNlQ29uc3RpdHVlbnRUeXBlOiAoKSA9PiBOLlRzVHlwZSxcbiAgICAgIG9wZXJhdG9yOiBUb2tlblR5cGUsXG4gICAgKTogTi5Uc1R5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNVbmlvblR5cGUgfCBOLlRzSW50ZXJzZWN0aW9uVHlwZT4oKTtcbiAgICAgIGNvbnN0IGhhc0xlYWRpbmdPcGVyYXRvciA9IHRoaXMuZWF0KG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gW107XG4gICAgICBkbyB7XG4gICAgICAgIHR5cGVzLnB1c2gocGFyc2VDb25zdGl0dWVudFR5cGUoKSk7XG4gICAgICB9IHdoaWxlICh0aGlzLmVhdChvcGVyYXRvcikpO1xuICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMSAmJiAhaGFzTGVhZGluZ09wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiB0eXBlc1swXTtcbiAgICAgIH1cbiAgICAgIG5vZGUudHlwZXMgPSB0eXBlcztcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwga2luZCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZUludGVyc2VjdGlvblR5cGVPckhpZ2hlcigpOiBOLlRzVHlwZSB7XG4gICAgICByZXR1cm4gdGhpcy50c1BhcnNlVW5pb25PckludGVyc2VjdGlvblR5cGUoXG4gICAgICAgIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVPcGVyYXRvck9ySGlnaGVyLmJpbmQodGhpcyksXG4gICAgICAgIHR0LmJpdHdpc2VBTkQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VVbmlvblR5cGVPckhpZ2hlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VVbmlvbk9ySW50ZXJzZWN0aW9uVHlwZShcbiAgICAgICAgXCJUU1VuaW9uVHlwZVwiLFxuICAgICAgICB0aGlzLnRzUGFyc2VJbnRlcnNlY3Rpb25UeXBlT3JIaWdoZXIuYmluZCh0aGlzKSxcbiAgICAgICAgdHQuYml0d2lzZU9SLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0c0lzU3RhcnRPZkZ1bmN0aW9uVHlwZSgpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgICB0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1VuYW1iaWd1b3VzbHlTdGFydE9mRnVuY3Rpb25UeXBlLmJpbmQodGhpcykpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzU2tpcFBhcmFtZXRlclN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgfHwgdGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJzZSBhbiBvYmplY3QgcGF0dGVybiB3aXRob3V0IGVycm9yc1xuICAgICAgICBjb25zdCB7IGVycm9ycyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFcnJvckNvdW50ID0gZXJyb3JzLmxlbmd0aDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBhcnNlT2JqZWN0TGlrZSh0dC5icmFjZVIsIHRydWUpO1xuICAgICAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID09PSBwcmV2aW91c0Vycm9yQ291bnQ7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJzZSBhbiBhcnJheSBwYXR0ZXJuIHdpdGhvdXQgZXJyb3JzXG4gICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBwcmV2aW91c0Vycm9yQ291bnQgPSBlcnJvcnMubGVuZ3RoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN1cGVyLnBhcnNlQmluZGluZ0xpc3QoXG4gICAgICAgICAgICB0dC5icmFja2V0UixcbiAgICAgICAgICAgIGNoYXJDb2Rlcy5yaWdodFNxdWFyZUJyYWNrZXQsXG4gICAgICAgICAgICBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuQUxMT1dfRU1QVFksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA9PT0gcHJldmlvdXNFcnJvckNvdW50O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRzSXNVbmFtYmlndW91c2x5U3RhcnRPZkZ1bmN0aW9uVHlwZSgpOiBib29sZWFuIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSB8fCB0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgICAvLyAoIClcbiAgICAgICAgLy8gKCAuLi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50c1NraXBQYXJhbWV0ZXJTdGFydCgpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmNvbG9uKSB8fFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuY29tbWEpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5xdWVzdGlvbikgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmVxKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyAoIHh4eCA6XG4gICAgICAgICAgLy8gKCB4eHggLFxuICAgICAgICAgIC8vICggeHh4ID9cbiAgICAgICAgICAvLyAoIHh4eCA9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmFycm93KSkge1xuICAgICAgICAgICAgLy8gKCB4eHggKSA9PlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKFxuICAgICAgcmV0dXJuVG9rZW46IFRva2VuVHlwZSxcbiAgICApOiBOLlRzVHlwZUFubm90YXRpb24ge1xuICAgICAgcmV0dXJuIHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVBbm5vdGF0aW9uPigpO1xuICAgICAgICB0aGlzLmV4cGVjdChyZXR1cm5Ub2tlbik7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUHJlZGljYXRlPigpO1xuXG4gICAgICAgIGNvbnN0IGFzc2VydHMgPSAhIXRoaXMudHNUcnlQYXJzZShcbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlUHJlZGljYXRlQXNzZXJ0cy5iaW5kKHRoaXMpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhc3NlcnRzICYmIHRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgICAgLy8gV2hlbiBhc3NlcnRzIGlzIGZhbHNlLCB0aGlzS2V5d29yZCBpcyBoYW5kbGVkIGJ5IHRzUGFyc2VOb25BcnJheVR5cGVcbiAgICAgICAgICAvLyA6IGFzc2VydHMgdGhpcyBpcyB0eXBlXG4gICAgICAgICAgbGV0IHRoaXNUeXBlUHJlZGljYXRlID0gdGhpcy50c1BhcnNlVGhpc1R5cGVPclRoaXNUeXBlUHJlZGljYXRlKCk7XG4gICAgICAgICAgLy8gaWYgaXQgdHVybnMgb3V0IHRvIGJlIGEgYFRTVGhpc1R5cGVgLCB3cmFwIGl0IHdpdGggYFRTVHlwZVByZWRpY2F0ZWBcbiAgICAgICAgICAvLyA6IGFzc2VydHMgdGhpc1xuICAgICAgICAgIGlmICh0aGlzVHlwZVByZWRpY2F0ZS50eXBlID09PSBcIlRTVGhpc1R5cGVcIikge1xuICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJOYW1lID0gdGhpc1R5cGVQcmVkaWNhdGU7XG4gICAgICAgICAgICBub2RlLmFzc2VydHMgPSB0cnVlO1xuICAgICAgICAgICAgKG5vZGUgYXMgTi5Uc1R5cGVQcmVkaWNhdGUpLnR5cGVBbm5vdGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXNUeXBlUHJlZGljYXRlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUHJlZGljYXRlXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHRoaXNUeXBlUHJlZGljYXRlLCBub2RlKTtcbiAgICAgICAgICAgIHRoaXNUeXBlUHJlZGljYXRlLmFzc2VydHMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0LnR5cGVBbm5vdGF0aW9uID0gdGhpc1R5cGVQcmVkaWNhdGU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlUHJlZGljYXRlVmFyaWFibGUgPVxuICAgICAgICAgIHRoaXMudHNJc0lkZW50aWZpZXIoKSAmJlxuICAgICAgICAgIHRoaXMudHNUcnlQYXJzZSh0aGlzLnRzUGFyc2VUeXBlUHJlZGljYXRlUHJlZml4LmJpbmQodGhpcykpO1xuXG4gICAgICAgIGlmICghdHlwZVByZWRpY2F0ZVZhcmlhYmxlKSB7XG4gICAgICAgICAgaWYgKCFhc3NlcnRzKSB7XG4gICAgICAgICAgICAvLyA6IHR5cGVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigvKiBlYXRDb2xvbiAqLyBmYWxzZSwgdCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gOiBhc3NlcnRzIGZvb1xuICAgICAgICAgIG5vZGUucGFyYW1ldGVyTmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbm9kZS5hc3NlcnRzID0gYXNzZXJ0cztcbiAgICAgICAgICAobm9kZSBhcyBOLlRzVHlwZVByZWRpY2F0ZSkudHlwZUFubm90YXRpb24gPSBudWxsO1xuICAgICAgICAgIHQudHlwZUFubm90YXRpb24gPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVQcmVkaWNhdGVcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA6IGFzc2VydHMgZm9vIGlzIHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKC8qIGVhdENvbG9uICovIGZhbHNlKTtcbiAgICAgICAgbm9kZS5wYXJhbWV0ZXJOYW1lID0gdHlwZVByZWRpY2F0ZVZhcmlhYmxlO1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdHlwZTtcbiAgICAgICAgbm9kZS5hc3NlcnRzID0gYXNzZXJ0cztcbiAgICAgICAgdC50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZVByZWRpY2F0ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24oKTogTi5Uc1R5cGVBbm5vdGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24odHQuY29sb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpOiBOLlRzVHlwZUFubm90YXRpb24gfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VUeXBlKCk6IE4uVHNUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRzRWF0VGhlblBhcnNlVHlwZSh0dC5jb2xvbik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQcmVkaWNhdGVQcmVmaXgoKTogTi5JZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faXMpICYmICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQcmVkaWNhdGVBc3NlcnRzKCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudHlwZSAhPT0gdHQuX2Fzc2VydHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbnNFc2MgPSB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiYgIXRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRhaW5zRXNjKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgIHJlc2VydmVkV29yZDogXCJhc3NlcnRzXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFubm90YXRpb24oXG4gICAgICBlYXRDb2xvbiA9IHRydWUsXG4gICAgICB0OiBVbmRvbmU8Ti5Uc1R5cGVBbm5vdGF0aW9uPiA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlQW5ub3RhdGlvbj4oKSxcbiAgICApOiBOLlRzVHlwZUFubm90YXRpb24ge1xuICAgICAgdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgIGlmIChlYXRDb2xvbikgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgICB0LnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHQsIFwiVFNUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICAvKiogQmUgc3VyZSB0byBiZSBpbiBhIHR5cGUgY29udGV4dCBiZWZvcmUgY2FsbGluZyB0aGlzLCB1c2luZyBgdHNJblR5cGVgLiAqL1xuICAgIHRzUGFyc2VUeXBlKCk6IE4uVHNUeXBlIHtcbiAgICAgIC8vIE5lZWQgdG8gc2V0IGBzdGF0ZS5pblR5cGVgIHNvIHRoYXQgd2UgZG9uJ3QgcGFyc2UgSlNYIGluIGEgdHlwZSBjb250ZXh0LlxuICAgICAgYXNzZXJ0KHRoaXMuc3RhdGUuaW5UeXBlKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzUGFyc2VOb25Db25kaXRpb25hbFR5cGUoKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCB8fFxuICAgICAgICB0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpIHx8XG4gICAgICAgICF0aGlzLmVhdCh0dC5fZXh0ZW5kcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzQ29uZGl0aW9uYWxUeXBlPih0eXBlKTtcbiAgICAgIG5vZGUuY2hlY2tUeXBlID0gdHlwZTtcblxuICAgICAgbm9kZS5leHRlbmRzVHlwZSA9IHRoaXMudHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlTm9uQ29uZGl0aW9uYWxUeXBlKCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICBub2RlLnRydWVUeXBlID0gdGhpcy50c0luQWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCgoKSA9PlxuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlKCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5jb2xvbik7XG4gICAgICBub2RlLmZhbHNlVHlwZSA9IHRoaXMudHNJbkFsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlVHlwZSgpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTQ29uZGl0aW9uYWxUeXBlXCIpO1xuICAgIH1cblxuICAgIGlzQWJzdHJhY3RDb25zdHJ1Y3RvclNpZ25hdHVyZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hYnN0cmFjdCkgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5fbmV3XG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VOb25Db25kaXRpb25hbFR5cGUoKTogTi5Uc1R5cGUge1xuICAgICAgaWYgKHRoaXMudHNJc1N0YXJ0T2ZGdW5jdGlvblR5cGUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRnVuY3Rpb25PckNvbnN0cnVjdG9yVHlwZShcIlRTRnVuY3Rpb25UeXBlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX25ldykpIHtcbiAgICAgICAgLy8gQXMgaW4gYG5ldyAoKSA9PiBEYXRlYFxuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRnVuY3Rpb25PckNvbnN0cnVjdG9yVHlwZShcIlRTQ29uc3RydWN0b3JUeXBlXCIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQWJzdHJhY3RDb25zdHJ1Y3RvclNpZ25hdHVyZSgpKSB7XG4gICAgICAgIC8vIEFzIGluIGBhYnN0cmFjdCBuZXcgKCkgPT4gRGF0ZWBcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUZ1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUoXG4gICAgICAgICAgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgICAgICAgIC8qIGFic3RyYWN0ICovIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50c1BhcnNlVW5pb25UeXBlT3JIaWdoZXIoKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFzc2VydGlvbigpOiBOLlRzVHlwZUFzc2VydGlvbiB7XG4gICAgICBpZiAodGhpcy5nZXRQbHVnaW5PcHRpb24oXCJ0eXBlc2NyaXB0XCIsIFwiZGlzYWxsb3dBbWJpZ3VvdXNKU1hMaWtlXCIpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uLCB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVBc3NlcnRpb24+KCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubmV4dCgpOyAvLyBcIjxcIlxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5fY29uc3QpXG4gICAgICAgICAgPyB0aGlzLnRzUGFyc2VUeXBlUmVmZXJlbmNlKClcbiAgICAgICAgICA6IHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5wYXJzZU1heWJlVW5hcnkoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVBc3NlcnRpb25cIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUhlcml0YWdlQ2xhdXNlKFxuICAgICAgdG9rZW46IFwiZXh0ZW5kc1wiIHwgXCJpbXBsZW1lbnRzXCIsXG4gICAgKTogQXJyYXk8Ti5Uc0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICAgIGNvbnN0IGRlbGltaXRlZExpc3QgPSB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0KFxuICAgICAgICBcIkhlcml0YWdlQ2xhdXNlRWxlbWVudFwiLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+KCk7XG4gICAgICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy50c1BhcnNlRW50aXR5TmFtZSgpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIik7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoIWRlbGltaXRlZExpc3QubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuRW1wdHlIZXJpdGFnZUNsYXVzZVR5cGUsIHtcbiAgICAgICAgICBhdDogb3JpZ2luYWxTdGFydExvYyxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWxpbWl0ZWRMaXN0O1xuICAgIH1cblxuICAgIHRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzSW50ZXJmYWNlRGVjbGFyYXRpb24+LFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBkZWNsYXJlPzogdHJ1ZTtcbiAgICAgIH0gPSB7fSxcbiAgICApOiBOLlRzSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLmhhc0ZvbGxvd2luZ0xpbmVCcmVhaygpKSByZXR1cm4gbnVsbDtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5faW50ZXJmYWNlKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmRlY2xhcmUpIG5vZGUuZGVjbGFyZSA9IHRydWU7XG4gICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19JTlRFUkZBQ0UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5pZCA9IG51bGw7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuTWlzc2luZ0ludGVyZmFjZU5hbWUsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRDb25zdE1vZGlmaWVycyxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5lYXQodHQuX2V4dGVuZHMpKSB7XG4gICAgICAgIG5vZGUuZXh0ZW5kcyA9IHRoaXMudHNQYXJzZUhlcml0YWdlQ2xhdXNlKFwiZXh0ZW5kc1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRTSW50ZXJmYWNlQm9keT4oKTtcbiAgICAgIGJvZHkuYm9keSA9IHRoaXMudHNJblR5cGUodGhpcy50c1BhcnNlT2JqZWN0VHlwZU1lbWJlcnMuYmluZCh0aGlzKSk7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZpbmlzaE5vZGUoYm9keSwgXCJUU0ludGVyZmFjZUJvZHlcIik7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFsaWFzRGVjbGFyYXRpb24oXG4gICAgICBub2RlOiBOLlRzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gICAgKTogTi5Uc1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19UWVBFKTtcblxuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1RyeVBhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRNb2RpZmllcnMsXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5leHBlY3QodHQuZXEpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50cmluc2ljKSAmJlxuICAgICAgICAgIHRoaXMubG9va2FoZWFkKCkudHlwZSAhPT0gdHQuZG90XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzS2V5d29yZFR5cGU+KCk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTSW50cmluc2ljS2V5d29yZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzSW5Ob0NvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLnN0YXRlLmNvbnRleHQ7XG4gICAgICB0aGlzLnN0YXRlLmNvbnRleHQgPSBbb2xkQ29udGV4dFswXV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY29udGV4dCA9IG9sZENvbnRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBgY2JgIGluIGEgdHlwZSBjb250ZXh0LlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmUgdG9rZW4gKmJlZm9yZSogdGhlIGZpcnN0IHR5cGUgdG9rZW4sXG4gICAgICogc28gdGhhdCB0aGUgY2FsbCB0byBgbmV4dCgpYCBpcyBydW4gaW4gdHlwZSBjb250ZXh0LlxuICAgICAqL1xuICAgIHRzSW5UeXBlPFQ+KGNiOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSBvbGRJblR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZEluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCA9XG4gICAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0O1xuICAgICAgdGhpcy5zdGF0ZS5pbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCA9XG4gICAgICAgICAgb2xkSW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0PFQ+KGNiOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBvbGRJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQgPVxuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dDtcbiAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0ID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0ID1cbiAgICAgICAgICBvbGRJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNFYXRUaGVuUGFyc2VUeXBlKHRva2VuOiBUb2tlblR5cGUpOiBOLlRzVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHNOZXh0VGhlblBhcnNlVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzRXhwZWN0VGhlblBhcnNlVHlwZSh0b2tlbjogVG9rZW5UeXBlKTogTi5Uc1R5cGUge1xuICAgICAgcmV0dXJuIHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGVjdCh0b2tlbik7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c05leHRUaGVuUGFyc2VUeXBlKCk6IE4uVHNUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLnRzSW5UeXBlKCgpID0+IHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c1BhcnNlRW51bU1lbWJlcigpOiBOLlRzRW51bU1lbWJlciB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1NZW1iZXI+KCk7XG4gICAgICAvLyBDb21wdXRlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgZ3JhbW1hciBlcnJvcnMgaW4gYW4gZW51bSwgc28gYWNjZXB0IGp1c3Qgc3RyaW5nIGxpdGVyYWwgb3IgaWRlbnRpZmllci5cbiAgICAgIG5vZGUuaWQgPSB0aGlzLm1hdGNoKHR0LnN0cmluZylcbiAgICAgICAgPyBzdXBlci5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSlcbiAgICAgICAgOiB0aGlzLnBhcnNlSWRlbnRpZmllcigvKiBsaWJlcmFsICovIHRydWUpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmVxKSkge1xuICAgICAgICBub2RlLmluaXRpYWxpemVyID0gc3VwZXIucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0VudW1NZW1iZXJcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUVudW1EZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzRW51bURlY2xhcmF0aW9uPixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgY29uc3Q/OiB0cnVlO1xuICAgICAgICBkZWNsYXJlPzogdHJ1ZTtcbiAgICAgIH0gPSB7fSxcbiAgICApOiBOLlRzRW51bURlY2xhcmF0aW9uIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnN0KSBub2RlLmNvbnN0ID0gdHJ1ZTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmRlY2xhcmUpIG5vZGUuZGVjbGFyZSA9IHRydWU7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2VudW0pO1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmNoZWNrSWRlbnRpZmllcihcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5jb25zdCA/IEJJTkRfVFNfQ09OU1RfRU5VTSA6IEJJTkRfVFNfRU5VTSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgICBub2RlLm1lbWJlcnMgPSB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0KFxuICAgICAgICBcIkVudW1NZW1iZXJzXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZUVudW1NZW1iZXIuYmluZCh0aGlzKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTRW51bURlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNb2R1bGVCbG9jaygpOiBOLlRzTW9kdWxlQmxvY2sge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNNb2R1bGVCbG9jaz4oKTtcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfT1RIRVIpO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgICAgLy8gSW5zaWRlIG9mIGEgbW9kdWxlIGJsb2NrIGlzIGNvbnNpZGVyZWQgXCJ0b3AtbGV2ZWxcIiwgbWVhbmluZyBpdCBjYW4gaGF2ZSBpbXBvcnRzIGFuZCBleHBvcnRzLlxuICAgICAgc3VwZXIucGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KFxuICAgICAgICAobm9kZS5ib2R5ID0gW10pLFxuICAgICAgICAvKiBkaXJlY3RpdmVzICovIHVuZGVmaW5lZCxcbiAgICAgICAgLyogdG9wTGV2ZWwgKi8gdHJ1ZSxcbiAgICAgICAgLyogZW5kICovIHR0LmJyYWNlUixcbiAgICAgICk7XG4gICAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU01vZHVsZUJsb2NrXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNb2R1bGVPck5hbWVzcGFjZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogVW5kb25lPE4uVHNNb2R1bGVEZWNsYXJhdGlvbj4sXG4gICAgICBuZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiBOLlRzTW9kdWxlRGVjbGFyYXRpb24ge1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgIGlmICghbmVzdGVkKSB7XG4gICAgICAgIHRoaXMuY2hlY2tJZGVudGlmaWVyKG5vZGUuaWQsIEJJTkRfVFNfTkFNRVNQQUNFKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTW9kdWxlRGVjbGFyYXRpb24+KCk7XG4gICAgICAgIHRoaXMudHNQYXJzZU1vZHVsZU9yTmFtZXNwYWNlRGVjbGFyYXRpb24oaW5uZXIsIHRydWUpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLmJvZHkgPSBpbm5lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfVFNfTU9EVUxFKTtcbiAgICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoUEFSQU0pO1xuICAgICAgICBub2RlLmJvZHkgPSB0aGlzLnRzUGFyc2VNb2R1bGVCbG9jaygpO1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5Uc01vZHVsZURlY2xhcmF0aW9uLFxuICAgICk6IE4uVHNNb2R1bGVEZWNsYXJhdGlvbiB7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2dsb2JhbCkpIHtcbiAgICAgICAgbm9kZS5nbG9iYWwgPSB0cnVlO1xuICAgICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIG5vZGUuaWQgPSBzdXBlci5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlTCkpIHtcbiAgICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9UU19NT0RVTEUpO1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgICAgIG5vZGUuYm9keSA9IHRoaXMudHNQYXJzZU1vZHVsZUJsb2NrKCk7XG4gICAgICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24oXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXI/OiBOLklkZW50aWZpZXIgfCBudWxsLFxuICAgICAgaXNFeHBvcnQ/OiBib29sZWFuLFxuICAgICk6IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB7XG4gICAgICBub2RlLmlzRXhwb3J0ID0gaXNFeHBvcnQgfHwgZmFsc2U7XG4gICAgICBub2RlLmlkID0gbWF5YmVEZWZhdWx0SWRlbnRpZmllciB8fCB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9GTEFHU19UU19JTVBPUlQpO1xuICAgICAgdGhpcy5leHBlY3QodHQuZXEpO1xuICAgICAgY29uc3QgbW9kdWxlUmVmZXJlbmNlID0gdGhpcy50c1BhcnNlTW9kdWxlUmVmZXJlbmNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgJiZcbiAgICAgICAgbW9kdWxlUmVmZXJlbmNlLnR5cGUgIT09IFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbXBvcnRBbGlhc0hhc0ltcG9ydFR5cGUsIHtcbiAgICAgICAgICBhdDogbW9kdWxlUmVmZXJlbmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5vZGUubW9kdWxlUmVmZXJlbmNlID0gbW9kdWxlUmVmZXJlbmNlO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzSXNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9yZXF1aXJlKSAmJlxuICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHNQYXJzZU1vZHVsZVJlZmVyZW5jZSgpOiBOLlRzTW9kdWxlUmVmZXJlbmNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRzSXNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSgpXG4gICAgICAgID8gdGhpcy50c1BhcnNlRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoKVxuICAgICAgICA6IHRoaXMudHNQYXJzZUVudGl0eU5hbWUoLyogYWxsb3dSZXNlcnZlZFdvcmRzICovIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoKTogTi5Uc0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+KCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX3JlcXVpcmUpO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgdG8gZXN0cmVlIHdlIGNhbm5vdCBjYWxsIHBhcnNlTGl0ZXJhbCBkaXJlY3RseSBoZXJlXG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBzdXBlci5wYXJzZUV4cHJBdG9tKCkgYXMgTi5TdHJpbmdMaXRlcmFsO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIHRoaXMuc2F3VW5hbWJpZ3VvdXNFU00gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIik7XG4gICAgfVxuXG4gICAgLy8gVXRpbGl0aWVzXG5cbiAgICB0c0xvb2tBaGVhZDxUPihmOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZUFuZENhdGNoPFQgZXh0ZW5kcyBOLk5vZGVCYXNlIHwgdW5kZWZpbmVkIHwgbnVsbD4oXG4gICAgICBmOiAoKSA9PiBULFxuICAgICk6IFQgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHJ5UGFyc2UoXG4gICAgICAgIGFib3J0ID0+XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICAgIGYoKSB8fCBhYm9ydCgpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5hYm9ydGVkIHx8ICFyZXN1bHQubm9kZSkgcmV0dXJuO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICByZXR1cm4gcmVzdWx0Lm5vZGU7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZTxUPihmOiAoKSA9PiBUIHwgdW5kZWZpbmVkIHwgZmFsc2UpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZS5jbG9uZSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZigpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlRGVjbGFyZShuYW55OiBhbnkpOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgc3RhcnRUeXBlID0gdGhpcy5zdGF0ZS50eXBlO1xuICAgICAgbGV0IGtpbmQ6IFwibGV0XCIgfCBudWxsO1xuXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2xldCkpIHtcbiAgICAgICAgc3RhcnRUeXBlID0gdHQuX3ZhcjtcbiAgICAgICAga2luZCA9IFwibGV0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgIHJldHVybiB0aGlzLnRzSW5BbWJpZW50Q29udGV4dCgoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoc3RhcnRUeXBlKSB7XG4gICAgICAgICAgY2FzZSB0dC5fZnVuY3Rpb246XG4gICAgICAgICAgICBuYW55LmRlY2xhcmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQoXG4gICAgICAgICAgICAgIG5hbnksXG4gICAgICAgICAgICAgIC8qIGFzeW5jICovIGZhbHNlLFxuICAgICAgICAgICAgICAvKiBpc0hhbmdpbmdEZWNsYXJhdGlvbiAqLyBmYWxzZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSB0dC5fY2xhc3M6XG4gICAgICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGFsc28gc2V0IGJ5IHRzUGFyc2VFeHByZXNzaW9uU3RhdGVtZW50LCB3ZSBuZWVkIHRvIHNldCBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIHBhcnNpbmcgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIHRvIGtub3cgaG93IHRvIHJlZ2lzdGVyIGl0IGluIHRoZSBzY29wZS5cbiAgICAgICAgICAgIG5hbnkuZGVjbGFyZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNsYXNzKFxuICAgICAgICAgICAgICBuYW55LFxuICAgICAgICAgICAgICAvKiBpc1N0YXRlbWVudCAqLyB0cnVlLFxuICAgICAgICAgICAgICAvKiBvcHRpb25hbElkICovIGZhbHNlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIHR0Ll9lbnVtOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihuYW55LCB7IGRlY2xhcmU6IHRydWUgfSk7XG4gICAgICAgICAgY2FzZSB0dC5fZ2xvYmFsOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKG5hbnkpO1xuICAgICAgICAgIGNhc2UgdHQuX2NvbnN0OlxuICAgICAgICAgIGNhc2UgdHQuX3ZhcjpcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5fY29uc3QpIHx8ICF0aGlzLmlzTG9va2FoZWFkQ29udGV4dHVhbChcImVudW1cIikpIHtcbiAgICAgICAgICAgICAgbmFueS5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgICAgICAgbmFueSxcbiAgICAgICAgICAgICAgICBraW5kIHx8IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYGNvbnN0IGVudW0gPSAwO2Agbm90IGFsbG93ZWQgYmVjYXVzZSBcImVudW1cIiBpcyBhIHN0cmljdCBtb2RlIHJlc2VydmVkIHdvcmQuXG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5fY29uc3QpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihuYW55LCB7XG4gICAgICAgICAgICAgIGNvbnN0OiB0cnVlLFxuICAgICAgICAgICAgICBkZWNsYXJlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY2FzZSB0dC5faW50ZXJmYWNlOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihuYW55LCB7XG4gICAgICAgICAgICAgIGRlY2xhcmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh0b2tlbklzSWRlbnRpZmllcihzdGFydFR5cGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgICBuYW55LFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICAgICAgLyogbmV4dCAqLyB0cnVlLFxuICAgICAgICAgICAgICAgIC8qIGRlY29yYXRvcnMgKi8gbnVsbCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogdGhpcyB3b24ndCBiZSBjYWxsZWQgdW5sZXNzIHRoZSBrZXl3b3JkIGlzIGFsbG93ZWQgaW4gYHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb25gLlxuICAgIHRzVHJ5UGFyc2VFeHBvcnREZWNsYXJhdGlvbigpOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgdGhpcy5zdGFydE5vZGUoKSxcbiAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgLyogbmV4dCAqLyB0cnVlLFxuICAgICAgICAvKiBkZWNvcmF0b3JzICovIG51bGwsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogVW5kb25lPE4uVHNNb2R1bGVEZWNsYXJhdGlvbj4sXG4gICAgICBleHByOiBOLklkZW50aWZpZXIsXG4gICAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIHN3aXRjaCAoZXhwci5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJkZWNsYXJlXCI6IHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMudHNUcnlQYXJzZURlY2xhcmUobm9kZSk7XG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbi5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJnbG9iYWxcIjpcbiAgICAgICAgICAvLyBgZ2xvYmFsIHsgfWAgKHdpdGggbm8gYGRlY2xhcmVgKSBtYXkgYXBwZWFyIGluc2lkZSBhbiBhbWJpZW50IG1vZHVsZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICAvLyBXb3VsZCBsaWtlIHRvIHVzZSB0c1BhcnNlQW1iaWVudEV4dGVybmFsTW9kdWxlRGVjbGFyYXRpb24gaGVyZSwgYnV0IGFscmVhZHkgcmFuIHBhc3QgXCJnbG9iYWxcIi5cbiAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICAgICAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX1RTX01PRFVMRSk7XG4gICAgICAgICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBub2RlO1xuICAgICAgICAgICAgbW9kLmdsb2JhbCA9IHRydWU7XG4gICAgICAgICAgICBtb2QuaWQgPSBleHByO1xuICAgICAgICAgICAgbW9kLmJvZHkgPSB0aGlzLnRzUGFyc2VNb2R1bGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG1vZCwgXCJUU01vZHVsZURlY2xhcmF0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBleHByLm5hbWUsXG4gICAgICAgICAgICAvKiBuZXh0ICovIGZhbHNlLFxuICAgICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1vbiB0byB0c1RyeVBhcnNlRGVjbGFyZSwgdHNUcnlQYXJzZUV4cG9ydERlY2xhcmF0aW9uLCBhbmQgdHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQuXG4gICAgdHNQYXJzZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogYW55LFxuICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgIG5leHQ6IGJvb2xlYW4sXG4gICAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICAvLyBubyBkZWNsYXJhdGlvbiBhcGFydCBmcm9tIGVudW0gY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhay5cbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSBcImFic3RyYWN0XCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy50c0NoZWNrTGluZVRlcm1pbmF0b3IobmV4dCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1hdGNoKHR0Ll9jbGFzcykgfHwgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VBYnN0cmFjdERlY2xhcmF0aW9uKG5vZGUsIGRlY29yYXRvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwibW9kdWxlXCI6XG4gICAgICAgICAgaWYgKHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yKG5leHQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VBbWJpZW50RXh0ZXJuYWxNb2R1bGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTW9kdWxlT3JOYW1lc3BhY2VEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIm5hbWVzcGFjZVwiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yKG5leHQpICYmXG4gICAgICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTW9kdWxlT3JOYW1lc3BhY2VEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInR5cGVcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnRzQ2hlY2tMaW5lVGVybWluYXRvcihuZXh0KSAmJlxuICAgICAgICAgICAgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0NoZWNrTGluZVRlcm1pbmF0b3IobmV4dDogYm9vbGVhbikge1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9sbG93aW5nTGluZUJyZWFrKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICF0aGlzLmlzTGluZVRlcm1pbmF0b3IoKTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlR2VuZXJpY0FzeW5jQXJyb3dGdW5jdGlvbihcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICApOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5sdCkpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICAgIHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHJlczogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRG9uJ3QgdXNlIG92ZXJsb2FkZWQgcGFyc2VGdW5jdGlvblBhcmFtcyB3aGljaCB3b3VsZCBsb29rIGZvciBcIjxcIiBhZ2Fpbi5cbiAgICAgICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO1xuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMudHNUcnlQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYXJyb3cpO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycztcblxuICAgICAgaWYgKCFyZXMpIHJldHVybjtcblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQXJyb3dFeHByZXNzaW9uKFxuICAgICAgICByZXMsXG4gICAgICAgIC8qIHBhcmFtcyBhcmUgYWxyZWFkeSBzZXQgKi8gbnVsbCxcbiAgICAgICAgLyogYXN5bmMgKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlZCB3aGVuIHBhcnNpbmcgdHlwZSBhcmd1bWVudHMgZnJvbSBFUyBwcm9kdWN0aW9ucywgd2hlcmUgdGhlIGZpcnN0IHRva2VuXG4gICAgLy8gaGFzIGJlZW4gY3JlYXRlZCB3aXRob3V0IHN0YXRlLmluVHlwZS4gVGh1cyB3ZSBuZWVkIHRvIHJlc2NhbiB0aGUgbHQgdG9rZW4uXG4gICAgdHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTogTi5Uc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHwgdm9pZCB7XG4gICAgICBpZiAodGhpcy5yZVNjYW5fbHQoKSAhPT0gdHQubHQpIHJldHVybjtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQXJndW1lbnRzKCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVBcmd1bWVudHMoKTogTi5Uc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KCk7XG4gICAgICBub2RlLnBhcmFtcyA9IHRoaXMudHNJblR5cGUoKCkgPT5cbiAgICAgICAgLy8gVGVtcG9yYXJpbHkgcmVtb3ZlIGEgSlNYIHBhcnNpbmcgY29udGV4dCwgd2hpY2ggbWFrZXMgdXMgc2NhbiBkaWZmZXJlbnQgdG9rZW5zLlxuICAgICAgICB0aGlzLnRzSW5Ob0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0Lmx0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRGVsaW1pdGVkTGlzdChcbiAgICAgICAgICAgIFwiVHlwZVBhcmFtZXRlcnNPckFyZ3VtZW50c1wiLFxuICAgICAgICAgICAgdGhpcy50c1BhcnNlVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5FbXB0eVR5cGVBcmd1bWVudHMsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlLmluVHlwZSAmJiB0aGlzLmN1ckNvbnRleHQoKSA9PT0gdGMuYnJhY2UpIHtcbiAgICAgICAgLy8gcmVzY2FuIGA+YCB3aGVuIHdlIGFyZSBubyBsb25nZXIgaW4gdHlwZSBjb250ZXh0IGFuZCBKU1ggcGFyc2luZyBjb250ZXh0XG4gICAgICAgIC8vIHNpbmNlIGl0IHdhcyB0b2tlbml6ZWQgd2hlbiBgaW5UeXBlYCBpcyBgdHJ1ZWAuXG4gICAgICAgIHRoaXMucmVTY2FuX2x0X2d0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCh0dC5ndCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c0lzRGVjbGFyYXRpb25TdGFydCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0b2tlbklzVFNEZWNsYXJhdGlvblN0YXJ0KHRoaXMuc3RhdGUudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gT1ZFUlJJREVTXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcy50c0lzRGVjbGFyYXRpb25TdGFydCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gc3VwZXIuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk7XG4gICAgfVxuXG4gICAgcGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW0oXG4gICAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSxcbiAgICApOiBOLlBhdHRlcm4gfCBOLlRTUGFyYW1ldGVyUHJvcGVydHkge1xuICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgbG9jYXRpb24gdG8gaW5jbHVkZSBtb2RpZmllcnMgaW4gcmFuZ2VcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcblxuICAgICAgY29uc3QgbW9kaWZpZWQ6IE1vZGlmaWVyQmFzZSA9IHt9O1xuICAgICAgdGhpcy50c1BhcnNlTW9kaWZpZXJzKFxuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZE1vZGlmaWVyczogW1xuICAgICAgICAgICAgXCJwdWJsaWNcIixcbiAgICAgICAgICAgIFwicHJpdmF0ZVwiLFxuICAgICAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgICAgIFwib3ZlcnJpZGVcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBtb2RpZmllZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBhY2Nlc3NpYmlsaXR5ID0gbW9kaWZpZWQuYWNjZXNzaWJpbGl0eTtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gbW9kaWZpZWQub3ZlcnJpZGU7XG4gICAgICBjb25zdCByZWFkb25seSA9IG1vZGlmaWVkLnJlYWRvbmx5O1xuICAgICAgaWYgKFxuICAgICAgICAhKGZsYWdzICYgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0NPTlNUUlVDVE9SX1BBUkFNUykgJiZcbiAgICAgICAgKGFjY2Vzc2liaWxpdHkgfHwgcmVhZG9ubHkgfHwgb3ZlcnJpZGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5VbmV4cGVjdGVkUGFyYW1ldGVyTW9kaWZpZXIsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdCgpO1xuICAgICAgdGhpcy5wYXJzZUFzc2lnbmFibGVMaXN0SXRlbVR5cGVzKGxlZnQsIGZsYWdzKTtcbiAgICAgIGNvbnN0IGVsdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQobGVmdC5sb2Muc3RhcnQsIGxlZnQpO1xuICAgICAgaWYgKGFjY2Vzc2liaWxpdHkgfHwgcmVhZG9ubHkgfHwgb3ZlcnJpZGUpIHtcbiAgICAgICAgY29uc3QgcHAgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eT4oc3RhcnRMb2MpO1xuICAgICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBwcC5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eSkgcHAuYWNjZXNzaWJpbGl0eSA9IGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIGlmIChyZWFkb25seSkgcHAucmVhZG9ubHkgPSByZWFkb25seTtcbiAgICAgICAgaWYgKG92ZXJyaWRlKSBwcC5vdmVycmlkZSA9IG92ZXJyaWRlO1xuICAgICAgICBpZiAoZWx0LnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmIGVsdC50eXBlICE9PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkUGFyYW1ldGVyUHJvcGVydHlLaW5kLCB7IGF0OiBwcCB9KTtcbiAgICAgICAgfVxuICAgICAgICBwcC5wYXJhbWV0ZXIgPSBlbHQgYXMgYW55IGFzIE4uSWRlbnRpZmllciB8IE4uQXNzaWdubWVudFBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHAsIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuXG4gICAgaXNTaW1wbGVQYXJhbWV0ZXIobm9kZTogTi5QYXR0ZXJuIHwgTi5UU1BhcmFtZXRlclByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAobm9kZS50eXBlID09PSBcIlRTUGFyYW1ldGVyUHJvcGVydHlcIiAmJlxuICAgICAgICAgIHN1cGVyLmlzU2ltcGxlUGFyYW1ldGVyKG5vZGUucGFyYW1ldGVyKSkgfHxcbiAgICAgICAgc3VwZXIuaXNTaW1wbGVQYXJhbWV0ZXIobm9kZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHNEaXNhbGxvd09wdGlvbmFsUGF0dGVybihub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4pIHtcbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygbm9kZS5wYXJhbXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcmFtLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgICAgKHBhcmFtIGFzIGFueSkub3B0aW9uYWwgJiZcbiAgICAgICAgICAhdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUGF0dGVybklzT3B0aW9uYWwsIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4sXG4gICAgICBwYXJhbXM6IE4uRXhwcmVzc2lvbltdLFxuICAgICAgdHJhaWxpbmdDb21tYUxvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLnNldEFycm93RnVuY3Rpb25QYXJhbWV0ZXJzKG5vZGUsIHBhcmFtcywgdHJhaWxpbmdDb21tYUxvYyk7XG4gICAgICB0aGlzLnRzRGlzYWxsb3dPcHRpb25hbFBhdHRlcm4obm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2g8XG4gICAgICBUIGV4dGVuZHNcbiAgICAgICAgfCBOLkZ1bmN0aW9uXG4gICAgICAgIHwgTi5UU0RlY2xhcmVNZXRob2RcbiAgICAgICAgfCBOLlRTRGVjbGFyZUZ1bmN0aW9uXG4gICAgICAgIHwgTi5DbGFzc1ByaXZhdGVNZXRob2QsXG4gICAgPihub2RlOiBVbmRvbmU8VD4sIHR5cGU6IFRbXCJ0eXBlXCJdLCBpc01ldGhvZDogYm9vbGVhbiA9IGZhbHNlKTogVCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgbm9kZS5yZXR1cm5UeXBlID0gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24odHQuY29sb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2RpbGVzc1R5cGUgPVxuICAgICAgICB0eXBlID09PSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIlxuICAgICAgICAgID8gXCJUU0RlY2xhcmVGdW5jdGlvblwiXG4gICAgICAgICAgOiB0eXBlID09PSBcIkNsYXNzTWV0aG9kXCIgfHwgdHlwZSA9PT0gXCJDbGFzc1ByaXZhdGVNZXRob2RcIlxuICAgICAgICAgID8gXCJUU0RlY2xhcmVNZXRob2RcIlxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGJvZGlsZXNzVHlwZSAmJiAhdGhpcy5tYXRjaCh0dC5icmFjZUwpICYmIHRoaXMuaXNMaW5lVGVybWluYXRvcigpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgYm9kaWxlc3NUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmIChib2RpbGVzc1R5cGUgPT09IFwiVFNEZWNsYXJlRnVuY3Rpb25cIiAmJiB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EZWNsYXJlRnVuY3Rpb25IYXNJbXBsZW1lbnRhdGlvbiwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgaWYgKChub2RlIGFzIFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+KS5kZWNsYXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoKG5vZGUsIGJvZGlsZXNzVHlwZSwgaXNNZXRob2QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRzRGlzYWxsb3dPcHRpb25hbFBhdHRlcm4obm9kZSk7XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaChub2RlLCB0eXBlLCBpc01ldGhvZCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGdW5jdGlvblN0YXRlbWVudElkKG5vZGU6IE4uRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgIGlmICghbm9kZS5ib2R5ICYmIG5vZGUuaWQpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gaWRzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgcGFyc2luZyB0aGVpciBib2R5LlxuICAgICAgICAvLyBGb3IgYm9kaWxlc3MgZnVuY3Rpb24sIHdlIG5lZWQgdG8gZG8gaXQgaGVyZS5cbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19BTUJJRU5UKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnJlZ2lzdGVyRnVuY3Rpb25TdGF0ZW1lbnRJZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0NoZWNrRm9ySW52YWxpZFR5cGVDYXN0cyhpdGVtczogQXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4pIHtcbiAgICAgIGl0ZW1zLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuZXhwZWN0ZWRUeXBlQW5ub3RhdGlvbiwge1xuICAgICAgICAgICAgYXQ6IG5vZGUudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvUmVmZXJlbmNlZExpc3QoXG4gICAgICBleHByTGlzdDogQXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBpc0luUGFyZW5zPzogYm9vbGVhbixcbiAgICApOiBBcnJheTxOLkV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgICAvLyBIYW5kbGVzIGludmFsaWQgc2NlbmFyaW9zIGxpa2U6IGBmKGE6YilgLCBgKGE6Yik7YCwgYW5kIGAoYTpiLGM6ZClgLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCBgZjxUPihhOmIpYCBnb2VzIHRocm91Z2ggYSBkaWZmZXJlbnQgcGF0aCBhbmQgaXMgaGFuZGxlZFxuICAgICAgLy8gaW4gYHBhcnNlU3Vic2NyaXB0YCBkaXJlY3RseS5cbiAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMoZXhwckxpc3QpO1xuICAgICAgcmV0dXJuIGV4cHJMaXN0O1xuICAgIH1cblxuICAgIHBhcnNlQXJyYXlMaWtlKFxuICAgICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICAgIGNhbkJlUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzVHVwbGU6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5BcnJheUV4cHJlc3Npb24gfCBOLlR1cGxlRXhwcmVzc2lvbiB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VBcnJheUxpa2UoXG4gICAgICAgIGNsb3NlLFxuICAgICAgICBjYW5CZVBhdHRlcm4sXG4gICAgICAgIGlzVHVwbGUsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuXG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMobm9kZS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICghdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJiB0aGlzLm1hdGNoKHR0LmJhbmcpKSB7XG4gICAgICAgIC8vIFdoZW4gISBpcyBjb25zdW1lZCBhcyBhIHBvc3RmaXggb3BlcmF0b3IgKG5vbi1udWxsIGFzc2VydGlvbiksXG4gICAgICAgIC8vIGRpc2FsbG93IEpTWCB0YWcgZm9ybWluZyBhZnRlci4gZS5nLiBXaGVuIHBhcnNpbmcgYHAhIDwgbi5wIWBcbiAgICAgICAgLy8gYDxuLnBgIGNhbiBub3QgYmUgYSBzdGFydCBvZiBKU1ggdGFnXG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGNvbnN0IG5vbk51bGxFeHByZXNzaW9uID1cbiAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0PE4uVHNOb25OdWxsRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgICBub25OdWxsRXhwcmVzc2lvbi5leHByZXNzaW9uID0gYmFzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub25OdWxsRXhwcmVzc2lvbiwgXCJUU05vbk51bGxFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNPcHRpb25hbENhbGwgPSBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXRjaCh0dC5xdWVzdGlvbkRvdCkgJiZcbiAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVzc1RoYW5cbiAgICAgICkge1xuICAgICAgICBpZiAobm9DYWxscykge1xuICAgICAgICAgIHN0YXRlLnN0b3AgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgPSBpc09wdGlvbmFsQ2FsbCA9IHRydWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBoYW5kbGVzICdmPDxUPidcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmJpdFNoaWZ0TCkpIHtcbiAgICAgICAgbGV0IG1pc3NpbmdQYXJlbkVycm9yTG9jO1xuICAgICAgICAvLyB0c1RyeVBhcnNlQW5kQ2F0Y2ggaXMgZXhwZW5zaXZlLCBzbyBhdm9pZCBpZiBub3QgbmVjZXNzYXJ5LlxuICAgICAgICAvLyBUaGVyZSBhcmUgbnVtYmVyIG9mIHRoaW5ncyB3ZSBhcmUgZ29pbmcgdG8gXCJtYXliZVwiIHBhcnNlLCBsaWtlIHR5cGUgYXJndW1lbnRzIG9uXG4gICAgICAgIC8vIHRhZ2dlZCB0ZW1wbGF0ZSBleHByZXNzaW9ucy4gSWYgYW55IG9mIHRoZW0gZmFpbCwgd2FsayBpdCBiYWNrIGFuZCBjb250aW51ZS5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghbm9DYWxscyAmJiB0aGlzLmF0UG9zc2libGVBc3luY0Fycm93KGJhc2UpKSB7XG4gICAgICAgICAgICAvLyBBbG1vc3QgY2VydGFpbmx5IHRoaXMgaXMgYSBnZW5lcmljIGFzeW5jIGZ1bmN0aW9uIGBhc3luYyA8VD4oKSA9PiAuLi5cbiAgICAgICAgICAgIC8vIEJ1dCBpdCBtaWdodCBiZSBhIGNhbGwgd2l0aCBhIHR5cGUgYXJndW1lbnQgYGFzeW5jPFQ+KCk7YFxuICAgICAgICAgICAgY29uc3QgYXN5bmNBcnJvd0ZuID1cbiAgICAgICAgICAgICAgdGhpcy50c1RyeVBhcnNlR2VuZXJpY0FzeW5jQXJyb3dGdW5jdGlvbihzdGFydExvYyk7XG4gICAgICAgICAgICBpZiAoYXN5bmNBcnJvd0ZuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhc3luY0Fycm93Rm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTtcbiAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMpIHJldHVybjtcblxuICAgICAgICAgIGlmIChpc09wdGlvbmFsQ2FsbCAmJiAhdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgICAgICBtaXNzaW5nUGFyZW5FcnJvckxvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodG9rZW5Jc1RlbXBsYXRlKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBiYXNlLFxuXG4gICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXN1bHQudHlwZVBhcmFtZXRlcnMgPSB0eXBlQXJndW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5vQ2FsbHMgJiYgdGhpcy5lYXQodHQucGFyZW5MKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8XG4gICAgICAgICAgICAgIE4uQ2FsbEV4cHJlc3Npb24gfCBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cbiAgICAgICAgICAgID4oc3RhcnRMb2MpO1xuICAgICAgICAgICAgbm9kZS5jYWxsZWUgPSBiYXNlO1xuICAgICAgICAgICAgLy8gcG9zc2libGVBc3luYyBhbHdheXMgZmFsc2UgaGVyZSwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGhhbmRsZWQgaXQgYWJvdmUuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICh3b24ndCBiZSBhbnkgdW5kZWZpbmVkIGFyZ3VtZW50cylcbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICAgICAgICB0dC5wYXJlblIsXG4gICAgICAgICAgICAgIC8qIHBvc3NpYmxlQXN5bmMgKi8gZmFsc2UsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGVzIGludmFsaWQgY2FzZTogYGY8VD4oYTpiKWBcbiAgICAgICAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMobm9kZS5hcmd1bWVudHMpO1xuXG4gICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIFVuZG9uZTxOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24+KS5vcHRpb25hbCA9XG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbENhbGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMuc3RhdGUudHlwZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBhPGI+PmMgaXMgbm90IChhPGI+KT5jLCBidXQgYTwoYj4+YylcbiAgICAgICAgICAgIHRva2VuVHlwZSA9PT0gdHQuZ3QgfHxcbiAgICAgICAgICAgIC8vIGE8Yj4+PmMgaXMgbm90IChhPGI+KT4+YywgYnV0IGE8KGI+Pj5jKVxuICAgICAgICAgICAgdG9rZW5UeXBlID09PSB0dC5iaXRTaGlmdFIgfHxcbiAgICAgICAgICAgIC8vIGE8Yj5jIGlzIChhPGIpPmNcbiAgICAgICAgICAgICh0b2tlblR5cGUgIT09IHR0LnBhcmVuTCAmJlxuICAgICAgICAgICAgICB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbih0b2tlblR5cGUpICYmXG4gICAgICAgICAgICAgICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQmFpbCBvdXQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5Uc0luc3RhbnRpYXRpb25FeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICAgICAgbm9kZS5leHByZXNzaW9uID0gYmFzZTtcbiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG1pc3NpbmdQYXJlbkVycm9yTG9jKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKG1pc3NpbmdQYXJlbkVycm9yTG9jLCB0dC5wYXJlbkwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdC50eXBlID09PSBcIlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICAgKHRoaXMubWF0Y2godHQuZG90KSB8fFxuICAgICAgICAgICAgICAodGhpcy5tYXRjaCh0dC5xdWVzdGlvbkRvdCkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgIT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXMpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShcbiAgICAgICAgICAgICAgVFNFcnJvcnMuSW52YWxpZFByb3BlcnR5QWNjZXNzQWZ0ZXJJbnN0YW50aWF0aW9uRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBwYXJzZU5ld0NhbGxlZShub2RlOiBOLk5ld0V4cHJlc3Npb24pOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlTmV3Q2FsbGVlKG5vZGUpO1xuXG4gICAgICBjb25zdCB7IGNhbGxlZSB9ID0gbm9kZTtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsbGVlLnR5cGUgPT09IFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiICYmXG4gICAgICAgICFjYWxsZWUuZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gY2FsbGVlLnR5cGVQYXJhbWV0ZXJzO1xuICAgICAgICBub2RlLmNhbGxlZSA9IGNhbGxlZS5leHByZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRXhwck9wKFxuICAgICAgbGVmdDogTi5FeHByZXNzaW9uLFxuICAgICAgbGVmdFN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIG1pblByZWM6IG51bWJlcixcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgbGV0IGlzU2F0aXNmaWVzOiBib29sZWFuO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbk9wZXJhdG9yUHJlY2VkZW5jZSh0dC5faW4pID4gbWluUHJlYyAmJlxuICAgICAgICAhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJlxuICAgICAgICAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSB8fFxuICAgICAgICAgIChpc1NhdGlzZmllcyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zYXRpc2ZpZXMpKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxcbiAgICAgICAgICBOLlRzQXNFeHByZXNzaW9uIHwgTi5Uc1NhdGlzZmllc0V4cHJlc3Npb25cbiAgICAgICAgPihsZWZ0U3RhcnRMb2MpO1xuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSBsZWZ0O1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7IC8vIFwiYXNcIiBvciBcInNhdGlzZmllc1wiXG4gICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NvbnN0KSkge1xuICAgICAgICAgICAgaWYgKGlzU2F0aXNmaWVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRLZXl3b3JkLCB7XG4gICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICAgICAga2V5d29yZDogXCJjb25zdFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlUmVmZXJlbmNlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlzU2F0aXNmaWVzID8gXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIiA6IFwiVFNBc0V4cHJlc3Npb25cIixcbiAgICAgICAgKTtcbiAgICAgICAgLy8gcmVzY2FuIGA8YCwgYD5gIGJlY2F1c2UgdGhleSB3ZXJlIHNjYW5uZWQgd2hlbiB0aGlzLnN0YXRlLmluVHlwZSB3YXMgdHJ1ZVxuICAgICAgICB0aGlzLnJlU2Nhbl9sdF9ndCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBsZWZ0U3RhcnRMb2MsXG4gICAgICAgICAgbWluUHJlYyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwck9wKGxlZnQsIGxlZnRTdGFydExvYywgbWluUHJlYyk7XG4gICAgfVxuXG4gICAgY2hlY2tSZXNlcnZlZFdvcmQoXG4gICAgICB3b3JkOiBzdHJpbmcsXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBjaGVja0tleXdvcmRzOiBib29sZWFuLFxuICAgICAgaXNCaW5kaW5nOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gU3RyaWN0IG1vZGUgd29yZHMgbWF5IGJlIGFsbG93ZWQgYXMgaW4gYGRlY2xhcmUgbmFtZXNwYWNlIE4geyBjb25zdCBzdGF0aWM6IG51bWJlcjsgfWAuXG4gICAgICAvLyBBbmQgd2UgaGF2ZSBhIHR5cGUgY2hlY2tlciBhbnl3YXksIHNvIGRvbid0IGJvdGhlciBoYXZpbmcgdGhlIHBhcnNlciBkbyBpdC5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyLmNoZWNrUmVzZXJ2ZWRXb3JkKHdvcmQsIHN0YXJ0TG9jLCBjaGVja0tleXdvcmRzLCBpc0JpbmRpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICAgIHN1cGVyLmNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlKTtcbiAgICAgIGlmIChub2RlLm1vZHVsZSAmJiBub2RlLmltcG9ydEtpbmQgIT09IFwidmFsdWVcIikge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkltcG9ydFJlZmxlY3Rpb25IYXNJbXBvcnRUeXBlLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgRG9uJ3QgYm90aGVyIGRvaW5nIHRoaXMgY2hlY2sgaW4gVHlwZVNjcmlwdCBjb2RlIGJlY2F1c2U6XG4gICAgMS4gV2UgbWF5IGhhdmUgYSBuZXN0ZWQgZXhwb3J0IHN0YXRlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWU6XG4gICAgICBleHBvcnQgY29uc3QgeCA9IDA7XG4gICAgICBleHBvcnQgbmFtZXNwYWNlIE4ge1xuICAgICAgICBleHBvcnQgY29uc3QgeCA9IDE7XG4gICAgICB9XG4gICAgMi4gV2UgaGF2ZSBhIHR5cGUgY2hlY2tlciB0byB3YXJuIHVzIGFib3V0IHRoaXMgc29ydCBvZiB0aGluZy5cbiAgICAqL1xuICAgIGNoZWNrRHVwbGljYXRlRXhwb3J0cygpIHt9XG5cbiAgICBpc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAoc3VwZXIuaXNQb3RlbnRpYWxJbXBvcnRQaGFzZShpc0V4cG9ydCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKSkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgcmV0dXJuIGlzRXhwb3J0XG4gICAgICAgICAgPyBjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlIHx8IGNoID09PSBjaGFyQ29kZXMuYXN0ZXJpc2tcbiAgICAgICAgICA6IGNoICE9PSBjaGFyQ29kZXMuZXF1YWxzVG87XG4gICAgICB9XG4gICAgICByZXR1cm4gIWlzRXhwb3J0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlb2YpO1xuICAgIH1cblxuICAgIGFwcGx5SW1wb3J0UGhhc2UoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgICBpc0V4cG9ydDogYm9vbGVhbixcbiAgICAgIHBoYXNlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbG9jPzogUG9zaXRpb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5hcHBseUltcG9ydFBoYXNlKG5vZGUsIGlzRXhwb3J0LCBwaGFzZSwgbG9jKTtcbiAgICAgIGlmIChpc0V4cG9ydCkge1xuICAgICAgICAobm9kZSBhcyBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pLmV4cG9ydEtpbmQgPVxuICAgICAgICAgIHBoYXNlID09PSBcInR5cGVcIiA/IFwidHlwZVwiIDogXCJ2YWx1ZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikuaW1wb3J0S2luZCA9XG4gICAgICAgICAgcGhhc2UgPT09IFwidHlwZVwiIHx8IHBoYXNlID09PSBcInR5cGVvZlwiID8gcGhhc2UgOiBcInZhbHVlXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VJbXBvcnQoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgKTogTi5BbnlJbXBvcnQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICBub2RlLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUltcG9ydChub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbXBvcnROb2RlO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpICYmXG4gICAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5pbXBvcnRLaW5kID0gXCJ2YWx1ZVwiO1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24oXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpKSB7XG4gICAgICAgIGNvbnN0IG1heWJlRGVmYXVsdElkZW50aWZpZXIgPSB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgICAvKiBpc0V4cG9ydCAqLyBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbXBvcnROb2RlID0gc3VwZXIucGFyc2VJbXBvcnRTcGVjaWZpZXJzQW5kQWZ0ZXIoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1wb3J0Tm9kZSA9IHN1cGVyLnBhcnNlSW1wb3J0KG5vZGUgYXMgVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+KTtcbiAgICAgIH1cblxuICAgICAgLy8gYGltcG9ydCB0eXBlYCBjYW4gb25seSBiZSB1c2VkIG9uIGltcG9ydHMgd2l0aCBuYW1lZCBpbXBvcnRzIG9yIHdpdGggYVxuICAgICAgLy8gZGVmYXVsdCBpbXBvcnQgLSBidXQgbm90IGJvdGhcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0Tm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVcIiAmJlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIGltcG9ydE5vZGUuc3BlY2lmaWVycy5sZW5ndGggPiAxICYmXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgaW1wb3J0Tm9kZS5zcGVjaWZpZXJzWzBdLnR5cGUgPT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5UeXBlSW1wb3J0Q2Fubm90U3BlY2lmeURlZmF1bHRBbmROYW1lZCwge1xuICAgICAgICAgIGF0OiBpbXBvcnROb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltcG9ydE5vZGU7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICAgIGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsLFxuICAgICk6IE4uQW55RXhwb3J0IHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9pbXBvcnQpKSB7XG4gICAgICAgIC8vIGBleHBvcnQgaW1wb3J0IEEgPSBCO2BcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCBgdHQuX2ltcG9ydGBcbiAgICAgICAgbGV0IG1heWJlRGVmYXVsdElkZW50aWZpZXI6IE4uSWRlbnRpZmllciB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpICYmXG4gICAgICAgICAgLy8gV2UgcGFzcyBmYWxzZSBoZXJlLCBiZWNhdXNlIHdlIGFyZSBwYXJzaW5nIGFuIGBpbXBvcnQgLi4uID1gXG4gICAgICAgICAgdGhpcy5pc1BvdGVudGlhbEltcG9ydFBoYXNlKC8qIGlzRXhwb3J0ICovIGZhbHNlKVxuICAgICAgICApIHtcbiAgICAgICAgICBtYXliZURlZmF1bHRJZGVudGlmaWVyID0gdGhpcy5wYXJzZU1heWJlSW1wb3J0UGhhc2UoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLlRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24+LFxuICAgICAgICAgICAgLyogaXNFeHBvcnQgKi8gZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICAgICAgICAvKiBpc0V4cG9ydCAqLyB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVhdCh0dC5lcSkpIHtcbiAgICAgICAgLy8gYGV4cG9ydCA9IHg7YFxuICAgICAgICBjb25zdCBhc3NpZ24gPSBub2RlIGFzIFVuZG9uZTxOLlRzRXhwb3J0QXNzaWdubWVudD47XG4gICAgICAgIGFzc2lnbi5leHByZXNzaW9uID0gc3VwZXIucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICAgIHRoaXMuc2F3VW5hbWJpZ3VvdXNFU00gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGFzc2lnbiwgXCJUU0V4cG9ydEFzc2lnbm1lbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICAgIC8vIGBleHBvcnQgYXMgbmFtZXNwYWNlIEE7YFxuICAgICAgICBjb25zdCBkZWNsID0gbm9kZSBhcyBVbmRvbmU8Ti5Uc05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uPjtcbiAgICAgICAgLy8gU2VlIGBwYXJzZU5hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uYCBpbiBUeXBlU2NyaXB0J3Mgb3duIHBhcnNlclxuICAgICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX25hbWVzcGFjZSk7XG4gICAgICAgIGRlY2wuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGRlY2wsIFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydChcbiAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24+LFxuICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNBYnN0cmFjdENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX2Fic3RyYWN0KSAmJiB0aGlzLmxvb2thaGVhZCgpLnR5cGUgPT09IHR0Ll9jbGFzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlZmF1bHRFeHByZXNzaW9uKCk6IE4uRXhwcmVzc2lvbiB8IE4uRGVjbGFyYXRpb24ge1xuICAgICAgaWYgKHRoaXMuaXNBYnN0cmFjdENsYXNzKCkpIHtcbiAgICAgICAgY29uc3QgY2xzID0gdGhpcy5zdGFydE5vZGU8Ti5DbGFzcz4oKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIFNraXAgXCJhYnN0cmFjdFwiXG4gICAgICAgIGNscy5hYnN0cmFjdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoY2xzLCB0cnVlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIGFsbG93ZWQgaW46XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvcHVsbC8xNjA0MFxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2ludGVyZmFjZSkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50c1BhcnNlSW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5Uc0ludGVyZmFjZURlY2xhcmF0aW9uPigpLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpO1xuICAgIH1cblxuICAgIHBhcnNlVmFyU3RhdGVtZW50KFxuICAgICAgbm9kZTogTi5WYXJpYWJsZURlY2xhcmF0aW9uLFxuICAgICAga2luZDogXCJ2YXJcIiB8IFwibGV0XCIgfCBcImNvbnN0XCIgfCBcInVzaW5nXCIsXG4gICAgICBhbGxvd01pc3NpbmdJbml0aWFsaXplcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgICkge1xuICAgICAgY29uc3QgeyBpc0FtYmllbnRDb250ZXh0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBzdXBlci5wYXJzZVZhclN0YXRlbWVudChcbiAgICAgICAgbm9kZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgYWxsb3dNaXNzaW5nSW5pdGlhbGl6ZXIgfHwgaXNBbWJpZW50Q29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBbWJpZW50Q29udGV4dCkgcmV0dXJuIGRlY2xhcmF0aW9uO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgaWQsIGluaXQgfSBvZiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgLy8gRW1wdHkgaW5pdGlhbGl6ZXIgaXMgdGhlIGVhc3kgY2FzZSB0aGF0IHdlIHdhbnQuXG4gICAgICAgIGlmICghaW5pdCkgY29udGludWU7XG5cbiAgICAgICAgLy8gdmFyIGFuZCBsZXQgYXJlbid0IGV2ZXIgYWxsb3dlZCBpbml0aWFsaXplcnMuXG4gICAgICAgIGlmIChraW5kICE9PSBcImNvbnN0XCIgfHwgISFpZC50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW5pdGlhbGl6ZXJOb3RBbGxvd2VkSW5BbWJpZW50Q29udGV4dCwge1xuICAgICAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgIWlzVmFsaWRBbWJpZW50Q29uc3RJbml0aWFsaXplcihpbml0LCB0aGlzLmhhc1BsdWdpbihcImVzdHJlZVwiKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShcbiAgICAgICAgICAgIFRTRXJyb3JzLkNvbnN0SW5pdGlhaWxpemVyTXVzdEJlU3RyaW5nT3JOdW1lcmljTGl0ZXJhbE9yTGl0ZXJhbEVudW1SZWZlcmVuY2UsXG4gICAgICAgICAgICB7IGF0OiBpbml0IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVjbGFyYXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VTdGF0ZW1lbnRDb250ZW50KFxuICAgICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgICAgIGRlY29yYXRvcnM/OiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLlN0YXRlbWVudCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fY29uc3QpICYmIHRoaXMuaXNMb29rYWhlYWRDb250ZXh0dWFsKFwiZW51bVwiKSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1EZWNsYXJhdGlvbj4oKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuX2NvbnN0KTsgLy8gZWF0ICdjb25zdCdcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihub2RlLCB7IGNvbnN0OiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2VudW0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VFbnVtRGVjbGFyYXRpb24oXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1EZWNsYXJhdGlvbj4oKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHNQYXJzZUludGVyZmFjZURlY2xhcmF0aW9uKHRoaXMuc3RhcnROb2RlKCkpO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VTdGF0ZW1lbnRDb250ZW50KGZsYWdzLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBwYXJzZUFjY2Vzc01vZGlmaWVyKCk6IE4uQWNjZXNzaWJpbGl0eSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZU1vZGlmaWVyKFtcInB1YmxpY1wiLCBcInByb3RlY3RlZFwiLCBcInByaXZhdGVcIl0pO1xuICAgIH1cblxuICAgIHRzSGFzU29tZU1vZGlmaWVycyhtZW1iZXI6IGFueSwgbW9kaWZpZXJzOiByZWFkb25seSBUc01vZGlmaWVyW10pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBtb2RpZmllcnMuc29tZShtb2RpZmllciA9PiB7XG4gICAgICAgIGlmICh0c0lzQWNjZXNzTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlci5hY2Nlc3NpYmlsaXR5ID09PSBtb2RpZmllcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtZW1iZXJbbW9kaWZpZXJdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHNJc1N0YXJ0T2ZTdGF0aWNCbG9ja3MoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5fc3RhdGljKSAmJlxuICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzTWVtYmVyKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1lbWJlcjogYW55LFxuICAgICAgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgbW9kaWZpZXJzID0gW1xuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJwcml2YXRlXCIsXG4gICAgICAgIFwicHVibGljXCIsXG4gICAgICAgIFwicHJvdGVjdGVkXCIsXG4gICAgICAgIFwib3ZlcnJpZGVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcInJlYWRvbmx5XCIsXG4gICAgICAgIFwic3RhdGljXCIsXG4gICAgICBdIGFzIGNvbnN0O1xuICAgICAgdGhpcy50c1BhcnNlTW9kaWZpZXJzKFxuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZE1vZGlmaWVyczogbW9kaWZpZXJzLFxuICAgICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcImluXCIsIFwib3V0XCJdLFxuICAgICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrOiB0cnVlLFxuICAgICAgICAgIGVycm9yVGVtcGxhdGU6IFRTRXJyb3JzLkludmFsaWRNb2RpZmllck9uVHlwZVBhcmFtZXRlclBvc2l0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgY2FsbFBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRzSXNTdGFydE9mU3RhdGljQmxvY2tzKCkpIHtcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IFwic3RhdGljXCJcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IFwie1wiXG4gICAgICAgICAgaWYgKHRoaXMudHNIYXNTb21lTW9kaWZpZXJzKG1lbWJlciwgbW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TdGF0aWNCbG9ja0Nhbm5vdEhhdmVNb2RpZmllciwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdGF0aWNCbG9jayhjbGFzc0JvZHksIG1lbWJlciBhcyBOLlN0YXRpY0Jsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMoXG4gICAgICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgICAgICBtZW1iZXIsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICEhbWVtYmVyLnN0YXRpYyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG1lbWJlci5kZWNsYXJlKSB7XG4gICAgICAgIHRoaXMudHNJbkFtYmllbnRDb250ZXh0KGNhbGxQYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxQYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc01lbWJlcldpdGhJc1N0YXRpYyhcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZW1iZXI6IFVuZG9uZTxOLkNsYXNzTWVtYmVyIHwgTi5Uc0luZGV4U2lnbmF0dXJlPixcbiAgICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy50c1RyeVBhcnNlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgIG1lbWJlciBhcyBVbmRvbmU8Ti5Uc0luZGV4U2lnbmF0dXJlPixcbiAgICAgICk7XG4gICAgICBpZiAoaWR4KSB7XG4gICAgICAgIGNsYXNzQm9keS5ib2R5LnB1c2goaWR4KTtcblxuICAgICAgICBpZiAoKG1lbWJlciBhcyBhbnkpLmFic3RyYWN0KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0Fic3RyYWN0LCB7IGF0OiBtZW1iZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChtZW1iZXIgYXMgYW55KS5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0FjY2Vzc2liaWxpdHksIHtcbiAgICAgICAgICAgIGF0OiBtZW1iZXIsXG4gICAgICAgICAgICBtb2RpZmllcjogKG1lbWJlciBhcyBhbnkpLmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChtZW1iZXIgYXMgYW55KS5kZWNsYXJlKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0RlY2xhcmUsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG1lbWJlciBhcyBhbnkpLm92ZXJyaWRlKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc092ZXJyaWRlLCB7IGF0OiBtZW1iZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pbkFic3RyYWN0Q2xhc3MgJiYgKG1lbWJlciBhcyBhbnkpLmFic3RyYWN0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuTm9uQWJzdHJhY3RDbGFzc0hhc0Fic3RyYWN0TWV0aG9kLCB7XG4gICAgICAgICAgYXQ6IG1lbWJlcixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgobWVtYmVyIGFzIGFueSkub3ZlcnJpZGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5oYWRTdXBlckNsYXNzKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5PdmVycmlkZU5vdEluU3ViQ2xhc3MsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKjo6IGludmFyaWFudChtZW1iZXIudHlwZSAhPT0gXCJUU0luZGV4U2lnbmF0dXJlXCIpICovXG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgbWVtYmVyIGFzIFVuZG9uZTxOLkNsYXNzTWVtYmVyPixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGlzU3RhdGljLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZVBvc3RNZW1iZXJOYW1lTW9kaWZpZXJzKFxuICAgICAgbWV0aG9kT3JQcm9wOiBOLkNsYXNzTWV0aG9kIHwgTi5DbGFzc1Byb3BlcnR5IHwgTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IG9wdGlvbmFsID0gdGhpcy5lYXQodHQucXVlc3Rpb24pO1xuICAgICAgaWYgKG9wdGlvbmFsKSBtZXRob2RPclByb3Aub3B0aW9uYWwgPSB0cnVlO1xuXG4gICAgICBpZiAoKG1ldGhvZE9yUHJvcCBhcyBhbnkpLnJlYWRvbmx5ICYmIHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkNsYXNzTWV0aG9kSGFzUmVhZG9ubHksIHsgYXQ6IG1ldGhvZE9yUHJvcCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKChtZXRob2RPclByb3AgYXMgYW55KS5kZWNsYXJlICYmIHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkNsYXNzTWV0aG9kSGFzRGVjbGFyZSwgeyBhdDogbWV0aG9kT3JQcm9wIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoZSByZWFzb24gd2UgZG8gdGhpcyBpbiBgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50YCBhbmQgbm90IGBwYXJzZVN0YXRlbWVudGBcbiAgICAvLyBpcyB0aGF0IGUuZy4gYHR5cGUoKWAgaXMgdmFsaWQgSlMsIHNvIHdlIG11c3QgdHJ5IHBhcnNpbmcgdGhhdCBmaXJzdC5cbiAgICAvLyBJZiBpdCdzIHJlYWxseSBhIHR5cGUsIHdlIHdpbGwgcGFyc2UgYHR5cGVgIGFzIHRoZSBzdGF0ZW1lbnQsIGFuZCBjYW4gY29ycmVjdCBpdCBoZXJlXG4gICAgLy8gYnkgcGFyc2luZyB0aGUgcmVzdC5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsdWdpbiBvdmVycmlkZXMgaW50ZXJmYWNlc1xuICAgIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkV4cHJlc3Npb25TdGF0ZW1lbnQ+LFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKTogTi5TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZGVjbCA9XG4gICAgICAgIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIHRoaXMudHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgZXhwciwgZGVjb3JhdG9ycylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBkZWNsIHx8IHN1cGVyLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBleHByLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICAvLyBleHBvcnQgdHlwZVxuICAgIC8vIFNob3VsZCBiZSB0cnVlIGZvciBhbnl0aGluZyBwYXJzZWQgYnkgYHRzVHJ5UGFyc2VFeHBvcnREZWNsYXJhdGlvbmAuXG4gICAgc2hvdWxkUGFyc2VFeHBvcnREZWNsYXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzLnRzSXNEZWNsYXJhdGlvblN0YXJ0KCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBBbiBhcHBhcmVudCBjb25kaXRpb25hbCBleHByZXNzaW9uIGNvdWxkIGFjdHVhbGx5IGJlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpbiBhbiBhcnJvdyBmdW5jdGlvbi5cbiAgICBwYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIC8vIG9ubHkgZG8gdGhlIGV4cGVuc2l2ZSBjbG9uZSBpZiB0aGVyZSBpcyBhIHF1ZXN0aW9uIG1hcmtcbiAgICAgIC8vIGFuZCBpZiB3ZSBjb21lIGZyb20gaW5zaWRlIHBhcmVuc1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgfHwgIXRoaXMubWF0Y2godHQucXVlc3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgICAgIGV4cHIsXG5cbiAgICAgICAgICBzdGFydExvYyxcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyeVBhcnNlKCgpID0+XG4gICAgICAgIHN1cGVyLnBhcnNlQ29uZGl0aW9uYWwoZXhwciwgc3RhcnRMb2MpLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQubm9kZSkge1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgLyo6OiBpbnZhcmlhbnQocmVmRXhwcmVzc2lvbkVycm9ycyAhPSBudWxsKSAqL1xuICAgICAgICAgIHN1cGVyLnNldE9wdGlvbmFsUGFyYW1ldGVyc0Vycm9yKHJlZkV4cHJlc3Npb25FcnJvcnMsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRoaXMuc3RhdGUgPSByZXN1bHQuZmFpbFN0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdC5ub2RlO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoZXNlIFwidHlwZSBjYXN0c1wiIGFyZSAqbm90KiB2YWxpZCBUUyBleHByZXNzaW9ucy5cbiAgICAvLyBCdXQgd2UgcGFyc2UgdGhlbSBoZXJlIGFuZCBjaGFuZ2UgdGhlbSB3aGVuIGNvbXBsZXRpbmcgdGhlIGFycm93IGZ1bmN0aW9uLlxuICAgIHBhcnNlUGFyZW5JdGVtKFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIG5vZGUgPSBzdXBlci5wYXJzZVBhcmVuSXRlbShub2RlLCBzdGFydExvYyk7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAvLyBJbmNsdWRlIHF1ZXN0aW9ubWFyayBpbiBsb2NhdGlvbiBvZiBub2RlXG4gICAgICAgIC8vIERvbid0IHVzZSB0aGlzLmZpbmlzaE5vZGUoKSBhcyBvdGhlcndpc2Ugd2UgbWlnaHQgcHJvY2VzcyBjb21tZW50cyB0d2ljZSBhbmRcbiAgICAgICAgLy8gaW5jbHVkZSBhbHJlYWR5IGNvbnN1bWVkIHBhcmVuc1xuICAgICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24obm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICBjb25zdCB0eXBlQ2FzdE5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uVHNUeXBlQ2FzdEV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgICAgdHlwZUNhc3ROb2RlLmV4cHJlc3Npb24gPSBub2RlO1xuICAgICAgICB0eXBlQ2FzdE5vZGUudHlwZUFubm90YXRpb24gPSB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUodHlwZUNhc3ROb2RlLCBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICAgICk6IE4uRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c0luQW1iaWVudENvbnRleHQoKCkgPT4gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgbG9jYXRpb25cbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcblxuICAgICAgY29uc3QgaXNEZWNsYXJlID0gdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKTtcblxuICAgICAgaWYgKFxuICAgICAgICBpc0RlY2xhcmUgJiZcbiAgICAgICAgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKSB8fCAhdGhpcy5zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShUU0Vycm9ycy5FeHBlY3RlZEFtYmllbnRBZnRlckV4cG9ydERlY2xhcmUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzSWRlbnRpZmllciA9IHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbjogTi5EZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPVxuICAgICAgICAoaXNJZGVudGlmaWVyICYmIHRoaXMudHNUcnlQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCkpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24obm9kZSk7XG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiIHx8XG4gICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiIHx8XG4gICAgICAgIGlzRGVjbGFyZVxuICAgICAgKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWNsYXJlKSB7XG4gICAgICAgIC8vIFJlc2V0IGxvY2F0aW9uIHRvIGluY2x1ZGUgYGRlY2xhcmVgIGluIHJhbmdlXG4gICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uKGRlY2xhcmF0aW9uLCBzdGFydExvYyk7XG5cbiAgICAgICAgZGVjbGFyYXRpb24uZGVjbGFyZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzSWQoXG4gICAgICBub2RlOiBOLkNsYXNzLFxuICAgICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgICBvcHRpb25hbElkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBiaW5kaW5nVHlwZT86IEJpbmRpbmdUeXBlcyxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICgoIWlzU3RhdGVtZW50IHx8IG9wdGlvbmFsSWQpICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbXBsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NJZChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaXNTdGF0ZW1lbnQsXG4gICAgICAgIG9wdGlvbmFsSWQsXG4gICAgICAgIChub2RlIGFzIGFueSkuZGVjbGFyZSA/IEJJTkRfVFNfQU1CSUVOVCA6IEJJTkRfQ0xBU1MsXG4gICAgICApO1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRDb25zdE1vZGlmaWVycyxcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKFxuICAgICAgbm9kZTogTi5DbGFzc1Byb3BlcnR5IHwgTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB8IE4uQ2xhc3NBY2Nlc3NvclByb3BlcnR5LFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKCFub2RlLm9wdGlvbmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5iYW5nKSkge1xuICAgICAgICAgIG5vZGUuZGVmaW5pdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgaWYgKHR5cGUpIG5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlOiBOLkNsYXNzUHJvcGVydHkpOiBOLkNsYXNzUHJvcGVydHkge1xuICAgICAgdGhpcy5wYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKG5vZGUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc3RhdGUuaXNBbWJpZW50Q29udGV4dCAmJlxuICAgICAgICAhKG5vZGUucmVhZG9ubHkgJiYgIW5vZGUudHlwZUFubm90YXRpb24pICYmXG4gICAgICAgIHRoaXMubWF0Y2godHQuZXEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EZWNsYXJlQ2xhc3NGaWVsZEhhc0luaXRpYWxpemVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYWJzdHJhY3QgJiYgdGhpcy5tYXRjaCh0dC5lcSkpIHtcbiAgICAgICAgY29uc3QgeyBrZXkgfSA9IG5vZGU7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuQWJzdHJhY3RQcm9wZXJ0eUhhc0luaXRpYWxpemVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOlxuICAgICAgICAgICAga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmICFub2RlLmNvbXB1dGVkXG4gICAgICAgICAgICAgID8ga2V5Lm5hbWVcbiAgICAgICAgICAgICAgOiBgWyR7dGhpcy5pbnB1dC5zbGljZShrZXkuc3RhcnQsIGtleS5lbmQpfV1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICAgICAgbm9kZTogTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSxcbiAgICApOiBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWJzdHJhY3QgbWF5IG5vdCBpbmRleCBub2RlXG4gICAgICBpZiAobm9kZS5hYnN0cmFjdCkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlByaXZhdGVFbGVtZW50SGFzQWJzdHJhY3QsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWNjZXNzaWJpbGl0eSBtYXkgbm90IGluZGV4IG5vZGVcbiAgICAgIGlmIChub2RlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5Qcml2YXRlRWxlbWVudEhhc0FjY2Vzc2liaWxpdHksIHtcbiAgICAgICAgICBhdDogbm9kZSxcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgbW9kaWZpZXI6IG5vZGUuYWNjZXNzaWJpbGl0eSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5QW5ub3RhdGlvbihub2RlKTtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KG5vZGUpO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NBY2Nlc3NvclByb3BlcnR5KFxuICAgICAgbm9kZTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHksXG4gICAgKTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICAgICAgdGhpcy5wYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKG5vZGUpO1xuICAgICAgaWYgKG5vZGUub3B0aW9uYWwpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5BY2Nlc3NvckNhbm5vdEJlT3B0aW9uYWwsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VDbGFzc0FjY2Vzc29yUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgcHVzaENsYXNzTWV0aG9kKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1ldGhvZDogTi5DbGFzc01ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgICBhbGxvd3NEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1RyeVBhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgIHRoaXMudHNQYXJzZUNvbnN0TW9kaWZpZXIsXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzICYmIGlzQ29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5Db25zdHJ1Y3Rvckhhc1R5cGVQYXJhbWV0ZXJzLCB7XG4gICAgICAgICAgYXQ6IHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZWNsYXJlIGRvZXMgbm90IGV4aXN0IGluIENsYXNzTWV0aG9kXG4gICAgICBjb25zdCB7IGRlY2xhcmUgPSBmYWxzZSwga2luZCB9ID0gbWV0aG9kO1xuXG4gICAgICBpZiAoZGVjbGFyZSAmJiAoa2luZCA9PT0gXCJnZXRcIiB8fCBraW5kID09PSBcInNldFwiKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkRlY2xhcmVBY2Nlc3NvciwgeyBhdDogbWV0aG9kLCBraW5kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzKSBtZXRob2QudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICAgIHN1cGVyLnB1c2hDbGFzc01ldGhvZChcbiAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc0NvbnN0cnVjdG9yLFxuICAgICAgICBhbGxvd3NEaXJlY3RTdXBlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZXRob2Q6IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RNb2RpZmllcixcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG1ldGhvZC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuICAgICAgc3VwZXIucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIG1ldGhvZCwgaXNHZW5lcmF0b3IsIGlzQXN5bmMpO1xuICAgIH1cblxuICAgIGRlY2xhcmVDbGFzc1ByaXZhdGVNZXRob2RJblNjb3BlKFxuICAgICAgbm9kZTogTi5DbGFzc1ByaXZhdGVNZXRob2QgfCBOLkVzdHJlZU1ldGhvZERlZmluaXRpb24gfCBOLlRTRGVjbGFyZU1ldGhvZCxcbiAgICAgIGtpbmQ6IG51bWJlcixcbiAgICApIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiVFNEZWNsYXJlTWV0aG9kXCIpIHJldHVybjtcbiAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHVzaW5nIHRoZSBcImVzdHJlZVwiIHBsdWdpbi5cbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiICYmICFub2RlLnZhbHVlLmJvZHkpIHJldHVybjtcblxuICAgICAgc3VwZXIuZGVjbGFyZUNsYXNzUHJpdmF0ZU1ldGhvZEluU2NvcGUobm9kZSwga2luZCk7XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1N1cGVyKG5vZGU6IE4uQ2xhc3MpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAgIC8vIGhhbmRsZSBgZXh0ZW5kcyBmPDxUPlxuICAgICAgaWYgKG5vZGUuc3VwZXJDbGFzcyAmJiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5iaXRTaGlmdEwpKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIG5vZGUuc3VwZXJUeXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX2ltcGxlbWVudHMpKSB7XG4gICAgICAgIG5vZGUuaW1wbGVtZW50cyA9IHRoaXMudHNQYXJzZUhlcml0YWdlQ2xhdXNlKFwiaW1wbGVtZW50c1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKSB7XG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlUGFyYW1ldGVycykgcHJvcC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgICAgIHByb3AsXG5cbiAgICAgICAgc3RhcnRMb2MsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIGlzQWNjZXNzb3IsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZTogTi5GdW5jdGlvbiwgaXNDb25zdHJ1Y3RvcjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RNb2RpZmllcixcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgaXNDb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgLy8gYGxldCB4OiBudW1iZXI7YFxuICAgIHBhcnNlVmFySWQoXG4gICAgICBkZWNsOiBOLlZhcmlhYmxlRGVjbGFyYXRvcixcbiAgICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiLFxuICAgICk6IHZvaWQge1xuICAgICAgc3VwZXIucGFyc2VWYXJJZChkZWNsLCBraW5kKTtcbiAgICAgIGlmIChcbiAgICAgICAgZGVjbC5pZC50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJlxuICAgICAgICB0aGlzLmVhdCh0dC5iYW5nKVxuICAgICAgKSB7XG4gICAgICAgIGRlY2wuZGVmaW5pdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gdGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIGRlY2wuaWQudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oZGVjbC5pZCk7IC8vIHNldCBlbmQgcG9zaXRpb24gdG8gZW5kIG9mIHR5cGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZSB0aGUgcmV0dXJuIHR5cGUgb2YgYW4gYXN5bmMgYXJyb3cgZnVuY3Rpb24gLSBsZXQgZm9vID0gKGFzeW5jICgpOiBudW1iZXIgPT4ge30pO1xuICAgIHBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbihcbiAgICAgIG5vZGU6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICBjYWxsOiBOLkNhbGxFeHByZXNzaW9uLFxuICAgICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKG5vZGUsIGNhbGwpO1xuICAgIH1cblxuICAgIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICAvLyBOb3RlOiBXaGVuIHRoZSBKU1ggcGx1Z2luIGlzIG9uLCB0eXBlIGFzc2VydGlvbnMgKGA8VD4geGApIGFyZW4ndCB2YWxpZCBzeW50YXguXG5cbiAgICAgIGxldCBzdGF0ZTogU3RhdGUgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgICAgbGV0IGpzeDtcbiAgICAgIGxldCB0eXBlQ2FzdDtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc1BsdWdpbihcImpzeFwiKSAmJlxuICAgICAgICAodGhpcy5tYXRjaCh0dC5qc3hUYWdTdGFydCkgfHwgdGhpcy5tYXRjaCh0dC5sdCkpXG4gICAgICApIHtcbiAgICAgICAgLy8gUHJlZmVyIHRvIHBhcnNlIEpTWCBpZiBwb3NzaWJsZS4gQnV0IG1heSBiZSBhbiBhcnJvdyBmbi5cbiAgICAgICAgc3RhdGUgPSB0aGlzLnN0YXRlLmNsb25lKCk7XG5cbiAgICAgICAganN4ID0gdGhpcy50cnlQYXJzZShcbiAgICAgICAgICAoKSA9PiBzdXBlci5wYXJzZU1heWJlQXNzaWduKHJlZkV4cHJlc3Npb25FcnJvcnMsIGFmdGVyTGVmdFBhcnNlKSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKjo6IGludmFyaWFudCghanN4LmFib3J0ZWQpICovXG4gICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5ub2RlICE9IG51bGwpICovXG4gICAgICAgIGlmICghanN4LmVycm9yKSByZXR1cm4ganN4Lm5vZGU7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGB0Yy5qX2V4cHJgIG9yIGB0Yy5qX29UYWdgIGZyb20gY29udGV4dCBhZGRlZFxuICAgICAgICAvLyBieSBwYXJzaW5nIGBqc3hUYWdTdGFydGAgdG8gc3RvcCB0aGUgSlNYIHBsdWdpbiBmcm9tXG4gICAgICAgIC8vIG1lc3Npbmcgd2l0aCB0aGUgdG9rZW5zXG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dCA9PT0gdGMual9vVGFnIHx8IGN1cnJlbnRDb250ZXh0ID09PSB0Yy5qX2V4cHIpIHtcbiAgICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghanN4Py5lcnJvciAmJiAhdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24ocmVmRXhwcmVzc2lvbkVycm9ycywgYWZ0ZXJMZWZ0UGFyc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBFaXRoZXIgd2F5LCB3ZSdyZSBsb29raW5nIGF0IGEgJzwnOiB0dC5qc3hUYWdTdGFydCBvciByZWxhdGlvbmFsLlxuXG4gICAgICAvLyBJZiB0aGUgc3RhdGUgd2FzIGNsb25lZCBpbiB0aGUgSlNYIHBhcnNpbmcgYnJhbmNoIGFib3ZlIGJ1dCB0aGVyZVxuICAgICAgLy8gaGF2ZSBiZWVuIGFueSBlcnJvciBpbiB0aGUgdHJ5UGFyc2UgY2FsbCwgdGhpcy5zdGF0ZSBpcyBzZXQgdG8gc3RhdGVcbiAgICAgIC8vIHNvIHdlIHN0aWxsIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgICBpZiAoIXN0YXRlIHx8IHN0YXRlID09PSB0aGlzLnN0YXRlKSBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcblxuICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzOiBOLlRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICAgIGNvbnN0IGFycm93ID0gdGhpcy50cnlQYXJzZShhYm9ydCA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgc2ltaWxhciB0byBUeXBlU2NyaXB0J3MgYHRyeVBhcnNlUGFyZW50aGVzaXplZEFycm93RnVuY3Rpb25FeHByZXNzaW9uYC5cbiAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzUGFyc2VUeXBlUGFyYW1ldGVycyh0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyKTtcbiAgICAgICAgY29uc3QgZXhwciA9IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgICBhZnRlckxlZnRQYXJzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhwci50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHxcbiAgICAgICAgICBleHByLmV4dHJhPy5wYXJlbnRoZXNpemVkXG4gICAgICAgICkge1xuICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3JyZWN0IFR5cGVTY3JpcHQgY29kZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIHR5cGUgcGFyYW1ldGVyLCBidXQgZG9uJ3QgY3Jhc2ggb24gYmFkIGNvZGUuXG4gICAgICAgIGlmICh0eXBlUGFyYW1ldGVycz8ucGFyYW1zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUoZXhwciwgdHlwZVBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmXG4gICAgICAgICAgICBleHByLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICFleHByLnR5cGVQYXJhbWV0ZXJzLmV4dHJhPy50cmFpbGluZ0NvbW1hXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyByZXBvcnQgZXJyb3IgaWYgc2luZ2xlIHR5cGUgcGFyYW1ldGVyIHVzZWQgd2l0aG91dCB0cmFpbGluZyBjb21tYS5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IGV4cHIudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXIuY29uc3RyYWludCkge1xuICAgICAgICAgICAgICAvLyBBIHNpbmdsZSB0eXBlIHBhcmFtZXRlciBtdXN0IGVpdGhlciBoYXZlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgIC8vIG9yIGEgdHJhaWxpbmcgY29tbWEsIG90aGVyd2lzZSBpdCdzIGFtYmlndW91cyB3aXRoIEpTWC5cbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TaW5nbGVUeXBlUGFyYW1ldGVyV2l0aG91dFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgICBhdDogY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KHBhcmFtZXRlci5sb2MuZW5kLCAxKSxcbiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyTmFtZTogcGFyYW1ldGVyLm5hbWUubmFtZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9LCBzdGF0ZSk7XG5cbiAgICAgIC8qOjogaW52YXJpYW50KGFycm93Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgIGlmICghYXJyb3cuZXJyb3IgJiYgIWFycm93LmFib3J0ZWQpIHtcbiAgICAgICAgLy8gVGhpcyBlcnJvciBpcyByZXBvcnRlZCBvdXRzaWRlIG9mIHRoZSB0aGlzLnRyeVBhcnNlIGNhbGwgc28gdGhhdFxuICAgICAgICAvLyBpbiBjYXNlIG9mIDxUPih4KSA9PiAyLCB3ZSBkb24ndCBjb25zaWRlciA8VD4oeCkgYXMgYSB0eXBlIGFzc2VydGlvblxuICAgICAgICAvLyBiZWNhdXNlIG9mIHRoaXMgZXJyb3IuXG4gICAgICAgIGlmICh0eXBlUGFyYW1ldGVycykgdGhpcy5yZXBvcnRSZXNlcnZlZEFycm93VHlwZVBhcmFtKHR5cGVQYXJhbWV0ZXJzKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICByZXR1cm4gYXJyb3cubm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFqc3gpIHtcbiAgICAgICAgLy8gVHJ5IHBhcnNpbmcgYSB0eXBlIGNhc3QgaW5zdGVhZCBvZiBhbiBhcnJvdyBmdW5jdGlvbi5cbiAgICAgICAgLy8gVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBvdXRzaWRlIG9mIEpTWC5cbiAgICAgICAgLy8gKEJlY2F1c2UgaW4gSlNYIHRoZSAnPCcgc2hvdWxkIGJlIGEganN4VGFnU3RhcnQgYW5kIG5vdCBhIHJlbGF0aW9uYWwuXG4gICAgICAgIGFzc2VydCghdGhpcy5oYXNQbHVnaW4oXCJqc3hcIikpO1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBzdGFydCB3aXRoIGEgdHlwZSBhc3NlcnRpb24gKHZpYSBwYXJzZU1heWJlVW5hcnkpLlxuICAgICAgICAvLyBCdXQgZG9uJ3QgZGlyZWN0bHkgY2FsbCBgdGhpcy50c1BhcnNlVHlwZUFzc2VydGlvbmAgYmVjYXVzZSB3ZSB3YW50IHRvIGhhbmRsZSBhbnkgYmluYXJ5IGFmdGVyIGl0LlxuICAgICAgICB0eXBlQ2FzdCA9IHRoaXMudHJ5UGFyc2UoXG4gICAgICAgICAgKCkgPT4gc3VwZXIucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIC8qOjogaW52YXJpYW50KCF0eXBlQ2FzdC5hYm9ydGVkKSAqL1xuICAgICAgICAvKjo6IGludmFyaWFudCh0eXBlQ2FzdC5ub2RlICE9IG51bGwpICovXG4gICAgICAgIGlmICghdHlwZUNhc3QuZXJyb3IpIHJldHVybiB0eXBlQ2FzdC5ub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoanN4Py5ub2RlKSB7XG4gICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5mYWlsU3RhdGUpICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBqc3guZmFpbFN0YXRlO1xuICAgICAgICByZXR1cm4ganN4Lm5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnJvdy5ub2RlKSB7XG4gICAgICAgIC8qOjogaW52YXJpYW50KGFycm93LmZhaWxTdGF0ZSkgKi9cbiAgICAgICAgdGhpcy5zdGF0ZSA9IGFycm93LmZhaWxTdGF0ZTtcbiAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzKSB0aGlzLnJlcG9ydFJlc2VydmVkQXJyb3dUeXBlUGFyYW0odHlwZVBhcmFtZXRlcnMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIHJldHVybiBhcnJvdy5ub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZUNhc3Q/Lm5vZGUpIHtcbiAgICAgICAgLyo6OiBpbnZhcmlhbnQodHlwZUNhc3QuZmFpbFN0YXRlKSAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gdHlwZUNhc3QuZmFpbFN0YXRlO1xuICAgICAgICByZXR1cm4gdHlwZUNhc3Qubm9kZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cganN4Py5lcnJvciB8fCBhcnJvdy5lcnJvciB8fCB0eXBlQ2FzdD8uZXJyb3I7XG4gICAgfVxuXG4gICAgcmVwb3J0UmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbShub2RlOiBhbnkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICFub2RlLnBhcmFtc1swXS5jb25zdHJhaW50ICYmXG4gICAgICAgICFub2RlLmV4dHJhPy50cmFpbGluZ0NvbW1hICYmXG4gICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwidHlwZXNjcmlwdFwiLCBcImRpc2FsbG93QW1iaWd1b3VzSlNYTGlrZVwiKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbSwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdHlwZSBhc3NlcnRpb25zXG4gICAgcGFyc2VNYXliZVVuYXJ5KFxuICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgICAgc2F3VW5hcnk/OiBib29sZWFuLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmIHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQXNzZXJ0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZVVuYXJ5KHJlZkV4cHJlc3Npb25FcnJvcnMsIHNhd1VuYXJ5KTtcbiAgICB9XG5cbiAgICBwYXJzZUFycm93KFxuICAgICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgICk6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gaG93IHRoZSBUUyBwYXJzZXIgZG9lcyBpdC5cbiAgICAgICAgLy8gVFMgdXNlcyBsb29rYWhlYWQuIFRoZSBCYWJlbCBQYXJzZXIgcGFyc2VzIGl0IGFzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGFuZCBjb252ZXJ0cy5cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyeVBhcnNlKGFib3J0ID0+IHtcbiAgICAgICAgICBjb25zdCByZXR1cm5UeXBlID0gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24oXG4gICAgICAgICAgICB0dC5jb2xvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLm1hdGNoKHR0LmFycm93KSkgYWJvcnQoKTtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFyZXN1bHQudGhyb3duKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHJlc3VsdC5ub2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUFycm93KG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHR5cGUgYW5ub3RhdGlvbnMgaW5zaWRlIG9mIGEgcGFyYW1ldGVyIGxpc3QuXG4gICAgcGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyhcbiAgICAgIHBhcmFtOiBOLlBhdHRlcm4sXG4gICAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgICkge1xuICAgICAgaWYgKCEoZmxhZ3MgJiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuSVNfRlVOQ1RJT05fUEFSQU1TKSkgcmV0dXJuIHBhcmFtO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIChwYXJhbSBhcyBhbnkgYXMgTi5JZGVudGlmaWVyKS5vcHRpb25hbCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIGlmICh0eXBlKSBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHR5cGU7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24ocGFyYW0pO1xuXG4gICAgICByZXR1cm4gcGFyYW07XG4gICAgfVxuXG4gICAgaXNBc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNCaW5kaW5nPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbiwgaXNCaW5kaW5nKTtcbiAgICAgICAgY2FzZSBcIlRTUGFyYW1ldGVyUHJvcGVydHlcIjpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gc3VwZXIuaXNBc3NpZ25hYmxlKG5vZGUsIGlzQmluZGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9Bc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgdGhpcy50b0Fzc2lnbmFibGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihub2RlLCBpc0xIUyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgICAgICBjYXNlIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICAgICAgICBpZiAoaXNMSFMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFycm93UGFyYW1ldGVyQmluZGluZ0Vycm9yKFxuICAgICAgICAgICAgICBUU0Vycm9ycy5VbmV4cGVjdGVkVHlwZUNhc3RJblBhcmFtZXRlcixcbiAgICAgICAgICAgICAgeyBhdDogbm9kZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5VbmV4cGVjdGVkVHlwZUNhc3RJblBhcmFtZXRlciwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5leHByZXNzaW9uLCBpc0xIUyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGlmICghaXNMSFMgJiYgbm9kZS5sZWZ0LnR5cGUgPT09IFwiVFNUeXBlQ2FzdEV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgbm9kZS5sZWZ0ID0gdGhpcy50eXBlQ2FzdFRvUGFyYW1ldGVyKG5vZGUubGVmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHN3aXRjaCAobm9kZS5leHByZXNzaW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzTEhTKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlOiBOLk5vZGUsIGFsbG93UGF0dGVybjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICBjYXNlIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIHRoaXMuY2hlY2tUb1Jlc3RDb252ZXJzaW9uKG5vZGUuZXhwcmVzc2lvbiwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN1cGVyLmNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlLCBhbGxvd1BhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIG92ZXJyaWRlcyBpbnRlcmZhY2VzXG4gICAgaXNWYWxpZExWYWwoXG4gICAgICB0eXBlOlxuICAgICAgICB8IFwiVFNUeXBlQ2FzdEV4cHJlc3Npb25cIlxuICAgICAgICB8IFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiXG4gICAgICAgIHwgXCJUU05vbk51bGxFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIlRTQXNFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiXG4gICAgICAgIHwgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgIGlzVW5wYXJlbnRoZXNpemVkSW5Bc3NpZ246IGJvb2xlYW4sXG4gICAgICBiaW5kaW5nOiBCaW5kaW5nVHlwZXMsXG4gICAgKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBnZXRPd24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gQWxsb3cgXCJ0eXBlY2FzdHNcIiB0byBhcHBlYXIgb24gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBleHByZXNzaW9ucyxcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgbWF5IGJlIGluIGFuIGFycm93IGZ1bmN0aW9uLlxuICAgICAgICAgICAgLy8gZS5nLiBgY29uc3QgZiA9IChmb286IG51bWJlciA9IDApID0+IGZvbztgXG4gICAgICAgICAgICBUU1R5cGVDYXN0RXhwcmVzc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgIFRTUGFyYW1ldGVyUHJvcGVydHk6IFwicGFyYW1ldGVyXCIsXG4gICAgICAgICAgICBUU05vbk51bGxFeHByZXNzaW9uOiBcImV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFRTQXNFeHByZXNzaW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgICAgVFNTYXRpc2ZpZXNFeHByZXNzaW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgICAgVFNUeXBlQXNzZXJ0aW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgKSB8fCBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1VucGFyZW50aGVzaXplZEluQXNzaWduLCBiaW5kaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUJpbmRpbmdBdG9tKCk6IE4uUGF0dGVybiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS50eXBlID09PSB0dC5fdGhpcykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUlkZW50aWZpZXIoLyogbGliZXJhbCAqLyB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUJpbmRpbmdBdG9tKCk7XG4gICAgfVxuXG4gICAgcGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByOiBOLkV4cHJlc3Npb24pOiBOLkV4cHJlc3Npb24ge1xuICAgICAgLy8gaGFuZGxlcyBgQGY8PFQ+YFxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpIHx8IHRoaXMubWF0Y2godHQuYml0U2hpZnRMKSkge1xuICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gdGhpcy50c1BhcnNlVHlwZUFyZ3VtZW50c0luRXhwcmVzc2lvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICBjb25zdCBjYWxsID0gc3VwZXIucGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByKTtcbiAgICAgICAgICBjYWxsLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICByZXR1cm4gY2FsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5wYXJlbkwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByKTtcbiAgICB9XG5cbiAgICBjaGVja0NvbW1hQWZ0ZXJSZXN0KFxuICAgICAgY2xvc2U6ICh0eXBlb2YgY2hhckNvZGVzKVtrZXlvZiB0eXBlb2YgY2hhckNvZGVzXSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ICYmXG4gICAgICAgIHRoaXMubWF0Y2godHQuY29tbWEpICYmXG4gICAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2xvc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLmNoZWNrQ29tbWFBZnRlclJlc3QoY2xvc2UpO1xuICAgIH1cblxuICAgIC8vID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PVxuICAgIC8vIE5vdGU6IEFsbCBiZWxvdyBtZXRob2RzIGFyZSBkdXBsaWNhdGVzIG9mIHNvbWV0aGluZyBpbiBmbG93LmpzLlxuICAgIC8vIE5vdCBzdXJlIHdoYXQgdGhlIGJlc3Qgd2F5IHRvIGNvbWJpbmUgdGhlc2UgaXMuXG4gICAgLy8gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09XG5cbiAgICBpc0NsYXNzTWV0aG9kKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQubHQpIHx8IHN1cGVyLmlzQ2xhc3NNZXRob2QoKTtcbiAgICB9XG5cbiAgICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm1hdGNoKHR0LmJhbmcpIHx8IHRoaXMubWF0Y2godHQuY29sb24pIHx8IHN1cGVyLmlzQ2xhc3NQcm9wZXJ0eSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlTWF5YmVEZWZhdWx0KFxuICAgICAgc3RhcnRMb2M/OiBQb3NpdGlvbiB8IG51bGwsXG4gICAgICBsZWZ0PzogUGF0dGVybiB8IG51bGwsXG4gICAgKTogTi5QYXR0ZXJuIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdXBlci5wYXJzZU1heWJlRGVmYXVsdChzdGFydExvYywgbGVmdCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgJiZcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiAmJlxuICAgICAgICBub2RlLnJpZ2h0LnN0YXJ0IDwgbm9kZS50eXBlQW5ub3RhdGlvbi5zdGFydFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuVHlwZUFubm90YXRpb25BZnRlckFzc2lnbiwge1xuICAgICAgICAgIGF0OiBub2RlLnR5cGVBbm5vdGF0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgaW5zaWRlIHR5cGVzLCB3ZSBieXBhc3MgdGhlIGpzeCBwYXJzZXIgcGx1Z2luXG4gICAgZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluVHlwZSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuKSB7XG4gICAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5ndCwgMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSBjaGFyQ29kZXMubGVzc1RoYW4pIHtcbiAgICAgICAgICB0aGlzLmZpbmlzaE9wKHR0Lmx0LCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY29kZSk7XG4gICAgfVxuXG4gICAgLy8gdXNlZCBhZnRlciB3ZSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgdHlwZXNcbiAgICByZVNjYW5fbHRfZ3QoKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodHlwZSA9PT0gdHQubHQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgLT0gMTtcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fbHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQuZ3QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgLT0gMTtcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fZ3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZVNjYW5fbHQoKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodHlwZSA9PT0gdHQuYml0U2hpZnRMKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zIC09IDI7XG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQubHQsIDEpO1xuICAgICAgICByZXR1cm4gdHQubHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB0b0Fzc2lnbmFibGVMaXN0KFxuICAgICAgZXhwckxpc3Q6IEV4cHJlc3Npb25bXSxcbiAgICAgIHRyYWlsaW5nQ29tbWFMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzTEhTOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBleHByID0gZXhwckxpc3RbaV07XG4gICAgICAgIGlmIChleHByPy50eXBlID09PSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBleHByTGlzdFtpXSA9IHRoaXMudHlwZUNhc3RUb1BhcmFtZXRlcihcbiAgICAgICAgICAgIGV4cHIgYXMgTi5Uc1R5cGVDYXN0RXhwcmVzc2lvbixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdXBlci50b0Fzc2lnbmFibGVMaXN0KGV4cHJMaXN0LCB0cmFpbGluZ0NvbW1hTG9jLCBpc0xIUyk7XG4gICAgfVxuXG4gICAgdHlwZUNhc3RUb1BhcmFtZXRlcihub2RlOiBOLlRzVHlwZUNhc3RFeHByZXNzaW9uKTogTi5Ob2RlIHtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbi50eXBlQW5ub3RhdGlvbiA9IG5vZGUudHlwZUFubm90YXRpb247XG5cbiAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihub2RlLmV4cHJlc3Npb24sIG5vZGUudHlwZUFubm90YXRpb24ubG9jLmVuZCk7XG5cbiAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VBcnJvdyhwYXJhbXM6IEFycmF5PE4uTm9kZT4pIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1zLmV2ZXJ5KGV4cHIgPT4gdGhpcy5pc0Fzc2lnbmFibGUoZXhwciwgdHJ1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZFBhcnNlQXJyb3cocGFyYW1zKTtcbiAgICB9XG5cbiAgICBzaG91bGRQYXJzZUFzeW5jQXJyb3coKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuc2hvdWxkUGFyc2VBc3luY0Fycm93KCk7XG4gICAgfVxuXG4gICAgY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKSB7XG4gICAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBsb29rYWhlYWQgaW4gY2hlY2tpbmcgZm9yIGFic3RyYWN0IGNsYXNzIHVubGVzcyBuZWVkZWQhXG4gICAgICByZXR1cm4gc3VwZXIuY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKSB8fCB0aGlzLmlzQWJzdHJhY3RDbGFzcygpO1xuICAgIH1cblxuICAgIGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgICBub2RlOiBOLkpTWE9wZW5pbmdFbGVtZW50LFxuICAgICk6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgLy8gaGFuZGxlcyBgPENvbXBvbmVudDw8VD5gXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5iaXRTaGlmdEwpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSB0aGlzLnRzVHJ5UGFyc2VBbmRDYXRjaCgoKSA9PlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgdGhpcy50c1BhcnNlVHlwZUFyZ3VtZW50c0luRXhwcmVzc2lvbigpLFxuICAgICAgICApO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBpZiAodHlwZUFyZ3VtZW50cykgbm9kZS50eXBlUGFyYW1ldGVycyA9IHR5cGVBcmd1bWVudHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuanN4UGFyc2VPcGVuaW5nRWxlbWVudEFmdGVyTmFtZShub2RlKTtcbiAgICB9XG5cbiAgICBnZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQoXG4gICAgICBtZXRob2Q6IE4uT2JqZWN0TWV0aG9kIHwgTi5DbGFzc01ldGhvZCxcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgYmFzZUNvdW50ID0gc3VwZXIuZ2V0R2V0dGVyU2V0dGVyRXhwZWN0ZWRQYXJhbUNvdW50KG1ldGhvZCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcbiAgICAgIGNvbnN0IGZpcnN0UGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICBjb25zdCBoYXNDb250ZXh0UGFyYW0gPSBmaXJzdFBhcmFtICYmIHRoaXMuaXNUaGlzUGFyYW0oZmlyc3RQYXJhbSk7XG5cbiAgICAgIHJldHVybiBoYXNDb250ZXh0UGFyYW0gPyBiYXNlQ291bnQgKyAxIDogYmFzZUNvdW50O1xuICAgIH1cblxuICAgIHBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSgpOiBOLlBhdHRlcm4ge1xuICAgICAgY29uc3QgcGFyYW0gPSBzdXBlci5wYXJzZUNhdGNoQ2xhdXNlUGFyYW0oKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuXG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG5cbiAgICB0c0luQW1iaWVudENvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZElzQW1iaWVudENvbnRleHQgPSB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQ7XG4gICAgICB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQgPSBvbGRJc0FtYmllbnRDb250ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlQ2xhc3M8VCBleHRlbmRzIE4uQ2xhc3M+KFxuICAgICAgbm9kZTogVW5kb25lPFQ+LFxuICAgICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgICBvcHRpb25hbElkPzogYm9vbGVhbixcbiAgICApOiBUIHtcbiAgICAgIGNvbnN0IG9sZEluQWJzdHJhY3RDbGFzcyA9IHRoaXMuc3RhdGUuaW5BYnN0cmFjdENsYXNzO1xuICAgICAgdGhpcy5zdGF0ZS5pbkFic3RyYWN0Q2xhc3MgPSAhIShub2RlIGFzIGFueSkuYWJzdHJhY3Q7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3VwZXIucGFyc2VDbGFzcyhub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmluQWJzdHJhY3RDbGFzcyA9IG9sZEluQWJzdHJhY3RDbGFzcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlQWJzdHJhY3REZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IGFueSxcbiAgICAgIGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsLFxuICAgICk6IE4uQ2xhc3NEZWNsYXJhdGlvbiB8IE4uVHNJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgICBub2RlLmFic3RyYWN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF5YmVUYWtlRGVjb3JhdG9ycyhcbiAgICAgICAgICBkZWNvcmF0b3JzLFxuICAgICAgICAgIHRoaXMucGFyc2VDbGFzczxOLkNsYXNzRGVjbGFyYXRpb24+KFxuICAgICAgICAgICAgbm9kZSBhcyBOLkNsYXNzRGVjbGFyYXRpb24sXG4gICAgICAgICAgICAvKiBpc1N0YXRlbWVudCAqLyB0cnVlLFxuICAgICAgICAgICAgLyogb3B0aW9uYWxJZCAqLyBmYWxzZSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSkge1xuICAgICAgICAvLyBmb3IgaW52YWxpZCBhYnN0cmFjdCBpbnRlcmZhY2VcblxuICAgICAgICAvLyBUbyBhdm9pZFxuICAgICAgICAvLyAgIGFic3RyYWN0IGludGVyZmFjZVxuICAgICAgICAvLyAgIEZvbyB7fVxuICAgICAgICBpZiAoIXRoaXMuaGFzRm9sbG93aW5nTGluZUJyZWFrKCkpIHtcbiAgICAgICAgICBub2RlLmFic3RyYWN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLk5vbkNsYXNzTWV0aG9kUHJvcGVydHlIYXNBYnN0cmFjdE1vZGlmZXIsIHtcbiAgICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIG5vZGUgYXMgTi5Uc0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5fY2xhc3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlTWV0aG9kPFxuICAgICAgVCBleHRlbmRzIE4uT2JqZWN0TWV0aG9kIHwgTi5DbGFzc01ldGhvZCB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgID4oXG4gICAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgaW5DbGFzc1Njb3BlPzogYm9vbGVhbixcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1cGVyLnBhcnNlTWV0aG9kPFQ+KFxuICAgICAgICBub2RlLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dEaXJlY3RTdXBlcixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaW5DbGFzc1Njb3BlLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgcHJvcGVydHkgbm90IGRlZmluZWQgZm9yIGFsbCB0eXBlcyBpbiB1bmlvblxuICAgICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgICBjb25zdCBoYXNCb2R5ID0gdGhpcy5oYXNQbHVnaW4oXCJlc3RyZWVcIilcbiAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0cmVlIHR5cGluZ3NcbiAgICAgICAgICAgICEhbWV0aG9kLnZhbHVlLmJvZHlcbiAgICAgICAgICA6ICEhbWV0aG9kLmJvZHk7XG4gICAgICAgIGlmIChoYXNCb2R5KSB7XG4gICAgICAgICAgY29uc3QgeyBrZXkgfSA9IG1ldGhvZDtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFic3RyYWN0TWV0aG9kSGFzSW1wbGVtZW50YXRpb24sIHtcbiAgICAgICAgICAgIGF0OiBtZXRob2QsXG4gICAgICAgICAgICBtZXRob2ROYW1lOlxuICAgICAgICAgICAgICBrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgIW1ldGhvZC5jb21wdXRlZFxuICAgICAgICAgICAgICAgID8ga2V5Lm5hbWVcbiAgICAgICAgICAgICAgICA6IGBbJHt0aGlzLmlucHV0LnNsaWNlKGtleS5zdGFydCwga2V5LmVuZCl9XWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQYXJhbWV0ZXJOYW1lKCk6IE4uSWRlbnRpZmllciB8IHN0cmluZyB7XG4gICAgICBjb25zdCB0eXBlTmFtZTogTi5JZGVudGlmaWVyID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gdHlwZU5hbWUgOiB0eXBlTmFtZS5uYW1lO1xuICAgIH1cblxuICAgIHNob3VsZFBhcnNlQXNBbWJpZW50Q29udGV4dCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwidHlwZXNjcmlwdFwiLCBcImR0c1wiKTtcbiAgICB9XG5cbiAgICBwYXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFBhcnNlQXNBbWJpZW50Q29udGV4dCgpKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuaXNBbWJpZW50Q29udGV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2UoKTtcbiAgICB9XG5cbiAgICBnZXRFeHByZXNzaW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkUGFyc2VBc0FtYmllbnRDb250ZXh0KCkpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5nZXRFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnRTcGVjaWZpZXIoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5FeHBvcnRTcGVjaWZpZXI+LFxuICAgICAgaXNTdHJpbmc6IGJvb2xlYW4sXG4gICAgICBpc0luVHlwZUV4cG9ydDogYm9vbGVhbixcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICApIHtcbiAgICAgIGlmICghaXNTdHJpbmcgJiYgaXNNYXliZVR5cGVPbmx5KSB7XG4gICAgICAgIHRoaXMucGFyc2VUeXBlT25seUltcG9ydEV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIC8qIGlzSW1wb3J0ICovIGZhbHNlLFxuICAgICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlPE4uRXhwb3J0U3BlY2lmaWVyPihub2RlLCBcIkV4cG9ydFNwZWNpZmllclwiKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidmFsdWVcIjtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaXNTdHJpbmcsXG4gICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgc3BlY2lmaWVyOiBVbmRvbmU8Ti5JbXBvcnRTcGVjaWZpZXI+LFxuICAgICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgfCB1bmRlZmluZWQsXG4gICAgKTogTi5JbXBvcnRTcGVjaWZpZXIge1xuICAgICAgaWYgKCFpbXBvcnRlZElzU3RyaW5nICYmIGlzTWF5YmVUeXBlT25seSkge1xuICAgICAgICB0aGlzLnBhcnNlVHlwZU9ubHlJbXBvcnRFeHBvcnRTcGVjaWZpZXIoXG4gICAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgICAgIC8qIGlzSW1wb3J0ICovIHRydWUsXG4gICAgICAgICAgaXNJblR5cGVPbmx5SW1wb3J0LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlPE4uSW1wb3J0U3BlY2lmaWVyPihzcGVjaWZpZXIsIFwiSW1wb3J0U3BlY2lmaWVyXCIpO1xuICAgICAgfVxuICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VJbXBvcnRTcGVjaWZpZXIoXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgaW1wb3J0ZWRJc1N0cmluZyxcbiAgICAgICAgaXNJblR5cGVPbmx5SW1wb3J0LFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICAgIGlzSW5UeXBlT25seUltcG9ydCA/IEJJTkRfVFNfVFlQRV9JTVBPUlQgOiBCSU5EX0ZMQUdTX1RTX0lNUE9SVCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VUeXBlT25seUltcG9ydEV4cG9ydFNwZWNpZmllcihcbiAgICAgIG5vZGU6IGFueSxcbiAgICAgIGlzSW1wb3J0OiBib29sZWFuLFxuICAgICAgaXNJblR5cGVPbmx5SW1wb3J0RXhwb3J0OiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgbGVmdE9mQXNLZXkgPSBpc0ltcG9ydCA/IFwiaW1wb3J0ZWRcIiA6IFwibG9jYWxcIjtcbiAgICAgIGNvbnN0IHJpZ2h0T2ZBc0tleSA9IGlzSW1wb3J0ID8gXCJsb2NhbFwiIDogXCJleHBvcnRlZFwiO1xuXG4gICAgICBsZXQgbGVmdE9mQXMgPSBub2RlW2xlZnRPZkFzS2V5XTtcbiAgICAgIGxldCByaWdodE9mQXM7XG5cbiAgICAgIGxldCBoYXNUeXBlU3BlY2lmaWVyID0gZmFsc2U7XG4gICAgICBsZXQgY2FuUGFyc2VBc0tleXdvcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBsb2MgPSBsZWZ0T2ZBcy5sb2Muc3RhcnQ7XG5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL2ZjNGY5ZDgzZDU5MzkwNDdhYTZiYjJhNDM5NjVjNmU5YmJmYmMzNWIvc3JjL2NvbXBpbGVyL3BhcnNlci50cyNMNzQxMS1MNzQ1NlxuICAgICAgLy8gaW1wb3J0IHsgdHlwZSB9IGZyb20gXCJtb2RcIjsgICAgICAgICAgLSBoYXNUeXBlU3BlY2lmaWVyOiBmYWxzZSwgbGVmdE9mQXM6IHR5cGVcbiAgICAgIC8vIGltcG9ydCB7IHR5cGUgYXMgfSBmcm9tIFwibW9kXCI7ICAgICAgIC0gaGFzVHlwZVNwZWNpZmllcjogdHJ1ZSwgIGxlZnRPZkFzOiBhc1xuICAgICAgLy8gaW1wb3J0IHsgdHlwZSBhcyBhcyB9IGZyb20gXCJtb2RcIjsgICAgLSBoYXNUeXBlU3BlY2lmaWVyOiBmYWxzZSwgbGVmdE9mQXM6IHR5cGUsIHJpZ2h0T2ZBczogYXNcbiAgICAgIC8vIGltcG9ydCB7IHR5cGUgYXMgYXMgYXMgfSBmcm9tIFwibW9kXCI7IC0gaGFzVHlwZVNwZWNpZmllcjogdHJ1ZSwgIGxlZnRPZkFzOiBhcywgICByaWdodE9mQXM6IGFzXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICAvLyB7IHR5cGUgYXMgLi4uPyB9XG4gICAgICAgIGNvbnN0IGZpcnN0QXMgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyBhcyAuLi4/IH1cbiAgICAgICAgICBjb25zdCBzZWNvbmRBcyA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgICAgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIC8vIHsgdHlwZSBhcyBhcyBzb21ldGhpbmcgfVxuICAgICAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgICAgICBsZWZ0T2ZBcyA9IGZpcnN0QXM7XG4gICAgICAgICAgICByaWdodE9mQXMgPSBpc0ltcG9ydFxuICAgICAgICAgICAgICA/IHRoaXMucGFyc2VJZGVudGlmaWVyKClcbiAgICAgICAgICAgICAgOiB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgICAgICAgY2FuUGFyc2VBc0tleXdvcmQgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8geyB0eXBlIGFzIGFzIH1cbiAgICAgICAgICAgIHJpZ2h0T2ZBcyA9IHNlY29uZEFzO1xuICAgICAgICAgICAgY2FuUGFyc2VBc0tleXdvcmQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW5Jc0tleXdvcmRPcklkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyBzb21ldGhpbmcgfVxuICAgICAgICAgIGNhblBhcnNlQXNLZXl3b3JkID0gZmFsc2U7XG4gICAgICAgICAgcmlnaHRPZkFzID0gaXNJbXBvcnRcbiAgICAgICAgICAgID8gdGhpcy5wYXJzZUlkZW50aWZpZXIoKVxuICAgICAgICAgICAgOiB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyB9XG4gICAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgICAgbGVmdE9mQXMgPSBmaXJzdEFzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgLy8geyB0eXBlIHNvbWV0aGluZyAuLi4/IH1cbiAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgIGlmIChpc0ltcG9ydCkge1xuICAgICAgICAgIGxlZnRPZkFzID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgICAgICAgICAgICBsZWZ0T2ZBcy5uYW1lLFxuICAgICAgICAgICAgICBsZWZ0T2ZBcy5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWZ0T2ZBcyA9IHRoaXMucGFyc2VNb2R1bGVFeHBvcnROYW1lKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNUeXBlU3BlY2lmaWVyICYmIGlzSW5UeXBlT25seUltcG9ydEV4cG9ydCkge1xuICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgIGlzSW1wb3J0XG4gICAgICAgICAgICA/IFRTRXJyb3JzLlR5cGVNb2RpZmllcklzVXNlZEluVHlwZUltcG9ydHNcbiAgICAgICAgICAgIDogVFNFcnJvcnMuVHlwZU1vZGlmaWVySXNVc2VkSW5UeXBlRXhwb3J0cyxcbiAgICAgICAgICB7IGF0OiBsb2MgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbm9kZVtsZWZ0T2ZBc0tleV0gPSBsZWZ0T2ZBcztcbiAgICAgIG5vZGVbcmlnaHRPZkFzS2V5XSA9IHJpZ2h0T2ZBcztcblxuICAgICAgY29uc3Qga2luZEtleSA9IGlzSW1wb3J0ID8gXCJpbXBvcnRLaW5kXCIgOiBcImV4cG9ydEtpbmRcIjtcbiAgICAgIG5vZGVba2luZEtleV0gPSBoYXNUeXBlU3BlY2lmaWVyID8gXCJ0eXBlXCIgOiBcInZhbHVlXCI7XG5cbiAgICAgIGlmIChjYW5QYXJzZUFzS2V5d29yZCAmJiB0aGlzLmVhdENvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICBub2RlW3JpZ2h0T2ZBc0tleV0gPSBpc0ltcG9ydFxuICAgICAgICAgID8gdGhpcy5wYXJzZUlkZW50aWZpZXIoKVxuICAgICAgICAgIDogdGhpcy5wYXJzZU1vZHVsZUV4cG9ydE5hbWUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghbm9kZVtyaWdodE9mQXNLZXldKSB7XG4gICAgICAgIG5vZGVbcmlnaHRPZkFzS2V5XSA9IGNsb25lSWRlbnRpZmllcihub2RlW2xlZnRPZkFzS2V5XSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNJbXBvcnQpIHtcbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIoXG4gICAgICAgICAgbm9kZVtyaWdodE9mQXNLZXldLFxuICAgICAgICAgIGhhc1R5cGVTcGVjaWZpZXIgPyBCSU5EX1RTX1RZUEVfSU1QT1JUIDogQklORF9GTEFHU19UU19JTVBPUlQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG5mdW5jdGlvbiBpc1Bvc3NpYmx5TGl0ZXJhbEVudW0oZXhwcmVzc2lvbjogTi5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgIT09IFwiTWVtYmVyRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgeyBjb21wdXRlZCwgcHJvcGVydHkgfSA9IGV4cHJlc3Npb247XG5cbiAgaWYgKFxuICAgIGNvbXB1dGVkICYmXG4gICAgcHJvcGVydHkudHlwZSAhPT0gXCJTdHJpbmdMaXRlcmFsXCIgJiZcbiAgICAocHJvcGVydHkudHlwZSAhPT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiB8fCBwcm9wZXJ0eS5leHByZXNzaW9ucy5sZW5ndGggPiAwKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNVbmNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbkNoYWluKGV4cHJlc3Npb24ub2JqZWN0KTtcbn1cblxuLy8gSWYgYSBjb25zdCBkZWNsYXJhdGlvbiBoYXMgbm8gdHlwZSBhbm5vdGF0aW9uIGFuZCBpcyBpbml0aWFsaXplZCB0b1xuLy8gYSBzdHJpbmcgbGl0ZXJhbCwgbnVtZXJpYyBsaXRlcmFsLCBvciBlbnVtIHJlZmVyZW5jZSwgdGhlbiBpdCBpc1xuLy8gYWxsb3dlZC4gSW4gYW4gaWRlYWwgd29ybGQsIHdlJ2QgY2hlY2sgd2hldGhlciBpbml0IHdhcyAqYWN0dWFsbHkqIGFuXG4vLyBlbnVtIHJlZmVyZW5jZSwgYnV0IHdlIGFsbG93IGFueXRoaW5nIHRoYXQgXCJjb3VsZCBiZVwiIGEgbGl0ZXJhbCBlbnVtXG4vLyBpbiBgaXNQb3NzaWJseUxpdGVyYWxFbnVtYCBzaW5jZSB3ZSBkb24ndCBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb25cbi8vIHRoYXQgdGhlIHR5cGVzY3JpcHQgY29tcGlsZXIgaGFzLlxuZnVuY3Rpb24gaXNWYWxpZEFtYmllbnRDb25zdEluaXRpYWxpemVyKFxuICBleHByZXNzaW9uOiBOLkV4cHJlc3Npb24sXG4gIGVzdHJlZTogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHR5cGUgfSA9IGV4cHJlc3Npb247XG4gIGlmIChleHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChlc3RyZWUpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJMaXRlcmFsXCIpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGV4cHJlc3Npb247XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlID09PSBcIlN0cmluZ0xpdGVyYWxcIiB8fCB0eXBlID09PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOdW1iZXIoZXhwcmVzc2lvbiwgZXN0cmVlKSB8fCBpc05lZ2F0aXZlTnVtYmVyKGV4cHJlc3Npb24sIGVzdHJlZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiAmJiBleHByZXNzaW9uLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc1Bvc3NpYmx5TGl0ZXJhbEVudW0oZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbiwgZXN0cmVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGlmIChlc3RyZWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgKHR5cGVvZiBleHByZXNzaW9uLnZhbHVlID09PSBcIm51bWJlclwiIHx8IFwiYmlnaW50XCIgaW4gZXhwcmVzc2lvbilcbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgZXhwcmVzc2lvbi50eXBlID09PSBcIk51bWVyaWNMaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi50eXBlID09PSBcIkJpZ0ludExpdGVyYWxcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlTnVtYmVyKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbiwgZXN0cmVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCB7IG9wZXJhdG9yLCBhcmd1bWVudCB9ID0gZXhwcmVzc2lvbiBhcyBOLlVuYXJ5RXhwcmVzc2lvbjtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiLVwiICYmIGlzTnVtYmVyKGFyZ3VtZW50LCBlc3RyZWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1VuY29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uQ2hhaW4oZXhwcmVzc2lvbjogTi5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5jb21wdXRlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc1VuY29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uQ2hhaW4oZXhwcmVzc2lvbi5vYmplY3QpO1xufVxuIiwgImltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5cbmltcG9ydCB7IHRva2VuTGFiZWxOYW1lLCB0dCB9IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi4vcGFyc2VyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vcGFyc2VyL25vZGVcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVHlwZXMgfSBmcm9tIFwiLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcblxudHlwZSBQb3NzaWJsZVBsYWNlaG9sZGVycyA9IHtcbiAgSWRlbnRpZmllcjogTi5JZGVudGlmaWVyO1xuICBTdHJpbmdMaXRlcmFsOiBOLlN0cmluZ0xpdGVyYWw7XG4gIEV4cHJlc3Npb246IE4uRXhwcmVzc2lvbjtcbiAgU3RhdGVtZW50OiBOLlN0YXRlbWVudDtcbiAgRGVjbGFyYXRpb246IE4uRGVjbGFyYXRpb247XG4gIEJsb2NrU3RhdGVtZW50OiBOLkJsb2NrU3RhdGVtZW50O1xuICBDbGFzc0JvZHk6IE4uQ2xhc3NCb2R5O1xuICBQYXR0ZXJuOiBOLlBhdHRlcm47XG59O1xuZXhwb3J0IHR5cGUgUGxhY2Vob2xkZXJUeXBlcyA9IGtleW9mIFBvc3NpYmxlUGxhY2Vob2xkZXJzO1xuXG50eXBlIE5vZGVPZjxUIGV4dGVuZHMga2V5b2YgUG9zc2libGVQbGFjZWhvbGRlcnM+ID0gUG9zc2libGVQbGFjZWhvbGRlcnNbVF07XG4vLyB0b2RvOiB3aGVuIHRoZXJlICBpcyBwcm9wZXIgdW5pb24gdHlwZSBmb3IgTm9kZVxuLy8gdHlwZSBOb2RlT2Y8VCBleHRlbmRzIFBsYWNlaG9sZGVyVHlwZXM+ID0gRXh0cmFjdDxOLk5vZGUsIHsgdHlwZTogVCB9PjtcblxuLy8gdG9kbzogUGxhY2Vob2xkZXI8VD4gYnJlYWtzIGV2ZXJ5dGhpbmcsIGJlY2F1c2UgaXRzIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGhcbi8vIHRoZSBzdWJzdGl0dXRlZCBub2Rlcy5cbnR5cGUgTWF5YmVQbGFjZWhvbGRlcjxUIGV4dGVuZHMgUGxhY2Vob2xkZXJUeXBlcz4gPSBOb2RlT2Y8VD47IC8vIHwgUGxhY2Vob2xkZXI8VD5cblxuLyogZXNsaW50IHNvcnQta2V5czogXCJlcnJvclwiICovXG5jb25zdCBQbGFjZWhvbGRlckVycm9ycyA9IFBhcnNlRXJyb3JFbnVtYHBsYWNlaG9sZGVyc2Aoe1xuICBDbGFzc05hbWVJc1JlcXVpcmVkOiBcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZC5cIixcbiAgVW5leHBlY3RlZFNwYWNlOiBcIlVuZXhwZWN0ZWQgc3BhY2UgaW4gcGxhY2Vob2xkZXIuXCIsXG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgc29ydC1rZXlzICovXG5cbmV4cG9ydCBkZWZhdWx0IChzdXBlckNsYXNzOiB0eXBlb2YgUGFyc2VyKSA9PlxuICBjbGFzcyBQbGFjZWhvbGRlcnNQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIHBhcnNlUGxhY2Vob2xkZXI8VCBleHRlbmRzIFBsYWNlaG9sZGVyVHlwZXM+KFxuICAgICAgZXhwZWN0ZWROb2RlOiBULFxuICAgICk6IC8qP04uUGxhY2Vob2xkZXI8VD4qLyBNYXliZVBsYWNlaG9sZGVyPFQ+IHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmFzc2VydE5vU3BhY2UoKTtcblxuICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhpcy5wYXJzZUlkZW50aWZpZXIgYmVjYXVzZVxuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IG5lc3RlZCBwbGFjZWhvbGRlcnMuXG4gICAgICAgIG5vZGUubmFtZSA9IHN1cGVyLnBhcnNlSWRlbnRpZmllcigvKiBsaWJlcmFsICovIHRydWUpO1xuXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm9TcGFjZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wbGFjZWhvbGRlcik7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGxhY2Vob2xkZXIgdHlwaW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hQbGFjZWhvbGRlcihub2RlLCBleHBlY3RlZE5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaFBsYWNlaG9sZGVyPFQgZXh0ZW5kcyBQbGFjZWhvbGRlclR5cGVzPihcbiAgICAgIG5vZGU6IE4uTm9kZSxcbiAgICAgIGV4cGVjdGVkTm9kZTogVCxcbiAgICApOiAvKk4uUGxhY2Vob2xkZXI8VD4qLyBNYXliZVBsYWNlaG9sZGVyPFQ+IHtcbiAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSAhIShub2RlLmV4cGVjdGVkTm9kZSAmJiBub2RlLnR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIik7XG4gICAgICBub2RlLmV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZTtcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgcmV0dXJuIGlzRmluaXNoZWQgPyBub2RlIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUGxhY2Vob2xkZXJcIik7XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiB0b2tlbml6ZXIvaW5kZXguanMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLnBlcmNlbnRTaWduICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMucGVyY2VudFNpZ25cbiAgICAgICkge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LnBsYWNlaG9sZGVyLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY29kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvZXhwcmVzc2lvbi5qcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgcGFyc2VFeHByQXRvbShcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiRXhwcmVzc2lvblwiPiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJFeHByZXNzaW9uXCIpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlRXhwckF0b20ocmVmRXhwcmVzc2lvbkVycm9ycylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VJZGVudGlmaWVyKGxpYmVyYWw/OiBib29sZWFuKTogTWF5YmVQbGFjZWhvbGRlcjxcIklkZW50aWZpZXJcIj4ge1xuICAgICAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGhhbmRsZXMgaWRlbnRpZmllcnMgb3V0c2lkZSBvZlxuICAgICAgLy8gZXhwcmVzc2lvbnMgYW5kIGJpbmRpbmcgcGF0dGVybnMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHlcbiAgICAgIC8vIGhhbmRsZWQgYnkgdGhlIHBhcnNlRXhwckF0b20gYW5kIHBhcnNlQmluZGluZ0F0b20gZnVuY3Rpb25zLlxuICAgICAgLy8gVGhpcyBpcyBuZWVkZWQsIGZvciBleGFtcGxlLCB0byBwYXJzZSBcImNsYXNzICUlTkFNRSUlIHt9XCIuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpIHx8IHN1cGVyLnBhcnNlSWRlbnRpZmllcihsaWJlcmFsKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjaGVja1Jlc2VydmVkV29yZChcbiAgICAgIHdvcmQ6IHN0cmluZyxcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIGNoZWNrS2V5d29yZHM6IGJvb2xlYW4sXG4gICAgICBpc0JpbmRpbmc6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICAvLyBTb21ldGltZXMgd2UgY2FsbCAjY2hlY2tSZXNlcnZlZFdvcmQobm9kZS5uYW1lKSwgZXhwZWN0aW5nXG4gICAgICAvLyB0aGF0IG5vZGUgaXMgYW4gSWRlbnRpZmllci4gSWYgaXQgaXMgYSBQbGFjZWhvbGRlciwgbmFtZVxuICAgICAgLy8gd2lsbCBiZSB1bmRlZmluZWQuXG4gICAgICBpZiAod29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrUmVzZXJ2ZWRXb3JkKHdvcmQsIHN0YXJ0TG9jLCBjaGVja0tleXdvcmRzLCBpc0JpbmRpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqXG4gICAgICogcGFyc2VyL2x2YWwuanMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAgIHBhcnNlQmluZGluZ0F0b20oKTogTWF5YmVQbGFjZWhvbGRlcjxcIlBhdHRlcm5cIj4ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIlBhdHRlcm5cIikgfHwgc3VwZXIucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIH1cblxuICAgIGlzVmFsaWRMVmFsKHR5cGU6IHN0cmluZywgaXNQYXJlbnRoZXNpemVkOiBib29sZWFuLCBiaW5kaW5nOiBCaW5kaW5nVHlwZXMpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIiB8fFxuICAgICAgICBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1BhcmVudGhlc2l6ZWQsIGJpbmRpbmcpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZShub2RlOiBOLk5vZGUsIGlzTEhTOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS50eXBlID09PSBcIlBsYWNlaG9sZGVyXCIgJiZcbiAgICAgICAgbm9kZS5leHBlY3RlZE5vZGUgPT09IFwiRXhwcmVzc2lvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5leHBlY3RlZE5vZGUgPSBcIlBhdHRlcm5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnRvQXNzaWduYWJsZShub2RlLCBpc0xIUyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvc3RhdGVtZW50LmpzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihjaDogbnVtYmVyLCBwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgaWYgKHN1cGVyLmNoU3RhcnRzQmluZGluZ0lkZW50aWZpZXIoY2gsIHBvcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFjY2VwdCBcImxldCAlJVwiIGFzIHRoZSBzdGFydCBvZiBcImxldCAlJXBsYWNlaG9sZGVyJSVcIiwgYXMgdGhvdWdoIHRoZVxuICAgICAgLy8gcGxhY2Vob2xkZXIgd2VyZSBhbiBpZGVudGlmaWVyLlxuICAgICAgY29uc3QgbmV4dFRva2VuID0gdGhpcy5sb29rYWhlYWQoKTtcbiAgICAgIGlmIChuZXh0VG9rZW4udHlwZSA9PT0gdHQucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlCcmVha0NvbnRpbnVlKFxuICAgICAgbm9kZTogTi5CcmVha1N0YXRlbWVudCB8IE4uQ29udGludWVTdGF0ZW1lbnQsXG4gICAgICBpc0JyZWFrOiBib29sZWFuLFxuICAgICkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogbm9kZS5sYWJlbCBjb3VsZCBiZSBQbGFjZWhvbGRlclxuICAgICAgaWYgKG5vZGUubGFiZWwgJiYgbm9kZS5sYWJlbC50eXBlID09PSBcIlBsYWNlaG9sZGVyXCIpIHJldHVybjtcbiAgICAgIHN1cGVyLnZlcmlmeUJyZWFrQ29udGludWUobm9kZSwgaXNCcmVhayk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBQbHVnaW4gd2lsbCBvdmVycmlkZSBwYXJzZXIgaW50ZXJmYWNlXG4gICAgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogTWF5YmVQbGFjZWhvbGRlcjxcIlN0YXRlbWVudFwiPixcbiAgICAgIGV4cHI6IE4uRXhwcmVzc2lvbixcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiU3RhdGVtZW50XCI+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXhwci50eXBlICE9PSBcIlBsYWNlaG9sZGVyXCIgfHxcbiAgICAgICAgKGV4cHIuZXh0cmEgJiYgZXhwci5leHRyYS5wYXJlbnRoZXNpemVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGxhY2Vob2xkZXIgdHlwaW5nc1xuICAgICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIGV4cHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwbGFjZWhvbGRlciB0eXBpbmdzXG4gICAgICAgIGNvbnN0IHN0bXQ6IE4uTGFiZWxlZFN0YXRlbWVudCA9IG5vZGU7XG4gICAgICAgIHN0bXQubGFiZWwgPSB0aGlzLmZpbmlzaFBsYWNlaG9sZGVyKGV4cHIsIFwiSWRlbnRpZmllclwiKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHN0bXQuYm9keSA9IHN1cGVyLnBhcnNlU3RhdGVtZW50T3JTbG9wcHlBbm5leEJGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoc3RtdCwgXCJMYWJlbGVkU3RhdGVtZW50XCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgbm9kZS5uYW1lID0gZXhwci5uYW1lO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoUGxhY2Vob2xkZXIobm9kZSwgXCJTdGF0ZW1lbnRcIik7XG4gICAgfVxuXG4gICAgcGFyc2VCbG9jayhcbiAgICAgIGFsbG93RGlyZWN0aXZlcz86IGJvb2xlYW4sXG4gICAgICBjcmVhdGVOZXdMZXhpY2FsU2NvcGU/OiBib29sZWFuLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlPzogKGhhc1N0cmljdE1vZGVEaXJlY3RpdmU6IGJvb2xlYW4pID0+IHZvaWQsXG4gICAgKTogTWF5YmVQbGFjZWhvbGRlcjxcIkJsb2NrU3RhdGVtZW50XCI+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkJsb2NrU3RhdGVtZW50XCIpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlQmxvY2soXG4gICAgICAgICAgYWxsb3dEaXJlY3RpdmVzLFxuICAgICAgICAgIGNyZWF0ZU5ld0xleGljYWxTY29wZSxcbiAgICAgICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VGdW5jdGlvbklkKFxuICAgICAgcmVxdWlyZUlkPzogYm9vbGVhbixcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiSWRlbnRpZmllclwiPiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKSB8fCBzdXBlci5wYXJzZUZ1bmN0aW9uSWQocmVxdWlyZUlkKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBQbHVnaW4gd2lsbCBvdmVycmlkZSBwYXJzZXIgaW50ZXJmYWNlXG4gICAgcGFyc2VDbGFzczxUIGV4dGVuZHMgTi5DbGFzcz4oXG4gICAgICBub2RlOiBULFxuICAgICAgaXNTdGF0ZW1lbnQ6IC8qIFQgPT09IENsYXNzRGVjbGFyYXRpb24gKi8gYm9vbGVhbixcbiAgICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICAgICk6IFQge1xuICAgICAgY29uc3QgdHlwZSA9IGlzU3RhdGVtZW50ID8gXCJDbGFzc0RlY2xhcmF0aW9uXCIgOiBcIkNsYXNzRXhwcmVzc2lvblwiO1xuXG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIklkZW50aWZpZXJcIik7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuX2V4dGVuZHMpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5wbGFjZWhvbGRlcikgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNlTClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5pZCA9IHBsYWNlaG9sZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsSWQgfHwgIWlzU3RhdGVtZW50KSB7XG4gICAgICAgICAgbm9kZS5pZCA9IG51bGw7XG4gICAgICAgICAgbm9kZS5ib2R5ID0gdGhpcy5maW5pc2hQbGFjZWhvbGRlcihwbGFjZWhvbGRlciwgXCJDbGFzc0JvZHlcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKFBsYWNlaG9sZGVyRXJyb3JzLkNsYXNzTmFtZUlzUmVxdWlyZWQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcnNlQ2xhc3NJZChub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAgIG5vZGUuYm9keSA9XG4gICAgICAgIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkNsYXNzQm9keVwiKSB8fFxuICAgICAgICBzdXBlci5wYXJzZUNsYXNzQm9keSghIW5vZGUuc3VwZXJDbGFzcywgb2xkU3RyaWN0KTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQobm9kZTogTi5Ob2RlLCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCk6IE4uQW55RXhwb3J0IHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKTtcbiAgICAgIGlmICghcGxhY2Vob2xkZXIpIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydChub2RlLCBkZWNvcmF0b3JzKTtcblxuICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fZnJvbSkgJiYgIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICAgIC8vIGV4cG9ydCAlJURFQ0wlJTtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMuZmluaXNoUGxhY2Vob2xkZXIocGxhY2Vob2xkZXIsIFwiRGVjbGFyYXRpb25cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBleHBvcnQgJSVOQU1FJSUgZnJvbSBcImZvb1wiO1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBvcnREZWZhdWx0RnJvbVwiKTtcbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSBwbGFjZWhvbGRlcjtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IFt0aGlzLmZpbmlzaE5vZGUoc3BlY2lmaWVyLCBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIildO1xuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHBvcnQobm9kZSwgZGVjb3JhdG9ycyk7XG4gICAgfVxuXG4gICAgaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2RlZmF1bHQpKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgICAgIGlmICh0aGlzLmlzVW5wYXJzZWRDb250ZXh0dWFsKG5leHQsIFwiZnJvbVwiKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuc3RhcnRzV2l0aChcbiAgICAgICAgICAgICAgdG9rZW5MYWJlbE5hbWUodHQucGxhY2Vob2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlblN0YXJ0U2luY2UobmV4dCArIDQpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk7XG4gICAgfVxuXG4gICAgbWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICBub2RlOiBVbmRvbmU8XG4gICAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgICAgfCBOLkV4cG9ydEFsbERlY2xhcmF0aW9uXG4gICAgICAgIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uXG4gICAgICA+LFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgICApOiBub2RlIGlzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+IHtcbiAgICAgIGlmICgobm9kZSBhcyBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pLnNwZWNpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBcImV4cG9ydCAlJU5BTUUlJVwiIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkIGJ5ICNwYXJzZUV4cG9ydC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIubWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNoZWNrRXhwb3J0KG5vZGU6IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbik6IHZvaWQge1xuICAgICAgY29uc3QgeyBzcGVjaWZpZXJzIH0gPSBub2RlO1xuICAgICAgaWYgKHNwZWNpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICBub2RlLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmZpbHRlcihcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsYWNlaG9sZGVyIHR5cGluZ3NcbiAgICAgICAgICBub2RlID0+IG5vZGUuZXhwb3J0ZWQudHlwZSA9PT0gXCJQbGFjZWhvbGRlclwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3VwZXIuY2hlY2tFeHBvcnQobm9kZSk7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzO1xuICAgIH1cblxuICAgIHBhcnNlSW1wb3J0KFxuICAgICAgbm9kZTogVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgICk6IE4uSW1wb3J0RGVjbGFyYXRpb24gfCBOLlRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpO1xuICAgICAgaWYgKCFwbGFjZWhvbGRlcikgcmV0dXJuIHN1cGVyLnBhcnNlSW1wb3J0KG5vZGUpO1xuXG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBbXTtcblxuICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fZnJvbSkgJiYgIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICAgIC8vIGltcG9ydCAlJVNUUklORyUlO1xuICAgICAgICBub2RlLnNvdXJjZSA9IHRoaXMuZmluaXNoUGxhY2Vob2xkZXIocGxhY2Vob2xkZXIsIFwiU3RyaW5nTGl0ZXJhbFwiKTtcbiAgICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBpbXBvcnQgJSVERUZBVUxUJSUgLi4uXG4gICAgICBjb25zdCBzcGVjaWZpZXIgPVxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KHBsYWNlaG9sZGVyKTtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IHBsYWNlaG9sZGVyO1xuICAgICAgbm9kZS5zcGVjaWZpZXJzLnB1c2goXG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmVhdCh0dC5jb21tYSkpIHtcbiAgICAgICAgLy8gaW1wb3J0ICUlREVGQVVMVCUlLCAqIGFzIC4uLlxuICAgICAgICBjb25zdCBoYXNTdGFySW1wb3J0ID0gdGhpcy5tYXliZVBhcnNlU3RhckltcG9ydFNwZWNpZmllcihub2RlKTtcblxuICAgICAgICAvLyBpbXBvcnQgJSVERUZBVUxUJSUsIHsgLi4uXG4gICAgICAgIGlmICghaGFzU3RhckltcG9ydCkgdGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9mcm9tKTtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnREZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBwYXJzZUltcG9ydFNvdXJjZSgpOiBNYXliZVBsYWNlaG9sZGVyPFwiU3RyaW5nTGl0ZXJhbFwiPiB7XG4gICAgICAvLyBpbXBvcnQgLi4uIGZyb20gJSVTVFJJTkclJTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiU3RyaW5nTGl0ZXJhbFwiKSB8fCBzdXBlci5wYXJzZUltcG9ydFNvdXJjZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRocm93cyBpZiB0aGUgY3VycmVudCB0b2tlbiBhbmQgdGhlIHByZXYgb25lIGFyZSBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAgICBhc3NlcnROb1NwYWNlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RhcnQgPiB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MuaW5kZXgpIHtcbiAgICAgICAgdGhpcy5yYWlzZShQbGFjZWhvbGRlckVycm9ycy5VbmV4cGVjdGVkU3BhY2UsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuLi9wYXJzZXJcIjtcbmltcG9ydCB7IHRva2VuSXNJZGVudGlmaWVyLCB0dCB9IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi9wYXJzZXIvdXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzczogdHlwZW9mIFBhcnNlcikgPT5cbiAgY2xhc3MgVjhJbnRyaW5zaWNNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIHBhcnNlVjhJbnRyaW5zaWMoKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lm1vZHVsbykpIHtcbiAgICAgICAgY29uc3QgdjhJbnRyaW5zaWNTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIC8vIGxldCB0aGUgYGxvY2Agb2YgSWRlbnRpZmllciBzdGFydHMgZnJvbSBgJWBcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uSWRlbnRpZmllcj4oKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnJSdcbiAgICAgICAgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihub2RlLCBuYW1lKTtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBhdm9pZCBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICBpZGVudGlmaWVyLnR5cGUgPSBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQodjhJbnRyaW5zaWNTdGFydExvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvZXhwcmVzc2lvbi5qcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgcGFyc2VFeHByQXRvbShyZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwpOiBOLkV4cHJlc3Npb24ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVY4SW50cmluc2ljKCkgfHwgc3VwZXIucGFyc2VFeHByQXRvbShyZWZFeHByZXNzaW9uRXJyb3JzKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZXJQbHVnaW5XaXRoT3B0aW9ucyxcbiAgUGx1Z2luQ29uZmlnLFxuICBQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbiA9IFBsdWdpbkNvbmZpZztcblxuZXhwb3J0IHR5cGUgUGx1Z2luTGlzdCA9IFBsdWdpbkNvbmZpZ1tdO1xuXG5leHBvcnQgdHlwZSBNaXhpblBsdWdpbiA9IChzdXBlckNsYXNzOiB7IG5ldyAoLi4uYXJnczogYW55KTogUGFyc2VyIH0pID0+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnkpOiBQYXJzZXI7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uXHUyMDE5cyBzZWNvbmQgcGFyYW1ldGVyIGFjY2VwdHMgZWl0aGVyIGEgc3RyaW5nIChwbHVnaW4gbmFtZSkgb3IgYW5cbi8vIGFycmF5IHBhaXIgKHBsdWdpbiBuYW1lIGFuZCBvcHRpb25zIG9iamVjdCkuIElmIGFuIG9wdGlvbnMgb2JqZWN0IGlzIGdpdmVuLFxuLy8gdGhlbiBlYWNoIHZhbHVlIGlzIG5vbi1yZWN1cnNpdmVseSBjaGVja2VkIGZvciBpZGVudGl0eSB3aXRoIHRoZSBhY3R1YWxcbi8vIG9wdGlvbiB2YWx1ZSBvZiBlYWNoIHBsdWdpbiBpbiB0aGUgZmlyc3QgYXJndW1lbnQgKHdoaWNoIGlzIGFuIGFycmF5IG9mXG4vLyBwbHVnaW4gbmFtZXMgb3IgYXJyYXkgcGFpcnMpLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BsdWdpbihcbiAgcGx1Z2luczogUGx1Z2luTGlzdCxcbiAgZXhwZWN0ZWRDb25maWc6IFBsdWdpbkNvbmZpZyxcbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgZXhwZWN0ZWRPcHRpb25zIG9iamVjdCBpcyBieSBkZWZhdWx0IGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgZ2l2ZW5cbiAgLy8gZXhwZWN0ZWRDb25maWcgYXJndW1lbnQgZG9lcyBub3QgZ2l2ZSBhbiBvcHRpb25zIG9iamVjdCAoaS5lLiwgaWYgaXQgaXMgYVxuICAvLyBzdHJpbmcpLlxuICBjb25zdCBbZXhwZWN0ZWROYW1lLCBleHBlY3RlZE9wdGlvbnNdID1cbiAgICB0eXBlb2YgZXhwZWN0ZWRDb25maWcgPT09IFwic3RyaW5nXCIgPyBbZXhwZWN0ZWRDb25maWcsIHt9XSA6IGV4cGVjdGVkQ29uZmlnO1xuXG4gIGNvbnN0IGV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdGVkT3B0aW9ucyk7XG5cbiAgY29uc3QgZXhwZWN0ZWRPcHRpb25zSXNFbXB0eSA9IGV4cGVjdGVkS2V5cy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHBsdWdpbnMuc29tZShwID0+IHtcbiAgICBpZiAodHlwZW9mIHAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZE9wdGlvbnNJc0VtcHR5ICYmIHAgPT09IGV4cGVjdGVkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gcDtcbiAgICAgIGlmIChwbHVnaW5OYW1lICE9PSBleHBlY3RlZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXhwZWN0ZWRLZXlzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG1heSBub3QgZXhpc3QgaW4gcGx1Z2luIG9wdGlvbnNcbiAgICAgICAgaWYgKHBsdWdpbk9wdGlvbnNba2V5XSAhPT0gZXhwZWN0ZWRPcHRpb25zW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbHVnaW5PcHRpb248XG4gIFBsdWdpbk5hbWUgZXh0ZW5kcyBQYXJzZXJQbHVnaW5XaXRoT3B0aW9uc1swXSxcbiAgT3B0aW9uTmFtZSBleHRlbmRzIGtleW9mIFBsdWdpbk9wdGlvbnM8UGx1Z2luTmFtZT4sXG4+KHBsdWdpbnM6IFBsdWdpbkxpc3QsIG5hbWU6IFBsdWdpbk5hbWUsIG9wdGlvbjogT3B0aW9uTmFtZSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQocGx1Z2luID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW4pKSB7XG4gICAgICByZXR1cm4gcGx1Z2luWzBdID09PSBuYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGx1Z2luID09PSBuYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHBsdWdpbiAmJiBBcnJheS5pc0FycmF5KHBsdWdpbikgJiYgcGx1Z2luLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gKHBsdWdpblsxXSBhcyBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+KVtvcHRpb25dO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IFBJUEVMSU5FX1BST1BPU0FMUyA9IFtcIm1pbmltYWxcIiwgXCJmc2hhcnBcIiwgXCJoYWNrXCIsIFwic21hcnRcIl07XG5jb25zdCBUT1BJQ19UT0tFTlMgPSBbXCJeXlwiLCBcIkBAXCIsIFwiXlwiLCBcIiVcIiwgXCIjXCJdO1xuY29uc3QgUkVDT1JEX0FORF9UVVBMRV9TWU5UQVhfVFlQRVMgPSBbXCJoYXNoXCIsIFwiYmFyXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbkxpc3QpIHtcbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcImRlY29yYXRvcnNcIikpIHtcbiAgICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwiZGVjb3JhdG9ycy1sZWdhY3lcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXNlIHRoZSBkZWNvcmF0b3JzIGFuZCBkZWNvcmF0b3JzLWxlZ2FjeSBwbHVnaW4gdG9nZXRoZXJcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCA9IGdldFBsdWdpbk9wdGlvbihcbiAgICAgIHBsdWdpbnMsXG4gICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCAhPT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCInZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCcgbXVzdCBiZSBhIGJvb2xlYW4sIGlmIHNwZWNpZmllZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dDYWxsUGFyZW50aGVzaXplZCA9IGdldFBsdWdpbk9wdGlvbihcbiAgICAgIHBsdWdpbnMsXG4gICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgIFwiYWxsb3dDYWxsUGFyZW50aGVzaXplZFwiLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgYWxsb3dDYWxsUGFyZW50aGVzaXplZCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgYWxsb3dDYWxsUGFyZW50aGVzaXplZCAhPT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIidhbGxvd0NhbGxQYXJlbnRoZXNpemVkJyBtdXN0IGJlIGEgYm9vbGVhbi5cIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcImZsb3dcIikgJiYgaGFzUGx1Z2luKHBsdWdpbnMsIFwidHlwZXNjcmlwdFwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21iaW5lIGZsb3cgYW5kIHR5cGVzY3JpcHQgcGx1Z2lucy5cIik7XG4gIH1cblxuICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwicGxhY2Vob2xkZXJzXCIpICYmIGhhc1BsdWdpbihwbHVnaW5zLCBcInY4aW50cmluc2ljXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbWJpbmUgcGxhY2Vob2xkZXJzIGFuZCB2OGludHJpbnNpYyBwbHVnaW5zLlwiKTtcbiAgfVxuXG4gIGlmIChoYXNQbHVnaW4ocGx1Z2lucywgXCJwaXBlbGluZU9wZXJhdG9yXCIpKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBnZXRQbHVnaW5PcHRpb24ocGx1Z2lucywgXCJwaXBlbGluZU9wZXJhdG9yXCIsIFwicHJvcG9zYWxcIik7XG5cbiAgICBpZiAoIVBJUEVMSU5FX1BST1BPU0FMUy5pbmNsdWRlcyhwcm9wb3NhbCkpIHtcbiAgICAgIGNvbnN0IHByb3Bvc2FsTGlzdCA9IFBJUEVMSU5FX1BST1BPU0FMUy5tYXAocCA9PiBgXCIke3B9XCJgKS5qb2luKFwiLCBcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcInBpcGVsaW5lT3BlcmF0b3JcIiByZXF1aXJlcyBcInByb3Bvc2FsXCIgb3B0aW9uIHdob3NlIHZhbHVlIG11c3QgYmUgb25lIG9mOiAke3Byb3Bvc2FsTGlzdH0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdHVwbGVTeW50YXhJc0hhc2ggPSBoYXNQbHVnaW4ocGx1Z2lucywgW1xuICAgICAgXCJyZWNvcmRBbmRUdXBsZVwiLFxuICAgICAgeyBzeW50YXhUeXBlOiBcImhhc2hcIiB9LFxuICAgIF0pO1xuXG4gICAgaWYgKHByb3Bvc2FsID09PSBcImhhY2tcIikge1xuICAgICAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcInBsYWNlaG9sZGVyc1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29tYmluZSBwbGFjZWhvbGRlcnMgcGx1Z2luIGFuZCBIYWNrLXN0eWxlIHBpcGVzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwidjhpbnRyaW5zaWNcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbWJpbmUgdjhpbnRyaW5zaWMgcGx1Z2luIGFuZCBIYWNrLXN0eWxlIHBpcGVzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3BpY1Rva2VuID0gZ2V0UGx1Z2luT3B0aW9uKFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgXCJ0b3BpY1Rva2VuXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoIVRPUElDX1RPS0VOUy5pbmNsdWRlcyh0b3BpY1Rva2VuKSkge1xuICAgICAgICBjb25zdCB0b2tlbkxpc3QgPSBUT1BJQ19UT0tFTlMubWFwKHQgPT4gYFwiJHt0fVwiYCkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgXCJwaXBlbGluZU9wZXJhdG9yXCIgaW4gXCJwcm9wb3NhbFwiOiBcImhhY2tcIiBtb2RlIGFsc28gcmVxdWlyZXMgYSBcInRvcGljVG9rZW5cIiBvcHRpb24gd2hvc2UgdmFsdWUgbXVzdCBiZSBvbmUgb2Y6ICR7dG9rZW5MaXN0fS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9waWNUb2tlbiA9PT0gXCIjXCIgJiYgdHVwbGVTeW50YXhJc0hhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdQbHVnaW4gY29uZmxpY3QgYmV0d2VlbiBgW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcImhhY2tcIiwgdG9waWNUb2tlbjogXCIjXCIgfV1gIGFuZCBgW1wicmVjb3JkQW5kdHVwbGVcIiwgeyBzeW50YXhUeXBlOiBcImhhc2hcIn1dYC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcG9zYWwgPT09IFwic21hcnRcIiAmJiB0dXBsZVN5bnRheElzSGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGx1Z2luIGNvbmZsaWN0IGJldHdlZW4gYFtcInBpcGVsaW5lT3BlcmF0b3JcIiwgeyBwcm9wb3NhbDogXCJzbWFydFwiIH1dYCBhbmQgYFtcInJlY29yZEFuZHR1cGxlXCIsIHsgc3ludGF4VHlwZTogXCJoYXNoXCJ9XWAuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBtb2R1bGVBdHRyaWJ1dGVzYCBoYXMgYmVlbiByZW1vdmVkIGluIEJhYmVsIDgsIHBsZWFzZSB1c2UgYGltcG9ydEF0dHJpYnV0ZXNgIHBhcnNlciBwbHVnaW4sIG9yIGBAYmFiZWwvcGx1Z2luLXN5bnRheC1pbXBvcnQtYXR0cmlidXRlc2AuXCIsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc1BsdWdpbihwbHVnaW5zLCBcImltcG9ydEFzc2VydGlvbnNcIikgfHxcbiAgICAgICAgaGFzUGx1Z2luKHBsdWdpbnMsIFwiaW1wb3J0QXR0cmlidXRlc1wiKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBjb21iaW5lIGltcG9ydEFzc2VydGlvbnMsIGltcG9ydEF0dHJpYnV0ZXMgYW5kIG1vZHVsZUF0dHJpYnV0ZXMgcGx1Z2lucy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vZHVsZUF0dHJpYnV0ZXNWZXJzaW9uUGx1Z2luT3B0aW9uID0gZ2V0UGx1Z2luT3B0aW9uKFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICBcIm1vZHVsZUF0dHJpYnV0ZXNcIixcbiAgICAgICAgXCJ2ZXJzaW9uXCIsXG4gICAgICApO1xuICAgICAgaWYgKG1vZHVsZUF0dHJpYnV0ZXNWZXJzaW9uUGx1Z2luT3B0aW9uICE9PSBcIm1heS0yMDIwXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiVGhlICdtb2R1bGVBdHRyaWJ1dGVzJyBwbHVnaW4gcmVxdWlyZXMgYSAndmVyc2lvbicgb3B0aW9uLFwiICtcbiAgICAgICAgICAgIFwiIHJlcHJlc2VudGluZyB0aGUgbGFzdCBwcm9wb3NhbCB1cGRhdGUuIEN1cnJlbnRseSwgdGhlXCIgK1xuICAgICAgICAgICAgXCIgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgJ21heS0yMDIwJy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIGhhc1BsdWdpbihwbHVnaW5zLCBcImltcG9ydEFzc2VydGlvbnNcIikgJiZcbiAgICBoYXNQbHVnaW4ocGx1Z2lucywgXCJpbXBvcnRBdHRyaWJ1dGVzXCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQ2Fubm90IGNvbWJpbmUgaW1wb3J0QXNzZXJ0aW9ucyBhbmQgaW1wb3J0QXR0cmlidXRlcyBwbHVnaW5zLlwiLFxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgaGFzUGx1Z2luKHBsdWdpbnMsIFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICBnZXRQbHVnaW5PcHRpb24ocGx1Z2lucywgXCJyZWNvcmRBbmRUdXBsZVwiLCBcInN5bnRheFR5cGVcIikgIT0gbnVsbCAmJlxuICAgICFSRUNPUkRfQU5EX1RVUExFX1NZTlRBWF9UWVBFUy5pbmNsdWRlcyhcbiAgICAgIGdldFBsdWdpbk9wdGlvbihwbHVnaW5zLCBcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSxcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVGhlICdzeW50YXhUeXBlJyBvcHRpb24gb2YgdGhlICdyZWNvcmRBbmRUdXBsZScgcGx1Z2luIG11c3QgYmUgb25lIG9mOiBcIiArXG4gICAgICAgIFJFQ09SRF9BTkRfVFVQTEVfU1lOVEFYX1RZUEVTLm1hcChwID0+IGAnJHtwfSdgKS5qb2luKFwiLCBcIiksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBoYXNQbHVnaW4ocGx1Z2lucywgXCJhc3luY0RvRXhwcmVzc2lvbnNcIikgJiZcbiAgICAhaGFzUGx1Z2luKHBsdWdpbnMsIFwiZG9FeHByZXNzaW9uc1wiKVxuICApIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgIFwiJ2FzeW5jRG9FeHByZXNzaW9ucycgcmVxdWlyZXMgJ2RvRXhwcmVzc2lvbnMnLCBwbGVhc2UgYWRkICdkb0V4cHJlc3Npb25zJyB0byBwYXJzZXIgcGx1Z2lucy5cIixcbiAgICApO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc28gQGJhYmVsL2NvcmUgY2FuIHByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2VcbiAgICBlcnJvci5taXNzaW5nUGx1Z2lucyA9IFwiZG9FeHByZXNzaW9uc1wiO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFRoZXNlIHBsdWdpbnMgYXJlIGRlZmluZWQgdXNpbmcgYSBtaXhpbiB3aGljaCBleHRlbmRzIHRoZSBwYXJzZXIgY2xhc3MuXG5cbmltcG9ydCBlc3RyZWUgZnJvbSBcIi4vcGx1Z2lucy9lc3RyZWVcIjtcbmltcG9ydCBmbG93IGZyb20gXCIuL3BsdWdpbnMvZmxvd1wiO1xuaW1wb3J0IGpzeCBmcm9tIFwiLi9wbHVnaW5zL2pzeFwiO1xuaW1wb3J0IHR5cGVzY3JpcHQgZnJvbSBcIi4vcGx1Z2lucy90eXBlc2NyaXB0XCI7XG5pbXBvcnQgcGxhY2Vob2xkZXJzIGZyb20gXCIuL3BsdWdpbnMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgdjhpbnRyaW5zaWMgZnJvbSBcIi4vcGx1Z2lucy92OGludHJpbnNpY1wiO1xuXG4vLyBOT1RFOiBvcmRlciBpcyBpbXBvcnRhbnQuIGVzdHJlZSBtdXN0IGNvbWUgZmlyc3Q7IHBsYWNlaG9sZGVycyBtdXN0IGNvbWUgbGFzdC5cbmV4cG9ydCBjb25zdCBtaXhpblBsdWdpbnMgPSB7XG4gIGVzdHJlZSxcbiAganN4LFxuICBmbG93LFxuICB0eXBlc2NyaXB0LFxuICB2OGludHJpbnNpYyxcbiAgcGxhY2Vob2xkZXJzLFxufTtcblxuZXhwb3J0IGNvbnN0IG1peGluUGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyhtaXhpblBsdWdpbnMpIGFzIFJlYWRvbmx5QXJyYXk8XG4gIFwiZXN0cmVlXCIgfCBcImpzeFwiIHwgXCJmbG93XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwidjhpbnRyaW5zaWNcIiB8IFwicGxhY2Vob2xkZXJzXCJcbj47XG4iLCAiaW1wb3J0IHR5cGUgeyBQbHVnaW5MaXN0IH0gZnJvbSBcIi4vcGx1Z2luLXV0aWxzXCI7XG5cbi8vIEEgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBmdXJ0aGVyIGNvbmZpZ3VyZVxuLy8gdGhlIHBhcnNlciBwcm9jZXNzLiBUaGVzZSBvcHRpb25zIGFyZSByZWNvZ25pemVkOlxuXG5leHBvcnQgdHlwZSBTb3VyY2VUeXBlID0gXCJzY3JpcHRcIiB8IFwibW9kdWxlXCIgfCBcInVuYW1iaWd1b3VzXCI7XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIHNvdXJjZVR5cGU6IFNvdXJjZVR5cGU7XG4gIHNvdXJjZUZpbGVuYW1lPzogc3RyaW5nO1xuICBzdGFydENvbHVtbjogbnVtYmVyO1xuICBzdGFydExpbmU6IG51bWJlcjtcbiAgYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbjogYm9vbGVhbjtcbiAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGJvb2xlYW47XG4gIGFsbG93TmV3VGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOiBib29sZWFuO1xuICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGJvb2xlYW47XG4gIGFsbG93U3VwZXJPdXRzaWRlTWV0aG9kOiBib29sZWFuO1xuICBhbGxvd1VuZGVjbGFyZWRFeHBvcnRzOiBib29sZWFuO1xuICBwbHVnaW5zOiBQbHVnaW5MaXN0O1xuICBzdHJpY3RNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgcmFuZ2VzOiBib29sZWFuO1xuICB0b2tlbnM6IGJvb2xlYW47XG4gIGNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uczogYm9vbGVhbjtcbiAgZXJyb3JSZWNvdmVyeTogYm9vbGVhbjtcbiAgYXR0YWNoQ29tbWVudDogYm9vbGVhbjtcbiAgYW5uZXhCOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAvLyBTb3VyY2UgdHlwZSAoXCJzY3JpcHRcIiBvciBcIm1vZHVsZVwiKSBmb3IgZGlmZmVyZW50IHNlbWFudGljc1xuICBzb3VyY2VUeXBlOiBcInNjcmlwdFwiLFxuICAvLyBTb3VyY2UgZmlsZW5hbWUuXG4gIHNvdXJjZUZpbGVuYW1lOiB1bmRlZmluZWQsXG4gIC8vIENvbHVtbiAoMC1iYXNlZCkgZnJvbSB3aGljaCB0byBzdGFydCBjb3VudGluZyBzb3VyY2UuIFVzZWZ1bCBmb3JcbiAgLy8gaW50ZWdyYXRpb24gd2l0aCBvdGhlciB0b29scy5cbiAgc3RhcnRDb2x1bW46IDAsXG4gIC8vIExpbmUgKDEtYmFzZWQpIGZyb20gd2hpY2ggdG8gc3RhcnQgY291bnRpbmcgc291cmNlLiBVc2VmdWwgZm9yXG4gIC8vIGludGVncmF0aW9uIHdpdGggb3RoZXIgdG9vbHMuXG4gIHN0YXJ0TGluZTogMSxcbiAgLy8gV2hlbiBlbmFibGVkLCBhd2FpdCBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gIC8vIGVycm9yLlxuICBhbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uOiBmYWxzZSxcbiAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gIC8vIGVycm9yLlxuICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgbmV3LnRhcmdldCBvdXRzaWRlIGEgZnVuY3Rpb24gb3IgY2xhc3MgaXMgbm90XG4gIC8vIGNvbnNpZGVyZWQgYW4gZXJyb3IuXG4gIGFsbG93TmV3VGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOiBmYWxzZSxcbiAgLy8gV2hlbiBlbmFibGVkLCBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudHMgYXJlIG5vdCBjb25zdHJhaW5lZCB0b1xuICAvLyBhcHBlYXJpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbS5cbiAgYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlOiBmYWxzZSxcbiAgLy8gVE9ET1xuICBhbGxvd1N1cGVyT3V0c2lkZU1ldGhvZDogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgZXhwb3J0IHN0YXRlbWVudHMgY2FuIHJlZmVyZW5jZSB1bmRlY2xhcmVkIHZhcmlhYmxlcy5cbiAgYWxsb3dVbmRlY2xhcmVkRXhwb3J0czogZmFsc2UsXG4gIC8vIEFuIGFycmF5IG9mIHBsdWdpbnMgdG8gZW5hYmxlXG4gIHBsdWdpbnM6IFtdLFxuICAvLyBUT0RPXG4gIHN0cmljdE1vZGU6IG51bGwsXG4gIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyAoZGlyZWN0bHkgb24gdGhlIG5vZGUsIHJhdGhlciB0aGFuXG4gIC8vIHRoZSBgbG9jYCBvYmplY3QsIHdoaWNoIGhvbGRzIGxpbmUvY29sdW1uIGRhdGEuIFRvIGFsc28gYWRkIGFcbiAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgLy8gZW5kXWAgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXJzLCBzZXQgdGhlIGByYW5nZXNgIG9wdGlvbiB0b1xuICAvLyBgdHJ1ZWAuXG4gIC8vXG4gIC8vIFtyYW5nZV06IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTY3OFxuICByYW5nZXM6IGZhbHNlLFxuICAvLyBBZGRzIGFsbCBwYXJzZWQgdG9rZW5zIHRvIGEgYHRva2Vuc2AgcHJvcGVydHkgb24gdGhlIGBGaWxlYCBub2RlXG4gIHRva2VuczogZmFsc2UsXG4gIC8vIFdoZXRoZXIgdG8gY3JlYXRlIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEFTVCBub2RlcyAoaWYgZmFsc2VcbiAgLy8gdGhlIHBhcnNlciBzZXRzIGV4dHJhLnBhcmVudGhlc2l6ZWQgb24gdGhlIGV4cHJlc3Npb24gbm9kZXMgaW5zdGVhZCkuXG4gIGNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uczogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgZXJyb3JzIGFyZSBhdHRhY2hlZCB0byB0aGUgQVNUIGluc3RlYWQgb2YgYmVpbmcgZGlyZWN0bHkgdGhyb3duLlxuICAvLyBTb21lIGVycm9ycyB3aWxsIHN0aWxsIHRocm93LCBiZWNhdXNlIEBiYWJlbC9wYXJzZXIgY2FuJ3QgYWx3YXlzIHJlY292ZXIuXG4gIGVycm9yUmVjb3Zlcnk6IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGNvbW1lbnRzIHdpbGwgYmUgYXR0YWNoZWQgdG8gYWRqYWNlbnQgQVNUIG5vZGVzIGFzIG9uZSBvZlxuICAvLyBgbGVhZGluZ0NvbW1lbnRzYCwgYHRyYWlsaW5nQ29tbWVudHNgIGFuZCBgaW5uZXJDb21tZW50c2AuIFRoZSBjb21tZW50IGF0dGFjaG1lbnRcbiAgLy8gaXMgdml0YWwgdG8gcHJlc2VydmUgY29tbWVudHMgYWZ0ZXIgdHJhbnNmb3JtLiBJZiB5b3UgZG9uJ3QgcHJpbnQgQVNUIGJhY2ssXG4gIC8vIGNvbnNpZGVyIHNldCB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIGZvciBwZXJmb3JtYW5jZVxuICBhdHRhY2hDb21tZW50OiB0cnVlLFxuICAvLyBXaGVuIGVuYWJsZWQsIHRoZSBwYXJzZXIgd2lsbCBzdXBwb3J0IEFubmV4IEIgc3ludGF4LlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFkZGl0aW9uYWwtZWNtYXNjcmlwdC1mZWF0dXJlcy1mb3Itd2ViLWJyb3dzZXJzXG4gIGFubmV4QjogdHJ1ZSxcbn07XG5cbi8vIEludGVycHJldCBhbmQgZGVmYXVsdCBhbiBvcHRpb25zIG9iamVjdFxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRzPzogT3B0aW9ucyB8IG51bGwpOiBPcHRpb25zIHtcbiAgaWYgKG9wdHMgJiYgb3B0cy5hbm5leEIgIT0gbnVsbCAmJiBvcHRzLmFubmV4QiAhPT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYGFubmV4QmAgb3B0aW9uIGNhbiBvbmx5IGJlIHNldCB0byBgZmFsc2VgLlwiKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkZWZhdWx0T3B0aW9ucykpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtYXkgbm90IGV4aXN0IGluIG9wdHNcbiAgICBvcHRpb25zW2tleV0gPSBvcHRzICYmIG9wdHNba2V5XSAhPSBudWxsID8gb3B0c1trZXldIDogZGVmYXVsdE9wdGlvbnNba2V5XTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cbiIsICIvLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbFxuLy8gc3ludGFjdGljIGVsZW1lbnRzLCBhbmQgcmVjdXJzaXZlbHkgY2FsbGluZyB0aG9zZSwgZWFjaCBmdW5jdGlvblxuLy8gYWR2YW5jaW5nIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybmluZyBhbiBBU1Qgbm9kZS4gUHJlY2VkZW5jZVxuLy8gb2YgY29uc3RydWN0cyAoZm9yIGV4YW1wbGUsIHRoZSBmYWN0IHRoYXQgYCF4WzFdYCBtZWFucyBgISh4WzFdKWBcbi8vIGluc3RlYWQgb2YgYCgheClbMV1gIGlzIGhhbmRsZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2VyXG4vLyBmdW5jdGlvbiB0aGF0IHBhcnNlcyB1bmFyeSBwcmVmaXggb3BlcmF0b3JzIGlzIGNhbGxlZCBmaXJzdCwgYW5kXG4vLyBpbiB0dXJuIGNhbGxzIHRoZSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBgW11gIHN1YnNjcmlwdHMgXHUyMDE0IHRoYXRcbi8vIHdheSwgaXQnbGwgcmVjZWl2ZSB0aGUgbm9kZSBmb3IgYHhbMV1gIGFscmVhZHkgcGFyc2VkLCBhbmQgd3JhcHNcbi8vICp0aGF0KiBpbiB0aGUgdW5hcnkgb3BlcmF0b3Igbm9kZS5cbi8vXG4vLyBBY29ybiB1c2VzIGFuIFtvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNlcl1bb3BwXSB0byBoYW5kbGUgYmluYXJ5XG4vLyBvcGVyYXRvciBwcmVjZWRlbmNlLCBiZWNhdXNlIGl0IGlzIG11Y2ggbW9yZSBjb21wYWN0IHRoYW4gdXNpbmdcbi8vIHRoZSB0ZWNobmlxdWUgb3V0bGluZWQgYWJvdmUsIHdoaWNoIHVzZXMgZGlmZmVyZW50LCBuZXN0aW5nXG4vLyBmdW5jdGlvbnMgdG8gc3BlY2lmeSBwcmVjZWRlbmNlLCBmb3IgYWxsIG9mIHRoZSB0ZW4gYmluYXJ5XG4vLyBwcmVjZWRlbmNlIGxldmVscyB0aGF0IEphdmFTY3JpcHQgZGVmaW5lcy5cbi8vXG4vLyBbb3BwXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRvci1wcmVjZWRlbmNlX3BhcnNlclxuXG5pbXBvcnQge1xuICB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbixcbiAgdG9rZW5Jc0Fzc2lnbm1lbnQsXG4gIHRva2VuSXNJZGVudGlmaWVyLFxuICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcixcbiAgdG9rZW5Jc09wZXJhdG9yLFxuICB0b2tlbklzUG9zdGZpeCxcbiAgdG9rZW5Jc1ByZWZpeCxcbiAgdG9rZW5Jc1JpZ2h0QXNzb2NpYXRpdmUsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdG9rZW5LZXl3b3JkT3JJZGVudGlmaWVySXNLZXl3b3JkLFxuICB0b2tlbkxhYmVsTmFtZSxcbiAgdG9rZW5PcGVyYXRvclByZWNlZGVuY2UsXG4gIHR0LFxuICB0eXBlIFRva2VuVHlwZSxcbn0gZnJvbSBcIi4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IExWYWxQYXJzZXIgZnJvbSBcIi4vbHZhbFwiO1xuaW1wb3J0IHtcbiAgaXNLZXl3b3JkLFxuICBpc1Jlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZFJlc2VydmVkV29yZCxcbiAgaXNJZGVudGlmaWVyU3RhcnQsXG4gIGNhbkJlUmVzZXJ2ZWRXb3JkLFxufSBmcm9tIFwiLi4vdXRpbC9pZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFBvc2l0aW9uLFxuICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQsXG59IGZyb20gXCIuLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHtcbiAgQklORF9PVVRTSURFLFxuICBCSU5EX1ZBUixcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0NMQVNTLFxuICBTQ09QRV9ESVJFQ1RfU1VQRVIsXG4gIFNDT1BFX0ZVTkNUSU9OLFxuICBTQ09QRV9TVVBFUixcbn0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7XG4gIFBBUkFNX0FXQUlULFxuICBQQVJBTV9JTixcbiAgUEFSQU1fUkVUVVJOLFxuICBmdW5jdGlvbkZsYWdzLFxufSBmcm9tIFwiLi4vdXRpbC9wcm9kdWN0aW9uLXBhcmFtZXRlclwiO1xuaW1wb3J0IHtcbiAgbmV3QXJyb3dIZWFkU2NvcGUsXG4gIG5ld0FzeW5jQXJyb3dTY29wZSxcbiAgbmV3RXhwcmVzc2lvblNjb3BlLFxufSBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgeyBFcnJvcnMsIHR5cGUgUGFyc2VFcnJvciB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgVW5wYXJlbnRoZXNpemVkUGlwZUJvZHlEZXNjcmlwdGlvbnMgfSBmcm9tIFwiLi4vcGFyc2UtZXJyb3IvcGlwZWxpbmUtb3BlcmF0b3ItZXJyb3JzXCI7XG5pbXBvcnQgeyBzZXRJbm5lckNvbW1lbnRzIH0gZnJvbSBcIi4vY29tbWVudHNcIjtcbmltcG9ydCB7IGNsb25lSWRlbnRpZmllciwgdHlwZSBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgeyBTb3VyY2VUeXBlIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvblBhcnNlciBleHRlbmRzIExWYWxQYXJzZXIge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIHN0YXRlbWVudC5qc1xuICBhYnN0cmFjdCBwYXJzZUJsb2NrKFxuICAgIGFsbG93RGlyZWN0aXZlcz86IGJvb2xlYW4sXG4gICAgY3JlYXRlTmV3TGV4aWNhbFNjb3BlPzogYm9vbGVhbixcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogTi5CbG9ja1N0YXRlbWVudDtcbiAgYWJzdHJhY3QgcGFyc2VDbGFzcyhcbiAgICBub2RlOiBOLkNsYXNzLFxuICAgIGlzU3RhdGVtZW50OiBib29sZWFuLFxuICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICApOiBOLkNsYXNzO1xuICBhYnN0cmFjdCBwYXJzZURlY29yYXRvcnMoYWxsb3dFeHBvcnQ/OiBib29sZWFuKTogdm9pZDtcbiAgYWJzdHJhY3QgcGFyc2VGdW5jdGlvbjxUIGV4dGVuZHMgTi5Ob3JtYWxGdW5jdGlvbj4oXG4gICAgbm9kZTogVCxcbiAgICBzdGF0ZW1lbnQ/OiBudW1iZXIsXG4gICAgYWxsb3dFeHByZXNzaW9uQm9keT86IGJvb2xlYW4sXG4gICAgaXNBc3luYz86IGJvb2xlYW4sXG4gICk6IFQ7XG4gIGFic3RyYWN0IHBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZTogTi5GdW5jdGlvbiwgaXNDb25zdHJ1Y3Rvcj86IGJvb2xlYW4pOiB2b2lkO1xuICBhYnN0cmFjdCBwYXJzZUJsb2NrT3JNb2R1bGVCbG9ja0JvZHkoXG4gICAgYm9keTogTi5TdGF0ZW1lbnRbXSxcbiAgICBkaXJlY3RpdmVzOiBOLkRpcmVjdGl2ZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogdm9pZDtcbiAgYWJzdHJhY3QgcGFyc2VQcm9ncmFtKFxuICAgIHByb2dyYW06IE4uUHJvZ3JhbSxcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBzb3VyY2VUeXBlPzogU291cmNlVHlwZSxcbiAgKTogTi5Qcm9ncmFtO1xuXG4gIC8vIEZvciBvYmplY3QgbGl0ZXJhbCwgY2hlY2sgaWYgcHJvcGVydHkgX19wcm90b19fIGhhcyBiZWVuIHVzZWQgbW9yZSB0aGFuIG9uY2UuXG4gIC8vIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50LCB0aGVuIF9fcHJvdG9fXyBtYXkgYXBwZWFyXG4gIC8vIG11bHRpcGxlIHRpbWVzLiBPdGhlcndpc2UsIF9fcHJvdG9fXyBpcyBhIGR1cGxpY2F0ZWQga2V5LlxuXG4gIC8vIEZvciByZWNvcmQgZXhwcmVzc2lvbiwgY2hlY2sgaWYgcHJvcGVydHkgX19wcm90b19fIGV4aXN0c1xuXG4gIGNoZWNrUHJvdG8oXG4gICAgcHJvcDogTi5PYmplY3RNZW1iZXIgfCBOLlNwcmVhZEVsZW1lbnQsXG4gICAgaXNSZWNvcmQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHByb3RvUmVmOiB7XG4gICAgICB1c2VkOiBib29sZWFuO1xuICAgIH0sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBwcm9wLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8XG4gICAgICB0aGlzLmlzT2JqZWN0TWV0aG9kKHByb3ApIHx8XG4gICAgICBwcm9wLmNvbXB1dGVkIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHByb3AgbXVzdCBiZSBhbiBPYmplY3RQcm9wZXJ0eVxuICAgICAgcHJvcC5zaG9ydGhhbmRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBwcm9wLmtleTtcbiAgICAvLyBJdCBpcyBlaXRoZXIgYW4gSWRlbnRpZmllciBvciBhIFN0cmluZy9OdW1lcmljTGl0ZXJhbFxuICAgIGNvbnN0IG5hbWUgPSBrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgPyBrZXkubmFtZSA6IGtleS52YWx1ZTtcblxuICAgIGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiKSB7XG4gICAgICBpZiAoaXNSZWNvcmQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVjb3JkTm9Qcm90bywgeyBhdDoga2V5IH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvdG9SZWYudXNlZCkge1xuICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBmaXJzdCByZWRlZmluaXRpb24ncyBwb3NpdGlvbiwgb3RoZXJ3aXNlIGlnbm9yZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgYXJlIHBhcnNpbmcgYW1iaWd1b3VzIHBhdHRlcm5cbiAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9IGtleS5sb2Muc3RhcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZVByb3RvLCB7IGF0OiBrZXkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvdG9SZWYudXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2hvdWxkRXhpdERlc2NlbmRpbmcoZXhwcjogTi5FeHByZXNzaW9uLCBwb3RlbnRpYWxBcnJvd0F0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhwci50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgZXhwci5zdGFydCA9PT0gcG90ZW50aWFsQXJyb3dBdFxuICAgICk7XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGFyc2UgYW4gRXhwcmVzc2lvbiBvbmx5XG4gIGdldEV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uICYgTi5QYXJzZXJPdXRwdXQge1xuICAgIHRoaXMuZW50ZXJJbml0aWFsU2NvcGVzKCk7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuZW9mKSkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICAgIC8vIFVubGlrZSBwYXJzZVRvcExldmVsLCB3ZSBuZWVkIHRvIGRyYWluIHJlbWFpbmluZyBjb21tZW50U3RhY2tzXG4gICAgLy8gYmVjYXVzZSB0aGUgdG9wIGxldmVsIG5vZGUgaXMgX25vdF8gUHJvZ3JhbS5cbiAgICB0aGlzLmZpbmFsaXplUmVtYWluaW5nQ29tbWVudHMoKTtcbiAgICBleHByLmNvbW1lbnRzID0gdGhpcy5zdGF0ZS5jb21tZW50cztcbiAgICBleHByLmVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW5zKSB7XG4gICAgICBleHByLnRva2VucyA9IHRoaXMudG9rZW5zO1xuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeG1lOiByZWZpbmUgdHlwZXNcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8vICMjIyBFeHByZXNzaW9uIHBhcnNpbmdcblxuICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbiAgLy8gJ2F0b21pYycsIG5vbmRpdmlzaWJsZSBleHByZXNzaW9uIHR5cGVzIGF0IHRoZSBib3R0b20uIE1vc3Qgb2ZcbiAgLy8gdGhlIGZ1bmN0aW9ucyB3aWxsIHNpbXBseSBsZXQgdGhlIGZ1bmN0aW9uIChzKSBiZWxvdyB0aGVtIHBhcnNlLFxuICAvLyBhbmQsICppZiogdGhlIHN5bnRhY3RpYyBjb25zdHJ1Y3QgdGhleSBoYW5kbGUgaXMgcHJlc2VudCwgd3JhcFxuICAvLyB0aGUgQVNUIG5vZGUgdGhhdCB0aGUgaW5uZXIgcGFyc2VyIGdhdmUgdGhlbSBpbiBhbm90aGVyIG5vZGUuXG5cbiAgLy8gUGFyc2UgYSBmdWxsIGV4cHJlc3Npb24uXG4gIC8vIC0gYGRpc2FsbG93SW5gXG4gIC8vICAgaXMgdXNlZCB0byBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0aWFsaXphdGlvbiBleHByZXNzaW9ucylcbiAgLy8gICBXaGVuIGBkaXNhbGxvd0luYCBpcyB0cnVlLCB0aGUgcHJvZHVjdGlvbiBwYXJhbWV0ZXIgW0luXSBpcyBub3QgcHJlc2VudC5cblxuICAvLyAtIGByZWZFeHByZXNzaW9uRXJyb3JzIGBcbiAgLy8gICBwcm92aWRlcyByZWZlcmVuY2UgZm9yIHN0b3JpbmcgJz0nIG9wZXJhdG9yIGluc2lkZSBzaG9ydGhhbmRcbiAgLy8gICBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIGNvbnRleHRzIHdoZXJlIGJvdGggb2JqZWN0IGV4cHJlc3Npb25cbiAgLy8gICBhbmQgb2JqZWN0IHBhdHRlcm4gbWlnaHQgYXBwZWFyIChzbyBpdCdzIHBvc3NpYmxlIHRvIHJhaXNlXG4gIC8vICAgZGVsYXllZCBzeW50YXggZXJyb3IgYXQgY29ycmVjdCBwb3NpdGlvbikuXG5cbiAgcGFyc2VFeHByZXNzaW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBkaXNhbGxvd0luPzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAoZGlzYWxsb3dJbikge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWxsb3dJbkFuZCgoKSA9PlxuICAgICAgICB0aGlzLnBhcnNlRXhwcmVzc2lvbkJhc2UocmVmRXhwcmVzc2lvbkVycm9ycyksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxvd0luQW5kKCgpID0+IHRoaXMucGFyc2VFeHByZXNzaW9uQmFzZShyZWZFeHByZXNzaW9uRXJyb3JzKSk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1FeHByZXNzaW9uXG4gIHBhcnNlRXhwcmVzc2lvbkJhc2UoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgbm9kZS5leHByZXNzaW9ucyA9IFtleHByXTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5jb21tYSkpIHtcbiAgICAgICAgbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3Qobm9kZS5leHByZXNzaW9ucyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU2VxdWVuY2VFeHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8vIFNldCBbfkluXSBwYXJhbWV0ZXIgZm9yIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICBwYXJzZU1heWJlQXNzaWduRGlzYWxsb3dJbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIGFmdGVyTGVmdFBhcnNlPzogRnVuY3Rpb24sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmRpc2FsbG93SW5BbmQoKCkgPT5cbiAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNldCBbK0luXSBwYXJhbWV0ZXIgZm9yIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICBwYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIGFmdGVyTGVmdFBhcnNlPzogRnVuY3Rpb24sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFsbG93SW5BbmQoKCkgPT5cbiAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBieVxuICAvLyB0aGUgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zLlxuICBzZXRPcHRpb25hbFBhcmFtZXRlcnNFcnJvcihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICAgIHJlc3VsdEVycm9yPzogUGFyc2VFcnJvcjxhbnk+LFxuICApIHtcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzLm9wdGlvbmFsUGFyYW1ldGVyc0xvYyA9XG4gICAgICByZXN1bHRFcnJvcj8ubG9jID8/IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uIFRoaXMgaW5jbHVkZXMgYXBwbGljYXRpb25zIG9mXG4gIC8vIG9wZXJhdG9ycyBsaWtlIGArPWAuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUFzc2lnbm1lbnRFeHByZXNzaW9uXG4gIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3lpZWxkKSkge1xuICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkKSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5wYXJzZVlpZWxkKCk7XG4gICAgICAgIGlmIChhZnRlckxlZnRQYXJzZSkge1xuICAgICAgICAgIGxlZnQgPSBhZnRlckxlZnRQYXJzZS5jYWxsKHRoaXMsIGxlZnQsIHN0YXJ0TG9jKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3duRXhwcmVzc2lvbkVycm9ycztcbiAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgb3duRXhwcmVzc2lvbkVycm9ycyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICAgIG93bkV4cHJlc3Npb25FcnJvcnMgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAodHlwZSA9PT0gdHQucGFyZW5MIHx8IHRva2VuSXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgIH1cblxuICAgIGxldCBsZWZ0ID0gdGhpcy5wYXJzZU1heWJlQ29uZGl0aW9uYWwocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgaWYgKGFmdGVyTGVmdFBhcnNlKSB7XG4gICAgICBsZWZ0ID0gYWZ0ZXJMZWZ0UGFyc2UuY2FsbCh0aGlzLCBsZWZ0LCBzdGFydExvYyk7XG4gICAgfVxuICAgIGlmICh0b2tlbklzQXNzaWdubWVudCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLkFzc2lnbm1lbnRFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBub2RlLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmVxKSkge1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShsZWZ0LCAvKiBpc0xIUyAqLyB0cnVlKTtcbiAgICAgICAgbm9kZS5sZWZ0ID0gbGVmdDtcblxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gc3RhcnRMb2MuaW5kZXg7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLmRvdWJsZVByb3RvTG9jICE9IG51bGwgJiZcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLmRvdWJsZVByb3RvTG9jLmluZGV4ID49IHN0YXJ0SW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9IG51bGw7IC8vIHJlc2V0IGJlY2F1c2UgZG91YmxlIF9fcHJvdG9fXyBpcyB2YWxpZCBpbiBhc3NpZ25tZW50IGV4cHJlc3Npb25cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgIT0gbnVsbCAmJlxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMuc2hvcnRoYW5kQXNzaWduTG9jLmluZGV4ID49IHN0YXJ0SW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgPSBudWxsOyAvLyByZXNldCBiZWNhdXNlIHNob3J0aGFuZCBkZWZhdWx0IHdhcyB1c2VkIGNvcnJlY3RseVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLnByaXZhdGVLZXlMb2MgIT0gbnVsbCAmJlxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMucHJpdmF0ZUtleUxvYy5pbmRleCA+PSBzdGFydEluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2hlY2tEZXN0cnVjdHVyaW5nUHJpdmF0ZShyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLnByaXZhdGVLZXlMb2MgPSBudWxsOyAvLyByZXNldCBiZWNhdXNlIGAoeyAjeDogeCB9KWAgaXMgYW4gYXNzaWduYWJsZSBwYXR0ZXJuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUubGVmdCA9IGxlZnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5yaWdodCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgdGhpcy5jaGVja0xWYWwobGVmdCwge1xuICAgICAgICBpbjogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiksXG4gICAgICB9KTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgaW1wcm92ZSBub2RlIHR5cGVzXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKG93bkV4cHJlc3Npb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkV4cHJlc3Npb25FcnJvcnMsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgLy8gUGFyc2UgYSB0ZXJuYXJ5IGNvbmRpdGlvbmFsIChgPzpgKSBvcGVyYXRvci5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQ29uZGl0aW9uYWxFeHByZXNzaW9uXG5cbiAgcGFyc2VNYXliZUNvbmRpdGlvbmFsKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlRXhwck9wcyhyZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZEV4aXREZXNjZW5kaW5nKGV4cHIsIHBvdGVudGlhbEFycm93QXQpKSB7XG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKGV4cHIsIHN0YXJ0TG9jLCByZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgfVxuXG4gIHBhcnNlQ29uZGl0aW9uYWwoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGV4cHI6IE4uRXhwcmVzc2lvbixcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBub2RlLnRlc3QgPSBleHByO1xuICAgICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcGFyc2VNYXliZVVuYXJ5T3JQcml2YXRlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyxcbiAgKTogTi5FeHByZXNzaW9uIHwgTi5Qcml2YXRlTmFtZSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpXG4gICAgICA/IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpXG4gICAgICA6IHRoaXMucGFyc2VNYXliZVVuYXJ5KHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICB9XG5cbiAgLy8gU3RhcnQgdGhlIHByZWNlZGVuY2UgcGFyc2VyLlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1TaG9ydENpcmN1aXRFeHByZXNzaW9uXG5cbiAgcGFyc2VFeHByT3BzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZShyZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZEV4aXREZXNjZW5kaW5nKGV4cHIsIHBvdGVudGlhbEFycm93QXQpKSB7XG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChleHByLCBzdGFydExvYywgLTEpO1xuICB9XG5cbiAgLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmdcbiAgLy8gYWxnb3JpdGhtLiBgbGVmdGAgaXMgdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvci5cbiAgLy8gYG1pblByZWNgIHByb3ZpZGVzIGNvbnRleHQgdGhhdCBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIHN0b3AgYW5kXG4gIC8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW5cbiAgLy8gb3BlcmF0b3IgdGhhdCBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIHNldCBpdCBpcyBwYXJzaW5nLlxuXG4gIHBhcnNlRXhwck9wKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBsZWZ0OiBOLkV4cHJlc3Npb24gfCBOLlByaXZhdGVOYW1lLFxuICAgIGxlZnRTdGFydExvYzogUG9zaXRpb24sXG4gICAgbWluUHJlYzogbnVtYmVyLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmICh0aGlzLmlzUHJpdmF0ZU5hbWUobGVmdCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVJlbGF0aW9uYWxFeHByZXNzaW9uXG4gICAgICAvLyBSZWxhdGlvbmFsRXhwcmVzc2lvbiBbSW4sIFlpZWxkLCBBd2FpdF1cbiAgICAgIC8vICAgWytJbl0gUHJpdmF0ZUlkZW50aWZpZXIgaW4gU2hpZnRFeHByZXNzaW9uWz9ZaWVsZCwgP0F3YWl0XVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihsZWZ0KTtcblxuICAgICAgaWYgKFxuICAgICAgICBtaW5QcmVjID49IHRva2VuT3BlcmF0b3JQcmVjZWRlbmNlKHR0Ll9pbikgfHxcbiAgICAgICAgIXRoaXMucHJvZFBhcmFtLmhhc0luIHx8XG4gICAgICAgICF0aGlzLm1hdGNoKHR0Ll9pbilcbiAgICAgICkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Qcml2YXRlSW5FeHBlY3RlZEluLCB7XG4gICAgICAgICAgYXQ6IGxlZnQsXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKHZhbHVlLCBsZWZ0LmxvYy5zdGFydCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3AgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgaWYgKHRva2VuSXNPcGVyYXRvcihvcCkgJiYgKHRoaXMucHJvZFBhcmFtLmhhc0luIHx8ICF0aGlzLm1hdGNoKHR0Ll9pbikpKSB7XG4gICAgICBsZXQgcHJlYyA9IHRva2VuT3BlcmF0b3JQcmVjZWRlbmNlKG9wKTtcbiAgICAgIGlmIChwcmVjID4gbWluUHJlYykge1xuICAgICAgICBpZiAob3AgPT09IHR0LnBpcGVsaW5lKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJwaXBlbGluZU9wZXJhdG9yXCIpO1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5KSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jaGVja1BpcGVsaW5lQXRJbmZpeE9wZXJhdG9yKGxlZnQsIGxlZnRTdGFydExvYyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5Mb2dpY2FsRXhwcmVzc2lvbiB8IE4uQmluYXJ5RXhwcmVzc2lvbj4oXG4gICAgICAgICAgbGVmdFN0YXJ0TG9jLFxuICAgICAgICApO1xuICAgICAgICBub2RlLmxlZnQgPSBsZWZ0O1xuICAgICAgICBub2RlLm9wZXJhdG9yID0gdGhpcy5zdGF0ZS52YWx1ZTtcblxuICAgICAgICBjb25zdCBsb2dpY2FsID0gb3AgPT09IHR0LmxvZ2ljYWxPUiB8fCBvcCA9PT0gdHQubG9naWNhbEFORDtcbiAgICAgICAgY29uc3QgY29hbGVzY2UgPSBvcCA9PT0gdHQubnVsbGlzaENvYWxlc2Npbmc7XG5cbiAgICAgICAgaWYgKGNvYWxlc2NlKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBwcmVjZWRlbmNlIG9mIGB0dC5jb2FsZXNjZWAgYXMgZXF1YWwgdG8gdGhlIHJhbmdlIG9mIGxvZ2ljYWwgZXhwcmVzc2lvbnMuXG4gICAgICAgICAgLy8gSW4gb3RoZXIgd29yZHMsIGBub2RlLnJpZ2h0YCBzaG91bGRuJ3QgY29udGFpbiBsb2dpY2FsIGV4cHJlc3Npb25zIGluIG9yZGVyIHRvIGNoZWNrIHRoZSBtaXhlZCBlcnJvci5cbiAgICAgICAgICBwcmVjID0gdG9rZW5PcGVyYXRvclByZWNlZGVuY2UodHQubG9naWNhbEFORCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHQoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3AgPT09IHR0LnBpcGVsaW5lICYmXG4gICAgICAgICAgdGhpcy5oYXNQbHVnaW4oW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcIm1pbmltYWxcIiB9XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudHlwZSA9PT0gdHQuX2F3YWl0ICYmIHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkQXdhaXRBZnRlclBpcGVsaW5lQm9keSwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlRXhwck9wUmlnaHRFeHByKG9wLCBwcmVjKTtcbiAgICAgICAgY29uc3QgZmluaXNoZWROb2RlID0gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbG9naWNhbCB8fCBjb2FsZXNjZSA/IFwiTG9naWNhbEV4cHJlc3Npb25cIiA6IFwiQmluYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgICApO1xuICAgICAgICAvKiB0aGlzIGNoZWNrIGlzIGZvciBhbGwgPz8gb3BlcmF0b3JzXG4gICAgICAgICAqIGEgPz8gYiAmJiBjIGZvciB0aGlzIGV4YW1wbGVcbiAgICAgICAgICogd2hlbiBvcCBpcyBjb2FsZXNjZSBhbmQgbmV4dE9wIGlzIGxvZ2ljYWwgKCYmKSwgdGhyb3cgYXQgdGhlIHBvcyBvZiBuZXh0T3AgdGhhdCBpdCBjYW4gbm90IGJlIG1peGVkLlxuICAgICAgICAgKiBTeW1tZXRyaWNhbGx5IGl0IGFsc28gdGhyb3dzIHdoZW4gb3AgaXMgbG9naWNhbCBhbmQgbmV4dE9wIGlzIGNvYWxlc2NlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBuZXh0T3AgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoY29hbGVzY2UgJiYgKG5leHRPcCA9PT0gdHQubG9naWNhbE9SIHx8IG5leHRPcCA9PT0gdHQubG9naWNhbEFORCkpIHx8XG4gICAgICAgICAgKGxvZ2ljYWwgJiYgbmV4dE9wID09PSB0dC5udWxsaXNoQ29hbGVzY2luZylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChmaW5pc2hlZE5vZGUsIGxlZnRTdGFydExvYywgbWluUHJlYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBgcGFyc2VFeHByT3BgLiBQYXJzZSB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIGJpbmFyeS1cbiAgLy8gb3BlcmF0b3IgZXhwcmVzc2lvbnMsIHRoZW4gYXBwbHkgYW55IG9wZXJhdG9yLXNwZWNpZmljIGZ1bmN0aW9ucy5cblxuICBwYXJzZUV4cHJPcFJpZ2h0RXhwcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgb3A6IFRva2VuVHlwZSxcbiAgICBwcmVjOiBudW1iZXIsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgdHQucGlwZWxpbmU6XG4gICAgICAgIHN3aXRjaCAodGhpcy5nZXRQbHVnaW5PcHRpb24oXCJwaXBlbGluZU9wZXJhdG9yXCIsIFwicHJvcG9zYWxcIikpIHtcbiAgICAgICAgICBjYXNlIFwiaGFja1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRvcGljQmluZGluZ0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUhhY2tQaXBlQm9keSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwic21hcnRcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndpdGhUb3BpY0JpbmRpbmdDb250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll95aWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5QaXBlQm9keUlzVGlnaHRlciwge1xuICAgICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTbWFydFBpcGVsaW5lQm9keUluU3R5bGUoXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUV4cHJPcEJhc2VSaWdodEV4cHIob3AsIHByZWMpLFxuICAgICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwiZnNoYXJwXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53aXRoU29sb0F3YWl0UGVybWl0dGluZ0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZTaGFycFBpcGVsaW5lQm9keShwcmVjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIC8vIEZhbGxzIHRocm91Z2guXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcEJhc2VSaWdodEV4cHIob3AsIHByZWMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgYHBhcnNlRXhwck9wUmlnaHRFeHByYC4gUGFyc2UgdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZlxuICAvLyBiaW5hcnktb3BlcmF0b3IgZXhwcmVzc2lvbnMgd2l0aG91dCBhcHBseWluZyBhbnkgb3BlcmF0b3Itc3BlY2lmaWMgZnVuY3Rpb25zLlxuXG4gIHBhcnNlRXhwck9wQmFzZVJpZ2h0RXhwcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgb3A6IFRva2VuVHlwZSxcbiAgICBwcmVjOiBudW1iZXIsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VFeHByT3AoXG4gICAgICB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZSgpLFxuICAgICAgc3RhcnRMb2MsXG4gICAgICB0b2tlbklzUmlnaHRBc3NvY2lhdGl2ZShvcCkgPyBwcmVjIC0gMSA6IHByZWMsXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlSGFja1BpcGVCb2R5KHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgeyBzdGFydExvYyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgY29uc3QgcmVxdWlyZWRQYXJlbnRoZXNlcyA9IFVucGFyZW50aGVzaXplZFBpcGVCb2R5RGVzY3JpcHRpb25zLmhhcyhcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFMyMzQ1OiBBcmd1bWVudCBvZiB0eXBlICdzdHJpbmcnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHBhcmFtZXRlciBvZiB0eXBlICdcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfCBcIllpZWxkRXhwcmVzc2lvblwiIHwgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiIHwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIicuXG4gICAgICBib2R5LnR5cGUsXG4gICAgKTtcblxuICAgIC8vIFRPRE86IENoZWNrIGhvdyB0byBoYW5kbGUgdHlwZSBjYXN0cyBpbiBGbG93IGFuZCBUUyBvbmNlIHRoZXkgYXJlIHN1cHBvcnRlZFxuICAgIGlmIChyZXF1aXJlZFBhcmVudGhlc2VzICYmICFib2R5LmV4dHJhPy5wYXJlbnRoZXNpemVkKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5QaXBlVW5wYXJlbnRoZXNpemVkQm9keSwge1xuICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyOiBUeXBlICdzdHJpbmcnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ1wiQXNzaWdubWVudEV4cHJlc3Npb25cIiB8IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiB8IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfCBcIllpZWxkRXhwcmVzc2lvblwiJy5cbiAgICAgICAgdHlwZTogYm9keS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy50b3BpY1JlZmVyZW5jZVdhc1VzZWRJbkN1cnJlbnRDb250ZXh0KCkpIHtcbiAgICAgIC8vIEEgSGFjayBwaXBlIGJvZHkgbXVzdCB1c2UgdGhlIHRvcGljIHJlZmVyZW5jZSBhdCBsZWFzdCBvbmNlLlxuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZVRvcGljVW51c2VkLCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIGNoZWNrRXhwb25lbnRpYWxBZnRlclVuYXJ5KFxuICAgIG5vZGU6IE4uQXdhaXRFeHByZXNzaW9uIHwgVW5kb25lPE4uVW5hcnlFeHByZXNzaW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuZXhwb25lbnQpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkVG9rZW5VbmFyeUV4cG9uZW50aWF0aW9uLCB7XG4gICAgICAgIGF0OiBub2RlLmFyZ3VtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2UgdW5hcnkgb3BlcmF0b3JzLCBib3RoIHByZWZpeCBhbmQgcG9zdGZpeC5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtVW5hcnlFeHByZXNzaW9uXG4gIHBhcnNlTWF5YmVVbmFyeShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIHNhd1VuYXJ5PzogYm9vbGVhbixcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgY29uc3QgaXNBd2FpdCA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hd2FpdCk7XG5cbiAgICBpZiAoaXNBd2FpdCAmJiB0aGlzLmlzQXdhaXRBbGxvd2VkKCkpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VBd2FpdChzdGFydExvYyk7XG4gICAgICBpZiAoIXNhd1VuYXJ5KSB0aGlzLmNoZWNrRXhwb25lbnRpYWxBZnRlclVuYXJ5KGV4cHIpO1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMubWF0Y2godHQuaW5jRGVjKTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5VbmFyeUV4cHJlc3Npb24gfCBOLlVwZGF0ZUV4cHJlc3Npb24+KCk7XG4gICAgaWYgKHRva2VuSXNQcmVmaXgodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBub2RlLnByZWZpeCA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll90aHJvdykpIHtcbiAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJ0aHJvd0V4cHJlc3Npb25zXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNEZWxldGUgPSB0aGlzLm1hdGNoKHR0Ll9kZWxldGUpO1xuICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCB0cnVlKTtcblxuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRXhwcmVzc2lvbkVycm9ycywgdHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiBpc0RlbGV0ZSkge1xuICAgICAgICBjb25zdCBhcmcgPSBub2RlLmFyZ3VtZW50O1xuXG4gICAgICAgIGlmIChhcmcudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5TdHJpY3REZWxldGUsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUoYXJnKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlbGV0ZVByaXZhdGVGaWVsZCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICBpZiAoIXNhd1VuYXJ5KSB7XG4gICAgICAgICAgdGhpcy5jaGVja0V4cG9uZW50aWFsQWZ0ZXJVbmFyeShub2RlIGFzIFVuZG9uZTxOLlVuYXJ5RXhwcmVzc2lvbj4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJVbmFyeUV4cHJlc3Npb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VVcGRhdGUoXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVzaW5nIFwiVW5kb25lXCIgbm9kZSBhcyBcImRvbmVcIlxuICAgICAgbm9kZSxcbiAgICAgIHVwZGF0ZSxcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgKTtcblxuICAgIGlmIChpc0F3YWl0KSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBzdGFydHNFeHByID0gdGhpcy5oYXNQbHVnaW4oXCJ2OGludHJpbnNpY1wiKVxuICAgICAgICA/IHRva2VuQ2FuU3RhcnRFeHByZXNzaW9uKHR5cGUpXG4gICAgICAgIDogdG9rZW5DYW5TdGFydEV4cHJlc3Npb24odHlwZSkgJiYgIXRoaXMubWF0Y2godHQubW9kdWxvKTtcbiAgICAgIGlmIChzdGFydHNFeHByICYmICF0aGlzLmlzQW1iaWd1b3VzQXdhaXQoKSkge1xuICAgICAgICB0aGlzLnJhaXNlT3ZlcndyaXRlKEVycm9ycy5Bd2FpdE5vdEluQXN5bmNDb250ZXh0LCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBd2FpdChzdGFydExvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1VcGRhdGVFeHByZXNzaW9uXG4gIHBhcnNlVXBkYXRlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBOLkV4cHJlc3Npb24sXG4gICAgdXBkYXRlOiBib29sZWFuLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFR5cGUgJ05vZGUnIGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gdHlwZSAnVW5kb25lPFVwZGF0ZUV4cHJlc3Npb24+JzogcHJlZml4LCBvcGVyYXRvciwgYXJndW1lbnRcbiAgICAgIGNvbnN0IHVwZGF0ZUV4cHJlc3Npb25Ob2RlID0gbm9kZSBhcyBVbmRvbmU8Ti5VcGRhdGVFeHByZXNzaW9uPjtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKHVwZGF0ZUV4cHJlc3Npb25Ob2RlLmFyZ3VtZW50LCB7XG4gICAgICAgIGluOiB0aGlzLmZpbmlzaE5vZGUodXBkYXRlRXhwcmVzc2lvbk5vZGUsIFwiVXBkYXRlRXhwcmVzc2lvblwiKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGxldCBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCBmYWxzZSkpIHJldHVybiBleHByO1xuICAgIHdoaWxlICh0b2tlbklzUG9zdGZpeCh0aGlzLnN0YXRlLnR5cGUpICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlVwZGF0ZUV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUub3BlcmF0b3IgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgbm9kZS5wcmVmaXggPSBmYWxzZTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBleHByO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLCB7XG4gICAgICAgIGluOiAoZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlVwZGF0ZUV4cHJlc3Npb25cIikpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLy8gUGFyc2UgY2FsbCwgZG90LCBhbmQgYFtdYC1zdWJzY3JpcHQgZXhwcmVzc2lvbnMuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUxlZnRIYW5kU2lkZUV4cHJlc3Npb25cbiAgcGFyc2VFeHByU3Vic2NyaXB0cyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlRXhwckF0b20ocmVmRXhwcmVzc2lvbkVycm9ycyk7XG5cbiAgICBpZiAodGhpcy5zaG91bGRFeGl0RGVzY2VuZGluZyhleHByLCBwb3RlbnRpYWxBcnJvd0F0KSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKGV4cHIsIHN0YXJ0TG9jKTtcbiAgfVxuXG4gIHBhcnNlU3Vic2NyaXB0cyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBub0NhbGxzPzogYm9vbGVhbiB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBvcHRpb25hbENoYWluTWVtYmVyOiBmYWxzZSxcbiAgICAgIG1heWJlQXN5bmNBcnJvdzogdGhpcy5hdFBvc3NpYmxlQXN5bmNBcnJvdyhiYXNlKSxcbiAgICAgIHN0b3A6IGZhbHNlLFxuICAgIH07XG4gICAgZG8ge1xuICAgICAgYmFzZSA9IHRoaXMucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMsIHN0YXRlKTtcblxuICAgICAgLy8gQWZ0ZXIgcGFyc2luZyBhIHN1YnNjcmlwdCwgdGhpcyBpc24ndCBcImFzeW5jXCIgZm9yIHN1cmUuXG4gICAgICBzdGF0ZS5tYXliZUFzeW5jQXJyb3cgPSBmYWxzZTtcbiAgICB9IHdoaWxlICghc3RhdGUuc3RvcCk7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHN0YXRlIFNldCAnc3RhdGUuc3RvcCA9IHRydWUnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHN0b3AgcGFyc2luZyBzdWJzY3JpcHRzLlxuICAgKiAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVtYmVyIGlzIGN1cnJlbnRseSBpbiBPcHRpb25hbENoYWluXG4gICAqL1xuICBwYXJzZVN1YnNjcmlwdChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoIW5vQ2FsbHMgJiYgdHlwZSA9PT0gdHQuZG91YmxlQ29sb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQmluZChiYXNlLCBzdGFydExvYywgbm9DYWxscywgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAodG9rZW5Jc1RlbXBsYXRlKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihiYXNlLCBzdGFydExvYywgc3RhdGUpO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25hbCA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGUgPT09IHR0LnF1ZXN0aW9uRG90KSB7XG4gICAgICBpZiAobm9DYWxscykge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5PcHRpb25hbENoYWluaW5nTm9OZXcsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXMpIHtcbiAgICAgICAgICAvLyBzdG9wIGF0IGA/LmAgd2hlbiBwYXJzaW5nIGBuZXcgYT8uKClgXG4gICAgICAgICAgc3RhdGUuc3RvcCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgPSBvcHRpb25hbCA9IHRydWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vQ2FsbHMgJiYgdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNvdmVyQ2FsbEFuZEFzeW5jQXJyb3dIZWFkKFxuICAgICAgICBiYXNlLFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmVhdCh0dC5icmFja2V0TCk7XG4gICAgICBpZiAoY29tcHV0ZWQgfHwgb3B0aW9uYWwgfHwgdGhpcy5lYXQodHQuZG90KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU1lbWJlcihiYXNlLCBzdGFydExvYywgc3RhdGUsIGNvbXB1dGVkLCBvcHRpb25hbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5zdG9wID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmFzZVs/WWllbGQsID9Bd2FpdF0gWyBFeHByZXNzaW9uWytJbiwgP1lpZWxkLCA/QXdhaXRdIF1cbiAgLy8gYmFzZVs/WWllbGQsID9Bd2FpdF0gLiBJZGVudGlmaWVyTmFtZVxuICAvLyBiYXNlWz9ZaWVsZCwgP0F3YWl0XSAuIFByaXZhdGVJZGVudGlmaWVyXG4gIC8vICAgd2hlcmUgYGJhc2VgIGlzIG9uZSBvZiBDYWxsRXhwcmVzc2lvbiwgTWVtYmVyRXhwcmVzc2lvbiBhbmQgT3B0aW9uYWxDaGFpblxuICBwYXJzZU1lbWJlcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICAgIGNvbXB1dGVkOiBib29sZWFuLFxuICAgIG9wdGlvbmFsOiBib29sZWFuLFxuICApOiBOLk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB8IE4uTWVtYmVyRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8XG4gICAgICBOLk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB8IE4uTWVtYmVyRXhwcmVzc2lvblxuICAgID4oc3RhcnRMb2MpO1xuICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICBub2RlLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpKSB7XG4gICAgICBpZiAoYmFzZS50eXBlID09PSBcIlN1cGVyXCIpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3VwZXJQcml2YXRlRmllbGQsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKHRoaXMuc3RhdGUudmFsdWUsIHRoaXMuc3RhdGUuc3RhcnRMb2MpO1xuICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIpIHtcbiAgICAgIChub2RlIGFzIE4uT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uKS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYmluZC1vcGVyYXRvciNzeW50YXhcbiAgcGFyc2VCaW5kKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIG5vQ2FsbHM6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICc6OidcbiAgICBub2RlLmNhbGxlZSA9IHRoaXMucGFyc2VOb0NhbGxFeHByKCk7XG4gICAgc3RhdGUuc3RvcCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKFxuICAgICAgdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmluZEV4cHJlc3Npb25cIiksXG4gICAgICBzdGFydExvYyxcbiAgICAgIG5vQ2FsbHMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUNvdmVyQ2FsbEV4cHJlc3Npb25BbmRBc3luY0Fycm93SGVhZFxuICAvLyBDb3ZlckNhbGxFeHByZXNzaW9uQW5kQXN5bmNBcnJvd0hlYWRcbiAgLy8gQ2FsbEV4cHJlc3Npb25bP1lpZWxkLCA/QXdhaXRdIEFyZ3VtZW50c1s/WWllbGQsID9Bd2FpdF1cbiAgLy8gT3B0aW9uYWxDaGFpbls/WWllbGQsID9Bd2FpdF0gQXJndW1lbnRzWz9ZaWVsZCwgP0F3YWl0XVxuICBwYXJzZUNvdmVyQ2FsbEFuZEFzeW5jQXJyb3dIZWFkKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgb3B0aW9uYWw6IGJvb2xlYW4sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICBsZXQgcmVmRXhwcmVzc2lvbkVycm9yczogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAoYFxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5DYWxsRXhwcmVzc2lvbiB8IE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4oXG4gICAgICBzdGFydExvYyxcbiAgICApO1xuICAgIG5vZGUuY2FsbGVlID0gYmFzZTtcbiAgICBjb25zdCB7IG1heWJlQXN5bmNBcnJvdywgb3B0aW9uYWxDaGFpbk1lbWJlciB9ID0gc3RhdGU7XG5cbiAgICBpZiAobWF5YmVBc3luY0Fycm93KSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5lbnRlcihuZXdBc3luY0Fycm93U2NvcGUoKSk7XG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uYWxDaGFpbk1lbWJlcikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB3aGVuIG9wdGlvbmFsQ2hhaW5NZW1iZXIgaXMgdHJ1ZSwgbm9kZSBtdXN0IGJlIGFuIG9wdGlvbmFsIGNhbGxcbiAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKHR0LnBhcmVuUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICB0dC5wYXJlblIsXG4gICAgICAgIGJhc2UudHlwZSA9PT0gXCJJbXBvcnRcIixcbiAgICAgICAgYmFzZS50eXBlICE9PSBcIlN1cGVyXCIsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgbm9kZSxcbiAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBmaW5pc2hlZE5vZGU6XG4gICAgICB8IE4uQ2FsbEV4cHJlc3Npb25cbiAgICAgIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uXG4gICAgICB8IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbmFsQ2hhaW5NZW1iZXIsXG4gICAgKTtcblxuICAgIGlmIChtYXliZUFzeW5jQXJyb3cgJiYgdGhpcy5zaG91bGRQYXJzZUFzeW5jQXJyb3coKSAmJiAhb3B0aW9uYWwpIHtcbiAgICAgIC8qOjogaW52YXJpYW50KHJlZkV4cHJlc3Npb25FcnJvcnMgIT0gbnVsbCkgKi9cbiAgICAgIHN0YXRlLnN0b3AgPSB0cnVlO1xuICAgICAgdGhpcy5jaGVja0Rlc3RydWN0dXJpbmdQcml2YXRlKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgICAgdGhpcy5leHByZXNzaW9uU2NvcGUudmFsaWRhdGVBc1BhdHRlcm4oKTtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmV4aXQoKTtcbiAgICAgIGZpbmlzaGVkTm9kZSA9IHRoaXMucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKFxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKSxcbiAgICAgICAgZmluaXNoZWROb2RlIGFzIE4uQ2FsbEV4cHJlc3Npb24sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF5YmVBc3luY0Fycm93KSB7XG4gICAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkV4cHJlc3Npb25FcnJvcnMsIHRydWUpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5leGl0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZEFyZ3VtZW50cyhmaW5pc2hlZE5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyA9IG9sZE1heWJlSW5BcnJvd1BhcmFtZXRlcnM7XG5cbiAgICByZXR1cm4gZmluaXNoZWROb2RlO1xuICB9XG5cbiAgdG9SZWZlcmVuY2VkQXJndW1lbnRzKFxuICAgIG5vZGU6IE4uQ2FsbEV4cHJlc3Npb24gfCBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24sXG4gICAgaXNQYXJlbnRoZXNpemVkRXhwcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAobm9kZS5hcmd1bWVudHMsIGlzUGFyZW50aGVzaXplZEV4cHIpO1xuICB9XG5cbiAgLy8gTWVtYmVyRXhwcmVzc2lvbiBbP1lpZWxkLCA/QXdhaXRdIFRlbXBsYXRlTGl0ZXJhbFs/WWllbGQsID9Bd2FpdCwgK1RhZ2dlZF1cbiAgLy8gQ2FsbEV4cHJlc3Npb24gWz9ZaWVsZCwgP0F3YWl0XSBUZW1wbGF0ZUxpdGVyYWxbP1lpZWxkLCA/QXdhaXQsICtUYWdnZWRdXG4gIHBhcnNlVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICk6IE4uVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgIG5vZGUudGFnID0gYmFzZTtcbiAgICBub2RlLnF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlKHRydWUpO1xuICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5PcHRpb25hbENoYWluaW5nTm9UZW1wbGF0ZSwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIik7XG4gIH1cblxuICBhdFBvc3NpYmxlQXN5bmNBcnJvdyhiYXNlOiBOLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgIHRoaXMuc3RhdGUubGFzdFRva0VuZExvYy5pbmRleCA9PT0gYmFzZS5lbmQgJiZcbiAgICAgICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpICYmXG4gICAgICAvLyBjaGVjayB0aGVyZSBhcmUgbm8gZXNjYXBlIHNlcXVlbmNlcywgc3VjaCBhcyBcXHV7NjF9c3luY1xuICAgICAgYmFzZS5lbmQgLSBiYXNlLnN0YXJ0ID09PSA1ICYmXG4gICAgICBiYXNlLnN0YXJ0ID09PSB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXRcbiAgICApO1xuICB9XG5cbiAgZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpIHtcbiAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJpbXBvcnRBdHRyaWJ1dGVzXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaENhbGxFeHByZXNzaW9uPFQgZXh0ZW5kcyBOLkNhbGxFeHByZXNzaW9uIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uPihcbiAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgb3B0aW9uYWw6IGJvb2xlYW4sXG4gICk6IFQge1xuICAgIGlmIChub2RlLmNhbGxlZS50eXBlID09PSBcIkltcG9ydFwiKSB7XG4gICAgICBpZiAobm9kZS5hcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RJbXBvcnRBdHRyaWJ1dGVzUGx1Z2luKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBub2RlLmFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxBcml0eSwge1xuICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgIG1heEFyZ3VtZW50Q291bnQ6XG4gICAgICAgICAgICB0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgfHxcbiAgICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSB8fFxuICAgICAgICAgICAgdGhpcy5oYXNQbHVnaW4oXCJtb2R1bGVBdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDEsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygbm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICBpZiAoYXJnLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRDYWxsU3ByZWFkQXJndW1lbnQsIHsgYXQ6IGFyZyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgIG5vZGUsXG4gICAgICBvcHRpb25hbCA/IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiIDogXCJDYWxsRXhwcmVzc2lvblwiLFxuICAgICk7XG4gIH1cblxuICBwYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGR5bmFtaWNJbXBvcnQ/OiBib29sZWFuLFxuICAgIGFsbG93UGxhY2Vob2xkZXI/OiBib29sZWFuLFxuICAgIG5vZGVGb3JFeHRyYT86IE4uTm9kZSB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBBcnJheTxOLkV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgY29uc3QgZWx0czogTi5FeHByZXNzaW9uW10gPSBbXTtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoIXRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKGNsb3NlKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGR5bmFtaWNJbXBvcnQgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcImltcG9ydEFzc2VydGlvbnNcIikgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxBcmd1bWVudFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChub2RlRm9yRXh0cmEpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkVHJhaWxpbmdDb21tYUV4dHJhVG9Ob2RlKG5vZGVGb3JFeHRyYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVsdHMucHVzaChcbiAgICAgICAgdGhpcy5wYXJzZUV4cHJMaXN0SXRlbShmYWxzZSwgcmVmRXhwcmVzc2lvbkVycm9ycywgYWxsb3dQbGFjZWhvbGRlciksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcblxuICAgIHJldHVybiBlbHRzO1xuICB9XG5cbiAgc2hvdWxkUGFyc2VBc3luY0Fycm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmFycm93KSAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKTtcbiAgfVxuXG4gIHBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgIGNhbGw6IE4uQ2FsbEV4cHJlc3Npb24sXG4gICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGNhbGwpO1xuICAgIHRoaXMuZXhwZWN0KHR0LmFycm93KTtcbiAgICB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKFxuICAgICAgbm9kZSxcbiAgICAgIGNhbGwuYXJndW1lbnRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNhbGwuZXh0cmE/LnRyYWlsaW5nQ29tbWFMb2MsXG4gICAgKTtcbiAgICAvLyBtYXJrIGlubmVyIGNvbW1lbnRzIG9mIGBhc3luYygpYCBhcyBpbm5lciBjb21tZW50cyBvZiBgYXN5bmMgKCkgPT5gXG4gICAgaWYgKGNhbGwuaW5uZXJDb21tZW50cykge1xuICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjYWxsLmlubmVyQ29tbWVudHMpO1xuICAgIH1cbiAgICAvLyBtYXJrIHRyYWlsaW5nIGNvbW1lbnRzIG9mIGBhc3luY2AgdG8gYmUgaW5uZXIgY29tbWVudHNcbiAgICBpZiAoY2FsbC5jYWxsZWUudHJhaWxpbmdDb21tZW50cykge1xuICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjYWxsLmNhbGxlZS50cmFpbGluZ0NvbW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUgYXMgTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgbm8tY2FsbCBleHByZXNzaW9uIChsaWtlIGFyZ3VtZW50IG9mIGBuZXdgIG9yIGA6OmAgb3BlcmF0b3JzKS5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTWVtYmVyRXhwcmVzc2lvblxuICBwYXJzZU5vQ2FsbEV4cHIodGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMucGFyc2VFeHByQXRvbSgpLCBzdGFydExvYywgdHJ1ZSk7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBhdG9taWMgZXhwcmVzc2lvbiBcdTIwMTQgZWl0aGVyIGEgc2luZ2xlIHRva2VuIHRoYXQgaXMgYW5cbiAgLy8gZXhwcmVzc2lvbiwgYW4gZXhwcmVzc2lvbiBzdGFydGVkIGJ5IGEga2V5d29yZCBsaWtlIGBmdW5jdGlvbmAgb3JcbiAgLy8gYG5ld2AsIG9yIGFuIGV4cHJlc3Npb24gd3JhcHBlZCBpbiBwdW5jdHVhdGlvbiBsaWtlIGAoKWAsIGBbXWAsXG4gIC8vIG9yIGB7fWAuXG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtUHJpbWFyeUV4cHJlc3Npb25cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNBcnJvd0Z1bmN0aW9uXG4gIC8vIFByaW1hcnlFeHByZXNzaW9uXG4gIC8vIFN1cGVyXG4gIC8vIEltcG9ydFxuICAvLyBBc3luY0Fycm93RnVuY3Rpb25cblxuICBwYXJzZUV4cHJBdG9tKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgdHQuX3N1cGVyOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN1cGVyKCk7XG5cbiAgICAgIGNhc2UgdHQuX2ltcG9ydDpcbiAgICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uTWV0YVByb3BlcnR5IHwgTi5JbXBvcnQ+KCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmRvdCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydE1ldGFQcm9wZXJ0eShub2RlIGFzIFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZEltcG9ydCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnRcIik7XG4gICAgICBjYXNlIHR0Ll90aGlzOlxuICAgICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaGlzRXhwcmVzc2lvblwiKTtcblxuICAgICAgY2FzZSB0dC5fZG86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEbyh0aGlzLnN0YXJ0Tm9kZSgpLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuc2xhc2g6XG4gICAgICBjYXNlIHR0LnNsYXNoQXNzaWduOiB7XG4gICAgICAgIHRoaXMucmVhZFJlZ2V4cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlZ0V4cExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQubnVtOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWVyaWNMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuXG4gICAgICBjYXNlIHR0LmJpZ2ludDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCaWdJbnRMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuXG4gICAgICBjYXNlIHR0LmRlY2ltYWw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjaW1hbExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG5cbiAgICAgIGNhc2UgdHQuc3RyaW5nOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG5cbiAgICAgIGNhc2UgdHQuX251bGw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVsbExpdGVyYWwoKTtcblxuICAgICAgY2FzZSB0dC5fdHJ1ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuTGl0ZXJhbCh0cnVlKTtcbiAgICAgIGNhc2UgdHQuX2ZhbHNlOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW5MaXRlcmFsKGZhbHNlKTtcblxuICAgICAgY2FzZSB0dC5wYXJlbkw6IHtcbiAgICAgICAgY29uc3QgY2FuQmVBcnJvdyA9IHRoaXMuc3RhdGUucG90ZW50aWFsQXJyb3dBdCA9PT0gdGhpcy5zdGF0ZS5zdGFydDtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSB0dC5icmFja2V0QmFyTDpcbiAgICAgIGNhc2UgdHQuYnJhY2tldEhhc2hMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXlMaWtlKFxuICAgICAgICAgIHRoaXMuc3RhdGUudHlwZSA9PT0gdHQuYnJhY2tldEJhckwgPyB0dC5icmFja2V0QmFyUiA6IHR0LmJyYWNrZXRSLFxuICAgICAgICAgIC8qIGNhbkJlUGF0dGVybiAqLyBmYWxzZSxcbiAgICAgICAgICAvKiBpc1R1cGxlICovIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIHR0LmJyYWNrZXRMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXlMaWtlKFxuICAgICAgICAgIHR0LmJyYWNrZXRSLFxuICAgICAgICAgIC8qIGNhbkJlUGF0dGVybiAqLyB0cnVlLFxuICAgICAgICAgIC8qIGlzVHVwbGUgKi8gZmFsc2UsXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdHQuYnJhY2VCYXJMOlxuICAgICAgY2FzZSB0dC5icmFjZUhhc2hMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqZWN0TGlrZShcbiAgICAgICAgICB0aGlzLnN0YXRlLnR5cGUgPT09IHR0LmJyYWNlQmFyTCA/IHR0LmJyYWNlQmFyUiA6IHR0LmJyYWNlUixcbiAgICAgICAgICAvKiBpc1BhdHRlcm4gKi8gZmFsc2UsXG4gICAgICAgICAgLyogaXNSZWNvcmQgKi8gdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdHQuYnJhY2VMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqZWN0TGlrZShcbiAgICAgICAgICB0dC5icmFjZVIsXG4gICAgICAgICAgLyogaXNQYXR0ZXJuICovIGZhbHNlLFxuICAgICAgICAgIC8qIGlzUmVjb3JkICovIGZhbHNlLFxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIHR0Ll9mdW5jdGlvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbk9yRnVuY3Rpb25TZW50KCk7XG5cbiAgICAgIGNhc2UgdHQuYXQ6XG4gICAgICAgIGRlY29yYXRvcnMgPSB0aGlzLnBhcnNlRGVjb3JhdG9ycygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgICBjYXNlIHR0Ll9jbGFzczpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyhcbiAgICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgdGhpcy5zdGFydE5vZGUoKSksXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgdHQuX25ldzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOZXdPck5ld1RhcmdldCgpO1xuXG4gICAgICBjYXNlIHR0LnRlbXBsYXRlTm9uVGFpbDpcbiAgICAgIGNhc2UgdHQudGVtcGxhdGVUYWlsOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRlbXBsYXRlKGZhbHNlKTtcblxuICAgICAgLy8gQmluZEV4cHJlc3Npb25bWWllbGRdXG4gICAgICAvLyAgIDo6IE1lbWJlckV4cHJlc3Npb25bP1lpZWxkXVxuICAgICAgY2FzZSB0dC5kb3VibGVDb2xvbjoge1xuICAgICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIG5vZGUub2JqZWN0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgY2FsbGVlID0gKG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZU5vQ2FsbEV4cHIoKSk7XG4gICAgICAgIGlmIChjYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmluZEV4cHJlc3Npb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRCaW5kLCB7IGF0OiBjYWxsZWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSB0dC5wcml2YXRlTmFtZToge1xuICAgICAgICAvLyBTdGFuZGFsb25lIHByaXZhdGUgbmFtZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBcIiN4IGluIG9ialwiXG4gICAgICAgIC8vIGV4cHJlc3Npb25zLCBhbmQgdGhleSBhcmUgZGlyZWN0bHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mXG4gICAgICAgIC8vIHBhcnNlRXhwck9wLiBJZiB3ZSByZWFjaCB0aGlzLCB0aGUgaW5wdXQgaXMgYWx3YXlzIGludmFsaWQuXG4gICAgICAgIC8vIFdlIGNhbiB0aHJvdyBhIGJldHRlciBlcnJvciBtZXNzYWdlIGFuZCByZWNvdmVyLCByYXRoZXIgdGhhblxuICAgICAgICAvLyBqdXN0IHRocm93aW5nIFwiVW5leHBlY3RlZCB0b2tlblwiICh3aGljaCBpcyB0aGUgZGVmYXVsdFxuICAgICAgICAvLyBiZWhhdmlvciBvZiB0aGlzIGJpZyBzd2l0Y2ggc3RhdGVtZW50KS5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUHJpdmF0ZUluRXhwZWN0ZWRJbiwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIGlkZW50aWZpZXJOYW1lOiB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIHR0Lm1vZHVsb0Fzc2lnbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRvcGljUmVmZXJlbmNlVGhlbkVxdWFsc1NpZ24odHQubW9kdWxvLCBcIiVcIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQueG9yQXNzaWduOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2VUaGVuRXF1YWxzU2lnbih0dC5iaXR3aXNlWE9SLCBcIl5cIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuZG91YmxlQ2FyZXQ6XG4gICAgICBjYXNlIHR0LmRvdWJsZUF0OiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2UoXCJoYWNrXCIpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIHR0LmJpdHdpc2VYT1I6XG4gICAgICBjYXNlIHR0Lm1vZHVsbzpcbiAgICAgIGNhc2UgdHQuaGFzaDoge1xuICAgICAgICBjb25zdCBwaXBlUHJvcG9zYWwgPSB0aGlzLmdldFBsdWdpbk9wdGlvbihcbiAgICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgICBcInByb3Bvc2FsXCIsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBpcGVQcm9wb3NhbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2UocGlwZVByb3Bvc2FsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQubHQ6IHtcbiAgICAgICAgY29uc3QgbG9va2FoZWFkQ2ggPSB0aGlzLmlucHV0LmNvZGVQb2ludEF0KHRoaXMubmV4dFRva2VuU3RhcnQoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0lkZW50aWZpZXJTdGFydChsb29rYWhlYWRDaCkgfHwgLy8gRWxlbWVudC9UeXBlIFBhcmFtZXRlciA8Zm9vPlxuICAgICAgICAgIGxvb2thaGVhZENoID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gLy8gRnJhZ21lbnQgPD5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RPbmVQbHVnaW4oW1wianN4XCIsIFwiZmxvd1wiLCBcInR5cGVzY3JpcHRcIl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5fbW9kdWxlKSAmJlxuICAgICAgICAgICAgdGhpcy5sb29rYWhlYWRJbkxpbmVDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTW9kdWxlRXhwcmVzc2lvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjYW5CZUFycm93ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0ID09PSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5zRXNjID0gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY29udGFpbnNFc2MgJiZcbiAgICAgICAgICAgIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJlxuICAgICAgICAgICAgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSB0dC5fZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoaWQpO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShpZCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuSXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGJlZ2lucyB3aXRoIFwiPVwiLCBjb21taXQgdG8gcGFyc2luZyBhbiBhc3luY1xuICAgICAgICAgICAgICAvLyBhcnJvdyBmdW5jdGlvbi4gKFBlZWtpbmcgYWhlYWQgZm9yIFwiPVwiIGxldHMgdXMgYXZvaWQgYSBtb3JlXG4gICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBmdWxsLXRva2VuIGxvb2thaGVhZCBvbiB0aGlzIGNvbW1vbiBwYXRoLilcbiAgICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0aG91Z2ggYGlkYCBpcyBub3QgdXNlZCBpbiBhc3luYyBhcnJvdyB1bmFyeSBmdW5jdGlvbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHJlc2V0IGBhc3luY2AncyB0cmFpbGluZyBjb21tZW50cyBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgdXBjb21pbmcgYXN5bmMgYXJyb3cgYmluZGluZyBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBc3luY0Fycm93VW5hcnlGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXROb2RlKGlkKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdHJlYXQgXCJhc3luY1wiIGFzIGFuIGlkZW50aWZpZXIgYW5kIGxldCBjYWxsaW5nIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggdGhlIGN1cnJlbnQgdHQubmFtZSB0b2tlbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQuX2RvKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGlkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEbyh0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShpZCksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNhbkJlQXJyb3cgJiZcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuYXJyb3cpICYmXG4gICAgICAgICAgICAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgdGhpcy5zdGFydE5vZGVBdE5vZGUoaWQpLFxuICAgICAgICAgICAgICBbaWRdLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBoZWxwZXIgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZFxuICAvLyB3aGVuIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQgYSBwb3RlbnRpYWwgSGFjayBwaXBlIHRvcGljIHRva2VuXG4gIC8vIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gZXF1YWxzIHNpZ24uXG4gIC8vIFNlZSA8aHR0cHM6Ly9naXRodWIuY29tL2pzLWNob2kvcHJvcG9zYWwtaGFjay1waXBlcz4uXG4gIC8vIElmIHdlIGZpbmQgXj0gb3IgJT0gaW4gYW4gZXhwcmVzc2lvbiBwb3NpdGlvblxuICAvLyAoaS5lLiwgdGhlIHR0Lm1vZHVsb0Fzc2lnbiBvciB0dC54b3JBc3NpZ24gdG9rZW4gdHlwZXMpLCBhbmQgaWYgdGhlXG4gIC8vIEhhY2stcGlwZXMgcHJvcG9zYWwgaXMgYWN0aXZlIHdpdGggXiBvciAlIGFzIGl0cyB0b3BpY1Rva2VuLCB0aGVuIHRoZSBeIG9yXG4gIC8vICUgY291bGQgYmUgdGhlIHRvcGljIHRva2VuIChlLmcuLCBpbiB4IHw+IF49PXkgb3IgeCB8PiBePT09eSksIGFuZCBzbyB3ZVxuICAvLyByZXBhcnNlIHRoZSBjdXJyZW50IHRva2VuIGFzIF4gb3IgJS5cbiAgLy8gT3RoZXJ3aXNlLCB0aGlzIHRocm93cyBhbiB1bmV4cGVjdGVkLXRva2VuIGVycm9yLlxuICBwYXJzZVRvcGljUmVmZXJlbmNlVGhlbkVxdWFsc1NpZ24oXG4gICAgdG9waWNUb2tlblR5cGU6IFRva2VuVHlwZSxcbiAgICB0b3BpY1Rva2VuVmFsdWU6IHN0cmluZyxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBwaXBlUHJvcG9zYWwgPSB0aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIiwgXCJwcm9wb3NhbFwiKTtcblxuICAgIGlmIChwaXBlUHJvcG9zYWwpIHtcbiAgICAgIC8vIFNldCB0aGUgbW9zdC1yZWNlbnQgdG9rZW4gdG8gYmUgYSB0b3BpYyB0b2tlblxuICAgICAgLy8gZ2l2ZW4gYnkgdGhlIHRva2VuVHlwZSBhbmQgdG9rZW5WYWx1ZS5cbiAgICAgIC8vIE5vdyB0aGUgbmV4dCByZWFkVG9rZW4oKSBjYWxsIChpbiBwYXJzZVRvcGljUmVmZXJlbmNlKVxuICAgICAgLy8gd2lsbCBjb25zdW1lIHRoYXQgXHUyMDFDdG9waWMgdG9rZW5cdTIwMUQuXG4gICAgICB0aGlzLnN0YXRlLnR5cGUgPSB0b3BpY1Rva2VuVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUudmFsdWUgPSB0b3BpY1Rva2VuVmFsdWU7XG4gICAgICAvLyBSZXdpbmQgdGhlIHRva2VuaXplciB0byB0aGUgZW5kIG9mIHRoZSBcdTIwMUN0b3BpYyB0b2tlblx1MjAxRCwgc28gdGhhdCB0aGVcbiAgICAgIC8vIGZvbGxvd2luZyB0b2tlbiBzdGFydHMgYXQgdGhlIGVxdWFscyBzaWduIGFmdGVyIHRoYXQgdG9waWMgdG9rZW4uXG4gICAgICB0aGlzLnN0YXRlLnBvcy0tO1xuICAgICAgdGhpcy5zdGF0ZS5lbmQtLTtcbiAgICAgIC8vIFRoaXMgaXMgc2FmZSB0byBkbyBzaW5jZSB0aGUgcHJlY2VkaW5nIGNoYXJhY3RlciB3YXMgZWl0aGVyIF4gb3IgJSwgYW5kXG4gICAgICAvLyB0aHVzIG5vdCBhIG5ld2xpbmUuXG4gICAgICB0aGlzLnN0YXRlLmVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldCh0aGlzLnN0YXRlLmVuZExvYywgLTEpO1xuICAgICAgLy8gTm93IGFjdHVhbGx5IGNvbnN1bWUgdGhlIHRvcGljIHRva2VuLlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb3BpY1JlZmVyZW5jZShwaXBlUHJvcG9zYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkXG4gIC8vIHdoZW4gdGhlIHByb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yIHBsdWdpbiBpcyBhY3RpdmUsXG4gIC8vIGFuZCB3aGVuIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQgYSBwb3RlbnRpYWwgSGFjayBwaXBlIHRvcGljIHRva2VuLlxuICAvLyBBbHRob3VnaCBhIHBpcGUtb3BlcmF0b3IgcHJvcG9zYWwgaXMgYXNzdW1lZCB0byBiZSBhY3RpdmUsXG4gIC8vIGl0cyBjb25maWd1cmF0aW9uIG1pZ2h0IG5vdCBtYXRjaCB0aGUgY3VycmVudCB0b2tlblx1MjAxOXMgdHlwZS5cbiAgLy8gU2VlIDxodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzPi5cbiAgcGFyc2VUb3BpY1JlZmVyZW5jZShwaXBlUHJvcG9zYWw6IHN0cmluZyk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVG9waWNSZWZlcmVuY2U+KCk7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMuc3RhdGUudHlwZTtcblxuICAgIC8vIENvbnN1bWUgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICAvLyBJZiB0aGUgcGlwZS1vcGVyYXRvciBwbHVnaW5cdTIwMTlzIGNvbmZpZ3VyYXRpb24gbWF0Y2hlcyB0aGUgY3VycmVudCB0b2tlblx1MjAxOXMgdHlwZSxcbiAgICAvLyB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYG5vZGVgLCB3aWxsIGhhdmUgYmVlbiBmaW5pc2hlZCBhcyBhIHRvcGljIHJlZmVyZW5jZS5cbiAgICAvLyBPdGhlcndpc2UsIHRoaXMgd2lsbCB0aHJvdyBhIGBQaXBlVG9waWNVbmNvbmZpZ3VyZWRUb2tlbmAgZXJyb3IuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9waWNSZWZlcmVuY2Uobm9kZSwgc3RhcnRMb2MsIHBpcGVQcm9wb3NhbCwgdG9rZW5UeXBlKTtcbiAgfVxuXG4gIC8vIFRoaXMgaGVscGVyIG1ldGhvZCBhdHRlbXB0cyB0byBmaW5pc2ggdGhlIGdpdmVuIGBub2RlYFxuICAvLyBpbnRvIGEgdG9waWMtcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBnaXZlbiBgcGlwZVByb3Bvc2FsYC5cbiAgLy8gU2VlIDxodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzPi5cbiAgLy9cbiAgLy8gVGhlIG1ldGhvZCBhc3N1bWVzIHRoYXQgYW55IHRvcGljIHRva2VuIHdhcyBjb25zdW1lZCBiZWZvcmUgaXQgd2FzIGNhbGxlZC5cbiAgLy9cbiAgLy8gSWYgdGhlIGBwaXBlbGluZU9wZXJhdG9yYCBwbHVnaW4gaXMgYWN0aXZlLFxuICAvLyBhbmQgaWYgdGhlIGdpdmVuIGB0b2tlblR5cGVgIG1hdGNoZXMgdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbixcbiAgLy8gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZmluaXNoZWQgYG5vZGVgLlxuICAvL1xuICAvLyBJZiB0aGUgYHBpcGVsaW5lT3BlcmF0b3JgIHBsdWdpbiBpcyBhY3RpdmUsXG4gIC8vIGJ1dCBpZiB0aGUgZ2l2ZW4gYHRva2VuVHlwZWAgZG9lcyBub3QgbWF0Y2ggdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbixcbiAgLy8gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGEgYFBpcGVUb3BpY1VuY29uZmlndXJlZFRva2VuYCBlcnJvci5cbiAgZmluaXNoVG9waWNSZWZlcmVuY2UoXG4gICAgbm9kZTogVW5kb25lPE4uTm9kZT4sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHBpcGVQcm9wb3NhbDogc3RyaW5nLFxuICAgIHRva2VuVHlwZTogVG9rZW5UeXBlLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmIChcbiAgICAgIHRoaXMudGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbihwaXBlUHJvcG9zYWwsIHN0YXJ0TG9jLCB0b2tlblR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBUaGUgdG9rZW4gbWF0Y2hlcyB0aGUgcGx1Z2luXHUyMDE5cyBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gVGhlIHRva2VuIGlzIHRoZXJlZm9yZSBhIHRvcGljIHJlZmVyZW5jZS5cblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub2RlIHR5cGUgZm9yIHRoZSB0b3BpYyByZWZlcmVuY2VcbiAgICAgIC8vIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBhY3RpdmUgcGlwZS1vcGVyYXRvciBwcm9wb3NhbC5cbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgcGlwZVByb3Bvc2FsID09PSBcInNtYXJ0XCJcbiAgICAgICAgICA/IFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIlxuICAgICAgICAgIDogLy8gVGhlIHByb3Bvc2FsIG11c3Qgb3RoZXJ3aXNlIGJlIFwiaGFja1wiLFxuICAgICAgICAgICAgLy8gYXMgZW5mb3JjZWQgYnkgdGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgIFwiVG9waWNSZWZlcmVuY2VcIjtcblxuICAgICAgaWYgKCF0aGlzLnRvcGljUmVmZXJlbmNlSXNBbGxvd2VkSW5DdXJyZW50Q29udGV4dCgpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgLy8gVGhlIHRvcGljIHJlZmVyZW5jZSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0OlxuICAgICAgICAgIC8vIGl0IGlzIG91dHNpZGUgb2YgYSBwaXBlIGJvZHkuXG4gICAgICAgICAgLy8gUmFpc2UgcmVjb3ZlcmFibGUgZXJyb3JzLlxuICAgICAgICAgIHBpcGVQcm9wb3NhbCA9PT0gXCJzbWFydFwiXG4gICAgICAgICAgICA/IEVycm9ycy5QcmltYXJ5VG9waWNOb3RBbGxvd2VkXG4gICAgICAgICAgICA6IC8vIEluIHRoaXMgY2FzZSwgYHBpcGVQcm9wb3NhbCA9PT0gXCJoYWNrXCJgIGlzIHRydWUuXG4gICAgICAgICAgICAgIEVycm9ycy5QaXBlVG9waWNVbmJvdW5kLFxuICAgICAgICAgIHsgYXQ6IHN0YXJ0TG9jIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSB0b3BpYyByZWZlcmVuY2Ugc28gdGhhdCBpdHMgcGlwZSBib2R5IGtub3dzXG4gICAgICAvLyB0aGF0IGl0cyB0b3BpYyB3YXMgdXNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgdGhpcy5yZWdpc3RlclRvcGljUmVmZXJlbmNlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgbm9kZVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgdG9rZW4gZG9lcyBub3QgbWF0Y2ggdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbi5cbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlBpcGVUb3BpY1VuY29uZmlndXJlZFRva2VuLCB7XG4gICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAgdG9rZW46IHRva2VuTGFiZWxOYW1lKHRva2VuVHlwZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgdGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gdG9rZW4gdHlwZVxuICAvLyBtYXRjaGVzIHRoZSBwaXBlbGluZU9wZXJhdG9yIHBhcnNlciBwbHVnaW5cdTIwMTlzIGNvbmZpZ3VyYXRpb24uXG4gIC8vIElmIHRoZSBhY3RpdmUgcGlwZSBwcm9wb3NhbCBpcyBIYWNrIHN0eWxlLFxuICAvLyBhbmQgaWYgdGhlIGdpdmVuIHRva2VuIGlzIHRoZSBzYW1lIGFzIHRoZSBwbHVnaW4gY29uZmlndXJhdGlvblx1MjAxOXMgYHRvcGljVG9rZW5gLFxuICAvLyB0aGVuIHRoaXMgaXMgYSB2YWxpZCB0b3BpYyByZWZlcmVuY2UuXG4gIC8vIElmIHRoZSBhY3RpdmUgcGlwZSBwcm9wb3NhbCBpcyBzbWFydCBtaXgsXG4gIC8vIHRoZW4gdGhlIHRvcGljIHRva2VuIG11c3QgYWx3YXlzIGJlIGAjYC5cbiAgLy8gSWYgdGhlIGFjdGl2ZSBwaXBlIHByb3Bvc2FsIGlzIG5laXRoZXIgKGUuZy4sIFwibWluaW1hbFwiIG9yIFwiZnNoYXJwXCIpLFxuICAvLyB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cbiAgdGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbihcbiAgICBwaXBlUHJvcG9zYWw6IHN0cmluZyxcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgdG9rZW5UeXBlOiBUb2tlblR5cGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocGlwZVByb3Bvc2FsKSB7XG4gICAgICBjYXNlIFwiaGFja1wiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BsdWdpbihbXG4gICAgICAgICAgXCJwaXBlbGluZU9wZXJhdG9yXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2tlbiBtdXN0IGhhdmUgYSBsYWJlbFxuICAgICAgICAgICAgdG9waWNUb2tlbjogdG9rZW5MYWJlbE5hbWUodG9rZW5UeXBlKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzbWFydFwiOlxuICAgICAgICByZXR1cm4gdG9rZW5UeXBlID09PSB0dC5oYXNoO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuUGlwZVRvcGljUmVxdWlyZXNIYWNrUGlwZXMsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBBc3luY0Fycm93QmluZGluZ0lkZW50aWZpZXJbP1lpZWxkXSBbbm8gTGluZVRlcm1pbmF0b3IgaGVyZV0gPT4gQXN5bmNDb25jaXNlQm9keVs/SW5dXG4gIHBhcnNlQXN5bmNBcnJvd1VuYXJ5RnVuY3Rpb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBwdXNoIGEgbmV3IFBhcmFtZXRlckRlY2xhcmF0aW9uU2NvcGUgaGVyZSBzaW5jZSB3ZSBhcmUgc3VyZVxuICAgIC8vIDEpIGl0IGlzIGFuIGFzeW5jIGFycm93LCAyKSBubyBiaWRpbmcgcGF0dGVybiBpcyBhbGxvd2VkIGluIHBhcmFtc1xuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZ1bmN0aW9uRmxhZ3ModHJ1ZSwgdGhpcy5wcm9kUGFyYW0uaGFzWWllbGQpKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbdGhpcy5wYXJzZUlkZW50aWZpZXIoKV07XG4gICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5MaW5lVGVybWluYXRvckJlZm9yZUFycm93LCB7XG4gICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5leHBlY3QodHQuYXJyb3cpO1xuICAgIC8vIGxldCBmb28gPSBhc3luYyBiYXIgPT4ge307XG4gICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24obm9kZSwgcGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWRvLWV4cHJlc3Npb25zXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFzeW5jLWRvLWV4cHJlc3Npb25zXG4gIHBhcnNlRG8oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkRvRXhwcmVzc2lvbj4sXG4gICAgaXNBc3luYzogYm9vbGVhbixcbiAgKTogTi5Eb0V4cHJlc3Npb24ge1xuICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZG9FeHByZXNzaW9uc1wiKTtcbiAgICBpZiAoaXNBc3luYykge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJhc3luY0RvRXhwcmVzc2lvbnNcIik7XG4gICAgfVxuICAgIG5vZGUuYXN5bmMgPSBpc0FzeW5jO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGRvYFxuICAgIGNvbnN0IG9sZExhYmVscyA9IHRoaXMuc3RhdGUubGFiZWxzO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzID0gW107XG4gICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgIC8vIEFzeW5jRG9FeHByZXNzaW9uIDpcbiAgICAgIC8vIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBkbyBCbG9ja1t+WWllbGQsICtBd2FpdCwgflJldHVybl1cbiAgICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKFBBUkFNX0FXQUlUKTtcbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VCbG9jaygpO1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IG9sZExhYmVscztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRG9FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gUGFyc2UgdGhlIGBzdXBlcmAga2V5d29yZFxuICBwYXJzZVN1cGVyKCk6IE4uU3VwZXIge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlN1cGVyPigpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHN1cGVyYFxuICAgIGlmIChcbiAgICAgIHRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgIXRoaXMuc2NvcGUuYWxsb3dEaXJlY3RTdXBlciAmJlxuICAgICAgIXRoaXMub3B0aW9ucy5hbGxvd1N1cGVyT3V0c2lkZU1ldGhvZFxuICAgICkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3VwZXJOb3RBbGxvd2VkLCB7IGF0OiBub2RlIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5zY29wZS5hbGxvd1N1cGVyICYmXG4gICAgICAhdGhpcy5vcHRpb25zLmFsbG93U3VwZXJPdXRzaWRlTWV0aG9kXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkU3VwZXIsIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIXRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgIXRoaXMubWF0Y2godHQuYnJhY2tldEwpICYmXG4gICAgICAhdGhpcy5tYXRjaCh0dC5kb3QpXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZFN1cGVyLCB7IGF0OiBub2RlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTdXBlclwiKTtcbiAgfVxuXG4gIHBhcnNlUHJpdmF0ZU5hbWUoKTogTi5Qcml2YXRlTmFtZSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uUHJpdmF0ZU5hbWU+KCk7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uSWRlbnRpZmllcj4oXG4gICAgICAvLyBUaGUgcG9zaXRpb24gaXMgaGFyZGNvZGVkIGJlY2F1c2Ugd2UgbWVyZ2UgYCNgIGFuZCBuYW1lIGludG8gYSBzaW5nbGVcbiAgICAgIC8vIHR0LnByaXZhdGVOYW1lIHRva2VuXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5zdGFydExvYywgMSksXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICNuYW1lO1xuICAgIG5vZGUuaWQgPSB0aGlzLmNyZWF0ZUlkZW50aWZpZXIoaWQsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJQcml2YXRlTmFtZVwiKTtcbiAgfVxuXG4gIHBhcnNlRnVuY3Rpb25PckZ1bmN0aW9uU2VudChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICk6IE4uRnVuY3Rpb25FeHByZXNzaW9uIHwgTi5NZXRhUHJvcGVydHkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkZ1bmN0aW9uRXhwcmVzc2lvbiB8IE4uTWV0YVByb3BlcnR5PigpO1xuXG4gICAgLy8gV2UgZG8gbm90IGRvIHBhcnNlSWRlbnRpZmllciBoZXJlIGJlY2F1c2Ugd2hlbiBwYXJzZUZ1bmN0aW9uT3JGdW5jdGlvblNlbnRcbiAgICAvLyBpcyBjYWxsZWQgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBcIm5hbWVcIiB3aXRoIHRoZSB2YWx1ZSBcImZ1bmN0aW9uXCJcbiAgICAvLyBUaGlzIHdpbGwgaW1wcm92ZSBwZXJmIGEgdGlueSBsaXR0bGUgYml0IGFzIHdlIGRvIG5vdCBkbyB2YWxpZGF0aW9uIGJ1dCBtb3JlIGltcG9ydGFudGx5XG4gICAgLy8gaGVyZSBpcyB0aGF0IHBhcnNlSWRlbnRpZmllciB3aWxsIHJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGV4cHJlc3Npb24gc3RhY2tcbiAgICAvLyBpZiBcImZ1bmN0aW9uXCIgb3IgXCJjbGFzc1wiIGlzIHBhcnNlZCBhcyBpZGVudGlmaWVyIChpbiBvYmplY3RzIGUuZy4pLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbiBoZXJlLlxuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGZ1bmN0aW9uYFxuXG4gICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkICYmIHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihcbiAgICAgICAgdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5JZGVudGlmaWVyPihub2RlKSxcbiAgICAgICAgXCJmdW5jdGlvblwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYC5gXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1mdW5jdGlvbi5zZW50I3N5bnRheC0xXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fc2VudCkpIHtcbiAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJmdW5jdGlvblNlbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmhhc1BsdWdpbihcImZ1bmN0aW9uU2VudFwiKSkge1xuICAgICAgICAvLyBUaGUgY29kZSB3YXNuJ3QgYGZ1bmN0aW9uLnNlbnRgIGJ1dCBqdXN0IGBmdW5jdGlvbi5gLCBzbyBhIHNpbXBsZSBlcnJvciBpcyBsZXNzIGNvbmZ1c2luZy5cbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZU1ldGFQcm9wZXJ0eShcbiAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5NZXRhUHJvcGVydHk+LFxuICAgICAgICBtZXRhLFxuICAgICAgICBcInNlbnRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSBhcyBVbmRvbmU8Ti5GdW5jdGlvbkV4cHJlc3Npb24+KTtcbiAgfVxuXG4gIHBhcnNlTWV0YVByb3BlcnR5KFxuICAgIG5vZGU6IFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4sXG4gICAgbWV0YTogTi5JZGVudGlmaWVyLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICApOiBOLk1ldGFQcm9wZXJ0eSB7XG4gICAgbm9kZS5tZXRhID0gbWV0YTtcblxuICAgIGNvbnN0IGNvbnRhaW5zRXNjID0gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcblxuICAgIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcblxuICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IHByb3BlcnR5TmFtZSB8fCBjb250YWluc0VzYykge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRNZXRhUHJvcGVydHksIHtcbiAgICAgICAgYXQ6IG5vZGUucHJvcGVydHksXG4gICAgICAgIHRhcmdldDogbWV0YS5uYW1lLFxuICAgICAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZXRhUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1JbXBvcnRNZXRhXG4gIHBhcnNlSW1wb3J0TWV0YVByb3BlcnR5KG5vZGU6IFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4pOiBOLk1ldGFQcm9wZXJ0eSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNyZWF0ZUlkZW50aWZpZXIoXG4gICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLklkZW50aWZpZXI+KG5vZGUpLFxuICAgICAgXCJpbXBvcnRcIixcbiAgICApO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYC5gXG5cbiAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX21ldGEpKSB7XG4gICAgICBpZiAoIXRoaXMuaW5Nb2R1bGUpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW1wb3J0TWV0YU91dHNpZGVNb2R1bGUsIHsgYXQ6IGlkIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VNZXRhUHJvcGVydHkobm9kZSwgaWQsIFwibWV0YVwiKTtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbEF0Tm9kZTxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICB2YWx1ZTogYW55LFxuICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgIG5vZGU6IGFueSxcbiAgKTogVCB7XG4gICAgdGhpcy5hZGRFeHRyYShub2RlLCBcInJhd1ZhbHVlXCIsIHZhbHVlKTtcbiAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwicmF3XCIsIHRoaXMuaW5wdXQuc2xpY2Uobm9kZS5zdGFydCwgdGhpcy5zdGF0ZS5lbmQpKTtcbiAgICBub2RlLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZTxUPihub2RlLCB0eXBlKTtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbDxUIGV4dGVuZHMgTi5Ob2RlPih2YWx1ZTogYW55LCB0eXBlOiBUW1widHlwZVwiXSk6IFQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbEF0Tm9kZSh2YWx1ZSwgdHlwZSwgbm9kZSk7XG4gIH1cblxuICBwYXJzZVN0cmluZ0xpdGVyYWwodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbDxOLlN0cmluZ0xpdGVyYWw+KHZhbHVlLCBcIlN0cmluZ0xpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZU51bWVyaWNMaXRlcmFsKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5OdW1lcmljTGl0ZXJhbD4odmFsdWUsIFwiTnVtZXJpY0xpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZUJpZ0ludExpdGVyYWwodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbDxOLkJpZ0ludExpdGVyYWw+KHZhbHVlLCBcIkJpZ0ludExpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZURlY2ltYWxMaXRlcmFsKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5EZWNpbWFsTGl0ZXJhbD4odmFsdWUsIFwiRGVjaW1hbExpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZVJlZ0V4cExpdGVyYWwodmFsdWU6IHtcbiAgICB2YWx1ZTogYW55O1xuICAgIHBhdHRlcm46IHN0cmluZztcbiAgICBmbGFnczogTi5SZWdFeHBMaXRlcmFsW1wiZmxhZ3NcIl07XG4gIH0pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUxpdGVyYWw8Ti5SZWdFeHBMaXRlcmFsPihcbiAgICAgIHZhbHVlLnZhbHVlLFxuICAgICAgXCJSZWdFeHBMaXRlcmFsXCIsXG4gICAgKTtcbiAgICBub2RlLnBhdHRlcm4gPSB2YWx1ZS5wYXR0ZXJuO1xuICAgIG5vZGUuZmxhZ3MgPSB2YWx1ZS5mbGFncztcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHBhcnNlQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Cb29sZWFuTGl0ZXJhbD4oKTtcbiAgICBub2RlLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkJvb2xlYW5MaXRlcmFsXCIpO1xuICB9XG5cbiAgcGFyc2VOdWxsTGl0ZXJhbCgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5OdWxsTGl0ZXJhbD4oKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVsbExpdGVyYWxcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Db3ZlclBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQW5kQXJyb3dQYXJhbWV0ZXJMaXN0XG4gIHBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNhbkJlQXJyb3c6IGJvb2xlYW4sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgbGV0IHZhbDtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAoYFxuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmVudGVyKG5ld0Fycm93SGVhZFNjb3BlKCkpO1xuXG4gICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICBjb25zdCBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG5cbiAgICBjb25zdCBpbm5lclN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBleHByTGlzdDogTi5FeHByZXNzaW9uW10gPSBbXTtcbiAgICBjb25zdCByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGxldCBzcHJlYWRTdGFydExvYztcbiAgICBsZXQgb3B0aW9uYWxDb21tYVN0YXJ0TG9jO1xuXG4gICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikpIHtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBlY3QoXG4gICAgICAgICAgdHQuY29tbWEsXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5vcHRpb25hbFBhcmFtZXRlcnNMb2MgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiByZWZFeHByZXNzaW9uRXJyb3JzLm9wdGlvbmFsUGFyYW1ldGVyc0xvYyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIG9wdGlvbmFsQ29tbWFTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIGNvbnN0IHNwcmVhZE5vZGVTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIHNwcmVhZFN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgZXhwckxpc3QucHVzaChcbiAgICAgICAgICB0aGlzLnBhcnNlUGFyZW5JdGVtKHRoaXMucGFyc2VSZXN0QmluZGluZygpLCBzcHJlYWROb2RlU3RhcnRMb2MpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghdGhpcy5jaGVja0NvbW1hQWZ0ZXJSZXN0KGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHByTGlzdC5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oXG4gICAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgICAgICAgdGhpcy5wYXJzZVBhcmVuSXRlbSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlubmVyRW5kTG9jID0gdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jO1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcblxuICAgIGxldCBhcnJvd05vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICBpZiAoXG4gICAgICBjYW5CZUFycm93ICYmXG4gICAgICB0aGlzLnNob3VsZFBhcnNlQXJyb3coZXhwckxpc3QpICYmXG4gICAgICAoYXJyb3dOb2RlID0gdGhpcy5wYXJzZUFycm93KGFycm93Tm9kZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmNoZWNrRGVzdHJ1Y3R1cmluZ1ByaXZhdGUocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS52YWxpZGF0ZUFzUGF0dGVybigpO1xuICAgICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuICAgICAgdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbihhcnJvd05vZGUsIGV4cHJMaXN0LCBmYWxzZSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpIGltcHJvdmUgbm9kZSB0eXBlc1xuICAgICAgcmV0dXJuIGFycm93Tm9kZTtcbiAgICB9XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuXG4gICAgaWYgKCFleHByTGlzdC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25hbENvbW1hU3RhcnRMb2MpIHRoaXMudW5leHBlY3RlZChvcHRpb25hbENvbW1hU3RhcnRMb2MpO1xuICAgIGlmIChzcHJlYWRTdGFydExvYykgdGhpcy51bmV4cGVjdGVkKHNwcmVhZFN0YXJ0TG9jKTtcbiAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCB0cnVlKTtcblxuICAgIHRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAoZXhwckxpc3QsIC8qIGlzUGFyZW50aGVzaXplZEV4cHIgKi8gdHJ1ZSk7XG4gICAgaWYgKGV4cHJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhbCA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5TZXF1ZW5jZUV4cHJlc3Npb24+KGlubmVyU3RhcnRMb2MpO1xuICAgICAgdmFsLmV4cHJlc3Npb25zID0gZXhwckxpc3Q7XG4gICAgICAvLyBmaW5pc2ggbm9kZSBhdCBjdXJyZW50IGxvY2F0aW9uIHNvIGl0IGNhbiBwaWNrIHVwIGNvbW1lbnRzIGFmdGVyIGApYFxuICAgICAgdGhpcy5maW5pc2hOb2RlKHZhbCwgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24odmFsLCBpbm5lckVuZExvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IGV4cHJMaXN0WzBdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndyYXBQYXJlbnRoZXNpcyhcbiAgICAgIHN0YXJ0TG9jLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgdmFsLFxuICAgICk7XG4gIH1cblxuICB3cmFwUGFyZW50aGVzaXMoc3RhcnRMb2M6IFBvc2l0aW9uLCBleHByZXNzaW9uOiBOLkV4cHJlc3Npb24pOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9ucykge1xuICAgICAgdGhpcy5hZGRFeHRyYShleHByZXNzaW9uLCBcInBhcmVudGhlc2l6ZWRcIiwgdHJ1ZSk7XG4gICAgICB0aGlzLmFkZEV4dHJhKGV4cHJlc3Npb24sIFwicGFyZW5TdGFydFwiLCBzdGFydExvYy5pbmRleCk7XG5cbiAgICAgIHRoaXMudGFrZVN1cnJvdW5kaW5nQ29tbWVudHMoXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIHN0YXJ0TG9jLmluZGV4LFxuICAgICAgICB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MuaW5kZXgsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbkV4cHJlc3Npb24gPVxuICAgICAgdGhpcy5zdGFydE5vZGVBdDxOLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgcGFyZW5FeHByZXNzaW9uLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocGFyZW5FeHByZXNzaW9uLCBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBgcGFyYW1zYCBpcyB1c2VkIGluIHR5cGVzY3JpcHQgcGx1Z2luXG4gIHNob3VsZFBhcnNlQXJyb3cocGFyYW1zOiBBcnJheTxOLk5vZGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpO1xuICB9XG5cbiAgcGFyc2VBcnJvdyhcbiAgICBub2RlOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4sXG4gICk6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZWF0KHR0LmFycm93KSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQYXJlbkl0ZW0oXG4gICAgbm9kZTogTi5FeHByZXNzaW9uLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwYXJzZU5ld09yTmV3VGFyZ2V0KHRoaXM6IFBhcnNlcik6IE4uTmV3RXhwcmVzc2lvbiB8IE4uTWV0YVByb3BlcnR5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5OZXdFeHByZXNzaW9uIHwgTi5NZXRhUHJvcGVydHk+KCk7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTmV3VGFyZ2V0XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5jcmVhdGVJZGVudGlmaWVyKFxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLklkZW50aWZpZXI+KG5vZGUpLFxuICAgICAgICBcIm5ld1wiLFxuICAgICAgKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgY29uc3QgbWV0YVByb3AgPSB0aGlzLnBhcnNlTWV0YVByb3BlcnR5KFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4sXG4gICAgICAgIG1ldGEsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNjb3BlLmluTm9uQXJyb3dGdW5jdGlvbiAmJlxuICAgICAgICAhdGhpcy5zY29wZS5pbkNsYXNzICYmXG4gICAgICAgICF0aGlzLm9wdGlvbnMuYWxsb3dOZXdUYXJnZXRPdXRzaWRlRnVuY3Rpb25cbiAgICAgICkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTmV3VGFyZ2V0LCB7IGF0OiBtZXRhUHJvcCB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1ldGFQcm9wO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlTmV3KG5vZGUgYXMgVW5kb25lPE4uTmV3RXhwcmVzc2lvbj4pO1xuICB9XG5cbiAgLy8gTmV3J3MgcHJlY2VkZW5jZSBpcyBzbGlnaHRseSB0cmlja3kuIEl0IG11c3QgYWxsb3cgaXRzIGFyZ3VtZW50IHRvXG4gIC8vIGJlIGEgYFtdYCBvciBkb3Qgc3Vic2NyaXB0IGV4cHJlc3Npb24sIGJ1dCBub3QgYSBjYWxsIFx1MjAxNCBhdCBsZWFzdCxcbiAgLy8gbm90IHdpdGhvdXQgd3JhcHBpbmcgaXQgaW4gcGFyZW50aGVzZXMuIFRodXMsIGl0IHVzZXMgdGhlIG5vQ2FsbHNcbiAgLy8gYXJndW1lbnQgdG8gcGFyc2VTdWJzY3JpcHRzIHRvIHByZXZlbnQgaXQgZnJvbSBjb25zdW1pbmcgdGhlXG4gIC8vIGFyZ3VtZW50IGxpc3QuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLU5ld0V4cHJlc3Npb25cbiAgcGFyc2VOZXcodGhpczogUGFyc2VyLCBub2RlOiBVbmRvbmU8Ti5OZXdFeHByZXNzaW9uPik6IE4uTmV3RXhwcmVzc2lvbiB7XG4gICAgdGhpcy5wYXJzZU5ld0NhbGxlZShub2RlKTtcblxuICAgIGlmICh0aGlzLmVhdCh0dC5wYXJlbkwpKSB7XG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR0LnBhcmVuUik7XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3QoYXJncyk7XG4gICAgICAvLyAocGFyc2VFeHByTGlzdCBzaG91bGQgYmUgYWxsIG5vbi1udWxsIGluIHRoaXMgY2FzZSlcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gYXJncztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5hcmd1bWVudHMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTmV3RXhwcmVzc2lvblwiKTtcbiAgfVxuXG4gIHBhcnNlTmV3Q2FsbGVlKHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uTmV3RXhwcmVzc2lvbj4pOiB2b2lkIHtcbiAgICBub2RlLmNhbGxlZSA9IHRoaXMucGFyc2VOb0NhbGxFeHByKCk7XG4gICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0XCIpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxOb3ROZXdFeHByZXNzaW9uLCB7IGF0OiBub2RlLmNhbGxlZSB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZSB0ZW1wbGF0ZSBleHByZXNzaW9uLlxuXG4gIHBhcnNlVGVtcGxhdGVFbGVtZW50KGlzVGFnZ2VkOiBib29sZWFuKTogTi5UZW1wbGF0ZUVsZW1lbnQge1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0YXJ0TG9jLCBlbmQsIHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGVsZW1TdGFydCA9IHN0YXJ0ICsgMTtcbiAgICBjb25zdCBlbGVtID0gdGhpcy5zdGFydE5vZGVBdDxOLlRlbXBsYXRlRWxlbWVudD4oXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIDEpLFxuICAgICk7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICBpZiAoIWlzVGFnZ2VkKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlLCB7XG4gICAgICAgICAgLy8gRklYTUU6IEFkZGluZyAxIGlzIHByb2JhYmx5IHdyb25nLlxuICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1RhaWwgPSB0aGlzLm1hdGNoKHR0LnRlbXBsYXRlVGFpbCk7XG4gICAgY29uc3QgZW5kT2Zmc2V0ID0gaXNUYWlsID8gLTEgOiAtMjtcbiAgICBjb25zdCBlbGVtRW5kID0gZW5kICsgZW5kT2Zmc2V0O1xuICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICByYXc6IHRoaXMuaW5wdXQuc2xpY2UoZWxlbVN0YXJ0LCBlbGVtRW5kKS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLFxuICAgICAgY29va2VkOiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB2YWx1ZS5zbGljZSgxLCBlbmRPZmZzZXQpLFxuICAgIH07XG4gICAgZWxlbS50YWlsID0gaXNUYWlsO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGNvbnN0IGZpbmlzaGVkTm9kZSA9IHRoaXMuZmluaXNoTm9kZShlbGVtLCBcIlRlbXBsYXRlRWxlbWVudFwiKTtcbiAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oXG4gICAgICBmaW5pc2hlZE5vZGUsXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLCBlbmRPZmZzZXQpLFxuICAgICk7XG4gICAgcmV0dXJuIGZpbmlzaGVkTm9kZTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVRlbXBsYXRlTGl0ZXJhbFxuICBwYXJzZVRlbXBsYXRlKHRoaXM6IFBhcnNlciwgaXNUYWdnZWQ6IGJvb2xlYW4pOiBOLlRlbXBsYXRlTGl0ZXJhbCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVGVtcGxhdGVMaXRlcmFsPigpO1xuICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbXTtcbiAgICBsZXQgY3VyRWx0ID0gdGhpcy5wYXJzZVRlbXBsYXRlRWxlbWVudChpc1RhZ2dlZCk7XG4gICAgbm9kZS5xdWFzaXMgPSBbY3VyRWx0XTtcbiAgICB3aGlsZSAoIWN1ckVsdC50YWlsKSB7XG4gICAgICBub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZVRlbXBsYXRlU3Vic3RpdHV0aW9uKCkpO1xuICAgICAgdGhpcy5yZWFkVGVtcGxhdGVDb250aW51YXRpb24oKTtcbiAgICAgIG5vZGUucXVhc2lzLnB1c2goKGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoaXNUYWdnZWQpKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIik7XG4gIH1cblxuICAvLyBUaGlzIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBUeXBlU2NyaXB0IHBsdWdpbiB0byBwYXJzZSB0ZW1wbGF0ZSB0eXBlc1xuICBwYXJzZVRlbXBsYXRlU3Vic3RpdHV0aW9uKHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBvYmplY3QgbGl0ZXJhbCwgYmluZGluZyBwYXR0ZXJuLCBvciByZWNvcmQuXG5cbiAgcGFyc2VPYmplY3RMaWtlKFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgaXNQYXR0ZXJuOiB0cnVlLFxuICAgIGlzUmVjb3JkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLk9iamVjdFBhdHRlcm47XG4gIHBhcnNlT2JqZWN0TGlrZShcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogZmFsc2UsXG4gICAgaXNSZWNvcmQ/OiBmYWxzZSB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLk9iamVjdEV4cHJlc3Npb247XG4gIHBhcnNlT2JqZWN0TGlrZShcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogZmFsc2UsXG4gICAgaXNSZWNvcmQ/OiB0cnVlLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5SZWNvcmRFeHByZXNzaW9uO1xuICBwYXJzZU9iamVjdExpa2U8VCBleHRlbmRzIE4uT2JqZWN0UGF0dGVybiB8IE4uT2JqZWN0RXhwcmVzc2lvbj4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzUmVjb3JkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBUIHtcbiAgICBpZiAoaXNSZWNvcmQpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIik7XG4gICAgfVxuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG4gICAgY29uc3QgcHJvcEhhc2g6IGFueSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8XG4gICAgICBOLk9iamVjdEV4cHJlc3Npb24gfCBOLk9iamVjdFBhdHRlcm4gfCBOLlJlY29yZEV4cHJlc3Npb25cbiAgICA+KCk7XG5cbiAgICBub2RlLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIHdoaWxlICghdGhpcy5tYXRjaChjbG9zZSkpIHtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5tYXRjaChjbG9zZSkpIHtcbiAgICAgICAgICB0aGlzLmFkZFRyYWlsaW5nQ29tbWFFeHRyYVRvTm9kZShcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgaW1wcm92ZSBub2RlIHR5cGVzXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHByb3A7XG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AgPSB0aGlzLnBhcnNlQmluZGluZ1Byb3BlcnR5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wID0gdGhpcy5wYXJzZVByb3BlcnR5RGVmaW5pdGlvbihyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgdGhpcy5jaGVja1Byb3RvKHByb3AsIGlzUmVjb3JkLCBwcm9wSGFzaCwgcmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNSZWNvcmQgJiZcbiAgICAgICAgIXRoaXMuaXNPYmplY3RQcm9wZXJ0eShwcm9wKSAmJlxuICAgICAgICBwcm9wLnR5cGUgIT09IFwiU3ByZWFkRWxlbWVudFwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZFJlY29yZFByb3BlcnR5LCB7IGF0OiBwcm9wIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNob3J0aGFuZCBtYXkgbm90IGluZGV4IHByb3BcbiAgICAgIGlmIChwcm9wLnNob3J0aGFuZCkge1xuICAgICAgICB0aGlzLmFkZEV4dHJhKHByb3AsIFwic2hvcnRoYW5kXCIsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiByZWZpbmUgdHlwaW5nc1xuICAgICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgfVxuXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gb2xkSW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgbGV0IHR5cGUgPSBcIk9iamVjdEV4cHJlc3Npb25cIjtcbiAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICB0eXBlID0gXCJPYmplY3RQYXR0ZXJuXCI7XG4gICAgfSBlbHNlIGlmIChpc1JlY29yZCkge1xuICAgICAgdHlwZSA9IFwiUmVjb3JkRXhwcmVzc2lvblwiO1xuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgaXMgd2VsbCBkZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgfVxuXG4gIGFkZFRyYWlsaW5nQ29tbWFFeHRyYVRvTm9kZShub2RlOiBOLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwidHJhaWxpbmdDb21tYVwiLCB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCk7XG4gICAgdGhpcy5hZGRFeHRyYShub2RlLCBcInRyYWlsaW5nQ29tbWFMb2NcIiwgdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsIGZhbHNlKTtcbiAgfVxuXG4gIC8vIENoZWNrIGdyYW1tYXIgcHJvZHVjdGlvbjpcbiAgLy8gICBJZGVudGlmaWVyTmFtZSAqX29wdCBQcm9wZXJ0eU5hbWVcbiAgLy8gSXQgaXMgdXNlZCBpbiBgcGFyc2VQcm9wZXJ0eURlZmluaXRpb25gIHRvIGRldGVjdCBBc3luY01ldGhvZCBhbmQgQWNjZXNzb3JzXG4gIG1heWJlQXN5bmNPckFjY2Vzc29yUHJvcChwcm9wOiBVbmRvbmU8Ti5PYmplY3RQcm9wZXJ0eT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXByb3AuY29tcHV0ZWQgJiZcbiAgICAgIHByb3Aua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAodGhpcy5pc0xpdGVyYWxQcm9wZXJ0eU5hbWUoKSB8fFxuICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNrZXRMKSB8fFxuICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpKVxuICAgICk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Qcm9wZXJ0eURlZmluaXRpb25cbiAgcGFyc2VQcm9wZXJ0eURlZmluaXRpb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5PYmplY3RNZW1iZXIgfCBOLlNwcmVhZEVsZW1lbnQge1xuICAgIGxldCBkZWNvcmF0b3JzID0gW107XG4gICAgaWYgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuc3VwcG9ydGVkUHJvcGVydHlEZWNvcmF0b3IsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIG5lZWRuJ3QgY2hlY2sgaWYgZGVjb3JhdG9ycyAoc3RhZ2UgMCkgcGx1Z2luIGlzIGVuYWJsZWQgc2luY2UgaXQncyBjaGVja2VkIGJ5XG4gICAgICAvLyB0aGUgY2FsbCB0byB0aGlzLnBhcnNlRGVjb3JhdG9yXG4gICAgICB3aGlsZSAodGhpcy5tYXRjaCh0dC5hdCkpIHtcbiAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc3RhcnROb2RlPE4uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgbGV0IGlzQXN5bmMgPSBmYWxzZTtcbiAgICBsZXQgaXNBY2Nlc3NvciA9IGZhbHNlO1xuICAgIGxldCBzdGFydExvYztcblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlU3ByZWFkKCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICBwcm9wLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgICAgZGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cblxuICAgIHByb3AubWV0aG9kID0gZmFsc2U7XG5cbiAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIH1cblxuICAgIGxldCBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR0LnN0YXIpO1xuICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihwcm9wKTtcbiAgICBjb25zdCBjb250YWluc0VzYyA9IHRoaXMuc3RhdGUuY29udGFpbnNFc2M7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wLCByZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICghaXNHZW5lcmF0b3IgJiYgIWNvbnRhaW5zRXNjICYmIHRoaXMubWF5YmVBc3luY09yQWNjZXNzb3JQcm9wKHByb3ApKSB7XG4gICAgICBjb25zdCBrZXlOYW1lID0ga2V5Lm5hbWU7XG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Bc3luY01ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNHZW5lcmF0b3JNZXRob2RcbiAgICAgIGlmIChrZXlOYW1lID09PSBcImFzeW5jXCIgJiYgIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkpIHtcbiAgICAgICAgaXNBc3luYyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGtleSk7XG4gICAgICAgIGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHQuc3Rhcik7XG4gICAgICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgUHJvcGVydHlOYW1lWz9ZaWVsZCwgP0F3YWl0XSAoKSB7IEZ1bmN0aW9uQm9keVt+WWllbGQsIH5Bd2FpdF0gfVxuICAgICAgLy8gc2V0IFByb3BlcnR5TmFtZVs/WWllbGQsID9Bd2FpdF0gKCBQcm9wZXJ0eVNldFBhcmFtZXRlckxpc3QgKSB7IEZ1bmN0aW9uQm9keVt+WWllbGQsIH5Bd2FpdF0gfVxuICAgICAgaWYgKGtleU5hbWUgPT09IFwiZ2V0XCIgfHwga2V5TmFtZSA9PT0gXCJzZXRcIikge1xuICAgICAgICBpc0FjY2Vzc29yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICAgICAgcHJvcC5raW5kID0ga2V5TmFtZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuc3RhcikpIHtcbiAgICAgICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQWNjZXNzb3JJc0dlbmVyYXRvciwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICAgIGtpbmQ6IGtleU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3AsXG4gICAgICBzdGFydExvYyxcbiAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgaXNBc3luYyxcbiAgICAgIGZhbHNlIC8qIGlzUGF0dGVybiAqLyxcbiAgICAgIGlzQWNjZXNzb3IsXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICk7XG4gIH1cblxuICBnZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQoXG4gICAgbWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QsXG4gICk6IG51bWJlciB7XG4gICAgcmV0dXJuIG1ldGhvZC5raW5kID09PSBcImdldFwiID8gMCA6IDE7XG4gIH1cblxuICAvLyBUaGlzIGV4aXN0cyBzbyB3ZSBjYW4gb3ZlcnJpZGUgd2l0aGluIHRoZSBFU1RyZWUgcGx1Z2luXG4gIGdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpIHtcbiAgICByZXR1cm4gbWV0aG9kLnBhcmFtcztcbiAgfVxuXG4gIC8vIGdldCBtZXRob2RzIGFyZW4ndCBhbGxvd2VkIHRvIGhhdmUgYW55IHBhcmFtZXRlcnNcbiAgLy8gc2V0IG1ldGhvZHMgbXVzdCBoYXZlIGV4YWN0bHkgMSBwYXJhbWV0ZXIgd2hpY2ggaXMgbm90IGEgcmVzdCBwYXJhbWV0ZXJcbiAgY2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbUNvdW50ID0gdGhpcy5nZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQobWV0aG9kKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcblxuICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSBwYXJhbUNvdW50KSB7XG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBtZXRob2Qua2luZCA9PT0gXCJnZXRcIiA/IEVycm9ycy5CYWRHZXR0ZXJBcml0eSA6IEVycm9ycy5CYWRTZXR0ZXJBcml0eSxcbiAgICAgICAgeyBhdDogbWV0aG9kIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG1ldGhvZC5raW5kID09PSBcInNldFwiICYmXG4gICAgICBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdPy50eXBlID09PSBcIlJlc3RFbGVtZW50XCJcbiAgICApIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlclJlc3RQYXJhbWV0ZXIsIHsgYXQ6IG1ldGhvZCB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1NZXRob2REZWZpbml0aW9uXG4gIHBhcnNlT2JqZWN0TWV0aG9kKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBwcm9wOiBVbmRvbmU8Ti5PYmplY3RNZXRob2Q+LFxuICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICk6IE4uT2JqZWN0TWV0aG9kIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgaWYgKGlzQWNjZXNzb3IpIHtcbiAgICAgIC8vIGlzQWNjZXNzb3IgaW1wbGllcyBpc0FzeW5jOiBmYWxzZSwgaXNQYXR0ZXJuOiBmYWxzZSwgaXNHZW5lcmF0b3I6IGZhbHNlXG4gICAgICBjb25zdCBmaW5pc2hlZFByb3AgPSB0aGlzLnBhcnNlTWV0aG9kKFxuICAgICAgICBwcm9wLFxuICAgICAgICAvLyBUaGlzIF9zaG91bGRfIGJlIGZhbHNlLCBidXQgd2l0aCBlcnJvciByZWNvdmVyeSwgd2UgYWxsb3cgaXQgdG8gYmVcbiAgICAgICAgLy8gc2V0IGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICAvKiBpc0FzeW5jICovIGZhbHNlLFxuICAgICAgICAvKiBpc0NvbnN0cnVjdG9yICovIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJPYmplY3RNZXRob2RcIixcbiAgICAgICk7XG4gICAgICB0aGlzLmNoZWNrR2V0dGVyU2V0dGVyUGFyYW1zKGZpbmlzaGVkUHJvcCk7XG4gICAgICByZXR1cm4gZmluaXNoZWRQcm9wO1xuICAgIH1cblxuICAgIGlmIChpc0FzeW5jIHx8IGlzR2VuZXJhdG9yIHx8IHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgaWYgKGlzUGF0dGVybikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICBwcm9wLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgcHJvcC5tZXRob2QgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VNZXRob2QoXG4gICAgICAgIHByb3AsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICAvKiBpc0NvbnN0cnVjdG9yICovIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJPYmplY3RNZXRob2RcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYGlzUGF0dGVybmAgaXMgdHJ1ZSwgcGFyc2UgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1Byb3BlcnR5XG4gIC8vIGVsc2UgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtUHJvcGVydHlEZWZpbml0aW9uXG4gIHBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdFByb3BlcnR5PixcbiAgICBzdGFydExvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uT2JqZWN0UHJvcGVydHkgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBwcm9wLnNob3J0aGFuZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR0LmNvbG9uKSkge1xuICAgICAgcHJvcC52YWx1ZSA9IGlzUGF0dGVyblxuICAgICAgICA/IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGF0ZS5zdGFydExvYylcbiAgICAgICAgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiT2JqZWN0UHJvcGVydHlcIik7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmNvbXB1dGVkICYmIHByb3Aua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAvLyBQcm9wZXJ0eURlZmluaXRpb246XG4gICAgICAvLyAgIElkZW50aWZpZXJSZWZlcmVuY2VcbiAgICAgIC8vICAgQ292ZXJJbml0aWFsaXplZE5hbWVcbiAgICAgIC8vIE5vdGU6IGB7IGV2YWwgfSA9IHt9YCB3aWxsIGJlIGNoZWNrZWQgaW4gYGNoZWNrTFZhbGAgbGF0ZXIuXG4gICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKHByb3Aua2V5Lm5hbWUsIHByb3Aua2V5LmxvYy5zdGFydCwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KFxuICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgIGNsb25lSWRlbnRpZmllcihwcm9wLmtleSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuZXEpKSB7XG4gICAgICAgIGNvbnN0IHNob3J0aGFuZEFzc2lnbkxvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIGlmIChyZWZFeHByZXNzaW9uRXJyb3JzICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMuc2hvcnRoYW5kQXNzaWduTG9jID0gc2hvcnRoYW5kQXNzaWduTG9jO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkQ292ZXJJbml0aWFsaXplZE5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBzaG9ydGhhbmRBc3NpZ25Mb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQoXG4gICAgICAgICAgc3RhcnRMb2MsXG4gICAgICAgICAgY2xvbmVJZGVudGlmaWVyKHByb3Aua2V5KSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3AudmFsdWUgPSBjbG9uZUlkZW50aWZpZXIocHJvcC5rZXkpO1xuICAgICAgfVxuICAgICAgcHJvcC5zaG9ydGhhbmQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiT2JqZWN0UHJvcGVydHlcIik7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgaXNBc3luYzogYm9vbGVhbixcbiAgICBpc1BhdHRlcm46IGJvb2xlYW4sXG4gICAgaXNBY2Nlc3NvcjogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uT2JqZWN0TWV0aG9kIHwgTi5PYmplY3RQcm9wZXJ0eSB7XG4gICAgY29uc3Qgbm9kZSA9XG4gICAgICB0aGlzLnBhcnNlT2JqZWN0TWV0aG9kKFxuICAgICAgICBwcm9wIGFzIFVuZG9uZTxOLk9iamVjdE1ldGhvZD4sXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIGlzQWNjZXNzb3IsXG4gICAgICApIHx8XG4gICAgICB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIHByb3AgYXMgVW5kb25lPE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgaXNQYXR0ZXJuLFxuICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgKTtcblxuICAgIGlmICghbm9kZSkgdGhpcy51bmV4cGVjdGVkKCk7XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVByb3BlcnR5TmFtZVxuICAvLyB3aGVuIHJlZkV4cHJlc3Npb25FcnJvcnMgcHJlc2VudHMsIGl0IHdpbGwgcGFyc2UgcHJpdmF0ZSBuYW1lXG4gIC8vIGFuZCByZWNvcmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwcml2YXRlIG5hbWVcbiAgcGFyc2VQcm9wZXJ0eU5hbWUoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6XG4gICAgICB8IFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXIgfCBOLkNsYXNzTWVtYmVyPlxuICAgICAgfCBOLlRzTmFtZWRUeXBlRWxlbWVudEJhc2UsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBOLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgIChwcm9wIGFzIFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXI+KS5jb21wdXRlZCA9IHRydWU7XG4gICAgICBwcm9wLmtleSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgY2hlY2sgaWYgaXQncyB2YWxpZCBmb3IgaXQgdG8gYmUgYSBwcml2YXRlIG5hbWUgd2hlbiB3ZSBwdXNoIGl0LlxuICAgICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGxldCBrZXk7XG4gICAgICAvLyBtb3N0IHVuLWNvbXB1dGVkIHByb3BlcnR5IG5hbWVzIGFyZSBpZGVudGlmaWVyc1xuICAgICAgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgIGtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSB0dC5udW06XG4gICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlTnVtZXJpY0xpdGVyYWwodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSB0dC5zdHJpbmc6XG4gICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHR0LmJpZ2ludDpcbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VCaWdJbnRMaXRlcmFsKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgdHQuZGVjaW1hbDpcbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VEZWNpbWFsTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHR0LnByaXZhdGVOYW1lOiB7XG4gICAgICAgICAgICAvLyB0aGUgY2xhc3MgcHJpdmF0ZSBrZXkgaGFzIGJlZW4gaGFuZGxlZCBpbiBwYXJzZUNsYXNzRWxlbWVudE5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByaXZhdGVLZXlMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgaWYgKHJlZkV4cHJlc3Npb25FcnJvcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5wcml2YXRlS2V5TG9jID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5wcml2YXRlS2V5TG9jID0gcHJpdmF0ZUtleUxvYztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFByaXZhdGVGaWVsZCwge1xuICAgICAgICAgICAgICAgIGF0OiBwcml2YXRlS2V5TG9jLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKHByb3AgYXMgYW55KS5rZXkgPSBrZXk7XG4gICAgICBpZiAodHlwZSAhPT0gdHQucHJpdmF0ZU5hbWUpIHtcbiAgICAgICAgLy8gQ2xhc3NQcml2YXRlUHJvcGVydHkgaXMgbmV2ZXIgY29tcHV0ZWQsIHNvIHdlIGRvbid0IGFzc2lnbiBpbiB0aGF0IGNhc2UuXG4gICAgICAgIHByb3AuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcC5rZXk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGVtcHR5IGZ1bmN0aW9uIG5vZGUuXG5cbiAgaW5pdEZ1bmN0aW9uKG5vZGU6IE4uQm9kaWxlc3NGdW5jdGlvbk9yTWV0aG9kQmFzZSwgaXNBc3luYzogYm9vbGVhbik6IHZvaWQge1xuICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIG5vZGUuZ2VuZXJhdG9yID0gZmFsc2U7XG4gICAgbm9kZS5hc3luYyA9IGlzQXN5bmM7XG4gIH1cblxuICAvLyBQYXJzZSBvYmplY3Qgb3IgY2xhc3MgbWV0aG9kLlxuXG4gIHBhcnNlTWV0aG9kPFQgZXh0ZW5kcyBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJpdmF0ZU1ldGhvZD4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICB0eXBlOiBUW1widHlwZVwiXSxcbiAgICBpbkNsYXNzU2NvcGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogVCB7XG4gICAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSwgaXNBc3luYyk7XG4gICAgbm9kZS5nZW5lcmF0b3IgPSBpc0dlbmVyYXRvcjtcbiAgICB0aGlzLnNjb3BlLmVudGVyKFxuICAgICAgU0NPUEVfRlVOQ1RJT04gfFxuICAgICAgICBTQ09QRV9TVVBFUiB8XG4gICAgICAgIChpbkNsYXNzU2NvcGUgPyBTQ09QRV9DTEFTUyA6IDApIHxcbiAgICAgICAgKGFsbG93RGlyZWN0U3VwZXIgPyBTQ09QRV9ESVJFQ1RfU1VQRVIgOiAwKSxcbiAgICApO1xuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZ1bmN0aW9uRmxhZ3MoaXNBc3luYywgbm9kZS5nZW5lcmF0b3IpKTtcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgaXNDb25zdHJ1Y3Rvcik7XG4gICAgY29uc3QgZmluaXNoZWROb2RlID0gdGhpcy5wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaChub2RlLCB0eXBlLCB0cnVlKTtcbiAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgdGhpcy5zY29wZS5leGl0KCk7XG5cbiAgICByZXR1cm4gZmluaXNoZWROb2RlO1xuICB9XG5cbiAgLy8gcGFyc2UgYW4gYXJyYXkgbGl0ZXJhbCBvciB0dXBsZSBsaXRlcmFsXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUFycmF5TGl0ZXJhbFxuICAvLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtcmVjb3JkLXR1cGxlLyNwcm9kLVR1cGxlTGl0ZXJhbFxuICBwYXJzZUFycmF5TGlrZShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICBjYW5CZVBhdHRlcm46IGJvb2xlYW4sXG4gICAgaXNUdXBsZTogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uQXJyYXlFeHByZXNzaW9uIHwgTi5UdXBsZUV4cHJlc3Npb24ge1xuICAgIGlmIChpc1R1cGxlKSB7XG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpO1xuICAgIH1cbiAgICBjb25zdCBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IGZhbHNlO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkFycmF5RXhwcmVzc2lvbiB8IE4uVHVwbGVFeHByZXNzaW9uPigpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwckxpc3QoXG4gICAgICBjbG9zZSxcbiAgICAgIC8qIGFsbG93RW1wdHkgKi8gIWlzVHVwbGUsXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgbm9kZSxcbiAgICApO1xuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzVHVwbGUgPyBcIlR1cGxlRXhwcmVzc2lvblwiIDogXCJBcnJheUV4cHJlc3Npb25cIixcbiAgICApO1xuICB9XG5cbiAgLy8gUGFyc2UgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbi5cbiAgLy8gSWYgdGhlIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGFuXG4gIC8vIGFzc2lnbmFibGUgbGlzdC5cbiAgcGFyc2VBcnJvd0V4cHJlc3Npb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgICBwYXJhbXM6IE4uRXhwcmVzc2lvbltdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIHRyYWlsaW5nQ29tbWFMb2M/OiBQb3NpdGlvbiB8IG51bGwsXG4gICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9BUlJPVyk7XG4gICAgbGV0IGZsYWdzID0gZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBmYWxzZSk7XG4gICAgLy8gQ29uY2lzZUJvZHlbSW5dIDpcbiAgICAvLyAgIFtsb29rYWhlYWQgXHUyMjYwIHtdIEV4cHJlc3Npb25Cb2R5Wz9JbiwgfkF3YWl0XVxuICAgIC8vICAgeyBGdW5jdGlvbkJvZHlbfllpZWxkLCB+QXdhaXRdIH1cbiAgICBpZiAoIXRoaXMubWF0Y2godHQuYnJhY2VMKSAmJiB0aGlzLnByb2RQYXJhbS5oYXNJbikge1xuICAgICAgZmxhZ3MgfD0gUEFSQU1fSU47XG4gICAgfVxuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZsYWdzKTtcbiAgICB0aGlzLmluaXRGdW5jdGlvbihub2RlLCBpc0FzeW5jKTtcbiAgICBjb25zdCBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMobm9kZSwgcGFyYW1zLCB0cmFpbGluZ0NvbW1hTG9jKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gZmFsc2U7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCB0cnVlKTtcblxuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgIHBhcmFtczogTi5FeHByZXNzaW9uW10sXG4gICAgdHJhaWxpbmdDb21tYUxvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJhaWxpbmdDb21tYUxvYywgZmFsc2UpO1xuICAgIG5vZGUucGFyYW1zID0gcGFyYW1zIGFzIChOLlBhdHRlcm4gfCBOLlRTUGFyYW1ldGVyUHJvcGVydHkpW107XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaDxcbiAgICBUIGV4dGVuZHNcbiAgICAgIHwgTi5GdW5jdGlvblxuICAgICAgfCBOLlRTRGVjbGFyZU1ldGhvZFxuICAgICAgfCBOLlRTRGVjbGFyZUZ1bmN0aW9uXG4gICAgICB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICA+KG5vZGU6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0sIGlzTWV0aG9kOiBib29sZWFuID0gZmFsc2UpOiBUIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIChub2RlIGlzIG5vdCBib2RpbGVzcyBpZiB3ZSBnZXQgaGVyZSlcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGZhbHNlLCBpc01ldGhvZCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGZ1bmN0aW9uIGJvZHkgYW5kIGNoZWNrIHBhcmFtZXRlcnMuXG4gIHBhcnNlRnVuY3Rpb25Cb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgYWxsb3dFeHByZXNzaW9uPzogYm9vbGVhbiB8IG51bGwsXG4gICAgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaXNFeHByZXNzaW9uID0gYWxsb3dFeHByZXNzaW9uICYmICF0aGlzLm1hdGNoKHR0LmJyYWNlTCk7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZW50ZXIobmV3RXhwcmVzc2lvblNjb3BlKCkpO1xuXG4gICAgaWYgKGlzRXhwcmVzc2lvbikge1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRXhwcmVzc2lvbkJvZHlcbiAgICAgIChub2RlIGFzIFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPikuYm9keSA9XG4gICAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgdGhpcy5jaGVja1BhcmFtcyhub2RlLCBmYWxzZSwgYWxsb3dFeHByZXNzaW9uLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuICAgICAgLy8gU3RhcnQgYSBuZXcgc2NvcGUgd2l0aCByZWdhcmQgdG8gbGFiZWxzXG4gICAgICAvLyBmbGFnIChyZXN0b3JlIHRoZW0gdG8gdGhlaXIgb2xkIHZhbHVlIGFmdGVyd2FyZHMpLlxuICAgICAgY29uc3Qgb2xkTGFiZWxzID0gdGhpcy5zdGF0ZS5sYWJlbHM7XG4gICAgICB0aGlzLnN0YXRlLmxhYmVscyA9IFtdO1xuXG4gICAgICAvLyBGdW5jdGlvbkJvZHlbWWllbGQsIEF3YWl0XTpcbiAgICAgIC8vICAgU3RhdGVtZW50TGlzdFs/WWllbGQsID9Bd2FpdCwgK1JldHVybl0gb3B0XG4gICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcih0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKSB8IFBBUkFNX1JFVFVSTik7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2soXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbiBjaGVja3MgYWZ0ZXIgd2UgcGFyc2UgdGhlIHN0YXRlbWVudHMgaW4gdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICAgIChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9uU2ltcGxlID0gIXRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpO1xuXG4gICAgICAgICAgaWYgKGhhc1N0cmljdE1vZGVEaXJlY3RpdmUgJiYgbm9uU2ltcGxlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGxvZ2ljIGlzIGhlcmUgdG8gYWxpZ24gdGhlIGVycm9yIGxvY2F0aW9uIHdpdGggdGhlIEVTVHJlZSBwbHVnaW4uXG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlLCB7XG4gICAgICAgICAgICAgIGF0OlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2luZCBtYXkgbm90IGluZGV4IG5vZGVcbiAgICAgICAgICAgICAgICAobm9kZS5raW5kID09PSBcIm1ldGhvZFwiIHx8IG5vZGUua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiKSAmJlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgICAgICAgICAgICEhbm9kZS5rZXlcbiAgICAgICAgICAgICAgICAgID8gLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlLmtleSBoYXMgYmVlbiBndWFyZGVkXG4gICAgICAgICAgICAgICAgICAgIG5vZGUua2V5LmxvYy5lbmRcbiAgICAgICAgICAgICAgICAgIDogbm9kZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0cmljdE1vZGVDaGFuZ2VkID0gIW9sZFN0cmljdCAmJiB0aGlzLnN0YXRlLnN0cmljdDtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGFyYW1zIHRvIHZhckRlY2xhcmVkTmFtZXMgdG8gZW5zdXJlIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duXG4gICAgICAgICAgLy8gaWYgYSBsZXQvY29uc3QgZGVjbGFyYXRpb24gaW4gdGhlIGZ1bmN0aW9uIGNsYXNoZXMgd2l0aCBvbmUgb2YgdGhlIHBhcmFtcy5cbiAgICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLnN0cmljdCAmJiAhYWxsb3dFeHByZXNzaW9uICYmICFpc01ldGhvZCAmJiAhbm9uU2ltcGxlLFxuICAgICAgICAgICAgYWxsb3dFeHByZXNzaW9uLFxuICAgICAgICAgICAgc3RyaWN0TW9kZUNoYW5nZWQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGZvcmJpZGRlbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlLCBlLmcuICdldmFsJ1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiBub2RlLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWRlbnRpZmllcihub2RlLmlkLCBCSU5EX09VVFNJREUsIHN0cmljdE1vZGVDaGFuZ2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBvbGRMYWJlbHM7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmV4aXQoKTtcbiAgfVxuXG4gIGlzU2ltcGxlUGFyYW1ldGVyKG5vZGU6IE4uUGF0dGVybiB8IE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiO1xuICB9XG5cbiAgaXNTaW1wbGVQYXJhbUxpc3QoXG4gICAgcGFyYW1zOiBSZWFkb25seUFycmF5PE4uUGF0dGVybiB8IE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eT4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1NpbXBsZVBhcmFtZXRlcihwYXJhbXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2hlY2tQYXJhbXMoXG4gICAgbm9kZTogVW5kb25lPE4uRnVuY3Rpb24+LFxuICAgIGFsbG93RHVwbGljYXRlczogYm9vbGVhbixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgaXNBcnJvd0Z1bmN0aW9uPzogYm9vbGVhbiB8IG51bGwsXG4gICAgc3RyaWN0TW9kZUNoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja0NsYXNoZXMgPSAhYWxsb3dEdXBsaWNhdGVzICYmIG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIFdlIGNyZWF0ZSBhIGZha2Ugbm9kZSB3aXRoIHRoZSBcImVwaGVtZXJhbFwiIHR5cGUgYEZvcm1hbFBhcmFtZXRlcnNgWzFdXG4gICAgLy8gc2luY2Ugd2UganVzdCBzdG9yZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBQZXJoYXBzIHNvbWVkYXkgd2UgY2FuIGhhdmVcbiAgICAvLyBzb21ldGhpbmcgbGlrZSBjbGFzcyBGb3JtYWxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXkgeyAuLi4gfSwgd2hpY2ggd291bGRcbiAgICAvLyBhbHNvIGJlIGhlbHBmdWwgd2hlbiB0cmF2ZXJzaW5nIHRoaXMgbm9kZS5cbiAgICAvL1xuICAgIC8vIDEuIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUZvcm1hbFBhcmFtZXRlcnNcbiAgICBjb25zdCBmb3JtYWxQYXJhbWV0ZXJzID0geyB0eXBlOiBcIkZvcm1hbFBhcmFtZXRlcnNcIiB9IGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygbm9kZS5wYXJhbXMpIHtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKHBhcmFtLCB7XG4gICAgICAgIGluOiBmb3JtYWxQYXJhbWV0ZXJzLFxuICAgICAgICBiaW5kaW5nOiBCSU5EX1ZBUixcbiAgICAgICAgY2hlY2tDbGFzaGVzLFxuICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLCBhbmQgcmV0dXJucyB0aGVtIGFzXG4gIC8vIGFuIGFycmF5LiBgY2xvc2VgIGlzIHRoZSB0b2tlbiB0eXBlIHRoYXQgZW5kcyB0aGUgbGlzdCwgYW5kXG4gIC8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGhcbiAgLy8gbm90aGluZyBpbiBiZXR3ZWVuIHRoZW0gdG8gYmUgcGFyc2VkIGFzIGBudWxsYCAod2hpY2ggaXMgbmVlZGVkXG4gIC8vIGZvciBhcnJheSBsaXRlcmFscykuXG5cbiAgcGFyc2VFeHByTGlzdChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICBhbGxvd0VtcHR5PzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgbm9kZUZvckV4dHJhPzogTi5Ob2RlIHwgbnVsbCxcbiAgKTogKE4uRXhwcmVzc2lvbiB8IG51bGwpW10ge1xuICAgIGNvbnN0IGVsdHM6IChOLkV4cHJlc3Npb24gfCBudWxsKVtdID0gW107XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcblxuICAgIHdoaWxlICghdGhpcy5lYXQoY2xvc2UpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goY2xvc2UpKSB7XG4gICAgICAgICAgaWYgKG5vZGVGb3JFeHRyYSkge1xuICAgICAgICAgICAgdGhpcy5hZGRUcmFpbGluZ0NvbW1hRXh0cmFUb05vZGUobm9kZUZvckV4dHJhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWx0cy5wdXNoKHRoaXMucGFyc2VFeHByTGlzdEl0ZW0oYWxsb3dFbXB0eSwgcmVmRXhwcmVzc2lvbkVycm9ycykpO1xuICAgIH1cbiAgICByZXR1cm4gZWx0cztcbiAgfVxuXG4gIHBhcnNlRXhwckxpc3RJdGVtKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBhbGxvd0VtcHR5PzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWxsb3dQbGFjZWhvbGRlcj86IGJvb2xlYW4gfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBudWxsO1xuICBwYXJzZUV4cHJMaXN0SXRlbShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYWxsb3dFbXB0eT86IGZhbHNlLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICBhbGxvd1BsYWNlaG9sZGVyPzogYm9vbGVhbiB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbjtcbiAgcGFyc2VFeHByTGlzdEl0ZW0oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGFsbG93RW1wdHk/OiBib29sZWFuIHwgbnVsbCxcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWxsb3dQbGFjZWhvbGRlcj86IGJvb2xlYW4gfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBudWxsIHtcbiAgICBsZXQgZWx0O1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgaWYgKCFhbGxvd0VtcHR5KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRUb2tlbiwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgdW5leHBlY3RlZDogXCIsXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWx0ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICBjb25zdCBzcHJlYWROb2RlU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgICBlbHQgPSB0aGlzLnBhcnNlUGFyZW5JdGVtKFxuICAgICAgICB0aGlzLnBhcnNlU3ByZWFkKHJlZkV4cHJlc3Npb25FcnJvcnMpLFxuICAgICAgICBzcHJlYWROb2RlU3RhcnRMb2MsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5xdWVzdGlvbikpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwicGFydGlhbEFwcGxpY2F0aW9uXCIpO1xuICAgICAgaWYgKCFhbGxvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRBcmd1bWVudFBsYWNlaG9sZGVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGVsdCA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICAgIHRoaXMucGFyc2VQYXJlbkl0ZW0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZWx0O1xuICB9XG5cbiAgLy8gUGFyc2UgdGhlIG5leHQgdG9rZW4gYXMgYW4gaWRlbnRpZmllci4gSWYgYGxpYmVyYWxgIGlzIHRydWUgKHVzZWRcbiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvXG4gIC8vIGlkZW50aWZpZXJzLlxuICAvLyBUaGlzIHNob3VsZG4ndCBiZSB1c2VkIHRvIHBhcnNlIHRoZSBrZXl3b3JkcyBvZiBtZXRhIHByb3BlcnRpZXMsIHNpbmNlIHRoZXlcbiAgLy8gYXJlIG5vdCBpZGVudGlmaWVycyBhbmQgY2Fubm90IGNvbnRhaW4gZXNjYXBlIHNlcXVlbmNlcy5cblxuICBwYXJzZUlkZW50aWZpZXIobGliZXJhbD86IGJvb2xlYW4pOiBOLklkZW50aWZpZXIge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLklkZW50aWZpZXI+KCk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZShsaWJlcmFsKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUlkZW50aWZpZXIobm9kZSwgbmFtZSk7XG4gIH1cblxuICBjcmVhdGVJZGVudGlmaWVyKFxuICAgIG5vZGU6IE9taXQ8Ti5JZGVudGlmaWVyLCBcInR5cGVcIj4sXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBOLklkZW50aWZpZXIge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gICAgbm9kZS5sb2MuaWRlbnRpZmllck5hbWUgPSBuYW1lO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklkZW50aWZpZXJcIik7XG4gIH1cblxuICBwYXJzZUlkZW50aWZpZXJOYW1lKGxpYmVyYWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3QgeyBzdGFydExvYywgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmICh0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgbmFtZSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuSXNLZXl3b3JkID0gdG9rZW5LZXl3b3JkT3JJZGVudGlmaWVySXNLZXl3b3JkKHR5cGUpO1xuXG4gICAgaWYgKGxpYmVyYWwpIHtcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB1c2VkIGFzIGEga2V5d29yZCwgc2V0IGl0cyB0eXBlIHRvIFwidHQubmFtZVwiLlxuICAgICAgLy8gVGhpcyB3aWxsIHByZXZlbnQgdGhpcy5uZXh0KCkgZnJvbSB0aHJvd2luZyBhYm91dCB1bmV4cGVjdGVkIGVzY2FwZXMuXG4gICAgICBpZiAodG9rZW5Jc0tleXdvcmQpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlVG9rZW4odHQubmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQobmFtZSwgc3RhcnRMb2MsIHRva2VuSXNLZXl3b3JkLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIGNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgIHdvcmQ6IHN0cmluZyxcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgY2hlY2tLZXl3b3JkczogYm9vbGVhbixcbiAgICBpc0JpbmRpbmc6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIC8vIEV2ZXJ5IEphdmFTY3JpcHQgcmVzZXJ2ZWQgd29yZCBpcyAxMCBjaGFyYWN0ZXJzIG9yIGxlc3MuXG4gICAgaWYgKHdvcmQubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTW9zdCBpZGVudGlmaWVycyBhcmUgbm90IHJlc2VydmVkV29yZC1saWtlLCB0aGV5IGRvbid0IG5lZWQgc3BlY2lhbFxuICAgIC8vIHRyZWF0bWVudHMgYWZ0ZXJ3YXJkLCB3aGljaCB2ZXJ5IGxpa2VseSBlbmRzIHVwIHRocm93aW5nIGVycm9yc1xuICAgIGlmICghY2FuQmVSZXNlcnZlZFdvcmQod29yZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tLZXl3b3JkcyAmJiBpc0tleXdvcmQod29yZCkpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRLZXl3b3JkLCB7XG4gICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAga2V5d29yZDogd29yZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2VydmVkVGVzdCA9ICF0aGlzLnN0YXRlLnN0cmljdFxuICAgICAgPyBpc1Jlc2VydmVkV29yZFxuICAgICAgOiBpc0JpbmRpbmdcbiAgICAgID8gaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkXG4gICAgICA6IGlzU3RyaWN0UmVzZXJ2ZWRXb3JkO1xuXG4gICAgaWYgKHJlc2VydmVkVGVzdCh3b3JkLCB0aGlzLmluTW9kdWxlKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFJlc2VydmVkV29yZCwge1xuICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIHJlc2VydmVkV29yZDogd29yZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAod29yZCA9PT0gXCJ5aWVsZFwiKSB7XG4gICAgICBpZiAodGhpcy5wcm9kUGFyYW0uaGFzWWllbGQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuWWllbGRCaW5kaW5nSWRlbnRpZmllciwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHdvcmQgPT09IFwiYXdhaXRcIikge1xuICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkF3YWl0QmluZGluZ0lkZW50aWZpZXIsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNjb3BlLmluU3RhdGljQmxvY2spIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQXdhaXRCaW5kaW5nSWRlbnRpZmllckluU3RhdGljQmxvY2ssIHtcbiAgICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFzeW5jQXJyb3dQYXJhbWV0ZXJzRXJyb3IoeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfSBlbHNlIGlmICh3b3JkID09PSBcImFyZ3VtZW50c1wiKSB7XG4gICAgICBpZiAodGhpcy5zY29wZS5pbkNsYXNzQW5kTm90SW5Ob25BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkFyZ3VtZW50c0luQ2xhc3MsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNBd2FpdEFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb24gJiYgIXRoaXMuc2NvcGUuaW5GdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBhd2FpdCBleHByZXNzaW9uIGluc2lkZSBhc3luYyBmdW5jdGlvbi5cblxuICBwYXJzZUF3YWl0KHRoaXM6IFBhcnNlciwgc3RhcnRMb2M6IFBvc2l0aW9uKTogTi5Bd2FpdEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXdhaXRFeHByZXNzaW9uPihzdGFydExvYyk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5yZWNvcmRQYXJhbWV0ZXJJbml0aWFsaXplckVycm9yKFxuICAgICAgRXJyb3JzLkF3YWl0RXhwcmVzc2lvbkZvcm1hbFBhcmFtZXRlcixcbiAgICAgIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICBhdDogbm9kZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmVhdCh0dC5zdGFyKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuT2Jzb2xldGVBd2FpdFN0YXIsIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNjb3BlLmluRnVuY3Rpb24gJiYgIXRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5pc0FtYmlndW91c0F3YWl0KCkpIHtcbiAgICAgICAgdGhpcy5hbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnNvbG9Bd2FpdCkge1xuICAgICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBd2FpdEV4cHJlc3Npb25cIik7XG4gIH1cblxuICBpc0FtYmlndW91c0F3YWl0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIEFsbCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIGFyZSBhbWJpZ3VvdXM6XG4gICAgICAvLyAgIGF3YWl0ICsgMCwgYXdhaXQgLSAwLCBhd2FpdCAoIDAgKSwgYXdhaXQgWyAwIF0sIGF3YWl0IC8gMCAvdSwgYXdhaXQgYGAsIGF3YWl0IG9mIFtdXG4gICAgICB0eXBlID09PSB0dC5wbHVzTWluIHx8XG4gICAgICB0eXBlID09PSB0dC5wYXJlbkwgfHxcbiAgICAgIHR5cGUgPT09IHR0LmJyYWNrZXRMIHx8XG4gICAgICB0b2tlbklzVGVtcGxhdGUodHlwZSkgfHxcbiAgICAgICh0eXBlID09PSB0dC5fb2YgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHx8XG4gICAgICAvLyBTb21ldGltZXMgdGhlIHRva2VuaXplciBnZW5lcmF0ZXMgdHQuc2xhc2ggZm9yIHJlZ2V4cHMsIGFuZCB0aGlzIGlzXG4gICAgICAvLyBoYW5kbGVyIGJ5IHBhcnNlRXhwckF0b21cbiAgICAgIHR5cGUgPT09IHR0LnJlZ2V4cCB8fFxuICAgICAgdHlwZSA9PT0gdHQuc2xhc2ggfHxcbiAgICAgIC8vIFRoaXMgY29kZSBjb3VsZCBiZSBwYXJzZWQgYm90aCBhcyBhIG1vZHVsbyBvcGVyYXRvciBvciBhcyBhbiBpbnRyaW5zaWM6XG4gICAgICAvLyAgIGF3YWl0ICV4KDApXG4gICAgICAodGhpcy5oYXNQbHVnaW4oXCJ2OGludHJpbnNpY1wiKSAmJiB0eXBlID09PSB0dC5tb2R1bG8pXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBhcnNlcyB5aWVsZCBleHByZXNzaW9uIGluc2lkZSBnZW5lcmF0b3IuXG5cbiAgcGFyc2VZaWVsZCh0aGlzOiBQYXJzZXIpOiBOLllpZWxkRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uWWllbGRFeHByZXNzaW9uPigpO1xuXG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUucmVjb3JkUGFyYW1ldGVySW5pdGlhbGl6ZXJFcnJvcihcbiAgICAgIEVycm9ycy5ZaWVsZEluUGFyYW1ldGVyLFxuICAgICAge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGF0OiBub2RlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbGV0IGRlbGVnYXRpbmcgPSBmYWxzZTtcbiAgICBsZXQgYXJndW1lbnQ6IE4uRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGlmICghdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSkge1xuICAgICAgZGVsZWdhdGluZyA9IHRoaXMuZWF0KHR0LnN0YXIpO1xuICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSB0dC5zZW1pOlxuICAgICAgICBjYXNlIHR0LmVvZjpcbiAgICAgICAgY2FzZSB0dC5icmFjZVI6XG4gICAgICAgIGNhc2UgdHQucGFyZW5SOlxuICAgICAgICBjYXNlIHR0LmJyYWNrZXRSOlxuICAgICAgICBjYXNlIHR0LmJyYWNlQmFyUjpcbiAgICAgICAgY2FzZSB0dC5jb2xvbjpcbiAgICAgICAgY2FzZSB0dC5jb21tYTpcbiAgICAgICAgICAvLyBUaGUgYWJvdmUgaXMgdGhlIGNvbXBsZXRlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW5cbiAgICAgICAgICAvLyBmb2xsb3cgYW4gQXNzaWdubWVudEV4cHJlc3Npb24sIGFuZCBub25lIG9mIHRoZW1cbiAgICAgICAgICAvLyBjYW4gc3RhcnQgYW4gQXNzaWdubWVudEV4cHJlc3Npb25cbiAgICAgICAgICBpZiAoIWRlbGVnYXRpbmcpIGJyZWFrO1xuICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZGVsZWdhdGUgPSBkZWxlZ2F0aW5nO1xuICAgIG5vZGUuYXJndW1lbnQgPSBhcmd1bWVudDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGVzIGEgcGlwZWxpbmUgKGZvciBhbnkgb2YgdGhlIHBpcGVsaW5lIEJhYnlsb24gcGx1Z2lucykgYXQgdGhlIHBvaW50XG4gIC8vIG9mIHRoZSBpbmZpeCBvcGVyYXRvciBgfD5gLlxuXG4gIGNoZWNrUGlwZWxpbmVBdEluZml4T3BlcmF0b3IobGVmdDogTi5FeHByZXNzaW9uLCBsZWZ0U3RhcnRMb2M6IFBvc2l0aW9uKSB7XG4gICAgaWYgKHRoaXMuaGFzUGx1Z2luKFtcInBpcGVsaW5lT3BlcmF0b3JcIiwgeyBwcm9wb3NhbDogXCJzbWFydFwiIH1dKSkge1xuICAgICAgaWYgKGxlZnQudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGlwZWxpbmUgaGVhZCBpcyBub3QgYSBjb21tYS1kZWxpbWl0ZWRcbiAgICAgICAgLy8gc2VxdWVuY2UgZXhwcmVzc2lvbi5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZWxpbmVIZWFkU2VxdWVuY2VFeHByZXNzaW9uLCB7XG4gICAgICAgICAgYXQ6IGxlZnRTdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTbWFydFBpcGVsaW5lQm9keUluU3R5bGUoY2hpbGRFeHByOiBOLkV4cHJlc3Npb24sIHN0YXJ0TG9jOiBQb3NpdGlvbikge1xuICAgIGlmICh0aGlzLmlzU2ltcGxlUmVmZXJlbmNlKGNoaWxkRXhwcikpIHtcbiAgICAgIGNvbnN0IGJvZHlOb2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlBpcGVsaW5lQmFyZUZ1bmN0aW9uPihzdGFydExvYyk7XG4gICAgICBib2R5Tm9kZS5jYWxsZWUgPSBjaGlsZEV4cHI7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIlBpcGVsaW5lQmFyZUZ1bmN0aW9uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib2R5Tm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgdGhpcy5jaGVja1NtYXJ0UGlwZVRvcGljQm9keUVhcmx5RXJyb3JzKHN0YXJ0TG9jKTtcbiAgICAgIGJvZHlOb2RlLmV4cHJlc3Npb24gPSBjaGlsZEV4cHI7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2ltcGxlUmVmZXJlbmNlKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoZXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFleHByZXNzaW9uLmNvbXB1dGVkICYmIHRoaXMuaXNTaW1wbGVSZWZlcmVuY2UoZXhwcmVzc2lvbi5vYmplY3QpXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGltbWVkaWF0ZWx5XG4gIC8vIGFmdGVyIGEgdG9waWMtc3R5bGUgc21hcnQtbWl4IHBpcGUgYm9keSBpcyBwYXJzZWQuXG4gIC8vIFRoZSBgc3RhcnRMb2NgIGlzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcGlwZSBib2R5LlxuXG4gIGNoZWNrU21hcnRQaXBlVG9waWNCb2R5RWFybHlFcnJvcnMoc3RhcnRMb2M6IFBvc2l0aW9uKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBpbnZhbGlkbHkgYD0+YCwgdGhlbiB0aHJvdyBhIGh1bWFuLWZyaWVuZGx5IGVycm9yXG4gICAgLy8gaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSAnVW5leHBlY3RlZCB0b2tlbiwgZXhwZWN0ZWQgXCI7XCInLlxuICAgIC8vIEZvciBleGFtcGxlLCBgeCA9PiB4IHw+IHkgPT4gI2AgKGFzc3VtaW5nIGAjYCBpcyB0aGUgdG9waWMgcmVmZXJlbmNlKVxuICAgIC8vIGdyb3VwcyBpbnRvIGB4ID0+ICh4IHw+IHkpID0+ICNgLFxuICAgIC8vIGFuZCBgKHggfD4geSkgPT4gI2AgaXMgYW4gaW52YWxpZCBhcnJvdyBmdW5jdGlvbi5cbiAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugc21hcnQtbWl4IGB8PmAgaGFzIHRpZ2h0ZXIgcHJlY2VkZW5jZSB0aGFuIGA9PmAuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuYXJyb3cpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5QaXBlbGluZUJvZHlOb0Fycm93LCB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0pO1xuICAgIH1cblxuICAgIC8vIEEgdG9waWMtc3R5bGUgc21hcnQtbWl4IHBpcGUgYm9keSBtdXN0IHVzZSB0aGUgdG9waWMgcmVmZXJlbmNlIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKCF0aGlzLnRvcGljUmVmZXJlbmNlV2FzVXNlZEluQ3VycmVudENvbnRleHQoKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZWxpbmVUb3BpY1VudXNlZCwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5hYmxlIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gSGFjay1zdHlsZSBwaXBlIGJvZGllcy5cbiAgLy8gVGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBwYXJzZXIncyB0b3BpYy1jb250ZXh0IHN0YXRlIHRvIGVuYWJsZSBvciBkaXNhYmxlXG4gIC8vIHRoZSB1c2Ugb2YgdG9waWMgcmVmZXJlbmNlcy5cbiAgLy8gVGhlIGZ1bmN0aW9uIHRoZW4gY2FsbHMgYSBjYWxsYmFjaywgdGhlbiByZXNldHMgdGhlIHBhcnNlclxuICAvLyB0byB0aGUgb2xkIHRvcGljLWNvbnRleHQgc3RhdGUgdGhhdCBpdCBoYWQgYmVmb3JlIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLlxuXG4gIHdpdGhUb3BpY0JpbmRpbmdDb250ZXh0PFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3Qgb3V0ZXJDb250ZXh0VG9waWNTdGF0ZSA9IHRoaXMuc3RhdGUudG9waWNDb250ZXh0O1xuICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0ge1xuICAgICAgLy8gRW5hYmxlIHRoZSB1c2Ugb2YgdGhlIHByaW1hcnkgdG9waWMgcmVmZXJlbmNlLlxuICAgICAgbWF4TnVtT2ZSZXNvbHZhYmxlVG9waWNzOiAxLFxuICAgICAgLy8gSGlkZSB0aGUgdXNlIG9mIGFueSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXIgY29udGV4dHMuXG4gICAgICBtYXhUb3BpY0luZGV4OiBudWxsLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0gb3V0ZXJDb250ZXh0VG9waWNTdGF0ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgaXMgdXNlZCBvbmx5IHdpdGggdGhlIGRlcHJlY2F0ZWQgc21hcnQtbWl4IHBpcGUgcHJvcG9zYWwuXG4gIC8vIERpc2FibGVzIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gc3ludGF4IGNvbnN0cnVjdHNcbiAgLy8gc3VjaCBhcyB0aGUgYm9kaWVzIG9mIGl0ZXJhdGlvbiBzdGF0ZW1lbnRzLlxuICAvLyBUaGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHBhcnNlcidzIHRvcGljLWNvbnRleHQgc3RhdGUgdG8gZW5hYmxlIG9yIGRpc2FibGVcbiAgLy8gdGhlIHVzZSBvZiB0b3BpYyByZWZlcmVuY2VzIHdpdGggdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbi4gVGhleSB0aGVuIHJ1biBhXG4gIC8vIGNhbGxiYWNrLCB0aGVuIHRoZXkgcmVzZXQgdGhlIHBhcnNlciB0byB0aGUgb2xkIHRvcGljLWNvbnRleHQgc3RhdGUgdGhhdCBpdFxuICAvLyBoYWQgYmVmb3JlIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLlxuXG4gIHdpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQ8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcInNtYXJ0XCIgfV0pKSB7XG4gICAgICAvLyBSZXNldCB0aGUgcGFyc2VyXHUyMDE5cyB0b3BpYyBjb250ZXh0IG9ubHkgaWYgdGhlIHNtYXJ0LW1peCBwaXBlIHByb3Bvc2FsIGlzIGFjdGl2ZS5cbiAgICAgIGNvbnN0IG91dGVyQ29udGV4dFRvcGljU3RhdGUgPSB0aGlzLnN0YXRlLnRvcGljQ29udGV4dDtcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0ge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSB1c2Ugb2YgdGhlIHByaW1hcnkgdG9waWMgcmVmZXJlbmNlLlxuICAgICAgICBtYXhOdW1PZlJlc29sdmFibGVUb3BpY3M6IDAsXG4gICAgICAgIC8vIEhpZGUgdGhlIHVzZSBvZiBhbnkgdG9waWMgcmVmZXJlbmNlcyBmcm9tIG91dGVyIGNvbnRleHRzLlxuICAgICAgICBtYXhUb3BpY0luZGV4OiBudWxsLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLnRvcGljQ29udGV4dCA9IG91dGVyQ29udGV4dFRvcGljU3RhdGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBwaXBlIHByb3Bvc2FsIGlzIFwibWluaW1hbFwiLCBcImZzaGFycFwiLCBvciBcImhhY2tcIixcbiAgICAgIC8vIG9yIGlmIG5vIHBpcGUgcHJvcG9zYWwgaXMgYWN0aXZlLFxuICAgICAgLy8gdGhlbiB0aGUgY2FsbGJhY2sgcmVzdWx0IGlzIHJldHVybmVkXG4gICAgICAvLyB3aXRob3V0IHRvdWNoaW5nIGFueSBleHRyYSBwYXJzZXIgc3RhdGUuXG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICB3aXRoU29sb0F3YWl0UGVybWl0dGluZ0NvbnRleHQ8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBvdXRlckNvbnRleHRTb2xvQXdhaXRTdGF0ZSA9IHRoaXMuc3RhdGUuc29sb0F3YWl0O1xuICAgIHRoaXMuc3RhdGUuc29sb0F3YWl0ID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGF0ZS5zb2xvQXdhaXQgPSBvdXRlckNvbnRleHRTb2xvQXdhaXRTdGF0ZTtcbiAgICB9XG4gIH1cblxuICBhbGxvd0luQW5kPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKTtcbiAgICBjb25zdCBwcm9kUGFyYW1Ub1NldCA9IFBBUkFNX0lOICYgfmZsYWdzO1xuICAgIGlmIChwcm9kUGFyYW1Ub1NldCkge1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZmxhZ3MgfCBQQVJBTV9JTik7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICBkaXNhbGxvd0luQW5kPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKTtcbiAgICBjb25zdCBwcm9kUGFyYW1Ub0NsZWFyID0gUEFSQU1fSU4gJiBmbGFncztcbiAgICBpZiAocHJvZFBhcmFtVG9DbGVhcikge1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZmxhZ3MgJiB+UEFSQU1fSU4pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHVzZSBvZiBhIHRvcGljIHJlZmVyZW5jZSB3aXRoaW4gdGhlIGN1cnJlbnRcbiAgLy8gdG9waWMtYmluZGluZyBjb250ZXh0LlxuICByZWdpc3RlclRvcGljUmVmZXJlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0Lm1heFRvcGljSW5kZXggPSAwO1xuICB9XG5cbiAgdG9waWNSZWZlcmVuY2VJc0FsbG93ZWRJbkN1cnJlbnRDb250ZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnRvcGljQ29udGV4dC5tYXhOdW1PZlJlc29sdmFibGVUb3BpY3MgPj0gMTtcbiAgfVxuXG4gIHRvcGljUmVmZXJlbmNlV2FzVXNlZEluQ3VycmVudENvbnRleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0Lm1heFRvcGljSW5kZXggIT0gbnVsbCAmJlxuICAgICAgdGhpcy5zdGF0ZS50b3BpY0NvbnRleHQubWF4VG9waWNJbmRleCA+PSAwXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlRlNoYXJwUGlwZWxpbmVCb2R5KHRoaXM6IFBhcnNlciwgcHJlYzogbnVtYmVyKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJldCA9IHRoaXMucGFyc2VFeHByT3AoXG4gICAgICB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZSgpLFxuICAgICAgc3RhcnRMb2MsXG4gICAgICBwcmVjLFxuICAgICk7XG5cbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gb2xkSW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtanMtbW9kdWxlLWJsb2Nrc1xuICBwYXJzZU1vZHVsZUV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5Nb2R1bGVFeHByZXNzaW9uIHtcbiAgICB0aGlzLmV4cGVjdFBsdWdpbihcIm1vZHVsZUJsb2Nrc1wiKTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Nb2R1bGVFeHByZXNzaW9uPigpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgXCJtb2R1bGVcIlxuICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQobnVsbCwgdHQuYnJhY2VMKTtcbiAgICB9XG4gICAgLy8gc3RhcnQgcHJvZ3JhbSBub2RlIGltbWVkaWF0ZWx5IGFmdGVyIGB7YFxuICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uUHJvZ3JhbT4odGhpcy5zdGF0ZS5lbmRMb2MpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHtgXG5cbiAgICBjb25zdCByZXZlcnRTY29wZXMgPSB0aGlzLmluaXRpYWxpemVTY29wZXMoLyoqIGluTW9kdWxlICovIHRydWUpO1xuICAgIHRoaXMuZW50ZXJJbml0aWFsU2NvcGVzKCk7XG5cbiAgICB0cnkge1xuICAgICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVByb2dyYW0ocHJvZ3JhbSwgdHQuYnJhY2VSLCBcIm1vZHVsZVwiKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmV2ZXJ0U2NvcGVzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGU8Ti5Nb2R1bGVFeHByZXNzaW9uPihub2RlLCBcIk1vZHVsZUV4cHJlc3Npb25cIik7XG4gIH1cblxuICAvLyBVc2VkIGluIEZsb3cgcGx1Z2luXG4gIHBhcnNlUHJvcGVydHlOYW1lUHJlZml4T3BlcmF0b3IoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXIgfCBOLkNsYXNzTWVtYmVyPixcbiAgKTogdm9pZCB7fVxufVxuIiwgImltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIHRva2VuSXNJZGVudGlmaWVyLFxuICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcixcbiAgdG9rZW5Jc0xvb3AsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdHQsXG4gIHR5cGUgVG9rZW5UeXBlLFxuICBnZXRFeHBvcnRlZFRva2VuLFxufSBmcm9tIFwiLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgRXhwcmVzc2lvblBhcnNlciBmcm9tIFwiLi9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBFcnJvcnMgfSBmcm9tIFwiLi4vcGFyc2UtZXJyb3JcIjtcbmltcG9ydCB7IGlzSWRlbnRpZmllckNoYXIsIGlzSWRlbnRpZmllclN0YXJ0IH0gZnJvbSBcIi4uL3V0aWwvaWRlbnRpZmllclwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB7XG4gIEJJTkRfQ0xBU1MsXG4gIEJJTkRfTEVYSUNBTCxcbiAgQklORF9WQVIsXG4gIEJJTkRfRlVOQ1RJT04sXG4gIFNDT1BFX0NMQVNTLFxuICBTQ09QRV9GVU5DVElPTixcbiAgU0NPUEVfT1RIRVIsXG4gIFNDT1BFX1NJTVBMRV9DQVRDSCxcbiAgU0NPUEVfU1RBVElDX0JMT0NLLFxuICBTQ09QRV9TVVBFUixcbiAgQ0xBU1NfRUxFTUVOVF9PVEhFUixcbiAgQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9HRVRURVIsXG4gIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfU0VUVEVSLFxuICBDTEFTU19FTEVNRU5UX1NUQVRJQ19HRVRURVIsXG4gIENMQVNTX0VMRU1FTlRfU1RBVElDX1NFVFRFUixcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIEJJTkRfQ0FUQ0hfUEFSQU0sXG59IGZyb20gXCIuLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25FcnJvcnMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBQQVJBTSwgZnVuY3Rpb25GbGFncyB9IGZyb20gXCIuLi91dGlsL3Byb2R1Y3Rpb24tcGFyYW1ldGVyXCI7XG5pbXBvcnQge1xuICBuZXdFeHByZXNzaW9uU2NvcGUsXG4gIG5ld1BhcmFtZXRlckRlY2xhcmF0aW9uU2NvcGUsXG59IGZyb20gXCIuLi91dGlsL2V4cHJlc3Npb24tc2NvcGVcIjtcbmltcG9ydCB0eXBlIHsgU291cmNlVHlwZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCIuLi90b2tlbml6ZXJcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0IH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IGNsb25lU3RyaW5nTGl0ZXJhbCwgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuL25vZGVcIjtcbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgUGFyc2VCaW5kaW5nTGlzdEZsYWdzIH0gZnJvbSBcIi4vbHZhbFwiO1xuXG5jb25zdCBsb29wTGFiZWwgPSB7IGtpbmQ6IFwibG9vcFwiIH0gYXMgY29uc3QsXG4gIHN3aXRjaExhYmVsID0geyBraW5kOiBcInN3aXRjaFwiIH0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlRnVuY3Rpb25GbGFnIHtcbiAgRXhwcmVzc2lvbiA9IDBiMDAwMCxcbiAgRGVjbGFyYXRpb24gPSAwYjAwMDEsXG4gIEhhbmdpbmdEZWNsYXJhdGlvbiA9IDBiMDAxMCxcbiAgTnVsbGFibGVJZCA9IDBiMDEwMCxcbiAgQXN5bmMgPSAwYjEwMDAsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlU3RhdGVtZW50RmxhZyB7XG4gIFN0YXRlbWVudE9ubHkgPSAwYjAwMDAsXG4gIEFsbG93SW1wb3J0RXhwb3J0ID0gMGIwMDAxLFxuICBBbGxvd0RlY2xhcmF0aW9uID0gMGIwMDEwLFxuICBBbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb24gPSAwYjAxMDAsXG4gIEFsbG93TGFiZWxlZEZ1bmN0aW9uID0gMGIxMDAwLFxufVxuXG5jb25zdCBsb25lU3Vycm9nYXRlID0gL1tcXHVEODAwLVxcdURGRkZdL3U7XG5cbmNvbnN0IGtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3IgPSAvaW4oPzpzdGFuY2VvZik/L3k7XG5cbi8qKlxuICogQ29udmVydCB0b2tlbnMgZm9yIGJhY2t3YXJkIEJhYmVsIDcgY29tcGF0LlxuICogdHQucHJpdmF0ZU5hbWUgPT4gdHQuaGFzaCArIHR0Lm5hbWVcbiAqIHR0LnRlbXBsYXRlVGFpbCA9PiB0dC5iYWNrcXVvdGUvdHQuYnJhY2VSICsgdHQudGVtcGxhdGUgKyB0dC5iYWNrcXVvdGVcbiAqIHR0LnRlbXBsYXRlTm9uVGFpbCA9PiB0dC5iYWNrcXVvdGUvdHQuYnJhY2VSICsgdHQudGVtcGxhdGUgKyB0dC5kb2xsYXJCcmFjZUxcbiAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoaXMgcm91dGluZSBtdXRhdGVzIGB0b2tlbnNgLCBpdCBpcyBva2F5XG4gKiBoZXJlIHNpbmNlIHdlIGV4ZWN1dGUgYHBhcnNlVG9wTGV2ZWxgIG9uY2UgZm9yIGV2ZXJ5IGZpbGUuXG4gKi9cbmZ1bmN0aW9uIGJhYmVsN0NvbXBhdFRva2Vucyh0b2tlbnM6IChUb2tlbiB8IE4uQ29tbWVudClbXSwgaW5wdXQ6IHN0cmluZykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gdG9rZW47XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHR0LnByaXZhdGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgeyBsb2MsIHN0YXJ0LCB2YWx1ZSwgZW5kIH0gPSB0b2tlbjtcbiAgICAgICAgICBjb25zdCBoYXNoRW5kUG9zID0gc3RhcnQgKyAxO1xuICAgICAgICAgIGNvbnN0IGhhc2hFbmRMb2MgPSBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQobG9jLnN0YXJ0LCAxKTtcbiAgICAgICAgICB0b2tlbnMuc3BsaWNlKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQuaGFzaCksXG4gICAgICAgICAgICAgIHZhbHVlOiBcIiNcIixcbiAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICBlbmQ6IGhhc2hFbmRQb3MsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBsb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZExvYzogaGFzaEVuZExvYyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFRva2VuKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGFja3kgd2F5IHRvIGNyZWF0ZSB0b2tlblxuICAgICAgICAgICAgICB0eXBlOiBnZXRFeHBvcnRlZFRva2VuKHR0Lm5hbWUpLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIHN0YXJ0OiBoYXNoRW5kUG9zLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IGhhc2hFbmRMb2MsXG4gICAgICAgICAgICAgIGVuZExvYzogbG9jLmVuZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuSXNUZW1wbGF0ZSh0eXBlKSkge1xuICAgICAgICAgIGNvbnN0IHsgbG9jLCBzdGFydCwgdmFsdWUsIGVuZCB9ID0gdG9rZW47XG4gICAgICAgICAgY29uc3QgYmFja3F1b3RlRW5kID0gc3RhcnQgKyAxO1xuICAgICAgICAgIGNvbnN0IGJhY2txdW90ZUVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChsb2Muc3RhcnQsIDEpO1xuICAgICAgICAgIGxldCBzdGFydFRva2VuO1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gY2hhckNvZGVzLmdyYXZlQWNjZW50KSB7XG4gICAgICAgICAgICBzdGFydFRva2VuID0gbmV3IFRva2VuKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGFja3kgd2F5IHRvIGNyZWF0ZSB0b2tlblxuICAgICAgICAgICAgICB0eXBlOiBnZXRFeHBvcnRlZFRva2VuKHR0LmJhY2tRdW90ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBcImBcIixcbiAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICBlbmQ6IGJhY2txdW90ZUVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IGxvYy5zdGFydCxcbiAgICAgICAgICAgICAgZW5kTG9jOiBiYWNrcXVvdGVFbmRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRUb2tlbiA9IG5ldyBUb2tlbih7XG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhhY2t5IHdheSB0byBjcmVhdGUgdG9rZW5cbiAgICAgICAgICAgICAgdHlwZTogZ2V0RXhwb3J0ZWRUb2tlbih0dC5icmFjZVIpLFxuICAgICAgICAgICAgICB2YWx1ZTogXCJ9XCIsXG4gICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgICAgZW5kOiBiYWNrcXVvdGVFbmQsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBsb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZExvYzogYmFja3F1b3RlRW5kTG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB0ZW1wbGF0ZVZhbHVlLFxuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kTG9jLFxuICAgICAgICAgICAgZW5kVG9rZW47XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHR0LnRlbXBsYXRlVGFpbCkge1xuICAgICAgICAgICAgLy8gZW5kcyB3aXRoICdgJ1xuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kID0gZW5kIC0gMTtcbiAgICAgICAgICAgIHRlbXBsYXRlRWxlbWVudEVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChsb2MuZW5kLCAtMSk7XG4gICAgICAgICAgICB0ZW1wbGF0ZVZhbHVlID0gdmFsdWUgPT09IG51bGwgPyBudWxsIDogdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgZW5kVG9rZW4gPSBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQuYmFja1F1b3RlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiYFwiLFxuICAgICAgICAgICAgICBzdGFydDogdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IHRlbXBsYXRlRWxlbWVudEVuZExvYyxcbiAgICAgICAgICAgICAgZW5kTG9jOiBsb2MuZW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuZHMgd2l0aCBgJHtgXG4gICAgICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRFbmQgPSBlbmQgLSAyO1xuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kTG9jID0gY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KGxvYy5lbmQsIC0yKTtcbiAgICAgICAgICAgIHRlbXBsYXRlVmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB2YWx1ZS5zbGljZSgxLCAtMik7XG4gICAgICAgICAgICBlbmRUb2tlbiA9IG5ldyBUb2tlbih7XG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhhY2t5IHdheSB0byBjcmVhdGUgdG9rZW5cbiAgICAgICAgICAgICAgdHlwZTogZ2V0RXhwb3J0ZWRUb2tlbih0dC5kb2xsYXJCcmFjZUwpLFxuICAgICAgICAgICAgICB2YWx1ZTogXCIke1wiLFxuICAgICAgICAgICAgICBzdGFydDogdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IHRlbXBsYXRlRWxlbWVudEVuZExvYyxcbiAgICAgICAgICAgICAgZW5kTG9jOiBsb2MuZW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRva2Vucy5zcGxpY2UoXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIHN0YXJ0VG9rZW4sXG4gICAgICAgICAgICBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQudGVtcGxhdGUpLFxuICAgICAgICAgICAgICB2YWx1ZTogdGVtcGxhdGVWYWx1ZSxcbiAgICAgICAgICAgICAgc3RhcnQ6IGJhY2txdW90ZUVuZCxcbiAgICAgICAgICAgICAgZW5kOiB0ZW1wbGF0ZUVsZW1lbnRFbmQsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBiYWNrcXVvdGVFbmRMb2MsXG4gICAgICAgICAgICAgIGVuZExvYzogdGVtcGxhdGVFbGVtZW50RW5kTG9jLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUb2tlbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2UgbWFuaXB1bGF0ZSBgdG9rZW5gIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gICAgICB0b2tlbi50eXBlID0gZ2V0RXhwb3J0ZWRUb2tlbih0eXBlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFBhcnNlciBleHRlbmRzIEV4cHJlc3Npb25QYXJzZXIge1xuICAvLyAjIyMgU3RhdGVtZW50IHBhcnNpbmdcblxuICAvLyBQYXJzZSBhIHByb2dyYW0uIEluaXRpYWxpemVzIHRoZSBwYXJzZXIsIHJlYWRzIGFueSBudW1iZXIgb2ZcbiAgLy8gc3RhdGVtZW50cywgYW5kIHdyYXBzIHRoZW0gaW4gYSBQcm9ncmFtIG5vZGUuICBPcHRpb25hbGx5IHRha2VzIGFcbiAgLy8gYHByb2dyYW1gIGFyZ3VtZW50LiAgSWYgcHJlc2VudCwgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSBhcHBlbmRlZFxuICAvLyB0byBpdHMgYm9keSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuXG5cbiAgcGFyc2VUb3BMZXZlbCh0aGlzOiBQYXJzZXIsIGZpbGU6IE4uRmlsZSwgcHJvZ3JhbTogTi5Qcm9ncmFtKTogTi5GaWxlIHtcbiAgICBmaWxlLnByb2dyYW0gPSB0aGlzLnBhcnNlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICBmaWxlLmNvbW1lbnRzID0gdGhpcy5zdGF0ZS5jb21tZW50cztcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW5zKSB7XG4gICAgICBmaWxlLnRva2VucyA9IGJhYmVsN0NvbXBhdFRva2Vucyh0aGlzLnRva2VucywgdGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShmaWxlLCBcIkZpbGVcIik7XG4gIH1cblxuICBwYXJzZVByb2dyYW0oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb2dyYW06IFVuZG9uZTxOLlByb2dyYW0+LFxuICAgIGVuZDogVG9rZW5UeXBlID0gdHQuZW9mLFxuICAgIHNvdXJjZVR5cGU6IFNvdXJjZVR5cGUgPSB0aGlzLm9wdGlvbnMuc291cmNlVHlwZSxcbiAgKTogTi5Qcm9ncmFtIHtcbiAgICBwcm9ncmFtLnNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlO1xuICAgIHByb2dyYW0uaW50ZXJwcmV0ZXIgPSB0aGlzLnBhcnNlSW50ZXJwcmV0ZXJEaXJlY3RpdmUoKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tCb2R5KHByb2dyYW0sIHRydWUsIHRydWUsIGVuZCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbk1vZHVsZSAmJlxuICAgICAgIXRoaXMub3B0aW9ucy5hbGxvd1VuZGVjbGFyZWRFeHBvcnRzICYmXG4gICAgICB0aGlzLnNjb3BlLnVuZGVmaW5lZEV4cG9ydHMuc2l6ZSA+IDBcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgW2xvY2FsTmFtZSwgYXRdIG9mIEFycmF5LmZyb20odGhpcy5zY29wZS51bmRlZmluZWRFeHBvcnRzKSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVFeHBvcnRVbmRlZmluZWQsIHsgYXQsIGxvY2FsTmFtZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGZpbmlzaGVkUHJvZ3JhbTogTi5Qcm9ncmFtO1xuICAgIGlmIChlbmQgPT09IHR0LmVvZikge1xuICAgICAgLy8gZmluaXNoIGF0IGVvZiBmb3IgdG9wIGxldmVsIHByb2dyYW1cbiAgICAgIGZpbmlzaGVkUHJvZ3JhbSA9IHRoaXMuZmluaXNoTm9kZShwcm9ncmFtLCBcIlByb2dyYW1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZpbmlzaCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGVuZCB0b2tlblxuICAgICAgZmluaXNoZWRQcm9ncmFtID0gdGhpcy5maW5pc2hOb2RlQXQoXG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIFwiUHJvZ3JhbVwiLFxuICAgICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5zdGFydExvYywgLTEpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmlzaGVkUHJvZ3JhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYXN0IGEgU3RhdGVtZW50IHRvIGEgRGlyZWN0aXZlLiBUaGlzIG1ldGhvZCBtdXRhdGVzIGlucHV0IHN0YXRlbWVudC5cbiAgICovXG4gIHN0bXRUb0RpcmVjdGl2ZShzdG10OiBOLlN0YXRlbWVudCk6IE4uRGlyZWN0aXZlIHtcbiAgICBjb25zdCBkaXJlY3RpdmUgPSBzdG10IGFzIGFueTtcbiAgICBkaXJlY3RpdmUudHlwZSA9IFwiRGlyZWN0aXZlXCI7XG4gICAgZGlyZWN0aXZlLnZhbHVlID0gZGlyZWN0aXZlLmV4cHJlc3Npb247XG4gICAgZGVsZXRlIGRpcmVjdGl2ZS5leHByZXNzaW9uO1xuXG4gICAgY29uc3QgZGlyZWN0aXZlTGl0ZXJhbCA9IGRpcmVjdGl2ZS52YWx1ZTtcbiAgICBjb25zdCBleHByZXNzaW9uVmFsdWUgPSBkaXJlY3RpdmVMaXRlcmFsLnZhbHVlO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuaW5wdXQuc2xpY2UoZGlyZWN0aXZlTGl0ZXJhbC5zdGFydCwgZGlyZWN0aXZlTGl0ZXJhbC5lbmQpO1xuICAgIGNvbnN0IHZhbCA9IChkaXJlY3RpdmVMaXRlcmFsLnZhbHVlID0gcmF3LnNsaWNlKDEsIC0xKSk7IC8vIHJlbW92ZSBxdW90ZXNcblxuICAgIHRoaXMuYWRkRXh0cmEoZGlyZWN0aXZlTGl0ZXJhbCwgXCJyYXdcIiwgcmF3KTtcbiAgICB0aGlzLmFkZEV4dHJhKGRpcmVjdGl2ZUxpdGVyYWwsIFwicmF3VmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLmFkZEV4dHJhKGRpcmVjdGl2ZUxpdGVyYWwsIFwiZXhwcmVzc2lvblZhbHVlXCIsIGV4cHJlc3Npb25WYWx1ZSk7XG5cbiAgICBkaXJlY3RpdmVMaXRlcmFsLnR5cGUgPSBcIkRpcmVjdGl2ZUxpdGVyYWxcIjtcblxuICAgIHJldHVybiBkaXJlY3RpdmU7XG4gIH1cblxuICBwYXJzZUludGVycHJldGVyRGlyZWN0aXZlKCk6IE4uSW50ZXJwcmV0ZXJEaXJlY3RpdmUgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuaW50ZXJwcmV0ZXJEaXJlY3RpdmUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5JbnRlcnByZXRlckRpcmVjdGl2ZT4oKTtcbiAgICBub2RlLnZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIik7XG4gIH1cblxuICBpc0xldCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKHR0Ll9sZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc0ZvbGxvd2luZ0JpbmRpbmdBdG9tKCk7XG4gIH1cblxuICBjaFN0YXJ0c0JpbmRpbmdJZGVudGlmaWVyKGNoOiBudW1iZXIsIHBvczogbnVtYmVyKSB7XG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNoKSkge1xuICAgICAga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvci5sYXN0SW5kZXggPSBwb3M7XG4gICAgICBpZiAoa2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvci50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VlbiBgaW5gIG9yIGBpbnN0YW5jZW9mYCBzbyBmYXIsIG5vdyBjaGVjayBpZiB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBlbmRzIGhlcmVcbiAgICAgICAgY29uc3QgZW5kQ2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKGtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3IubGFzdEluZGV4KTtcbiAgICAgICAgaWYgKCFpc0lkZW50aWZpZXJDaGFyKGVuZENoKSAmJiBlbmRDaCAhPT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjaFN0YXJ0c0JpbmRpbmdQYXR0ZXJuKGNoOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2ggPT09IGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldCB8fCBjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3N1bWluZyB3ZSBoYXZlIHNlZW4gYSBjb250ZXh0dWFsIGBsZXRgIGFuZCBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkLCBjaGVjayBpZiBpdFxuICAgKiBzdGFydHMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzbyB0aGF0IGl0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIGtleXdvcmQuXG4gICAqL1xuICBoYXNGb2xsb3dpbmdCaW5kaW5nQXRvbSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5TdGFydCgpO1xuICAgIGNvbnN0IG5leHRDaCA9IHRoaXMuY29kZVBvaW50QXRQb3MobmV4dCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hTdGFydHNCaW5kaW5nUGF0dGVybihuZXh0Q2gpIHx8XG4gICAgICB0aGlzLmNoU3RhcnRzQmluZGluZ0lkZW50aWZpZXIobmV4dENoLCBuZXh0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXNzdW1pbmcgd2UgaGF2ZSBzZWVuIGEgY29udGV4dHVhbCBgdXNpbmdgIGFuZCBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkLCBjaGVjayBpZiBpdFxuICAgKiBzdGFydHMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiB0aGUgc2FtZSBsaW5lIHNvIHRoYXQgaXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gICAqIGEga2V5d29yZC5cbiAgICovXG4gIGhhc0luTGluZUZvbGxvd2luZ0JpbmRpbmdJZGVudGlmaWVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlbkluTGluZVN0YXJ0KCk7XG4gICAgY29uc3QgbmV4dENoID0gdGhpcy5jb2RlUG9pbnRBdFBvcyhuZXh0KTtcbiAgICByZXR1cm4gdGhpcy5jaFN0YXJ0c0JpbmRpbmdJZGVudGlmaWVyKG5leHRDaCwgbmV4dCk7XG4gIH1cblxuICBzdGFydHNVc2luZ0Zvck9mKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdHlwZSwgY29udGFpbnNFc2MgfSA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgaWYgKHR5cGUgPT09IHR0Ll9vZiAmJiAhY29udGFpbnNFc2MpIHtcbiAgICAgIC8vIGB1c2luZyBvZmAgbXVzdCBzdGFydCBhIGZvci1saHMtb2Ygc3RhdGVtZW50XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0b2tlbklzSWRlbnRpZmllcih0eXBlKSAmJiAhdGhpcy5oYXNGb2xsb3dpbmdMaW5lQnJlYWsoKSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBsaWNpdFJlc291cmNlTWFuYWdlbWVudFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0c0F3YWl0VXNpbmcoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHQgPSB0aGlzLm5leHRUb2tlbkluTGluZVN0YXJ0KCk7XG4gICAgaWYgKHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgXCJ1c2luZ1wiKSkge1xuICAgICAgbmV4dCA9IHRoaXMubmV4dFRva2VuSW5MaW5lU3RhcnRTaW5jZShuZXh0ICsgNSk7XG4gICAgICBjb25zdCBuZXh0Q2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHQpO1xuICAgICAgaWYgKHRoaXMuY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihuZXh0Q2gsIG5leHQpKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZXhwbGljaXRSZXNvdXJjZU1hbmFnZW1lbnRcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Nb2R1bGVJdGVtXG4gIHBhcnNlTW9kdWxlSXRlbSh0aGlzOiBQYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoXG4gICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dJbXBvcnRFeHBvcnQgfFxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dEZWNsYXJhdGlvbiB8XG4gICAgICAgIFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb24gfFxuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGFsc28gdXNlZCB0byBwYXJzZSBTdGF0ZW1lbnRJdGVtcyxcbiAgICAgICAgLy8gd2hpY2ggd2l0aCBBbm5leCBCIGVuYWJsZWQgYWxsb3dzIGxhYmVsZWQgZnVuY3Rpb25zLlxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dMYWJlbGVkRnVuY3Rpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVN0YXRlbWVudExpc3RJdGVtXG4gIHBhcnNlU3RhdGVtZW50TGlzdEl0ZW0odGhpczogUGFyc2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRMaWtlKFxuICAgICAgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93RGVjbGFyYXRpb24gfFxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uIHxcbiAgICAgICAgKCF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8IHRoaXMuc3RhdGUuc3RyaWN0XG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dMYWJlbGVkRnVuY3Rpb24pLFxuICAgICk7XG4gIH1cblxuICBwYXJzZVN0YXRlbWVudE9yU2xvcHB5QW5uZXhCRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYWxsb3dMYWJlbGVkRnVuY3Rpb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgbGV0IGZsYWdzOiBQYXJzZVN0YXRlbWVudEZsYWcgPSBQYXJzZVN0YXRlbWVudEZsYWcuU3RhdGVtZW50T25seTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFubmV4QiAmJiAhdGhpcy5zdGF0ZS5zdHJpY3QpIHtcbiAgICAgIGZsYWdzIHw9IFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb247XG4gICAgICBpZiAoYWxsb3dMYWJlbGVkRnVuY3Rpb24pIHtcbiAgICAgICAgZmxhZ3MgfD0gUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93TGFiZWxlZEZ1bmN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoZmxhZ3MpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAvL1xuICAvLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuICAvLyByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbC4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgbGlrZVxuICAvLyBgaWYgKGZvbykgL2JsYWgvLmV4ZWMoZm9vKWAsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuXG4gIC8vIGRvZXMgbm90IGhlbHAuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVN0YXRlbWVudFxuICBwYXJzZVN0YXRlbWVudCh0aGlzOiBQYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoUGFyc2VTdGF0ZW1lbnRGbGFnLlN0YXRlbWVudE9ubHkpO1xuICB9XG5cbiAgLy8gSW1wb3J0RGVjbGFyYXRpb24gYW5kIEV4cG9ydERlY2xhcmF0aW9uIGFyZSBhbHNvIGhhbmRsZWQgaGVyZSBzbyB3ZSBjYW4gdGhyb3cgcmVjb3ZlcmFibGUgZXJyb3JzXG4gIC8vIHdoZW4gdGhleSBhcmUgbm90IGF0IHRoZSB0b3AgbGV2ZWxcbiAgcGFyc2VTdGF0ZW1lbnRMaWtlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBmbGFnczogUGFyc2VTdGF0ZW1lbnRGbGFnLFxuICApOlxuICAgIHwgTi5TdGF0ZW1lbnRcbiAgICB8IE4uRGVjbGFyYXRpb25cbiAgICB8IE4uSW1wb3J0RGVjbGFyYXRpb25cbiAgICB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXG4gICAgfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cbiAgICB8IE4uRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICAgIGxldCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5hdCkpIHtcbiAgICAgIGRlY29yYXRvcnMgPSB0aGlzLnBhcnNlRGVjb3JhdG9ycyh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRDb250ZW50KGZsYWdzLCBkZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHBhcnNlU3RhdGVtZW50Q29udGVudChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgICBkZWNvcmF0b3JzPzogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICk6IE4uU3RhdGVtZW50IHtcbiAgICBjb25zdCBzdGFydHR5cGUgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgY29uc3QgYWxsb3dEZWNsYXJhdGlvbiA9ICEhKGZsYWdzICYgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93RGVjbGFyYXRpb24pO1xuICAgIGNvbnN0IGFsbG93RnVuY3Rpb25EZWNsYXJhdGlvbiA9ICEhKFxuICAgICAgZmxhZ3MgJiBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgKTtcbiAgICBjb25zdCB0b3BMZXZlbCA9IGZsYWdzICYgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93SW1wb3J0RXhwb3J0O1xuXG4gICAgLy8gTW9zdCB0eXBlcyBvZiBzdGF0ZW1lbnRzIGFyZSByZWNvZ25pemVkIGJ5IHRoZSBrZXl3b3JkIHRoZXlcbiAgICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2ZcbiAgICAvLyBjb21wbGV4aXR5LlxuXG4gICAgc3dpdGNoIChzdGFydHR5cGUpIHtcbiAgICAgIGNhc2UgdHQuX2JyZWFrOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgLyogaXNCcmVhayAqLyB0cnVlKTtcbiAgICAgIGNhc2UgdHQuX2NvbnRpbnVlOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgLyogaXNCcmVhayAqLyBmYWxzZSk7XG4gICAgICBjYXNlIHR0Ll9kZWJ1Z2dlcjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkRlYnVnZ2VyU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9kbzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEb1doaWxlU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uRG9XaGlsZVN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fZm9yOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZvclN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkZvclN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fZnVuY3Rpb246XG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5kb3QpIGJyZWFrO1xuICAgICAgICBpZiAoIWFsbG93RnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0cmljdFxuICAgICAgICAgICAgICA/IEVycm9ycy5TdHJpY3RGdW5jdGlvblxuICAgICAgICAgICAgICA6IHRoaXMub3B0aW9ucy5hbm5leEJcbiAgICAgICAgICAgICAgPyBFcnJvcnMuU2xvcHB5RnVuY3Rpb25Bbm5leEJcbiAgICAgICAgICAgICAgOiBFcnJvcnMuU2xvcHB5RnVuY3Rpb24sXG4gICAgICAgICAgICB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KFxuICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgIWFsbG93RGVjbGFyYXRpb24gJiYgYWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICAgICAgICApO1xuICAgICAgY2FzZSB0dC5fY2xhc3M6XG4gICAgICAgIGlmICghYWxsb3dEZWNsYXJhdGlvbikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoXG4gICAgICAgICAgdGhpcy5tYXliZVRha2VEZWNvcmF0b3JzKFxuICAgICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uQ2xhc3NEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuXG4gICAgICBjYXNlIHR0Ll9pZjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLklmU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9yZXR1cm46XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uUmV0dXJuU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9zd2l0Y2g6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uU3dpdGNoU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll90aHJvdzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUaHJvd1N0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLlRocm93U3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll90cnk6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uVHJ5U3RhdGVtZW50Pik7XG5cbiAgICAgIGNhc2UgdHQuX2F3YWl0OlxuICAgICAgICAvLyBbK0F3YWl0XSBhd2FpdCBbbm8gTGluZVRlcm1pbmF0b3IgaGVyZV0gdXNpbmcgW25vIExpbmVUZXJtaW5hdG9yIGhlcmVdIEJpbmRpbmdMaXN0WytVc2luZ11cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmNvbnRhaW5zRXNjICYmIHRoaXMuc3RhcnRzQXdhaXRVc2luZygpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQXdhaXRBbGxvd2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkF3YWl0VXNpbmdOb3RJbkFzeW5jQ29udGV4dCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTGV4aWNhbERlY2xhcmF0aW9uLCB7XG4gICAgICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJ2F3YWl0J1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVmFyU3RhdGVtZW50KFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIFwiYXdhaXQgdXNpbmdcIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0dC5fdXNpbmc6XG4gICAgICAgIC8vIHVzaW5nIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBCaW5kaW5nTGlzdFsrVXNpbmddXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjIHx8XG4gICAgICAgICAgIXRoaXMuaGFzSW5MaW5lRm9sbG93aW5nQmluZGluZ0lkZW50aWZpZXIoKVxuICAgICAgICApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGVjdFBsdWdpbihcImV4cGxpY2l0UmVzb3VyY2VNYW5hZ2VtZW50XCIpO1xuICAgICAgICBpZiAoIXRoaXMuc2NvcGUuaW5Nb2R1bGUgJiYgdGhpcy5zY29wZS5pblRvcExldmVsKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFVzaW5nRGVjbGFyYXRpb24sIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZExleGljYWxEZWNsYXJhdGlvbiwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICBcInVzaW5nXCIsXG4gICAgICAgICk7XG4gICAgICBjYXNlIHR0Ll9sZXQ6IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBgbGV0IFtgIGlzIGFuIGV4cGxpY2l0IG5lZ2F0aXZlIGxvb2thaGVhZCBmb3JcbiAgICAgICAgLy8gRXhwcmVzc2lvblN0YXRlbWVudCwgc28gc3BlY2lhbC1jYXNlIGl0IGZpcnN0LlxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5TdGFydCgpO1xuICAgICAgICBjb25zdCBuZXh0Q2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHQpO1xuICAgICAgICBpZiAobmV4dENoICE9PSBjaGFyQ29kZXMubGVmdFNxdWFyZUJyYWNrZXQpIHtcbiAgICAgICAgICBpZiAoIWFsbG93RGVjbGFyYXRpb24gJiYgdGhpcy5oYXNGb2xsb3dpbmdMaW5lQnJlYWsoKSkgYnJlYWs7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihuZXh0Q2gsIG5leHQpICYmXG4gICAgICAgICAgICBuZXh0Q2ggIT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX2NvbnN0OiB7XG4gICAgICAgIGlmICghYWxsb3dEZWNsYXJhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRMZXhpY2FsRGVjbGFyYXRpb24sIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX3Zhcjoge1xuICAgICAgICBjb25zdCBraW5kID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICBraW5kLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSB0dC5fd2hpbGU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQobm9kZSBhcyBVbmRvbmU8Ti5XaGlsZVN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fd2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uV2l0aFN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5icmFjZUw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICAgIGNhc2UgdHQuc2VtaTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFbXB0eVN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkVtcHR5U3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9pbXBvcnQ6IHtcbiAgICAgICAgY29uc3QgbmV4dFRva2VuQ2hhckNvZGUgPSB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0VG9rZW5DaGFyQ29kZSA9PT0gY2hhckNvZGVzLmxlZnRQYXJlbnRoZXNpcyB8fCAvLyBpbXBvcnQoKVxuICAgICAgICAgIG5leHRUb2tlbkNoYXJDb2RlID09PSBjaGFyQ29kZXMuZG90IC8vIGltcG9ydC5tZXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX2V4cG9ydDoge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmUgJiYgIXRvcExldmVsKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZEltcG9ydEV4cG9ydCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBpbXBvcnRgL2BleHBvcnRgXG5cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgaWYgKHN0YXJ0dHlwZSA9PT0gdHQuX2ltcG9ydCkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VJbXBvcnQobm9kZSBhcyBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIiAmJlxuICAgICAgICAgICAgKCFyZXN1bHQuaW1wb3J0S2luZCB8fCByZXN1bHQuaW1wb3J0S2luZCA9PT0gXCJ2YWx1ZVwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VFeHBvcnQoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxcbiAgICAgICAgICAgICAgfCBOLkV4cG9ydEFsbERlY2xhcmF0aW9uXG4gICAgICAgICAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgfCBOLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblxuICAgICAgICAgICAgPixcbiAgICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChyZXN1bHQudHlwZSA9PT0gXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgKCFyZXN1bHQuZXhwb3J0S2luZCB8fCByZXN1bHQuZXhwb3J0S2luZCA9PT0gXCJ2YWx1ZVwiKSkgfHxcbiAgICAgICAgICAgIChyZXN1bHQudHlwZSA9PT0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiICYmXG4gICAgICAgICAgICAgICghcmVzdWx0LmV4cG9ydEtpbmQgfHwgcmVzdWx0LmV4cG9ydEtpbmQgPT09IFwidmFsdWVcIikpIHx8XG4gICAgICAgICAgICByZXN1bHQudHlwZSA9PT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hc3NlcnRNb2R1bGVOb2RlQWxsb3dlZChyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuaXNBc3luY0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICBpZiAoIWFsbG93RGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnYXN5bmMnXG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgIWFsbG93RGVjbGFyYXRpb24gJiYgYWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc3RhdGVtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGF0ZW1lbnQga2V5d29yZCBvciBhXG4gICAgLy8gYnJhY2UsIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudCBvciBMYWJlbGVkU3RhdGVtZW50LiBXZVxuICAgIC8vIHNpbXBseSBzdGFydCBwYXJzaW5nIGFuIGV4cHJlc3Npb24sIGFuZCBhZnRlcndhcmRzLCBpZiB0aGVcbiAgICAvLyBuZXh0IHRva2VuIGlzIGEgY29sb24gYW5kIHRoZSBleHByZXNzaW9uIHdhcyBhIHNpbXBsZVxuICAgIC8vIElkZW50aWZpZXIgbm9kZSwgd2Ugc3dpdGNoIHRvIGludGVycHJldGluZyBpdCBhcyBhIGxhYmVsLlxuICAgIGNvbnN0IG1heWJlTmFtZSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoXG4gICAgICB0b2tlbklzSWRlbnRpZmllcihzdGFydHR5cGUpICYmXG4gICAgICBleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICB0aGlzLmVhdCh0dC5jb2xvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTGFiZWxlZFN0YXRlbWVudChcbiAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5MYWJlbGVkU3RhdGVtZW50PixcbiAgICAgICAgbWF5YmVOYW1lLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgZXhwcixcbiAgICAgICAgZmxhZ3MsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXhwcmVzc2lvblN0YXRlbWVudD4sXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGRlY29yYXRvcnMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzc2VydE1vZHVsZU5vZGVBbGxvd2VkKG5vZGU6IE4uTm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZSAmJiAhdGhpcy5pbk1vZHVsZSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW1wb3J0T3V0c2lkZU1vZHVsZSwgeyBhdDogbm9kZSB9KTtcbiAgICB9XG4gIH1cblxuICBkZWNvcmF0b3JzRW5hYmxlZEJlZm9yZUV4cG9ydCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzLWxlZ2FjeVwiKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaGFzUGx1Z2luKFwiZGVjb3JhdG9yc1wiKSAmJlxuICAgICAgdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJkZWNvcmF0b3JzXCIsIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiKSAhPT0gZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLy8gQXR0YWNoIHRoZSBkZWNvcmF0b3JzIHRvIHRoZSBnaXZlbiBjbGFzcy5cbiAgLy8gTk9URTogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgLnN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBjbGFzcywgYW5kIHRodXNcbiAgLy8gY2FuIGFmZmVjdCBjb21tZW50IGF0dGFjaG1lbnQuIENhbGxpbmcgaXQgYmVmb3JlIG9yIGFmdGVyIGZpbmFsaXppbmdcbiAgLy8gdGhlIGNsYXNzIG5vZGUgKGFuZCB0aHVzIGZpbmFsaXppbmcgaXRzIGNvbW1lbnRzKSBjaGFuZ2VzIGhvdyBjb21tZW50c1xuICAvLyBiZWZvcmUgdGhlIGBjbGFzc2Aga2V5d29yZCBvciBiZWZvcmUgdGhlIGZpbmFsIC5zdGFydCBsb2NhdGlvbiBvZiB0aGVcbiAgLy8gY2xhc3MgYXJlIGF0dGFjaGVkLlxuICBtYXliZVRha2VEZWNvcmF0b3JzPFQgZXh0ZW5kcyBVbmRvbmU8Ti5DbGFzcz4+KFxuICAgIG1heWJlRGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgY2xhc3NOb2RlOiBULFxuICAgIGV4cG9ydE5vZGU/OiBVbmRvbmU8Ti5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICApOiBUIHtcbiAgICBpZiAobWF5YmVEZWNvcmF0b3JzKSB7XG4gICAgICBpZiAoY2xhc3NOb2RlLmRlY29yYXRvcnMgJiYgY2xhc3NOb2RlLmRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBOb3RlOiBkZWNvcmF0b3JzIGF0dGFjaG1lbnQgaXMgb25seSBhdHRlbXByZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgLy8gd2hlbiB0aGUgY2xhc3MgaXMgcGFydCBvZiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdGhpcy5nZXRQbHVnaW5PcHRpb24oXG4gICAgICAgICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgICAgICAgIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiLFxuICAgICAgICAgICkgIT09IFwiYm9vbGVhblwiXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGBkZWNvcmF0b3JzQmVmb3JlRXhwb3J0YCB3YXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgLCB3ZVxuICAgICAgICAgIC8vIGFscmVhZHkgdGhyZXcgYW4gZXJyb3IgYWJvdXQgZGVjb3JhdG9ycyBub3QgYmVpbmcgaW4gYSB2YWxpZFxuICAgICAgICAgIC8vIHBvc2l0aW9uLlxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvcnNCZWZvcmVBZnRlckV4cG9ydCwge1xuICAgICAgICAgICAgYXQ6IGNsYXNzTm9kZS5kZWNvcmF0b3JzWzBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTm9kZS5kZWNvcmF0b3JzLnVuc2hpZnQoLi4ubWF5YmVEZWNvcmF0b3JzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTm9kZS5kZWNvcmF0b3JzID0gbWF5YmVEZWNvcmF0b3JzO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShjbGFzc05vZGUsIG1heWJlRGVjb3JhdG9yc1swXSk7XG4gICAgICBpZiAoZXhwb3J0Tm9kZSkgdGhpcy5yZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShleHBvcnROb2RlLCBjbGFzc05vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOb2RlO1xuICB9XG5cbiAgY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQuX2NsYXNzKTtcbiAgfVxuXG4gIHBhcnNlRGVjb3JhdG9ycyh0aGlzOiBQYXJzZXIsIGFsbG93RXhwb3J0PzogYm9vbGVhbik6IE4uRGVjb3JhdG9yW10ge1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2godGhpcy5wYXJzZURlY29yYXRvcigpKTtcbiAgICB9IHdoaWxlICh0aGlzLm1hdGNoKHR0LmF0KSk7XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5fZXhwb3J0KSkge1xuICAgICAgaWYgKCFhbGxvd0V4cG9ydCkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRlY29yYXRvcnNFbmFibGVkQmVmb3JlRXhwb3J0KCkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yRXhwb3J0Q2xhc3MsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5jYW5IYXZlTGVhZGluZ0RlY29yYXRvcigpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTGVhZGluZ0RlY29yYXRvciwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG5cbiAgcGFyc2VEZWNvcmF0b3IodGhpczogUGFyc2VyKTogTi5EZWNvcmF0b3Ige1xuICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImRlY29yYXRvcnNcIiwgXCJkZWNvcmF0b3JzLWxlZ2FjeVwiXSk7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5EZWNvcmF0b3I+KCk7XG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICBsZXQgZXhwcjogTi5FeHByZXNzaW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnKCdcbiAgICAgICAgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG4gICAgICAgIGV4cHIgPSB0aGlzLndyYXBQYXJlbnRoZXNpcyhzdGFydExvYywgZXhwcik7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHMoZXhwcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFBsdWdpbk9wdGlvbihcImRlY29yYXRvcnNcIiwgXCJhbGxvd0NhbGxQYXJlbnRoZXNpemVkXCIpID09PVxuICAgICAgICAgICAgZmFsc2UgJiZcbiAgICAgICAgICBub2RlLmV4cHJlc3Npb24gIT09IGV4cHJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQXJndW1lbnRzT3V0c2lkZVBhcmVudGhlc2VzLCB7XG4gICAgICAgICAgICBhdDogcGFyYW1zU3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlSWRlbnRpZmllcihmYWxzZSk7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICAgICAgbm9kZS5vYmplY3QgPSBleHByO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnByaXZhdGVOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlUHJpdmF0ZU5hbWUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHMoZXhwcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VFeHByU3Vic2NyaXB0cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjb3JhdG9yXCIpO1xuICB9XG5cbiAgcGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyh0aGlzOiBQYXJzZXIsIGV4cHI6IE4uRXhwcmVzc2lvbik6IE4uRXhwcmVzc2lvbiB7XG4gICAgaWYgKHRoaXMuZWF0KHR0LnBhcmVuTCkpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShleHByKTtcbiAgICAgIG5vZGUuY2FsbGVlID0gZXhwcjtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKHR0LnBhcmVuUiwgZmFsc2UpO1xuICAgICAgdGhpcy50b1JlZmVyZW5jZWRMaXN0KG5vZGUuYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICBpc0JyZWFrOiB0cnVlLFxuICApOiBOLkJyZWFrU3RhdGVtZW50O1xuICBwYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQoXG4gICAgbm9kZTogVW5kb25lPE4uTm9kZT4sXG4gICAgaXNCcmVhazogZmFsc2UsXG4gICk6IE4uQ29udGludWVTdGF0ZW1lbnQ7XG4gIHBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5CcmVha1N0YXRlbWVudCB8IE4uQ29udGludWVTdGF0ZW1lbnQ+LFxuICAgIGlzQnJlYWs6IGJvb2xlYW4sXG4gICk6IE4uQnJlYWtTdGF0ZW1lbnQgfCBOLkNvbnRpbnVlU3RhdGVtZW50IHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgbm9kZS5sYWJlbCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUubGFiZWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcmlmeUJyZWFrQ29udGludWUobm9kZSwgaXNCcmVhayk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIsXG4gICAgKTtcbiAgfVxuXG4gIHZlcmlmeUJyZWFrQ29udGludWUoXG4gICAgbm9kZTogVW5kb25lPE4uQnJlYWtTdGF0ZW1lbnQgfCBOLkNvbnRpbnVlU3RhdGVtZW50PixcbiAgICBpc0JyZWFrOiBib29sZWFuLFxuICApIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGxhYiA9IHRoaXMuc3RhdGUubGFiZWxzW2ldO1xuICAgICAgaWYgKG5vZGUubGFiZWwgPT0gbnVsbCB8fCBsYWIubmFtZSA9PT0gbm9kZS5sYWJlbC5uYW1lKSB7XG4gICAgICAgIGlmIChsYWIua2luZCAhPSBudWxsICYmIChpc0JyZWFrIHx8IGxhYi5raW5kID09PSBcImxvb3BcIikpIGJyZWFrO1xuICAgICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IHRoaXMuc3RhdGUubGFiZWxzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdHlwZSA9IGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCI7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbGxlZ2FsQnJlYWtDb250aW51ZSwgeyBhdDogbm9kZSwgdHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBwYXJzZURlYnVnZ2VyU3RhdGVtZW50KFxuICAgIG5vZGU6IFVuZG9uZTxOLkRlYnVnZ2VyU3RhdGVtZW50PixcbiAgKTogTi5EZWJ1Z2dlclN0YXRlbWVudCB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIik7XG4gIH1cblxuICBwYXJzZUhlYWRlckV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uIHtcbiAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRG9XaGlsZVN0YXRlbWVudFxuICBwYXJzZURvV2hpbGVTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkRvV2hpbGVTdGF0ZW1lbnQ+LFxuICApOiBOLkRvV2hpbGVTdGF0ZW1lbnQge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcblxuICAgIC8vIFBhcnNlIHRoZSBsb29wIGJvZHkncyBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgIC8vIGNvbnRleHRzIHdpdGhpbiB0aGUgbG9vcCBib2R5LiBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucyxcbiAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGxvb3AgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5J3MgYm9keS5cbiAgICAgICAgdGhpcy5wYXJzZVN0YXRlbWVudCgpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc3RhdGUubGFiZWxzLnBvcCgpO1xuXG4gICAgdGhpcy5leHBlY3QodHQuX3doaWxlKTtcbiAgICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlSGVhZGVyRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZWF0KHR0LnNlbWkpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJEb1doaWxlU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gRGlzYW1iaWd1YXRpbmcgYmV0d2VlbiBhIGBmb3JgIGFuZCBhIGBmb3JgL2BpbmAgb3IgYGZvcmAvYG9mYFxuICAvLyBsb29wIGlzIG5vbi10cml2aWFsLiBCYXNpY2FsbHksIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGluaXQgYHZhcmBcbiAgLy8gc3RhdGVtZW50IG9yIGV4cHJlc3Npb24sIGRpc2FsbG93aW5nIHRoZSBgaW5gIG9wZXJhdG9yIChzZWVcbiAgLy8gdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYHBhcnNlRXhwcmVzc2lvbmApLCBhbmQgdGhlbiBjaGVja1xuICAvLyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAgb3IgYG9mYC4gV2hlbiB0aGVyZSBpcyBubyBpbml0XG4gIC8vIHBhcnQgKHNlbWljb2xvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyksIGl0XG4gIC8vIGlzIGEgcmVndWxhciBgZm9yYCBsb29wLlxuXG4gIHBhcnNlRm9yU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQgfCBOLkZvckluT2Y+LFxuICApOiBOLkZvckxpa2Uge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcblxuICAgIGxldCBhd2FpdEF0ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLmlzQXdhaXRBbGxvd2VkKCkgJiYgdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hd2FpdCkpIHtcbiAgICAgIGF3YWl0QXQgPSB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYztcbiAgICB9XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LnNlbWkpKSB7XG4gICAgICBpZiAoYXdhaXRBdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvcihub2RlIGFzIFVuZG9uZTxOLkZvclN0YXRlbWVudD4sIG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0c1dpdGhMZXQgPSB0aGlzLmlzQ29udGV4dHVhbCh0dC5fbGV0KTtcbiAgICB7XG4gICAgICBjb25zdCBzdGFydHNXaXRoQXdhaXRVc2luZyA9XG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hd2FpdCkgJiYgdGhpcy5zdGFydHNBd2FpdFVzaW5nKCk7XG4gICAgICBjb25zdCBzdGFyc1dpdGhVc2luZ0RlY2xhcmF0aW9uID1cbiAgICAgICAgc3RhcnRzV2l0aEF3YWl0VXNpbmcgfHxcbiAgICAgICAgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll91c2luZykgJiYgdGhpcy5zdGFydHNVc2luZ0Zvck9mKCkpO1xuICAgICAgY29uc3QgaXNMZXRPclVzaW5nID1cbiAgICAgICAgKHN0YXJ0c1dpdGhMZXQgJiYgdGhpcy5oYXNGb2xsb3dpbmdCaW5kaW5nQXRvbSgpKSB8fFxuICAgICAgICBzdGFyc1dpdGhVc2luZ0RlY2xhcmF0aW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdmFyKSB8fCB0aGlzLm1hdGNoKHR0Ll9jb25zdCkgfHwgaXNMZXRPclVzaW5nKSB7XG4gICAgICAgIGNvbnN0IGluaXROb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPigpO1xuICAgICAgICBsZXQga2luZDtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhBd2FpdFVzaW5nKSB7XG4gICAgICAgICAga2luZCA9IFwiYXdhaXQgdXNpbmdcIjtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBd2FpdEFsbG93ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQXdhaXRVc2luZ05vdEluQXN5bmNDb250ZXh0LCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJ2F3YWl0J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtpbmQgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLnBhcnNlVmFyKGluaXROb2RlLCB0cnVlLCBraW5kKTtcbiAgICAgICAgY29uc3QgaW5pdCA9IHRoaXMuZmluaXNoTm9kZShpbml0Tm9kZSwgXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IGlzRm9ySW4gPSB0aGlzLm1hdGNoKHR0Ll9pbik7XG4gICAgICAgIGlmIChpc0ZvckluICYmIHN0YXJzV2l0aFVzaW5nRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Gb3JJblVzaW5nLCB7IGF0OiBpbml0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaXNGb3JJbiB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKSAmJlxuICAgICAgICAgIGluaXQuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUgYXMgVW5kb25lPE4uRm9ySW5PZj4sIGluaXQsIGF3YWl0QXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdEF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUgYXMgVW5kb25lPE4uRm9yU3RhdGVtZW50PiwgaW5pdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZmlyc3QgdG9rZW4gaXMgcG9zc2libHkgYSBjb250ZXh0dWFsIGtleXdvcmQsIHNvIHRoYXRcbiAgICAvLyB3ZSBjYW4gZm9yYmlkIGBmb3IgKGFzeW5jIG9mYCBpZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIGZvci1vZiBsb29wLlxuICAgIGNvbnN0IHN0YXJ0c1dpdGhBc3luYyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hc3luYyk7XG5cbiAgICBjb25zdCByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICBjb25zdCBpbml0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24odHJ1ZSwgcmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgY29uc3QgaXNGb3JPZiA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9vZik7XG4gICAgaWYgKGlzRm9yT2YpIHtcbiAgICAgIC8vIENoZWNrIGZvciBsZWFkaW5nIHRva2VucyB0aGF0IGFyZSBmb3JiaWRkZW4gaW4gZm9yLW9mIGxvb3BzOlxuICAgICAgaWYgKHN0YXJ0c1dpdGhMZXQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRm9yT2ZMZXQsIHsgYXQ6IGluaXQgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgLy8gYGZvciBhd2FpdCAoYXN5bmMgb2YgW10pO2AgaXMgYWxsb3dlZC5cbiAgICAgICAgYXdhaXRBdCA9PT0gbnVsbCAmJlxuICAgICAgICBzdGFydHNXaXRoQXN5bmMgJiZcbiAgICAgICAgaW5pdC50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB0aGUgY2FzZSB3aGVyZSB0aGUgYGFzeW5jYCBpbiBgZm9yIChhc3luYyBvZmAgd2FzXG4gICAgICAgIC8vIHBhcnNlZCBhcyBhbiBpZGVudGlmaWVyLiBJZiBpdCB3YXMgcGFyc2VkIGFzIHRoZSBzdGFydCBvZiBhbiBhc3luY1xuICAgICAgICAvLyBhcnJvdyBmdW5jdGlvbiAoZS5nLiBgZm9yIChhc3luYyBvZiA9PiB7fSBvZiBbXSk7YCksIHRoZSBMVmFsIGNoZWNrXG4gICAgICAgIC8vIGZ1cnRoZXIgZG93biB3aWxsIHJhaXNlIGEgbW9yZSBhcHByb3ByaWF0ZSBlcnJvci5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRm9yT2ZBc3luYywgeyBhdDogaW5pdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9yT2YgfHwgdGhpcy5tYXRjaCh0dC5faW4pKSB7XG4gICAgICB0aGlzLmNoZWNrRGVzdHJ1Y3R1cmluZ1ByaXZhdGUocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShpbml0LCAvKiBpc0xIUyAqLyB0cnVlKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBpc0Zvck9mID8gXCJGb3JPZlN0YXRlbWVudFwiIDogXCJGb3JJblN0YXRlbWVudFwiO1xuICAgICAgdGhpcy5jaGVja0xWYWwoaW5pdCwgeyBpbjogeyB0eXBlIH0gfSk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkZvckluU3RhdGVtZW50IHwgTi5Gb3JPZlN0YXRlbWVudD4sXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaW5pdCBoYXMgYmVlbiB0cmFuc2Zvcm1lZCB0byBhbiBhc3NpZ25hYmxlXG4gICAgICAgIGluaXQsXG4gICAgICAgIGF3YWl0QXQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGF3YWl0QXQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSBhcyBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQ+LCBpbml0KTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUhvaXN0YWJsZURlY2xhcmF0aW9uXG4gIHBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+LFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNIYW5naW5nRGVjbGFyYXRpb246IGJvb2xlYW4sXG4gICk6IE4uRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnZnVuY3Rpb24nXG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihcbiAgICAgIG5vZGUsXG4gICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5EZWNsYXJhdGlvbiB8XG4gICAgICAgIChpc0hhbmdpbmdEZWNsYXJhdGlvbiA/IFBhcnNlRnVuY3Rpb25GbGFnLkhhbmdpbmdEZWNsYXJhdGlvbiA6IDApIHxcbiAgICAgICAgKGlzQXN5bmMgPyBQYXJzZUZ1bmN0aW9uRmxhZy5Bc3luYyA6IDApLFxuICAgICk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1JZlN0YXRlbWVudFxuICBwYXJzZUlmU3RhdGVtZW50KHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uSWZTdGF0ZW1lbnQ+KSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKTtcbiAgICAvLyBBbm5leCBCLjMuM1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb25kZWNsYXJhdGlvbnMtaW4taWZzdGF0ZW1lbnQtc3RhdGVtZW50LWNsYXVzZXNcbiAgICBub2RlLmNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlU3RhdGVtZW50T3JTbG9wcHlBbm5leEJGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLmVhdCh0dC5fZWxzZSlcbiAgICAgID8gdGhpcy5wYXJzZVN0YXRlbWVudE9yU2xvcHB5QW5uZXhCRnVuY3Rpb25EZWNsYXJhdGlvbigpXG4gICAgICA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklmU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgcGFyc2VSZXR1cm5TdGF0ZW1lbnQodGhpczogUGFyc2VyLCBub2RlOiBVbmRvbmU8Ti5SZXR1cm5TdGF0ZW1lbnQ+KSB7XG4gICAgaWYgKCF0aGlzLnByb2RQYXJhbS5oYXNSZXR1cm4gJiYgIXRoaXMub3B0aW9ucy5hbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbikge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSWxsZWdhbFJldHVybiwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIEluIGByZXR1cm5gIChhbmQgYGJyZWFrYC9gY29udGludWVgKSwgdGhlIGtleXdvcmRzIHdpdGhcbiAgICAvLyBvcHRpb25hbCBhcmd1bWVudHMsIHdlIGVhZ2VybHkgbG9vayBmb3IgYSBzZW1pY29sb24gb3IgdGhlXG4gICAgLy8gcG9zc2liaWxpdHkgdG8gaW5zZXJ0IG9uZS5cblxuICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgbm9kZS5hcmd1bWVudCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUmV0dXJuU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtU3dpdGNoU3RhdGVtZW50XG4gIHBhcnNlU3dpdGNoU3RhdGVtZW50KHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uU3dpdGNoU3RhdGVtZW50Pikge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKTtcbiAgICBjb25zdCBjYXNlczogTi5Td2l0Y2hTdGF0ZW1lbnRbXCJjYXNlc1wiXSA9IChub2RlLmNhc2VzID0gW10pO1xuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucHVzaChzd2l0Y2hMYWJlbCk7XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG5cbiAgICAvLyBTdGF0ZW1lbnRzIHVuZGVyIG11c3QgYmUgZ3JvdXBlZCAoYnkgbGFiZWwpIGluIFN3aXRjaENhc2VcbiAgICAvLyBub2Rlcy4gYGN1cmAgaXMgdXNlZCB0byBrZWVwIHRoZSBub2RlIHRoYXQgd2UgYXJlIGN1cnJlbnRseVxuICAgIC8vIGFkZGluZyBzdGF0ZW1lbnRzIHRvLlxuXG4gICAgbGV0IGN1cjtcbiAgICBmb3IgKGxldCBzYXdEZWZhdWx0OyAhdGhpcy5tYXRjaCh0dC5icmFjZVIpOyApIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9jYXNlKSB8fCB0aGlzLm1hdGNoKHR0Ll9kZWZhdWx0KSkge1xuICAgICAgICBjb25zdCBpc0Nhc2UgPSB0aGlzLm1hdGNoKHR0Ll9jYXNlKTtcbiAgICAgICAgaWYgKGN1cikgdGhpcy5maW5pc2hOb2RlKGN1ciwgXCJTd2l0Y2hDYXNlXCIpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lXG4gICAgICAgIGNhc2VzLnB1c2goKGN1ciA9IHRoaXMuc3RhcnROb2RlKCkpKTtcbiAgICAgICAgY3VyLmNvbnNlcXVlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGlmIChpc0Nhc2UpIHtcbiAgICAgICAgICBjdXIudGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNhd0RlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk11bHRpcGxlRGVmYXVsdHNJblN3aXRjaCwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2F3RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgY3VyLnRlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXIpIHtcbiAgICAgICAgICBjdXIuY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICBpZiAoY3VyKSB0aGlzLmZpbmlzaE5vZGUoY3VyLCBcIlN3aXRjaENhc2VcIik7XG4gICAgdGhpcy5uZXh0KCk7IC8vIENsb3NpbmcgYnJhY2VcbiAgICB0aGlzLnN0YXRlLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3dpdGNoU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgcGFyc2VUaHJvd1N0YXRlbWVudCh0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLlRocm93U3RhdGVtZW50Pikge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5OZXdsaW5lQWZ0ZXJUaHJvdywgeyBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jIH0pO1xuICAgIH1cbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaHJvd1N0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSh0aGlzOiBQYXJzZXIpOiBOLlBhdHRlcm4ge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7XG5cbiAgICB0aGlzLnNjb3BlLmVudGVyKFxuICAgICAgdGhpcy5vcHRpb25zLmFubmV4QiAmJiBwYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgICA/IFNDT1BFX1NJTVBMRV9DQVRDSFxuICAgICAgICA6IDAsXG4gICAgKTtcbiAgICB0aGlzLmNoZWNrTFZhbChwYXJhbSwge1xuICAgICAgaW46IHsgdHlwZTogXCJDYXRjaENsYXVzZVwiIH0sXG4gICAgICBiaW5kaW5nOiBCSU5EX0NBVENIX1BBUkFNLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtO1xuICB9XG5cbiAgcGFyc2VUcnlTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlRyeVN0YXRlbWVudD4sXG4gICk6IE4uVHJ5U3RhdGVtZW50IHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBub2RlLmhhbmRsZXIgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NhdGNoKSkge1xuICAgICAgY29uc3QgY2xhdXNlID0gdGhpcy5zdGFydE5vZGU8Ti5DYXRjaENsYXVzZT4oKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICBjbGF1c2UucGFyYW0gPSB0aGlzLnBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlblIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhdXNlLnBhcmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjYXRjaCBjbGF1c2UncyBib2R5LlxuICAgICAgY2xhdXNlLmJvZHkgPVxuICAgICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgICAgLy8gY29udGV4dHMgd2l0aGluIHRoZSBjYXRjaCBjbGF1c2UncyBib2R5LlxuICAgICAgICB0aGlzLndpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCkgPT5cbiAgICAgICAgICAvLyBQYXJzZSB0aGUgY2F0Y2ggY2xhdXNlJ3MgYm9keS5cbiAgICAgICAgICB0aGlzLnBhcnNlQmxvY2soZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgKTtcblxuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICAgIH1cblxuICAgIG5vZGUuZmluYWxpemVyID0gdGhpcy5lYXQodHQuX2ZpbmFsbHkpID8gdGhpcy5wYXJzZUJsb2NrKCkgOiBudWxsO1xuXG4gICAgaWYgKCFub2RlLmhhbmRsZXIgJiYgIW5vZGUuZmluYWxpemVyKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5Ob0NhdGNoT3JGaW5hbGx5LCB7IGF0OiBub2RlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUcnlTdGF0ZW1lbnRcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1WYXJpYWJsZVN0YXRlbWVudFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1MZXhpY2FsRGVjbGFyYXRpb25cbiAgcGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+LFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICAgIGFsbG93TWlzc2luZ0luaXRpYWxpemVyOiBib29sZWFuID0gZmFsc2UsXG4gICk6IE4uVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5wYXJzZVZhcihub2RlLCBmYWxzZSwga2luZCwgYWxsb3dNaXNzaW5nSW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1XaGlsZVN0YXRlbWVudFxuICBwYXJzZVdoaWxlU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5XaGlsZVN0YXRlbWVudD4sXG4gICk6IE4uV2hpbGVTdGF0ZW1lbnQge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMucGFyc2VIZWFkZXJFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuXG4gICAgLy8gUGFyc2UgdGhlIGxvb3AgYm9keS5cbiAgICBub2RlLmJvZHkgPVxuICAgICAgLy8gRm9yIHRoZSBzbWFydFBpcGVsaW5lcyBwbHVnaW46XG4gICAgICAvLyBEaXNhYmxlIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gdGhlIGxvb3AgYm9keS5cbiAgICAgIC8vIFRoZXkgYXJlIHBlcm1pdHRlZCBpbiB0ZXN0IGV4cHJlc3Npb25zLCBvdXRzaWRlIG9mIHRoZSBsb29wIGJvZHkuXG4gICAgICB0aGlzLndpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCkgPT5cbiAgICAgICAgLy8gUGFyc2UgbG9vcCBib2R5LlxuICAgICAgICB0aGlzLnBhcnNlU3RhdGVtZW50KCksXG4gICAgICApO1xuXG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2hpbGVTdGF0ZW1lbnRcIik7XG4gIH1cblxuICBwYXJzZVdpdGhTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLldpdGhTdGF0ZW1lbnQ+LFxuICApOiBOLldpdGhTdGF0ZW1lbnQge1xuICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3RyaWN0V2l0aCwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5vYmplY3QgPSB0aGlzLnBhcnNlSGVhZGVyRXhwcmVzc2lvbigpO1xuXG4gICAgLy8gUGFyc2UgdGhlIHN0YXRlbWVudCBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjpcbiAgICAgIC8vIERpc2FibGUgdG9waWMgcmVmZXJlbmNlcyBmcm9tIG91dGVyIGNvbnRleHRzIHdpdGhpbiB0aGUgd2l0aCBzdGF0ZW1lbnQncyBib2R5LlxuICAgICAgLy8gVGhleSBhcmUgcGVybWl0dGVkIGluIGZ1bmN0aW9uIGRlZmF1bHQtcGFyYW1ldGVyIGV4cHJlc3Npb25zLCB3aGljaCBhcmVcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG91dGVyIGNvbnRleHQsIG91dHNpZGUgb2YgdGhlIHdpdGggc3RhdGVtZW50J3MgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgc3RhdGVtZW50IGJvZHkuXG4gICAgICAgIHRoaXMucGFyc2VTdGF0ZW1lbnQoKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2l0aFN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZTogVW5kb25lPE4uRW1wdHlTdGF0ZW1lbnQ+KTogTi5FbXB0eVN0YXRlbWVudCB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVtcHR5U3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTGFiZWxsZWRTdGF0ZW1lbnRcbiAgcGFyc2VMYWJlbGVkU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5MYWJlbGVkU3RhdGVtZW50PixcbiAgICBtYXliZU5hbWU6IHN0cmluZyxcbiAgICBleHByOiBOLklkZW50aWZpZXIsXG4gICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgKTogTi5MYWJlbGVkU3RhdGVtZW50IHtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHRoaXMuc3RhdGUubGFiZWxzKSB7XG4gICAgICBpZiAobGFiZWwubmFtZSA9PT0gbWF5YmVOYW1lKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkxhYmVsUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICAgIGF0OiBleHByLFxuICAgICAgICAgIGxhYmVsTmFtZTogbWF5YmVOYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBraW5kID0gdG9rZW5Jc0xvb3AodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgPyBcImxvb3BcIlxuICAgICAgOiB0aGlzLm1hdGNoKHR0Ll9zd2l0Y2gpXG4gICAgICA/IFwic3dpdGNoXCJcbiAgICAgIDogbnVsbDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZS5sYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zdGF0ZS5sYWJlbHNbaV07XG4gICAgICBpZiAobGFiZWwuc3RhdGVtZW50U3RhcnQgPT09IG5vZGUuc3RhcnQpIHtcbiAgICAgICAgbGFiZWwuc3RhdGVtZW50U3RhcnQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgICAgICBsYWJlbC5raW5kID0ga2luZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2goe1xuICAgICAgbmFtZTogbWF5YmVOYW1lLFxuICAgICAga2luZDoga2luZCxcbiAgICAgIHN0YXRlbWVudFN0YXJ0OiB0aGlzLnN0YXRlLnN0YXJ0LFxuICAgIH0pO1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUxhYmVsbGVkSXRlbVxuICAgIG5vZGUuYm9keSA9XG4gICAgICBmbGFncyAmIFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0xhYmVsZWRGdW5jdGlvblxuICAgICAgICA/IHRoaXMucGFyc2VTdGF0ZW1lbnRPclNsb3BweUFubmV4QkZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSlcbiAgICAgICAgOiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICB0aGlzLnN0YXRlLmxhYmVscy5wb3AoKTtcbiAgICBub2RlLmxhYmVsID0gZXhwcjtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGFiZWxlZFN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5FeHByZXNzaW9uU3RhdGVtZW50PixcbiAgICBleHByOiBOLkV4cHJlc3Npb24sXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSB1c2VkIGluIFR5cGVTY3JpcHQgcGFyc2VyICovXG4gICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICkge1xuICAgIG5vZGUuZXhwcmVzc2lvbiA9IGV4cHI7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgc2VtaWNvbG9uLWVuY2xvc2VkIGJsb2NrIG9mIHN0YXRlbWVudHMsIGhhbmRsaW5nIGBcInVzZVxuICAvLyBzdHJpY3RcImAgZGVjbGFyYXRpb25zIHdoZW4gYGFsbG93RGlyZWN0aXZlc2AgaXMgdHJ1ZSAodXNlZCBmb3JcbiAgLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxuICBwYXJzZUJsb2NrKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBhbGxvd0RpcmVjdGl2ZXM6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBjcmVhdGVOZXdMZXhpY2FsU2NvcGU6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFmdGVyQmxvY2tQYXJzZT86IChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB2b2lkLFxuICApOiBOLkJsb2NrU3RhdGVtZW50IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5CbG9ja1N0YXRlbWVudD4oKTtcbiAgICBpZiAoYWxsb3dEaXJlY3RpdmVzKSB7XG4gICAgICB0aGlzLnN0YXRlLnN0cmljdEVycm9ycy5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgIGlmIChjcmVhdGVOZXdMZXhpY2FsU2NvcGUpIHtcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfT1RIRVIpO1xuICAgIH1cbiAgICB0aGlzLnBhcnNlQmxvY2tCb2R5KFxuICAgICAgbm9kZSxcbiAgICAgIGFsbG93RGlyZWN0aXZlcyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHQuYnJhY2VSLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlLFxuICAgICk7XG4gICAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkge1xuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJCbG9ja1N0YXRlbWVudFwiKTtcbiAgfVxuXG4gIGlzVmFsaWREaXJlY3RpdmUoc3RtdDogTi5TdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RtdC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiAmJlxuICAgICAgc3RtdC5leHByZXNzaW9uLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiICYmXG4gICAgICAhc3RtdC5leHByZXNzaW9uLmV4dHJhLnBhcmVudGhlc2l6ZWRcbiAgICApO1xuICB9XG5cbiAgcGFyc2VCbG9ja0JvZHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkJsb2NrU3RhdGVtZW50TGlrZT4sXG4gICAgYWxsb3dEaXJlY3RpdmVzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYm9keTogTi5CbG9ja1N0YXRlbWVudExpa2VbXCJib2R5XCJdID0gKG5vZGUuYm9keSA9IFtdKTtcbiAgICBjb25zdCBkaXJlY3RpdmVzOiBOLkJsb2NrU3RhdGVtZW50TGlrZVtcImRpcmVjdGl2ZXNcIl0gPSAobm9kZS5kaXJlY3RpdmVzID1cbiAgICAgIFtdKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tPck1vZHVsZUJsb2NrQm9keShcbiAgICAgIGJvZHksXG4gICAgICBhbGxvd0RpcmVjdGl2ZXMgPyBkaXJlY3RpdmVzIDogdW5kZWZpbmVkLFxuICAgICAgdG9wTGV2ZWwsXG4gICAgICBlbmQsXG4gICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVuZGVmaW5lZCBkaXJlY3RpdmVzIG1lYW5zIHRoYXQgZGlyZWN0aXZlcyBhcmUgbm90IGFsbG93ZWQuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJsb2NrXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLU1vZHVsZUJvZHlcbiAgcGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBib2R5OiBOLlN0YXRlbWVudFtdLFxuICAgIGRpcmVjdGl2ZXM6IE4uRGlyZWN0aXZlW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHRvcExldmVsOiBib29sZWFuLFxuICAgIGVuZDogVG9rZW5UeXBlLFxuICAgIGFmdGVyQmxvY2tQYXJzZT86IChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvbGRTdHJpY3QgPSB0aGlzLnN0YXRlLnN0cmljdDtcbiAgICBsZXQgaGFzU3RyaWN0TW9kZURpcmVjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBwYXJzZWROb25EaXJlY3RpdmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICghdGhpcy5tYXRjaChlbmQpKSB7XG4gICAgICBjb25zdCBzdG10ID0gdG9wTGV2ZWxcbiAgICAgICAgPyB0aGlzLnBhcnNlTW9kdWxlSXRlbSgpXG4gICAgICAgIDogdGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCk7XG5cbiAgICAgIGlmIChkaXJlY3RpdmVzICYmICFwYXJzZWROb25EaXJlY3RpdmUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZERpcmVjdGl2ZShzdG10KSkge1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IHRoaXMuc3RtdFRvRGlyZWN0aXZlKHN0bXQpO1xuICAgICAgICAgIGRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWhhc1N0cmljdE1vZGVEaXJlY3RpdmUgJiZcbiAgICAgICAgICAgIGRpcmVjdGl2ZS52YWx1ZS52YWx1ZSA9PT0gXCJ1c2Ugc3RyaWN0XCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGhhc1N0cmljdE1vZGVEaXJlY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VkTm9uRGlyZWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgLy8gY2xlYXIgc3RyaWN0IGVycm9ycyBzaW5jZSB0aGUgc3RyaWN0IG1vZGUgd2lsbCBub3QgY2hhbmdlIHdpdGhpbiB0aGUgYmxvY2tcbiAgICAgICAgdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGJvZHkucHVzaChzdG10KTtcbiAgICB9XG5cbiAgICBpZiAoYWZ0ZXJCbG9ja1BhcnNlKSB7XG4gICAgICBhZnRlckJsb2NrUGFyc2UuY2FsbCh0aGlzLCBoYXNTdHJpY3RNb2RlRGlyZWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0cmljdCkge1xuICAgICAgdGhpcy5zZXRTdHJpY3QoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSByZWd1bGFyIGBmb3JgIGxvb3AuIFRoZSBkaXNhbWJpZ3VhdGlvbiBjb2RlIGluXG4gIC8vIGBwYXJzZVN0YXRlbWVudGAgd2lsbCBhbHJlYWR5IGhhdmUgcGFyc2VkIHRoZSBpbml0IHN0YXRlbWVudCBvclxuICAvLyBleHByZXNzaW9uLlxuXG4gIHBhcnNlRm9yKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQ+LFxuICAgIGluaXQ/OiBOLlZhcmlhYmxlRGVjbGFyYXRpb24gfCBOLkV4cHJlc3Npb24gfCBudWxsLFxuICApOiBOLkZvclN0YXRlbWVudCB7XG4gICAgbm9kZS5pbml0ID0gaW5pdDtcbiAgICB0aGlzLnNlbWljb2xvbigvKiBhbGxvd0FzaSAqLyBmYWxzZSk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5tYXRjaCh0dC5zZW1pKSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuc2VtaWNvbG9uKC8qIGFsbG93QXNpICovIGZhbHNlKTtcbiAgICBub2RlLnVwZGF0ZSA9IHRoaXMubWF0Y2godHQucGFyZW5SKSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgIC8vIGNvbnRleHRzIHdpdGhpbiB0aGUgbG9vcCBib2R5LiBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucyxcbiAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGxvb3AgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5LlxuICAgICAgICB0aGlzLnBhcnNlU3RhdGVtZW50KCksXG4gICAgICApO1xuXG4gICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBgZm9yYC9gaW5gIGFuZCBgZm9yYC9gb2ZgIGxvb3AsIHdoaWNoIGFyZSBhbG1vc3RcbiAgLy8gc2FtZSBmcm9tIHBhcnNlcidzIHBlcnNwZWN0aXZlLlxuXG4gIHBhcnNlRm9ySW4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkZvckluT2Y+LFxuICAgIGluaXQ6IE4uVmFyaWFibGVEZWNsYXJhdGlvbiB8IE4uQXNzaWdubWVudFBhdHRlcm4sXG4gICAgYXdhaXRBdD86IFBvc2l0aW9uIHwgbnVsbCxcbiAgKTogTi5Gb3JJbk9mIHtcbiAgICBjb25zdCBpc0ZvckluID0gdGhpcy5tYXRjaCh0dC5faW4pO1xuICAgIHRoaXMubmV4dCgpO1xuXG4gICAgaWYgKGlzRm9ySW4pIHtcbiAgICAgIGlmIChhd2FpdEF0ICE9PSBudWxsKSB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXdhaXQgPSBhd2FpdEF0ICE9PSBudWxsO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGluaXQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcbiAgICAgIGluaXQuZGVjbGFyYXRpb25zWzBdLmluaXQgIT0gbnVsbCAmJlxuICAgICAgKCFpc0ZvckluIHx8XG4gICAgICAgICF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8XG4gICAgICAgIHRoaXMuc3RhdGUuc3RyaWN0IHx8XG4gICAgICAgIGluaXQua2luZCAhPT0gXCJ2YXJcIiB8fFxuICAgICAgICBpbml0LmRlY2xhcmF0aW9uc1swXS5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIilcbiAgICApIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkZvckluT2ZMb29wSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgIHR5cGU6IGlzRm9ySW4gPyBcIkZvckluU3RhdGVtZW50XCIgOiBcIkZvck9mU3RhdGVtZW50XCIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW5pdC50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRMaHMsIHtcbiAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgIGFuY2VzdG9yOiB7IHR5cGU6IFwiRm9yU3RhdGVtZW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5vZGUubGVmdCA9IGluaXQ7XG4gICAgbm9kZS5yaWdodCA9IGlzRm9ySW5cbiAgICAgID8gdGhpcy5wYXJzZUV4cHJlc3Npb24oKVxuICAgICAgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgIC8vIFBhcnNlIHRoZSBsb29wIGJvZHkuXG4gICAgbm9kZS5ib2R5ID1cbiAgICAgIC8vIEZvciB0aGUgc21hcnRQaXBlbGluZXMgcGx1Z2luOlxuICAgICAgLy8gRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXIgY29udGV4dHMgd2l0aGluIHRoZSBsb29wIGJvZHkuXG4gICAgICAvLyBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucywgb3V0c2lkZSBvZiB0aGUgbG9vcCBib2R5LlxuICAgICAgdGhpcy53aXRoU21hcnRNaXhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpID0+XG4gICAgICAgIC8vIFBhcnNlIGxvb3AgYm9keS5cbiAgICAgICAgdGhpcy5wYXJzZVN0YXRlbWVudCgpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnBvcCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc0ZvckluID8gXCJGb3JJblN0YXRlbWVudFwiIDogXCJGb3JPZlN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuXG5cbiAgcGFyc2VWYXIoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+LFxuICAgIGlzRm9yOiBib29sZWFuLFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICAgIGFsbG93TWlzc2luZ0luaXRpYWxpemVyOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+IHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbnM6IE4uVmFyaWFibGVEZWNsYXJhdG9yW10gPSAobm9kZS5kZWNsYXJhdGlvbnMgPSBbXSk7XG4gICAgbm9kZS5raW5kID0ga2luZDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBkZWNsID0gdGhpcy5zdGFydE5vZGU8Ti5WYXJpYWJsZURlY2xhcmF0b3I+KCk7XG4gICAgICB0aGlzLnBhcnNlVmFySWQoZGVjbCwga2luZCk7XG4gICAgICBkZWNsLmluaXQgPSAhdGhpcy5lYXQodHQuZXEpXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGlzRm9yXG4gICAgICAgID8gdGhpcy5wYXJzZU1heWJlQXNzaWduRGlzYWxsb3dJbigpXG4gICAgICAgIDogdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuXG4gICAgICBpZiAoZGVjbC5pbml0ID09PSBudWxsICYmICFhbGxvd01pc3NpbmdJbml0aWFsaXplcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVjbC5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICEoaXNGb3IgJiYgKHRoaXMubWF0Y2godHQuX2luKSB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICAgICAgICAgICBraW5kOiBcImRlc3RydWN0dXJpbmdcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBraW5kID09PSBcImNvbnN0XCIgJiZcbiAgICAgICAgICAhKHRoaXMubWF0Y2godHQuX2luKSB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5EZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplciwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva0VuZExvYyxcbiAgICAgICAgICAgIGtpbmQ6IFwiY29uc3RcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVjbGFyYXRpb25zLnB1c2godGhpcy5maW5pc2hOb2RlKGRlY2wsIFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpKTtcbiAgICAgIGlmICghdGhpcy5lYXQodHQuY29tbWEpKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwYXJzZVZhcklkKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBkZWNsOiBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0b3I+LFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIHRoaXMuY2hlY2tMVmFsKGlkLCB7XG4gICAgICBpbjogeyB0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRvclwiIH0sXG4gICAgICBiaW5kaW5nOiBraW5kID09PSBcInZhclwiID8gQklORF9WQVIgOiBCSU5EX0xFWElDQUwsXG4gICAgfSk7XG4gICAgZGVjbC5pZCA9IGlkO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNGdW5jdGlvbkV4cHJlc3Npb25cbiAgcGFyc2VBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uRnVuY3Rpb25FeHByZXNzaW9uPixcbiAgKTogTi5GdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSwgUGFyc2VGdW5jdGlvbkZsYWcuQXN5bmMpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBleHByZXNzaW9uIChkZXBlbmRpbmcgb24gdGhlXG4gIC8vIFBhcnNlRnVuY3Rpb25GbGFnLkRlY2xhcmF0aW9uIGZsYWcpLlxuXG4gIHBhcnNlRnVuY3Rpb248VCBleHRlbmRzIE4uTm9ybWFsRnVuY3Rpb24+KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgZmxhZ3M6IFBhcnNlRnVuY3Rpb25GbGFnID0gUGFyc2VGdW5jdGlvbkZsYWcuRXhwcmVzc2lvbixcbiAgKTogVCB7XG4gICAgY29uc3QgaGFuZ2luZ0RlY2xhcmF0aW9uID0gZmxhZ3MgJiBQYXJzZUZ1bmN0aW9uRmxhZy5IYW5naW5nRGVjbGFyYXRpb247XG4gICAgY29uc3QgaXNEZWNsYXJhdGlvbiA9ICEhKGZsYWdzICYgUGFyc2VGdW5jdGlvbkZsYWcuRGVjbGFyYXRpb24pO1xuICAgIGNvbnN0IHJlcXVpcmVJZCA9IGlzRGVjbGFyYXRpb24gJiYgIShmbGFncyAmIFBhcnNlRnVuY3Rpb25GbGFnLk51bGxhYmxlSWQpO1xuICAgIGNvbnN0IGlzQXN5bmMgPSAhIShmbGFncyAmIFBhcnNlRnVuY3Rpb25GbGFnLkFzeW5jKTtcblxuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUsIGlzQXN5bmMpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuc3RhcikpIHtcbiAgICAgIGlmIChoYW5naW5nRGVjbGFyYXRpb24pIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuR2VuZXJhdG9ySW5TaW5nbGVTdGF0ZW1lbnRDb250ZXh0LCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAqXG4gICAgICBub2RlLmdlbmVyYXRvciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRGVjbGFyYXRpb24pIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlRnVuY3Rpb25JZChyZXF1aXJlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZE1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM7XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gZmFsc2U7XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9GVU5DVElPTik7XG4gICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBub2RlLmdlbmVyYXRvcikpO1xuXG4gICAgaWYgKCFpc0RlY2xhcmF0aW9uKSB7XG4gICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUZ1bmN0aW9uSWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSk7XG5cbiAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAvLyBjb250ZXh0cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGJvZHkuIFRoZXkgYXJlIHBlcm1pdHRlZCBpbiBmdW5jdGlvblxuICAgIC8vIGRlZmF1bHQtcGFyYW1ldGVyIGV4cHJlc3Npb25zLCBvdXRzaWRlIG9mIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PiB7XG4gICAgICAvLyBQYXJzZSB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHRoaXMucGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2goXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGlzRGVjbGFyYXRpb24gPyBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiA6IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuXG4gICAgaWYgKGlzRGVjbGFyYXRpb24gJiYgIWhhbmdpbmdEZWNsYXJhdGlvbikge1xuICAgICAgLy8gV2UgbmVlZCB0byByZWdpc3RlciB0aGlzIF9hZnRlcl8gcGFyc2luZyB0aGUgZnVuY3Rpb24gYm9keVxuICAgICAgLy8gYmVjYXVzZSBvZiBUeXBlU2NyaXB0IGJvZHktbGVzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsXG4gICAgICAvLyB3aGljaCBzaG91bGRuJ3QgYmUgYWRkZWQgdG8gdGhlIHNjb3BlLlxuICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uU3RhdGVtZW50SWQobm9kZSBhcyBUKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuICAgIHJldHVybiBub2RlIGFzIFQ7XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uSWQocmVxdWlyZUlkPzogYm9vbGVhbik6IE4uSWRlbnRpZmllciB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiByZXF1aXJlSWQgfHwgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgPyB0aGlzLnBhcnNlSWRlbnRpZmllcigpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uUGFyYW1zKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgaXNDb25zdHJ1Y3Rvcj86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZW50ZXIobmV3UGFyYW1ldGVyRGVjbGFyYXRpb25TY29wZSgpKTtcbiAgICBub2RlLnBhcmFtcyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChcbiAgICAgIHR0LnBhcmVuUixcbiAgICAgIGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzLFxuICAgICAgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0ZVTkNUSU9OX1BBUkFNUyB8XG4gICAgICAgIChpc0NvbnN0cnVjdG9yID8gUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0NPTlNUUlVDVE9SX1BBUkFNUyA6IDApLFxuICAgICk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5leGl0KCk7XG4gIH1cblxuICByZWdpc3RlckZ1bmN0aW9uU3RhdGVtZW50SWQobm9kZTogTi5GdW5jdGlvbik6IHZvaWQge1xuICAgIGlmICghbm9kZS5pZCkgcmV0dXJuO1xuXG4gICAgLy8gSWYgaXQgaXMgYSByZWd1bGFyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIHNsb3BweSBtb2RlLCB0aGVuIGl0IGlzXG4gICAgLy8gc3ViamVjdCB0byBBbm5leCBCIHNlbWFudGljcyAoQklORF9GVU5DVElPTikuIE90aGVyd2lzZSwgdGhlIGJpbmRpbmdcbiAgICAvLyBtb2RlIGRlcGVuZHMgb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBzY29wZSAoc2VlXG4gICAgLy8gdHJlYXRGdW5jdGlvbnNBc1ZhcikuXG4gICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShcbiAgICAgIG5vZGUuaWQubmFtZSxcbiAgICAgICF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8IHRoaXMuc3RhdGUuc3RyaWN0IHx8IG5vZGUuZ2VuZXJhdG9yIHx8IG5vZGUuYXN5bmNcbiAgICAgICAgPyB0aGlzLnNjb3BlLnRyZWF0RnVuY3Rpb25zQXNWYXJcbiAgICAgICAgICA/IEJJTkRfVkFSXG4gICAgICAgICAgOiBCSU5EX0xFWElDQUxcbiAgICAgICAgOiBCSU5EX0ZVTkNUSU9OLFxuICAgICAgbm9kZS5pZC5sb2Muc3RhcnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbiAgcGFyc2VDbGFzczxUIGV4dGVuZHMgTi5DbGFzcz4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICBpc1N0YXRlbWVudDogLyogVCA9PT0gQ2xhc3NEZWNsYXJhdGlvbiAqLyBib29sZWFuLFxuICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICApOiBUIHtcbiAgICB0aGlzLm5leHQoKTsgLy8gJ2NsYXNzJ1xuXG4gICAgLy8gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFsd2F5cyBzdHJpY3QgbW9kZSBjb2RlLlxuICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuICAgIHRoaXMuc3RhdGUuc3RyaWN0ID0gdHJ1ZTtcblxuICAgIHRoaXMucGFyc2VDbGFzc0lkKG5vZGUsIGlzU3RhdGVtZW50LCBvcHRpb25hbElkKTtcbiAgICB0aGlzLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAvLyB0aGlzLnN0YXRlLnN0cmljdCBpcyByZXN0b3JlZCBpbiBwYXJzZUNsYXNzQm9keVxuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VDbGFzc0JvZHkoISFub2RlLnN1cGVyQ2xhc3MsIG9sZFN0cmljdCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzU3RhdGVtZW50ID8gXCJDbGFzc0RlY2xhcmF0aW9uXCIgOiBcIkNsYXNzRXhwcmVzc2lvblwiLFxuICAgICk7XG4gIH1cblxuICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQuZXEpIHx8IHRoaXMubWF0Y2godHQuc2VtaSkgfHwgdGhpcy5tYXRjaCh0dC5icmFjZVIpO1xuICB9XG5cbiAgaXNDbGFzc01ldGhvZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5wYXJlbkwpO1xuICB9XG5cbiAgaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2Q6IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJvcGVydHkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIW1ldGhvZC5jb21wdXRlZCAmJlxuICAgICAgIW1ldGhvZC5zdGF0aWMgJiZcbiAgICAgIChtZXRob2Qua2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCAvLyBJZGVudGlmaWVyXG4gICAgICAgIG1ldGhvZC5rZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikgLy8gU3RyaW5nIGxpdGVyYWxcbiAgICApO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQ2xhc3NCb2R5XG4gIHBhcnNlQ2xhc3NCb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBoYWRTdXBlckNsYXNzOiBib29sZWFuLFxuICAgIG9sZFN0cmljdDogYm9vbGVhbixcbiAgKTogTi5DbGFzc0JvZHkge1xuICAgIHRoaXMuY2xhc3NTY29wZS5lbnRlcigpO1xuXG4gICAgY29uc3Qgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlID0ge1xuICAgICAgaGFkQ29uc3RydWN0b3I6IGZhbHNlLFxuICAgICAgaGFkU3VwZXJDbGFzcyxcbiAgICB9O1xuICAgIGxldCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdID0gW107XG4gICAgY29uc3QgY2xhc3NCb2R5ID0gdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0JvZHk+KCk7XG4gICAgY2xhc3NCb2R5LmJvZHkgPSBbXTtcblxuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG5cbiAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAvLyBjb250ZXh0cyB3aXRoaW4gdGhlIGNsYXNzIGJvZHkuXG4gICAgdGhpcy53aXRoU21hcnRNaXhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpID0+IHtcbiAgICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyB3aXRoaW4gdGhlIGJyYWNlcy5cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5zZW1pKSkge1xuICAgICAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvclNlbWljb2xvbiwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLkNsYXNzTWVtYmVyPigpO1xuXG4gICAgICAgIC8vIHN0ZWFsIHRoZSBkZWNvcmF0b3JzIGlmIHRoZXJlIGFyZSBhbnlcbiAgICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKG1lbWJlciwgZGVjb3JhdG9yc1swXSk7XG4gICAgICAgICAgZGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJzZUNsYXNzTWVtYmVyKGNsYXNzQm9keSwgbWVtYmVyLCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWVcbiAgICAgICAgICBtZW1iZXIua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzICYmXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQ29uc3RydWN0b3IsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZS5zdHJpY3QgPSBvbGRTdHJpY3Q7XG5cbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGB9YFxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5UcmFpbGluZ0RlY29yYXRvciwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNsYXNzU2NvcGUuZXhpdCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShjbGFzc0JvZHksIFwiQ2xhc3NCb2R5XCIpO1xuICB9XG5cbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgaXMgYSBtZXRob2QvZmllbGQgbmFtZSxcbiAgLy8gZmFsc2UgaWYgaXQgaXMgYSBtb2RpZmllclxuICBwYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8Ti5DbGFzc01lbWJlcj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpOyAvLyBlYXRzIHRoZSBtb2RpZmllclxuXG4gICAgaWYgKHRoaXMuaXNDbGFzc01ldGhvZCgpKSB7XG4gICAgICBjb25zdCBtZXRob2Q6IE4uQ2xhc3NNZXRob2QgPSBtZW1iZXIgYXMgYW55O1xuXG4gICAgICAvLyBhIG1ldGhvZCBuYW1lZCBsaWtlIHRoZSBtb2RpZmllclxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgbWV0aG9kLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICBtZXRob2Qua2V5ID0ga2V5O1xuICAgICAgbWV0aG9kLnN0YXRpYyA9IGZhbHNlO1xuICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NsYXNzUHJvcGVydHkoKSkge1xuICAgICAgY29uc3QgcHJvcDogTi5DbGFzc1Byb3BlcnR5ID0gbWVtYmVyIGFzIGFueTtcblxuICAgICAgLy8gYSBwcm9wZXJ0eSBuYW1lZCBsaWtlIHRoZSBtb2RpZmllclxuICAgICAgcHJvcC5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgcHJvcC5rZXkgPSBrZXk7XG4gICAgICBwcm9wLnN0YXRpYyA9IGZhbHNlO1xuICAgICAgY2xhc3NCb2R5LmJvZHkucHVzaCh0aGlzLnBhcnNlQ2xhc3NQcm9wZXJ0eShwcm9wKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwYXJzZUNsYXNzTWVtYmVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8Ti5DbGFzc01lbWJlcj4sXG4gICAgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpc1N0YXRpYyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zdGF0aWMpO1xuXG4gICAgaWYgKGlzU3RhdGljKSB7XG4gICAgICBpZiAodGhpcy5wYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKGNsYXNzQm9keSwgbWVtYmVyKSkge1xuICAgICAgICAvLyBhIGNsYXNzIGVsZW1lbnQgbmFtZWQgJ3N0YXRpYydcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmJyYWNlTCkpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNsYXNzU3RhdGljQmxvY2soY2xhc3NCb2R5LCBtZW1iZXIgYXMgYW55IGFzIE4uU3RhdGljQmxvY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKGNsYXNzQm9keSwgbWVtYmVyLCBzdGF0ZSwgaXNTdGF0aWMpO1xuICB9XG5cbiAgcGFyc2VDbGFzc01lbWJlcldpdGhJc1N0YXRpYyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xhc3NCb2R5OiBVbmRvbmU8Ti5DbGFzc0JvZHk+LFxuICAgIG1lbWJlcjogVW5kb25lPE4uQ2xhc3NNZW1iZXI+LFxuICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICBpc1N0YXRpYzogYm9vbGVhbixcbiAgKSB7XG4gICAgY29uc3QgcHVibGljTWV0aG9kID0gbWVtYmVyIGFzIE4uQ2xhc3NNZXRob2Q7XG4gICAgY29uc3QgcHJpdmF0ZU1ldGhvZCA9IG1lbWJlciBhcyBOLkNsYXNzUHJpdmF0ZU1ldGhvZDtcbiAgICBjb25zdCBwdWJsaWNQcm9wID0gbWVtYmVyIGFzIE4uQ2xhc3NQcm9wZXJ0eTtcbiAgICBjb25zdCBwcml2YXRlUHJvcCA9IG1lbWJlciBhcyBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5O1xuICAgIGNvbnN0IGFjY2Vzc29yUHJvcCA9IG1lbWJlciBhcyBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eTtcblxuICAgIGNvbnN0IG1ldGhvZDogdHlwZW9mIHB1YmxpY01ldGhvZCB8IHR5cGVvZiBwcml2YXRlTWV0aG9kID0gcHVibGljTWV0aG9kO1xuICAgIGNvbnN0IHB1YmxpY01lbWJlcjogdHlwZW9mIHB1YmxpY01ldGhvZCB8IHR5cGVvZiBwdWJsaWNQcm9wID0gcHVibGljTWV0aG9kO1xuXG4gICAgbWVtYmVyLnN0YXRpYyA9IGlzU3RhdGljO1xuICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihtZW1iZXIpO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR0LnN0YXIpKSB7XG4gICAgICAvLyBhIGdlbmVyYXRvclxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgY29uc3QgaXNQcml2YXRlTmFtZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWV0aG9kKTtcblxuICAgICAgaWYgKGlzUHJpdmF0ZU5hbWUpIHtcbiAgICAgICAgLy8gUHJpdmF0ZSBnZW5lcmF0b3IgbWV0aG9kXG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIHByaXZhdGVNZXRob2QsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc05vbnN0YXRpY0NvbnN0cnVjdG9yKHB1YmxpY01ldGhvZCkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0dlbmVyYXRvciwge1xuICAgICAgICAgIGF0OiBwdWJsaWNNZXRob2Qua2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgcHVibGljTWV0aG9kLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNDb250ZXh0dWFsID1cbiAgICAgIHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2M7XG4gICAgY29uc3QgaXNQcml2YXRlID0gdGhpcy5tYXRjaCh0dC5wcml2YXRlTmFtZSk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWVtYmVyKTtcbiAgICBjb25zdCBtYXliZVF1ZXN0aW9uVG9rZW5TdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICB0aGlzLnBhcnNlUG9zdE1lbWJlck5hbWVNb2RpZmllcnMocHVibGljTWVtYmVyKTtcblxuICAgIGlmICh0aGlzLmlzQ2xhc3NNZXRob2QoKSkge1xuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIHByaXZhdGVNZXRob2QsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYSBub3JtYWwgbWV0aG9kXG4gICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdGhpcy5pc05vbnN0YXRpY0NvbnN0cnVjdG9yKHB1YmxpY01ldGhvZCk7XG4gICAgICBsZXQgYWxsb3dzRGlyZWN0U3VwZXIgPSBmYWxzZTtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7XG4gICAgICAgIHB1YmxpY01ldGhvZC5raW5kID0gXCJjb25zdHJ1Y3RvclwiO1xuXG4gICAgICAgIC8vIFR5cGVTY3JpcHQgYWxsb3dzIG11bHRpcGxlIG92ZXJsb2FkZWQgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zLlxuICAgICAgICBpZiAoc3RhdGUuaGFkQ29uc3RydWN0b3IgJiYgIXRoaXMuaGFzUGx1Z2luKFwidHlwZXNjcmlwdFwiKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZUNvbnN0cnVjdG9yLCB7IGF0OiBrZXkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgdGhpcy5oYXNQbHVnaW4oXCJ0eXBlc2NyaXB0XCIpICYmIG1lbWJlci5vdmVycmlkZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk92ZXJyaWRlT25Db25zdHJ1Y3RvciwgeyBhdDoga2V5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmhhZENvbnN0cnVjdG9yID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIgPSBzdGF0ZS5oYWRTdXBlckNsYXNzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnB1c2hDbGFzc01ldGhvZChcbiAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICBwdWJsaWNNZXRob2QsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NsYXNzUHJvcGVydHkoKSkge1xuICAgICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgICB0aGlzLnB1c2hDbGFzc1ByaXZhdGVQcm9wZXJ0eShjbGFzc0JvZHksIHByaXZhdGVQcm9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJvcGVydHkoY2xhc3NCb2R5LCBwdWJsaWNQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaXNDb250ZXh0dWFsICYmXG4gICAgICBrZXkubmFtZSA9PT0gXCJhc3luY1wiICYmXG4gICAgICAhdGhpcy5pc0xpbmVUZXJtaW5hdG9yKClcbiAgICApIHtcbiAgICAgIC8vIGFuIGFzeW5jIG1ldGhvZFxuICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICAgIGNvbnN0IGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHQuc3Rhcik7XG5cbiAgICAgIGlmIChwdWJsaWNNZW1iZXIub3B0aW9uYWwpIHtcbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKG1heWJlUXVlc3Rpb25Ub2tlblN0YXJ0TG9jKTtcbiAgICAgIH1cblxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJhc3luY1wiOiBnZXQgdGhlIHJlYWwgbmFtZS5cbiAgICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWV0aG9kKTtcbiAgICAgIHRoaXMucGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyhwdWJsaWNNZW1iZXIpO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIC8vIHByaXZhdGUgYXN5bmMgbWV0aG9kXG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgICAgcHJpdmF0ZU1ldGhvZCxcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihwdWJsaWNNZXRob2QpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0FzeW5jLCB7IGF0OiBwdWJsaWNNZXRob2Qua2V5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICAgIHB1YmxpY01ldGhvZCxcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGlzQ29udGV4dHVhbCAmJlxuICAgICAgKGtleS5uYW1lID09PSBcImdldFwiIHx8IGtleS5uYW1lID09PSBcInNldFwiKSAmJlxuICAgICAgISh0aGlzLm1hdGNoKHR0LnN0YXIpICYmIHRoaXMuaXNMaW5lVGVybWluYXRvcigpKVxuICAgICkge1xuICAgICAgLy8gYGdldFxcbipgIGlzIGFuIHVuaW5pdGlhbGl6ZWQgcHJvcGVydHkgbmFtZWQgJ2dldCcgZm9sbG93ZWQgYnkgYSBnZW5lcmF0b3IuXG4gICAgICAvLyBhIGdldHRlciBvciBzZXR0ZXJcbiAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGtleSk7XG4gICAgICBtZXRob2Qua2luZCA9IGtleS5uYW1lO1xuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJnZXQvc2V0XCI6IGdldCB0aGUgcmVhbCBuYW1lLlxuICAgICAgY29uc3QgaXNQcml2YXRlID0gdGhpcy5tYXRjaCh0dC5wcml2YXRlTmFtZSk7XG4gICAgICB0aGlzLnBhcnNlQ2xhc3NFbGVtZW50TmFtZShwdWJsaWNNZXRob2QpO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIC8vIHByaXZhdGUgZ2V0dGVyL3NldHRlclxuICAgICAgICB0aGlzLnB1c2hDbGFzc1ByaXZhdGVNZXRob2QoY2xhc3NCb2R5LCBwcml2YXRlTWV0aG9kLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihwdWJsaWNNZXRob2QpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0FjY2Vzc29yLCB7IGF0OiBwdWJsaWNNZXRob2Qua2V5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaENsYXNzTWV0aG9kKFxuICAgICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgICBwdWJsaWNNZXRob2QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGVja0dldHRlclNldHRlclBhcmFtcyhwdWJsaWNNZXRob2QpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpc0NvbnRleHR1YWwgJiZcbiAgICAgIGtleS5uYW1lID09PSBcImFjY2Vzc29yXCIgJiZcbiAgICAgICF0aGlzLmlzTGluZVRlcm1pbmF0b3IoKVxuICAgICkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJkZWNvcmF0b3JBdXRvQWNjZXNzb3JzXCIpO1xuICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcblxuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJhY2Nlc3NvclwiOiBnZXQgdGhlIHJlYWwgbmFtZS5cbiAgICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUocHVibGljUHJvcCk7XG4gICAgICB0aGlzLnB1c2hDbGFzc0FjY2Vzc29yUHJvcGVydHkoY2xhc3NCb2R5LCBhY2Nlc3NvclByb3AsIGlzUHJpdmF0ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgLy8gYW4gdW5pbml0aWFsaXplZCBjbGFzcyBwcm9wZXJ0eSAoZHVlIHRvIEFTSSwgc2luY2Ugd2UgZG9uJ3Qgb3RoZXJ3aXNlIHJlY29nbml6ZSB0aGUgbmV4dCB0b2tlbilcbiAgICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoQ2xhc3NQcml2YXRlUHJvcGVydHkoY2xhc3NCb2R5LCBwcml2YXRlUHJvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hDbGFzc1Byb3BlcnR5KGNsYXNzQm9keSwgcHVibGljUHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUNsYXNzRWxlbWVudE5hbWVcbiAgcGFyc2VDbGFzc0VsZW1lbnROYW1lKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBtZW1iZXI6IFVuZG9uZTxOLkNsYXNzTWVtYmVyPixcbiAgKTogTi5FeHByZXNzaW9uIHwgTi5JZGVudGlmaWVyIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChcbiAgICAgICh0eXBlID09PSB0dC5uYW1lIHx8IHR5cGUgPT09IHR0LnN0cmluZykgJiZcbiAgICAgIG1lbWJlci5zdGF0aWMgJiZcbiAgICAgIHZhbHVlID09PSBcInByb3RvdHlwZVwiXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5TdGF0aWNQcm90b3R5cGUsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IHR0LnByaXZhdGVOYW1lKSB7XG4gICAgICBpZiAodmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzUHJpdmF0ZUZpZWxkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZVByaXZhdGVOYW1lKCk7XG4gICAgICBtZW1iZXIua2V5ID0ga2V5O1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZVByb3BlcnR5TmFtZShtZW1iZXIpO1xuICB9XG5cbiAgcGFyc2VDbGFzc1N0YXRpY0Jsb2NrKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8XG4gICAgICBOLlN0YXRpY0Jsb2NrICYge1xuICAgICAgICBkZWNvcmF0b3JzPzogQXJyYXk8Ti5EZWNvcmF0b3I+O1xuICAgICAgfVxuICAgID4sXG4gICkge1xuICAgIC8vIFN0YXJ0IGEgbmV3IGxleGljYWwgc2NvcGVcbiAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX0NMQVNTIHwgU0NPUEVfU1RBVElDX0JMT0NLIHwgU0NPUEVfU1VQRVIpO1xuICAgIC8vIFN0YXJ0IGEgbmV3IHNjb3BlIHdpdGggcmVnYXJkIHRvIGxvb3AgbGFiZWxzXG4gICAgY29uc3Qgb2xkTGFiZWxzID0gdGhpcy5zdGF0ZS5sYWJlbHM7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBbXTtcbiAgICAvLyBDbGFzc1N0YXRpY0Jsb2NrU3RhdGVtZW50TGlzdDpcbiAgICAvLyAgIFN0YXRlbWVudExpc3RbfllpZWxkLCB+QXdhaXQsIH5SZXR1cm5dIG9wdFxuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKFBBUkFNKTtcbiAgICBjb25zdCBib2R5OiBOLk5vZGVbXSA9IChtZW1iZXIuYm9keSA9IFtdKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tPck1vZHVsZUJsb2NrQm9keShib2R5LCB1bmRlZmluZWQsIGZhbHNlLCB0dC5icmFjZVIpO1xuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IG9sZExhYmVscztcbiAgICBjbGFzc0JvZHkuYm9keS5wdXNoKHRoaXMuZmluaXNoTm9kZTxOLlN0YXRpY0Jsb2NrPihtZW1iZXIsIFwiU3RhdGljQmxvY2tcIikpO1xuICAgIGlmIChtZW1iZXIuZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5EZWNvcmF0b3JTdGF0aWNCbG9jaywgeyBhdDogbWVtYmVyIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hDbGFzc1Byb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgcHJvcDogTi5DbGFzc1Byb3BlcnR5LFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhcHJvcC5jb21wdXRlZCAmJlxuICAgICAgKHByb3Aua2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCBwcm9wLmtleS52YWx1ZSA9PT0gXCJjb25zdHJ1Y3RvclwiKVxuICAgICkge1xuICAgICAgLy8gTm9uLWNvbXB1dGVkIGZpZWxkLCB3aGljaCBpcyBlaXRoZXIgYW4gaWRlbnRpZmllciBuYW1lZCBcImNvbnN0cnVjdG9yXCJcbiAgICAgIC8vIG9yIGEgc3RyaW5nIGxpdGVyYWwgbmFtZWQgXCJjb25zdHJ1Y3RvclwiXG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzRmllbGQsIHsgYXQ6IHByb3Aua2V5IH0pO1xuICAgIH1cblxuICAgIGNsYXNzQm9keS5ib2R5LnB1c2godGhpcy5wYXJzZUNsYXNzUHJvcGVydHkocHJvcCkpO1xuICB9XG5cbiAgcHVzaENsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgcHJvcDogVW5kb25lPE4uQ2xhc3NQcml2YXRlUHJvcGVydHk+LFxuICApIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KHByb3ApO1xuICAgIGNsYXNzQm9keS5ib2R5LnB1c2gobm9kZSk7XG5cbiAgICB0aGlzLmNsYXNzU2NvcGUuZGVjbGFyZVByaXZhdGVOYW1lKFxuICAgICAgdGhpcy5nZXRQcml2YXRlTmFtZVNWKG5vZGUua2V5KSxcbiAgICAgIENMQVNTX0VMRU1FTlRfT1RIRVIsXG4gICAgICBub2RlLmtleS5sb2Muc3RhcnQsXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hDbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsYXNzQm9keTogVW5kb25lPE4uQ2xhc3NCb2R5PixcbiAgICBwcm9wOiBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgICBpc1ByaXZhdGU6IGJvb2xlYW4sXG4gICkge1xuICAgIGlmICghaXNQcml2YXRlICYmICFwcm9wLmNvbXB1dGVkKSB7XG4gICAgICAvLyBOb3QgcHJpdmF0ZSwgc28gbm90IG5vZGUgaXMgbm90IGEgUHJpdmF0ZU5hbWUgYW5kIHdlIGNhbiBzYWZlbHkgY2FzdFxuICAgICAgY29uc3Qga2V5ID0gcHJvcC5rZXkgYXMgTi5FeHByZXNzaW9uO1xuXG4gICAgICBpZiAoa2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCBrZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICAvLyBOb24tY29tcHV0ZWQgZmllbGQsIHdoaWNoIGlzIGVpdGhlciBhbiBpZGVudGlmaWVyIG5hbWVkIFwiY29uc3RydWN0b3JcIlxuICAgICAgICAvLyBvciBhIHN0cmluZyBsaXRlcmFsIG5hbWVkIFwiY29uc3RydWN0b3JcIlxuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzRmllbGQsIHsgYXQ6IGtleSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUNsYXNzQWNjZXNzb3JQcm9wZXJ0eShwcm9wKTtcbiAgICBjbGFzc0JvZHkuYm9keS5wdXNoKG5vZGUpO1xuXG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgdGhpcy5jbGFzc1Njb3BlLmRlY2xhcmVQcml2YXRlTmFtZShcbiAgICAgICAgdGhpcy5nZXRQcml2YXRlTmFtZVNWKG5vZGUua2V5KSxcbiAgICAgICAgQ0xBU1NfRUxFTUVOVF9PVEhFUixcbiAgICAgICAgbm9kZS5rZXkubG9jLnN0YXJ0LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdXNoQ2xhc3NNZXRob2QoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsYXNzQm9keTogVW5kb25lPE4uQ2xhc3NCb2R5PixcbiAgICBtZXRob2Q6IFVuZG9uZTxOLkNsYXNzTWV0aG9kPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgYWxsb3dzRGlyZWN0U3VwZXI6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNsYXNzQm9keS5ib2R5LnB1c2goXG4gICAgICB0aGlzLnBhcnNlTWV0aG9kKFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc0NvbnN0cnVjdG9yLFxuICAgICAgICBhbGxvd3NEaXJlY3RTdXBlcixcbiAgICAgICAgXCJDbGFzc01ldGhvZFwiLFxuICAgICAgICB0cnVlLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xhc3NCb2R5OiBVbmRvbmU8Ti5DbGFzc0JvZHk+LFxuICAgIG1ldGhvZDogVW5kb25lPE4uQ2xhc3NQcml2YXRlTWV0aG9kPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgaXNBc3luYyxcbiAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICBmYWxzZSxcbiAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgY2xhc3NCb2R5LmJvZHkucHVzaChub2RlKTtcblxuICAgIGNvbnN0IGtpbmQgPVxuICAgICAgbm9kZS5raW5kID09PSBcImdldFwiXG4gICAgICAgID8gbm9kZS5zdGF0aWNcbiAgICAgICAgICA/IENMQVNTX0VMRU1FTlRfU1RBVElDX0dFVFRFUlxuICAgICAgICAgIDogQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9HRVRURVJcbiAgICAgICAgOiBub2RlLmtpbmQgPT09IFwic2V0XCJcbiAgICAgICAgPyBub2RlLnN0YXRpY1xuICAgICAgICAgID8gQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSXG4gICAgICAgICAgOiBDTEFTU19FTEVNRU5UX0lOU1RBTkNFX1NFVFRFUlxuICAgICAgICA6IENMQVNTX0VMRU1FTlRfT1RIRVI7XG4gICAgdGhpcy5kZWNsYXJlQ2xhc3NQcml2YXRlTWV0aG9kSW5TY29wZShub2RlLCBraW5kKTtcbiAgfVxuXG4gIGRlY2xhcmVDbGFzc1ByaXZhdGVNZXRob2RJblNjb3BlKFxuICAgIG5vZGU6IFVuZG9uZTxcbiAgICAgIE4uQ2xhc3NQcml2YXRlTWV0aG9kIHwgTi5Fc3RyZWVNZXRob2REZWZpbml0aW9uIHwgTi5UU0RlY2xhcmVNZXRob2RcbiAgICA+LFxuICAgIGtpbmQ6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy5jbGFzc1Njb3BlLmRlY2xhcmVQcml2YXRlTmFtZShcbiAgICAgIHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihub2RlLmtleSksXG4gICAgICBraW5kLFxuICAgICAgbm9kZS5rZXkubG9jLnN0YXJ0LFxuICAgICk7XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIGluIHR5cGVzY3JpcHQuanNcbiAgcGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgbWV0aG9kT3JQcm9wOiBVbmRvbmU8Ti5DbGFzc01ldGhvZCB8IE4uQ2xhc3NQcm9wZXJ0eT4sXG4gICk6IHZvaWQge31cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1GaWVsZERlZmluaXRpb25cbiAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uQ2xhc3NQcml2YXRlUHJvcGVydHk+LFxuICApOiBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHtcbiAgICB0aGlzLnBhcnNlSW5pdGlhbGl6ZXIobm9kZSk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1GaWVsZERlZmluaXRpb25cbiAgcGFyc2VDbGFzc1Byb3BlcnR5KHRoaXM6IFBhcnNlciwgbm9kZTogTi5DbGFzc1Byb3BlcnR5KTogTi5DbGFzc1Byb3BlcnR5IHtcbiAgICB0aGlzLnBhcnNlSW5pdGlhbGl6ZXIobm9kZSk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQ2xhc3NQcm9wZXJ0eVwiKTtcbiAgfVxuXG4gIHBhcnNlQ2xhc3NBY2Nlc3NvclByb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgKTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICAgIHRoaXMucGFyc2VJbml0aWFsaXplcihub2RlKTtcbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Jbml0aWFsaXplclxuICBwYXJzZUluaXRpYWxpemVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkNsYXNzUHJvcGVydHkgfCBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHwgTi5DbGFzc0FjY2Vzc29yUHJvcGVydHlcbiAgICA+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX0NMQVNTIHwgU0NPUEVfU1VQRVIpO1xuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmVudGVyKG5ld0V4cHJlc3Npb25TY29wZSgpKTtcbiAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgbm9kZS52YWx1ZSA9IHRoaXMuZWF0KHR0LmVxKSA/IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKSA6IG51bGw7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgfVxuXG4gIHBhcnNlQ2xhc3NJZChcbiAgICBub2RlOiBVbmRvbmU8Ti5DbGFzcz4sXG4gICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgb3B0aW9uYWxJZD86IGJvb2xlYW4gfCBudWxsLFxuICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgPSBCSU5EX0NMQVNTLFxuICApOiB2b2lkIHtcbiAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBpZiAoaXNTdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kZWNsYXJlTmFtZUZyb21JZGVudGlmaWVyKG5vZGUuaWQsIGJpbmRpbmdUeXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbmFsSWQgfHwgIWlzU3RhdGVtZW50KSB7XG4gICAgICAgIG5vZGUuaWQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ0NsYXNzTmFtZSwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1DbGFzc0hlcml0YWdlXG4gIHBhcnNlQ2xhc3NTdXBlcih0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLkNsYXNzPik6IHZvaWQge1xuICAgIG5vZGUuc3VwZXJDbGFzcyA9IHRoaXMuZWF0KHR0Ll9leHRlbmRzKSA/IHRoaXMucGFyc2VFeHByU3Vic2NyaXB0cygpIDogbnVsbDtcbiAgfVxuXG4gIC8vIFBhcnNlcyBtb2R1bGUgZXhwb3J0IGRlY2xhcmF0aW9uLlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1FeHBvcnREZWNsYXJhdGlvblxuXG4gIHBhcnNlRXhwb3J0KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXG4gICAgICB8IE4uRXhwb3J0QWxsRGVjbGFyYXRpb25cbiAgICAgIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uXG4gICAgPixcbiAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgKTogTi5BbnlFeHBvcnQge1xuICAgIGNvbnN0IG1heWJlRGVmYXVsdElkZW50aWZpZXIgPSB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICAgIG5vZGUsXG4gICAgICAvKiBpc0V4cG9ydCAqLyB0cnVlLFxuICAgICk7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IHRoaXMubWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICBub2RlLFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlQWZ0ZXJEZWZhdWx0ID0gIWhhc0RlZmF1bHQgfHwgdGhpcy5lYXQodHQuY29tbWEpO1xuICAgIGNvbnN0IGhhc1N0YXIgPVxuICAgICAgcGFyc2VBZnRlckRlZmF1bHQgJiZcbiAgICAgIHRoaXMuZWF0RXhwb3J0U3RhcihcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICBub2RlLFxuICAgICAgKTtcbiAgICBjb25zdCBoYXNOYW1lc3BhY2UgPVxuICAgICAgaGFzU3RhciAmJlxuICAgICAgdGhpcy5tYXliZVBhcnNlRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIG5vZGUsXG4gICAgICApO1xuICAgIGNvbnN0IHBhcnNlQWZ0ZXJOYW1lc3BhY2UgPVxuICAgICAgcGFyc2VBZnRlckRlZmF1bHQgJiYgKCFoYXNOYW1lc3BhY2UgfHwgdGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICBjb25zdCBpc0Zyb21SZXF1aXJlZCA9IGhhc0RlZmF1bHQgfHwgaGFzU3RhcjtcblxuICAgIGlmIChoYXNTdGFyICYmICFoYXNOYW1lc3BhY2UpIHtcbiAgICAgIGlmIChoYXNEZWZhdWx0KSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIGlmIChkZWNvcmF0b3JzKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVuc3VwcG9ydGVkRGVjb3JhdG9yRXhwb3J0LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJzZUV4cG9ydEZyb20obm9kZSBhcyBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uPiwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTcGVjaWZpZXJzID0gdGhpcy5tYXliZVBhcnNlRXhwb3J0TmFtZWRTcGVjaWZpZXJzKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgbm9kZSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0RlZmF1bHQgJiYgcGFyc2VBZnRlckRlZmF1bHQgJiYgIWhhc1N0YXIgJiYgIWhhc1NwZWNpZmllcnMpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5icmFjZUwpO1xuICAgIH1cblxuICAgIGlmIChoYXNOYW1lc3BhY2UgJiYgcGFyc2VBZnRlck5hbWVzcGFjZSkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKG51bGwsIHR0Ll9mcm9tKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzRGVjbGFyYXRpb247XG4gICAgaWYgKGlzRnJvbVJlcXVpcmVkIHx8IGhhc1NwZWNpZmllcnMpIHtcbiAgICAgIGhhc0RlY2xhcmF0aW9uID0gZmFsc2U7XG4gICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFyc2VFeHBvcnRGcm9tKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICAgICAgICBpc0Zyb21SZXF1aXJlZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0RlY2xhcmF0aW9uID0gdGhpcy5tYXliZVBhcnNlRXhwb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0Zyb21SZXF1aXJlZCB8fCBoYXNTcGVjaWZpZXJzIHx8IGhhc0RlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBub2RlMiA9IG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj47XG4gICAgICB0aGlzLmNoZWNrRXhwb3J0KG5vZGUyLCB0cnVlLCBmYWxzZSwgISFub2RlMi5zb3VyY2UpO1xuICAgICAgaWYgKG5vZGUyLmRlY2xhcmF0aW9uPy50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIikge1xuICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgbm9kZTIuZGVjbGFyYXRpb24sIG5vZGUyKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZTIsIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lYXQodHQuX2RlZmF1bHQpKSB7XG4gICAgICBjb25zdCBub2RlMiA9IG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPjtcbiAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IC4uLlxuICAgICAgY29uc3QgZGVjbCA9IHRoaXMucGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpO1xuICAgICAgbm9kZTIuZGVjbGFyYXRpb24gPSBkZWNsO1xuXG4gICAgICBpZiAoZGVjbC50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIikge1xuICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgZGVjbCBhcyBOLkNsYXNzRGVjbGFyYXRpb24sIG5vZGUyKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGVja0V4cG9ydChub2RlMiwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZTIsIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5icmFjZUwpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBlYXRFeHBvcnRTdGFyKG5vZGU6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVhdCh0dC5zdGFyKTtcbiAgfVxuXG4gIG1heWJlUGFyc2VFeHBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICAgIG5vZGU6IFVuZG9uZTxcbiAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgIHwgTi5FeHBvcnRBbGxEZWNsYXJhdGlvblxuICAgICAgfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cbiAgICA+LFxuICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXI6IE4uSWRlbnRpZmllciB8IG51bGwsXG4gICk6IG5vZGUgaXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4ge1xuICAgIGlmIChtYXliZURlZmF1bHRJZGVudGlmaWVyIHx8IHRoaXMuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCkpIHtcbiAgICAgIC8vIGV4cG9ydCBkZWZhdWx0T2JqIC4uLlxuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBvcnREZWZhdWx0RnJvbVwiLCBtYXliZURlZmF1bHRJZGVudGlmaWVyPy5sb2Muc3RhcnQpO1xuICAgICAgY29uc3QgaWQgPSBtYXliZURlZmF1bHRJZGVudGlmaWVyIHx8IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgY29uc3Qgc3BlY2lmaWVyID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5FeHBvcnREZWZhdWx0U3BlY2lmaWVyPihpZCk7XG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSBpZDtcbiAgICAgIChub2RlIGFzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+KS5zcGVjaWZpZXJzID0gW1xuICAgICAgICB0aGlzLmZpbmlzaE5vZGUoc3BlY2lmaWVyLCBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIiksXG4gICAgICBdO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1heWJlUGFyc2VFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgIGlmICghbm9kZS5zcGVjaWZpZXJzKSBub2RlLnNwZWNpZmllcnMgPSBbXTtcblxuICAgICAgY29uc3Qgc3BlY2lmaWVyID0gdGhpcy5zdGFydE5vZGVBdCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyk7XG5cbiAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgbm9kZS5zcGVjaWZpZXJzLnB1c2goXG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBtYXliZVBhcnNlRXhwb3J0TmFtZWRTcGVjaWZpZXJzKG5vZGU6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlTCkpIHtcbiAgICAgIGlmICghbm9kZS5zcGVjaWZpZXJzKSBub2RlLnNwZWNpZmllcnMgPSBbXTtcbiAgICAgIGNvbnN0IGlzVHlwZUV4cG9ydCA9IG5vZGUuZXhwb3J0S2luZCA9PT0gXCJ0eXBlXCI7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaCguLi50aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhpc1R5cGVFeHBvcnQpKTtcblxuICAgICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IG51bGw7XG4gICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJpbXBvcnRBc3NlcnRpb25zXCIpKSB7XG4gICAgICAgIG5vZGUuYXNzZXJ0aW9ucyA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbWF5YmVQYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2hvdWxkUGFyc2VFeHBvcnREZWNsYXJhdGlvbigpKSB7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBbXTtcbiAgICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImltcG9ydEFzc2VydGlvbnNcIikpIHtcbiAgICAgICAgbm9kZS5hc3NlcnRpb25zID0gW107XG4gICAgICB9XG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hc3luYykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydCgpO1xuICAgIHJldHVybiB0aGlzLmlzVW5wYXJzZWRDb250ZXh0dWFsKG5leHQsIFwiZnVuY3Rpb25cIik7XG4gIH1cblxuICBwYXJzZUV4cG9ydERlZmF1bHRFeHByZXNzaW9uKHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB8IE4uRGVjbGFyYXRpb24ge1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2Z1bmN0aW9uKSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKFxuICAgICAgICBleHByIGFzIFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+LFxuICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5EZWNsYXJhdGlvbiB8IFBhcnNlRnVuY3Rpb25GbGFnLk51bGxhYmxlSWQsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnYXN5bmMnXG4gICAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICdmdW5jdGlvbidcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24oXG4gICAgICAgIGV4cHIgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgIFBhcnNlRnVuY3Rpb25GbGFnLkRlY2xhcmF0aW9uIHxcbiAgICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5OdWxsYWJsZUlkIHxcbiAgICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5Bc3luYyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyhleHByIGFzIFVuZG9uZTxOLkNsYXNzRXhwcmVzc2lvbj4sIHRydWUsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LmF0KSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc1BsdWdpbihcImRlY29yYXRvcnNcIikgJiZcbiAgICAgICAgdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJkZWNvcmF0b3JzXCIsIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiKSA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvckJlZm9yZUV4cG9ydCwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoXG4gICAgICAgIHRoaXMubWF5YmVUYWtlRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhmYWxzZSksXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0RlY2xhcmF0aW9uPigpLFxuICAgICAgICApLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5fY29uc3QpIHx8IHRoaXMubWF0Y2godHQuX3ZhcikgfHwgdGhpcy5pc0xldCgpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlZmF1bHRFeHBvcnQsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRXhwb3J0RGVjbGFyYXRpb25cbiAgcGFyc2VFeHBvcnREZWNsYXJhdGlvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG5vZGU6IFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucGFyc2VDbGFzcyhcbiAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0RlY2xhcmF0aW9uPigpLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpIGFzIE4uRGVjbGFyYXRpb247XG4gIH1cblxuICBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0b2tlbklzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgaWYgKCh0eXBlID09PSB0dC5fYXN5bmMgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHx8IHR5cGUgPT09IHR0Ll9sZXQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAodHlwZSA9PT0gdHQuX3R5cGUgfHwgdHlwZSA9PT0gdHQuX2ludGVyZmFjZSkgJiZcbiAgICAgICAgIXRoaXMuc3RhdGUuY29udGFpbnNFc2NcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IHR5cGU6IG5leHRUeXBlIH0gPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAvLyBJZiB3ZSBzZWUgYW55IHZhcmlhYmxlIG5hbWUgb3RoZXIgdGhhbiBgZnJvbWAgYWZ0ZXIgYHR5cGVgIGtleXdvcmQsXG4gICAgICAgIC8vIHdlIGNvbnNpZGVyIGl0IGFzIGZsb3cvdHlwZXNjcmlwdCB0eXBlIGV4cG9ydHNcbiAgICAgICAgLy8gbm90ZSB0aGF0IHRoaXMgYXBwcm9hY2ggbWF5IGZhaWwgb24gc29tZSBwZWRhbnRpYyBjYXNlc1xuICAgICAgICAvLyBleHBvcnQgdHlwZSBmcm9tID0gbnVtYmVyXG4gICAgICAgIGlmIChcbiAgICAgICAgICAodG9rZW5Jc0lkZW50aWZpZXIobmV4dFR5cGUpICYmIG5leHRUeXBlICE9PSB0dC5fZnJvbSkgfHxcbiAgICAgICAgICBuZXh0VHlwZSA9PT0gdHQuYnJhY2VMXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImZsb3dcIiwgXCJ0eXBlc2NyaXB0XCJdKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLm1hdGNoKHR0Ll9kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgY29uc3QgaGFzRnJvbSA9IHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgXCJmcm9tXCIpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KSA9PT0gY2hhckNvZGVzLmNvbW1hIHx8XG4gICAgICAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSAmJiBoYXNGcm9tKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGxvb2thaGVhZCBhZ2FpbiB3aGVuIGBleHBvcnQgZGVmYXVsdCBmcm9tYCBpcyBzZWVuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2RlZmF1bHQpICYmIGhhc0Zyb20pIHtcbiAgICAgIGNvbnN0IG5leHRBZnRlckZyb20gPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoXG4gICAgICAgIHRoaXMubmV4dFRva2VuU3RhcnRTaW5jZShuZXh0ICsgNCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbmV4dEFmdGVyRnJvbSA9PT0gY2hhckNvZGVzLnF1b3RhdGlvbk1hcmsgfHxcbiAgICAgICAgbmV4dEFmdGVyRnJvbSA9PT0gY2hhckNvZGVzLmFwb3N0cm9waGVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHBhcnNlRXhwb3J0RnJvbShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgZXhwZWN0PzogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fZnJvbSkpIHtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgICAgdGhpcy5jaGVja0V4cG9ydChub2RlKTtcbiAgICAgIHRoaXMubWF5YmVQYXJzZUltcG9ydEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICB0aGlzLmNoZWNrSlNPTk1vZHVsZUltcG9ydChub2RlKTtcbiAgICB9IGVsc2UgaWYgKGV4cGVjdCkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgfVxuXG4gIHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0eXBlID09PSB0dC5hdCkge1xuICAgICAgdGhpcy5leHBlY3RPbmVQbHVnaW4oW1wiZGVjb3JhdG9yc1wiLCBcImRlY29yYXRvcnMtbGVnYWN5XCJdKTtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImRlY29yYXRvcnNcIikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZGVjb3JhdG9yc1wiLCBcImRlY29yYXRvcnNCZWZvcmVFeHBvcnRcIikgPT09IHRydWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQmVmb3JlRXhwb3J0LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlID09PSB0dC5fdmFyIHx8XG4gICAgICB0eXBlID09PSB0dC5fY29uc3QgfHxcbiAgICAgIHR5cGUgPT09IHR0Ll9mdW5jdGlvbiB8fFxuICAgICAgdHlwZSA9PT0gdHQuX2NsYXNzIHx8XG4gICAgICB0aGlzLmlzTGV0KCkgfHxcbiAgICAgIHRoaXMuaXNBc3luY0Z1bmN0aW9uKClcbiAgICApO1xuICB9XG5cbiAgY2hlY2tFeHBvcnQoXG4gICAgbm9kZTogVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbiB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPixcbiAgICBjaGVja05hbWVzPzogYm9vbGVhbixcbiAgICBpc0RlZmF1bHQ/OiBib29sZWFuLFxuICAgIGlzRnJvbT86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGlmIChjaGVja05hbWVzKSB7XG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIGV4cG9ydHNcbiAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBleHBvcnRzXG4gICAgICAgIHRoaXMuY2hlY2tEdXBsaWNhdGVFeHBvcnRzKG5vZGUsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzUGx1Z2luKFwiZXhwb3J0RGVmYXVsdEZyb21cIikpIHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IChub2RlIGFzIGFueSBhcyBOLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbilcbiAgICAgICAgICAgIC5kZWNsYXJhdGlvbjtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICAgZGVjbGFyYXRpb24ubmFtZSA9PT0gXCJmcm9tXCIgJiZcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uLmVuZCAtIGRlY2xhcmF0aW9uLnN0YXJ0ID09PSA0ICYmIC8vIGRvZXMgbm90IGNvbnRhaW4gZXNjYXBlXG4gICAgICAgICAgICAhZGVjbGFyYXRpb24uZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkV4cG9ydERlZmF1bHRGcm9tQXNJZGVudGlmaWVyLCB7XG4gICAgICAgICAgICAgIGF0OiBkZWNsYXJhdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5vZGUuc3BlY2lmaWVycyBtYXkgbm90IGV4aXN0XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuc3BlY2lmaWVycyAmJiBub2RlLnNwZWNpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5hbWVkIGV4cG9ydHNcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlLnNwZWNpZmllcnMgbWF5IG5vdCBleGlzdFxuICAgICAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjb25zdCB7IGV4cG9ydGVkIH0gPSBzcGVjaWZpZXI7XG4gICAgICAgICAgY29uc3QgZXhwb3J0TmFtZSA9XG4gICAgICAgICAgICBleHBvcnRlZC50eXBlID09PSBcIklkZW50aWZpZXJcIiA/IGV4cG9ydGVkLm5hbWUgOiBleHBvcnRlZC52YWx1ZTtcbiAgICAgICAgICB0aGlzLmNoZWNrRHVwbGljYXRlRXhwb3J0cyhzcGVjaWZpZXIsIGV4cG9ydE5hbWUpO1xuICAgICAgICAgIGlmICghaXNGcm9tICYmIHNwZWNpZmllci5sb2NhbCkge1xuICAgICAgICAgICAgY29uc3QgeyBsb2NhbCB9ID0gc3BlY2lmaWVyO1xuICAgICAgICAgICAgaWYgKGxvY2FsLnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkV4cG9ydEJpbmRpbmdJc1N0cmluZywge1xuICAgICAgICAgICAgICAgIGF0OiBzcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgbG9jYWxOYW1lOiBsb2NhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICBleHBvcnROYW1lLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBrZXl3b3JkcyB1c2VkIGFzIGxvY2FsIG5hbWVzXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQobG9jYWwubmFtZSwgbG9jYWwubG9jLnN0YXJ0LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGV4cG9ydCBpcyBkZWZpbmVkXG4gICAgICAgICAgICAgIHRoaXMuc2NvcGUuY2hlY2tMb2NhbEV4cG9ydChsb2NhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gRXhwb3J0ZWQgZGVjbGFyYXRpb25zXG4gICAgICAgIGlmIChcbiAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8XG4gICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbi50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpZCA9IG5vZGUuZGVjbGFyYXRpb24uaWQ7XG4gICAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKFwiQXNzZXJ0aW9uIGZhaWx1cmVcIik7XG5cbiAgICAgICAgICB0aGlzLmNoZWNrRHVwbGljYXRlRXhwb3J0cyhub2RlLCBpZC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja0RlY2xhcmF0aW9uKG5vZGU6IE4uUGF0dGVybiB8IE4uT2JqZWN0UHJvcGVydHkpOiB2b2lkIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgdGhpcy5jaGVja0R1cGxpY2F0ZUV4cG9ydHMobm9kZSwgbm9kZS5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBub2RlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKHByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkFycmF5UGF0dGVyblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tEZWNsYXJhdGlvbihlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlc1xuICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKG5vZGUudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgIHRoaXMuY2hlY2tEZWNsYXJhdGlvbihub2RlLmFyZ3VtZW50KTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICB0aGlzLmNoZWNrRGVjbGFyYXRpb24obm9kZS5sZWZ0KTtcbiAgICB9XG4gIH1cblxuICBjaGVja0R1cGxpY2F0ZUV4cG9ydHMoXG4gICAgbm9kZTogVW5kb25lPFxuICAgICAgfCBOLklkZW50aWZpZXJcbiAgICAgIHwgTi5TdHJpbmdMaXRlcmFsXG4gICAgICB8IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvblxuICAgICAgfCBOLkV4cG9ydFNwZWNpZmllclxuICAgICAgfCBOLkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICA+LFxuICAgIGV4cG9ydE5hbWU6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhwb3J0ZWRJZGVudGlmaWVycy5oYXMoZXhwb3J0TmFtZSkpIHtcbiAgICAgIGlmIChleHBvcnROYW1lID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5EdXBsaWNhdGVEZWZhdWx0RXhwb3J0LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRHVwbGljYXRlRXhwb3J0LCB7IGF0OiBub2RlLCBleHBvcnROYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMuYWRkKGV4cG9ydE5hbWUpO1xuICB9XG5cbiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGV4cG9ydHMuXG5cbiAgcGFyc2VFeHBvcnRTcGVjaWZpZXJzKGlzSW5UeXBlRXhwb3J0OiBib29sZWFuKTogQXJyYXk8Ti5FeHBvcnRTcGVjaWZpZXI+IHtcbiAgICBjb25zdCBub2RlcyA9IFtdO1xuICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAvLyBleHBvcnQgeyB4LCB5IGFzIHogfSBbZnJvbSAnLi4uJ11cbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuXG4gICAgd2hpbGUgKCF0aGlzLmVhdCh0dC5icmFjZVIpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmJyYWNlUikpIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNNYXliZVR5cGVPbmx5ID0gdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpO1xuICAgICAgY29uc3QgaXNTdHJpbmcgPSB0aGlzLm1hdGNoKHR0LnN0cmluZyk7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgbm9kZXMucHVzaChcbiAgICAgICAgdGhpcy5wYXJzZUV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlzU3RyaW5nLFxuICAgICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICAgIGlzTWF5YmVUeXBlT25seSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcGFyc2VFeHBvcnRTcGVjaWZpZXIoXG4gICAgbm9kZTogYW55LFxuICAgIGlzU3RyaW5nOiBib29sZWFuLFxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSB1c2VkIGluIFR5cGVTY3JpcHQgcGFyc2VyICovXG4gICAgaXNJblR5cGVFeHBvcnQ6IGJvb2xlYW4sXG4gICAgaXNNYXliZVR5cGVPbmx5OiBib29sZWFuLFxuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICk6IE4uRXhwb3J0U3BlY2lmaWVyIHtcbiAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgIG5vZGUuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIG5vZGUuZXhwb3J0ZWQgPSBjbG9uZVN0cmluZ0xpdGVyYWwobm9kZS5sb2NhbCk7XG4gICAgfSBlbHNlIGlmICghbm9kZS5leHBvcnRlZCkge1xuICAgICAgbm9kZS5leHBvcnRlZCA9IGNsb25lSWRlbnRpZmllcihub2RlLmxvY2FsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZTxOLkV4cG9ydFNwZWNpZmllcj4obm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Nb2R1bGVFeHBvcnROYW1lXG4gIHBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpOiBOLlN0cmluZ0xpdGVyYWwgfCBOLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0cmluZykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VTdHJpbmdMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgY29uc3Qgc3Vycm9nYXRlID0gcmVzdWx0LnZhbHVlLm1hdGNoKGxvbmVTdXJyb2dhdGUpO1xuICAgICAgaWYgKHN1cnJvZ2F0ZSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVFeHBvcnROYW1lSGFzTG9uZVN1cnJvZ2F0ZSwge1xuICAgICAgICAgIGF0OiByZXN1bHQsXG4gICAgICAgICAgc3Vycm9nYXRlQ2hhckNvZGU6IHN1cnJvZ2F0ZVswXS5jaGFyQ29kZUF0KDApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgfVxuXG4gIGlzSlNPTk1vZHVsZUltcG9ydChcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5JbXBvcnREZWNsYXJhdGlvblxuICAgID4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChub2RlLmFzc2VydGlvbnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vZGUuYXNzZXJ0aW9ucy5zb21lKCh7IGtleSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlLnZhbHVlID09PSBcImpzb25cIiAmJlxuICAgICAgICAgIChrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICAgID8ga2V5Lm5hbWUgPT09IFwidHlwZVwiXG4gICAgICAgICAgICA6IGtleS52YWx1ZSA9PT0gXCJ0eXBlXCIpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hlY2tJbXBvcnRSZWZsZWN0aW9uKG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPikge1xuICAgIGlmIChub2RlLm1vZHVsZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlLnNwZWNpZmllcnMubGVuZ3RoICE9PSAxIHx8XG4gICAgICAgIG5vZGUuc3BlY2lmaWVyc1swXS50eXBlICE9PSBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIlxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydFJlZmxlY3Rpb25Ob3RCaW5kaW5nLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXNzZXJ0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRSZWZsZWN0aW9uSGFzQXNzZXJ0aW9uLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrSlNPTk1vZHVsZUltcG9ydChcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5JbXBvcnREZWNsYXJhdGlvblxuICAgID4sXG4gICkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IG5vZGUudHlwZSBtdXN0IGJlIHVuZGVmaW5lZCBiZWNhdXNlIHRoZXkgYXJlIHVuZG9uZVxuICAgIGlmICh0aGlzLmlzSlNPTk1vZHVsZUltcG9ydChub2RlKSAmJiBub2RlLnR5cGUgIT09IFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzcGVjaWZpZXJzIG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgY29uc3QgeyBzcGVjaWZpZXJzIH0gPSBub2RlO1xuICAgICAgaWYgKHNwZWNpZmllcnMgIT0gbnVsbCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSBzcGVjaWZpZXIgdHlwZXNcbiAgICAgICAgY29uc3Qgbm9uRGVmYXVsdE5hbWVkU3BlY2lmaWVyID0gc3BlY2lmaWVycy5maW5kKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgbGV0IGltcG9ydGVkO1xuICAgICAgICAgIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gXCJFeHBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgaW1wb3J0ZWQgPSBzcGVjaWZpZXIubG9jYWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgaW1wb3J0ZWQgPSBzcGVjaWZpZXIuaW1wb3J0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbXBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0ZWQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgPyBpbXBvcnRlZC5uYW1lICE9PSBcImRlZmF1bHRcIlxuICAgICAgICAgICAgICA6IGltcG9ydGVkLnZhbHVlICE9PSBcImRlZmF1bHRcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9uRGVmYXVsdE5hbWVkU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRKU09OQmluZGluZ05vdERlZmF1bHQsIHtcbiAgICAgICAgICAgIGF0OiBub25EZWZhdWx0TmFtZWRTcGVjaWZpZXIubG9jLnN0YXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNQb3RlbnRpYWxJbXBvcnRQaGFzZShpc0V4cG9ydDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNFeHBvcnQgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX21vZHVsZSk7XG4gIH1cblxuICBhcHBseUltcG9ydFBoYXNlKFxuICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgICBpc0V4cG9ydDogYm9vbGVhbixcbiAgICBwaGFzZTogc3RyaW5nIHwgbnVsbCxcbiAgICBsb2M/OiBQb3NpdGlvbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGlzRXhwb3J0KSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LklTX1BVQkxJU0gpIHtcbiAgICAgICAgaWYgKHBoYXNlID09PSBcIm1vZHVsZVwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJBc3NlcnRpb24gZmFpbHVyZTogZXhwb3J0IGRlY2xhcmF0aW9ucyBkbyBub3Qgc3VwcG9ydCB0aGUgJ21vZHVsZScgcGhhc2UuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGhhc2UgPT09IFwibW9kdWxlXCIpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiaW1wb3J0UmVmbGVjdGlvblwiLCBsb2MpO1xuICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikubW9kdWxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0UmVmbGVjdGlvblwiKSkge1xuICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikubW9kdWxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUGFyc2UgYG1vZHVsZWAgaW4gYGltcG9ydCBtb2R1bGUgeCBmcm8gXCJ4XCJgLCBkaXNhbWJpZ3VhdGluZ1xuICAgKiBgaW1wb3J0IG1vZHVsZSBmcm9tIFwieFwiYCBhbmQgYGltcG9ydCBtb2R1bGUgZnJvbSBmcm9tIFwieFwiYC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtaWdodCByZXR1cm4gYW4gaWRlbnRpZmllciByZXByZXNlbnRpbmcgdGhlIGBtb2R1bGVgXG4gICAqIGlmIGl0IGVhdHMgYG1vZHVsZWAgYW5kIHRoZW4gZGlzY292ZXJzIHRoYXQgaXQgd2FzIHRoZSBkZWZhdWx0IGltcG9ydFxuICAgKiBiaW5kaW5nIGFuZCBub3QgdGhlIGltcG9ydCByZWZsZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBwYXJzZSBgaW1wb3J0IHR5cGVgIGFuZCBgaW1wb3J0IHR5cGVvZmBcbiAgICogaW4gdGhlIFRTIGFuZCBGbG93IHBsdWdpbnMuXG4gICAqXG4gICAqIE5vdGU6IHRoZSBwcm9wb3NhbCBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSBgc291cmNlYCBpbnN0ZWFkIG9mIGBtb2R1bGVgLFxuICAgKiBidXQgaXQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldC5cbiAgICovXG4gIHBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgaXNFeHBvcnQ6IGJvb2xlYW4sXG4gICk6IE4uSWRlbnRpZmllciB8IG51bGwge1xuICAgIGlmICghdGhpcy5pc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0KSkge1xuICAgICAgdGhpcy5hcHBseUltcG9ydFBoYXNlKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgaXNFeHBvcnQsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGhhc2VJZGVudGlmaWVyID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG5cbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNJbXBvcnRQaGFzZSA9IHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHR5cGUpXG4gICAgICA/IC8vIE9LOiBpbXBvcnQgPHBoYXNlPiB4IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IGZyb20gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSAnZm9vJztcbiAgICAgICAgLy8gV2l0aCB0aGUgbW9kdWxlIGRlY2xhcmF0aW9ucyBwcm9wb3NhbHMsIHdlIHdpbGwgbmVlZCBmdXJ0aGVyIGRpc2FtYmlndWF0aW9uXG4gICAgICAgIC8vIGZvciBgaW1wb3J0IG1vZHVsZSBmcm9tIGZyb207YC5cbiAgICAgICAgdHlwZSAhPT0gdHQuX2Zyb20gfHwgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubG93ZXJjYXNlRlxuICAgICAgOiAvLyBPSzogaW1wb3J0IDxwaGFzZT4geyB4IH0gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4geCBmcm9tIFwiZm9vXCI7XG4gICAgICAgIC8vIE9LOiBpbXBvcnQgPHBoYXNlPiAqIGFzIFQgZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4gXCJmb29cIjtcbiAgICAgICAgLy8gVGhlIGxhc3Qgb25lIGlzIGludmFsaWQsIHdlIHdpbGwgY29udGludWUgcGFyc2luZyBhbmQgdGhyb3dcbiAgICAgICAgLy8gYW4gZXJyb3IgbGF0ZXJcbiAgICAgICAgdHlwZSAhPT0gdHQuY29tbWE7XG5cbiAgICBpZiAoaXNJbXBvcnRQaGFzZSkge1xuICAgICAgdGhpcy5yZXNldFByZXZpb3VzSWRlbnRpZmllckxlYWRpbmdDb21tZW50cyhwaGFzZUlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5hcHBseUltcG9ydFBoYXNlKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgaXNFeHBvcnQsXG4gICAgICAgIHBoYXNlSWRlbnRpZmllci5uYW1lLFxuICAgICAgICBwaGFzZUlkZW50aWZpZXIubG9jLnN0YXJ0LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5SW1wb3J0UGhhc2UoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgICAgICBpc0V4cG9ydCxcbiAgICAgICAgbnVsbCxcbiAgICAgICk7XG4gICAgICAvLyBgPHBoYXNlPmAgaXMgYSBkZWZhdWx0IGJpbmRpbmcsIHJldHVybiBpdCB0byB0aGUgbWFpbiBpbXBvcnQgZGVjbGFyYXRpb24gcGFyc2VyXG4gICAgICByZXR1cm4gcGhhc2VJZGVudGlmaWVyO1xuICAgIH1cbiAgfVxuXG4gIGlzUHJlY2VkaW5nSWRJbXBvcnRQaGFzZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiB0b2tlbklzSWRlbnRpZmllcih0eXBlKVxuICAgICAgPyAvLyBPSzogaW1wb3J0IDxwaGFzZT4geCBmcm9tIFwiZm9vXCI7XG4gICAgICAgIC8vIE9LOiBpbXBvcnQgPHBoYXNlPiBmcm9tIGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gJ2Zvbyc7XG4gICAgICAgIC8vIFdpdGggdGhlIG1vZHVsZSBkZWNsYXJhdGlvbnMgcHJvcG9zYWxzLCB3ZSB3aWxsIG5lZWQgZnVydGhlciBkaXNhbWJpZ3VhdGlvblxuICAgICAgICAvLyBmb3IgYGltcG9ydCBtb2R1bGUgZnJvbSBmcm9tO2AuXG4gICAgICAgIHR5cGUgIT09IHR0Ll9mcm9tIHx8IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZUZcbiAgICAgIDogLy8gT0s6IGltcG9ydCA8cGhhc2U+IHsgeCB9IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IHggZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4gKiBhcyBUIGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IFwiZm9vXCI7XG4gICAgICAgIC8vIFRoZSBsYXN0IG9uZSBpcyBpbnZhbGlkLCB3ZSB3aWxsIGNvbnRpbnVlIHBhcnNpbmcgYW5kIHRocm93XG4gICAgICAgIC8vIGFuIGVycm9yIGxhdGVyXG4gICAgICAgIHR5cGUgIT09IHR0LmNvbW1hO1xuICB9XG5cbiAgLy8gUGFyc2VzIGltcG9ydCBkZWNsYXJhdGlvbi5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtSW1wb3J0RGVjbGFyYXRpb25cblxuICBwYXJzZUltcG9ydCh0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik6IE4uQW55SW1wb3J0IHtcbiAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAvLyBpbXBvcnQgJy4uLidcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSW1wb3J0U291cmNlQW5kQXR0cmlidXRlcyhub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydFNwZWNpZmllcnNBbmRBZnRlcihcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShub2RlLCAvKiBpc0V4cG9ydCAqLyBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlSW1wb3J0U3BlY2lmaWVyc0FuZEFmdGVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgKTogTi5BbnlJbXBvcnQge1xuICAgIG5vZGUuc3BlY2lmaWVycyA9IFtdO1xuXG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgaW1wb3J0IGxpa2VcbiAgICAvLyBpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IHRoaXMubWF5YmVQYXJzZURlZmF1bHRJbXBvcnRTcGVjaWZpZXIoXG4gICAgICBub2RlLFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICApO1xuICAgIC8qIHdlIGFyZSBjaGVja2luZyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgaW1wb3J0LCB0aGVuIGl0IGlzIG9idmlvdXMgdGhhdCB3ZSBuZWVkIG5hbWVkIGltcG9ydHNcbiAgICAgKiBpbXBvcnQgeyBnZXQgfSBmcm9tIFwiYXhpb3NcIjtcbiAgICAgKiBidXQgaWYgd2UgZG8gaGF2ZSBhIGRlZmF1bHQgaW1wb3J0XG4gICAgICogd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGEgY29tbWEgYWZ0ZXIgdGhhdCBhbmRcbiAgICAgKiB0aGF0IGlzIHdoZXJlIHRoaXMgYHx8IHRoaXMuZWF0YCBjb25kaXRpb24gY29tZXMgaW50byBwbGF5XG4gICAgICovXG4gICAgY29uc3QgcGFyc2VOZXh0ID0gIWhhc0RlZmF1bHQgfHwgdGhpcy5lYXQodHQuY29tbWEpO1xuICAgIC8vIGlmIHdlIGRvIGhhdmUgdG8gcGFyc2UgdGhlIG5leHQgc2V0IG9mIHNwZWNpZmllcnMsIHdlIGZpcnN0IGNoZWNrIGZvciBzdGFyIGltcG9ydHNcbiAgICAvLyBpbXBvcnQgUmVhY3QsICogZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgaGFzU3RhciA9IHBhcnNlTmV4dCAmJiB0aGlzLm1heWJlUGFyc2VTdGFySW1wb3J0U3BlY2lmaWVyKG5vZGUpO1xuICAgIC8vIG5vdyB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBuZXh0IGltcG9ydHNcbiAgICAvLyBidXQgb25seSBpZiB0aGV5IGFyZSBub3QgaW1wb3J0aW5nICogKGV2ZXJ5dGhpbmcpXG4gICAgaWYgKHBhcnNlTmV4dCAmJiAhaGFzU3RhcikgdGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlKTtcbiAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2Zyb20pO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VJbXBvcnRTb3VyY2VBbmRBdHRyaWJ1dGVzKG5vZGUpO1xuICB9XG5cbiAgcGFyc2VJbXBvcnRTb3VyY2VBbmRBdHRyaWJ1dGVzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICk6IE4uQW55SW1wb3J0IHtcbiAgICBub2RlLnNwZWNpZmllcnMgPz89IFtdO1xuICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgIHRoaXMubWF5YmVQYXJzZUltcG9ydEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgdGhpcy5jaGVja0ltcG9ydFJlZmxlY3Rpb24obm9kZSk7XG4gICAgdGhpcy5jaGVja0pTT05Nb2R1bGVJbXBvcnQobm9kZSk7XG5cbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnREZWNsYXJhdGlvblwiKTtcbiAgfVxuXG4gIHBhcnNlSW1wb3J0U291cmNlKHRoaXM6IFBhcnNlcik6IE4uU3RyaW5nTGl0ZXJhbCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoKHR0LnN0cmluZykpIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlRXhwckF0b20oKSBhcyBOLlN0cmluZ0xpdGVyYWw7XG4gIH1cblxuICBwYXJzZUltcG9ydFNwZWNpZmllckxvY2FsPFxuICAgIFQgZXh0ZW5kc1xuICAgICAgfCBOLkltcG9ydFNwZWNpZmllclxuICAgICAgfCBOLkltcG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gID4oXG4gICAgbm9kZTogVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgIHNwZWNpZmllcjogVW5kb25lPFQ+LFxuICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICApOiB2b2lkIHtcbiAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIG5vZGUuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKHNwZWNpZmllciwgdHlwZSkpO1xuICB9XG5cbiAgZmluaXNoSW1wb3J0U3BlY2lmaWVyPFxuICAgIFQgZXh0ZW5kc1xuICAgICAgfCBOLkltcG9ydFNwZWNpZmllclxuICAgICAgfCBOLkltcG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gID4oc3BlY2lmaWVyOiBVbmRvbmU8VD4sIHR5cGU6IFRbXCJ0eXBlXCJdLCBiaW5kaW5nVHlwZSA9IEJJTkRfTEVYSUNBTCkge1xuICAgIHRoaXMuY2hlY2tMVmFsKHNwZWNpZmllci5sb2NhbCwge1xuICAgICAgaW46IHsgdHlwZSB9LFxuICAgICAgYmluZGluZzogYmluZGluZ1R5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFzc2VydCBlbnRyaWVzXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbXBvcnQtYXR0cmlidXRlcy8jcHJvZC1XaXRoRW50cmllcyBXaXRoRW50cmllc31cbiAgICovXG4gIHBhcnNlSW1wb3J0QXR0cmlidXRlcygpOiBOLkltcG9ydEF0dHJpYnV0ZVtdIHtcbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuXG4gICAgY29uc3QgYXR0cnMgPSBbXTtcbiAgICBjb25zdCBhdHRyTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5JbXBvcnRBdHRyaWJ1dGU+KCk7XG5cbiAgICAgIC8vIHBhcnNlIEFzc2VydGlvbktleSA6IElkZW50aWZpZXJOYW1lLCBTdHJpbmdMaXRlcmFsXG4gICAgICBjb25zdCBrZXlOYW1lID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgYW4gYXR0cmlidXRlXG4gICAgICAvLyBpZiBhIGR1cGxpY2F0ZSBlbnRyeSBpcyBmb3VuZCwgdGhyb3cgYW4gZXJyb3JcbiAgICAgIC8vIGZvciBub3cgdGhpcyBsb2dpYyB3aWxsIGNvbWUgaW50byBwbGF5IG9ubHkgd2hlbiBzb21lb25lIGRlY2xhcmVzIGB0eXBlYCB0d2ljZVxuICAgICAgaWYgKGF0dHJOYW1lcy5oYXMoa2V5TmFtZSkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuTW9kdWxlQXR0cmlidXRlc1dpdGhEdXBsaWNhdGVLZXlzLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAga2V5OiBrZXlOYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF0dHJOYW1lcy5hZGQoa2V5TmFtZSk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIG5vZGUua2V5ID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoa2V5TmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuXG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVBdHRyaWJ1dGVJbnZhbGlkVmFsdWUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEF0dHJpYnV0ZVwiKSk7XG4gICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcblxuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG5cbiAgICByZXR1cm4gYXR0cnM7XG4gIH1cblxuICAvKipcbiAgICogcGFyc2UgbW9kdWxlIGF0dHJpYnV0ZXNcbiAgICogQGRlcHJlY2F0ZWQgSXQgd2lsbCBiZSByZW1vdmVkIGluIEJhYmVsIDhcbiAgICovXG4gIHBhcnNlTW9kdWxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyczogTi5JbXBvcnRBdHRyaWJ1dGVbXSA9IFtdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgU2V0KCk7XG4gICAgZG8ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0QXR0cmlidXRlPigpO1xuICAgICAgbm9kZS5rZXkgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcblxuICAgICAgaWYgKG5vZGUua2V5Lm5hbWUgIT09IFwidHlwZVwiKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1vZHVsZUF0dHJpYnV0ZURpZmZlcmVudEZyb21UeXBlLCB7XG4gICAgICAgICAgYXQ6IG5vZGUua2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzKG5vZGUua2V5Lm5hbWUpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1vZHVsZUF0dHJpYnV0ZXNXaXRoRHVwbGljYXRlS2V5cywge1xuICAgICAgICAgIGF0OiBub2RlLmtleSxcbiAgICAgICAgICBrZXk6IG5vZGUua2V5Lm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcy5hZGQobm9kZS5rZXkubmFtZSk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5jb2xvbik7XG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVBdHRyaWJ1dGVJbnZhbGlkVmFsdWUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEF0dHJpYnV0ZVwiKSk7XG4gICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcblxuICAgIHJldHVybiBhdHRycztcbiAgfVxuXG4gIG1heWJlUGFyc2VJbXBvcnRBdHRyaWJ1dGVzKFxuICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgKSB7XG4gICAgbGV0IGF0dHJpYnV0ZXM6IE4uSW1wb3J0QXR0cmlidXRlW107XG4gICAgbGV0IHVzZVdpdGggPSBmYWxzZTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbXBvcnQtYXR0cmlidXRlcy8jcHJvZC1XaXRoQ2xhdXNlXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX3dpdGgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiZcbiAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVmdFBhcmVudGhlc2lzXG4gICAgICApIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIHBhcnNlZCBhcyBhIHdpdGggc3RhdGVtZW50LCBhbmQgd2Ugd2lsbCB0aHJvdyBhXG4gICAgICAgIC8vIGJldHRlciBlcnJvciBhYm91dCBpdCBub3QgYmVpbmcgc3VwcG9ydGVkIGluIHN0cmljdCBtb2RlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHdpdGhgXG5cbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJtb2R1bGVBdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VNb2R1bGVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RJbXBvcnRBdHRyaWJ1dGVzUGx1Z2luKCk7XG4gICAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VJbXBvcnRBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpO1xuICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZUltcG9ydEF0dHJpYnV0ZXMoKTtcbiAgICAgIH1cbiAgICAgIHVzZVdpdGggPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2Fzc2VydCkgJiYgIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkpIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiaW1wb3J0QXR0cmlidXRlc1wiLCBcImRlcHJlY2F0ZWRBc3NlcnRTeW50YXhcIikgIT09XG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRBdHRyaWJ1dGVzVXNlQXNzZXJ0LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwiZGVwcmVjYXRlZEFzc2VydFN5bnRheFwiLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImltcG9ydEF0dHJpYnV0ZXNcIiwgXCJpbXBvcnRBc3NlcnRpb25zXCJdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGFzc2VydGBcbiAgICAgIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSW1wb3J0QXR0cmlidXRlcygpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgfHxcbiAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKVxuICAgICkge1xuICAgICAgYXR0cmlidXRlcyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IFtdO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9IGVsc2UgcmV0dXJuO1xuXG4gICAgaWYgKCF1c2VXaXRoICYmIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSkge1xuICAgICAgbm9kZS5hc3NlcnRpb25zID0gYXR0cmlidXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICB9XG4gIH1cblxuICBtYXliZVBhcnNlRGVmYXVsdEltcG9ydFNwZWNpZmllcihcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gaW1wb3J0IGRlZmF1bHRPYmosIHsgeCwgeSBhcyB6IH0gZnJvbSAnLi4uJ1xuICAgIGlmIChtYXliZURlZmF1bHRJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KFxuICAgICAgICBtYXliZURlZmF1bHRJZGVudGlmaWVyLFxuICAgICAgKTtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IG1heWJlRGVmYXVsdElkZW50aWZpZXI7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaChcbiAgICAgICAgdGhpcy5maW5pc2hJbXBvcnRTcGVjaWZpZXIoc3BlY2lmaWVyLCBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIiksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIFdlIGFsbG93IGtleXdvcmRzLCBhbmQgcGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbCB3aWxsIHJlcG9ydCBhIHJlY292ZXJhYmxlIGVycm9yXG4gICAgICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpXG4gICAgKSB7XG4gICAgICB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyTG9jYWwoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0RGVmYXVsdFNwZWNpZmllcj4oKSxcbiAgICAgICAgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1heWJlUGFyc2VTdGFySW1wb3J0U3BlY2lmaWVyKG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0YXIpKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcj4oKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9hcyk7XG5cbiAgICAgIHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgICBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgd2hpbGUgKCF0aGlzLmVhdCh0dC5icmFjZVIpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERldGVjdCBhbiBhdHRlbXB0IHRvIGRlZXAgZGVzdHJ1Y3R1cmVcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmNvbG9uKSkge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkRlc3RydWN0dXJlTmFtZWRJbXBvcnQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5lYXQodHQuYnJhY2VSKSkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0U3BlY2lmaWVyPigpO1xuICAgICAgY29uc3QgaW1wb3J0ZWRJc1N0cmluZyA9IHRoaXMubWF0Y2godHQuc3RyaW5nKTtcbiAgICAgIGNvbnN0IGlzTWF5YmVUeXBlT25seSA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKTtcbiAgICAgIHNwZWNpZmllci5pbXBvcnRlZCA9IHRoaXMucGFyc2VNb2R1bGVFeHBvcnROYW1lKCk7XG4gICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXIgPSB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydGVkSXNTdHJpbmcsXG4gICAgICAgIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgfHwgbm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVvZlwiLFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaChpbXBvcnRTcGVjaWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUltcG9ydFNwZWNpZmllclxuICBwYXJzZUltcG9ydFNwZWNpZmllcihcbiAgICBzcGVjaWZpZXI6IFVuZG9uZTxOLkltcG9ydFNwZWNpZmllcj4sXG4gICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gdXNlZCBpbiBUeXBlU2NyaXB0IGFuZCBGbG93IHBhcnNlciAqL1xuICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICBpc01heWJlVHlwZU9ubHk6IGJvb2xlYW4sXG4gICAgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcyB8IHVuZGVmaW5lZCxcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICApOiBOLkltcG9ydFNwZWNpZmllciB7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGltcG9ydGVkIH0gPSBzcGVjaWZpZXI7XG4gICAgICBpZiAoaW1wb3J0ZWRJc1N0cmluZykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRCaW5kaW5nSXNTdHJpbmcsIHtcbiAgICAgICAgICBhdDogc3BlY2lmaWVyLFxuICAgICAgICAgIGltcG9ydE5hbWU6IChpbXBvcnRlZCBhcyBOLlN0cmluZ0xpdGVyYWwpLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQoXG4gICAgICAgIChpbXBvcnRlZCBhcyBOLklkZW50aWZpZXIpLm5hbWUsXG4gICAgICAgIHNwZWNpZmllci5sb2Muc3RhcnQsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgICAgaWYgKCFzcGVjaWZpZXIubG9jYWwpIHtcbiAgICAgICAgc3BlY2lmaWVyLmxvY2FsID0gY2xvbmVJZGVudGlmaWVyKGltcG9ydGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgc3BlY2lmaWVyLFxuICAgICAgXCJJbXBvcnRTcGVjaWZpZXJcIixcbiAgICAgIGJpbmRpbmdUeXBlLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHVzZWQgaW4gZmxvdyBhbmQgdHlwZXNjcmlwdCBwbHVnaW5cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJhbWV0ZXIgaXMgYSB0aGlzIHBhcmFtXG4gIGlzVGhpc1BhcmFtKFxuICAgIHBhcmFtOiBOLlBhdHRlcm4gfCBOLklkZW50aWZpZXIgfCBOLlRTUGFyYW1ldGVyUHJvcGVydHksXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwYXJhbS5uYW1lID09PSBcInRoaXNcIjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkxpc3QgfSBmcm9tIFwiLi4vcGx1Z2luLXV0aWxzXCI7XG5pbXBvcnQgeyBnZXRPcHRpb25zIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCBTdGF0ZW1lbnRQYXJzZXIgZnJvbSBcIi4vc3RhdGVtZW50XCI7XG5pbXBvcnQgU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL3Njb3BlXCI7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbnNNYXAgPSBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIFt4OiBzdHJpbmddOiBhbnk7XG4gIH1cbj47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBleHRlbmRzIFN0YXRlbWVudFBhcnNlciB7XG4gIC8vIEZvcndhcmQtZGVjbGFyYXRpb24gc28gdHlwZXNjcmlwdCBwbHVnaW4gY2FuIG92ZXJyaWRlIGpzeCBwbHVnaW5cbiAgLy8gdG9kbyhmbG93LT50cykgLSB0aGlzIHByb2JhYmx5IGNhbiBiZSByZW1vdmVkXG4gIC8vIGFic3RyYWN0IGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gIC8vICAgbm9kZTogTi5KU1hPcGVuaW5nRWxlbWVudCxcbiAgLy8gKTogTi5KU1hPcGVuaW5nRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zIHwgdW5kZWZpbmVkIHwgbnVsbCwgaW5wdXQ6IHN0cmluZykge1xuICAgIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHN1cGVyKG9wdGlvbnMsIGlucHV0KTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5pbml0aWFsaXplU2NvcGVzKCk7XG4gICAgdGhpcy5wbHVnaW5zID0gcGx1Z2luc01hcCh0aGlzLm9wdGlvbnMucGx1Z2lucyk7XG4gICAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuc291cmNlRmlsZW5hbWU7XG4gIH1cblxuICAvLyBUaGlzIGNhbiBiZSBvdmVyd3JpdHRlbiwgZm9yIGV4YW1wbGUsIGJ5IHRoZSBUeXBlU2NyaXB0IHBsdWdpbi5cbiAgZ2V0U2NvcGVIYW5kbGVyKCk6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueSk6IFNjb3BlSGFuZGxlcjtcbiAgfSB7XG4gICAgcmV0dXJuIFNjb3BlSGFuZGxlcjtcbiAgfVxuXG4gIHBhcnNlKCk6IE4uRmlsZSB7XG4gICAgdGhpcy5lbnRlckluaXRpYWxTY29wZXMoKTtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5zdGFydE5vZGUoKSBhcyBOLkZpbGU7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMuc3RhcnROb2RlKCkgYXMgTi5Qcm9ncmFtO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgZmlsZS5lcnJvcnMgPSBudWxsO1xuICAgIHRoaXMucGFyc2VUb3BMZXZlbChmaWxlLCBwcm9ncmFtKTtcbiAgICBmaWxlLmVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNNYXAocGx1Z2luczogUGx1Z2luTGlzdCk6IFBsdWdpbnNNYXAge1xuICBjb25zdCBwbHVnaW5NYXA6IFBsdWdpbnNNYXAgPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICBjb25zdCBbbmFtZSwgb3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW4gOiBbcGx1Z2luLCB7fV07XG4gICAgaWYgKCFwbHVnaW5NYXAuaGFzKG5hbWUpKSBwbHVnaW5NYXAuc2V0KG5hbWUsIG9wdGlvbnMgfHwge30pO1xuICB9XG4gIHJldHVybiBwbHVnaW5NYXA7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgaGFzUGx1Z2luLFxuICB2YWxpZGF0ZVBsdWdpbnMsXG4gIG1peGluUGx1Z2luTmFtZXMsXG4gIG1peGluUGx1Z2lucyxcbiAgdHlwZSBQbHVnaW5MaXN0LFxufSBmcm9tIFwiLi9wbHVnaW4tdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmlnIGFzIFBhcnNlclBsdWdpbixcbiAgRmxvd1BsdWdpbk9wdGlvbnMsXG4gIFJlY29yZEFuZFR1cGxlUGx1Z2luT3B0aW9ucyxcbiAgUGlwZWxpbmVPcGVyYXRvclBsdWdpbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vcGFyc2VyXCI7XG5cbmltcG9ydCB0eXBlIHsgRXhwb3J0ZWRUb2tlblR5cGUgfSBmcm9tIFwiLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEV4cG9ydGVkVG9rZW4sXG4gIHR0IGFzIGludGVybmFsVG9rZW5UeXBlcyxcbiAgdHlwZSBJbnRlcm5hbFRva2VuVHlwZXMsXG59IGZyb20gXCIuL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IFwiLi90b2tlbml6ZXIvY29udGV4dFwiO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24sIEZpbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbnMpOiBGaWxlIHtcbiAgaWYgKG9wdGlvbnM/LnNvdXJjZVR5cGUgPT09IFwidW5hbWJpZ3VvdXNcIikge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIG9wdGlvbnMuc291cmNlVHlwZSA9IFwibW9kdWxlXCI7XG4gICAgICBjb25zdCBwYXJzZXIgPSBnZXRQYXJzZXIob3B0aW9ucywgaW5wdXQpO1xuICAgICAgY29uc3QgYXN0ID0gcGFyc2VyLnBhcnNlKCk7XG5cbiAgICAgIGlmIChwYXJzZXIuc2F3VW5hbWJpZ3VvdXNFU00pIHtcbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlci5hbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3QpIHtcbiAgICAgICAgLy8gVG9wIGxldmVsIGF3YWl0IGludHJvZHVjZXMgY29kZSB3aGljaCBjYW4gYmUgYm90aCBhIHZhbGlkIHNjcmlwdCBhbmRcbiAgICAgICAgLy8gYSB2YWxpZCBtb2R1bGUsIGJ1dCB3aGljaCBwcm9kdWNlcyBkaWZmZXJlbnQgQVNUczpcbiAgICAgICAgLy8gICAgYXdhaXRcbiAgICAgICAgLy8gICAgMFxuICAgICAgICAvLyBjYW4gYmUgcGFyc2VkIGVpdGhlciBhcyBhbiBBd2FpdEV4cHJlc3Npb24sIG9yIGFzIHR3byBFeHByZXNzaW9uU3RhdGVtZW50cy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcHRpb25zLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgICAgIHJldHVybiBnZXRQYXJzZXIob3B0aW9ucywgaW5wdXQpLnBhcnNlKCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYm90aCBhIHZhbGlkIG1vZHVsZSBhbmQgYSB2YWxpZCBzY3JpcHQsIGJ1dFxuICAgICAgICAvLyB3ZSBwYXJzZSBpdCBhcyBhIHNjcmlwdCBieSBkZWZhdWx0XG4gICAgICAgIGFzdC5wcm9ncmFtLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXN0O1xuICAgIH0gY2F0Y2ggKG1vZHVsZUVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2VyKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpO1xuICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICB0aHJvdyBtb2R1bGVFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldFBhcnNlcihvcHRpb25zLCBpbnB1dCkucGFyc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBPcHRpb25zKTogRXhwcmVzc2lvbiB7XG4gIGNvbnN0IHBhcnNlciA9IGdldFBhcnNlcihvcHRpb25zLCBpbnB1dCk7XG4gIGlmIChwYXJzZXIub3B0aW9ucy5zdHJpY3RNb2RlKSB7XG4gICAgcGFyc2VyLnN0YXRlLnN0cmljdCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHBhcnNlci5nZXRFeHByZXNzaW9uKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXhwb3J0ZWRUb2tlblR5cGVzKFxuICBpbnRlcm5hbFRva2VuVHlwZXM6IEludGVybmFsVG9rZW5UeXBlcyxcbik6IFJlY29yZDxzdHJpbmcsIEV4cG9ydGVkVG9rZW5UeXBlPiB7XG4gIGNvbnN0IHRva2VuVHlwZXM6IFJlY29yZDxzdHJpbmcsIEV4cG9ydGVkVG9rZW5UeXBlPiA9IHt9O1xuICBmb3IgKGNvbnN0IHR5cGVOYW1lIG9mIE9iamVjdC5rZXlzKFxuICAgIGludGVybmFsVG9rZW5UeXBlcyxcbiAgKSBhcyAoa2V5b2YgSW50ZXJuYWxUb2tlblR5cGVzKVtdKSB7XG4gICAgdG9rZW5UeXBlc1t0eXBlTmFtZV0gPSBnZXRFeHBvcnRlZFRva2VuKGludGVybmFsVG9rZW5UeXBlc1t0eXBlTmFtZV0pO1xuICB9XG4gIHJldHVybiB0b2tlblR5cGVzO1xufVxuXG5leHBvcnQgY29uc3QgdG9rVHlwZXMgPSBnZW5lcmF0ZUV4cG9ydGVkVG9rZW5UeXBlcyhpbnRlcm5hbFRva2VuVHlwZXMpO1xuXG5mdW5jdGlvbiBnZXRQYXJzZXIob3B0aW9uczogT3B0aW9ucyB8IHVuZGVmaW5lZCB8IG51bGwsIGlucHV0OiBzdHJpbmcpOiBQYXJzZXIge1xuICBsZXQgY2xzID0gUGFyc2VyO1xuICBpZiAob3B0aW9ucz8ucGx1Z2lucykge1xuICAgIHZhbGlkYXRlUGx1Z2lucyhvcHRpb25zLnBsdWdpbnMpO1xuICAgIGNscyA9IGdldFBhcnNlckNsYXNzKG9wdGlvbnMucGx1Z2lucyk7XG4gIH1cblxuICByZXR1cm4gbmV3IGNscyhvcHRpb25zLCBpbnB1dCk7XG59XG5cbmNvbnN0IHBhcnNlckNsYXNzQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogeyBuZXcgKC4uLmFyZ3M6IGFueSk6IFBhcnNlciB9IH0gPSB7fTtcblxuLyoqIEdldCBhIFBhcnNlciBjbGFzcyB3aXRoIHBsdWdpbnMgYXBwbGllZC4gKi9cbmZ1bmN0aW9uIGdldFBhcnNlckNsYXNzKHBsdWdpbnNGcm9tT3B0aW9uczogUGx1Z2luTGlzdCk6IHtcbiAgbmV3ICguLi5hcmdzOiBhbnkpOiBQYXJzZXI7XG59IHtcbiAgY29uc3QgcGx1Z2luTGlzdCA9IG1peGluUGx1Z2luTmFtZXMuZmlsdGVyKG5hbWUgPT5cbiAgICBoYXNQbHVnaW4ocGx1Z2luc0Zyb21PcHRpb25zLCBuYW1lKSxcbiAgKTtcblxuICBjb25zdCBrZXkgPSBwbHVnaW5MaXN0LmpvaW4oXCIvXCIpO1xuICBsZXQgY2xzID0gcGFyc2VyQ2xhc3NDYWNoZVtrZXldO1xuICBpZiAoIWNscykge1xuICAgIGNscyA9IFBhcnNlcjtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5MaXN0KSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICBjbHMgPSBtaXhpblBsdWdpbnNbcGx1Z2luXShjbHMpO1xuICAgIH1cbiAgICBwYXJzZXJDbGFzc0NhY2hlW2tleV0gPSBjbHM7XG4gIH1cbiAgcmV0dXJuIGNscztcbn1cblxuZXhwb3J0IHR5cGUge1xuICBGbG93UGx1Z2luT3B0aW9ucyxcbiAgUGFyc2VyUGx1Z2luLFxuICBQaXBlbGluZU9wZXJhdG9yUGx1Z2luT3B0aW9ucyxcbiAgUmVjb3JkQW5kVHVwbGVQbHVnaW5PcHRpb25zLFxufTtcbmV4cG9ydCB0eXBlIFBhcnNlck9wdGlvbnMgPSBQYXJ0aWFsPE9wdGlvbnM+O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgYWN0dWFsOiBvYmplY3QsXG4gIGV4cGVjdGVkOiBULFxuKTogYWN0dWFsIGlzIFQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwZWN0ZWQpIGFzIChrZXlvZiBUKVtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1heWJlIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIGtleSBleGlzdHMgZmlyc3RcbiAgICAgIGFjdHVhbFtrZXldICE9PSBleHBlY3RlZFtrZXldXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiY29uc3Qgd2FybmluZ3MgPSBuZXcgU2V0KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlcHJlY2F0aW9uV2FybmluZyhcbiAgb2xkTmFtZTogc3RyaW5nLFxuICBuZXdOYW1lOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nID0gXCJcIixcbikge1xuICBpZiAod2FybmluZ3MuaGFzKG9sZE5hbWUpKSByZXR1cm47XG4gIHdhcm5pbmdzLmFkZChvbGROYW1lKTtcblxuICBjb25zdCB7IGludGVybmFsLCB0cmFjZSB9ID0gY2FwdHVyZVNob3J0U3RhY2tUcmFjZSgxLCAyKTtcbiAgaWYgKGludGVybmFsKSB7XG4gICAgLy8gSWYgdXNhZ2UgY29tZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlLCB0aGVyZSBpcyBubyBwb2ludCBpbiB3YXJuaW5nIGJlY2F1c2VcbiAgICAvLyAxLiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIHBhY2thZ2Ugd2lsbCBhbHJlYWR5IHVzZSB0aGUgbmV3IEFQSVxuICAgIC8vIDIuIFdoZW4gdGhlIGRlcHJlY2F0aW9uIHdpbGwgYmVjb21lIGFuIGVycm9yIChpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uKSwgdXNlcnNcbiAgICAvLyAgICB3aWxsIGhhdmUgdG8gdXBkYXRlIGV2ZXJ5IHBhY2thZ2UgYW55d2F5LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7cHJlZml4fVxcYCR7b2xkTmFtZX1cXGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGxlYXNlIG1pZ3JhdGUgdG8gXFxgJHtuZXdOYW1lfVxcYFxcbiR7dHJhY2V9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZVNob3J0U3RhY2tUcmFjZShza2lwOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gIGNvbnN0IHsgc3RhY2tUcmFjZUxpbWl0LCBwcmVwYXJlU3RhY2tUcmFjZSB9ID0gRXJyb3I7XG4gIGxldCBzdGFja1RyYWNlOiBOb2RlSlMuQ2FsbFNpdGVbXTtcbiAgLy8gV2UgYWRkIDEgdG8gYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGlzIGZ1bmN0aW9uLlxuICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSAxICsgc2tpcCArIGxlbmd0aDtcbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoZXJyLCBzdGFjaykge1xuICAgIHN0YWNrVHJhY2UgPSBzdGFjaztcbiAgfTtcbiAgbmV3IEVycm9yKCkuc3RhY2s7XG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmVwYXJlU3RhY2tUcmFjZTtcblxuICBpZiAoIXN0YWNrVHJhY2UpIHJldHVybiB7IGludGVybmFsOiBmYWxzZSwgdHJhY2U6IFwiXCIgfTtcblxuICBjb25zdCBzaG9ydFN0YWNrVHJhY2UgPSBzdGFja1RyYWNlLnNsaWNlKDEgKyBza2lwLCAxICsgc2tpcCArIGxlbmd0aCk7XG4gIHJldHVybiB7XG4gICAgaW50ZXJuYWw6IC9bXFxcXC9dQGJhYmVsW1xcXFwvXS8udGVzdChzaG9ydFN0YWNrVHJhY2VbMV0uZ2V0RmlsZU5hbWUoKSksXG4gICAgdHJhY2U6IHNob3J0U3RhY2tUcmFjZS5tYXAoZnJhbWUgPT4gYCAgICBhdCAke2ZyYW1lfWApLmpvaW4oXCJcXG5cIiksXG4gIH07XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xuXG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gXCIuLi8uLi91dGlscy9zaGFsbG93RXF1YWxcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcbmltcG9ydCBkZXByZWNhdGlvbldhcm5pbmcgZnJvbSBcIi4uLy4uL3V0aWxzL2RlcHJlY2F0aW9uV2FybmluZ1wiO1xuXG50eXBlIE9wdHM8T2JqZWN0PiA9IFBhcnRpYWw8e1xuICBbUHJvcCBpbiBrZXlvZiBPYmplY3RdOiBPYmplY3RbUHJvcF0gZXh0ZW5kcyB0Lk5vZGVcbiAgICA/IHQuTm9kZSB8IE9iamVjdFtQcm9wXVxuICAgIDogT2JqZWN0W1Byb3BdIGV4dGVuZHMgdC5Ob2RlW11cbiAgICA/IHQuTm9kZVtdIHwgT2JqZWN0W1Byb3BdXG4gICAgOiBPYmplY3RbUHJvcF07XG59PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycmF5RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXJyYXlFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFzc2lnbm1lbnRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQXNzaWdubWVudEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQmluYXJ5RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJpbmFyeUV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJwcmV0ZXJEaXJlY3RpdmUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW50ZXJwcmV0ZXJEaXJlY3RpdmU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbnRlcnByZXRlckRpcmVjdGl2ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlyZWN0aXZlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRpcmVjdGl2ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRpcmVjdGl2ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGlyZWN0aXZlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RpcmVjdGl2ZUxpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGlyZWN0aXZlTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRpcmVjdGl2ZUxpdGVyYWwge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRpcmVjdGl2ZUxpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmxvY2tTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQmxvY2tTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CbG9ja1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQmxvY2tTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJlYWtTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQnJlYWtTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CcmVha1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQnJlYWtTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2FsbEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DYWxsRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2F0Y2hDbGF1c2UoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2F0Y2hDbGF1c2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DYXRjaENsYXVzZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2F0Y2hDbGF1c2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVlU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNvbnRpbnVlU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ29udGludWVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlYnVnZ2VyU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlYnVnZ2VyU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVidWdnZXJTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlYnVnZ2VyU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RvV2hpbGVTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRG9XaGlsZVN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRvV2hpbGVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRvV2hpbGVTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW1wdHlTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbXB0eVN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW1wdHlTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHByZXNzaW9uU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwcmVzc2lvblN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGaWxlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZpbGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GaWxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGaWxlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZvckluU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZvckluU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRm9ySW5TdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZvckluU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZvclN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Gb3JTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZvclN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvbkRlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GdW5jdGlvbkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvbkV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LklkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JZGVudGlmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0lmU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LklmU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSWZTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIklmU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xhYmVsZWRTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTGFiZWxlZFN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkxhYmVsZWRTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkxhYmVsZWRTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RyaW5nTGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1lcmljTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bWVyaWNMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1lcmljTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdWxsTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bGxMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdWxsTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Cb29sZWFuTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHBMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlJlZ0V4cExpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5SZWdFeHBMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJSZWdFeHBMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2ljYWxFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkxvZ2ljYWxFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkxvZ2ljYWxFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01lbWJlckV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1lbWJlckV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1lbWJlckV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV3RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OZXdFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTmV3RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTmV3RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9ncmFtKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByb2dyYW0+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Qcm9ncmFtIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQcm9ncmFtXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0TWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdE1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdE1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0TWV0aG9kXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuT2JqZWN0UHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RFbGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlJlc3RFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUmVzdEVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlJlc3RFbGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JldHVyblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZXR1cm5TdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5SZXR1cm5TdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlJldHVyblN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZXF1ZW5jZUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU2VxdWVuY2VFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU2VxdWVuY2VFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuUGFyZW50aGVzaXplZEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3dpdGNoQ2FzZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Td2l0Y2hDYXNlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3dpdGNoQ2FzZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3dpdGNoQ2FzZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTd2l0Y2hTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3dpdGNoU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3dpdGNoU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTd2l0Y2hTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhpc0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhpc0V4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UaGlzRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGhpc0V4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhyb3dTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhyb3dTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UaHJvd1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGhyb3dTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ5U3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRyeVN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRyeVN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHJ5U3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuYXJ5RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5VbmFyeUV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5VbmFyeUV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlVwZGF0ZUV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5VcGRhdGVFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJVcGRhdGVFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhcmlhYmxlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVmFyaWFibGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFyaWFibGVEZWNsYXJhdG9yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlZhcmlhYmxlRGVjbGFyYXRvcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZhcmlhYmxlRGVjbGFyYXRvciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1doaWxlU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LldoaWxlU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuV2hpbGVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIldoaWxlU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dpdGhTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuV2l0aFN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LldpdGhTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIldpdGhTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXNzaWdubWVudFBhdHRlcm4oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQXNzaWdubWVudFBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXNzaWdubWVudFBhdHRlcm5cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycmF5UGF0dGVybj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5UGF0dGVybiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXJyYXlQYXR0ZXJuXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NsYXNzQm9keShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc0JvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzc0JvZHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkNsYXNzQm9keVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0V4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHBvcnRBbGxEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4cG9ydEFsbERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwb3J0TmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHBvcnROYW1lZERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0TmFtZWREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnRTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0U3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0U3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnRTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9yT2ZTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRm9yT2ZTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JPZlN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRm9yT2ZTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0RGVmYXVsdFNwZWNpZmllcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0U3BlY2lmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkltcG9ydFNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkltcG9ydFNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0U3BlY2lmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01ldGFQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5NZXRhUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5NZXRhUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1ldGFQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc01ldGhvZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc01ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNsYXNzTWV0aG9kIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc01ldGhvZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RQYXR0ZXJuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RQYXR0ZXJuXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NwcmVhZEVsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3ByZWFkRWxlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlNwcmVhZEVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlNwcmVhZEVsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3VwZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5TdXBlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3VwZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBsYXRlRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UZW1wbGF0ZUVsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UZW1wbGF0ZUVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRlbXBsYXRlRWxlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wbGF0ZUxpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGVtcGxhdGVMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGVtcGxhdGVMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUZW1wbGF0ZUxpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzWWllbGRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LllpZWxkRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LllpZWxkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiWWllbGRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F3YWl0RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Bd2FpdEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bd2FpdEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkF3YWl0RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50TGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CaWdJbnRMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQmlnSW50TGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQmlnSW50TGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGlvbmFsQ2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc1Byb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcml2YXRlUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NQcml2YXRlUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcml2YXRlTWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNsYXNzUHJpdmF0ZU1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNsYXNzUHJpdmF0ZU1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVOYW1lKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByaXZhdGVOYW1lPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUHJpdmF0ZU5hbWUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlByaXZhdGVOYW1lXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpY0Jsb2NrKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlN0YXRpY0Jsb2NrPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhdGljQmxvY2sge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlN0YXRpY0Jsb2NrXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FueVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFueVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQW55VHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFueVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5VHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQXJyYXlUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5VHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFycmF5VHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0ltcGxlbWVudHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NJbXBsZW1lbnRzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NJbXBsZW1lbnRzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0ltcGxlbWVudHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZUNsYXNzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVDbGFzcz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVDbGFzcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZUNsYXNzXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVGdW5jdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlRnVuY3Rpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVGdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlSW50ZXJmYWNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVJbnRlcmZhY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlSW50ZXJmYWNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlSW50ZXJmYWNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVNb2R1bGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZU1vZHVsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVNb2R1bGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZU1vZHVsZUV4cG9ydHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZU1vZHVsZUV4cG9ydHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZVR5cGVBbGlhcyhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlVHlwZUFsaWFzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjbGFyZVR5cGVBbGlhcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZVR5cGVBbGlhc1wiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlT3BhcXVlVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlT3BhcXVlVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVPcGFxdWVUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlT3BhcXVlVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlVmFyaWFibGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZVZhcmlhYmxlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjbGFyZVZhcmlhYmxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlVmFyaWFibGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlZFByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlZFByZWRpY2F0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVkUHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlZFByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeGlzdHNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeGlzdHNUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4aXN0c1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uVHlwZVBhcmFtKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uVHlwZVBhcmFtPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRnVuY3Rpb25UeXBlUGFyYW0ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0dlbmVyaWNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5HZW5lcmljVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5HZW5lcmljVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbmZlcnJlZFByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbmZlcnJlZFByZWRpY2F0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkluZmVycmVkUHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbmZlcnJlZFByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcmZhY2VFeHRlbmRzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZUV4dGVuZHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbnRlcmZhY2VFeHRlbmRzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbnRlcmZhY2VFeHRlbmRzXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyZmFjZURlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyZmFjZVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01peGVkVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTWl4ZWRUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1peGVkVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1peGVkVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbXB0eVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW1wdHlUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW1wdHlUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsYWJsZVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk51bGxhYmxlVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5OdWxsYWJsZVR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bWJlclR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1iZXJUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RUeXBlSW50ZXJuYWxTbG90KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFR5cGVJbnRlcm5hbFNsb3Q+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFR5cGVDYWxsUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVDYWxsUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0VHlwZUluZGV4ZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0VHlwZUluZGV4ZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlSW5kZXhlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0VHlwZUluZGV4ZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0VHlwZVByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFR5cGVQcm9wZXJ0eT4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPcGFxdWVUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9wYXF1ZVR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PcGFxdWVUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPcGFxdWVUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1F1YWxpZmllZFR5cGVJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlN0cmluZ1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTeW1ib2xUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TeW1ib2xUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlN5bWJvbFR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUaGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhpc1R5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUaGlzVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHVwbGVUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UdXBsZVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlb2ZUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UeXBlb2ZUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVvZlR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlQWxpYXMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZUFsaWFzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHlwZUFsaWFzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUeXBlQWxpYXNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUNhc3RFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVDYXN0RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbWV0ZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZVBhcmFtZXRlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlR5cGVQYXJhbWV0ZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaW9uVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVW5pb25UeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlVuaW9uVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlVuaW9uVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFyaWFuY2UoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVmFyaWFuY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5WYXJpYW5jZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVmFyaWFuY2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVm9pZFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlZvaWRUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZvaWRUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1EZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbnVtRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkVudW1EZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtQm9vbGVhbkJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bUJvb2xlYW5Cb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bUJvb2xlYW5Cb2R5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFbnVtQm9vbGVhbkJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bU51bWJlckJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bU51bWJlckJvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtTnVtYmVyQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bU51bWJlckJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVN0cmluZ0JvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bVN0cmluZ0JvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3RyaW5nQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bVN0cmluZ0JvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVN5bWJvbEJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bVN5bWJvbEJvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3ltYm9sQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bVN5bWJvbEJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bUJvb2xlYW5NZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bUJvb2xlYW5NZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtQm9vbGVhbk1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bUJvb2xlYW5NZW1iZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bU51bWJlck1lbWJlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbnVtTnVtYmVyTWVtYmVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bU51bWJlck1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bU51bWJlck1lbWJlclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtU3RyaW5nTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkVudW1TdHJpbmdNZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3RyaW5nTWVtYmVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFbnVtU3RyaW5nTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1EZWZhdWx0ZWRNZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bURlZmF1bHRlZE1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkVudW1EZWZhdWx0ZWRNZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW5kZXhlZEFjY2Vzc1R5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbmRleGVkQWNjZXNzVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW5kZXhlZEFjY2Vzc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hBdHRyaWJ1dGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYQXR0cmlidXRlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYQXR0cmlidXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hBdHRyaWJ1dGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYQ2xvc2luZ0VsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYQ2xvc2luZ0VsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hDbG9zaW5nRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYQ2xvc2luZ0VsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRWxlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hFbXB0eUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYRW1wdHlFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRW1wdHlFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hFbXB0eUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hFeHByZXNzaW9uQ29udGFpbmVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRXhwcmVzc2lvbkNvbnRhaW5lciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hTcHJlYWRDaGlsZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hTcHJlYWRDaGlsZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFNwcmVhZENoaWxkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hTcHJlYWRDaGlsZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWElkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hJZGVudGlmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWE1lbWJlckV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYTmFtZXNwYWNlZE5hbWUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYTmFtZXNwYWNlZE5hbWU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hOYW1lc3BhY2VkTmFtZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYTmFtZXNwYWNlZE5hbWVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYT3BlbmluZ0VsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYT3BlbmluZ0VsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hPcGVuaW5nRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYT3BlbmluZ0VsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYU3ByZWFkQXR0cmlidXRlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWFNwcmVhZEF0dHJpYnV0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFNwcmVhZEF0dHJpYnV0ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWFRleHQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYVGV4dD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFRleHQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWFRleHRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRnJhZ21lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYRnJhZ21lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hGcmFnbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRnJhZ21lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYT3BlbmluZ0ZyYWdtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWE9wZW5pbmdGcmFnbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWE9wZW5pbmdGcmFnbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWENsb3NpbmdGcmFnbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hDbG9zaW5nRnJhZ21lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWENsb3NpbmdGcmFnbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb29wKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk5vb3A+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Ob29wIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOb29wXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlBsYWNlaG9sZGVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUGxhY2Vob2xkZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlBsYWNlaG9sZGVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Y4SW50cmluc2ljSWRlbnRpZmllcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5WOEludHJpbnNpY0lkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5WOEludHJpbnNpY0lkZW50aWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcmd1bWVudFBsYWNlaG9sZGVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFyZ3VtZW50UGxhY2Vob2xkZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkJpbmRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQmluZEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJpbmRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ltcG9ydEF0dHJpYnV0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbXBvcnRBdHRyaWJ1dGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnRBdHRyaWJ1dGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkltcG9ydEF0dHJpYnV0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNvcmF0b3IoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjb3JhdG9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjb3JhdG9yIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNvcmF0b3JcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRG9FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRvRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRvRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRG9FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4cG9ydERlZmF1bHRTcGVjaWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZWNvcmRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUmVjb3JkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUmVjb3JkRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUdXBsZUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHVwbGVFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHVwbGVFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUdXBsZUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjaW1hbExpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjaW1hbExpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNpbWFsTGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjaW1hbExpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kdWxlRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Nb2R1bGVFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTW9kdWxlRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTW9kdWxlRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Ub3BpY1JlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRvcGljUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUb3BpY1JlZmVyZW5jZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZVRvcGljRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lVG9waWNFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZVRvcGljRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZUJhcmVGdW5jdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZUJhcmVGdW5jdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lUHJpbWFyeVRvcGljUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1BhcmFtZXRlclByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUGFyYW1ldGVyUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1BhcmFtZXRlclByb3BlcnR5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1BhcmFtZXRlclByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRGVjbGFyZUZ1bmN0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRGVjbGFyZUZ1bmN0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRGVjbGFyZU1ldGhvZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0RlY2xhcmVNZXRob2Q+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0RlY2xhcmVNZXRob2Qge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTRGVjbGFyZU1ldGhvZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1F1YWxpZmllZE5hbWUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNRdWFsaWZpZWROYW1lPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNRdWFsaWZpZWROYW1lIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1F1YWxpZmllZE5hbWVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1Byb3BlcnR5U2lnbmF0dXJlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUHJvcGVydHlTaWduYXR1cmU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1Byb3BlcnR5U2lnbmF0dXJlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTWV0aG9kU2lnbmF0dXJlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTWV0aG9kU2lnbmF0dXJlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNNZXRob2RTaWduYXR1cmUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTWV0aG9kU2lnbmF0dXJlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW5kZXhTaWduYXR1cmUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbmRleFNpZ25hdHVyZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5kZXhTaWduYXR1cmUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW5kZXhTaWduYXR1cmVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNBbnlLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQW55S2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQW55S2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNBbnlLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQm9vbGVhbktleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNCb29sZWFuS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQm9vbGVhbktleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQm9vbGVhbktleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNCaWdJbnRLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQmlnSW50S2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQmlnSW50S2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNCaWdJbnRLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW50cmluc2ljS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludHJpbnNpY0tleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW50cmluc2ljS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU05ldmVyS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU05ldmVyS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmV2ZXJLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU05ldmVyS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU051bGxLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTnVsbEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU051bGxLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU051bGxLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTnVtYmVyS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU051bWJlcktleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU051bWJlcktleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTnVtYmVyS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU09iamVjdEtleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNPYmplY3RLZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNPYmplY3RLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU09iamVjdEtleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNTdHJpbmdLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTU3RyaW5nS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTU3RyaW5nS2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNTdHJpbmdLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTU3ltYm9sS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1N5bWJvbEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1N5bWJvbEtleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTU3ltYm9sS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1VuZGVmaW5lZEtleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNVbmRlZmluZWRLZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmRlZmluZWRLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1VuZGVmaW5lZEtleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNVbmtub3duS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1Vua25vd25LZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmtub3duS2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNVbmtub3duS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1ZvaWRLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVm9pZEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1ZvaWRLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1ZvaWRLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVGhpc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUaGlzVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVGhpc1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVGhpc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNGdW5jdGlvblR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNGdW5jdGlvblR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNGdW5jdGlvblR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDb25zdHJ1Y3RvclR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNDb25zdHJ1Y3RvclR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0NvbnN0cnVjdG9yVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDb25zdHJ1Y3RvclR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlUmVmZXJlbmNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVJlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVHlwZVJlZmVyZW5jZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlUmVmZXJlbmNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVQcmVkaWNhdGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQcmVkaWNhdGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVRdWVyeShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVRdWVyeT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVHlwZVF1ZXJ5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVRdWVyeVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZUxpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQXJyYXlUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQXJyYXlUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNBcnJheVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQXJyYXlUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHVwbGVUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHVwbGVUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUdXBsZVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHVwbGVUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTT3B0aW9uYWxUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTT3B0aW9uYWxUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNPcHRpb25hbFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTT3B0aW9uYWxUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTUmVzdFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNSZXN0VHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTUmVzdFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTUmVzdFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNOYW1lZFR1cGxlTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTmFtZWRUdXBsZU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmFtZWRUdXBsZU1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVW5pb25UeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVW5pb25UeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmlvblR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVW5pb25UeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW50ZXJzZWN0aW9uVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludGVyc2VjdGlvblR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0ludGVyc2VjdGlvblR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0NvbmRpdGlvbmFsVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0NvbmRpdGlvbmFsVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0NvbmRpdGlvbmFsVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0luZmVyVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0luZmVyVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5mZXJUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0luZmVyVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1BhcmVudGhlc2l6ZWRUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUGFyZW50aGVzaXplZFR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1BhcmVudGhlc2l6ZWRUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZU9wZXJhdG9yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZU9wZXJhdG9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlT3BlcmF0b3Ige1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZU9wZXJhdG9yXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbmRleGVkQWNjZXNzVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5kZXhlZEFjY2Vzc1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNNYXBwZWRUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTWFwcGVkVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTWFwcGVkVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNNYXBwZWRUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTGl0ZXJhbFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNMaXRlcmFsVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTGl0ZXJhbFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTGl0ZXJhbFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludGVyZmFjZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0ludGVyZmFjZUJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbnRlcmZhY2VCb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbnRlcmZhY2VCb2R5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0ludGVyZmFjZUJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0luc3RhbnRpYXRpb25FeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQXNFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQXNFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNBc0V4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQXNFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTU2F0aXNmaWVzRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1NhdGlzZmllc0V4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1NhdGlzZmllc0V4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVBc3NlcnRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUeXBlQXNzZXJ0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQXNzZXJ0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVBc3NlcnRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFbnVtRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNFbnVtRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0VudW1EZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFbnVtRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFbnVtTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRW51bU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTRW51bU1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFbnVtTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTW9kdWxlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNNb2R1bGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNNb2R1bGVCbG9jayhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU01vZHVsZUJsb2NrPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNNb2R1bGVCbG9jayB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNNb2R1bGVCbG9ja1wiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0ltcG9ydFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbXBvcnRUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbXBvcnRUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0ltcG9ydFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTm9uTnVsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNOb25OdWxsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTm9uTnVsbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFeHBvcnRBc3NpZ25tZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRXhwb3J0QXNzaWdubWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTRXhwb3J0QXNzaWdubWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFeHBvcnRBc3NpZ25tZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVBhcmFtZXRlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVQYXJhbWV0ZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQYXJhbWV0ZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVBhcmFtZXRlclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdGFuZGFyZGl6ZWQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3RhbmRhcmRpemVkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhbmRhcmRpemVkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIjpcbiAgICBjYXNlIFwiRGlyZWN0aXZlXCI6XG4gICAgY2FzZSBcIkRpcmVjdGl2ZUxpdGVyYWxcIjpcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkRlYnVnZ2VyU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkRvV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRW1wdHlTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGaWxlXCI6XG4gICAgY2FzZSBcIkZvckluU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIklmU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJQcm9ncmFtXCI6XG4gICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgY2FzZSBcIk9iamVjdFByb3BlcnR5XCI6XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgY2FzZSBcIlJldHVyblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiU3dpdGNoQ2FzZVwiOlxuICAgIGNhc2UgXCJTd2l0Y2hTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVGhpc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVHJ5U3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJVcGRhdGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdG9yXCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldpdGhTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzQm9keVwiOlxuICAgIGNhc2UgXCJDbGFzc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnRTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiSW1wb3J0U3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiU3VwZXJcIjpcbiAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRlbXBsYXRlRWxlbWVudFwiOlxuICAgIGNhc2UgXCJUZW1wbGF0ZUxpdGVyYWxcIjpcbiAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJbXBvcnRcIjpcbiAgICBjYXNlIFwiQmlnSW50TGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCI6XG4gICAgY2FzZSBcIlByaXZhdGVOYW1lXCI6XG4gICAgY2FzZSBcIlN0YXRpY0Jsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIHN3aXRjaCAobm9kZS5leHBlY3RlZE5vZGUpIHtcbiAgICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxcIjpcbiAgICAgICAgY2FzZSBcIkJsb2NrU3RhdGVtZW50XCI6XG4gICAgICAgIGNhc2UgXCJDbGFzc0JvZHlcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxcIjpcbiAgICBjYXNlIFwiTnVtZXJpY0xpdGVyYWxcIjpcbiAgICBjYXNlIFwiTnVsbExpdGVyYWxcIjpcbiAgICBjYXNlIFwiQm9vbGVhbkxpdGVyYWxcIjpcbiAgICBjYXNlIFwiUmVnRXhwTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGhpc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlVwZGF0ZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJTdXBlclwiOlxuICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGVtcGxhdGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIllpZWxkRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJBd2FpdEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0XCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkpTWEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiSlNYRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiRG9FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlJlY29yZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHVwbGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkRlY2ltYWxMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk1vZHVsZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVG9waWNSZWZlcmVuY2VcIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVCYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIjpcbiAgICBjYXNlIFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiRXhwcmVzc2lvblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CaW5hcnk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CaW5hcnkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTY29wYWJsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TY29wYWJsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlNjb3BhYmxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JJblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiU3dpdGNoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCbG9ja1BhcmVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CbG9ja1BhcmVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJsb2NrUGFyZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JJblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiU3dpdGNoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCbG9jayhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CbG9jaz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJsb2NrIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ29udGludWVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRGVidWdnZXJTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJFbXB0eVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvckluU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIklmU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUmV0dXJuU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlN3aXRjaFN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUaHJvd1N0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUcnlTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJXaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJXaXRoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUNsYXNzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVGdW5jdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlSW50ZXJmYWNlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVR5cGVBbGlhc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlVmFyaWFibGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJPcGFxdWVUeXBlXCI6XG4gICAgY2FzZSBcIlR5cGVBbGlhc1wiOlxuICAgIGNhc2UgXCJFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTRW51bURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0V4cG9ydEFzc2lnbm1lbnRcIjpcbiAgICBjYXNlIFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBsYWNlaG9sZGVyXCI6XG4gICAgICBzd2l0Y2ggKG5vZGUuZXhwZWN0ZWROb2RlKSB7XG4gICAgICAgIGNhc2UgXCJTdGF0ZW1lbnRcIjpcbiAgICAgICAgY2FzZSBcIkRlY2xhcmF0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlcm1pbmF0b3JsZXNzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRlcm1pbmF0b3JsZXNzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGVybWluYXRvcmxlc3Mge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJCcmVha1N0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJDb250aW51ZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJSZXR1cm5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxldGlvblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Db21wbGV0aW9uU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ29tcGxldGlvblN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkJyZWFrU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlJldHVyblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUaHJvd1N0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ29uZGl0aW9uYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Db25kaXRpb25hbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZlN0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9vcChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Mb29wPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTG9vcCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkRvV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNXaGlsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5XaGlsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LldoaWxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJXaGlsZVN0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbldyYXBwZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwcmVzc2lvbldyYXBwZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FeHByZXNzaW9uV3JhcHBlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGb3IoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRm9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRm9yIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGb3JYU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZvclhTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JYU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NNZXRob2RcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvblBhcmVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GdW5jdGlvblBhcmVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkZ1bmN0aW9uUGFyZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQdXJlaXNoKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlB1cmVpc2g+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QdXJlaXNoIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiRGVjaW1hbExpdGVyYWxcIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlN0cmluZ0xpdGVyYWxcIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkltcG9ydERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVDbGFzc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUludGVyZmFjZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVZhcmlhYmxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRW51bURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0VudW1EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU01vZHVsZURlY2xhcmF0aW9uXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJEZWNsYXJhdGlvblwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuTGlrZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QYXR0ZXJuTGlrZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBhdHRlcm5MaWtlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xWYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTFZhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkxWYWwge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRW50aXR5TmFtZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0VudGl0eU5hbWU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0VudGl0eU5hbWUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIlRTUXVhbGlmaWVkTmFtZVwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBsYWNlaG9sZGVyXCI6XG4gICAgICBpZiAobm9kZS5leHBlY3RlZE5vZGUgPT09IFwiSWRlbnRpZmllclwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkxpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5MaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRlbXBsYXRlTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCaWdJbnRMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkRlY2ltYWxMaXRlcmFsXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbXV0YWJsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbW11dGFibGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbW11dGFibGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk51bWVyaWNMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5MaXRlcmFsXCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiSlNYQXR0cmlidXRlXCI6XG4gICAgY2FzZSBcIkpTWENsb3NpbmdFbGVtZW50XCI6XG4gICAgY2FzZSBcIkpTWEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiOlxuICAgIGNhc2UgXCJKU1hTcHJlYWRDaGlsZFwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hUZXh0XCI6XG4gICAgY2FzZSBcIkpTWEZyYWdtZW50XCI6XG4gICAgY2FzZSBcIkpTWE9wZW5pbmdGcmFnbWVudFwiOlxuICAgIGNhc2UgXCJKU1hDbG9zaW5nRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiRGVjaW1hbExpdGVyYWxcIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlN0cmluZ0xpdGVyYWxcIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXNlcldoaXRlc3BhY2FibGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVXNlcldoaXRlc3BhY2FibGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Vc2VyV2hpdGVzcGFjYWJsZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgIGNhc2UgXCJPYmplY3RQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUluZGV4ZXJcIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZVByb3BlcnR5XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdE1lbWJlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RNZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RNZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1Byb3BlcnR5XCI6XG4gICAgY2FzZSBcIkNsYXNzQWNjZXNzb3JQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5hcnlMaWtlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlVuYXJ5TGlrZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlVuYXJ5TGlrZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QYXR0ZXJuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlBhdHRlcm5cIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3MoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3M+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkV4cG9ydERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kdWxlU3BlY2lmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1vZHVsZVNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1vZHVsZVNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkV4cG9ydFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnRTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FjY2Vzc29yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFjY2Vzc29yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQWNjZXNzb3Ige1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuUHJpdmF0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlByaXZhdGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICBjYXNlIFwiUHJpdmF0ZU5hbWVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3coXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRmxvdz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkZsb3cge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJBbnlUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NJbXBsZW1lbnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVDbGFzc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUludGVyZmFjZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVZhcmlhYmxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvblR5cGVQYXJhbVwiOlxuICAgIGNhc2UgXCJHZW5lcmljVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW5mZXJyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlRXh0ZW5kc1wiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkVtcHR5VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVtYmVyVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVJbmRleGVyXCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiOlxuICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiU3RyaW5nVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiU3ltYm9sVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVGhpc1R5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlR1cGxlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHlwZW9mVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHlwZUFsaWFzXCI6XG4gICAgY2FzZSBcIlR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUeXBlUGFyYW1ldGVyXCI6XG4gICAgY2FzZSBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiOlxuICAgIGNhc2UgXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlZhcmlhbmNlXCI6XG4gICAgY2FzZSBcIlZvaWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRW51bUJvb2xlYW5Cb2R5XCI6XG4gICAgY2FzZSBcIkVudW1OdW1iZXJCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1TdHJpbmdCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1TeW1ib2xCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1Cb29sZWFuTWVtYmVyXCI6XG4gICAgY2FzZSBcIkVudW1OdW1iZXJNZW1iZXJcIjpcbiAgICBjYXNlIFwiRW51bVN0cmluZ01lbWJlclwiOlxuICAgIGNhc2UgXCJFbnVtRGVmYXVsdGVkTWVtYmVyXCI6XG4gICAgY2FzZSBcIkluZGV4ZWRBY2Nlc3NUeXBlXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZsb3dUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRmxvd1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJBbnlUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJHZW5lcmljVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUaGlzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlZvaWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJJbmRleGVkQWNjZXNzVHlwZVwiOlxuICAgIGNhc2UgXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGbG93QmFzZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRmxvd0Jhc2VBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRmxvd0Jhc2VBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQW55VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN0cmluZ1R5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlRoaXNUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJWb2lkVHlwZUFubm90YXRpb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GbG93RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GbG93RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJEZWNsYXJlQ2xhc3NcIjpcbiAgICBjYXNlIFwiRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVJbnRlcmZhY2VcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU1vZHVsZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlRXhwb3J0c1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlVHlwZUFsaWFzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVPcGFxdWVUeXBlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVWYXJpYWJsZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIk9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiVHlwZUFsaWFzXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGbG93UHJlZGljYXRlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZsb3dQcmVkaWNhdGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GbG93UHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRGVjbGFyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiSW5mZXJyZWRQcmVkaWNhdGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1Cb2R5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkVudW1Cb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bUJvZHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFbnVtQm9vbGVhbkJvZHlcIjpcbiAgICBjYXNlIFwiRW51bU51bWJlckJvZHlcIjpcbiAgICBjYXNlIFwiRW51bVN0cmluZ0JvZHlcIjpcbiAgICBjYXNlIFwiRW51bVN5bWJvbEJvZHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1NZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkVudW1NZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFbnVtQm9vbGVhbk1lbWJlclwiOlxuICAgIGNhc2UgXCJFbnVtTnVtYmVyTWVtYmVyXCI6XG4gICAgY2FzZSBcIkVudW1TdHJpbmdNZW1iZXJcIjpcbiAgICBjYXNlIFwiRW51bURlZmF1bHRlZE1lbWJlclwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkpTWEF0dHJpYnV0ZVwiOlxuICAgIGNhc2UgXCJKU1hDbG9zaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hFbGVtZW50XCI6XG4gICAgY2FzZSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCI6XG4gICAgY2FzZSBcIkpTWFNwcmVhZENoaWxkXCI6XG4gICAgY2FzZSBcIkpTWElkZW50aWZpZXJcIjpcbiAgICBjYXNlIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJKU1hOYW1lc3BhY2VkTmFtZVwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIjpcbiAgICBjYXNlIFwiSlNYVGV4dFwiOlxuICAgIGNhc2UgXCJKU1hGcmFnbWVudFwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNNaXNjZWxsYW5lb3VzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1pc2NlbGxhbmVvdXM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5NaXNjZWxsYW5lb3VzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiTm9vcFwiOlxuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgIGNhc2UgXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZVNjcmlwdD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVTY3JpcHQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJUU1BhcmFtZXRlclByb3BlcnR5XCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJUU1F1YWxpZmllZE5hbWVcIjpcbiAgICBjYXNlIFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCI6XG4gICAgY2FzZSBcIlRTTWV0aG9kU2lnbmF0dXJlXCI6XG4gICAgY2FzZSBcIlRTSW5kZXhTaWduYXR1cmVcIjpcbiAgICBjYXNlIFwiVFNBbnlLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTQm9vbGVhbktleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCaWdJbnRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTSW50cmluc2ljS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU05ldmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU051bGxLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVtYmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU09iamVjdEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTdHJpbmdLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTU3ltYm9sS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1VuZGVmaW5lZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNVbmtub3duS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1ZvaWRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVGhpc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNGdW5jdGlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTVHlwZVByZWRpY2F0ZVwiOlxuICAgIGNhc2UgXCJUU1R5cGVRdWVyeVwiOlxuICAgIGNhc2UgXCJUU1R5cGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRTQXJyYXlUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgY2FzZSBcIlRTT3B0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTUmVzdFR5cGVcIjpcbiAgICBjYXNlIFwiVFNOYW1lZFR1cGxlTWVtYmVyXCI6XG4gICAgY2FzZSBcIlRTVW5pb25UeXBlXCI6XG4gICAgY2FzZSBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiOlxuICAgIGNhc2UgXCJUU0NvbmRpdGlvbmFsVHlwZVwiOlxuICAgIGNhc2UgXCJUU0luZmVyVHlwZVwiOlxuICAgIGNhc2UgXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHlwZU9wZXJhdG9yXCI6XG4gICAgY2FzZSBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNNYXBwZWRUeXBlXCI6XG4gICAgY2FzZSBcIlRTTGl0ZXJhbFR5cGVcIjpcbiAgICBjYXNlIFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIjpcbiAgICBjYXNlIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0ludGVyZmFjZUJvZHlcIjpcbiAgICBjYXNlIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICBjYXNlIFwiVFNFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNFbnVtTWVtYmVyXCI6XG4gICAgY2FzZSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNNb2R1bGVCbG9ja1wiOlxuICAgIGNhc2UgXCJUU0ltcG9ydFR5cGVcIjpcbiAgICBjYXNlIFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNFeHBvcnRBc3NpZ25tZW50XCI6XG4gICAgY2FzZSBcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCI6XG4gICAgY2FzZSBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTVHlwZVBhcmFtZXRlclwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiOlxuICAgIGNhc2UgXCJUU01ldGhvZFNpZ25hdHVyZVwiOlxuICAgIGNhc2UgXCJUU0luZGV4U2lnbmF0dXJlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiVFNBbnlLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTQm9vbGVhbktleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCaWdJbnRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTSW50cmluc2ljS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU05ldmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU051bGxLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVtYmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU09iamVjdEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTdHJpbmdLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTU3ltYm9sS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1VuZGVmaW5lZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNVbmtub3duS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1ZvaWRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVGhpc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNGdW5jdGlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTVHlwZVByZWRpY2F0ZVwiOlxuICAgIGNhc2UgXCJUU1R5cGVRdWVyeVwiOlxuICAgIGNhc2UgXCJUU1R5cGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRTQXJyYXlUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgY2FzZSBcIlRTT3B0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTUmVzdFR5cGVcIjpcbiAgICBjYXNlIFwiVFNVbmlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCI6XG4gICAgY2FzZSBcIlRTQ29uZGl0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTSW5mZXJUeXBlXCI6XG4gICAgY2FzZSBcIlRTUGFyZW50aGVzaXplZFR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlT3BlcmF0b3JcIjpcbiAgICBjYXNlIFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiOlxuICAgIGNhc2UgXCJUU01hcHBlZFR5cGVcIjpcbiAgICBjYXNlIFwiVFNMaXRlcmFsVHlwZVwiOlxuICAgIGNhc2UgXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJUU0ltcG9ydFR5cGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQmFzZVR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNCYXNlVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQmFzZVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJUU0FueUtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCb29sZWFuS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU0JpZ0ludEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNJbnRyaW5zaWNLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTmV2ZXJLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVsbEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNOdW1iZXJLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTT2JqZWN0S2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1N0cmluZ0tleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTeW1ib2xLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVW5kZWZpbmVkS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1Vua25vd25LZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVm9pZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNUaGlzVHlwZVwiOlxuICAgIGNhc2UgXCJUU0xpdGVyYWxUeXBlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgaXNOdW1lcmljTGl0ZXJhbGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJMaXRlcmFsPiB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiaXNOdW1iZXJMaXRlcmFsXCIsIFwiaXNOdW1lcmljTGl0ZXJhbFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1iZXJMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBpc1JlZ0V4cExpdGVyYWxgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ2V4TGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZWdleExpdGVyYWw+IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc1JlZ2V4TGl0ZXJhbFwiLCBcImlzUmVnRXhwTGl0ZXJhbFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJSZWdleExpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGlzUmVzdEVsZW1lbnRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZXN0UHJvcGVydHk+IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc1Jlc3RQcm9wZXJ0eVwiLCBcImlzUmVzdEVsZW1lbnRcIik7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUmVzdFByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBpc1NwcmVhZEVsZW1lbnRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwcmVhZFByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlNwcmVhZFByb3BlcnR5PiB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiaXNTcHJlYWRQcm9wZXJ0eVwiLCBcImlzU3ByZWFkRWxlbWVudFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTcHJlYWRQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2R1bGVEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Nb2R1bGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc01vZHVsZURlY2xhcmF0aW9uXCIsIFwiaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCIpO1xuICByZXR1cm4gaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uKG5vZGUsIG9wdHMpO1xufVxuIiwgImltcG9ydCB7XG4gIGlzSWRlbnRpZmllcixcbiAgaXNNZW1iZXJFeHByZXNzaW9uLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIGlzVGhpc0V4cHJlc3Npb24sXG59IGZyb20gXCIuL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGlucHV0IG5vZGUgYG1lbWJlcmAgbWF0Y2hlcyB0aGVcbiAqIGlucHV0IGBtYXRjaGAuXG4gKlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBtYXRjaCBgUmVhY3QuY3JlYXRlQ2xhc3NgIGl0IHdvdWxkIG1hdGNoIHRoZVxuICogcGFyc2VkIG5vZGVzIG9mIGBSZWFjdC5jcmVhdGVDbGFzc2AgYW5kIGBSZWFjdFtcImNyZWF0ZUNsYXNzXCJdYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oXG4gIG1lbWJlcjogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbWF0Y2g6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBhbGxvd1BhcnRpYWw/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIC8vIG5vdCBhIG1lbWJlciBleHByZXNzaW9uXG4gIGlmICghaXNNZW1iZXJFeHByZXNzaW9uKG1lbWJlcikpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwYXJ0cyA9IEFycmF5LmlzQXJyYXkobWF0Y2gpID8gbWF0Y2ggOiBtYXRjaC5zcGxpdChcIi5cIik7XG4gIGNvbnN0IG5vZGVzID0gW107XG5cbiAgbGV0IG5vZGU7XG4gIGZvciAobm9kZSA9IG1lbWJlcjsgaXNNZW1iZXJFeHByZXNzaW9uKG5vZGUpOyBub2RlID0gbm9kZS5vYmplY3QpIHtcbiAgICBub2Rlcy5wdXNoKG5vZGUucHJvcGVydHkpO1xuICB9XG4gIG5vZGVzLnB1c2gobm9kZSk7XG5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWFsbG93UGFydGlhbCAmJiBub2Rlcy5sZW5ndGggPiBwYXJ0cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKywgai0tKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2pdO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICB2YWx1ZSA9IG5vZGUubmFtZTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAoaXNUaGlzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgdmFsdWUgPSBcInRoaXNcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJ0c1tpXSAhPT0gdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCBtYXRjaGVzUGF0dGVybiBmcm9tIFwiLi9tYXRjaGVzUGF0dGVyblwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEJ1aWxkIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGNhbGxlZCB3aWxsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGVcbiAqIGlucHV0IGBub2RlYCBgTWVtYmVyRXhwcmVzc2lvbmAgbWF0Y2hlcyB0aGUgaW5wdXQgYG1hdGNoYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIG1hdGNoIGBSZWFjdC5jcmVhdGVDbGFzc2AgaXQgd291bGQgbWF0Y2ggdGhlXG4gKiBwYXJzZWQgbm9kZXMgb2YgYFJlYWN0LmNyZWF0ZUNsYXNzYCBhbmQgYFJlYWN0W1wiY3JlYXRlQ2xhc3NcIl1gLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZE1hdGNoTWVtYmVyRXhwcmVzc2lvbihcbiAgbWF0Y2g6IHN0cmluZyxcbiAgYWxsb3dQYXJ0aWFsPzogYm9vbGVhbixcbikge1xuICBjb25zdCBwYXJ0cyA9IG1hdGNoLnNwbGl0KFwiLlwiKTtcblxuICByZXR1cm4gKG1lbWJlcjogdC5Ob2RlKSA9PiBtYXRjaGVzUGF0dGVybihtZW1iZXIsIHBhcnRzLCBhbGxvd1BhcnRpYWwpO1xufVxuIiwgImltcG9ydCBidWlsZE1hdGNoTWVtYmVyRXhwcmVzc2lvbiBmcm9tIFwiLi4vYnVpbGRNYXRjaE1lbWJlckV4cHJlc3Npb25cIjtcblxuY29uc3QgaXNSZWFjdENvbXBvbmVudCA9IGJ1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uKFwiUmVhY3QuQ29tcG9uZW50XCIpO1xuXG5leHBvcnQgZGVmYXVsdCBpc1JlYWN0Q29tcG9uZW50O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQ29tcGF0VGFnKHRhZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIEFTQ0lJIGxldHRlclxuICByZXR1cm4gISF0YWdOYW1lICYmIC9eW2Etel0vLnRlc3QodGFnTmFtZSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgZmFzdFByb3RvID0gbnVsbDtcblxuLy8gQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCBwZXJtYW5lbnRseSBmYXN0IHByb3BlcnRpZXMgaW4gVjguIFNlZSBUb29uIFZlcndhZXN0J3Ncbi8vIHBvc3QgaHR0cHM6Ly9tZWRpdW0uY29tL0B0dmVyd2Flcy9zZXR0aW5nLXVwLXByb3RvdHlwZXMtaW4tdjgtZWM5Yzk0OTFkZmUyIzVmNjJcbi8vIGZvciBtb3JlIGRldGFpbHMuIFVzZSAlSGFzRmFzdFByb3BlcnRpZXMob2JqZWN0KSBhbmQgdGhlIE5vZGUuanMgZmxhZ1xuLy8gLS1hbGxvdy1uYXRpdmVzLXN5bnRheCB0byBjaGVjayB3aGV0aGVyIGFuIG9iamVjdCBoYXMgZmFzdCBwcm9wZXJ0aWVzLlxuZnVuY3Rpb24gRmFzdE9iamVjdChvKSB7XG5cdC8vIEEgcHJvdG90eXBlIG9iamVjdCB3aWxsIGhhdmUgXCJmYXN0IHByb3BlcnRpZXNcIiBlbmFibGVkIG9uY2UgaXQgaXMgY2hlY2tlZFxuXHQvLyBhZ2FpbnN0IHRoZSBpbmxpbmUgcHJvcGVydHkgY2FjaGUgb2YgYSBmdW5jdGlvbiwgZS5nLiBmYXN0UHJvdG8ucHJvcGVydHk6XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92OC92OC9ibG9iLzYuMC4xMjIvdGVzdC9tanN1bml0L2Zhc3QtcHJvdG90eXBlLmpzI0w0OC1MNjNcblx0aWYgKGZhc3RQcm90byAhPT0gbnVsbCAmJiB0eXBlb2YgZmFzdFByb3RvLnByb3BlcnR5KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZmFzdFByb3RvO1xuXHRcdGZhc3RQcm90byA9IEZhc3RPYmplY3QucHJvdG90eXBlID0gbnVsbDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cdGZhc3RQcm90byA9IEZhc3RPYmplY3QucHJvdG90eXBlID0gbyA9PSBudWxsID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IG87XG5cdHJldHVybiBuZXcgRmFzdE9iamVjdDtcbn1cblxuLy8gSW5pdGlhbGl6ZSB0aGUgaW5saW5lIHByb3BlcnR5IGNhY2hlIG9mIEZhc3RPYmplY3RcbkZhc3RPYmplY3QoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b0Zhc3Rwcm9wZXJ0aWVzKG8pIHtcblx0cmV0dXJuIEZhc3RPYmplY3Qobyk7XG59O1xuIiwgImltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUywgQUxJQVNfS0VZUyB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1R5cGU8VCBleHRlbmRzIHQuTm9kZVtcInR5cGVcIl0+KFxuICBub2RlVHlwZTogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBULFxuKTogbm9kZVR5cGUgaXMgVDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUeXBlKFxuICBub2RlVHlwZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0VHlwZTogc3RyaW5nLFxuKTogYm9vbGVhbjtcblxuLyoqXG4gKiBUZXN0IGlmIGEgYG5vZGVUeXBlYCBpcyBhIGB0YXJnZXRUeXBlYCBvciBpZiBgdGFyZ2V0VHlwZWAgaXMgYW4gYWxpYXMgb2YgYG5vZGVUeXBlYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUeXBlKG5vZGVUeXBlOiBzdHJpbmcsIHRhcmdldFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAobm9kZVR5cGUgPT09IHRhcmdldFR5cGUpIHJldHVybiB0cnVlO1xuXG4gIC8vIFRoaXMgaXMgYSBmYXN0LXBhdGguIElmIHRoZSB0ZXN0IGFib3ZlIGZhaWxlZCwgYnV0IGFuIGFsaWFzIGtleSBpcyBmb3VuZCwgdGhlbiB0aGVcbiAgLy8gdGFyZ2V0VHlwZSB3YXMgYSBwcmltYXJ5IG5vZGUgdHlwZSwgc28gdGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIHRoZSBhbGlhc2VzLlxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRhcmdldFR5cGUgbWF5IG5vdCBpbmRleCBBTElBU19LRVlTXG4gIGlmIChBTElBU19LRVlTW3RhcmdldFR5cGVdKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgYWxpYXNlczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9IEZMSVBQRURfQUxJQVNfS0VZU1t0YXJnZXRUeXBlXTtcbiAgaWYgKGFsaWFzZXMpIHtcbiAgICBpZiAoYWxpYXNlc1swXSA9PT0gbm9kZVR5cGUpIHJldHVybiB0cnVlO1xuXG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICBpZiAobm9kZVR5cGUgPT09IGFsaWFzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iLCAiaW1wb3J0IHsgUExBQ0VIT0xERVJTX0FMSUFTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbi8qKlxuICogVGVzdCBpZiBhIGBwbGFjZWhvbGRlclR5cGVgIGlzIGEgYHRhcmdldFR5cGVgIG9yIGlmIGB0YXJnZXRUeXBlYCBpcyBhbiBhbGlhcyBvZiBgcGxhY2Vob2xkZXJUeXBlYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFjZWhvbGRlclR5cGUoXG4gIHBsYWNlaG9sZGVyVHlwZTogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgaWYgKHBsYWNlaG9sZGVyVHlwZSA9PT0gdGFyZ2V0VHlwZSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgYWxpYXNlczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9XG4gICAgUExBQ0VIT0xERVJTX0FMSUFTW3BsYWNlaG9sZGVyVHlwZV07XG4gIGlmIChhbGlhc2VzKSB7XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gYWxpYXMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gXCIuLi91dGlscy9zaGFsbG93RXF1YWxcIjtcbmltcG9ydCBpc1R5cGUgZnJvbSBcIi4vaXNUeXBlXCI7XG5pbXBvcnQgaXNQbGFjZWhvbGRlclR5cGUgZnJvbSBcIi4vaXNQbGFjZWhvbGRlclR5cGVcIjtcbmltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUyB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpczxUIGV4dGVuZHMgdC5Ob2RlW1widHlwZVwiXT4oXG4gIHR5cGU6IFQsXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiB1bmRlZmluZWQsXG4pOiBub2RlIGlzIEV4dHJhY3Q8dC5Ob2RlLCB7IHR5cGU6IFQgfT47XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzPFxuICBUIGV4dGVuZHMgdC5Ob2RlW1widHlwZVwiXSxcbiAgUCBleHRlbmRzIEV4dHJhY3Q8dC5Ob2RlLCB7IHR5cGU6IFQgfT4sXG4+KHR5cGU6IFQsIG46IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsIHJlcXVpcmVkOiBQYXJ0aWFsPFA+KTogbiBpcyBQO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpczxQIGV4dGVuZHMgdC5Ob2RlPihcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzOiBQYXJ0aWFsPFA+LFxuKTogbm9kZSBpcyBQO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpcyhcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogUGFydGlhbDx0Lk5vZGU+LFxuKTogbm9kZSBpcyB0Lk5vZGU7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBgbm9kZWAgaXMgb2YgZ2l2ZW4gYHR5cGVgLlxuICpcbiAqIEZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIHVzZSB0aGlzIGluc3RlYWQgb2YgYGlzW1R5cGVdYCB3aGVuIGB0eXBlYCBpcyB1bmtub3duLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpcyhcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogUGFydGlhbDx0Lk5vZGU+LFxuKTogbm9kZSBpcyB0Lk5vZGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBtYXRjaGVzID0gaXNUeXBlKG5vZGUudHlwZSwgdHlwZSk7XG4gIGlmICghbWF0Y2hlcykge1xuICAgIGlmICghb3B0cyAmJiBub2RlLnR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIiAmJiB0eXBlIGluIEZMSVBQRURfQUxJQVNfS0VZUykge1xuICAgICAgLy8gV2UgY2FuIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIHBsYWNlaG9sZGVyIGRvZXNuJ3QgcmVwbGFjZSBhIHJlYWwgbm9kZSxcbiAgICAgIC8vIGJ1dCBpdCByZXBsYWNlcyBhIGNhdGVnb3J5IG9mIG5vZGVzIChhbiBhbGlhcykuXG4gICAgICAvL1xuICAgICAgLy8gdC5pcyhcIklkZW50aWZpZXJcIiwgbm9kZSkgZ2l2ZXMgc29tZSBndWFyYW50ZWVzIGFib3V0IG5vZGUncyBzaGFwZSwgc28gd2VcbiAgICAgIC8vIGNhbid0IHNheSB0aGF0IFBsYWNlaG9sZGVyKGV4cGVjdGVkTm9kZTogXCJJZGVudGlmaWVyXCIpIGlzIGFuIGlkZW50aWZpZXJcbiAgICAgIC8vIGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIHRoZSBzYW1lIHByb3BlcnRpZXMuXG4gICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgdC5pcyhcIkV4cHJlc3Npb25cIiwgbm9kZSkgZG9lc24ndCBzYXkgYW55dGhpbmcgYWJvdXRcbiAgICAgIC8vIHRoZSBzaGFwZSBvZiBub2RlIGJlY2F1c2UgRXhwcmVzc2lvbiBjYW4gYmUgbWFueSBkaWZmZXJlbnQgbm9kZXM6IHdlIGNhbixcbiAgICAgIC8vIGFuZCBzaG91bGQsIHNhZmVseSByZXBvcnQgZXhwcmVzc2lvbiBwbGFjZWhvbGRlcnMgYXMgRXhwcmVzc2lvbnMuXG4gICAgICByZXR1cm4gaXNQbGFjZWhvbGRlclR5cGUobm9kZS5leHBlY3RlZE5vZGUsIHR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcblxuLy8gIyMgQ2hhcmFjdGVyIGNhdGVnb3JpZXNcblxuLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlXG4vLyB3aGl0ZXNwYWNlLCBpZGVudGlmaWVyLCBhbmQgaWRlbnRpZmllci1zdGFydCBjYXRlZ29yaWVzLiBUaGVzZVxuLy8gYXJlIG9ubHkgYXBwbGllZCB3aGVuIGEgY2hhcmFjdGVyIGlzIGZvdW5kIHRvIGFjdHVhbGx5IGhhdmUgYVxuLy8gY29kZSBwb2ludCBiZXR3ZWVuIDB4ODAgYW5kIDB4ZmZmZi5cbi8vIEdlbmVyYXRlZCBieSBgc2NyaXB0cy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cblxuLyogcHJldHRpZXItaWdub3JlICovXG5sZXQgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IFwiXFx4YWFcXHhiNVxceGJhXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyYzFcXHUwMmM2LVxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVjXFx1MDJlZVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3YS1cXHUwMzdkXFx1MDM3ZlxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTJmXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjAtXFx1MDU4OFxcdTA1ZDAtXFx1MDVlYVxcdTA1ZWYtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NmFcXHUwODcwLVxcdTA4ODdcXHUwODg5LVxcdTA4OGVcXHUwOGEwLVxcdTA4YzlcXHUwOTA0LVxcdTA5MzlcXHUwOTNkXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Y1xcdTA5OGZcXHUwOTkwXFx1MDk5My1cXHUwOWE4XFx1MDlhYS1cXHUwOWIwXFx1MDliMlxcdTA5YjYtXFx1MDliOVxcdTA5YmRcXHUwOWNlXFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWYwXFx1MDlmMVxcdTA5ZmNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWY5XFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzlcXHUwYzNkXFx1MGM1OC1cXHUwYzVhXFx1MGM1ZFxcdTBjNjBcXHUwYzYxXFx1MGM4MFxcdTBjODUtXFx1MGM4Y1xcdTBjOGUtXFx1MGM5MFxcdTBjOTItXFx1MGNhOFxcdTBjYWEtXFx1MGNiM1xcdTBjYjUtXFx1MGNiOVxcdTBjYmRcXHUwY2RkXFx1MGNkZVxcdTBjZTBcXHUwY2UxXFx1MGNmMVxcdTBjZjJcXHUwZDA0LVxcdTBkMGNcXHUwZDBlLVxcdTBkMTBcXHUwZDEyLVxcdTBkM2FcXHUwZDNkXFx1MGQ0ZVxcdTBkNTQtXFx1MGQ1NlxcdTBkNWYtXFx1MGQ2MVxcdTBkN2EtXFx1MGQ3ZlxcdTBkODUtXFx1MGQ5NlxcdTBkOWEtXFx1MGRiMVxcdTBkYjMtXFx1MGRiYlxcdTBkYmRcXHUwZGMwLVxcdTBkYzZcXHUwZTAxLVxcdTBlMzBcXHUwZTMyXFx1MGUzM1xcdTBlNDAtXFx1MGU0NlxcdTBlODFcXHUwZTgyXFx1MGU4NFxcdTBlODYtXFx1MGU4YVxcdTBlOGMtXFx1MGVhM1xcdTBlYTVcXHUwZWE3LVxcdTBlYjBcXHUwZWIyXFx1MGViM1xcdTBlYmRcXHUwZWMwLVxcdTBlYzRcXHUwZWM2XFx1MGVkYy1cXHUwZWRmXFx1MGYwMFxcdTBmNDAtXFx1MGY0N1xcdTBmNDktXFx1MGY2Y1xcdTBmODgtXFx1MGY4Y1xcdTEwMDAtXFx1MTAyYVxcdTEwM2ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVhLVxcdTEwNWRcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZlLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhlXFx1MTBhMC1cXHUxMGM1XFx1MTBjN1xcdTEwY2RcXHUxMGQwLVxcdTEwZmFcXHUxMGZjLVxcdTEyNDhcXHUxMjRhLVxcdTEyNGRcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1YS1cXHUxMjVkXFx1MTI2MC1cXHUxMjg4XFx1MTI4YS1cXHUxMjhkXFx1MTI5MC1cXHUxMmIwXFx1MTJiMi1cXHUxMmI1XFx1MTJiOC1cXHUxMmJlXFx1MTJjMFxcdTEyYzItXFx1MTJjNVxcdTEyYzgtXFx1MTJkNlxcdTEyZDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1YVxcdTEzODAtXFx1MTM4ZlxcdTEzYTAtXFx1MTNmNVxcdTEzZjgtXFx1MTNmZFxcdTE0MDEtXFx1MTY2Y1xcdTE2NmYtXFx1MTY3ZlxcdTE2ODEtXFx1MTY5YVxcdTE2YTAtXFx1MTZlYVxcdTE2ZWUtXFx1MTZmOFxcdTE3MDAtXFx1MTcxMVxcdTE3MWYtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Y1xcdTE3NmUtXFx1MTc3MFxcdTE3ODAtXFx1MTdiM1xcdTE3ZDdcXHUxN2RjXFx1MTgyMC1cXHUxODc4XFx1MTg4MC1cXHUxOGE4XFx1MThhYVxcdTE4YjAtXFx1MThmNVxcdTE5MDAtXFx1MTkxZVxcdTE5NTAtXFx1MTk2ZFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlhYlxcdTE5YjAtXFx1MTljOVxcdTFhMDAtXFx1MWExNlxcdTFhMjAtXFx1MWE1NFxcdTFhYTdcXHUxYjA1LVxcdTFiMzNcXHUxYjQ1LVxcdTFiNGNcXHUxYjgzLVxcdTFiYTBcXHUxYmFlXFx1MWJhZlxcdTFiYmEtXFx1MWJlNVxcdTFjMDAtXFx1MWMyM1xcdTFjNGQtXFx1MWM0ZlxcdTFjNWEtXFx1MWM3ZFxcdTFjODAtXFx1MWM4OFxcdTFjOTAtXFx1MWNiYVxcdTFjYmQtXFx1MWNiZlxcdTFjZTktXFx1MWNlY1xcdTFjZWUtXFx1MWNmM1xcdTFjZjVcXHUxY2Y2XFx1MWNmYVxcdTFkMDAtXFx1MWRiZlxcdTFlMDAtXFx1MWYxNVxcdTFmMTgtXFx1MWYxZFxcdTFmMjAtXFx1MWY0NVxcdTFmNDgtXFx1MWY0ZFxcdTFmNTAtXFx1MWY1N1xcdTFmNTlcXHUxZjViXFx1MWY1ZFxcdTFmNWYtXFx1MWY3ZFxcdTFmODAtXFx1MWZiNFxcdTFmYjYtXFx1MWZiY1xcdTFmYmVcXHUxZmMyLVxcdTFmYzRcXHUxZmM2LVxcdTFmY2NcXHUxZmQwLVxcdTFmZDNcXHUxZmQ2LVxcdTFmZGJcXHUxZmUwLVxcdTFmZWNcXHUxZmYyLVxcdTFmZjRcXHUxZmY2LVxcdTFmZmNcXHUyMDcxXFx1MjA3ZlxcdTIwOTAtXFx1MjA5Y1xcdTIxMDJcXHUyMTA3XFx1MjEwYS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExZFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMmEtXFx1MjEzOVxcdTIxM2MtXFx1MjEzZlxcdTIxNDUtXFx1MjE0OVxcdTIxNGVcXHUyMTYwLVxcdTIxODhcXHUyYzAwLVxcdTJjZTRcXHUyY2ViLVxcdTJjZWVcXHUyY2YyXFx1MmNmM1xcdTJkMDAtXFx1MmQyNVxcdTJkMjdcXHUyZDJkXFx1MmQzMC1cXHUyZDY3XFx1MmQ2ZlxcdTJkODAtXFx1MmQ5NlxcdTJkYTAtXFx1MmRhNlxcdTJkYTgtXFx1MmRhZVxcdTJkYjAtXFx1MmRiNlxcdTJkYjgtXFx1MmRiZVxcdTJkYzAtXFx1MmRjNlxcdTJkYzgtXFx1MmRjZVxcdTJkZDAtXFx1MmRkNlxcdTJkZDgtXFx1MmRkZVxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzY1xcdTMwNDEtXFx1MzA5NlxcdTMwOWItXFx1MzA5ZlxcdTMwYTEtXFx1MzBmYVxcdTMwZmMtXFx1MzBmZlxcdTMxMDUtXFx1MzEyZlxcdTMxMzEtXFx1MzE4ZVxcdTMxYTAtXFx1MzFiZlxcdTMxZjAtXFx1MzFmZlxcdTM0MDAtXFx1NGRiZlxcdTRlMDAtXFx1YTQ4Y1xcdWE0ZDAtXFx1YTRmZFxcdWE1MDAtXFx1YTYwY1xcdWE2MTAtXFx1YTYxZlxcdWE2MmFcXHVhNjJiXFx1YTY0MC1cXHVhNjZlXFx1YTY3Zi1cXHVhNjlkXFx1YTZhMC1cXHVhNmVmXFx1YTcxNy1cXHVhNzFmXFx1YTcyMi1cXHVhNzg4XFx1YTc4Yi1cXHVhN2NhXFx1YTdkMFxcdWE3ZDFcXHVhN2QzXFx1YTdkNS1cXHVhN2Q5XFx1YTdmMi1cXHVhODAxXFx1YTgwMy1cXHVhODA1XFx1YTgwNy1cXHVhODBhXFx1YTgwYy1cXHVhODIyXFx1YTg0MC1cXHVhODczXFx1YTg4Mi1cXHVhOGIzXFx1YThmMi1cXHVhOGY3XFx1YThmYlxcdWE4ZmRcXHVhOGZlXFx1YTkwYS1cXHVhOTI1XFx1YTkzMC1cXHVhOTQ2XFx1YTk2MC1cXHVhOTdjXFx1YTk4NC1cXHVhOWIyXFx1YTljZlxcdWE5ZTAtXFx1YTllNFxcdWE5ZTYtXFx1YTllZlxcdWE5ZmEtXFx1YTlmZVxcdWFhMDAtXFx1YWEyOFxcdWFhNDAtXFx1YWE0MlxcdWFhNDQtXFx1YWE0YlxcdWFhNjAtXFx1YWE3NlxcdWFhN2FcXHVhYTdlLVxcdWFhYWZcXHVhYWIxXFx1YWFiNVxcdWFhYjZcXHVhYWI5LVxcdWFhYmRcXHVhYWMwXFx1YWFjMlxcdWFhZGItXFx1YWFkZFxcdWFhZTAtXFx1YWFlYVxcdWFhZjItXFx1YWFmNFxcdWFiMDEtXFx1YWIwNlxcdWFiMDktXFx1YWIwZVxcdWFiMTEtXFx1YWIxNlxcdWFiMjAtXFx1YWIyNlxcdWFiMjgtXFx1YWIyZVxcdWFiMzAtXFx1YWI1YVxcdWFiNWMtXFx1YWI2OVxcdWFiNzAtXFx1YWJlMlxcdWFjMDAtXFx1ZDdhM1xcdWQ3YjAtXFx1ZDdjNlxcdWQ3Y2ItXFx1ZDdmYlxcdWY5MDAtXFx1ZmE2ZFxcdWZhNzAtXFx1ZmFkOVxcdWZiMDAtXFx1ZmIwNlxcdWZiMTMtXFx1ZmIxN1xcdWZiMWRcXHVmYjFmLVxcdWZiMjhcXHVmYjJhLVxcdWZiMzZcXHVmYjM4LVxcdWZiM2NcXHVmYjNlXFx1ZmI0MFxcdWZiNDFcXHVmYjQzXFx1ZmI0NFxcdWZiNDYtXFx1ZmJiMVxcdWZiZDMtXFx1ZmQzZFxcdWZkNTAtXFx1ZmQ4ZlxcdWZkOTItXFx1ZmRjN1xcdWZkZjAtXFx1ZmRmYlxcdWZlNzAtXFx1ZmU3NFxcdWZlNzYtXFx1ZmVmY1xcdWZmMjEtXFx1ZmYzYVxcdWZmNDEtXFx1ZmY1YVxcdWZmNjYtXFx1ZmZiZVxcdWZmYzItXFx1ZmZjN1xcdWZmY2EtXFx1ZmZjZlxcdWZmZDItXFx1ZmZkN1xcdWZmZGEtXFx1ZmZkY1wiO1xuLyogcHJldHRpZXItaWdub3JlICovXG5sZXQgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBcIlxcdTIwMGNcXHUyMDBkXFx4YjdcXHUwMzAwLVxcdTAzNmZcXHUwMzg3XFx1MDQ4My1cXHUwNDg3XFx1MDU5MS1cXHUwNWJkXFx1MDViZlxcdTA1YzFcXHUwNWMyXFx1MDVjNFxcdTA1YzVcXHUwNWM3XFx1MDYxMC1cXHUwNjFhXFx1MDY0Yi1cXHUwNjY5XFx1MDY3MFxcdTA2ZDYtXFx1MDZkY1xcdTA2ZGYtXFx1MDZlNFxcdTA2ZTdcXHUwNmU4XFx1MDZlYS1cXHUwNmVkXFx1MDZmMC1cXHUwNmY5XFx1MDcxMVxcdTA3MzAtXFx1MDc0YVxcdTA3YTYtXFx1MDdiMFxcdTA3YzAtXFx1MDdjOVxcdTA3ZWItXFx1MDdmM1xcdTA3ZmRcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwODU5LVxcdTA4NWJcXHUwODk4LVxcdTA4OWZcXHUwOGNhLVxcdTA4ZTFcXHUwOGUzLVxcdTA5MDNcXHUwOTNhLVxcdTA5M2NcXHUwOTNlLVxcdTA5NGZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5NjYtXFx1MDk2ZlxcdTA5ODEtXFx1MDk4M1xcdTA5YmNcXHUwOWJlLVxcdTA5YzRcXHUwOWM3XFx1MDljOFxcdTA5Y2ItXFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTA5ZTYtXFx1MDllZlxcdTA5ZmVcXHUwYTAxLVxcdTBhMDNcXHUwYTNjXFx1MGEzZS1cXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE2Ni1cXHUwYTcxXFx1MGE3NVxcdTBhODEtXFx1MGE4M1xcdTBhYmNcXHUwYWJlLVxcdTBhYzVcXHUwYWM3LVxcdTBhYzlcXHUwYWNiLVxcdTBhY2RcXHUwYWUyXFx1MGFlM1xcdTBhZTYtXFx1MGFlZlxcdTBhZmEtXFx1MGFmZlxcdTBiMDEtXFx1MGIwM1xcdTBiM2NcXHUwYjNlLVxcdTBiNDRcXHUwYjQ3XFx1MGI0OFxcdTBiNGItXFx1MGI0ZFxcdTBiNTUtXFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI2Ni1cXHUwYjZmXFx1MGI4MlxcdTBiYmUtXFx1MGJjMlxcdTBiYzYtXFx1MGJjOFxcdTBiY2EtXFx1MGJjZFxcdTBiZDdcXHUwYmU2LVxcdTBiZWZcXHUwYzAwLVxcdTBjMDRcXHUwYzNjXFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGNmM1xcdTBkMDAtXFx1MGQwM1xcdTBkM2JcXHUwZDNjXFx1MGQzZS1cXHUwZDQ0XFx1MGQ0Ni1cXHUwZDQ4XFx1MGQ0YS1cXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGQ2Ni1cXHUwZDZmXFx1MGQ4MS1cXHUwZDgzXFx1MGRjYVxcdTBkY2YtXFx1MGRkNFxcdTBkZDZcXHUwZGQ4LVxcdTBkZGZcXHUwZGU2LVxcdTBkZWZcXHUwZGYyXFx1MGRmM1xcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZTUwLVxcdTBlNTlcXHUwZWIxXFx1MGViNC1cXHUwZWJjXFx1MGVjOC1cXHUwZWNlXFx1MGVkMC1cXHUwZWQ5XFx1MGYxOFxcdTBmMTlcXHUwZjIwLVxcdTBmMjlcXHUwZjM1XFx1MGYzN1xcdTBmMzlcXHUwZjNlXFx1MGYzZlxcdTBmNzEtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY4ZC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmItXFx1MTAzZVxcdTEwNDAtXFx1MTA0OVxcdTEwNTYtXFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNjItXFx1MTA2NFxcdTEwNjctXFx1MTA2ZFxcdTEwNzEtXFx1MTA3NFxcdTEwODItXFx1MTA4ZFxcdTEwOGYtXFx1MTA5ZFxcdTEzNWQtXFx1MTM1ZlxcdTEzNjktXFx1MTM3MVxcdTE3MTItXFx1MTcxNVxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I0LVxcdTE3ZDNcXHUxN2RkXFx1MTdlMC1cXHUxN2U5XFx1MTgwYi1cXHUxODBkXFx1MTgwZi1cXHUxODE5XFx1MThhOVxcdTE5MjAtXFx1MTkyYlxcdTE5MzAtXFx1MTkzYlxcdTE5NDYtXFx1MTk0ZlxcdTE5ZDAtXFx1MTlkYVxcdTFhMTctXFx1MWExYlxcdTFhNTUtXFx1MWE1ZVxcdTFhNjAtXFx1MWE3Y1xcdTFhN2YtXFx1MWE4OVxcdTFhOTAtXFx1MWE5OVxcdTFhYjAtXFx1MWFiZFxcdTFhYmYtXFx1MWFjZVxcdTFiMDAtXFx1MWIwNFxcdTFiMzQtXFx1MWI0NFxcdTFiNTAtXFx1MWI1OVxcdTFiNmItXFx1MWI3M1xcdTFiODAtXFx1MWI4MlxcdTFiYTEtXFx1MWJhZFxcdTFiYjAtXFx1MWJiOVxcdTFiZTYtXFx1MWJmM1xcdTFjMjQtXFx1MWMzN1xcdTFjNDAtXFx1MWM0OVxcdTFjNTAtXFx1MWM1OVxcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlOFxcdTFjZWRcXHUxY2Y0XFx1MWNmNy1cXHUxY2Y5XFx1MWRjMC1cXHUxZGZmXFx1MjAzZlxcdTIwNDBcXHUyMDU0XFx1MjBkMC1cXHUyMGRjXFx1MjBlMVxcdTIwZTUtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkN2ZcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2MjAtXFx1YTYyOVxcdWE2NmZcXHVhNjc0LVxcdWE2N2RcXHVhNjllXFx1YTY5ZlxcdWE2ZjBcXHVhNmYxXFx1YTgwMlxcdWE4MDZcXHVhODBiXFx1YTgyMy1cXHVhODI3XFx1YTgyY1xcdWE4ODBcXHVhODgxXFx1YThiNC1cXHVhOGM1XFx1YThkMC1cXHVhOGQ5XFx1YThlMC1cXHVhOGYxXFx1YThmZi1cXHVhOTA5XFx1YTkyNi1cXHVhOTJkXFx1YTk0Ny1cXHVhOTUzXFx1YTk4MC1cXHVhOTgzXFx1YTliMy1cXHVhOWMwXFx1YTlkMC1cXHVhOWQ5XFx1YTllNVxcdWE5ZjAtXFx1YTlmOVxcdWFhMjktXFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWE0ZFxcdWFhNTAtXFx1YWE1OVxcdWFhN2ItXFx1YWE3ZFxcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFhZWItXFx1YWFlZlxcdWFhZjVcXHVhYWY2XFx1YWJlMy1cXHVhYmVhXFx1YWJlY1xcdWFiZWRcXHVhYmYwLVxcdWFiZjlcXHVmYjFlXFx1ZmUwMC1cXHVmZTBmXFx1ZmUyMC1cXHVmZTJmXFx1ZmUzM1xcdWZlMzRcXHVmZTRkLVxcdWZlNGZcXHVmZjEwLVxcdWZmMTlcXHVmZjNmXCI7XG5cbmNvbnN0IG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0ID0gbmV3IFJlZ0V4cChcbiAgXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgXCJdXCIsXG4pO1xuY29uc3Qgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cChcbiAgXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgKyBcIl1cIixcbik7XG5cbm5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgPSBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IG51bGw7XG5cbi8vIFRoZXNlIGFyZSBhIHJ1bi1sZW5ndGggYW5kIG9mZnNldC1lbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuLy8gPjB4ZmZmZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBhIHZhbGlkIHBhcnQgb2YgaWRlbnRpZmllcnMuIFRoZVxuLy8gb2Zmc2V0IHN0YXJ0cyBhdCAweDEwMDAwLCBhbmQgZWFjaCBwYWlyIG9mIG51bWJlcnMgcmVwcmVzZW50cyBhblxuLy8gb2Zmc2V0IHRvIHRoZSBuZXh0IHJhbmdlLCBhbmQgdGhlbiBhIHNpemUgb2YgdGhlIHJhbmdlLiBUaGV5IHdlcmVcbi8vIGdlbmVyYXRlZCBieSBgc2NyaXB0cy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3QgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMgPSBbMCwxMSwyLDI1LDIsMTgsMiwxLDIsMTQsMywxMywzNSwxMjIsNzAsNTIsMjY4LDI4LDQsNDgsNDgsMzEsMTQsMjksNiwzNywxMSwyOSwzLDM1LDUsNywyLDQsNDMsMTU3LDE5LDM1LDUsMzUsNSwzOSw5LDUxLDEzLDEwLDIsMTQsMiw2LDIsMSwyLDEwLDIsMTQsMiw2LDIsMSw2OCwzMTAsMTAsMjEsMTEsNywyNSw1LDIsNDEsMiw4LDcwLDUsMywwLDIsNDMsMiwxLDQsMCwzLDIyLDExLDIyLDEwLDMwLDY2LDE4LDIsMSwxMSwyMSwxMSwyNSw3MSw1NSw3LDEsNjUsMCwxNiwzLDIsMiwyLDI4LDQzLDI4LDQsMjgsMzYsNywyLDI3LDI4LDUzLDExLDIxLDExLDE4LDE0LDE3LDExMSw3Miw1Niw1MCwxNCw1MCwxNCwzNSwzNDksNDEsNywxLDc5LDI4LDExLDAsOSwyMSw0MywxNyw0NywyMCwyOCwyMiwxMyw1Miw1OCwxLDMsMCwxNCw0NCwzMywyNCwyNywzNSwzMCwwLDMsMCw5LDM0LDQsMCwxMyw0NywxNSwzLDIyLDAsMiwwLDM2LDE3LDIsMjQsMjAsMSw2NCw2LDIsMCwyLDMsMiwxNCwyLDksOCw0NiwzOSw3LDMsMSwzLDIxLDIsNiwyLDEsMiw0LDQsMCwxOSwwLDEzLDQsMTU5LDUyLDE5LDMsMjEsMiwzMSw0NywyMSwxLDIsMCwxODUsNDYsNDIsMywzNyw0NywyMSwwLDYwLDQyLDE0LDAsNzIsMjYsMzgsNiwxODYsNDMsMTE3LDYzLDMyLDcsMywwLDMsNywyLDEsMiwyMywxNiwwLDIsMCw5NSw3LDMsMzgsMTcsMCwyLDAsMjksMCwxMSwzOSw4LDAsMjIsMCwxMiw0NSwyMCwwLDE5LDcyLDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDI2LDUsMiwxLDIsMzEsMTUsMCwzMjgsMTgsMTYsMCwyLDEyLDIsMzMsMTI1LDAsODAsOTIxLDEwMywxMTAsMTgsMTk1LDI2MzcsOTYsMTYsMTA3MSwxOCw1LDQwMjYsNTgyLDg2MzQsNTY4LDgsMzAsMTgsNzgsMTgsMjksMTksNDcsMTcsMywzMiwyMCw2LDE4LDY4OSw2MywxMjksNzQsNiwwLDY3LDEyLDY1LDEsMiwwLDI5LDYxMzUsOSwxMjM3LDQzLDgsODkzNiwzLDIsNiwyLDEsMiwyOTAsMTYsMCwzMCwyLDMsMCwxNSwzLDksMzk1LDIzMDksMTA2LDYsMTIsNCw4LDgsOSw1OTkxLDg0LDIsNzAsMiwxLDMsMCwzLDEsMywzLDIsMTEsMiwwLDIsNiwyLDY0LDIsMywzLDcsMiw2LDIsMjcsMiwzLDIsNCwyLDAsNCw2LDIsMzM5LDMsMjQsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiw3LDE4NDUsMzAsNyw1LDI2Miw2MSwxNDcsNDQsMTEsNiwxNywwLDMyMiwyOSwxOSw0Myw0ODUsMjcsNzU3LDYsMiwzLDIsMSwyLDE0LDIsMTk2LDYwLDY3LDgsMCwxMjA1LDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzE5LDMzLDQxNTMsNywyMjEsMyw1NzYxLDE1LDc0NzIsMzEwNCw1NDEsMTUwNyw0OTM4LDYsNDE5MV07XG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmNvbnN0IGFzdHJhbElkZW50aWZpZXJDb2RlcyA9IFs1MDksMCwyMjcsMCwxNTAsNCwyOTQsOSwxMzY4LDIsMiwxLDYsMyw0MSwyLDUsMCwxNjYsMSw1NzQsMyw5LDksMzcwLDEsODEsMiw3MSwxMCw1MCwzLDEyMywyLDU0LDE0LDMyLDEwLDMsMSwxMSwzLDQ2LDEwLDgsMCw0Niw5LDcsMiwzNywxMywyLDksNiwxLDQ1LDAsMTMsMiw0OSwxMyw5LDMsMiwxMSw4MywxMSw3LDAsMywwLDE1OCwxMSw2LDksNywzLDU2LDEsMiw2LDMsMSwzLDIsMTAsMCwxMSwxLDMsNiw0LDQsMTkzLDE3LDEwLDksNSwwLDgyLDE5LDEzLDksMjE0LDYsMyw4LDI4LDEsODMsMTYsMTYsOSw4MiwxMiw5LDksODQsMTQsNSw5LDI0MywxNCwxNjYsOSw3MSw1LDIsMSwzLDMsMiwwLDIsMSwxMyw5LDEyMCw2LDMsNiw0LDAsMjksOSw0MSw2LDIsMyw5LDAsMTAsMTAsNDcsMTUsNDA2LDcsMiw3LDE3LDksNTcsMjEsMiwxMywxMjMsNSw0LDAsMiwxLDIsNiwyLDAsOSw5LDQ5LDQsMiwxLDIsNCw5LDksMzMwLDMsMTAsMSwyLDAsNDksNiw0LDQsMTQsOSw1MzUxLDAsNywxNCwxMzgzNSw5LDg3LDksMzksNCw2MCw2LDI2LDksMTAxNCwwLDIsNTQsOCwzLDgyLDAsMTIsMSwxOTYyOCwxLDQ3MDYsNDUsMywyMiw1NDMsNCw0LDUsOSw3LDMsNiwzMSwzLDE0OSwyLDE0MTgsNDksNTEzLDU0LDUsNDksOSwwLDE1LDAsMjMsNCwyLDE0LDEzNjEsNiwyLDE2LDMsNiwyLDEsMiw0LDEwMSwwLDE2MSw2LDEwLDksMzU3LDAsNjIsMTMsNDk5LDEzLDk4Myw2LDExMCw2LDYsOSw0NzU5LDksNzg3NzE5LDIzOV07XG5cbi8vIFRoaXMgaGFzIGEgY29tcGxleGl0eSBsaW5lYXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlLiBUaGVcbi8vIGFzc3VtcHRpb24gaXMgdGhhdCBsb29raW5nIHVwIGFzdHJhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgaXNcbi8vIHJhcmUuXG5mdW5jdGlvbiBpc0luQXN0cmFsU2V0KGNvZGU6IG51bWJlciwgc2V0OiByZWFkb25seSBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBsZXQgcG9zID0gMHgxMDAwMDtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHNldC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgIHBvcyArPSBzZXRbaV07XG4gICAgaWYgKHBvcyA+IGNvZGUpIHJldHVybiBmYWxzZTtcblxuICAgIHBvcyArPSBzZXRbaSArIDFdO1xuICAgIGlmIChwb3MgPj0gY29kZSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBzdGFydHMgYW4gaWRlbnRpZmllci5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ247XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMubG93ZXJjYXNlQSkgcmV0dXJuIGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMubG93ZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikge1xuICAgIHJldHVybiAoXG4gICAgICBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyQ2hhcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMuZGlnaXQwKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ247XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLmNvbG9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMudXBwZXJjYXNlQSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMudXBwZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLmxvd2VyY2FzZUEpIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMudW5kZXJzY29yZTtcbiAgaWYgKGNvZGUgPD0gY2hhckNvZGVzLmxvd2VyY2FzZVopIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8PSAweGZmZmYpIHtcbiAgICByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpO1xuICB9XG4gIHJldHVybiAoXG4gICAgaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcykgfHxcbiAgICBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJDb2RlcylcbiAgKTtcbn1cblxuLy8gVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBuYW1lXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykge1xuICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvblxuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXI6djgvc3JjL2J1aWx0aW5zL2J1aWx0aW5zLXN0cmluZy1nZW4uY2M7bD0xNDU1O2RyYz0yMjFlMzMxYjQ5ZGZlZmFkYmM2ZmE0MGIwYzY4ZTZmOTc2MDZkMGIzO2Jwdj0wO2JwdD0xXG4gICAgLy8gV2UgcmVpbXBsZW1lbnQgYGNvZGVQb2ludEF0YCBiZWNhdXNlIGBjb2RlUG9pbnRBdGAgaXMgYSBWOCBidWlsdGluIHdoaWNoIGlzIG5vdCBpbmxpbmVkIGJ5IFR1cmJvRmFuIChhcyBvZiBNOTEpXG4gICAgLy8gc2luY2UgYG5hbWVgIGlzIG1vc3RseSBBU0NJSSwgYW4gaW5saW5lZCBgY2hhckNvZGVBdGAgd2lucyBoZXJlXG4gICAgbGV0IGNwID0gbmFtZS5jaGFyQ29kZUF0KGkpO1xuICAgIGlmICgoY3AgJiAweGZjMDApID09PSAweGQ4MDAgJiYgaSArIDEgPCBuYW1lLmxlbmd0aCkge1xuICAgICAgY29uc3QgdHJhaWwgPSBuYW1lLmNoYXJDb2RlQXQoKytpKTtcbiAgICAgIGlmICgodHJhaWwgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgY3AgPSAweDEwMDAwICsgKChjcCAmIDB4M2ZmKSA8PCAxMCkgKyAodHJhaWwgJiAweDNmZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICBpZiAoIWlzSWRlbnRpZmllclN0YXJ0KGNwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNJZGVudGlmaWVyQ2hhcihjcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICFpc0ZpcnN0O1xufVxuIiwgImNvbnN0IHJlc2VydmVkV29yZHMgPSB7XG4gIGtleXdvcmQ6IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjYXRjaFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlYnVnZ2VyXCIsXG4gICAgXCJkZWZhdWx0XCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZmluYWxseVwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwiaWZcIixcbiAgICBcInJldHVyblwiLFxuICAgIFwic3dpdGNoXCIsXG4gICAgXCJ0aHJvd1wiLFxuICAgIFwidHJ5XCIsXG4gICAgXCJ2YXJcIixcbiAgICBcImNvbnN0XCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwid2l0aFwiLFxuICAgIFwibmV3XCIsXG4gICAgXCJ0aGlzXCIsXG4gICAgXCJzdXBlclwiLFxuICAgIFwiY2xhc3NcIixcbiAgICBcImV4dGVuZHNcIixcbiAgICBcImV4cG9ydFwiLFxuICAgIFwiaW1wb3J0XCIsXG4gICAgXCJudWxsXCIsXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiaW5cIixcbiAgICBcImluc3RhbmNlb2ZcIixcbiAgICBcInR5cGVvZlwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwiZGVsZXRlXCIsXG4gIF0sXG4gIHN0cmljdDogW1xuICAgIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW50ZXJmYWNlXCIsXG4gICAgXCJsZXRcIixcbiAgICBcInBhY2thZ2VcIixcbiAgICBcInByaXZhdGVcIixcbiAgICBcInByb3RlY3RlZFwiLFxuICAgIFwicHVibGljXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInlpZWxkXCIsXG4gIF0sXG4gIHN0cmljdEJpbmQ6IFtcImV2YWxcIiwgXCJhcmd1bWVudHNcIl0sXG59O1xuY29uc3Qga2V5d29yZHMgPSBuZXcgU2V0KHJlc2VydmVkV29yZHMua2V5d29yZCk7XG5jb25zdCByZXNlcnZlZFdvcmRzU3RyaWN0U2V0ID0gbmV3IFNldChyZXNlcnZlZFdvcmRzLnN0cmljdCk7XG5jb25zdCByZXNlcnZlZFdvcmRzU3RyaWN0QmluZFNldCA9IG5ldyBTZXQocmVzZXJ2ZWRXb3Jkcy5zdHJpY3RCaW5kKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gbm9uLXN0cmljdCBtb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcsIGluTW9kdWxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoaW5Nb2R1bGUgJiYgd29yZCA9PT0gXCJhd2FpdFwiKSB8fCB3b3JkID09PSBcImVudW1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gbm9uLWJpbmRpbmcgc3RyaWN0IG1vZGVcbiAqXG4gKiBJbmNsdWRlcyBub24tc3RyaWN0IHJlc2VydmVkIHdvcmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdFJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcsIGluTW9kdWxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Jlc2VydmVkV29yZCh3b3JkLCBpbk1vZHVsZSkgfHwgcmVzZXJ2ZWRXb3Jkc1N0cmljdFNldC5oYXMod29yZCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHdvcmQgaXMgYSByZXNlcnZlZCB3b3JkIGluIGJpbmRpbmcgc3RyaWN0IG1vZGUsIGJ1dCBpdCBpcyBhbGxvd2VkIGFzXG4gKiBhIG5vcm1hbCBpZGVudGlmaWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc2VydmVkV29yZHNTdHJpY3RCaW5kU2V0Lmhhcyh3b3JkKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gYmluZGluZyBzdHJpY3QgbW9kZVxuICpcbiAqIEluY2x1ZGVzIG5vbi1zdHJpY3QgcmVzZXJ2ZWQgd29yZHMgYW5kIG5vbi1iaW5kaW5nIHN0cmljdCByZXNlcnZlZCB3b3Jkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkKFxuICB3b3JkOiBzdHJpbmcsXG4gIGluTW9kdWxlOiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNTdHJpY3RSZXNlcnZlZFdvcmQod29yZCwgaW5Nb2R1bGUpIHx8IGlzU3RyaWN0QmluZE9ubHlSZXNlcnZlZFdvcmQod29yZClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5d29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGtleXdvcmRzLmhhcyh3b3JkKTtcbn1cbiIsICJleHBvcnQge1xuICBpc0lkZW50aWZpZXJOYW1lLFxuICBpc0lkZW50aWZpZXJDaGFyLFxuICBpc0lkZW50aWZpZXJTdGFydCxcbn0gZnJvbSBcIi4vaWRlbnRpZmllclwiO1xuZXhwb3J0IHtcbiAgaXNSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZE9ubHlSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZFJlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RSZXNlcnZlZFdvcmQsXG4gIGlzS2V5d29yZCxcbn0gZnJvbSBcIi4va2V5d29yZFwiO1xuIiwgImltcG9ydCB7XG4gIGlzSWRlbnRpZmllck5hbWUsXG4gIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkLFxuICBpc0tleXdvcmQsXG59IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBuYW1lYCBpcyBhIHZhbGlkIGlkZW50aWZpZXIgbmFtZVxuICogYW5kIGlzbid0IGEgcmVzZXJ2ZWQgd29yZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZElkZW50aWZpZXIoXG4gIG5hbWU6IHN0cmluZyxcbiAgcmVzZXJ2ZWQ6IGJvb2xlYW4gPSB0cnVlLFxuKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChyZXNlcnZlZCkge1xuICAgIC8vIFwiYXdhaXRcIiBpcyBpbnZhbGlkIGluIG1vZHVsZSwgdmFsaWQgaW4gc2NyaXB0OyBiZXR0ZXIgYmUgc2FmZSAoc2VlICM0OTUyKVxuICAgIGlmIChpc0tleXdvcmQobmFtZSkgfHwgaXNTdHJpY3RSZXNlcnZlZFdvcmQobmFtZSwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNJZGVudGlmaWVyTmFtZShuYW1lKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyBUaGUgZm9sbG93aW5nIGNoYXJhY3RlciBjb2RlcyBhcmUgZm9yYmlkZGVuIGZyb20gYmVpbmdcbi8vIGFuIGltbWVkaWF0ZSBzaWJsaW5nIG9mIE51bWVyaWNMaXRlcmFsU2VwYXJhdG9yIF9cbmNvbnN0IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncyA9IHtcbiAgZGVjQmluT2N0OiBuZXcgU2V0PG51bWJlcj4oW1xuICAgIGNoYXJDb2Rlcy5kb3QsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZUIsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZUUsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZU8sXG4gICAgY2hhckNvZGVzLnVuZGVyc2NvcmUsIC8vIG11bHRpcGxlIHNlcGFyYXRvcnMgYXJlIG5vdCBhbGxvd2VkXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZUIsXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZUUsXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZU8sXG4gIF0pLFxuICBoZXg6IG5ldyBTZXQ8bnVtYmVyPihbXG4gICAgY2hhckNvZGVzLmRvdCxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlWCxcbiAgICBjaGFyQ29kZXMudW5kZXJzY29yZSwgLy8gbXVsdGlwbGUgc2VwYXJhdG9ycyBhcmUgbm90IGFsbG93ZWRcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlWCxcbiAgXSksXG59O1xuXG5jb25zdCBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZyA9IHtcbiAgLy8gMCAtIDFcbiAgYmluOiAoY2g6IG51bWJlcikgPT4gY2ggPT09IGNoYXJDb2Rlcy5kaWdpdDAgfHwgY2ggPT09IGNoYXJDb2Rlcy5kaWdpdDEsXG5cbiAgLy8gMCAtIDdcbiAgb2N0OiAoY2g6IG51bWJlcikgPT4gY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ3LFxuXG4gIC8vIDAgLSA5XG4gIGRlYzogKGNoOiBudW1iZXIpID0+IGNoID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgY2ggPD0gY2hhckNvZGVzLmRpZ2l0OSxcblxuICAvLyAwIC0gOSwgQSAtIEYsIGEgLSBmLFxuICBoZXg6IChjaDogbnVtYmVyKSA9PlxuICAgIChjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDkpIHx8XG4gICAgKGNoID49IGNoYXJDb2Rlcy51cHBlcmNhc2VBICYmIGNoIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VGKSB8fFxuICAgIChjaCA+PSBjaGFyQ29kZXMubG93ZXJjYXNlQSAmJiBjaCA8PSBjaGFyQ29kZXMubG93ZXJjYXNlRiksXG59O1xuXG5leHBvcnQgdHlwZSBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMgPSBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMgJiB7XG4gIHVudGVybWluYXRlZChcbiAgICBpbml0aWFsUG9zOiBudW1iZXIsXG4gICAgaW5pdGlhbExpbmVTdGFydDogbnVtYmVyLFxuICAgIGluaXRpYWxDdXJMaW5lOiBudW1iZXIsXG4gICk6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0cmluZ0NvbnRlbnRzKFxuICB0eXBlOiBcInNpbmdsZVwiIHwgXCJkb3VibGVcIiB8IFwidGVtcGxhdGVcIixcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGVycm9yczogU3RyaW5nQ29udGVudHNFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IGluaXRpYWxQb3MgPSBwb3M7XG4gIGNvbnN0IGluaXRpYWxMaW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gIGNvbnN0IGluaXRpYWxDdXJMaW5lID0gY3VyTGluZTtcblxuICBsZXQgb3V0ID0gXCJcIjtcbiAgbGV0IGZpcnN0SW52YWxpZExvYyA9IG51bGw7XG4gIGxldCBjaHVua1N0YXJ0ID0gcG9zO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gaW5wdXQ7XG4gIGZvciAoOzspIHtcbiAgICBpZiAocG9zID49IGxlbmd0aCkge1xuICAgICAgZXJyb3JzLnVudGVybWluYXRlZChpbml0aWFsUG9zLCBpbml0aWFsTGluZVN0YXJ0LCBpbml0aWFsQ3VyTGluZSk7XG4gICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBjaCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoaXNTdHJpbmdFbmQodHlwZSwgY2gsIGlucHV0LCBwb3MpKSB7XG4gICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5iYWNrc2xhc2gpIHtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgY29uc3QgcmVzID0gcmVhZEVzY2FwZWRDaGFyKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIHR5cGUgPT09IFwidGVtcGxhdGVcIixcbiAgICAgICAgZXJyb3JzLFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuY2ggPT09IG51bGwgJiYgIWZpcnN0SW52YWxpZExvYykge1xuICAgICAgICBmaXJzdEludmFsaWRMb2MgPSB7IHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gcmVzLmNoO1xuICAgICAgfVxuICAgICAgKHsgcG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUgfSA9IHJlcyk7XG4gICAgICBjaHVua1N0YXJ0ID0gcG9zO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaCA9PT0gY2hhckNvZGVzLmxpbmVTZXBhcmF0b3IgfHxcbiAgICAgIGNoID09PSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yXG4gICAgKSB7XG4gICAgICArK3BvcztcbiAgICAgICsrY3VyTGluZTtcbiAgICAgIGxpbmVTdGFydCA9IHBvcztcbiAgICB9IGVsc2UgaWYgKGNoID09PSBjaGFyQ29kZXMubGluZUZlZWQgfHwgY2ggPT09IGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybikge1xuICAgICAgaWYgKHR5cGUgPT09IFwidGVtcGxhdGVcIikge1xuICAgICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKSArIFwiXFxuXCI7XG4gICAgICAgICsrcG9zO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybiAmJlxuICAgICAgICAgIGlucHV0LmNoYXJDb2RlQXQocG9zKSA9PT0gY2hhckNvZGVzLmxpbmVGZWVkXG4gICAgICAgICkge1xuICAgICAgICAgICsrcG9zO1xuICAgICAgICB9XG4gICAgICAgICsrY3VyTGluZTtcbiAgICAgICAgY2h1bmtTdGFydCA9IGxpbmVTdGFydCA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy51bnRlcm1pbmF0ZWQoaW5pdGlhbFBvcywgaW5pdGlhbExpbmVTdGFydCwgaW5pdGlhbEN1ckxpbmUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICArK3BvcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICA/IHsgcG9zLCBzdHI6IG91dCwgZmlyc3RJbnZhbGlkTG9jLCBsaW5lU3RhcnQsIGN1ckxpbmUgfVxuICAgIDoge1xuICAgICAgICBwb3MsXG4gICAgICAgIHN0cjogb3V0LFxuICAgICAgICBmaXJzdEludmFsaWRMb2MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgY29udGFpbnNJbnZhbGlkOiAhIWZpcnN0SW52YWxpZExvYyxcbiAgICAgIH07XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nRW5kKFxuICB0eXBlOiBcInNpbmdsZVwiIHwgXCJkb3VibGVcIiB8IFwidGVtcGxhdGVcIixcbiAgY2g6IG51bWJlcixcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4pIHtcbiAgaWYgKHR5cGUgPT09IFwidGVtcGxhdGVcIikge1xuICAgIHJldHVybiAoXG4gICAgICBjaCA9PT0gY2hhckNvZGVzLmdyYXZlQWNjZW50IHx8XG4gICAgICAoY2ggPT09IGNoYXJDb2Rlcy5kb2xsYXJTaWduICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQocG9zICsgMSkgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSlcbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgY2ggPT09ICh0eXBlID09PSBcImRvdWJsZVwiID8gY2hhckNvZGVzLnF1b3RhdGlvbk1hcmsgOiBjaGFyQ29kZXMuYXBvc3Ryb3BoZSlcbiAgKTtcbn1cblxudHlwZSBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMgPSBIZXhDaGFyRXJyb3JIYW5kbGVycyAmXG4gIENvZGVQb2ludEVycm9ySGFuZGxlcnMgJiB7XG4gICAgc3RyaWN0TnVtZXJpY0VzY2FwZShwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG4gIH07XG5cbmZ1bmN0aW9uIHJlYWRFc2NhcGVkQ2hhcihcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGluVGVtcGxhdGU6IGJvb2xlYW4sXG4gIGVycm9yczogRXNjYXBlZENoYXJFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IHRocm93T25JbnZhbGlkID0gIWluVGVtcGxhdGU7XG4gIHBvcysrOyAvLyBza2lwICdcXCdcblxuICBjb25zdCByZXMgPSAoY2g6IHN0cmluZyB8IG51bGwpID0+ICh7IHBvcywgY2gsIGxpbmVTdGFydCwgY3VyTGluZSB9KTtcblxuICBjb25zdCBjaCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKyspO1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlTjpcbiAgICAgIHJldHVybiByZXMoXCJcXG5cIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlUjpcbiAgICAgIHJldHVybiByZXMoXCJcXHJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlWDoge1xuICAgICAgbGV0IGNvZGU7XG4gICAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRIZXhDaGFyKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIDIsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgKSk7XG4gICAgICByZXR1cm4gcmVzKGNvZGUgPT09IG51bGwgPyBudWxsIDogU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgfVxuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVU6IHtcbiAgICAgIGxldCBjb2RlO1xuICAgICAgKHsgY29kZSwgcG9zIH0gPSByZWFkQ29kZVBvaW50KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApKTtcbiAgICAgIHJldHVybiByZXMoY29kZSA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgfVxuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVQ6XG4gICAgICByZXR1cm4gcmVzKFwiXFx0XCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZUI6XG4gICAgICByZXR1cm4gcmVzKFwiXFxiXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVY6XG4gICAgICByZXR1cm4gcmVzKFwiXFx1MDAwYlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VGOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcZlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybjpcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBvcykgPT09IGNoYXJDb2Rlcy5saW5lRmVlZCkge1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgICBjYXNlIGNoYXJDb2Rlcy5saW5lRmVlZDpcbiAgICAgIGxpbmVTdGFydCA9IHBvcztcbiAgICAgICsrY3VyTGluZTtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgICBjYXNlIGNoYXJDb2Rlcy5saW5lU2VwYXJhdG9yOlxuICAgIGNhc2UgY2hhckNvZGVzLnBhcmFncmFwaFNlcGFyYXRvcjpcbiAgICAgIHJldHVybiByZXMoXCJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMuZGlnaXQ4OlxuICAgIGNhc2UgY2hhckNvZGVzLmRpZ2l0OTpcbiAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiByZXMobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMuc3RyaWN0TnVtZXJpY0VzY2FwZShwb3MgLSAxLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfVxuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ3KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zIC0gMTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5zbGljZShzdGFydFBvcywgcG9zICsgMikubWF0Y2goL15bMC03XSsvKSE7XG5cbiAgICAgICAgbGV0IG9jdGFsU3RyID0gbWF0Y2hbMF07XG5cbiAgICAgICAgbGV0IG9jdGFsID0gcGFyc2VJbnQob2N0YWxTdHIsIDgpO1xuICAgICAgICBpZiAob2N0YWwgPiAyNTUpIHtcbiAgICAgICAgICBvY3RhbFN0ciA9IG9jdGFsU3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gb2N0YWxTdHIubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9jdGFsU3RyICE9PSBcIjBcIiB8fFxuICAgICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5kaWdpdDggfHxcbiAgICAgICAgICBuZXh0ID09PSBjaGFyQ29kZXMuZGlnaXQ5XG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzKG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMuc3RyaWN0TnVtZXJpY0VzY2FwZShzdGFydFBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzKFN0cmluZy5mcm9tQ2hhckNvZGUob2N0YWwpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gIH1cbn1cblxudHlwZSBIZXhDaGFyRXJyb3JIYW5kbGVycyA9IEludEVycm9ySGFuZGxlcnMgJiB7XG4gIGludmFsaWRFc2NhcGVTZXF1ZW5jZShwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG59O1xuXG4vLyBVc2VkIHRvIHJlYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgKCdcXHgnLCAnXFx1JykuXG5mdW5jdGlvbiByZWFkSGV4Q2hhcihcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGxlbjogbnVtYmVyLFxuICBmb3JjZUxlbjogYm9vbGVhbixcbiAgdGhyb3dPbkludmFsaWQ6IGJvb2xlYW4sXG4gIGVycm9yczogSGV4Q2hhckVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgaW5pdGlhbFBvcyA9IHBvcztcbiAgbGV0IG47XG4gICh7IG4sIHBvcyB9ID0gcmVhZEludChcbiAgICBpbnB1dCxcbiAgICBwb3MsXG4gICAgbGluZVN0YXJ0LFxuICAgIGN1ckxpbmUsXG4gICAgMTYsXG4gICAgbGVuLFxuICAgIGZvcmNlTGVuLFxuICAgIGZhbHNlLFxuICAgIGVycm9ycyxcbiAgICAvKiBiYWlsT25FcnJvciAqLyAhdGhyb3dPbkludmFsaWQsXG4gICkpO1xuICBpZiAobiA9PT0gbnVsbCkge1xuICAgIGlmICh0aHJvd09uSW52YWxpZCkge1xuICAgICAgZXJyb3JzLmludmFsaWRFc2NhcGVTZXF1ZW5jZShpbml0aWFsUG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3MgPSBpbml0aWFsUG9zIC0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogbiwgcG9zIH07XG59XG5cbmV4cG9ydCB0eXBlIEludEVycm9ySGFuZGxlcnMgPSB7XG4gIG51bWVyaWNTZXBhcmF0b3JJbkVzY2FwZVNlcXVlbmNlKFxuICAgIHBvczogbnVtYmVyLFxuICAgIGxpbmVTdGFydDogbnVtYmVyLFxuICAgIGN1ckxpbmU6IG51bWJlcixcbiAgKTogdm9pZDtcbiAgdW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICApOiB2b2lkO1xuICAvLyBJdCBjYW4gcmV0dXJuIFwidHJ1ZVwiIHRvIGluZGljYXRlIHRoYXQgdGhlIGVycm9yIHdhcyBoYW5kbGVkXG4gIC8vIGFuZCB0aGUgaW50IHBhcnNpbmcgc2hvdWxkIGNvbnRpbnVlLlxuICBpbnZhbGlkRGlnaXQoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICAgIHJhZGl4OiBudW1iZXIsXG4gICk6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEludChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIHJhZGl4OiBudW1iZXIsXG4gIGxlbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBmb3JjZUxlbjogYm9vbGVhbixcbiAgYWxsb3dOdW1TZXBhcmF0b3I6IGJvb2xlYW4gfCBcImJhaWxcIixcbiAgZXJyb3JzOiBJbnRFcnJvckhhbmRsZXJzLFxuICBiYWlsT25FcnJvcjogYm9vbGVhbixcbikge1xuICBjb25zdCBzdGFydCA9IHBvcztcbiAgY29uc3QgZm9yYmlkZGVuU2libGluZ3MgPVxuICAgIHJhZGl4ID09PSAxNlxuICAgICAgPyBmb3JiaWRkZW5OdW1lcmljU2VwYXJhdG9yU2libGluZ3MuaGV4XG4gICAgICA6IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncy5kZWNCaW5PY3Q7XG4gIGNvbnN0IGlzQWxsb3dlZFNpYmxpbmcgPVxuICAgIHJhZGl4ID09PSAxNlxuICAgICAgPyBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5oZXhcbiAgICAgIDogcmFkaXggPT09IDEwXG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLmRlY1xuICAgICAgOiByYWRpeCA9PT0gOFxuICAgICAgPyBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5vY3RcbiAgICAgIDogaXNBbGxvd2VkTnVtZXJpY1NlcGFyYXRvclNpYmxpbmcuYmluO1xuXG4gIGxldCBpbnZhbGlkID0gZmFsc2U7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpKSB7XG4gICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBsZXQgdmFsO1xuXG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlICYmIGFsbG93TnVtU2VwYXJhdG9yICE9PSBcImJhaWxcIikge1xuICAgICAgY29uc3QgcHJldiA9IGlucHV0LmNoYXJDb2RlQXQocG9zIC0gMSk7XG4gICAgICBjb25zdCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKTtcblxuICAgICAgaWYgKCFhbGxvd051bVNlcGFyYXRvcikge1xuICAgICAgICBpZiAoYmFpbE9uRXJyb3IpIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgICBlcnJvcnMubnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgTnVtYmVyLmlzTmFOKG5leHQpIHx8XG4gICAgICAgICFpc0FsbG93ZWRTaWJsaW5nKG5leHQpIHx8XG4gICAgICAgIGZvcmJpZGRlblNpYmxpbmdzLmhhcyhwcmV2KSB8fFxuICAgICAgICBmb3JiaWRkZW5TaWJsaW5ncy5oYXMobmV4dClcbiAgICAgICkge1xuICAgICAgICBpZiAoYmFpbE9uRXJyb3IpIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgICBlcnJvcnMudW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgdGhpcyBfIGNoYXJhY3RlclxuICAgICAgKytwb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSBjaGFyQ29kZXMubG93ZXJjYXNlQSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy5sb3dlcmNhc2VBICsgY2hhckNvZGVzLmxpbmVGZWVkO1xuICAgIH0gZWxzZSBpZiAoY29kZSA+PSBjaGFyQ29kZXMudXBwZXJjYXNlQSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy51cHBlcmNhc2VBICsgY2hhckNvZGVzLmxpbmVGZWVkO1xuICAgIH0gZWxzZSBpZiAoY2hhckNvZGVzLmlzRGlnaXQoY29kZSkpIHtcbiAgICAgIHZhbCA9IGNvZGUgLSBjaGFyQ29kZXMuZGlnaXQwOyAvLyAwLTlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmICh2YWwgPj0gcmFkaXgpIHtcbiAgICAgIC8vIElmIHdlIGZvdW5kIGEgZGlnaXQgd2hpY2ggaXMgdG9vIGJpZywgZXJyb3JzLmludmFsaWREaWdpdCBjYW4gcmV0dXJuIHRydWUgdG8gYXZvaWRcbiAgICAgIC8vIGJyZWFraW5nIHRoZSBsb29wICh0aGlzIGlzIHVzZWQgZm9yIGVycm9yIHJlY292ZXJ5KS5cbiAgICAgIGlmICh2YWwgPD0gOSAmJiBiYWlsT25FcnJvcikge1xuICAgICAgICByZXR1cm4geyBuOiBudWxsLCBwb3MgfTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbCA8PSA5ICYmXG4gICAgICAgIGVycm9ycy5pbnZhbGlkRGlnaXQocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUsIHJhZGl4KVxuICAgICAgKSB7XG4gICAgICAgIHZhbCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGZvcmNlTGVuKSB7XG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGludmFsaWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgICsrcG9zO1xuICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDtcbiAgfVxuICBpZiAocG9zID09PSBzdGFydCB8fCAobGVuICE9IG51bGwgJiYgcG9zIC0gc3RhcnQgIT09IGxlbikgfHwgaW52YWxpZCkge1xuICAgIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgbjogdG90YWwsIHBvcyB9O1xufVxuXG5leHBvcnQgdHlwZSBDb2RlUG9pbnRFcnJvckhhbmRsZXJzID0gSGV4Q2hhckVycm9ySGFuZGxlcnMgJiB7XG4gIGludmFsaWRDb2RlUG9pbnQocG9zOiBudW1iZXIsIGxpbmVTdGFydDogbnVtYmVyLCBjdXJMaW5lOiBudW1iZXIpOiB2b2lkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb2RlUG9pbnQoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHBvczogbnVtYmVyLFxuICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgY3VyTGluZTogbnVtYmVyLFxuICB0aHJvd09uSW52YWxpZDogYm9vbGVhbixcbiAgZXJyb3JzOiBDb2RlUG9pbnRFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICBsZXQgY29kZTtcblxuICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSkge1xuICAgICsrcG9zO1xuICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICBpbnB1dCxcbiAgICAgIHBvcyxcbiAgICAgIGxpbmVTdGFydCxcbiAgICAgIGN1ckxpbmUsXG4gICAgICBpbnB1dC5pbmRleE9mKFwifVwiLCBwb3MpIC0gcG9zLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgZXJyb3JzLFxuICAgICkpO1xuICAgICsrcG9zO1xuICAgIGlmIChjb2RlICE9PSBudWxsICYmIGNvZGUgPiAweDEwZmZmZikge1xuICAgICAgaWYgKHRocm93T25JbnZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5pbnZhbGlkQ29kZVBvaW50KHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IG51bGwsIHBvcyB9O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRIZXhDaGFyKFxuICAgICAgaW5wdXQsXG4gICAgICBwb3MsXG4gICAgICBsaW5lU3RhcnQsXG4gICAgICBjdXJMaW5lLFxuICAgICAgNCxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICBlcnJvcnMsXG4gICAgKSk7XG4gIH1cbiAgcmV0dXJuIHsgY29kZSwgcG9zIH07XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRFTUVOVF9PUl9CTE9DS19LRVlTID0gW1wiY29uc2VxdWVudFwiLCBcImJvZHlcIiwgXCJhbHRlcm5hdGVcIl07XG5leHBvcnQgY29uc3QgRkxBVFRFTkFCTEVfS0VZUyA9IFtcImJvZHlcIiwgXCJleHByZXNzaW9uc1wiXTtcbmV4cG9ydCBjb25zdCBGT1JfSU5JVF9LRVlTID0gW1wibGVmdFwiLCBcImluaXRcIl07XG5leHBvcnQgY29uc3QgQ09NTUVOVF9LRVlTID0gW1xuICBcImxlYWRpbmdDb21tZW50c1wiLFxuICBcInRyYWlsaW5nQ29tbWVudHNcIixcbiAgXCJpbm5lckNvbW1lbnRzXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTE9HSUNBTF9PUEVSQVRPUlMgPSBbXCJ8fFwiLCBcIiYmXCIsIFwiPz9cIl07XG5leHBvcnQgY29uc3QgVVBEQVRFX09QRVJBVE9SUyA9IFtcIisrXCIsIFwiLS1cIl07XG5cbmV4cG9ydCBjb25zdCBCT09MRUFOX05VTUJFUl9CSU5BUllfT1BFUkFUT1JTID0gW1wiPlwiLCBcIjxcIiwgXCI+PVwiLCBcIjw9XCJdO1xuZXhwb3J0IGNvbnN0IEVRVUFMSVRZX0JJTkFSWV9PUEVSQVRPUlMgPSBbXCI9PVwiLCBcIj09PVwiLCBcIiE9XCIsIFwiIT09XCJdO1xuZXhwb3J0IGNvbnN0IENPTVBBUklTT05fQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgLi4uRVFVQUxJVFlfQklOQVJZX09QRVJBVE9SUyxcbiAgXCJpblwiLFxuICBcImluc3RhbmNlb2ZcIixcbl07XG5leHBvcnQgY29uc3QgQk9PTEVBTl9CSU5BUllfT1BFUkFUT1JTID0gW1xuICAuLi5DT01QQVJJU09OX0JJTkFSWV9PUEVSQVRPUlMsXG4gIC4uLkJPT0xFQU5fTlVNQkVSX0JJTkFSWV9PUEVSQVRPUlMsXG5dO1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9CSU5BUllfT1BFUkFUT1JTID0gW1xuICBcIi1cIixcbiAgXCIvXCIsXG4gIFwiJVwiLFxuICBcIipcIixcbiAgXCIqKlwiLFxuICBcIiZcIixcbiAgXCJ8XCIsXG4gIFwiPj5cIixcbiAgXCI+Pj5cIixcbiAgXCI8PFwiLFxuICBcIl5cIixcbl07XG5leHBvcnQgY29uc3QgQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgXCIrXCIsXG4gIC4uLk5VTUJFUl9CSU5BUllfT1BFUkFUT1JTLFxuICAuLi5CT09MRUFOX0JJTkFSWV9PUEVSQVRPUlMsXG4gIFwifD5cIixcbl07XG5cbmV4cG9ydCBjb25zdCBBU1NJR05NRU5UX09QRVJBVE9SUyA9IFtcbiAgXCI9XCIsXG4gIFwiKz1cIixcbiAgLi4uTlVNQkVSX0JJTkFSWV9PUEVSQVRPUlMubWFwKG9wID0+IG9wICsgXCI9XCIpLFxuICAuLi5MT0dJQ0FMX09QRVJBVE9SUy5tYXAob3AgPT4gb3AgKyBcIj1cIiksXG5dO1xuXG5leHBvcnQgY29uc3QgQk9PTEVBTl9VTkFSWV9PUEVSQVRPUlMgPSBbXCJkZWxldGVcIiwgXCIhXCJdO1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9VTkFSWV9PUEVSQVRPUlMgPSBbXCIrXCIsIFwiLVwiLCBcIn5cIl07XG5leHBvcnQgY29uc3QgU1RSSU5HX1VOQVJZX09QRVJBVE9SUyA9IFtcInR5cGVvZlwiXTtcbmV4cG9ydCBjb25zdCBVTkFSWV9PUEVSQVRPUlMgPSBbXG4gIFwidm9pZFwiLFxuICBcInRocm93XCIsXG4gIC4uLkJPT0xFQU5fVU5BUllfT1BFUkFUT1JTLFxuICAuLi5OVU1CRVJfVU5BUllfT1BFUkFUT1JTLFxuICAuLi5TVFJJTkdfVU5BUllfT1BFUkFUT1JTLFxuXTtcblxuZXhwb3J0IGNvbnN0IElOSEVSSVRfS0VZUyA9IHtcbiAgb3B0aW9uYWw6IFtcInR5cGVBbm5vdGF0aW9uXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyZXR1cm5UeXBlXCJdLFxuICBmb3JjZTogW1wic3RhcnRcIiwgXCJsb2NcIiwgXCJlbmRcIl0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQkxPQ0tfU0NPUEVEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJ2YXIgdXNlZCB0byBiZSBibG9jayBzY29wZWRcIik7XG5leHBvcnQgY29uc3QgTk9UX0xPQ0FMX0JJTkRJTkcgPSBTeW1ib2wuZm9yKFxuICBcInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhIGxvY2FsIGJpbmRpbmdcIixcbik7XG4iLCAiaW1wb3J0IGlzIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpZWxkLCB2YWxpZGF0ZUNoaWxkIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGNvbnN0IFZJU0lUT1JfS0VZUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5leHBvcnQgY29uc3QgQUxJQVNfS0VZUzogUGFydGlhbDxSZWNvcmQ8Tm9kZVR5cGVzV2l0aG91dENvbW1lbnQsIHN0cmluZ1tdPj4gPVxuICB7fTtcbmV4cG9ydCBjb25zdCBGTElQUEVEX0FMSUFTX0tFWVM6IFJlY29yZDxzdHJpbmcsIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50W10+ID0ge307XG5leHBvcnQgY29uc3QgTk9ERV9GSUVMRFM6IFJlY29yZDxzdHJpbmcsIEZpZWxkRGVmaW5pdGlvbnM+ID0ge307XG5leHBvcnQgY29uc3QgQlVJTERFUl9LRVlTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbmV4cG9ydCBjb25zdCBERVBSRUNBVEVEX0tFWVM6IFJlY29yZDxzdHJpbmcsIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50PiA9IHt9O1xuZXhwb3J0IGNvbnN0IE5PREVfUEFSRU5UX1ZBTElEQVRJT05TOiBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3I+ID0ge307XG5cbmZ1bmN0aW9uIGdldFR5cGUodmFsOiBhbnkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBcImFycmF5XCI7XG4gIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0eXBlb2YgdmFsO1xuICB9XG59XG5cbnR5cGUgTm9kZVR5cGVzV2l0aG91dENvbW1lbnQgPSB0Lk5vZGVbXCJ0eXBlXCJdIHwga2V5b2YgdC5BbGlhc2VzO1xuXG50eXBlIE5vZGVUeXBlcyA9IE5vZGVUeXBlc1dpdGhvdXRDb21tZW50IHwgdC5Db21tZW50W1widHlwZVwiXTtcblxudHlwZSBQcmltaXRpdmVUeXBlcyA9IFJldHVyblR5cGU8dHlwZW9mIGdldFR5cGU+O1xuXG50eXBlIEZpZWxkRGVmaW5pdGlvbnMgPSB7XG4gIFt4OiBzdHJpbmddOiBGaWVsZE9wdGlvbnM7XG59O1xuXG50eXBlIERlZmluZVR5cGVPcHRzID0ge1xuICBmaWVsZHM/OiBGaWVsZERlZmluaXRpb25zO1xuICB2aXNpdG9yPzogQXJyYXk8c3RyaW5nPjtcbiAgYWxpYXNlcz86IEFycmF5PHN0cmluZz47XG4gIGJ1aWxkZXI/OiBBcnJheTxzdHJpbmc+O1xuICBpbmhlcml0cz86IE5vZGVUeXBlcztcbiAgZGVwcmVjYXRlZEFsaWFzPzogc3RyaW5nO1xuICB2YWxpZGF0ZT86IFZhbGlkYXRvcjtcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvciA9IChcbiAgfCB7IHR5cGU6IFByaW1pdGl2ZVR5cGVzIH1cbiAgfCB7IGVhY2g6IFZhbGlkYXRvciB9XG4gIHwgeyBjaGFpbk9mOiBWYWxpZGF0b3JbXSB9XG4gIHwgeyBvbmVPZjogYW55W10gfVxuICB8IHsgb25lT2ZOb2RlVHlwZXM6IE5vZGVUeXBlc1tdIH1cbiAgfCB7IG9uZU9mTm9kZU9yVmFsdWVUeXBlczogKE5vZGVUeXBlcyB8IFByaW1pdGl2ZVR5cGVzKVtdIH1cbiAgfCB7IHNoYXBlT2Y6IHsgW3g6IHN0cmluZ106IEZpZWxkT3B0aW9ucyB9IH1cbiAgfCB7fVxuKSAmXG4gICgobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IHZvaWQpO1xuXG5leHBvcnQgdHlwZSBGaWVsZE9wdGlvbnMgPSB7XG4gIGRlZmF1bHQ/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgW107XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPzogVmFsaWRhdG9yO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbGlkYXRlOiBWYWxpZGF0b3IpOiBGaWVsZE9wdGlvbnMge1xuICByZXR1cm4geyB2YWxpZGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZUlzKHR5cGVOYW1lOiBOb2RlVHlwZXMgfCBOb2RlVHlwZXNbXSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGVOYW1lID09PSBcInN0cmluZ1wiXG4gICAgPyBhc3NlcnROb2RlVHlwZSh0eXBlTmFtZSlcbiAgICA6IGFzc2VydE5vZGVUeXBlKC4uLnR5cGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZSh0eXBlTmFtZTogTm9kZVR5cGVzIHwgTm9kZVR5cGVzW10pIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHR5cGVJcyh0eXBlTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25hbCh2YWxpZGF0ZTogVmFsaWRhdG9yKTogRmllbGRPcHRpb25zIHtcbiAgcmV0dXJuIHsgdmFsaWRhdGUsIG9wdGlvbmFsOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcbiAgdHlwZU5hbWU6IE5vZGVUeXBlcyB8IE5vZGVUeXBlc1tdLFxuKTogRmllbGRPcHRpb25zIHtcbiAgcmV0dXJuIHsgdmFsaWRhdGU6IHR5cGVJcyh0eXBlTmFtZSksIG9wdGlvbmFsOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheU9mKGVsZW1lbnRUeXBlOiBWYWxpZGF0b3IpOiBWYWxpZGF0b3Ige1xuICByZXR1cm4gY2hhaW4oYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksIGFzc2VydEVhY2goZWxlbWVudFR5cGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5T2ZUeXBlKHR5cGVOYW1lOiBOb2RlVHlwZXMgfCBOb2RlVHlwZXNbXSkge1xuICByZXR1cm4gYXJyYXlPZih0eXBlSXModHlwZU5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXlPZlR5cGUodHlwZU5hbWU6IE5vZGVUeXBlcyB8IE5vZGVUeXBlc1tdKSB7XG4gIHJldHVybiB2YWxpZGF0ZShhcnJheU9mVHlwZSh0eXBlTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RWFjaChjYWxsYmFjazogVmFsaWRhdG9yKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdG9yKG5vZGU6IHQuTm9kZSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJrZXkgPSBgJHtrZXl9WyR7aX1dYDtcbiAgICAgIGNvbnN0IHYgPSB2YWxbaV07XG4gICAgICBjYWxsYmFjayhub2RlLCBzdWJrZXksIHYpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHZhbGlkYXRlQ2hpbGQobm9kZSwgc3Via2V5LCB2KTtcbiAgICB9XG4gIH1cbiAgdmFsaWRhdG9yLmVhY2ggPSBjYWxsYmFjaztcbiAgcmV0dXJuIHZhbGlkYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9uZU9mKC4uLnZhbHVlczogQXJyYXk8YW55Pik6IFZhbGlkYXRvciB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGU6IGFueSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbCkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgUHJvcGVydHkgJHtrZXl9IGV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgKX0gYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUub25lT2YgPSB2YWx1ZXM7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9kZVR5cGUoLi4udHlwZXM6IE5vZGVUeXBlc1tdKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmIChpcyh0eXBlLCB2YWwpKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hpbGQobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBQcm9wZXJ0eSAke2tleX0gb2YgJHtcbiAgICAgICAgbm9kZS50eXBlXG4gICAgICB9IGV4cGVjdGVkIG5vZGUgdG8gYmUgb2YgYSB0eXBlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHR5cGVzLFxuICAgICAgKX0gYnV0IGluc3RlYWQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsPy50eXBlKX1gLFxuICAgICk7XG4gIH1cblxuICB2YWxpZGF0ZS5vbmVPZk5vZGVUeXBlcyA9IHR5cGVzO1xuXG4gIHJldHVybiB2YWxpZGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vZGVPclZhbHVlVHlwZShcbiAgLi4udHlwZXM6IChOb2RlVHlwZXMgfCBQcmltaXRpdmVUeXBlcylbXVxuKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmIChnZXRUeXBlKHZhbCkgPT09IHR5cGUgfHwgaXModHlwZSwgdmFsKSkge1xuICAgICAgICB2YWxpZGF0ZUNoaWxkKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgUHJvcGVydHkgJHtrZXl9IG9mICR7XG4gICAgICAgIG5vZGUudHlwZVxuICAgICAgfSBleHBlY3RlZCBub2RlIHRvIGJlIG9mIGEgdHlwZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0eXBlcyxcbiAgICAgICl9IGJ1dCBpbnN0ZWFkIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbD8udHlwZSl9YCxcbiAgICApO1xuICB9XG5cbiAgdmFsaWRhdGUub25lT2ZOb2RlT3JWYWx1ZVR5cGVzID0gdHlwZXM7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsdWVUeXBlKHR5cGU6IFByaW1pdGl2ZVR5cGVzKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBjb25zdCB2YWxpZCA9IGdldFR5cGUodmFsKSA9PT0gdHlwZTtcblxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBQcm9wZXJ0eSAke2tleX0gZXhwZWN0ZWQgdHlwZSBvZiAke3R5cGV9IGJ1dCBnb3QgJHtnZXRUeXBlKHZhbCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUudHlwZSA9IHR5cGU7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2hhcGUoc2hhcGU6IHsgW3g6IHN0cmluZ106IEZpZWxkT3B0aW9ucyB9KTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHNoYXBlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVGaWVsZChub2RlLCBwcm9wZXJ0eSwgdmFsW3Byb3BlcnR5XSwgc2hhcGVbcHJvcGVydHldKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFByb3BlcnR5ICR7a2V5fSBvZiAke1xuICAgICAgICAgIG5vZGUudHlwZVxuICAgICAgICB9IGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZzpcXG4ke2Vycm9ycy5qb2luKFwiXFxuXCIpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlLnNoYXBlT2YgPSBzaGFwZTtcblxuICByZXR1cm4gdmFsaWRhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPcHRpb25hbENoYWluU3RhcnQoKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IGN1cnJlbnQ7XG4gICAgICBpZiAodHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQub3B0aW9uYWwpIHJldHVybjtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2FsbGVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQub3B0aW9uYWwpIHJldHVybjtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub2JqZWN0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBOb24tb3B0aW9uYWwgJHtub2RlLnR5cGV9IG11c3QgY2hhaW4gZnJvbSBhbiBvcHRpb25hbCBPcHRpb25hbE1lbWJlckV4cHJlc3Npb24gb3IgT3B0aW9uYWxDYWxsRXhwcmVzc2lvbi4gRm91bmQgY2hhaW4gZnJvbSAke2N1cnJlbnQ/LnR5cGV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhaW4oLi4uZm5zOiBBcnJheTxWYWxpZGF0b3I+KTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUoLi4uYXJnczogUGFyYW1ldGVyczxWYWxpZGF0b3I+KSB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZS5jaGFpbk9mID0gZm5zO1xuXG4gIGlmIChcbiAgICBmbnMubGVuZ3RoID49IDIgJiZcbiAgICBcInR5cGVcIiBpbiBmbnNbMF0gJiZcbiAgICBmbnNbMF0udHlwZSA9PT0gXCJhcnJheVwiICYmXG4gICAgIShcImVhY2hcIiBpbiBmbnNbMV0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBbiBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSB2YWxpZGF0b3IgY2FuIG9ubHkgYmUgZm9sbG93ZWQgYnkgYW4gYXNzZXJ0RWFjaCguLi4pIHZhbGlkYXRvci5gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGU7XG59XG5cbmNvbnN0IHZhbGlkVHlwZU9wdHMgPSBbXG4gIFwiYWxpYXNlc1wiLFxuICBcImJ1aWxkZXJcIixcbiAgXCJkZXByZWNhdGVkQWxpYXNcIixcbiAgXCJmaWVsZHNcIixcbiAgXCJpbmhlcml0c1wiLFxuICBcInZpc2l0b3JcIixcbiAgXCJ2YWxpZGF0ZVwiLFxuXTtcbmNvbnN0IHZhbGlkRmllbGRLZXlzID0gW1wiZGVmYXVsdFwiLCBcIm9wdGlvbmFsXCIsIFwiZGVwcmVjYXRlZFwiLCBcInZhbGlkYXRlXCJdO1xuXG5jb25zdCBzdG9yZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIERlZmluZVR5cGVPcHRzPjtcblxuLy8gV3JhcHMgZGVmaW5lVHlwZSB0byBlbnN1cmUgdGhlc2UgYWxpYXNlcyBhcmUgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQWxpYXNlZFR5cGUoLi4uYWxpYXNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuICh0eXBlOiBzdHJpbmcsIG9wdHM6IERlZmluZVR5cGVPcHRzID0ge30pID0+IHtcbiAgICBsZXQgZGVmaW5lZCA9IG9wdHMuYWxpYXNlcztcbiAgICBpZiAoIWRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRzLmluaGVyaXRzKSBkZWZpbmVkID0gc3RvcmVbb3B0cy5pbmhlcml0c10uYWxpYXNlcz8uc2xpY2UoKTtcbiAgICAgIGRlZmluZWQgPz89IFtdO1xuICAgICAgb3B0cy5hbGlhc2VzID0gZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IGFsaWFzZXMuZmlsdGVyKGEgPT4gIWRlZmluZWQuaW5jbHVkZXMoYSkpO1xuICAgIGRlZmluZWQudW5zaGlmdCguLi5hZGRpdGlvbmFsKTtcbiAgICBkZWZpbmVUeXBlKHR5cGUsIG9wdHMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZpbmVUeXBlKHR5cGU6IHN0cmluZywgb3B0czogRGVmaW5lVHlwZU9wdHMgPSB7fSkge1xuICBjb25zdCBpbmhlcml0cyA9IChvcHRzLmluaGVyaXRzICYmIHN0b3JlW29wdHMuaW5oZXJpdHNdKSB8fCB7fTtcblxuICBsZXQgZmllbGRzID0gb3B0cy5maWVsZHM7XG4gIGlmICghZmllbGRzKSB7XG4gICAgZmllbGRzID0ge307XG4gICAgaWYgKGluaGVyaXRzLmZpZWxkcykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaGVyaXRzLmZpZWxkcyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gaW5oZXJpdHMuZmllbGRzW2tleV07XG4gICAgICAgIGNvbnN0IGRlZiA9IGZpZWxkLmRlZmF1bHQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlZikgPyBkZWYubGVuZ3RoID4gMCA6IGRlZiAmJiB0eXBlb2YgZGVmID09PSBcIm9iamVjdFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiZmllbGQgZGVmYXVsdHMgY2FuIG9ubHkgYmUgcHJpbWl0aXZlcyBvciBlbXB0eSBhcnJheXMgY3VycmVudGx5XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICBkZWZhdWx0OiBBcnJheS5pc0FycmF5KGRlZikgPyBbXSA6IGRlZixcbiAgICAgICAgICBvcHRpb25hbDogZmllbGQub3B0aW9uYWwsXG4gICAgICAgICAgZGVwcmVjYXRlZDogZmllbGQuZGVwcmVjYXRlZCxcbiAgICAgICAgICB2YWxpZGF0ZTogZmllbGQudmFsaWRhdGUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdmlzaXRvcjogQXJyYXk8c3RyaW5nPiA9IG9wdHMudmlzaXRvciB8fCBpbmhlcml0cy52aXNpdG9yIHx8IFtdO1xuICBjb25zdCBhbGlhc2VzOiBBcnJheTxzdHJpbmc+ID0gb3B0cy5hbGlhc2VzIHx8IGluaGVyaXRzLmFsaWFzZXMgfHwgW107XG4gIGNvbnN0IGJ1aWxkZXI6IEFycmF5PHN0cmluZz4gPVxuICAgIG9wdHMuYnVpbGRlciB8fCBpbmhlcml0cy5idWlsZGVyIHx8IG9wdHMudmlzaXRvciB8fCBbXTtcblxuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob3B0cykpIHtcbiAgICBpZiAodmFsaWRUeXBlT3B0cy5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb3B0aW9uIFwiJHtrfVwiIG9uICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kZXByZWNhdGVkQWxpYXMpIHtcbiAgICBERVBSRUNBVEVEX0tFWVNbb3B0cy5kZXByZWNhdGVkQWxpYXNdID0gdHlwZSBhcyBOb2RlVHlwZXNXaXRob3V0Q29tbWVudDtcbiAgfVxuXG4gIC8vIGVuc3VyZSBhbGwgZmllbGQga2V5cyBhcmUgcmVwcmVzZW50ZWQgaW4gYGZpZWxkc2BcbiAgZm9yIChjb25zdCBrZXkgb2YgdmlzaXRvci5jb25jYXQoYnVpbGRlcikpIHtcbiAgICBmaWVsZHNba2V5XSA9IGZpZWxkc1trZXldIHx8IHt9O1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2tleV07XG5cbiAgICBpZiAoZmllbGQuZGVmYXVsdCAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkZXIuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgZmllbGQub3B0aW9uYWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZC5kZWZhdWx0ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWxpZGF0ZSAmJiBmaWVsZC5kZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgIGZpZWxkLnZhbGlkYXRlID0gYXNzZXJ0VmFsdWVUeXBlKGdldFR5cGUoZmllbGQuZGVmYXVsdCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmICh2YWxpZEZpZWxkS2V5cy5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmllbGQga2V5IFwiJHtrfVwiIG9uICR7dHlwZX0uJHtrZXl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgVklTSVRPUl9LRVlTW3R5cGVdID0gb3B0cy52aXNpdG9yID0gdmlzaXRvcjtcbiAgQlVJTERFUl9LRVlTW3R5cGVdID0gb3B0cy5idWlsZGVyID0gYnVpbGRlcjtcbiAgTk9ERV9GSUVMRFNbdHlwZV0gPSBvcHRzLmZpZWxkcyA9IGZpZWxkcztcbiAgQUxJQVNfS0VZU1t0eXBlIGFzIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50XSA9IG9wdHMuYWxpYXNlcyA9IGFsaWFzZXM7XG4gIGFsaWFzZXMuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgRkxJUFBFRF9BTElBU19LRVlTW2FsaWFzXSA9IEZMSVBQRURfQUxJQVNfS0VZU1thbGlhc10gfHwgW107XG4gICAgRkxJUFBFRF9BTElBU19LRVlTW2FsaWFzXS5wdXNoKHR5cGUgYXMgTm9kZVR5cGVzV2l0aG91dENvbW1lbnQpO1xuICB9KTtcblxuICBpZiAob3B0cy52YWxpZGF0ZSkge1xuICAgIE5PREVfUEFSRU5UX1ZBTElEQVRJT05TW3R5cGVdID0gb3B0cy52YWxpZGF0ZTtcbiAgfVxuXG4gIHN0b3JlW3R5cGVdID0gb3B0cztcbn1cbiIsICJpbXBvcnQgaXMgZnJvbSBcIi4uL3ZhbGlkYXRvcnMvaXNcIjtcbmltcG9ydCBpc1ZhbGlkSWRlbnRpZmllciBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1ZhbGlkSWRlbnRpZmllclwiO1xuaW1wb3J0IHsgaXNLZXl3b3JkLCBpc1Jlc2VydmVkV29yZCB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyByZWFkU3RyaW5nQ29udGVudHMgfSBmcm9tIFwiQGJhYmVsL2hlbHBlci1zdHJpbmctcGFyc2VyXCI7XG5cbmltcG9ydCB7XG4gIEJJTkFSWV9PUEVSQVRPUlMsXG4gIExPR0lDQUxfT1BFUkFUT1JTLFxuICBBU1NJR05NRU5UX09QRVJBVE9SUyxcbiAgVU5BUllfT1BFUkFUT1JTLFxuICBVUERBVEVfT1BFUkFUT1JTLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGRlZmluZUFsaWFzZWRUeXBlLFxuICBhc3NlcnRTaGFwZSxcbiAgYXNzZXJ0T3B0aW9uYWxDaGFpblN0YXJ0LFxuICBhc3NlcnRWYWx1ZVR5cGUsXG4gIGFzc2VydE5vZGVUeXBlLFxuICBhc3NlcnROb2RlT3JWYWx1ZVR5cGUsXG4gIGFzc2VydEVhY2gsXG4gIGNoYWluLFxuICBhc3NlcnRPbmVPZixcbiAgdmFsaWRhdGVPcHRpb25hbCxcbiAgdHlwZSBWYWxpZGF0b3IsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGRlZmluZVR5cGUgPSBkZWZpbmVBbGlhc2VkVHlwZShcIlN0YW5kYXJkaXplZFwiKTtcblxuZGVmaW5lVHlwZShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gIGZpZWxkczoge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVPclZhbHVlVHlwZShcIm51bGxcIiwgXCJFeHByZXNzaW9uXCIsIFwiU3ByZWFkRWxlbWVudFwiKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORyA/IFtdIDogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImVsZW1lbnRzXCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7XG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSB7XG4gICAgICAgICAgcmV0dXJuIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBhc3NlcnRPbmVPZiguLi5BU1NJR05NRU5UX09QRVJBVE9SUyk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBhc3NlcnRPbmVPZihcIj1cIik7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlOiB0LkFzc2lnbm1lbnRFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGlzKFwiUGF0dGVyblwiLCBub2RlLmxlZnQpID8gcGF0dGVybiA6IGlkZW50aWZpZXI7XG4gICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIkxWYWxcIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgXCJNZW1iZXJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgICAgICksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxuICBidWlsZGVyOiBbXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiXSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCaW5hcnlFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoLi4uQklOQVJZX09QRVJBVE9SUyksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcbiAgICAgICAgY29uc3QgaW5PcCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiLCBcIlByaXZhdGVOYW1lXCIpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5CaW5hcnlFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5vcGVyYXRvciA9PT0gXCJpblwiID8gaW5PcCA6IGV4cHJlc3Npb247XG4gICAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgIH0gYXMgVmFsaWRhdG9yLFxuICAgICAgICAgIC8vIHRvZG8odHMpOiBjYW4gYmUgZGlzY3JpbWluYXRlZCB1bmlvbiBieSBgb3BlcmF0b3JgIHByb3BlcnR5XG4gICAgICAgICAgeyBvbmVPZk5vZGVUeXBlczogW1wiRXhwcmVzc2lvblwiLCBcIlByaXZhdGVOYW1lXCJdIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJCaW5hcnlcIiwgXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEaXJlY3RpdmVcIiwge1xuICB2aXNpdG9yOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkRpcmVjdGl2ZUxpdGVyYWxcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGlyZWN0aXZlTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJkaXJlY3RpdmVzXCJdLFxuICB2aXNpdG9yOiBbXCJkaXJlY3RpdmVzXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGlyZWN0aXZlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRpcmVjdGl2ZVwiKSksXG4gICAgICApLFxuICAgICAgZGVmYXVsdDogW10sXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJCbG9ja1BhcmVudFwiLCBcIkJsb2NrXCIsIFwiU3RhdGVtZW50XCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCcmVha1N0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImxhYmVsXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsYWJlbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIlRlcm1pbmF0b3JsZXNzXCIsIFwiQ29tcGxldGlvblN0YXRlbWVudFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2FsbEV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJjYWxsZWVcIiwgXCJhcmd1bWVudHNcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInR5cGVBcmd1bWVudHNcIl0sXG4gIGJ1aWxkZXI6IFtcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgY2FsbGVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiU3VwZXJcIiwgXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgICBhcmd1bWVudHM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFwiU3ByZWFkRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJKU1hOYW1lc3BhY2VkTmFtZVwiLFxuICAgICAgICAgICAgXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgID8ge1xuICAgICAgICAgIG9wdGlvbmFsOiB7XG4gICAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YodHJ1ZSwgZmFsc2UpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgdHlwZUFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2F0Y2hDbGF1c2VcIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbVwiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiQXJyYXlQYXR0ZXJuXCIsIFwiT2JqZWN0UGF0dGVyblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJCbG9ja1BhcmVudFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBjb25zZXF1ZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgYWx0ZXJuYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJDb25kaXRpb25hbFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ29udGludWVTdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJsYWJlbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgbGFiZWw6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJUZXJtaW5hdG9ybGVzc1wiLCBcIkNvbXBsZXRpb25TdGF0ZW1lbnRcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlYnVnZ2VyU3RhdGVtZW50XCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJEb1doaWxlU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJMb29wXCIsIFwiV2hpbGVcIiwgXCJTY29wYWJsZVwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW1wdHlTdGF0ZW1lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkV4cHJlc3Npb25XcmFwcGVyXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJGaWxlXCIsIHtcbiAgYnVpbGRlcjogW1wicHJvZ3JhbVwiLCBcImNvbW1lbnRzXCIsIFwidG9rZW5zXCJdLFxuICB2aXNpdG9yOiBbXCJwcm9ncmFtXCJdLFxuICBmaWVsZHM6IHtcbiAgICBwcm9ncmFtOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJQcm9ncmFtXCIpLFxuICAgIH0sXG4gICAgY29tbWVudHM6IHtcbiAgICAgIHZhbGlkYXRlOiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgICA/IE9iamVjdC5hc3NpZ24oKCkgPT4ge30sIHtcbiAgICAgICAgICAgIGVhY2g6IHsgb25lT2ZOb2RlVHlwZXM6IFtcIkNvbW1lbnRCbG9ja1wiLCBcIkNvbW1lbnRMaW5lXCJdIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiQ29tbWVudEJsb2NrXCIsIFwiQ29tbWVudExpbmVcIikpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB0b2tlbnM6IHtcbiAgICAgIC8vIHRvZG8odHMpOiBhZGQgVG9rZW4gdHlwZVxuICAgICAgdmFsaWRhdGU6IGFzc2VydEVhY2goT2JqZWN0LmFzc2lnbigoKSA9PiB7fSwgeyB0eXBlOiBcImFueVwiIH0pKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkZvckluU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCIsIFwiYm9keVwiXSxcbiAgYWxpYXNlczogW1xuICAgIFwiU2NvcGFibGVcIixcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRm9yXCIsXG4gICAgXCJCbG9ja1BhcmVudFwiLFxuICAgIFwiTG9vcFwiLFxuICAgIFwiRm9yWFN0YXRlbWVudFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwgXCJMVmFsXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgXCJNZW1iZXJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgICAgICksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGb3JTdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJpbml0XCIsIFwidGVzdFwiLCBcInVwZGF0ZVwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiU3RhdGVtZW50XCIsIFwiRm9yXCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJMb29wXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpbml0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdGVzdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdXBkYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25Db21tb24gPSAoKSA9PiAoe1xuICBwYXJhbXM6IHtcbiAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiUGF0dGVyblwiLCBcIlJlc3RFbGVtZW50XCIpKSxcbiAgICApLFxuICB9LFxuICBnZW5lcmF0b3I6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgYXN5bmM6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vbiA9ICgpID0+ICh7XG4gIHJldHVyblR5cGU6IHtcbiAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlR5cGVBbm5vdGF0aW9uXCIsIFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgXCJUU1R5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgXCJOb29wXCIsXG4gICAgICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKVxuICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbiA9ICgpID0+ICh7XG4gIC4uLmZ1bmN0aW9uQ29tbW9uKCksXG4gIGRlY2xhcmU6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAgaWQ6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLCAvLyBNYXkgYmUgbnVsbCBmb3IgYGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uYFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiYXN5bmNcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcInJldHVyblR5cGVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICAgIHByZWRpY2F0ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRGVjbGFyZWRQcmVkaWNhdGVcIiwgXCJJbmZlcnJlZFByZWRpY2F0ZVwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlNjb3BhYmxlXCIsXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJTdGF0ZW1lbnRcIixcbiAgICBcIlB1cmVpc2hcIixcbiAgICBcIkRlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuICgpID0+IHt9O1xuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAocGFyZW50LCBrZXksIG5vZGUpIHtcbiAgICAgIGlmICghaXMoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiwgcGFyZW50KSkge1xuICAgICAgICBpZGVudGlmaWVyKG5vZGUsIFwiaWRcIiwgbm9kZS5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIsIHtcbiAgaW5oZXJpdHM6IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxuICBhbGlhc2VzOiBbXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiRnVuY3Rpb25cIixcbiAgICBcIkJsb2NrUGFyZW50XCIsXG4gICAgXCJGdW5jdGlvblBhcmVudFwiLFxuICAgIFwiRXhwcmVzc2lvblwiLFxuICAgIFwiUHVyZWlzaFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5mdW5jdGlvbkNvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgICBwcmVkaWNhdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIsIFwiSW5mZXJyZWRQcmVkaWNhdGVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBwYXR0ZXJuTGlrZUNvbW1vbiA9ICgpID0+ICh7XG4gIHR5cGVBbm5vdGF0aW9uOiB7XG4gICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgIFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICAgIFwiTm9vcFwiLFxuICAgICAgICApLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBvcHRpb25hbDoge1xuICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBkZWNvcmF0b3JzOiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICApLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJZGVudGlmaWVyXCIsIHtcbiAgYnVpbGRlcjogW1wibmFtZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIiwgXCJkZWNvcmF0b3JzXCIgLyogZm9yIGxlZ2FjeSBwYXJhbSBkZWNvcmF0b3JzICovXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5MaWtlXCIsIFwiTFZhbFwiLCBcIlRTRW50aXR5TmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZSwga2V5LCB2YWwpIHtcbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHZhbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFwiJHt2YWx9XCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllciBuYW1lYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICBjb25zdCBtYXRjaCA9IC9cXC4oXFx3KykkLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuXG4gICAgY29uc3QgWywgcGFyZW50S2V5XSA9IG1hdGNoO1xuICAgIGNvbnN0IG5vbkNvbXAgPSB7IGNvbXB1dGVkOiBmYWxzZSB9O1xuXG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaWYgYHBhcmVudC5wcm9wZXJ0eSA9PT0gbm9kZWAsIGJlY2F1c2Ugbm9kZXMgYXJlIHZhbGlkYXRlZFxuICAgIC8vIGJlZm9yZSByZXBsYWNpbmcgdGhlbSBpbiB0aGUgQVNULlxuICAgIGlmIChwYXJlbnRLZXkgPT09IFwicHJvcGVydHlcIikge1xuICAgICAgaWYgKGlzKFwiTWVtYmVyRXhwcmVzc2lvblwiLCBwYXJlbnQsIG5vbkNvbXApKSByZXR1cm47XG4gICAgICBpZiAoaXMoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiwgcGFyZW50LCBub25Db21wKSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcImtleVwiKSB7XG4gICAgICBpZiAoaXMoXCJQcm9wZXJ0eVwiLCBwYXJlbnQsIG5vbkNvbXApKSByZXR1cm47XG4gICAgICBpZiAoaXMoXCJNZXRob2RcIiwgcGFyZW50LCBub25Db21wKSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcImV4cG9ydGVkXCIpIHtcbiAgICAgIGlmIChpcyhcIkV4cG9ydFNwZWNpZmllclwiLCBwYXJlbnQpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChwYXJlbnRLZXkgPT09IFwiaW1wb3J0ZWRcIikge1xuICAgICAgaWYgKGlzKFwiSW1wb3J0U3BlY2lmaWVyXCIsIHBhcmVudCwgeyBpbXBvcnRlZDogbm9kZSB9KSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcIm1ldGFcIikge1xuICAgICAgaWYgKGlzKFwiTWV0YVByb3BlcnR5XCIsIHBhcmVudCwgeyBtZXRhOiBub2RlIH0pKSByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgY2FsbCBpc1N0cmljdFJlc2VydmVkV29yZCBpZiB0aGlzIG5vZGUgaXMgYSBkZXNjZW5kYW50XG4gICAgICAvLyBvZiBhIGJsb2NrIGluIHN0cmljdCBtb2RlLiBBbHNvLCB3ZSBzaG91bGQgcGFzcyB0aGUgaW5Nb2R1bGUgb3B0aW9uIHNvXG4gICAgICAvLyB3ZSBjYW4gZGlzYWJsZSBcImF3YWl0XCIgaW4gbW9kdWxlLlxuICAgICAgKGlzS2V5d29yZChub2RlLm5hbWUpIHx8IGlzUmVzZXJ2ZWRXb3JkKG5vZGUubmFtZSwgZmFsc2UpKSAmJlxuICAgICAgLy8gRXZlbiBpZiBcInRoaXNcIiBpcyBhIGtleXdvcmQsIHdlIGFyZSB1c2luZyB0aGUgSWRlbnRpZmllclxuICAgICAgLy8gbm9kZSB0byByZXByZXNlbnQgaXQuXG4gICAgICBub2RlLm5hbWUgIT09IFwidGhpc1wiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBcIiR7bm9kZS5uYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXJgKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIklmU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkNvbmRpdGlvbmFsXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0ZXN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgY29uc2VxdWVudDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gICAgYWx0ZXJuYXRlOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJMYWJlbGVkU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wibGFiZWxcIiwgXCJib2R5XCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN0cmluZ0xpdGVyYWxcIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1lcmljTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBkZXByZWNhdGVkQWxpYXM6IFwiTnVtYmVyTGl0ZXJhbFwiLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcIm51bWJlclwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiUHVyZWlzaFwiLCBcIkxpdGVyYWxcIiwgXCJJbW11dGFibGVcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIk51bGxMaXRlcmFsXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJSZWdFeHBMaXRlcmFsXCIsIHtcbiAgYnVpbGRlcjogW1wicGF0dGVyblwiLCBcImZsYWdzXCJdLFxuICBkZXByZWNhdGVkQWxpYXM6IFwiUmVnZXhMaXRlcmFsXCIsXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJQdXJlaXNoXCIsIFwiTGl0ZXJhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgcGF0dGVybjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICAgIGZsYWdzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZSwga2V5LCB2YWwpIHtcbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkID0gL1teZ2ltc3V5XS8uZXhlYyh2YWwpO1xuICAgICAgICAgICAgaWYgKGludmFsaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgXCIke2ludmFsaWRbMF19XCIgaXMgbm90IGEgdmFsaWQgUmVnRXhwIGZsYWdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBcIlwiLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkxvZ2ljYWxFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiXSxcbiAgYWxpYXNlczogW1wiQmluYXJ5XCIsIFwiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5MT0dJQ0FMX09QRVJBVE9SUyksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcbiAgICBcIm9iamVjdFwiLFxuICAgIFwicHJvcGVydHlcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgLi4uKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HID8gW1wib3B0aW9uYWxcIl0gOiBbXSksXG4gIF0sXG4gIHZpc2l0b3I6IFtcIm9iamVjdFwiLCBcInByb3BlcnR5XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiTFZhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiU3VwZXJcIiksXG4gICAgfSxcbiAgICBwcm9wZXJ0eToge1xuICAgICAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbCA9IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiLCBcIlByaXZhdGVOYW1lXCIpO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvciA9IGZ1bmN0aW9uIChcbiAgICAgICAgICBub2RlOiB0Lk1lbWJlckV4cHJlc3Npb24sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbCxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3IgPSBub2RlLmNvbXB1dGVkID8gY29tcHV0ZWQgOiBub3JtYWw7XG4gICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICB2YWxpZGF0b3Iub25lT2ZOb2RlVHlwZXMgPSBbXCJFeHByZXNzaW9uXCIsIFwiSWRlbnRpZmllclwiLCBcIlByaXZhdGVOYW1lXCJdO1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yO1xuICAgICAgfSkoKSxcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIC4uLighcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgPyB7XG4gICAgICAgICAgb3B0aW9uYWw6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZih0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTmV3RXhwcmVzc2lvblwiLCB7IGluaGVyaXRzOiBcIkNhbGxFeHByZXNzaW9uXCIgfSk7XG5cbmRlZmluZVR5cGUoXCJQcm9ncmFtXCIsIHtcbiAgLy8gTm90ZTogV2UgZXhwbGljaXRseSBsZWF2ZSAnaW50ZXJwcmV0ZXInIG91dCBoZXJlIGJlY2F1c2UgaXQgaXNcbiAgLy8gY29uY2VwdHVhbGx5IGNvbW1lbnQtbGlrZSwgYW5kIEJhYmVsIGRvZXMgbm90IHRyYXZlcnNlIGNvbW1lbnRzIGVpdGhlci5cbiAgdmlzaXRvcjogW1wiZGlyZWN0aXZlc1wiLCBcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJkaXJlY3RpdmVzXCIsIFwic291cmNlVHlwZVwiLCBcImludGVycHJldGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBzb3VyY2VGaWxlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gICAgc291cmNlVHlwZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwic2NyaXB0XCIsIFwibW9kdWxlXCIpLFxuICAgICAgZGVmYXVsdDogXCJzY3JpcHRcIixcbiAgICB9LFxuICAgIGludGVycHJldGVyOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRpcmVjdGl2ZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEaXJlY3RpdmVcIikpLFxuICAgICAgKSxcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJCbG9ja1wiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJPYmplY3RNZXRob2RcIiwgXCJPYmplY3RQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdE1ldGhvZFwiLCB7XG4gIGJ1aWxkZXI6IFtcImtpbmRcIiwgXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiY29tcHV0ZWRcIiwgXCJnZW5lcmF0b3JcIiwgXCJhc3luY1wiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uZnVuY3Rpb25Db21tb24oKSxcbiAgICAuLi5mdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpLFxuICAgICAgLi4uKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HID8geyBkZWZhdWx0OiBcIm1ldGhvZFwiIH0gOiB7fSksXG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBrZXk6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yID0gZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0TWV0aG9kLCBrZXksIHZhbCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5vZGUuY29tcHV0ZWQgPyBjb21wdXRlZCA6IG5vcm1hbDtcbiAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8odHMpOiBjYW4gYmUgZGlzY3JpbWluYXRlZCB1bmlvbiBieSBgY29tcHV0ZWRgIHByb3BlcnR5XG4gICAgICAgIHZhbGlkYXRvci5vbmVPZk5vZGVUeXBlcyA9IFtcbiAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgZGVjb3JhdG9yczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRlY29yYXRvclwiKSksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXG4gICAgXCJrZXlcIixcbiAgICBcInBhcmFtc1wiLFxuICAgIFwiYm9keVwiLFxuICAgIFwiZGVjb3JhdG9yc1wiLFxuICAgIFwicmV0dXJuVHlwZVwiLFxuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgXSxcbiAgYWxpYXNlczogW1xuICAgIFwiVXNlcldoaXRlc3BhY2FibGVcIixcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJNZXRob2RcIixcbiAgICBcIk9iamVjdE1lbWJlclwiLFxuICBdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RQcm9wZXJ0eVwiLCB7XG4gIGJ1aWxkZXI6IFtcbiAgICBcImtleVwiLFxuICAgIFwidmFsdWVcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzaG9ydGhhbmRcIixcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcgPyBbXCJkZWNvcmF0b3JzXCJdIDogW10pLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBjb21wdXRlZDoge1xuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBrZXk6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJEZWNpbWFsTGl0ZXJhbFwiLFxuICAgICAgICAgIFwiUHJpdmF0ZU5hbWVcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIik7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3IgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIGZ1bmN0aW9uIChub2RlOiB0Lk9iamVjdFByb3BlcnR5LCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICAgICAgb25lT2ZOb2RlVHlwZXM6IFtcbiAgICAgICAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgICAgICBcIkJpZ0ludExpdGVyYWxcIixcbiAgICAgICAgICAgICAgXCJEZWNpbWFsTGl0ZXJhbFwiLFxuICAgICAgICAgICAgICBcIlByaXZhdGVOYW1lXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIC8vIFZhbHVlIG1heSBiZSBQYXR0ZXJuTGlrZSBpZiB0aGlzIGlzIGFuIEFzc2lnbm1lbnRQcm9wZXJ0eVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYnlsb24vaXNzdWVzLzQzNFxuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5MaWtlXCIpLFxuICAgIH0sXG4gICAgc2hvcnRoYW5kOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0UHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHZhbCAmJiBub2RlLmNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQcm9wZXJ0eSBzaG9ydGhhbmQgb2YgT2JqZWN0UHJvcGVydHkgY2Fubm90IGJlIHRydWUgaWYgY29tcHV0ZWQgaXMgdHJ1ZVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYXMgVmFsaWRhdG9yLFxuICAgICAgICAgIHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgKSxcbiAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0UHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAodmFsICYmICFpcyhcIklkZW50aWZpZXJcIiwgbm9kZS5rZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBcIlByb3BlcnR5IHNob3J0aGFuZCBvZiBPYmplY3RQcm9wZXJ0eSBjYW5ub3QgYmUgdHJ1ZSBpZiBrZXkgaXMgbm90IGFuIElkZW50aWZpZXJcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImtleVwiLCBcInZhbHVlXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYWxpYXNlczogW1wiVXNlcldoaXRlc3BhY2FibGVcIiwgXCJQcm9wZXJ0eVwiLCBcIk9iamVjdE1lbWJlclwiXSxcbiAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICBcIlBhdHRlcm5cIixcbiAgICAgIFwiVFNBc0V4cHJlc3Npb25cIixcbiAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBleHByZXNzaW9uID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwYXJlbnQsIGtleSwgbm9kZSkge1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGlzKFwiT2JqZWN0UGF0dGVyblwiLCBwYXJlbnQpID8gcGF0dGVybiA6IGV4cHJlc3Npb247XG4gICAgICB2YWxpZGF0b3Iobm9kZSwgXCJ2YWx1ZVwiLCBub2RlLnZhbHVlKTtcbiAgICB9O1xuICB9KSgpLFxufSk7XG5cbmRlZmluZVR5cGUoXCJSZXN0RWxlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGJ1aWxkZXI6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJMVmFsXCIsIFwiUGF0dGVybkxpa2VcIl0sXG4gIGRlcHJlY2F0ZWRBbGlhczogXCJSZXN0UHJvcGVydHlcIixcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBhcmd1bWVudDoge1xuICAgICAgdmFsaWRhdGU6ICFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HXG4gICAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJMVmFsXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIk9iamVjdFBhdHRlcm5cIixcbiAgICAgICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgICAgICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudDogdC5BcnJheVBhdHRlcm4gfCB0Lk9iamVjdFBhdHRlcm4sIGtleSkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFxcdyspXFxbKFxcZCspXFxdLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgQmFiZWwgZXJyb3I6IG1hbGZvcm1lZCBrZXkuXCIpO1xuXG4gICAgY29uc3QgWywgbGlzdEtleSwgaW5kZXhdID0gbWF0Y2ggYXMgdW5rbm93biBhcyBbXG4gICAgICBzdHJpbmcsXG4gICAgICBrZXlvZiB0eXBlb2YgcGFyZW50LFxuICAgICAgc3RyaW5nLFxuICAgIF07XG4gICAgaWYgKChwYXJlbnRbbGlzdEtleV0gYXMgdC5Ob2RlW10pLmxlbmd0aCA+ICtpbmRleCArIDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJlc3RFbGVtZW50IG11c3QgYmUgbGFzdCBlbGVtZW50IG9mICR7bGlzdEtleX1gKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlJldHVyblN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJUZXJtaW5hdG9ybGVzc1wiLCBcIkNvbXBsZXRpb25TdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU2VxdWVuY2VFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvbnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb25zOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkV4cHJlc3Npb25XcmFwcGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN3aXRjaENhc2VcIiwge1xuICB2aXNpdG9yOiBbXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgdGVzdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgY29uc2VxdWVudDoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN3aXRjaFN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImRpc2NyaW1pbmFudFwiLCBcImNhc2VzXCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJCbG9ja1BhcmVudFwiLCBcIlNjb3BhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBkaXNjcmltaW5hbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBjYXNlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN3aXRjaENhc2VcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUaGlzRXhwcmVzc2lvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRocm93U3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIlRlcm1pbmF0b3JsZXNzXCIsIFwiQ29tcGxldGlvblN0YXRlbWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHJ5U3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYmxvY2tcIiwgXCJoYW5kbGVyXCIsIFwiZmluYWxpemVyXCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGJsb2NrOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuVHJ5U3RhdGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3IgaXNuJ3QgcHV0IGF0IHRoZSB0b3AgbGV2ZWwgYmVjYXVzZSB3ZSBjYW4gcnVuIGl0XG4gICAgICAgICAgICAvLyBldmVuIGlmIHRoaXMgbm9kZSBkb2Vzbid0IGhhdmUgYSBwYXJlbnQuXG5cbiAgICAgICAgICAgIGlmICghbm9kZS5oYW5kbGVyICYmICFub2RlLmZpbmFsaXplcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiVHJ5U3RhdGVtZW50IGV4cGVjdHMgZWl0aGVyIGEgaGFuZGxlciBvciBmaW5hbGl6ZXIsIG9yIGJvdGhcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbmVPZk5vZGVUeXBlczogW1wiQmxvY2tTdGF0ZW1lbnRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBoYW5kbGVyOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkNhdGNoQ2xhdXNlXCIpLFxuICAgIH0sXG4gICAgZmluYWxpemVyOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkJsb2NrU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlVuYXJ5RXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIl0sXG4gIGZpZWxkczoge1xuICAgIHByZWZpeDoge1xuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB9LFxuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5VTkFSWV9PUEVSQVRPUlMpLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJVbmFyeUxpa2VcIiwgXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJVcGRhdGVFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJhcmd1bWVudFwiLCBcInByZWZpeFwiXSxcbiAgZmllbGRzOiB7XG4gICAgcHJlZml4OiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJNZW1iZXJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5VUERBVEVfT1BFUkFUT1JTKSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImtpbmRcIiwgXCJkZWNsYXJhdGlvbnNcIl0sXG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uc1wiXSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBraW5kOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXG4gICAgICAgIFwidmFyXCIsXG4gICAgICAgIFwibGV0XCIsXG4gICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuICAgICAgICBcInVzaW5nXCIsXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFzeW5jLWV4cGxpY2l0LXJlc291cmNlLW1hbmFnZW1lbnRcbiAgICAgICAgXCJhd2FpdCB1c2luZ1wiLFxuICAgICAgKSxcbiAgICB9LFxuICAgIGRlY2xhcmF0aW9uczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICBpZiAoIWlzKFwiRm9yWFN0YXRlbWVudFwiLCBwYXJlbnQsIHsgbGVmdDogbm9kZSB9KSkgcmV0dXJuO1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeGFjdGx5IG9uZSBWYXJpYWJsZURlY2xhcmF0b3IgaXMgcmVxdWlyZWQgaW4gdGhlIFZhcmlhYmxlRGVjbGFyYXRpb24gb2YgYSAke3BhcmVudC50eXBlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJpbml0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykge1xuICAgICAgICAgIHJldHVybiBhc3NlcnROb2RlVHlwZShcIkxWYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgIFwiT2JqZWN0UGF0dGVyblwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB3aXRob3V0ID0gYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogdC5WYXJpYWJsZURlY2xhcmF0b3IsIGtleSwgdmFsKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5pbml0ID8gbm9ybWFsIDogd2l0aG91dDtcbiAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgfSkoKSxcbiAgICB9LFxuICAgIGRlZmluaXRlOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIH0sXG4gICAgaW5pdDoge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIldoaWxlU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkJsb2NrUGFyZW50XCIsIFwiTG9vcFwiLCBcIldoaWxlXCIsIFwiU2NvcGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiV2l0aFN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcIm9iamVjdFwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLy8gLS0tIEVTMjAxNSAtLS1cbmRlZmluZVR5cGUoXCJBc3NpZ25tZW50UGF0dGVyblwiLCB7XG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImRlY29yYXRvcnNcIiAvKiBmb3IgbGVnYWN5IHBhcmFtIGRlY29yYXRvcnMgKi9dLFxuICBidWlsZGVyOiBbXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIGFsaWFzZXM6IFtcIlBhdHRlcm5cIiwgXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLnBhdHRlcm5MaWtlQ29tbW9uKCksXG4gICAgbGVmdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgLy8gRm9yIFR5cGVTY3JpcHRcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJBcnJheVBhdHRlcm5cIiwge1xuICB2aXNpdG9yOiBbXCJlbGVtZW50c1wiLCBcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBidWlsZGVyOiBbXCJlbGVtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiUGF0dGVyblwiLCBcIlBhdHRlcm5MaWtlXCIsIFwiTFZhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBlbGVtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlT3JWYWx1ZVR5cGUoXCJudWxsXCIsIFwiUGF0dGVybkxpa2VcIiwgXCJMVmFsXCIpKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiwge1xuICBidWlsZGVyOiBbXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiYXN5bmNcIl0sXG4gIHZpc2l0b3I6IFtcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJyZXR1cm5UeXBlXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlNjb3BhYmxlXCIsXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJFeHByZXNzaW9uXCIsXG4gICAgXCJQdXJlaXNoXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIC4uLmZ1bmN0aW9uQ29tbW9uKCksXG4gICAgLi4uZnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vbigpLFxuICAgIGV4cHJlc3Npb246IHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJ5bG9uL2lzc3Vlcy81MDVcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiwgXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgcHJlZGljYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJEZWNsYXJlZFByZWRpY2F0ZVwiLCBcIkluZmVycmVkUHJlZGljYXRlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NCb2R5XCIsIHtcbiAgdmlzaXRvcjogW1wiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgICAgICAgICBcIkNsYXNzUHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiQ2xhc3NBY2Nlc3NvclByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIlRTRGVjbGFyZU1ldGhvZFwiLFxuICAgICAgICAgICAgXCJUU0luZGV4U2lnbmF0dXJlXCIsXG4gICAgICAgICAgICBcIlN0YXRpY0Jsb2NrXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiaWRcIiwgXCJzdXBlckNsYXNzXCIsIFwiYm9keVwiLCBcImRlY29yYXRvcnNcIl0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImlkXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJzdXBlckNsYXNzXCIsXG4gICAgXCJtaXhpbnNcIixcbiAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgXCJzdXBlclR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJkZWNvcmF0b3JzXCIsXG4gIF0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQ2xhc3NcIiwgXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIC8vIEluIGRlY2xhcmF0aW9ucywgdGhpcyBpcyBtaXNzaW5nIGlmIHRoaXMgaXMgdGhlXG4gICAgICAvLyBjaGlsZCBvZiBhbiBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24uXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICApXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJDbGFzc0JvZHlcIiksXG4gICAgfSxcbiAgICBzdXBlckNsYXNzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBzdXBlclR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBpbXBsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVUeXBlKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIiwgXCJDbGFzc0ltcGxlbWVudHNcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG1peGluczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkNsYXNzRGVjbGFyYXRpb25cIiwge1xuICBpbmhlcml0czogXCJDbGFzc0V4cHJlc3Npb25cIixcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJDbGFzc1wiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICApXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJDbGFzc0JvZHlcIiksXG4gICAgfSxcbiAgICBzdXBlckNsYXNzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBzdXBlclR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBpbXBsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVUeXBlKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIiwgXCJDbGFzc0ltcGxlbWVudHNcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG1peGluczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVjbGFyZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGFic3RyYWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgaWYgKCFpcyhcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLCBwYXJlbnQpKSB7XG4gICAgICAgIGlkZW50aWZpZXIobm9kZSwgXCJpZFwiLCBub2RlLmlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpLFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcInNvdXJjZVwiXSxcbiAgdmlzaXRvcjogW1wic291cmNlXCIsIFwiYXR0cmlidXRlc1wiLCBcImFzc2VydGlvbnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRGVjbGFyYXRpb25cIixcbiAgICBcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIixcbiAgICBcIkV4cG9ydERlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIHNvdXJjZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICB9LFxuICAgIGV4cG9ydEtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIikpLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkltcG9ydEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgLy8gVE9ETyhCYWJlbCA4KTogRGVwcmVjYXRlZFxuICAgIGFzc2VydGlvbnM6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkltcG9ydEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uXCJdLFxuICBhbGlhc2VzOiBbXG4gICAgXCJTdGF0ZW1lbnRcIixcbiAgICBcIkRlY2xhcmF0aW9uXCIsXG4gICAgXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgXCJFeHBvcnREZWNsYXJhdGlvblwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBkZWNsYXJhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsXG4gICAgICAgIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxuICAgICAgICBcIkNsYXNzRGVjbGFyYXRpb25cIixcbiAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgZXhwb3J0S2luZDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZihcInZhbHVlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiXSxcbiAgdmlzaXRvcjogW1wiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIsIFwiYXR0cmlidXRlc1wiLCBcImFzc2VydGlvbnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRGVjbGFyYXRpb25cIixcbiAgICBcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIixcbiAgICBcIkV4cG9ydERlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmF0aW9uOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJEZWNsYXJhdGlvblwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRoaXMgdmFsaWRhdG9yIGlzbid0IHB1dCBhdCB0aGUgdG9wIGxldmVsIGJlY2F1c2Ugd2UgY2FuIHJ1biBpdFxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGlzIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LlxuXG4gICAgICAgICAgICBpZiAodmFsICYmIG5vZGUuc3BlY2lmaWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIk9ubHkgZGVjbGFyYXRpb24gb3Igc3BlY2lmaWVycyBpcyBhbGxvd2VkIG9uIEV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7IG9uZU9mTm9kZVR5cGVzOiBbXCJEZWNsYXJhdGlvblwiXSB9LFxuICAgICAgICApLFxuICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3IgaXNuJ3QgcHV0IGF0IHRoZSB0b3AgbGV2ZWwgYmVjYXVzZSB3ZSBjYW4gcnVuIGl0XG4gICAgICAgICAgLy8gZXZlbiBpZiB0aGlzIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LlxuXG4gICAgICAgICAgaWYgKHZhbCAmJiBub2RlLnNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBleHBvcnQgYSBkZWNsYXJhdGlvbiBmcm9tIGEgc291cmNlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIC8vIFRPRE8oQmFiZWwgOCk6IERlcHJlY2F0ZWRcbiAgICBhc3NlcnRpb25zOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHNwZWNpZmllcnM6IHtcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlZCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgICBcIkV4cG9ydFNwZWNpZmllclwiLFxuICAgICAgICAgICAgICBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIixcbiAgICAgICAgICAgICAgXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VsZXNzID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHBvcnRTcGVjaWZpZXJcIik7XG5cbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuIHNvdXJjZWQ7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBub2RlLnNvdXJjZSA/IHNvdXJjZWQgOiBzb3VyY2VsZXNzO1xuICAgICAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgICAgfSBhcyBWYWxpZGF0b3I7XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBzb3VyY2U6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGV4cG9ydEtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiLCBcImV4cG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGxvY2FsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgZXhwb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgZXhwb3J0S2luZDoge1xuICAgICAgLy8gQW5kIFR5cGVTY3JpcHQncyBcImV4cG9ydCB7IHR5cGUgZm9vIH0gZnJvbVwiXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGb3JPZlN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIiwgXCJhd2FpdFwiXSxcbiAgYWxpYXNlczogW1xuICAgIFwiU2NvcGFibGVcIixcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRm9yXCIsXG4gICAgXCJCbG9ja1BhcmVudFwiLFxuICAgIFwiTG9vcFwiLFxuICAgIFwiRm9yWFN0YXRlbWVudFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSB7XG4gICAgICAgICAgcmV0dXJuIGFzc2VydE5vZGVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCBcIkxWYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKTtcbiAgICAgICAgY29uc3QgbHZhbCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGtleSwgdmFsKSB7XG4gICAgICAgICAgaWYgKGlzKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB2YWwpKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGx2YWwobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICAgIGF3YWl0OiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnREZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIl0sXG4gIHZpc2l0b3I6IFtcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIiwgXCJhdHRyaWJ1dGVzXCIsIFwiYXNzZXJ0aW9uc1wiXSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIiwgXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIC8vIFRPRE8oQmFiZWwgOCk6IERlcHJlY2F0ZWRcbiAgICBhc3NlcnRpb25zOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIG1vZHVsZToge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICB9LFxuICAgIHNwZWNpZmllcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkltcG9ydFNwZWNpZmllclwiLFxuICAgICAgICAgICAgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgICAgICAgICBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gICAgc291cmNlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgLy8gSGFuZGxlIFR5cGVTY3JpcHQvRmxvd3R5cGUncyBleHRlbnNpb24gXCJpbXBvcnQgdHlwZSBmb28gZnJvbVwiXG4gICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlb2ZcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcInR5cGVcIiwgXCJ0eXBlb2ZcIiwgXCJ2YWx1ZVwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiXSxcbiAgYWxpYXNlczogW1wiTW9kdWxlU3BlY2lmaWVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsb2NhbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiXSxcbiAgYWxpYXNlczogW1wiTW9kdWxlU3BlY2lmaWVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsb2NhbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiLCBcImltcG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGxvY2FsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgLy8gSGFuZGxlIEZsb3d0eXBlJ3MgZXh0ZW5zaW9uIFwiaW1wb3J0IHt0eXBlb2YgZm9vfSBmcm9tXCJcbiAgICAgIC8vIEFuZCBUeXBlU2NyaXB0J3MgXCJpbXBvcnQgeyB0eXBlIGZvbyB9IGZyb21cIlxuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwidHlwZVwiLCBcInR5cGVvZlwiLCBcInZhbHVlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTWV0YVByb3BlcnR5XCIsIHtcbiAgdmlzaXRvcjogW1wibWV0YVwiLCBcInByb3BlcnR5XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBtZXRhOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5NZXRhUHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IHByb3BlcnR5O1xuICAgICAgICAgICAgc3dpdGNoICh2YWwubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IFwic2VudFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwibmV3XCI6XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBcInRhcmdldFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiaW1wb3J0XCI6XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBcIm1ldGFcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXMoXCJJZGVudGlmaWVyXCIsIG5vZGUucHJvcGVydHksIHsgbmFtZTogcHJvcGVydHkgfSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVucmVjb2duaXNlZCBNZXRhUHJvcGVydHlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyBvbmVPZk5vZGVUeXBlczogW1wiSWRlbnRpZmllclwiXSB9LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTWV0aG9kT3JQcm9wZXJ0eUNvbW1vbiA9ICgpID0+ICh7XG4gIGFic3RyYWN0OiB7XG4gICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIGFjY2Vzc2liaWxpdHk6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBzdGF0aWM6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgb3ZlcnJpZGU6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgb3B0aW9uYWw6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAga2V5OiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJTdHJpbmdMaXRlcmFsXCIsXG4gICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGU6IGFueSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgIHZhbGlkYXRvcihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgIH07XG4gICAgICB9KSgpLFxuICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICBcIkJpZ0ludExpdGVyYWxcIixcbiAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICApLFxuICAgICksXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uID0gKCkgPT4gKHtcbiAgLi4uZnVuY3Rpb25Db21tb24oKSxcbiAgLi4uY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uKCksXG4gIHBhcmFtczoge1xuICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJSZXN0RWxlbWVudFwiLFxuICAgICAgICAgIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICB9LFxuICBraW5kOiB7XG4gICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIsIFwiY29uc3RydWN0b3JcIiksXG4gICAgZGVmYXVsdDogXCJtZXRob2RcIixcbiAgfSxcbiAgYWNjZXNzOiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgICAgYXNzZXJ0T25lT2YoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIpLFxuICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIGRlY29yYXRvcnM6IHtcbiAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkNsYXNzTWV0aG9kXCIsIHtcbiAgYWxpYXNlczogW1wiRnVuY3Rpb25cIiwgXCJTY29wYWJsZVwiLCBcIkJsb2NrUGFyZW50XCIsIFwiRnVuY3Rpb25QYXJlbnRcIiwgXCJNZXRob2RcIl0sXG4gIGJ1aWxkZXI6IFtcbiAgICBcImtpbmRcIixcbiAgICBcImtleVwiLFxuICAgIFwicGFyYW1zXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJjb21wdXRlZFwiLFxuICAgIFwic3RhdGljXCIsXG4gICAgXCJnZW5lcmF0b3JcIixcbiAgICBcImFzeW5jXCIsXG4gIF0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImtleVwiLFxuICAgIFwicGFyYW1zXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJkZWNvcmF0b3JzXCIsXG4gICAgXCJyZXR1cm5UeXBlXCIsXG4gICAgXCJ0eXBlUGFyYW1ldGVyc1wiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5jbGFzc01ldGhvZE9yRGVjbGFyZU1ldGhvZENvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RQYXR0ZXJuXCIsIHtcbiAgdmlzaXRvcjogW1xuICAgIFwicHJvcGVydGllc1wiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIiAvKiBmb3IgbGVnYWN5IHBhcmFtIGRlY29yYXRvcnMgKi8sXG4gIF0sXG4gIGJ1aWxkZXI6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIlBhdHRlcm5cIiwgXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLnBhdHRlcm5MaWtlQ29tbW9uKCksXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlJlc3RFbGVtZW50XCIsIFwiT2JqZWN0UHJvcGVydHlcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJTcHJlYWRFbGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIlVuYXJ5TGlrZVwiXSxcbiAgZGVwcmVjYXRlZEFsaWFzOiBcIlNwcmVhZFByb3BlcnR5XCIsXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcbiAgXCJTdXBlclwiLFxuICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHtcbiAgICAgICAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgICAgIH0sXG4pO1xuXG5kZWZpbmVUeXBlKFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1widGFnXCIsIFwicXVhc2lcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgYnVpbGRlcjogW1widGFnXCIsIFwicXVhc2lcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHRhZzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIHF1YXNpOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUZW1wbGF0ZUxpdGVyYWxcIiksXG4gICAgfSxcbiAgICB0eXBlUGFyYW1ldGVyczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICAgIFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRlbXBsYXRlRWxlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCIsIFwidGFpbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0U2hhcGUoe1xuICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvb2tlZDoge1xuICAgICAgICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBmdW5jdGlvbiB0ZW1wbGF0ZUVsZW1lbnRDb29rZWRWYWxpZGF0b3Iobm9kZTogdC5UZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByYXcgPSBub2RlLnZhbHVlLnJhdztcblxuICAgICAgICAgIGxldCB1bnRlcm1pbmF0ZWRDYWxsZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gdW5yZWFjaGFibGVcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVybmFsIEBiYWJlbC90eXBlcyBlcnJvci5cIik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB7IHN0ciwgZmlyc3RJbnZhbGlkTG9jIH0gPSByZWFkU3RyaW5nQ29udGVudHMoXG4gICAgICAgICAgICBcInRlbXBsYXRlXCIsXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVudGVybWluYXRlZCgpIHtcbiAgICAgICAgICAgICAgICB1bnRlcm1pbmF0ZWRDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzdHJpY3ROdW1lcmljRXNjYXBlOiBlcnJvcixcbiAgICAgICAgICAgICAgaW52YWxpZEVzY2FwZVNlcXVlbmNlOiBlcnJvcixcbiAgICAgICAgICAgICAgbnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2U6IGVycm9yLFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcjogZXJyb3IsXG4gICAgICAgICAgICAgIGludmFsaWREaWdpdDogZXJyb3IsXG4gICAgICAgICAgICAgIGludmFsaWRDb2RlUG9pbnQ6IGVycm9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdW50ZXJtaW5hdGVkQ2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJhd1wiKTtcblxuICAgICAgICAgIG5vZGUudmFsdWUuY29va2VkID0gZmlyc3RJbnZhbGlkTG9jID8gbnVsbCA6IHN0cjtcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB0YWlsOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUZW1wbGF0ZUxpdGVyYWxcIiwge1xuICB2aXNpdG9yOiBbXCJxdWFzaXNcIiwgXCJleHByZXNzaW9uc1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxpdGVyYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIHF1YXNpczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlRlbXBsYXRlRWxlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgZXhwcmVzc2lvbnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIC8vIEZvciBUeXBlU2NyaXB0IHRlbXBsYXRlIGxpdGVyYWwgdHlwZXNcbiAgICAgICAgICAgIFwiVFNUeXBlXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuVGVtcGxhdGVMaXRlcmFsLCBrZXksIHZhbCkge1xuICAgICAgICAgIGlmIChub2RlLnF1YXNpcy5sZW5ndGggIT09IHZhbC5sZW5ndGggKyAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgTnVtYmVyIG9mICR7XG4gICAgICAgICAgICAgICAgbm9kZS50eXBlXG4gICAgICAgICAgICAgIH0gcXVhc2lzIHNob3VsZCBiZSBleGFjdGx5IG9uZSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBleHByZXNzaW9ucy5cXG5FeHBlY3RlZCAke1xuICAgICAgICAgICAgICAgIHZhbC5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIH0gcXVhc2lzIGJ1dCBnb3QgJHtub2RlLnF1YXNpcy5sZW5ndGh9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiWWllbGRFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiYXJndW1lbnRcIiwgXCJkZWxlZ2F0ZVwiXSxcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJUZXJtaW5hdG9ybGVzc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVsZWdhdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5ZaWVsZEV4cHJlc3Npb24sIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHZhbCAmJiAhbm9kZS5hcmd1bWVudCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiUHJvcGVydHkgZGVsZWdhdGUgb2YgWWllbGRFeHByZXNzaW9uIGNhbm5vdCBiZSB0cnVlIGlmIHRoZXJlIGlzIG5vIGFyZ3VtZW50XCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbi8vIC0tLSBFUzIwMTcgLS0tXG5kZWZpbmVUeXBlKFwiQXdhaXRFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiYXJndW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiVGVybWluYXRvcmxlc3NcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLy8gLS0tIEVTMjAxOSAtLS1cbmRlZmluZVR5cGUoXCJJbXBvcnRcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIC0tLSBFUzIwMjAgLS0tXG5kZWZpbmVUeXBlKFwiQmlnSW50TGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiUHVyZWlzaFwiLCBcIkxpdGVyYWxcIiwgXCJJbW11dGFibGVcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLCB7XG4gIHZpc2l0b3I6IFtcImV4cG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cG9ydGVkOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIiwgXCJvcHRpb25hbFwiXSxcbiAgdmlzaXRvcjogW1wib2JqZWN0XCIsIFwicHJvcGVydHlcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICAvLyB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICAgIHsgb25lT2ZOb2RlVHlwZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJJZGVudGlmaWVyXCJdIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgb3B0aW9uYWw6IHtcbiAgICAgIHZhbGlkYXRlOiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIilcbiAgICAgICAgOiBjaGFpbihhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLCBhc3NlcnRPcHRpb25hbENoYWluU3RhcnQoKSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwidHlwZUFyZ3VtZW50c1wiXSxcbiAgYnVpbGRlcjogW1wiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIsIFwib3B0aW9uYWxcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGNhbGxlZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICAgICAgICBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIixcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9LFxuICAgIG9wdGlvbmFsOiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpXG4gICAgICAgIDogY2hhaW4oYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSwgYXNzZXJ0T3B0aW9uYWxDaGFpblN0YXJ0KCkpLFxuICAgIH0sXG4gICAgdHlwZUFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vLyAtLS0gRVMyMDIyIC0tLVxuZGVmaW5lVHlwZShcIkNsYXNzUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYnVpbGRlcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgXSxcbiAgYWxpYXNlczogW1wiUHJvcGVydHlcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLmNsYXNzTWV0aG9kT3JQcm9wZXJ0eUNvbW1vbigpLFxuICAgIHZhbHVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWZpbml0ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVBbm5vdGF0aW9uOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFwiVHlwZUFubm90YXRpb25cIiwgXCJUU1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICBcIlRTVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICAgICAgXCJOb29wXCIsXG4gICAgICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVjb3JhdG9yczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRlY29yYXRvclwiKSksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICByZWFkb25seToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY2xhcmU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB2YXJpYW5jZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFuY2VcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYnVpbGRlcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgXSxcbiAgYWxpYXNlczogW1wiUHJvcGVydHlcIiwgXCJBY2Nlc3NvclwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uKCksXG4gICAga2V5OiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICAgIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgICBcIlByaXZhdGVOYW1lXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogYW55LCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5vZGUuY29tcHV0ZWQgPyBjb21wdXRlZCA6IG5vcm1hbDtcbiAgICAgICAgICAgIHZhbGlkYXRvcihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJTdHJpbmdMaXRlcmFsXCIsXG4gICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgIFwiQmlnSW50TGl0ZXJhbFwiLFxuICAgICAgICAgIFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiUHJpdmF0ZU5hbWVcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVmaW5pdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB0eXBlQW5ub3RhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlR5cGVBbm5vdGF0aW9uXCIsIFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICA6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgICAgIFwiTm9vcFwiLFxuICAgICAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgcmVhZG9ubHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNsYXJlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdmFyaWFuY2U6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlZhcmlhbmNlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcImRlY29yYXRvcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYnVpbGRlcjogW1wia2V5XCIsIFwidmFsdWVcIiwgXCJkZWNvcmF0b3JzXCIsIFwic3RhdGljXCJdLFxuICBhbGlhc2VzOiBbXCJQcm9wZXJ0eVwiLCBcIlByaXZhdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJpdmF0ZU5hbWVcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdHlwZUFubm90YXRpb246IHtcbiAgICAgIHZhbGlkYXRlOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHN0YXRpYzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIHJlYWRvbmx5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVmaW5pdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB2YXJpYW5jZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFuY2VcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJDbGFzc1ByaXZhdGVNZXRob2RcIiwge1xuICBidWlsZGVyOiBbXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcInN0YXRpY1wiXSxcbiAgdmlzaXRvcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJwYXJhbXNcIixcbiAgICBcImJvZHlcIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcInJldHVyblR5cGVcIixcbiAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gIF0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJNZXRob2RcIixcbiAgICBcIlByaXZhdGVcIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb24oKSxcbiAgICAuLi5mdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIpLFxuICAgICAgZGVmYXVsdDogXCJtZXRob2RcIixcbiAgICB9LFxuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJpdmF0ZU5hbWVcIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJQcml2YXRlTmFtZVwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJQcml2YXRlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJTdGF0aWNCbG9ja1wiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJTY29wYWJsZVwiLCBcIkJsb2NrUGFyZW50XCIsIFwiRnVuY3Rpb25QYXJlbnRcIl0sXG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXJyYXlPZlR5cGUsXG4gIGFzc2VydE9uZU9mLFxuICBhc3NlcnRWYWx1ZVR5cGUsXG4gIHZhbGlkYXRlLFxuICB2YWxpZGF0ZUFycmF5T2ZUeXBlLFxuICB2YWxpZGF0ZU9wdGlvbmFsLFxuICB2YWxpZGF0ZU9wdGlvbmFsVHlwZSxcbiAgdmFsaWRhdGVUeXBlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBkZWZpbmVUeXBlID0gZGVmaW5lQWxpYXNlZFR5cGUoXCJGbG93XCIpO1xuXG5jb25zdCBkZWZpbmVJbnRlcmZhY2Vpc2hUeXBlID0gKFxuICBuYW1lOiBcIkRlY2xhcmVDbGFzc1wiIHwgXCJEZWNsYXJlSW50ZXJmYWNlXCIgfCBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIsXG4pID0+IHtcbiAgY29uc3QgaXNEZWNsYXJlQ2xhc3MgPSBuYW1lID09PSBcIkRlY2xhcmVDbGFzc1wiO1xuXG4gIGRlZmluZVR5cGUobmFtZSwge1xuICAgIGJ1aWxkZXI6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJleHRlbmRzXCIsIFwiYm9keVwiXSxcbiAgICB2aXNpdG9yOiBbXG4gICAgICBcImlkXCIsXG4gICAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgICBcImV4dGVuZHNcIixcbiAgICAgIC4uLihpc0RlY2xhcmVDbGFzcyA/IFtcIm1peGluc1wiLCBcImltcGxlbWVudHNcIl0gOiBbXSksXG4gICAgICBcImJvZHlcIixcbiAgICBdLFxuICAgIGFsaWFzZXM6IFtcIkZsb3dEZWNsYXJhdGlvblwiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICAgIGZpZWxkczoge1xuICAgICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksXG4gICAgICBleHRlbmRzOiB2YWxpZGF0ZU9wdGlvbmFsKGFycmF5T2ZUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSksXG4gICAgICAuLi4oaXNEZWNsYXJlQ2xhc3NcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtaXhpbnM6IHZhbGlkYXRlT3B0aW9uYWwoYXJyYXlPZlR5cGUoXCJJbnRlcmZhY2VFeHRlbmRzXCIpKSxcbiAgICAgICAgICAgIGltcGxlbWVudHM6IHZhbGlkYXRlT3B0aW9uYWwoYXJyYXlPZlR5cGUoXCJDbGFzc0ltcGxlbWVudHNcIikpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBib2R5OiB2YWxpZGF0ZVR5cGUoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSxcbiAgICB9LFxuICB9KTtcbn07XG5cbmRlZmluZVR5cGUoXCJBbnlUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZWxlbWVudFR5cGVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBlbGVtZW50VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NJbXBsZW1lbnRzXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lSW50ZXJmYWNlaXNoVHlwZShcIkRlY2xhcmVDbGFzc1wiKTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVGdW5jdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgcHJlZGljYXRlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZUludGVyZmFjZWlzaFR5cGUoXCJEZWNsYXJlSW50ZXJmYWNlXCIpO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZU1vZHVsZVwiLCB7XG4gIGJ1aWxkZXI6IFtcImlkXCIsIFwiYm9keVwiLCBcImtpbmRcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlN0cmluZ0xpdGVyYWxcIl0pLFxuICAgIGJvZHk6IHZhbGlkYXRlVHlwZShcIkJsb2NrU3RhdGVtZW50XCIpLFxuICAgIGtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJDb21tb25KU1wiLCBcIkVTXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZVR5cGVBbGlhc1wiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICByaWdodDogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVPcGFxdWVUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICBzdXBlcnR5cGU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgaW1wbHR5cGU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVWYXJpYWJsZVwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmF0aW9uOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkZsb3dcIiksXG4gICAgc3BlY2lmaWVyczogdmFsaWRhdGVPcHRpb25hbChcbiAgICAgIGFycmF5T2ZUeXBlKFtcIkV4cG9ydFNwZWNpZmllclwiLCBcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiXSksXG4gICAgKSxcbiAgICBzb3VyY2U6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICBkZWZhdWx0OiB2YWxpZGF0ZU9wdGlvbmFsKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJzb3VyY2VcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dEZWNsYXJhdGlvblwiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBzb3VyY2U6IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgZXhwb3J0S2luZDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZihcInR5cGVcIiwgXCJ2YWx1ZVwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIsIHtcbiAgdmlzaXRvcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dQcmVkaWNhdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB2YWxpZGF0ZVR5cGUoXCJGbG93XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1widHlwZVBhcmFtZXRlcnNcIiwgXCJwYXJhbXNcIiwgXCJyZXN0XCIsIFwicmV0dXJuVHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICBwYXJhbXM6IHZhbGlkYXRlKGFycmF5T2ZUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIikpLFxuICAgIHJlc3Q6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiksXG4gICAgdGhpczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJGdW5jdGlvblR5cGVQYXJhbVwiKSxcbiAgICByZXR1cm5UeXBlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiwge1xuICB2aXNpdG9yOiBbXCJuYW1lXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgb3B0aW9uYWw6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiXSksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkluZmVycmVkUHJlZGljYXRlXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1ByZWRpY2F0ZVwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCJdKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVJbnRlcmZhY2Vpc2hUeXBlKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIik7XG5cbmRlZmluZVR5cGUoXCJJbnRlcmZhY2VUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImV4dGVuZHNcIiwgXCJib2R5XCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXh0ZW5kczogdmFsaWRhdGVPcHRpb25hbChhcnJheU9mVHlwZShcIkludGVyZmFjZUV4dGVuZHNcIikpLFxuICAgIGJvZHk6IHZhbGlkYXRlVHlwZShcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVzXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZXM6IHZhbGlkYXRlKGFycmF5T2ZUeXBlKFwiRmxvd1R5cGVcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIiwgXCJGbG93QmFzZUFubm90YXRpb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVtcHR5VHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJudW1iZXJcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1iZXJUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIiwgXCJpbmRleGVyc1wiLCBcImNhbGxQcm9wZXJ0aWVzXCIsIFwiaW50ZXJuYWxTbG90c1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGJ1aWxkZXI6IFtcbiAgICBcInByb3BlcnRpZXNcIixcbiAgICBcImluZGV4ZXJzXCIsXG4gICAgXCJjYWxsUHJvcGVydGllc1wiLFxuICAgIFwiaW50ZXJuYWxTbG90c1wiLFxuICAgIFwiZXhhY3RcIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgcHJvcGVydGllczogdmFsaWRhdGUoXG4gICAgICBhcnJheU9mVHlwZShbXCJPYmplY3RUeXBlUHJvcGVydHlcIiwgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIl0pLFxuICAgICksXG4gICAgaW5kZXhlcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBhcnJheU9mVHlwZShcIk9iamVjdFR5cGVJbmRleGVyXCIpLFxuICAgICAgb3B0aW9uYWw6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBmYWxzZSA6IHRydWUsXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICAgIGNhbGxQcm9wZXJ0aWVzOiB7XG4gICAgICB2YWxpZGF0ZTogYXJyYXlPZlR5cGUoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIpLFxuICAgICAgb3B0aW9uYWw6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBmYWxzZSA6IHRydWUsXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICAgIGludGVybmFsU2xvdHM6IHtcbiAgICAgIHZhbGlkYXRlOiBhcnJheU9mVHlwZShcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIiksXG4gICAgICBvcHRpb25hbDogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgIH0sXG4gICAgZXhhY3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICAvLyBJZiB0aGUgaW5leGFjdCBmbGFnIGlzIHByZXNlbnQgdGhlbiB0aGlzIGlzIGFuIG9iamVjdCB0eXBlLCBhbmQgbm90IGFcbiAgICAvLyBkZWNsYXJlIGNsYXNzLCBkZWNsYXJlIGludGVyZmFjZSwgb3IgaW50ZXJmYWNlLiBJZiBpdCBpcyB0cnVlLCB0aGVcbiAgICAvLyBvYmplY3QgdXNlcyAuLi4gdG8gZXhwcmVzcyB0aGF0IGl0IGlzIGluZXhhY3QuXG4gICAgaW5leGFjdDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidmFsdWVcIiwgXCJvcHRpb25hbFwiLCBcInN0YXRpY1wiLCBcIm1ldGhvZFwiXSxcbiAgYWxpYXNlczogW1wiVXNlcldoaXRlc3BhY2FibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHZhbHVlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgICBtZXRob2Q6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsIHtcbiAgdmlzaXRvcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0VHlwZUluZGV4ZXJcIiwge1xuICB2aXNpdG9yOiBbXCJpZFwiLCBcImtleVwiLCBcInZhbHVlXCIsIFwidmFyaWFuY2VcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIGtleTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgdmFsdWU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIHN0YXRpYzogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgdmFyaWFuY2U6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVmFyaWFuY2VcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdFR5cGVQcm9wZXJ0eVwiLCB7XG4gIHZpc2l0b3I6IFtcImtleVwiLCBcInZhbHVlXCIsIFwidmFyaWFuY2VcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBrZXk6IHZhbGlkYXRlVHlwZShbXCJJZGVudGlmaWVyXCIsIFwiU3RyaW5nTGl0ZXJhbFwiXSksXG4gICAgdmFsdWU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIGtpbmQ6IHZhbGlkYXRlKGFzc2VydE9uZU9mKFwiaW5pdFwiLCBcImdldFwiLCBcInNldFwiKSksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgICBwcm90bzogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgb3B0aW9uYWw6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIHZhcmlhbmNlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlZhcmlhbmNlXCIpLFxuICAgIG1ldGhvZDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJVc2VyV2hpdGVzcGFjYWJsZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPcGFxdWVUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiLCBcImltcGx0eXBlXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLFxuICAgIHN1cGVydHlwZTogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBpbXBsdHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJxdWFsaWZpY2F0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBxdWFsaWZpY2F0aW9uOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCJdKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3RyaW5nVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3ltYm9sVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIiwgXCJGbG93QmFzZUFubm90YXRpb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlR1cGxlVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlc1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZShhcnJheU9mVHlwZShcIkZsb3dUeXBlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZW9mVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZUFsaWFzXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLFxuICAgIHJpZ2h0OiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUeXBlQ2FzdEV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25XcmFwcGVyXCIsIFwiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwcmVzc2lvbjogdmFsaWRhdGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVHlwZUFubm90YXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlR5cGVQYXJhbWV0ZXJcIiwge1xuICB2aXNpdG9yOiBbXCJib3VuZFwiLCBcImRlZmF1bHRcIiwgXCJ2YXJpYW5jZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpKSxcbiAgICBib3VuZDogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlQW5ub3RhdGlvblwiKSxcbiAgICBkZWZhdWx0OiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIHZhcmlhbmNlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlZhcmlhbmNlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczogdmFsaWRhdGUoYXJyYXlPZlR5cGUoXCJUeXBlUGFyYW1ldGVyXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczogdmFsaWRhdGUoYXJyYXlPZlR5cGUoXCJGbG93VHlwZVwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlVuaW9uVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlc1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZShhcnJheU9mVHlwZShcIkZsb3dUeXBlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFuY2VcIiwge1xuICBidWlsZGVyOiBbXCJraW5kXCJdLFxuICBmaWVsZHM6IHtcbiAgICBraW5kOiB2YWxpZGF0ZShhc3NlcnRPbmVPZihcIm1pbnVzXCIsIFwicGx1c1wiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlZvaWRUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbi8vIEVudW1zXG5kZWZpbmVUeXBlKFwiRW51bURlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgYm9keTogdmFsaWRhdGVUeXBlKFtcbiAgICAgIFwiRW51bUJvb2xlYW5Cb2R5XCIsXG4gICAgICBcIkVudW1OdW1iZXJCb2R5XCIsXG4gICAgICBcIkVudW1TdHJpbmdCb2R5XCIsXG4gICAgICBcIkVudW1TeW1ib2xCb2R5XCIsXG4gICAgXSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1Cb29sZWFuQm9keVwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1Cb2R5XCJdLFxuICB2aXNpdG9yOiBbXCJtZW1iZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHBsaWNpdFR5cGU6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIG1lbWJlcnM6IHZhbGlkYXRlQXJyYXlPZlR5cGUoXCJFbnVtQm9vbGVhbk1lbWJlclwiKSxcbiAgICBoYXNVbmtub3duTWVtYmVyczogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1OdW1iZXJCb2R5XCIsIHtcbiAgYWxpYXNlczogW1wiRW51bUJvZHlcIl0sXG4gIHZpc2l0b3I6IFtcIm1lbWJlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cGxpY2l0VHlwZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIkVudW1OdW1iZXJNZW1iZXJcIiksXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFbnVtU3RyaW5nQm9keVwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1Cb2R5XCJdLFxuICB2aXNpdG9yOiBbXCJtZW1iZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHBsaWNpdFR5cGU6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIG1lbWJlcnM6IHZhbGlkYXRlQXJyYXlPZlR5cGUoW1wiRW51bVN0cmluZ01lbWJlclwiLCBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIl0pLFxuICAgIGhhc1Vua25vd25NZW1iZXJzOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW51bVN5bWJvbEJvZHlcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtQm9keVwiXSxcbiAgdmlzaXRvcjogW1wibWVtYmVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIiksXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFbnVtQm9vbGVhbk1lbWJlclwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1NZW1iZXJcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBpbml0OiB2YWxpZGF0ZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW51bU51bWJlck1lbWJlclwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1NZW1iZXJcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiaW5pdFwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgaW5pdDogdmFsaWRhdGVUeXBlKFwiTnVtZXJpY0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1TdHJpbmdNZW1iZXJcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtTWVtYmVyXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcImluaXRcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIGluaXQ6IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtTWVtYmVyXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wib2JqZWN0VHlwZVwiLCBcImluZGV4VHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdFR5cGU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIGluZGV4VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIiwge1xuICB2aXNpdG9yOiBbXCJvYmplY3RUeXBlXCIsIFwiaW5kZXhUeXBlXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgaW5kZXhUeXBlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG4gIGFzc2VydEVhY2gsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGRlZmluZVR5cGUgPSBkZWZpbmVBbGlhc2VkVHlwZShcIkpTWFwiKTtcblxuZGVmaW5lVHlwZShcIkpTWEF0dHJpYnV0ZVwiLCB7XG4gIHZpc2l0b3I6IFtcIm5hbWVcIiwgXCJ2YWx1ZVwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIsIFwiSlNYTmFtZXNwYWNlZE5hbWVcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiSlNYRWxlbWVudFwiLFxuICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgICAgICBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIixcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJuYW1lXCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgICAgIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEVsZW1lbnRcIiwge1xuICBidWlsZGVyOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgPyBbXCJvcGVuaW5nRWxlbWVudFwiLCBcImNsb3NpbmdFbGVtZW50XCIsIFwiY2hpbGRyZW5cIl1cbiAgICA6IFtcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiLCBcInNlbGZDbG9zaW5nXCJdLFxuICB2aXNpdG9yOiBbXCJvcGVuaW5nRWxlbWVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xvc2luZ0VsZW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIkltbXV0YWJsZVwiLCBcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZW5pbmdFbGVtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hPcGVuaW5nRWxlbWVudFwiKSxcbiAgICB9LFxuICAgIGNsb3NpbmdFbGVtZW50OiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkpTWENsb3NpbmdFbGVtZW50XCIpLFxuICAgIH0sXG4gICAgY2hpbGRyZW46IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkpTWFRleHRcIixcbiAgICAgICAgICAgIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgXCJKU1hTcHJlYWRDaGlsZFwiLFxuICAgICAgICAgICAgXCJKU1hFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgc2VsZkNsb3Npbmc6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEVtcHR5RXhwcmVzc2lvblwiLCB7fSk7XG5cbmRlZmluZVR5cGUoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiSlNYRW1wdHlFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWFNwcmVhZENoaWxkXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWElkZW50aWZpZXJcIiwge1xuICBidWlsZGVyOiBbXCJuYW1lXCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWE1lbWJlckV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIsIFwiSlNYSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWE5hbWVzcGFjZWROYW1lXCIsIHtcbiAgdmlzaXRvcjogW1wibmFtZXNwYWNlXCIsIFwibmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZXNwYWNlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSlNYSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hPcGVuaW5nRWxlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCIsIFwic2VsZkNsb3NpbmdcIl0sXG4gIHZpc2l0b3I6IFtcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgICAgIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgc2VsZkNsb3Npbmc6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkpTWEF0dHJpYnV0ZVwiLCBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgdHlwZVBhcmFtZXRlcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLFxuICAgICAgICBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIiwge1xuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYVGV4dFwiLCB7XG4gIGFsaWFzZXM6IFtcIkltbXV0YWJsZVwiXSxcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEZyYWdtZW50XCIsIHtcbiAgYnVpbGRlcjogW1wib3BlbmluZ0ZyYWdtZW50XCIsIFwiY2xvc2luZ0ZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIl0sXG4gIHZpc2l0b3I6IFtcIm9wZW5pbmdGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xvc2luZ0ZyYWdtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIiwgXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBvcGVuaW5nRnJhZ21lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkpTWE9wZW5pbmdGcmFnbWVudFwiKSxcbiAgICB9LFxuICAgIGNsb3NpbmdGcmFnbWVudDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIpLFxuICAgIH0sXG4gICAgY2hpbGRyZW46IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkpTWFRleHRcIixcbiAgICAgICAgICAgIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgXCJKU1hTcHJlYWRDaGlsZFwiLFxuICAgICAgICAgICAgXCJKU1hFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIsIHtcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG59KTtcbiIsICJpbXBvcnQgeyBBTElBU19LRVlTIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IFBMQUNFSE9MREVSUyA9IFtcbiAgXCJJZGVudGlmaWVyXCIsXG4gIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICBcIkV4cHJlc3Npb25cIixcbiAgXCJTdGF0ZW1lbnRcIixcbiAgXCJEZWNsYXJhdGlvblwiLFxuICBcIkJsb2NrU3RhdGVtZW50XCIsXG4gIFwiQ2xhc3NCb2R5XCIsXG4gIFwiUGF0dGVyblwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFBMQUNFSE9MREVSU19BTElBUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBEZWNsYXJhdGlvbjogW1wiU3RhdGVtZW50XCJdLFxuICBQYXR0ZXJuOiBbXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG59O1xuXG5mb3IgKGNvbnN0IHR5cGUgb2YgUExBQ0VIT0xERVJTKSB7XG4gIGNvbnN0IGFsaWFzID0gQUxJQVNfS0VZU1t0eXBlXTtcbiAgaWYgKGFsaWFzPy5sZW5ndGgpIFBMQUNFSE9MREVSU19BTElBU1t0eXBlXSA9IGFsaWFzO1xufVxuXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5PYmplY3Qua2V5cyhQTEFDRUhPTERFUlNfQUxJQVMpLmZvckVhY2godHlwZSA9PiB7XG4gIFBMQUNFSE9MREVSU19BTElBU1t0eXBlXS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTLCBhbGlhcykpIHtcbiAgICAgIFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTW2FsaWFzXSA9IFtdO1xuICAgIH1cbiAgICBQTEFDRUhPTERFUlNfRkxJUFBFRF9BTElBU1thbGlhc10ucHVzaCh0eXBlKTtcbiAgfSk7XG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydE9uZU9mLFxuICBhc3NlcnRWYWx1ZVR5cGUsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQTEFDRUhPTERFUlMgfSBmcm9tIFwiLi9wbGFjZWhvbGRlcnNcIjtcblxuY29uc3QgZGVmaW5lVHlwZSA9IGRlZmluZUFsaWFzZWRUeXBlKFwiTWlzY2VsbGFuZW91c1wiKTtcblxuaWYgKCFwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gIGRlZmluZVR5cGUoXCJOb29wXCIsIHtcbiAgICB2aXNpdG9yOiBbXSxcbiAgfSk7XG59XG5cbmRlZmluZVR5cGUoXCJQbGFjZWhvbGRlclwiLCB7XG4gIHZpc2l0b3I6IFtdLFxuICBidWlsZGVyOiBbXCJleHBlY3RlZE5vZGVcIiwgXCJuYW1lXCJdLFxuICAvLyBhbGlhc2VzOiBbXSwgZGVmaW5lZCBpbiBwbGFjZWhvbGRlcnMuanNcbiAgZmllbGRzOiB7XG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIGV4cGVjdGVkTm9kZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKC4uLlBMQUNFSE9MREVSUyksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVjhJbnRyaW5zaWNJZGVudGlmaWVyXCIsIHtcbiAgYnVpbGRlcjogW1wibmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IGRlZmluZVR5cGUsIHtcbiAgYXNzZXJ0RWFjaCxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmRlZmluZVR5cGUoXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIsIHt9KTtcblxuZGVmaW5lVHlwZShcIkJpbmRFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wib2JqZWN0XCIsIFwiY2FsbGVlXCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6ICFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HXG4gICAgPyB7XG4gICAgICAgIG9iamVjdDoge1xuICAgICAgICAgIHZhbGlkYXRlOiBPYmplY3QuYXNzaWduKCgpID0+IHt9LCB7XG4gICAgICAgICAgICBvbmVPZk5vZGVUeXBlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGVlOiB7XG4gICAgICAgICAgdmFsaWRhdGU6IE9iamVjdC5hc3NpZ24oKCkgPT4ge30sIHtcbiAgICAgICAgICAgIG9uZU9mTm9kZVR5cGVzOiBbXCJFeHByZXNzaW9uXCJdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgICB9LFxuICAgICAgICBjYWxsZWU6IHtcbiAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgICB9LFxuICAgICAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSW1wb3J0QXR0cmlidXRlXCIsIHtcbiAgdmlzaXRvcjogW1wia2V5XCIsIFwidmFsdWVcIl0sXG4gIGZpZWxkczoge1xuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiLCBcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEZWNvcmF0b3JcIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRvRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJhc3luY1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgICBhc3luYzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwb3J0ZWRcIl0sXG4gIGFsaWFzZXM6IFtcIk1vZHVsZVNwZWNpZmllclwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiUmVjb3JkRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJPYmplY3RQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUdXBsZUV4cHJlc3Npb25cIiwge1xuICBmaWVsZHM6IHtcbiAgICBlbGVtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiwgXCJTcHJlYWRFbGVtZW50XCIpKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXCJlbGVtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjaW1hbExpdGVyYWxcIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWpzLW1vZHVsZS1ibG9ja3NcbmRlZmluZVR5cGUoXCJNb2R1bGVFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJvZ3JhbVwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzXG5kZWZpbmVUeXBlKFwiVG9waWNSZWZlcmVuY2VcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1zbWFydC1waXBlc1xuZGVmaW5lVHlwZShcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwcmVzc2lvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImNhbGxlZVwiXSxcbiAgdmlzaXRvcjogW1wiY2FsbGVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBjYWxsZWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG4iLCAiaW1wb3J0IHtcbiAgZGVmaW5lQWxpYXNlZFR5cGUsXG4gIGFycmF5T2ZUeXBlLFxuICBhc3NlcnRFYWNoLFxuICBhc3NlcnROb2RlVHlwZSxcbiAgYXNzZXJ0T25lT2YsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG4gIHZhbGlkYXRlLFxuICB2YWxpZGF0ZUFycmF5T2ZUeXBlLFxuICB2YWxpZGF0ZU9wdGlvbmFsLFxuICB2YWxpZGF0ZU9wdGlvbmFsVHlwZSxcbiAgdmFsaWRhdGVUeXBlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbixcbiAgY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb24sXG59IGZyb20gXCIuL2NvcmVcIjtcbmltcG9ydCBpcyBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1wiO1xuXG5jb25zdCBkZWZpbmVUeXBlID0gZGVmaW5lQWxpYXNlZFR5cGUoXCJUeXBlU2NyaXB0XCIpO1xuXG5jb25zdCBib29sID0gYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKTtcblxuY29uc3QgdFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uID0gKCkgPT4gKHtcbiAgcmV0dXJuVHlwZToge1xuICAgIHZhbGlkYXRlOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICA/IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgOiAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIsIFwiTm9vcFwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAgdHlwZVBhcmFtZXRlcnM6IHtcbiAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpXG4gICAgICA6IC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICBhc3NlcnROb2RlVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIsIFwiTm9vcFwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiLCB7XG4gIGFsaWFzZXM6IFtcIkxWYWxcIl0sIC8vIFRPRE86IFRoaXMgaXNuJ3QgdXNhYmxlIGluIGdlbmVyYWwgYXMgYW4gTFZhbC4gU2hvdWxkIGhhdmUgYSBcIlBhcmFtZXRlclwiIGFsaWFzLlxuICB2aXNpdG9yOiBbXCJwYXJhbWV0ZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHJlYWRvbmx5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgcGFyYW1ldGVyOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiQXNzaWdubWVudFBhdHRlcm5cIiksXG4gICAgfSxcbiAgICBvdmVycmlkZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5mdW5jdGlvbkRlY2xhcmF0aW9uQ29tbW9uKCksXG4gICAgLi4udFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRGVjbGFyZU1ldGhvZFwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY29yYXRvcnNcIiwgXCJrZXlcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLmNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uKCksXG4gICAgLi4udFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUXVhbGlmaWVkTmFtZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTRW50aXR5TmFtZVwiXSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB2YWxpZGF0ZVR5cGUoXCJUU0VudGl0eU5hbWVcIiksXG4gICAgcmlnaHQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuY29uc3Qgc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24gPSAoKSA9PiAoe1xuICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgW3Byb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInBhcmFtc1wiIDogXCJwYXJhbWV0ZXJzXCJdOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFxuICAgIFtcIklkZW50aWZpZXJcIiwgXCJSZXN0RWxlbWVudFwiXSxcbiAgKSxcbiAgW3Byb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIl06XG4gICAgdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLFxufSk7XG5cbmNvbnN0IGNhbGxDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiA9IHtcbiAgYWxpYXNlczogW1wiVFNUeXBlRWxlbWVudFwiXSxcbiAgdmlzaXRvcjogW1xuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gXCJwYXJhbXNcIiA6IFwicGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIixcbiAgXSxcbiAgZmllbGRzOiBzaWduYXR1cmVEZWNsYXJhdGlvbkNvbW1vbigpLFxufTtcblxuZGVmaW5lVHlwZShcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsIGNhbGxDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbik7XG5kZWZpbmVUeXBlKFxuICBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgY2FsbENvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuKTtcblxuY29uc3QgbmFtZWRUeXBlRWxlbWVudENvbW1vbiA9ICgpID0+ICh7XG4gIGtleTogdmFsaWRhdGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgY29tcHV0ZWQ6IHsgZGVmYXVsdDogZmFsc2UgfSxcbiAgb3B0aW9uYWw6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUHJvcGVydHlTaWduYXR1cmVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVFbGVtZW50XCJdLFxuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ0eXBlQW5ub3RhdGlvblwiLCBcImluaXRpYWxpemVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5uYW1lZFR5cGVFbGVtZW50Q29tbW9uKCksXG4gICAgcmVhZG9ubHk6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIGtpbmQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcImdldFwiLCBcInNldFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU01ldGhvZFNpZ25hdHVyZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZUVsZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImtleVwiLFxuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gXCJwYXJhbXNcIiA6IFwicGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24oKSxcbiAgICAuLi5uYW1lZFR5cGVFbGVtZW50Q29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5kZXhTaWduYXR1cmVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVFbGVtZW50XCJdLFxuICB2aXNpdG9yOiBbXCJwYXJhbWV0ZXJzXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHJlYWRvbmx5OiB2YWxpZGF0ZU9wdGlvbmFsKGJvb2wpLFxuICAgIHN0YXRpYzogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBwYXJhbWV0ZXJzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiSWRlbnRpZmllclwiKSwgLy8gTGVuZ3RoIG11c3QgYmUgMVxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZUFubm90YXRpb25cIiksXG4gIH0sXG59KTtcblxuY29uc3QgdHNLZXl3b3JkVHlwZXMgPSBbXG4gIFwiVFNBbnlLZXl3b3JkXCIsXG4gIFwiVFNCb29sZWFuS2V5d29yZFwiLFxuICBcIlRTQmlnSW50S2V5d29yZFwiLFxuICBcIlRTSW50cmluc2ljS2V5d29yZFwiLFxuICBcIlRTTmV2ZXJLZXl3b3JkXCIsXG4gIFwiVFNOdWxsS2V5d29yZFwiLFxuICBcIlRTTnVtYmVyS2V5d29yZFwiLFxuICBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICBcIlRTU3RyaW5nS2V5d29yZFwiLFxuICBcIlRTU3ltYm9sS2V5d29yZFwiLFxuICBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgXCJUU1ZvaWRLZXl3b3JkXCIsXG5dIGFzIGNvbnN0O1xuXG5mb3IgKGNvbnN0IHR5cGUgb2YgdHNLZXl3b3JkVHlwZXMpIHtcbiAgZGVmaW5lVHlwZSh0eXBlLCB7XG4gICAgYWxpYXNlczogW1wiVFNUeXBlXCIsIFwiVFNCYXNlVHlwZVwiXSxcbiAgICB2aXNpdG9yOiBbXSxcbiAgICBmaWVsZHM6IHt9LFxuICB9KTtcbn1cblxuZGVmaW5lVHlwZShcIlRTVGhpc1R5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIiwgXCJUU0Jhc2VUeXBlXCJdLFxuICB2aXNpdG9yOiBbXSxcbiAgZmllbGRzOiB7fSxcbn0pO1xuXG5jb25zdCBmbk9yQ3RyQmFzZSA9IHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXG4gICAgXCJ0eXBlUGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInBhcmFtc1wiIDogXCJwYXJhbWV0ZXJzXCIsXG4gICAgcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IFwicmV0dXJuVHlwZVwiIDogXCJ0eXBlQW5ub3RhdGlvblwiLFxuICBdLFxufTtcblxuZGVmaW5lVHlwZShcIlRTRnVuY3Rpb25UeXBlXCIsIHtcbiAgLi4uZm5PckN0ckJhc2UsXG4gIGZpZWxkczogc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24oKSxcbn0pO1xuZGVmaW5lVHlwZShcIlRTQ29uc3RydWN0b3JUeXBlXCIsIHtcbiAgLi4uZm5PckN0ckJhc2UsXG4gIGZpZWxkczoge1xuICAgIC4uLnNpZ25hdHVyZURlY2xhcmF0aW9uQ29tbW9uKCksXG4gICAgYWJzdHJhY3Q6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVJlZmVyZW5jZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZU5hbWVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZU5hbWU6IHZhbGlkYXRlVHlwZShcIlRTRW50aXR5TmFtZVwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVQcmVkaWNhdGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcInBhcmFtZXRlck5hbWVcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYnVpbGRlcjogW1wicGFyYW1ldGVyTmFtZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiYXNzZXJ0c1wiXSxcbiAgZmllbGRzOiB7XG4gICAgcGFyYW1ldGVyTmFtZTogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJUU1RoaXNUeXBlXCJdKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLFxuICAgIGFzc2VydHM6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVF1ZXJ5XCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByTmFtZVwiLCBcInR5cGVQYXJhbWV0ZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByTmFtZTogdmFsaWRhdGVUeXBlKFtcIlRTRW50aXR5TmFtZVwiLCBcIlRTSW1wb3J0VHlwZVwiXSksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlTGl0ZXJhbFwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1wibWVtYmVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIlRTVHlwZUVsZW1lbnRcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTQXJyYXlUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJlbGVtZW50VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZWxlbWVudFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUdXBsZVR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImVsZW1lbnRUeXBlc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgZWxlbWVudFR5cGVzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFtcIlRTVHlwZVwiLCBcIlRTTmFtZWRUdXBsZU1lbWJlclwiXSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTT3B0aW9uYWxUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNSZXN0VHlwZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTmFtZWRUdXBsZU1lbWJlclwiLCB7XG4gIHZpc2l0b3I6IFtcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIl0sXG4gIGJ1aWxkZXI6IFtcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIiwgXCJvcHRpb25hbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgbGFiZWw6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgb3B0aW9uYWw6IHtcbiAgICAgIHZhbGlkYXRlOiBib29sLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBlbGVtZW50VHlwZTogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmNvbnN0IHVuaW9uT3JJbnRlcnNlY3Rpb24gPSB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufTtcblxuZGVmaW5lVHlwZShcIlRTVW5pb25UeXBlXCIsIHVuaW9uT3JJbnRlcnNlY3Rpb24pO1xuZGVmaW5lVHlwZShcIlRTSW50ZXJzZWN0aW9uVHlwZVwiLCB1bmlvbk9ySW50ZXJzZWN0aW9uKTtcblxuZGVmaW5lVHlwZShcIlRTQ29uZGl0aW9uYWxUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJjaGVja1R5cGVcIiwgXCJleHRlbmRzVHlwZVwiLCBcInRydWVUeXBlXCIsIFwiZmFsc2VUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBjaGVja1R5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgICBleHRlbmRzVHlwZTogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIHRydWVUeXBlOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gICAgZmFsc2VUeXBlOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5mZXJUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlUGFyYW1ldGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlUGFyYW1ldGVyOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUGFyZW50aGVzaXplZFR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVPcGVyYXRvclwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIikpLFxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcIm9iamVjdFR5cGVcIiwgXCJpbmRleFR5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgICBpbmRleFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNNYXBwZWRUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlUGFyYW1ldGVyXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJuYW1lVHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgcmVhZG9ubHk6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YodHJ1ZSwgZmFsc2UsIFwiK1wiLCBcIi1cIikpLFxuICAgIHR5cGVQYXJhbWV0ZXI6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVBhcmFtZXRlclwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZih0cnVlLCBmYWxzZSwgXCIrXCIsIFwiLVwiKSksXG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlXCIpLFxuICAgIG5hbWVUeXBlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNMaXRlcmFsVHlwZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiLCBcIlRTQmFzZVR5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImxpdGVyYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIGxpdGVyYWw6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB1bmFyeUV4cHJlc3Npb24gPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHVuYXJ5T3BlcmF0b3IgPSBhc3NlcnRPbmVPZihcIi1cIik7XG5cbiAgICAgICAgY29uc3QgbGl0ZXJhbCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgIFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICAgICAgKTtcbiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdG9yKHBhcmVudDogYW55LCBrZXk6IHN0cmluZywgbm9kZTogYW55KSB7XG4gICAgICAgICAgLy8gdHlwZSBBID0gLTEgfCAxO1xuICAgICAgICAgIGlmIChpcyhcIlVuYXJ5RXhwcmVzc2lvblwiLCBub2RlKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3BlcmF0b3IgZmlyc3RcbiAgICAgICAgICAgIHVuYXJ5T3BlcmF0b3Iobm9kZSwgXCJvcGVyYXRvclwiLCBub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgICAgIHVuYXJ5RXhwcmVzc2lvbihub2RlLCBcImFyZ3VtZW50XCIsIG5vZGUuYXJndW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0eXBlIEEgPSAnZm9vJyB8ICdiYXInIHwgZmFsc2UgfCAxO1xuICAgICAgICAgICAgbGl0ZXJhbChwYXJlbnQsIGtleSwgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdG9yLm9uZU9mTm9kZVR5cGVzID0gW1xuICAgICAgICAgIFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICAgICAgICBcIlVuYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIlRTRW50aXR5TmFtZVwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIsIHtcbiAgLy8gXCJTdGF0ZW1lbnRcIiBhbGlhcyBwcmV2ZW50cyBhIHNlbWljb2xvbiBmcm9tIGFwcGVhcmluZyBhZnRlciBpdCBpbiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwiZXh0ZW5kc1wiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksXG4gICAgZXh0ZW5kczogdmFsaWRhdGVPcHRpb25hbChhcnJheU9mVHlwZShcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpKSxcbiAgICBib2R5OiB2YWxpZGF0ZVR5cGUoXCJUU0ludGVyZmFjZUJvZHlcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW50ZXJmYWNlQm9keVwiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGJvZHk6IHZhbGlkYXRlQXJyYXlPZlR5cGUoXCJUU1R5cGVFbGVtZW50XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVjbGFyZTogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiLCBcInR5cGVQYXJhbWV0ZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuY29uc3QgVFNUeXBlRXhwcmVzc2lvbiA9IHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxWYWxcIiwgXCJQYXR0ZXJuTGlrZVwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiLCBcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59O1xuXG5kZWZpbmVUeXBlKFwiVFNBc0V4cHJlc3Npb25cIiwgVFNUeXBlRXhwcmVzc2lvbik7XG5kZWZpbmVUeXBlKFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsIFRTVHlwZUV4cHJlc3Npb24pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlQXNzZXJ0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxWYWxcIiwgXCJQYXR0ZXJuTGlrZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIiwgXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRW51bURlY2xhcmF0aW9uXCIsIHtcbiAgLy8gXCJTdGF0ZW1lbnRcIiBhbGlhcyBwcmV2ZW50cyBhIHNlbWljb2xvbiBmcm9tIGFwcGVhcmluZyBhZnRlciBpdCBpbiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcIm1lbWJlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgY29uc3Q6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIlRTRW51bU1lbWJlclwiKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0VudW1NZW1iZXJcIiwge1xuICB2aXNpdG9yOiBbXCJpZFwiLCBcImluaXRpYWxpemVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCJdKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVjbGFyZTogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBnbG9iYWw6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShbXCJJZGVudGlmaWVyXCIsIFwiU3RyaW5nTGl0ZXJhbFwiXSksXG4gICAgYm9keTogdmFsaWRhdGVUeXBlKFtcIlRTTW9kdWxlQmxvY2tcIiwgXCJUU01vZHVsZURlY2xhcmF0aW9uXCJdKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNNb2R1bGVCbG9ja1wiLCB7XG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQmxvY2tcIiwgXCJCbG9ja1BhcmVudFwiLCBcIkZ1bmN0aW9uUGFyZW50XCJdLFxuICB2aXNpdG9yOiBbXCJib2R5XCJdLFxuICBmaWVsZHM6IHtcbiAgICBib2R5OiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiU3RhdGVtZW50XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0ltcG9ydFR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCIsIFwicXVhbGlmaWVyXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB2YWxpZGF0ZVR5cGUoXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIHF1YWxpZmllcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU0VudGl0eU5hbWVcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiXSxcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJtb2R1bGVSZWZlcmVuY2VcIl0sXG4gIGZpZWxkczoge1xuICAgIGlzRXhwb3J0OiB2YWxpZGF0ZShib29sKSxcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBtb2R1bGVSZWZlcmVuY2U6IHZhbGlkYXRlVHlwZShbXG4gICAgICBcIlRTRW50aXR5TmFtZVwiLFxuICAgICAgXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIsXG4gICAgXSksXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwidHlwZVwiLCBcInZhbHVlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiLCB7XG4gIHZpc2l0b3I6IFtcImV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTm9uTnVsbEV4cHJlc3Npb25cIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiTFZhbFwiLCBcIlBhdHRlcm5MaWtlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0V4cG9ydEFzc2lnbm1lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlRTVHlwZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1wicGFyYW1zXCJdLFxuICBmaWVsZHM6IHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIiwge1xuICBidWlsZGVyOiBbXCJjb25zdHJhaW50XCIsIFwiZGVmYXVsdFwiLCBcIm5hbWVcIl0sXG4gIHZpc2l0b3I6IFtcImNvbnN0cmFpbnRcIiwgXCJkZWZhdWx0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgICBpbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG91dDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGNvbnN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgY29uc3RyYWludDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWZhdWx0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IERFUFJFQ0FURURfQUxJQVNFUyA9IHtcbiAgTW9kdWxlRGVjbGFyYXRpb246IFwiSW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvblwiLFxufTtcbiIsICJpbXBvcnQgdG9GYXN0UHJvcGVydGllcyBmcm9tIFwidG8tZmFzdC1wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgXCIuL2NvcmVcIjtcbmltcG9ydCBcIi4vZmxvd1wiO1xuaW1wb3J0IFwiLi9qc3hcIjtcbmltcG9ydCBcIi4vbWlzY1wiO1xuaW1wb3J0IFwiLi9leHBlcmltZW50YWxcIjtcbmltcG9ydCBcIi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHtcbiAgVklTSVRPUl9LRVlTLFxuICBBTElBU19LRVlTLFxuICBGTElQUEVEX0FMSUFTX0tFWVMsXG4gIE5PREVfRklFTERTLFxuICBCVUlMREVSX0tFWVMsXG4gIERFUFJFQ0FURURfS0VZUyxcbiAgTk9ERV9QQVJFTlRfVkFMSURBVElPTlMsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBQTEFDRUhPTERFUlMsXG4gIFBMQUNFSE9MREVSU19BTElBUyxcbiAgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVMsXG59IGZyb20gXCIuL3BsYWNlaG9sZGVyc1wiO1xuaW1wb3J0IHsgREVQUkVDQVRFRF9BTElBU0VTIH0gZnJvbSBcIi4vZGVwcmVjYXRlZC1hbGlhc2VzXCI7XG5cbihcbiAgT2JqZWN0LmtleXMoREVQUkVDQVRFRF9BTElBU0VTKSBhcyAoa2V5b2YgdHlwZW9mIERFUFJFQ0FURURfQUxJQVNFUylbXVxuKS5mb3JFYWNoKGRlcHJlY2F0ZWRBbGlhcyA9PiB7XG4gIEZMSVBQRURfQUxJQVNfS0VZU1tkZXByZWNhdGVkQWxpYXNdID1cbiAgICBGTElQUEVEX0FMSUFTX0tFWVNbREVQUkVDQVRFRF9BTElBU0VTW2RlcHJlY2F0ZWRBbGlhc11dO1xufSk7XG5cbi8vIFdlIGRvIHRoaXMgaGVyZSwgYmVjYXVzZSBhdCB0aGlzIHBvaW50IHRoZSB2aXNpdG9yIGtleXMgc2hvdWxkIGJlIHJlYWR5IGFuZCBzZXR1cFxudG9GYXN0UHJvcGVydGllcyhWSVNJVE9SX0tFWVMpO1xudG9GYXN0UHJvcGVydGllcyhBTElBU19LRVlTKTtcbnRvRmFzdFByb3BlcnRpZXMoRkxJUFBFRF9BTElBU19LRVlTKTtcbnRvRmFzdFByb3BlcnRpZXMoTk9ERV9GSUVMRFMpO1xudG9GYXN0UHJvcGVydGllcyhCVUlMREVSX0tFWVMpO1xudG9GYXN0UHJvcGVydGllcyhERVBSRUNBVEVEX0tFWVMpO1xuXG50b0Zhc3RQcm9wZXJ0aWVzKFBMQUNFSE9MREVSU19BTElBUyk7XG50b0Zhc3RQcm9wZXJ0aWVzKFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTKTtcblxuY29uc3QgVFlQRVM6IEFycmF5PHN0cmluZz4gPSBbXS5jb25jYXQoXG4gIE9iamVjdC5rZXlzKFZJU0lUT1JfS0VZUyksXG4gIE9iamVjdC5rZXlzKEZMSVBQRURfQUxJQVNfS0VZUyksXG4gIE9iamVjdC5rZXlzKERFUFJFQ0FURURfS0VZUyksXG4pO1xuXG5leHBvcnQge1xuICBWSVNJVE9SX0tFWVMsXG4gIEFMSUFTX0tFWVMsXG4gIEZMSVBQRURfQUxJQVNfS0VZUyxcbiAgTk9ERV9GSUVMRFMsXG4gIEJVSUxERVJfS0VZUyxcbiAgREVQUkVDQVRFRF9BTElBU0VTLFxuICBERVBSRUNBVEVEX0tFWVMsXG4gIE5PREVfUEFSRU5UX1ZBTElEQVRJT05TLFxuICBQTEFDRUhPTERFUlMsXG4gIFBMQUNFSE9MREVSU19BTElBUyxcbiAgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVMsXG4gIFRZUEVTLFxufTtcblxuZXhwb3J0IHR5cGUgeyBGaWVsZE9wdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuIiwgImltcG9ydCB7XG4gIE5PREVfRklFTERTLFxuICBOT0RFX1BBUkVOVF9WQUxJREFUSU9OUyxcbiAgdHlwZSBGaWVsZE9wdGlvbnMsXG59IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZShcbiAgbm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbDogYW55LFxuKTogdm9pZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpZWxkcyA9IE5PREVfRklFTERTW25vZGUudHlwZV07XG4gIGlmICghZmllbGRzKSByZXR1cm47XG5cbiAgY29uc3QgZmllbGQgPSBmaWVsZHNba2V5XTtcbiAgdmFsaWRhdGVGaWVsZChub2RlLCBrZXksIHZhbCwgZmllbGQpO1xuICB2YWxpZGF0ZUNoaWxkKG5vZGUsIGtleSwgdmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmllbGQoXG4gIG5vZGU6IHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIGtleTogc3RyaW5nLFxuICB2YWw6IGFueSxcbiAgZmllbGQ6IEZpZWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKCFmaWVsZD8udmFsaWRhdGUpIHJldHVybjtcbiAgaWYgKGZpZWxkLm9wdGlvbmFsICYmIHZhbCA9PSBudWxsKSByZXR1cm47XG5cbiAgZmllbGQudmFsaWRhdGUobm9kZSwga2V5LCB2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZChcbiAgbm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbD86IHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4pIHtcbiAgaWYgKHZhbCA9PSBudWxsKSByZXR1cm47XG4gIGNvbnN0IHZhbGlkYXRlID0gTk9ERV9QQVJFTlRfVkFMSURBVElPTlNbdmFsLnR5cGVdO1xuICBpZiAoIXZhbGlkYXRlKSByZXR1cm47XG4gIHZhbGlkYXRlKG5vZGUsIGtleSwgdmFsKTtcbn1cbiIsICJpbXBvcnQgdmFsaWRhdGUgZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IEJVSUxERVJfS0VZUyB9IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU5vZGU8TiBleHRlbmRzIHQuTm9kZT4obm9kZTogTikge1xuICAvLyB0b2RvOiBiZWNhdXNlIGtleXMgbm90IGluIEJVSUxERVJfS0VZUyBhcmUgbm90IHZhbGlkYXRlZCAtIHRoaXMgYWN0dWFsbHkgYWxsb3dzIGludmFsaWQgbm9kZXMgaW4gc29tZSBjYXNlc1xuICBjb25zdCBrZXlzID0gQlVJTERFUl9LRVlTW25vZGUudHlwZV0gYXMgKGtleW9mIE4gJiBzdHJpbmcpW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICB2YWxpZGF0ZShub2RlLCBrZXksIG5vZGVba2V5XSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuaW1wb3J0IHZhbGlkYXRlTm9kZSBmcm9tIFwiLi4vdmFsaWRhdGVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5pbXBvcnQgZGVwcmVjYXRpb25XYXJuaW5nIGZyb20gXCIuLi8uLi91dGlscy9kZXByZWNhdGlvbldhcm5pbmdcIjtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUV4cHJlc3Npb24oXG4gIGVsZW1lbnRzOiBBcnJheTxudWxsIHwgdC5FeHByZXNzaW9uIHwgdC5TcHJlYWRFbGVtZW50PiA9IFtdLFxuKTogdC5BcnJheUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyYXlFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJBcnJheUV4cHJlc3Npb25cIixcbiAgICBlbGVtZW50cyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzaWdubWVudEV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBzdHJpbmcsXG4gIGxlZnQ6IHQuTFZhbCxcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbik6IHQuQXNzaWdubWVudEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXNzaWdubWVudEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIsXG4gICAgb3BlcmF0b3IsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5RXhwcmVzc2lvbihcbiAgb3BlcmF0b3I6XG4gICAgfCBcIitcIlxuICAgIHwgXCItXCJcbiAgICB8IFwiL1wiXG4gICAgfCBcIiVcIlxuICAgIHwgXCIqXCJcbiAgICB8IFwiKipcIlxuICAgIHwgXCImXCJcbiAgICB8IFwifFwiXG4gICAgfCBcIj4+XCJcbiAgICB8IFwiPj4+XCJcbiAgICB8IFwiPDxcIlxuICAgIHwgXCJeXCJcbiAgICB8IFwiPT1cIlxuICAgIHwgXCI9PT1cIlxuICAgIHwgXCIhPVwiXG4gICAgfCBcIiE9PVwiXG4gICAgfCBcImluXCJcbiAgICB8IFwiaW5zdGFuY2VvZlwiXG4gICAgfCBcIj5cIlxuICAgIHwgXCI8XCJcbiAgICB8IFwiPj1cIlxuICAgIHwgXCI8PVwiXG4gICAgfCBcInw+XCIsXG4gIGxlZnQ6IHQuRXhwcmVzc2lvbiB8IHQuUHJpdmF0ZU5hbWUsXG4gIHJpZ2h0OiB0LkV4cHJlc3Npb24sXG4pOiB0LkJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQmluYXJ5RXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQmluYXJ5RXhwcmVzc2lvblwiLFxuICAgIG9wZXJhdG9yLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludGVycHJldGVyRGlyZWN0aXZlKHZhbHVlOiBzdHJpbmcpOiB0LkludGVycHJldGVyRGlyZWN0aXZlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkludGVycHJldGVyRGlyZWN0aXZlPih7XG4gICAgdHlwZTogXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUodmFsdWU6IHQuRGlyZWN0aXZlTGl0ZXJhbCk6IHQuRGlyZWN0aXZlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRpcmVjdGl2ZT4oe1xuICAgIHR5cGU6IFwiRGlyZWN0aXZlXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZUxpdGVyYWwodmFsdWU6IHN0cmluZyk6IHQuRGlyZWN0aXZlTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EaXJlY3RpdmVMaXRlcmFsPih7XG4gICAgdHlwZTogXCJEaXJlY3RpdmVMaXRlcmFsXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrU3RhdGVtZW50KFxuICBib2R5OiBBcnJheTx0LlN0YXRlbWVudD4sXG4gIGRpcmVjdGl2ZXM6IEFycmF5PHQuRGlyZWN0aXZlPiA9IFtdLFxuKTogdC5CbG9ja1N0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CbG9ja1N0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiQmxvY2tTdGF0ZW1lbnRcIixcbiAgICBib2R5LFxuICAgIGRpcmVjdGl2ZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJyZWFrU3RhdGVtZW50KFxuICBsYWJlbDogdC5JZGVudGlmaWVyIHwgbnVsbCA9IG51bGwsXG4pOiB0LkJyZWFrU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkJyZWFrU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJCcmVha1N0YXRlbWVudFwiLFxuICAgIGxhYmVsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxsRXhwcmVzc2lvbihcbiAgY2FsbGVlOiB0LkV4cHJlc3Npb24gfCB0LlN1cGVyIHwgdC5WOEludHJpbnNpY0lkZW50aWZpZXIsXG4gIF9hcmd1bWVudHM6IEFycmF5PFxuICAgIHQuRXhwcmVzc2lvbiB8IHQuU3ByZWFkRWxlbWVudCB8IHQuSlNYTmFtZXNwYWNlZE5hbWUgfCB0LkFyZ3VtZW50UGxhY2Vob2xkZXJcbiAgPixcbik6IHQuQ2FsbEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2FsbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkNhbGxFeHByZXNzaW9uXCIsXG4gICAgY2FsbGVlLFxuICAgIGFyZ3VtZW50czogX2FyZ3VtZW50cyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2F0Y2hDbGF1c2UoXG4gIHBhcmFtOlxuICAgIHwgdC5JZGVudGlmaWVyXG4gICAgfCB0LkFycmF5UGF0dGVyblxuICAgIHwgdC5PYmplY3RQYXR0ZXJuXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuKTogdC5DYXRjaENsYXVzZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DYXRjaENsYXVzZT4oe1xuICAgIHR5cGU6IFwiQ2F0Y2hDbGF1c2VcIixcbiAgICBwYXJhbSxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEV4cHJlc3Npb24oXG4gIHRlc3Q6IHQuRXhwcmVzc2lvbixcbiAgY29uc2VxdWVudDogdC5FeHByZXNzaW9uLFxuICBhbHRlcm5hdGU6IHQuRXhwcmVzc2lvbixcbik6IHQuQ29uZGl0aW9uYWxFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsXG4gICAgdGVzdCxcbiAgICBjb25zZXF1ZW50LFxuICAgIGFsdGVybmF0ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGludWVTdGF0ZW1lbnQoXG4gIGxhYmVsOiB0LklkZW50aWZpZXIgfCBudWxsID0gbnVsbCxcbik6IHQuQ29udGludWVTdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ29udGludWVTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIsXG4gICAgbGFiZWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnZ2VyU3RhdGVtZW50KCk6IHQuRGVidWdnZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRGVidWdnZXJTdGF0ZW1lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb1doaWxlU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5Eb1doaWxlU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRvV2hpbGVTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkRvV2hpbGVTdGF0ZW1lbnRcIixcbiAgICB0ZXN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U3RhdGVtZW50KCk6IHQuRW1wdHlTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRW1wdHlTdGF0ZW1lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW9uU3RhdGVtZW50KFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4pOiB0LkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwcmVzc2lvblN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGUoXG4gIHByb2dyYW06IHQuUHJvZ3JhbSxcbiAgY29tbWVudHM6IEFycmF5PHQuQ29tbWVudEJsb2NrIHwgdC5Db21tZW50TGluZT4gfCBudWxsID0gbnVsbCxcbiAgdG9rZW5zOiBBcnJheTxhbnk+IHwgbnVsbCA9IG51bGwsXG4pOiB0LkZpbGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRmlsZT4oe1xuICAgIHR5cGU6IFwiRmlsZVwiLFxuICAgIHByb2dyYW0sXG4gICAgY29tbWVudHMsXG4gICAgdG9rZW5zLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JJblN0YXRlbWVudChcbiAgbGVmdDogdC5WYXJpYWJsZURlY2xhcmF0aW9uIHwgdC5MVmFsLFxuICByaWdodDogdC5FeHByZXNzaW9uLFxuICBib2R5OiB0LlN0YXRlbWVudCxcbik6IHQuRm9ySW5TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRm9ySW5TdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkZvckluU3RhdGVtZW50XCIsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JTdGF0ZW1lbnQoXG4gIGluaXQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB8IHQuRXhwcmVzc2lvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICB0ZXN0OiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgdXBkYXRlOiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5TdGF0ZW1lbnQsXG4pOiB0LkZvclN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Gb3JTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkZvclN0YXRlbWVudFwiLFxuICAgIGluaXQsXG4gICAgdGVzdCxcbiAgICB1cGRhdGUsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQ+LFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuICBnZW5lcmF0b3I6IGJvb2xlYW4gPSBmYWxzZSxcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvbkRlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgZ2VuZXJhdG9yLFxuICAgIGFzeW5jLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvbkV4cHJlc3Npb24oXG4gIGlkOiB0LklkZW50aWZpZXIgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1zOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50PixcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAgZ2VuZXJhdG9yOiBib29sZWFuID0gZmFsc2UsXG4gIGFzeW5jOiBib29sZWFuID0gZmFsc2UsXG4pOiB0LkZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvbkV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLFxuICAgIGlkLFxuICAgIHBhcmFtcyxcbiAgICBib2R5LFxuICAgIGdlbmVyYXRvcixcbiAgICBhc3luYyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LklkZW50aWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSWRlbnRpZmllcj4oe1xuICAgIHR5cGU6IFwiSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlmU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGNvbnNlcXVlbnQ6IHQuU3RhdGVtZW50LFxuICBhbHRlcm5hdGU6IHQuU3RhdGVtZW50IHwgbnVsbCA9IG51bGwsXG4pOiB0LklmU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LklmU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJJZlN0YXRlbWVudFwiLFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgICBhbHRlcm5hdGUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsZWRTdGF0ZW1lbnQoXG4gIGxhYmVsOiB0LklkZW50aWZpZXIsXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5MYWJlbGVkU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkxhYmVsZWRTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkxhYmVsZWRTdGF0ZW1lbnRcIixcbiAgICBsYWJlbCxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdMaXRlcmFsKHZhbHVlOiBzdHJpbmcpOiB0LlN0cmluZ0xpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuU3RyaW5nTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljTGl0ZXJhbCh2YWx1ZTogbnVtYmVyKTogdC5OdW1lcmljTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5OdW1lcmljTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbExpdGVyYWwoKTogdC5OdWxsTGl0ZXJhbCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJOdWxsTGl0ZXJhbFwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW5MaXRlcmFsKHZhbHVlOiBib29sZWFuKTogdC5Cb29sZWFuTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Cb29sZWFuTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiQm9vbGVhbkxpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVnRXhwTGl0ZXJhbChcbiAgcGF0dGVybjogc3RyaW5nLFxuICBmbGFnczogc3RyaW5nID0gXCJcIixcbik6IHQuUmVnRXhwTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5SZWdFeHBMaXRlcmFsPih7XG4gICAgdHlwZTogXCJSZWdFeHBMaXRlcmFsXCIsXG4gICAgcGF0dGVybixcbiAgICBmbGFncyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9naWNhbEV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBcInx8XCIgfCBcIiYmXCIgfCBcIj8/XCIsXG4gIGxlZnQ6IHQuRXhwcmVzc2lvbixcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbik6IHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTG9naWNhbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkxvZ2ljYWxFeHByZXNzaW9uXCIsXG4gICAgb3BlcmF0b3IsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24gfCB0LlN1cGVyLFxuICBwcm9wZXJ0eTogdC5FeHByZXNzaW9uIHwgdC5JZGVudGlmaWVyIHwgdC5Qcml2YXRlTmFtZSxcbiAgY29tcHV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgb3B0aW9uYWw6IHRydWUgfCBmYWxzZSB8IG51bGwgPSBudWxsLFxuKTogdC5NZW1iZXJFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk1lbWJlckV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIk1lbWJlckV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgcHJvcGVydHksXG4gICAgY29tcHV0ZWQsXG4gICAgb3B0aW9uYWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5ld0V4cHJlc3Npb24oXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uIHwgdC5TdXBlciB8IHQuVjhJbnRyaW5zaWNJZGVudGlmaWVyLFxuICBfYXJndW1lbnRzOiBBcnJheTxcbiAgICB0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQgfCB0LkpTWE5hbWVzcGFjZWROYW1lIHwgdC5Bcmd1bWVudFBsYWNlaG9sZGVyXG4gID4sXG4pOiB0Lk5ld0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTmV3RXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiTmV3RXhwcmVzc2lvblwiLFxuICAgIGNhbGxlZSxcbiAgICBhcmd1bWVudHM6IF9hcmd1bWVudHMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW0oXG4gIGJvZHk6IEFycmF5PHQuU3RhdGVtZW50PixcbiAgZGlyZWN0aXZlczogQXJyYXk8dC5EaXJlY3RpdmU+ID0gW10sXG4gIHNvdXJjZVR5cGU6IFwic2NyaXB0XCIgfCBcIm1vZHVsZVwiID0gXCJzY3JpcHRcIixcbiAgaW50ZXJwcmV0ZXI6IHQuSW50ZXJwcmV0ZXJEaXJlY3RpdmUgfCBudWxsID0gbnVsbCxcbik6IHQuUHJvZ3JhbSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Qcm9ncmFtPih7XG4gICAgdHlwZTogXCJQcm9ncmFtXCIsXG4gICAgYm9keSxcbiAgICBkaXJlY3RpdmVzLFxuICAgIHNvdXJjZVR5cGUsXG4gICAgaW50ZXJwcmV0ZXIsXG4gICAgc291cmNlRmlsZTogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0RXhwcmVzc2lvbihcbiAgcHJvcGVydGllczogQXJyYXk8dC5PYmplY3RNZXRob2QgfCB0Lk9iamVjdFByb3BlcnR5IHwgdC5TcHJlYWRFbGVtZW50Pixcbik6IHQuT2JqZWN0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJPYmplY3RFeHByZXNzaW9uXCIsXG4gICAgcHJvcGVydGllcyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TWV0aG9kKFxuICBraW5kOiBcIm1ldGhvZFwiIHwgXCJnZXRcIiB8IFwic2V0XCIgfCB1bmRlZmluZWQgPSBcIm1ldGhvZFwiLFxuICBrZXk6XG4gICAgfCB0LkV4cHJlc3Npb25cbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWwsXG4gIHBhcmFtczogQXJyYXk8dC5JZGVudGlmaWVyIHwgdC5QYXR0ZXJuIHwgdC5SZXN0RWxlbWVudD4sXG4gIGJvZHk6IHQuQmxvY2tTdGF0ZW1lbnQsXG4gIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2UsXG4gIGdlbmVyYXRvcjogYm9vbGVhbiA9IGZhbHNlLFxuICBhc3luYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5PYmplY3RNZXRob2Qge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT2JqZWN0TWV0aG9kPih7XG4gICAgdHlwZTogXCJPYmplY3RNZXRob2RcIixcbiAgICBraW5kLFxuICAgIGtleSxcbiAgICBwYXJhbXMsXG4gICAgYm9keSxcbiAgICBjb21wdXRlZCxcbiAgICBnZW5lcmF0b3IsXG4gICAgYXN5bmMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFByb3BlcnR5KFxuICBrZXk6XG4gICAgfCB0LkV4cHJlc3Npb25cbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWxcbiAgICB8IHQuRGVjaW1hbExpdGVyYWxcbiAgICB8IHQuUHJpdmF0ZU5hbWUsXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCB0LlBhdHRlcm5MaWtlLFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuICBzaG9ydGhhbmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4pOiB0Lk9iamVjdFByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJPYmplY3RQcm9wZXJ0eVwiLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBjb21wdXRlZCxcbiAgICBzaG9ydGhhbmQsXG4gICAgZGVjb3JhdG9ycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzdEVsZW1lbnQoYXJndW1lbnQ6IHQuTFZhbCk6IHQuUmVzdEVsZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUmVzdEVsZW1lbnQ+KHtcbiAgICB0eXBlOiBcIlJlc3RFbGVtZW50XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJldHVyblN0YXRlbWVudChcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuKTogdC5SZXR1cm5TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUmV0dXJuU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJSZXR1cm5TdGF0ZW1lbnRcIixcbiAgICBhcmd1bWVudCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VFeHByZXNzaW9uKFxuICBleHByZXNzaW9uczogQXJyYXk8dC5FeHByZXNzaW9uPixcbik6IHQuU2VxdWVuY2VFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlNlcXVlbmNlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4pOiB0LlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaENhc2UoXG4gIHRlc3Q6IHQuRXhwcmVzc2lvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBjb25zZXF1ZW50OiBBcnJheTx0LlN0YXRlbWVudD4sXG4pOiB0LlN3aXRjaENhc2Uge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuU3dpdGNoQ2FzZT4oe1xuICAgIHR5cGU6IFwiU3dpdGNoQ2FzZVwiLFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3dpdGNoU3RhdGVtZW50KFxuICBkaXNjcmltaW5hbnQ6IHQuRXhwcmVzc2lvbixcbiAgY2FzZXM6IEFycmF5PHQuU3dpdGNoQ2FzZT4sXG4pOiB0LlN3aXRjaFN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Td2l0Y2hTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIlN3aXRjaFN0YXRlbWVudFwiLFxuICAgIGRpc2NyaW1pbmFudCxcbiAgICBjYXNlcyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhpc0V4cHJlc3Npb24oKTogdC5UaGlzRXhwcmVzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUaGlzRXhwcmVzc2lvblwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRocm93U3RhdGVtZW50KGFyZ3VtZW50OiB0LkV4cHJlc3Npb24pOiB0LlRocm93U3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRocm93U3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJUaHJvd1N0YXRlbWVudFwiLFxuICAgIGFyZ3VtZW50LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cnlTdGF0ZW1lbnQoXG4gIGJsb2NrOiB0LkJsb2NrU3RhdGVtZW50LFxuICBoYW5kbGVyOiB0LkNhdGNoQ2xhdXNlIHwgbnVsbCA9IG51bGwsXG4gIGZpbmFsaXplcjogdC5CbG9ja1N0YXRlbWVudCB8IG51bGwgPSBudWxsLFxuKTogdC5UcnlTdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHJ5U3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJUcnlTdGF0ZW1lbnRcIixcbiAgICBibG9jayxcbiAgICBoYW5kbGVyLFxuICAgIGZpbmFsaXplcixcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5hcnlFeHByZXNzaW9uKFxuICBvcGVyYXRvcjogXCJ2b2lkXCIgfCBcInRocm93XCIgfCBcImRlbGV0ZVwiIHwgXCIhXCIgfCBcIitcIiB8IFwiLVwiIHwgXCJ+XCIgfCBcInR5cGVvZlwiLFxuICBhcmd1bWVudDogdC5FeHByZXNzaW9uLFxuICBwcmVmaXg6IGJvb2xlYW4gPSB0cnVlLFxuKTogdC5VbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVW5hcnlFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJVbmFyeUV4cHJlc3Npb25cIixcbiAgICBvcGVyYXRvcixcbiAgICBhcmd1bWVudCxcbiAgICBwcmVmaXgsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBcIisrXCIgfCBcIi0tXCIsXG4gIGFyZ3VtZW50OiB0LkV4cHJlc3Npb24sXG4gIHByZWZpeDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5VcGRhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlVwZGF0ZUV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIixcbiAgICBvcGVyYXRvcixcbiAgICBhcmd1bWVudCxcbiAgICBwcmVmaXgsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlRGVjbGFyYXRpb24oXG4gIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICBkZWNsYXJhdGlvbnM6IEFycmF5PHQuVmFyaWFibGVEZWNsYXJhdG9yPixcbik6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYWJsZURlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsXG4gICAga2luZCxcbiAgICBkZWNsYXJhdGlvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlRGVjbGFyYXRvcihcbiAgaWQ6IHQuTFZhbCxcbiAgaW5pdDogdC5FeHByZXNzaW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlZhcmlhYmxlRGVjbGFyYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYWJsZURlY2xhcmF0b3I+KHtcbiAgICB0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRvclwiLFxuICAgIGlkLFxuICAgIGluaXQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoaWxlU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5XaGlsZVN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5XaGlsZVN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiV2hpbGVTdGF0ZW1lbnRcIixcbiAgICB0ZXN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTdGF0ZW1lbnQoXG4gIG9iamVjdDogdC5FeHByZXNzaW9uLFxuICBib2R5OiB0LlN0YXRlbWVudCxcbik6IHQuV2l0aFN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5XaXRoU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJXaXRoU3RhdGVtZW50XCIsXG4gICAgb2JqZWN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbm1lbnRQYXR0ZXJuKFxuICBsZWZ0OlxuICAgIHwgdC5JZGVudGlmaWVyXG4gICAgfCB0Lk9iamVjdFBhdHRlcm5cbiAgICB8IHQuQXJyYXlQYXR0ZXJuXG4gICAgfCB0Lk1lbWJlckV4cHJlc3Npb25cbiAgICB8IHQuVFNBc0V4cHJlc3Npb25cbiAgICB8IHQuVFNTYXRpc2ZpZXNFeHByZXNzaW9uXG4gICAgfCB0LlRTVHlwZUFzc2VydGlvblxuICAgIHwgdC5UU05vbk51bGxFeHByZXNzaW9uLFxuICByaWdodDogdC5FeHByZXNzaW9uLFxuKTogdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Bc3NpZ25tZW50UGF0dGVybj4oe1xuICAgIHR5cGU6IFwiQXNzaWdubWVudFBhdHRlcm5cIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVBhdHRlcm4oXG4gIGVsZW1lbnRzOiBBcnJheTxudWxsIHwgdC5QYXR0ZXJuTGlrZSB8IHQuTFZhbD4sXG4pOiB0LkFycmF5UGF0dGVybiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5BcnJheVBhdHRlcm4+KHtcbiAgICB0eXBlOiBcIkFycmF5UGF0dGVyblwiLFxuICAgIGVsZW1lbnRzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgcGFyYW1zOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50PixcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCB8IHQuRXhwcmVzc2lvbixcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIsXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgYXN5bmMsXG4gICAgZXhwcmVzc2lvbjogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2R5KFxuICBib2R5OiBBcnJheTxcbiAgICB8IHQuQ2xhc3NNZXRob2RcbiAgICB8IHQuQ2xhc3NQcml2YXRlTWV0aG9kXG4gICAgfCB0LkNsYXNzUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NQcml2YXRlUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5XG4gICAgfCB0LlRTRGVjbGFyZU1ldGhvZFxuICAgIHwgdC5UU0luZGV4U2lnbmF0dXJlXG4gICAgfCB0LlN0YXRpY0Jsb2NrXG4gID4sXG4pOiB0LkNsYXNzQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc0JvZHk+KHtcbiAgICB0eXBlOiBcIkNsYXNzQm9keVwiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzRXhwcmVzc2lvbihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBzdXBlckNsYXNzOiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5DbGFzc0JvZHksXG4gIGRlY29yYXRvcnM6IEFycmF5PHQuRGVjb3JhdG9yPiB8IG51bGwgPSBudWxsLFxuKTogdC5DbGFzc0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJDbGFzc0V4cHJlc3Npb25cIixcbiAgICBpZCxcbiAgICBzdXBlckNsYXNzLFxuICAgIGJvZHksXG4gICAgZGVjb3JhdG9ycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgc3VwZXJDbGFzczogdC5FeHByZXNzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIGJvZHk6IHQuQ2xhc3NCb2R5LFxuICBkZWNvcmF0b3JzOiBBcnJheTx0LkRlY29yYXRvcj4gfCBudWxsID0gbnVsbCxcbik6IHQuQ2xhc3NEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc0RlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJDbGFzc0RlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gICAgc3VwZXJDbGFzcyxcbiAgICBib2R5LFxuICAgIGRlY29yYXRvcnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydEFsbERlY2xhcmF0aW9uKFxuICBzb3VyY2U6IHQuU3RyaW5nTGl0ZXJhbCxcbik6IHQuRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwb3J0QWxsRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIsXG4gICAgc291cmNlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnREZWZhdWx0RGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOlxuICAgIHwgdC5UU0RlY2xhcmVGdW5jdGlvblxuICAgIHwgdC5GdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgfCB0LkNsYXNzRGVjbGFyYXRpb25cbiAgICB8IHQuRXhwcmVzc2lvbixcbik6IHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIsXG4gICAgZGVjbGFyYXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5hbWVkRGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOiB0LkRlY2xhcmF0aW9uIHwgbnVsbCA9IG51bGwsXG4gIHNwZWNpZmllcnM6IEFycmF5PFxuICAgIHQuRXhwb3J0U3BlY2lmaWVyIHwgdC5FeHBvcnREZWZhdWx0U3BlY2lmaWVyIHwgdC5FeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcbiAgPiA9IFtdLFxuICBzb3VyY2U6IHQuU3RyaW5nTGl0ZXJhbCB8IG51bGwgPSBudWxsLFxuKTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIixcbiAgICBkZWNsYXJhdGlvbixcbiAgICBzcGVjaWZpZXJzLFxuICAgIHNvdXJjZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuICBleHBvcnRlZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5FeHBvcnRTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwb3J0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJFeHBvcnRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgICBleHBvcnRlZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9yT2ZTdGF0ZW1lbnQoXG4gIGxlZnQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB8IHQuTFZhbCxcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbiAgYm9keTogdC5TdGF0ZW1lbnQsXG4gIF9hd2FpdDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5Gb3JPZlN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Gb3JPZlN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiRm9yT2ZTdGF0ZW1lbnRcIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICAgIGJvZHksXG4gICAgYXdhaXQ6IF9hd2FpdCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0RGVjbGFyYXRpb24oXG4gIHNwZWNpZmllcnM6IEFycmF5PFxuICAgIHQuSW1wb3J0U3BlY2lmaWVyIHwgdC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyIHwgdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcbiAgPixcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwsXG4pOiB0LkltcG9ydERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkltcG9ydERlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJJbXBvcnREZWNsYXJhdGlvblwiLFxuICAgIHNwZWNpZmllcnMsXG4gICAgc291cmNlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuKTogdC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KHtcbiAgICB0eXBlOiBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuKTogdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuICBpbXBvcnRlZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5JbXBvcnRTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJJbXBvcnRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgICBpbXBvcnRlZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWV0YVByb3BlcnR5KFxuICBtZXRhOiB0LklkZW50aWZpZXIsXG4gIHByb3BlcnR5OiB0LklkZW50aWZpZXIsXG4pOiB0Lk1ldGFQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5NZXRhUHJvcGVydHk+KHtcbiAgICB0eXBlOiBcIk1ldGFQcm9wZXJ0eVwiLFxuICAgIG1ldGEsXG4gICAgcHJvcGVydHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzTWV0aG9kKFxuICBraW5kOiBcImdldFwiIHwgXCJzZXRcIiB8IFwibWV0aG9kXCIgfCBcImNvbnN0cnVjdG9yXCIgfCB1bmRlZmluZWQgPSBcIm1ldGhvZFwiLFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHBhcmFtczogQXJyYXk8XG4gICAgdC5JZGVudGlmaWVyIHwgdC5QYXR0ZXJuIHwgdC5SZXN0RWxlbWVudCB8IHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eVxuICA+LFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuICBfc3RhdGljOiBib29sZWFuID0gZmFsc2UsXG4gIGdlbmVyYXRvcjogYm9vbGVhbiA9IGZhbHNlLFxuICBhc3luYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5DbGFzc01ldGhvZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc01ldGhvZD4oe1xuICAgIHR5cGU6IFwiQ2xhc3NNZXRob2RcIixcbiAgICBraW5kLFxuICAgIGtleSxcbiAgICBwYXJhbXMsXG4gICAgYm9keSxcbiAgICBjb21wdXRlZCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gICAgZ2VuZXJhdG9yLFxuICAgIGFzeW5jLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RQYXR0ZXJuKFxuICBwcm9wZXJ0aWVzOiBBcnJheTx0LlJlc3RFbGVtZW50IHwgdC5PYmplY3RQcm9wZXJ0eT4sXG4pOiB0Lk9iamVjdFBhdHRlcm4ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT2JqZWN0UGF0dGVybj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0UGF0dGVyblwiLFxuICAgIHByb3BlcnRpZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNwcmVhZEVsZW1lbnQoYXJndW1lbnQ6IHQuRXhwcmVzc2lvbik6IHQuU3ByZWFkRWxlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5TcHJlYWRFbGVtZW50Pih7XG4gICAgdHlwZTogXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZnVuY3Rpb24gX3N1cGVyKCk6IHQuU3VwZXIge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiU3VwZXJcIixcbiAgfTtcbn1cbmV4cG9ydCB7IF9zdXBlciBhcyBzdXBlciB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihcbiAgdGFnOiB0LkV4cHJlc3Npb24sXG4gIHF1YXNpOiB0LlRlbXBsYXRlTGl0ZXJhbCxcbik6IHQuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIsXG4gICAgdGFnLFxuICAgIHF1YXNpLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUVsZW1lbnQoXG4gIHZhbHVlOiB7IHJhdzogc3RyaW5nOyBjb29rZWQ/OiBzdHJpbmcgfSxcbiAgdGFpbDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5UZW1wbGF0ZUVsZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVGVtcGxhdGVFbGVtZW50Pih7XG4gICAgdHlwZTogXCJUZW1wbGF0ZUVsZW1lbnRcIixcbiAgICB2YWx1ZSxcbiAgICB0YWlsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUxpdGVyYWwoXG4gIHF1YXNpczogQXJyYXk8dC5UZW1wbGF0ZUVsZW1lbnQ+LFxuICBleHByZXNzaW9uczogQXJyYXk8dC5FeHByZXNzaW9uIHwgdC5UU1R5cGU+LFxuKTogdC5UZW1wbGF0ZUxpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVGVtcGxhdGVMaXRlcmFsPih7XG4gICAgdHlwZTogXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICBxdWFzaXMsXG4gICAgZXhwcmVzc2lvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHlpZWxkRXhwcmVzc2lvbihcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuICBkZWxlZ2F0ZTogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5ZaWVsZEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuWWllbGRFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJZaWVsZEV4cHJlc3Npb25cIixcbiAgICBhcmd1bWVudCxcbiAgICBkZWxlZ2F0ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50OiB0LkV4cHJlc3Npb24pOiB0LkF3YWl0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Bd2FpdEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkF3YWl0RXhwcmVzc2lvblwiLFxuICAgIGFyZ3VtZW50LFxuICB9KTtcbn1cbmZ1bmN0aW9uIF9pbXBvcnQoKTogdC5JbXBvcnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSW1wb3J0XCIsXG4gIH07XG59XG5leHBvcnQgeyBfaW1wb3J0IGFzIGltcG9ydCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludExpdGVyYWwodmFsdWU6IHN0cmluZyk6IHQuQmlnSW50TGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CaWdJbnRMaXRlcmFsPih7XG4gICAgdHlwZTogXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcihcbiAgZXhwb3J0ZWQ6IHQuSWRlbnRpZmllcixcbik6IHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcj4oe1xuICAgIHR5cGU6IFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIsXG4gICAgZXhwb3J0ZWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24sXG4gIHByb3BlcnR5OiB0LkV4cHJlc3Npb24gfCB0LklkZW50aWZpZXIsXG4gIGNvbXB1dGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIG9wdGlvbmFsOiBib29sZWFuLFxuKTogdC5PcHRpb25hbE1lbWJlckV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgcHJvcGVydHksXG4gICAgY29tcHV0ZWQsXG4gICAgb3B0aW9uYWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsQ2FsbEV4cHJlc3Npb24oXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uLFxuICBfYXJndW1lbnRzOiBBcnJheTxcbiAgICB0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQgfCB0LkpTWE5hbWVzcGFjZWROYW1lIHwgdC5Bcmd1bWVudFBsYWNlaG9sZGVyXG4gID4sXG4gIG9wdGlvbmFsOiBib29sZWFuLFxuKTogdC5PcHRpb25hbENhbGxFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIixcbiAgICBjYWxsZWUsXG4gICAgYXJndW1lbnRzOiBfYXJndW1lbnRzLFxuICAgIG9wdGlvbmFsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc1Byb3BlcnR5KFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCBudWxsID0gbnVsbCxcbiAgdHlwZUFubm90YXRpb246IHQuVHlwZUFubm90YXRpb24gfCB0LlRTVHlwZUFubm90YXRpb24gfCB0Lk5vb3AgfCBudWxsID0gbnVsbCxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4gIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2UsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc1Byb3BlcnR5Pih7XG4gICAgdHlwZTogXCJDbGFzc1Byb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGRlY29yYXRvcnMsXG4gICAgY29tcHV0ZWQsXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gIGtleTpcbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWxcbiAgICB8IHQuRXhwcmVzc2lvblxuICAgIHwgdC5Qcml2YXRlTmFtZSxcbiAgdmFsdWU6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UeXBlQW5ub3RhdGlvbiB8IHQuVFNUeXBlQW5ub3RhdGlvbiB8IHQuTm9vcCB8IG51bGwgPSBudWxsLFxuICBkZWNvcmF0b3JzOiBBcnJheTx0LkRlY29yYXRvcj4gfCBudWxsID0gbnVsbCxcbiAgY29tcHV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgX3N0YXRpYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIixcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgZGVjb3JhdG9ycyxcbiAgICBjb21wdXRlZCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICBrZXk6IHQuUHJpdmF0ZU5hbWUsXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCBudWxsID0gbnVsbCxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcml2YXRlUHJvcGVydHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NQcml2YXRlUHJvcGVydHk+KHtcbiAgICB0eXBlOiBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvcnMsXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc1ByaXZhdGVNZXRob2QoXG4gIGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIHwgXCJtZXRob2RcIiB8IHVuZGVmaW5lZCA9IFwibWV0aG9kXCIsXG4gIGtleTogdC5Qcml2YXRlTmFtZSxcbiAgcGFyYW1zOiBBcnJheTxcbiAgICB0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50IHwgdC5UU1BhcmFtZXRlclByb3BlcnR5XG4gID4sXG4gIGJvZHk6IHQuQmxvY2tTdGF0ZW1lbnQsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcml2YXRlTWV0aG9kIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkNsYXNzUHJpdmF0ZU1ldGhvZD4oe1xuICAgIHR5cGU6IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAga2luZCxcbiAgICBrZXksXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlTmFtZShpZDogdC5JZGVudGlmaWVyKTogdC5Qcml2YXRlTmFtZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Qcml2YXRlTmFtZT4oe1xuICAgIHR5cGU6IFwiUHJpdmF0ZU5hbWVcIixcbiAgICBpZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhdGljQmxvY2soYm9keTogQXJyYXk8dC5TdGF0ZW1lbnQ+KTogdC5TdGF0aWNCbG9jayB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5TdGF0aWNCbG9jaz4oe1xuICAgIHR5cGU6IFwiU3RhdGljQmxvY2tcIixcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbnlUeXBlQW5ub3RhdGlvbigpOiB0LkFueVR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIkFueVR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUeXBlQW5ub3RhdGlvbihcbiAgZWxlbWVudFR5cGU6IHQuRmxvd1R5cGUsXG4pOiB0LkFycmF5VHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyYXlUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiQXJyYXlUeXBlQW5ub3RhdGlvblwiLFxuICAgIGVsZW1lbnRUeXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuVHlwZUFubm90YXRpb24oKTogdC5Cb29sZWFuVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgdmFsdWU6IGJvb2xlYW4sXG4pOiB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKCk6IHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NJbXBsZW1lbnRzKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5DbGFzc0ltcGxlbWVudHMge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NJbXBsZW1lbnRzPih7XG4gICAgdHlwZTogXCJDbGFzc0ltcGxlbWVudHNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZUNsYXNzKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuRGVjbGFyZUNsYXNzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVDbGFzcz4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZUNsYXNzXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZUZ1bmN0aW9uKGlkOiB0LklkZW50aWZpZXIpOiB0LkRlY2xhcmVGdW5jdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlRnVuY3Rpb24+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVGdW5jdGlvblwiLFxuICAgIGlkLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNsYXJlSW50ZXJmYWNlKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuRGVjbGFyZUludGVyZmFjZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlSW50ZXJmYWNlPih7XG4gICAgdHlwZTogXCJEZWNsYXJlSW50ZXJmYWNlXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU1vZHVsZShcbiAgaWQ6IHQuSWRlbnRpZmllciB8IHQuU3RyaW5nTGl0ZXJhbCxcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAga2luZDogXCJDb21tb25KU1wiIHwgXCJFU1wiIHwgbnVsbCA9IG51bGwsXG4pOiB0LkRlY2xhcmVNb2R1bGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZU1vZHVsZT4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZU1vZHVsZVwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gICAga2luZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU1vZHVsZUV4cG9ydHMoXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlR5cGVBbm5vdGF0aW9uLFxuKTogdC5EZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlTW9kdWxlRXhwb3J0cz4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZVR5cGVBbGlhcyhcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHJpZ2h0OiB0LkZsb3dUeXBlLFxuKTogdC5EZWNsYXJlVHlwZUFsaWFzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVUeXBlQWxpYXM+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVUeXBlQWxpYXNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU9wYXF1ZVR5cGUoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgPSBudWxsLFxuICBzdXBlcnR5cGU6IHQuRmxvd1R5cGUgfCBudWxsID0gbnVsbCxcbik6IHQuRGVjbGFyZU9wYXF1ZVR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZU9wYXF1ZVR5cGU+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVPcGFxdWVUeXBlXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgc3VwZXJ0eXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNsYXJlVmFyaWFibGUoaWQ6IHQuSWRlbnRpZmllcik6IHQuRGVjbGFyZVZhcmlhYmxlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVWYXJpYWJsZT4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZVZhcmlhYmxlXCIsXG4gICAgaWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbihcbiAgZGVjbGFyYXRpb246IHQuRmxvdyB8IG51bGwgPSBudWxsLFxuICBzcGVjaWZpZXJzOiBBcnJheTxcbiAgICB0LkV4cG9ydFNwZWNpZmllciB8IHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXG4gID4gfCBudWxsID0gbnVsbCxcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwgfCBudWxsID0gbnVsbCxcbik6IHQuRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgZGVjbGFyYXRpb24sXG4gICAgc3BlY2lmaWVycyxcbiAgICBzb3VyY2UsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwsXG4pOiB0LkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiLFxuICAgIHNvdXJjZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZWRQcmVkaWNhdGUodmFsdWU6IHQuRmxvdyk6IHQuRGVjbGFyZWRQcmVkaWNhdGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZWRQcmVkaWNhdGU+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVkUHJlZGljYXRlXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0c1R5cGVBbm5vdGF0aW9uKCk6IHQuRXhpc3RzVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRXhpc3RzVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1zOiBBcnJheTx0LkZ1bmN0aW9uVHlwZVBhcmFtPixcbiAgcmVzdDogdC5GdW5jdGlvblR5cGVQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICByZXR1cm5UeXBlOiB0LkZsb3dUeXBlLFxuKTogdC5GdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkZ1bmN0aW9uVHlwZUFubm90YXRpb25cIixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbXMsXG4gICAgcmVzdCxcbiAgICByZXR1cm5UeXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVQYXJhbShcbiAgbmFtZTogdC5JZGVudGlmaWVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHR5cGVBbm5vdGF0aW9uOiB0LkZsb3dUeXBlLFxuKTogdC5GdW5jdGlvblR5cGVQYXJhbSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvblR5cGVQYXJhbT4oe1xuICAgIHR5cGU6IFwiRnVuY3Rpb25UeXBlUGFyYW1cIixcbiAgICBuYW1lLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljVHlwZUFubm90YXRpb24oXG4gIGlkOiB0LklkZW50aWZpZXIgfCB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5HZW5lcmljVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJHZW5lcmljVHlwZUFubm90YXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5mZXJyZWRQcmVkaWNhdGUoKTogdC5JbmZlcnJlZFByZWRpY2F0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJJbmZlcnJlZFByZWRpY2F0ZVwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludGVyZmFjZUV4dGVuZHMoXG4gIGlkOiB0LklkZW50aWZpZXIgfCB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5JbnRlcmZhY2VFeHRlbmRzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkludGVyZmFjZUV4dGVuZHM+KHtcbiAgICB0eXBlOiBcIkludGVyZmFjZUV4dGVuZHNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBfZXh0ZW5kczogQXJyYXk8dC5JbnRlcmZhY2VFeHRlbmRzPiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBib2R5OiB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uLFxuKTogdC5JbnRlcmZhY2VEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5JbnRlcmZhY2VEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBleHRlbmRzOiBfZXh0ZW5kcyxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmZhY2VUeXBlQW5ub3RhdGlvbihcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1peGVkVHlwZUFubm90YXRpb24oKTogdC5NaXhlZFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIk1peGVkVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eVR5cGVBbm5vdGF0aW9uKCk6IHQuRW1wdHlUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVUeXBlQW5ub3RhdGlvbihcbiAgdHlwZUFubm90YXRpb246IHQuRmxvd1R5cGUsXG4pOiB0Lk51bGxhYmxlVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTnVsbGFibGVUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIHZhbHVlOiBudW1iZXIsXG4pOiB0Lk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUeXBlQW5ub3RhdGlvbigpOiB0Lk51bWJlclR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VHlwZUFubm90YXRpb24oXG4gIHByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0VHlwZVByb3BlcnR5IHwgdC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHk+LFxuICBpbmRleGVyczogQXJyYXk8dC5PYmplY3RUeXBlSW5kZXhlcj4gPSBbXSxcbiAgY2FsbFByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4gPSBbXSxcbiAgaW50ZXJuYWxTbG90czogQXJyYXk8dC5PYmplY3RUeXBlSW50ZXJuYWxTbG90PiA9IFtdLFxuICBleGFjdDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZUFubm90YXRpb25cIixcbiAgICBwcm9wZXJ0aWVzLFxuICAgIGluZGV4ZXJzLFxuICAgIGNhbGxQcm9wZXJ0aWVzLFxuICAgIGludGVybmFsU2xvdHMsXG4gICAgZXhhY3QsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFR5cGVJbnRlcm5hbFNsb3QoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHZhbHVlOiB0LkZsb3dUeXBlLFxuICBvcHRpb25hbDogYm9vbGVhbixcbiAgX3N0YXRpYzogYm9vbGVhbixcbiAgbWV0aG9kOiBib29sZWFuLFxuKTogdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVJbnRlcm5hbFNsb3Q+KHtcbiAgICB0eXBlOiBcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIixcbiAgICBpZCxcbiAgICB2YWx1ZSxcbiAgICBvcHRpb25hbCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gICAgbWV0aG9kLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlQ2FsbFByb3BlcnR5KFxuICB2YWx1ZTogdC5GbG93VHlwZSxcbik6IHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlQ2FsbFByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsXG4gICAgdmFsdWUsXG4gICAgc3RhdGljOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlSW5kZXhlcihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBrZXk6IHQuRmxvd1R5cGUsXG4gIHZhbHVlOiB0LkZsb3dUeXBlLFxuICB2YXJpYW5jZTogdC5WYXJpYW5jZSB8IG51bGwgPSBudWxsLFxuKTogdC5PYmplY3RUeXBlSW5kZXhlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlSW5kZXhlcj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZUluZGV4ZXJcIixcbiAgICBpZCxcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgdmFyaWFuY2UsXG4gICAgc3RhdGljOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlUHJvcGVydHkoXG4gIGtleTogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICB2YWx1ZTogdC5GbG93VHlwZSxcbiAgdmFyaWFuY2U6IHQuVmFyaWFuY2UgfCBudWxsID0gbnVsbCxcbik6IHQuT2JqZWN0VHlwZVByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVQcm9wZXJ0eT4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZVByb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIHZhcmlhbmNlLFxuICAgIGtpbmQ6IG51bGwsXG4gICAgbWV0aG9kOiBudWxsLFxuICAgIG9wdGlvbmFsOiBudWxsLFxuICAgIHByb3RvOiBudWxsLFxuICAgIHN0YXRpYzogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5KFxuICBhcmd1bWVudDogdC5GbG93VHlwZSxcbik6IHQuT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eT4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZVR5cGUoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBzdXBlcnR5cGU6IHQuRmxvd1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgaW1wbHR5cGU6IHQuRmxvd1R5cGUsXG4pOiB0Lk9wYXF1ZVR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT3BhcXVlVHlwZT4oe1xuICAgIHR5cGU6IFwiT3BhcXVlVHlwZVwiLFxuICAgIGlkLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHN1cGVydHlwZSxcbiAgICBpbXBsdHlwZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHF1YWxpZmljYXRpb246IHQuSWRlbnRpZmllciB8IHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIsXG4pOiB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyPih7XG4gICAgdHlwZTogXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiLFxuICAgIGlkLFxuICAgIHF1YWxpZmljYXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgdmFsdWU6IHN0cmluZyxcbik6IHQuU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1R5cGVBbm5vdGF0aW9uKCk6IHQuU3RyaW5nVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiU3RyaW5nVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzeW1ib2xUeXBlQW5ub3RhdGlvbigpOiB0LlN5bWJvbFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdGhpc1R5cGVBbm5vdGF0aW9uKCk6IHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRoaXNUeXBlQW5ub3RhdGlvblwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR1cGxlVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UdXBsZVR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJUdXBsZVR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVvZlR5cGVBbm5vdGF0aW9uKFxuICBhcmd1bWVudDogdC5GbG93VHlwZSxcbik6IHQuVHlwZW9mVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZW9mVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVBbGlhcyhcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHJpZ2h0OiB0LkZsb3dUeXBlLFxuKTogdC5UeXBlQWxpYXMge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZUFsaWFzPih7XG4gICAgdHlwZTogXCJUeXBlQWxpYXNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdHlwZUFubm90YXRpb24odHlwZUFubm90YXRpb246IHQuRmxvd1R5cGUpOiB0LlR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0eXBlQ2FzdEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbiAgdHlwZUFubm90YXRpb246IHQuVHlwZUFubm90YXRpb24sXG4pOiB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UeXBlQ2FzdEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlR5cGVDYXN0RXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXIoXG4gIGJvdW5kOiB0LlR5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4gIF9kZWZhdWx0OiB0LkZsb3dUeXBlIHwgbnVsbCA9IG51bGwsXG4gIHZhcmlhbmNlOiB0LlZhcmlhbmNlIHwgbnVsbCA9IG51bGwsXG4pOiB0LlR5cGVQYXJhbWV0ZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZVBhcmFtZXRlcj4oe1xuICAgIHR5cGU6IFwiVHlwZVBhcmFtZXRlclwiLFxuICAgIGJvdW5kLFxuICAgIGRlZmF1bHQ6IF9kZWZhdWx0LFxuICAgIHZhcmlhbmNlLFxuICAgIG5hbWU6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgcGFyYW1zOiBBcnJheTx0LlR5cGVQYXJhbWV0ZXI+LFxuKTogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBwYXJhbXM6IEFycmF5PHQuRmxvd1R5cGU+LFxuKTogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbj4oe1xuICAgIHR5cGU6IFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuVW5pb25UeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5VbmlvblR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhbmNlKGtpbmQ6IFwibWludXNcIiB8IFwicGx1c1wiKTogdC5WYXJpYW5jZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYW5jZT4oe1xuICAgIHR5cGU6IFwiVmFyaWFuY2VcIixcbiAgICBraW5kLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2b2lkVHlwZUFubm90YXRpb24oKTogdC5Wb2lkVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bURlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICBib2R5OlxuICAgIHwgdC5FbnVtQm9vbGVhbkJvZHlcbiAgICB8IHQuRW51bU51bWJlckJvZHlcbiAgICB8IHQuRW51bVN0cmluZ0JvZHlcbiAgICB8IHQuRW51bVN5bWJvbEJvZHksXG4pOiB0LkVudW1EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkVudW1EZWNsYXJhdGlvblwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1Cb29sZWFuQm9keShcbiAgbWVtYmVyczogQXJyYXk8dC5FbnVtQm9vbGVhbk1lbWJlcj4sXG4pOiB0LkVudW1Cb29sZWFuQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtQm9vbGVhbkJvZHk+KHtcbiAgICB0eXBlOiBcIkVudW1Cb29sZWFuQm9keVwiLFxuICAgIG1lbWJlcnMsXG4gICAgZXhwbGljaXRUeXBlOiBudWxsLFxuICAgIGhhc1Vua25vd25NZW1iZXJzOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbnVtTnVtYmVyQm9keShcbiAgbWVtYmVyczogQXJyYXk8dC5FbnVtTnVtYmVyTWVtYmVyPixcbik6IHQuRW51bU51bWJlckJvZHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRW51bU51bWJlckJvZHk+KHtcbiAgICB0eXBlOiBcIkVudW1OdW1iZXJCb2R5XCIsXG4gICAgbWVtYmVycyxcbiAgICBleHBsaWNpdFR5cGU6IG51bGwsXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdCb2R5KFxuICBtZW1iZXJzOiBBcnJheTx0LkVudW1TdHJpbmdNZW1iZXIgfCB0LkVudW1EZWZhdWx0ZWRNZW1iZXI+LFxuKTogdC5FbnVtU3RyaW5nQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtU3RyaW5nQm9keT4oe1xuICAgIHR5cGU6IFwiRW51bVN0cmluZ0JvZHlcIixcbiAgICBtZW1iZXJzLFxuICAgIGV4cGxpY2l0VHlwZTogbnVsbCxcbiAgICBoYXNVbmtub3duTWVtYmVyczogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bVN5bWJvbEJvZHkoXG4gIG1lbWJlcnM6IEFycmF5PHQuRW51bURlZmF1bHRlZE1lbWJlcj4sXG4pOiB0LkVudW1TeW1ib2xCb2R5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1TeW1ib2xCb2R5Pih7XG4gICAgdHlwZTogXCJFbnVtU3ltYm9sQm9keVwiLFxuICAgIG1lbWJlcnMsXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1Cb29sZWFuTWVtYmVyKGlkOiB0LklkZW50aWZpZXIpOiB0LkVudW1Cb29sZWFuTWVtYmVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1Cb29sZWFuTWVtYmVyPih7XG4gICAgdHlwZTogXCJFbnVtQm9vbGVhbk1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1OdW1iZXJNZW1iZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIGluaXQ6IHQuTnVtZXJpY0xpdGVyYWwsXG4pOiB0LkVudW1OdW1iZXJNZW1iZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRW51bU51bWJlck1lbWJlcj4oe1xuICAgIHR5cGU6IFwiRW51bU51bWJlck1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdNZW1iZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIGluaXQ6IHQuU3RyaW5nTGl0ZXJhbCxcbik6IHQuRW51bVN0cmluZ01lbWJlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtU3RyaW5nTWVtYmVyPih7XG4gICAgdHlwZTogXCJFbnVtU3RyaW5nTWVtYmVyXCIsXG4gICAgaWQsXG4gICAgaW5pdCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bURlZmF1bHRlZE1lbWJlcihpZDogdC5JZGVudGlmaWVyKTogdC5FbnVtRGVmYXVsdGVkTWVtYmVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1EZWZhdWx0ZWRNZW1iZXI+KHtcbiAgICB0eXBlOiBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIixcbiAgICBpZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuRmxvd1R5cGUsXG4gIGluZGV4VHlwZTogdC5GbG93VHlwZSxcbik6IHQuSW5kZXhlZEFjY2Vzc1R5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW5kZXhlZEFjY2Vzc1R5cGU+KHtcbiAgICB0eXBlOiBcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgb2JqZWN0VHlwZSxcbiAgICBpbmRleFR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuRmxvd1R5cGUsXG4gIGluZGV4VHlwZTogdC5GbG93VHlwZSxcbik6IHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlPih7XG4gICAgdHlwZTogXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgb2JqZWN0VHlwZSxcbiAgICBpbmRleFR5cGUsXG4gICAgb3B0aW9uYWw6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpzeEF0dHJpYnV0ZShcbiAgbmFtZTogdC5KU1hJZGVudGlmaWVyIHwgdC5KU1hOYW1lc3BhY2VkTmFtZSxcbiAgdmFsdWU6XG4gICAgfCB0LkpTWEVsZW1lbnRcbiAgICB8IHQuSlNYRnJhZ21lbnRcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5KU1hFeHByZXNzaW9uQ29udGFpbmVyXG4gICAgfCBudWxsID0gbnVsbCxcbik6IHQuSlNYQXR0cmlidXRlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWEF0dHJpYnV0ZT4oe1xuICAgIHR5cGU6IFwiSlNYQXR0cmlidXRlXCIsXG4gICAgbmFtZSxcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hBdHRyaWJ1dGUgYXMgalNYQXR0cmlidXRlIH07XG5leHBvcnQgZnVuY3Rpb24ganN4Q2xvc2luZ0VsZW1lbnQoXG4gIG5hbWU6IHQuSlNYSWRlbnRpZmllciB8IHQuSlNYTWVtYmVyRXhwcmVzc2lvbiB8IHQuSlNYTmFtZXNwYWNlZE5hbWUsXG4pOiB0LkpTWENsb3NpbmdFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWENsb3NpbmdFbGVtZW50Pih7XG4gICAgdHlwZTogXCJKU1hDbG9zaW5nRWxlbWVudFwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4Q2xvc2luZ0VsZW1lbnQgYXMgalNYQ2xvc2luZ0VsZW1lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hFbGVtZW50KFxuICBvcGVuaW5nRWxlbWVudDogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgY2xvc2luZ0VsZW1lbnQ6IHQuSlNYQ2xvc2luZ0VsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgY2hpbGRyZW46IEFycmF5PFxuICAgIHwgdC5KU1hUZXh0XG4gICAgfCB0LkpTWEV4cHJlc3Npb25Db250YWluZXJcbiAgICB8IHQuSlNYU3ByZWFkQ2hpbGRcbiAgICB8IHQuSlNYRWxlbWVudFxuICAgIHwgdC5KU1hGcmFnbWVudFxuICA+LFxuICBzZWxmQ2xvc2luZzogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuKTogdC5KU1hFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWEVsZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkpTWEVsZW1lbnRcIixcbiAgICBvcGVuaW5nRWxlbWVudCxcbiAgICBjbG9zaW5nRWxlbWVudCxcbiAgICBjaGlsZHJlbixcbiAgICBzZWxmQ2xvc2luZyxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hFbGVtZW50IGFzIGpTWEVsZW1lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hFbXB0eUV4cHJlc3Npb24oKTogdC5KU1hFbXB0eUV4cHJlc3Npb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSlNYRW1wdHlFeHByZXNzaW9uXCIsXG4gIH07XG59XG5leHBvcnQgeyBqc3hFbXB0eUV4cHJlc3Npb24gYXMgalNYRW1wdHlFeHByZXNzaW9uIH07XG5leHBvcnQgZnVuY3Rpb24ganN4RXhwcmVzc2lvbkNvbnRhaW5lcihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uIHwgdC5KU1hFbXB0eUV4cHJlc3Npb24sXG4pOiB0LkpTWEV4cHJlc3Npb25Db250YWluZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcj4oe1xuICAgIHR5cGU6IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IHsganN4RXhwcmVzc2lvbkNvbnRhaW5lciBhcyBqU1hFeHByZXNzaW9uQ29udGFpbmVyIH07XG5leHBvcnQgZnVuY3Rpb24ganN4U3ByZWFkQ2hpbGQoZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uKTogdC5KU1hTcHJlYWRDaGlsZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5KU1hTcHJlYWRDaGlsZD4oe1xuICAgIHR5cGU6IFwiSlNYU3ByZWFkQ2hpbGRcIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IGpzeFNwcmVhZENoaWxkIGFzIGpTWFNwcmVhZENoaWxkIH07XG5leHBvcnQgZnVuY3Rpb24ganN4SWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LkpTWElkZW50aWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYSWRlbnRpZmllcj4oe1xuICAgIHR5cGU6IFwiSlNYSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4SWRlbnRpZmllciBhcyBqU1hJZGVudGlmaWVyIH07XG5leHBvcnQgZnVuY3Rpb24ganN4TWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkpTWE1lbWJlckV4cHJlc3Npb24gfCB0LkpTWElkZW50aWZpZXIsXG4gIHByb3BlcnR5OiB0LkpTWElkZW50aWZpZXIsXG4pOiB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYTWVtYmVyRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgIG9iamVjdCxcbiAgICBwcm9wZXJ0eSxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hNZW1iZXJFeHByZXNzaW9uIGFzIGpTWE1lbWJlckV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hOYW1lc3BhY2VkTmFtZShcbiAgbmFtZXNwYWNlOiB0LkpTWElkZW50aWZpZXIsXG4gIG5hbWU6IHQuSlNYSWRlbnRpZmllcixcbik6IHQuSlNYTmFtZXNwYWNlZE5hbWUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYTmFtZXNwYWNlZE5hbWU+KHtcbiAgICB0eXBlOiBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4TmFtZXNwYWNlZE5hbWUgYXMgalNYTmFtZXNwYWNlZE5hbWUgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hPcGVuaW5nRWxlbWVudChcbiAgbmFtZTogdC5KU1hJZGVudGlmaWVyIHwgdC5KU1hNZW1iZXJFeHByZXNzaW9uIHwgdC5KU1hOYW1lc3BhY2VkTmFtZSxcbiAgYXR0cmlidXRlczogQXJyYXk8dC5KU1hBdHRyaWJ1dGUgfCB0LkpTWFNwcmVhZEF0dHJpYnV0ZT4sXG4gIHNlbGZDbG9zaW5nOiBib29sZWFuID0gZmFsc2UsXG4pOiB0LkpTWE9wZW5pbmdFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWE9wZW5pbmdFbGVtZW50Pih7XG4gICAgdHlwZTogXCJKU1hPcGVuaW5nRWxlbWVudFwiLFxuICAgIG5hbWUsXG4gICAgYXR0cmlidXRlcyxcbiAgICBzZWxmQ2xvc2luZyxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hPcGVuaW5nRWxlbWVudCBhcyBqU1hPcGVuaW5nRWxlbWVudCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeFNwcmVhZEF0dHJpYnV0ZShcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbixcbik6IHQuSlNYU3ByZWFkQXR0cmlidXRlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWFNwcmVhZEF0dHJpYnV0ZT4oe1xuICAgIHR5cGU6IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4U3ByZWFkQXR0cmlidXRlIGFzIGpTWFNwcmVhZEF0dHJpYnV0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeFRleHQodmFsdWU6IHN0cmluZyk6IHQuSlNYVGV4dCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5KU1hUZXh0Pih7XG4gICAgdHlwZTogXCJKU1hUZXh0XCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4VGV4dCBhcyBqU1hUZXh0IH07XG5leHBvcnQgZnVuY3Rpb24ganN4RnJhZ21lbnQoXG4gIG9wZW5pbmdGcmFnbWVudDogdC5KU1hPcGVuaW5nRnJhZ21lbnQsXG4gIGNsb3NpbmdGcmFnbWVudDogdC5KU1hDbG9zaW5nRnJhZ21lbnQsXG4gIGNoaWxkcmVuOiBBcnJheTxcbiAgICB8IHQuSlNYVGV4dFxuICAgIHwgdC5KU1hFeHByZXNzaW9uQ29udGFpbmVyXG4gICAgfCB0LkpTWFNwcmVhZENoaWxkXG4gICAgfCB0LkpTWEVsZW1lbnRcbiAgICB8IHQuSlNYRnJhZ21lbnRcbiAgPixcbik6IHQuSlNYRnJhZ21lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYRnJhZ21lbnQ+KHtcbiAgICB0eXBlOiBcIkpTWEZyYWdtZW50XCIsXG4gICAgb3BlbmluZ0ZyYWdtZW50LFxuICAgIGNsb3NpbmdGcmFnbWVudCxcbiAgICBjaGlsZHJlbixcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hGcmFnbWVudCBhcyBqU1hGcmFnbWVudCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeE9wZW5pbmdGcmFnbWVudCgpOiB0LkpTWE9wZW5pbmdGcmFnbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJKU1hPcGVuaW5nRnJhZ21lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IGpzeE9wZW5pbmdGcmFnbWVudCBhcyBqU1hPcGVuaW5nRnJhZ21lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hDbG9zaW5nRnJhZ21lbnQoKTogdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIsXG4gIH07XG59XG5leHBvcnQgeyBqc3hDbG9zaW5nRnJhZ21lbnQgYXMgalNYQ2xvc2luZ0ZyYWdtZW50IH07XG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpOiB0Lk5vb3Age1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiTm9vcFwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBsYWNlaG9sZGVyKFxuICBleHBlY3RlZE5vZGU6XG4gICAgfCBcIklkZW50aWZpZXJcIlxuICAgIHwgXCJTdHJpbmdMaXRlcmFsXCJcbiAgICB8IFwiRXhwcmVzc2lvblwiXG4gICAgfCBcIlN0YXRlbWVudFwiXG4gICAgfCBcIkRlY2xhcmF0aW9uXCJcbiAgICB8IFwiQmxvY2tTdGF0ZW1lbnRcIlxuICAgIHwgXCJDbGFzc0JvZHlcIlxuICAgIHwgXCJQYXR0ZXJuXCIsXG4gIG5hbWU6IHQuSWRlbnRpZmllcixcbik6IHQuUGxhY2Vob2xkZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUGxhY2Vob2xkZXI+KHtcbiAgICB0eXBlOiBcIlBsYWNlaG9sZGVyXCIsXG4gICAgZXhwZWN0ZWROb2RlLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHY4SW50cmluc2ljSWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LlY4SW50cmluc2ljSWRlbnRpZmllciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WOEludHJpbnNpY0lkZW50aWZpZXI+KHtcbiAgICB0eXBlOiBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFyZ3VtZW50UGxhY2Vob2xkZXIoKTogdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24sXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uLFxuKTogdC5CaW5kRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CaW5kRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQmluZEV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgY2FsbGVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRBdHRyaWJ1dGUoXG4gIGtleTogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICB2YWx1ZTogdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5JbXBvcnRBdHRyaWJ1dGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0QXR0cmlidXRlPih7XG4gICAgdHlwZTogXCJJbXBvcnRBdHRyaWJ1dGVcIixcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRvcihleHByZXNzaW9uOiB0LkV4cHJlc3Npb24pOiB0LkRlY29yYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNvcmF0b3I+KHtcbiAgICB0eXBlOiBcIkRlY29yYXRvclwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvRXhwcmVzc2lvbihcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuRG9FeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRvRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiRG9FeHByZXNzaW9uXCIsXG4gICAgYm9keSxcbiAgICBhc3luYyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0RGVmYXVsdFNwZWNpZmllcihcbiAgZXhwb3J0ZWQ6IHQuSWRlbnRpZmllcixcbik6IHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FeHBvcnREZWZhdWx0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgZXhwb3J0ZWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEV4cHJlc3Npb24oXG4gIHByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0UHJvcGVydHkgfCB0LlNwcmVhZEVsZW1lbnQ+LFxuKTogdC5SZWNvcmRFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlJlY29yZEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlJlY29yZEV4cHJlc3Npb25cIixcbiAgICBwcm9wZXJ0aWVzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0dXBsZUV4cHJlc3Npb24oXG4gIGVsZW1lbnRzOiBBcnJheTx0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQ+ID0gW10sXG4pOiB0LlR1cGxlRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UdXBsZUV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlR1cGxlRXhwcmVzc2lvblwiLFxuICAgIGVsZW1lbnRzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNpbWFsTGl0ZXJhbCh2YWx1ZTogc3RyaW5nKTogdC5EZWNpbWFsTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNpbWFsTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiRGVjaW1hbExpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlRXhwcmVzc2lvbihib2R5OiB0LlByb2dyYW0pOiB0Lk1vZHVsZUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTW9kdWxlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiTW9kdWxlRXhwcmVzc2lvblwiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvcGljUmVmZXJlbmNlKCk6IHQuVG9waWNSZWZlcmVuY2Uge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVG9waWNSZWZlcmVuY2VcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVRvcGljRXhwcmVzc2lvbihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuKTogdC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZUJhcmVGdW5jdGlvbihcbiAgY2FsbGVlOiB0LkV4cHJlc3Npb24sXG4pOiB0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uPih7XG4gICAgdHlwZTogXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLFxuICAgIGNhbGxlZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2UoKTogdC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZVwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRzUGFyYW1ldGVyUHJvcGVydHkoXG4gIHBhcmFtZXRlcjogdC5JZGVudGlmaWVyIHwgdC5Bc3NpZ25tZW50UGF0dGVybixcbik6IHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1BhcmFtZXRlclByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJUU1BhcmFtZXRlclByb3BlcnR5XCIsXG4gICAgcGFyYW1ldGVyLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUGFyYW1ldGVyUHJvcGVydHkgYXMgdFNQYXJhbWV0ZXJQcm9wZXJ0eSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRGVjbGFyZUZ1bmN0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHR5cGVQYXJhbWV0ZXJzOlxuICAgIHwgdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgIHwgdC5Ob29wXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQ+LFxuICByZXR1cm5UeXBlOiB0LlRTVHlwZUFubm90YXRpb24gfCB0Lk5vb3AgfCBudWxsID0gbnVsbCxcbik6IHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNEZWNsYXJlRnVuY3Rpb24+KHtcbiAgICB0eXBlOiBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgcGFyYW1zLFxuICAgIHJldHVyblR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNEZWNsYXJlRnVuY3Rpb24gYXMgdFNEZWNsYXJlRnVuY3Rpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0RlY2xhcmVNZXRob2QoXG4gIGRlY29yYXRvcnM6IEFycmF5PHQuRGVjb3JhdG9yPiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOlxuICAgIHwgdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgIHwgdC5Ob29wXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PFxuICAgIHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQgfCB0LlRTUGFyYW1ldGVyUHJvcGVydHlcbiAgPixcbiAgcmV0dXJuVHlwZTogdC5UU1R5cGVBbm5vdGF0aW9uIHwgdC5Ob29wIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTRGVjbGFyZU1ldGhvZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0RlY2xhcmVNZXRob2Q+KHtcbiAgICB0eXBlOiBcIlRTRGVjbGFyZU1ldGhvZFwiLFxuICAgIGRlY29yYXRvcnMsXG4gICAga2V5LFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtcyxcbiAgICByZXR1cm5UeXBlLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRGVjbGFyZU1ldGhvZCBhcyB0U0RlY2xhcmVNZXRob2QgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1F1YWxpZmllZE5hbWUoXG4gIGxlZnQ6IHQuVFNFbnRpdHlOYW1lLFxuICByaWdodDogdC5JZGVudGlmaWVyLFxuKTogdC5UU1F1YWxpZmllZE5hbWUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNRdWFsaWZpZWROYW1lPih7XG4gICAgdHlwZTogXCJUU1F1YWxpZmllZE5hbWVcIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUXVhbGlmaWVkTmFtZSBhcyB0U1F1YWxpZmllZE5hbWUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1ldGVyczogQXJyYXk8dC5JZGVudGlmaWVyIHwgdC5SZXN0RWxlbWVudD4sXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgcGFyYW1ldGVycyxcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiBhcyB0U0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiBhcyB0U0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNQcm9wZXJ0eVNpZ25hdHVyZShcbiAga2V5OiB0LkV4cHJlc3Npb24sXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbiAgaW5pdGlhbGl6ZXI6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1Byb3BlcnR5U2lnbmF0dXJlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTUHJvcGVydHlTaWduYXR1cmU+KHtcbiAgICB0eXBlOiBcIlRTUHJvcGVydHlTaWduYXR1cmVcIixcbiAgICBrZXksXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgaW5pdGlhbGl6ZXIsXG4gICAga2luZDogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1Byb3BlcnR5U2lnbmF0dXJlIGFzIHRTUHJvcGVydHlTaWduYXR1cmUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01ldGhvZFNpZ25hdHVyZShcbiAga2V5OiB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTTWV0aG9kU2lnbmF0dXJlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTTWV0aG9kU2lnbmF0dXJlPih7XG4gICAgdHlwZTogXCJUU01ldGhvZFNpZ25hdHVyZVwiLFxuICAgIGtleSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGtpbmQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNZXRob2RTaWduYXR1cmUgYXMgdFNNZXRob2RTaWduYXR1cmUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luZGV4U2lnbmF0dXJlKFxuICBwYXJhbWV0ZXJzOiBBcnJheTx0LklkZW50aWZpZXI+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTSW5kZXhTaWduYXR1cmUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNJbmRleFNpZ25hdHVyZT4oe1xuICAgIHR5cGU6IFwiVFNJbmRleFNpZ25hdHVyZVwiLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNJbmRleFNpZ25hdHVyZSBhcyB0U0luZGV4U2lnbmF0dXJlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNBbnlLZXl3b3JkKCk6IHQuVFNBbnlLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTQW55S2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNBbnlLZXl3b3JkIGFzIHRTQW55S2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQm9vbGVhbktleXdvcmQoKTogdC5UU0Jvb2xlYW5LZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTQm9vbGVhbktleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzQm9vbGVhbktleXdvcmQgYXMgdFNCb29sZWFuS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQmlnSW50S2V5d29yZCgpOiB0LlRTQmlnSW50S2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU0JpZ0ludEtleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzQmlnSW50S2V5d29yZCBhcyB0U0JpZ0ludEtleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ludHJpbnNpY0tleXdvcmQoKTogdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNJbnRyaW5zaWNLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c0ludHJpbnNpY0tleXdvcmQgYXMgdFNJbnRyaW5zaWNLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNOZXZlcktleXdvcmQoKTogdC5UU05ldmVyS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU05ldmVyS2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNOZXZlcktleXdvcmQgYXMgdFNOZXZlcktleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c051bGxLZXl3b3JkKCk6IHQuVFNOdWxsS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU051bGxLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c051bGxLZXl3b3JkIGFzIHRTTnVsbEtleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c051bWJlcktleXdvcmQoKTogdC5UU051bWJlcktleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNOdW1iZXJLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c051bWJlcktleXdvcmQgYXMgdFNOdW1iZXJLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNPYmplY3RLZXl3b3JkKCk6IHQuVFNPYmplY3RLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNPYmplY3RLZXl3b3JkIGFzIHRTT2JqZWN0S2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzU3RyaW5nS2V5d29yZCgpOiB0LlRTU3RyaW5nS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU1N0cmluZ0tleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzU3RyaW5nS2V5d29yZCBhcyB0U1N0cmluZ0tleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1N5bWJvbEtleXdvcmQoKTogdC5UU1N5bWJvbEtleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNTeW1ib2xLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c1N5bWJvbEtleXdvcmQgYXMgdFNTeW1ib2xLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNVbmRlZmluZWRLZXl3b3JkKCk6IHQuVFNVbmRlZmluZWRLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNVbmRlZmluZWRLZXl3b3JkIGFzIHRTVW5kZWZpbmVkS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVW5rbm93bktleXdvcmQoKTogdC5UU1Vua25vd25LZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVW5rbm93bktleXdvcmQgYXMgdFNVbmtub3duS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVm9pZEtleXdvcmQoKTogdC5UU1ZvaWRLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVm9pZEtleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVm9pZEtleXdvcmQgYXMgdFNWb2lkS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVGhpc1R5cGUoKTogdC5UU1RoaXNUeXBlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVGhpc1R5cGVcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVGhpc1R5cGUgYXMgdFNUaGlzVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRnVuY3Rpb25UeXBlKFxuICB0eXBlUGFyYW1ldGVyczogdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbWV0ZXJzOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlJlc3RFbGVtZW50PixcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlQW5ub3RhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0Z1bmN0aW9uVHlwZT4oe1xuICAgIHR5cGU6IFwiVFNGdW5jdGlvblR5cGVcIixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRnVuY3Rpb25UeXBlIGFzIHRTRnVuY3Rpb25UeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNDb25zdHJ1Y3RvclR5cGUoXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTQ29uc3RydWN0b3JUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQ29uc3RydWN0b3JUeXBlPih7XG4gICAgdHlwZTogXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25zdHJ1Y3RvclR5cGUgYXMgdFNDb25zdHJ1Y3RvclR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVSZWZlcmVuY2UoXG4gIHR5cGVOYW1lOiB0LlRTRW50aXR5TmFtZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVSZWZlcmVuY2Uge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlUmVmZXJlbmNlPih7XG4gICAgdHlwZTogXCJUU1R5cGVSZWZlcmVuY2VcIixcbiAgICB0eXBlTmFtZSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVSZWZlcmVuY2UgYXMgdFNUeXBlUmVmZXJlbmNlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlUHJlZGljYXRlKFxuICBwYXJhbWV0ZXJOYW1lOiB0LklkZW50aWZpZXIgfCB0LlRTVGhpc1R5cGUsXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbiAgYXNzZXJ0czogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVQcmVkaWNhdGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlUHJlZGljYXRlPih7XG4gICAgdHlwZTogXCJUU1R5cGVQcmVkaWNhdGVcIixcbiAgICBwYXJhbWV0ZXJOYW1lLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGFzc2VydHMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUHJlZGljYXRlIGFzIHRTVHlwZVByZWRpY2F0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZVF1ZXJ5KFxuICBleHByTmFtZTogdC5UU0VudGl0eU5hbWUgfCB0LlRTSW1wb3J0VHlwZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVRdWVyeSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVRdWVyeT4oe1xuICAgIHR5cGU6IFwiVFNUeXBlUXVlcnlcIixcbiAgICBleHByTmFtZSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVRdWVyeSBhcyB0U1R5cGVRdWVyeSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZUxpdGVyYWwoXG4gIG1lbWJlcnM6IEFycmF5PHQuVFNUeXBlRWxlbWVudD4sXG4pOiB0LlRTVHlwZUxpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiVFNUeXBlTGl0ZXJhbFwiLFxuICAgIG1lbWJlcnMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlTGl0ZXJhbCBhcyB0U1R5cGVMaXRlcmFsIH07XG5leHBvcnQgZnVuY3Rpb24gdHNBcnJheVR5cGUoZWxlbWVudFR5cGU6IHQuVFNUeXBlKTogdC5UU0FycmF5VHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0FycmF5VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNBcnJheVR5cGVcIixcbiAgICBlbGVtZW50VHlwZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0FycmF5VHlwZSBhcyB0U0FycmF5VHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHVwbGVUeXBlKFxuICBlbGVtZW50VHlwZXM6IEFycmF5PHQuVFNUeXBlIHwgdC5UU05hbWVkVHVwbGVNZW1iZXI+LFxuKTogdC5UU1R1cGxlVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R1cGxlVHlwZT4oe1xuICAgIHR5cGU6IFwiVFNUdXBsZVR5cGVcIixcbiAgICBlbGVtZW50VHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUdXBsZVR5cGUgYXMgdFNUdXBsZVR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c09wdGlvbmFsVHlwZSh0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTT3B0aW9uYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTT3B0aW9uYWxUeXBlPih7XG4gICAgdHlwZTogXCJUU09wdGlvbmFsVHlwZVwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzT3B0aW9uYWxUeXBlIGFzIHRTT3B0aW9uYWxUeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNSZXN0VHlwZSh0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTUmVzdFR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNSZXN0VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNSZXN0VHlwZVwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUmVzdFR5cGUgYXMgdFNSZXN0VHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTmFtZWRUdXBsZU1lbWJlcihcbiAgbGFiZWw6IHQuSWRlbnRpZmllcixcbiAgZWxlbWVudFR5cGU6IHQuVFNUeXBlLFxuICBvcHRpb25hbDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5UU05hbWVkVHVwbGVNZW1iZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNOYW1lZFR1cGxlTWVtYmVyPih7XG4gICAgdHlwZTogXCJUU05hbWVkVHVwbGVNZW1iZXJcIixcbiAgICBsYWJlbCxcbiAgICBlbGVtZW50VHlwZSxcbiAgICBvcHRpb25hbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c05hbWVkVHVwbGVNZW1iZXIgYXMgdFNOYW1lZFR1cGxlTWVtYmVyIH07XG5leHBvcnQgZnVuY3Rpb24gdHNVbmlvblR5cGUodHlwZXM6IEFycmF5PHQuVFNUeXBlPik6IHQuVFNVbmlvblR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNVbmlvblR5cGU+KHtcbiAgICB0eXBlOiBcIlRTVW5pb25UeXBlXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNVbmlvblR5cGUgYXMgdFNVbmlvblR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ludGVyc2VjdGlvblR5cGUoXG4gIHR5cGVzOiBBcnJheTx0LlRTVHlwZT4sXG4pOiB0LlRTSW50ZXJzZWN0aW9uVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0ludGVyc2VjdGlvblR5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiLFxuICAgIHR5cGVzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW50ZXJzZWN0aW9uVHlwZSBhcyB0U0ludGVyc2VjdGlvblR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0NvbmRpdGlvbmFsVHlwZShcbiAgY2hlY2tUeXBlOiB0LlRTVHlwZSxcbiAgZXh0ZW5kc1R5cGU6IHQuVFNUeXBlLFxuICB0cnVlVHlwZTogdC5UU1R5cGUsXG4gIGZhbHNlVHlwZTogdC5UU1R5cGUsXG4pOiB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQ29uZGl0aW9uYWxUeXBlPih7XG4gICAgdHlwZTogXCJUU0NvbmRpdGlvbmFsVHlwZVwiLFxuICAgIGNoZWNrVHlwZSxcbiAgICBleHRlbmRzVHlwZSxcbiAgICB0cnVlVHlwZSxcbiAgICBmYWxzZVR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25kaXRpb25hbFR5cGUgYXMgdFNDb25kaXRpb25hbFR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luZmVyVHlwZSh0eXBlUGFyYW1ldGVyOiB0LlRTVHlwZVBhcmFtZXRlcik6IHQuVFNJbmZlclR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNJbmZlclR5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW5mZXJUeXBlXCIsXG4gICAgdHlwZVBhcmFtZXRlcixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luZmVyVHlwZSBhcyB0U0luZmVyVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzUGFyZW50aGVzaXplZFR5cGUoXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZSxcbik6IHQuVFNQYXJlbnRoZXNpemVkVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1BhcmVudGhlc2l6ZWRUeXBlPih7XG4gICAgdHlwZTogXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNQYXJlbnRoZXNpemVkVHlwZSBhcyB0U1BhcmVudGhlc2l6ZWRUeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlT3BlcmF0b3IodHlwZUFubm90YXRpb246IHQuVFNUeXBlKTogdC5UU1R5cGVPcGVyYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVPcGVyYXRvcj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlT3BlcmF0b3JcIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgICBvcGVyYXRvcjogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVPcGVyYXRvciBhcyB0U1R5cGVPcGVyYXRvciB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuVFNUeXBlLFxuICBpbmRleFR5cGU6IHQuVFNUeXBlLFxuKTogdC5UU0luZGV4ZWRBY2Nlc3NUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW5kZXhlZEFjY2Vzc1R5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIixcbiAgICBvYmplY3RUeXBlLFxuICAgIGluZGV4VHlwZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luZGV4ZWRBY2Nlc3NUeXBlIGFzIHRTSW5kZXhlZEFjY2Vzc1R5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01hcHBlZFR5cGUoXG4gIHR5cGVQYXJhbWV0ZXI6IHQuVFNUeXBlUGFyYW1ldGVyLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUgfCBudWxsID0gbnVsbCxcbiAgbmFtZVR5cGU6IHQuVFNUeXBlIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTTWFwcGVkVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU01hcHBlZFR5cGU+KHtcbiAgICB0eXBlOiBcIlRTTWFwcGVkVHlwZVwiLFxuICAgIHR5cGVQYXJhbWV0ZXIsXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgbmFtZVR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNYXBwZWRUeXBlIGFzIHRTTWFwcGVkVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTGl0ZXJhbFR5cGUoXG4gIGxpdGVyYWw6XG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LlN0cmluZ0xpdGVyYWxcbiAgICB8IHQuQm9vbGVhbkxpdGVyYWxcbiAgICB8IHQuQmlnSW50TGl0ZXJhbFxuICAgIHwgdC5UZW1wbGF0ZUxpdGVyYWxcbiAgICB8IHQuVW5hcnlFeHByZXNzaW9uLFxuKTogdC5UU0xpdGVyYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTTGl0ZXJhbFR5cGU+KHtcbiAgICB0eXBlOiBcIlRTTGl0ZXJhbFR5cGVcIixcbiAgICBsaXRlcmFsLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzTGl0ZXJhbFR5cGUgYXMgdFNMaXRlcmFsVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKFxuICBleHByZXNzaW9uOiB0LlRTRW50aXR5TmFtZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4oe1xuICAgIHR5cGU6IFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIixcbiAgICBleHByZXNzaW9uLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGFzIHRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIH07XG5leHBvcnQgZnVuY3Rpb24gdHNJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+IHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIGJvZHk6IHQuVFNJbnRlcmZhY2VCb2R5LFxuKTogdC5UU0ludGVyZmFjZURlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW50ZXJmYWNlRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBleHRlbmRzOiBfZXh0ZW5kcyxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW50ZXJmYWNlRGVjbGFyYXRpb24gYXMgdFNJbnRlcmZhY2VEZWNsYXJhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzSW50ZXJmYWNlQm9keShcbiAgYm9keTogQXJyYXk8dC5UU1R5cGVFbGVtZW50Pixcbik6IHQuVFNJbnRlcmZhY2VCb2R5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW50ZXJmYWNlQm9keT4oe1xuICAgIHR5cGU6IFwiVFNJbnRlcmZhY2VCb2R5XCIsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0ludGVyZmFjZUJvZHkgYXMgdFNJbnRlcmZhY2VCb2R5IH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlLFxuKTogdC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTVHlwZUFsaWFzRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTVHlwZUFsaWFzRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVBbGlhc0RlY2xhcmF0aW9uIGFzIHRTVHlwZUFsaWFzRGVjbGFyYXRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0luc3RhbnRpYXRpb25FeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uIGFzIHRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0FzRXhwcmVzc2lvbihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUsXG4pOiB0LlRTQXNFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQXNFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNBc0V4cHJlc3Npb24gYXMgdFNBc0V4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1NhdGlzZmllc0V4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlLFxuKTogdC5UU1NhdGlzZmllc0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNTYXRpc2ZpZXNFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIixcbiAgICBleHByZXNzaW9uLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzU2F0aXNmaWVzRXhwcmVzc2lvbiBhcyB0U1NhdGlzZmllc0V4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVBc3NlcnRpb24oXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZSxcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuKTogdC5UU1R5cGVBc3NlcnRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlQXNzZXJ0aW9uPih7XG4gICAgdHlwZTogXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzVHlwZUFzc2VydGlvbiBhcyB0U1R5cGVBc3NlcnRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0VudW1EZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgbWVtYmVyczogQXJyYXk8dC5UU0VudW1NZW1iZXI+LFxuKTogdC5UU0VudW1EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0VudW1EZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNFbnVtRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICBtZW1iZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRW51bURlY2xhcmF0aW9uIGFzIHRTRW51bURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNFbnVtTWVtYmVyKFxuICBpZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICBpbml0aWFsaXplcjogdC5FeHByZXNzaW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTRW51bU1lbWJlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0VudW1NZW1iZXI+KHtcbiAgICB0eXBlOiBcIlRTRW51bU1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXRpYWxpemVyLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRW51bU1lbWJlciBhcyB0U0VudW1NZW1iZXIgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01vZHVsZURlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICBib2R5OiB0LlRTTW9kdWxlQmxvY2sgfCB0LlRTTW9kdWxlRGVjbGFyYXRpb24sXG4pOiB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNNb2R1bGVEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNb2R1bGVEZWNsYXJhdGlvbiBhcyB0U01vZHVsZURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNNb2R1bGVCbG9jayhib2R5OiBBcnJheTx0LlN0YXRlbWVudD4pOiB0LlRTTW9kdWxlQmxvY2sge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNNb2R1bGVCbG9jaz4oe1xuICAgIHR5cGU6IFwiVFNNb2R1bGVCbG9ja1wiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNb2R1bGVCbG9jayBhcyB0U01vZHVsZUJsb2NrIH07XG5leHBvcnQgZnVuY3Rpb24gdHNJbXBvcnRUeXBlKFxuICBhcmd1bWVudDogdC5TdHJpbmdMaXRlcmFsLFxuICBxdWFsaWZpZXI6IHQuVFNFbnRpdHlOYW1lIHwgbnVsbCA9IG51bGwsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNJbXBvcnRUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW1wb3J0VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNJbXBvcnRUeXBlXCIsXG4gICAgYXJndW1lbnQsXG4gICAgcXVhbGlmaWVyLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW1wb3J0VHlwZSBhcyB0U0ltcG9ydFR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICBtb2R1bGVSZWZlcmVuY2U6IHQuVFNFbnRpdHlOYW1lIHwgdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlLFxuKTogdC5UU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICBtb2R1bGVSZWZlcmVuY2UsXG4gICAgaXNFeHBvcnQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiBhcyB0U0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZShcbiAgZXhwcmVzc2lvbjogdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+KHtcbiAgICB0eXBlOiBcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UgYXMgdFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTm9uTnVsbEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbik6IHQuVFNOb25OdWxsRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU05vbk51bGxFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU05vbk51bGxFeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c05vbk51bGxFeHByZXNzaW9uIGFzIHRTTm9uTnVsbEV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0V4cG9ydEFzc2lnbm1lbnQoXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbik6IHQuVFNFeHBvcnRBc3NpZ25tZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTRXhwb3J0QXNzaWdubWVudD4oe1xuICAgIHR5cGU6IFwiVFNFeHBvcnRBc3NpZ25tZW50XCIsXG4gICAgZXhwcmVzc2lvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0V4cG9ydEFzc2lnbm1lbnQgYXMgdFNFeHBvcnRBc3NpZ25tZW50IH07XG5leHBvcnQgZnVuY3Rpb24gdHNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbik6IHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiBhcyB0U05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlQW5ub3RhdGlvbih0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzVHlwZUFubm90YXRpb24gYXMgdFNUeXBlQW5ub3RhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oXG4gIHBhcmFtczogQXJyYXk8dC5UU1R5cGU+LFxuKTogdC5UU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiBhcyB0U1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gIHBhcmFtczogQXJyYXk8dC5UU1R5cGVQYXJhbWV0ZXI+LFxuKTogdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXMgdFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVQYXJhbWV0ZXIoXG4gIGNvbnN0cmFpbnQ6IHQuVFNUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIF9kZWZhdWx0OiB0LlRTVHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBuYW1lOiBzdHJpbmcsXG4pOiB0LlRTVHlwZVBhcmFtZXRlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVQYXJhbWV0ZXI+KHtcbiAgICB0eXBlOiBcIlRTVHlwZVBhcmFtZXRlclwiLFxuICAgIGNvbnN0cmFpbnQsXG4gICAgZGVmYXVsdDogX2RlZmF1bHQsXG4gICAgbmFtZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVQYXJhbWV0ZXIgYXMgdFNUeXBlUGFyYW1ldGVyIH07XG4vKiogQGRlcHJlY2F0ZWQgKi9cbmZ1bmN0aW9uIE51bWJlckxpdGVyYWwodmFsdWU6IG51bWJlcikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJOdW1iZXJMaXRlcmFsXCIsIFwiTnVtZXJpY0xpdGVyYWxcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIG51bWVyaWNMaXRlcmFsKHZhbHVlKTtcbn1cbmV4cG9ydCB7IE51bWJlckxpdGVyYWwgYXMgbnVtYmVyTGl0ZXJhbCB9O1xuLyoqIEBkZXByZWNhdGVkICovXG5mdW5jdGlvbiBSZWdleExpdGVyYWwocGF0dGVybjogc3RyaW5nLCBmbGFnczogc3RyaW5nID0gXCJcIikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJSZWdleExpdGVyYWxcIiwgXCJSZWdFeHBMaXRlcmFsXCIsIFwiVGhlIG5vZGUgdHlwZSBcIik7XG4gIHJldHVybiByZWdFeHBMaXRlcmFsKHBhdHRlcm4sIGZsYWdzKTtcbn1cbmV4cG9ydCB7IFJlZ2V4TGl0ZXJhbCBhcyByZWdleExpdGVyYWwgfTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZnVuY3Rpb24gUmVzdFByb3BlcnR5KGFyZ3VtZW50OiB0LkxWYWwpIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiUmVzdFByb3BlcnR5XCIsIFwiUmVzdEVsZW1lbnRcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIHJlc3RFbGVtZW50KGFyZ3VtZW50KTtcbn1cbmV4cG9ydCB7IFJlc3RQcm9wZXJ0eSBhcyByZXN0UHJvcGVydHkgfTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZnVuY3Rpb24gU3ByZWFkUHJvcGVydHkoYXJndW1lbnQ6IHQuRXhwcmVzc2lvbikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJTcHJlYWRQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIHNwcmVhZEVsZW1lbnQoYXJndW1lbnQpO1xufVxuZXhwb3J0IHsgU3ByZWFkUHJvcGVydHkgYXMgc3ByZWFkUHJvcGVydHkgfTtcbiIsICJpbXBvcnQgeyBzdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uLy4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IHsgaW5oZXJpdHMgfSBmcm9tIFwiLi4vLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkKFxuICBjaGlsZDogdC5KU1hUZXh0LFxuICBhcmdzOiBBcnJheTx0Lk5vZGU+LFxuKSB7XG4gIGNvbnN0IGxpbmVzID0gY2hpbGQudmFsdWUuc3BsaXQoL1xcclxcbnxcXG58XFxyLyk7XG5cbiAgbGV0IGxhc3ROb25FbXB0eUxpbmUgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGluZXNbaV0ubWF0Y2goL1teIFxcdF0vKSkge1xuICAgICAgbGFzdE5vbkVtcHR5TGluZSA9IGk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHN0ciA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcblxuICAgIGNvbnN0IGlzRmlyc3RMaW5lID0gaSA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RMaW5lID0gaSA9PT0gbGluZXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBpc0xhc3ROb25FbXB0eUxpbmUgPSBpID09PSBsYXN0Tm9uRW1wdHlMaW5lO1xuXG4gICAgLy8gcmVwbGFjZSByZW5kZXJlZCB3aGl0ZXNwYWNlIHRhYnMgd2l0aCBzcGFjZXNcbiAgICBsZXQgdHJpbW1lZExpbmUgPSBsaW5lLnJlcGxhY2UoL1xcdC9nLCBcIiBcIik7XG5cbiAgICAvLyB0cmltIHdoaXRlc3BhY2UgdG91Y2hpbmcgYSBuZXdsaW5lXG4gICAgaWYgKCFpc0ZpcnN0TGluZSkge1xuICAgICAgdHJpbW1lZExpbmUgPSB0cmltbWVkTGluZS5yZXBsYWNlKC9eWyBdKy8sIFwiXCIpO1xuICAgIH1cblxuICAgIC8vIHRyaW0gd2hpdGVzcGFjZSB0b3VjaGluZyBhbiBlbmRsaW5lXG4gICAgaWYgKCFpc0xhc3RMaW5lKSB7XG4gICAgICB0cmltbWVkTGluZSA9IHRyaW1tZWRMaW5lLnJlcGxhY2UoL1sgXSskLywgXCJcIik7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lKSB7XG4gICAgICBpZiAoIWlzTGFzdE5vbkVtcHR5TGluZSkge1xuICAgICAgICB0cmltbWVkTGluZSArPSBcIiBcIjtcbiAgICAgIH1cblxuICAgICAgc3RyICs9IHRyaW1tZWRMaW5lO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHIpIGFyZ3MucHVzaChpbmhlcml0cyhzdHJpbmdMaXRlcmFsKHN0ciksIGNoaWxkKSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNKU1hUZXh0LFxuICBpc0pTWEV4cHJlc3Npb25Db250YWluZXIsXG4gIGlzSlNYRW1wdHlFeHByZXNzaW9uLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCBjbGVhbkpTWEVsZW1lbnRMaXRlcmFsQ2hpbGQgZnJvbSBcIi4uLy4uL3V0aWxzL3JlYWN0L2NsZWFuSlNYRWxlbWVudExpdGVyYWxDaGlsZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuXG50eXBlIFJldHVybmVkQ2hpbGQgPVxuICB8IHQuSlNYU3ByZWFkQ2hpbGRcbiAgfCB0LkpTWEVsZW1lbnRcbiAgfCB0LkpTWEZyYWdtZW50XG4gIHwgdC5FeHByZXNzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZENoaWxkcmVuKFxuICBub2RlOiB0LkpTWEVsZW1lbnQgfCB0LkpTWEZyYWdtZW50LFxuKTogUmV0dXJuZWRDaGlsZFtdIHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQ6IGFueSA9IG5vZGUuY2hpbGRyZW5baV07XG5cbiAgICBpZiAoaXNKU1hUZXh0KGNoaWxkKSkge1xuICAgICAgY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkKGNoaWxkLCBlbGVtZW50cyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNKU1hFeHByZXNzaW9uQ29udGFpbmVyKGNoaWxkKSkgY2hpbGQgPSBjaGlsZC5leHByZXNzaW9uO1xuICAgIGlmIChpc0pTWEVtcHR5RXhwcmVzc2lvbihjaGlsZCkpIGNvbnRpbnVlO1xuXG4gICAgZWxlbWVudHMucHVzaChjaGlsZCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudHM7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTm9kZShub2RlOiBhbnkpOiBub2RlIGlzIHQuTm9kZSB7XG4gIHJldHVybiAhIShub2RlICYmIFZJU0lUT1JfS0VZU1tub2RlLnR5cGVdKTtcbn1cbiIsICJpbXBvcnQgaXNOb2RlIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzTm9kZVwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc3NlcnROb2RlKG5vZGU/OiBhbnkpOiBhc3NlcnRzIG5vZGUgaXMgdC5Ob2RlIHtcbiAgaWYgKCFpc05vZGUobm9kZSkpIHtcbiAgICBjb25zdCB0eXBlID0gbm9kZT8udHlwZSA/PyBKU09OLnN0cmluZ2lmeShub2RlKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBOb3QgYSB2YWxpZCBub2RlIG9mIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQhIERvIG5vdCBtb2RpZnkgaXQgZGlyZWN0bHkuXG4gKiBUbyByZS1nZW5lcmF0ZSBydW4gJ21ha2UgYnVpbGQnXG4gKi9cbmltcG9ydCBpcyBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9pc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IGRlcHJlY2F0aW9uV2FybmluZyBmcm9tIFwiLi4vLi4vdXRpbHMvZGVwcmVjYXRpb25XYXJuaW5nXCI7XG5cbmZ1bmN0aW9uIGFzc2VydCh0eXBlOiBzdHJpbmcsIG5vZGU6IGFueSwgb3B0cz86IGFueSk6IHZvaWQge1xuICBpZiAoIWlzKHR5cGUsIG5vZGUsIG9wdHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIHR5cGUgXCIke3R5cGV9XCIgd2l0aCBvcHRpb24gJHtKU09OLnN0cmluZ2lmeShvcHRzKX0sIGAgK1xuICAgICAgICBgYnV0IGluc3RlYWQgZ290IFwiJHtub2RlLnR5cGV9XCIuYCxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBcnJheUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyYXlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXJyYXlFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkFzc2lnbm1lbnRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmluYXJ5RXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaW5hcnlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQmluYXJ5RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnRlcnByZXRlckRpcmVjdGl2ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbnRlcnByZXRlckRpcmVjdGl2ZSB7XG4gIGFzc2VydChcIkludGVycHJldGVyRGlyZWN0aXZlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERpcmVjdGl2ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EaXJlY3RpdmUge1xuICBhc3NlcnQoXCJEaXJlY3RpdmVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGlyZWN0aXZlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EaXJlY3RpdmVMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiRGlyZWN0aXZlTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCbG9ja1N0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CbG9ja1N0YXRlbWVudCB7XG4gIGFzc2VydChcIkJsb2NrU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJyZWFrU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJyZWFrU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiQnJlYWtTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2FsbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDYWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDYXRjaENsYXVzZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DYXRjaENsYXVzZSB7XG4gIGFzc2VydChcIkNhdGNoQ2xhdXNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENvbmRpdGlvbmFsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db25kaXRpb25hbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29udGludWVTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ29udGludWVTdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJDb250aW51ZVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWJ1Z2dlclN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWJ1Z2dlclN0YXRlbWVudCB7XG4gIGFzc2VydChcIkRlYnVnZ2VyU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERvV2hpbGVTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRG9XaGlsZVN0YXRlbWVudCB7XG4gIGFzc2VydChcIkRvV2hpbGVTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW1wdHlTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW1wdHlTdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJFbXB0eVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHByZXNzaW9uU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZpbGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmlsZSB7XG4gIGFzc2VydChcIkZpbGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rm9ySW5TdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRm9ySW5TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJGb3JJblN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGb3JTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRm9yU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb25FeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJZGVudGlmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LklkZW50aWZpZXIge1xuICBhc3NlcnQoXCJJZGVudGlmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElmU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LklmU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiSWZTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TGFiZWxlZFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5MYWJlbGVkU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiTGFiZWxlZFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdHJpbmdMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN0cmluZ0xpdGVyYWwge1xuICBhc3NlcnQoXCJTdHJpbmdMaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bWVyaWNMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk51bWVyaWNMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiTnVtZXJpY0xpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TnVsbExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbExpdGVyYWwge1xuICBhc3NlcnQoXCJOdWxsTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCb29sZWFuTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Cb29sZWFuTGl0ZXJhbCB7XG4gIGFzc2VydChcIkJvb2xlYW5MaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJlZ0V4cExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUmVnRXhwTGl0ZXJhbCB7XG4gIGFzc2VydChcIlJlZ0V4cExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TG9naWNhbEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJMb2dpY2FsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJNZW1iZXJFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ld0V4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTmV3RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIk5ld0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHJvZ3JhbShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcm9ncmFtIHtcbiAgYXNzZXJ0KFwiUHJvZ3JhbVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJPYmplY3RFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdE1ldGhvZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RNZXRob2Qge1xuICBhc3NlcnQoXCJPYmplY3RNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0UHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT2JqZWN0UHJvcGVydHkge1xuICBhc3NlcnQoXCJPYmplY3RQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSZXN0RWxlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZXN0RWxlbWVudCB7XG4gIGFzc2VydChcIlJlc3RFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJldHVyblN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZXR1cm5TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJSZXR1cm5TdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2VxdWVuY2VFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlNlcXVlbmNlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN3aXRjaENhc2UoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3dpdGNoQ2FzZSB7XG4gIGFzc2VydChcIlN3aXRjaENhc2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3dpdGNoU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN3aXRjaFN0YXRlbWVudCB7XG4gIGFzc2VydChcIlN3aXRjaFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUaGlzRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UaGlzRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRoaXNFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRocm93U3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRocm93U3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiVGhyb3dTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHJ5U3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRyeVN0YXRlbWVudCB7XG4gIGFzc2VydChcIlRyeVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVbmFyeUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVW5hcnlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVW5hcnlFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVwZGF0ZUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVXBkYXRlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlVwZGF0ZUV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFyaWFibGVEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5WYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYXJpYWJsZURlY2xhcmF0b3IoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVmFyaWFibGVEZWNsYXJhdG9yIHtcbiAgYXNzZXJ0KFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdoaWxlU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LldoaWxlU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiV2hpbGVTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V2l0aFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5XaXRoU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiV2l0aFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBc3NpZ25tZW50UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIGFzc2VydChcIkFzc2lnbm1lbnRQYXR0ZXJuXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFycmF5UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5BcnJheVBhdHRlcm4ge1xuICBhc3NlcnQoXCJBcnJheVBhdHRlcm5cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXJyb3dGdW5jdGlvbkV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc0JvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NCb2R5IHtcbiAgYXNzZXJ0KFwiQ2xhc3NCb2R5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0V4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDbGFzc0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiQ2xhc3NEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnRBbGxEZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhwb3J0TmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnRTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0U3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiRXhwb3J0U3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZvck9mU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZvck9mU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yT2ZTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1wb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW1wb3J0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJJbXBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbXBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltcG9ydERlZmF1bHRTcGVjaWZpZXIge1xuICBhc3NlcnQoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIge1xuICBhc3NlcnQoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1wb3J0U3BlY2lmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltcG9ydFNwZWNpZmllciB7XG4gIGFzc2VydChcIkltcG9ydFNwZWNpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNZXRhUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTWV0YVByb3BlcnR5IHtcbiAgYXNzZXJ0KFwiTWV0YVByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzTWV0aG9kKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzTWV0aG9kIHtcbiAgYXNzZXJ0KFwiQ2xhc3NNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RQYXR0ZXJuIHtcbiAgYXNzZXJ0KFwiT2JqZWN0UGF0dGVyblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTcHJlYWRFbGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlNwcmVhZEVsZW1lbnQge1xuICBhc3NlcnQoXCJTcHJlYWRFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN1cGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN1cGVyIHtcbiAgYXNzZXJ0KFwiU3VwZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUZW1wbGF0ZUVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVGVtcGxhdGVFbGVtZW50IHtcbiAgYXNzZXJ0KFwiVGVtcGxhdGVFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRlbXBsYXRlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UZW1wbGF0ZUxpdGVyYWwge1xuICBhc3NlcnQoXCJUZW1wbGF0ZUxpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0WWllbGRFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LllpZWxkRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIllpZWxkRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBd2FpdEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXdhaXRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXdhaXRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnQge1xuICBhc3NlcnQoXCJJbXBvcnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmlnSW50TGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaWdJbnRMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiQmlnSW50TGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PcHRpb25hbE1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T3B0aW9uYWxDYWxsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PcHRpb25hbENhbGxFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc1Byb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc1Byb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzQWNjZXNzb3JQcm9wZXJ0eShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NQcml2YXRlUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NQcml2YXRlUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc1ByaXZhdGVNZXRob2QoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NQcml2YXRlTWV0aG9kIHtcbiAgYXNzZXJ0KFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFByaXZhdGVOYW1lKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlByaXZhdGVOYW1lIHtcbiAgYXNzZXJ0KFwiUHJpdmF0ZU5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3RhdGljQmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhdGljQmxvY2sge1xuICBhc3NlcnQoXCJTdGF0aWNCbG9ja1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBbnlUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5BbnlUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkFueVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFycmF5VHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyYXlUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkFycmF5VHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Qm9vbGVhblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bGxMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NJbXBsZW1lbnRzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzSW1wbGVtZW50cyB7XG4gIGFzc2VydChcIkNsYXNzSW1wbGVtZW50c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlQ2xhc3MoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRGVjbGFyZUNsYXNzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUNsYXNzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVGdW5jdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJEZWNsYXJlRnVuY3Rpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZUludGVyZmFjZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlSW50ZXJmYWNlIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUludGVyZmFjZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlTW9kdWxlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGUge1xuICBhc3NlcnQoXCJEZWNsYXJlTW9kdWxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVNb2R1bGVFeHBvcnRzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGVFeHBvcnRzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZVR5cGVBbGlhcyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlVHlwZUFsaWFzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZVR5cGVBbGlhc1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlT3BhcXVlVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlT3BhcXVlVHlwZSB7XG4gIGFzc2VydChcIkRlY2xhcmVPcGFxdWVUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVWYXJpYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlVmFyaWFibGUge1xuICBhc3NlcnQoXCJEZWNsYXJlVmFyaWFibGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVkUHJlZGljYXRlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVkUHJlZGljYXRlIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZWRQcmVkaWNhdGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhpc3RzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhpc3RzVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uVHlwZVBhcmFtKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uVHlwZVBhcmFtIHtcbiAgYXNzZXJ0KFwiRnVuY3Rpb25UeXBlUGFyYW1cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0R2VuZXJpY1R5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkdlbmVyaWNUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbmZlcnJlZFByZWRpY2F0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbmZlcnJlZFByZWRpY2F0ZSB7XG4gIGFzc2VydChcIkluZmVycmVkUHJlZGljYXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEludGVyZmFjZUV4dGVuZHMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW50ZXJmYWNlRXh0ZW5kcyB7XG4gIGFzc2VydChcIkludGVyZmFjZUV4dGVuZHNcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnRlcmZhY2VUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbnRlcmZhY2VUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWl4ZWRUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NaXhlZFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbXB0eVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVtcHR5VHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bGxhYmxlVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbGFibGVUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROdW1iZXJUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5OdW1iZXJUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0VHlwZUludGVybmFsU2xvdChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlQ2FsbFByb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVDYWxsUHJvcGVydHkge1xuICBhc3NlcnQoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGVJbmRleGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVJbmRleGVyIHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUluZGV4ZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0VHlwZVByb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVQcm9wZXJ0eSB7XG4gIGFzc2VydChcIk9iamVjdFR5cGVQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlU3ByZWFkUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wYXF1ZVR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT3BhcXVlVHlwZSB7XG4gIGFzc2VydChcIk9wYXF1ZVR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIge1xuICBhc3NlcnQoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN0cmluZ1R5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN0cmluZ1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiU3RyaW5nVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3ltYm9sVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3ltYm9sVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUaGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR1cGxlVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIlR1cGxlVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZW9mVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZW9mVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlQWxpYXMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZUFsaWFzIHtcbiAgYXNzZXJ0KFwiVHlwZUFsaWFzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZUNhc3RFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlR5cGVDYXN0RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlUGFyYW1ldGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXIge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVbmlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlVuaW9uVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhcmlhbmNlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlZhcmlhbmNlIHtcbiAgYXNzZXJ0KFwiVmFyaWFuY2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Vm9pZFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlZvaWRUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIlZvaWRUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRW51bURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1Cb29sZWFuQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtQm9vbGVhbkJvZHkge1xuICBhc3NlcnQoXCJFbnVtQm9vbGVhbkJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bU51bWJlckJvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bU51bWJlckJvZHkge1xuICBhc3NlcnQoXCJFbnVtTnVtYmVyQm9keVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtU3RyaW5nQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtU3RyaW5nQm9keSB7XG4gIGFzc2VydChcIkVudW1TdHJpbmdCb2R5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1TeW1ib2xCb2R5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1TeW1ib2xCb2R5IHtcbiAgYXNzZXJ0KFwiRW51bVN5bWJvbEJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bUJvb2xlYW5NZW1iZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bUJvb2xlYW5NZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtQm9vbGVhbk1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtTnVtYmVyTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1OdW1iZXJNZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtTnVtYmVyTWVtYmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1TdHJpbmdNZW1iZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bVN0cmluZ01lbWJlciB7XG4gIGFzc2VydChcIkVudW1TdHJpbmdNZW1iZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bURlZmF1bHRlZE1lbWJlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtRGVmYXVsdGVkTWVtYmVyIHtcbiAgYXNzZXJ0KFwiRW51bURlZmF1bHRlZE1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbmRleGVkQWNjZXNzVHlwZSB7XG4gIGFzc2VydChcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIGFzc2VydChcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYQXR0cmlidXRlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEF0dHJpYnV0ZSB7XG4gIGFzc2VydChcIkpTWEF0dHJpYnV0ZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hDbG9zaW5nRWxlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hDbG9zaW5nRWxlbWVudCB7XG4gIGFzc2VydChcIkpTWENsb3NpbmdFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWEVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYRWxlbWVudCB7XG4gIGFzc2VydChcIkpTWEVsZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYRW1wdHlFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEVtcHR5RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkpTWEVtcHR5RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hFeHByZXNzaW9uQ29udGFpbmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEV4cHJlc3Npb25Db250YWluZXIge1xuICBhc3NlcnQoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWFNwcmVhZENoaWxkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWFNwcmVhZENoaWxkIHtcbiAgYXNzZXJ0KFwiSlNYU3ByZWFkQ2hpbGRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYSWRlbnRpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hJZGVudGlmaWVyIHtcbiAgYXNzZXJ0KFwiSlNYSWRlbnRpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWE5hbWVzcGFjZWROYW1lKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWE5hbWVzcGFjZWROYW1lIHtcbiAgYXNzZXJ0KFwiSlNYTmFtZXNwYWNlZE5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYT3BlbmluZ0VsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYT3BlbmluZ0VsZW1lbnQge1xuICBhc3NlcnQoXCJKU1hPcGVuaW5nRWxlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hTcHJlYWRBdHRyaWJ1dGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYU3ByZWFkQXR0cmlidXRlIHtcbiAgYXNzZXJ0KFwiSlNYU3ByZWFkQXR0cmlidXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWFRleHQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYVGV4dCB7XG4gIGFzc2VydChcIkpTWFRleHRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYRnJhZ21lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYRnJhZ21lbnQge1xuICBhc3NlcnQoXCJKU1hGcmFnbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hPcGVuaW5nRnJhZ21lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYT3BlbmluZ0ZyYWdtZW50IHtcbiAgYXNzZXJ0KFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWENsb3NpbmdGcmFnbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICBhc3NlcnQoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9vcChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Ob29wIHtcbiAgYXNzZXJ0KFwiTm9vcFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbGFjZWhvbGRlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QbGFjZWhvbGRlciB7XG4gIGFzc2VydChcIlBsYWNlaG9sZGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFY4SW50cmluc2ljSWRlbnRpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5WOEludHJpbnNpY0lkZW50aWZpZXIge1xuICBhc3NlcnQoXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXJndW1lbnRQbGFjZWhvbGRlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgYXNzZXJ0KFwiQXJndW1lbnRQbGFjZWhvbGRlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCaW5kRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaW5kRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkJpbmRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydEF0dHJpYnV0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnRBdHRyaWJ1dGUge1xuICBhc3NlcnQoXCJJbXBvcnRBdHRyaWJ1dGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjb3JhdG9yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY29yYXRvciB7XG4gIGFzc2VydChcIkRlY29yYXRvclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREb0V4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRG9FeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiRG9FeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIGFzc2VydChcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVjb3JkRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZWNvcmRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiUmVjb3JkRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUdXBsZUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHVwbGVFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVHVwbGVFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2ltYWxMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2ltYWxMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiRGVjaW1hbExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TW9kdWxlRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Nb2R1bGVFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiTW9kdWxlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Ub3BpY1JlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRvcGljUmVmZXJlbmNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBpcGVsaW5lVG9waWNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlBpcGVsaW5lVG9waWNFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGlwZWxpbmVCYXJlRnVuY3Rpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUGlwZWxpbmVCYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSB7XG4gIGFzc2VydChcIlBpcGVsaW5lUHJpbWFyeVRvcGljUmVmZXJlbmNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUGFyYW1ldGVyUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gIGFzc2VydChcIlRTUGFyYW1ldGVyUHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNEZWNsYXJlRnVuY3Rpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJUU0RlY2xhcmVGdW5jdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0RlY2xhcmVNZXRob2QoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNEZWNsYXJlTWV0aG9kIHtcbiAgYXNzZXJ0KFwiVFNEZWNsYXJlTWV0aG9kXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUXVhbGlmaWVkTmFtZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1F1YWxpZmllZE5hbWUge1xuICBhc3NlcnQoXCJUU1F1YWxpZmllZE5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUHJvcGVydHlTaWduYXR1cmUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNQcm9wZXJ0eVNpZ25hdHVyZSB7XG4gIGFzc2VydChcIlRTUHJvcGVydHlTaWduYXR1cmVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNNZXRob2RTaWduYXR1cmUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNZXRob2RTaWduYXR1cmUge1xuICBhc3NlcnQoXCJUU01ldGhvZFNpZ25hdHVyZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0luZGV4U2lnbmF0dXJlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW5kZXhTaWduYXR1cmUge1xuICBhc3NlcnQoXCJUU0luZGV4U2lnbmF0dXJlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQW55S2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0FueUtleXdvcmQge1xuICBhc3NlcnQoXCJUU0FueUtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNCb29sZWFuS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0Jvb2xlYW5LZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNCb29sZWFuS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0JpZ0ludEtleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNCaWdJbnRLZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNCaWdJbnRLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTSW50cmluc2ljS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICBhc3NlcnQoXCJUU0ludHJpbnNpY0tleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNOZXZlcktleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNOZXZlcktleXdvcmQge1xuICBhc3NlcnQoXCJUU05ldmVyS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU051bGxLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTTnVsbEtleXdvcmQge1xuICBhc3NlcnQoXCJUU051bGxLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTnVtYmVyS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU051bWJlcktleXdvcmQge1xuICBhc3NlcnQoXCJUU051bWJlcktleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNPYmplY3RLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTT2JqZWN0S2V5d29yZCB7XG4gIGFzc2VydChcIlRTT2JqZWN0S2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1N0cmluZ0tleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNTdHJpbmdLZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNTdHJpbmdLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTU3ltYm9sS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1N5bWJvbEtleXdvcmQge1xuICBhc3NlcnQoXCJUU1N5bWJvbEtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNVbmRlZmluZWRLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVW5kZWZpbmVkS2V5d29yZCB7XG4gIGFzc2VydChcIlRTVW5kZWZpbmVkS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1Vua25vd25LZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVW5rbm93bktleXdvcmQge1xuICBhc3NlcnQoXCJUU1Vua25vd25LZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVm9pZEtleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNWb2lkS2V5d29yZCB7XG4gIGFzc2VydChcIlRTVm9pZEtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUaGlzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1RoaXNUeXBlIHtcbiAgYXNzZXJ0KFwiVFNUaGlzVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0Z1bmN0aW9uVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIGFzc2VydChcIlRTRnVuY3Rpb25UeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQ29uc3RydWN0b3JUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uc3RydWN0b3JUeXBlIHtcbiAgYXNzZXJ0KFwiVFNDb25zdHJ1Y3RvclR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlUmVmZXJlbmNlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVJlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRTVHlwZVJlZmVyZW5jZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVQcmVkaWNhdGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlUHJlZGljYXRlIHtcbiAgYXNzZXJ0KFwiVFNUeXBlUHJlZGljYXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZVF1ZXJ5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVF1ZXJ5IHtcbiAgYXNzZXJ0KFwiVFNUeXBlUXVlcnlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiVFNUeXBlTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0FycmF5VHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0FycmF5VHlwZSB7XG4gIGFzc2VydChcIlRTQXJyYXlUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHVwbGVUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHVwbGVUeXBlIHtcbiAgYXNzZXJ0KFwiVFNUdXBsZVR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNPcHRpb25hbFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNPcHRpb25hbFR5cGUge1xuICBhc3NlcnQoXCJUU09wdGlvbmFsVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1Jlc3RUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTUmVzdFR5cGUge1xuICBhc3NlcnQoXCJUU1Jlc3RUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTmFtZWRUdXBsZU1lbWJlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU05hbWVkVHVwbGVNZW1iZXIge1xuICBhc3NlcnQoXCJUU05hbWVkVHVwbGVNZW1iZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNVbmlvblR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNVbmlvblR5cGUge1xuICBhc3NlcnQoXCJUU1VuaW9uVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ludGVyc2VjdGlvblR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNJbnRlcnNlY3Rpb25UeXBlIHtcbiAgYXNzZXJ0KFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQ29uZGl0aW9uYWxUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgYXNzZXJ0KFwiVFNDb25kaXRpb25hbFR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbmZlclR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNJbmZlclR5cGUge1xuICBhc3NlcnQoXCJUU0luZmVyVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1BhcmVudGhlc2l6ZWRUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTUGFyZW50aGVzaXplZFR5cGUge1xuICBhc3NlcnQoXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZU9wZXJhdG9yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZU9wZXJhdG9yIHtcbiAgYXNzZXJ0KFwiVFNUeXBlT3BlcmF0b3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0luZGV4ZWRBY2Nlc3NUeXBlIHtcbiAgYXNzZXJ0KFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU01hcHBlZFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNYXBwZWRUeXBlIHtcbiAgYXNzZXJ0KFwiVFNNYXBwZWRUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTGl0ZXJhbFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNMaXRlcmFsVHlwZSB7XG4gIGFzc2VydChcIlRTTGl0ZXJhbFR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMge1xuICBhc3NlcnQoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ludGVyZmFjZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTSW50ZXJmYWNlQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0ludGVyZmFjZUJvZHkge1xuICBhc3NlcnQoXCJUU0ludGVyZmFjZUJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQXNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQXNFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVFNBc0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNTYXRpc2ZpZXNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTU2F0aXNmaWVzRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVBc3NlcnRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlQXNzZXJ0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQXNzZXJ0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTRW51bURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTRW51bURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNFbnVtRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNFbnVtTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTRW51bU1lbWJlciB7XG4gIGFzc2VydChcIlRTRW51bU1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU01vZHVsZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTW9kdWxlQmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNb2R1bGVCbG9jayB7XG4gIGFzc2VydChcIlRTTW9kdWxlQmxvY2tcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbXBvcnRUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW1wb3J0VHlwZSB7XG4gIGFzc2VydChcIlRTSW1wb3J0VHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNOb25OdWxsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU05vbk51bGxFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0V4cG9ydEFzc2lnbm1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHBvcnRBc3NpZ25tZW50IHtcbiAgYXNzZXJ0KFwiVFNFeHBvcnRBc3NpZ25tZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBhc3NlcnQoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlUGFyYW1ldGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlciB7XG4gIGFzc2VydChcIlRTVHlwZVBhcmFtZXRlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdGFuZGFyZGl6ZWQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhbmRhcmRpemVkIHtcbiAgYXNzZXJ0KFwiU3RhbmRhcmRpemVkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmluYXJ5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJpbmFyeSB7XG4gIGFzc2VydChcIkJpbmFyeVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTY29wYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5TY29wYWJsZSB7XG4gIGFzc2VydChcIlNjb3BhYmxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJsb2NrUGFyZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJsb2NrUGFyZW50IHtcbiAgYXNzZXJ0KFwiQmxvY2tQYXJlbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQmxvY2sge1xuICBhc3NlcnQoXCJCbG9ja1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRlcm1pbmF0b3JsZXNzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRlcm1pbmF0b3JsZXNzIHtcbiAgYXNzZXJ0KFwiVGVybWluYXRvcmxlc3NcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29tcGxldGlvblN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db21wbGV0aW9uU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiQ29tcGxldGlvblN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDb25kaXRpb25hbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db25kaXRpb25hbCB7XG4gIGFzc2VydChcIkNvbmRpdGlvbmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydExvb3AoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTG9vcCB7XG4gIGFzc2VydChcIkxvb3BcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V2hpbGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuV2hpbGUge1xuICBhc3NlcnQoXCJXaGlsZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHByZXNzaW9uV3JhcHBlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHByZXNzaW9uV3JhcHBlciB7XG4gIGFzc2VydChcIkV4cHJlc3Npb25XcmFwcGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZvcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Gb3Ige1xuICBhc3NlcnQoXCJGb3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rm9yWFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Gb3JYU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yWFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGdW5jdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5GdW5jdGlvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uUGFyZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uUGFyZW50IHtcbiAgYXNzZXJ0KFwiRnVuY3Rpb25QYXJlbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHVyZWlzaChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QdXJlaXNoIHtcbiAgYXNzZXJ0KFwiUHVyZWlzaFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkRlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhdHRlcm5MaWtlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlBhdHRlcm5MaWtlIHtcbiAgYXNzZXJ0KFwiUGF0dGVybkxpa2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TFZhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5MVmFsIHtcbiAgYXNzZXJ0KFwiTFZhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0VudGl0eU5hbWUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFbnRpdHlOYW1lIHtcbiAgYXNzZXJ0KFwiVFNFbnRpdHlOYW1lXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTGl0ZXJhbCB7XG4gIGFzc2VydChcIkxpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1tdXRhYmxlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltbXV0YWJsZSB7XG4gIGFzc2VydChcIkltbXV0YWJsZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVc2VyV2hpdGVzcGFjYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Vc2VyV2hpdGVzcGFjYWJsZSB7XG4gIGFzc2VydChcIlVzZXJXaGl0ZXNwYWNhYmxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE1ldGhvZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NZXRob2Qge1xuICBhc3NlcnQoXCJNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0TWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdE1lbWJlciB7XG4gIGFzc2VydChcIk9iamVjdE1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcm9wZXJ0eSB7XG4gIGFzc2VydChcIlByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVuYXJ5TGlrZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5VbmFyeUxpa2Uge1xuICBhc3NlcnQoXCJVbmFyeUxpa2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QYXR0ZXJuIHtcbiAgYXNzZXJ0KFwiUGF0dGVyblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzcyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzcyB7XG4gIGFzc2VydChcIkNsYXNzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJFeHBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNb2R1bGVTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTW9kdWxlU3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiTW9kdWxlU3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFjY2Vzc29yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkFjY2Vzc29yIHtcbiAgYXNzZXJ0KFwiQWNjZXNzb3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHJpdmF0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcml2YXRlIHtcbiAgYXNzZXJ0KFwiUHJpdmF0ZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG93KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3cge1xuICBhc3NlcnQoXCJGbG93XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZsb3dUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3dUeXBlIHtcbiAgYXNzZXJ0KFwiRmxvd1R5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rmxvd0Jhc2VBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3dCYXNlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkZsb3dCYXNlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG93RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmxvd0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRmxvd0RlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZsb3dQcmVkaWNhdGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmxvd1ByZWRpY2F0ZSB7XG4gIGFzc2VydChcIkZsb3dQcmVkaWNhdGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bUJvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bUJvZHkge1xuICBhc3NlcnQoXCJFbnVtQm9keVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1NZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtTWVtYmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1gge1xuICBhc3NlcnQoXCJKU1hcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWlzY2VsbGFuZW91cyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NaXNjZWxsYW5lb3VzIHtcbiAgYXNzZXJ0KFwiTWlzY2VsbGFuZW91c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlU2NyaXB0KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVTY3JpcHQge1xuICBhc3NlcnQoXCJUeXBlU2NyaXB0XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZUVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlRWxlbWVudCB7XG4gIGFzc2VydChcIlRTVHlwZUVsZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZSB7XG4gIGFzc2VydChcIlRTVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0Jhc2VUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQmFzZVR5cGUge1xuICBhc3NlcnQoXCJUU0Jhc2VUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bWJlckxpdGVyYWwobm9kZTogYW55LCBvcHRzOiBhbnkpOiB2b2lkIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiYXNzZXJ0TnVtYmVyTGl0ZXJhbFwiLCBcImFzc2VydE51bWVyaWNMaXRlcmFsXCIpO1xuICBhc3NlcnQoXCJOdW1iZXJMaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJlZ2V4TGl0ZXJhbChub2RlOiBhbnksIG9wdHM6IGFueSk6IHZvaWQge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJhc3NlcnRSZWdleExpdGVyYWxcIiwgXCJhc3NlcnRSZWdFeHBMaXRlcmFsXCIpO1xuICBhc3NlcnQoXCJSZWdleExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVzdFByb3BlcnR5KG5vZGU6IGFueSwgb3B0czogYW55KTogdm9pZCB7XG4gIGRlcHJlY2F0aW9uV2FybmluZyhcImFzc2VydFJlc3RQcm9wZXJ0eVwiLCBcImFzc2VydFJlc3RFbGVtZW50XCIpO1xuICBhc3NlcnQoXCJSZXN0UHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3ByZWFkUHJvcGVydHkobm9kZTogYW55LCBvcHRzOiBhbnkpOiB2b2lkIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiYXNzZXJ0U3ByZWFkUHJvcGVydHlcIiwgXCJhc3NlcnRTcHJlYWRFbGVtZW50XCIpO1xuICBhc3NlcnQoXCJTcHJlYWRQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNb2R1bGVEZWNsYXJhdGlvbihub2RlOiBhbnksIG9wdHM6IGFueSk6IHZvaWQge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXG4gICAgXCJhc3NlcnRNb2R1bGVEZWNsYXJhdGlvblwiLFxuICAgIFwiYXNzZXJ0SW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvblwiLFxuICApO1xuICBhc3NlcnQoXCJNb2R1bGVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbiIsICJpbXBvcnQge1xuICBhbnlUeXBlQW5ub3RhdGlvbixcbiAgc3RyaW5nVHlwZUFubm90YXRpb24sXG4gIG51bWJlclR5cGVBbm5vdGF0aW9uLFxuICB2b2lkVHlwZUFubm90YXRpb24sXG4gIGJvb2xlYW5UeXBlQW5ub3RhdGlvbixcbiAgZ2VuZXJpY1R5cGVBbm5vdGF0aW9uLFxuICBpZGVudGlmaWVyLFxufSBmcm9tIFwiLi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVR5cGVBbm5vdGF0aW9uQmFzZWRPblR5cGVvZiBhcyB7XG4gICh0eXBlOiBcInN0cmluZ1wiKTogdC5TdHJpbmdUeXBlQW5ub3RhdGlvbjtcbiAgKHR5cGU6IFwibnVtYmVyXCIpOiB0Lk51bWJlclR5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJ1bmRlZmluZWRcIik6IHQuVm9pZFR5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJib29sZWFuXCIpOiB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbjtcbiAgKHR5cGU6IFwiZnVuY3Rpb25cIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJvYmplY3RcIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJzeW1ib2xcIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJiaWdpbnRcIik6IHQuQW55VHlwZUFubm90YXRpb247XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHR5cGUgYW5ub3RhdGlvbiBiYXNlZCBvbiB0eXBlb2YgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mKHR5cGU6IHN0cmluZyk6IHQuRmxvd1R5cGUge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gc3RyaW5nVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gbnVtYmVyVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gdm9pZFR5cGVBbm5vdGF0aW9uKCk7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBib29sZWFuVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIHJldHVybiBnZW5lcmljVHlwZUFubm90YXRpb24oaWRlbnRpZmllcihcIkZ1bmN0aW9uXCIpKTtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICByZXR1cm4gZ2VuZXJpY1R5cGVBbm5vdGF0aW9uKGlkZW50aWZpZXIoXCJPYmplY3RcIikpO1xuICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgIHJldHVybiBnZW5lcmljVHlwZUFubm90YXRpb24oaWRlbnRpZmllcihcIlN5bWJvbFwiKSk7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgLy8gdG9kbzogdXNlIEJpZ0ludCBhbm5vdGF0aW9uIHdoZW4gRmxvdyBzdXBwb3J0cyBCaWdJbnRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy82NjM5XG4gICAgICByZXR1cm4gYW55VHlwZUFubm90YXRpb24oKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHR5cGVvZiB2YWx1ZTogXCIgKyB0eXBlKTtcbn1cbiIsICJpbXBvcnQge1xuICBpc0FueVR5cGVBbm5vdGF0aW9uLFxuICBpc0dlbmVyaWNUeXBlQW5ub3RhdGlvbixcbiAgaXNVbmlvblR5cGVBbm5vdGF0aW9uLFxuICBpc0Zsb3dCYXNlQW5ub3RhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcblxuZnVuY3Rpb24gZ2V0UXVhbGlmaWVkTmFtZShub2RlOiB0LkdlbmVyaWNUeXBlQW5ub3RhdGlvbltcImlkXCJdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllcihub2RlKVxuICAgID8gbm9kZS5uYW1lXG4gICAgOiBgJHtub2RlLmlkLm5hbWV9LiR7Z2V0UXVhbGlmaWVkTmFtZShub2RlLnF1YWxpZmljYXRpb24pfWA7XG59XG5cbi8qKlxuICogRGVkdXBlIHR5cGUgYW5ub3RhdGlvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICBub2Rlc0luOiBSZWFkb25seUFycmF5PHQuRmxvd1R5cGUgfCBmYWxzZSB8IG51bGwgfCB1bmRlZmluZWQ+LFxuKTogdC5GbG93VHlwZVtdIHtcbiAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGVzSW4pO1xuXG4gIGNvbnN0IGdlbmVyaWNzID0gbmV3IE1hcDxzdHJpbmcsIHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uPigpO1xuICBjb25zdCBiYXNlcyA9IG5ldyBNYXA8dC5GbG93QmFzZUFubm90YXRpb25bXCJ0eXBlXCJdLCB0LkZsb3dCYXNlQW5ub3RhdGlvbj4oKTtcblxuICAvLyBzdG9yZSB1bmlvbiB0eXBlIGdyb3VwcyB0byBjaXJjdWxhciByZWZlcmVuY2VzXG4gIGNvbnN0IHR5cGVHcm91cHMgPSBuZXcgU2V0PHQuRmxvd1R5cGVbXT4oKTtcblxuICBjb25zdCB0eXBlczogdC5GbG93VHlwZVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAoIW5vZGUpIGNvbnRpbnVlO1xuXG4gICAgLy8gZGV0ZWN0IGR1cGxpY2F0ZXNcbiAgICBpZiAodHlwZXMuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHR5cGUgbWF0Y2hlcyBhbnl0aGluZ1xuICAgIGlmIChpc0FueVR5cGVBbm5vdGF0aW9uKG5vZGUpKSB7XG4gICAgICByZXR1cm4gW25vZGVdO1xuICAgIH1cblxuICAgIGlmIChpc0Zsb3dCYXNlQW5ub3RhdGlvbihub2RlKSkge1xuICAgICAgYmFzZXMuc2V0KG5vZGUudHlwZSwgbm9kZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmlvblR5cGVBbm5vdGF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAoIXR5cGVHcm91cHMuaGFzKG5vZGUudHlwZXMpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goLi4ubm9kZS50eXBlcyk7XG4gICAgICAgIHR5cGVHcm91cHMuYWRkKG5vZGUudHlwZXMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gZmluZCBhIG1hdGNoaW5nIGdlbmVyaWMgdHlwZSBhbmQgbWVyZ2UgYW5kIGRlZHVwbGljYXRlIHRoZSB0eXBlIHBhcmFtZXRlcnNcbiAgICBpZiAoaXNHZW5lcmljVHlwZUFubm90YXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKG5vZGUuaWQpO1xuXG4gICAgICBpZiAoZ2VuZXJpY3MuaGFzKG5hbWUpKSB7XG4gICAgICAgIGxldCBleGlzdGluZzogdC5GbG93ID0gZ2VuZXJpY3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycykge1xuICAgICAgICAgICAgZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMucGFyYW1zLnB1c2goLi4ubm9kZS50eXBlUGFyYW1ldGVycy5wYXJhbXMpO1xuICAgICAgICAgICAgZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMucGFyYW1zID0gcmVtb3ZlVHlwZUR1cGxpY2F0ZXMoXG4gICAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4aXN0aW5nID0gbm9kZS50eXBlUGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2VuZXJpY3Muc2V0KG5hbWUsIG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0eXBlcy5wdXNoKG5vZGUpO1xuICB9XG5cbiAgLy8gYWRkIGJhY2sgaW4gYmFzZXNcbiAgZm9yIChjb25zdCBbLCBiYXNlVHlwZV0gb2YgYmFzZXMpIHtcbiAgICB0eXBlcy5wdXNoKGJhc2VUeXBlKTtcbiAgfVxuXG4gIC8vIGFkZCBiYWNrIGluIGdlbmVyaWNzXG4gIGZvciAoY29uc3QgWywgZ2VuZXJpY05hbWVdIG9mIGdlbmVyaWNzKSB7XG4gICAgdHlwZXMucHVzaChnZW5lcmljTmFtZSk7XG4gIH1cblxuICByZXR1cm4gdHlwZXM7XG59XG4iLCAiaW1wb3J0IHsgdW5pb25UeXBlQW5ub3RhdGlvbiB9IGZyb20gXCIuLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCByZW1vdmVUeXBlRHVwbGljYXRlcyBmcm9tIFwiLi4vLi4vbW9kaWZpY2F0aW9ucy9mbG93L3JlbW92ZVR5cGVEdXBsaWNhdGVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgYHR5cGVzYCBhbmQgZmxhdHRlbnMgdGhlbSwgcmVtb3ZpbmcgZHVwbGljYXRlcyBhbmRcbiAqIHJldHVybnMgYSBgVW5pb25UeXBlQW5ub3RhdGlvbmAgbm9kZSBjb250YWluaW5nIHRoZW0uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZsb3dVbmlvblR5cGU8VCBleHRlbmRzIHQuRmxvd1R5cGU+KFxuICB0eXBlczogW1RdIHwgQXJyYXk8VD4sXG4pOiBUIHwgdC5VbmlvblR5cGVBbm5vdGF0aW9uIHtcbiAgY29uc3QgZmxhdHRlbmVkID0gcmVtb3ZlVHlwZUR1cGxpY2F0ZXModHlwZXMpO1xuXG4gIGlmIChmbGF0dGVuZWQubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZFswXSBhcyBUO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmlvblR5cGVBbm5vdGF0aW9uKGZsYXR0ZW5lZCk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBpc0lkZW50aWZpZXIsXG4gIGlzVFNBbnlLZXl3b3JkLFxuICBpc1RTVHlwZVJlZmVyZW5jZSxcbiAgaXNUU1VuaW9uVHlwZSxcbiAgaXNUU0Jhc2VUeXBlLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcblxuZnVuY3Rpb24gZ2V0UXVhbGlmaWVkTmFtZShub2RlOiB0LlRTVHlwZVJlZmVyZW5jZVtcInR5cGVOYW1lXCJdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllcihub2RlKVxuICAgID8gbm9kZS5uYW1lXG4gICAgOiBgJHtub2RlLnJpZ2h0Lm5hbWV9LiR7Z2V0UXVhbGlmaWVkTmFtZShub2RlLmxlZnQpfWA7XG59XG5cbi8qKlxuICogRGVkdXBlIHR5cGUgYW5ub3RhdGlvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICBub2Rlc0luOiBSZWFkb25seUFycmF5PHQuVFNUeXBlPixcbik6IEFycmF5PHQuVFNUeXBlPiB7XG4gIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShub2Rlc0luKTtcblxuICBjb25zdCBnZW5lcmljcyA9IG5ldyBNYXA8c3RyaW5nLCB0LlRTVHlwZVJlZmVyZW5jZT4oKTtcbiAgY29uc3QgYmFzZXMgPSBuZXcgTWFwPHQuVFNCYXNlVHlwZVtcInR5cGVcIl0sIHQuVFNCYXNlVHlwZT4oKTtcblxuICAvLyBzdG9yZSB1bmlvbiB0eXBlIGdyb3VwcyB0byBjaXJjdWxhciByZWZlcmVuY2VzXG4gIGNvbnN0IHR5cGVHcm91cHMgPSBuZXcgU2V0PHQuVFNUeXBlW10+KCk7XG5cbiAgY29uc3QgdHlwZXM6IHQuVFNUeXBlW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmICghbm9kZSkgY29udGludWU7XG5cbiAgICAvLyBkZXRlY3QgZHVwbGljYXRlc1xuICAgIGlmICh0eXBlcy5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdHlwZSBtYXRjaGVzIGFueXRoaW5nXG4gICAgaWYgKGlzVFNBbnlLZXl3b3JkKG5vZGUpKSB7XG4gICAgICByZXR1cm4gW25vZGVdO1xuICAgIH1cblxuICAgIC8vIEFuYWxvZ3VlIG9mIEZsb3dCYXNlQW5ub3RhdGlvblxuICAgIGlmIChpc1RTQmFzZVR5cGUobm9kZSkpIHtcbiAgICAgIGJhc2VzLnNldChub2RlLnR5cGUsIG5vZGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzVFNVbmlvblR5cGUobm9kZSkpIHtcbiAgICAgIGlmICghdHlwZUdyb3Vwcy5oYXMobm9kZS50eXBlcykpIHtcbiAgICAgICAgbm9kZXMucHVzaCguLi5ub2RlLnR5cGVzKTtcbiAgICAgICAgdHlwZUdyb3Vwcy5hZGQobm9kZS50eXBlcyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0b2RvOiBzdXBwb3J0IG1lcmdpbmcgdHVwbGVzOiBudW1iZXJbXVxuICAgIGlmIChpc1RTVHlwZVJlZmVyZW5jZShub2RlKSAmJiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UXVhbGlmaWVkTmFtZShub2RlLnR5cGVOYW1lKTtcblxuICAgICAgaWYgKGdlbmVyaWNzLmhhcyhuYW1lKSkge1xuICAgICAgICBsZXQgZXhpc3Rpbmc6IHQuVHlwZVNjcmlwdCA9IGdlbmVyaWNzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcy5wdXNoKC4uLm5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcyA9IHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICAgICAgICAgICAgICBleGlzdGluZy50eXBlUGFyYW1ldGVycy5wYXJhbXMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleGlzdGluZyA9IG5vZGUudHlwZVBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlbmVyaWNzLnNldChuYW1lLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHlwZXMucHVzaChub2RlKTtcbiAgfVxuXG4gIC8vIGFkZCBiYWNrIGluIGJhc2VzXG4gIGZvciAoY29uc3QgWywgYmFzZVR5cGVdIG9mIGJhc2VzKSB7XG4gICAgdHlwZXMucHVzaChiYXNlVHlwZSk7XG4gIH1cblxuICAvLyBhZGQgYmFjayBpbiBnZW5lcmljc1xuICBmb3IgKGNvbnN0IFssIGdlbmVyaWNOYW1lXSBvZiBnZW5lcmljcykge1xuICAgIHR5cGVzLnB1c2goZ2VuZXJpY05hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVzO1xufVxuIiwgImltcG9ydCB7IHRzVW5pb25UeXBlIH0gZnJvbSBcIi4uL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHJlbW92ZVR5cGVEdXBsaWNhdGVzIGZyb20gXCIuLi8uLi9tb2RpZmljYXRpb25zL3R5cGVzY3JpcHQvcmVtb3ZlVHlwZUR1cGxpY2F0ZXNcIjtcbmltcG9ydCB7IGlzVFNUeXBlQW5ub3RhdGlvbiB9IGZyb20gXCIuLi8uLi92YWxpZGF0b3JzL2dlbmVyYXRlZC9pbmRleFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuXG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGB0eXBlc2AgYW5kIGZsYXR0ZW5zIHRoZW0sIHJlbW92aW5nIGR1cGxpY2F0ZXMgYW5kXG4gKiByZXR1cm5zIGEgYFVuaW9uVHlwZUFubm90YXRpb25gIG5vZGUgY29udGFpbmluZyB0aGVtLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUU1VuaW9uVHlwZShcbiAgdHlwZUFubm90YXRpb25zOiBBcnJheTx0LlRTVHlwZUFubm90YXRpb24gfCB0LlRTVHlwZT4sXG4pOiB0LlRTVHlwZSB7XG4gIGNvbnN0IHR5cGVzID0gdHlwZUFubm90YXRpb25zLm1hcCh0eXBlID0+IHtcbiAgICByZXR1cm4gaXNUU1R5cGVBbm5vdGF0aW9uKHR5cGUpID8gdHlwZS50eXBlQW5ub3RhdGlvbiA6IHR5cGU7XG4gIH0pO1xuICBjb25zdCBmbGF0dGVuZWQgPSByZW1vdmVUeXBlRHVwbGljYXRlcyh0eXBlcyk7XG5cbiAgaWYgKGZsYXR0ZW5lZC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmxhdHRlbmVkWzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0c1VuaW9uVHlwZShmbGF0dGVuZWQpO1xuICB9XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuXG4vKipcbiAqIFRoaXMgZmlsZSBpcyB3cml0dGVuIGluIEphdmFTY3JpcHQgYW5kIG5vdCBUeXBlU2NyaXB0IGJlY2F1c2UgdXBwZXJjYXNlIGJ1aWxkZXJzXG4gKiBjb25mbGljdCB3aXRoIEFTVCB0eXBlcy4gVHlwZVNjcmlwdCByZWFkcyB0aGUgdXBwZXJjYXNlLmQudHMgZmlsZSBpbnN0ZWFkLlxuICovXG5cbmV4cG9ydCB7XG4gIGFycmF5RXhwcmVzc2lvbiBhcyBBcnJheUV4cHJlc3Npb24sXG4gIGFzc2lnbm1lbnRFeHByZXNzaW9uIGFzIEFzc2lnbm1lbnRFeHByZXNzaW9uLFxuICBiaW5hcnlFeHByZXNzaW9uIGFzIEJpbmFyeUV4cHJlc3Npb24sXG4gIGludGVycHJldGVyRGlyZWN0aXZlIGFzIEludGVycHJldGVyRGlyZWN0aXZlLFxuICBkaXJlY3RpdmUgYXMgRGlyZWN0aXZlLFxuICBkaXJlY3RpdmVMaXRlcmFsIGFzIERpcmVjdGl2ZUxpdGVyYWwsXG4gIGJsb2NrU3RhdGVtZW50IGFzIEJsb2NrU3RhdGVtZW50LFxuICBicmVha1N0YXRlbWVudCBhcyBCcmVha1N0YXRlbWVudCxcbiAgY2FsbEV4cHJlc3Npb24gYXMgQ2FsbEV4cHJlc3Npb24sXG4gIGNhdGNoQ2xhdXNlIGFzIENhdGNoQ2xhdXNlLFxuICBjb25kaXRpb25hbEV4cHJlc3Npb24gYXMgQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuICBjb250aW51ZVN0YXRlbWVudCBhcyBDb250aW51ZVN0YXRlbWVudCxcbiAgZGVidWdnZXJTdGF0ZW1lbnQgYXMgRGVidWdnZXJTdGF0ZW1lbnQsXG4gIGRvV2hpbGVTdGF0ZW1lbnQgYXMgRG9XaGlsZVN0YXRlbWVudCxcbiAgZW1wdHlTdGF0ZW1lbnQgYXMgRW1wdHlTdGF0ZW1lbnQsXG4gIGV4cHJlc3Npb25TdGF0ZW1lbnQgYXMgRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgZmlsZSBhcyBGaWxlLFxuICBmb3JJblN0YXRlbWVudCBhcyBGb3JJblN0YXRlbWVudCxcbiAgZm9yU3RhdGVtZW50IGFzIEZvclN0YXRlbWVudCxcbiAgZnVuY3Rpb25EZWNsYXJhdGlvbiBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBmdW5jdGlvbkV4cHJlc3Npb24gYXMgRnVuY3Rpb25FeHByZXNzaW9uLFxuICBpZGVudGlmaWVyIGFzIElkZW50aWZpZXIsXG4gIGlmU3RhdGVtZW50IGFzIElmU3RhdGVtZW50LFxuICBsYWJlbGVkU3RhdGVtZW50IGFzIExhYmVsZWRTdGF0ZW1lbnQsXG4gIHN0cmluZ0xpdGVyYWwgYXMgU3RyaW5nTGl0ZXJhbCxcbiAgbnVtZXJpY0xpdGVyYWwgYXMgTnVtZXJpY0xpdGVyYWwsXG4gIG51bGxMaXRlcmFsIGFzIE51bGxMaXRlcmFsLFxuICBib29sZWFuTGl0ZXJhbCBhcyBCb29sZWFuTGl0ZXJhbCxcbiAgcmVnRXhwTGl0ZXJhbCBhcyBSZWdFeHBMaXRlcmFsLFxuICBsb2dpY2FsRXhwcmVzc2lvbiBhcyBMb2dpY2FsRXhwcmVzc2lvbixcbiAgbWVtYmVyRXhwcmVzc2lvbiBhcyBNZW1iZXJFeHByZXNzaW9uLFxuICBuZXdFeHByZXNzaW9uIGFzIE5ld0V4cHJlc3Npb24sXG4gIHByb2dyYW0gYXMgUHJvZ3JhbSxcbiAgb2JqZWN0RXhwcmVzc2lvbiBhcyBPYmplY3RFeHByZXNzaW9uLFxuICBvYmplY3RNZXRob2QgYXMgT2JqZWN0TWV0aG9kLFxuICBvYmplY3RQcm9wZXJ0eSBhcyBPYmplY3RQcm9wZXJ0eSxcbiAgcmVzdEVsZW1lbnQgYXMgUmVzdEVsZW1lbnQsXG4gIHJldHVyblN0YXRlbWVudCBhcyBSZXR1cm5TdGF0ZW1lbnQsXG4gIHNlcXVlbmNlRXhwcmVzc2lvbiBhcyBTZXF1ZW5jZUV4cHJlc3Npb24sXG4gIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGFzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLFxuICBzd2l0Y2hDYXNlIGFzIFN3aXRjaENhc2UsXG4gIHN3aXRjaFN0YXRlbWVudCBhcyBTd2l0Y2hTdGF0ZW1lbnQsXG4gIHRoaXNFeHByZXNzaW9uIGFzIFRoaXNFeHByZXNzaW9uLFxuICB0aHJvd1N0YXRlbWVudCBhcyBUaHJvd1N0YXRlbWVudCxcbiAgdHJ5U3RhdGVtZW50IGFzIFRyeVN0YXRlbWVudCxcbiAgdW5hcnlFeHByZXNzaW9uIGFzIFVuYXJ5RXhwcmVzc2lvbixcbiAgdXBkYXRlRXhwcmVzc2lvbiBhcyBVcGRhdGVFeHByZXNzaW9uLFxuICB2YXJpYWJsZURlY2xhcmF0aW9uIGFzIFZhcmlhYmxlRGVjbGFyYXRpb24sXG4gIHZhcmlhYmxlRGVjbGFyYXRvciBhcyBWYXJpYWJsZURlY2xhcmF0b3IsXG4gIHdoaWxlU3RhdGVtZW50IGFzIFdoaWxlU3RhdGVtZW50LFxuICB3aXRoU3RhdGVtZW50IGFzIFdpdGhTdGF0ZW1lbnQsXG4gIGFzc2lnbm1lbnRQYXR0ZXJuIGFzIEFzc2lnbm1lbnRQYXR0ZXJuLFxuICBhcnJheVBhdHRlcm4gYXMgQXJyYXlQYXR0ZXJuLFxuICBhcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiBhcyBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbixcbiAgY2xhc3NCb2R5IGFzIENsYXNzQm9keSxcbiAgY2xhc3NFeHByZXNzaW9uIGFzIENsYXNzRXhwcmVzc2lvbixcbiAgY2xhc3NEZWNsYXJhdGlvbiBhcyBDbGFzc0RlY2xhcmF0aW9uLFxuICBleHBvcnRBbGxEZWNsYXJhdGlvbiBhcyBFeHBvcnRBbGxEZWNsYXJhdGlvbixcbiAgZXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIGFzIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbixcbiAgZXhwb3J0TmFtZWREZWNsYXJhdGlvbiBhcyBFeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICBleHBvcnRTcGVjaWZpZXIgYXMgRXhwb3J0U3BlY2lmaWVyLFxuICBmb3JPZlN0YXRlbWVudCBhcyBGb3JPZlN0YXRlbWVudCxcbiAgaW1wb3J0RGVjbGFyYXRpb24gYXMgSW1wb3J0RGVjbGFyYXRpb24sXG4gIGltcG9ydERlZmF1bHRTcGVjaWZpZXIgYXMgSW1wb3J0RGVmYXVsdFNwZWNpZmllcixcbiAgaW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIGFzIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcixcbiAgaW1wb3J0U3BlY2lmaWVyIGFzIEltcG9ydFNwZWNpZmllcixcbiAgbWV0YVByb3BlcnR5IGFzIE1ldGFQcm9wZXJ0eSxcbiAgY2xhc3NNZXRob2QgYXMgQ2xhc3NNZXRob2QsXG4gIG9iamVjdFBhdHRlcm4gYXMgT2JqZWN0UGF0dGVybixcbiAgc3ByZWFkRWxlbWVudCBhcyBTcHJlYWRFbGVtZW50LFxuICBzdXBlciBhcyBTdXBlcixcbiAgdGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIGFzIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbixcbiAgdGVtcGxhdGVFbGVtZW50IGFzIFRlbXBsYXRlRWxlbWVudCxcbiAgdGVtcGxhdGVMaXRlcmFsIGFzIFRlbXBsYXRlTGl0ZXJhbCxcbiAgeWllbGRFeHByZXNzaW9uIGFzIFlpZWxkRXhwcmVzc2lvbixcbiAgYXdhaXRFeHByZXNzaW9uIGFzIEF3YWl0RXhwcmVzc2lvbixcbiAgaW1wb3J0IGFzIEltcG9ydCxcbiAgYmlnSW50TGl0ZXJhbCBhcyBCaWdJbnRMaXRlcmFsLFxuICBleHBvcnROYW1lc3BhY2VTcGVjaWZpZXIgYXMgRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyLFxuICBvcHRpb25hbE1lbWJlckV4cHJlc3Npb24gYXMgT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLFxuICBvcHRpb25hbENhbGxFeHByZXNzaW9uIGFzIE9wdGlvbmFsQ2FsbEV4cHJlc3Npb24sXG4gIGNsYXNzUHJvcGVydHkgYXMgQ2xhc3NQcm9wZXJ0eSxcbiAgY2xhc3NBY2Nlc3NvclByb3BlcnR5IGFzIENsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgY2xhc3NQcml2YXRlUHJvcGVydHkgYXMgQ2xhc3NQcml2YXRlUHJvcGVydHksXG4gIGNsYXNzUHJpdmF0ZU1ldGhvZCBhcyBDbGFzc1ByaXZhdGVNZXRob2QsXG4gIHByaXZhdGVOYW1lIGFzIFByaXZhdGVOYW1lLFxuICBzdGF0aWNCbG9jayBhcyBTdGF0aWNCbG9jayxcbiAgYW55VHlwZUFubm90YXRpb24gYXMgQW55VHlwZUFubm90YXRpb24sXG4gIGFycmF5VHlwZUFubm90YXRpb24gYXMgQXJyYXlUeXBlQW5ub3RhdGlvbixcbiAgYm9vbGVhblR5cGVBbm5vdGF0aW9uIGFzIEJvb2xlYW5UeXBlQW5ub3RhdGlvbixcbiAgYm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbiBhcyBCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uLFxuICBudWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIGFzIE51bGxMaXRlcmFsVHlwZUFubm90YXRpb24sXG4gIGNsYXNzSW1wbGVtZW50cyBhcyBDbGFzc0ltcGxlbWVudHMsXG4gIGRlY2xhcmVDbGFzcyBhcyBEZWNsYXJlQ2xhc3MsXG4gIGRlY2xhcmVGdW5jdGlvbiBhcyBEZWNsYXJlRnVuY3Rpb24sXG4gIGRlY2xhcmVJbnRlcmZhY2UgYXMgRGVjbGFyZUludGVyZmFjZSxcbiAgZGVjbGFyZU1vZHVsZSBhcyBEZWNsYXJlTW9kdWxlLFxuICBkZWNsYXJlTW9kdWxlRXhwb3J0cyBhcyBEZWNsYXJlTW9kdWxlRXhwb3J0cyxcbiAgZGVjbGFyZVR5cGVBbGlhcyBhcyBEZWNsYXJlVHlwZUFsaWFzLFxuICBkZWNsYXJlT3BhcXVlVHlwZSBhcyBEZWNsYXJlT3BhcXVlVHlwZSxcbiAgZGVjbGFyZVZhcmlhYmxlIGFzIERlY2xhcmVWYXJpYWJsZSxcbiAgZGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIGFzIERlY2xhcmVFeHBvcnREZWNsYXJhdGlvbixcbiAgZGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uIGFzIERlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbixcbiAgZGVjbGFyZWRQcmVkaWNhdGUgYXMgRGVjbGFyZWRQcmVkaWNhdGUsXG4gIGV4aXN0c1R5cGVBbm5vdGF0aW9uIGFzIEV4aXN0c1R5cGVBbm5vdGF0aW9uLFxuICBmdW5jdGlvblR5cGVBbm5vdGF0aW9uIGFzIEZ1bmN0aW9uVHlwZUFubm90YXRpb24sXG4gIGZ1bmN0aW9uVHlwZVBhcmFtIGFzIEZ1bmN0aW9uVHlwZVBhcmFtLFxuICBnZW5lcmljVHlwZUFubm90YXRpb24gYXMgR2VuZXJpY1R5cGVBbm5vdGF0aW9uLFxuICBpbmZlcnJlZFByZWRpY2F0ZSBhcyBJbmZlcnJlZFByZWRpY2F0ZSxcbiAgaW50ZXJmYWNlRXh0ZW5kcyBhcyBJbnRlcmZhY2VFeHRlbmRzLFxuICBpbnRlcmZhY2VEZWNsYXJhdGlvbiBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaW50ZXJmYWNlVHlwZUFubm90YXRpb24gYXMgSW50ZXJmYWNlVHlwZUFubm90YXRpb24sXG4gIGludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uIGFzIEludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uLFxuICBtaXhlZFR5cGVBbm5vdGF0aW9uIGFzIE1peGVkVHlwZUFubm90YXRpb24sXG4gIGVtcHR5VHlwZUFubm90YXRpb24gYXMgRW1wdHlUeXBlQW5ub3RhdGlvbixcbiAgbnVsbGFibGVUeXBlQW5ub3RhdGlvbiBhcyBOdWxsYWJsZVR5cGVBbm5vdGF0aW9uLFxuICBudW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24gYXMgTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uLFxuICBudW1iZXJUeXBlQW5ub3RhdGlvbiBhcyBOdW1iZXJUeXBlQW5ub3RhdGlvbixcbiAgb2JqZWN0VHlwZUFubm90YXRpb24gYXMgT2JqZWN0VHlwZUFubm90YXRpb24sXG4gIG9iamVjdFR5cGVJbnRlcm5hbFNsb3QgYXMgT2JqZWN0VHlwZUludGVybmFsU2xvdCxcbiAgb2JqZWN0VHlwZUNhbGxQcm9wZXJ0eSBhcyBPYmplY3RUeXBlQ2FsbFByb3BlcnR5LFxuICBvYmplY3RUeXBlSW5kZXhlciBhcyBPYmplY3RUeXBlSW5kZXhlcixcbiAgb2JqZWN0VHlwZVByb3BlcnR5IGFzIE9iamVjdFR5cGVQcm9wZXJ0eSxcbiAgb2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IGFzIE9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eSxcbiAgb3BhcXVlVHlwZSBhcyBPcGFxdWVUeXBlLFxuICBxdWFsaWZpZWRUeXBlSWRlbnRpZmllciBhcyBRdWFsaWZpZWRUeXBlSWRlbnRpZmllcixcbiAgc3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIGFzIFN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbixcbiAgc3RyaW5nVHlwZUFubm90YXRpb24gYXMgU3RyaW5nVHlwZUFubm90YXRpb24sXG4gIHN5bWJvbFR5cGVBbm5vdGF0aW9uIGFzIFN5bWJvbFR5cGVBbm5vdGF0aW9uLFxuICB0aGlzVHlwZUFubm90YXRpb24gYXMgVGhpc1R5cGVBbm5vdGF0aW9uLFxuICB0dXBsZVR5cGVBbm5vdGF0aW9uIGFzIFR1cGxlVHlwZUFubm90YXRpb24sXG4gIHR5cGVvZlR5cGVBbm5vdGF0aW9uIGFzIFR5cGVvZlR5cGVBbm5vdGF0aW9uLFxuICB0eXBlQWxpYXMgYXMgVHlwZUFsaWFzLFxuICB0eXBlQW5ub3RhdGlvbiBhcyBUeXBlQW5ub3RhdGlvbixcbiAgdHlwZUNhc3RFeHByZXNzaW9uIGFzIFR5cGVDYXN0RXhwcmVzc2lvbixcbiAgdHlwZVBhcmFtZXRlciBhcyBUeXBlUGFyYW1ldGVyLFxuICB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXMgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLFxuICB0eXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiBhcyBUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbixcbiAgdW5pb25UeXBlQW5ub3RhdGlvbiBhcyBVbmlvblR5cGVBbm5vdGF0aW9uLFxuICB2YXJpYW5jZSBhcyBWYXJpYW5jZSxcbiAgdm9pZFR5cGVBbm5vdGF0aW9uIGFzIFZvaWRUeXBlQW5ub3RhdGlvbixcbiAgZW51bURlY2xhcmF0aW9uIGFzIEVudW1EZWNsYXJhdGlvbixcbiAgZW51bUJvb2xlYW5Cb2R5IGFzIEVudW1Cb29sZWFuQm9keSxcbiAgZW51bU51bWJlckJvZHkgYXMgRW51bU51bWJlckJvZHksXG4gIGVudW1TdHJpbmdCb2R5IGFzIEVudW1TdHJpbmdCb2R5LFxuICBlbnVtU3ltYm9sQm9keSBhcyBFbnVtU3ltYm9sQm9keSxcbiAgZW51bUJvb2xlYW5NZW1iZXIgYXMgRW51bUJvb2xlYW5NZW1iZXIsXG4gIGVudW1OdW1iZXJNZW1iZXIgYXMgRW51bU51bWJlck1lbWJlcixcbiAgZW51bVN0cmluZ01lbWJlciBhcyBFbnVtU3RyaW5nTWVtYmVyLFxuICBlbnVtRGVmYXVsdGVkTWVtYmVyIGFzIEVudW1EZWZhdWx0ZWRNZW1iZXIsXG4gIGluZGV4ZWRBY2Nlc3NUeXBlIGFzIEluZGV4ZWRBY2Nlc3NUeXBlLFxuICBvcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlIGFzIE9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUsXG4gIGpzeEF0dHJpYnV0ZSBhcyBKU1hBdHRyaWJ1dGUsXG4gIGpzeENsb3NpbmdFbGVtZW50IGFzIEpTWENsb3NpbmdFbGVtZW50LFxuICBqc3hFbGVtZW50IGFzIEpTWEVsZW1lbnQsXG4gIGpzeEVtcHR5RXhwcmVzc2lvbiBhcyBKU1hFbXB0eUV4cHJlc3Npb24sXG4gIGpzeEV4cHJlc3Npb25Db250YWluZXIgYXMgSlNYRXhwcmVzc2lvbkNvbnRhaW5lcixcbiAganN4U3ByZWFkQ2hpbGQgYXMgSlNYU3ByZWFkQ2hpbGQsXG4gIGpzeElkZW50aWZpZXIgYXMgSlNYSWRlbnRpZmllcixcbiAganN4TWVtYmVyRXhwcmVzc2lvbiBhcyBKU1hNZW1iZXJFeHByZXNzaW9uLFxuICBqc3hOYW1lc3BhY2VkTmFtZSBhcyBKU1hOYW1lc3BhY2VkTmFtZSxcbiAganN4T3BlbmluZ0VsZW1lbnQgYXMgSlNYT3BlbmluZ0VsZW1lbnQsXG4gIGpzeFNwcmVhZEF0dHJpYnV0ZSBhcyBKU1hTcHJlYWRBdHRyaWJ1dGUsXG4gIGpzeFRleHQgYXMgSlNYVGV4dCxcbiAganN4RnJhZ21lbnQgYXMgSlNYRnJhZ21lbnQsXG4gIGpzeE9wZW5pbmdGcmFnbWVudCBhcyBKU1hPcGVuaW5nRnJhZ21lbnQsXG4gIGpzeENsb3NpbmdGcmFnbWVudCBhcyBKU1hDbG9zaW5nRnJhZ21lbnQsXG4gIG5vb3AgYXMgTm9vcCxcbiAgcGxhY2Vob2xkZXIgYXMgUGxhY2Vob2xkZXIsXG4gIHY4SW50cmluc2ljSWRlbnRpZmllciBhcyBWOEludHJpbnNpY0lkZW50aWZpZXIsXG4gIGFyZ3VtZW50UGxhY2Vob2xkZXIgYXMgQXJndW1lbnRQbGFjZWhvbGRlcixcbiAgYmluZEV4cHJlc3Npb24gYXMgQmluZEV4cHJlc3Npb24sXG4gIGltcG9ydEF0dHJpYnV0ZSBhcyBJbXBvcnRBdHRyaWJ1dGUsXG4gIGRlY29yYXRvciBhcyBEZWNvcmF0b3IsXG4gIGRvRXhwcmVzc2lvbiBhcyBEb0V4cHJlc3Npb24sXG4gIGV4cG9ydERlZmF1bHRTcGVjaWZpZXIgYXMgRXhwb3J0RGVmYXVsdFNwZWNpZmllcixcbiAgcmVjb3JkRXhwcmVzc2lvbiBhcyBSZWNvcmRFeHByZXNzaW9uLFxuICB0dXBsZUV4cHJlc3Npb24gYXMgVHVwbGVFeHByZXNzaW9uLFxuICBkZWNpbWFsTGl0ZXJhbCBhcyBEZWNpbWFsTGl0ZXJhbCxcbiAgbW9kdWxlRXhwcmVzc2lvbiBhcyBNb2R1bGVFeHByZXNzaW9uLFxuICB0b3BpY1JlZmVyZW5jZSBhcyBUb3BpY1JlZmVyZW5jZSxcbiAgcGlwZWxpbmVUb3BpY0V4cHJlc3Npb24gYXMgUGlwZWxpbmVUb3BpY0V4cHJlc3Npb24sXG4gIHBpcGVsaW5lQmFyZUZ1bmN0aW9uIGFzIFBpcGVsaW5lQmFyZUZ1bmN0aW9uLFxuICBwaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSBhcyBQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSxcbiAgdHNQYXJhbWV0ZXJQcm9wZXJ0eSBhcyBUU1BhcmFtZXRlclByb3BlcnR5LFxuICB0c0RlY2xhcmVGdW5jdGlvbiBhcyBUU0RlY2xhcmVGdW5jdGlvbixcbiAgdHNEZWNsYXJlTWV0aG9kIGFzIFRTRGVjbGFyZU1ldGhvZCxcbiAgdHNRdWFsaWZpZWROYW1lIGFzIFRTUXVhbGlmaWVkTmFtZSxcbiAgdHNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24gYXMgVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24sXG4gIHRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24gYXMgVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbixcbiAgdHNQcm9wZXJ0eVNpZ25hdHVyZSBhcyBUU1Byb3BlcnR5U2lnbmF0dXJlLFxuICB0c01ldGhvZFNpZ25hdHVyZSBhcyBUU01ldGhvZFNpZ25hdHVyZSxcbiAgdHNJbmRleFNpZ25hdHVyZSBhcyBUU0luZGV4U2lnbmF0dXJlLFxuICB0c0FueUtleXdvcmQgYXMgVFNBbnlLZXl3b3JkLFxuICB0c0Jvb2xlYW5LZXl3b3JkIGFzIFRTQm9vbGVhbktleXdvcmQsXG4gIHRzQmlnSW50S2V5d29yZCBhcyBUU0JpZ0ludEtleXdvcmQsXG4gIHRzSW50cmluc2ljS2V5d29yZCBhcyBUU0ludHJpbnNpY0tleXdvcmQsXG4gIHRzTmV2ZXJLZXl3b3JkIGFzIFRTTmV2ZXJLZXl3b3JkLFxuICB0c051bGxLZXl3b3JkIGFzIFRTTnVsbEtleXdvcmQsXG4gIHRzTnVtYmVyS2V5d29yZCBhcyBUU051bWJlcktleXdvcmQsXG4gIHRzT2JqZWN0S2V5d29yZCBhcyBUU09iamVjdEtleXdvcmQsXG4gIHRzU3RyaW5nS2V5d29yZCBhcyBUU1N0cmluZ0tleXdvcmQsXG4gIHRzU3ltYm9sS2V5d29yZCBhcyBUU1N5bWJvbEtleXdvcmQsXG4gIHRzVW5kZWZpbmVkS2V5d29yZCBhcyBUU1VuZGVmaW5lZEtleXdvcmQsXG4gIHRzVW5rbm93bktleXdvcmQgYXMgVFNVbmtub3duS2V5d29yZCxcbiAgdHNWb2lkS2V5d29yZCBhcyBUU1ZvaWRLZXl3b3JkLFxuICB0c1RoaXNUeXBlIGFzIFRTVGhpc1R5cGUsXG4gIHRzRnVuY3Rpb25UeXBlIGFzIFRTRnVuY3Rpb25UeXBlLFxuICB0c0NvbnN0cnVjdG9yVHlwZSBhcyBUU0NvbnN0cnVjdG9yVHlwZSxcbiAgdHNUeXBlUmVmZXJlbmNlIGFzIFRTVHlwZVJlZmVyZW5jZSxcbiAgdHNUeXBlUHJlZGljYXRlIGFzIFRTVHlwZVByZWRpY2F0ZSxcbiAgdHNUeXBlUXVlcnkgYXMgVFNUeXBlUXVlcnksXG4gIHRzVHlwZUxpdGVyYWwgYXMgVFNUeXBlTGl0ZXJhbCxcbiAgdHNBcnJheVR5cGUgYXMgVFNBcnJheVR5cGUsXG4gIHRzVHVwbGVUeXBlIGFzIFRTVHVwbGVUeXBlLFxuICB0c09wdGlvbmFsVHlwZSBhcyBUU09wdGlvbmFsVHlwZSxcbiAgdHNSZXN0VHlwZSBhcyBUU1Jlc3RUeXBlLFxuICB0c05hbWVkVHVwbGVNZW1iZXIgYXMgVFNOYW1lZFR1cGxlTWVtYmVyLFxuICB0c1VuaW9uVHlwZSBhcyBUU1VuaW9uVHlwZSxcbiAgdHNJbnRlcnNlY3Rpb25UeXBlIGFzIFRTSW50ZXJzZWN0aW9uVHlwZSxcbiAgdHNDb25kaXRpb25hbFR5cGUgYXMgVFNDb25kaXRpb25hbFR5cGUsXG4gIHRzSW5mZXJUeXBlIGFzIFRTSW5mZXJUeXBlLFxuICB0c1BhcmVudGhlc2l6ZWRUeXBlIGFzIFRTUGFyZW50aGVzaXplZFR5cGUsXG4gIHRzVHlwZU9wZXJhdG9yIGFzIFRTVHlwZU9wZXJhdG9yLFxuICB0c0luZGV4ZWRBY2Nlc3NUeXBlIGFzIFRTSW5kZXhlZEFjY2Vzc1R5cGUsXG4gIHRzTWFwcGVkVHlwZSBhcyBUU01hcHBlZFR5cGUsXG4gIHRzTGl0ZXJhbFR5cGUgYXMgVFNMaXRlcmFsVHlwZSxcbiAgdHNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMgYXMgVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMsXG4gIHRzSW50ZXJmYWNlRGVjbGFyYXRpb24gYXMgVFNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgdHNJbnRlcmZhY2VCb2R5IGFzIFRTSW50ZXJmYWNlQm9keSxcbiAgdHNUeXBlQWxpYXNEZWNsYXJhdGlvbiBhcyBUU1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uIGFzIFRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24sXG4gIHRzQXNFeHByZXNzaW9uIGFzIFRTQXNFeHByZXNzaW9uLFxuICB0c1NhdGlzZmllc0V4cHJlc3Npb24gYXMgVFNTYXRpc2ZpZXNFeHByZXNzaW9uLFxuICB0c1R5cGVBc3NlcnRpb24gYXMgVFNUeXBlQXNzZXJ0aW9uLFxuICB0c0VudW1EZWNsYXJhdGlvbiBhcyBUU0VudW1EZWNsYXJhdGlvbixcbiAgdHNFbnVtTWVtYmVyIGFzIFRTRW51bU1lbWJlcixcbiAgdHNNb2R1bGVEZWNsYXJhdGlvbiBhcyBUU01vZHVsZURlY2xhcmF0aW9uLFxuICB0c01vZHVsZUJsb2NrIGFzIFRTTW9kdWxlQmxvY2ssXG4gIHRzSW1wb3J0VHlwZSBhcyBUU0ltcG9ydFR5cGUsXG4gIHRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gYXMgVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbixcbiAgdHNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSBhcyBUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlLFxuICB0c05vbk51bGxFeHByZXNzaW9uIGFzIFRTTm9uTnVsbEV4cHJlc3Npb24sXG4gIHRzRXhwb3J0QXNzaWdubWVudCBhcyBUU0V4cG9ydEFzc2lnbm1lbnQsXG4gIHRzTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24gYXMgVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbixcbiAgdHNUeXBlQW5ub3RhdGlvbiBhcyBUU1R5cGVBbm5vdGF0aW9uLFxuICB0c1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIGFzIFRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24sXG4gIHRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGFzIFRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLFxuICB0c1R5cGVQYXJhbWV0ZXIgYXMgVFNUeXBlUGFyYW1ldGVyLFxuICBudW1iZXJMaXRlcmFsIGFzIE51bWJlckxpdGVyYWwsXG4gIHJlZ2V4TGl0ZXJhbCBhcyBSZWdleExpdGVyYWwsXG4gIHJlc3RQcm9wZXJ0eSBhcyBSZXN0UHJvcGVydHksXG4gIHNwcmVhZFByb3BlcnR5IGFzIFNwcmVhZFByb3BlcnR5LFxufSBmcm9tIFwiLi9pbmRleFwiO1xuIiwgImltcG9ydCB7IE5PREVfRklFTERTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBpc0ZpbGUsIGlzSWRlbnRpZmllciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuXG5jb25zdCBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbnR5cGUgQ29tbWVudENhY2hlID0gTWFwPHQuQ29tbWVudCwgdC5Db21tZW50PjtcblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIGJlIGNhbGxlZCBmb3IgY29tbWVudHMsIG9ubHkgZm9yIHJlYWwgbm9kZXMuXG5mdW5jdGlvbiBjbG9uZUlmTm9kZShcbiAgb2JqOiB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsLFxuICBkZWVwOiBib29sZWFuLFxuICB3aXRob3V0TG9jOiBib29sZWFuLFxuICBjb21tZW50c0NhY2hlOiBDb21tZW50Q2FjaGUsXG4pIHtcbiAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY2xvbmVOb2RlSW50ZXJuYWwob2JqLCBkZWVwLCB3aXRob3V0TG9jLCBjb21tZW50c0NhY2hlKTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGNsb25lSWZOb2RlT3JBcnJheShcbiAgb2JqOiB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsIHwgKHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwpW10sXG4gIGRlZXA6IGJvb2xlYW4sXG4gIHdpdGhvdXRMb2M6IGJvb2xlYW4sXG4gIGNvbW1lbnRzQ2FjaGU6IENvbW1lbnRDYWNoZSxcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAobm9kZSA9PiBjbG9uZUlmTm9kZShub2RlLCBkZWVwLCB3aXRob3V0TG9jLCBjb21tZW50c0NhY2hlKSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lSWZOb2RlKG9iaiwgZGVlcCwgd2l0aG91dExvYywgY29tbWVudHNDYWNoZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2xvbmUgb2YgYSBgbm9kZWAgaW5jbHVkaW5nIG9ubHkgcHJvcGVydGllcyBiZWxvbmdpbmcgdG8gdGhlIG5vZGUuXG4gKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBgZmFsc2VgLCBjbG9uZU5vZGUgcGVyZm9ybXMgYSBzaGFsbG93IGNsb25lLlxuICogSWYgdGhlIHRoaXJkIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY2xvbmVkIG5vZGVzIGV4Y2x1ZGUgbG9jYXRpb24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xvbmVOb2RlPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBub2RlOiBULFxuICBkZWVwOiBib29sZWFuID0gdHJ1ZSxcbiAgd2l0aG91dExvYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogVCB7XG4gIHJldHVybiBjbG9uZU5vZGVJbnRlcm5hbChub2RlLCBkZWVwLCB3aXRob3V0TG9jLCBuZXcgTWFwKCkpO1xufVxuXG5mdW5jdGlvbiBjbG9uZU5vZGVJbnRlcm5hbDxUIGV4dGVuZHMgdC5Ob2RlPihcbiAgbm9kZTogVCxcbiAgZGVlcDogYm9vbGVhbiA9IHRydWUsXG4gIHdpdGhvdXRMb2M6IGJvb2xlYW4gPSBmYWxzZSxcbiAgY29tbWVudHNDYWNoZTogQ29tbWVudENhY2hlLFxuKTogVCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgeyB0eXBlIH0gPSBub2RlO1xuICBjb25zdCBuZXdOb2RlOiBhbnkgPSB7IHR5cGU6IG5vZGUudHlwZSB9O1xuXG4gIC8vIFNwZWNpYWwtY2FzZSBpZGVudGlmaWVycyBzaW5jZSB0aGV5IGFyZSB0aGUgbW9zdCBjbG9uZWQgbm9kZXMuXG4gIGlmIChpc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICBuZXdOb2RlLm5hbWUgPSBub2RlLm5hbWU7XG5cbiAgICBpZiAoaGFzKG5vZGUsIFwib3B0aW9uYWxcIikgJiYgdHlwZW9mIG5vZGUub3B0aW9uYWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBuZXdOb2RlLm9wdGlvbmFsID0gbm9kZS5vcHRpb25hbDtcbiAgICB9XG5cbiAgICBpZiAoaGFzKG5vZGUsIFwidHlwZUFubm90YXRpb25cIikpIHtcbiAgICAgIG5ld05vZGUudHlwZUFubm90YXRpb24gPSBkZWVwXG4gICAgICAgID8gY2xvbmVJZk5vZGVPckFycmF5KFxuICAgICAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB3aXRob3V0TG9jLFxuICAgICAgICAgICAgY29tbWVudHNDYWNoZSxcbiAgICAgICAgICApXG4gICAgICAgIDogbm9kZS50eXBlQW5ub3RhdGlvbjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWhhcyhOT0RFX0ZJRUxEUywgdHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbm9kZSB0eXBlOiBcIiR7dHlwZX1cImApO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMoTk9ERV9GSUVMRFNbdHlwZV0pKSB7XG4gICAgICBpZiAoaGFzKG5vZGUsIGZpZWxkKSkge1xuICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgIG5ld05vZGVbZmllbGRdID1cbiAgICAgICAgICAgIGlzRmlsZShub2RlKSAmJiBmaWVsZCA9PT0gXCJjb21tZW50c1wiXG4gICAgICAgICAgICAgID8gbWF5YmVDbG9uZUNvbW1lbnRzKFxuICAgICAgICAgICAgICAgICAgbm9kZS5jb21tZW50cyxcbiAgICAgICAgICAgICAgICAgIGRlZXAsXG4gICAgICAgICAgICAgICAgICB3aXRob3V0TG9jLFxuICAgICAgICAgICAgICAgICAgY29tbWVudHNDYWNoZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY2xvbmVJZk5vZGVPckFycmF5KFxuICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlW2ZpZWxkXSBoYXMgYmVlbiBndWFyZGVkIGJ5IGhhcyBjaGVja1xuICAgICAgICAgICAgICAgICAgbm9kZVtmaWVsZF0sXG4gICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgd2l0aG91dExvYyxcbiAgICAgICAgICAgICAgICAgIGNvbW1lbnRzQ2FjaGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdOb2RlW2ZpZWxkXSA9XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5vZGVbZmllbGRdIGhhcyBiZWVuIGd1YXJkZWQgYnkgaGFzIGNoZWNrXG4gICAgICAgICAgICBub2RlW2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXMobm9kZSwgXCJsb2NcIikpIHtcbiAgICBpZiAod2l0aG91dExvYykge1xuICAgICAgbmV3Tm9kZS5sb2MgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdOb2RlLmxvYyA9IG5vZGUubG9jO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzKG5vZGUsIFwibGVhZGluZ0NvbW1lbnRzXCIpKSB7XG4gICAgbmV3Tm9kZS5sZWFkaW5nQ29tbWVudHMgPSBtYXliZUNsb25lQ29tbWVudHMoXG4gICAgICBub2RlLmxlYWRpbmdDb21tZW50cyxcbiAgICAgIGRlZXAsXG4gICAgICB3aXRob3V0TG9jLFxuICAgICAgY29tbWVudHNDYWNoZSxcbiAgICApO1xuICB9XG4gIGlmIChoYXMobm9kZSwgXCJpbm5lckNvbW1lbnRzXCIpKSB7XG4gICAgbmV3Tm9kZS5pbm5lckNvbW1lbnRzID0gbWF5YmVDbG9uZUNvbW1lbnRzKFxuICAgICAgbm9kZS5pbm5lckNvbW1lbnRzLFxuICAgICAgZGVlcCxcbiAgICAgIHdpdGhvdXRMb2MsXG4gICAgICBjb21tZW50c0NhY2hlLFxuICAgICk7XG4gIH1cbiAgaWYgKGhhcyhub2RlLCBcInRyYWlsaW5nQ29tbWVudHNcIikpIHtcbiAgICBuZXdOb2RlLnRyYWlsaW5nQ29tbWVudHMgPSBtYXliZUNsb25lQ29tbWVudHMoXG4gICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMsXG4gICAgICBkZWVwLFxuICAgICAgd2l0aG91dExvYyxcbiAgICAgIGNvbW1lbnRzQ2FjaGUsXG4gICAgKTtcbiAgfVxuICBpZiAoaGFzKG5vZGUsIFwiZXh0cmFcIikpIHtcbiAgICBuZXdOb2RlLmV4dHJhID0ge1xuICAgICAgLi4ubm9kZS5leHRyYSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2xvbmVDb21tZW50czxUIGV4dGVuZHMgdC5Db21tZW50PihcbiAgY29tbWVudHM6IFJlYWRvbmx5QXJyYXk8VD4gfCBudWxsLFxuICBkZWVwOiBib29sZWFuLFxuICB3aXRob3V0TG9jOiBib29sZWFuLFxuICBjb21tZW50c0NhY2hlOiBNYXA8VCwgVD4sXG4pOiBSZWFkb25seUFycmF5PFQ+IHwgbnVsbCB7XG4gIGlmICghY29tbWVudHMgfHwgIWRlZXApIHtcbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgcmV0dXJuIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IGNvbW1lbnRzQ2FjaGUuZ2V0KGNvbW1lbnQpO1xuICAgIGlmIChjYWNoZSkgcmV0dXJuIGNhY2hlO1xuXG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSwgbG9jIH0gPSBjb21tZW50O1xuXG4gICAgY29uc3QgcmV0ID0geyB0eXBlLCB2YWx1ZSwgbG9jIH0gYXMgVDtcbiAgICBpZiAod2l0aG91dExvYykge1xuICAgICAgcmV0LmxvYyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29tbWVudHNDYWNoZS5zZXQoY29tbWVudCwgcmV0KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwgImltcG9ydCBjbG9uZU5vZGUgZnJvbSBcIi4vY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgc2hhbGxvdyBjbG9uZSBvZiBhIGBub2RlYCwgaW5jbHVkaW5nIG9ubHlcbiAqIHByb3BlcnRpZXMgYmVsb25naW5nIHRvIHRoZSBub2RlLlxuICogQGRlcHJlY2F0ZWQgVXNlIHQuY2xvbmVOb2RlIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyB0Lk5vZGU+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGNsb25lTm9kZShub2RlLCAvKiBkZWVwICovIGZhbHNlKTtcbn1cbiIsICJpbXBvcnQgY2xvbmVOb2RlIGZyb20gXCIuL2Nsb25lTm9kZVwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIGRlZXAgY2xvbmUgb2YgYSBgbm9kZWAgYW5kIGFsbCBvZiBpdCdzIGNoaWxkIG5vZGVzXG4gKiBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byB0aGUgbm9kZS5cbiAqIEBkZXByZWNhdGVkIFVzZSB0LmNsb25lTm9kZSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZURlZXA8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICByZXR1cm4gY2xvbmVOb2RlKG5vZGUpO1xufVxuIiwgImltcG9ydCBjbG9uZU5vZGUgZnJvbSBcIi4vY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG4vKipcbiAqIENyZWF0ZSBhIGRlZXAgY2xvbmUgb2YgYSBgbm9kZWAgYW5kIGFsbCBvZiBpdCdzIGNoaWxkIG5vZGVzXG4gKiBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byB0aGUgbm9kZS5cbiAqIGV4Y2x1ZGluZyBgX3ByaXZhdGVgIGFuZCBsb2NhdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZURlZXBXaXRob3V0TG9jPFQgZXh0ZW5kcyB0Lk5vZGU+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGNsb25lTm9kZShub2RlLCAvKiBkZWVwICovIHRydWUsIC8qIHdpdGhvdXRMb2MgKi8gdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi9jbG9uZU5vZGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBzaGFsbG93IGNsb25lIG9mIGEgYG5vZGVgIGV4Y2x1ZGluZyBgX3ByaXZhdGVgIGFuZCBsb2NhdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZVdpdGhvdXRMb2M8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICByZXR1cm4gY2xvbmVOb2RlKG5vZGUsIC8qIGRlZXAgKi8gZmFsc2UsIC8qIHdpdGhvdXRMb2MgKi8gdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEFkZCBjb21tZW50cyBvZiBjZXJ0YWluIHR5cGUgdG8gYSBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRDb21tZW50czxUIGV4dGVuZHMgdC5Ob2RlPihcbiAgbm9kZTogVCxcbiAgdHlwZTogdC5Db21tZW50VHlwZVNob3J0aGFuZCxcbiAgY29tbWVudHM6IEFycmF5PHQuQ29tbWVudD4sXG4pOiBUIHtcbiAgaWYgKCFjb21tZW50cyB8fCAhbm9kZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3Qga2V5ID0gYCR7dHlwZX1Db21tZW50c2AgYXMgY29uc3Q7XG5cbiAgaWYgKG5vZGVba2V5XSkge1xuICAgIGlmICh0eXBlID09PSBcImxlYWRpbmdcIikge1xuICAgICAgbm9kZVtrZXldID0gY29tbWVudHMuY29uY2F0KG5vZGVba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVba2V5XS5wdXNoKC4uLmNvbW1lbnRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZVtrZXldID0gY29tbWVudHM7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbiIsICJpbXBvcnQgYWRkQ29tbWVudHMgZnJvbSBcIi4vYWRkQ29tbWVudHNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBBZGQgY29tbWVudCBvZiBjZXJ0YWluIHR5cGUgdG8gYSBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRDb21tZW50PFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBub2RlOiBULFxuICB0eXBlOiB0LkNvbW1lbnRUeXBlU2hvcnRoYW5kLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmU/OiBib29sZWFuLFxuKTogVCB7XG4gIHJldHVybiBhZGRDb21tZW50cyhub2RlLCB0eXBlLCBbXG4gICAge1xuICAgICAgdHlwZTogbGluZSA/IFwiQ29tbWVudExpbmVcIiA6IFwiQ29tbWVudEJsb2NrXCIsXG4gICAgICB2YWx1ZTogY29udGVudCxcbiAgICB9IGFzIHQuQ29tbWVudCxcbiAgXSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0PFxuICBDIGV4dGVuZHMgdC5Ob2RlIHwgdW5kZWZpbmVkLFxuICBQIGV4dGVuZHMgdC5Ob2RlIHwgdW5kZWZpbmVkLFxuPihrZXk6IGtleW9mIEMgJiBrZXlvZiBQLCBjaGlsZDogQywgcGFyZW50OiBQKTogdm9pZCB7XG4gIGlmIChjaGlsZCAmJiBwYXJlbnQpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvdWxkIGZ1cnRoZXIgcmVmaW5lIGtleSBkZWZpbml0aW9uc1xuICAgIGNoaWxkW2tleV0gPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbXS5jb25jYXQoY2hpbGRba2V5XSwgcGFyZW50W2tleV0pLmZpbHRlcihCb29sZWFuKSksXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCBpbmhlcml0IGZyb20gXCIuLi91dGlscy9pbmhlcml0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaGVyaXRJbm5lckNvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwiaW5uZXJDb21tZW50c1wiLCBjaGlsZCwgcGFyZW50KTtcbn1cbiIsICJpbXBvcnQgaW5oZXJpdCBmcm9tIFwiLi4vdXRpbHMvaW5oZXJpdFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0TGVhZGluZ0NvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwibGVhZGluZ0NvbW1lbnRzXCIsIGNoaWxkLCBwYXJlbnQpO1xufVxuIiwgImltcG9ydCBpbmhlcml0IGZyb20gXCIuLi91dGlscy9pbmhlcml0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaGVyaXRUcmFpbGluZ0NvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwidHJhaWxpbmdDb21tZW50c1wiLCBjaGlsZCwgcGFyZW50KTtcbn1cbiIsICJpbXBvcnQgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMgZnJvbSBcIi4vaW5oZXJpdFRyYWlsaW5nQ29tbWVudHNcIjtcbmltcG9ydCBpbmhlcml0TGVhZGluZ0NvbW1lbnRzIGZyb20gXCIuL2luaGVyaXRMZWFkaW5nQ29tbWVudHNcIjtcbmltcG9ydCBpbmhlcml0SW5uZXJDb21tZW50cyBmcm9tIFwiLi9pbmhlcml0SW5uZXJDb21tZW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEluaGVyaXQgYWxsIHVuaXF1ZSBjb21tZW50cyBmcm9tIGBwYXJlbnRgIG5vZGUgdG8gYGNoaWxkYCBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0c0NvbW1lbnRzPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBjaGlsZDogVCxcbiAgcGFyZW50OiB0Lk5vZGUsXG4pOiBUIHtcbiAgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMoY2hpbGQsIHBhcmVudCk7XG4gIGluaGVyaXRMZWFkaW5nQ29tbWVudHMoY2hpbGQsIHBhcmVudCk7XG4gIGluaGVyaXRJbm5lckNvbW1lbnRzKGNoaWxkLCBwYXJlbnQpO1xuXG4gIHJldHVybiBjaGlsZDtcbn1cbiIsICJpbXBvcnQgeyBDT01NRU5UX0tFWVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogUmVtb3ZlIGNvbW1lbnQgcHJvcGVydGllcyBmcm9tIGEgbm9kZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVtb3ZlQ29tbWVudHM8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICBDT01NRU5UX0tFWVMuZm9yRWFjaChrZXkgPT4ge1xuICAgIG5vZGVba2V5XSA9IG51bGw7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuIiwgIi8qXG4gKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQhIERvIG5vdCBtb2RpZnkgaXQgZGlyZWN0bHkuXG4gKiBUbyByZS1nZW5lcmF0ZSBydW4gJ21ha2UgYnVpbGQnXG4gKi9cbmltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUyB9IGZyb20gXCIuLi8uLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgU1RBTkRBUkRJWkVEX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiU3RhbmRhcmRpemVkXCJdO1xuZXhwb3J0IGNvbnN0IEVYUFJFU1NJT05fVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJFeHByZXNzaW9uXCJdO1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkJpbmFyeVwiXTtcbmV4cG9ydCBjb25zdCBTQ09QQUJMRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlNjb3BhYmxlXCJdO1xuZXhwb3J0IGNvbnN0IEJMT0NLUEFSRU5UX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiQmxvY2tQYXJlbnRcIl07XG5leHBvcnQgY29uc3QgQkxPQ0tfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJCbG9ja1wiXTtcbmV4cG9ydCBjb25zdCBTVEFURU1FTlRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJTdGF0ZW1lbnRcIl07XG5leHBvcnQgY29uc3QgVEVSTUlOQVRPUkxFU1NfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUZXJtaW5hdG9ybGVzc1wiXTtcbmV4cG9ydCBjb25zdCBDT01QTEVUSU9OU1RBVEVNRU5UX1RZUEVTID1cbiAgRkxJUFBFRF9BTElBU19LRVlTW1wiQ29tcGxldGlvblN0YXRlbWVudFwiXTtcbmV4cG9ydCBjb25zdCBDT05ESVRJT05BTF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkNvbmRpdGlvbmFsXCJdO1xuZXhwb3J0IGNvbnN0IExPT1BfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJMb29wXCJdO1xuZXhwb3J0IGNvbnN0IFdISUxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiV2hpbGVcIl07XG5leHBvcnQgY29uc3QgRVhQUkVTU0lPTldSQVBQRVJfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJFeHByZXNzaW9uV3JhcHBlclwiXTtcbmV4cG9ydCBjb25zdCBGT1JfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGb3JcIl07XG5leHBvcnQgY29uc3QgRk9SWFNUQVRFTUVOVF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZvclhTdGF0ZW1lbnRcIl07XG5leHBvcnQgY29uc3QgRlVOQ1RJT05fVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGdW5jdGlvblwiXTtcbmV4cG9ydCBjb25zdCBGVU5DVElPTlBBUkVOVF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZ1bmN0aW9uUGFyZW50XCJdO1xuZXhwb3J0IGNvbnN0IFBVUkVJU0hfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJQdXJlaXNoXCJdO1xuZXhwb3J0IGNvbnN0IERFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRGVjbGFyYXRpb25cIl07XG5leHBvcnQgY29uc3QgUEFUVEVSTkxJS0VfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJQYXR0ZXJuTGlrZVwiXTtcbmV4cG9ydCBjb25zdCBMVkFMX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTFZhbFwiXTtcbmV4cG9ydCBjb25zdCBUU0VOVElUWU5BTUVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUU0VudGl0eU5hbWVcIl07XG5leHBvcnQgY29uc3QgTElURVJBTF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkxpdGVyYWxcIl07XG5leHBvcnQgY29uc3QgSU1NVVRBQkxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiSW1tdXRhYmxlXCJdO1xuZXhwb3J0IGNvbnN0IFVTRVJXSElURVNQQUNBQkxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiVXNlcldoaXRlc3BhY2FibGVcIl07XG5leHBvcnQgY29uc3QgTUVUSE9EX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTWV0aG9kXCJdO1xuZXhwb3J0IGNvbnN0IE9CSkVDVE1FTUJFUl9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIk9iamVjdE1lbWJlclwiXTtcbmV4cG9ydCBjb25zdCBQUk9QRVJUWV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlByb3BlcnR5XCJdO1xuZXhwb3J0IGNvbnN0IFVOQVJZTElLRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlVuYXJ5TGlrZVwiXTtcbmV4cG9ydCBjb25zdCBQQVRURVJOX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiUGF0dGVyblwiXTtcbmV4cG9ydCBjb25zdCBDTEFTU19UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkNsYXNzXCJdO1xuZXhwb3J0IGNvbnN0IElNUE9SVE9SRVhQT1JUREVDTEFSQVRJT05fVFlQRVMgPVxuICBGTElQUEVEX0FMSUFTX0tFWVNbXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCJdO1xuZXhwb3J0IGNvbnN0IEVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRXhwb3J0RGVjbGFyYXRpb25cIl07XG5leHBvcnQgY29uc3QgTU9EVUxFU1BFQ0lGSUVSX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTW9kdWxlU3BlY2lmaWVyXCJdO1xuZXhwb3J0IGNvbnN0IEFDQ0VTU09SX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiQWNjZXNzb3JcIl07XG5leHBvcnQgY29uc3QgUFJJVkFURV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlByaXZhdGVcIl07XG5leHBvcnQgY29uc3QgRkxPV19UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZsb3dcIl07XG5leHBvcnQgY29uc3QgRkxPV1RZUEVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93VHlwZVwiXTtcbmV4cG9ydCBjb25zdCBGTE9XQkFTRUFOTk9UQVRJT05fVFlQRVMgPVxuICBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93QmFzZUFubm90YXRpb25cIl07XG5leHBvcnQgY29uc3QgRkxPV0RFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRmxvd0RlY2xhcmF0aW9uXCJdO1xuZXhwb3J0IGNvbnN0IEZMT1dQUkVESUNBVEVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93UHJlZGljYXRlXCJdO1xuZXhwb3J0IGNvbnN0IEVOVU1CT0RZX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRW51bUJvZHlcIl07XG5leHBvcnQgY29uc3QgRU5VTU1FTUJFUl9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkVudW1NZW1iZXJcIl07XG5leHBvcnQgY29uc3QgSlNYX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiSlNYXCJdO1xuZXhwb3J0IGNvbnN0IE1JU0NFTExBTkVPVVNfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJNaXNjZWxsYW5lb3VzXCJdO1xuZXhwb3J0IGNvbnN0IFRZUEVTQ1JJUFRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUeXBlU2NyaXB0XCJdO1xuZXhwb3J0IGNvbnN0IFRTVFlQRUVMRU1FTlRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUU1R5cGVFbGVtZW50XCJdO1xuZXhwb3J0IGNvbnN0IFRTVFlQRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlRTVHlwZVwiXTtcbmV4cG9ydCBjb25zdCBUU0JBU0VUWVBFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiVFNCYXNlVHlwZVwiXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgbWlncmF0ZSB0byBJTVBPUlRPUkVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTLlxuICovXG5leHBvcnQgY29uc3QgTU9EVUxFREVDTEFSQVRJT05fVFlQRVMgPSBJTVBPUlRPUkVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTO1xuIiwgImltcG9ydCB7XG4gIGlzQmxvY2tTdGF0ZW1lbnQsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRW1wdHlTdGF0ZW1lbnQsXG4gIGlzU3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIHJldHVyblN0YXRlbWVudCxcbiAgZXhwcmVzc2lvblN0YXRlbWVudCxcbiAgYmxvY2tTdGF0ZW1lbnQsXG59IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9CbG9jayhcbiAgbm9kZTogdC5TdGF0ZW1lbnQgfCB0LkV4cHJlc3Npb24sXG4gIHBhcmVudD86IHQuTm9kZSxcbik6IHQuQmxvY2tTdGF0ZW1lbnQge1xuICBpZiAoaXNCbG9ja1N0YXRlbWVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgbGV0IGJsb2NrTm9kZXM6IHQuU3RhdGVtZW50W10gPSBbXTtcblxuICBpZiAoaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgIGJsb2NrTm9kZXMgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWlzU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihwYXJlbnQpKSB7XG4gICAgICAgIG5vZGUgPSByZXR1cm5TdGF0ZW1lbnQobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0gZXhwcmVzc2lvblN0YXRlbWVudChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBibG9ja05vZGVzID0gW25vZGVdO1xuICB9XG5cbiAgcmV0dXJuIGJsb2NrU3RhdGVtZW50KGJsb2NrTm9kZXMpO1xufVxuIiwgImltcG9ydCB0b0Jsb2NrIGZyb20gXCIuL3RvQmxvY2tcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBFbnN1cmUgdGhlIGBrZXlgIChkZWZhdWx0cyB0byBcImJvZHlcIikgb2YgYSBgbm9kZWAgaXMgYSBibG9jay5cbiAqIENhc3RpbmcgaXQgdG8gYSBibG9jayBpZiBpdCBpcyBub3QuXG4gKlxuICogUmV0dXJucyB0aGUgQmxvY2tTdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW5zdXJlQmxvY2soXG4gIG5vZGU6IHQuTm9kZSxcbiAga2V5OiBzdHJpbmcgPSBcImJvZHlcIixcbik6IHQuQmxvY2tTdGF0ZW1lbnQge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBrZXkgbWF5IG5vdCBleGlzdCBpbiBub2RlLCBjb25zaWRlciByZW1vdmUga2V5ID0gXCJib2R5XCJcbiAgY29uc3QgcmVzdWx0ID0gdG9CbG9jayhub2RlW2tleV0sIG5vZGUpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBrZXkgbWF5IG5vdCBleGlzdCBpbiBub2RlLCBjb25zaWRlciByZW1vdmUga2V5ID0gXCJib2R5XCJcbiAgbm9kZVtrZXldID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCBpc1ZhbGlkSWRlbnRpZmllciBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1ZhbGlkSWRlbnRpZmllclwiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyQ2hhciB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaW5wdXQgPSBpbnB1dCArIFwiXCI7XG5cbiAgLy8gcmVwbGFjZSBhbGwgbm9uLXZhbGlkIGlkZW50aWZpZXJzIHdpdGggZGFzaGVzXG4gIGxldCBuYW1lID0gXCJcIjtcbiAgZm9yIChjb25zdCBjIG9mIGlucHV0KSB7XG4gICAgbmFtZSArPSBpc0lkZW50aWZpZXJDaGFyKGMuY29kZVBvaW50QXQoMCkpID8gYyA6IFwiLVwiO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBkYXNoZXMgYW5kIG51bWJlcnMgZnJvbSBzdGFydCBvZiBuYW1lXG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL15bLTAtOV0rLywgXCJcIik7XG5cbiAgLy8gY2FtZWwgY2FzZVxuICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bLVxcc10rKC4pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIGMpIHtcbiAgICByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6IFwiXCI7XG4gIH0pO1xuXG4gIGlmICghaXNWYWxpZElkZW50aWZpZXIobmFtZSkpIHtcbiAgICBuYW1lID0gYF8ke25hbWV9YDtcbiAgfVxuXG4gIHJldHVybiBuYW1lIHx8IFwiX1wiO1xufVxuIiwgImltcG9ydCB0b0lkZW50aWZpZXIgZnJvbSBcIi4vdG9JZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQmluZGluZ0lkZW50aWZpZXJOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIG5hbWUgPSB0b0lkZW50aWZpZXIobmFtZSk7XG4gIGlmIChuYW1lID09PSBcImV2YWxcIiB8fCBuYW1lID09PSBcImFyZ3VtZW50c1wiKSBuYW1lID0gXCJfXCIgKyBuYW1lO1xuXG4gIHJldHVybiBuYW1lO1xufVxuIiwgImltcG9ydCB7IGlzSWRlbnRpZmllciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgc3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9Db21wdXRlZEtleShcbiAgbm9kZTpcbiAgICB8IHQuT2JqZWN0TWVtYmVyXG4gICAgfCB0Lk9iamVjdFByb3BlcnR5XG4gICAgfCB0LkNsYXNzTWV0aG9kXG4gICAgfCB0LkNsYXNzUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5XG4gICAgfCB0Lk1lbWJlckV4cHJlc3Npb25cbiAgICB8IHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpOiBtYXliZSBjaGVjayB0aGUgdHlwZSBvZiBub2RlIGJlZm9yZSBhY2Nlc3NpbmcgLmtleSBhbmQgLnByb3BlcnR5XG4gIGtleTogdC5FeHByZXNzaW9uIHwgdC5Qcml2YXRlTmFtZSA9IG5vZGUua2V5IHx8IG5vZGUucHJvcGVydHksXG4pIHtcbiAgaWYgKCFub2RlLmNvbXB1dGVkICYmIGlzSWRlbnRpZmllcihrZXkpKSBrZXkgPSBzdHJpbmdMaXRlcmFsKGtleS5uYW1lKTtcblxuICByZXR1cm4ga2V5O1xufVxuIiwgImltcG9ydCB7XG4gIGlzRXhwcmVzc2lvbixcbiAgaXNGdW5jdGlvbixcbiAgaXNDbGFzcyxcbiAgaXNFeHByZXNzaW9uU3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdG9FeHByZXNzaW9uIGFzIHtcbiAgKG5vZGU6IHQuRnVuY3Rpb24pOiB0LkZ1bmN0aW9uRXhwcmVzc2lvbjtcbiAgKG5vZGU6IHQuQ2xhc3MpOiB0LkNsYXNzRXhwcmVzc2lvbjtcbiAgKFxuICAgIG5vZGU6IHQuRXhwcmVzc2lvblN0YXRlbWVudCB8IHQuRXhwcmVzc2lvbiB8IHQuQ2xhc3MgfCB0LkZ1bmN0aW9uLFxuICApOiB0LkV4cHJlc3Npb247XG59O1xuXG5mdW5jdGlvbiB0b0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuRXhwcmVzc2lvblN0YXRlbWVudCB8IHQuRXhwcmVzc2lvbiB8IHQuQ2xhc3MgfCB0LkZ1bmN0aW9uLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgaWYgKGlzRXhwcmVzc2lvblN0YXRlbWVudChub2RlKSkge1xuICAgIG5vZGUgPSBub2RlLmV4cHJlc3Npb247XG4gIH1cblxuICAvLyByZXR1cm4gdW5tb2RpZmllZCBub2RlXG4gIC8vIGltcG9ydGFudCBmb3IgdGhpbmdzIGxpa2UgQXJyb3dGdW5jdGlvbnMgd2hlcmVcbiAgLy8gdHlwZSBjaGFuZ2UgZnJvbSBBcnJvd0Z1bmN0aW9uIHRvIEZ1bmN0aW9uRXhwcmVzc2lvblxuICAvLyBwcm9kdWNlcyBidWdzIGxpa2UgLT4gYCgpPT5hYCB0byBgZnVuY3Rpb24gKCkgYWBcbiAgLy8gd2l0aG91dCBnZW5lcmF0aW5nIGEgQmxvY2tTdGF0ZW1lbnQgZm9yIGl0XG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmlsaS9pc3N1ZXMvMTMwXG4gIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgYWxsIGNsYXNzZXMgYW5kIGZ1bmN0aW9uc1xuICAvLyBDbGFzc0RlY2xhcmF0aW9uIC0+IENsYXNzRXhwcmVzc2lvblxuICAvLyBGdW5jdGlvbkRlY2xhcmF0aW9uLCBPYmplY3RNZXRob2QsIENsYXNzTWV0aG9kIC0+IEZ1bmN0aW9uRXhwcmVzc2lvblxuICBpZiAoaXNDbGFzcyhub2RlKSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IGF2b2lkIHR5cGUgdW5zYWZlIG11dGF0aW9uc1xuICAgIG5vZGUudHlwZSA9IFwiQ2xhc3NFeHByZXNzaW9uXCI7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihub2RlKSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IGF2b2lkIHR5cGUgdW5zYWZlIG11dGF0aW9uc1xuICAgIG5vZGUudHlwZSA9IFwiRnVuY3Rpb25FeHByZXNzaW9uXCI7XG4gIH1cblxuICAvLyBpZiBpdCdzIHN0aWxsIG5vdCBhbiBleHByZXNzaW9uXG4gIGlmICghaXNFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgdHVybiAke25vZGUudHlwZX0gdG8gYW4gZXhwcmVzc2lvbmApO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQSBwcmVmaXggQVNUIHRyYXZlcnNhbCBpbXBsZW1lbnRhdGlvbiBtZWFudCBmb3Igc2ltcGxlIHNlYXJjaGluZ1xuICogYW5kIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYXZlcnNlRmFzdDxPcHRpb25zID0ge30+KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBlbnRlcjogKG5vZGU6IHQuTm9kZSwgb3B0cz86IE9wdGlvbnMpID0+IHZvaWQsXG4gIG9wdHM/OiBPcHRpb25zLFxuKTogdm9pZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXMgPSBWSVNJVE9SX0tFWVNbbm9kZS50eXBlXTtcbiAgaWYgKCFrZXlzKSByZXR1cm47XG5cbiAgb3B0cyA9IG9wdHMgfHwgKHt9IGFzIE9wdGlvbnMpO1xuICBlbnRlcihub2RlLCBvcHRzKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3Qgc3ViTm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtdXN0IHByZXNlbnQgaW4gbm9kZVxuICAgICAgbm9kZVtrZXldO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViTm9kZSkpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWJOb2RlKSB7XG4gICAgICAgIHRyYXZlcnNlRmFzdChub2RlLCBlbnRlciwgb3B0cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYXZlcnNlRmFzdChzdWJOb2RlLCBlbnRlciwgb3B0cyk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ09NTUVOVF9LRVlTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5jb25zdCBDTEVBUl9LRVlTID0gW1xuICBcInRva2Vuc1wiLCAvLyBvbmx5IGV4aXN0IGluIHQuRmlsZVxuICBcInN0YXJ0XCIsXG4gIFwiZW5kXCIsXG4gIFwibG9jXCIsXG4gIC8vIEZpeG1lOiBzaG91bGQgYmUgZXh0cmEucmF3IC8gZXh0cmEucmF3VmFsdWU/XG4gIFwicmF3XCIsXG4gIFwicmF3VmFsdWVcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IENMRUFSX0tFWVNfUExVU19DT01NRU5UUyA9IFtcbiAgLi4uQ09NTUVOVF9LRVlTLFxuICBcImNvbW1lbnRzXCIsXG4gIC4uLkNMRUFSX0tFWVMsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPcHRpb25zID0geyBwcmVzZXJ2ZUNvbW1lbnRzPzogYm9vbGVhbiB9O1xuLyoqXG4gKiBSZW1vdmUgYWxsIG9mIHRoZSBfKiBwcm9wZXJ0aWVzIGZyb20gYSBub2RlIGFsb25nIHdpdGggdGhlIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAqIHByb3BlcnRpZXMgbGlrZSBsb2NhdGlvbiBkYXRhIGFuZCByYXcgdG9rZW4gZGF0YS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydGllcyhcbiAgbm9kZTogdC5Ob2RlLFxuICBvcHRzOiBPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3QgbWFwID0gb3B0cy5wcmVzZXJ2ZUNvbW1lbnRzID8gQ0xFQVJfS0VZUyA6IENMRUFSX0tFWVNfUExVU19DT01NRU5UUztcbiAgZm9yIChjb25zdCBrZXkgb2YgbWFwKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2tlbnMgb25seSBleGlzdCBpbiB0LkZpbGVcbiAgICBpZiAobm9kZVtrZXldICE9IG51bGwpIG5vZGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJpbmcgY2FuIG5vdCBpbmRleCBub2RlXG4gICAgaWYgKGtleVswXSA9PT0gXCJfXCIgJiYgbm9kZVtrZXldICE9IG51bGwpIG5vZGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHM6IEFycmF5PHN5bWJvbD4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG5vZGUpO1xuICBmb3IgKGNvbnN0IHN5bSBvZiBzeW1ib2xzKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZTogZG9jdW1lbnQgc3ltYm9sIHByb3BlcnRpZXNcbiAgICBub2RlW3N5bV0gPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHRyYXZlcnNlRmFzdCBmcm9tIFwiLi4vdHJhdmVyc2UvdHJhdmVyc2VGYXN0XCI7XG5pbXBvcnQgcmVtb3ZlUHJvcGVydGllcyBmcm9tIFwiLi9yZW1vdmVQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXNEZWVwPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICB0cmVlOiBULFxuICBvcHRzPzogeyBwcmVzZXJ2ZUNvbW1lbnRzOiBib29sZWFuIH0gfCBudWxsLFxuKTogVCB7XG4gIHRyYXZlcnNlRmFzdCh0cmVlLCByZW1vdmVQcm9wZXJ0aWVzLCBvcHRzKTtcblxuICByZXR1cm4gdHJlZTtcbn1cbiIsICJpbXBvcnQgeyBpc0lkZW50aWZpZXIsIGlzU3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5pbXBvcnQgcmVtb3ZlUHJvcGVydGllc0RlZXAgZnJvbSBcIi4uL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXBcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9LZXlBbGlhcyhcbiAgbm9kZTogdC5NZXRob2QgfCB0LlByb3BlcnR5LFxuICBrZXk6IHQuTm9kZSA9IG5vZGUua2V5LFxuKTogc3RyaW5nIHtcbiAgbGV0IGFsaWFzO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IG1heWJlIGFkZCBub2RlIHR5cGUgY2hlY2sgYmVmb3JlIGNoZWNraW5nIGAua2luZGBcbiAgaWYgKG5vZGUua2luZCA9PT0gXCJtZXRob2RcIikge1xuICAgIHJldHVybiB0b0tleUFsaWFzLmluY3JlbWVudCgpICsgXCJcIjtcbiAgfSBlbHNlIGlmIChpc0lkZW50aWZpZXIoa2V5KSkge1xuICAgIGFsaWFzID0ga2V5Lm5hbWU7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdMaXRlcmFsKGtleSkpIHtcbiAgICBhbGlhcyA9IEpTT04uc3RyaW5naWZ5KGtleS52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgYWxpYXMgPSBKU09OLnN0cmluZ2lmeShyZW1vdmVQcm9wZXJ0aWVzRGVlcChjbG9uZU5vZGUoa2V5KSkpO1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogbWF5YmUgYWRkIG5vZGUgdHlwZSBjaGVjayBiZWZvcmUgY2hlY2tpbmcgYC5jb21wdXRlZGBcbiAgaWYgKG5vZGUuY29tcHV0ZWQpIHtcbiAgICBhbGlhcyA9IGBbJHthbGlhc31dYDtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IG1heWJlIGFkZCBub2RlIHR5cGUgY2hlY2sgYmVmb3JlIGNoZWNraW5nIGAuc3RhdGljYFxuICBpZiAobm9kZS5zdGF0aWMpIHtcbiAgICBhbGlhcyA9IGBzdGF0aWM6JHthbGlhc31gO1xuICB9XG5cbiAgcmV0dXJuIGFsaWFzO1xufVxuXG50b0tleUFsaWFzLnVpZCA9IDA7XG5cbnRvS2V5QWxpYXMuaW5jcmVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodG9LZXlBbGlhcy51aWQgPj0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICByZXR1cm4gKHRvS2V5QWxpYXMudWlkID0gMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvS2V5QWxpYXMudWlkKys7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtcbiAgaXNFeHBvcnREZWNsYXJhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxuICBpc0RlY2xhcmF0aW9uLFxuICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25FeHByZXNzaW9uLFxuICBpc0V4cG9ydEFsbERlY2xhcmF0aW9uLFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IHsgZ2V0QmluZGluZ0lkZW50aWZpZXJzIGFzIGRlZmF1bHQgfTtcblxuZnVuY3Rpb24gZ2V0QmluZGluZ0lkZW50aWZpZXJzKFxuICBub2RlOiB0Lk5vZGUsXG4gIGR1cGxpY2F0ZXM6IHRydWUsXG4gIG91dGVyT25seT86IGJvb2xlYW4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcblxuZnVuY3Rpb24gZ2V0QmluZGluZ0lkZW50aWZpZXJzKFxuICBub2RlOiB0Lk5vZGUsXG4gIGR1cGxpY2F0ZXM/OiBmYWxzZSxcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj47XG5cbmZ1bmN0aW9uIGdldEJpbmRpbmdJZGVudGlmaWVycyhcbiAgbm9kZTogdC5Ob2RlLFxuICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcblxuLyoqXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGJpbmRpbmcgaWRlbnRpZmllcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBgbm9kZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdJZGVudGlmaWVycyhcbiAgbm9kZTogdC5Ob2RlLFxuICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PiB7XG4gIGNvbnN0IHNlYXJjaDogdC5Ob2RlW10gPSBbXS5jb25jYXQobm9kZSk7XG4gIGNvbnN0IGlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgd2hpbGUgKHNlYXJjaC5sZW5ndGgpIHtcbiAgICBjb25zdCBpZCA9IHNlYXJjaC5zaGlmdCgpO1xuICAgIGlmICghaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5cyA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGdldEJpbmRpbmdJZGVudGlmaWVycy5rZXlzIGRvIG5vdCBjb3ZlciBhbGwgQVNUIHR5cGVzXG4gICAgICBnZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5c1tpZC50eXBlXTtcblxuICAgIGlmIChpc0lkZW50aWZpZXIoaWQpKSB7XG4gICAgICBpZiAoZHVwbGljYXRlcykge1xuICAgICAgICBjb25zdCBfaWRzID0gKGlkc1tpZC5uYW1lXSA9IGlkc1tpZC5uYW1lXSB8fCBbXSk7XG4gICAgICAgIF9pZHMucHVzaChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZHNbaWQubmFtZV0gPSBpZDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc0V4cG9ydERlY2xhcmF0aW9uKGlkKSAmJiAhaXNFeHBvcnRBbGxEZWNsYXJhdGlvbihpZCkpIHtcbiAgICAgIGlmIChpc0RlY2xhcmF0aW9uKGlkLmRlY2xhcmF0aW9uKSkge1xuICAgICAgICBzZWFyY2gucHVzaChpZC5kZWNsYXJhdGlvbik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3V0ZXJPbmx5KSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGlkKSkge1xuICAgICAgICBzZWFyY2gucHVzaChpZC5pZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24oaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXlzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiBpZFxuICAgICAgICAgIGlkW2tleV0gYXMgdC5Ob2RlW10gfCB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgICAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgICBBcnJheS5pc0FycmF5KG5vZGVzKSA/IHNlYXJjaC5wdXNoKC4uLm5vZGVzKSA6IHNlYXJjaC5wdXNoKG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vICRGbG93SXNzdWUgT2JqZWN0LmNyZWF0ZSgpIHNlZW1zIGJyb2tlblxuICByZXR1cm4gaWRzO1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgdHlwZXMgdG8gdGhlaXIgaWRlbnRpZmllciBrZXlzLlxuICovXG5nZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5cyA9IHtcbiAgRGVjbGFyZUNsYXNzOiBbXCJpZFwiXSxcbiAgRGVjbGFyZUZ1bmN0aW9uOiBbXCJpZFwiXSxcbiAgRGVjbGFyZU1vZHVsZTogW1wiaWRcIl0sXG4gIERlY2xhcmVWYXJpYWJsZTogW1wiaWRcIl0sXG4gIERlY2xhcmVJbnRlcmZhY2U6IFtcImlkXCJdLFxuICBEZWNsYXJlVHlwZUFsaWFzOiBbXCJpZFwiXSxcbiAgRGVjbGFyZU9wYXF1ZVR5cGU6IFtcImlkXCJdLFxuICBJbnRlcmZhY2VEZWNsYXJhdGlvbjogW1wiaWRcIl0sXG4gIFR5cGVBbGlhczogW1wiaWRcIl0sXG4gIE9wYXF1ZVR5cGU6IFtcImlkXCJdLFxuXG4gIENhdGNoQ2xhdXNlOiBbXCJwYXJhbVwiXSxcbiAgTGFiZWxlZFN0YXRlbWVudDogW1wibGFiZWxcIl0sXG4gIFVuYXJ5RXhwcmVzc2lvbjogW1wiYXJndW1lbnRcIl0sXG4gIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBbXCJsZWZ0XCJdLFxuXG4gIEltcG9ydFNwZWNpZmllcjogW1wibG9jYWxcIl0sXG4gIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogW1wibG9jYWxcIl0sXG4gIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IFtcImxvY2FsXCJdLFxuICBJbXBvcnREZWNsYXJhdGlvbjogW1wic3BlY2lmaWVyc1wiXSxcblxuICBFeHBvcnRTcGVjaWZpZXI6IFtcImV4cG9ydGVkXCJdLFxuICBFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IFtcImV4cG9ydGVkXCJdLFxuICBFeHBvcnREZWZhdWx0U3BlY2lmaWVyOiBbXCJleHBvcnRlZFwiXSxcblxuICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBbXCJpZFwiLCBcInBhcmFtc1wiXSxcbiAgRnVuY3Rpb25FeHByZXNzaW9uOiBbXCJpZFwiLCBcInBhcmFtc1wiXSxcbiAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFtcInBhcmFtc1wiXSxcbiAgT2JqZWN0TWV0aG9kOiBbXCJwYXJhbXNcIl0sXG4gIENsYXNzTWV0aG9kOiBbXCJwYXJhbXNcIl0sXG4gIENsYXNzUHJpdmF0ZU1ldGhvZDogW1wicGFyYW1zXCJdLFxuXG4gIEZvckluU3RhdGVtZW50OiBbXCJsZWZ0XCJdLFxuICBGb3JPZlN0YXRlbWVudDogW1wibGVmdFwiXSxcblxuICBDbGFzc0RlY2xhcmF0aW9uOiBbXCJpZFwiXSxcbiAgQ2xhc3NFeHByZXNzaW9uOiBbXCJpZFwiXSxcblxuICBSZXN0RWxlbWVudDogW1wiYXJndW1lbnRcIl0sXG4gIFVwZGF0ZUV4cHJlc3Npb246IFtcImFyZ3VtZW50XCJdLFxuXG4gIE9iamVjdFByb3BlcnR5OiBbXCJ2YWx1ZVwiXSxcblxuICBBc3NpZ25tZW50UGF0dGVybjogW1wibGVmdFwiXSxcbiAgQXJyYXlQYXR0ZXJuOiBbXCJlbGVtZW50c1wiXSxcbiAgT2JqZWN0UGF0dGVybjogW1wicHJvcGVydGllc1wiXSxcblxuICBWYXJpYWJsZURlY2xhcmF0aW9uOiBbXCJkZWNsYXJhdGlvbnNcIl0sXG4gIFZhcmlhYmxlRGVjbGFyYXRvcjogW1wiaWRcIl0sXG59O1xuIiwgImltcG9ydCBnZXRCaW5kaW5nSWRlbnRpZmllcnMgZnJvbSBcIi4uL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzXCI7XG5pbXBvcnQge1xuICBpc0V4cHJlc3Npb24sXG4gIGlzRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgaXNWYXJpYWJsZURlY2xhcmF0aW9uLFxuICBpc0lmU3RhdGVtZW50LFxuICBpc0Jsb2NrU3RhdGVtZW50LFxuICBpc0VtcHR5U3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIHNlcXVlbmNlRXhwcmVzc2lvbixcbiAgYXNzaWdubWVudEV4cHJlc3Npb24sXG4gIGNvbmRpdGlvbmFsRXhwcmVzc2lvbixcbn0gZnJvbSBcIi4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IFNjb3BlIH0gZnJvbSBcIkBiYWJlbC90cmF2ZXJzZVwiO1xuXG5leHBvcnQgdHlwZSBEZWNsYXJhdGlvbkluZm8gPSB7XG4gIGtpbmQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbltcImtpbmRcIl07XG4gIGlkOiB0LklkZW50aWZpZXI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKFxuICBub2RlczogUmVhZG9ubHlBcnJheTx0Lk5vZGU+LFxuICBzY29wZTogU2NvcGUsXG4gIGRlY2xhcnM6IEFycmF5PERlY2xhcmF0aW9uSW5mbz4sXG4pIHtcbiAgY29uc3QgZXhwcnM6IHQuRXhwcmVzc2lvbltdID0gW107XG4gIGxldCBlbnN1cmVMYXN0VW5kZWZpbmVkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgZW1wdHlTdGF0ZW1lbnQgYmVmb3JlIGEgbm9uLWVtcHR5U3RhdGVtZW50XG4gICAgLy8gd2Ugd2FudCB0byBkaXNyZWdhcmQgdGhhdFxuICAgIGlmICghaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgICAgZW5zdXJlTGFzdFVuZGVmaW5lZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgIGV4cHJzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgIGV4cHJzLnB1c2gobm9kZS5leHByZXNzaW9uKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUua2luZCAhPT0gXCJ2YXJcIikgcmV0dXJuOyAvLyBiYWlsZWRcblxuICAgICAgZm9yIChjb25zdCBkZWNsYXIgb2Ygbm9kZS5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBnZXRCaW5kaW5nSWRlbnRpZmllcnMoZGVjbGFyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYmluZGluZ3MpKSB7XG4gICAgICAgICAgZGVjbGFycy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6IG5vZGUua2luZCxcbiAgICAgICAgICAgIGlkOiBjbG9uZU5vZGUoYmluZGluZ3Nba2V5XSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVjbGFyLmluaXQpIHtcbiAgICAgICAgICBleHBycy5wdXNoKGFzc2lnbm1lbnRFeHByZXNzaW9uKFwiPVwiLCBkZWNsYXIuaWQsIGRlY2xhci5pbml0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5zdXJlTGFzdFVuZGVmaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChpc0lmU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBjb25zZXF1ZW50ID0gbm9kZS5jb25zZXF1ZW50XG4gICAgICAgID8gZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucyhbbm9kZS5jb25zZXF1ZW50XSwgc2NvcGUsIGRlY2xhcnMpXG4gICAgICAgIDogc2NvcGUuYnVpbGRVbmRlZmluZWROb2RlKCk7XG4gICAgICBjb25zdCBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZVxuICAgICAgICA/IGdhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnMoW25vZGUuYWx0ZXJuYXRlXSwgc2NvcGUsIGRlY2xhcnMpXG4gICAgICAgIDogc2NvcGUuYnVpbGRVbmRlZmluZWROb2RlKCk7XG4gICAgICBpZiAoIWNvbnNlcXVlbnQgfHwgIWFsdGVybmF0ZSkgcmV0dXJuOyAvLyBiYWlsZWRcblxuICAgICAgZXhwcnMucHVzaChjb25kaXRpb25hbEV4cHJlc3Npb24obm9kZS50ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvY2tTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKG5vZGUuYm9keSwgc2NvcGUsIGRlY2xhcnMpO1xuICAgICAgaWYgKCFib2R5KSByZXR1cm47IC8vIGJhaWxlZFxuXG4gICAgICBleHBycy5wdXNoKGJvZHkpO1xuICAgIH0gZWxzZSBpZiAoaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgICAgLy8gZW1wdHkgc3RhdGVtZW50IHNvIGVuc3VyZSB0aGUgbGFzdCBpdGVtIGlzIHVuZGVmaW5lZCBpZiB3ZSdyZSBsYXN0XG4gICAgICAvLyBjaGVja3MgaWYgZW1wdHlTdGF0ZW1lbnQgaXMgZmlyc3RcbiAgICAgIGlmIChub2Rlcy5pbmRleE9mKG5vZGUpID09PSAwKSB7XG4gICAgICAgIGVuc3VyZUxhc3RVbmRlZmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBiYWlsZWQsIHdlIGNhbid0IHR1cm4gdGhpcyBzdGF0ZW1lbnQgaW50byBhbiBleHByZXNzaW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuc3VyZUxhc3RVbmRlZmluZWQpIHtcbiAgICBleHBycy5wdXNoKHNjb3BlLmJ1aWxkVW5kZWZpbmVkTm9kZSgpKTtcbiAgfVxuXG4gIGlmIChleHBycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZXhwcnNbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlRXhwcmVzc2lvbihleHBycyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucyBmcm9tIFwiLi9nYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IERlY2xhcmF0aW9uSW5mbyB9IGZyb20gXCIuL2dhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnNcIjtcblxuLyoqXG4gKiBUdXJuIGFuIGFycmF5IG9mIHN0YXRlbWVudCBgbm9kZXNgIGludG8gYSBgU2VxdWVuY2VFeHByZXNzaW9uYC5cbiAqXG4gKiBWYXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIHR1cm5lZCBpbnRvIHNpbXBsZSBhc3NpZ25tZW50cyBhbmQgdGhlaXJcbiAqIGRlY2xhcmF0aW9ucyBob2lzdGVkIHRvIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgc2NvcGUuXG4gKlxuICogRXhwcmVzc2lvbiBzdGF0ZW1lbnRzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvU2VxdWVuY2VFeHByZXNzaW9uKFxuICBub2RlczogUmVhZG9ubHlBcnJheTx0Lk5vZGU+LFxuICBzY29wZTogYW55LFxuKTogdC5TZXF1ZW5jZUV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGVzPy5sZW5ndGgpIHJldHVybjtcblxuICBjb25zdCBkZWNsYXJzOiBEZWNsYXJhdGlvbkluZm9bXSA9IFtdO1xuICBjb25zdCByZXN1bHQgPSBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKG5vZGVzLCBzY29wZSwgZGVjbGFycyk7XG4gIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBkZWNsYXIgb2YgZGVjbGFycykge1xuICAgIHNjb3BlLnB1c2goZGVjbGFyKTtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4bWU6IGdhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnMgd2lsbCByZXR1cm4gYW4gRXhwcmVzc2lvbiB3aGVuIHRoZXJlIGFyZSBvbmx5IG9uZSBlbGVtZW50XG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNTdGF0ZW1lbnQsXG4gIGlzRnVuY3Rpb24sXG4gIGlzQ2xhc3MsXG4gIGlzQXNzaWdubWVudEV4cHJlc3Npb24sXG59IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZXhwcmVzc2lvblN0YXRlbWVudCB9IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdG9TdGF0ZW1lbnQgYXMge1xuICAobm9kZTogdC5Bc3NpZ25tZW50RXhwcmVzc2lvbiwgaWdub3JlPzogYm9vbGVhbik6IHQuRXhwcmVzc2lvblN0YXRlbWVudDtcblxuICA8VCBleHRlbmRzIHQuU3RhdGVtZW50Pihub2RlOiBULCBpZ25vcmU6IGZhbHNlKTogVDtcbiAgPFQgZXh0ZW5kcyB0LlN0YXRlbWVudD4obm9kZTogVCwgaWdub3JlPzogYm9vbGVhbik6IFQgfCBmYWxzZTtcblxuICAobm9kZTogdC5DbGFzcywgaWdub3JlOiBmYWxzZSk6IHQuQ2xhc3NEZWNsYXJhdGlvbjtcbiAgKG5vZGU6IHQuQ2xhc3MsIGlnbm9yZT86IGJvb2xlYW4pOiB0LkNsYXNzRGVjbGFyYXRpb24gfCBmYWxzZTtcblxuICAobm9kZTogdC5GdW5jdGlvbiwgaWdub3JlOiBmYWxzZSk6IHQuRnVuY3Rpb25EZWNsYXJhdGlvbjtcbiAgKG5vZGU6IHQuRnVuY3Rpb24sIGlnbm9yZT86IGJvb2xlYW4pOiB0LkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBmYWxzZTtcblxuICAobm9kZTogdC5Ob2RlLCBpZ25vcmU6IGZhbHNlKTogdC5TdGF0ZW1lbnQ7XG4gIChub2RlOiB0Lk5vZGUsIGlnbm9yZT86IGJvb2xlYW4pOiB0LlN0YXRlbWVudCB8IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gdG9TdGF0ZW1lbnQobm9kZTogdC5Ob2RlLCBpZ25vcmU/OiBib29sZWFuKTogdC5TdGF0ZW1lbnQgfCBmYWxzZSB7XG4gIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgbGV0IG11c3RIYXZlSWQgPSBmYWxzZTtcbiAgbGV0IG5ld1R5cGU7XG5cbiAgaWYgKGlzQ2xhc3Mobm9kZSkpIHtcbiAgICBtdXN0SGF2ZUlkID0gdHJ1ZTtcbiAgICBuZXdUeXBlID0gXCJDbGFzc0RlY2xhcmF0aW9uXCIgYXMgY29uc3Q7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihub2RlKSkge1xuICAgIG11c3RIYXZlSWQgPSB0cnVlO1xuICAgIG5ld1R5cGUgPSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiBhcyBjb25zdDtcbiAgfSBlbHNlIGlmIChpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpOiBub2RlLmlkIG1pZ2h0IGJlIG1pc3NpbmdcbiAgaWYgKG11c3RIYXZlSWQgJiYgIW5vZGUuaWQpIHtcbiAgICBuZXdUeXBlID0gZmFsc2UgYXMgZmFsc2U7XG4gIH1cblxuICBpZiAoIW5ld1R5cGUpIHtcbiAgICBpZiAoaWdub3JlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IHR1cm4gJHtub2RlLnR5cGV9IHRvIGEgc3RhdGVtZW50YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBtYW5pcHVsYXRpbmcgbm9kZS50eXBlXG4gIG5vZGUudHlwZSA9IG5ld1R5cGU7XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKSByZWZhY3RvciB0byBhdm9pZCB0eXBlIHVuc2FmZSBtdXRhdGlvbnMgbGlrZSByZWFzc2lnbmluZyBub2RlIHR5cGUgYWJvdmVcbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiaW1wb3J0IGlzVmFsaWRJZGVudGlmaWVyIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzVmFsaWRJZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICBpZGVudGlmaWVyLFxuICBib29sZWFuTGl0ZXJhbCxcbiAgbnVsbExpdGVyYWwsXG4gIHN0cmluZ0xpdGVyYWwsXG4gIG51bWVyaWNMaXRlcmFsLFxuICByZWdFeHBMaXRlcmFsLFxuICBhcnJheUV4cHJlc3Npb24sXG4gIG9iamVjdFByb3BlcnR5LFxuICBvYmplY3RFeHByZXNzaW9uLFxuICB1bmFyeUV4cHJlc3Npb24sXG4gIGJpbmFyeUV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdmFsdWVUb05vZGUgYXMge1xuICAodmFsdWU6IHVuZGVmaW5lZCk6IHQuSWRlbnRpZmllcjsgLy8gVE9ETzogVGhpcyBzaG91bGQgcmV0dXJuIFwidm9pZCAwXCJcbiAgKHZhbHVlOiBib29sZWFuKTogdC5Cb29sZWFuTGl0ZXJhbDtcbiAgKHZhbHVlOiBudWxsKTogdC5OdWxsTGl0ZXJhbDtcbiAgKHZhbHVlOiBzdHJpbmcpOiB0LlN0cmluZ0xpdGVyYWw7XG4gIC8vIEluZmluaXRpZXMgYW5kIE5hTiBuZWVkIHRvIHVzZSBhIEJpbmFyeUV4cHJlc3Npb247IG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHdyYXBwZWQgaW4gVW5hcnlFeHByZXNzaW9uXG4gICh2YWx1ZTogbnVtYmVyKTogdC5OdW1lcmljTGl0ZXJhbCB8IHQuQmluYXJ5RXhwcmVzc2lvbiB8IHQuVW5hcnlFeHByZXNzaW9uO1xuICAodmFsdWU6IFJlZ0V4cCk6IHQuUmVnRXhwTGl0ZXJhbDtcbiAgKHZhbHVlOiBSZWFkb25seUFycmF5PHVua25vd24+KTogdC5BcnJheUV4cHJlc3Npb247XG5cbiAgLy8gdGhpcyB0aHJvd3Mgd2l0aCBvYmplY3RzIHRoYXQgYXJlIG5vdCBwbGFpbiBvYmplY3RzLFxuICAvLyBvciBpZiB0aGVyZSBhcmUgbm9uLXZhbHVlVG9Ob2RlLWFibGUgdmFsdWVzXG4gICh2YWx1ZTogb2JqZWN0KTogdC5PYmplY3RFeHByZXNzaW9uO1xuXG4gICh2YWx1ZTogdW5rbm93bik6IHQuRXhwcmVzc2lvbjtcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3I6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgbXVzdCByZXR1cm4gYSBzdHJpbmdcbmNvbnN0IG9iamVjdFRvU3RyaW5nOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyA9IEZ1bmN0aW9uLmNhbGwuYmluZChcbiAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbik7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVnRXhwIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgLy8gT2JqZWN0LnByb3RvdHlwZSdzIF9fcHJvdG9fXyBpcyBudWxsLiBFdmVyeSBvdGhlciBjbGFzcydzIF9fcHJvdG9fXy5fX3Byb3RvX18gaXNcbiAgLy8gbm90IG51bGwgYnkgZGVmYXVsdC4gV2UgY2Fubm90IGNoZWNrIGlmIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIGJlY2F1c2UgaXRcbiAgLy8gY291bGQgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0uXG4gIHJldHVybiBwcm90byA9PT0gbnVsbCB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVRvTm9kZSh2YWx1ZTogdW5rbm93bik6IHQuRXhwcmVzc2lvbiB7XG4gIC8vIHVuZGVmaW5lZFxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBpZGVudGlmaWVyKFwidW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgLy8gYm9vbGVhblxuICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJvb2xlYW5MaXRlcmFsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIG51bGxcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxMaXRlcmFsKCk7XG4gIH1cblxuICAvLyBzdHJpbmdzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBudW1iZXJzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSBudW1lcmljTGl0ZXJhbChNYXRoLmFicyh2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbnVtZXJhdG9yO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgLy8gTmFOXG4gICAgICAgIG51bWVyYXRvciA9IG51bWVyaWNMaXRlcmFsKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5maW5pdHkgLyAtSW5maW5pdHlcbiAgICAgICAgbnVtZXJhdG9yID0gbnVtZXJpY0xpdGVyYWwoMSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGJpbmFyeUV4cHJlc3Npb24oXCIvXCIsIG51bWVyYXRvciwgbnVtZXJpY0xpdGVyYWwoMCkpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA8IDAgfHwgT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICAgIHJlc3VsdCA9IHVuYXJ5RXhwcmVzc2lvbihcIi1cIiwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gcmVnZXhlc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IHZhbHVlLnNvdXJjZTtcbiAgICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL1xcLyhbYS16XSt8KSQvKVsxXTtcbiAgICByZXR1cm4gcmVnRXhwTGl0ZXJhbChwYXR0ZXJuLCBmbGFncyk7XG4gIH1cblxuICAvLyBhcnJheVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYXJyYXlFeHByZXNzaW9uKHZhbHVlLm1hcCh2YWx1ZVRvTm9kZSkpO1xuICB9XG5cbiAgLy8gb2JqZWN0XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGNvbnN0IHByb3BzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBsZXQgbm9kZUtleTtcbiAgICAgIGlmIChpc1ZhbGlkSWRlbnRpZmllcihrZXkpKSB7XG4gICAgICAgIG5vZGVLZXkgPSBpZGVudGlmaWVyKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlS2V5ID0gc3RyaW5nTGl0ZXJhbChrZXkpO1xuICAgICAgfVxuICAgICAgcHJvcHMucHVzaChcbiAgICAgICAgb2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgbm9kZUtleSxcbiAgICAgICAgICB2YWx1ZVRvTm9kZShcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiB2YWx1ZVxuICAgICAgICAgICAgdmFsdWVba2V5XSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdEV4cHJlc3Npb24ocHJvcHMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiZG9uJ3Qga25vdyBob3cgdG8gdHVybiB0aGlzIHZhbHVlIGludG8gYSBub2RlXCIpO1xufVxuIiwgImltcG9ydCB7IG1lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYnVpbGRlcnMvZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQXBwZW5kIGEgbm9kZSB0byBhIG1lbWJlciBleHByZXNzaW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcHBlbmRUb01lbWJlckV4cHJlc3Npb24oXG4gIG1lbWJlcjogdC5NZW1iZXJFeHByZXNzaW9uLFxuICBhcHBlbmQ6IHQuTWVtYmVyRXhwcmVzc2lvbltcInByb3BlcnR5XCJdLFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5NZW1iZXJFeHByZXNzaW9uIHtcbiAgbWVtYmVyLm9iamVjdCA9IG1lbWJlckV4cHJlc3Npb24oXG4gICAgbWVtYmVyLm9iamVjdCxcbiAgICBtZW1iZXIucHJvcGVydHksXG4gICAgbWVtYmVyLmNvbXB1dGVkLFxuICApO1xuICBtZW1iZXIucHJvcGVydHkgPSBhcHBlbmQ7XG4gIG1lbWJlci5jb21wdXRlZCA9ICEhY29tcHV0ZWQ7XG5cbiAgcmV0dXJuIG1lbWJlcjtcbn1cbiIsICJpbXBvcnQgeyBJTkhFUklUX0tFWVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgaW5oZXJpdHNDb21tZW50cyBmcm9tIFwiLi4vY29tbWVudHMvaW5oZXJpdHNDb21tZW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEluaGVyaXQgYWxsIGNvbnRleHR1YWwgcHJvcGVydGllcyBmcm9tIGBwYXJlbnRgIG5vZGUgdG8gYGNoaWxkYCBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0czxUIGV4dGVuZHMgdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gIGNoaWxkOiBULFxuICBwYXJlbnQ6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBUIHtcbiAgaWYgKCFjaGlsZCB8fCAhcGFyZW50KSByZXR1cm4gY2hpbGQ7XG5cbiAgLy8gb3B0aW9uYWxseSBpbmhlcml0IHNwZWNpZmljIHByb3BlcnRpZXMgaWYgbm90IG51bGxcbiAgZm9yIChjb25zdCBrZXkgb2YgSU5IRVJJVF9LRVlTLm9wdGlvbmFsKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZTogcmVmaW5lIHBhcmVudCB0eXBlc1xuICAgIGlmIChjaGlsZFtrZXldID09IG51bGwpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICAgIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3JjZSBpbmhlcml0IFwicHJpdmF0ZVwiIHByb3BlcnRpZXNcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyZW50KSkge1xuICAgIGlmIChrZXlbMF0gPT09IFwiX1wiICYmIGtleSAhPT0gXCJfX2Nsb25lXCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICAgIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3JjZSBpbmhlcml0IHNlbGVjdCBwcm9wZXJ0aWVzXG4gIGZvciAoY29uc3Qga2V5IG9mIElOSEVSSVRfS0VZUy5mb3JjZSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gIH1cblxuICBpbmhlcml0c0NvbW1lbnRzKGNoaWxkLCBwYXJlbnQpO1xuXG4gIHJldHVybiBjaGlsZDtcbn1cbiIsICJpbXBvcnQgeyBtZW1iZXJFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgaXNTdXBlciB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIFByZXBlbmQgYSBub2RlIHRvIGEgbWVtYmVyIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByZXBlbmRUb01lbWJlckV4cHJlc3Npb248XG4gIFQgZXh0ZW5kcyBQaWNrPHQuTWVtYmVyRXhwcmVzc2lvbiwgXCJvYmplY3RcIiB8IFwicHJvcGVydHlcIj4sXG4+KG1lbWJlcjogVCwgcHJlcGVuZDogdC5NZW1iZXJFeHByZXNzaW9uW1wib2JqZWN0XCJdKTogVCB7XG4gIGlmIChpc1N1cGVyKG1lbWJlci5vYmplY3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJDYW5ub3QgcHJlcGVuZCBub2RlIHRvIHN1cGVyIHByb3BlcnR5IGFjY2VzcyAoYHN1cGVyLmZvb2ApLlwiLFxuICAgICk7XG4gIH1cbiAgbWVtYmVyLm9iamVjdCA9IG1lbWJlckV4cHJlc3Npb24ocHJlcGVuZCwgbWVtYmVyLm9iamVjdCk7XG5cbiAgcmV0dXJuIG1lbWJlcjtcbn1cbiIsICJpbXBvcnQgZ2V0QmluZGluZ0lkZW50aWZpZXJzIGZyb20gXCIuL2dldEJpbmRpbmdJZGVudGlmaWVyc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBnZXRPdXRlckJpbmRpbmdJZGVudGlmaWVycyBhcyB7XG4gIChub2RlOiB0Lk5vZGUsIGR1cGxpY2F0ZXM6IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcbiAgKG5vZGU6IHQuTm9kZSwgZHVwbGljYXRlcz86IGZhbHNlKTogUmVjb3JkPHN0cmluZywgdC5JZGVudGlmaWVyPjtcbiAgKFxuICAgIG5vZGU6IHQuTm9kZSxcbiAgICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgKTogUmVjb3JkPHN0cmluZywgdC5JZGVudGlmaWVyPiB8IFJlY29yZDxzdHJpbmcsIEFycmF5PHQuSWRlbnRpZmllcj4+O1xufTtcblxuZnVuY3Rpb24gZ2V0T3V0ZXJCaW5kaW5nSWRlbnRpZmllcnMoXG4gIG5vZGU6IHQuTm9kZSxcbiAgZHVwbGljYXRlczogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PiB7XG4gIHJldHVybiBnZXRCaW5kaW5nSWRlbnRpZmllcnMobm9kZSwgZHVwbGljYXRlcywgdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCB0eXBlIFRyYXZlcnNhbEFuY2VzdG9ycyA9IEFycmF5PHtcbiAgbm9kZTogdC5Ob2RlO1xuICBrZXk6IHN0cmluZztcbiAgaW5kZXg/OiBudW1iZXI7XG59PjtcblxuZXhwb3J0IHR5cGUgVHJhdmVyc2FsSGFuZGxlcjxUPiA9IChcbiAgdGhpczogdW5kZWZpbmVkLFxuICBub2RlOiB0Lk5vZGUsXG4gIHBhcmVudDogVHJhdmVyc2FsQW5jZXN0b3JzLFxuICBzdGF0ZTogVCxcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVHJhdmVyc2FsSGFuZGxlcnM8VD4gPSB7XG4gIGVudGVyPzogVHJhdmVyc2FsSGFuZGxlcjxUPjtcbiAgZXhpdD86IFRyYXZlcnNhbEhhbmRsZXI8VD47XG59O1xuXG4vKipcbiAqIEEgZ2VuZXJhbCBBU1QgdHJhdmVyc2FsIHdpdGggYm90aCBwcmVmaXggYW5kIHBvc3RmaXggaGFuZGxlcnMsIGFuZCBhXG4gKiBzdGF0ZSBvYmplY3QuIEV4cG9zZXMgYW5jZXN0cnkgZGF0YSB0byBlYWNoIGhhbmRsZXIgc28gdGhhdCBtb3JlIGNvbXBsZXhcbiAqIEFTVCBkYXRhIGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYXZlcnNlPFQ+KFxuICBub2RlOiB0Lk5vZGUsXG4gIGhhbmRsZXJzOiBUcmF2ZXJzYWxIYW5kbGVyPFQ+IHwgVHJhdmVyc2FsSGFuZGxlcnM8VD4sXG4gIHN0YXRlPzogVCxcbik6IHZvaWQge1xuICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBoYW5kbGVycyA9IHsgZW50ZXI6IGhhbmRsZXJzIH07XG4gIH1cblxuICBjb25zdCB7IGVudGVyLCBleGl0IH0gPSBoYW5kbGVycztcblxuICB0cmF2ZXJzZVNpbXBsZUltcGwobm9kZSwgZW50ZXIsIGV4aXQsIHN0YXRlLCBbXSk7XG59XG5cbmZ1bmN0aW9uIHRyYXZlcnNlU2ltcGxlSW1wbDxUPihcbiAgbm9kZTogYW55LFxuICBlbnRlcjogRnVuY3Rpb24gfCB1bmRlZmluZWQsXG4gIGV4aXQ6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkLFxuICBzdGF0ZTogVCB8IHVuZGVmaW5lZCxcbiAgYW5jZXN0b3JzOiBUcmF2ZXJzYWxBbmNlc3RvcnMsXG4pIHtcbiAgY29uc3Qga2V5cyA9IFZJU0lUT1JfS0VZU1tub2RlLnR5cGVdO1xuICBpZiAoIWtleXMpIHJldHVybjtcblxuICBpZiAoZW50ZXIpIGVudGVyKG5vZGUsIGFuY2VzdG9ycywgc3RhdGUpO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBzdWJOb2RlID0gbm9kZVtrZXldO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViTm9kZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHN1Yk5vZGVbaV07XG4gICAgICAgIGlmICghY2hpbGQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhdmVyc2VTaW1wbGVJbXBsKGNoaWxkLCBlbnRlciwgZXhpdCwgc3RhdGUsIGFuY2VzdG9ycyk7XG5cbiAgICAgICAgYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3ViTm9kZSkge1xuICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICBub2RlLFxuICAgICAgICBrZXksXG4gICAgICB9KTtcblxuICAgICAgdHJhdmVyc2VTaW1wbGVJbXBsKHN1Yk5vZGUsIGVudGVyLCBleGl0LCBzdGF0ZSwgYW5jZXN0b3JzKTtcblxuICAgICAgYW5jZXN0b3JzLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0KSBleGl0KG5vZGUsIGFuY2VzdG9ycywgc3RhdGUpO1xufVxuIiwgImltcG9ydCBnZXRCaW5kaW5nSWRlbnRpZmllcnMgZnJvbSBcIi4uL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYSBiaW5kaW5nIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQmluZGluZyhcbiAgbm9kZTogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbiAgZ3JhbmRwYXJlbnQ/OiB0Lk5vZGUsXG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgIGdyYW5kcGFyZW50ICYmXG4gICAgbm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgIHBhcmVudC50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIgJiZcbiAgICBncmFuZHBhcmVudC50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIlxuICApIHtcbiAgICAvLyBXZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGlzLCBiZWNhdXNlIGdldEJpbmRpbmdJZGVudGlmaWVyc1xuICAgIC8vIGhhcyBhbiBPYmplY3RQcm9wZXJ0eS0+dmFsdWUgZW50cnkgZm9yIGRlc3RydWN0dXJpbmcgcGF0dGVybnMuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBnZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5cyBkb2VzIG5vdCBjb3ZlciBhbGwgQVNUIHR5cGVzXG4gICAgZ2V0QmluZGluZ0lkZW50aWZpZXJzLmtleXNbcGFyZW50LnR5cGVdO1xuICBpZiAoa2V5cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHZhbCA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiBwYXJlbnRcbiAgICAgICAgcGFyZW50W2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGlmICh2YWwuaW5kZXhPZihub2RlKSA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWwgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgeyBpc1ZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IEJMT0NLX1NDT1BFRF9TWU1CT0wgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBub2RlYCBpcyBhIGBsZXRgIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xldChub2RlOiB0Lk5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiZcbiAgICAobm9kZS5raW5kICE9PSBcInZhclwiIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBkb2N1bWVudCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICAgIG5vZGVbQkxPQ0tfU0NPUEVEX1NZTUJPTF0pXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgaXNDbGFzc0RlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24gfSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCBpc0xldCBmcm9tIFwiLi9pc0xldFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYmxvY2sgc2NvcGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Jsb2NrU2NvcGVkKG5vZGU6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSB8fCBpc0xldChub2RlKTtcbn1cbiIsICJpbXBvcnQgaXNUeXBlIGZyb20gXCIuL2lzVHlwZVwiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBub2RlYCBpcyBkZWZpbml0ZWx5IGltbXV0YWJsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJbW11dGFibGUobm9kZTogdC5Ob2RlKTogYm9vbGVhbiB7XG4gIGlmIChpc1R5cGUobm9kZS50eXBlLCBcIkltbXV0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGlzSWRlbnRpZmllcihub2RlKSkge1xuICAgIGlmIChub2RlLm5hbWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIGltbXV0YWJsZSFcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBpZGVhLi4uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IE5PREVfRklFTERTLCBWSVNJVE9SX0tFWVMgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gbm9kZXMgYXJlIGVxdWl2YWxlbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOb2Rlc0VxdWl2YWxlbnQ8VCBleHRlbmRzIFBhcnRpYWw8dC5Ob2RlPj4oXG4gIGE6IFQsXG4gIGI6IGFueSxcbik6IGIgaXMgVCB7XG4gIGlmIChcbiAgICB0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8XG4gICAgYSA9PSBudWxsIHx8XG4gICAgYiA9PSBudWxsXG4gICkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG5cbiAgaWYgKGEudHlwZSAhPT0gYi50eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoTk9ERV9GSUVMRFNbYS50eXBlXSB8fCBhLnR5cGUpO1xuICBjb25zdCB2aXNpdG9yS2V5cyA9IFZJU0lUT1JfS0VZU1thLnR5cGVdO1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsX2EgPVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWVsZCBtdXN0IHByZXNlbnQgaW4gYVxuICAgICAgYVtmaWVsZF07XG4gICAgY29uc3QgdmFsX2IgPSBiW2ZpZWxkXTtcbiAgICBpZiAodHlwZW9mIHZhbF9hICE9PSB0eXBlb2YgdmFsX2IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbF9hID09IG51bGwgJiYgdmFsX2IgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh2YWxfYSA9PSBudWxsIHx8IHZhbF9iID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWxfYSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWxfYikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbF9hLmxlbmd0aCAhPT0gdmFsX2IubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxfYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzTm9kZXNFcXVpdmFsZW50KHZhbF9hW2ldLCB2YWxfYltpXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsX2EgPT09IFwib2JqZWN0XCIgJiYgIXZpc2l0b3JLZXlzPy5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbF9hKSkge1xuICAgICAgICBpZiAodmFsX2Fba2V5XSAhPT0gdmFsX2Jba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc05vZGVzRXF1aXZhbGVudCh2YWxfYSwgdmFsX2IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYSByZWZlcmVuY2UgdG8gYSBib3VuZCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNSZWZlcmVuY2VkKFxuICBub2RlOiB0Lk5vZGUsXG4gIHBhcmVudDogdC5Ob2RlLFxuICBncmFuZHBhcmVudD86IHQuTm9kZSxcbik6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgLy8geWVzOiBQQVJFTlRbTk9ERV1cbiAgICAvLyB5ZXM6IE5PREUuY2hpbGRcbiAgICAvLyBubzogcGFyZW50Lk5PREVcbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGlmIChwYXJlbnQucHJvcGVydHkgPT09IG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEhcGFyZW50LmNvbXB1dGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG5cbiAgICBjYXNlIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgLy8gbm86IGxldCBOT0RFID0gaW5pdDtcbiAgICAvLyB5ZXM6IGxldCBpZCA9IE5PREU7XG4gICAgY2FzZSBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5pbml0ID09PSBub2RlO1xuXG4gICAgLy8geWVzOiAoKSA9PiBOT0RFXG4gICAgLy8gbm86IChOT0RFKSA9PiB7fVxuICAgIGNhc2UgXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5ib2R5ID09PSBub2RlO1xuXG4gICAgLy8gbm86IGNsYXNzIHsgI05PREU7IH1cbiAgICAvLyBubzogY2xhc3MgeyBnZXQgI05PREUoKSB7fSB9XG4gICAgLy8gbm86IGNsYXNzIHsgI05PREUoKSB7fSB9XG4gICAgLy8gbm86IGNsYXNzIHsgZm4oKSB7IHJldHVybiB0aGlzLiNOT0RFOyB9IH1cbiAgICBjYXNlIFwiUHJpdmF0ZU5hbWVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBjbGFzcyB7IE5PREUoKSB7fSB9XG4gICAgLy8geWVzOiBjbGFzcyB7IFtOT0RFXSgpIHt9IH1cbiAgICAvLyBubzogY2xhc3MgeyBmb28oTk9ERSkge30gfVxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgICBpZiAocGFyZW50LmtleSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gISFwYXJlbnQuY29tcHV0ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyB5ZXM6IHsgW05PREVdOiBcIlwiIH1cbiAgICAvLyBubzogeyBOT0RFOiBcIlwiIH1cbiAgICAvLyBkZXBlbmRzOiB7IE5PREUgfVxuICAgIC8vIGRlcGVuZHM6IHsga2V5OiBOT0RFIH1cbiAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgIGlmIChwYXJlbnQua2V5ID09PSBub2RlKSB7XG4gICAgICAgIHJldHVybiAhIXBhcmVudC5jb21wdXRlZDtcbiAgICAgIH1cbiAgICAgIC8vIHBhcmVudC52YWx1ZSA9PT0gbm9kZVxuICAgICAgcmV0dXJuICFncmFuZHBhcmVudCB8fCBncmFuZHBhcmVudC50eXBlICE9PSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAvLyBubzogY2xhc3MgeyBOT0RFID0gdmFsdWU7IH1cbiAgICAvLyB5ZXM6IGNsYXNzIHsgW05PREVdID0gdmFsdWU7IH1cbiAgICAvLyB5ZXM6IGNsYXNzIHsga2V5ID0gTk9ERTsgfVxuICAgIGNhc2UgXCJDbGFzc1Byb3BlcnR5XCI6XG4gICAgY2FzZSBcIkNsYXNzQWNjZXNzb3JQcm9wZXJ0eVwiOlxuICAgICAgaWYgKHBhcmVudC5rZXkgPT09IG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEhcGFyZW50LmNvbXB1dGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCI6XG4gICAgICByZXR1cm4gcGFyZW50LmtleSAhPT0gbm9kZTtcblxuICAgIC8vIG5vOiBjbGFzcyBOT0RFIHt9XG4gICAgLy8geWVzOiBjbGFzcyBGb28gZXh0ZW5kcyBOT0RFIHt9XG4gICAgY2FzZSBcIkNsYXNzRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NFeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnN1cGVyQ2xhc3MgPT09IG5vZGU7XG5cbiAgICAvLyB5ZXM6IGxlZnQgPSBOT0RFO1xuICAgIC8vIG5vOiBOT0RFID0gcmlnaHQ7XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnJpZ2h0ID09PSBub2RlO1xuXG4gICAgLy8gbm86IFtOT0RFID0gZm9vXSA9IFtdO1xuICAgIC8vIHllczogW2ZvbyA9IE5PREVdID0gW107XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnJpZ2h0ID09PSBub2RlO1xuXG4gICAgLy8gbm86IE5PREU6IGZvciAoOzspIHt9XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiB0cnkge30gY2F0Y2ggKE5PREUpIHt9XG4gICAgY2FzZSBcIkNhdGNoQ2xhdXNlXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogZnVuY3Rpb24gZm9vKC4uLk5PREUpIHt9XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ29udGludWVTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBmdW5jdGlvbiBOT0RFKCkge31cbiAgICAvLyBubzogZnVuY3Rpb24gZm9vKE5PREUpIHt9XG4gICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogZXhwb3J0IE5PREUgZnJvbSBcImZvb1wiO1xuICAgIC8vIG5vOiBleHBvcnQgKiBhcyBOT0RFIGZyb20gXCJmb29cIjtcbiAgICBjYXNlIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBleHBvcnQgeyBmb28gYXMgTk9ERSB9O1xuICAgIC8vIHllczogZXhwb3J0IHsgTk9ERSBhcyBmb28gfTtcbiAgICAvLyBubzogZXhwb3J0IHsgTk9ERSBhcyBmb28gfSBmcm9tIFwiZm9vXCI7XG4gICAgY2FzZSBcIkV4cG9ydFNwZWNpZmllclwiOlxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogUHJvcGVydHkgJ3NvdXJjZScgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQW55VHlwZUFubm90YXRpb24nLlxuICAgICAgaWYgKGdyYW5kcGFyZW50Py5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudC5sb2NhbCA9PT0gbm9kZTtcblxuICAgIC8vIG5vOiBpbXBvcnQgTk9ERSBmcm9tIFwiZm9vXCI7XG4gICAgLy8gbm86IGltcG9ydCAqIGFzIE5PREUgZnJvbSBcImZvb1wiO1xuICAgIC8vIG5vOiBpbXBvcnQgeyBOT0RFIGFzIGZvbyB9IGZyb20gXCJmb29cIjtcbiAgICAvLyBubzogaW1wb3J0IHsgZm9vIGFzIE5PREUgfSBmcm9tIFwiZm9vXCI7XG4gICAgLy8gbm86IGltcG9ydCBOT0RFIGZyb20gXCJiYXJcIjtcbiAgICBjYXNlIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiSW1wb3J0U3BlY2lmaWVyXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogaW1wb3J0IFwiZm9vXCIgYXNzZXJ0IHsgTk9ERTogXCJqc29uXCIgfVxuICAgIGNhc2UgXCJJbXBvcnRBdHRyaWJ1dGVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiA8ZGl2IE5PREU9XCJmb29cIiAvPlxuICAgIGNhc2UgXCJKU1hBdHRyaWJ1dGVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBbTk9ERV0gPSBbXTtcbiAgICAvLyBubzogKHsgTk9ERSB9KSA9IFtdO1xuICAgIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gbm86IG5ldy5OT0RFXG4gICAgLy8gbm86IE5PREUudGFyZ2V0XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8geWVzOiB0eXBlIFggPSB7IHNvbWVQcm9wZXJ0eTogTk9ERSB9XG4gICAgLy8gbm86IHR5cGUgWCA9IHsgTk9ERTogT3RoZXJUeXBlIH1cbiAgICBjYXNlIFwiT2JqZWN0VHlwZVByb3BlcnR5XCI6XG4gICAgICByZXR1cm4gcGFyZW50LmtleSAhPT0gbm9kZTtcblxuICAgIC8vIHllczogZW51bSBYIHsgRm9vID0gTk9ERSB9XG4gICAgLy8gbm86IGVudW0gWCB7IE5PREUgfVxuICAgIGNhc2UgXCJUU0VudW1NZW1iZXJcIjpcbiAgICAgIHJldHVybiBwYXJlbnQuaWQgIT09IG5vZGU7XG5cbiAgICAvLyB5ZXM6IHsgW05PREVdOiB2YWx1ZSB9XG4gICAgLy8gbm86IHsgTk9ERTogdmFsdWUgfVxuICAgIGNhc2UgXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCI6XG4gICAgICBpZiAocGFyZW50LmtleSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gISFwYXJlbnQuY29tcHV0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNDYXRjaENsYXVzZSxcbiAgaXNCbG9ja1N0YXRlbWVudCxcbiAgaXNTY29wYWJsZSxcbiAgaXNQYXR0ZXJuLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW5wdXQgYG5vZGVgIGlzIGEgc2NvcGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2NvcGUobm9kZTogdC5Ob2RlLCBwYXJlbnQ6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICAvLyBJZiBhIEJsb2NrU3RhdGVtZW50IGlzIGFuIGltbWVkaWF0ZSBkZXNjZW5kZW50IG9mIGEgRnVuY3Rpb24vQ2F0Y2hDbGF1c2UsIGl0IG11c3QgYmUgaW4gdGhlIGJvZHkuXG4gIC8vIEhlbmNlIHdlIHNraXBwZWQgdGhlIHBhcmVudEtleSA9PT0gXCJwYXJhbXNcIiBjaGVja1xuICBpZiAoaXNCbG9ja1N0YXRlbWVudChub2RlKSAmJiAoaXNGdW5jdGlvbihwYXJlbnQpIHx8IGlzQ2F0Y2hDbGF1c2UocGFyZW50KSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBhIFBhdHRlcm4gaXMgYW4gaW1tZWRpYXRlIGRlc2NlbmRlbnQgb2YgYSBGdW5jdGlvbi9DYXRjaENsYXVzZSwgaXQgbXVzdCBiZSBpbiB0aGUgcGFyYW1zLlxuICAvLyBIZW5jZSB3ZSBza2lwcGVkIHRoZSBwYXJlbnRLZXkgPT09IFwicGFyYW1zXCIgY2hlY2tcbiAgaWYgKGlzUGF0dGVybihub2RlKSAmJiAoaXNGdW5jdGlvbihwYXJlbnQpIHx8IGlzQ2F0Y2hDbGF1c2UocGFyZW50KSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBpc1Njb3BhYmxlKG5vZGUpO1xufVxuIiwgImltcG9ydCB7IGlzSWRlbnRpZmllciwgaXNJbXBvcnREZWZhdWx0U3BlY2lmaWVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBzcGVjaWZpZXJgIGlzIGEgYGRlZmF1bHRgIGltcG9ydCBvciBleHBvcnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU3BlY2lmaWVyRGVmYXVsdChcbiAgc3BlY2lmaWVyOiB0Lk1vZHVsZVNwZWNpZmllcixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzSW1wb3J0RGVmYXVsdFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogc3RyaWN0ZXIgdHlwZSBmb3Igc3BlY2lmaWVyXG4gICAgaXNJZGVudGlmaWVyKHNwZWNpZmllci5pbXBvcnRlZCB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgIH0pXG4gICk7XG59XG4iLCAiaW1wb3J0IGlzVmFsaWRJZGVudGlmaWVyIGZyb20gXCIuL2lzVmFsaWRJZGVudGlmaWVyXCI7XG5cbmNvbnN0IFJFU0VSVkVEX1dPUkRTX0VTM19PTkxZOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcImFic3RyYWN0XCIsXG4gIFwiYm9vbGVhblwiLFxuICBcImJ5dGVcIixcbiAgXCJjaGFyXCIsXG4gIFwiZG91YmxlXCIsXG4gIFwiZW51bVwiLFxuICBcImZpbmFsXCIsXG4gIFwiZmxvYXRcIixcbiAgXCJnb3RvXCIsXG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImludFwiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxvbmdcIixcbiAgXCJuYXRpdmVcIixcbiAgXCJwYWNrYWdlXCIsXG4gIFwicHJpdmF0ZVwiLFxuICBcInByb3RlY3RlZFwiLFxuICBcInB1YmxpY1wiLFxuICBcInNob3J0XCIsXG4gIFwic3RhdGljXCIsXG4gIFwic3luY2hyb25pemVkXCIsXG4gIFwidGhyb3dzXCIsXG4gIFwidHJhbnNpZW50XCIsXG4gIFwidm9sYXRpbGVcIixcbl0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbmFtZWAgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBFUzMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBBZGRpdGlvbmFsIEVTMyByZXNlcnZlZCB3b3JkcyBhcmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZEVTM0lkZW50aWZpZXIobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkSWRlbnRpZmllcihuYW1lKSAmJiAhUkVTRVJWRURfV09SRFNfRVMzX09OTFkuaGFzKG5hbWUpO1xufVxuIiwgImltcG9ydCB7IGlzVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gXCIuL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgQkxPQ0tfU0NPUEVEX1NZTUJPTCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW5wdXQgYG5vZGVgIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFyKG5vZGU6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCB7IGtpbmQ6IFwidmFyXCIgfSkgJiZcbiAgICAhKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkb2N1bWVudCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICAgIG5vZGVbQkxPQ0tfU0NPUEVEX1NZTUJPTF1cbiAgICApXG4gICk7XG59XG4iLCAiaW1wb3J0IGlzUmVhY3RDb21wb25lbnQgZnJvbSBcIi4vdmFsaWRhdG9ycy9yZWFjdC9pc1JlYWN0Q29tcG9uZW50XCI7XG5pbXBvcnQgaXNDb21wYXRUYWcgZnJvbSBcIi4vdmFsaWRhdG9ycy9yZWFjdC9pc0NvbXBhdFRhZ1wiO1xuaW1wb3J0IGJ1aWxkQ2hpbGRyZW4gZnJvbSBcIi4vYnVpbGRlcnMvcmVhY3QvYnVpbGRDaGlsZHJlblwiO1xuXG4vLyBhc3NlcnRzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFzc2VydE5vZGUgfSBmcm9tIFwiLi9hc3NlcnRzL2Fzc2VydE5vZGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Fzc2VydHMvZ2VuZXJhdGVkXCI7XG5cbi8vIGJ1aWxkZXJzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZVR5cGVBbm5vdGF0aW9uQmFzZWRPblR5cGVvZiB9IGZyb20gXCIuL2J1aWxkZXJzL2Zsb3cvY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mXCI7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUZsb3dVbmlvblR5cGUgaW5zdGVhZCAqL1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjcmVhdGVVbmlvblR5cGVBbm5vdGF0aW9uIH0gZnJvbSBcIi4vYnVpbGRlcnMvZmxvdy9jcmVhdGVGbG93VW5pb25UeXBlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZUZsb3dVbmlvblR5cGUgfSBmcm9tIFwiLi9idWlsZGVycy9mbG93L2NyZWF0ZUZsb3dVbmlvblR5cGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlVFNVbmlvblR5cGUgfSBmcm9tIFwiLi9idWlsZGVycy90eXBlc2NyaXB0L2NyZWF0ZVRTVW5pb25UeXBlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2J1aWxkZXJzL2dlbmVyYXRlZC91cHBlcmNhc2VcIjtcblxuLy8gY2xvbmVcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmVOb2RlIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmVEZWVwIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVEZWVwXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lRGVlcFdpdGhvdXRMb2MgfSBmcm9tIFwiLi9jbG9uZS9jbG9uZURlZXBXaXRob3V0TG9jXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lV2l0aG91dExvYyB9IGZyb20gXCIuL2Nsb25lL2Nsb25lV2l0aG91dExvY1wiO1xuXG4vLyBjb21tZW50c1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRDb21tZW50IH0gZnJvbSBcIi4vY29tbWVudHMvYWRkQ29tbWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2FkZENvbW1lbnRzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluaGVyaXRJbm5lckNvbW1lbnRzIH0gZnJvbSBcIi4vY29tbWVudHMvaW5oZXJpdElubmVyQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdExlYWRpbmdDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2luaGVyaXRMZWFkaW5nQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdHNDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2luaGVyaXRzQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMgfSBmcm9tIFwiLi9jb21tZW50cy9pbmhlcml0VHJhaWxpbmdDb21tZW50c1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmVDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL3JlbW92ZUNvbW1lbnRzXCI7XG5cbi8vIGNvbnN0YW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzL2dlbmVyYXRlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIGNvbnZlcnRlcnNcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW5zdXJlQmxvY2sgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL2Vuc3VyZUJsb2NrXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvQmluZGluZ0lkZW50aWZpZXJOYW1lIH0gZnJvbSBcIi4vY29udmVydGVycy90b0JpbmRpbmdJZGVudGlmaWVyTmFtZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0Jsb2NrIH0gZnJvbSBcIi4vY29udmVydGVycy90b0Jsb2NrXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvQ29tcHV0ZWRLZXkgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL3RvQ29tcHV0ZWRLZXlcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9FeHByZXNzaW9uIH0gZnJvbSBcIi4vY29udmVydGVycy90b0V4cHJlc3Npb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9JZGVudGlmaWVyIH0gZnJvbSBcIi4vY29udmVydGVycy90b0lkZW50aWZpZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9LZXlBbGlhcyB9IGZyb20gXCIuL2NvbnZlcnRlcnMvdG9LZXlBbGlhc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlcXVlbmNlRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvdG9TZXF1ZW5jZUV4cHJlc3Npb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TdGF0ZW1lbnQgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL3RvU3RhdGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlVG9Ob2RlIH0gZnJvbSBcIi4vY29udmVydGVycy92YWx1ZVRvTm9kZVwiO1xuXG4vLyBkZWZpbml0aW9uc1xuZXhwb3J0ICogZnJvbSBcIi4vZGVmaW5pdGlvbnNcIjtcblxuLy8gbW9kaWZpY2F0aW9uc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmRUb01lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi9tb2RpZmljYXRpb25zL2FwcGVuZFRvTWVtYmVyRXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmhlcml0cyB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvaW5oZXJpdHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvbiB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvblwiO1xuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyByZW1vdmVQcm9wZXJ0aWVzLFxuICB0eXBlIE9wdGlvbnMgYXMgUmVtb3ZlUHJvcGVydGllc09wdGlvbnMsXG59IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmVQcm9wZXJ0aWVzRGVlcCB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXBcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlVHlwZUR1cGxpY2F0ZXMgfSBmcm9tIFwiLi9tb2RpZmljYXRpb25zL2Zsb3cvcmVtb3ZlVHlwZUR1cGxpY2F0ZXNcIjtcblxuLy8gcmV0cmlldmVyc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRCaW5kaW5nSWRlbnRpZmllcnMgfSBmcm9tIFwiLi9yZXRyaWV2ZXJzL2dldEJpbmRpbmdJZGVudGlmaWVyc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRPdXRlckJpbmRpbmdJZGVudGlmaWVycyB9IGZyb20gXCIuL3JldHJpZXZlcnMvZ2V0T3V0ZXJCaW5kaW5nSWRlbnRpZmllcnNcIjtcblxuLy8gdHJhdmVyc2VcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tIFwiLi90cmF2ZXJzZS90cmF2ZXJzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhdmVyc2UvdHJhdmVyc2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2VGYXN0IH0gZnJvbSBcIi4vdHJhdmVyc2UvdHJhdmVyc2VGYXN0XCI7XG5cbi8vIHV0aWxzXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNoYWxsb3dFcXVhbCB9IGZyb20gXCIuL3V0aWxzL3NoYWxsb3dFcXVhbFwiO1xuXG4vLyB2YWxpZGF0b3JzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0JpbmRpbmcgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzQmluZGluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jsb2NrU2NvcGVkIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc0Jsb2NrU2NvcGVkXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzSW1tdXRhYmxlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc0ltbXV0YWJsZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0xldCB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNMZXRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOb2RlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc05vZGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOb2Rlc0VxdWl2YWxlbnQgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzTm9kZXNFcXVpdmFsZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzUGxhY2Vob2xkZXJUeXBlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1BsYWNlaG9sZGVyVHlwZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1JlZmVyZW5jZWQgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzUmVmZXJlbmNlZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1Njb3BlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1Njb3BlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzU3BlY2lmaWVyRGVmYXVsdCB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNTcGVjaWZpZXJEZWZhdWx0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVHlwZSB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNUeXBlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVmFsaWRFUzNJZGVudGlmaWVyIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1ZhbGlkRVMzSWRlbnRpZmllclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkSWRlbnRpZmllciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNWYWxpZElkZW50aWZpZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYXIgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzVmFyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1hdGNoZXNQYXR0ZXJuIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9tYXRjaGVzUGF0dGVyblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWxpZGF0ZSB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYnVpbGRNYXRjaE1lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi92YWxpZGF0b3JzL2J1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuXG4vLyByZWFjdFxuZXhwb3J0IGNvbnN0IHJlYWN0ID0ge1xuICBpc1JlYWN0Q29tcG9uZW50LFxuICBpc0NvbXBhdFRhZyxcbiAgYnVpbGRDaGlsZHJlbixcbn07XG5cbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vYXN0LXR5cGVzL2dlbmVyYXRlZFwiO1xuXG4vLyB0aGlzIGlzIHVzZWQgYnkgQGJhYmVsL3RyYXZlcnNlIHRvIHdhcm4gYWJvdXQgZGVwcmVjYXRlZCB2aXNpdG9yc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBfX2ludGVybmFsX19kZXByZWNhdGlvbldhcm5pbmcgfSBmcm9tIFwiLi91dGlscy9kZXByZWNhdGlvbldhcm5pbmdcIjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBiaW5hcnlPcGVyYXRpb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQ7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICUgcmlnaHQ7XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICAgICAgY2FzZSAnKionOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAmIHJpZ2h0O1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IHwgcmlnaHQ7XG4gICAgICAgIGNhc2UgJz4+JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID4+IHJpZ2h0O1xuICAgICAgICBjYXNlICc+Pj4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj4+IHJpZ2h0O1xuICAgICAgICBjYXNlICc8PCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8PCByaWdodDtcbiAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCBeIHJpZ2h0O1xuICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDtcbiAgICAgICAgY2FzZSAnPT09JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAhPT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluIHJpZ2h0O1xuICAgICAgICBjYXNlICdpbnN0YW5jZW9mJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodDtcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgfVxufVxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBiaW5hcnlPcGVyYXRpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHBhcnNlcl8xID0gcmVxdWlyZShcIkBiYWJlbC9wYXJzZXJcIik7XG52YXIgYiA9IHJlcXVpcmUoXCJAYmFiZWwvdHlwZXNcIik7XG52YXIgYmluYXJ5T3BlcmF0aW9uXzEgPSByZXF1aXJlKFwiLi9iaW5hcnlPcGVyYXRpb25cIik7XG5mdW5jdGlvbiBleHByZXNzaW9uVG9Db25zdGFudChleHByZXNzaW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgY29uc3RhbnQgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIHRvQ29uc3RhbnQoZXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoYi5pc0FycmF5RXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdF8xID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24uZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGV4cHJlc3Npb24uZWxlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGIuaXNTcHJlYWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcHJlYWQgPSB0b0NvbnN0YW50KGVsZW1lbnQuYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShpc1NwcmVhZGFibGUoc3ByZWFkKSAmJiBjb25zdGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMS5wdXNoLmFwcGx5KHJlc3VsdF8xLCBzcHJlYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNFeHByZXNzaW9uKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdF8xLnB1c2godG9Db25zdGFudChlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRfMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYi5pc0JpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gdG9Db25zdGFudChleHByZXNzaW9uLmxlZnQpO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdG9Db25zdGFudChleHByZXNzaW9uLnJpZ2h0KTtcbiAgICAgICAgICAgIHJldHVybiBjb25zdGFudCAmJiBiaW5hcnlPcGVyYXRpb25fMVtcImRlZmF1bHRcIl0oZXhwcmVzc2lvbi5vcGVyYXRvciwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzQm9vbGVhbkxpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZyA9IGV4cHJlc3Npb24uYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChiLmlzU3ByZWFkRWxlbWVudChhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcHJlYWQgPSB0b0NvbnN0YW50KGFyZy5hcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGlzU3ByZWFkYWJsZShzcHJlYWQpICYmIGNvbnN0YW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBzcHJlYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNFeHByZXNzaW9uKGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRvQ29uc3RhbnQoYXJnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29uc3RhbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGIuaXNNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24uY2FsbGVlKSkge1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QgfHwgIWNvbnN0YW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1lbWJlciA9IGV4cHJlc3Npb24uY2FsbGVlLmNvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgID8gdG9Db25zdGFudChleHByZXNzaW9uLmNhbGxlZS5wcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAgICAgOiBiLmlzSWRlbnRpZmllcihleHByZXNzaW9uLmNhbGxlZS5wcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZXhwcmVzc2lvbi5jYWxsZWUucHJvcGVydHkubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlciA9PT0gdW5kZWZpbmVkICYmICFleHByZXNzaW9uLmNhbGxlZS5jb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGNhbkNhbGxNZXRob2Qob2JqZWN0LCAnJyArIG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZW1iZXJdLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiLmlzRXhwcmVzc2lvbihleHByZXNzaW9uLmNhbGxlZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY2FsbGVlID0gdG9Db25zdGFudChleHByZXNzaW9uLmNhbGxlZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdGFudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsZWUuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNDb25kaXRpb25hbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gdG9Db25zdGFudChleHByZXNzaW9uLnRlc3QpO1xuICAgICAgICAgICAgcmV0dXJuIHRlc3RcbiAgICAgICAgICAgICAgICA/IHRvQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zZXF1ZW50KVxuICAgICAgICAgICAgICAgIDogdG9Db25zdGFudChleHByZXNzaW9uLmFsdGVybmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb25zdGFudHMgJiZcbiAgICAgICAgICAgICAgICB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMuY29uc3RhbnRzLCBleHByZXNzaW9uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29uc3RhbnRzW2V4cHJlc3Npb24ubmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNMb2dpY2FsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24ubGVmdCk7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKGNvbnN0YW50ICYmIGV4cHJlc3Npb24ub3BlcmF0b3IgPT09ICcmJicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAmJiByaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25zdGFudCAmJiBleHByZXNzaW9uLm9wZXJhdG9yID09PSAnfHwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gdG9Db25zdGFudChleHByZXNzaW9uLm9iamVjdCk7XG4gICAgICAgICAgICBpZiAoIW9iamVjdCB8fCAhY29uc3RhbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtZW1iZXIgPSBleHByZXNzaW9uLmNvbXB1dGVkXG4gICAgICAgICAgICAgICAgPyB0b0NvbnN0YW50KGV4cHJlc3Npb24ucHJvcGVydHkpXG4gICAgICAgICAgICAgICAgOiBiLmlzSWRlbnRpZmllcihleHByZXNzaW9uLnByb3BlcnR5KVxuICAgICAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb24ucHJvcGVydHkubmFtZVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChtZW1iZXIgPT09IHVuZGVmaW5lZCAmJiAhZXhwcmVzc2lvbi5jb21wdXRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJycgKyBtZW1iZXIpICYmIG1lbWJlclswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZW1iZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzTnVsbExpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzTnVtZXJpY0xpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzT2JqZWN0RXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdF8yID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGV4cHJlc3Npb24ucHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYi5pc09iamVjdFByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwcm9wZXJ0eS5jb21wdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0b0NvbnN0YW50KHByb3BlcnR5LmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYi5pc0lkZW50aWZpZXIocHJvcGVydHkua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcGVydHkua2V5Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5LmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eS5rZXkudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5IHx8IGtleVswXSA9PT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uc3RhbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChiLmlzRXhwcmVzc2lvbihwcm9wZXJ0eS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRvQ29uc3RhbnQocHJvcGVydHkudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zdGFudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMltrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNPYmplY3RNZXRob2QocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNTcHJlYWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3VtZW50ID0gdG9Db25zdGFudChwcm9wZXJ0eS5hcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdF8yLCBhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdF8yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0NvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNSZWdFeHBMaXRlcmFsKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChleHByZXNzaW9uLnBhdHRlcm4sIGV4cHJlc3Npb24uZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoIC0gMSAmJiBjb25zdGFudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG9Db25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b0NvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbnNbZXhwcmVzc2lvbi5leHByZXNzaW9ucy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNTdHJpbmdMaXRlcmFsKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cbiAgICAgICAgaWYgKGIuaXNUZW1wbGF0ZUxpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRfMyA9ICcnO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLnF1YXNpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IGV4cHJlc3Npb24ucXVhc2lzW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdF8zICs9IHF1YXNpLnZhbHVlLmNvb2tlZDtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdF8zICs9ICcnICsgdG9Db25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb25zW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XzM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNVbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBhcmd1bWVudCA9IHRvQ29uc3RhbnQoZXhwcmVzc2lvbi5hcmd1bWVudCk7XG4gICAgICAgICAgICBpZiAoIWNvbnN0YW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiArYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnfic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB+YXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAndHlwZW9mJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudDtcbiAgICAgICAgICAgICAgICBjYXNlICd2b2lkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYXJndW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRvQ29uc3RhbnQoZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIGNvbnN0YW50ID8geyBjb25zdGFudDogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgfSA6IHsgY29uc3RhbnQ6IGZhbHNlIH07XG59XG5leHBvcnRzLmV4cHJlc3Npb25Ub0NvbnN0YW50ID0gZXhwcmVzc2lvblRvQ29uc3RhbnQ7XG5mdW5jdGlvbiBpc1NwcmVhZGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICAgICAgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgU2V0KSB8fFxuICAgICAgICAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBNYXApKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoYVtrZXldICE9PSBiW2tleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNhbkNhbGxNZXRob2Qob2JqZWN0LCBtZW1iZXIpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBvYmplY3QpIHtcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvU3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgc3dpdGNoIChtZW1iZXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0b0V4cG9uZW50aWFsJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b0ZpeGVkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b1ByZWNpc2lvbic6XG4gICAgICAgICAgICAgICAgY2FzZSAndG9TdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoYXJBdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hhckNvZGVBdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29kZVBvaW50QXQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbmNhdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5kc1dpdGgnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGVzJzpcbiAgICAgICAgICAgICAgICBjYXNlICdpbmRleE9mJzpcbiAgICAgICAgICAgICAgICBjYXNlICdsYXN0SW5kZXhPZic6XG4gICAgICAgICAgICAgICAgY2FzZSAnbWF0Y2gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ25vcm1hbGl6ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAncGFkRW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdwYWRTdGFydCc6XG4gICAgICAgICAgICAgICAgY2FzZSAncmVwZWF0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NsaWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzcGxpdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnRzV2l0aCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc3Vic3RyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJzdHJpbmcnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RvTG93ZXJDYXNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b1VwcGVyQ2FzZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAndHJpbSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZXN0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhlYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG1lbWJlcikgJiYgbWVtYmVyWzBdICE9PSAnXyc7XG4gICAgfVxufVxudmFyIEVNUFRZX09CSkVDVCA9IHt9O1xudmFyIGxhc3RTcmMgPSAnJztcbnZhciBsYXN0Q29uc3RhbnRzID0gRU1QVFlfT0JKRUNUO1xudmFyIGxhc3RPcHRpb25zID0gRU1QVFlfT0JKRUNUO1xudmFyIGxhc3RSZXN1bHQgPSBudWxsO1xudmFyIGxhc3RXYXNDb25zdGFudCA9IGZhbHNlO1xuZnVuY3Rpb24gaXNDb25zdGFudChzcmMsIGNvbnN0YW50cywgb3B0aW9ucykge1xuICAgIGlmIChjb25zdGFudHMgPT09IHZvaWQgMCkgeyBjb25zdGFudHMgPSBFTVBUWV9PQkpFQ1Q7IH1cbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSBFTVBUWV9PQkpFQ1Q7IH1cbiAgICBpZiAobGFzdFNyYyA9PT0gc3JjICYmXG4gICAgICAgIHNoYWxsb3dFcXVhbChsYXN0Q29uc3RhbnRzLCBjb25zdGFudHMpICYmXG4gICAgICAgIHNoYWxsb3dFcXVhbChsYXN0T3B0aW9ucywgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGxhc3RXYXNDb25zdGFudDtcbiAgICB9XG4gICAgbGFzdFNyYyA9IHNyYztcbiAgICBsYXN0Q29uc3RhbnRzID0gY29uc3RhbnRzO1xuICAgIHZhciBhc3Q7XG4gICAgdHJ5IHtcbiAgICAgICAgYXN0ID0gcGFyc2VyXzEucGFyc2VFeHByZXNzaW9uKHNyYywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNhdGNoIChleCkge1xuICAgICAgICByZXR1cm4gKGxhc3RXYXNDb25zdGFudCA9IGZhbHNlKTtcbiAgICB9XG4gICAgdmFyIF9hID0gZXhwcmVzc2lvblRvQ29uc3RhbnQoYXN0LCB7IGNvbnN0YW50czogY29uc3RhbnRzIH0pLCByZXN1bHQgPSBfYS5yZXN1bHQsIGNvbnN0YW50ID0gX2EuY29uc3RhbnQ7XG4gICAgbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgICByZXR1cm4gKGxhc3RXYXNDb25zdGFudCA9IGNvbnN0YW50KTtcbn1cbmV4cG9ydHMuaXNDb25zdGFudCA9IGlzQ29uc3RhbnQ7XG5mdW5jdGlvbiB0b0NvbnN0YW50KHNyYywgY29uc3RhbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKGNvbnN0YW50cyA9PT0gdm9pZCAwKSB7IGNvbnN0YW50cyA9IEVNUFRZX09CSkVDVDsgfVxuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IEVNUFRZX09CSkVDVDsgfVxuICAgIGlmICghaXNDb25zdGFudChzcmMsIGNvbnN0YW50cywgb3B0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHNyYykgKyAnIGlzIG5vdCBjb25zdGFudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG59XG5leHBvcnRzLnRvQ29uc3RhbnQgPSB0b0NvbnN0YW50O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBpc0NvbnN0YW50O1xubW9kdWxlLmV4cG9ydHMgPSBpc0NvbnN0YW50O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNDb25zdGFudDtcbm1vZHVsZS5leHBvcnRzLmV4cHJlc3Npb25Ub0NvbnN0YW50ID0gZXhwcmVzc2lvblRvQ29uc3RhbnQ7XG5tb2R1bGUuZXhwb3J0cy5pc0NvbnN0YW50ID0gaXNDb25zdGFudDtcbm1vZHVsZS5leHBvcnRzLnRvQ29uc3RhbnQgPSB0b0NvbnN0YW50O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGRpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykuZGlybmFtZTtcbnZhciBjb25zdGFudGlub3BsZSA9IHJlcXVpcmUoJ2NvbnN0YW50aW5vcGxlJyk7XG52YXIgd2FsayA9IHJlcXVpcmUoJ3B1Zy13YWxrJyk7XG52YXIgZXJyb3IgPSByZXF1aXJlKCdwdWctZXJyb3InKTtcbnZhciBydW5GaWx0ZXIgPSByZXF1aXJlKCcuL3J1bi1maWx0ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGVGaWx0ZXJzO1xuZnVuY3Rpb24gaGFuZGxlRmlsdGVycyhhc3QsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHdhbGsoXG4gICAgYXN0LFxuICAgIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBkaXIgPSBub2RlLmZpbGVuYW1lID8gZGlybmFtZShub2RlLmZpbGVuYW1lKSA6IG51bGw7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnRmlsdGVyJykge1xuICAgICAgICBoYW5kbGVOZXN0ZWRGaWx0ZXJzKG5vZGUsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpO1xuICAgICAgICB2YXIgdGV4dCA9IGdldEJvZHlBc1RleHQobm9kZSk7XG4gICAgICAgIHZhciBhdHRycyA9IGdldEF0dHJpYnV0ZXMobm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIGF0dHJzLmZpbGVuYW1lID0gbm9kZS5maWxlbmFtZTtcbiAgICAgICAgbm9kZS50eXBlID0gJ1RleHQnO1xuICAgICAgICBub2RlLnZhbCA9IGZpbHRlcldpdGhGYWxsYmFjayhub2RlLCB0ZXh0LCBhdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1Jhd0luY2x1ZGUnICYmIG5vZGUuZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZpcnN0RmlsdGVyID0gbm9kZS5maWx0ZXJzLnBvcCgpO1xuICAgICAgICB2YXIgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKGZpcnN0RmlsdGVyLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIGZpbGVuYW1lID0gKGF0dHJzLmZpbGVuYW1lID0gbm9kZS5maWxlLmZ1bGxQYXRoKTtcbiAgICAgICAgbm9kZS50eXBlID0gJ1RleHQnO1xuICAgICAgICBub2RlLnZhbCA9IGZpbHRlckZpbGVXaXRoRmFsbGJhY2soXG4gICAgICAgICAgZmlyc3RGaWx0ZXIsXG4gICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgbm9kZS5maWxlLFxuICAgICAgICAgIGF0dHJzXG4gICAgICAgICk7XG4gICAgICAgIG5vZGUuZmlsdGVyc1xuICAgICAgICAgIC5zbGljZSgpXG4gICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgdmFyIGF0dHJzID0gZ2V0QXR0cmlidXRlcyhmaWx0ZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYXR0cnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgIG5vZGUudmFsID0gZmlsdGVyV2l0aEZhbGxiYWNrKGZpbHRlciwgbm9kZS52YWwsIGF0dHJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgbm9kZS5maWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgICAgICBub2RlLmZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZpbHRlcldpdGhGYWxsYmFjayhmaWx0ZXIsIHRleHQsIGF0dHJzLCBmdW5jTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBmaWx0ZXJOYW1lID0gZ2V0RmlsdGVyTmFtZShmaWx0ZXIpO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnNbZmlsdGVyTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJzW2ZpbHRlck5hbWVdKHRleHQsIGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bkZpbHRlcihmaWx0ZXJOYW1lLCB0ZXh0LCBhdHRycywgZGlyLCBmdW5jTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGlmIChleC5jb2RlID09PSAnVU5LTk9XTl9GSUxURVInKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcihleC5jb2RlLCBleC5tZXNzYWdlLCBmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaWx0ZXJGaWxlV2l0aEZhbGxiYWNrKGZpbHRlciwgZmlsZW5hbWUsIGZpbGUsIGF0dHJzKSB7XG4gICAgICAgIHZhciBmaWx0ZXJOYW1lID0gZ2V0RmlsdGVyTmFtZShmaWx0ZXIpO1xuICAgICAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzW2ZpbHRlck5hbWVdKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcnNbZmlsdGVyTmFtZV0ucmVuZGVyQnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyc1tmaWx0ZXJOYW1lXS5yZW5kZXJCdWZmZXIoZmlsZS5yYXcsIGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcnNbZmlsdGVyTmFtZV0oZmlsZS5zdHIsIGF0dHJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcldpdGhGYWxsYmFjayhmaWx0ZXIsIGZpbGVuYW1lLCBhdHRycywgJ3JlbmRlckZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAge2luY2x1ZGVEZXBlbmRlbmNpZXM6IHRydWV9XG4gICk7XG4gIGZ1bmN0aW9uIGdldEZpbHRlck5hbWUoZmlsdGVyKSB7XG4gICAgdmFyIGZpbHRlck5hbWUgPSBmaWx0ZXIubmFtZTtcbiAgICBpZiAoZmlsdGVyQWxpYXNlcyAmJiBmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdKSB7XG4gICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyQWxpYXNlc1tmaWx0ZXJOYW1lXTtcbiAgICAgIGlmIChmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdKSB7XG4gICAgICAgIHRocm93IGVycm9yKFxuICAgICAgICAgICdGSUxURVJfQUxJU0VfQ0hBSU4nLFxuICAgICAgICAgICdUaGUgZmlsdGVyIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXIubmFtZSArXG4gICAgICAgICAgICAnXCIgaXMgYW4gYWxpYXMgZm9yIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXJOYW1lICtcbiAgICAgICAgICAgICdcIiwgd2hpY2ggaXMgYW4gYWxpYXMgZm9yIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdICtcbiAgICAgICAgICAgICdcIi4gIFB1ZyBkb2VzIG5vdCBzdXBwb3J0IGNoYWlucyBvZiBmaWx0ZXIgYWxpYXNlcy4nLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyTmFtZTtcbiAgfVxuICByZXR1cm4gYXN0O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVOZXN0ZWRGaWx0ZXJzKG5vZGUsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpIHtcbiAgaWYgKG5vZGUuYmxvY2subm9kZXNbMF0gJiYgbm9kZS5ibG9jay5ub2Rlc1swXS50eXBlID09PSAnRmlsdGVyJykge1xuICAgIG5vZGUuYmxvY2subm9kZXNbMF0gPSBoYW5kbGVGaWx0ZXJzKFxuICAgICAgbm9kZS5ibG9jayxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgZmlsdGVyQWxpYXNlc1xuICAgICkubm9kZXNbMF07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qm9keUFzVGV4dChub2RlKSB7XG4gIHJldHVybiBub2RlLmJsb2NrLm5vZGVzXG4gICAgLm1hcChmdW5jdGlvbihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWw7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMobm9kZSwgb3B0aW9ucykge1xuICB2YXIgYXR0cnMgPSB7fTtcbiAgbm9kZS5hdHRycy5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICB0cnkge1xuICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9XG4gICAgICAgIGF0dHIudmFsID09PSB0cnVlID8gdHJ1ZSA6IGNvbnN0YW50aW5vcGxlLnRvQ29uc3RhbnQoYXR0ci52YWwpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoL25vdCBjb25zdGFudC8udGVzdChleC5tZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBlcnJvcihcbiAgICAgICAgICAnRklMVEVSX09QVElPTl9OT1RfQ09OU1RBTlQnLFxuICAgICAgICAgIGV4Lm1lc3NhZ2UgK1xuICAgICAgICAgICAgJyBBbGwgZmlsdGVycyBhcmUgcmVuZGVyZWQgY29tcGlsZS10aW1lIHNvIGZpbHRlciBvcHRpb25zIG11c3QgYmUgY29uc3RhbnRzLicsXG4gICAgICAgICAgbm9kZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICB9KTtcbiAgdmFyIG9wdHMgPSBvcHRpb25zW25vZGUubmFtZV0gfHwge307XG4gIE9iamVjdC5rZXlzKG9wdHMpLmZvckVhY2goZnVuY3Rpb24ob3B0KSB7XG4gICAgaWYgKCFhdHRycy5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7XG4gICAgICBhdHRyc1tvcHRdID0gb3B0c1tvcHRdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMucnVuRmlsdGVyID0gcmVxdWlyZSgnLi9saWIvcnVuLWZpbHRlcicpO1xuZXhwb3J0cy5oYW5kbGVGaWx0ZXJzID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlLWZpbHRlcnMnKTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciB3YWxrID0gcmVxdWlyZSgncHVnLXdhbGsnKTtcblxuZnVuY3Rpb24gZXJyb3IoKSB7XG4gIHRocm93IHJlcXVpcmUoJ3B1Zy1lcnJvcicpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGluaztcbmZ1bmN0aW9uIGxpbmsoYXN0KSB7XG4gIGFzc2VydChcbiAgICBhc3QudHlwZSA9PT0gJ0Jsb2NrJyxcbiAgICAnVGhlIHRvcCBsZXZlbCBlbGVtZW50IHNob3VsZCBhbHdheXMgYmUgYSBibG9jaydcbiAgKTtcbiAgdmFyIGV4dGVuZHNOb2RlID0gbnVsbDtcbiAgaWYgKGFzdC5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgaGFzRXh0ZW5kcyA9IGFzdC5ub2Rlc1swXS50eXBlID09PSAnRXh0ZW5kcyc7XG4gICAgY2hlY2tFeHRlbmRQb3NpdGlvbihhc3QsIGhhc0V4dGVuZHMpO1xuICAgIGlmIChoYXNFeHRlbmRzKSB7XG4gICAgICBleHRlbmRzTm9kZSA9IGFzdC5ub2Rlcy5zaGlmdCgpO1xuICAgIH1cbiAgfVxuICBhc3QgPSBhcHBseUluY2x1ZGVzKGFzdCk7XG4gIGFzdC5kZWNsYXJlZEJsb2NrcyA9IGZpbmREZWNsYXJlZEJsb2Nrcyhhc3QpO1xuICBpZiAoZXh0ZW5kc05vZGUpIHtcbiAgICB2YXIgbWl4aW5zID0gW107XG4gICAgdmFyIGV4cGVjdGVkQmxvY2tzID0gW107XG4gICAgYXN0Lm5vZGVzLmZvckVhY2goZnVuY3Rpb24gYWRkTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnTmFtZWRCbG9jaycpIHtcbiAgICAgICAgZXhwZWN0ZWRCbG9ja3MucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgIG5vZGUubm9kZXMuZm9yRWFjaChhZGROb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnTWl4aW4nICYmIG5vZGUuY2FsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWl4aW5zLnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICAnVU5FWFBFQ1RFRF9OT0RFU19JTl9FWFRFTkRJTkdfUk9PVCcsXG4gICAgICAgICAgJ09ubHkgbmFtZWQgYmxvY2tzIGFuZCBtaXhpbnMgY2FuIGFwcGVhciBhdCB0aGUgdG9wIGxldmVsIG9mIGFuIGV4dGVuZGluZyB0ZW1wbGF0ZScsXG4gICAgICAgICAgbm9kZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBwYXJlbnQgPSBsaW5rKGV4dGVuZHNOb2RlLmZpbGUuYXN0KTtcbiAgICBleHRlbmQocGFyZW50LmRlY2xhcmVkQmxvY2tzLCBhc3QpO1xuICAgIHZhciBmb3VuZEJsb2NrTmFtZXMgPSBbXTtcbiAgICB3YWxrKHBhcmVudCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snKSB7XG4gICAgICAgIGZvdW5kQmxvY2tOYW1lcy5wdXNoKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZXhwZWN0ZWRCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihleHBlY3RlZEJsb2NrKSB7XG4gICAgICBpZiAoZm91bmRCbG9ja05hbWVzLmluZGV4T2YoZXhwZWN0ZWRCbG9jay5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ1VORVhQRUNURURfQkxPQ0snLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGJsb2NrICcgKyBleHBlY3RlZEJsb2NrLm5hbWUsXG4gICAgICAgICAgZXhwZWN0ZWRCbG9ja1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5rZXlzKGFzdC5kZWNsYXJlZEJsb2NrcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICBwYXJlbnQuZGVjbGFyZWRCbG9ja3NbbmFtZV0gPSBhc3QuZGVjbGFyZWRCbG9ja3NbbmFtZV07XG4gICAgfSk7XG4gICAgcGFyZW50Lm5vZGVzID0gbWl4aW5zLmNvbmNhdChwYXJlbnQubm9kZXMpO1xuICAgIHBhcmVudC5oYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG4gIHJldHVybiBhc3Q7XG59XG5cbmZ1bmN0aW9uIGZpbmREZWNsYXJlZEJsb2Nrcyhhc3QpIC8qOiB7W25hbWU6IHN0cmluZ106IEFycmF5PEJsb2NrTm9kZT59Ki8ge1xuICB2YXIgZGVmaW5pdGlvbnMgPSB7fTtcbiAgd2Fsayhhc3QsIGZ1bmN0aW9uIGJlZm9yZShub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snICYmIG5vZGUubW9kZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICBkZWZpbml0aW9uc1tub2RlLm5hbWVdID0gZGVmaW5pdGlvbnNbbm9kZS5uYW1lXSB8fCBbXTtcbiAgICAgIGRlZmluaXRpb25zW25vZGUubmFtZV0ucHVzaChub2RlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZGVmaW5pdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5QYXJlbnRCbG9ja3MocGFyZW50QmxvY2tzLCBhY2N1bXVsYXRvcikge1xuICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yIHx8IFtdO1xuICBwYXJlbnRCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihwYXJlbnRCbG9jaykge1xuICAgIGlmIChwYXJlbnRCbG9jay5wYXJlbnRzKSB7XG4gICAgICBmbGF0dGVuUGFyZW50QmxvY2tzKHBhcmVudEJsb2NrLnBhcmVudHMsIGFjY3VtdWxhdG9yKTtcbiAgICB9XG4gICAgYWNjdW11bGF0b3IucHVzaChwYXJlbnRCbG9jayk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChwYXJlbnRCbG9ja3MsIGFzdCkge1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgd2FsayhcbiAgICBhc3QsXG4gICAgZnVuY3Rpb24gYmVmb3JlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdOYW1lZEJsb2NrJykge1xuICAgICAgICBpZiAoc3RhY2tbbm9kZS5uYW1lXSA9PT0gbm9kZS5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIChub2RlLmlnbm9yZSA9IHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrW25vZGUubmFtZV0gPSBub2RlLm5hbWU7XG4gICAgICAgIHZhciBwYXJlbnRCbG9ja0xpc3QgPSBwYXJlbnRCbG9ja3Nbbm9kZS5uYW1lXVxuICAgICAgICAgID8gZmxhdHRlblBhcmVudEJsb2NrcyhwYXJlbnRCbG9ja3Nbbm9kZS5uYW1lXSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgICBpZiAocGFyZW50QmxvY2tMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUucGFyZW50cyA9IHBhcmVudEJsb2NrTGlzdDtcbiAgICAgICAgICBwYXJlbnRCbG9ja0xpc3QuZm9yRWFjaChmdW5jdGlvbihwYXJlbnRCbG9jaykge1xuICAgICAgICAgICAgc3dpdGNoIChub2RlLm1vZGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5ub2RlcyA9IHBhcmVudEJsb2NrLm5vZGVzLmNvbmNhdChub2RlLm5vZGVzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgcGFyZW50QmxvY2subm9kZXMgPSBub2RlLm5vZGVzLmNvbmNhdChwYXJlbnRCbG9jay5ub2Rlcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOlxuICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLm5vZGVzID0gbm9kZS5ub2RlcztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZnVuY3Rpb24gYWZ0ZXIobm9kZSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snICYmICFub2RlLmlnbm9yZSkge1xuICAgICAgICBkZWxldGUgc3RhY2tbbm9kZS5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5SW5jbHVkZXMoYXN0LCBjaGlsZCkge1xuICByZXR1cm4gd2FsayhcbiAgICBhc3QsXG4gICAgZnVuY3Rpb24gYmVmb3JlKG5vZGUsIHJlcGxhY2UpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdSYXdJbmNsdWRlJykge1xuICAgICAgICByZXBsYWNlKHt0eXBlOiAnVGV4dCcsIHZhbDogbm9kZS5maWxlLnN0ci5yZXBsYWNlKC9cXHIvZywgJycpfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmdW5jdGlvbiBhZnRlcihub2RlLCByZXBsYWNlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnSW5jbHVkZScpIHtcbiAgICAgICAgdmFyIGNoaWxkQVNUID0gbGluayhub2RlLmZpbGUuYXN0KTtcbiAgICAgICAgaWYgKGNoaWxkQVNULmhhc0V4dGVuZHMpIHtcbiAgICAgICAgICBjaGlsZEFTVCA9IHJlbW92ZUJsb2NrcyhjaGlsZEFTVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZShhcHBseVlpZWxkKGNoaWxkQVNULCBub2RlLmJsb2NrKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuZnVuY3Rpb24gcmVtb3ZlQmxvY2tzKGFzdCkge1xuICByZXR1cm4gd2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUsIHJlcGxhY2UpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnTmFtZWRCbG9jaycpIHtcbiAgICAgIHJlcGxhY2Uoe1xuICAgICAgICB0eXBlOiAnQmxvY2snLFxuICAgICAgICBub2Rlczogbm9kZS5ub2RlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5WWllbGQoYXN0LCBibG9jaykge1xuICBpZiAoIWJsb2NrIHx8ICFibG9jay5ub2Rlcy5sZW5ndGgpIHJldHVybiBhc3Q7XG4gIHZhciByZXBsYWNlZCA9IGZhbHNlO1xuICBhc3QgPSB3YWxrKGFzdCwgbnVsbCwgZnVuY3Rpb24obm9kZSwgcmVwbGFjZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdZaWVsZEJsb2NrJykge1xuICAgICAgcmVwbGFjZWQgPSB0cnVlO1xuICAgICAgbm9kZS50eXBlID0gJ0Jsb2NrJztcbiAgICAgIG5vZGUubm9kZXMgPSBbYmxvY2tdO1xuICAgIH1cbiAgfSk7XG4gIGZ1bmN0aW9uIGRlZmF1bHRZaWVsZExvY2F0aW9uKG5vZGUpIHtcbiAgICB2YXIgcmVzID0gbm9kZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2RlLm5vZGVzW2ldLnRleHRPbmx5KSBjb250aW51ZTtcbiAgICAgIGlmIChub2RlLm5vZGVzW2ldLnR5cGUgPT09ICdCbG9jaycpIHtcbiAgICAgICAgcmVzID0gZGVmYXVsdFlpZWxkTG9jYXRpb24obm9kZS5ub2Rlc1tpXSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZXNbaV0uYmxvY2sgJiYgbm9kZS5ub2Rlc1tpXS5ibG9jay5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzID0gZGVmYXVsdFlpZWxkTG9jYXRpb24obm9kZS5ub2Rlc1tpXS5ibG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKCFyZXBsYWNlZCkge1xuICAgIC8vIHRvZG86IHByb2JhYmx5IHNob3VsZCBkZXByZWNhdGUgdGhpcyB3aXRoIGEgd2FybmluZ1xuICAgIGRlZmF1bHRZaWVsZExvY2F0aW9uKGFzdCkubm9kZXMucHVzaChibG9jayk7XG4gIH1cbiAgcmV0dXJuIGFzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tFeHRlbmRQb3NpdGlvbihhc3QsIGhhc0V4dGVuZHMpIHtcbiAgdmFyIGxlZ2l0RXh0ZW5kc1JlYWNoZWQgPSBmYWxzZTtcbiAgd2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnRXh0ZW5kcycpIHtcbiAgICAgIGlmIChoYXNFeHRlbmRzICYmICFsZWdpdEV4dGVuZHNSZWFjaGVkKSB7XG4gICAgICAgIGxlZ2l0RXh0ZW5kc1JlYWNoZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ0VYVEVORFNfTk9UX0ZJUlNUJyxcbiAgICAgICAgICAnRGVjbGFyYXRpb24gb2YgdGVtcGxhdGUgaW5oZXJpdGFuY2UgKFwiZXh0ZW5kc1wiKSBzaG91bGQgYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgZXh0ZW5kcyBzdGF0ZW1lbnQgcGVyIGZpbGUuJyxcbiAgICAgICAgICBub2RlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAnaHRtbCc6ICc8IURPQ1RZUEUgaHRtbD4nLFxuICAneG1sJzogJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz4nLFxuICAndHJhbnNpdGlvbmFsJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+JyxcbiAgJ3N0cmljdCc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPicsXG4gICdmcmFtZXNldCc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGRcIj4nLFxuICAnMS4xJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkXCI+JyxcbiAgJ2Jhc2ljJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTEuZHRkXCI+JyxcbiAgJ21vYmlsZSc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjIvL0VOXCIgXCJodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9EVEQveGh0bWwtbW9iaWxlMTIuZHRkXCI+JyxcbiAgJ3BsaXN0JzogJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU5cIiBcImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGRcIj4nXG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuICBcImhhc19vd25fcHJvcGVydHlcIjogW10sXG4gIFwibWVyZ2VcIjogW1xuICAgIFwic3R5bGVcIlxuICBdLFxuICBcImNsYXNzZXNfYXJyYXlcIjogW1xuICAgIFwiY2xhc3Nlc1wiLFxuICAgIFwiZXNjYXBlXCJcbiAgXSxcbiAgXCJjbGFzc2VzX29iamVjdFwiOiBbXG4gICAgXCJoYXNfb3duX3Byb3BlcnR5XCJcbiAgXSxcbiAgXCJjbGFzc2VzXCI6IFtcbiAgICBcImNsYXNzZXNfYXJyYXlcIixcbiAgICBcImNsYXNzZXNfb2JqZWN0XCJcbiAgXSxcbiAgXCJzdHlsZVwiOiBbXG4gICAgXCJoYXNfb3duX3Byb3BlcnR5XCJcbiAgXSxcbiAgXCJhdHRyXCI6IFtcbiAgICBcImVzY2FwZVwiXG4gIF0sXG4gIFwiYXR0cnNcIjogW1xuICAgIFwiYXR0clwiLFxuICAgIFwiY2xhc3Nlc1wiLFxuICAgIFwiaGFzX293bl9wcm9wZXJ0eVwiLFxuICAgIFwic3R5bGVcIlxuICBdLFxuICBcIm1hdGNoX2h0bWxcIjogW10sXG4gIFwiZXNjYXBlXCI6IFtcbiAgICBcIm1hdGNoX2h0bWxcIlxuICBdLFxuICBcInJldGhyb3dcIjogW11cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCJkZXBlbmRlbmNpZXNcIjogdHJ1ZSxcbiAgXCJpbnRlcm5hbHNcIjogdHJ1ZSxcbiAgXCJoYXNfb3duX3Byb3BlcnR5XCI6IHRydWUsXG4gIFwiY2xhc3Nlc19hcnJheVwiOiB0cnVlLFxuICBcImNsYXNzZXNfb2JqZWN0XCI6IHRydWUsXG4gIFwibWF0Y2hfaHRtbFwiOiB0cnVlXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwiaGFzX293bl9wcm9wZXJ0eVwiOiBcInZhciBwdWdfaGFzX293bl9wcm9wZXJ0eT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1wiLFxuICBcIm1lcmdlXCI6IFwiZnVuY3Rpb24gcHVnX21lcmdlKGUscil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1lWzBdLGc9MTtnPGUubGVuZ3RoO2crKyl0PXB1Z19tZXJnZSh0LGVbZ10pO3JldHVybiB0fWZvcih2YXIgbCBpbiByKWlmKFxcXCJjbGFzc1xcXCI9PT1sKXt2YXIgbj1lW2xdfHxbXTtlW2xdPShBcnJheS5pc0FycmF5KG4pP246W25dKS5jb25jYXQocltsXXx8W10pfWVsc2UgaWYoXFxcInN0eWxlXFxcIj09PWwpe3ZhciBuPXB1Z19zdHlsZShlW2xdKTtuPW4mJlxcXCI7XFxcIiE9PW5bbi5sZW5ndGgtMV0/bitcXFwiO1xcXCI6bjt2YXIgYT1wdWdfc3R5bGUocltsXSk7YT1hJiZcXFwiO1xcXCIhPT1hW2EubGVuZ3RoLTFdP2ErXFxcIjtcXFwiOmEsZVtsXT1uK2F9ZWxzZSBlW2xdPXJbbF07cmV0dXJuIGV9XCIsXG4gIFwiY2xhc3Nlc19hcnJheVwiOiBcImZ1bmN0aW9uIHB1Z19jbGFzc2VzX2FycmF5KHIsYSl7Zm9yKHZhciBzLGU9XFxcIlxcXCIsdT1cXFwiXFxcIixjPUFycmF5LmlzQXJyYXkoYSksZz0wO2c8ci5sZW5ndGg7ZysrKShzPXB1Z19jbGFzc2VzKHJbZ10pKSYmKGMmJmFbZ10mJihzPXB1Z19lc2NhcGUocykpLGU9ZSt1K3MsdT1cXFwiIFxcXCIpO3JldHVybiBlfVwiLFxuICBcImNsYXNzZXNfb2JqZWN0XCI6IFwiZnVuY3Rpb24gcHVnX2NsYXNzZXNfb2JqZWN0KHIpe3ZhciBhPVxcXCJcXFwiLG49XFxcIlxcXCI7Zm9yKHZhciBvIGluIHIpbyYmcltvXSYmcHVnX2hhc19vd25fcHJvcGVydHkuY2FsbChyLG8pJiYoYT1hK24rbyxuPVxcXCIgXFxcIik7cmV0dXJuIGF9XCIsXG4gIFwiY2xhc3Nlc1wiOiBcImZ1bmN0aW9uIHB1Z19jbGFzc2VzKHMscil7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/cHVnX2NsYXNzZXNfYXJyYXkocyxyKTpzJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIHM/cHVnX2NsYXNzZXNfb2JqZWN0KHMpOnN8fFxcXCJcXFwifVwiLFxuICBcInN0eWxlXCI6IFwiZnVuY3Rpb24gcHVnX3N0eWxlKHIpe2lmKCFyKXJldHVyblxcXCJcXFwiO2lmKFxcXCJvYmplY3RcXFwiPT10eXBlb2Ygcil7dmFyIHQ9XFxcIlxcXCI7Zm9yKHZhciBlIGluIHIpcHVnX2hhc19vd25fcHJvcGVydHkuY2FsbChyLGUpJiYodD10K2UrXFxcIjpcXFwiK3JbZV0rXFxcIjtcXFwiKTtyZXR1cm4gdH1yZXR1cm4gcitcXFwiXFxcIn1cIixcbiAgXCJhdHRyXCI6IFwiZnVuY3Rpb24gcHVnX2F0dHIodCxlLG4scil7aWYoITE9PT1lfHxudWxsPT1lfHwhZSYmKFxcXCJjbGFzc1xcXCI9PT10fHxcXFwic3R5bGVcXFwiPT09dCkpcmV0dXJuXFxcIlxcXCI7aWYoITA9PT1lKXJldHVyblxcXCIgXFxcIisocj90OnQrJz1cXFwiJyt0KydcXFwiJyk7dmFyIGY9dHlwZW9mIGU7cmV0dXJuXFxcIm9iamVjdFxcXCIhPT1mJiZcXFwiZnVuY3Rpb25cXFwiIT09Znx8XFxcImZ1bmN0aW9uXFxcIiE9dHlwZW9mIGUudG9KU09OfHwoZT1lLnRvSlNPTigpKSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGV8fChlPUpTT04uc3RyaW5naWZ5KGUpLG58fC0xPT09ZS5pbmRleE9mKCdcXFwiJykpPyhuJiYoZT1wdWdfZXNjYXBlKGUpKSxcXFwiIFxcXCIrdCsnPVxcXCInK2UrJ1xcXCInKTpcXFwiIFxcXCIrdCtcXFwiPSdcXFwiK2UucmVwbGFjZSgvJy9nLFxcXCImIzM5O1xcXCIpK1xcXCInXFxcIn1cIixcbiAgXCJhdHRyc1wiOiBcImZ1bmN0aW9uIHB1Z19hdHRycyh0LHIpe3ZhciBhPVxcXCJcXFwiO2Zvcih2YXIgcyBpbiB0KWlmKHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodCxzKSl7dmFyIHU9dFtzXTtpZihcXFwiY2xhc3NcXFwiPT09cyl7dT1wdWdfY2xhc3Nlcyh1KSxhPXB1Z19hdHRyKHMsdSwhMSxyKSthO2NvbnRpbnVlfVxcXCJzdHlsZVxcXCI9PT1zJiYodT1wdWdfc3R5bGUodSkpLGErPXB1Z19hdHRyKHMsdSwhMSxyKX1yZXR1cm4gYX1cIixcbiAgXCJtYXRjaF9odG1sXCI6IFwidmFyIHB1Z19tYXRjaF9odG1sPS9bXFxcIiY8Pl0vO1wiLFxuICBcImVzY2FwZVwiOiBcImZ1bmN0aW9uIHB1Z19lc2NhcGUoZSl7dmFyIGE9XFxcIlxcXCIrZSx0PXB1Z19tYXRjaF9odG1sLmV4ZWMoYSk7aWYoIXQpcmV0dXJuIGU7dmFyIHIsYyxuLHM9XFxcIlxcXCI7Zm9yKHI9dC5pbmRleCxjPTA7cjxhLmxlbmd0aDtyKyspe3N3aXRjaChhLmNoYXJDb2RlQXQocikpe2Nhc2UgMzQ6bj1cXFwiJnF1b3Q7XFxcIjticmVhaztjYXNlIDM4Om49XFxcIiZhbXA7XFxcIjticmVhaztjYXNlIDYwOm49XFxcIiZsdDtcXFwiO2JyZWFrO2Nhc2UgNjI6bj1cXFwiJmd0O1xcXCI7YnJlYWs7ZGVmYXVsdDpjb250aW51ZX1jIT09ciYmKHMrPWEuc3Vic3RyaW5nKGMscikpLGM9cisxLHMrPW59cmV0dXJuIGMhPT1yP3MrYS5zdWJzdHJpbmcoYyxyKTpzfVwiLFxuICBcInJldGhyb3dcIjogXCJmdW5jdGlvbiBwdWdfcmV0aHJvdyhlLG4scix0KXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpdGhyb3cgZTtpZighKFxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2Ygd2luZG93JiZufHx0KSl0aHJvdyBlLm1lc3NhZ2UrPVxcXCIgb24gbGluZSBcXFwiK3IsZTt2YXIgbyxhLGksczt0cnl7dD10fHxyZXF1aXJlKFxcXCJmc1xcXCIpLnJlYWRGaWxlU3luYyhuLHtlbmNvZGluZzpcXFwidXRmOFxcXCJ9KSxvPTMsYT10LnNwbGl0KFxcXCJcXFxcblxcXCIpLGk9TWF0aC5tYXgoci1vLDApLHM9TWF0aC5taW4oYS5sZW5ndGgscitvKX1jYXRjaCh0KXtyZXR1cm4gZS5tZXNzYWdlKz1cXFwiIC0gY291bGQgbm90IHJlYWQgZnJvbSBcXFwiK24rXFxcIiAoXFxcIit0Lm1lc3NhZ2UrXFxcIilcXFwiLHZvaWQgcHVnX3JldGhyb3coZSxudWxsLHIpfW89YS5zbGljZShpLHMpLm1hcChmdW5jdGlvbihlLG4pe3ZhciB0PW4raSsxO3JldHVybih0PT1yP1xcXCIgID4gXFxcIjpcXFwiICAgIFxcXCIpK3QrXFxcInwgXFxcIitlfSkuam9pbihcXFwiXFxcXG5cXFwiKSxlLnBhdGg9bjt0cnl7ZS5tZXNzYWdlPShufHxcXFwiUHVnXFxcIikrXFxcIjpcXFwiK3IrXFxcIlxcXFxuXFxcIitvK1xcXCJcXFxcblxcXFxuXFxcIitlLm1lc3NhZ2V9Y2F0Y2goZSl7fXRocm93IGV9XCJcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgZGVwZW5kZW5jaWVzID0gcmVxdWlyZSgnLi9saWIvZGVwZW5kZW5jaWVzLmpzJyk7XG52YXIgaW50ZXJuYWxzID0gcmVxdWlyZSgnLi9saWIvaW50ZXJuYWxzLmpzJyk7XG52YXIgc291cmNlcyA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZXMuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZDtcblxuZnVuY3Rpb24gYnVpbGQoZnVuY3Rpb25zKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZnVuY3Rpb25zID0gZnVuY3Rpb25zLmZpbHRlcihmdW5jdGlvbihmbikge1xuICAgIHJldHVybiAhaW50ZXJuYWxzW2ZuXTtcbiAgfSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZucy5pbmRleE9mKGZ1bmN0aW9uc1tpXSkgPT09IC0xKSB7XG4gICAgICBmbnMucHVzaChmdW5jdGlvbnNbaV0pO1xuICAgICAgZnVuY3Rpb25zLnB1c2guYXBwbHkoZnVuY3Rpb25zLCBkZXBlbmRlbmNpZXNbZnVuY3Rpb25zW2ldXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmbnNcbiAgICAuc29ydCgpXG4gICAgLm1hcChmdW5jdGlvbihuYW1lKSB7XG4gICAgICByZXR1cm4gc291cmNlc1tuYW1lXTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBwdWdfaGFzX293bl9wcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogTWVyZ2UgdHdvIGF0dHJpYnV0ZSBvYmplY3RzIGdpdmluZyBwcmVjZWRlbmNlXG4gKiB0byB2YWx1ZXMgaW4gb2JqZWN0IGBiYC4gQ2xhc3NlcyBhcmUgc3BlY2lhbC1jYXNlZFxuICogYWxsb3dpbmcgZm9yIGFycmF5cyBhbmQgbWVyZ2luZy9qb2luaW5nIGFwcHJvcHJpYXRlbHlcbiAqIHJlc3VsdGluZyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHBhcmFtIHtPYmplY3R9IGJcbiAqIEByZXR1cm4ge09iamVjdH0gYVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5tZXJnZSA9IHB1Z19tZXJnZTtcbmZ1bmN0aW9uIHB1Z19tZXJnZShhLCBiKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIGF0dHJzID0gYVswXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGF0dHJzID0gcHVnX21lcmdlKGF0dHJzLCBhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHJzO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIGIpIHtcbiAgICBpZiAoa2V5ID09PSAnY2xhc3MnKSB7XG4gICAgICB2YXIgdmFsQSA9IGFba2V5XSB8fCBbXTtcbiAgICAgIGFba2V5XSA9IChBcnJheS5pc0FycmF5KHZhbEEpID8gdmFsQSA6IFt2YWxBXSkuY29uY2F0KGJba2V5XSB8fCBbXSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgIHZhciB2YWxBID0gcHVnX3N0eWxlKGFba2V5XSk7XG4gICAgICB2YWxBID0gdmFsQSAmJiB2YWxBW3ZhbEEubGVuZ3RoIC0gMV0gIT09ICc7JyA/IHZhbEEgKyAnOycgOiB2YWxBO1xuICAgICAgdmFyIHZhbEIgPSBwdWdfc3R5bGUoYltrZXldKTtcbiAgICAgIHZhbEIgPSB2YWxCICYmIHZhbEJbdmFsQi5sZW5ndGggLSAxXSAhPT0gJzsnID8gdmFsQiArICc7JyA6IHZhbEI7XG4gICAgICBhW2tleV0gPSB2YWxBICsgdmFsQjtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gYltrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgYXJyYXksIG9iamVjdCwgb3Igc3RyaW5nIGFzIGEgc3RyaW5nIG9mIGNsYXNzZXMgZGVsaW1pdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogSWYgYHZhbGAgaXMgYW4gYXJyYXksIGFsbCBtZW1iZXJzIG9mIGl0IGFuZCBpdHMgc3ViYXJyYXlzIGFyZSBjb3VudGVkIGFzXG4gKiBjbGFzc2VzLiBJZiBgZXNjYXBpbmdgIGlzIGFuIGFycmF5LCB0aGVuIHdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIGluIGB2YWxgIGlzXG4gKiBlc2NhcGVkIGRlcGVuZHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiBgZXNjYXBpbmdgLiBJZiBgZXNjYXBpbmdgIGlzXG4gKiBub3QgYW4gYXJyYXksIG5vIGVzY2FwaW5nIGlzIGRvbmUuXG4gKlxuICogSWYgYHZhbGAgaXMgYW4gb2JqZWN0LCBhbGwgdGhlIGtleXMgd2hvc2UgdmFsdWUgaXMgdHJ1dGh5IGFyZSBjb3VudGVkIGFzXG4gKiBjbGFzc2VzLiBObyBlc2NhcGluZyBpcyBkb25lLlxuICpcbiAqIElmIGB2YWxgIGlzIGEgc3RyaW5nLCBpdCBpcyBjb3VudGVkIGFzIGEgY2xhc3MuIE5vIGVzY2FwaW5nIGlzIGRvbmUuXG4gKlxuICogQHBhcmFtIHsoQXJyYXkuPHN0cmluZz58T2JqZWN0LjxzdHJpbmcsIGJvb2xlYW4+fHN0cmluZyl9IHZhbFxuICogQHBhcmFtIHs/QXJyYXkuPHN0cmluZz59IGVzY2FwaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydHMuY2xhc3NlcyA9IHB1Z19jbGFzc2VzO1xuZnVuY3Rpb24gcHVnX2NsYXNzZXNfYXJyYXkodmFsLCBlc2NhcGluZykge1xuICB2YXIgY2xhc3NTdHJpbmcgPSAnJyxcbiAgICBjbGFzc05hbWUsXG4gICAgcGFkZGluZyA9ICcnLFxuICAgIGVzY2FwZUVuYWJsZWQgPSBBcnJheS5pc0FycmF5KGVzY2FwaW5nKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICBjbGFzc05hbWUgPSBwdWdfY2xhc3Nlcyh2YWxbaV0pO1xuICAgIGlmICghY2xhc3NOYW1lKSBjb250aW51ZTtcbiAgICBlc2NhcGVFbmFibGVkICYmIGVzY2FwaW5nW2ldICYmIChjbGFzc05hbWUgPSBwdWdfZXNjYXBlKGNsYXNzTmFtZSkpO1xuICAgIGNsYXNzU3RyaW5nID0gY2xhc3NTdHJpbmcgKyBwYWRkaW5nICsgY2xhc3NOYW1lO1xuICAgIHBhZGRpbmcgPSAnICc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzU3RyaW5nO1xufVxuZnVuY3Rpb24gcHVnX2NsYXNzZXNfb2JqZWN0KHZhbCkge1xuICB2YXIgY2xhc3NTdHJpbmcgPSAnJyxcbiAgICBwYWRkaW5nID0gJyc7XG4gIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICBpZiAoa2V5ICYmIHZhbFtrZXldICYmIHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodmFsLCBrZXkpKSB7XG4gICAgICBjbGFzc1N0cmluZyA9IGNsYXNzU3RyaW5nICsgcGFkZGluZyArIGtleTtcbiAgICAgIHBhZGRpbmcgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjbGFzc1N0cmluZztcbn1cbmZ1bmN0aW9uIHB1Z19jbGFzc2VzKHZhbCwgZXNjYXBpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBwdWdfY2xhc3Nlc19hcnJheSh2YWwsIGVzY2FwaW5nKTtcbiAgfSBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcHVnX2NsYXNzZXNfb2JqZWN0KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbCB8fCAnJztcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgb2JqZWN0IG9yIHN0cmluZyB0byBhIHN0cmluZyBvZiBDU1Mgc3R5bGVzIGRlbGltaXRlZCBieSBhIHNlbWljb2xvbi5cbiAqXG4gKiBAcGFyYW0geyhPYmplY3QuPHN0cmluZywgc3RyaW5nPnxzdHJpbmcpfSB2YWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5leHBvcnRzLnN0eWxlID0gcHVnX3N0eWxlO1xuZnVuY3Rpb24gcHVnX3N0eWxlKHZhbCkge1xuICBpZiAoIXZhbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGUgaW4gdmFsKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodmFsLCBzdHlsZSkpIHtcbiAgICAgICAgb3V0ID0gb3V0ICsgc3R5bGUgKyAnOicgKyB2YWxbc3R5bGVdICsgJzsnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWwgKyAnJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZ2l2ZW4gYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZXNjYXBlZFxuICogQHBhcmFtIHtCb29sZWFufSB0ZXJzZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnRzLmF0dHIgPSBwdWdfYXR0cjtcbmZ1bmN0aW9uIHB1Z19hdHRyKGtleSwgdmFsLCBlc2NhcGVkLCB0ZXJzZSkge1xuICBpZiAoXG4gICAgdmFsID09PSBmYWxzZSB8fFxuICAgIHZhbCA9PSBudWxsIHx8XG4gICAgKCF2YWwgJiYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdzdHlsZScpKVxuICApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnICcgKyAodGVyc2UgPyBrZXkgOiBrZXkgKyAnPVwiJyArIGtleSArICdcIicpO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKFxuICAgICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSAmJlxuICAgIHR5cGVvZiB2YWwudG9KU09OID09PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHZhbCA9IHZhbC50b0pTT04oKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgIGlmICghZXNjYXBlZCAmJiB2YWwuaW5kZXhPZignXCInKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAnICcgKyBrZXkgKyBcIj0nXCIgKyB2YWwucmVwbGFjZSgvJy9nLCAnJiMzOTsnKSArIFwiJ1wiO1xuICAgIH1cbiAgfVxuICBpZiAoZXNjYXBlZCkgdmFsID0gcHVnX2VzY2FwZSh2YWwpO1xuICByZXR1cm4gJyAnICsga2V5ICsgJz1cIicgKyB2YWwgKyAnXCInO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtPYmplY3R9IHRlcnNlIHdoZXRoZXIgdG8gdXNlIEhUTUw1IHRlcnNlIGJvb2xlYW4gYXR0cmlidXRlc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnRzLmF0dHJzID0gcHVnX2F0dHJzO1xuZnVuY3Rpb24gcHVnX2F0dHJzKG9iaiwgdGVyc2UpIHtcbiAgdmFyIGF0dHJzID0gJyc7XG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChwdWdfaGFzX293bl9wcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuXG4gICAgICBpZiAoJ2NsYXNzJyA9PT0ga2V5KSB7XG4gICAgICAgIHZhbCA9IHB1Z19jbGFzc2VzKHZhbCk7XG4gICAgICAgIGF0dHJzID0gcHVnX2F0dHIoa2V5LCB2YWwsIGZhbHNlLCB0ZXJzZSkgKyBhdHRycztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0eWxlJyA9PT0ga2V5KSB7XG4gICAgICAgIHZhbCA9IHB1Z19zdHlsZSh2YWwpO1xuICAgICAgfVxuICAgICAgYXR0cnMgKz0gcHVnX2F0dHIoa2V5LCB2YWwsIGZhbHNlLCB0ZXJzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dHJzO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGBodG1sYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHB1Z19tYXRjaF9odG1sID0gL1tcIiY8Pl0vO1xuZXhwb3J0cy5lc2NhcGUgPSBwdWdfZXNjYXBlO1xuZnVuY3Rpb24gcHVnX2VzY2FwZShfaHRtbCkge1xuICB2YXIgaHRtbCA9ICcnICsgX2h0bWw7XG4gIHZhciByZWdleFJlc3VsdCA9IHB1Z19tYXRjaF9odG1sLmV4ZWMoaHRtbCk7XG4gIGlmICghcmVnZXhSZXN1bHQpIHJldHVybiBfaHRtbDtcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBpLCBsYXN0SW5kZXgsIGVzY2FwZTtcbiAgZm9yIChpID0gcmVnZXhSZXN1bHQuaW5kZXgsIGxhc3RJbmRleCA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChodG1sLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMzQ6XG4gICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MDpcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCAhPT0gaSkgcmVzdWx0ICs9IGh0bWwuc3Vic3RyaW5nKGxhc3RJbmRleCwgaSk7XG4gICAgbGFzdEluZGV4ID0gaSArIDE7XG4gICAgcmVzdWx0ICs9IGVzY2FwZTtcbiAgfVxuICBpZiAobGFzdEluZGV4ICE9PSBpKSByZXR1cm4gcmVzdWx0ICsgaHRtbC5zdWJzdHJpbmcobGFzdEluZGV4LCBpKTtcbiAgZWxzZSByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJlLXRocm93IHRoZSBnaXZlbiBgZXJyYCBpbiBjb250ZXh0IHRvIHRoZVxuICogdGhlIHB1ZyBpbiBgZmlsZW5hbWVgIGF0IHRoZSBnaXZlbiBgbGluZW5vYC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGxpbmVub1xuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBvcmlnaW5hbCBzb3VyY2VcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucmV0aHJvdyA9IHB1Z19yZXRocm93O1xuZnVuY3Rpb24gcHVnX3JldGhyb3coZXJyLCBmaWxlbmFtZSwgbGluZW5vLCBzdHIpIHtcbiAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpKSB0aHJvdyBlcnI7XG4gIGlmICgodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyB8fCAhZmlsZW5hbWUpICYmICFzdHIpIHtcbiAgICBlcnIubWVzc2FnZSArPSAnIG9uIGxpbmUgJyArIGxpbmVubztcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgdmFyIGNvbnRleHQsIGxpbmVzLCBzdGFydCwgZW5kO1xuICB0cnkge1xuICAgIHN0ciA9IHN0ciB8fCByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwge2VuY29kaW5nOiAndXRmOCd9KTtcbiAgICBjb250ZXh0ID0gMztcbiAgICBsaW5lcyA9IHN0ci5zcGxpdCgnXFxuJyk7XG4gICAgc3RhcnQgPSBNYXRoLm1heChsaW5lbm8gLSBjb250ZXh0LCAwKTtcbiAgICBlbmQgPSBNYXRoLm1pbihsaW5lcy5sZW5ndGgsIGxpbmVubyArIGNvbnRleHQpO1xuICB9IGNhdGNoIChleCkge1xuICAgIGVyci5tZXNzYWdlICs9XG4gICAgICAnIC0gY291bGQgbm90IHJlYWQgZnJvbSAnICsgZmlsZW5hbWUgKyAnICgnICsgZXgubWVzc2FnZSArICcpJztcbiAgICBwdWdfcmV0aHJvdyhlcnIsIG51bGwsIGxpbmVubyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRXJyb3IgY29udGV4dFxuICBjb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICAubWFwKGZ1bmN0aW9uKGxpbmUsIGkpIHtcbiAgICAgIHZhciBjdXJyID0gaSArIHN0YXJ0ICsgMTtcbiAgICAgIHJldHVybiAoY3VyciA9PSBsaW5lbm8gPyAnICA+ICcgOiAnICAgICcpICsgY3VyciArICd8ICcgKyBsaW5lO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIC8vIEFsdGVyIGV4Y2VwdGlvbiBtZXNzYWdlXG4gIGVyci5wYXRoID0gZmlsZW5hbWU7XG4gIHRyeSB7XG4gICAgZXJyLm1lc3NhZ2UgPVxuICAgICAgKGZpbGVuYW1lIHx8ICdQdWcnKSArXG4gICAgICAnOicgK1xuICAgICAgbGluZW5vICtcbiAgICAgICdcXG4nICtcbiAgICAgIGNvbnRleHQgK1xuICAgICAgJ1xcblxcbicgK1xuICAgICAgZXJyLm1lc3NhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHRocm93IGVycjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5O1xuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAnbmV3IERhdGUoJyArIHN0cmluZ2lmeShvYmoudG9JU09TdHJpbmcoKSkgKyAnKSc7XG4gIH1cbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTIwMjgvZywgJ1xcXFx1MjAyOCcpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTIwMjkvZywgJ1xcXFx1MjAyOScpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJ1xcXFx1MDAzQycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJ1xcXFx1MDAzRScpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXHUwMDJGJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgY29uc3RhbnRpbm9wbGUgPSByZXF1aXJlKCdjb25zdGFudGlub3BsZScpO1xudmFyIHJ1bnRpbWUgPSByZXF1aXJlKCdwdWctcnVudGltZScpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJ2pzLXN0cmluZ2lmeScpO1xuXG5mdW5jdGlvbiBpc0NvbnN0YW50KHNyYykge1xuICByZXR1cm4gY29uc3RhbnRpbm9wbGUoc3JjLCB7cHVnOiBydW50aW1lLCBwdWdfaW50ZXJwOiB1bmRlZmluZWR9KTtcbn1cbmZ1bmN0aW9uIHRvQ29uc3RhbnQoc3JjKSB7XG4gIHJldHVybiBjb25zdGFudGlub3BsZS50b0NvbnN0YW50KHNyYywge3B1ZzogcnVudGltZSwgcHVnX2ludGVycDogdW5kZWZpbmVkfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZUF0dHJzO1xuLyoqXG4gKiBvcHRpb25zOlxuICogIC0gdGVyc2VcbiAqICAtIHJ1bnRpbWVcbiAqICAtIGZvcm1hdCAoJ2h0bWwnIHx8ICdvYmplY3QnKVxuICovXG5mdW5jdGlvbiBjb21waWxlQXR0cnMoYXR0cnMsIG9wdGlvbnMpIHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoYXR0cnMpLCAnQXR0cnMgc2hvdWxkIGJlIGFuIGFycmF5Jyk7XG4gIGFzc2VydChcbiAgICBhdHRycy5ldmVyeShmdW5jdGlvbihhdHRyKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhdHRyICYmXG4gICAgICAgIHR5cGVvZiBhdHRyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgYXR0ci5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAodHlwZW9mIGF0dHIudmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXR0ci52YWwgPT09ICdib29sZWFuJykgJiZcbiAgICAgICAgdHlwZW9mIGF0dHIubXVzdEVzY2FwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgICApO1xuICAgIH0pLFxuICAgICdBbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgc3VwcGxpZWQgYXMgYW4gb2JqZWN0IG9mIHRoZSBmb3JtIHtuYW1lLCB2YWwsIG11c3RFc2NhcGV9J1xuICApO1xuICBhc3NlcnQob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcsICdPcHRpb25zIHNob3VsZCBiZSBhbiBvYmplY3QnKTtcbiAgYXNzZXJ0KFxuICAgIHR5cGVvZiBvcHRpb25zLnRlcnNlID09PSAnYm9vbGVhbicsXG4gICAgJ09wdGlvbnMudGVyc2Ugc2hvdWxkIGJlIGEgYm9vbGVhbidcbiAgKTtcbiAgYXNzZXJ0KFxuICAgIHR5cGVvZiBvcHRpb25zLnJ1bnRpbWUgPT09ICdmdW5jdGlvbicsXG4gICAgJ09wdGlvbnMucnVudGltZSBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcnVudGltZSBmdW5jdGlvbiBuYW1lIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UgY29kZSB0aGF0IHdpbGwgZXZhbHVhdGUgdG8gdGhhdCBmdW5jdGlvbiBhdCBydW50aW1lJ1xuICApO1xuICBhc3NlcnQoXG4gICAgb3B0aW9ucy5mb3JtYXQgPT09ICdodG1sJyB8fCBvcHRpb25zLmZvcm1hdCA9PT0gJ29iamVjdCcsXG4gICAgJ09wdGlvbnMuZm9ybWF0IHNob3VsZCBiZSBcImh0bWxcIiBvciBcIm9iamVjdFwiJ1xuICApO1xuXG4gIHZhciBidWYgPSBbXTtcbiAgdmFyIGNsYXNzZXMgPSBbXTtcbiAgdmFyIGNsYXNzRXNjYXBpbmcgPSBbXTtcblxuICBmdW5jdGlvbiBhZGRBdHRyaWJ1dGUoa2V5LCB2YWwsIG11c3RFc2NhcGUsIGJ1Zikge1xuICAgIGlmIChpc0NvbnN0YW50KHZhbCkpIHtcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2h0bWwnKSB7XG4gICAgICAgIHZhciBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICAgICAgcnVudGltZS5hdHRyKGtleSwgdG9Db25zdGFudCh2YWwpLCBtdXN0RXNjYXBlLCBvcHRpb25zLnRlcnNlKVxuICAgICAgICApO1xuICAgICAgICB2YXIgbGFzdCA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3RbbGFzdC5sZW5ndGggLSAxXSA9PT0gc3RyWzBdKSB7XG4gICAgICAgICAgYnVmW2J1Zi5sZW5ndGggLSAxXSA9IGxhc3Quc3Vic3RyKDAsIGxhc3QubGVuZ3RoIC0gMSkgKyBzdHIuc3Vic3RyKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Zi5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IHRvQ29uc3RhbnQodmFsKTtcbiAgICAgICAgaWYgKG11c3RFc2NhcGUpIHtcbiAgICAgICAgICB2YWwgPSBydW50aW1lLmVzY2FwZSh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGJ1Zi5wdXNoKHN0cmluZ2lmeShrZXkpICsgJzogJyArIHN0cmluZ2lmeSh2YWwpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnaHRtbCcpIHtcbiAgICAgICAgYnVmLnB1c2goXG4gICAgICAgICAgb3B0aW9ucy5ydW50aW1lKCdhdHRyJykgK1xuICAgICAgICAgICAgJyhcIicgK1xuICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICdcIiwgJyArXG4gICAgICAgICAgICB2YWwgK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBzdHJpbmdpZnkobXVzdEVzY2FwZSkgK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBzdHJpbmdpZnkob3B0aW9ucy50ZXJzZSkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobXVzdEVzY2FwZSkge1xuICAgICAgICAgIHZhbCA9IG9wdGlvbnMucnVudGltZSgnZXNjYXBlJykgKyAnKCcgKyB2YWwgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgICAgYnVmLnB1c2goc3RyaW5naWZ5KGtleSkgKyAnOiAnICsgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICB2YXIga2V5ID0gYXR0ci5uYW1lO1xuICAgIHZhciB2YWwgPSBhdHRyLnZhbDtcbiAgICB2YXIgbXVzdEVzY2FwZSA9IGF0dHIubXVzdEVzY2FwZTtcblxuICAgIGlmIChrZXkgPT09ICdjbGFzcycpIHtcbiAgICAgIGNsYXNzZXMucHVzaCh2YWwpO1xuICAgICAgY2xhc3NFc2NhcGluZy5wdXNoKG11c3RFc2NhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgIGlmIChpc0NvbnN0YW50KHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSBzdHJpbmdpZnkocnVudGltZS5zdHlsZSh0b0NvbnN0YW50KHZhbCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSBvcHRpb25zLnJ1bnRpbWUoJ3N0eWxlJykgKyAnKCcgKyB2YWwgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFkZEF0dHJpYnV0ZShrZXksIHZhbCwgbXVzdEVzY2FwZSwgYnVmKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgY2xhc3Nlc0J1ZiA9IFtdO1xuICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICBpZiAoY2xhc3Nlcy5ldmVyeShpc0NvbnN0YW50KSkge1xuICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAnY2xhc3MnLFxuICAgICAgICBzdHJpbmdpZnkocnVudGltZS5jbGFzc2VzKGNsYXNzZXMubWFwKHRvQ29uc3RhbnQpLCBjbGFzc0VzY2FwaW5nKSksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjbGFzc2VzQnVmXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXAoZnVuY3Rpb24oY2xzLCBpKSB7XG4gICAgICAgIGlmIChpc0NvbnN0YW50KGNscykpIHtcbiAgICAgICAgICBjbHMgPSBzdHJpbmdpZnkoXG4gICAgICAgICAgICBjbGFzc0VzY2FwaW5nW2ldID8gcnVudGltZS5lc2NhcGUodG9Db25zdGFudChjbHMpKSA6IHRvQ29uc3RhbnQoY2xzKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY2xhc3NFc2NhcGluZ1tpXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbHM7XG4gICAgICB9KTtcbiAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgb3B0aW9ucy5ydW50aW1lKCdjbGFzc2VzJykgK1xuICAgICAgICAgICcoWycgK1xuICAgICAgICAgIGNsYXNzZXMuam9pbignLCcpICtcbiAgICAgICAgICAnXSwgJyArXG4gICAgICAgICAgc3RyaW5naWZ5KGNsYXNzRXNjYXBpbmcpICtcbiAgICAgICAgICAnKScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjbGFzc2VzQnVmXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBidWYgPSBjbGFzc2VzQnVmLmNvbmNhdChidWYpO1xuICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdodG1sJykgcmV0dXJuIGJ1Zi5sZW5ndGggPyBidWYuam9pbignKycpIDogJ1wiXCInO1xuICBlbHNlIHJldHVybiAneycgKyBidWYuam9pbignLCcpICsgJ30nO1xufVxuIiwgIi8qKlxuICogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYHByZS1wdWJsaXNoLmpzYC5cbiAqIERvIG5vdCBtYW51YWxseSBlZGl0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcImFyZWFcIjogdHJ1ZSxcbiAgXCJiYXNlXCI6IHRydWUsXG4gIFwiYnJcIjogdHJ1ZSxcbiAgXCJjb2xcIjogdHJ1ZSxcbiAgXCJlbWJlZFwiOiB0cnVlLFxuICBcImhyXCI6IHRydWUsXG4gIFwiaW1nXCI6IHRydWUsXG4gIFwiaW5wdXRcIjogdHJ1ZSxcbiAgXCJsaW5rXCI6IHRydWUsXG4gIFwibWV0YVwiOiB0cnVlLFxuICBcInBhcmFtXCI6IHRydWUsXG4gIFwic291cmNlXCI6IHRydWUsXG4gIFwidHJhY2tcIjogdHJ1ZSxcbiAgXCJ3YnJcIjogdHJ1ZVxufTtcbiIsIG51bGwsIG51bGwsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBleGhhdXN0aXZlIGNoZWNrcyBvZiBkaXNjcmltaW5hdGVkIHVuaW9ucy5cbiAqIGh0dHBzOi8vYmFzYXJhdC5naXRib29rcy5pby90eXBlc2NyaXB0L2RvY3MvdHlwZXMvZGlzY3JpbWluYXRlZC11bmlvbnMuaHRtbFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdHlwZSBBID0ge3R5cGU6ICdhJ307XG4gKiAgICB0eXBlIEIgPSB7dHlwZTogJ2InfTtcbiAqICAgIHR5cGUgVW5pb24gPSBBIHwgQjtcbiAqXG4gKiAgICBmdW5jdGlvbiBkb1NvbWV0aGluZyhhcmc6IFVuaW9uKSB7XG4gKiAgICAgIGlmIChhcmcudHlwZSA9PT0gJ2EnKSB7XG4gKiAgICAgICAgcmV0dXJuIHNvbWV0aGluZztcbiAqICAgICAgfVxuICpcbiAqICAgICAgaWYgKGFyZy50eXBlID09PSAnYicpIHtcbiAqICAgICAgICByZXR1cm4gc29tZXRoaW5nRWxzZTtcbiAqICAgICAgfVxuICpcbiAqICAgICAgLy8gVFMgd2lsbCBlcnJvciBpZiB0aGVyZSBhcmUgb3RoZXIgdHlwZXMgaW4gdGhlIHVuaW9uXG4gKiAgICAgIC8vIFdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBjYWxsZWQgYXQgcnVudGltZS5cbiAqICAgICAgLy8gVXNlIGBhc3NlcnROZXZlcihhcmcsIHRydWUpYCBpbnN0ZWFkIHRvIGZhaWwgc2lsZW50bHkuXG4gKiAgICAgIHJldHVybiBhc3NlcnROZXZlcihhcmcpO1xuICogICAgfVxuICovXG5mdW5jdGlvbiBhc3NlcnROZXZlcih2YWx1ZSwgbm9UaHJvdykge1xuICAgIGlmIChub1Rocm93KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWVtYmVyOiBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG5leHBvcnRzLmFzc2VydE5ldmVyID0gYXNzZXJ0TmV2ZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBhc3NlcnROZXZlcjtcbiIsIG51bGwsIG51bGwsIG51bGwsICIndXNlIHN0cmljdCc7XG5cbnZhciBkb2N0eXBlcyA9IHJlcXVpcmUoJ2RvY3R5cGVzJyk7XG52YXIgbWFrZUVycm9yID0gcmVxdWlyZSgncHVnLWVycm9yJyk7XG52YXIgYnVpbGRSdW50aW1lID0gcmVxdWlyZSgncHVnLXJ1bnRpbWUvYnVpbGQnKTtcbnZhciBydW50aW1lID0gcmVxdWlyZSgncHVnLXJ1bnRpbWUnKTtcbnZhciBjb21waWxlQXR0cnMgPSByZXF1aXJlKCdwdWctYXR0cnMnKTtcbnZhciBzZWxmQ2xvc2luZyA9IHJlcXVpcmUoJ3ZvaWQtZWxlbWVudHMnKTtcbnZhciBjb25zdGFudGlub3BsZSA9IHJlcXVpcmUoJ2NvbnN0YW50aW5vcGxlJyk7XG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnanMtc3RyaW5naWZ5Jyk7XG52YXIgYWRkV2l0aCA9IHJlcXVpcmUoJ3dpdGgnKTtcblxuLy8gVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgcHJldHR5IHByaW50aW5nIGluc2lkZSBjZXJ0YWluIHRhZ3NcbnZhciBXSElURV9TUEFDRV9TRU5TSVRJVkVfVEFHUyA9IHtcbiAgcHJlOiB0cnVlLFxuICB0ZXh0YXJlYTogdHJ1ZSxcbn07XG5cbnZhciBJTlRFUk5BTF9WQVJJQUJMRVMgPSBbXG4gICdwdWcnLFxuICAncHVnX21peGlucycsXG4gICdwdWdfaW50ZXJwJyxcbiAgJ3B1Z19kZWJ1Z19maWxlbmFtZScsXG4gICdwdWdfZGVidWdfbGluZScsXG4gICdwdWdfZGVidWdfc291cmNlcycsXG4gICdwdWdfaHRtbCcsXG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlbmVyYXRlQ29kZTtcbm1vZHVsZS5leHBvcnRzLkNvZGVHZW5lcmF0b3IgPSBDb21waWxlcjtcbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZShhc3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDb21waWxlcihhc3QsIG9wdGlvbnMpLmNvbXBpbGUoKTtcbn1cblxuZnVuY3Rpb24gaXNDb25zdGFudChzcmMpIHtcbiAgcmV0dXJuIGNvbnN0YW50aW5vcGxlKHNyYywge3B1ZzogcnVudGltZSwgcHVnX2ludGVycDogdW5kZWZpbmVkfSk7XG59XG5mdW5jdGlvbiB0b0NvbnN0YW50KHNyYykge1xuICByZXR1cm4gY29uc3RhbnRpbm9wbGUudG9Db25zdGFudChzcmMsIHtwdWc6IHJ1bnRpbWUsIHB1Z19pbnRlcnA6IHVuZGVmaW5lZH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYENvbXBpbGVyYCB3aXRoIHRoZSBnaXZlbiBgbm9kZWAuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBDb21waWxlcihub2RlLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50ID0gMDtcbiAgdGhpcy5oYXNDb21waWxlZERvY3R5cGUgPSBmYWxzZTtcbiAgdGhpcy5oYXNDb21waWxlZFRhZyA9IGZhbHNlO1xuICB0aGlzLnBwID0gb3B0aW9ucy5wcmV0dHkgfHwgZmFsc2U7XG4gIGlmICh0aGlzLnBwICYmIHR5cGVvZiB0aGlzLnBwICE9PSAnc3RyaW5nJykge1xuICAgIHRoaXMucHAgPSAnICAnO1xuICB9XG4gIGlmICh0aGlzLnBwICYmICEvXlxccyskLy50ZXN0KHRoaXMucHApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1RoZSBwcmV0dHkgcGFyYW1ldGVyIHNob3VsZCBlaXRoZXIgYmUgYSBib29sZWFuIG9yIHdoaXRlc3BhY2Ugb25seSBzdHJpbmcnXG4gICAgKTtcbiAgfVxuICB0aGlzLmRlYnVnID0gZmFsc2UgIT09IG9wdGlvbnMuY29tcGlsZURlYnVnO1xuICB0aGlzLmluZGVudHMgPSAwO1xuICB0aGlzLnBhcmVudEluZGVudHMgPSAwO1xuICB0aGlzLnRlcnNlID0gZmFsc2U7XG4gIHRoaXMubWl4aW5zID0ge307XG4gIHRoaXMuZHluYW1pY01peGlucyA9IGZhbHNlO1xuICB0aGlzLmVhY2hDb3VudCA9IDA7XG4gIGlmIChvcHRpb25zLmRvY3R5cGUpIHRoaXMuc2V0RG9jdHlwZShvcHRpb25zLmRvY3R5cGUpO1xuICB0aGlzLnJ1bnRpbWVGdW5jdGlvbnNVc2VkID0gW107XG4gIHRoaXMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyA9IG9wdGlvbnMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyB8fCBmYWxzZTtcbiAgaWYgKHRoaXMuZGVidWcgJiYgdGhpcy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zKSB7XG4gICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5wdXNoKCdyZXRocm93Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21waWxlciBwcm90b3R5cGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlID0ge1xuICBydW50aW1lOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKHRoaXMuaW5saW5lUnVudGltZUZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5wdXNoKG5hbWUpO1xuICAgICAgcmV0dXJuICdwdWdfJyArIG5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncHVnLicgKyBuYW1lO1xuICAgIH1cbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgY29kZSwgbm9kZSkge1xuICAgIHZhciBlcnIgPSBtYWtlRXJyb3IoY29kZSwgbWVzc2FnZSwge1xuICAgICAgbGluZTogbm9kZS5saW5lLFxuICAgICAgY29sdW1uOiBub2RlLmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiBub2RlLmZpbGVuYW1lLFxuICAgIH0pO1xuICAgIHRocm93IGVycjtcbiAgfSxcblxuICAvKipcbiAgICogQ29tcGlsZSBwYXJzZSB0cmVlIHRvIEphdmFTY3JpcHQuXG4gICAqXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGNvbXBpbGU6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYnVmID0gW107XG4gICAgaWYgKHRoaXMucHApIHRoaXMuYnVmLnB1c2goJ3ZhciBwdWdfaW5kZW50ID0gW107Jyk7XG4gICAgdGhpcy5sYXN0QnVmZmVyZWRJZHggPSAtMTtcbiAgICB0aGlzLnZpc2l0KHRoaXMubm9kZSk7XG4gICAgaWYgKCF0aGlzLmR5bmFtaWNNaXhpbnMpIHtcbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBkeW5hbWljIG1peGlucyB3ZSBjYW4gcmVtb3ZlIGFueSB1bi11c2VkIG1peGluc1xuICAgICAgdmFyIG1peGluTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLm1peGlucyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1peGluTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1peGluID0gdGhpcy5taXhpbnNbbWl4aW5OYW1lc1tpXV07XG4gICAgICAgIGlmICghbWl4aW4udXNlZCkge1xuICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgbWl4aW4uaW5zdGFuY2VzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICB2YXIgeSA9IG1peGluLmluc3RhbmNlc1t4XS5zdGFydDtcbiAgICAgICAgICAgICAgeSA8IG1peGluLmluc3RhbmNlc1t4XS5lbmQ7XG4gICAgICAgICAgICAgIHkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuYnVmW3ldID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBqcyA9IHRoaXMuYnVmLmpvaW4oJ1xcbicpO1xuICAgIHZhciBnbG9iYWxzID0gdGhpcy5vcHRpb25zLmdsb2JhbHNcbiAgICAgID8gdGhpcy5vcHRpb25zLmdsb2JhbHMuY29uY2F0KElOVEVSTkFMX1ZBUklBQkxFUylcbiAgICAgIDogSU5URVJOQUxfVkFSSUFCTEVTO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZikge1xuICAgICAganMgPSAndmFyIHNlbGYgPSBsb2NhbHMgfHwge307JyArIGpzO1xuICAgIH0gZWxzZSB7XG4gICAgICBqcyA9IGFkZFdpdGgoXG4gICAgICAgICdsb2NhbHMgfHwge30nLFxuICAgICAgICBqcyxcbiAgICAgICAgZ2xvYmFscy5jb25jYXQoXG4gICAgICAgICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5tYXAoZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuICdwdWdfJyArIG5hbWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5jbHVkZVNvdXJjZXMpIHtcbiAgICAgICAganMgPVxuICAgICAgICAgICd2YXIgcHVnX2RlYnVnX3NvdXJjZXMgPSAnICtcbiAgICAgICAgICBzdHJpbmdpZnkodGhpcy5vcHRpb25zLmluY2x1ZGVTb3VyY2VzKSArXG4gICAgICAgICAgJztcXG4nICtcbiAgICAgICAgICBqcztcbiAgICAgIH1cbiAgICAgIGpzID1cbiAgICAgICAgJ3ZhciBwdWdfZGVidWdfZmlsZW5hbWUsIHB1Z19kZWJ1Z19saW5lOycgK1xuICAgICAgICAndHJ5IHsnICtcbiAgICAgICAganMgK1xuICAgICAgICAnfSBjYXRjaCAoZXJyKSB7JyArXG4gICAgICAgICh0aGlzLmlubGluZVJ1bnRpbWVGdW5jdGlvbnMgPyAncHVnX3JldGhyb3cnIDogJ3B1Zy5yZXRocm93JykgK1xuICAgICAgICAnKGVyciwgcHVnX2RlYnVnX2ZpbGVuYW1lLCBwdWdfZGVidWdfbGluZScgK1xuICAgICAgICAodGhpcy5vcHRpb25zLmluY2x1ZGVTb3VyY2VzXG4gICAgICAgICAgPyAnLCBwdWdfZGVidWdfc291cmNlc1twdWdfZGVidWdfZmlsZW5hbWVdJ1xuICAgICAgICAgIDogJycpICtcbiAgICAgICAgJyk7JyArXG4gICAgICAgICd9JztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGJ1aWxkUnVudGltZSh0aGlzLnJ1bnRpbWVGdW5jdGlvbnNVc2VkKSArXG4gICAgICAnZnVuY3Rpb24gJyArXG4gICAgICAodGhpcy5vcHRpb25zLnRlbXBsYXRlTmFtZSB8fCAndGVtcGxhdGUnKSArXG4gICAgICAnKGxvY2Fscykge3ZhciBwdWdfaHRtbCA9IFwiXCIsIHB1Z19taXhpbnMgPSB7fSwgcHVnX2ludGVycDsnICtcbiAgICAgIGpzICtcbiAgICAgICc7cmV0dXJuIHB1Z19odG1sO30nXG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBkb2N0eXBlIGBuYW1lYC4gU2V0cyB0ZXJzZSBtb2RlIHRvIGB0cnVlYCB3aGVuXG4gICAqIGh0bWwgNSBpcyB1c2VkLCBjYXVzaW5nIHNlbGYtY2xvc2luZyB0YWdzIHRvIGVuZCB3aXRoIFwiPlwiIHZzIFwiLz5cIixcbiAgICogYW5kIGJvb2xlYW4gYXR0cmlidXRlcyBhcmUgbm90IG1pcnJvcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBzZXREb2N0eXBlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdGhpcy5kb2N0eXBlID0gZG9jdHlwZXNbbmFtZS50b0xvd2VyQ2FzZSgpXSB8fCAnPCFET0NUWVBFICcgKyBuYW1lICsgJz4nO1xuICAgIHRoaXMudGVyc2UgPSB0aGlzLmRvY3R5cGUudG9Mb3dlckNhc2UoKSA9PSAnPCFkb2N0eXBlIGh0bWw+JztcbiAgICB0aGlzLnhtbCA9IDAgPT0gdGhpcy5kb2N0eXBlLmluZGV4T2YoJzw/eG1sJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGUgZ2l2ZW4gYHN0cmAgZXhhY3RseSBhcyBpcyBvciB3aXRoIGludGVycG9sYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGludGVycG9sYXRlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGJ1ZmZlcjogZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgc3RyID0gc3RyaW5naWZ5KHN0cik7XG4gICAgc3RyID0gc3RyLnN1YnN0cigxLCBzdHIubGVuZ3RoIC0gMik7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9PSB0aGlzLmJ1Zi5sZW5ndGggJiZcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPCAxMDBcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPT09ICdjb2RlJykge1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArPSAnICsgXCInO1xuICAgICAgICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50Kys7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAndGV4dCc7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZCArPSBzdHI7XG4gICAgICB0aGlzLmJ1Zlt0aGlzLmxhc3RCdWZmZXJlZElkeCAtIDFdID1cbiAgICAgICAgJ3B1Z19odG1sID0gcHVnX2h0bWwgKyAnICtcbiAgICAgICAgdGhpcy5idWZmZXJTdGFydENoYXIgK1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArXG4gICAgICAgICdcIjsnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50ID0gMDtcbiAgICAgIHRoaXMuYnVmLnB1c2goJ3B1Z19odG1sID0gcHVnX2h0bWwgKyBcIicgKyBzdHIgKyAnXCI7Jyk7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAndGV4dCc7XG4gICAgICB0aGlzLmJ1ZmZlclN0YXJ0Q2hhciA9ICdcIic7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZCA9IHN0cjtcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkSWR4ID0gdGhpcy5idWYubGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQnVmZmVyIHRoZSBnaXZlbiBgc3JjYCBzbyBpdCBpcyBldmFsdWF0ZWQgYXQgcnVuIHRpbWVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBidWZmZXJFeHByZXNzaW9uOiBmdW5jdGlvbihzcmMpIHtcbiAgICBpZiAoaXNDb25zdGFudChzcmMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXIodG9Db25zdGFudChzcmMpICsgJycpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9PSB0aGlzLmJ1Zi5sZW5ndGggJiZcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPCAxMDBcbiAgICApIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQrKztcbiAgICAgIGlmICh0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPT09ICd0ZXh0JykgdGhpcy5sYXN0QnVmZmVyZWQgKz0gJ1wiJztcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkVHlwZSA9ICdjb2RlJztcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkICs9ICcgKyAoJyArIHNyYyArICcpJztcbiAgICAgIHRoaXMuYnVmW3RoaXMubGFzdEJ1ZmZlcmVkSWR4IC0gMV0gPVxuICAgICAgICAncHVnX2h0bWwgPSBwdWdfaHRtbCArICgnICtcbiAgICAgICAgdGhpcy5idWZmZXJTdGFydENoYXIgK1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArXG4gICAgICAgICcpOyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPSAwO1xuICAgICAgdGhpcy5idWYucHVzaCgncHVnX2h0bWwgPSBwdWdfaHRtbCArICgnICsgc3JjICsgJyk7Jyk7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAnY29kZSc7XG4gICAgICB0aGlzLmJ1ZmZlclN0YXJ0Q2hhciA9ICcnO1xuICAgICAgdGhpcy5sYXN0QnVmZmVyZWQgPSAnKCcgKyBzcmMgKyAnKSc7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9IHRoaXMuYnVmLmxlbmd0aDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBhbiBpbmRlbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgYGluZGVudGBcbiAgICogcHJvcGVydHkgYW5kIGFuIGFkZGl0aW9uYWwgYG9mZnNldGAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBuZXdsaW5lXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHByZXR0eUluZGVudDogZnVuY3Rpb24ob2Zmc2V0LCBuZXdsaW5lKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgbmV3bGluZSA9IG5ld2xpbmUgPyAnXFxuJyA6ICcnO1xuICAgIHRoaXMuYnVmZmVyKG5ld2xpbmUgKyBBcnJheSh0aGlzLmluZGVudHMgKyBvZmZzZXQpLmpvaW4odGhpcy5wcCkpO1xuICAgIGlmICh0aGlzLnBhcmVudEluZGVudHMpXG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdwdWdfaHRtbCA9IHB1Z19odG1sICsgcHVnX2luZGVudC5qb2luKFwiXCIpOycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgbm9kZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdDogZnVuY3Rpb24obm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIGRlYnVnID0gdGhpcy5kZWJ1ZztcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgdmFyIG1zZztcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgbXNnID1cbiAgICAgICAgICAnQSBjaGlsZCBvZiAnICtcbiAgICAgICAgICBwYXJlbnQudHlwZSArXG4gICAgICAgICAgJyAoJyArXG4gICAgICAgICAgKHBhcmVudC5maWxlbmFtZSB8fCAnUHVnJykgK1xuICAgICAgICAgICc6JyArXG4gICAgICAgICAgcGFyZW50LmxpbmUgK1xuICAgICAgICAgICcpJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1zZyA9ICdBIHRvcC1sZXZlbCBub2RlJztcbiAgICAgIH1cbiAgICAgIG1zZyArPSAnIGlzICcgKyBub2RlICsgJywgZXhwZWN0ZWQgYSBQdWcgQVNUIE5vZGUuJztcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcgJiYgbm9kZS5kZWJ1ZyAhPT0gZmFsc2UgJiYgbm9kZS50eXBlICE9PSAnQmxvY2snKSB7XG4gICAgICBpZiAobm9kZS5saW5lKSB7XG4gICAgICAgIHZhciBqcyA9ICc7cHVnX2RlYnVnX2xpbmUgPSAnICsgbm9kZS5saW5lO1xuICAgICAgICBpZiAobm9kZS5maWxlbmFtZSlcbiAgICAgICAgICBqcyArPSAnO3B1Z19kZWJ1Z19maWxlbmFtZSA9ICcgKyBzdHJpbmdpZnkobm9kZS5maWxlbmFtZSk7XG4gICAgICAgIHRoaXMuYnVmLnB1c2goanMgKyAnOycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpc1sndmlzaXQnICsgbm9kZS50eXBlXSkge1xuICAgICAgdmFyIG1zZztcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgbXNnID0gJ0EgY2hpbGQgb2YgJyArIHBhcmVudC50eXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXNnID0gJ0EgdG9wLWxldmVsIG5vZGUnO1xuICAgICAgfVxuICAgICAgbXNnICs9XG4gICAgICAgICcgKCcgK1xuICAgICAgICAobm9kZS5maWxlbmFtZSB8fCAnUHVnJykgK1xuICAgICAgICAnOicgK1xuICAgICAgICBub2RlLmxpbmUgK1xuICAgICAgICAnKScgK1xuICAgICAgICAnIGlzIG9mIHR5cGUgJyArXG4gICAgICAgIG5vZGUudHlwZSArXG4gICAgICAgICcsJyArXG4gICAgICAgICcgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBwdWctY29kZS1nZW4uJztcbiAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0ZpbHRlcic6XG4gICAgICAgICAgbXNnICs9ICcgUGxlYXNlIHVzZSBwdWctZmlsdGVycyB0byBwcmVwcm9jZXNzIHRoaXMgQVNULic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0V4dGVuZHMnOlxuICAgICAgICBjYXNlICdJbmNsdWRlJzpcbiAgICAgICAgY2FzZSAnTmFtZWRCbG9jayc6XG4gICAgICAgIGNhc2UgJ0ZpbGVSZWZlcmVuY2UnOiAvLyB1bmxpa2VseSBidXQgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzc1xuICAgICAgICAgIG1zZyArPSAnIFBsZWFzZSB1c2UgcHVnLWxpbmtlciB0byBwcmVwcm9jZXNzIHRoaXMgQVNULic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy52aXNpdE5vZGUobm9kZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiB0aGlzWyd2aXNpdCcgKyBub2RlLnR5cGVdKG5vZGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBjYXNlIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Q2FzZTogZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMuYnVmLnB1c2goJ3N3aXRjaCAoJyArIG5vZGUuZXhwciArICcpeycpO1xuICAgIHRoaXMudmlzaXQobm9kZS5ibG9jaywgbm9kZSk7XG4gICAgdGhpcy5idWYucHVzaCgnfScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCB3aGVuIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0V2hlbjogZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICgnZGVmYXVsdCcgPT0gbm9kZS5leHByKSB7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdkZWZhdWx0OicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdjYXNlICcgKyBub2RlLmV4cHIgKyAnOicpO1xuICAgIH1cbiAgICBpZiAobm9kZS5ibG9jaykge1xuICAgICAgdGhpcy52aXNpdChub2RlLmJsb2NrLCBub2RlKTtcbiAgICAgIHRoaXMuYnVmLnB1c2goJyAgYnJlYWs7Jyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBsaXRlcmFsIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0TGl0ZXJhbDogZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMuYnVmZmVyKG5vZGUuc3RyKTtcbiAgfSxcblxuICB2aXNpdE5hbWVkQmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRCbG9jayhibG9jayk7XG4gIH0sXG4gIC8qKlxuICAgKiBWaXNpdCBhbGwgbm9kZXMgaW4gYGJsb2NrYC5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ja30gYmxvY2tcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRCbG9jazogZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgZXNjYXBlUHJldHR5TW9kZSA9IHRoaXMuZXNjYXBlUHJldHR5TW9kZTtcbiAgICB2YXIgcHAgPSB0aGlzLnBwO1xuXG4gICAgLy8gUHJldHR5IHByaW50IG11bHRpLWxpbmUgdGV4dFxuICAgIGlmIChcbiAgICAgIHBwICYmXG4gICAgICBibG9jay5ub2Rlcy5sZW5ndGggPiAxICYmXG4gICAgICAhZXNjYXBlUHJldHR5TW9kZSAmJlxuICAgICAgYmxvY2subm9kZXNbMF0udHlwZSA9PT0gJ1RleHQnICYmXG4gICAgICBibG9jay5ub2Rlc1sxXS50eXBlID09PSAnVGV4dCdcbiAgICApIHtcbiAgICAgIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrLm5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBQcmV0dHkgcHJpbnQgdGV4dFxuICAgICAgaWYgKFxuICAgICAgICBwcCAmJlxuICAgICAgICBpID4gMCAmJlxuICAgICAgICAhZXNjYXBlUHJldHR5TW9kZSAmJlxuICAgICAgICBibG9jay5ub2Rlc1tpXS50eXBlID09PSAnVGV4dCcgJiZcbiAgICAgICAgYmxvY2subm9kZXNbaSAtIDFdLnR5cGUgPT09ICdUZXh0JyAmJlxuICAgICAgICAvXFxuJC8udGVzdChibG9jay5ub2Rlc1tpIC0gMV0udmFsKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucHJldHR5SW5kZW50KDEsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlzaXQoYmxvY2subm9kZXNbaV0sIGJsb2NrKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGEgbWl4aW4ncyBgYmxvY2tgIGtleXdvcmQuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4aW5CbG9ja30gYmxvY2tcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRNaXhpbkJsb2NrOiBmdW5jdGlvbihibG9jaykge1xuICAgIGlmICh0aGlzLnBwKVxuICAgICAgdGhpcy5idWYucHVzaChcbiAgICAgICAgJ3B1Z19pbmRlbnQucHVzaCgnICtcbiAgICAgICAgICBzdHJpbmdpZnkoQXJyYXkodGhpcy5pbmRlbnRzICsgMSkuam9pbih0aGlzLnBwKSkgK1xuICAgICAgICAgICcpOydcbiAgICAgICk7XG4gICAgdGhpcy5idWYucHVzaCgnYmxvY2sgJiYgYmxvY2soKTsnKTtcbiAgICBpZiAodGhpcy5wcCkgdGhpcy5idWYucHVzaCgncHVnX2luZGVudC5wb3AoKTsnKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYGRvY3R5cGVgLiBTZXRzIHRlcnNlIG1vZGUgdG8gYHRydWVgIHdoZW4gaHRtbCA1XG4gICAqIGlzIHVzZWQsIGNhdXNpbmcgc2VsZi1jbG9zaW5nIHRhZ3MgdG8gZW5kIHdpdGggXCI+XCIgdnMgXCIvPlwiLFxuICAgKiBhbmQgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgbWlycm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RG9jdHlwZX0gZG9jdHlwZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdERvY3R5cGU6IGZ1bmN0aW9uKGRvY3R5cGUpIHtcbiAgICBpZiAoZG9jdHlwZSAmJiAoZG9jdHlwZS52YWwgfHwgIXRoaXMuZG9jdHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0RG9jdHlwZShkb2N0eXBlLnZhbCB8fCAnaHRtbCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvY3R5cGUpIHRoaXMuYnVmZmVyKHRoaXMuZG9jdHlwZSk7XG4gICAgdGhpcy5oYXNDb21waWxlZERvY3R5cGUgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgbWl4aW5gLCBnZW5lcmF0aW5nIGEgZnVuY3Rpb24gdGhhdFxuICAgKiBtYXkgYmUgY2FsbGVkIHdpdGhpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4aW59IG1peGluXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0TWl4aW46IGZ1bmN0aW9uKG1peGluKSB7XG4gICAgdmFyIG5hbWUgPSAncHVnX21peGluc1snO1xuICAgIHZhciBhcmdzID0gbWl4aW4uYXJncyB8fCAnJztcbiAgICB2YXIgYmxvY2sgPSBtaXhpbi5ibG9jaztcbiAgICB2YXIgYXR0cnMgPSBtaXhpbi5hdHRycztcbiAgICB2YXIgYXR0cnNCbG9ja3MgPSB0aGlzLmF0dHJpYnV0ZUJsb2NrcyhtaXhpbi5hdHRyaWJ1dGVCbG9ja3MpO1xuICAgIHZhciBwcCA9IHRoaXMucHA7XG4gICAgdmFyIGR5bmFtaWMgPSBtaXhpbi5uYW1lWzBdID09PSAnIyc7XG4gICAgdmFyIGtleSA9IG1peGluLm5hbWU7XG4gICAgaWYgKGR5bmFtaWMpIHRoaXMuZHluYW1pY01peGlucyA9IHRydWU7XG4gICAgbmFtZSArPVxuICAgICAgKGR5bmFtaWNcbiAgICAgICAgPyBtaXhpbi5uYW1lLnN1YnN0cigyLCBtaXhpbi5uYW1lLmxlbmd0aCAtIDMpXG4gICAgICAgIDogJ1wiJyArIG1peGluLm5hbWUgKyAnXCInKSArICddJztcblxuICAgIHRoaXMubWl4aW5zW2tleV0gPSB0aGlzLm1peGluc1trZXldIHx8IHt1c2VkOiBmYWxzZSwgaW5zdGFuY2VzOiBbXX07XG4gICAgaWYgKG1peGluLmNhbGwpIHtcbiAgICAgIHRoaXMubWl4aW5zW2tleV0udXNlZCA9IHRydWU7XG4gICAgICBpZiAocHApXG4gICAgICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAgICAgJ3B1Z19pbmRlbnQucHVzaCgnICtcbiAgICAgICAgICAgIHN0cmluZ2lmeShBcnJheSh0aGlzLmluZGVudHMgKyAxKS5qb2luKHBwKSkgK1xuICAgICAgICAgICAgJyk7J1xuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NrIHx8IGF0dHJzLmxlbmd0aCB8fCBhdHRyc0Jsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5idWYucHVzaChuYW1lICsgJy5jYWxsKHsnKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCdibG9jazogZnVuY3Rpb24oKXsnKTtcblxuICAgICAgICAgIC8vIFJlbmRlciBibG9jayB3aXRoIG5vIGluZGVudHMsIGR5bmFtaWNhbGx5IGFkZGVkIHdoZW4gcmVuZGVyZWRcbiAgICAgICAgICB0aGlzLnBhcmVudEluZGVudHMrKztcbiAgICAgICAgICB2YXIgX2luZGVudHMgPSB0aGlzLmluZGVudHM7XG4gICAgICAgICAgdGhpcy5pbmRlbnRzID0gMDtcbiAgICAgICAgICB0aGlzLnZpc2l0KG1peGluLmJsb2NrLCBtaXhpbik7XG4gICAgICAgICAgdGhpcy5pbmRlbnRzID0gX2luZGVudHM7XG4gICAgICAgICAgdGhpcy5wYXJlbnRJbmRlbnRzLS07XG5cbiAgICAgICAgICBpZiAoYXR0cnMubGVuZ3RoIHx8IGF0dHJzQmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnfSwnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnfScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyc0Jsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5hdHRycyhhdHRycyk7XG4gICAgICAgICAgICBhdHRyc0Jsb2Nrcy51bnNoaWZ0KHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRyc0Jsb2Nrcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgICAgICAgICAnYXR0cmlidXRlczogJyArXG4gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lKCdtZXJnZScpICtcbiAgICAgICAgICAgICAgICAnKFsnICtcbiAgICAgICAgICAgICAgICBhdHRyc0Jsb2Nrcy5qb2luKCcsJykgK1xuICAgICAgICAgICAgICAgICddKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJ2F0dHJpYnV0ZXM6ICcgKyBhdHRyc0Jsb2Nrc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmF0dHJzKGF0dHJzKTtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCdhdHRyaWJ1dGVzOiAnICsgdmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgICAgdGhpcy5idWYucHVzaCgnfSwgJyArIGFyZ3MgKyAnKTsnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9KTsnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWYucHVzaChuYW1lICsgJygnICsgYXJncyArICcpOycpO1xuICAgICAgfVxuICAgICAgaWYgKHBwKSB0aGlzLmJ1Zi5wdXNoKCdwdWdfaW5kZW50LnBvcCgpOycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWl4aW5fc3RhcnQgPSB0aGlzLmJ1Zi5sZW5ndGg7XG4gICAgICBhcmdzID0gYXJncyA/IGFyZ3Muc3BsaXQoJywnKSA6IFtdO1xuICAgICAgdmFyIHJlc3Q7XG4gICAgICBpZiAoYXJncy5sZW5ndGggJiYgL15cXC5cXC5cXC4vLnRlc3QoYXJnc1thcmdzLmxlbmd0aCAtIDFdLnRyaW0oKSkpIHtcbiAgICAgICAgcmVzdCA9IGFyZ3NcbiAgICAgICAgICAucG9wKClcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnJlcGxhY2UoL15cXC5cXC5cXC4vLCAnJyk7XG4gICAgICB9XG4gICAgICAvLyB3ZSBuZWVkIHVzZSBwdWdfaW50ZXJwIGhlcmUgZm9yIHY4OiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDE2NVxuICAgICAgLy8gb25jZSBmaXhlZCwgdXNlIHRoaXM6IHRoaXMuYnVmLnB1c2gobmFtZSArICcgPSBmdW5jdGlvbignICsgYXJncy5qb2luKCcsJykgKyAnKXsnKTtcbiAgICAgIHRoaXMuYnVmLnB1c2gobmFtZSArICcgPSBwdWdfaW50ZXJwID0gZnVuY3Rpb24oJyArIGFyZ3Muam9pbignLCcpICsgJyl7Jyk7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgICAndmFyIGJsb2NrID0gKHRoaXMgJiYgdGhpcy5ibG9jayksIGF0dHJpYnV0ZXMgPSAodGhpcyAmJiB0aGlzLmF0dHJpYnV0ZXMpIHx8IHt9OydcbiAgICAgICk7XG4gICAgICBpZiAocmVzdCkge1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd2YXIgJyArIHJlc3QgKyAnID0gW107Jyk7XG4gICAgICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAgICAgJ2ZvciAocHVnX2ludGVycCA9ICcgK1xuICAgICAgICAgICAgYXJncy5sZW5ndGggK1xuICAgICAgICAgICAgJzsgcHVnX2ludGVycCA8IGFyZ3VtZW50cy5sZW5ndGg7IHB1Z19pbnRlcnArKykgeydcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnICAnICsgcmVzdCArICcucHVzaChhcmd1bWVudHNbcHVnX2ludGVycF0pOycpO1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudEluZGVudHMrKztcbiAgICAgIHRoaXMudmlzaXQoYmxvY2ssIG1peGluKTtcbiAgICAgIHRoaXMucGFyZW50SW5kZW50cy0tO1xuICAgICAgdGhpcy5idWYucHVzaCgnfTsnKTtcbiAgICAgIHZhciBtaXhpbl9lbmQgPSB0aGlzLmJ1Zi5sZW5ndGg7XG4gICAgICB0aGlzLm1peGluc1trZXldLmluc3RhbmNlcy5wdXNoKHtzdGFydDogbWl4aW5fc3RhcnQsIGVuZDogbWl4aW5fZW5kfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgdGFnYCBidWZmZXJpbmcgdGFnIG1hcmt1cCwgZ2VuZXJhdGluZ1xuICAgKiBhdHRyaWJ1dGVzLCB2aXNpdGluZyB0aGUgYHRhZ2AncyBjb2RlIGFuZCBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHtUYWd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGludGVycG9sYXRlZFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdFRhZzogZnVuY3Rpb24odGFnLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB0aGlzLmluZGVudHMrKztcbiAgICB2YXIgbmFtZSA9IHRhZy5uYW1lLFxuICAgICAgcHAgPSB0aGlzLnBwLFxuICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBidWZmZXJOYW1lKCkge1xuICAgICAgaWYgKGludGVycG9sYXRlZCkgc2VsZi5idWZmZXJFeHByZXNzaW9uKHRhZy5leHByKTtcbiAgICAgIGVsc2Ugc2VsZi5idWZmZXIobmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKFdISVRFX1NQQUNFX1NFTlNJVElWRV9UQUdTW3RhZy5uYW1lXSA9PT0gdHJ1ZSlcbiAgICAgIHRoaXMuZXNjYXBlUHJldHR5TW9kZSA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuaGFzQ29tcGlsZWRUYWcpIHtcbiAgICAgIGlmICghdGhpcy5oYXNDb21waWxlZERvY3R5cGUgJiYgJ2h0bWwnID09IG5hbWUpIHtcbiAgICAgICAgdGhpcy52aXNpdERvY3R5cGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFzQ29tcGlsZWRUYWcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHByZXR0eSBwcmludFxuICAgIGlmIChwcCAmJiAhdGFnLmlzSW5saW5lKSB0aGlzLnByZXR0eUluZGVudCgwLCB0cnVlKTtcbiAgICBpZiAodGFnLnNlbGZDbG9zaW5nIHx8ICghdGhpcy54bWwgJiYgc2VsZkNsb3NpbmdbdGFnLm5hbWVdKSkge1xuICAgICAgdGhpcy5idWZmZXIoJzwnKTtcbiAgICAgIGJ1ZmZlck5hbWUoKTtcbiAgICAgIHRoaXMudmlzaXRBdHRyaWJ1dGVzKFxuICAgICAgICB0YWcuYXR0cnMsXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQmxvY2tzKHRhZy5hdHRyaWJ1dGVCbG9ja3MpXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMudGVyc2UgJiYgIXRhZy5zZWxmQ2xvc2luZykge1xuICAgICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXIoJy8+Jyk7XG4gICAgICB9XG4gICAgICAvLyBpZiBpdCBpcyBub24tZW1wdHkgdGhyb3cgYW4gZXJyb3JcbiAgICAgIGlmIChcbiAgICAgICAgdGFnLmNvZGUgfHxcbiAgICAgICAgKHRhZy5ibG9jayAmJlxuICAgICAgICAgICEodGFnLmJsb2NrLnR5cGUgPT09ICdCbG9jaycgJiYgdGFnLmJsb2NrLm5vZGVzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICAgICB0YWcuYmxvY2subm9kZXMuc29tZShmdW5jdGlvbih0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcudHlwZSAhPT0gJ1RleHQnIHx8ICEvXlxccyokLy50ZXN0KHRhZy52YWwpO1xuICAgICAgICAgIH0pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgICAnIGlzIGEgc2VsZiBjbG9zaW5nIGVsZW1lbnQ6IDwnICtcbiAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgJy8+IGJ1dCBjb250YWlucyBuZXN0ZWQgY29udGVudC4nLFxuICAgICAgICAgICdTRUxGX0NMT1NJTkdfQ09OVEVOVCcsXG4gICAgICAgICAgdGFnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9wdGltaXplIGF0dHJpYnV0ZXMgYnVmZmVyaW5nXG4gICAgICB0aGlzLmJ1ZmZlcignPCcpO1xuICAgICAgYnVmZmVyTmFtZSgpO1xuICAgICAgdGhpcy52aXNpdEF0dHJpYnV0ZXMoXG4gICAgICAgIHRhZy5hdHRycyxcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVCbG9ja3ModGFnLmF0dHJpYnV0ZUJsb2NrcylcbiAgICAgICk7XG4gICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgICAgaWYgKHRhZy5jb2RlKSB0aGlzLnZpc2l0Q29kZSh0YWcuY29kZSk7XG4gICAgICB0aGlzLnZpc2l0KHRhZy5ibG9jaywgdGFnKTtcblxuICAgICAgLy8gcHJldHR5IHByaW50XG4gICAgICBpZiAoXG4gICAgICAgIHBwICYmXG4gICAgICAgICF0YWcuaXNJbmxpbmUgJiZcbiAgICAgICAgV0hJVEVfU1BBQ0VfU0VOU0lUSVZFX1RBR1NbdGFnLm5hbWVdICE9PSB0cnVlICYmXG4gICAgICAgICF0YWdDYW5JbmxpbmUodGFnKVxuICAgICAgKVxuICAgICAgICB0aGlzLnByZXR0eUluZGVudCgwLCB0cnVlKTtcblxuICAgICAgdGhpcy5idWZmZXIoJzwvJyk7XG4gICAgICBidWZmZXJOYW1lKCk7XG4gICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgIH1cblxuICAgIGlmIChXSElURV9TUEFDRV9TRU5TSVRJVkVfVEFHU1t0YWcubmFtZV0gPT09IHRydWUpXG4gICAgICB0aGlzLmVzY2FwZVByZXR0eU1vZGUgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5kZW50cy0tO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBJbnRlcnBvbGF0ZWRUYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7SW50ZXJwb2xhdGVkVGFnfSB0YWdcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRJbnRlcnBvbGF0ZWRUYWc6IGZ1bmN0aW9uKHRhZykge1xuICAgIHJldHVybiB0aGlzLnZpc2l0VGFnKHRhZywgdHJ1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGB0ZXh0YCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHR9IHRleHRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRUZXh0OiBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdGhpcy5idWZmZXIodGV4dC52YWwpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBhIGBjb21tZW50YCwgb25seSBidWZmZXJpbmcgd2hlbiB0aGUgYnVmZmVyIGZsYWcgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1lbnR9IGNvbW1lbnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRDb21tZW50OiBmdW5jdGlvbihjb21tZW50KSB7XG4gICAgaWYgKCFjb21tZW50LmJ1ZmZlcikgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBwKSB0aGlzLnByZXR0eUluZGVudCgxLCB0cnVlKTtcbiAgICB0aGlzLmJ1ZmZlcignPCEtLScgKyBjb21tZW50LnZhbCArICctLT4nKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYSBgWWllbGRCbG9ja2AuXG4gICAqXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGFsbG93IGNvbXBpbGluZyBhIGZpbGUgd2l0aCBgeWllbGRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1lpZWxkQmxvY2t9IGJsb2NrXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0WWllbGRCbG9jazogZnVuY3Rpb24oYmxvY2spIHt9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBhIGBCbG9ja0NvbW1lbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1lbnR9IGNvbW1lbnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRCbG9ja0NvbW1lbnQ6IGZ1bmN0aW9uKGNvbW1lbnQpIHtcbiAgICBpZiAoIWNvbW1lbnQuYnVmZmVyKSByZXR1cm47XG4gICAgaWYgKHRoaXMucHApIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIHRoaXMuYnVmZmVyKCc8IS0tJyArIChjb21tZW50LnZhbCB8fCAnJykpO1xuICAgIHRoaXMudmlzaXQoY29tbWVudC5ibG9jaywgY29tbWVudCk7XG4gICAgaWYgKHRoaXMucHApIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIHRoaXMuYnVmZmVyKCctLT4nKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYGNvZGVgLCByZXNwZWN0aW5nIGJ1ZmZlciAvIGVzY2FwZSBmbGFncy5cbiAgICogSWYgdGhlIGNvZGUgaXMgZm9sbG93ZWQgYnkgYSBibG9jaywgd3JhcCBpdCBpblxuICAgKiBhIHNlbGYtY2FsbGluZyBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb2RlfSBjb2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Q29kZTogZnVuY3Rpb24oY29kZSkge1xuICAgIC8vIFdyYXAgY29kZSBibG9ja3Mgd2l0aCB7fS5cbiAgICAvLyB3ZSBvbmx5IHdyYXAgdW5idWZmZXJlZCBjb2RlIGJsb2NrcyBBVE1cbiAgICAvLyBzaW5jZSB0aGV5IGFyZSB1c3VhbGx5IGZsb3cgY29udHJvbFxuXG4gICAgLy8gQnVmZmVyIGNvZGVcbiAgICBpZiAoY29kZS5idWZmZXIpIHtcbiAgICAgIHZhciB2YWwgPSBjb2RlLnZhbC50cmltKCk7XG4gICAgICB2YWwgPSAnbnVsbCA9PSAocHVnX2ludGVycCA9ICcgKyB2YWwgKyAnKSA/IFwiXCIgOiBwdWdfaW50ZXJwJztcbiAgICAgIGlmIChjb2RlLm11c3RFc2NhcGUgIT09IGZhbHNlKVxuICAgICAgICB2YWwgPSB0aGlzLnJ1bnRpbWUoJ2VzY2FwZScpICsgJygnICsgdmFsICsgJyknO1xuICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmLnB1c2goY29kZS52YWwpO1xuICAgIH1cblxuICAgIC8vIEJsb2NrIHN1cHBvcnRcbiAgICBpZiAoY29kZS5ibG9jaykge1xuICAgICAgaWYgKCFjb2RlLmJ1ZmZlcikgdGhpcy5idWYucHVzaCgneycpO1xuICAgICAgdGhpcy52aXNpdChjb2RlLmJsb2NrLCBjb2RlKTtcbiAgICAgIGlmICghY29kZS5idWZmZXIpIHRoaXMuYnVmLnB1c2goJ30nKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBDb25kaXRpb25hbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uYWx9IGNvbmRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRDb25kaXRpb25hbDogZnVuY3Rpb24oY29uZCkge1xuICAgIHZhciB0ZXN0ID0gY29uZC50ZXN0O1xuICAgIHRoaXMuYnVmLnB1c2goJ2lmICgnICsgdGVzdCArICcpIHsnKTtcbiAgICB0aGlzLnZpc2l0KGNvbmQuY29uc2VxdWVudCwgY29uZCk7XG4gICAgdGhpcy5idWYucHVzaCgnfScpO1xuICAgIGlmIChjb25kLmFsdGVybmF0ZSkge1xuICAgICAgaWYgKGNvbmQuYWx0ZXJuYXRlLnR5cGUgPT09ICdDb25kaXRpb25hbCcpIHtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnZWxzZScpO1xuICAgICAgICB0aGlzLnZpc2l0Q29uZGl0aW9uYWwoY29uZC5hbHRlcm5hdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnZWxzZSB7Jyk7XG4gICAgICAgIHRoaXMudmlzaXQoY29uZC5hbHRlcm5hdGUsIGNvbmQpO1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgV2hpbGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1doaWxlfSBsb29wXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0V2hpbGU6IGZ1bmN0aW9uKGxvb3ApIHtcbiAgICB2YXIgdGVzdCA9IGxvb3AudGVzdDtcbiAgICB0aGlzLmJ1Zi5wdXNoKCd3aGlsZSAoJyArIHRlc3QgKyAnKSB7Jyk7XG4gICAgdGhpcy52aXNpdChsb29wLmJsb2NrLCBsb29wKTtcbiAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBlYWNoYCBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHtFYWNofSBlYWNoXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0RWFjaDogZnVuY3Rpb24oZWFjaCkge1xuICAgIHZhciBpbmRleFZhck5hbWUgPSBlYWNoLmtleSB8fCAncHVnX2luZGV4JyArIHRoaXMuZWFjaENvdW50O1xuICAgIHRoaXMuZWFjaENvdW50Kys7XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgJycgK1xuICAgICAgICAnLy8gaXRlcmF0ZSAnICtcbiAgICAgICAgZWFjaC5vYmogK1xuICAgICAgICAnXFxuJyArXG4gICAgICAgICc7KGZ1bmN0aW9uKCl7XFxuJyArXG4gICAgICAgICcgIHZhciAkJG9iaiA9ICcgK1xuICAgICAgICBlYWNoLm9iaiArXG4gICAgICAgICc7XFxuJyArXG4gICAgICAgIFwiICBpZiAoJ251bWJlcicgPT0gdHlwZW9mICQkb2JqLmxlbmd0aCkge1wiXG4gICAgKTtcblxuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIGlmICgkJG9iai5sZW5ndGgpIHsnKTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgJycgK1xuICAgICAgICAnICAgICAgZm9yICh2YXIgJyArXG4gICAgICAgIGluZGV4VmFyTmFtZSArXG4gICAgICAgICcgPSAwLCAkJGwgPSAkJG9iai5sZW5ndGg7ICcgK1xuICAgICAgICBpbmRleFZhck5hbWUgK1xuICAgICAgICAnIDwgJCRsOyAnICtcbiAgICAgICAgaW5kZXhWYXJOYW1lICtcbiAgICAgICAgJysrKSB7XFxuJyArXG4gICAgICAgICcgICAgICAgIHZhciAnICtcbiAgICAgICAgZWFjaC52YWwgK1xuICAgICAgICAnID0gJCRvYmpbJyArXG4gICAgICAgIGluZGV4VmFyTmFtZSArXG4gICAgICAgICddOydcbiAgICApO1xuXG4gICAgdGhpcy52aXNpdChlYWNoLmJsb2NrLCBlYWNoKTtcblxuICAgIHRoaXMuYnVmLnB1c2goJyAgICAgIH0nKTtcblxuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIH0gZWxzZSB7Jyk7XG4gICAgICB0aGlzLnZpc2l0KGVhY2guYWx0ZXJuYXRlLCBlYWNoKTtcbiAgICAgIHRoaXMuYnVmLnB1c2goJyAgICB9Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5idWYucHVzaChcbiAgICAgICcnICtcbiAgICAgICAgJyAgfSBlbHNlIHtcXG4nICtcbiAgICAgICAgJyAgICB2YXIgJCRsID0gMDtcXG4nICtcbiAgICAgICAgJyAgICBmb3IgKHZhciAnICtcbiAgICAgICAgaW5kZXhWYXJOYW1lICtcbiAgICAgICAgJyBpbiAkJG9iaikge1xcbicgK1xuICAgICAgICAnICAgICAgJCRsKys7XFxuJyArXG4gICAgICAgICcgICAgICB2YXIgJyArXG4gICAgICAgIGVhY2gudmFsICtcbiAgICAgICAgJyA9ICQkb2JqWycgK1xuICAgICAgICBpbmRleFZhck5hbWUgK1xuICAgICAgICAnXTsnXG4gICAgKTtcblxuICAgIHRoaXMudmlzaXQoZWFjaC5ibG9jaywgZWFjaCk7XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKCcgICAgfScpO1xuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIGlmICgkJGwgPT09IDApIHsnKTtcbiAgICAgIHRoaXMudmlzaXQoZWFjaC5hbHRlcm5hdGUsIGVhY2gpO1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIH0nKTtcbiAgICB9XG4gICAgdGhpcy5idWYucHVzaCgnICB9XFxufSkuY2FsbCh0aGlzKTtcXG4nKTtcbiAgfSxcblxuICB2aXNpdEVhY2hPZjogZnVuY3Rpb24oZWFjaCkge1xuICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAnJyArXG4gICAgICAgICcvLyBpdGVyYXRlICcgK1xuICAgICAgICBlYWNoLm9iaiArXG4gICAgICAgICdcXG4nICtcbiAgICAgICAgJ2ZvciAoY29uc3QgJyArXG4gICAgICAgIGVhY2gudmFsICtcbiAgICAgICAgJyBvZiAnICtcbiAgICAgICAgZWFjaC5vYmogK1xuICAgICAgICAnKSB7XFxuJ1xuICAgICk7XG5cbiAgICB0aGlzLnZpc2l0KGVhY2guYmxvY2ssIGVhY2gpO1xuXG4gICAgdGhpcy5idWYucHVzaCgnfVxcbicpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgYXR0cnNgLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhdHRyc1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGF0dHJzLCBhdHRyaWJ1dGVCbG9ja3MpIHtcbiAgICBpZiAoYXR0cmlidXRlQmxvY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGF0dHJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5hdHRycyhhdHRycyk7XG4gICAgICAgIGF0dHJpYnV0ZUJsb2Nrcy51bnNoaWZ0KHZhbCk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlQmxvY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMucnVudGltZSgnYXR0cnMnKSArXG4gICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgdGhpcy5ydW50aW1lKCdtZXJnZScpICtcbiAgICAgICAgICAgICcoWycgK1xuICAgICAgICAgICAgYXR0cmlidXRlQmxvY2tzLmpvaW4oJywnKSArXG4gICAgICAgICAgICAnXSksICcgK1xuICAgICAgICAgICAgc3RyaW5naWZ5KHRoaXMudGVyc2UpICtcbiAgICAgICAgICAgICcpJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMucnVudGltZSgnYXR0cnMnKSArXG4gICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgYXR0cmlidXRlQmxvY2tzWzBdICtcbiAgICAgICAgICAgICcsICcgK1xuICAgICAgICAgICAgc3RyaW5naWZ5KHRoaXMudGVyc2UpICtcbiAgICAgICAgICAgICcpJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmF0dHJzKGF0dHJzLCB0cnVlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXBpbGUgYXR0cmlidXRlcy5cbiAgICovXG5cbiAgYXR0cnM6IGZ1bmN0aW9uKGF0dHJzLCBidWZmZXIpIHtcbiAgICB2YXIgcmVzID0gY29tcGlsZUF0dHJzKGF0dHJzLCB7XG4gICAgICB0ZXJzZTogdGhpcy50ZXJzZSxcbiAgICAgIGZvcm1hdDogYnVmZmVyID8gJ2h0bWwnIDogJ29iamVjdCcsXG4gICAgICBydW50aW1lOiB0aGlzLnJ1bnRpbWUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICBpZiAoYnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlckV4cHJlc3Npb24ocmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcblxuICAvKipcbiAgICogQ29tcGlsZSBhdHRyaWJ1dGUgYmxvY2tzLlxuICAgKi9cblxuICBhdHRyaWJ1dGVCbG9ja3M6IGZ1bmN0aW9uKGF0dHJpYnV0ZUJsb2Nrcykge1xuICAgIHJldHVybiAoXG4gICAgICBhdHRyaWJ1dGVCbG9ja3MgJiZcbiAgICAgIGF0dHJpYnV0ZUJsb2Nrcy5zbGljZSgpLm1hcChmdW5jdGlvbihhdHRyQmxvY2spIHtcbiAgICAgICAgcmV0dXJuIGF0dHJCbG9jay52YWw7XG4gICAgICB9KVxuICAgICk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0YWdDYW5JbmxpbmUodGFnKSB7XG4gIGZ1bmN0aW9uIGlzSW5saW5lKG5vZGUpIHtcbiAgICAvLyBSZWN1cnNlIGlmIHRoZSBub2RlIGlzIGEgYmxvY2tcbiAgICBpZiAobm9kZS50eXBlID09PSAnQmxvY2snKSByZXR1cm4gbm9kZS5ub2Rlcy5ldmVyeShpc0lubGluZSk7XG4gICAgLy8gV2hlbiB0aGVyZSBpcyBhIFlpZWxkQmxvY2sgaGVyZSwgaXQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIGlzXG4gICAgLy8gZXhwZWN0ZWQgdG8gYmUgaW5jbHVkZWQgYnV0IGlzIG5vdC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGJsb2NrXG4gICAgLy8gbXVzdCBiZSBlbXB0eS5cbiAgICBpZiAobm9kZS50eXBlID09PSAnWWllbGRCbG9jaycpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAobm9kZS50eXBlID09PSAnVGV4dCcgJiYgIS9cXG4vLnRlc3Qobm9kZS52YWwpKSB8fCBub2RlLmlzSW5saW5lO1xuICB9XG5cbiAgcmV0dXJuIHRhZy5ibG9jay5ub2Rlcy5ldmVyeShpc0lubGluZSk7XG59XG4iLCAidmFyIHJ1bnRpbWUgPSByZXF1aXJlKCcuLycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5mdW5jdGlvbiB3cmFwKHRlbXBsYXRlLCB0ZW1wbGF0ZU5hbWUpIHtcbiAgdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lIHx8ICd0ZW1wbGF0ZSc7XG4gIHJldHVybiBGdW5jdGlvbihcbiAgICAncHVnJyxcbiAgICB0ZW1wbGF0ZSArICdcXG4nICsgJ3JldHVybiAnICsgdGVtcGxhdGVOYW1lICsgJzsnXG4gICkocnVudGltZSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiFcbiAqIFB1Z1xuICogQ29weXJpZ2h0KGMpIDIwMTAgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgbGV4ID0gcmVxdWlyZSgncHVnLWxleGVyJyk7XG52YXIgc3RyaXBDb21tZW50cyA9IHJlcXVpcmUoJ3B1Zy1zdHJpcC1jb21tZW50cycpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgncHVnLXBhcnNlcicpO1xudmFyIGxvYWQgPSByZXF1aXJlKCdwdWctbG9hZCcpO1xudmFyIGZpbHRlcnMgPSByZXF1aXJlKCdwdWctZmlsdGVycycpO1xudmFyIGxpbmsgPSByZXF1aXJlKCdwdWctbGlua2VyJyk7XG52YXIgZ2VuZXJhdGVDb2RlID0gcmVxdWlyZSgncHVnLWNvZGUtZ2VuJyk7XG52YXIgcnVudGltZSA9IHJlcXVpcmUoJ3B1Zy1ydW50aW1lJyk7XG52YXIgcnVudGltZVdyYXAgPSByZXF1aXJlKCdwdWctcnVudGltZS93cmFwJyk7XG5cbi8qKlxuICogTmFtZSBmb3IgZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0cy5uYW1lID0gJ1B1Zyc7XG5cbi8qKlxuICogUHVnIHJ1bnRpbWUgaGVscGVycy5cbiAqL1xuXG5leHBvcnRzLnJ1bnRpbWUgPSBydW50aW1lO1xuXG4vKipcbiAqIFRlbXBsYXRlIGZ1bmN0aW9uIGNhY2hlLlxuICovXG5cbmV4cG9ydHMuY2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gYXBwbHlQbHVnaW5zKHZhbHVlLCBvcHRpb25zLCBwbHVnaW5zLCBuYW1lKSB7XG4gIHJldHVybiBwbHVnaW5zLnJlZHVjZShmdW5jdGlvbih2YWx1ZSwgcGx1Z2luKSB7XG4gICAgcmV0dXJuIHBsdWdpbltuYW1lXSA/IHBsdWdpbltuYW1lXSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgfSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsIG5hbWUpIHtcbiAgdmFyIGVsaWdpYmxlUGx1Z2lucyA9IHBsdWdpbnMuZmlsdGVyKGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBwbHVnaW5bbmFtZV07XG4gIH0pO1xuXG4gIGlmIChlbGlnaWJsZVBsdWdpbnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHdvIG9yIG1vcmUgcGx1Z2lucyBhbGwgaW1wbGVtZW50ICcgKyBuYW1lICsgJyBtZXRob2QuJyk7XG4gIH0gZWxzZSBpZiAoZWxpZ2libGVQbHVnaW5zLmxlbmd0aCkge1xuICAgIHJldHVybiBlbGlnaWJsZVBsdWdpbnNbMF1bbmFtZV0uYmluZChlbGlnaWJsZVBsdWdpbnNbMF0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE9iamVjdCBmb3IgZ2xvYmFsIGN1c3RvbSBmaWx0ZXJzLiAgTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBqdXN0IHBhc3MgYSBgZmlsdGVyc2BcbiAqIG9wdGlvbiB0byBhbnkgb3RoZXIgbWV0aG9kLlxuICovXG5leHBvcnRzLmZpbHRlcnMgPSB7fTtcblxuLyoqXG4gKiBDb21waWxlIHRoZSBnaXZlbiBgc3RyYCBvZiBwdWcgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGJvZHkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVCb2R5KHN0ciwgb3B0aW9ucykge1xuICB2YXIgZGVidWdfc291cmNlcyA9IHt9O1xuICBkZWJ1Z19zb3VyY2VzW29wdGlvbnMuZmlsZW5hbWVdID0gc3RyO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gW107XG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zIHx8IFtdO1xuICB2YXIgYXN0ID0gbG9hZC5zdHJpbmcoc3RyLCB7XG4gICAgZmlsZW5hbWU6IG9wdGlvbnMuZmlsZW5hbWUsXG4gICAgYmFzZWRpcjogb3B0aW9ucy5iYXNlZGlyLFxuICAgIGxleDogZnVuY3Rpb24oc3RyLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGV4T3B0aW9ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgbGV4T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfSk7XG4gICAgICBsZXhPcHRpb25zLnBsdWdpbnMgPSBwbHVnaW5zXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICAgICAgcmV0dXJuICEhcGx1Z2luLmxleDtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihwbHVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLmxleDtcbiAgICAgICAgfSk7XG4gICAgICB2YXIgY29udGVudHMgPSBhcHBseVBsdWdpbnMoXG4gICAgICAgIHN0cixcbiAgICAgICAge2ZpbGVuYW1lOiBvcHRpb25zLmZpbGVuYW1lfSxcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgJ3ByZUxleCdcbiAgICAgICk7XG4gICAgICByZXR1cm4gYXBwbHlQbHVnaW5zKFxuICAgICAgICBsZXgoY29udGVudHMsIGxleE9wdGlvbnMpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICAncG9zdExleCdcbiAgICAgICk7XG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24odG9rZW5zLCBvcHRpb25zKSB7XG4gICAgICB0b2tlbnMgPSB0b2tlbnMubWFwKGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAncGF0aCcgJiYgcGF0aC5leHRuYW1lKHRva2VuLnZhbCkgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXRoJyxcbiAgICAgICAgICAgIGxvYzogdG9rZW4ubG9jLFxuICAgICAgICAgICAgdmFsOiB0b2tlbi52YWwgKyAnLnB1ZycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9KTtcbiAgICAgIHRva2VucyA9IHN0cmlwQ29tbWVudHModG9rZW5zLCBvcHRpb25zKTtcbiAgICAgIHRva2VucyA9IGFwcGx5UGx1Z2lucyh0b2tlbnMsIG9wdGlvbnMsIHBsdWdpbnMsICdwcmVQYXJzZScpO1xuICAgICAgdmFyIHBhcnNlT3B0aW9ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcGFyc2VPcHRpb25zW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICB9KTtcbiAgICAgIHBhcnNlT3B0aW9ucy5wbHVnaW5zID0gcGx1Z2luc1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHBsdWdpbikge1xuICAgICAgICAgIHJldHVybiAhIXBsdWdpbi5wYXJzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihwbHVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLnBhcnNlO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFwcGx5UGx1Z2lucyhcbiAgICAgICAgYXBwbHlQbHVnaW5zKFxuICAgICAgICAgIHBhcnNlKHRva2VucywgcGFyc2VPcHRpb25zKSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHBsdWdpbnMsXG4gICAgICAgICAgJ3Bvc3RQYXJzZSdcbiAgICAgICAgKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgJ3ByZUxvYWQnXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVzb2x2ZTogZnVuY3Rpb24oZmlsZW5hbWUsIHNvdXJjZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgIHZhciByZXBsYWNlbWVudEZ1bmMgPSBmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsICdyZXNvbHZlJyk7XG4gICAgICBpZiAocmVwbGFjZW1lbnRGdW5jKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudEZ1bmMoZmlsZW5hbWUsIHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkLnJlc29sdmUoZmlsZW5hbWUsIHNvdXJjZSwgbG9hZE9wdGlvbnMpO1xuICAgIH0sXG4gICAgcmVhZDogZnVuY3Rpb24oZmlsZW5hbWUsIGxvYWRPcHRpb25zKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChmaWxlbmFtZSk7XG5cbiAgICAgIHZhciBjb250ZW50cztcblxuICAgICAgdmFyIHJlcGxhY2VtZW50RnVuYyA9IGZpbmRSZXBsYWNlbWVudEZ1bmMocGx1Z2lucywgJ3JlYWQnKTtcbiAgICAgIGlmIChyZXBsYWNlbWVudEZ1bmMpIHtcbiAgICAgICAgY29udGVudHMgPSByZXBsYWNlbWVudEZ1bmMoZmlsZW5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudHMgPSBsb2FkLnJlYWQoZmlsZW5hbWUsIGxvYWRPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgZGVidWdfc291cmNlc1tmaWxlbmFtZV0gPSBCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpXG4gICAgICAgID8gY29udGVudHMudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IGNvbnRlbnRzO1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH0sXG4gIH0pO1xuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdExvYWQnKTtcbiAgYXN0ID0gYXBwbHlQbHVnaW5zKGFzdCwgb3B0aW9ucywgcGx1Z2lucywgJ3ByZUZpbHRlcnMnKTtcblxuICB2YXIgZmlsdGVyc1NldCA9IHt9O1xuICBPYmplY3Qua2V5cyhleHBvcnRzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgZmlsdGVyc1NldFtrZXldID0gZXhwb3J0cy5maWx0ZXJzW2tleV07XG4gIH0pO1xuICBpZiAob3B0aW9ucy5maWx0ZXJzKSB7XG4gICAgT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgZmlsdGVyc1NldFtrZXldID0gb3B0aW9ucy5maWx0ZXJzW2tleV07XG4gICAgfSk7XG4gIH1cbiAgYXN0ID0gZmlsdGVycy5oYW5kbGVGaWx0ZXJzKFxuICAgIGFzdCxcbiAgICBmaWx0ZXJzU2V0LFxuICAgIG9wdGlvbnMuZmlsdGVyT3B0aW9ucyxcbiAgICBvcHRpb25zLmZpbHRlckFsaWFzZXNcbiAgKTtcblxuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdEZpbHRlcnMnKTtcbiAgYXN0ID0gYXBwbHlQbHVnaW5zKGFzdCwgb3B0aW9ucywgcGx1Z2lucywgJ3ByZUxpbmsnKTtcbiAgYXN0ID0gbGluayhhc3QpO1xuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdExpbmsnKTtcblxuICAvLyBDb21waWxlXG4gIGFzdCA9IGFwcGx5UGx1Z2lucyhhc3QsIG9wdGlvbnMsIHBsdWdpbnMsICdwcmVDb2RlR2VuJyk7XG4gIHZhciBqcyA9IChmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsICdnZW5lcmF0ZUNvZGUnKSB8fCBnZW5lcmF0ZUNvZGUpKGFzdCwge1xuICAgIHByZXR0eTogb3B0aW9ucy5wcmV0dHksXG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBkb2N0eXBlOiBvcHRpb25zLmRvY3R5cGUsXG4gICAgaW5saW5lUnVudGltZUZ1bmN0aW9uczogb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zLFxuICAgIGdsb2JhbHM6IG9wdGlvbnMuZ2xvYmFscyxcbiAgICBzZWxmOiBvcHRpb25zLnNlbGYsXG4gICAgaW5jbHVkZVNvdXJjZXM6IG9wdGlvbnMuaW5jbHVkZVNvdXJjZXMgPyBkZWJ1Z19zb3VyY2VzIDogZmFsc2UsXG4gICAgdGVtcGxhdGVOYW1lOiBvcHRpb25zLnRlbXBsYXRlTmFtZSxcbiAgfSk7XG4gIGpzID0gYXBwbHlQbHVnaW5zKGpzLCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdENvZGVHZW4nKTtcblxuICAvLyBEZWJ1ZyBjb21waWxlclxuICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAnXFxuQ29tcGlsZWQgRnVuY3Rpb246XFxuXFxuXFx1MDAxYls5MG0lc1xcdTAwMWJbMG0nLFxuICAgICAganMucmVwbGFjZSgvXi9nbSwgJyAgJylcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtib2R5OiBqcywgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXN9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgdGVtcGxhdGUgZnJvbSBhIHN0cmluZyBvciBhIGZpbGUsIGVpdGhlciBjb21waWxlZCBvbi10aGUtZmx5IG9yXG4gKiByZWFkIGZyb20gY2FjaGUgKGlmIGVuYWJsZWQpLCBhbmQgY2FjaGUgdGhlIHRlbXBsYXRlIGlmIG5lZWRlZC5cbiAqXG4gKiBJZiBgc3RyYCBpcyBub3Qgc2V0LCB0aGUgZmlsZSBzcGVjaWZpZWQgaW4gYG9wdGlvbnMuZmlsZW5hbWVgIHdpbGwgYmUgcmVhZC5cbiAqXG4gKiBJZiBgb3B0aW9ucy5jYWNoZWAgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZmlsZSBmcm9tXG4gKiBgb3B0aW9ucy5maWxlbmFtZWAgc28gaXQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZz19IHN0clxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaGFuZGxlVGVtcGxhdGVDYWNoZShvcHRpb25zLCBzdHIpIHtcbiAgdmFyIGtleSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIGlmIChvcHRpb25zLmNhY2hlICYmIGV4cG9ydHMuY2FjaGVba2V5XSkge1xuICAgIHJldHVybiBleHBvcnRzLmNhY2hlW2tleV07XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSBzdHIgPSBmcy5yZWFkRmlsZVN5bmMob3B0aW9ucy5maWxlbmFtZSwgJ3V0ZjgnKTtcbiAgICB2YXIgdGVtcGwgPSBleHBvcnRzLmNvbXBpbGUoc3RyLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5jYWNoZSkgZXhwb3J0cy5jYWNoZVtrZXldID0gdGVtcGw7XG4gICAgcmV0dXJuIHRlbXBsO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGBGdW5jdGlvbmAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHB1ZyBgc3RyYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgY29tcGlsZURlYnVnYCB3aGVuIGBmYWxzZWAgZGVidWdnaW5nIGNvZGUgaXMgc3RyaXBwZWQgZnJvbSB0aGUgY29tcGlsZWRcbiAgICAgICB0ZW1wbGF0ZSwgd2hlbiBpdCBpcyBleHBsaWNpdGx5IGB0cnVlYCwgdGhlIHNvdXJjZSBjb2RlIGlzIGluY2x1ZGVkIGluXG4gICAgICAgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZvciBiZXR0ZXIgYWNjdXJhY3kuXG4gKiAgIC0gYGZpbGVuYW1lYCB1c2VkIHRvIGltcHJvdmUgZXJyb3JzIHdoZW4gYGNvbXBpbGVEZWJ1Z2AgaXMgbm90IGBmYWxzZWAgYW5kIHRvIHJlc29sdmUgaW1wb3J0cy9leHRlbmRzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jb21waWxlID0gZnVuY3Rpb24oc3RyLCBvcHRpb25zKSB7XG4gIHZhciBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBzdHIgPSBTdHJpbmcoc3RyKTtcblxuICB2YXIgcGFyc2VkID0gY29tcGlsZUJvZHkoc3RyLCB7XG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyAhPT0gZmFsc2UsXG4gICAgZmlsZW5hbWU6IG9wdGlvbnMuZmlsZW5hbWUsXG4gICAgYmFzZWRpcjogb3B0aW9ucy5iYXNlZGlyLFxuICAgIHByZXR0eTogb3B0aW9ucy5wcmV0dHksXG4gICAgZG9jdHlwZTogb3B0aW9ucy5kb2N0eXBlLFxuICAgIGlubGluZVJ1bnRpbWVGdW5jdGlvbnM6IG9wdGlvbnMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyxcbiAgICBnbG9iYWxzOiBvcHRpb25zLmdsb2JhbHMsXG4gICAgc2VsZjogb3B0aW9ucy5zZWxmLFxuICAgIGluY2x1ZGVTb3VyY2VzOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyA9PT0gdHJ1ZSxcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICB0ZW1wbGF0ZU5hbWU6ICd0ZW1wbGF0ZScsXG4gICAgZmlsdGVyczogb3B0aW9ucy5maWx0ZXJzLFxuICAgIGZpbHRlck9wdGlvbnM6IG9wdGlvbnMuZmlsdGVyT3B0aW9ucyxcbiAgICBmaWx0ZXJBbGlhc2VzOiBvcHRpb25zLmZpbHRlckFsaWFzZXMsXG4gICAgcGx1Z2luczogb3B0aW9ucy5wbHVnaW5zLFxuICB9KTtcblxuICB2YXIgcmVzID0gb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zXG4gICAgPyBuZXcgRnVuY3Rpb24oJycsIHBhcnNlZC5ib2R5ICsgJztyZXR1cm4gdGVtcGxhdGU7JykoKVxuICAgIDogcnVudGltZVdyYXAocGFyc2VkLmJvZHkpO1xuXG4gIHJlcy5kZXBlbmRlbmNpZXMgPSBwYXJzZWQuZGVwZW5kZW5jaWVzO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBKYXZhU2NyaXB0IHNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gcHVnIGBzdHJgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBjb21waWxlRGVidWdgIFdoZW4gaXQgaXMgYHRydWVgLCB0aGUgc291cmNlIGNvZGUgaXMgaW5jbHVkZWQgaW5cbiAqICAgICB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy5cbiAqICAgLSBgZmlsZW5hbWVgIHVzZWQgdG8gaW1wcm92ZSBlcnJvcnMgd2hlbiBgY29tcGlsZURlYnVnYCBpcyBub3QgYHRydWVgIGFuZCB0byByZXNvbHZlIGltcG9ydHMvZXh0ZW5kc1xuICogICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIChkZWZhdWx0cyB0byBcInRlbXBsYXRlXCIpXG4gKiAgIC0gYG1vZHVsZWAgd2hlbiBpdCBpcyBleHBsaWNpdGx5IGB0cnVlYCwgdGhlIHNvdXJjZSBjb2RlIGluY2x1ZGUgZXhwb3J0IG1vZHVsZSBzeW50YXhcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jb21waWxlQ2xpZW50V2l0aERlcGVuZGVuY2llc1RyYWNrZWQgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICB2YXIgcGFyc2VkID0gY29tcGlsZUJvZHkoc3RyLCB7XG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZSxcbiAgICBiYXNlZGlyOiBvcHRpb25zLmJhc2VkaXIsXG4gICAgcHJldHR5OiBvcHRpb25zLnByZXR0eSxcbiAgICBkb2N0eXBlOiBvcHRpb25zLmRvY3R5cGUsXG4gICAgaW5saW5lUnVudGltZUZ1bmN0aW9uczogb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zICE9PSBmYWxzZSxcbiAgICBnbG9iYWxzOiBvcHRpb25zLmdsb2JhbHMsXG4gICAgc2VsZjogb3B0aW9ucy5zZWxmLFxuICAgIGluY2x1ZGVTb3VyY2VzOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IG9wdGlvbnMubmFtZSB8fCAndGVtcGxhdGUnLFxuICAgIGZpbHRlcnM6IG9wdGlvbnMuZmlsdGVycyxcbiAgICBmaWx0ZXJPcHRpb25zOiBvcHRpb25zLmZpbHRlck9wdGlvbnMsXG4gICAgZmlsdGVyQWxpYXNlczogb3B0aW9ucy5maWx0ZXJBbGlhc2VzLFxuICAgIHBsdWdpbnM6IG9wdGlvbnMucGx1Z2lucyxcbiAgfSk7XG5cbiAgdmFyIGJvZHkgPSBwYXJzZWQuYm9keTtcblxuICBpZiAob3B0aW9ucy5tb2R1bGUpIHtcbiAgICBpZiAob3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgYm9keSA9ICd2YXIgcHVnID0gcmVxdWlyZShcInB1Zy1ydW50aW1lXCIpOycgKyBib2R5O1xuICAgIH1cbiAgICBib2R5ICs9ICcgbW9kdWxlLmV4cG9ydHMgPSAnICsgKG9wdGlvbnMubmFtZSB8fCAndGVtcGxhdGUnKSArICc7JztcbiAgfVxuXG4gIHJldHVybiB7Ym9keTogYm9keSwgZGVwZW5kZW5jaWVzOiBwYXJzZWQuZGVwZW5kZW5jaWVzfTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIEphdmFTY3JpcHQgc291cmNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBwdWcgYHN0cmAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNvbXBpbGVEZWJ1Z2AgV2hlbiBpdCBpcyBgdHJ1ZWAsIHRoZSBzb3VyY2UgY29kZSBpcyBpbmNsdWRlZCBpblxuICogICAgIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICogICAtIGBmaWxlbmFtZWAgdXNlZCB0byBpbXByb3ZlIGVycm9ycyB3aGVuIGBjb21waWxlRGVidWdgIGlzIG5vdCBgdHJ1ZWAgYW5kIHRvIHJlc29sdmUgaW1wb3J0cy9leHRlbmRzXG4gKiAgIC0gYG5hbWVgIHRoZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gKGRlZmF1bHRzIHRvIFwidGVtcGxhdGVcIilcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMuY29tcGlsZUNsaWVudCA9IGZ1bmN0aW9uKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gZXhwb3J0cy5jb21waWxlQ2xpZW50V2l0aERlcGVuZGVuY2llc1RyYWNrZWQoc3RyLCBvcHRpb25zKS5ib2R5O1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgYEZ1bmN0aW9uYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gcHVnIGZpbGUuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNvbXBpbGVEZWJ1Z2Agd2hlbiBgZmFsc2VgIGRlYnVnZ2luZyBjb2RlIGlzIHN0cmlwcGVkIGZyb20gdGhlIGNvbXBpbGVkXG4gICAgICAgdGVtcGxhdGUsIHdoZW4gaXQgaXMgZXhwbGljaXRseSBgdHJ1ZWAsIHRoZSBzb3VyY2UgY29kZSBpcyBpbmNsdWRlZCBpblxuICAgICAgIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgYmV0dGVyIGFjY3VyYWN5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5jb21waWxlRmlsZSA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZmlsZW5hbWUgPSBwYXRoO1xuICByZXR1cm4gaGFuZGxlVGVtcGxhdGVDYWNoZShvcHRpb25zKTtcbn07XG5cbi8qKlxuICogUmVuZGVyIHRoZSBnaXZlbiBgc3RyYCBvZiBwdWcuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNhY2hlYCBlbmFibGUgdGVtcGxhdGUgY2FjaGluZ1xuICogICAtIGBmaWxlbmFtZWAgZmlsZW5hbWUgcmVxdWlyZWQgZm9yIGBpbmNsdWRlYCAvIGBleHRlbmRzYCBhbmQgY2FjaGluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBvcHRpb25zIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHVuZGVmaW5lZH0gZm5cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucmVuZGVyID0gZnVuY3Rpb24oc3RyLCBvcHRpb25zLCBmbikge1xuICAvLyBzdXBwb3J0IGNhbGxiYWNrIEFQSVxuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgIChmbiA9IG9wdGlvbnMpLCAob3B0aW9ucyA9IHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGV4cG9ydHMucmVuZGVyKHN0ciwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBmbihleCk7XG4gICAgfVxuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gY2FjaGUgcmVxdWlyZXMgLmZpbGVuYW1lXG4gIGlmIChvcHRpb25zLmNhY2hlICYmICFvcHRpb25zLmZpbGVuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgXCJmaWxlbmFtZVwiIG9wdGlvbiBpcyByZXF1aXJlZCBmb3IgY2FjaGluZycpO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZVRlbXBsYXRlQ2FjaGUob3B0aW9ucywgc3RyKShvcHRpb25zKTtcbn07XG5cbi8qKlxuICogUmVuZGVyIGEgUHVnIGZpbGUgYXQgdGhlIGdpdmVuIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IG9wdGlvbnMgb3IgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb258dW5kZWZpbmVkfSBmblxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5yZW5kZXJGaWxlID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucywgZm4pIHtcbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBBUElcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICAoZm4gPSBvcHRpb25zKSwgKG9wdGlvbnMgPSB1bmRlZmluZWQpO1xuICB9XG4gIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBleHBvcnRzLnJlbmRlckZpbGUocGF0aCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBmbihleCk7XG4gICAgfVxuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgb3B0aW9ucy5maWxlbmFtZSA9IHBhdGg7XG4gIHJldHVybiBoYW5kbGVUZW1wbGF0ZUNhY2hlKG9wdGlvbnMpKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgUHVnIGZpbGUgYXQgdGhlIGdpdmVuIGBwYXRoYCBmb3IgdXNlIG9uIHRoZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVGaWxlQ2xpZW50ID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykge1xuICB2YXIga2V5ID0gcGF0aCArICc6Y2xpZW50JztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgb3B0aW9ucy5maWxlbmFtZSA9IHBhdGg7XG5cbiAgaWYgKG9wdGlvbnMuY2FjaGUgJiYgZXhwb3J0cy5jYWNoZVtrZXldKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FjaGVba2V5XTtcbiAgfVxuXG4gIHZhciBzdHIgPSBmcy5yZWFkRmlsZVN5bmMob3B0aW9ucy5maWxlbmFtZSwgJ3V0ZjgnKTtcbiAgdmFyIG91dCA9IGV4cG9ydHMuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5jYWNoZSkgZXhwb3J0cy5jYWNoZVtrZXldID0gb3V0O1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBFeHByZXNzIHN1cHBvcnQuXG4gKi9cblxuZXhwb3J0cy5fX2V4cHJlc3MgPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zLCBmbikge1xuICBpZiAoXG4gICAgb3B0aW9ucy5jb21waWxlRGVidWcgPT0gdW5kZWZpbmVkICYmXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xuICApIHtcbiAgICBvcHRpb25zLmNvbXBpbGVEZWJ1ZyA9IGZhbHNlO1xuICB9XG4gIGV4cG9ydHMucmVuZGVyRmlsZShwYXRoLCBvcHRpb25zLCBmbik7XG59O1xuIiwgImV4cG9ydCB7IGNvbXBpbGUsIGNvbXBpbGVDbGllbnQgfSBmcm9tICdwdWcnO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiaTFCQUdBLGFBQTRCLENBQ3hCLEtBQU0sSUFBSSxPQUFNLG1DQUVwQixhQUErQixDQUMzQixLQUFNLElBQUksT0FBTSxxQ0FXcEIsWUFBb0IsRUFBSyxDQUNyQixHQUFJLEtBQXFCLFdBRXJCLE1BQU8sWUFBVyxFQUFLLEdBRzNCLEdBQ0ssTUFBcUIsSUFBb0IsQ0FBQyxLQUMzQyxXQUVBLFVBQW1CLFdBQ1osV0FBVyxFQUFLLEdBRTNCLEdBQUksQ0FFQSxNQUFPLElBQWlCLEVBQUssU0FDeEIsRUFBUCxDQUNFLEdBQUksQ0FFQSxNQUFPLElBQWlCLEtBQUssS0FBTSxFQUFLLFNBQ25DLEVBQVAsQ0FFRSxNQUFPLElBQWlCLEtBQUssS0FBTSxFQUFLLEtBSXBELFlBQXlCLEVBQVEsQ0FDN0IsR0FBSSxLQUF1QixhQUV2QixNQUFPLGNBQWEsR0FHeEIsR0FDSyxNQUF1QixJQUF1QixDQUFDLEtBQ2hELGFBRUEsVUFBcUIsYUFDZCxhQUFhLEdBRXhCLEdBQUksQ0FFQSxNQUFPLElBQW1CLFNBQ3JCLEVBQVAsQ0FDRSxHQUFJLENBRUEsTUFBTyxJQUFtQixLQUFLLEtBQU0sU0FDaEMsRUFBUCxDQUdFLE1BQU8sSUFBbUIsS0FBSyxLQUFNLEtBU2pELGFBQTJCLENBQ3ZCLEFBQUksQ0FBQyxJQUFZLENBQUMsSUFHbEIsSUFBVyxHQUNYLEFBQUksR0FBYSxPQUNiLEdBQVEsR0FBYSxPQUFPLElBRTVCLEdBQWEsR0FFYixHQUFNLFFBQ04sTUFJUixhQUFzQixDQUNsQixHQUFJLElBR0osSUFBSSxHQUFVLEdBQVcsSUFDekIsR0FBVyxHQUdYLE9BREksR0FBTSxHQUFNLE9BQ1QsR0FBSyxDQUdSLElBRkEsR0FBZSxHQUNm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QUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssTUFHcHlDLEVBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sS0FLanFCLFdBQXVCLEVBQU0sRUFBSyxDQUVoQyxPQURJLEdBQU0sTUFDRCxFQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsR0FBSyxFQUFHLENBRXRDLEdBREEsR0FBTyxFQUFJLEdBQ1AsRUFBTSxFQUFRLE1BQU8sR0FFekIsR0FEQSxHQUFPLEVBQUksRUFBSSxHQUNYLEdBQU8sRUFBUSxNQUFPLElBTTlCLFdBQTJCLEVBQU0sRUFBUSxDQUN2QyxNQUFJLEdBQU8sR0FBYSxJQUFTLEdBQzdCLEVBQU8sR0FBYSxHQUNwQixFQUFPLEdBQWEsSUFBUyxHQUM3QixFQUFPLElBQWMsR0FDckIsR0FBUSxNQUFpQixHQUFRLEtBQVEsRUFBd0IsS0FBSyxPQUFPLGFBQWEsSUFDMUYsSUFBVyxHQUFnQixHQUN4QixFQUFjLEVBQU0sR0FLN0IsV0FBMEIsRUFBTSxFQUFRLENBQ3RDLE1BQUksR0FBTyxHQUFhLElBQVMsR0FDN0IsRUFBTyxHQUFhLEdBQ3BCLEVBQU8sR0FBYSxHQUNwQixFQUFPLEdBQWEsR0FDcEIsRUFBTyxHQUFhLElBQVMsR0FDN0IsRUFBTyxJQUFjLEdBQ3JCLEdBQVEsTUFBaUIsR0FBUSxLQUFRLEVBQW1CLEtBQUssT0FBTyxhQUFhLElBQ3JGLElBQVcsR0FBZ0IsR0FDeEIsRUFBYyxFQUFNLElBQStCLEVBQWMsRUFBTSxHQTBCaEYsR0FBSSxHQUFZLFNBQW1CLEVBQU8sRUFBTSxDQUM5QyxBQUFLLElBQVMsUUFBUyxHQUFPLElBRTlCLEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxFQUFLLFFBQ3BCLEtBQUssV0FBYSxDQUFDLENBQUMsRUFBSyxXQUN6QixLQUFLLFdBQWEsQ0FBQyxDQUFDLEVBQUssV0FDekIsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUFLLE9BQ3JCLEtBQUssU0FBVyxDQUFDLENBQUMsRUFBSyxTQUN2QixLQUFLLE9BQVMsQ0FBQyxDQUFDLEVBQUssT0FDckIsS0FBSyxRQUFVLENBQUMsQ0FBQyxFQUFLLFFBQ3RCLEtBQUssTUFBUSxFQUFLLE9BQVMsS0FDM0IsS0FBSyxjQUFnQixNQUd2QixXQUFlLEVBQU0sRUFBTSxDQUN6QixNQUFPLElBQUksR0FBVSxFQUFNLENBQUMsV0FBWSxHQUFNLE1BQU8sSUFFdkQsR0FBSSxHQUFhLENBQUMsV0FBWSxJQUFPLEVBQWEsQ0FBQyxXQUFZLElBSTNELEdBQWEsR0FHakIsV0FBWSxFQUFNLEVBQVMsQ0FDekIsTUFBSyxLQUFZLFFBQVMsR0FBVSxJQUVwQyxFQUFRLFFBQVUsRUFDWCxHQUFXLEdBQVEsR0FBSSxHQUFVLEVBQU0sR0FHaEQsR0FBSSxHQUFRLENBQ1YsSUFBSyxHQUFJLEdBQVUsTUFBTyxHQUMxQixPQUFRLEdBQUksR0FBVSxTQUFVLEdBQ2hDLE9BQVEsR0FBSSxHQUFVLFNBQVUsR0FDaEMsS0FBTSxHQUFJLEdBQVUsT0FBUSxHQUM1QixJQUFLLEdBQUksR0FBVSxPQUduQixTQUFVLEdBQUksR0FBVSxJQUFLLENBQUMsV0FBWSxHQUFNLFdBQVksS0FDNUQsU0FBVSxHQUFJLEdBQVUsS0FDeEIsT0FBUSxHQUFJLEdBQVUsSUFBSyxDQUFDLFdBQVksR0FBTSxXQUFZLEtBQzFELE9BQVEsR0FBSSxHQUFVLEtBQ3RCLE9BQVEsR0FBSSxHQUFVLElBQUssQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQUMxRCxPQUFRLEdBQUksR0FBVSxLQUN0QixNQUFPLEdBQUksR0FBVSxJQUFLLEdBQzFCLEtBQU0sR0FBSSxHQUFVLElBQUssR0FDekIsTUFBTyxHQUFJLEdBQVUsSUFBSyxHQUMxQixJQUFLLEdBQUksR0FBVSxLQUNuQixTQUFVLEdBQUksR0FBVSxJQUFLLEdBQzdCLFlBQWEsR0FBSSxHQUFVLE1BQzNCLE1BQU8sR0FBSSxHQUFVLEtBQU0sR0FDM0IsU0FBVSxHQUFJLEdBQVUsWUFDeEIsZ0JBQWlCLEdBQUksR0FBVSxtQkFDL0IsU0FBVSxHQUFJLEdBQVUsTUFBTyxHQUMvQixVQUFXLEdBQUksR0FBVSxJQUFLLEdBQzlCLGFBQWMsR0FBSSxHQUFVLEtBQU0sQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQWdCakUsR0FBSSxHQUFJLEdBQVUsSUFBSyxDQUFDLFdBQVksR0FBTSxTQUFVLEtBQ3BELE9BQVEsR0FBSSxHQUFVLEtBQU0sQ0FBQyxXQUFZLEdBQU0sU0FBVSxLQUN6RCxPQUFRLEdBQUksR0FBVSxRQUFTLENBQUMsT0FBUSxHQUFNLFFBQVMsR0FBTSxXQUFZLEtBQ3pFLE9BQVEsR0FBSSxHQUFVLE1BQU8sQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDMUUsVUFBVyxFQUFNLEtBQU0sR0FDdkIsV0FBWSxFQUFNLEtBQU0sR0FDeEIsVUFBVyxFQUFNLElBQUssR0FDdEIsV0FBWSxFQUFNLElBQUssR0FDdkIsV0FBWSxFQUFNLElBQUssR0FDdkIsU0FBVSxFQUFNLGdCQUFpQixHQUNqQyxXQUFZLEVBQU0sWUFBYSxHQUMvQixTQUFVLEVBQU0sWUFBYSxHQUM3QixRQUFTLEdBQUksR0FBVSxNQUFPLENBQUMsV0FBWSxHQUFNLE1BQU8sRUFBRyxPQUFRLEdBQU0sV0FBWSxLQUNyRixPQUFRLEVBQU0sSUFBSyxJQUNuQixLQUFNLEVBQU0sSUFBSyxJQUNqQixNQUFPLEVBQU0sSUFBSyxJQUNsQixTQUFVLEdBQUksR0FBVSxLQUFNLENBQUMsV0FBWSxLQUMzQyxTQUFVLEVBQU0sS0FBTSxHQUd0QixPQUFRLEVBQUcsU0FDWCxNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsU0FDWCxVQUFXLEVBQUcsWUFDZCxVQUFXLEVBQUcsWUFDZCxTQUFVLEVBQUcsVUFBVyxHQUN4QixJQUFLLEVBQUcsS0FBTSxDQUFDLE9BQVEsR0FBTSxXQUFZLEtBQ3pDLE1BQU8sRUFBRyxPQUFRLEdBQ2xCLFNBQVUsRUFBRyxXQUNiLEtBQU0sRUFBRyxNQUFPLENBQUMsT0FBUSxLQUN6QixVQUFXLEVBQUcsV0FBWSxHQUMxQixJQUFLLEVBQUcsTUFDUixRQUFTLEVBQUcsU0FBVSxHQUN0QixRQUFTLEVBQUcsVUFDWixPQUFRLEVBQUcsUUFBUyxHQUNwQixLQUFNLEVBQUcsT0FDVCxLQUFNLEVBQUcsT0FDVCxPQUFRLEVBQUcsU0FDWCxPQUFRLEVBQUcsUUFBUyxDQUFDLE9BQVEsS0FDN0IsTUFBTyxFQUFHLFFBQ1YsS0FBTSxFQUFHLE1BQU8sQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQUMvQyxNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsUUFBUyxHQUNwQixPQUFRLEVBQUcsUUFBUyxHQUNwQixTQUFVLEVBQUcsVUFBVyxHQUN4QixRQUFTLEVBQUcsVUFDWixRQUFTLEVBQUcsU0FBVSxHQUN0QixNQUFPLEVBQUcsT0FBUSxHQUNsQixNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsUUFBUyxHQUNwQixJQUFLLEVBQUcsS0FBTSxDQUFDLFdBQVksR0FBTSxNQUFPLElBQ3hDLFlBQWEsRUFBRyxhQUFjLENBQUMsV0FBWSxHQUFNLE1BQU8sSUFDeEQsUUFBUyxFQUFHLFNBQVUsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDbkUsTUFBTyxFQUFHLE9BQVEsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDL0QsUUFBUyxFQUFHLFNBQVUsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksTUFNakUsR0FBWSx5QkFDWixHQUFhLEdBQUksUUFBTyxHQUFVLE9BQVEsS0FFOUMsWUFBbUIsRUFBTSxFQUFnQixDQUN2QyxNQUFPLEtBQVMsSUFBTSxJQUFTLElBQU8sQ0FBQyxHQUFtQixLQUFTLE1BQVUsSUFBUyxNQUd4RixHQUFJLElBQXFCLGdEQUVyQixHQUFpQixnQ0FFakIsR0FBTSxPQUFPLFVBQ2IsR0FBaUIsR0FBSSxlQUNyQixHQUFXLEdBQUksU0FJbkIsWUFBYSxFQUFLLEVBQVUsQ0FDMUIsTUFBTyxJQUFlLEtBQUssRUFBSyxHQUdsQyxHQUFJLElBQVUsTUFBTSxTQUFZLFNBQVUsRUFBSyxDQUFFLE1BQy9DLElBQVMsS0FBSyxLQUFTLGtCQUd6QixZQUFxQixFQUFPLENBQzFCLE1BQU8sSUFBSSxRQUFPLE9BQVMsRUFBTSxRQUFRLEtBQU0sS0FBTyxNQU14RCxHQUFJLElBQVcsU0FBa0IsRUFBTSxFQUFLLENBQzFDLEtBQUssS0FBTyxFQUNaLEtBQUssT0FBUyxHQUdoQixHQUFTLFVBQVUsT0FBUyxTQUFpQixFQUFHLENBQzlDLE1BQU8sSUFBSSxJQUFTLEtBQUssS0FBTSxLQUFLLE9BQVMsSUFHL0MsR0FBSSxJQUFpQixTQUF3QixFQUFHLEVBQU8sRUFBSyxDQUMxRCxLQUFLLE1BQVEsRUFDYixLQUFLLElBQU0sRUFDUCxFQUFFLGFBQWUsTUFBUSxNQUFLLE9BQVMsRUFBRSxhQVMvQyxZQUFxQixFQUFPLEVBQVEsQ0FDbEMsT0FBUyxHQUFPLEVBQUcsRUFBTSxJQUFLLENBQzVCLEdBQVcsVUFBWSxFQUN2QixHQUFJLEdBQVEsR0FBVyxLQUFLLEdBQzVCLEdBQUksR0FBUyxFQUFNLE1BQVEsRUFDekIsRUFBRSxFQUNGLEVBQU0sRUFBTSxNQUFRLEVBQU0sR0FBRyxXQUU3QixPQUFPLElBQUksSUFBUyxFQUFNLEVBQVMsSUFRekMsR0FBSSxJQUFpQixDQU1uQixZQUFhLEdBSWIsV0FBWSxTQU1aLG9CQUFxQixLQUdyQixnQkFBaUIsS0FLakIsY0FBZSxLQUdmLDJCQUE0QixHQUc1Qiw0QkFBNkIsR0FHN0IsMEJBQTJCLEdBRzNCLGNBQWUsR0FLZixVQUFXLEdBTVgsUUFBUyxLQVdULFVBQVcsS0FTWCxPQUFRLEdBTVIsUUFBUyxLQUdULFdBQVksS0FHWixpQkFBa0IsS0FHbEIsZUFBZ0IsSUFLbEIsWUFBb0IsRUFBTSxDQUN4QixHQUFJLEdBQVUsR0FFZCxPQUFTLEtBQU8sSUFDWixFQUFRLEdBQU8sR0FBUSxHQUFJLEVBQU0sR0FBTyxFQUFLLEdBQU8sR0FBZSxHQVF2RSxHQU5JLEVBQVEsYUFBZSxNQUN2QixHQUFRLGFBQWUsTUFFdkIsRUFBUSxlQUFpQixNQUN6QixHQUFRLGNBQWdCLEVBQVEsWUFBYyxHQUU5QyxHQUFRLEVBQVEsU0FBVSxDQUM1QixHQUFJLEdBQVMsRUFBUSxRQUNyQixFQUFRLFFBQVUsU0FBVSxFQUFPLENBQUUsTUFBTyxHQUFPLEtBQUssSUFFMUQsTUFBSSxJQUFRLEVBQVEsWUFDaEIsR0FBUSxVQUFZLEdBQVksRUFBUyxFQUFRLFlBRTlDLEVBR1QsWUFBcUIsRUFBUyxFQUFPLENBQ25DLE1BQU8sVUFBUyxFQUFPLEVBQU0sRUFBTyxFQUFLLEVBQVUsRUFBUSxDQUN6RCxHQUFJLEdBQVUsQ0FDWixLQUFNLEVBQVEsUUFBVSxPQUN4QixNQUFPLEVBQ1AsTUFBTyxFQUNQLElBQUssR0FFUCxBQUFJLEVBQVEsV0FDUixHQUFRLElBQU0sR0FBSSxJQUFlLEtBQU0sRUFBVSxJQUNqRCxFQUFRLFFBQ1IsR0FBUSxNQUFRLENBQUMsRUFBTyxJQUM1QixFQUFNLEtBQUssSUFLZixHQUNJLElBQVksRUFDWixHQUFpQixFQUNqQixHQUFZLEdBQVksR0FDeEIsR0FBYyxFQUNkLEdBQWtCLEVBQ2xCLEdBQWMsR0FDZCxHQUFxQixHQUNyQixHQUFjLEdBQ2QsR0FBcUIsSUFFekIsWUFBdUIsRUFBTyxFQUFXLENBQ3ZDLE1BQU8sSUFBa0IsR0FBUSxHQUFjLEdBQU0sR0FBWSxHQUFrQixHQUlyRixHQUNJLElBQVksRUFDWixHQUFXLEVBQ1gsR0FBZSxFQUNmLEdBQWdCLEVBQ2hCLEdBQW9CLEVBQ3BCLEdBQWUsRUFFZixHQUFTLFNBQWdCLEVBQVMsRUFBTyxFQUFVLENBQ3JELEtBQUssUUFBVSxFQUFVLEdBQVcsR0FDcEMsS0FBSyxXQUFhLEVBQVEsV0FDMUIsS0FBSyxTQUFXLEdBQVksRUFBUyxFQUFRLGFBQWUsRUFBSSxFQUFJLEVBQVEsYUFBZSxTQUFXLFVBQVksSUFDbEgsR0FBSSxHQUFXLEdBQ2YsR0FBSSxFQUFRLGdCQUFrQixHQUFNLENBQ2xDLE9BQVMsR0FBSSxFQUFRLFlBQ2IsSUFBVyxFQUFjLElBREUsSUFDL0IsQ0FDSixBQUFJLEVBQVEsYUFBZSxVQUFZLElBQVksVUFFckQsS0FBSyxjQUFnQixHQUFZLEdBQ2pDLEdBQUksR0FBa0IsR0FBVyxFQUFXLElBQU0sSUFBTSxFQUFjLE9BQ3RFLEtBQUssb0JBQXNCLEdBQVksR0FDdkMsS0FBSyx3QkFBMEIsR0FBWSxFQUFpQixJQUFNLEVBQWMsWUFDaEYsS0FBSyxNQUFRLE9BQU8sR0FLcEIsS0FBSyxZQUFjLEdBS25CLEFBQUksRUFDRixNQUFLLElBQU0sRUFDWCxLQUFLLFVBQVksS0FBSyxNQUFNLFlBQVk7QUFBQSxFQUFNLEVBQVcsR0FBSyxFQUM5RCxLQUFLLFFBQVUsS0FBSyxNQUFNLE1BQU0sRUFBRyxLQUFLLFdBQVcsTUFBTSxJQUFXLFFBRXBFLE1BQUssSUFBTSxLQUFLLFVBQVksRUFDNUIsS0FBSyxRQUFVLEdBS2pCLEtBQUssS0FBTyxFQUFNLElBRWxCLEtBQUssTUFBUSxLQUViLEtBQUssTUFBUSxLQUFLLElBQU0sS0FBSyxJQUc3QixLQUFLLFNBQVcsS0FBSyxPQUFTLEtBQUssY0FHbkMsS0FBSyxjQUFnQixLQUFLLGdCQUFrQixLQUM1QyxLQUFLLGFBQWUsS0FBSyxXQUFhLEtBQUssSUFLM0MsS0FBSyxRQUFVLEtBQUssaUJBQ3BCLEtBQUssWUFBYyxHQUduQixLQUFLLFNBQVcsRUFBUSxhQUFlLFNBQ3ZDLEtBQUssT0FBUyxLQUFLLFVBQVksS0FBSyxnQkFBZ0IsS0FBSyxLQUd6RCxLQUFLLGlCQUFtQixHQUd4QixLQUFLLFNBQVcsS0FBSyxTQUFXLEtBQUssY0FBZ0IsRUFFckQsS0FBSyxPQUFTLEdBRWQsS0FBSyxpQkFBbUIsR0FHcEIsS0FBSyxNQUFRLEdBQUssRUFBUSxlQUFpQixLQUFLLE1BQU0sTUFBTSxFQUFHLEtBQU8sTUFDdEUsS0FBSyxnQkFBZ0IsR0FHekIsS0FBSyxXQUFhLEdBQ2xCLEtBQUssV0FBVyxJQUdoQixLQUFLLFlBQWMsTUFHakIsR0FBcUIsQ0FBRSxXQUFZLENBQUUsYUFBYyxJQUFPLFlBQWEsQ0FBRSxhQUFjLElBQU8sUUFBUyxDQUFFLGFBQWMsSUFBTyxXQUFZLENBQUUsYUFBYyxJQUFPLGlCQUFrQixDQUFFLGFBQWMsSUFBTyxvQkFBcUIsQ0FBRSxhQUFjLEtBRW5QLEdBQU8sVUFBVSxNQUFRLFVBQWtCLENBQ3pDLEdBQUksR0FBTyxLQUFLLFFBQVEsU0FBVyxLQUFLLFlBQ3hDLFlBQUssWUFDRSxLQUFLLGNBQWMsSUFHNUIsR0FBbUIsV0FBVyxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBa0IsR0FDM0csR0FBbUIsWUFBWSxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBbUIsR0FDN0csR0FBbUIsUUFBUSxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBZSxHQUNyRyxHQUFtQixXQUFXLElBQU0sVUFBWSxDQUFFLE1BQVEsTUFBSyxtQkFBbUIsTUFBUSxJQUFlLEdBQ3pHLEdBQW1CLGlCQUFpQixJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssbUJBQW1CLE1BQVEsSUFBc0IsR0FDdEgsR0FBbUIsb0JBQW9CLElBQU0sVUFBWSxDQUFFLE1BQU8sTUFBSywyQkFBMkIsS0FBSyxpQkFHdkcsR0FBTyxVQUFVLG1CQUFxQixVQUErQixDQUFFLE1BQVEsTUFBSyxtQkFBbUIsTUFBUSxJQUFrQixHQUVqSSxHQUFPLE9BQVMsVUFBbUIsQ0FFL0IsT0FESSxHQUFVLEdBQUksRUFBTSxVQUFVLE9BQzFCLEtBQVEsRUFBUyxHQUFRLFVBQVcsR0FHOUMsT0FESSxHQUFNLEtBQ0QsRUFBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQU8sRUFBTSxFQUFRLEdBQUcsR0FDNUQsTUFBTyxJQUdULEdBQU8sTUFBUSxTQUFnQixFQUFPLEVBQVMsQ0FDN0MsTUFBTyxJQUFJLE1BQUssRUFBUyxHQUFPLFNBR2xDLEdBQU8sa0JBQW9CLFNBQTRCLEVBQU8sRUFBSyxFQUFTLENBQzFFLEdBQUksR0FBUyxHQUFJLE1BQUssRUFBUyxFQUFPLEdBQ3RDLFNBQU8sWUFDQSxFQUFPLG1CQUdoQixHQUFPLFVBQVksU0FBb0IsRUFBTyxFQUFTLENBQ3JELE1BQU8sSUFBSSxNQUFLLEVBQVMsSUFHM0IsT0FBTyxpQkFBa0IsR0FBTyxVQUFXLElBRTNDLEdBQUksSUFBSyxHQUFPLFVBSVosR0FBVSxpREFDZCxHQUFHLGdCQUFrQixTQUFTLEVBQU8sQ0FDbkMsT0FBUyxDQUVQLEdBQWUsVUFBWSxFQUMzQixHQUFTLEdBQWUsS0FBSyxLQUFLLE9BQU8sR0FBRyxPQUM1QyxHQUFJLEdBQVEsR0FBUSxLQUFLLEtBQUssTUFBTSxNQUFNLElBQzFDLEdBQUksQ0FBQyxFQUFTLE1BQU8sR0FDckIsR0FBSyxHQUFNLElBQU0sRUFBTSxNQUFRLGFBQWMsQ0FDM0MsR0FBZSxVQUFZLEVBQVEsRUFBTSxHQUFHLE9BQzVDLEdBQUksR0FBYSxHQUFlLEtBQUssS0FBSyxPQUFRLEVBQU0sRUFBVyxNQUFRLEVBQVcsR0FBRyxPQUNyRixFQUFPLEtBQUssTUFBTSxPQUFPLEdBQzdCLE1BQU8sS0FBUyxLQUFPLElBQVMsS0FDN0IsR0FBVSxLQUFLLEVBQVcsS0FDMUIsQ0FBRSx1QkFBc0IsS0FBSyxJQUFTLElBQVMsS0FBTyxLQUFLLE1BQU0sT0FBTyxFQUFNLEtBQU8sS0FFMUYsR0FBUyxFQUFNLEdBQUcsT0FHbEIsR0FBZSxVQUFZLEVBQzNCLEdBQVMsR0FBZSxLQUFLLEtBQUssT0FBTyxHQUFHLE9BQ3hDLEtBQUssTUFBTSxLQUFXLEtBQ3RCLE1BT1IsR0FBRyxJQUFNLFNBQVMsRUFBTSxDQUN0QixNQUFJLE1BQUssT0FBUyxFQUNoQixNQUFLLE9BQ0UsSUFFQSxJQU1YLEdBQUcsYUFBZSxTQUFTLEVBQU0sQ0FDL0IsTUFBTyxNQUFLLE9BQVMsRUFBTSxNQUFRLEtBQUssUUFBVSxHQUFRLENBQUMsS0FBSyxhQUtsRSxHQUFHLGNBQWdCLFNBQVMsRUFBTSxDQUNoQyxNQUFLLE1BQUssYUFBYSxHQUN2QixNQUFLLE9BQ0UsSUFGZ0MsSUFPekMsR0FBRyxpQkFBbUIsU0FBUyxFQUFNLENBQ25DLEFBQUssS0FBSyxjQUFjLElBQVMsS0FBSyxjQUt4QyxHQUFHLG1CQUFxQixVQUFXLENBQ2pDLE1BQU8sTUFBSyxPQUFTLEVBQU0sS0FDekIsS0FBSyxPQUFTLEVBQU0sUUFDcEIsR0FBVSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBWSxLQUFLLFNBRzFELEdBQUcsZ0JBQWtCLFVBQVcsQ0FDOUIsR0FBSSxLQUFLLHFCQUNQLE1BQUksTUFBSyxRQUFRLHFCQUNiLEtBQUssUUFBUSxvQkFBb0IsS0FBSyxXQUFZLEtBQUssZUFDcEQsSUFPWCxHQUFHLFVBQVksVUFBVyxDQUN4QixBQUFJLENBQUMsS0FBSyxJQUFJLEVBQU0sT0FBUyxDQUFDLEtBQUssbUJBQXFCLEtBQUssY0FHL0QsR0FBRyxtQkFBcUIsU0FBUyxFQUFTLEVBQVMsQ0FDakQsR0FBSSxLQUFLLE9BQVMsRUFDaEIsTUFBSSxNQUFLLFFBQVEsaUJBQ2IsS0FBSyxRQUFRLGdCQUFnQixLQUFLLGFBQWMsS0FBSyxpQkFDcEQsR0FDRCxLQUFLLE9BQ0YsSUFPWCxHQUFHLE9BQVMsU0FBUyxFQUFNLENBQ3pCLEtBQUssSUFBSSxJQUFTLEtBQUssY0FLekIsR0FBRyxXQUFhLFNBQVMsRUFBSyxDQUM1QixLQUFLLE1BQU0sR0FBb0IsS0FBSyxNQUFPLHFCQUc3QyxhQUErQixDQUM3QixLQUFLLGdCQUNMLEtBQUssY0FDTCxLQUFLLG9CQUNMLEtBQUssa0JBQ0wsS0FBSyxZQUNILEdBR0osR0FBRyxtQkFBcUIsU0FBUyxFQUF3QixFQUFVLENBQ2pFLEdBQUksRUFBQyxFQUNMLENBQUksRUFBdUIsY0FBZ0IsSUFDdkMsS0FBSyxpQkFBaUIsRUFBdUIsY0FBZSxpREFDaEUsR0FBSSxHQUFTLEVBQVcsRUFBdUIsb0JBQXNCLEVBQXVCLGtCQUM1RixBQUFJLEVBQVMsSUFBTSxLQUFLLGlCQUFpQixFQUFRLDJCQUduRCxHQUFHLHNCQUF3QixTQUFTLEVBQXdCLEVBQVUsQ0FDcEUsR0FBSSxDQUFDLEVBQTBCLE1BQU8sR0FDdEMsR0FBSSxHQUFrQixFQUF1QixnQkFDekMsRUFBYyxFQUF1QixZQUN6QyxHQUFJLENBQUMsRUFBWSxNQUFPLElBQW1CLEdBQUssR0FBZSxFQUMvRCxBQUFJLEdBQW1CLEdBQ25CLEtBQUssTUFBTSxFQUFpQiwyRUFDNUIsR0FBZSxHQUNmLEtBQUssaUJBQWlCLEVBQWEsdUNBR3pDLEdBQUcsK0JBQWlDLFVBQVcsQ0FDN0MsQUFBSSxLQUFLLFVBQWEsRUFBQyxLQUFLLFVBQVksS0FBSyxTQUFXLEtBQUssV0FDekQsS0FBSyxNQUFNLEtBQUssU0FBVSw4Q0FDMUIsS0FBSyxVQUNMLEtBQUssTUFBTSxLQUFLLFNBQVUsK0NBR2hDLEdBQUcscUJBQXVCLFNBQVMsRUFBTSxDQUN2QyxNQUFJLEdBQUssT0FBUywwQkFDUCxLQUFLLHFCQUFxQixFQUFLLFlBQ25DLEVBQUssT0FBUyxjQUFnQixFQUFLLE9BQVMsb0JBR3JELEdBQUksSUFBTyxHQUFPLFVBU2xCLEdBQUssY0FBZ0IsU0FBUyxFQUFNLENBQ2xDLEdBQUksR0FBVSxHQUVkLElBREssRUFBSyxNQUFRLEdBQUssS0FBTyxJQUN2QixLQUFLLE9BQVMsRUFBTSxLQUFLLENBQzlCLEdBQUksR0FBTyxLQUFLLGVBQWUsS0FBTSxHQUFNLEdBQzNDLEVBQUssS0FBSyxLQUFLLEdBRWpCLEdBQUksS0FBSyxTQUNMLE9BQVMsR0FBSSxFQUFHLEVBQU8sT0FBTyxLQUFLLEtBQUssa0JBQW1CLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDakYsQ0FDRSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLGlCQUFpQixLQUFLLGlCQUFpQixHQUFNLE1BQVEsV0FBYSxFQUFPLG9CQUVwRixZQUFLLHVCQUF1QixFQUFLLE1BQ2pDLEtBQUssT0FDTCxFQUFLLFdBQWEsS0FBSyxRQUFRLFdBQ3hCLEtBQUssV0FBVyxFQUFNLFlBRy9CLEdBQUksSUFBWSxDQUFDLEtBQU0sUUFBUyxHQUFjLENBQUMsS0FBTSxVQUVyRCxHQUFLLE1BQVEsU0FBUyxFQUFTLENBQzdCLEdBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxDQUFDLEtBQUssYUFBYSxPQUFVLE1BQU8sR0FDeEUsR0FBZSxVQUFZLEtBQUssSUFDaEMsR0FBSSxHQUFPLEdBQWUsS0FBSyxLQUFLLE9BQ2hDLEVBQU8sS0FBSyxJQUFNLEVBQUssR0FBRyxPQUFRLEVBQVMsS0FBSyxNQUFNLFdBQVcsR0FLckUsR0FBSSxJQUFXLEdBQU0sTUFBTyxHQUM1QixHQUFJLEVBQVcsTUFBTyxHQUV0QixHQUFJLElBQVcsSUFBTyxNQUFPLEdBQzdCLEdBQUksRUFBa0IsRUFBUSxJQUFPLENBRW5DLE9BREksR0FBTSxFQUFPLEVBQ1YsRUFBaUIsS0FBSyxNQUFNLFdBQVcsR0FBTSxLQUFTLEVBQUUsRUFDL0QsR0FBSSxHQUFRLEtBQUssTUFBTSxNQUFNLEVBQU0sR0FDbkMsR0FBSSxDQUFDLEVBQTBCLEtBQUssR0FBVSxNQUFPLEdBRXZELE1BQU8sSUFNVCxHQUFLLGdCQUFrQixVQUFXLENBQ2hDLEdBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxDQUFDLEtBQUssYUFBYSxTQUNuRCxNQUFPLEdBRVgsR0FBZSxVQUFZLEtBQUssSUFDaEMsR0FBSSxHQUFPLEdBQWUsS0FBSyxLQUFLLE9BQ2hDLEVBQU8sS0FBSyxJQUFNLEVBQUssR0FBRyxPQUM5QixNQUFPLENBQUMsR0FBVSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssSUFBSyxLQUNoRCxLQUFLLE1BQU0sTUFBTSxFQUFNLEVBQU8sS0FBTyxZQUNwQyxHQUFPLElBQU0sS0FBSyxNQUFNLFFBQVUsQ0FBQyxFQUFpQixLQUFLLE1BQU0sT0FBTyxFQUFPLE1BVWxGLEdBQUssZUFBaUIsU0FBUyxFQUFTLEVBQVUsRUFBUyxDQUN6RCxHQUFJLEdBQVksS0FBSyxLQUFNLEVBQU8sS0FBSyxZQUFhLEVBV3BELE9BVEksS0FBSyxNQUFNLElBQ2IsR0FBWSxFQUFNLEtBQ2xCLEVBQU8sT0FPRCxPQUNILEdBQU0sV0FBYSxHQUFNLFVBQVcsTUFBTyxNQUFLLDRCQUE0QixFQUFNLEVBQVUsYUFDNUYsR0FBTSxVQUFXLE1BQU8sTUFBSyx1QkFBdUIsT0FDcEQsR0FBTSxJQUFLLE1BQU8sTUFBSyxpQkFBaUIsT0FDeEMsR0FBTSxLQUFNLE1BQU8sTUFBSyxrQkFBa0IsT0FDMUMsR0FBTSxVQUlULE1BQUssSUFBWSxNQUFLLFFBQVUsSUFBWSxNQUFRLElBQVksVUFBYSxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssYUFDNUcsS0FBSyx1QkFBdUIsRUFBTSxHQUFPLENBQUMsT0FDOUMsR0FBTSxPQUNULE1BQUksSUFBVyxLQUFLLGFBQ2IsS0FBSyxXQUFXLEVBQU0sUUFDMUIsR0FBTSxJQUFLLE1BQU8sTUFBSyxpQkFBaUIsT0FDeEMsR0FBTSxRQUFTLE1BQU8sTUFBSyxxQkFBcUIsT0FDaEQsR0FBTSxRQUFTLE1BQU8sTUFBSyxxQkFBcUIsT0FDaEQsR0FBTSxPQUFRLE1BQU8sTUFBSyxvQkFBb0IsT0FDOUMsR0FBTSxLQUFNLE1BQU8sTUFBSyxrQkFBa0IsT0FDMUMsR0FBTSxXQUFhLEdBQU0sS0FDNUIsU0FBTyxHQUFRLEtBQUssTUFDaEIsR0FBVyxJQUFTLE9BQVMsS0FBSyxhQUMvQixLQUFLLGtCQUFrQixFQUFNLE9BQ2pDLEdBQU0sT0FBUSxNQUFPLE1BQUssb0JBQW9CLE9BQzlDLEdBQU0sTUFBTyxNQUFPLE1BQUssbUJBQW1CLE9BQzVDLEdBQU0sT0FBUSxNQUFPLE1BQUssV0FBVyxHQUFNLE9BQzNDLEdBQU0sS0FBTSxNQUFPLE1BQUssb0JBQW9CLE9BQzVDLEdBQU0sWUFDTixHQUFNLFFBQ1QsR0FBSSxLQUFLLFFBQVEsWUFBYyxJQUFNLElBQWMsRUFBTSxRQUFTLENBQ2hFLEdBQWUsVUFBWSxLQUFLLElBQ2hDLEdBQUksR0FBTyxHQUFlLEtBQUssS0FBSyxPQUNoQyxFQUFPLEtBQUssSUFBTSxFQUFLLEdBQUcsT0FBUSxFQUFTLEtBQUssTUFBTSxXQUFXLEdBQ3JFLEdBQUksSUFBVyxJQUFNLElBQVcsR0FDNUIsTUFBTyxNQUFLLHlCQUF5QixFQUFNLEtBQUssbUJBR3RELE1BQUssTUFBSyxRQUFRLDZCQUNYLElBQ0QsS0FBSyxNQUFNLEtBQUssTUFBTywwREFDdEIsS0FBSyxVQUNOLEtBQUssTUFBTSxLQUFLLE1BQU8sb0VBRXRCLElBQWMsRUFBTSxRQUFVLEtBQUssWUFBWSxHQUFRLEtBQUssWUFBWSxFQUFNLFdBUXJGLEdBQUksS0FBSyxrQkFDUCxNQUFJLElBQVcsS0FBSyxhQUNwQixLQUFLLE9BQ0UsS0FBSyx1QkFBdUIsRUFBTSxHQUFNLENBQUMsR0FHbEQsR0FBSSxJQUFZLEtBQUssTUFBTyxHQUFPLEtBQUssa0JBQ3hDLE1BQUksS0FBYyxFQUFNLE1BQVEsR0FBSyxPQUFTLGNBQWdCLEtBQUssSUFBSSxFQUFNLE9BQ2xFLEtBQUssc0JBQXNCLEVBQU0sR0FBVyxHQUFNLEdBQy9DLEtBQUsseUJBQXlCLEVBQU0sTUFJdEQsR0FBSyw0QkFBOEIsU0FBUyxFQUFNLEVBQVMsQ0FDekQsR0FBSSxHQUFVLElBQVksUUFDMUIsS0FBSyxPQUNMLEFBQUksS0FBSyxJQUFJLEVBQU0sT0FBUyxLQUFLLGtCQUFxQixFQUFLLE1BQVEsS0FDOUQsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssYUFFeEMsR0FBSyxNQUFRLEtBQUssYUFDbEIsS0FBSyxhQU1QLE9BREksR0FBSSxFQUNELEVBQUksS0FBSyxPQUFPLE9BQVEsRUFBRSxFQUFHLENBQ2xDLEdBQUksR0FBTSxLQUFLLE9BQU8sR0FDdEIsR0FBSSxHQUFLLE9BQVMsTUFBUSxFQUFJLE9BQVMsRUFBSyxNQUFNLE9BQzVDLEdBQUksTUFBUSxNQUFTLElBQVcsRUFBSSxPQUFTLFNBQzdDLEVBQUssT0FBUyxHQUFXLE1BR2pDLE1BQUksS0FBTSxLQUFLLE9BQU8sUUFBVSxLQUFLLE1BQU0sRUFBSyxNQUFPLGVBQWlCLEdBQ2pFLEtBQUssV0FBVyxFQUFNLEVBQVUsaUJBQW1CLHNCQUc1RCxHQUFLLHVCQUF5QixTQUFTLEVBQU0sQ0FDM0MsWUFBSyxPQUNMLEtBQUssWUFDRSxLQUFLLFdBQVcsRUFBTSxzQkFHL0IsR0FBSyxpQkFBbUIsU0FBUyxFQUFNLENBQ3JDLFlBQUssT0FDTCxLQUFLLE9BQU8sS0FBSyxJQUNqQixFQUFLLEtBQU8sS0FBSyxlQUFlLE1BQ2hDLEtBQUssT0FBTyxNQUNaLEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssS0FBTyxLQUFLLHVCQUNqQixBQUFJLEtBQUssUUFBUSxhQUFlLEVBQzVCLEtBQUssSUFBSSxFQUFNLE1BRWYsS0FBSyxZQUNGLEtBQUssV0FBVyxFQUFNLHFCQVcvQixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FDdEMsS0FBSyxPQUNMLEdBQUksR0FBVyxLQUFLLFFBQVEsYUFBZSxHQUFNLE1BQUssU0FBWSxDQUFDLEtBQUssWUFBYyxLQUFLLFFBQVEsNEJBQStCLEtBQUssY0FBYyxTQUFZLEtBQUssYUFBZSxHQUlyTCxHQUhBLEtBQUssT0FBTyxLQUFLLElBQ2pCLEtBQUssV0FBVyxHQUNoQixLQUFLLE9BQU8sRUFBTSxRQUNkLEtBQUssT0FBUyxFQUFNLEtBQ3RCLE1BQUksR0FBVSxJQUFNLEtBQUssV0FBVyxHQUM3QixLQUFLLFNBQVMsRUFBTSxNQUU3QixHQUFJLEdBQVEsS0FBSyxRQUNqQixHQUFJLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxPQUFTLEVBQU0sUUFBVSxFQUFPLENBQ25FLEdBQUksR0FBUyxLQUFLLFlBQWEsRUFBTyxFQUFRLE1BQVEsS0FBSyxNQUkzRCxNQUhBLE1BQUssT0FDTCxLQUFLLFNBQVMsRUFBUSxHQUFNLEdBQzVCLEtBQUssV0FBVyxFQUFRLHVCQUNuQixNQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxhQUFhLFFBQVcsRUFBTyxhQUFhLFNBQVcsRUFDeEgsTUFBSyxRQUFRLGFBQWUsR0FDOUIsQ0FBSSxLQUFLLE9BQVMsRUFBTSxJQUNsQixFQUFVLElBQU0sS0FBSyxXQUFXLEdBQzdCLEVBQUssTUFBUSxFQUFVLElBRTNCLEtBQUssV0FBVyxFQUFNLElBRTNCLEdBQVUsSUFBTSxLQUFLLFdBQVcsR0FDN0IsS0FBSyxTQUFTLEVBQU0sSUFFN0IsR0FBSSxHQUF5QixHQUFJLElBQzdCLEVBQU8sS0FBSyxnQkFBZ0IsR0FBTSxHQUN0QyxNQUFJLE1BQUssT0FBUyxFQUFNLEtBQVEsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLGFBQWEsTUFDN0UsTUFBSyxRQUFRLGFBQWUsR0FDOUIsQ0FBSSxLQUFLLE9BQVMsRUFBTSxJQUNsQixFQUFVLElBQU0sS0FBSyxXQUFXLEdBQzdCLEVBQUssTUFBUSxFQUFVLElBRWxDLEtBQUssYUFBYSxFQUFNLEdBQU8sR0FDL0IsS0FBSyxVQUFVLEdBQ1IsS0FBSyxXQUFXLEVBQU0sSUFFN0IsTUFBSyxzQkFBc0IsRUFBd0IsSUFFakQsRUFBVSxJQUFNLEtBQUssV0FBVyxHQUM3QixLQUFLLFNBQVMsRUFBTSxLQUc3QixHQUFLLHVCQUF5QixTQUFTLEVBQU0sRUFBUyxFQUFxQixDQUN6RSxZQUFLLE9BQ0UsS0FBSyxjQUFjLEVBQU0sR0FBa0IsR0FBc0IsRUFBSSxJQUF5QixHQUFPLElBRzlHLEdBQUssaUJBQW1CLFNBQVMsRUFBTSxDQUNyQyxZQUFLLE9BQ0wsRUFBSyxLQUFPLEtBQUssdUJBRWpCLEVBQUssV0FBYSxLQUFLLGVBQWUsTUFDdEMsRUFBSyxVQUFZLEtBQUssSUFBSSxFQUFNLE9BQVMsS0FBSyxlQUFlLE1BQVEsS0FDOUQsS0FBSyxXQUFXLEVBQU0sZ0JBRy9CLEdBQUsscUJBQXVCLFNBQVMsRUFBTSxDQUN6QyxNQUFJLENBQUMsS0FBSyxZQUFjLENBQUMsS0FBSyxRQUFRLDRCQUNsQyxLQUFLLE1BQU0sS0FBSyxNQUFPLGdDQUMzQixLQUFLLE9BTUwsQUFBSSxLQUFLLElBQUksRUFBTSxPQUFTLEtBQUssa0JBQXFCLEVBQUssU0FBVyxLQUMvRCxHQUFLLFNBQVcsS0FBSyxrQkFBbUIsS0FBSyxhQUM3QyxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSyxxQkFBdUIsU0FBUyxFQUFNLENBQ3pDLEtBQUssT0FDTCxFQUFLLGFBQWUsS0FBSyx1QkFDekIsRUFBSyxNQUFRLEdBQ2IsS0FBSyxPQUFPLEVBQU0sUUFDbEIsS0FBSyxPQUFPLEtBQUssSUFDakIsS0FBSyxXQUFXLEdBT2hCLE9BREksR0FDSyxFQUFhLEdBQU8sS0FBSyxPQUFTLEVBQU0sUUFDL0MsR0FBSSxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssT0FBUyxFQUFNLFNBQVUsQ0FDN0QsR0FBSSxHQUFTLEtBQUssT0FBUyxFQUFNLE1BQ2pDLEFBQUksR0FBTyxLQUFLLFdBQVcsRUFBSyxjQUNoQyxFQUFLLE1BQU0sS0FBSyxFQUFNLEtBQUssYUFDM0IsRUFBSSxXQUFhLEdBQ2pCLEtBQUssT0FDTCxBQUFJLEVBQ0YsRUFBSSxLQUFPLEtBQUssa0JBRVosSUFBYyxLQUFLLGlCQUFpQixLQUFLLGFBQWMsNEJBQzNELEVBQWEsR0FDYixFQUFJLEtBQU8sTUFFYixLQUFLLE9BQU8sRUFBTSxXQUVsQixBQUFLLElBQU8sS0FBSyxhQUNqQixFQUFJLFdBQVcsS0FBSyxLQUFLLGVBQWUsT0FHNUMsWUFBSyxZQUNELEdBQU8sS0FBSyxXQUFXLEVBQUssY0FDaEMsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLG9CQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNELEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxTQUN0RCxLQUFLLE1BQU0sS0FBSyxXQUFZLCtCQUNoQyxFQUFLLFNBQVcsS0FBSyxrQkFDckIsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLG1CQUsvQixHQUFJLElBQVEsR0FFWixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FJdEMsR0FIQSxLQUFLLE9BQ0wsRUFBSyxNQUFRLEtBQUssYUFDbEIsRUFBSyxRQUFVLEtBQ1gsS0FBSyxPQUFTLEVBQU0sT0FBUSxDQUM5QixHQUFJLEdBQVMsS0FBSyxZQUVsQixHQURBLEtBQUssT0FDRCxLQUFLLElBQUksRUFBTSxRQUFTLENBQzFCLEVBQU8sTUFBUSxLQUFLLG1CQUNwQixHQUFJLEdBQVMsRUFBTyxNQUFNLE9BQVMsYUFDbkMsS0FBSyxXQUFXLEVBQVMsR0FBcUIsR0FDOUMsS0FBSyxVQUFVLEVBQU8sTUFBTyxFQUFTLEdBQW9CLElBQzFELEtBQUssT0FBTyxFQUFNLFlBRWxCLEFBQUksTUFBSyxRQUFRLFlBQWMsSUFBTSxLQUFLLGFBQzFDLEVBQU8sTUFBUSxLQUNmLEtBQUssV0FBVyxHQUVsQixFQUFPLEtBQU8sS0FBSyxXQUFXLElBQzlCLEtBQUssWUFDTCxFQUFLLFFBQVUsS0FBSyxXQUFXLEVBQVEsZUFFekMsU0FBSyxVQUFZLEtBQUssSUFBSSxFQUFNLFVBQVksS0FBSyxhQUFlLEtBQzVELENBQUMsRUFBSyxTQUFXLENBQUMsRUFBSyxXQUN2QixLQUFLLE1BQU0sRUFBSyxNQUFPLG1DQUNwQixLQUFLLFdBQVcsRUFBTSxpQkFHL0IsR0FBSyxrQkFBb0IsU0FBUyxFQUFNLEVBQU0sQ0FDNUMsWUFBSyxPQUNMLEtBQUssU0FBUyxFQUFNLEdBQU8sR0FDM0IsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLHdCQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNMLEVBQUssS0FBTyxLQUFLLHVCQUNqQixLQUFLLE9BQU8sS0FBSyxJQUNqQixFQUFLLEtBQU8sS0FBSyxlQUFlLFNBQ2hDLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLG1CQUcvQixHQUFLLG1CQUFxQixTQUFTLEVBQU0sQ0FDdkMsTUFBSSxNQUFLLFFBQVUsS0FBSyxNQUFNLEtBQUssTUFBTyx5QkFDMUMsS0FBSyxPQUNMLEVBQUssT0FBUyxLQUFLLHVCQUNuQixFQUFLLEtBQU8sS0FBSyxlQUFlLFFBQ3pCLEtBQUssV0FBVyxFQUFNLGtCQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNFLEtBQUssV0FBVyxFQUFNLG1CQUcvQixHQUFLLHNCQUF3QixTQUFTLEVBQU0sRUFBVyxFQUFNLEVBQVMsQ0FDcEUsT0FBUyxHQUFNLEVBQUcsRUFBTyxLQUFLLE9BQVEsRUFBTSxFQUFLLE9BQVEsR0FBTyxFQUM5RCxDQUNBLEdBQUksR0FBUSxFQUFLLEdBRWpCLEFBQUksRUFBTSxPQUFTLEdBQ2YsS0FBSyxNQUFNLEVBQUssTUFBTyxVQUFZLEVBQVkseUJBR3JELE9BREksR0FBTyxLQUFLLEtBQUssT0FBUyxPQUFTLEtBQUssT0FBUyxFQUFNLFFBQVUsU0FBVyxLQUN2RSxFQUFJLEtBQUssT0FBTyxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDaEQsR0FBSSxJQUFVLEtBQUssT0FBTyxHQUMxQixHQUFJLEdBQVEsaUJBQW1CLEVBQUssTUFFbEMsR0FBUSxlQUFpQixLQUFLLE1BQzlCLEdBQVEsS0FBTyxNQUNSLE9BRVgsWUFBSyxPQUFPLEtBQUssQ0FBQyxLQUFNLEVBQVcsS0FBTSxFQUFNLGVBQWdCLEtBQUssUUFDcEUsRUFBSyxLQUFPLEtBQUssZUFBZSxFQUFVLEVBQVEsUUFBUSxXQUFhLEdBQUssRUFBVSxRQUFVLEVBQVUsU0FDMUcsS0FBSyxPQUFPLE1BQ1osRUFBSyxNQUFRLEVBQ04sS0FBSyxXQUFXLEVBQU0scUJBRy9CLEdBQUsseUJBQTJCLFNBQVMsRUFBTSxFQUFNLENBQ25ELFNBQUssV0FBYSxFQUNsQixLQUFLLFlBQ0UsS0FBSyxXQUFXLEVBQU0sd0JBTy9CLEdBQUssV0FBYSxTQUFTLEVBQXVCLEVBQU0sRUFBWSxDQU9sRSxJQU5LLElBQTBCLFFBQVMsR0FBd0IsSUFDM0QsSUFBUyxRQUFTLEdBQU8sS0FBSyxhQUVuQyxFQUFLLEtBQU8sR0FDWixLQUFLLE9BQU8sRUFBTSxRQUNkLEdBQXlCLEtBQUssV0FBVyxHQUN0QyxLQUFLLE9BQVMsRUFBTSxRQUFRLENBQ2pDLEdBQUksR0FBTyxLQUFLLGVBQWUsTUFDL0IsRUFBSyxLQUFLLEtBQUssR0FFakIsTUFBSSxJQUFjLE1BQUssT0FBUyxJQUNoQyxLQUFLLE9BQ0QsR0FBeUIsS0FBSyxZQUMzQixLQUFLLFdBQVcsRUFBTSxtQkFPL0IsR0FBSyxTQUFXLFNBQVMsRUFBTSxFQUFNLENBQ25DLFNBQUssS0FBTyxFQUNaLEtBQUssT0FBTyxFQUFNLE1BQ2xCLEVBQUssS0FBTyxLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQU8sS0FBSyxrQkFDbkQsS0FBSyxPQUFPLEVBQU0sTUFDbEIsRUFBSyxPQUFTLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBTyxLQUFLLGtCQUN2RCxLQUFLLE9BQU8sRUFBTSxRQUNsQixFQUFLLEtBQU8sS0FBSyxlQUFlLE9BQ2hDLEtBQUssWUFDTCxLQUFLLE9BQU8sTUFDTCxLQUFLLFdBQVcsRUFBTSxpQkFNL0IsR0FBSyxXQUFhLFNBQVMsRUFBTSxFQUFNLENBQ3JDLEdBQUksR0FBVSxLQUFLLE9BQVMsRUFBTSxJQUNsQyxZQUFLLE9BRUwsQUFDRSxFQUFLLE9BQVMsdUJBQ2QsRUFBSyxhQUFhLEdBQUcsTUFBUSxNQUUzQixFQUFDLEdBQ0QsS0FBSyxRQUFRLFlBQWMsR0FDM0IsS0FBSyxRQUNMLEVBQUssT0FBUyxPQUNkLEVBQUssYUFBYSxHQUFHLEdBQUcsT0FBUyxjQUduQyxLQUFLLE1BQ0gsRUFBSyxNQUNILEdBQVUsU0FBVyxVQUFZLDBEQUU1QixFQUFLLE9BQVMscUJBQ3ZCLEtBQUssTUFBTSxFQUFLLE1BQU8sc0NBRXpCLEVBQUssS0FBTyxFQUNaLEVBQUssTUFBUSxFQUFVLEtBQUssa0JBQW9CLEtBQUssbUJBQ3JELEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssS0FBTyxLQUFLLGVBQWUsT0FDaEMsS0FBSyxZQUNMLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLEVBQVUsaUJBQW1CLG1CQUs1RCxHQUFLLFNBQVcsU0FBUyxFQUFNLEVBQU8sRUFBTSxDQUcxQyxJQUZBLEVBQUssYUFBZSxHQUNwQixFQUFLLEtBQU8sSUFDSCxDQUNQLEdBQUksR0FBTyxLQUFLLFlBWWhCLEdBWEEsS0FBSyxXQUFXLEVBQU0sR0FDdEIsQUFBSSxLQUFLLElBQUksRUFBTSxJQUNqQixFQUFLLEtBQU8sS0FBSyxpQkFBaUIsR0FDN0IsQUFBSSxJQUFTLFNBQVcsQ0FBRSxNQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxhQUFhLE9BQzlHLEtBQUssYUFDQSxBQUFJLEVBQUssR0FBRyxPQUFTLGNBQWdCLENBQUUsSUFBVSxNQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssYUFBYSxRQUNuRyxLQUFLLE1BQU0sS0FBSyxXQUFZLDREQUU1QixFQUFLLEtBQU8sS0FFZCxFQUFLLGFBQWEsS0FBSyxLQUFLLFdBQVcsRUFBTSx1QkFDekMsQ0FBQyxLQUFLLElBQUksRUFBTSxPQUFVLE1BRWhDLE1BQU8sSUFHVCxHQUFLLFdBQWEsU0FBUyxFQUFNLEVBQU0sQ0FDckMsRUFBSyxHQUFLLEtBQUssbUJBQ2YsS0FBSyxVQUFVLEVBQUssR0FBSSxJQUFTLE1BQVEsR0FBVyxHQUFjLEtBR3BFLEdBQUksSUFBaUIsRUFBRyxHQUF5QixFQUFHLEdBQW1CLEVBTXZFLEdBQUssY0FBZ0IsU0FBUyxFQUFNLEVBQVcsRUFBcUIsRUFBUyxDQUMzRSxLQUFLLGFBQWEsR0FDZCxNQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxJQUNqRSxNQUFLLE9BQVMsRUFBTSxNQUFTLEVBQVksSUFDekMsS0FBSyxhQUNULEVBQUssVUFBWSxLQUFLLElBQUksRUFBTSxPQUU5QixLQUFLLFFBQVEsYUFBZSxHQUM1QixHQUFLLE1BQVEsQ0FBQyxDQUFDLEdBRWYsRUFBWSxJQUNkLEdBQUssR0FBTSxFQUFZLElBQXFCLEtBQUssT0FBUyxFQUFNLEtBQU8sS0FBTyxLQUFLLGFBQy9FLEVBQUssSUFBTSxDQUFFLEdBQVksS0FLekIsS0FBSyxVQUFVLEVBQUssR0FBSyxLQUFLLFFBQVUsRUFBSyxXQUFhLEVBQUssTUFBUyxLQUFLLG9CQUFzQixHQUFXLEdBQWUsS0FHbkksR0FBSSxHQUFjLEtBQUssU0FBVSxFQUFjLEtBQUssU0FBVSxFQUFtQixLQUFLLGNBQ3RGLFlBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUNyQixLQUFLLFdBQVcsR0FBYyxFQUFLLE1BQU8sRUFBSyxZQUV6QyxFQUFZLElBQ2QsR0FBSyxHQUFLLEtBQUssT0FBUyxFQUFNLEtBQU8sS0FBSyxhQUFlLE1BRTdELEtBQUssb0JBQW9CLEdBQ3pCLEtBQUssa0JBQWtCLEVBQU0sRUFBcUIsSUFFbEQsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ2QsS0FBSyxXQUFXLEVBQU8sRUFBWSxHQUFrQixzQkFBd0IsdUJBR3RGLEdBQUssb0JBQXNCLFNBQVMsRUFBTSxDQUN4QyxLQUFLLE9BQU8sRUFBTSxRQUNsQixFQUFLLE9BQVMsS0FBSyxpQkFBaUIsRUFBTSxPQUFRLEdBQU8sS0FBSyxRQUFRLGFBQWUsR0FDckYsS0FBSyxrQ0FNUCxHQUFLLFdBQWEsU0FBUyxFQUFNLEVBQWEsQ0FDNUMsS0FBSyxPQUlMLEdBQUksR0FBWSxLQUFLLE9BQ3JCLEtBQUssT0FBUyxHQUVkLEtBQUssYUFBYSxFQUFNLEdBQ3hCLEtBQUssZ0JBQWdCLEdBQ3JCLEdBQUksR0FBWSxLQUFLLFlBQ2pCLEVBQWlCLEdBR3JCLElBRkEsRUFBVSxLQUFPLEdBQ2pCLEtBQUssT0FBTyxFQUFNLFFBQ1gsS0FBSyxPQUFTLEVBQU0sUUFBUSxDQUNqQyxHQUFJLEdBQVUsS0FBSyxrQkFBa0IsRUFBSyxhQUFlLE1BQ3pELEFBQUksR0FDRixHQUFVLEtBQUssS0FBSyxHQUNoQixFQUFRLE9BQVMsb0JBQXNCLEVBQVEsT0FBUyxlQUN0RCxJQUFrQixLQUFLLE1BQU0sRUFBUSxNQUFPLDJDQUNoRCxFQUFpQixLQUl2QixZQUFLLE9BQVMsRUFDZCxLQUFLLE9BQ0wsRUFBSyxLQUFPLEtBQUssV0FBVyxFQUFXLGFBQ2hDLEtBQUssV0FBVyxFQUFNLEVBQWMsbUJBQXFCLG9CQUdsRSxHQUFLLGtCQUFvQixTQUFTLEVBQXdCLENBQ3hELEdBQUksR0FBUyxLQUViLEdBQUksS0FBSyxJQUFJLEVBQU0sTUFBUyxNQUFPLE1BRW5DLEdBQUksR0FBUyxLQUFLLFlBQ2QsRUFBZ0IsU0FBVSxFQUFHLEdBQWEsQ0FDNUMsQUFBSyxLQUFnQixRQUFTLElBQWMsSUFFNUMsR0FBSSxJQUFRLEVBQU8sTUFBTyxHQUFXLEVBQU8sU0FDNUMsTUFBSyxHQUFPLGNBQWMsR0FDdEIsRUFBTyxPQUFTLEVBQU0sUUFBVyxFQUFDLElBQWUsQ0FBQyxFQUFPLHNCQUFnQyxHQUN6RixHQUFPLEtBQU8sRUFBTyxhQUN6QixFQUFPLFNBQVcsR0FDbEIsRUFBTyxJQUFNLEVBQU8sWUFBWSxHQUFPLElBQ3ZDLEVBQU8sSUFBSSxLQUFPLEVBQ2xCLEVBQU8sV0FBVyxFQUFPLElBQUssY0FDdkIsSUFQZ0MsSUFVekMsRUFBTyxLQUFPLFNBQ2QsRUFBTyxPQUFTLEVBQWMsVUFDOUIsR0FBSSxHQUFjLEtBQUssSUFBSSxFQUFNLE1BQzdCLEVBQVUsR0FDZCxBQUFLLEdBQ0gsQ0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQWMsUUFBUyxJQUMxRCxHQUFVLEdBQ1YsRUFBYyxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssSUFBSSxFQUFNLE9BQ3pELEFBQUksRUFBYyxPQUN2QixFQUFPLEtBQU8sTUFDTCxFQUFjLFFBQ3ZCLEdBQU8sS0FBTyxRQUdiLEVBQU8sS0FBTyxLQUFLLGtCQUFrQixHQUMxQyxHQUFJLEdBQU0sRUFBTyxJQUNiLEVBQW9CLEdBQ3hCLE1BQUksQ0FBQyxFQUFPLFVBQVksQ0FBQyxFQUFPLFFBQVcsR0FBSSxPQUFTLGNBQWdCLEVBQUksT0FBUyxlQUNqRixFQUFJLE9BQVMsV0FBYSxFQUFJLFFBQVUsZUFDdEMsR0FBTyxPQUFTLFVBQVksS0FBSyxNQUFNLEVBQUksTUFBTywyQ0FDbEQsR0FBZSxLQUFLLE1BQU0sRUFBSSxNQUFPLG9DQUNyQyxHQUFXLEtBQUssTUFBTSxFQUFJLE1BQU8sd0NBQ3JDLEVBQU8sS0FBTyxjQUNkLEVBQW9CLEdBQ1gsRUFBTyxRQUFVLEVBQUksT0FBUyxjQUFnQixFQUFJLE9BQVMsYUFDcEUsS0FBSyxNQUFNLEVBQUksTUFBTywwREFFeEIsS0FBSyxpQkFBaUIsRUFBUSxFQUFhLEVBQVMsR0FDaEQsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sU0FBVyxHQUN4RCxLQUFLLGlCQUFpQixFQUFPLE1BQU0sTUFBTyxnQ0FDMUMsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sU0FBVyxHQUN4RCxLQUFLLGlCQUFpQixFQUFPLE1BQU0sTUFBTyx3Q0FDMUMsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sR0FBRyxPQUFTLGVBQ3pELEtBQUssaUJBQWlCLEVBQU8sTUFBTSxPQUFPLEdBQUcsTUFBTyxpQ0FDakQsR0FHVCxHQUFLLGlCQUFtQixTQUFTLEVBQVEsRUFBYSxFQUFTLEVBQW1CLENBQ2hGLFNBQU8sTUFBUSxLQUFLLFlBQVksRUFBYSxFQUFTLEdBQy9DLEtBQUssV0FBVyxFQUFRLHFCQUdqQyxHQUFLLGFBQWUsU0FBUyxFQUFNLEVBQWEsQ0FDOUMsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUN0QixHQUFLLEdBQUssS0FBSyxhQUNYLEdBQ0EsS0FBSyxVQUFVLEVBQUssR0FBSSxHQUFjLEtBRXRDLEtBQWdCLElBQ2hCLEtBQUssYUFDVCxFQUFLLEdBQUssT0FJZCxHQUFLLGdCQUFrQixTQUFTLEVBQU0sQ0FDcEMsRUFBSyxXQUFhLEtBQUssSUFBSSxFQUFNLFVBQVksS0FBSyxzQkFBd0IsTUFLNUUsR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFTLENBR3pDLEdBRkEsS0FBSyxPQUVELEtBQUssSUFBSSxFQUFNLE1BQ2pCLE1BQUksTUFBSyxRQUFRLGFBQWUsSUFDOUIsQ0FBSSxLQUFLLGNBQWMsTUFDckIsR0FBSyxTQUFXLEtBQUssV0FBVyxJQUNoQyxLQUFLLFlBQVksRUFBUyxFQUFLLFNBQVMsS0FBTSxLQUFLLGVBRW5ELEVBQUssU0FBVyxNQUdwQixLQUFLLGlCQUFpQixRQUNsQixLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssYUFDdkMsRUFBSyxPQUFTLEtBQUssZ0JBQ25CLEtBQUssWUFDRSxLQUFLLFdBQVcsRUFBTSx3QkFFL0IsR0FBSSxLQUFLLElBQUksRUFBTSxVQUFXLENBQzVCLEtBQUssWUFBWSxFQUFTLFVBQVcsS0FBSyxjQUMxQyxHQUFJLEdBQ0osR0FBSSxLQUFLLE9BQVMsRUFBTSxXQUFjLEdBQVUsS0FBSyxtQkFBb0IsQ0FDdkUsR0FBSSxHQUFRLEtBQUssWUFDakIsS0FBSyxPQUNELEdBQVcsS0FBSyxPQUNwQixFQUFLLFlBQWMsS0FBSyxjQUFjLEVBQU8sR0FBaUIsR0FBa0IsR0FBTyxXQUM5RSxLQUFLLE9BQVMsRUFBTSxPQUFRLENBQ3JDLEdBQUksR0FBUSxLQUFLLFlBQ2pCLEVBQUssWUFBYyxLQUFLLFdBQVcsRUFBTyxrQkFFMUMsR0FBSyxZQUFjLEtBQUssbUJBQ3hCLEtBQUssWUFFUCxNQUFPLE1BQUssV0FBVyxFQUFNLDRCQUcvQixHQUFJLEtBQUssNkJBQ1AsRUFBSyxZQUFjLEtBQUssZUFBZSxNQUN2QyxBQUFJLEVBQUssWUFBWSxPQUFTLHNCQUMxQixLQUFLLG9CQUFvQixFQUFTLEVBQUssWUFBWSxjQUVuRCxLQUFLLFlBQVksRUFBUyxFQUFLLFlBQVksR0FBRyxLQUFNLEVBQUssWUFBWSxHQUFHLE9BQzVFLEVBQUssV0FBYSxHQUNsQixFQUFLLE9BQVMsU0FDVCxDQUdMLEdBRkEsRUFBSyxZQUFjLEtBQ25CLEVBQUssV0FBYSxLQUFLLHNCQUFzQixHQUN6QyxLQUFLLGNBQWMsUUFDckIsQUFBSSxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssYUFDdkMsRUFBSyxPQUFTLEtBQUssb0JBQ2QsQ0FDTCxPQUFTLEdBQUksRUFBRyxFQUFPLEVBQUssV0FBWSxFQUFJLEVBQUssT0FBUSxHQUFLLEVBQUcsQ0FFL0QsR0FBSSxHQUFPLEVBQUssR0FFaEIsS0FBSyxnQkFBZ0IsRUFBSyxPQUUxQixLQUFLLGlCQUFpQixFQUFLLE9BRzdCLEVBQUssT0FBUyxLQUVoQixLQUFLLFlBRVAsTUFBTyxNQUFLLFdBQVcsRUFBTSwyQkFHL0IsR0FBSyxZQUFjLFNBQVMsRUFBUyxFQUFNLEVBQUssQ0FDOUMsQUFBSSxDQUFDLEdBQ0QsSUFBSSxFQUFTLElBQ2IsS0FBSyxpQkFBaUIsRUFBSyxxQkFBdUIsRUFBTyxLQUM3RCxFQUFRLEdBQVEsS0FHbEIsR0FBSyxtQkFBcUIsU0FBUyxFQUFTLEVBQUssQ0FDL0MsR0FBSSxHQUFPLEVBQUksS0FDZixHQUFJLElBQVMsYUFDVCxLQUFLLFlBQVksRUFBUyxFQUFJLEtBQU0sRUFBSSxlQUNuQyxJQUFTLGdCQUNkLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBSSxXQUFZLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDN0QsQ0FDRSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLG1CQUFtQixFQUFTLFdBRTlCLElBQVMsZUFDZCxPQUFTLEdBQU0sRUFBRyxFQUFTLEVBQUksU0FBVSxFQUFNLEVBQU8sT0FBUSxHQUFPLEVBQUcsQ0FDeEUsR0FBSSxHQUFNLEVBQU8sR0FFZixBQUFJLEdBQU8sS0FBSyxtQkFBbUIsRUFBUyxPQUU3QyxBQUFJLEtBQVMsV0FDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksT0FDcEMsQUFBSSxJQUFTLG9CQUNkLEtBQUssbUJBQW1CLEVBQVMsRUFBSSxNQUNwQyxBQUFJLElBQVMsY0FDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksVUFDaEMsSUFBUywyQkFDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksYUFHM0MsR0FBSyxvQkFBc0IsU0FBUyxFQUFTLEVBQU8sQ0FDbEQsR0FBSSxFQUFDLEVBQ0wsT0FBUyxHQUFJLEVBQUcsRUFBTyxFQUFPLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDbEQsQ0FDQSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLG1CQUFtQixFQUFTLEVBQUssTUFJMUMsR0FBSywyQkFBNkIsVUFBVyxDQUMzQyxNQUFPLE1BQUssS0FBSyxVQUFZLE9BQzNCLEtBQUssS0FBSyxVQUFZLFNBQ3RCLEtBQUssS0FBSyxVQUFZLFNBQ3RCLEtBQUssS0FBSyxVQUFZLFlBQ3RCLEtBQUssU0FDTCxLQUFLLG1CQUtULEdBQUssc0JBQXdCLFNBQVMsRUFBUyxDQUM3QyxHQUFJLEdBQVEsR0FBSSxFQUFRLEdBR3hCLElBREEsS0FBSyxPQUFPLEVBQU0sUUFDWCxDQUFDLEtBQUssSUFBSSxFQUFNLFNBQVMsQ0FDOUIsR0FBSyxFQUdJLEVBQVEsV0FGZixLQUFLLE9BQU8sRUFBTSxPQUNkLEtBQUssbUJBQW1CLEVBQU0sUUFBVyxNQUcvQyxHQUFJLEdBQU8sS0FBSyxZQUNoQixFQUFLLE1BQVEsS0FBSyxXQUFXLElBQzdCLEVBQUssU0FBVyxLQUFLLGNBQWMsTUFBUSxLQUFLLFdBQVcsSUFBUSxFQUFLLE1BQ3hFLEtBQUssWUFBWSxFQUFTLEVBQUssU0FBUyxLQUFNLEVBQUssU0FBUyxPQUM1RCxFQUFNLEtBQUssS0FBSyxXQUFXLEVBQU0sb0JBRW5DLE1BQU8sSUFLVCxHQUFLLFlBQWMsU0FBUyxFQUFNLENBQ2hDLFlBQUssT0FFTCxBQUFJLEtBQUssT0FBUyxFQUFNLE9BQ3RCLEdBQUssV0FBYSxHQUNsQixFQUFLLE9BQVMsS0FBSyxpQkFFbkIsR0FBSyxXQUFhLEtBQUssd0JBQ3ZCLEtBQUssaUJBQWlCLFFBQ3RCLEVBQUssT0FBUyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssZ0JBQWtCLEtBQUssY0FFekUsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLHNCQUsvQixHQUFLLHNCQUF3QixVQUFXLENBQ3RDLEdBQUksR0FBUSxHQUFJLEVBQVEsR0FDeEIsR0FBSSxLQUFLLE9BQVMsRUFBTSxLQUFNLENBRTVCLEdBQUksR0FBTyxLQUFLLFlBSWhCLEdBSEEsRUFBSyxNQUFRLEtBQUssYUFDbEIsS0FBSyxVQUFVLEVBQUssTUFBTyxJQUMzQixFQUFNLEtBQUssS0FBSyxXQUFXLEVBQU0sMkJBQzdCLENBQUMsS0FBSyxJQUFJLEVBQU0sT0FBVSxNQUFPLEdBRXZDLEdBQUksS0FBSyxPQUFTLEVBQU0sS0FBTSxDQUM1QixHQUFJLEdBQVMsS0FBSyxZQUNsQixZQUFLLE9BQ0wsS0FBSyxpQkFBaUIsTUFDdEIsRUFBTyxNQUFRLEtBQUssYUFDcEIsS0FBSyxVQUFVLEVBQU8sTUFBTyxJQUM3QixFQUFNLEtBQUssS0FBSyxXQUFXLEVBQVEsNkJBQzVCLEVBR1QsSUFEQSxLQUFLLE9BQU8sRUFBTSxRQUNYLENBQUMsS0FBSyxJQUFJLEVBQU0sU0FBUyxDQUM5QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsS0FBSyxtQkFBbUIsRUFBTSxRQUFXLE1BRy9DLEdBQUksR0FBUyxLQUFLLFlBQ2xCLEVBQU8sU0FBVyxLQUFLLFdBQVcsSUFDbEMsQUFBSSxLQUFLLGNBQWMsTUFDckIsRUFBTyxNQUFRLEtBQUssYUFFcEIsTUFBSyxnQkFBZ0IsRUFBTyxVQUM1QixFQUFPLE1BQVEsRUFBTyxVQUV4QixLQUFLLFVBQVUsRUFBTyxNQUFPLElBQzdCLEVBQU0sS0FBSyxLQUFLLFdBQVcsRUFBUSxvQkFFckMsTUFBTyxJQUlULEdBQUssdUJBQXlCLFNBQVMsRUFBWSxDQUNqRCxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVcsUUFBVSxLQUFLLHFCQUFxQixFQUFXLElBQUssRUFBRSxFQUNuRixFQUFXLEdBQUcsVUFBWSxFQUFXLEdBQUcsV0FBVyxJQUFJLE1BQU0sRUFBRyxLQUdwRSxHQUFLLHFCQUF1QixTQUFTLEVBQVcsQ0FDOUMsTUFDRSxHQUFVLE9BQVMsdUJBQ25CLEVBQVUsV0FBVyxPQUFTLFdBQzlCLE1BQU8sR0FBVSxXQUFXLE9BQVUsVUFFckMsTUFBSyxNQUFNLEVBQVUsU0FBVyxLQUFRLEtBQUssTUFBTSxFQUFVLFNBQVcsTUFJN0UsR0FBSSxJQUFPLEdBQU8sVUFLbEIsR0FBSyxhQUFlLFNBQVMsRUFBTSxFQUFXLEVBQXdCLENBQ3BFLEdBQUksS0FBSyxRQUFRLGFBQWUsR0FBSyxFQUNuQyxPQUFRLEVBQUssVUFDUixhQUNILEFBQUksS0FBSyxTQUFXLEVBQUssT0FBUyxTQUM5QixLQUFLLE1BQU0sRUFBSyxNQUFPLDZEQUMzQixVQUVHLG9CQUNBLG1CQUNBLGNBQ0gsVUFFRyxtQkFDSCxFQUFLLEtBQU8sZ0JBQ1IsR0FBMEIsS0FBSyxtQkFBbUIsRUFBd0IsSUFDOUUsT0FBUyxHQUFJLEVBQUcsRUFBTyxFQUFLLFdBQVksRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUFHLENBQy9ELEdBQUksR0FBTyxFQUFLLEdBRWxCLEtBQUssYUFBYSxFQUFNLEdBT3BCLEVBQUssT0FBUyxlQUNiLEdBQUssU0FBUyxPQUFTLGdCQUFrQixFQUFLLFNBQVMsT0FBUyxrQkFFakUsS0FBSyxNQUFNLEVBQUssU0FBUyxNQUFPLG9CQUdwQyxVQUVHLFdBRUgsQUFBSSxFQUFLLE9BQVMsUUFBVSxLQUFLLE1BQU0sRUFBSyxJQUFJLE1BQU8saURBQ3ZELEtBQUssYUFBYSxFQUFLLE1BQU8sR0FDOUIsVUFFRyxrQkFDSCxFQUFLLEtBQU8sZUFDUixHQUEwQixLQUFLLG1CQUFtQixFQUF3QixJQUM5RSxLQUFLLGlCQUFpQixFQUFLLFNBQVUsR0FDckMsVUFFRyxnQkFDSCxFQUFLLEtBQU8sY0FDWixLQUFLLGFBQWEsRUFBSyxTQUFVLEdBQzdCLEVBQUssU0FBUyxPQUFTLHFCQUN2QixLQUFLLE1BQU0sRUFBSyxTQUFTLE1BQU8sNkNBQ3BDLFVBRUcsdUJBQ0gsQUFBSSxFQUFLLFdBQWEsS0FBTyxLQUFLLE1BQU0sRUFBSyxLQUFLLElBQUssK0RBQ3ZELEVBQUssS0FBTyxvQkFDWixNQUFPLEdBQUssU0FDWixLQUFLLGFBQWEsRUFBSyxLQUFNLE9BRzFCLG9CQUNILFVBRUcsMEJBQ0gsS0FBSyxhQUFhLEVBQUssV0FBWSxFQUFXLEdBQzlDLFVBRUcsa0JBQ0gsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLHFEQUNsQyxVQUVHLG1CQUNILEdBQUksQ0FBQyxFQUFhLGNBR2xCLEtBQUssTUFBTSxFQUFLLE1BQU8sMkJBRXBCLEFBQUksSUFBMEIsS0FBSyxtQkFBbUIsRUFBd0IsSUFDckYsTUFBTyxJQUtULEdBQUssaUJBQW1CLFNBQVMsRUFBVSxFQUFXLENBRXBELE9BREksR0FBTSxFQUFTLE9BQ1YsRUFBSSxFQUFHLEVBQUksRUFBSyxJQUFLLENBQzVCLEdBQUksR0FBTSxFQUFTLEdBQ25CLEFBQUksR0FBTyxLQUFLLGFBQWEsRUFBSyxHQUVwQyxHQUFJLEVBQUssQ0FDUCxHQUFJLEdBQU8sRUFBUyxFQUFNLEdBQzFCLEFBQUksS0FBSyxRQUFRLGNBQWdCLEdBQUssR0FBYSxHQUFRLEVBQUssT0FBUyxlQUFpQixFQUFLLFNBQVMsT0FBUyxjQUM3RyxLQUFLLFdBQVcsRUFBSyxTQUFTLE9BRXBDLE1BQU8sSUFLVCxHQUFLLFlBQWMsU0FBUyxFQUF3QixDQUNsRCxHQUFJLEdBQU8sS0FBSyxZQUNoQixZQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEdBQU8sR0FDdEMsS0FBSyxXQUFXLEVBQU0sa0JBRy9CLEdBQUssaUJBQW1CLFVBQVcsQ0FDakMsR0FBSSxHQUFPLEtBQUssWUFDaEIsWUFBSyxPQUdELEtBQUssUUFBUSxjQUFnQixHQUFLLEtBQUssT0FBUyxFQUFNLE1BQ3RELEtBQUssYUFFVCxFQUFLLFNBQVcsS0FBSyxtQkFFZCxLQUFLLFdBQVcsRUFBTSxnQkFLL0IsR0FBSyxpQkFBbUIsVUFBVyxDQUNqQyxHQUFJLEtBQUssUUFBUSxhQUFlLEVBQzlCLE9BQVEsS0FBSyxVQUNSLEdBQU0sU0FDVCxHQUFJLEdBQU8sS0FBSyxZQUNoQixZQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEVBQU0sU0FBVSxHQUFNLElBQ3JELEtBQUssV0FBVyxFQUFNLG9CQUUxQixHQUFNLE9BQ1QsTUFBTyxNQUFLLFNBQVMsSUFHekIsTUFBTyxNQUFLLGNBR2QsR0FBSyxpQkFBbUIsU0FBUyxFQUFPLEVBQVksRUFBb0IsQ0FFdEUsT0FESSxHQUFPLEdBQUksRUFBUSxHQUNoQixDQUFDLEtBQUssSUFBSSxJQUdmLEdBRkEsQUFBSSxFQUFTLEVBQVEsR0FDZCxLQUFLLE9BQU8sRUFBTSxPQUNyQixHQUFjLEtBQUssT0FBUyxFQUFNLE1BQ3BDLEVBQUssS0FBSyxVQUNMLElBQUksR0FBc0IsS0FBSyxtQkFBbUIsR0FDdkQsTUFDSyxHQUFJLEtBQUssT0FBUyxFQUFNLFNBQVUsQ0FDdkMsR0FBSSxHQUFPLEtBQUssbUJBQ2hCLEtBQUsscUJBQXFCLEdBQzFCLEVBQUssS0FBSyxHQUNOLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBSyxNQUFNLEtBQUssTUFBTyxpREFDeEQsS0FBSyxPQUFPLEdBQ1osVUFDSyxDQUNMLEdBQUksR0FBTyxLQUFLLGtCQUFrQixLQUFLLE1BQU8sS0FBSyxVQUNuRCxLQUFLLHFCQUFxQixHQUMxQixFQUFLLEtBQUssSUFHZCxNQUFPLElBR1QsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLENBQzFDLE1BQU8sSUFLVCxHQUFLLGtCQUFvQixTQUFTLEVBQVUsRUFBVSxFQUFNLENBRTFELEdBREEsRUFBTyxHQUFRLEtBQUssbUJBQ2hCLEtBQUssUUFBUSxZQUFjLEdBQUssQ0FBQyxLQUFLLElBQUksRUFBTSxJQUFPLE1BQU8sR0FDbEUsR0FBSSxHQUFPLEtBQUssWUFBWSxFQUFVLEdBQ3RDLFNBQUssS0FBTyxFQUNaLEVBQUssTUFBUSxLQUFLLG1CQUNYLEtBQUssV0FBVyxFQUFNLHNCQVUvQixHQUFLLFVBQVksU0FBUyxFQUFNLEVBQWEsRUFBYyxDQUd6RCxPQUZLLElBQWdCLFFBQVMsR0FBYyxJQUVwQyxFQUFLLFVBQ1IsYUFDSCxBQUFJLElBQWdCLElBQWdCLEVBQUssT0FBUyxPQUM5QyxLQUFLLGlCQUFpQixFQUFLLE1BQU8sK0NBQ2xDLEtBQUssUUFBVSxLQUFLLHdCQUF3QixLQUFLLEVBQUssT0FDdEQsS0FBSyxpQkFBaUIsRUFBSyxNQUFRLEdBQWMsV0FBYSxpQkFBbUIsRUFBSyxLQUFPLG1CQUM3RixHQUNFLElBQUksRUFBYyxFQUFLLE9BQ3ZCLEtBQUssaUJBQWlCLEVBQUssTUFBTyx1QkFDdEMsRUFBYSxFQUFLLE1BQVEsSUFFeEIsSUFBZ0IsSUFBYSxJQUFnQixJQUFnQixLQUFLLFlBQVksRUFBSyxLQUFNLEVBQWEsRUFBSyxPQUMvRyxVQUVHLGtCQUNILEtBQUssaUJBQWlCLEVBQUssTUFBTyxxREFDbEMsVUFFRyxtQkFDSCxBQUFJLEdBQWUsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLDZCQUNyRCxVQUVHLGdCQUNILE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBSyxXQUFZLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDNUQsQ0FDRixHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLFVBQVUsRUFBTSxFQUFhLEdBRWxDLFVBRUcsV0FFSCxLQUFLLFVBQVUsRUFBSyxNQUFPLEVBQWEsR0FDeEMsVUFFRyxlQUNILE9BQVMsR0FBTSxFQUFHLEVBQVMsRUFBSyxTQUFVLEVBQU0sRUFBTyxPQUFRLEdBQU8sRUFBRyxDQUN2RSxHQUFJLEdBQU8sRUFBTyxHQUVwQixBQUFJLEdBQVEsS0FBSyxVQUFVLEVBQU0sRUFBYSxHQUU5QyxVQUVHLG9CQUNILEtBQUssVUFBVSxFQUFLLEtBQU0sRUFBYSxHQUN2QyxVQUVHLGNBQ0gsS0FBSyxVQUFVLEVBQUssU0FBVSxFQUFhLEdBQzNDLFVBRUcsMEJBQ0gsS0FBSyxVQUFVLEVBQUssV0FBWSxFQUFhLEdBQzdDLGNBR0EsS0FBSyxNQUFNLEVBQUssTUFBUSxHQUFjLFVBQVksZ0JBQWtCLGFBTXhFLEdBQUksSUFBTyxHQUFPLFVBT2xCLEdBQUssZUFBaUIsU0FBUyxFQUFNLEVBQVUsRUFBd0IsQ0FDckUsR0FBSSxPQUFLLFFBQVEsYUFBZSxHQUFLLEVBQUssT0FBUyxrQkFFL0MsT0FBSyxRQUFRLGFBQWUsR0FBTSxHQUFLLFVBQVksRUFBSyxRQUFVLEVBQUssWUFFM0UsSUFBSSxHQUFNLEVBQUssSUFDWCxFQUNKLE9BQVEsRUFBSSxVQUNQLGFBQWMsRUFBTyxFQUFJLEtBQU0sVUFDL0IsVUFBVyxFQUFPLE9BQU8sRUFBSSxPQUFRLGNBQ2pDLE9BRVQsR0FBSSxHQUFPLEVBQUssS0FDaEIsR0FBSSxLQUFLLFFBQVEsYUFBZSxFQUFHLENBQ2pDLEFBQUksSUFBUyxhQUFlLElBQVMsUUFDL0IsR0FBUyxPQUNYLENBQUksRUFDRSxFQUF1QixZQUFjLEdBQ3JDLEdBQXVCLFlBQWMsRUFBSSxPQUV0QyxLQUFLLGlCQUFpQixFQUFJLE1BQU8sdUNBRTVDLEVBQVMsTUFBUSxJQUVuQixPQUVGLEVBQU8sSUFBTSxFQUNiLEdBQUksR0FBUSxFQUFTLEdBQ3JCLEdBQUksRUFBTyxDQUNULEdBQUksR0FDSixBQUFJLElBQVMsT0FDWCxFQUFlLEtBQUssUUFBVSxFQUFNLE1BQVEsRUFBTSxLQUFPLEVBQU0sSUFFL0QsRUFBZSxFQUFNLE1BQVEsRUFBTSxHQUVqQyxHQUNBLEtBQUssaUJBQWlCLEVBQUksTUFBTyxnQ0FFckMsR0FBUSxFQUFTLEdBQVEsQ0FDdkIsS0FBTSxHQUNOLElBQUssR0FDTCxJQUFLLElBR1QsRUFBTSxHQUFRLEtBa0JoQixHQUFLLGdCQUFrQixTQUFTLEVBQU0sRUFBd0IsQ0FDNUQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGlCQUFpQixFQUFNLEdBQ3ZDLEdBQUksS0FBSyxPQUFTLEVBQU0sTUFBTyxDQUM3QixHQUFJLEdBQU8sS0FBSyxZQUFZLEVBQVUsR0FFdEMsSUFEQSxFQUFLLFlBQWMsQ0FBQyxHQUNiLEtBQUssSUFBSSxFQUFNLFFBQVUsRUFBSyxZQUFZLEtBQUssS0FBSyxpQkFBaUIsRUFBTSxJQUNsRixNQUFPLE1BQUssV0FBVyxFQUFNLHNCQUUvQixNQUFPLElBTVQsR0FBSyxpQkFBbUIsU0FBUyxFQUFNLEVBQXdCLEVBQWdCLENBQzdFLEdBQUksS0FBSyxhQUFhLFNBQVUsQ0FDOUIsR0FBSSxLQUFLLFlBQWUsTUFBTyxNQUFLLFdBQVcsR0FHeEMsS0FBSyxZQUFjLEdBRzVCLEdBQUksR0FBeUIsR0FBTyxFQUFpQixHQUFJLEVBQW1CLEdBQzVFLEFBQUksRUFDRixHQUFpQixFQUF1QixvQkFDeEMsRUFBbUIsRUFBdUIsY0FDMUMsRUFBdUIsb0JBQXNCLEVBQXVCLGNBQWdCLElBRXBGLEdBQXlCLEdBQUksSUFDN0IsRUFBeUIsSUFHM0IsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDM0MsQUFBSSxNQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLE9BQ2xELE1BQUssaUJBQW1CLEtBQUssT0FDakMsR0FBSSxHQUFPLEtBQUssc0JBQXNCLEVBQU0sR0FFNUMsR0FESSxHQUFrQixHQUFPLEVBQWUsS0FBSyxLQUFNLEVBQU0sRUFBVSxJQUNuRSxLQUFLLEtBQUssU0FBVSxDQUN0QixHQUFJLElBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsVUFBSyxTQUFXLEtBQUssTUFDckIsR0FBSyxLQUFPLEtBQUssT0FBUyxFQUFNLEdBQUssS0FBSyxhQUFhLEVBQU0sR0FBTyxHQUEwQixFQUN6RixHQUNILEdBQXVCLG9CQUFzQixFQUF1QixjQUFnQixFQUF1QixZQUFjLElBRXZILEVBQXVCLGlCQUFtQixHQUFLLEtBQUssT0FDcEQsR0FBdUIsZ0JBQWtCLElBQzdDLEtBQUssVUFBVSxHQUNmLEtBQUssT0FDTCxHQUFLLE1BQVEsS0FBSyxpQkFBaUIsR0FDNUIsS0FBSyxXQUFXLEdBQU0sNEJBRTdCLEFBQUksSUFBMEIsS0FBSyxzQkFBc0IsRUFBd0IsSUFFbkYsTUFBSSxHQUFpQixJQUFNLEdBQXVCLG9CQUFzQixHQUNwRSxFQUFtQixJQUFNLEdBQXVCLGNBQWdCLEdBQzdELEdBS1QsR0FBSyxzQkFBd0IsU0FBUyxFQUFNLEVBQXdCLENBQ2xFLEdBQUksR0FBVyxLQUFLLE1BQU8sRUFBVyxLQUFLLFNBQ3ZDLEVBQU8sS0FBSyxhQUFhLEVBQU0sR0FDbkMsR0FBSSxLQUFLLHNCQUFzQixHQUEyQixNQUFPLEdBQ2pFLEdBQUksS0FBSyxJQUFJLEVBQU0sVUFBVyxDQUM1QixHQUFJLEdBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsU0FBSyxLQUFPLEVBQ1osRUFBSyxXQUFhLEtBQUssbUJBQ3ZCLEtBQUssT0FBTyxFQUFNLE9BQ2xCLEVBQUssVUFBWSxLQUFLLGlCQUFpQixHQUNoQyxLQUFLLFdBQVcsRUFBTSx5QkFFL0IsTUFBTyxJQUtULEdBQUssYUFBZSxTQUFTLEVBQU0sRUFBd0IsQ0FDekQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGdCQUFnQixFQUF3QixJQUN4RCxNQUFJLE1BQUssc0JBQXNCLElBQ3hCLEVBQUssUUFBVSxHQUFZLEVBQUssT0FBUywwQkFEaUIsRUFDa0IsS0FBSyxZQUFZLEVBQU0sRUFBVSxFQUFVLEdBQUksSUFTcEksR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFjLEVBQWMsRUFBUyxFQUFNLENBQzNFLEdBQUksR0FBTyxLQUFLLEtBQUssTUFDckIsR0FBSSxHQUFRLE1BQVMsRUFBQyxHQUFRLEtBQUssT0FBUyxFQUFNLE1BQzVDLEVBQU8sRUFBUyxDQUNsQixHQUFJLEdBQVUsS0FBSyxPQUFTLEVBQU0sV0FBYSxLQUFLLE9BQVMsRUFBTSxXQUMvRCxFQUFXLEtBQUssT0FBUyxFQUFNLFNBQ25DLEFBQUksR0FHRixHQUFPLEVBQU0sV0FBVyxPQUUxQixHQUFJLEdBQUssS0FBSyxNQUNkLEtBQUssT0FDTCxHQUFJLElBQVcsS0FBSyxNQUFPLEdBQVcsS0FBSyxTQUN2QyxHQUFRLEtBQUssWUFBWSxLQUFLLGdCQUFnQixLQUFNLElBQVEsR0FBVSxHQUFVLEVBQU0sR0FDdEYsR0FBTyxLQUFLLFlBQVksRUFBYyxFQUFjLEVBQU0sR0FBTyxFQUFJLEdBQVcsR0FDcEYsTUFBSyxJQUFXLEtBQUssT0FBUyxFQUFNLFVBQWMsR0FBYSxNQUFLLE9BQVMsRUFBTSxXQUFhLEtBQUssT0FBUyxFQUFNLGNBQ2xILEtBQUssaUJBQWlCLEtBQUssTUFBTyw0RkFFN0IsS0FBSyxZQUFZLEdBQU0sRUFBYyxFQUFjLEVBQVMsR0FHdkUsTUFBTyxJQUdULEdBQUssWUFBYyxTQUFTLEVBQVUsRUFBVSxFQUFNLEVBQU8sRUFBSSxFQUFTLENBQ3hFLEdBQUksR0FBTyxLQUFLLFlBQVksRUFBVSxHQUN0QyxTQUFLLEtBQU8sRUFDWixFQUFLLFNBQVcsRUFDaEIsRUFBSyxNQUFRLEVBQ04sS0FBSyxXQUFXLEVBQU0sRUFBVSxvQkFBc0IscUJBSy9ELEdBQUssZ0JBQWtCLFNBQVMsRUFBd0IsRUFBVSxDQUNoRSxHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQ3JELEdBQUksS0FBSyxhQUFhLFVBQWEsTUFBSyxTQUFZLENBQUMsS0FBSyxZQUFjLEtBQUssUUFBUSwyQkFDbkYsRUFBTyxLQUFLLGFBQ1osRUFBVyxXQUNGLEtBQUssS0FBSyxPQUFRLENBQzNCLEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBUyxLQUFLLE9BQVMsRUFBTSxPQUMxRCxFQUFLLFNBQVcsS0FBSyxNQUNyQixFQUFLLE9BQVMsR0FDZCxLQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssZ0JBQWdCLEtBQU0sSUFDM0MsS0FBSyxzQkFBc0IsRUFBd0IsSUFDbkQsQUFBSSxFQUFVLEtBQUssVUFBVSxFQUFLLFVBQzdCLEFBQUksS0FBSyxRQUFVLEVBQUssV0FBYSxVQUNqQyxFQUFLLFNBQVMsT0FBUyxhQUM1QixLQUFLLGlCQUFpQixFQUFLLE1BQU8sMENBQy9CLEVBQVcsR0FDbEIsRUFBTyxLQUFLLFdBQVcsRUFBTSxFQUFTLG1CQUFxQix1QkFDdEQsQ0FFTCxHQURBLEVBQU8sS0FBSyxvQkFBb0IsR0FDNUIsS0FBSyxzQkFBc0IsR0FBMkIsTUFBTyxHQUNqRSxLQUFPLEtBQUssS0FBSyxTQUFXLENBQUMsS0FBSyxzQkFBc0IsQ0FDdEQsR0FBSSxHQUFTLEtBQUssWUFBWSxFQUFVLEdBQ3hDLEVBQU8sU0FBVyxLQUFLLE1BQ3ZCLEVBQU8sT0FBUyxHQUNoQixFQUFPLFNBQVcsRUFDbEIsS0FBSyxVQUFVLEdBQ2YsS0FBSyxPQUNMLEVBQU8sS0FBSyxXQUFXLEVBQVEscUJBSW5DLE1BQUksQ0FBQyxHQUFZLEtBQUssSUFBSSxFQUFNLFVBQ3JCLEtBQUssWUFBWSxFQUFVLEVBQVUsRUFBTSxLQUFLLGdCQUFnQixLQUFNLElBQVEsS0FBTSxJQUVwRixHQUtiLEdBQUssb0JBQXNCLFNBQVMsRUFBd0IsQ0FDMUQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGNBQWMsR0FDOUIsR0FBSSxFQUFLLE9BQVMsMkJBQTZCLEtBQUssTUFBTSxNQUFNLEtBQUssYUFBYyxLQUFLLGNBQWdCLElBQ3BHLE1BQU8sR0FDWCxHQUFJLEdBQVMsS0FBSyxnQkFBZ0IsRUFBTSxFQUFVLEdBQ2xELE1BQUksSUFBMEIsRUFBTyxPQUFTLG9CQUN4QyxHQUF1QixxQkFBdUIsRUFBTyxPQUFTLEdBQXVCLG9CQUFzQixJQUMzRyxFQUF1QixtQkFBcUIsRUFBTyxPQUFTLEdBQXVCLGtCQUFvQixLQUV0RyxHQUdULEdBQUssZ0JBQWtCLFNBQVMsRUFBTSxFQUFVLEVBQVUsRUFBUyxDQU1qRSxPQUxJLEdBQWtCLEtBQUssUUFBUSxhQUFlLEdBQUssRUFBSyxPQUFTLGNBQWdCLEVBQUssT0FBUyxTQUMvRixLQUFLLGFBQWUsRUFBSyxLQUFPLENBQUMsS0FBSyxzQkFBd0IsRUFBSyxJQUFNLEVBQUssT0FBVSxHQUN4RixLQUFLLG1CQUFxQixFQUFLLE1BQy9CLEVBQWtCLEtBRVQsQ0FDWCxHQUFJLEdBQVUsS0FBSyxlQUFlLEVBQU0sRUFBVSxFQUFVLEVBQVMsRUFBaUIsR0FHdEYsR0FESSxFQUFRLFVBQVksR0FBa0IsSUFDdEMsSUFBWSxHQUFRLEVBQVEsT0FBUywwQkFBMkIsQ0FDbEUsR0FBSSxFQUFpQixDQUNuQixHQUFJLEdBQVksS0FBSyxZQUFZLEVBQVUsR0FDM0MsRUFBVSxXQUFhLEVBQ3ZCLEVBQVUsS0FBSyxXQUFXLEVBQVcsbUJBRXZDLE1BQU8sR0FHVCxFQUFPLElBSVgsR0FBSyxlQUFpQixTQUFTLEVBQU0sRUFBVSxFQUFVLEVBQVMsRUFBaUIsRUFBaUIsQ0FDbEcsR0FBSSxHQUFvQixLQUFLLFFBQVEsYUFBZSxHQUNoRCxFQUFXLEdBQXFCLEtBQUssSUFBSSxFQUFNLGFBQ25ELEFBQUksR0FBVyxHQUFZLEtBQUssTUFBTSxLQUFLLGFBQWMsb0VBRXpELEdBQUksR0FBVyxLQUFLLElBQUksRUFBTSxVQUM5QixHQUFJLEdBQWEsR0FBWSxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLFdBQWMsS0FBSyxJQUFJLEVBQU0sS0FBTSxDQUNoSCxHQUFJLElBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsR0FBSyxPQUFTLEVBQ2QsR0FBSyxTQUFXLEVBQVcsS0FBSyxrQkFBb0IsS0FBSyxXQUFXLEtBQUssUUFBUSxnQkFBa0IsU0FDbkcsR0FBSyxTQUFXLENBQUMsQ0FBQyxFQUNkLEdBQVksS0FBSyxPQUFPLEVBQU0sVUFDOUIsR0FDRixJQUFLLFNBQVcsR0FFbEIsRUFBTyxLQUFLLFdBQVcsR0FBTSw0QkFDcEIsQ0FBQyxHQUFXLEtBQUssSUFBSSxFQUFNLFFBQVMsQ0FDN0MsR0FBSSxJQUF5QixHQUFJLElBQXFCLEdBQWMsS0FBSyxTQUFVLEdBQWMsS0FBSyxTQUFVLEdBQW1CLEtBQUssY0FDeEksS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ3JCLEdBQUksSUFBVyxLQUFLLGNBQWMsRUFBTSxPQUFRLEtBQUssUUFBUSxhQUFlLEVBQUcsR0FBTyxJQUN0RixHQUFJLEdBQW1CLENBQUMsR0FBWSxDQUFDLEtBQUssc0JBQXdCLEtBQUssSUFBSSxFQUFNLE9BQy9FLFlBQUssbUJBQW1CLEdBQXdCLElBQ2hELEtBQUssaUNBQ0QsS0FBSyxjQUFnQixHQUNyQixLQUFLLE1BQU0sS0FBSyxjQUFlLDZEQUNuQyxLQUFLLFNBQVcsR0FDaEIsS0FBSyxTQUFXLEdBQ2hCLEtBQUssY0FBZ0IsR0FDZCxLQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLEdBQVUsSUFFbkYsS0FBSyxzQkFBc0IsR0FBd0IsSUFDbkQsS0FBSyxTQUFXLElBQWUsS0FBSyxTQUNwQyxLQUFLLFNBQVcsSUFBZSxLQUFLLFNBQ3BDLEtBQUssY0FBZ0IsSUFBb0IsS0FBSyxjQUM5QyxHQUFJLElBQVMsS0FBSyxZQUFZLEVBQVUsR0FDeEMsR0FBTyxPQUFTLEVBQ2hCLEdBQU8sVUFBWSxHQUNmLEdBQ0YsSUFBTyxTQUFXLEdBRXBCLEVBQU8sS0FBSyxXQUFXLEdBQVEsMEJBQ3RCLEtBQUssT0FBUyxFQUFNLFVBQVcsQ0FDeEMsQUFBSSxJQUFZLElBQ2QsS0FBSyxNQUFNLEtBQUssTUFBTyw2RUFFekIsR0FBSSxJQUFTLEtBQUssWUFBWSxFQUFVLEdBQ3hDLEdBQU8sSUFBTSxFQUNiLEdBQU8sTUFBUSxLQUFLLGNBQWMsQ0FBQyxTQUFVLEtBQzdDLEVBQU8sS0FBSyxXQUFXLEdBQVEsNEJBRWpDLE1BQU8sSUFRVCxHQUFLLGNBQWdCLFNBQVMsRUFBd0IsQ0FHcEQsQUFBSSxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssYUFFdEMsR0FBSSxHQUFNLEVBQWEsS0FBSyxtQkFBcUIsS0FBSyxNQUN0RCxPQUFRLEtBQUssVUFDUixHQUFNLE9BQ1QsTUFBSyxNQUFLLFlBQ04sS0FBSyxNQUFNLEtBQUssTUFBTyxvQ0FDM0IsRUFBTyxLQUFLLFlBQ1osS0FBSyxPQUNELEtBQUssT0FBUyxFQUFNLFFBQVUsQ0FBQyxLQUFLLGtCQUNwQyxLQUFLLE1BQU0sRUFBSyxNQUFPLGtEQU92QixLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssT0FBUyxFQUFNLFVBQVksS0FBSyxPQUFTLEVBQU0sUUFDL0UsS0FBSyxhQUNGLEtBQUssV0FBVyxFQUFNLGFBRTFCLEdBQU0sTUFDVCxTQUFPLEtBQUssWUFDWixLQUFLLE9BQ0UsS0FBSyxXQUFXLEVBQU0sc0JBRTFCLEdBQU0sS0FDVCxHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQWMsS0FBSyxZQUNwRSxFQUFLLEtBQUssV0FBVyxJQUN6QixHQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxHQUFlLEVBQUcsT0FBUyxTQUFXLENBQUMsS0FBSyxzQkFBd0IsS0FBSyxJQUFJLEVBQU0sV0FDckgsTUFBTyxNQUFLLGNBQWMsS0FBSyxZQUFZLEVBQVUsR0FBVyxFQUFHLEdBQU8sSUFDOUUsR0FBSSxHQUFjLENBQUMsS0FBSyxxQkFBc0IsQ0FDNUMsR0FBSSxLQUFLLElBQUksRUFBTSxPQUNmLE1BQU8sTUFBSyxxQkFBcUIsS0FBSyxZQUFZLEVBQVUsR0FBVyxDQUFDLEdBQUssSUFDakYsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQUcsT0FBUyxTQUFXLEtBQUssT0FBUyxFQUFNLE1BQVEsQ0FBQyxFQUN2RixTQUFLLEtBQUssV0FBVyxJQUNqQixNQUFLLHNCQUF3QixDQUFDLEtBQUssSUFBSSxFQUFNLFNBQzdDLEtBQUssYUFDRixLQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLENBQUMsR0FBSyxJQUdqRixNQUFPLE9BRUosR0FBTSxPQUNULEdBQUksR0FBUSxLQUFLLE1BQ2pCLFNBQU8sS0FBSyxhQUFhLEVBQU0sT0FDL0IsRUFBSyxNQUFRLENBQUMsUUFBUyxFQUFNLFFBQVMsTUFBTyxFQUFNLE9BQzVDLE1BRUosR0FBTSxRQUFVLEdBQU0sT0FDekIsTUFBTyxNQUFLLGFBQWEsS0FBSyxXQUUzQixHQUFNLFVBQVksR0FBTSxVQUFZLEdBQU0sT0FDN0MsU0FBTyxLQUFLLFlBQ1osRUFBSyxNQUFRLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBTyxLQUFLLE9BQVMsRUFBTSxNQUNwRSxFQUFLLElBQU0sS0FBSyxLQUFLLFFBQ3JCLEtBQUssT0FDRSxLQUFLLFdBQVcsRUFBTSxlQUUxQixHQUFNLE9BQ1QsR0FBSSxHQUFRLEtBQUssTUFBTyxHQUFPLEtBQUssbUNBQW1DLEdBQ3ZFLE1BQUksSUFDRSxHQUF1QixvQkFBc0IsR0FBSyxDQUFDLEtBQUsscUJBQXFCLEtBQzdFLEdBQXVCLG9CQUFzQixHQUM3QyxFQUF1QixrQkFBb0IsR0FDM0MsR0FBdUIsa0JBQW9CLElBRTFDLE9BRUosR0FBTSxTQUNULFNBQU8sS0FBSyxZQUNaLEtBQUssT0FDTCxFQUFLLFNBQVcsS0FBSyxjQUFjLEVBQU0sU0FBVSxHQUFNLEdBQU0sR0FDeEQsS0FBSyxXQUFXLEVBQU0sdUJBRTFCLEdBQU0sT0FDVCxNQUFPLE1BQUssU0FBUyxHQUFPLE9BRXpCLEdBQU0sVUFDVCxTQUFPLEtBQUssWUFDWixLQUFLLE9BQ0UsS0FBSyxjQUFjLEVBQU0sT0FFN0IsR0FBTSxPQUNULE1BQU8sTUFBSyxXQUFXLEtBQUssWUFBYSxRQUV0QyxHQUFNLEtBQ1QsTUFBTyxNQUFLLGVBRVQsR0FBTSxVQUNULE1BQU8sTUFBSyxvQkFFVCxHQUFNLFFBQ1QsTUFBSSxNQUFLLFFBQVEsYUFBZSxHQUN2QixLQUFLLGtCQUVMLEtBQUsscUJBSWQsS0FBSyxlQUlULEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssWUFJaEIsQUFBSSxLQUFLLGFBQWUsS0FBSyxpQkFBaUIsS0FBSyxNQUFPLHFDQUMxRCxHQUFJLEdBQU8sS0FBSyxXQUFXLElBRTNCLE9BQVEsS0FBSyxVQUNSLEdBQU0sT0FDVCxNQUFPLE1BQUssbUJBQW1CLE9BQzVCLEdBQU0sSUFDVCxTQUFLLEtBQU8sRUFDTCxLQUFLLGdCQUFnQixXQUU1QixLQUFLLGVBSVQsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBT3ZDLEdBTkEsS0FBSyxPQUdMLEVBQUssT0FBUyxLQUFLLG1CQUdmLENBQUMsS0FBSyxJQUFJLEVBQU0sUUFBUyxDQUMzQixHQUFJLEdBQVcsS0FBSyxNQUNwQixBQUFJLEtBQUssSUFBSSxFQUFNLFFBQVUsS0FBSyxJQUFJLEVBQU0sUUFDMUMsS0FBSyxpQkFBaUIsRUFBVSw2Q0FFaEMsS0FBSyxXQUFXLEdBSXBCLE1BQU8sTUFBSyxXQUFXLEVBQU0scUJBRy9CLEdBQUssZ0JBQWtCLFNBQVMsRUFBTSxDQUNwQyxLQUFLLE9BRUwsR0FBSSxHQUFjLEtBQUssWUFDdkIsU0FBSyxTQUFXLEtBQUssV0FBVyxJQUU1QixFQUFLLFNBQVMsT0FBUyxRQUN2QixLQUFLLGlCQUFpQixFQUFLLFNBQVMsTUFBTyw0REFDM0MsR0FDQSxLQUFLLGlCQUFpQixFQUFLLE1BQU8scURBQ2xDLEtBQUssUUFBUSxhQUFlLFVBQzVCLEtBQUssaUJBQWlCLEVBQUssTUFBTyw2Q0FFL0IsS0FBSyxXQUFXLEVBQU0saUJBRy9CLEdBQUssYUFBZSxTQUFTLEVBQU8sQ0FDbEMsR0FBSSxHQUFPLEtBQUssWUFDaEIsU0FBSyxNQUFRLEVBQ2IsRUFBSyxJQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLEtBQ3pDLEVBQUssSUFBSSxXQUFXLEVBQUssSUFBSSxPQUFTLEtBQU8sS0FBTyxHQUFLLE9BQVMsRUFBSyxJQUFJLE1BQU0sRUFBRyxJQUFJLFFBQVEsS0FBTSxLQUMxRyxLQUFLLE9BQ0UsS0FBSyxXQUFXLEVBQU0sWUFHL0IsR0FBSyxxQkFBdUIsVUFBVyxDQUNyQyxLQUFLLE9BQU8sRUFBTSxRQUNsQixHQUFJLEdBQU0sS0FBSyxrQkFDZixZQUFLLE9BQU8sRUFBTSxRQUNYLEdBR1QsR0FBSyxtQ0FBcUMsU0FBUyxFQUFZLENBQzdELEdBQUksR0FBVyxLQUFLLE1BQU8sRUFBVyxLQUFLLFNBQVUsRUFBSyxFQUFxQixLQUFLLFFBQVEsYUFBZSxFQUMzRyxHQUFJLEtBQUssUUFBUSxhQUFlLEVBQUcsQ0FDakMsS0FBSyxPQUVMLEdBQUksR0FBZ0IsS0FBSyxNQUFPLEVBQWdCLEtBQUssU0FDakQsRUFBVyxHQUFJLEVBQVEsR0FBTSxHQUFjLEdBQzNDLEdBQXlCLEdBQUksSUFBcUIsR0FBYyxLQUFLLFNBQVUsR0FBYyxLQUFLLFNBQVUsR0FJaEgsSUFIQSxLQUFLLFNBQVcsRUFDaEIsS0FBSyxTQUFXLEVBRVQsS0FBSyxPQUFTLEVBQU0sUUFFekIsR0FEQSxFQUFRLEVBQVEsR0FBUSxLQUFLLE9BQU8sRUFBTSxPQUN0QyxHQUFzQixLQUFLLG1CQUFtQixFQUFNLE9BQVEsSUFBTyxDQUNyRSxHQUFjLEdBQ2QsY0FDUyxLQUFLLE9BQVMsRUFBTSxTQUFVLENBQ3ZDLEdBQWMsS0FBSyxNQUNuQixFQUFTLEtBQUssS0FBSyxlQUFlLEtBQUsscUJBQ25DLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBSyxNQUFNLEtBQUssTUFBTyxpREFDeEQsVUFFQSxHQUFTLEtBQUssS0FBSyxpQkFBaUIsR0FBTyxHQUF3QixLQUFLLGlCQUc1RSxHQUFJLElBQWMsS0FBSyxNQUFPLEdBQWMsS0FBSyxTQUdqRCxHQUZBLEtBQUssT0FBTyxFQUFNLFFBRWQsR0FBYyxDQUFDLEtBQUssc0JBQXdCLEtBQUssSUFBSSxFQUFNLE9BQzdELFlBQUssbUJBQW1CLEdBQXdCLElBQ2hELEtBQUssaUNBQ0wsS0FBSyxTQUFXLEdBQ2hCLEtBQUssU0FBVyxHQUNULEtBQUssb0JBQW9CLEVBQVUsRUFBVSxHQUd0RCxBQUFJLEVBQUMsRUFBUyxRQUFVLEtBQWUsS0FBSyxXQUFXLEtBQUssY0FDeEQsSUFBZSxLQUFLLFdBQVcsSUFDbkMsS0FBSyxzQkFBc0IsR0FBd0IsSUFDbkQsS0FBSyxTQUFXLElBQWUsS0FBSyxTQUNwQyxLQUFLLFNBQVcsSUFBZSxLQUFLLFNBRXBDLEFBQUksRUFBUyxPQUFTLEVBQ3BCLEdBQU0sS0FBSyxZQUFZLEVBQWUsR0FDdEMsRUFBSSxZQUFjLEVBQ2xCLEtBQUssYUFBYSxFQUFLLHFCQUFzQixHQUFhLEtBRTFELEVBQU0sRUFBUyxPQUdqQixHQUFNLEtBQUssdUJBR2IsR0FBSSxLQUFLLFFBQVEsZUFBZ0IsQ0FDL0IsR0FBSSxJQUFNLEtBQUssWUFBWSxFQUFVLEdBQ3JDLFVBQUksV0FBYSxFQUNWLEtBQUssV0FBVyxHQUFLLCtCQUU1QixPQUFPLElBSVgsR0FBSyxlQUFpQixTQUFTLEVBQU0sQ0FDbkMsTUFBTyxJQUdULEdBQUssb0JBQXNCLFNBQVMsRUFBVSxFQUFVLEVBQVUsQ0FDaEUsTUFBTyxNQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLElBU3pFLEdBQUksSUFBVSxHQUVkLEdBQUssU0FBVyxVQUFXLENBQ3pCLEFBQUksS0FBSyxhQUFlLEtBQUssaUJBQWlCLEtBQUssTUFBTyxrQ0FDMUQsR0FBSSxHQUFPLEtBQUssWUFDWixFQUFPLEtBQUssV0FBVyxJQUMzQixHQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxJQUFJLEVBQU0sS0FBTSxDQUN4RCxFQUFLLEtBQU8sRUFDWixHQUFJLEdBQWMsS0FBSyxZQUN2QixTQUFLLFNBQVcsS0FBSyxXQUFXLElBQzVCLEVBQUssU0FBUyxPQUFTLFVBQ3ZCLEtBQUssaUJBQWlCLEVBQUssU0FBUyxNQUFPLHdEQUMzQyxHQUNBLEtBQUssaUJBQWlCLEVBQUssTUFBTyxvREFDakMsS0FBSyxzQkFDTixLQUFLLGlCQUFpQixFQUFLLE1BQU8sOENBQy9CLEtBQUssV0FBVyxFQUFNLGdCQUUvQixHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQVcsS0FBSyxPQUFTLEVBQU0sUUFDcEYsU0FBSyxPQUFTLEtBQUssZ0JBQWdCLEtBQUssZ0JBQWlCLEVBQVUsRUFBVSxJQUN6RSxHQUFZLEVBQUssT0FBTyxPQUFTLG9CQUNuQyxLQUFLLE1BQU0sRUFBVSxnQ0FFdkIsQUFBSSxLQUFLLElBQUksRUFBTSxRQUFXLEVBQUssVUFBWSxLQUFLLGNBQWMsRUFBTSxPQUFRLEtBQUssUUFBUSxhQUFlLEVBQUcsSUFDeEcsRUFBSyxVQUFZLEdBQ2pCLEtBQUssV0FBVyxFQUFNLGtCQUsvQixHQUFLLHFCQUF1QixTQUFTLEVBQUssQ0FDeEMsR0FBSSxHQUFXLEVBQUksU0FFZixFQUFPLEtBQUssWUFDaEIsTUFBSSxNQUFLLE9BQVMsRUFBTSxnQkFDakIsSUFDSCxLQUFLLGlCQUFpQixLQUFLLE1BQU8sb0RBRXBDLEVBQUssTUFBUSxDQUNYLElBQUssS0FBSyxNQUNWLE9BQVEsT0FHVixFQUFLLE1BQVEsQ0FDWCxJQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLEtBQUssUUFBUSxTQUFVO0FBQUEsR0FDOUQsT0FBUSxLQUFLLE9BR2pCLEtBQUssT0FDTCxFQUFLLEtBQU8sS0FBSyxPQUFTLEVBQU0sVUFDekIsS0FBSyxXQUFXLEVBQU0sb0JBRy9CLEdBQUssY0FBZ0IsU0FBUyxFQUFLLENBQ2pDLEFBQUssSUFBUSxRQUFTLEdBQU0sSUFDNUIsR0FBSSxHQUFXLEVBQUksU0FBVSxBQUFLLElBQWEsUUFBUyxHQUFXLElBRW5FLEdBQUksR0FBTyxLQUFLLFlBQ2hCLEtBQUssT0FDTCxFQUFLLFlBQWMsR0FDbkIsR0FBSSxHQUFTLEtBQUsscUJBQXFCLENBQUMsU0FBVSxJQUVsRCxJQURBLEVBQUssT0FBUyxDQUFDLEdBQ1IsQ0FBQyxFQUFPLE1BQ2IsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssTUFBTSxLQUFLLElBQUssaUNBQ3BELEtBQUssT0FBTyxFQUFNLGNBQ2xCLEVBQUssWUFBWSxLQUFLLEtBQUssbUJBQzNCLEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssT0FBTyxLQUFLLEVBQVMsS0FBSyxxQkFBcUIsQ0FBQyxTQUFVLEtBRWpFLFlBQUssT0FDRSxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSyxZQUFjLFNBQVMsRUFBTSxDQUNoQyxNQUFPLENBQUMsRUFBSyxVQUFZLEVBQUssSUFBSSxPQUFTLGNBQWdCLEVBQUssSUFBSSxPQUFTLFNBQzFFLE1BQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxPQUFTLEVBQU0sS0FBTyxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLFVBQVksS0FBSyxLQUFLLFNBQVksS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLE9BQVMsRUFBTSxPQUNqTSxDQUFDLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxTQUszRCxHQUFLLFNBQVcsU0FBUyxFQUFXLEVBQXdCLENBQzFELEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBUSxHQUFNLEVBQVcsR0FHdEQsSUFGQSxFQUFLLFdBQWEsR0FDbEIsS0FBSyxPQUNFLENBQUMsS0FBSyxJQUFJLEVBQU0sU0FBUyxDQUM5QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLG1CQUFtQixFQUFNLFFBQVcsTUFHaEYsR0FBSSxHQUFPLEtBQUssY0FBYyxFQUFXLEdBQ3pDLEFBQUssR0FBYSxLQUFLLGVBQWUsRUFBTSxFQUFVLEdBQ3RELEVBQUssV0FBVyxLQUFLLEdBRXZCLE1BQU8sTUFBSyxXQUFXLEVBQU0sRUFBWSxnQkFBa0IscUJBRzdELEdBQUssY0FBZ0IsU0FBUyxFQUFXLEVBQXdCLENBQy9ELEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBYSxFQUFTLEVBQVUsRUFDN0QsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssSUFBSSxFQUFNLFVBQ2xELE1BQUksR0FDRixHQUFLLFNBQVcsS0FBSyxXQUFXLElBQzVCLEtBQUssT0FBUyxFQUFNLE9BQ3RCLEtBQUssTUFBTSxLQUFLLE1BQU8saURBRWxCLEtBQUssV0FBVyxFQUFNLGdCQUczQixNQUFLLE9BQVMsRUFBTSxRQUFVLEdBQzVCLEdBQXVCLG9CQUFzQixHQUMvQyxHQUF1QixvQkFBc0IsS0FBSyxPQUVoRCxFQUF1QixrQkFBb0IsR0FDN0MsR0FBdUIsa0JBQW9CLEtBQUssUUFJcEQsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEdBQU8sR0FFekMsS0FBSyxPQUFTLEVBQU0sT0FBUyxHQUEwQixFQUF1QixjQUFnQixHQUNoRyxHQUF1QixjQUFnQixLQUFLLE9BR3ZDLEtBQUssV0FBVyxFQUFNLGtCQUUvQixBQUFJLEtBQUssUUFBUSxhQUFlLEdBQzlCLEdBQUssT0FBUyxHQUNkLEVBQUssVUFBWSxHQUNiLElBQWEsSUFDZixHQUFXLEtBQUssTUFDaEIsRUFBVyxLQUFLLFVBRWIsR0FDRCxHQUFjLEtBQUssSUFBSSxFQUFNLFFBRW5DLEdBQUksR0FBYyxLQUFLLFlBQ3ZCLFlBQUssa0JBQWtCLEdBQ3ZCLEFBQUksQ0FBQyxHQUFhLENBQUMsR0FBZSxLQUFLLFFBQVEsYUFBZSxHQUFLLENBQUMsR0FBZSxLQUFLLFlBQVksR0FDbEcsR0FBVSxHQUNWLEVBQWMsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLElBQUksRUFBTSxNQUM5RCxLQUFLLGtCQUFrQixFQUFNLElBRTdCLEVBQVUsR0FFWixLQUFLLG1CQUFtQixFQUFNLEVBQVcsRUFBYSxFQUFTLEVBQVUsRUFBVSxFQUF3QixHQUNwRyxLQUFLLFdBQVcsRUFBTSxhQUcvQixHQUFLLG1CQUFxQixTQUFTLEVBQU0sRUFBVyxFQUFhLEVBQVMsRUFBVSxFQUFVLEVBQXdCLEVBQWEsQ0FJakksR0FISyxJQUFlLElBQVksS0FBSyxPQUFTLEVBQU0sT0FDaEQsS0FBSyxhQUVMLEtBQUssSUFBSSxFQUFNLE9BQ2pCLEVBQUssTUFBUSxFQUFZLEtBQUssa0JBQWtCLEtBQUssTUFBTyxLQUFLLFVBQVksS0FBSyxpQkFBaUIsR0FBTyxHQUMxRyxFQUFLLEtBQU8sZUFDSCxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssT0FBUyxFQUFNLE9BQzlELEFBQUksR0FBYSxLQUFLLGFBQ3RCLEVBQUssS0FBTyxPQUNaLEVBQUssT0FBUyxHQUNkLEVBQUssTUFBUSxLQUFLLFlBQVksRUFBYSxXQUNsQyxDQUFDLEdBQWEsQ0FBQyxHQUNmLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxFQUFLLFVBQVksRUFBSyxJQUFJLE9BQVMsY0FDcEUsR0FBSyxJQUFJLE9BQVMsT0FBUyxFQUFLLElBQUksT0FBUyxRQUM3QyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssT0FBUyxFQUFNLFFBQVUsS0FBSyxPQUFTLEVBQU0sR0FBSyxDQUM5RixBQUFJLElBQWUsSUFBVyxLQUFLLGFBQ25DLEVBQUssS0FBTyxFQUFLLElBQUksS0FDckIsS0FBSyxrQkFBa0IsR0FDdkIsRUFBSyxNQUFRLEtBQUssWUFBWSxJQUM5QixHQUFJLEdBQWEsRUFBSyxPQUFTLE1BQVEsRUFBSSxFQUMzQyxHQUFJLEVBQUssTUFBTSxPQUFPLFNBQVcsRUFBWSxDQUMzQyxHQUFJLElBQVEsRUFBSyxNQUFNLE1BQ3ZCLEFBQUksRUFBSyxPQUFTLE1BQ2QsS0FBSyxpQkFBaUIsR0FBTyxnQ0FFN0IsS0FBSyxpQkFBaUIsR0FBTyw0Q0FFakMsQUFBSSxHQUFLLE9BQVMsT0FBUyxFQUFLLE1BQU0sT0FBTyxHQUFHLE9BQVMsZUFDckQsS0FBSyxpQkFBaUIsRUFBSyxNQUFNLE9BQU8sR0FBRyxNQUFPLHFDQUVuRCxBQUFJLE1BQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxFQUFLLFVBQVksRUFBSyxJQUFJLE9BQVMsYUFDMUUsS0FBZSxJQUFXLEtBQUssYUFDbkMsS0FBSyxnQkFBZ0IsRUFBSyxLQUN0QixFQUFLLElBQUksT0FBUyxTQUFXLENBQUMsS0FBSyxlQUNuQyxNQUFLLGNBQWdCLEdBQ3pCLEVBQUssS0FBTyxPQUNaLEFBQUksRUFDRixFQUFLLE1BQVEsS0FBSyxrQkFBa0IsRUFBVSxFQUFVLEVBQUssS0FDeEQsQUFBSSxLQUFLLE9BQVMsRUFBTSxJQUFNLEVBQy9CLEdBQXVCLGdCQUFrQixHQUN6QyxHQUF1QixnQkFBa0IsS0FBSyxPQUNsRCxFQUFLLE1BQVEsS0FBSyxrQkFBa0IsRUFBVSxFQUFVLEVBQUssTUFFN0QsRUFBSyxNQUFRLEVBQUssSUFFcEIsRUFBSyxVQUFZLElBQ1YsS0FBSyxjQUdoQixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FDdEMsR0FBSSxLQUFLLFFBQVEsYUFBZSxFQUFHLENBQ2pDLEdBQUksS0FBSyxJQUFJLEVBQU0sVUFDakIsU0FBSyxTQUFXLEdBQ2hCLEVBQUssSUFBTSxLQUFLLG1CQUNoQixLQUFLLE9BQU8sRUFBTSxVQUNYLEVBQUssSUFFWixFQUFLLFNBQVcsR0FHcEIsTUFBTyxHQUFLLElBQU0sS0FBSyxPQUFTLEVBQU0sS0FBTyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssZ0JBQWtCLEtBQUssV0FBVyxLQUFLLFFBQVEsZ0JBQWtCLFVBS2xKLEdBQUssYUFBZSxTQUFTLEVBQU0sQ0FDakMsRUFBSyxHQUFLLEtBQ04sS0FBSyxRQUFRLGFBQWUsR0FBSyxHQUFLLFVBQVksRUFBSyxXQUFhLElBQ3BFLEtBQUssUUFBUSxhQUFlLEdBQUssR0FBSyxNQUFRLEtBS3BELEdBQUssWUFBYyxTQUFTLEVBQWEsRUFBUyxFQUFrQixDQUNsRSxHQUFJLEdBQU8sS0FBSyxZQUFhLEVBQWMsS0FBSyxTQUFVLEVBQWMsS0FBSyxTQUFVLEVBQW1CLEtBQUssY0FFL0csWUFBSyxhQUFhLEdBQ2QsS0FBSyxRQUFRLGFBQWUsR0FDNUIsR0FBSyxVQUFZLEdBQ2pCLEtBQUssUUFBUSxhQUFlLEdBQzVCLEdBQUssTUFBUSxDQUFDLENBQUMsR0FFbkIsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ3JCLEtBQUssV0FBVyxHQUFjLEVBQVMsRUFBSyxXQUFhLEdBQWUsR0FBbUIsR0FBcUIsSUFFaEgsS0FBSyxPQUFPLEVBQU0sUUFDbEIsRUFBSyxPQUFTLEtBQUssaUJBQWlCLEVBQU0sT0FBUSxHQUFPLEtBQUssUUFBUSxhQUFlLEdBQ3JGLEtBQUssaUNBQ0wsS0FBSyxrQkFBa0IsRUFBTSxHQUFPLElBRXBDLEtBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUNkLEtBQUssV0FBVyxFQUFNLHVCQUsvQixHQUFLLHFCQUF1QixTQUFTLEVBQU0sRUFBUSxFQUFTLENBQzFELEdBQUksR0FBYyxLQUFLLFNBQVUsRUFBYyxLQUFLLFNBQVUsRUFBbUIsS0FBSyxjQUV0RixZQUFLLFdBQVcsR0FBYyxFQUFTLElBQVMsSUFDaEQsS0FBSyxhQUFhLEdBQ2QsS0FBSyxRQUFRLGFBQWUsR0FBSyxHQUFLLE1BQVEsQ0FBQyxDQUFDLEdBRXBELEtBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUVyQixFQUFLLE9BQVMsS0FBSyxpQkFBaUIsRUFBUSxJQUM1QyxLQUFLLGtCQUFrQixFQUFNLEdBQU0sSUFFbkMsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ2QsS0FBSyxXQUFXLEVBQU0sNEJBSy9CLEdBQUssa0JBQW9CLFNBQVMsRUFBTSxFQUFpQixFQUFVLENBQ2pFLEdBQUksR0FBZSxHQUFtQixLQUFLLE9BQVMsRUFBTSxPQUN0RCxFQUFZLEtBQUssT0FBUSxFQUFZLEdBRXpDLEdBQUksRUFDRixFQUFLLEtBQU8sS0FBSyxtQkFDakIsRUFBSyxXQUFhLEdBQ2xCLEtBQUssWUFBWSxFQUFNLFFBQ2xCLENBQ0wsR0FBSSxHQUFZLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxLQUFLLGtCQUFrQixFQUFLLFFBQzlFLEFBQUksRUFBQyxHQUFhLElBQ2hCLEdBQVksS0FBSyxnQkFBZ0IsS0FBSyxLQUlsQyxHQUFhLEdBQ2IsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLDhFQUl4QyxHQUFJLEdBQVksS0FBSyxPQUNyQixLQUFLLE9BQVMsR0FDVixHQUFhLE1BQUssT0FBUyxJQUkvQixLQUFLLFlBQVksRUFBTSxDQUFDLEdBQWEsQ0FBQyxHQUFhLENBQUMsR0FBbUIsQ0FBQyxHQUFZLEtBQUssa0JBQWtCLEVBQUssU0FFNUcsS0FBSyxRQUFVLEVBQUssSUFBTSxLQUFLLFVBQVUsRUFBSyxHQUFJLElBQ3RELEVBQUssS0FBTyxLQUFLLFdBQVcsR0FBTyxPQUFXLEdBQWEsQ0FBQyxHQUM1RCxFQUFLLFdBQWEsR0FDbEIsS0FBSyx1QkFBdUIsRUFBSyxLQUFLLE1BQ3RDLEtBQUssT0FBUyxFQUVoQixLQUFLLGFBR1AsR0FBSyxrQkFBb0IsU0FBUyxFQUFRLENBQ3hDLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBUSxFQUFJLEVBQUssT0FBUSxHQUFLLEVBQ25ELENBQ0EsR0FBSSxHQUFRLEVBQUssR0FFakIsR0FBSSxFQUFNLE9BQVMsYUFBZ0IsTUFBTyxHQUU1QyxNQUFPLElBTVQsR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFpQixDQUVqRCxPQURJLEdBQVcsR0FDTixFQUFJLEVBQUcsRUFBTyxFQUFLLE9BQVEsRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUN4RCxDQUNBLEdBQUksR0FBUSxFQUFLLEdBRWpCLEtBQUssVUFBVSxFQUFPLEdBQVUsRUFBa0IsS0FBTyxLQVU3RCxHQUFLLGNBQWdCLFNBQVMsRUFBTyxFQUFvQixFQUFZLEVBQXdCLENBRTNGLE9BREksR0FBTyxHQUFJLEVBQVEsR0FDaEIsQ0FBQyxLQUFLLElBQUksSUFBUSxDQUN2QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsR0FBc0IsS0FBSyxtQkFBbUIsR0FBVSxNQUc5RCxHQUFJLEdBQU8sT0FDWCxBQUFJLEdBQWMsS0FBSyxPQUFTLEVBQU0sTUFDbEMsRUFBTSxLQUNMLEFBQUksS0FBSyxPQUFTLEVBQU0sU0FDM0IsR0FBTSxLQUFLLFlBQVksR0FDbkIsR0FBMEIsS0FBSyxPQUFTLEVBQU0sT0FBUyxFQUF1QixjQUFnQixHQUM5RixHQUF1QixjQUFnQixLQUFLLFFBRWhELEVBQU0sS0FBSyxpQkFBaUIsR0FBTyxHQUVyQyxFQUFLLEtBQUssR0FFWixNQUFPLElBR1QsR0FBSyxnQkFBa0IsU0FBUyxFQUFLLENBQ25DLEdBQUksR0FBUSxFQUFJLE1BQ1osRUFBTSxFQUFJLElBQ1YsRUFBTyxFQUFJLEtBUWYsR0FOSSxLQUFLLGFBQWUsSUFBUyxTQUM3QixLQUFLLGlCQUFpQixFQUFPLHVEQUM3QixLQUFLLFNBQVcsSUFBUyxTQUN6QixLQUFLLGlCQUFpQixFQUFPLDZEQUM3QixLQUFLLFNBQVMsS0FBSyxJQUNuQixLQUFLLE1BQU0sRUFBUSx1QkFBeUIsRUFBTyxLQUNuRCxPQUFLLFFBQVEsWUFBYyxHQUM3QixLQUFLLE1BQU0sTUFBTSxFQUFPLEdBQUssUUFBUSxRQUFVLElBQ2pELElBQUksR0FBSyxLQUFLLE9BQVMsS0FBSyxvQkFBc0IsS0FBSyxjQUN2RCxBQUFJLEVBQUcsS0FBSyxJQUNOLEVBQUMsS0FBSyxTQUFXLElBQVMsU0FDMUIsS0FBSyxpQkFBaUIsRUFBTyx3REFDakMsS0FBSyxpQkFBaUIsRUFBUSxnQkFBa0IsRUFBTyxvQkFRM0QsR0FBSyxXQUFhLFNBQVMsRUFBUyxFQUFXLENBQzdDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLE1BQUksTUFBSyxPQUFTLEVBQU0sS0FDdEIsRUFBSyxLQUFPLEtBQUssTUFDWixBQUFJLEtBQUssS0FBSyxRQUNuQixHQUFLLEtBQU8sS0FBSyxLQUFLLFFBTWpCLEdBQUssT0FBUyxTQUFXLEVBQUssT0FBUyxhQUN2QyxNQUFLLGFBQWUsS0FBSyxhQUFlLEdBQUssS0FBSyxNQUFNLFdBQVcsS0FBSyxnQkFBa0IsS0FDN0YsS0FBSyxRQUFRLE9BR2YsS0FBSyxhQUVQLEtBQUssS0FBSyxDQUFDLENBQUMsR0FDWixLQUFLLFdBQVcsRUFBTSxjQUNqQixHQUNILE1BQUssZ0JBQWdCLEdBQ2pCLEVBQUssT0FBUyxTQUFXLENBQUMsS0FBSyxlQUMvQixNQUFLLGNBQWdCLEVBQUssUUFFekIsR0FLVCxHQUFLLFdBQWEsU0FBUyxFQUFNLENBQy9CLEFBQUssS0FBSyxVQUFZLE1BQUssU0FBVyxLQUFLLE9BRTNDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLFlBQUssT0FDTCxBQUFJLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxzQkFBeUIsS0FBSyxPQUFTLEVBQU0sTUFBUSxDQUFDLEtBQUssS0FBSyxXQUNuRyxHQUFLLFNBQVcsR0FDaEIsRUFBSyxTQUFXLE1BRWhCLEdBQUssU0FBVyxLQUFLLElBQUksRUFBTSxNQUMvQixFQUFLLFNBQVcsS0FBSyxpQkFBaUIsSUFFakMsS0FBSyxXQUFXLEVBQU0sb0JBRy9CLEdBQUssV0FBYSxVQUFXLENBQzNCLEFBQUssS0FBSyxVQUFZLE1BQUssU0FBVyxLQUFLLE9BRTNDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLFlBQUssT0FDTCxFQUFLLFNBQVcsS0FBSyxnQkFBZ0IsS0FBTSxJQUNwQyxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSSxJQUFPLEdBQU8sVUFRbEIsR0FBSyxNQUFRLFNBQVMsRUFBSyxFQUFTLENBQ2xDLEdBQUksR0FBTSxHQUFZLEtBQUssTUFBTyxHQUNsQyxHQUFXLEtBQU8sRUFBSSxLQUFPLElBQU0sRUFBSSxPQUFTLElBQ2hELEdBQUksR0FBTSxHQUFJLGFBQVksR0FDMUIsUUFBSSxJQUFNLEVBQUssRUFBSSxJQUFNLEVBQUssRUFBSSxTQUFXLEtBQUssSUFDNUMsR0FHUixHQUFLLGlCQUFtQixHQUFLLE1BRTdCLEdBQUssWUFBYyxVQUFXLENBQzVCLEdBQUksS0FBSyxRQUFRLFVBQ2YsTUFBTyxJQUFJLElBQVMsS0FBSyxRQUFTLEtBQUssSUFBTSxLQUFLLFlBSXRELEdBQUksSUFBTyxHQUFPLFVBRWQsR0FBUSxTQUFlLEVBQU8sQ0FDaEMsS0FBSyxNQUFRLEVBRWIsS0FBSyxJQUFNLEdBRVgsS0FBSyxRQUFVLEdBRWYsS0FBSyxVQUFZLElBS25CLEdBQUssV0FBYSxTQUFTLEVBQU8sQ0FDaEMsS0FBSyxXQUFXLEtBQUssR0FBSSxJQUFNLEtBR2pDLEdBQUssVUFBWSxVQUFXLENBQzFCLEtBQUssV0FBVyxPQU1sQixHQUFLLDJCQUE2QixTQUFTLEVBQU8sQ0FDaEQsTUFBUSxHQUFNLE1BQVEsSUFBbUIsQ0FBQyxLQUFLLFVBQWEsRUFBTSxNQUFRLElBRzVFLEdBQUssWUFBYyxTQUFTLEVBQU0sRUFBYSxFQUFLLENBQ2xELEdBQUksR0FBYSxHQUNqQixHQUFJLElBQWdCLEdBQWMsQ0FDaEMsR0FBSSxHQUFRLEtBQUssZUFDakIsRUFBYSxFQUFNLFFBQVEsUUFBUSxHQUFRLElBQU0sRUFBTSxVQUFVLFFBQVEsR0FBUSxJQUFNLEVBQU0sSUFBSSxRQUFRLEdBQVEsR0FDakgsRUFBTSxRQUFRLEtBQUssR0FDZixLQUFLLFVBQWEsRUFBTSxNQUFRLElBQ2hDLE1BQU8sTUFBSyxpQkFBaUIsV0FDeEIsSUFBZ0IsR0FBbUIsQ0FDNUMsR0FBSSxHQUFVLEtBQUssZUFDbkIsRUFBUSxRQUFRLEtBQUssV0FDWixJQUFnQixHQUFlLENBQ3hDLEdBQUksR0FBVSxLQUFLLGVBQ25CLEFBQUksS0FBSyxvQkFDTCxFQUFhLEVBQVEsUUFBUSxRQUFRLEdBQVEsR0FFN0MsRUFBYSxFQUFRLFFBQVEsUUFBUSxHQUFRLElBQU0sRUFBUSxJQUFJLFFBQVEsR0FBUSxHQUNuRixFQUFRLFVBQVUsS0FBSyxPQUV2QixRQUFTLEdBQUksS0FBSyxXQUFXLE9BQVMsRUFBRyxHQUFLLEVBQUcsRUFBRSxFQUFHLENBQ3BELEdBQUksR0FBVSxLQUFLLFdBQVcsR0FDOUIsR0FBSSxFQUFRLFFBQVEsUUFBUSxHQUFRLElBQU0sQ0FBRyxHQUFRLE1BQVEsSUFBdUIsRUFBUSxRQUFRLEtBQU8sSUFDdkcsQ0FBQyxLQUFLLDJCQUEyQixJQUFZLEVBQVEsVUFBVSxRQUFRLEdBQVEsR0FBSSxDQUNyRixFQUFhLEdBQ2IsTUFLRixHQUhBLEVBQVEsSUFBSSxLQUFLLEdBQ2IsS0FBSyxVQUFhLEVBQVEsTUFBUSxJQUNsQyxNQUFPLE1BQUssaUJBQWlCLEdBQzdCLEVBQVEsTUFBUSxHQUFhLE1BR3JDLEFBQUksR0FBYyxLQUFLLGlCQUFpQixFQUFNLGVBQWlCLEVBQU8sZ0NBR3hFLEdBQUssaUJBQW1CLFNBQVMsRUFBSSxDQUVuQyxBQUFJLEtBQUssV0FBVyxHQUFHLFFBQVEsUUFBUSxFQUFHLFFBQVUsSUFDaEQsS0FBSyxXQUFXLEdBQUcsSUFBSSxRQUFRLEVBQUcsUUFBVSxJQUM5QyxNQUFLLGlCQUFpQixFQUFHLE1BQVEsSUFJckMsR0FBSyxhQUFlLFVBQVcsQ0FDN0IsTUFBTyxNQUFLLFdBQVcsS0FBSyxXQUFXLE9BQVMsSUFHbEQsR0FBSyxnQkFBa0IsVUFBVyxDQUNoQyxPQUFTLEdBQUksS0FBSyxXQUFXLE9BQVMsR0FBSSxJQUFLLENBQzdDLEdBQUksR0FBUSxLQUFLLFdBQVcsR0FDNUIsR0FBSSxFQUFNLE1BQVEsR0FBYSxNQUFPLEtBSzFDLEdBQUssaUJBQW1CLFVBQVcsQ0FDakMsT0FBUyxHQUFJLEtBQUssV0FBVyxPQUFTLEdBQUksSUFBSyxDQUM3QyxHQUFJLEdBQVEsS0FBSyxXQUFXLEdBQzVCLEdBQUksRUFBTSxNQUFRLElBQWEsQ0FBRSxHQUFNLE1BQVEsSUFBZ0IsTUFBTyxLQUkxRSxHQUFJLElBQU8sU0FBYyxFQUFRLEVBQUssRUFBSyxDQUN6QyxLQUFLLEtBQU8sR0FDWixLQUFLLE1BQVEsRUFDYixLQUFLLElBQU0sRUFDUCxFQUFPLFFBQVEsV0FDZixNQUFLLElBQU0sR0FBSSxJQUFlLEVBQVEsSUFDdEMsRUFBTyxRQUFRLGtCQUNmLE1BQUssV0FBYSxFQUFPLFFBQVEsa0JBQ2pDLEVBQU8sUUFBUSxRQUNmLE1BQUssTUFBUSxDQUFDLEVBQUssS0FLckIsR0FBTyxHQUFPLFVBRWxCLEdBQUssVUFBWSxVQUFXLENBQzFCLE1BQU8sSUFBSSxJQUFLLEtBQU0sS0FBSyxNQUFPLEtBQUssV0FHekMsR0FBSyxZQUFjLFNBQVMsRUFBSyxFQUFLLENBQ3BDLE1BQU8sSUFBSSxJQUFLLEtBQU0sRUFBSyxJQUs3QixZQUFzQixFQUFNLEVBQU0sRUFBSyxFQUFLLENBQzFDLFNBQUssS0FBTyxFQUNaLEVBQUssSUFBTSxFQUNQLEtBQUssUUFBUSxXQUNiLEdBQUssSUFBSSxJQUFNLEdBQ2YsS0FBSyxRQUFRLFFBQ2IsR0FBSyxNQUFNLEdBQUssR0FDYixFQUdULEdBQUssV0FBYSxTQUFTLEVBQU0sRUFBTSxDQUNyQyxNQUFPLElBQWEsS0FBSyxLQUFNLEVBQU0sRUFBTSxLQUFLLFdBQVksS0FBSyxnQkFLbkUsR0FBSyxhQUFlLFNBQVMsRUFBTSxFQUFNLEVBQUssRUFBSyxDQUNqRCxNQUFPLElBQWEsS0FBSyxLQUFNLEVBQU0sRUFBTSxFQUFLLElBS2xELEdBQUksSUFBYSxTQUFvQixFQUFPLEVBQVEsRUFBZSxFQUFVLEVBQVcsQ0FDdEYsS0FBSyxNQUFRLEVBQ2IsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUNoQixLQUFLLGNBQWdCLENBQUMsQ0FBQyxFQUN2QixLQUFLLFNBQVcsRUFDaEIsS0FBSyxVQUFZLENBQUMsQ0FBQyxHQUdqQixHQUFVLENBQ1osT0FBUSxHQUFJLElBQVcsSUFBSyxJQUM1QixPQUFRLEdBQUksSUFBVyxJQUFLLElBQzVCLE9BQVEsR0FBSSxJQUFXLEtBQU0sSUFDN0IsT0FBUSxHQUFJLElBQVcsSUFBSyxJQUM1QixPQUFRLEdBQUksSUFBVyxJQUFLLElBQzVCLE9BQVEsR0FBSSxJQUFXLElBQUssR0FBTSxHQUFNLFNBQVUsRUFBRyxDQUFFLE1BQU8sR0FBRSx5QkFDaEUsT0FBUSxHQUFJLElBQVcsV0FBWSxJQUNuQyxPQUFRLEdBQUksSUFBVyxXQUFZLElBQ25DLFdBQVksR0FBSSxJQUFXLFdBQVksR0FBTSxHQUFPLEtBQU0sSUFDMUQsTUFBTyxHQUFJLElBQVcsV0FBWSxHQUFPLEdBQU8sS0FBTSxLQUdwRCxHQUFPLEdBQU8sVUFFbEIsR0FBSyxlQUFpQixVQUFXLENBQy9CLE1BQU8sQ0FBQyxHQUFRLFNBR2xCLEdBQUssYUFBZSxTQUFTLEVBQVUsQ0FDckMsR0FBSSxHQUFTLEtBQUssYUFDbEIsTUFBSSxLQUFXLEdBQVEsUUFBVSxJQUFXLEdBQVEsT0FDekMsR0FDUCxJQUFhLEVBQU0sT0FBVSxLQUFXLEdBQVEsUUFBVSxJQUFXLEdBQVEsUUFDdEUsQ0FBQyxFQUFPLE9BS2YsSUFBYSxFQUFNLFNBQVcsSUFBYSxFQUFNLE1BQVEsS0FBSyxZQUN2RCxHQUFVLEtBQUssS0FBSyxNQUFNLE1BQU0sS0FBSyxXQUFZLEtBQUssUUFDN0QsSUFBYSxFQUFNLE9BQVMsSUFBYSxFQUFNLE1BQVEsSUFBYSxFQUFNLEtBQU8sSUFBYSxFQUFNLFFBQVUsSUFBYSxFQUFNLE1BQzFILEdBQ1AsSUFBYSxFQUFNLE9BQ1osSUFBVyxHQUFRLE9BQzFCLElBQWEsRUFBTSxNQUFRLElBQWEsRUFBTSxRQUFVLElBQWEsRUFBTSxLQUNwRSxHQUNKLENBQUMsS0FBSyxhQUdmLEdBQUssbUJBQXFCLFVBQVcsQ0FDbkMsT0FBUyxHQUFJLEtBQUssUUFBUSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDakQsR0FBSSxHQUFVLEtBQUssUUFBUSxHQUMzQixHQUFJLEVBQVEsUUFBVSxXQUNsQixNQUFPLEdBQVEsVUFFckIsTUFBTyxJQUdULEdBQUssY0FBZ0IsU0FBUyxFQUFVLENBQ3RDLEdBQUksR0FBUSxFQUFPLEtBQUssS0FDeEIsQUFBSSxFQUFLLFNBQVcsSUFBYSxFQUFNLElBQ25DLEtBQUssWUFBYyxHQUNsQixBQUFJLEdBQVMsRUFBSyxlQUNuQixFQUFPLEtBQUssS0FBTSxHQUVsQixLQUFLLFlBQWMsRUFBSyxZQUs5QixFQUFNLE9BQU8sY0FBZ0IsRUFBTSxPQUFPLGNBQWdCLFVBQVcsQ0FDbkUsR0FBSSxLQUFLLFFBQVEsU0FBVyxFQUFHLENBQzdCLEtBQUssWUFBYyxHQUNuQixPQUVGLEdBQUksR0FBTSxLQUFLLFFBQVEsTUFDdkIsQUFBSSxJQUFRLEdBQVEsUUFBVSxLQUFLLGFBQWEsUUFBVSxZQUN4RCxHQUFNLEtBQUssUUFBUSxPQUVyQixLQUFLLFlBQWMsQ0FBQyxFQUFJLFFBRzFCLEVBQU0sT0FBTyxjQUFnQixTQUFTLEVBQVUsQ0FDOUMsS0FBSyxRQUFRLEtBQUssS0FBSyxhQUFhLEdBQVksR0FBUSxPQUFTLEdBQVEsUUFDekUsS0FBSyxZQUFjLElBR3JCLEVBQU0sYUFBYSxjQUFnQixVQUFXLENBQzVDLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDMUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sT0FBTyxjQUFnQixTQUFTLEVBQVUsQ0FDOUMsR0FBSSxHQUFrQixJQUFhLEVBQU0sS0FBTyxJQUFhLEVBQU0sTUFBUSxJQUFhLEVBQU0sT0FBUyxJQUFhLEVBQU0sT0FDMUgsS0FBSyxRQUFRLEtBQUssRUFBa0IsR0FBUSxPQUFTLEdBQVEsUUFDN0QsS0FBSyxZQUFjLElBR3JCLEVBQU0sT0FBTyxjQUFnQixVQUFXLEdBSXhDLEVBQU0sVUFBVSxjQUFnQixFQUFNLE9BQU8sY0FBZ0IsU0FBUyxFQUFVLENBQzlFLEFBQUksRUFBUyxZQUFjLElBQWEsRUFBTSxNQUFRLElBQWEsRUFBTSxPQUNyRSxDQUFFLEtBQWEsRUFBTSxTQUFXLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxVQUN0RixDQUFHLE1BQWEsRUFBTSxPQUFTLElBQWEsRUFBTSxTQUFXLEtBQUssZUFBaUIsR0FBUSxRQUMzRixLQUFLLFFBQVEsS0FBSyxHQUFRLFFBRTFCLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDOUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sVUFBVSxjQUFnQixVQUFXLENBQ3pDLEFBQUksS0FBSyxlQUFpQixHQUFRLE9BQzlCLEtBQUssUUFBUSxNQUViLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDOUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sS0FBSyxjQUFnQixTQUFTLEVBQVUsQ0FDNUMsR0FBSSxJQUFhLEVBQU0sVUFBVyxDQUNoQyxHQUFJLEdBQVEsS0FBSyxRQUFRLE9BQVMsRUFDbEMsQUFBSSxLQUFLLFFBQVEsS0FBVyxHQUFRLE9BQ2hDLEtBQUssUUFBUSxHQUFTLEdBQVEsV0FFOUIsS0FBSyxRQUFRLEdBQVMsR0FBUSxNQUVwQyxLQUFLLFlBQWMsSUFHckIsRUFBTSxLQUFLLGNBQWdCLFNBQVMsRUFBVSxDQUM1QyxHQUFJLEdBQVUsR0FDZCxBQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssSUFBYSxFQUFNLEtBQ2xELE1BQUssUUFBVSxNQUFRLENBQUMsS0FBSyxhQUM3QixLQUFLLFFBQVUsU0FBVyxLQUFLLHVCQUMvQixHQUFVLElBRWhCLEtBQUssWUFBYyxHQVFyQixHQUFJLElBQXdCLDg5QkFDeEIsR0FBeUIsR0FBd0IseUJBQ2pELEdBQXlCLEdBQ3pCLEdBQTBCLENBQzVCLEVBQUcsR0FDSCxHQUFJLEdBQ0osR0FBSSxJQUlGLEdBQStCLHFwQkFHL0IsR0FBb0IsMitEQUNwQixHQUFxQixHQUFvQixrSEFDekMsR0FBcUIsR0FBcUIseUVBQzFDLEdBQXNCLENBQ3hCLEVBQUcsR0FDSCxHQUFJLEdBQ0osR0FBSSxJQUdGLEdBQU8sR0FDWCxZQUEwQixFQUFhLENBQ3JDLEdBQUksR0FBSSxHQUFLLEdBQWUsQ0FDMUIsT0FBUSxHQUFZLEdBQXdCLEdBQWUsSUFBTSxJQUNqRSxVQUFXLENBQ1QsaUJBQWtCLEdBQVksSUFDOUIsT0FBUSxHQUFZLEdBQW9CLE1BRzVDLEVBQUUsVUFBVSxrQkFBb0IsRUFBRSxVQUFVLE9BRTVDLEVBQUUsVUFBVSxHQUFLLEVBQUUsVUFBVSxpQkFDN0IsRUFBRSxVQUFVLEdBQUssRUFBRSxVQUFVLE9BQzdCLEVBQUUsVUFBVSxJQUFNLEVBQUUsVUFBVSxrQkFFaEMsR0FBaUIsR0FDakIsR0FBaUIsSUFDakIsR0FBaUIsSUFFakIsR0FBSSxJQUFPLEdBQU8sVUFFZCxHQUF3QixTQUErQixFQUFRLENBQ2pFLEtBQUssT0FBUyxFQUNkLEtBQUssV0FBYSxNQUFTLEdBQU8sUUFBUSxhQUFlLEVBQUksS0FBTyxJQUFPLEdBQU8sUUFBUSxhQUFlLEVBQUksSUFBTSxJQUNuSCxLQUFLLGtCQUFvQixHQUFLLEVBQU8sUUFBUSxhQUFlLEdBQUssR0FBSyxFQUFPLFFBQVEsYUFDckYsS0FBSyxPQUFTLEdBQ2QsS0FBSyxNQUFRLEdBQ2IsS0FBSyxNQUFRLEVBQ2IsS0FBSyxRQUFVLEdBQ2YsS0FBSyxRQUFVLEdBQ2YsS0FBSyxJQUFNLEVBQ1gsS0FBSyxhQUFlLEVBQ3BCLEtBQUssZ0JBQWtCLEdBQ3ZCLEtBQUssNEJBQThCLEdBQ25DLEtBQUssbUJBQXFCLEVBQzFCLEtBQUssaUJBQW1CLEVBQ3hCLEtBQUssV0FBYSxHQUNsQixLQUFLLG1CQUFxQixJQUc1QixHQUFzQixVQUFVLE1BQVEsU0FBZ0IsRUFBTyxFQUFTLEVBQU8sQ0FDN0UsR0FBSSxHQUFVLEVBQU0sUUFBUSxPQUFTLEdBQ3JDLEtBQUssTUFBUSxFQUFRLEVBQ3JCLEtBQUssT0FBUyxFQUFVLEdBQ3hCLEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxHQUFXLEtBQUssT0FBTyxRQUFRLGFBQWUsRUFDN0QsS0FBSyxRQUFVLEdBQVcsS0FBSyxPQUFPLFFBQVEsYUFBZSxHQUcvRCxHQUFzQixVQUFVLE1BQVEsU0FBZ0IsRUFBUyxDQUMvRCxLQUFLLE9BQU8saUJBQWlCLEtBQUssTUFBUSxnQ0FBbUMsS0FBSyxPQUFVLE1BQVEsSUFLdEcsR0FBc0IsVUFBVSxHQUFLLFNBQWEsRUFBRyxFQUFRLENBQ3pELEFBQUssSUFBVyxRQUFTLEdBQVMsSUFFcEMsR0FBSSxHQUFJLEtBQUssT0FDVCxFQUFJLEVBQUUsT0FDVixHQUFJLEdBQUssRUFDUCxNQUFPLEdBRVQsR0FBSSxHQUFJLEVBQUUsV0FBVyxHQUNyQixHQUFJLENBQUUsSUFBVSxLQUFLLFVBQVksR0FBSyxPQUFVLEdBQUssT0FBVSxFQUFJLEdBQUssRUFDdEUsTUFBTyxHQUVULEdBQUksR0FBTyxFQUFFLFdBQVcsRUFBSSxHQUM1QixNQUFPLElBQVEsT0FBVSxHQUFRLE1BQVUsSUFBSyxJQUFNLEVBQU8sU0FBWSxHQUczRSxHQUFzQixVQUFVLFVBQVksU0FBb0IsRUFBRyxFQUFRLENBQ3ZFLEFBQUssSUFBVyxRQUFTLEdBQVMsSUFFcEMsR0FBSSxHQUFJLEtBQUssT0FDVCxFQUFJLEVBQUUsT0FDVixHQUFJLEdBQUssRUFDUCxNQUFPLEdBRVQsR0FBSSxHQUFJLEVBQUUsV0FBVyxHQUFJLEVBQ3pCLE1BQUksQ0FBRSxJQUFVLEtBQUssVUFBWSxHQUFLLE9BQVUsR0FBSyxPQUFVLEVBQUksR0FBSyxHQUNuRSxHQUFPLEVBQUUsV0FBVyxFQUFJLElBQU0sT0FBVSxFQUFPLE1BQzNDLEVBQUksRUFFTixFQUFJLEdBR2IsR0FBc0IsVUFBVSxRQUFVLFNBQWtCLEVBQVEsQ0FDaEUsTUFBSyxLQUFXLFFBQVMsR0FBUyxJQUU3QixLQUFLLEdBQUcsS0FBSyxJQUFLLElBRzNCLEdBQXNCLFVBQVUsVUFBWSxTQUFvQixFQUFRLENBQ3BFLE1BQUssS0FBVyxRQUFTLEdBQVMsSUFFN0IsS0FBSyxHQUFHLEtBQUssVUFBVSxLQUFLLElBQUssR0FBUyxJQUduRCxHQUFzQixVQUFVLFFBQVUsU0FBa0IsRUFBUSxDQUNoRSxBQUFLLElBQVcsUUFBUyxHQUFTLElBRXBDLEtBQUssSUFBTSxLQUFLLFVBQVUsS0FBSyxJQUFLLElBR3RDLEdBQXNCLFVBQVUsSUFBTSxTQUFjLEVBQUksRUFBUSxDQUc5RCxNQUZPLEtBQVcsUUFBUyxHQUFTLElBRWhDLEtBQUssUUFBUSxLQUFZLEVBQzNCLE1BQUssUUFBUSxHQUNOLElBRUYsSUFHVCxZQUEyQixFQUFJLENBQzdCLE1BQUksSUFBTSxNQUFpQixPQUFPLGFBQWEsR0FDL0MsSUFBTSxNQUNDLE9BQU8sYUFBYyxJQUFNLElBQU0sTUFBUyxHQUFLLE1BQVUsUUFTbEUsR0FBSyxvQkFBc0IsU0FBUyxFQUFPLENBSXpDLE9BSEksR0FBYSxFQUFNLFdBQ25CLEVBQVEsRUFBTSxNQUVULEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxJQUFLLENBQ3JDLEdBQUksR0FBTyxFQUFNLE9BQU8sR0FDeEIsQUFBSSxFQUFXLFFBQVEsS0FBVSxJQUMvQixLQUFLLE1BQU0sRUFBTSxNQUFPLG1DQUV0QixFQUFNLFFBQVEsRUFBTSxFQUFJLEdBQUssSUFDL0IsS0FBSyxNQUFNLEVBQU0sTUFBTyx1Q0FXOUIsR0FBSyxzQkFBd0IsU0FBUyxFQUFPLENBQzNDLEtBQUssZUFBZSxHQU9oQixDQUFDLEVBQU0sU0FBVyxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQU0sV0FBVyxPQUFTLEdBQy9FLEdBQU0sUUFBVSxHQUNoQixLQUFLLGVBQWUsS0FLeEIsR0FBSyxlQUFpQixTQUFTLEVBQU8sQ0FDcEMsRUFBTSxJQUFNLEVBQ1osRUFBTSxhQUFlLEVBQ3JCLEVBQU0sZ0JBQWtCLEdBQ3hCLEVBQU0sNEJBQThCLEdBQ3BDLEVBQU0sbUJBQXFCLEVBQzNCLEVBQU0saUJBQW1CLEVBQ3pCLEVBQU0sV0FBVyxPQUFTLEVBQzFCLEVBQU0sbUJBQW1CLE9BQVMsRUFFbEMsS0FBSyxtQkFBbUIsR0FFcEIsRUFBTSxNQUFRLEVBQU0sT0FBTyxRQUV6QixHQUFNLElBQUksS0FDWixFQUFNLE1BQU0saUJBRVYsR0FBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxPQUN2QyxFQUFNLE1BQU0sNkJBR1osRUFBTSxpQkFBbUIsRUFBTSxvQkFDakMsRUFBTSxNQUFNLGtCQUVkLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBTSxtQkFBb0IsRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUFHLENBQ3hFLEdBQUksR0FBTyxFQUFLLEdBRWhCLEFBQUksRUFBTSxXQUFXLFFBQVEsS0FBVSxJQUNyQyxFQUFNLE1BQU0sc0NBTWxCLEdBQUssbUJBQXFCLFNBQVMsRUFBTyxDQUV4QyxJQURBLEtBQUssbUJBQW1CLEdBQ2pCLEVBQU0sSUFBSSxNQUNmLEtBQUssbUJBQW1CLEdBSTFCLEFBQUksS0FBSyxxQkFBcUIsRUFBTyxLQUNuQyxFQUFNLE1BQU0scUJBRVYsRUFBTSxJQUFJLE1BQ1osRUFBTSxNQUFNLDZCQUtoQixHQUFLLG1CQUFxQixTQUFTLEVBQU8sQ0FDeEMsS0FBTyxFQUFNLElBQU0sRUFBTSxPQUFPLFFBQVUsS0FBSyxlQUFlLElBQzVELEdBSUosR0FBSyxlQUFpQixTQUFTLEVBQU8sQ0FDcEMsTUFBSSxNQUFLLG9CQUFvQixHQUl2QixHQUFNLDZCQUErQixLQUFLLHFCQUFxQixJQUU3RCxFQUFNLFNBQ1IsRUFBTSxNQUFNLHNCQUdULElBR0wsR0FBTSxRQUFVLEtBQUssZUFBZSxHQUFTLEtBQUssdUJBQXVCLElBQzNFLE1BQUsscUJBQXFCLEdBQ25CLElBR0YsSUFJVCxHQUFLLG9CQUFzQixTQUFTLEVBQU8sQ0FDekMsR0FBSSxHQUFRLEVBQU0sSUFJbEIsR0FIQSxFQUFNLDRCQUE4QixHQUdoQyxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLElBQ3ZDLE1BQU8sR0FJVCxHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksRUFBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxJQUN2QyxNQUFPLEdBRVQsRUFBTSxJQUFNLEVBSWQsR0FBSSxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLElBQWUsQ0FDdEQsR0FBSSxHQUFhLEdBSWpCLEdBSEksS0FBSyxRQUFRLGFBQWUsR0FDOUIsR0FBYSxFQUFNLElBQUksS0FFckIsRUFBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxJQUN2QyxZQUFLLG1CQUFtQixHQUNuQixFQUFNLElBQUksS0FDYixFQUFNLE1BQU0sc0JBRWQsRUFBTSw0QkFBOEIsQ0FBQyxFQUM5QixHQUlYLFNBQU0sSUFBTSxFQUNMLElBSVQsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLEVBQVMsQ0FHbkQsTUFGSyxLQUFZLFFBQVMsR0FBVSxJQUVoQyxLQUFLLDJCQUEyQixFQUFPLEdBQ3pDLEdBQU0sSUFBSSxJQUNILElBRUYsSUFJVCxHQUFLLDJCQUE2QixTQUFTLEVBQU8sRUFBUyxDQUN6RCxNQUNFLEdBQU0sSUFBSSxLQUNWLEVBQU0sSUFBSSxLQUNWLEVBQU0sSUFBSSxLQUNWLEtBQUssMkJBQTJCLEVBQU8sSUFHM0MsR0FBSywyQkFBNkIsU0FBUyxFQUFPLEVBQVMsQ0FDekQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEdBQU0sRUFBRyxFQUFNLEdBQ25CLEdBQUksS0FBSyx3QkFBd0IsSUFDL0IsR0FBTSxFQUFNLGFBQ1IsRUFBTSxJQUFJLEtBQWlCLEtBQUssd0JBQXdCLElBQzFELEdBQU0sRUFBTSxjQUVWLEVBQU0sSUFBSSxNQUVaLE1BQUksS0FBUSxJQUFNLEVBQU0sR0FBTyxDQUFDLEdBQzlCLEVBQU0sTUFBTSx5Q0FFUCxHQUdYLEFBQUksRUFBTSxTQUFXLENBQUMsR0FDcEIsRUFBTSxNQUFNLHlCQUVkLEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFJVCxHQUFLLGVBQWlCLFNBQVMsRUFBTyxDQUNwQyxNQUNFLE1BQUssNEJBQTRCLElBQ2pDLEVBQU0sSUFBSSxLQUNWLEtBQUssbUNBQW1DLElBQ3hDLEtBQUsseUJBQXlCLElBQzlCLEtBQUssMkJBQTJCLElBQ2hDLEtBQUsseUJBQXlCLElBR2xDLEdBQUssbUNBQXFDLFNBQVMsRUFBTyxDQUN4RCxHQUFJLEdBQVEsRUFBTSxJQUNsQixHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksS0FBSyxxQkFBcUIsR0FDNUIsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLDJCQUE2QixTQUFTLEVBQU8sQ0FDaEQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksSUFBZSxDQUMzQixHQUFJLEVBQU0sSUFBSSxLQUFpQixFQUFNLElBQUksSUFBZSxDQUV0RCxHQURBLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLE1BQU8sR0FFVCxFQUFNLE1BQU0sc0JBRWQsRUFBTSxJQUFNLEVBRWQsTUFBTyxJQUVULEdBQUsseUJBQTJCLFNBQVMsRUFBTyxDQUM5QyxHQUFJLEVBQU0sSUFBSSxJQUFlLENBTzNCLEdBTkEsQUFBSSxLQUFLLFFBQVEsYUFBZSxFQUM5QixLQUFLLHNCQUFzQixHQUNsQixFQUFNLFlBQWMsSUFDN0IsRUFBTSxNQUFNLGlCQUVkLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLFNBQU0sb0JBQXNCLEVBQ3JCLEdBRVQsRUFBTSxNQUFNLHNCQUVkLE1BQU8sSUFJVCxHQUFLLHVCQUF5QixTQUFTLEVBQU8sQ0FDNUMsTUFDRSxHQUFNLElBQUksS0FDVixLQUFLLG1DQUFtQyxJQUN4QyxLQUFLLHlCQUF5QixJQUM5QixLQUFLLDJCQUEyQixJQUNoQyxLQUFLLHlCQUF5QixJQUM5QixLQUFLLGtDQUFrQyxJQUN2QyxLQUFLLG1DQUFtQyxJQUs1QyxHQUFLLGtDQUFvQyxTQUFTLEVBQU8sQ0FDdkQsTUFBSSxNQUFLLDJCQUEyQixFQUFPLEtBQ3pDLEVBQU0sTUFBTSxxQkFFUCxJQUlULEdBQUssMEJBQTRCLFNBQVMsRUFBTyxDQUMvQyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBa0IsR0FDcEIsR0FBTSxhQUFlLEVBQ3JCLEVBQU0sVUFDQyxJQUVGLElBRVQsWUFBMkIsRUFBSSxDQUM3QixNQUNFLEtBQU8sSUFDUCxHQUFNLElBQWdCLEdBQU0sSUFDNUIsSUFBTyxJQUNQLElBQU8sSUFDUCxHQUFNLElBQWdCLEdBQU0sSUFDNUIsR0FBTSxLQUFnQixHQUFNLElBTWhDLEdBQUssNEJBQThCLFNBQVMsRUFBTyxDQUdqRCxPQUZJLEdBQVEsRUFBTSxJQUNkLEVBQUssRUFDRCxHQUFLLEVBQU0sYUFBZSxJQUFNLENBQUMsR0FBa0IsSUFDekQsRUFBTSxVQUVSLE1BQU8sR0FBTSxNQUFRLEdBSXZCLEdBQUssbUNBQXFDLFNBQVMsRUFBTyxDQUN4RCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQ0UsS0FBTyxJQUNQLElBQU8sSUFDUCxDQUFFLElBQU0sSUFBZ0IsR0FBTSxLQUM5QixJQUFPLElBQ1AsSUFBTyxJQUNQLElBQU8sSUFDUCxJQUFPLElBQ1AsSUFBTyxJQUVQLEdBQU0sVUFDQyxJQUVGLElBTVQsR0FBSyxzQkFBd0IsU0FBUyxFQUFPLENBQzNDLEdBQUksRUFBTSxJQUFJLElBQWUsQ0FDM0IsR0FBSSxLQUFLLG9CQUFvQixHQUFRLENBQ25DLEFBQUksRUFBTSxXQUFXLFFBQVEsRUFBTSxtQkFBcUIsSUFDdEQsRUFBTSxNQUFNLGdDQUVkLEVBQU0sV0FBVyxLQUFLLEVBQU0saUJBQzVCLE9BRUYsRUFBTSxNQUFNLG1CQU9oQixHQUFLLG9CQUFzQixTQUFTLEVBQU8sQ0FFekMsR0FEQSxFQUFNLGdCQUFrQixHQUNwQixFQUFNLElBQUksSUFBZSxDQUMzQixHQUFJLEtBQUssK0JBQStCLElBQVUsRUFBTSxJQUFJLElBQzFELE1BQU8sR0FFVCxFQUFNLE1BQU0sOEJBRWQsTUFBTyxJQU9ULEdBQUssK0JBQWlDLFNBQVMsRUFBTyxDQUVwRCxHQURBLEVBQU0sZ0JBQWtCLEdBQ3BCLEtBQUssZ0NBQWdDLEdBQVEsQ0FFL0MsSUFEQSxFQUFNLGlCQUFtQixHQUFrQixFQUFNLGNBQzFDLEtBQUssK0JBQStCLElBQ3pDLEVBQU0saUJBQW1CLEdBQWtCLEVBQU0sY0FFbkQsTUFBTyxHQUVULE1BQU8sSUFRVCxHQUFLLGdDQUFrQyxTQUFTLEVBQU8sQ0FDckQsR0FBSSxHQUFRLEVBQU0sSUFDZCxFQUFTLEtBQUssUUFBUSxhQUFlLEdBQ3JDLEVBQUssRUFBTSxRQUFRLEdBTXZCLE1BTEEsR0FBTSxRQUFRLEdBRVYsSUFBTyxJQUFnQixLQUFLLHNDQUFzQyxFQUFPLElBQzNFLEdBQUssRUFBTSxjQUVULEdBQXdCLEdBQzFCLEdBQU0sYUFBZSxFQUNkLElBR1QsR0FBTSxJQUFNLEVBQ0wsS0FFVCxZQUFpQyxFQUFJLENBQ25DLE1BQU8sR0FBa0IsRUFBSSxLQUFTLElBQU8sSUFBZ0IsSUFBTyxHQVV0RSxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFRLEVBQU0sSUFDZCxFQUFTLEtBQUssUUFBUSxhQUFlLEdBQ3JDLEVBQUssRUFBTSxRQUFRLEdBTXZCLE1BTEEsR0FBTSxRQUFRLEdBRVYsSUFBTyxJQUFnQixLQUFLLHNDQUFzQyxFQUFPLElBQzNFLEdBQUssRUFBTSxjQUVULEdBQXVCLEdBQ3pCLEdBQU0sYUFBZSxFQUNkLElBR1QsR0FBTSxJQUFNLEVBQ0wsS0FFVCxZQUFnQyxFQUFJLENBQ2xDLE1BQU8sR0FBaUIsRUFBSSxLQUFTLElBQU8sSUFBZ0IsSUFBTyxJQUFnQixJQUFPLE1BQXVCLElBQU8sS0FJMUgsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLENBQzFDLE1BQ0UsTUFBSyx3QkFBd0IsSUFDN0IsS0FBSywrQkFBK0IsSUFDcEMsS0FBSywwQkFBMEIsSUFDOUIsRUFBTSxTQUFXLEtBQUsscUJBQXFCLEdBRXJDLEdBRUwsR0FBTSxTQUVKLEdBQU0sWUFBYyxJQUN0QixFQUFNLE1BQU0sMEJBRWQsRUFBTSxNQUFNLG1CQUVQLEtBRVQsR0FBSyx3QkFBMEIsU0FBUyxFQUFPLENBQzdDLEdBQUksR0FBUSxFQUFNLElBQ2xCLEdBQUksS0FBSyx3QkFBd0IsR0FBUSxDQUN2QyxHQUFJLEdBQUksRUFBTSxhQUNkLEdBQUksRUFBTSxRQUVSLE1BQUksR0FBSSxFQUFNLGtCQUNaLEdBQU0saUJBQW1CLEdBRXBCLEdBRVQsR0FBSSxHQUFLLEVBQU0sbUJBQ2IsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLHFCQUF1QixTQUFTLEVBQU8sQ0FDMUMsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUssb0JBQW9CLEdBQzNCLFNBQU0sbUJBQW1CLEtBQUssRUFBTSxpQkFDN0IsR0FFVCxFQUFNLE1BQU0sMkJBRWQsTUFBTyxJQUlULEdBQUssMEJBQTRCLFNBQVMsRUFBTyxDQUMvQyxNQUNFLE1BQUssd0JBQXdCLElBQzdCLEtBQUsseUJBQXlCLElBQzlCLEtBQUssZUFBZSxJQUNwQixLQUFLLDRCQUE0QixJQUNqQyxLQUFLLHNDQUFzQyxFQUFPLEtBQ2pELENBQUMsRUFBTSxTQUFXLEtBQUssb0NBQW9DLElBQzVELEtBQUsseUJBQXlCLElBR2xDLEdBQUsseUJBQTJCLFNBQVMsRUFBTyxDQUM5QyxHQUFJLEdBQVEsRUFBTSxJQUNsQixHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksS0FBSyx3QkFBd0IsR0FDL0IsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLGVBQWlCLFNBQVMsRUFBTyxDQUNwQyxNQUFJLEdBQU0sWUFBYyxJQUFnQixDQUFDLEdBQWUsRUFBTSxhQUM1RCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBRUYsSUFJVCxHQUFLLHdCQUEwQixTQUFTLEVBQU8sQ0FDN0MsR0FBSSxHQUFLLEVBQU0sVUFDZixNQUFJLEtBQU8sSUFDVCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBRUwsSUFBTyxJQUNULEdBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsSUFFTCxJQUFPLElBQ1QsR0FBTSxhQUFlLEdBQ3JCLEVBQU0sVUFDQyxJQUVMLElBQU8sSUFDVCxHQUFNLGFBQWUsR0FDckIsRUFBTSxVQUNDLElBRUwsSUFBTyxJQUNULEdBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsSUFFRixJQUlULEdBQUssd0JBQTBCLFNBQVMsRUFBTyxDQUM3QyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBZ0IsR0FDbEIsR0FBTSxhQUFlLEVBQUssR0FDMUIsRUFBTSxVQUNDLElBRUYsSUFFVCxZQUF5QixFQUFJLENBQzNCLE1BQ0csSUFBTSxJQUFnQixHQUFNLElBQzVCLEdBQU0sSUFBZ0IsR0FBTSxJQUtqQyxHQUFLLHNDQUF3QyxTQUFTLEVBQU8sRUFBUSxDQUNuRSxBQUFLLElBQVcsUUFBUyxHQUFTLElBRWxDLEdBQUksR0FBUSxFQUFNLElBQ2QsRUFBVSxHQUFVLEVBQU0sUUFFOUIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUsseUJBQXlCLEVBQU8sR0FBSSxDQUMzQyxHQUFJLEdBQU8sRUFBTSxhQUNqQixHQUFJLEdBQVcsR0FBUSxPQUFVLEdBQVEsTUFBUSxDQUMvQyxHQUFJLEdBQW1CLEVBQU0sSUFDN0IsR0FBSSxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLE1BQWlCLEtBQUsseUJBQXlCLEVBQU8sR0FBSSxDQUNqRyxHQUFJLEdBQVEsRUFBTSxhQUNsQixHQUFJLEdBQVMsT0FBVSxHQUFTLE1BQzlCLFNBQU0sYUFBZ0IsR0FBTyxPQUFVLEtBQVMsR0FBUSxPQUFVLE1BQzNELEdBR1gsRUFBTSxJQUFNLEVBQ1osRUFBTSxhQUFlLEVBRXZCLE1BQU8sR0FFVCxHQUNFLEdBQ0EsRUFBTSxJQUFJLE1BQ1YsS0FBSyxvQkFBb0IsSUFDekIsRUFBTSxJQUFJLE1BQ1YsR0FBZSxFQUFNLGNBRXJCLE1BQU8sR0FFVCxBQUFJLEdBQ0YsRUFBTSxNQUFNLDBCQUVkLEVBQU0sSUFBTSxFQUdkLE1BQU8sSUFFVCxZQUF3QixFQUFJLENBQzFCLE1BQU8sSUFBTSxHQUFLLEdBQU0sUUFJMUIsR0FBSyx5QkFBMkIsU0FBUyxFQUFPLENBQzlDLEdBQUksRUFBTSxRQUNSLE1BQUksTUFBSywwQkFBMEIsR0FDMUIsR0FFTCxFQUFNLElBQUksSUFDWixHQUFNLGFBQWUsR0FDZCxJQUVGLEdBR1QsR0FBSSxHQUFLLEVBQU0sVUFDZixNQUFJLEtBQU8sSUFBaUIsRUFBQyxFQUFNLFNBQVcsSUFBTyxLQUNuRCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBR0YsSUFJVCxHQUFLLHdCQUEwQixTQUFTLEVBQU8sQ0FDN0MsRUFBTSxhQUFlLEVBQ3JCLEdBQUksR0FBSyxFQUFNLFVBQ2YsR0FBSSxHQUFNLElBQWdCLEdBQU0sR0FBYyxDQUM1QyxFQUNFLEdBQU0sYUFBZSxHQUFLLEVBQU0sYUFBZ0IsR0FBSyxJQUNyRCxFQUFNLGdCQUNFLEdBQUssRUFBTSxZQUFjLElBQWdCLEdBQU0sSUFDekQsTUFBTyxHQUVULE1BQU8sSUFJVCxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFLLEVBQU0sVUFFZixHQUFJLEdBQXVCLEdBQ3pCLFNBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsR0FHVCxHQUNFLEVBQU0sU0FDTixLQUFLLFFBQVEsYUFBZSxHQUMzQixLQUFPLElBQWdCLElBQU8sS0FDL0IsQ0FHQSxHQUZBLEVBQU0sYUFBZSxHQUNyQixFQUFNLFVBRUosRUFBTSxJQUFJLE1BQ1YsS0FBSyx5Q0FBeUMsSUFDOUMsRUFBTSxJQUFJLEtBRVYsTUFBTyxHQUVULEVBQU0sTUFBTSx5QkFHZCxNQUFPLElBRVQsWUFBZ0MsRUFBSSxDQUNsQyxNQUNFLEtBQU8sS0FDUCxJQUFPLElBQ1AsSUFBTyxLQUNQLElBQU8sSUFDUCxJQUFPLEtBQ1AsSUFBTyxHQU9YLEdBQUsseUNBQTJDLFNBQVMsRUFBTyxDQUM5RCxHQUFJLEdBQVEsRUFBTSxJQUdsQixHQUFJLEtBQUssOEJBQThCLElBQVUsRUFBTSxJQUFJLElBQWUsQ0FDeEUsR0FBSSxHQUFPLEVBQU0sZ0JBQ2pCLEdBQUksS0FBSywrQkFBK0IsR0FBUSxDQUM5QyxHQUFJLEdBQVEsRUFBTSxnQkFDbEIsWUFBSywyQ0FBMkMsRUFBTyxFQUFNLEdBQ3RELElBTVgsR0FIQSxFQUFNLElBQU0sRUFHUixLQUFLLHlDQUF5QyxHQUFRLENBQ3hELEdBQUksR0FBYyxFQUFNLGdCQUN4QixZQUFLLDBDQUEwQyxFQUFPLEdBQy9DLEdBRVQsTUFBTyxJQUVULEdBQUssMkNBQTZDLFNBQVMsRUFBTyxFQUFNLEVBQU8sQ0FDN0UsQUFBSyxHQUFJLEVBQU0sa0JBQWtCLFVBQVcsSUFDeEMsRUFBTSxNQUFNLHlCQUNYLEVBQU0sa0JBQWtCLFVBQVUsR0FBTSxLQUFLLElBQzlDLEVBQU0sTUFBTSwyQkFFbEIsR0FBSywwQ0FBNEMsU0FBUyxFQUFPLEVBQWEsQ0FDNUUsQUFBSyxFQUFNLGtCQUFrQixPQUFPLEtBQUssSUFDckMsRUFBTSxNQUFNLDBCQUtsQixHQUFLLDhCQUFnQyxTQUFTLEVBQU8sQ0FDbkQsR0FBSSxHQUFLLEVBRVQsSUFEQSxFQUFNLGdCQUFrQixHQUNqQixHQUErQixFQUFLLEVBQU0sWUFDL0MsRUFBTSxpQkFBbUIsR0FBa0IsR0FDM0MsRUFBTSxVQUVSLE1BQU8sR0FBTSxrQkFBb0IsSUFFbkMsWUFBd0MsRUFBSSxDQUMxQyxNQUFPLElBQWdCLElBQU8sSUFBTyxHQUt2QyxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFLLEVBRVQsSUFEQSxFQUFNLGdCQUFrQixHQUNqQixHQUFnQyxFQUFLLEVBQU0sWUFDaEQsRUFBTSxpQkFBbUIsR0FBa0IsR0FDM0MsRUFBTSxVQUVSLE1BQU8sR0FBTSxrQkFBb0IsSUFFbkMsWUFBeUMsRUFBSSxDQUMzQyxNQUFPLElBQStCLElBQU8sR0FBZSxHQUs5RCxHQUFLLHlDQUEyQyxTQUFTLEVBQU8sQ0FDOUQsTUFBTyxNQUFLLCtCQUErQixJQUk3QyxHQUFLLHlCQUEyQixTQUFTLEVBQU8sQ0FDOUMsR0FBSSxFQUFNLElBQUksSUFBZSxDQUczQixHQUZBLEVBQU0sSUFBSSxJQUNWLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLE1BQU8sR0FHVCxFQUFNLE1BQU0sZ0NBRWQsTUFBTyxJQU1ULEdBQUssbUJBQXFCLFNBQVMsRUFBTyxDQUN4QyxLQUFPLEtBQUssb0JBQW9CLElBQVEsQ0FDdEMsR0FBSSxHQUFPLEVBQU0sYUFDakIsR0FBSSxFQUFNLElBQUksS0FBaUIsS0FBSyxvQkFBb0IsR0FBUSxDQUM5RCxHQUFJLEdBQVEsRUFBTSxhQUNsQixBQUFJLEVBQU0sU0FBWSxLQUFTLElBQU0sSUFBVSxLQUM3QyxFQUFNLE1BQU0sMkJBRVYsSUFBUyxJQUFNLElBQVUsSUFBTSxFQUFPLEdBQ3hDLEVBQU0sTUFBTSw0Q0FRcEIsR0FBSyxvQkFBc0IsU0FBUyxFQUFPLENBQ3pDLEdBQUksR0FBUSxFQUFNLElBRWxCLEdBQUksRUFBTSxJQUFJLElBQWUsQ0FDM0IsR0FBSSxLQUFLLHNCQUFzQixHQUM3QixNQUFPLEdBRVQsR0FBSSxFQUFNLFFBQVMsQ0FFakIsR0FBSSxHQUFPLEVBQU0sVUFDakIsQUFBSSxLQUFTLElBQWdCLEdBQWEsS0FDeEMsRUFBTSxNQUFNLHdCQUVkLEVBQU0sTUFBTSxrQkFFZCxFQUFNLElBQU0sRUFHZCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksS0FBTyxHQUNULEdBQU0sYUFBZSxFQUNyQixFQUFNLFVBQ0MsSUFHRixJQUlULEdBQUssc0JBQXdCLFNBQVMsRUFBTyxDQUMzQyxHQUFJLEdBQVEsRUFBTSxJQUVsQixHQUFJLEVBQU0sSUFBSSxJQUNaLFNBQU0sYUFBZSxFQUNkLEdBR1QsR0FBSSxFQUFNLFNBQVcsRUFBTSxJQUFJLElBQzdCLFNBQU0sYUFBZSxHQUNkLEdBR1QsR0FBSSxDQUFDLEVBQU0sU0FBVyxFQUFNLElBQUksSUFBZSxDQUM3QyxHQUFJLEtBQUssNkJBQTZCLEdBQ3BDLE1BQU8sR0FFVCxFQUFNLElBQU0sRUFHZCxNQUNFLE1BQUssK0JBQStCLElBQ3BDLEtBQUssMEJBQTBCLElBS25DLEdBQUssNkJBQStCLFNBQVMsRUFBTyxDQUNsRCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBZSxJQUFPLElBQU8sR0FDL0IsR0FBTSxhQUFlLEVBQUssR0FDMUIsRUFBTSxVQUNDLElBRUYsSUFJVCxHQUFLLDRCQUE4QixTQUFTLEVBQU8sQ0FDakQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUsseUJBQXlCLEVBQU8sR0FDdkMsTUFBTyxHQUVULEFBQUksRUFBTSxTQUNSLEVBQU0sTUFBTSxrQkFFZCxFQUFNLElBQU0sRUFFZCxNQUFPLElBSVQsR0FBSyx3QkFBMEIsU0FBUyxFQUFPLENBQzdDLEdBQUksR0FBUSxFQUFNLElBQ2QsRUFBSyxFQUVULElBREEsRUFBTSxhQUFlLEVBQ2QsR0FBZSxFQUFLLEVBQU0sWUFDL0IsRUFBTSxhQUFlLEdBQUssRUFBTSxhQUFnQixHQUFLLElBQ3JELEVBQU0sVUFFUixNQUFPLEdBQU0sTUFBUSxHQUV2QixZQUF3QixFQUFJLENBQzFCLE1BQU8sSUFBTSxJQUFnQixHQUFNLEdBSXJDLEdBQUssb0JBQXNCLFNBQVMsRUFBTyxDQUN6QyxHQUFJLEdBQVEsRUFBTSxJQUNkLEVBQUssRUFFVCxJQURBLEVBQU0sYUFBZSxFQUNkLEdBQVcsRUFBSyxFQUFNLFlBQzNCLEVBQU0sYUFBZSxHQUFLLEVBQU0sYUFBZSxHQUFTLEdBQ3hELEVBQU0sVUFFUixNQUFPLEdBQU0sTUFBUSxHQUV2QixZQUFvQixFQUFJLENBQ3RCLE1BQ0csSUFBTSxJQUFnQixHQUFNLElBQzVCLEdBQU0sSUFBZ0IsR0FBTSxJQUM1QixHQUFNLElBQWdCLEdBQU0sSUFHakMsWUFBa0IsRUFBSSxDQUNwQixNQUFJLElBQU0sSUFBZ0IsR0FBTSxHQUN2QixHQUFNLEdBQUssSUFFaEIsR0FBTSxJQUFnQixHQUFNLElBQ3ZCLEdBQU0sR0FBSyxJQUViLEVBQUssR0FLZCxHQUFLLG9DQUFzQyxTQUFTLEVBQU8sQ0FDekQsR0FBSSxLQUFLLHFCQUFxQixHQUFRLENBQ3BDLEdBQUksR0FBSyxFQUFNLGFBQ2YsR0FBSSxLQUFLLHFCQUFxQixHQUFRLENBQ3BDLEdBQUksR0FBSyxFQUFNLGFBQ2YsQUFBSSxHQUFNLEdBQUssS0FBSyxxQkFBcUIsR0FDdkMsRUFBTSxhQUFlLEVBQUssR0FBSyxFQUFLLEVBQUksRUFBTSxhQUU5QyxFQUFNLGFBQWUsRUFBSyxFQUFJLE1BR2hDLEdBQU0sYUFBZSxFQUV2QixNQUFPLEdBRVQsTUFBTyxJQUlULEdBQUsscUJBQXVCLFNBQVMsRUFBTyxDQUMxQyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBYSxHQUNmLEdBQU0sYUFBZSxFQUFLLEdBQzFCLEVBQU0sVUFDQyxJQUVULEdBQU0sYUFBZSxFQUNkLEtBRVQsWUFBc0IsRUFBSSxDQUN4QixNQUFPLElBQU0sSUFBZ0IsR0FBTSxHQU1yQyxHQUFLLHlCQUEyQixTQUFTLEVBQU8sRUFBUSxDQUN0RCxHQUFJLEdBQVEsRUFBTSxJQUNsQixFQUFNLGFBQWUsRUFDckIsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFRLEVBQUUsRUFBRyxDQUMvQixHQUFJLEdBQUssRUFBTSxVQUNmLEdBQUksQ0FBQyxHQUFXLEdBQ2QsU0FBTSxJQUFNLEVBQ0wsR0FFVCxFQUFNLGFBQWUsR0FBSyxFQUFNLGFBQWUsR0FBUyxHQUN4RCxFQUFNLFVBRVIsTUFBTyxJQU9ULEdBQUksSUFBUSxTQUFlLEVBQUcsQ0FDNUIsS0FBSyxLQUFPLEVBQUUsS0FDZCxLQUFLLE1BQVEsRUFBRSxNQUNmLEtBQUssTUFBUSxFQUFFLE1BQ2YsS0FBSyxJQUFNLEVBQUUsSUFDVCxFQUFFLFFBQVEsV0FDVixNQUFLLElBQU0sR0FBSSxJQUFlLEVBQUcsRUFBRSxTQUFVLEVBQUUsU0FDL0MsRUFBRSxRQUFRLFFBQ1YsTUFBSyxNQUFRLENBQUMsRUFBRSxNQUFPLEVBQUUsT0FLM0IsR0FBTyxHQUFPLFVBSWxCLEdBQUssS0FBTyxTQUFTLEVBQStCLENBQ2xELEFBQUksQ0FBQyxHQUFpQyxLQUFLLEtBQUssU0FBVyxLQUFLLGFBQzVELEtBQUssaUJBQWlCLEtBQUssTUFBTyw4QkFBZ0MsS0FBSyxLQUFLLFNBQzVFLEtBQUssUUFBUSxTQUNiLEtBQUssUUFBUSxRQUFRLEdBQUksSUFBTSxPQUVuQyxLQUFLLFdBQWEsS0FBSyxJQUN2QixLQUFLLGFBQWUsS0FBSyxNQUN6QixLQUFLLGNBQWdCLEtBQUssT0FDMUIsS0FBSyxnQkFBa0IsS0FBSyxTQUM1QixLQUFLLGFBR1AsR0FBSyxTQUFXLFVBQVcsQ0FDekIsWUFBSyxPQUNFLEdBQUksSUFBTSxPQUlmLE1BQU8sU0FBVyxhQUNsQixJQUFLLE9BQU8sVUFBWSxVQUFXLENBQ25DLEdBQUksR0FBUyxLQUViLE1BQU8sQ0FDTCxLQUFNLFVBQVksQ0FDaEIsR0FBSSxHQUFRLEVBQU8sV0FDbkIsTUFBTyxDQUNMLEtBQU0sRUFBTSxPQUFTLEVBQU0sSUFDM0IsTUFBTyxPQVNqQixHQUFLLFdBQWEsVUFBVyxDQUMzQixNQUFPLE1BQUssUUFBUSxLQUFLLFFBQVEsT0FBUyxJQU01QyxHQUFLLFVBQVksVUFBVyxDQUMxQixHQUFJLEdBQWEsS0FBSyxhQUt0QixHQUpJLEVBQUMsR0FBYyxDQUFDLEVBQVcsZ0JBQWlCLEtBQUssWUFFckQsS0FBSyxNQUFRLEtBQUssSUFDZCxLQUFLLFFBQVEsV0FBYSxNQUFLLFNBQVcsS0FBSyxlQUMvQyxLQUFLLEtBQU8sS0FBSyxNQUFNLE9BQVUsTUFBTyxNQUFLLFlBQVksRUFBTSxLQUVuRSxHQUFJLEVBQVcsU0FBWSxNQUFPLEdBQVcsU0FBUyxNQUMvQyxLQUFLLFVBQVUsS0FBSyxzQkFHN0IsR0FBSyxVQUFZLFNBQVMsRUFBTSxDQUc5QixNQUFJLEdBQWtCLEVBQU0sS0FBSyxRQUFRLGFBQWUsSUFBTSxJQUFTLEdBQzVELEtBQUssV0FFVCxLQUFLLGlCQUFpQixJQUcvQixHQUFLLGtCQUFvQixVQUFXLENBQ2xDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3RDLEdBQUksR0FBUSxPQUFVLEdBQVEsTUFBVSxNQUFPLEdBQy9DLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBUSxJQUFRLElBQU0sRUFBTyxVQUcvQixHQUFLLGlCQUFtQixVQUFXLENBQ2pDLEdBQUksR0FBVyxLQUFLLFFBQVEsV0FBYSxLQUFLLGNBQzFDLEVBQVEsS0FBSyxJQUFLLEVBQU0sS0FBSyxNQUFNLFFBQVEsS0FBTSxLQUFLLEtBQU8sR0FHakUsR0FGSSxJQUFRLElBQU0sS0FBSyxNQUFNLEtBQUssSUFBTSxFQUFHLHdCQUMzQyxLQUFLLElBQU0sRUFBTSxFQUNiLEtBQUssUUFBUSxVQUFXLENBQzFCLEdBQVcsVUFBWSxFQUV2QixPQURJLEdBQ0ksR0FBUSxHQUFXLEtBQUssS0FBSyxTQUFXLEVBQU0sTUFBUSxLQUFLLEtBQ2pFLEVBQUUsS0FBSyxRQUNQLEtBQUssVUFBWSxFQUFNLE1BQVEsRUFBTSxHQUFHLE9BRzVDLEFBQUksS0FBSyxRQUFRLFdBQ2IsS0FBSyxRQUFRLFVBQVUsR0FBTSxLQUFLLE1BQU0sTUFBTSxFQUFRLEVBQUcsR0FBTSxFQUFPLEtBQUssSUFDdEQsRUFBVSxLQUFLLGdCQUcxQyxHQUFLLGdCQUFrQixTQUFTLEVBQVcsQ0FJekMsT0FISSxHQUFRLEtBQUssSUFDYixFQUFXLEtBQUssUUFBUSxXQUFhLEtBQUssY0FDMUMsRUFBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQU8sR0FDcEMsS0FBSyxJQUFNLEtBQUssTUFBTSxRQUFVLENBQUMsR0FBVSxJQUNoRCxFQUFLLEtBQUssTUFBTSxXQUFXLEVBQUUsS0FBSyxLQUVwQyxBQUFJLEtBQUssUUFBUSxXQUNiLEtBQUssUUFBUSxVQUFVLEdBQU8sS0FBSyxNQUFNLE1BQU0sRUFBUSxFQUFXLEtBQUssS0FBTSxFQUFPLEtBQUssSUFDcEUsRUFBVSxLQUFLLGdCQU0xQyxHQUFLLFVBQVksVUFBVyxDQUMxQixFQUFNLEtBQU8sS0FBSyxJQUFNLEtBQUssTUFBTSxRQUFRLENBQ3pDLEdBQUksR0FBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3BDLE9BQVEsT0FDSCxRQUFTLEtBQ1osRUFBRSxLQUFLLElBQ1AsVUFDRyxJQUNILEFBQUksS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEtBQU8sSUFDMUMsRUFBRSxLQUFLLFFBRU4sUUFBUyxVQUFXLE1BQ3ZCLEVBQUUsS0FBSyxJQUNILEtBQUssUUFBUSxXQUNmLEdBQUUsS0FBSyxRQUNQLEtBQUssVUFBWSxLQUFLLEtBRXhCLFVBQ0csSUFDSCxPQUFRLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxRQUNwQyxJQUNILEtBQUssbUJBQ0wsVUFDRyxJQUNILEtBQUssZ0JBQWdCLEdBQ3JCLGNBRUEsUUFFRixjQUVBLEdBQUksRUFBSyxHQUFLLEVBQUssSUFBTSxHQUFNLE1BQVEsR0FBbUIsS0FBSyxPQUFPLGFBQWEsSUFDakYsRUFBRSxLQUFLLFFBRVAsWUFXUixHQUFLLFlBQWMsU0FBUyxFQUFNLEVBQUssQ0FDckMsS0FBSyxJQUFNLEtBQUssSUFDWixLQUFLLFFBQVEsV0FBYSxNQUFLLE9BQVMsS0FBSyxlQUNqRCxHQUFJLEdBQVcsS0FBSyxLQUNwQixLQUFLLEtBQU8sRUFDWixLQUFLLE1BQVEsRUFFYixLQUFLLGNBQWMsSUFZckIsR0FBSyxjQUFnQixVQUFXLENBQzlCLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxHQUFRLElBQU0sR0FBUSxHQUFNLE1BQU8sTUFBSyxXQUFXLElBQ3ZELEdBQUksR0FBUSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDN0MsTUFBSSxNQUFLLFFBQVEsYUFBZSxHQUFLLElBQVMsSUFBTSxJQUFVLEdBQzVELE1BQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLFdBRTlCLEdBQUUsS0FBSyxJQUNBLEtBQUssWUFBWSxFQUFNLE9BSWxDLEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUM1QyxNQUFJLE1BQUssWUFBZSxHQUFFLEtBQUssSUFBWSxLQUFLLGNBQzVDLElBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEdBQy9DLEtBQUssU0FBUyxFQUFNLE1BQU8sSUFHcEMsR0FBSywwQkFBNEIsU0FBUyxFQUFNLENBQzlDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDeEMsRUFBTyxFQUNQLEVBQVksSUFBUyxHQUFLLEVBQU0sS0FBTyxFQUFNLE9BU2pELE1BTkksTUFBSyxRQUFRLGFBQWUsR0FBSyxJQUFTLElBQU0sSUFBUyxJQUMzRCxHQUFFLEVBQ0YsRUFBWSxFQUFNLFNBQ2xCLEVBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLElBR3RDLElBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEVBQU8sR0FDdEQsS0FBSyxTQUFTLEVBQVcsSUFHbEMsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBQ3ZDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxJQUFTLEVBQU0sQ0FDakIsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFJLENBQ2xDLEdBQUksR0FBUSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDN0MsR0FBSSxJQUFVLEdBQU0sTUFBTyxNQUFLLFNBQVMsRUFBTSxPQUFRLEdBRXpELE1BQU8sTUFBSyxTQUFTLElBQVMsSUFBTSxFQUFNLFVBQVksRUFBTSxXQUFZLEdBRTFFLE1BQUksS0FBUyxHQUFhLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FDL0MsS0FBSyxTQUFTLElBQVMsSUFBTSxFQUFNLFVBQVksRUFBTSxXQUFZLElBRzFFLEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUM1QyxNQUFJLEtBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEdBQy9DLEtBQUssU0FBUyxFQUFNLFdBQVksSUFHekMsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBQ3ZDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBSSxLQUFTLEVBQ1AsSUFBUyxJQUFNLENBQUMsS0FBSyxVQUFZLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxLQUFPLElBQ3hFLE1BQUssYUFBZSxHQUFLLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxPQUVsRixNQUFLLGdCQUFnQixHQUNyQixLQUFLLFlBQ0UsS0FBSyxhQUVQLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FFakMsSUFBUyxHQUFhLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FDL0MsS0FBSyxTQUFTLEVBQU0sUUFBUyxJQUd0QyxHQUFLLGdCQUFrQixTQUFTLEVBQU0sQ0FDcEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUN4QyxFQUFPLEVBQ1gsTUFBSSxLQUFTLEVBQ1gsR0FBTyxJQUFTLElBQU0sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEtBQU8sR0FBSyxFQUFJLEVBQ25FLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxLQUFVLEdBQWEsS0FBSyxTQUFTLEVBQU0sT0FBUSxFQUFPLEdBQ3hGLEtBQUssU0FBUyxFQUFNLFNBQVUsSUFFbkMsSUFBUyxJQUFNLElBQVMsSUFBTSxDQUFDLEtBQUssVUFBWSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxJQUN4RixLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxHQUUxQyxNQUFLLGdCQUFnQixHQUNyQixLQUFLLFlBQ0UsS0FBSyxhQUVWLEtBQVMsSUFBTSxHQUFPLEdBQ25CLEtBQUssU0FBUyxFQUFNLFdBQVksS0FHekMsR0FBSyxrQkFBb0IsU0FBUyxFQUFNLENBQ3RDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBSSxLQUFTLEdBQWEsS0FBSyxTQUFTLEVBQU0sU0FBVSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxHQUFLLEVBQUksR0FDckcsSUFBUyxJQUFNLElBQVMsSUFBTSxLQUFLLFFBQVEsYUFBZSxFQUM1RCxNQUFLLEtBQU8sRUFDTCxLQUFLLFlBQVksRUFBTSxRQUV6QixLQUFLLFNBQVMsSUFBUyxHQUFLLEVBQU0sR0FBSyxFQUFNLE9BQVEsSUFHOUQsR0FBSyxtQkFBcUIsVUFBVyxDQUNuQyxHQUFJLEdBQWMsS0FBSyxRQUFRLFlBQy9CLEdBQUksR0FBZSxHQUFJLENBQ3JCLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxJQUFTLEdBQUksQ0FDZixHQUFJLEdBQVEsS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQzdDLEdBQUksRUFBUSxJQUFNLEVBQVEsR0FBTSxNQUFPLE1BQUssU0FBUyxFQUFNLFlBQWEsR0FFMUUsR0FBSSxJQUFTLEdBQUksQ0FDZixHQUFJLEdBQWUsR0FBSSxDQUNyQixHQUFJLEdBQVUsS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQy9DLEdBQUksSUFBWSxHQUFNLE1BQU8sTUFBSyxTQUFTLEVBQU0sT0FBUSxHQUUzRCxNQUFPLE1BQUssU0FBUyxFQUFNLFNBQVUsSUFHekMsTUFBTyxNQUFLLFNBQVMsRUFBTSxTQUFVLElBR3ZDLEdBQUssaUJBQW1CLFNBQVMsRUFBTSxDQUNyQyxPQUFRLE9BR0gsSUFDSCxNQUFPLE1BQUssb0JBR1QsSUFBSSxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxZQUM5QyxJQUFJLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLFlBQzlDLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sVUFDOUMsSUFBSSxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxXQUM5QyxJQUFJLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLGNBQzlDLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sY0FDOUMsS0FBSyxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxZQUMvQyxLQUFLLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLFlBQy9DLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sV0FFOUMsSUFDSCxHQUFJLEtBQUssUUFBUSxZQUFjLEVBQUssTUFDcEMsUUFBRSxLQUFLLElBQ0EsS0FBSyxZQUFZLEVBQU0sZUFFM0IsSUFDSCxHQUFJLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQzVDLEdBQUksSUFBUyxLQUFPLElBQVMsR0FBTSxNQUFPLE1BQUssZ0JBQWdCLElBQy9ELEdBQUksS0FBSyxRQUFRLGFBQWUsRUFBRyxDQUNqQyxHQUFJLElBQVMsS0FBTyxJQUFTLEdBQU0sTUFBTyxNQUFLLGdCQUFnQixHQUMvRCxHQUFJLElBQVMsSUFBTSxJQUFTLEdBQU0sTUFBTyxNQUFLLGdCQUFnQixPQUs3RCxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsSUFDM0UsTUFBTyxNQUFLLFdBQVcsUUFHcEIsUUFBUyxJQUNaLE1BQU8sTUFBSyxXQUFXLE9BT3BCLElBQ0gsTUFBTyxNQUFLLHNCQUVULFFBQVMsSUFDWixNQUFPLE1BQUssMEJBQTBCLE9BRW5DLFNBQVUsSUFDYixNQUFPLE1BQUssbUJBQW1CLE9BRTVCLElBQ0gsTUFBTyxNQUFLLHNCQUVULFFBQVMsSUFDWixNQUFPLE1BQUssbUJBQW1CLE9BRTVCLFFBQVMsSUFDWixNQUFPLE1BQUssZ0JBQWdCLE9BRXpCLFFBQVMsSUFDWixNQUFPLE1BQUssa0JBQWtCLE9BRTNCLElBQ0gsTUFBTyxNQUFLLHlCQUVULEtBQ0gsTUFBTyxNQUFLLFNBQVMsRUFBTSxPQUFRLEdBR3JDLEtBQUssTUFBTSxLQUFLLElBQUsseUJBQTJCLEdBQW9CLEdBQVEsTUFHOUUsR0FBSyxTQUFXLFNBQVMsRUFBTSxFQUFNLENBQ25DLEdBQUksR0FBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLElBQUssS0FBSyxJQUFNLEdBQ2hELFlBQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLElBR2hDLEdBQUssV0FBYSxVQUFXLENBRTNCLE9BREksR0FBUyxFQUFTLEVBQVEsS0FBSyxNQUMxQixDQUNQLEFBQUksS0FBSyxLQUFPLEtBQUssTUFBTSxRQUFVLEtBQUssTUFBTSxFQUFPLG1DQUN2RCxHQUFJLEdBQUssS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUVoQyxHQURJLEdBQVUsS0FBSyxJQUFPLEtBQUssTUFBTSxFQUFPLG1DQUN2QyxFQUtJLEVBQVUsT0FMTCxDQUNaLEdBQUksSUFBTyxJQUFPLEVBQVUsV0FDbkIsSUFBTyxLQUFPLEVBQVcsRUFBVSxXQUNuQyxJQUFPLEtBQU8sQ0FBQyxFQUFXLE1BQ25DLEVBQVUsSUFBTyxLQUVuQixFQUFFLEtBQUssSUFFVCxHQUFJLEdBQVUsS0FBSyxNQUFNLE1BQU0sRUFBTyxLQUFLLEtBQzNDLEVBQUUsS0FBSyxJQUNQLEdBQUksR0FBYSxLQUFLLElBQ2xCLEVBQVEsS0FBSyxZQUNqQixBQUFJLEtBQUssYUFBZSxLQUFLLFdBQVcsR0FHeEMsR0FBSSxHQUFRLEtBQUssYUFBZ0IsTUFBSyxZQUFjLEdBQUksSUFBc0IsT0FDOUUsRUFBTSxNQUFNLEVBQU8sRUFBUyxHQUM1QixLQUFLLG9CQUFvQixHQUN6QixLQUFLLHNCQUFzQixHQUczQixHQUFJLEdBQVEsS0FDWixHQUFJLENBQ0YsRUFBUSxHQUFJLFFBQU8sRUFBUyxTQUNyQixHQUFQLEVBS0YsTUFBTyxNQUFLLFlBQVksRUFBTSxPQUFRLENBQUMsUUFBUyxFQUFTLE1BQU8sRUFBTyxNQUFPLEtBT2hGLEdBQUssUUFBVSxTQUFTLEVBQU8sRUFBSyxFQUFnQyxDQVVsRSxPQVJJLEdBQWtCLEtBQUssUUFBUSxhQUFlLElBQU0sSUFBUSxPQUs1RCxFQUE4QixHQUFrQyxLQUFLLE1BQU0sV0FBVyxLQUFLLE9BQVMsR0FFcEcsRUFBUSxLQUFLLElBQUssRUFBUSxFQUFHLEVBQVcsRUFDbkMsRUFBSSxFQUFHLEdBQUksR0FBYyxJQUFnQixFQUFJLEdBQUcsRUFBRSxFQUFHLEVBQUUsS0FBSyxJQUFLLENBQ3hFLEdBQUksSUFBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQU0sR0FBTyxPQUVuRCxHQUFJLEdBQW1CLEtBQVMsR0FBSSxDQUNsQyxBQUFJLEdBQStCLEtBQUssaUJBQWlCLEtBQUssSUFBSyxxRUFDL0QsSUFBYSxJQUFNLEtBQUssaUJBQWlCLEtBQUssSUFBSyxvREFDbkQsSUFBTSxHQUFLLEtBQUssaUJBQWlCLEtBQUssSUFBSywyREFDL0MsRUFBVyxHQUNYLFNBT0YsR0FKQSxBQUFJLElBQVEsR0FBTSxHQUFNLEdBQU8sR0FBSyxHQUMvQixBQUFJLElBQVEsR0FBTSxHQUFNLEdBQU8sR0FBSyxHQUNwQyxBQUFJLElBQVEsSUFBTSxJQUFRLEdBQU0sR0FBTSxHQUFPLEdBQzNDLEdBQU0sSUFDVCxJQUFPLEVBQVMsTUFDcEIsRUFBVyxHQUNYLEVBQVEsRUFBUSxFQUFRLEdBSTFCLE1BREksSUFBbUIsSUFBYSxJQUFNLEtBQUssaUJBQWlCLEtBQUssSUFBTSxFQUFHLDBEQUMxRSxLQUFLLE1BQVEsR0FBUyxHQUFPLE1BQVEsS0FBSyxJQUFNLElBQVUsRUFBYyxLQUVyRSxHQUdULFlBQXdCLEVBQUssRUFBNkIsQ0FDeEQsTUFBSSxHQUNLLFNBQVMsRUFBSyxHQUloQixXQUFXLEVBQUksUUFBUSxLQUFNLEtBR3RDLFlBQXdCLEVBQUssQ0FDM0IsTUFBSSxPQUFPLFNBQVcsV0FDYixLQUlGLE9BQU8sRUFBSSxRQUFRLEtBQU0sS0FHbEMsR0FBSyxnQkFBa0IsU0FBUyxFQUFPLENBQ3JDLEdBQUksR0FBUSxLQUFLLElBQ2pCLEtBQUssS0FBTyxFQUNaLEdBQUksR0FBTSxLQUFLLFFBQVEsR0FDdkIsTUFBSSxJQUFPLE1BQVEsS0FBSyxNQUFNLEtBQUssTUFBUSxFQUFHLDRCQUE4QixHQUM1RSxBQUFJLEtBQUssUUFBUSxhQUFlLElBQU0sS0FBSyxNQUFNLFdBQVcsS0FBSyxPQUFTLElBQ3hFLEdBQU0sR0FBZSxLQUFLLE1BQU0sTUFBTSxFQUFPLEtBQUssTUFDbEQsRUFBRSxLQUFLLEtBQ0UsRUFBa0IsS0FBSyxzQkFBd0IsS0FBSyxNQUFNLEtBQUssSUFBSyxvQ0FDeEUsS0FBSyxZQUFZLEVBQU0sSUFBSyxJQUtyQyxHQUFLLFdBQWEsU0FBUyxFQUFlLENBQ3hDLEdBQUksR0FBUSxLQUFLLElBQ2pCLEFBQUksQ0FBQyxHQUFpQixLQUFLLFFBQVEsR0FBSSxPQUFXLE1BQVUsTUFBUSxLQUFLLE1BQU0sRUFBTyxrQkFDdEYsR0FBSSxHQUFRLEtBQUssSUFBTSxHQUFTLEdBQUssS0FBSyxNQUFNLFdBQVcsS0FBVyxHQUN0RSxBQUFJLEdBQVMsS0FBSyxRQUFVLEtBQUssTUFBTSxFQUFPLGtCQUM5QyxHQUFJLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxLQUN0QyxHQUFJLENBQUMsR0FBUyxDQUFDLEdBQWlCLEtBQUssUUFBUSxhQUFlLElBQU0sSUFBUyxJQUFLLENBQzlFLEdBQUksR0FBUSxHQUFlLEtBQUssTUFBTSxNQUFNLEVBQU8sS0FBSyxNQUN4RCxRQUFFLEtBQUssSUFDSCxFQUFrQixLQUFLLHNCQUF3QixLQUFLLE1BQU0sS0FBSyxJQUFLLG9DQUNqRSxLQUFLLFlBQVksRUFBTSxJQUFLLEdBRXJDLEFBQUksR0FBUyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sRUFBTyxLQUFLLE9BQVMsR0FBUSxJQUNuRSxJQUFTLElBQU0sQ0FBQyxHQUNsQixHQUFFLEtBQUssSUFDUCxLQUFLLFFBQVEsSUFDYixFQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssTUFFL0IsS0FBUyxJQUFNLElBQVMsTUFBUSxDQUFDLEdBQ3BDLEdBQU8sS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLEtBQ2hDLEtBQVMsSUFBTSxJQUFTLEtBQU0sRUFBRSxLQUFLLElBQ3JDLEtBQUssUUFBUSxNQUFRLE1BQVEsS0FBSyxNQUFNLEVBQU8sbUJBRWpELEVBQWtCLEtBQUssc0JBQXdCLEtBQUssTUFBTSxLQUFLLElBQUssb0NBRXhFLEdBQUksR0FBTSxHQUFlLEtBQUssTUFBTSxNQUFNLEVBQU8sS0FBSyxLQUFNLEdBQzVELE1BQU8sTUFBSyxZQUFZLEVBQU0sSUFBSyxJQUtyQyxHQUFLLGNBQWdCLFVBQVcsQ0FDOUIsR0FBSSxHQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssS0FBTSxFQUUxQyxHQUFJLElBQU8sSUFBSyxDQUNkLEFBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxLQUFLLGFBQ3pDLEdBQUksR0FBVSxFQUFFLEtBQUssSUFDckIsRUFBTyxLQUFLLFlBQVksS0FBSyxNQUFNLFFBQVEsSUFBSyxLQUFLLEtBQU8sS0FBSyxLQUNqRSxFQUFFLEtBQUssSUFDSCxFQUFPLFNBQVksS0FBSyxtQkFBbUIsRUFBUyxnQ0FFeEQsR0FBTyxLQUFLLFlBQVksR0FFMUIsTUFBTyxJQUdULFlBQTZCLEVBQU0sQ0FFakMsTUFBSSxJQUFRLE1BQWlCLE9BQU8sYUFBYSxHQUNqRCxJQUFRLE1BQ0QsT0FBTyxhQUFjLElBQVEsSUFBTSxNQUFTLEdBQU8sTUFBUSxRQUdwRSxHQUFLLFdBQWEsU0FBUyxFQUFPLENBRWhDLE9BREksR0FBTSxHQUFJLEVBQWEsRUFBRSxLQUFLLE1BQ3pCLENBQ1AsQUFBSSxLQUFLLEtBQU8sS0FBSyxNQUFNLFFBQVUsS0FBSyxNQUFNLEtBQUssTUFBTyxnQ0FDNUQsR0FBSSxHQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssS0FDcEMsR0FBSSxJQUFPLEVBQVMsTUFDcEIsQUFBSSxJQUFPLEdBQ1QsSUFBTyxLQUFLLE1BQU0sTUFBTSxFQUFZLEtBQUssS0FDekMsR0FBTyxLQUFLLGdCQUFnQixJQUM1QixFQUFhLEtBQUssS0FFZCxJQUFVLEVBQUksS0FBSyxRQUFRLGFBQWUsS0FBTyxLQUFLLE1BQU0sS0FBSyxNQUFPLGdDQUM1RSxFQUFFLEtBQUssS0FHWCxVQUFPLEtBQUssTUFBTSxNQUFNLEVBQVksS0FBSyxPQUNsQyxLQUFLLFlBQVksRUFBTSxPQUFRLElBS3hDLEdBQUksSUFBZ0MsR0FFcEMsR0FBSyxxQkFBdUIsVUFBVyxDQUNyQyxLQUFLLGtCQUFvQixHQUN6QixHQUFJLENBQ0YsS0FBSyxzQkFDRSxFQUFQLENBQ0EsR0FBSSxJQUFRLEdBQ1YsS0FBSywrQkFFTCxNQUFNLEdBSVYsS0FBSyxrQkFBb0IsSUFHM0IsR0FBSyxtQkFBcUIsU0FBUyxFQUFVLEVBQVMsQ0FDcEQsR0FBSSxLQUFLLG1CQUFxQixLQUFLLFFBQVEsYUFBZSxFQUN4RCxLQUFNLElBRU4sS0FBSyxNQUFNLEVBQVUsSUFJekIsR0FBSyxjQUFnQixVQUFXLENBRTlCLE9BREksR0FBTSxHQUFJLEVBQWEsS0FBSyxNQUN2QixDQUNQLEFBQUksS0FBSyxLQUFPLEtBQUssTUFBTSxRQUFVLEtBQUssTUFBTSxLQUFLLE1BQU8seUJBQzVELEdBQUksR0FBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3BDLEdBQUksSUFBTyxJQUFNLElBQU8sSUFBTSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxJQUNwRSxNQUFJLE1BQUssTUFBUSxLQUFLLE9BQVUsTUFBSyxPQUFTLEVBQU0sVUFBWSxLQUFLLE9BQVMsRUFBTSxpQkFDOUUsSUFBTyxHQUNULE1BQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLGVBRTlCLEdBQUUsS0FBSyxJQUNBLEtBQUssWUFBWSxFQUFNLFlBR2xDLElBQU8sS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLEtBQ2xDLEtBQUssWUFBWSxFQUFNLFNBQVUsSUFFMUMsR0FBSSxJQUFPLEdBQ1QsR0FBTyxLQUFLLE1BQU0sTUFBTSxFQUFZLEtBQUssS0FDekMsR0FBTyxLQUFLLGdCQUFnQixJQUM1QixFQUFhLEtBQUssWUFDVCxHQUFVLEdBQUssQ0FHeEIsT0FGQSxHQUFPLEtBQUssTUFBTSxNQUFNLEVBQVksS0FBSyxLQUN6QyxFQUFFLEtBQUssSUFDQyxPQUNILElBQ0gsQUFBSSxLQUFLLE1BQU0sV0FBVyxLQUFLLE9BQVMsSUFBTSxFQUFFLEtBQUssUUFDbEQsSUFDSCxHQUFPO0FBQUEsRUFDUCxjQUVBLEdBQU8sT0FBTyxhQUFhLEdBQzNCLE1BRUYsQUFBSSxLQUFLLFFBQVEsV0FDZixHQUFFLEtBQUssUUFDUCxLQUFLLFVBQVksS0FBSyxLQUV4QixFQUFhLEtBQUssUUFFbEIsRUFBRSxLQUFLLE1BTWIsR0FBSyx5QkFBMkIsVUFBVyxDQUN6QyxLQUFPLEtBQUssSUFBTSxLQUFLLE1BQU0sT0FBUSxLQUFLLE1BQ3hDLE9BQVEsS0FBSyxNQUFNLEtBQUssVUFDbkIsS0FDSCxFQUFFLEtBQUssSUFDUCxVQUVHLElBQ0gsR0FBSSxLQUFLLE1BQU0sS0FBSyxJQUFNLEtBQU8sSUFDL0IsVUFJQyxJQUNILE1BQU8sTUFBSyxZQUFZLEVBQU0sZ0JBQWlCLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLE1BS3JGLEtBQUssTUFBTSxLQUFLLE1BQU8sMEJBS3pCLEdBQUssZ0JBQWtCLFNBQVMsRUFBWSxDQUMxQyxHQUFJLEdBQUssS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLEtBRXRDLE9BREEsRUFBRSxLQUFLLElBQ0MsT0FDSCxLQUFLLE1BQU87QUFBQSxNQUNaLEtBQUssTUFBTyxTQUNaLEtBQUssTUFBTyxRQUFPLGFBQWEsS0FBSyxZQUFZLFFBQ2pELEtBQUssTUFBTyxJQUFvQixLQUFLLHFCQUNyQyxLQUFLLE1BQU8sUUFDWixJQUFJLE1BQU8sU0FDWCxLQUFLLE1BQU8sU0FDWixLQUFLLE1BQU8sU0FDWixJQUFJLEFBQUksS0FBSyxNQUFNLFdBQVcsS0FBSyxPQUFTLElBQU0sRUFBRSxLQUFLLFFBQ3pELElBQ0gsTUFBSSxNQUFLLFFBQVEsV0FBYSxNQUFLLFVBQVksS0FBSyxJQUFLLEVBQUUsS0FBSyxTQUN6RCxPQUNKLFFBQ0EsSUFDSCxHQUFJLEVBQVksQ0FDZCxHQUFJLEdBQVUsS0FBSyxJQUFNLEVBRXpCLFlBQUssbUJBQ0gsRUFDQSw4Q0FHSyxhQUdULEdBQUksR0FBTSxJQUFNLEdBQU0sR0FBSSxDQUN4QixHQUFJLEdBQVcsS0FBSyxNQUFNLE9BQU8sS0FBSyxJQUFNLEVBQUcsR0FBRyxNQUFNLFdBQVcsR0FDL0QsRUFBUSxTQUFTLEVBQVUsR0FDL0IsTUFBSSxHQUFRLEtBQ1YsR0FBVyxFQUFTLE1BQU0sRUFBRyxJQUM3QixFQUFRLFNBQVMsRUFBVSxJQUU3QixLQUFLLEtBQU8sRUFBUyxPQUFTLEVBQzlCLEVBQUssS0FBSyxNQUFNLFdBQVcsS0FBSyxLQUMzQixLQUFhLEtBQU8sSUFBTyxJQUFNLElBQU8sS0FBUSxNQUFLLFFBQVUsSUFDbEUsS0FBSyxtQkFDSCxLQUFLLElBQU0sRUFBSSxFQUFTLE9BQ3hCLEVBQ0ksbUNBQ0EsZ0NBR0QsT0FBTyxhQUFhLEdBRTdCLE1BQUksSUFBVSxHQUdMLEdBRUYsT0FBTyxhQUFhLEtBTS9CLEdBQUssWUFBYyxTQUFTLEVBQUssQ0FDL0IsR0FBSSxHQUFVLEtBQUssSUFDZixFQUFJLEtBQUssUUFBUSxHQUFJLEdBQ3pCLE1BQUksS0FBTSxNQUFRLEtBQUssbUJBQW1CLEVBQVMsaUNBQzVDLEdBU1QsR0FBSyxVQUFZLFVBQVcsQ0FDMUIsS0FBSyxZQUFjLEdBR25CLE9BRkksR0FBTyxHQUFJLEVBQVEsR0FBTSxFQUFhLEtBQUssSUFDM0MsRUFBUyxLQUFLLFFBQVEsYUFBZSxFQUNsQyxLQUFLLElBQU0sS0FBSyxNQUFNLFFBQVEsQ0FDbkMsR0FBSSxHQUFLLEtBQUssb0JBQ2QsR0FBSSxFQUFpQixFQUFJLEdBQ3ZCLEtBQUssS0FBTyxHQUFNLE1BQVMsRUFBSSxVQUN0QixJQUFPLEdBQUksQ0FDcEIsS0FBSyxZQUFjLEdBQ25CLEdBQVEsS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLEtBQzFDLEdBQUksR0FBVyxLQUFLLElBQ3BCLEFBQUksS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLE9BQVMsS0FDdEMsS0FBSyxtQkFBbUIsS0FBSyxJQUFLLDZDQUN0QyxFQUFFLEtBQUssSUFDUCxHQUFJLEdBQU0sS0FBSyxnQkFDZixBQUFNLEdBQVEsRUFBb0IsR0FBa0IsRUFBSyxJQUNyRCxLQUFLLG1CQUFtQixFQUFVLDBCQUN0QyxHQUFRLEdBQW9CLEdBQzVCLEVBQWEsS0FBSyxRQUVsQixPQUVGLEVBQVEsR0FFVixNQUFPLEdBQU8sS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLE1BTWxELEdBQUssU0FBVyxVQUFXLENBQ3pCLEdBQUksR0FBTyxLQUFLLFlBQ1osRUFBTyxFQUFNLEtBQ2pCLE1BQUksTUFBSyxTQUFTLEtBQUssSUFDckIsR0FBTyxHQUFXLElBRWIsS0FBSyxZQUFZLEVBQU0sSUFLaEMsR0FBSSxJQUFVLFFBRWQsR0FBTyxNQUFRLENBQ2IsT0FBUSxHQUNSLFFBQVMsR0FDVCxlQUFnQixHQUNoQixTQUFVLEdBQ1YsZUFBZ0IsR0FDaEIsWUFBYSxHQUNiLEtBQU0sR0FDTixVQUFXLEVBQ1gsU0FBVSxFQUNWLGFBQWMsR0FDZCxXQUFZLEdBQ1osWUFBYSxHQUNiLGlCQUFrQixFQUNsQixrQkFBbUIsRUFDbkIsTUFBTyxHQUNQLFVBQVcsR0FDWCxVQUFXLEdBQ1gsV0FBWSxHQUNaLG1CQUFvQixJQVV0QixZQUFlLEVBQU8sRUFBUyxDQUM3QixNQUFPLElBQU8sTUFBTSxFQUFPLEdBTzdCLFlBQTJCLEVBQU8sRUFBSyxFQUFTLENBQzlDLE1BQU8sSUFBTyxrQkFBa0IsRUFBTyxFQUFLLEdBTTlDLFlBQW1CLEVBQU8sRUFBUyxDQUNqQyxNQUFPLElBQU8sVUFBVSxFQUFPLEdBR2pDLEVBQVEsS0FBTyxHQUNmLEVBQVEsT0FBUyxHQUNqQixFQUFRLFNBQVcsR0FDbkIsRUFBUSxlQUFpQixHQUN6QixFQUFRLFdBQWEsR0FDckIsRUFBUSxNQUFRLEdBQ2hCLEVBQVEsVUFBWSxFQUNwQixFQUFRLGVBQWlCLEdBQ3pCLEVBQVEsWUFBYyxHQUN0QixFQUFRLGlCQUFtQixFQUMzQixFQUFRLGtCQUFvQixFQUM1QixFQUFRLFVBQVksR0FDcEIsRUFBUSxhQUFlLEdBQ3ZCLEVBQVEsVUFBWSxHQUNwQixFQUFRLFdBQWEsR0FDckIsRUFBUSxtQkFBcUIsR0FDN0IsRUFBUSxNQUFRLEdBQ2hCLEVBQVEsa0JBQW9CLEdBQzVCLEVBQVEsWUFBYyxHQUN0QixFQUFRLFNBQVcsRUFDbkIsRUFBUSxVQUFZLEdBQ3BCLEVBQVEsUUFBVSxHQUVsQixPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxTQy9qS3hELDJCQU1BLGFBRUEsR0FBSSxJQUF3QixPQUFPLHNCQUMvQixHQUFpQixPQUFPLFVBQVUsZUFDbEMsR0FBbUIsT0FBTyxVQUFVLHFCQUV4QyxZQUFrQixFQUFLLENBQ3RCLEdBQUksR0FBUSxLQUNYLEtBQU0sSUFBSSxXQUFVLHlEQUdyQixNQUFPLFFBQU8sR0FHZixhQUEyQixDQUMxQixHQUFJLENBQ0gsR0FBSSxDQUFDLE9BQU8sT0FDWCxNQUFPLEdBTVIsR0FBSSxHQUFRLEdBQUksUUFBTyxPQUV2QixHQURBLEVBQU0sR0FBSyxLQUNQLE9BQU8sb0JBQW9CLEdBQU8sS0FBTyxJQUM1QyxNQUFPLEdBS1IsT0FESSxHQUFRLEdBQ0gsRUFBSSxFQUFHLEVBQUksR0FBSSxJQUN2QixFQUFNLElBQU0sT0FBTyxhQUFhLElBQU0sRUFFdkMsR0FBSSxHQUFTLE9BQU8sb0JBQW9CLEdBQU8sSUFBSSxTQUFVLEVBQUcsQ0FDL0QsTUFBTyxHQUFNLEtBRWQsR0FBSSxFQUFPLEtBQUssTUFBUSxhQUN2QixNQUFPLEdBSVIsR0FBSSxHQUFRLEdBSVosTUFIQSx1QkFBdUIsTUFBTSxJQUFJLFFBQVEsU0FBVSxFQUFRLENBQzFELEVBQU0sR0FBVSxJQUViLE9BQU8sS0FBSyxPQUFPLE9BQU8sR0FBSSxJQUFRLEtBQUssTUFDN0MsNkJBS00sRUFBUCxDQUVELE1BQU8sSUFJVCxHQUFPLFFBQVUsS0FBb0IsT0FBTyxPQUFTLFNBQVUsRUFBUSxFQUFRLENBSzlFLE9BSkksR0FDQSxFQUFLLEdBQVMsR0FDZCxFQUVLLEVBQUksRUFBRyxFQUFJLFVBQVUsT0FBUSxJQUFLLENBQzFDLEVBQU8sT0FBTyxVQUFVLElBRXhCLE9BQVMsS0FBTyxHQUNmLEFBQUksR0FBZSxLQUFLLEVBQU0sSUFDN0IsR0FBRyxHQUFPLEVBQUssSUFJakIsR0FBSSxHQUF1QixDQUMxQixFQUFVLEdBQXNCLEdBQ2hDLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQ25DLEFBQUksR0FBaUIsS0FBSyxFQUFNLEVBQVEsS0FDdkMsR0FBRyxFQUFRLElBQU0sRUFBSyxFQUFRLE1BTWxDLE1BQU8sTUN4RlIsd0NBRUEsR0FBSSxJQUFRLEtBQ1IsR0FBZSxLQUVuQixHQUFPLFFBQVUsR0FFakIsR0FBSSxJQUFrQixDQUNwQixNQUFPLEdBQ1AsT0FBUSxHQUNSLFlBQWEsSUFHZixZQUFzQixFQUFLLEVBQVMsQ0FDbEMsRUFBVSxHQUFhLEdBQUksR0FBaUIsR0FFNUMsR0FBSSxDQUNGLEdBQUksR0FBUyxHQUFJLElBQU0sT0FBTyxFQUFTLEVBQUssR0FFNUMsQUFBSSxFQUFRLFFBQ1YsR0FBTyxPQUFTLElBR2IsRUFBUSxhQUNYLEdBQU8sZ0JBQWtCLFNBQVUsRUFBVyxDQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFLLGdEQUl6QixFQUFPLFlBQ1AsRUFBTyxrQkFFSCxFQUFPLE9BQVMsR0FBTSxTQUFTLEtBQ2pDLEVBQU8sbUJBRUYsRUFBUCxDQUNBLEdBQUksQ0FBQyxFQUFRLE1BQ1gsTUFBTyxHQUdULEtBQU0sR0FHUixNQUFPLE1DM0NULHdDQUdBLEdBQU8sUUFBVSxVQUFzQixDQUN0QyxHQUFJLE1BQU8sU0FBVyxZQUFjLE1BQU8sUUFBTyx1QkFBMEIsV0FBYyxNQUFPLEdBQ2pHLEdBQUksTUFBTyxRQUFPLFVBQWEsU0FBWSxNQUFPLEdBRWxELEdBQUksR0FBTSxHQUNOLEVBQU0sT0FBTyxRQUNiLEVBQVMsT0FBTyxHQUlwQixHQUhJLE1BQU8sSUFBUSxVQUVmLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBUyxtQkFDeEMsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFZLGtCQUFxQixNQUFPLEdBVTNFLEdBQUksR0FBUyxHQUNiLEVBQUksR0FBTyxFQUNYLElBQUssSUFBTyxHQUFPLE1BQU8sR0FHMUIsR0FGSSxNQUFPLFFBQU8sTUFBUyxZQUFjLE9BQU8sS0FBSyxHQUFLLFNBQVcsR0FFakUsTUFBTyxRQUFPLHFCQUF3QixZQUFjLE9BQU8sb0JBQW9CLEdBQUssU0FBVyxFQUFLLE1BQU8sR0FFL0csR0FBSSxHQUFPLE9BQU8sc0JBQXNCLEdBR3hDLEdBRkksRUFBSyxTQUFXLEdBQUssRUFBSyxLQUFPLEdBRWpDLENBQUMsT0FBTyxVQUFVLHFCQUFxQixLQUFLLEVBQUssR0FBUSxNQUFPLEdBRXBFLEdBQUksTUFBTyxRQUFPLDBCQUE2QixXQUFZLENBQzFELEdBQUksR0FBYSxPQUFPLHlCQUF5QixFQUFLLEdBQ3RELEdBQUksRUFBVyxRQUFVLEdBQVUsRUFBVyxhQUFlLEdBQVEsTUFBTyxHQUc3RSxNQUFPLE1DeENSLHdDQUVBLEdBQUksSUFBYSxNQUFPLFNBQVcsYUFBZSxPQUM5QyxHQUFnQixLQUVwQixHQUFPLFFBQVUsVUFBNEIsQ0FJNUMsTUFISSxPQUFPLEtBQWUsWUFDdEIsTUFBTyxTQUFXLFlBQ2xCLE1BQU8sSUFBVyxRQUFXLFVBQzdCLE1BQU8sUUFBTyxRQUFXLFNBQW1CLEdBRXpDLFFDWFIsd0NBRUEsR0FBSSxJQUFPLENBQ1YsSUFBSyxJQUdGLEdBQVUsT0FFZCxHQUFPLFFBQVUsVUFBb0IsQ0FDcEMsTUFBTyxDQUFFLFVBQVcsSUFBTyxNQUFRLEdBQUssS0FBTyxDQUFFLEVBQUUsVUFBVyxlQUFrQixRQ1RqRix3Q0FJQSxHQUFJLElBQWdCLGtEQUNoQixHQUFRLE1BQU0sVUFBVSxNQUN4QixHQUFRLE9BQU8sVUFBVSxTQUN6QixHQUFXLG9CQUVmLEdBQU8sUUFBVSxTQUFjLEVBQU0sQ0FDakMsR0FBSSxHQUFTLEtBQ2IsR0FBSSxNQUFPLElBQVcsWUFBYyxHQUFNLEtBQUssS0FBWSxHQUN2RCxLQUFNLElBQUksV0FBVSxHQUFnQixHQXlCeEMsT0F2QkksR0FBTyxHQUFNLEtBQUssVUFBVyxHQUU3QixFQUNBLEVBQVMsVUFBWSxDQUNyQixHQUFJLGVBQWdCLEdBQU8sQ0FDdkIsR0FBSSxHQUFTLEVBQU8sTUFDaEIsS0FDQSxFQUFLLE9BQU8sR0FBTSxLQUFLLGFBRTNCLE1BQUksUUFBTyxLQUFZLEVBQ1osRUFFSixTQUVQLE9BQU8sR0FBTyxNQUNWLEVBQ0EsRUFBSyxPQUFPLEdBQU0sS0FBSyxjQUsvQixFQUFjLEtBQUssSUFBSSxFQUFHLEVBQU8sT0FBUyxFQUFLLFFBQy9DLEVBQVksR0FDUCxFQUFJLEVBQUcsRUFBSSxFQUFhLElBQzdCLEVBQVUsS0FBSyxJQUFNLEdBS3pCLEdBRkEsRUFBUSxTQUFTLFNBQVUsb0JBQXNCLEVBQVUsS0FBSyxLQUFPLDZDQUE2QyxHQUVoSCxFQUFPLFVBQVcsQ0FDbEIsR0FBSSxHQUFRLFVBQWlCLEdBQzdCLEVBQU0sVUFBWSxFQUFPLFVBQ3pCLEVBQU0sVUFBWSxHQUFJLEdBQ3RCLEVBQU0sVUFBWSxLQUd0QixNQUFPLE1DbERYLHdDQUVBLEdBQUksSUFBaUIsS0FFckIsR0FBTyxRQUFVLFNBQVMsVUFBVSxNQUFRLEtDSjVDLHdDQUVBLEdBQUksSUFBTyxLQUVYLEdBQU8sUUFBVSxHQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxrQkNKM0Qsd0NBRUEsR0FBSSxJQUVBLEdBQWUsWUFDZixHQUFZLFNBQ1osR0FBYSxVQUdiLEdBQXdCLFNBQVUsRUFBa0IsQ0FDdkQsR0FBSSxDQUNILE1BQU8sSUFBVSx5QkFBMkIsRUFBbUIsMEJBQ3ZELEVBQVAsSUFHQyxHQUFRLE9BQU8seUJBQ25CLEdBQUksR0FDSCxHQUFJLENBQ0gsR0FBTSxHQUFJLFVBQ0YsRUFBUCxDQUNELEdBQVEsS0FJVixHQUFJLElBQWlCLFVBQVksQ0FDaEMsS0FBTSxJQUFJLEtBRVAsR0FBaUIsR0FDakIsVUFBWSxDQUNkLEdBQUksQ0FFSCxpQkFBVSxPQUNILFNBQ0MsRUFBUCxDQUNELEdBQUksQ0FFSCxNQUFPLElBQU0sVUFBVyxVQUFVLFVBQzFCLEVBQVAsQ0FDRCxNQUFPLFNBSVIsR0FFQyxHQUFhLE9BQ2IsR0FBVyxPQUVYLEdBQVcsT0FBTyxnQkFDckIsSUFDRyxTQUFVLEVBQUcsQ0FBRSxNQUFPLEdBQUUsV0FDeEIsTUFHQSxHQUFZLEdBRVosR0FBYSxNQUFPLGFBQWUsYUFBZSxDQUFDLEdBQVcsR0FBWSxHQUFTLFlBRW5GLEdBQWEsQ0FDaEIsbUJBQW9CLE1BQU8saUJBQW1CLFlBQWMsR0FBWSxlQUN4RSxVQUFXLE1BQ1gsZ0JBQWlCLE1BQU8sY0FBZ0IsWUFBYyxHQUFZLFlBQ2xFLDJCQUE0QixJQUFjLEdBQVcsR0FBUyxHQUFHLE9BQU8sYUFBZSxHQUN2RixtQ0FBb0MsR0FDcEMsa0JBQW1CLEdBQ25CLG1CQUFvQixHQUNwQiwyQkFBNEIsR0FDNUIsMkJBQTRCLEdBQzVCLFlBQWEsTUFBTyxVQUFZLFlBQWMsR0FBWSxRQUMxRCxXQUFZLE1BQU8sU0FBVyxZQUFjLEdBQVksT0FDeEQsa0JBQW1CLE1BQU8sZ0JBQWtCLFlBQWMsR0FBWSxjQUN0RSxtQkFBb0IsTUFBTyxpQkFBbUIsWUFBYyxHQUFZLGVBQ3hFLFlBQWEsUUFDYixhQUFjLE1BQU8sV0FBYSxZQUFjLEdBQVksU0FDNUQsU0FBVSxLQUNWLGNBQWUsVUFDZix1QkFBd0IsbUJBQ3hCLGNBQWUsVUFDZix1QkFBd0IsbUJBQ3hCLFVBQVcsTUFDWCxTQUFVLEtBQ1YsY0FBZSxVQUNmLGlCQUFrQixNQUFPLGVBQWlCLFlBQWMsR0FBWSxhQUNwRSxpQkFBa0IsTUFBTyxlQUFpQixZQUFjLEdBQVksYUFDcEUseUJBQTBCLE1BQU8sdUJBQXlCLFlBQWMsR0FBWSxxQkFDcEYsYUFBYyxHQUNkLHNCQUF1QixHQUN2QixjQUFlLE1BQU8sWUFBYyxZQUFjLEdBQVksVUFDOUQsZUFBZ0IsTUFBTyxhQUFlLFlBQWMsR0FBWSxXQUNoRSxlQUFnQixNQUFPLGFBQWUsWUFBYyxHQUFZLFdBQ2hFLGFBQWMsU0FDZCxVQUFXLE1BQ1gsc0JBQXVCLElBQWMsR0FBVyxHQUFTLEdBQVMsR0FBRyxPQUFPLGNBQWdCLEdBQzVGLFNBQVUsTUFBTyxPQUFTLFNBQVcsS0FBTyxHQUM1QyxRQUFTLE1BQU8sTUFBUSxZQUFjLEdBQVksSUFDbEQseUJBQTBCLE1BQU8sTUFBUSxhQUFlLENBQUMsSUFBYyxDQUFDLEdBQVcsR0FBWSxHQUFTLEdBQUksT0FBTSxPQUFPLGFBQ3pILFNBQVUsS0FDVixXQUFZLE9BQ1osV0FBWSxPQUNaLGVBQWdCLFdBQ2hCLGFBQWMsU0FDZCxZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsVUFBVyxNQUFPLFFBQVUsWUFBYyxHQUFZLE1BQ3RELGVBQWdCLFdBQ2hCLG1CQUFvQixlQUNwQixZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsV0FBWSxPQUNaLFFBQVMsTUFBTyxNQUFRLFlBQWMsR0FBWSxJQUNsRCx5QkFBMEIsTUFBTyxNQUFRLGFBQWUsQ0FBQyxJQUFjLENBQUMsR0FBVyxHQUFZLEdBQVMsR0FBSSxPQUFNLE9BQU8sYUFDekgsc0JBQXVCLE1BQU8sb0JBQXNCLFlBQWMsR0FBWSxrQkFDOUUsV0FBWSxPQUNaLDRCQUE2QixJQUFjLEdBQVcsR0FBUyxHQUFHLE9BQU8sYUFBZSxHQUN4RixXQUFZLEdBQWEsT0FBUyxHQUNsQyxnQkFBaUIsR0FDakIsbUJBQW9CLEdBQ3BCLGVBQWdCLEdBQ2hCLGNBQWUsR0FDZixlQUFnQixNQUFPLGFBQWUsWUFBYyxHQUFZLFdBQ2hFLHNCQUF1QixNQUFPLG9CQUFzQixZQUFjLEdBQVksa0JBQzlFLGdCQUFpQixNQUFPLGNBQWdCLFlBQWMsR0FBWSxZQUNsRSxnQkFBaUIsTUFBTyxjQUFnQixZQUFjLEdBQVksWUFDbEUsYUFBYyxTQUNkLFlBQWEsTUFBTyxVQUFZLFlBQWMsR0FBWSxRQUMxRCxZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsWUFBYSxNQUFPLFVBQVksWUFBYyxHQUFZLFNBRzNELEdBQUksR0FDSCxHQUFJLENBQ0gsS0FBSyxZQUNHLEVBQVAsQ0FFRyxHQUFhLEdBQVMsR0FBUyxJQUNuQyxHQUFXLHFCQUF1QixHQUQ5QixPQUtGLEdBQVMsV0FBZ0IsRUFBTSxDQUNsQyxHQUFJLEdBQ0osR0FBSSxJQUFTLGtCQUNaLEVBQVEsR0FBc0IsZ0NBQ3BCLElBQVMsc0JBQ25CLEVBQVEsR0FBc0IsMkJBQ3BCLElBQVMsMkJBQ25CLEVBQVEsR0FBc0IsaUNBQ3BCLElBQVMsbUJBQW9CLENBQ3ZDLEdBQUksR0FBSyxFQUFPLDRCQUNoQixBQUFJLEdBQ0gsR0FBUSxFQUFHLG1CQUVGLElBQVMsMkJBQTRCLENBQy9DLEdBQUksR0FBTSxFQUFPLG9CQUNqQixBQUFJLEdBQU8sSUFDVixHQUFRLEdBQVMsRUFBSSxZQUl2QixVQUFXLEdBQVEsRUFFWixHQUdKLEdBQWlCLENBQ3BCLHlCQUEwQixDQUFDLGNBQWUsYUFDMUMsbUJBQW9CLENBQUMsUUFBUyxhQUM5Qix1QkFBd0IsQ0FBQyxRQUFTLFlBQWEsV0FDL0MsdUJBQXdCLENBQUMsUUFBUyxZQUFhLFdBQy9DLG9CQUFxQixDQUFDLFFBQVMsWUFBYSxRQUM1QyxzQkFBdUIsQ0FBQyxRQUFTLFlBQWEsVUFDOUMsMkJBQTRCLENBQUMsZ0JBQWlCLGFBQzlDLG1CQUFvQixDQUFDLHlCQUEwQixhQUMvQyw0QkFBNkIsQ0FBQyx5QkFBMEIsWUFBYSxhQUNyRSxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHNCQUF1QixDQUFDLFdBQVksYUFDcEMsa0JBQW1CLENBQUMsT0FBUSxhQUM1QixtQkFBb0IsQ0FBQyxRQUFTLGFBQzlCLHVCQUF3QixDQUFDLFlBQWEsYUFDdEMsMEJBQTJCLENBQUMsZUFBZ0IsYUFDNUMsMEJBQTJCLENBQUMsZUFBZ0IsYUFDNUMsc0JBQXVCLENBQUMsV0FBWSxhQUNwQyxjQUFlLENBQUMsb0JBQXFCLGFBQ3JDLHVCQUF3QixDQUFDLG9CQUFxQixZQUFhLGFBQzNELHVCQUF3QixDQUFDLFlBQWEsYUFDdEMsd0JBQXlCLENBQUMsYUFBYyxhQUN4Qyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLGNBQWUsQ0FBQyxPQUFRLFNBQ3hCLGtCQUFtQixDQUFDLE9BQVEsYUFDNUIsaUJBQWtCLENBQUMsTUFBTyxhQUMxQixvQkFBcUIsQ0FBQyxTQUFVLGFBQ2hDLG9CQUFxQixDQUFDLFNBQVUsYUFDaEMsc0JBQXVCLENBQUMsU0FBVSxZQUFhLFlBQy9DLHFCQUFzQixDQUFDLFNBQVUsWUFBYSxXQUM5QyxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHNCQUF1QixDQUFDLFVBQVcsWUFBYSxRQUNoRCxnQkFBaUIsQ0FBQyxVQUFXLE9BQzdCLG1CQUFvQixDQUFDLFVBQVcsVUFDaEMsb0JBQXFCLENBQUMsVUFBVyxXQUNqQyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLDRCQUE2QixDQUFDLGlCQUFrQixhQUNoRCxvQkFBcUIsQ0FBQyxTQUFVLGFBQ2hDLGlCQUFrQixDQUFDLE1BQU8sYUFDMUIsK0JBQWdDLENBQUMsb0JBQXFCLGFBQ3RELG9CQUFxQixDQUFDLFNBQVUsYUFDaEMsb0JBQXFCLENBQUMsU0FBVSxhQUNoQyx5QkFBMEIsQ0FBQyxjQUFlLGFBQzFDLHdCQUF5QixDQUFDLGFBQWMsYUFDeEMsdUJBQXdCLENBQUMsWUFBYSxhQUN0Qyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLCtCQUFnQyxDQUFDLG9CQUFxQixhQUN0RCx5QkFBMEIsQ0FBQyxjQUFlLGFBQzFDLHlCQUEwQixDQUFDLGNBQWUsYUFDMUMsc0JBQXVCLENBQUMsV0FBWSxhQUNwQyxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHFCQUFzQixDQUFDLFVBQVcsY0FHL0IsR0FBTyxLQUNQLEdBQVMsS0FDVCxHQUFVLEdBQUssS0FBSyxTQUFTLEtBQU0sTUFBTSxVQUFVLFFBQ25ELEdBQWUsR0FBSyxLQUFLLFNBQVMsTUFBTyxNQUFNLFVBQVUsUUFDekQsR0FBVyxHQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxTQUNyRCxHQUFZLEdBQUssS0FBSyxTQUFTLEtBQU0sT0FBTyxVQUFVLE9BQ3RELEdBQVEsR0FBSyxLQUFLLFNBQVMsS0FBTSxPQUFPLFVBQVUsTUFHbEQsR0FBYSxxR0FDYixHQUFlLFdBQ2YsR0FBZSxTQUFzQixFQUFRLENBQ2hELEdBQUksR0FBUSxHQUFVLEVBQVEsRUFBRyxHQUM3QixFQUFPLEdBQVUsRUFBUSxJQUM3QixHQUFJLElBQVUsS0FBTyxJQUFTLElBQzdCLEtBQU0sSUFBSSxJQUFhLGtEQUNqQixHQUFJLElBQVMsS0FBTyxJQUFVLElBQ3BDLEtBQU0sSUFBSSxJQUFhLGtEQUV4QixHQUFJLEdBQVMsR0FDYixVQUFTLEVBQVEsR0FBWSxTQUFVLEVBQU8sRUFBUSxFQUFPLEVBQVcsQ0FDdkUsRUFBTyxFQUFPLFFBQVUsRUFBUSxHQUFTLEVBQVcsR0FBYyxNQUFRLEdBQVUsSUFFOUUsR0FJSixHQUFtQixTQUEwQixFQUFNLEVBQWMsQ0FDcEUsR0FBSSxHQUFnQixFQUNoQixFQU1KLEdBTEksR0FBTyxHQUFnQixJQUMxQixHQUFRLEdBQWUsR0FDdkIsRUFBZ0IsSUFBTSxFQUFNLEdBQUssS0FHOUIsR0FBTyxHQUFZLEdBQWdCLENBQ3RDLEdBQUksR0FBUSxHQUFXLEdBSXZCLEdBSEksSUFBVSxJQUNiLEdBQVEsR0FBTyxJQUVaLE1BQU8sSUFBVSxhQUFlLENBQUMsRUFDcEMsS0FBTSxJQUFJLElBQVcsYUFBZSxFQUFPLHdEQUc1QyxNQUFPLENBQ04sTUFBTyxFQUNQLEtBQU0sRUFDTixNQUFPLEdBSVQsS0FBTSxJQUFJLElBQWEsYUFBZSxFQUFPLHFCQUc5QyxHQUFPLFFBQVUsU0FBc0IsRUFBTSxFQUFjLENBQzFELEdBQUksTUFBTyxJQUFTLFVBQVksRUFBSyxTQUFXLEVBQy9DLEtBQU0sSUFBSSxJQUFXLDZDQUV0QixHQUFJLFVBQVUsT0FBUyxHQUFLLE1BQU8sSUFBaUIsVUFDbkQsS0FBTSxJQUFJLElBQVcsNkNBR3RCLEdBQUksR0FBTSxjQUFlLEtBQVUsS0FDbEMsS0FBTSxJQUFJLElBQWEsc0ZBRXhCLEdBQUksR0FBUSxHQUFhLEdBQ3JCLEVBQW9CLEVBQU0sT0FBUyxFQUFJLEVBQU0sR0FBSyxHQUVsRCxFQUFZLEdBQWlCLElBQU0sRUFBb0IsSUFBSyxHQUM1RCxFQUFvQixFQUFVLEtBQzlCLEVBQVEsRUFBVSxNQUNsQixFQUFxQixHQUVyQixFQUFRLEVBQVUsTUFDdEIsQUFBSSxHQUNILEdBQW9CLEVBQU0sR0FDMUIsR0FBYSxFQUFPLEdBQVEsQ0FBQyxFQUFHLEdBQUksS0FHckMsT0FBUyxHQUFJLEVBQUcsRUFBUSxHQUFNLEVBQUksRUFBTSxPQUFRLEdBQUssRUFBRyxDQUN2RCxHQUFJLEdBQU8sRUFBTSxHQUNiLEVBQVEsR0FBVSxFQUFNLEVBQUcsR0FDM0IsRUFBTyxHQUFVLEVBQU0sSUFDM0IsR0FFRyxLQUFVLEtBQU8sSUFBVSxLQUFPLElBQVUsS0FDekMsSUFBUyxLQUFPLElBQVMsS0FBTyxJQUFTLE1BRTNDLElBQVUsRUFFYixLQUFNLElBQUksSUFBYSx3REFTeEIsR0FQSSxLQUFTLGVBQWlCLENBQUMsSUFDOUIsR0FBcUIsSUFHdEIsR0FBcUIsSUFBTSxFQUMzQixFQUFvQixJQUFNLEVBQW9CLElBRTFDLEdBQU8sR0FBWSxHQUN0QixFQUFRLEdBQVcsV0FDVCxHQUFTLEtBQU0sQ0FDekIsR0FBSSxDQUFFLEtBQVEsSUFBUSxDQUNyQixHQUFJLENBQUMsRUFDSixLQUFNLElBQUksSUFBVyxzQkFBd0IsRUFBTywrQ0FFckQsT0FFRCxHQUFJLElBQVUsRUFBSSxHQUFNLEVBQU0sT0FBUSxDQUNyQyxHQUFJLEdBQU8sR0FBTSxFQUFPLEdBQ3hCLEVBQVEsQ0FBQyxDQUFDLEVBU1YsQUFBSSxHQUFTLE9BQVMsSUFBUSxDQUFFLGtCQUFtQixHQUFLLEtBQ3ZELEVBQVEsRUFBSyxJQUViLEVBQVEsRUFBTSxPQUdmLEdBQVEsR0FBTyxFQUFPLEdBQ3RCLEVBQVEsRUFBTSxHQUdmLEFBQUksR0FBUyxDQUFDLEdBQ2IsSUFBVyxHQUFxQixJQUluQyxNQUFPLE1DN1ZSLHdDQUVBLEdBQUksSUFBTyxLQUNQLEdBQWUsS0FFZixHQUFTLEdBQWEsOEJBQ3RCLEdBQVEsR0FBYSw2QkFDckIsR0FBZ0IsR0FBYSxrQkFBbUIsS0FBUyxHQUFLLEtBQUssR0FBTyxJQUUxRSxHQUFRLEdBQWEsb0NBQXFDLElBQzFELEdBQWtCLEdBQWEsMEJBQTJCLElBQzFELEdBQU8sR0FBYSxjQUV4QixHQUFJLEdBQ0gsR0FBSSxDQUNILEdBQWdCLEdBQUksSUFBSyxDQUFFLE1BQU8sVUFDMUIsRUFBUCxDQUVELEdBQWtCLEtBSXBCLEdBQU8sUUFBVSxTQUFrQixFQUFrQixDQUNwRCxHQUFJLEdBQU8sR0FBYyxHQUFNLEdBQU8sV0FDdEMsR0FBSSxJQUFTLEdBQWlCLENBQzdCLEdBQUksR0FBTyxHQUFNLEVBQU0sVUFDdkIsQUFBSSxFQUFLLGNBRVIsR0FDQyxFQUNBLFNBQ0EsQ0FBRSxNQUFPLEVBQUksR0FBSyxFQUFHLEVBQWlCLE9BQVUsV0FBVSxPQUFTLE1BSXRFLE1BQU8sSUFHUixHQUFJLElBQVksVUFBcUIsQ0FDcEMsTUFBTyxJQUFjLEdBQU0sR0FBUSxZQUdwQyxBQUFJLEdBQ0gsR0FBZ0IsR0FBTyxRQUFTLFFBQVMsQ0FBRSxNQUFPLEtBRWxELEdBQU8sUUFBUSxNQUFRLEtDN0N4Qix3Q0FFQSxHQUFJLElBQWUsS0FFZixHQUFXLEtBRVgsR0FBVyxHQUFTLEdBQWEsNkJBRXJDLEdBQU8sUUFBVSxTQUE0QixFQUFNLEVBQWMsQ0FDaEUsR0FBSSxHQUFZLEdBQWEsRUFBTSxDQUFDLENBQUMsR0FDckMsTUFBSSxPQUFPLElBQWMsWUFBYyxHQUFTLEVBQU0sZUFBaUIsR0FDL0QsR0FBUyxHQUVWLEtDYlIsd0NBRUEsR0FBSSxJQUFhLEtBRWpCLEdBQU8sUUFBVSxVQUErQixDQUMvQyxNQUFPLE9BQWdCLENBQUMsQ0FBQyxPQUFPLGVDTGpDLHdDQUVBLEdBQUksSUFBWSxLQUNaLEdBQWlCLE9BQ2pCLEdBQ0EsR0FDQSxHQUNBLEdBRUosQUFBSSxJQUNILElBQU0sR0FBVSxtQ0FDaEIsR0FBUSxHQUFVLHlCQUNsQixHQUFnQixHQUVaLEdBQW1CLFVBQVksQ0FDbEMsS0FBTSxLQUVQLEdBQWlCLENBQ2hCLFNBQVUsR0FDVixRQUFTLElBR04sTUFBTyxRQUFPLGFBQWdCLFVBQ2pDLElBQWUsT0FBTyxhQUFlLEtBVGxDLE9BYUQsR0FBWSxHQUFVLDZCQUN0QixHQUFPLE9BQU8seUJBQ2QsR0FBYSxrQkFFakIsR0FBTyxRQUFVLEdBRWQsU0FBaUIsRUFBTyxDQUN6QixHQUFJLENBQUMsR0FBUyxNQUFPLElBQVUsU0FDOUIsTUFBTyxHQUdSLEdBQUksR0FBYSxHQUFLLEVBQU8sYUFDekIsRUFBMkIsR0FBYyxHQUFJLEVBQVksU0FDN0QsR0FBSSxDQUFDLEVBQ0osTUFBTyxHQUdSLEdBQUksQ0FDSCxHQUFNLEVBQU8sVUFDTCxFQUFQLENBQ0QsTUFBTyxLQUFNLEtBR2IsU0FBaUIsRUFBTyxDQUV6QixNQUFJLENBQUMsR0FBVSxNQUFPLElBQVUsVUFBWSxNQUFPLElBQVUsV0FDckQsR0FHRCxHQUFVLEtBQVcsTUN4RDlCLHdDQUVBLEdBQUksSUFBYSxLQUVqQixHQUFXLEdBQU8sUUFBVSxHQUU1QixHQUFJLElBQWMsR0FBUSxZQUFjLENBQ3RDLGFBQWMsS0FDZCxjQUFlLE9BQ2YsYUFBYyxJQUNkLGFBQWMsSUFDZCxlQUFnQixJQUNoQixPQUFRLE9BR04sR0FBVyxHQUFRLFNBQVcsQ0FDaEMsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBRUgsR0FBb0IsQ0FDdEIsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBR1AsR0FBUSxNQUFRLEdBQ2hCLFlBQWUsRUFBSyxFQUFPLEVBQVMsQ0FDbEMsRUFBVSxHQUFXLEdBQ3JCLEVBQVEsR0FBUyxHQUFRLGVBSXpCLE9BSEksR0FBUSxFQUFRLE9BQVMsRUFDekIsRUFBTSxFQUFRLEtBQU8sRUFBSSxPQUN6QixFQUFRLEVBQ0wsRUFBUSxHQUFLLENBQ2xCLEdBQUksQ0FDRixHQUFVLEVBQUksR0FBUSxTQUNmLEVBQVAsQ0FDQSxRQUFHLE1BQVEsRUFDTCxFQUVSLElBRUYsTUFBTyxHQUdULEdBQVEsV0FBYSxHQUNyQixZQUFvQixFQUFLLEVBQVcsRUFBUyxDQUMzQyxFQUFVLEdBQVcsR0FJckIsT0FISSxHQUFRLEVBQVEsT0FBUyxFQUN6QixFQUFRLEVBQ1IsRUFBUSxHQUFRLGVBQ2IsRUFBUSxFQUFJLFFBQVEsQ0FDekIsR0FBSyxHQUFRLGVBQWlCLENBQUMsRUFBTSxVQUFVLEtBQWEsR0FBUSxFQUFLLEVBQVcsR0FBUSxDQUMxRixHQUFJLEdBQU0sRUFDVixNQUFPLENBQ0wsTUFBTyxFQUNQLElBQUssRUFDTCxJQUFLLEVBQUksVUFBVSxFQUFPLElBRzlCLEdBQUksQ0FDRixHQUFVLEVBQUksR0FBUSxTQUNmLEVBQVAsQ0FDQSxRQUFHLE1BQVEsRUFDTCxFQUVSLElBRUYsR0FBSSxHQUFNLEdBQUksT0FBTSxvRUFDcEIsUUFBSSxLQUFPLHlDQUNYLEVBQUksTUFBUSxFQUNOLEVBR1IsR0FBUSxVQUFZLEdBQ3BCLFlBQW1CLEVBQVcsRUFBTyxDQUNuQyxHQUFJLEVBQVUsU0FBVyxFQUFHLENBQzFCLEdBQUksR0FBTSxHQUFJLE9BQU0sMENBQ3BCLFFBQUksS0FBTyx1QkFDWCxFQUFJLEtBQU8sdUNBQ0wsRUFFUixFQUFRLEdBQVMsR0FBUSxlQUN6QixFQUFNLEtBQU8sRUFDYixHQUFJLEdBQWEsRUFBTSxZQUNuQixFQUFXLEVBQU0sUUFBVSxFQUFNLFFBQVEsR0FBSyxHQVNsRCxPQU5JLEVBQU0sYUFDSixNQUFjLEtBQU8sR0FBYSxNQUNwQyxFQUFNLE1BQU0sTUFFZCxFQUFNLFlBQWMsSUFFZCxFQUFNLGVBQ1AsSUFBWSxhQUNmLEFBQUksSUFBYztBQUFBLEdBQ2hCLEVBQU0sTUFBTSxNQUVkLFVBQ0csSUFBWSxjQUNmLEFBQUksRUFBTSxXQUFhLEtBQU8sSUFBYyxLQUMxQyxFQUFNLE1BQU0sTUFFZCxVQUNHLElBQVksYUFDZixBQUFJLElBQWMsS0FBUSxDQUFDLEVBQU0sUUFDL0IsRUFBTSxNQUFNLE1BQ1AsQUFBSSxJQUFjLE1BQVEsQ0FBQyxFQUFNLFFBQ3RDLEVBQU0sUUFBVSxHQUVoQixFQUFNLFFBQVUsR0FFbEIsVUFDRyxJQUFZLGFBQ2YsQUFBSSxJQUFjLEtBQU8sQ0FBQyxFQUFNLFFBQzlCLEVBQU0sTUFBTSxNQUNQLEFBQUksSUFBYyxNQUFRLENBQUMsRUFBTSxRQUN0QyxFQUFNLFFBQVUsR0FFaEIsRUFBTSxRQUFVLEdBRWxCLFVBQ0csSUFBWSxlQUNmLEFBQUksSUFBYyxLQUFPLENBQUMsRUFBTSxRQUM5QixHQUFNLE1BQU0sTUFDWixFQUFNLFVBQVksSUFDYixBQUFJLElBQWMsTUFBUSxDQUFDLEVBQU0sUUFDdEMsR0FBTSxRQUFVLEdBQ2hCLEVBQU0sVUFBWSxJQUNiLEFBQUksSUFBYyxLQUFPLENBQUMsRUFBTSxRQUNyQyxFQUFNLFVBQVksR0FDYixBQUFJLElBQWMsS0FBTyxFQUFNLFVBQ3BDLEVBQU0sTUFBTSxLQUFLLEdBQVMsSUFFMUIsR0FBTSxRQUFVLEdBQ2hCLEVBQU0sVUFBWSxJQUVwQixVQUNHLElBQVksT0FDZixBQUFJLElBQWMsS0FBTyxDQUFDLEVBQU0sUUFDOUIsRUFBTSxNQUFNLE1BQ1AsQUFBSSxJQUFjLE1BQVEsQ0FBQyxFQUFNLFFBQ3RDLEVBQU0sUUFBVSxHQUVoQixFQUFNLFFBQVUsR0FFbEIsY0FFQSxHQUFJLElBQWEsSUFDZixFQUFNLE1BQU0sS0FBSyxHQUFTLFlBQ2pCLElBQWEsSUFBbUIsQ0FDekMsR0FBSSxFQUFNLFlBQWMsRUFBVyxDQUNqQyxHQUFJLEdBQU0sR0FBSSxhQUFZLHVCQUF5QixHQUNuRCxRQUFJLEtBQU8sc0NBQ0wsRUFFUixFQUFNLE1BQU0sVUFDUCxBQUFJLEtBQWEsS0FBTyxJQUFjLElBRTNDLEdBQU0sUUFBVSxFQUFNLFFBQVEsT0FBTyxHQUNyQyxFQUFNLE1BQU0sS0FBSyxHQUFZLGVBQ3hCLEFBQUksSUFBYSxLQUFPLElBQWMsSUFFM0MsR0FBTSxRQUFVLEVBQU0sUUFBUSxPQUFPLEdBQ3JDLEVBQU0sTUFBTSxLQUFLLEdBQVksZ0JBQ3hCLEFBQUksSUFBYyxLQUFPLEdBQVMsRUFBTSxTQUM3QyxHQUFNLE1BQU0sS0FBSyxHQUFZLFFBRzdCLEVBQU0sWUFBYyxJQUNmLEFBQUksSUFBYyxJQUN2QixFQUFNLE1BQU0sS0FBSyxHQUFZLGNBQ3hCLEFBQUksSUFBYyxJQUN2QixFQUFNLE1BQU0sS0FBSyxHQUFZLGNBQ3BCLElBQWMsS0FDdkIsRUFBTSxNQUFNLEtBQUssR0FBWSxnQkFFL0IsTUFFSixNQUFJLENBQUMsRUFBTSxhQUFlLENBQUMsR0FDekIsR0FBTSxRQUFVLEVBQVksRUFBTSxTQUVwQyxFQUFNLFNBQVcsRUFDVixFQUdULEdBQVEsYUFBZSxVQUFZLENBQUUsTUFBTyxJQUFJLEtBQ2hELGFBQWlCLENBQ2YsS0FBSyxNQUFRLEdBRWIsS0FBSyxZQUFjLEdBQ25CLEtBQUssUUFBVSxHQUNmLEtBQUssVUFBWSxHQUVqQixLQUFLLElBQU0sR0FDWCxLQUFLLFFBQVUsR0FDZixLQUFLLFNBQVcsR0FFbEIsR0FBTSxVQUFVLFFBQVUsVUFBWSxDQUNwQyxNQUFPLE1BQUssTUFBTSxLQUFLLE1BQU0sT0FBUyxJQUV4QyxHQUFNLFVBQVUsU0FBVyxVQUFZLENBQ3JDLE1BQ0UsTUFBSyxZQUFjLEdBQVksY0FDL0IsS0FBSyxZQUFjLEdBQVksY0FDL0IsS0FBSyxZQUFjLEdBQVksZ0JBR25DLEdBQU0sVUFBVSxVQUFZLFVBQVksQ0FDdEMsTUFBTyxNQUFLLFlBQWMsR0FBWSxjQUFnQixLQUFLLFlBQWMsR0FBWSxlQUV2RixHQUFNLFVBQVUsVUFBWSxTQUFVLEVBQU0sQ0FDMUMsTUFDRSxJQUFRLEVBQUssbUJBQ2IsS0FBSyxNQUFNLFNBQVcsR0FBSyxLQUFLLE1BQU0sS0FBTyxHQUFZLGFBSWxELEdBRUYsQ0FBQyxDQUFDLEtBQUssTUFBTSxRQUd0QixZQUFpQixFQUFLLEVBQVMsRUFBRyxDQUNoQyxNQUFJLElBQVcsR0FDTixFQUFRLEtBQUssRUFBSSxPQUFPLEdBQUssSUFFN0IsRUFBSSxPQUFPLEdBQUssRUFBRyxFQUFRLFVBQVksRUFJbEQsR0FBUSxhQUFlLEdBQ3ZCLFlBQXNCLEVBQUcsQ0FDdkIsR0FBSSxDQUFDLEVBQUcsTUFBTyxHQUNmLEdBQUksR0FBTyxFQUFFLFdBQVcsR0FFeEIsT0FBUSxPQUNELFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxTQUNBLFNBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxTQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFNBQ0EsUUFDQSxJQUNILE1BQU8sV0FFUCxNQUFPLElBSWIsR0FBUSxVQUFZLEdBQ3BCLFlBQW1CLEVBQUksQ0FDckIsTUFBUSxLQUFPLE1BQVUsSUFBTyxNQUFVLElBQU8sTUFBVSxJQUFPLE9BQVcsSUFBTyxPQUFXLElBQU8sT0FDOUYsSUFBTyxPQUFXLElBQU8sT0FBVyxJQUFPLFFBQVksSUFBTyxRQUFZLElBQU8sUUFDakYsSUFBTyxRQUFZLElBQU8sUUFBWSxJQUFPLFFBQVksSUFBTyxTQUFhLElBQU8sU0FBYSxJQUFPLFNBQ3hHLElBQU8sU0FBYSxJQUFPLFNBQWEsSUFBTyxTQUFhLElBQU8sU0FBYSxJQUFPLFNBQ3ZGLElBQU8sVUFBYyxJQUFPLFVBQWMsSUFBTyxVQUFjLElBQU8sVUFBYyxJQUFPLFVBQzNGLElBQU8sVUFBYyxJQUFPLFdBQWUsSUFBTyxXQUFlLElBQU8sV0FBZSxJQUFPLFlBQzlGLElBQU8sWUFBZ0IsSUFBTyxZQUFnQixJQUFPLFdBQWUsSUFBTyxXQUFlLElBQU8sYUFDakcsSUFBTyxjQUFrQixJQUFPLGNBQWtCLElBQU8sYUFBaUIsSUFBTyxVQUFjLElBQU8sU0FHaEgsWUFBa0IsRUFBUyxDQU16QixNQUhBLEdBQVUsRUFBUSxRQUFRLE9BQVEsSUFHOUIsRUFBUSxLQUFPLElBQVksR0FFM0IsS0FBUSxLQUFPLEtBRWYsR0FBYSxFQUFRLEtBRXJCLFNBQVMsS0FBSyxJQUFZLEdBQVUsU0FBUyxLQUFLLEdBQVMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLFNDcFM3Rix3Q0FFQSxHQUFPLFFBQVUsR0FDakIsWUFBbUIsRUFBTSxFQUFTLEVBQVMsQ0FDekMsR0FBSSxHQUFPLEVBQVEsS0FDZixFQUFTLEVBQVEsT0FDakIsRUFBVyxFQUFRLFNBQ25CLEVBQU0sRUFBUSxJQUNkLEVBQ0EsRUFBVyxFQUFRLEdBQVMsSUFBTSxFQUFTLElBQy9DLEdBQUksR0FBTyxHQUFRLEdBQUssR0FBUSxFQUFJLE1BQU07QUFBQSxHQUFNLE9BQVEsQ0FDdEQsR0FBSSxHQUFRLEVBQUksTUFBTTtBQUFBLEdBQ2xCLEVBQVEsS0FBSyxJQUFJLEVBQU8sRUFBRyxHQUMzQixFQUFNLEtBQUssSUFBSSxFQUFNLE9BQVEsRUFBTyxHQUVwQyxFQUFVLEVBQ1gsTUFBTSxFQUFPLEdBQ2IsSUFBSSxTQUFTLEVBQU0sRUFBRyxDQUNyQixHQUFJLEdBQU8sRUFBSSxFQUFRLEVBQ25CLEVBQVksSUFBUSxFQUFPLE9BQVMsUUFBVSxFQUFPLEtBQ3JELEdBQU0sRUFBVyxFQUNyQixNQUFJLEtBQVMsR0FBUSxFQUFTLEdBQzVCLEtBQU87QUFBQSxFQUNQLElBQU8sTUFBTSxFQUFTLE9BQVMsR0FBUSxLQUFLLEtBQU8sS0FFOUMsS0FFUixLQUFLO0FBQUEsR0FDUixFQUNHLElBQVksT0FBUyxJQUFNLEVBQVc7QUFBQSxFQUFPLEVBQVU7QUFBQTtBQUFBLEVBQVMsTUFFbkUsR0FBZSxJQUFZLE9BQVMsSUFBTSxFQUFXO0FBQUE7QUFBQSxFQUFTLEVBRWhFLEdBQUksR0FBTSxHQUFJLE9BQU0sR0FDcEIsU0FBSSxLQUFPLE9BQVMsRUFDcEIsRUFBSSxJQUFNLEVBQ1YsRUFBSSxLQUFPLEVBQ1gsRUFBSSxPQUFTLEVBQ2IsRUFBSSxTQUFXLEVBQ2YsRUFBSSxJQUFNLEVBQ1YsRUFBSSxPQUFTLFVBQVcsQ0FDdEIsTUFBTyxDQUNMLEtBQU0sS0FBSyxLQUNYLElBQUssS0FBSyxJQUNWLEtBQU0sS0FBSyxLQUNYLE9BQVEsS0FBSyxPQUNiLFNBQVUsS0FBSyxXQUdaLEtDakRULHdDQUVBLEdBQUksSUFBUyxLQUNULEdBQWUsS0FDZixHQUFrQixLQUNsQixHQUFRLEtBRVosR0FBTyxRQUFVLEdBQ2pCLEdBQU8sUUFBUSxNQUFRLEdBQ3ZCLFlBQWEsRUFBSyxFQUFTLENBQ3pCLEdBQUksR0FBUSxHQUFJLElBQU0sRUFBSyxHQUMzQixNQUFPLE1BQUssTUFBTSxLQUFLLFVBQVUsRUFBTSxjQVd6QyxZQUFlLEVBQUssRUFBUyxDQUUzQixHQURBLEVBQVUsR0FBVyxHQUNqQixNQUFPLElBQVEsU0FDakIsS0FBTSxJQUFJLE9BQ1IsZ0RBQWtELE1BQU8sR0FBTSxLQUduRSxHQUFJLE1BQU8sSUFBWSxTQUNyQixLQUFNLElBQUksT0FDUiwrQ0FBaUQsTUFBTyxHQUFVLEtBSXRFLEVBQU0sRUFBSSxRQUFRLFVBQVcsSUFDN0IsS0FBSyxNQUFRLEVBQUksUUFBUSxXQUFZO0FBQUEsR0FDckMsS0FBSyxjQUFnQixLQUFLLE1BQzFCLEtBQUssU0FBVyxFQUFRLFNBQ3hCLEtBQUssYUFBZSxFQUFRLGNBQWdCLEdBQzVDLEtBQUssT0FBUyxFQUFRLGNBQWdCLEVBQ3RDLEtBQUssTUFBUSxFQUFRLGdCQUFrQixFQUN2QyxLQUFLLFFBQVUsRUFBUSxTQUFXLEdBQ2xDLEtBQUssWUFBYyxDQUFDLEdBQ3BCLEtBQUssU0FBVyxLQUVoQixLQUFLLHFCQUF1QixHQUM1QixLQUFLLGFBQWUsVUFFcEIsS0FBSyxPQUFTLEdBQ2QsS0FBSyxNQUFRLEdBT2YsR0FBTSxVQUFZLENBQ2hCLFlBQWEsR0FFYixNQUFPLFNBQVMsRUFBTSxFQUFTLENBQzdCLEdBQUksR0FBTSxHQUFNLEVBQU0sRUFBUyxDQUM3QixLQUFNLEtBQUssT0FDWCxPQUFRLEtBQUssTUFDYixTQUFVLEtBQUssU0FDZixJQUFLLEtBQUssZ0JBRVosS0FBTSxJQUdSLE9BQVEsU0FBUyxFQUFPLEVBQVMsQ0FDL0IsQUFBSyxHQUFPLEtBQUssTUFBTSxnQkFBaUIsSUFHMUMsYUFBYyxTQUFTLEVBQUssQ0FDMUIsTUFBTyxJQUFhLEVBQUssQ0FDdkIsTUFBTyxNQUlYLGlCQUFrQixTQUFTLEVBQUssRUFBUyxDQUV2QyxHQUFJLENBQ0YsWUFBSyxrQkFBa0IsZUFBZ0IsR0FDaEMsU0FDQSxFQUFQLENBQ0EsR0FBSSxFQUFTLE1BQU8sR0FHcEIsR0FBSSxDQUFDLEVBQUcsSUFBSyxLQUFNLEdBRW5CLEtBQUssY0FBYyxFQUFHLElBQUksS0FBTyxHQUNqQyxLQUFLLGdCQUFnQixFQUFHLElBQUksUUFDNUIsR0FBSSxHQUNGLGlCQUFtQixFQUFHLFFBQVEsUUFBUSxzQkFBdUIsSUFDL0QsS0FBSyxNQUFNLGVBQWdCLEtBSS9CLHFCQUFzQixTQUFTLEVBQUssQ0FHbEMsR0FBSSxHQUFNLEdBQWdCLEdBQzFCLEFBQUksRUFBSSxhQUNOLEtBQUssTUFDSCxvQkFDQSxxQ0FBdUMsRUFBTSxNQWNuRCxJQUFLLFNBQVMsRUFBTSxFQUFLLENBQ3ZCLEdBQUksR0FBTSxDQUNSLEtBQU0sRUFDTixJQUFLLENBQ0gsTUFBTyxDQUNMLEtBQU0sS0FBSyxPQUNYLE9BQVEsS0FBSyxPQUVmLFNBQVUsS0FBSyxXQUluQixNQUFJLEtBQVEsUUFBVyxHQUFJLElBQU0sR0FFMUIsR0FXVCxPQUFRLFNBQVMsRUFBSyxDQUNwQixTQUFJLElBQUksSUFBTSxDQUNaLEtBQU0sS0FBSyxPQUNYLE9BQVEsS0FBSyxPQUVSLEdBVVQsY0FBZSxTQUFTLEVBQVcsQ0FDakMsS0FBSyxRQUFVLEVBQ1gsR0FBVyxNQUFLLE1BQVEsSUFVOUIsZ0JBQWlCLFNBQVMsRUFBVyxDQUNuQyxLQUFLLE9BQVMsR0FVaEIsUUFBUyxTQUFTLEVBQUssQ0FDckIsS0FBSyxNQUFRLEtBQUssTUFBTSxPQUFPLElBWWpDLEtBQU0sU0FBUyxFQUFRLEVBQU0sQ0FDM0IsR0FBSSxHQUNKLEdBQUssRUFBVyxFQUFPLEtBQUssS0FBSyxPQUFTLENBQ3hDLEdBQUksR0FBTSxFQUFTLEdBQUcsT0FDbEIsRUFBTSxFQUFTLEdBQ2YsRUFBTyxFQUFPLEdBQU0sRUFBSSxPQUFTLEdBQ2pDLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FDekIsWUFBSyxRQUFRLEdBQ2IsS0FBSyxnQkFBZ0IsR0FDZCxJQUdYLGNBQWUsU0FBUyxFQUFRLEVBQU0sQ0FDcEMsR0FBSSxHQUNKLEdBQUssRUFBVyxFQUFPLEtBQUssS0FBSyxPQUFTLENBQ3hDLEdBQUksR0FBbUIsRUFDbkIsRUFDQSxFQUNKLEFBQUssR0FBYSxpQkFBaUIsS0FBSyxFQUFTLE1BQy9DLEdBQW1CLEVBQVcsR0FBRyxPQUNqQyxLQUFLLGdCQUFnQixJQUV2QixHQUFJLEdBQVcsS0FBSyxNQUFNLE9BQU8sRUFBUyxHQUFHLFFBQzdDLEdBQUksRUFBUyxLQUFPLElBQ2xCLFlBQUssTUFBUSxFQUNiLEVBQU0sS0FBSyxJQUFJLEVBQU0sRUFBUyxJQUM5QixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxHQUNuQyxFQUVULEdBQUksZ0JBQWdCLEtBQUssR0FDdkIsWUFBSyxNQUFRLEVBQVMsT0FBTyxVQUFVLEtBQUssR0FBVSxHQUFHLFFBQ3pELEVBQU0sS0FBSyxJQUFJLEVBQU0sRUFBUyxJQUM5QixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxHQUNuQyxJQWViLGtCQUFtQixTQUFTLEVBQU0sQ0FDaEMsRUFBTyxHQUFRLEVBQ2YsR0FBSSxHQUFRLEtBQUssTUFBTSxHQUN2QixHQUNFLElBQVUsS0FBTyxJQUFVLEtBQU8sSUFBVSxJQUM1QyxpREFFRixHQUFJLEdBQU0sR0FBZ0IsU0FBUyxHQUMvQixFQUNKLEdBQUksQ0FDRixFQUFRLEdBQWdCLFdBQVcsS0FBSyxNQUFPLEVBQUssQ0FBQyxNQUFPLEVBQU8sVUFDNUQsRUFBUCxDQUNBLEdBQUksRUFBRyxRQUFVLE9BQVcsQ0FPMUIsT0FOSSxHQUFNLEVBQUcsTUFFVCxFQUFNLEtBQUssTUFBTSxPQUFPLEdBQU0sUUFBUTtBQUFBLEdBRXRDLEVBQWMsRUFBTSxFQUNwQixFQUFNLEVBQ0gsRUFBTSxHQUFlLElBQVEsSUFDbEMsS0FBSyxjQUFjLEdBQ25CLEdBQU8sRUFBYyxFQUNyQixHQUFPLEVBQWMsRUFDckIsRUFBTSxFQUFjLEtBQUssTUFBTSxPQUFPLEdBQUssUUFBUTtBQUFBLEdBR3JELEtBQUssZ0JBQWdCLEdBRXZCLEtBQUksR0FBRyxPQUFTLHlDQUNkLEtBQUssTUFDSCxpQkFDQSx5REFDRSxFQUNBLFdBRUssRUFBRyxPQUFTLHVDQUNyQixLQUFLLE1BQU0sbUJBQW9CLEVBQUcsU0FFOUIsRUFFUixNQUFPLElBR1QsZ0JBQWlCLFVBQVcsQ0FDMUIsR0FBSSxHQUFVLEVBR2QsTUFBSSxNQUFLLFNBQ1AsRUFBVyxLQUFLLFNBQVMsS0FBSyxLQUFLLE9BSW5DLEdBQUssYUFDTCxFQUFXLEVBQUcsS0FBSyxLQUFLLE9BR3BCLEdBQVksQ0FBQyxFQUFTLEdBQUcsUUFDM0IsR0FBSyxVQUNMLEVBQVcsRUFBRyxLQUFLLEtBQUssUUFJdEIsR0FBWSxFQUFTLEdBQUcsUUFBUSxNQUFLLFNBQVcsSUFHL0MsR0FPVCxJQUFLLFVBQVcsQ0FDZCxHQUFJLE1BQUssTUFBTSxPQUNmLENBQUksS0FBSyxjQUNQLEtBQUssTUFDSCxpQkFDQSxzRUFHSixPQUFTLEdBQUksRUFBRyxLQUFLLFlBQVksR0FBSSxJQUNuQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLGFBRXhDLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLElBQUksU0FDdEMsS0FBSyxNQUFRLEdBQ04sS0FPVCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUNKLEdBQUssRUFBVyxjQUFjLEtBQUssS0FBSyxPQUN0QyxZQUFLLFFBQVEsRUFBUyxHQUFHLE9BQVMsR0FDbEMsS0FBSyxjQUFjLEdBQ1osSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUNKLEdBQUssRUFBVyxvQkFBb0IsS0FBSyxLQUFLLE9BQVMsQ0FDckQsS0FBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLFVBQVcsRUFBUyxJQUN2QyxTQUFJLE9BQVMsQUFBTyxFQUFTLElBQWhCLElBQ2IsS0FBSyxxQkFBdUIsRUFBSSxPQUNoQyxLQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEdBQ1osS0FBSyxrQkFBa0IsZ0JBQ2hCLEtBUVgsY0FBZSxVQUFXLENBQ3hCLEdBQUksT0FBTyxLQUFLLEtBQUssT0FBUSxDQUMzQixHQUFJLEdBQVEsS0FBSyxrQkFBa0IsR0FDbkMsS0FBSyxRQUFRLEVBQU0sSUFBTSxHQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLGdCQUFpQixFQUFNLEtBQzFDLEtBQUssT0FBTyxLQUFLLEdBQ2pCLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssaUJBQWlCLEVBQU0sS0FFNUIsR0FBSSxHQUFXLEVBQU0sSUFBSSxNQUFNO0FBQUEsR0FDM0IsRUFBUSxFQUFTLE9BQVMsRUFDOUIsWUFBSyxjQUFjLEdBQ25CLEtBQUssZ0JBQWdCLEVBQVMsR0FBTyxPQUFTLEdBQzlDLEtBQUssT0FBTyxHQUNMLEtBUVgsSUFBSyxVQUFXLENBQ2QsR0FBSSxHQUVKLEdBQUssRUFBVyxzQkFBc0IsS0FBSyxLQUFLLE9BQVMsQ0FDdkQsR0FBSSxHQUNGLEVBQU8sRUFBUyxHQUNoQixFQUFNLEVBQVMsR0FBRyxPQUNwQixZQUFLLFFBQVEsR0FDYixFQUFNLEtBQUssSUFBSSxNQUFPLEdBQ3RCLEtBQUssT0FBTyxLQUFLLEdBQ2pCLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxHQUNMLEtBUVgsT0FBUSxTQUFTLEVBQU0sQ0FDckIsR0FBSSxHQUFNLEtBQUssS0FBSyxjQUFlLFVBQy9CLEVBQVksR0FBUSxFQUFLLFVBQzdCLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEdBQ1osS0FBSyxrQkFBa0IsU0FDbEIsR0FDSCxNQUFLLHFCQUF1QixHQUM1QixLQUFLLGtCQUFrQixpQkFFbEIsSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFPLEtBQUssY0FBYyxxQkFBc0IsV0FDcEQsR0FBSSxFQUNGLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixJQVFYLEdBQUksVUFBVyxDQUNiLEdBQUksR0FBTSxLQUFLLEtBQUssYUFBYyxNQUNsQyxHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssR0FDakIsS0FBSyxnQkFBZ0IsRUFBSSxJQUFJLFFBQzdCLEtBQUssT0FBTyxHQUNMLEdBRVQsQUFBSSxLQUFLLEtBQUssS0FBSyxRQUNqQixLQUFLLE1BQ0gsYUFDQSxJQUNFLG1CQUFtQixLQUFLLEtBQUssTUFBTSxPQUFPLElBQUksR0FDOUMseUJBU1IsVUFBVyxVQUFXLENBQ3BCLEdBQUksR0FBTSxLQUFLLEtBQUssdUNBQXdDLFNBQzVELEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEdBQ0wsR0FFVCxBQUFJLG1CQUFtQixLQUFLLEtBQUssUUFDL0IsS0FBSyxNQUNILHFCQUNBLCtEQUdBLE1BQU0sS0FBSyxLQUFLLFFBQ2xCLEtBQUssTUFDSCxxQkFDQSxJQUNFLG1CQUFtQixLQUFLLEtBQUssTUFBTSxPQUFPLElBQUksR0FDOUMsbUlBUVIsaUJBQWtCLFVBQVcsQ0FDM0IsR0FBSSxLQUFLLGNBQWdCLEtBQUssTUFBTSxLQUFPLElBQ3pDLFlBQUssTUFBUSxLQUFLLE1BQU0sT0FBTyxHQUMvQixLQUFLLE1BQVEsR0FDTixJQUdYLFFBQVMsU0FBUyxFQUFNLEVBQU8sRUFBUSxFQUFTLENBQzlDLEdBQUksR0FDSixHQUFJLEVBQVEsSUFBVyxHQUN2QixHQUFTLEdBQVUsR0FDbkIsRUFBVSxHQUFXLEVBQ3JCLEdBQUksR0FBYSxLQUFLLGFBQWUsRUFBTSxRQUFRLEtBQU8sR0FDdEQsRUFBZSxLQUFLLHFCQUF1QixFQUFNLFFBQVEsTUFBUSxHQUNqRSxFQUFpQixLQUFLLHFCQUF1QixFQUFNLFFBQVEsUUFBVSxHQUNyRSxFQUFzQiwyQkFBMkIsS0FBSyxHQUN0RCxFQUNGLEtBQUssc0JBQXdCLEVBQ3pCLEVBQW9CLE1BQ3BCLElBTU4sR0FKSSxJQUFlLElBQUksR0FBYSxLQUNoQyxJQUFpQixJQUFJLEdBQWUsS0FDcEMsSUFBbUIsSUFBSSxHQUFpQixLQUcxQyxJQUFtQixLQUNuQixFQUFpQixHQUNqQixFQUFpQixHQUNqQixFQUFpQixFQUVqQixTQUFTLEVBQVMsRUFBTSxVQUFVLEVBQUcsR0FBa0IsS0FDaEQsS0FBSyxRQUNWLEVBQ0EsRUFBTSxVQUFVLEVBQWlCLEdBQ2pDLEVBQ0EsRUFBVSxHQUdkLEdBQ0UsSUFBaUIsS0FDakIsRUFBZSxHQUNmLEVBQWUsR0FDZixFQUFlLEVBQ2YsQ0FDQSxFQUFNLEtBQUssSUFBSSxFQUFNLEVBQVMsRUFBTSxVQUFVLEVBQUcsSUFDakQsS0FBSyxnQkFBZ0IsRUFBTyxPQUFTLEVBQWUsR0FDcEQsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEVBQU0sS0FBSyxJQUFJLDJCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixHQUFJLEdBQVEsR0FBSSxNQUFLLFlBQVksRUFBTSxPQUFPLEVBQWUsR0FBSSxDQUMvRCxTQUFVLEtBQUssU0FDZixhQUFjLEdBQ2QsYUFBYyxLQUFLLE9BQ25CLGVBQWdCLEtBQUssTUFDckIsUUFBUyxLQUFLLFVBRVosRUFDSixHQUFJLENBQ0YsRUFBZSxFQUFNLGtCQUNkLEVBQVAsQ0FDQSxLQUFJLEdBQUcsTUFBUSxRQUFRLEtBQUssRUFBRyxPQUM3QixNQUFLLE1BQVEsRUFBRyxPQUNoQixLQUFLLE1BQU0sRUFBRyxLQUFLLE9BQU8sR0FBSSxFQUFHLE1BRTdCLEVBRVIsS0FBSyxNQUFRLEVBQU0sTUFDbkIsS0FBSyxPQUFTLEtBQUssT0FBTyxPQUFPLEdBQ2pDLEVBQU0sS0FBSyxJQUFJLHlCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBTSxFQUFNLE9BQ3pCLE9BRUYsR0FDRSxJQUFlLEtBQ2YsRUFBYSxHQUNiLEVBQWEsR0FDYixFQUFhLEVBQ2IsQ0FDQSxBQUFJLEVBQVMsRUFBTSxVQUFVLEVBQUcsSUFDOUIsS0FBSyxRQUFRLEVBQU0sRUFBTSxVQUFVLEVBQUcsR0FBYSxHQUVyRCxLQUFLLE1BQVEsR0FDYixLQUFLLE1BQVEsRUFBTSxPQUFPLEVBQU0sUUFBUSxLQUFPLEdBQUssS0FBSyxNQUN6RCxPQUVGLEdBQUksSUFBd0IsSUFBVSxDQUNwQyxHQUFJLEVBQW9CLEdBQ3RCLFNBQ0UsRUFDQSxFQUFNLFVBQVUsRUFBRyxHQUNuQixFQUFvQixHQUNwQixJQUNLLEtBQUssUUFDVixFQUNBLEVBQU0sVUFBVSxFQUFzQixHQUN0QyxFQUNBLEVBQVUsR0FHZCxHQUFJLEdBQVMsRUFBTSxPQUFPLEVBQUcsR0FDN0IsQUFBSSxJQUFVLElBQ1osR0FBUyxFQUFTLEVBQ2xCLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FDckIsS0FBSyxnQkFBZ0IsRUFBTyxPQUFTLEdBQ3JDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUcvQixHQUFJLEdBQU8sRUFBb0IsR0FDM0IsRUFDSixFQUFNLEtBQUssSUFBSSxxQkFDZixLQUFLLGdCQUFnQixHQUNyQixHQUFJLENBQ0YsRUFBUSxHQUFnQixXQUFXLEVBQU0sV0FDbEMsRUFBUCxDQUlBLEdBSEksRUFBRyxRQUFVLFFBQ2YsS0FBSyxnQkFBZ0IsRUFBRyxPQUV0QixFQUFHLE9BQVMseUNBQ2QsS0FBSyxNQUNILGlCQUNBLDhFQUVPLEVBQUcsT0FBUyxzQ0FDckIsS0FBSyxNQUFNLG1CQUFvQixFQUFHLGFBRWxDLE1BQU0sR0FHVixFQUFJLFdBQWEsRUFBb0IsS0FBTyxJQUM1QyxFQUFJLE9BQVMsR0FDYixFQUFJLElBQU0sRUFBTSxJQUNoQixLQUFLLGlCQUFpQixFQUFNLEtBRTVCLEFBQUksRUFBTSxJQUFNLEVBQUksRUFBSyxPQUN2QixHQUFPLEVBQUssT0FBTyxFQUFNLElBQU0sR0FDL0IsS0FBSyxnQkFBZ0IsRUFBTSxJQUFNLEdBQ2pDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBTSxJQUVuQixNQUFLLGdCQUFnQixFQUFLLFFBQzFCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUUvQixPQUdGLEVBQVEsRUFBUyxFQUNqQixFQUFNLEtBQUssSUFBSSxFQUFNLEdBQ3JCLEtBQUssZ0JBQWdCLEVBQU0sT0FBUyxHQUNwQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFHL0IsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUNGLEtBQUssS0FBSyxzQkFBdUIsU0FDakMsS0FBSyxLQUFLLE9BQVEsU0FDbEIsS0FBSyxLQUFLLFVBQVcsUUFDdkIsR0FBSSxFQUNGLFlBQUssUUFBUSxPQUFRLEVBQUksS0FDbEIsSUFJWCxTQUFVLFVBQVcsQ0FDbkIsR0FBSSxHQUFNLEtBQUssS0FBSyxhQUFjLGFBQ2xDLEdBQUksRUFDRixZQUFLLFFBQVEsWUFBYSxFQUFJLEtBQ3ZCLElBUVgsSUFBSyxVQUFXLENBQ2QsR0FBSSxHQUNKLEdBQUssRUFBTSxLQUFLLGNBQWMsTUFBTyxPQUNuQyxZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxrQkFBa0IsZ0JBQ2hCLElBUVgsUUFBUyxVQUFXLENBQ2xCLEdBQUksR0FBTSxLQUFLLEtBQUssc0JBQXVCLFdBQzNDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDeEIsS0FBSyxrQkFBa0IsU0FDMUIsS0FBSyxNQUFNLGtCQUFtQiw0QkFFekIsR0FFVCxBQUFJLEtBQUssS0FBSyxnQkFDWixLQUFLLE1BQU0sb0JBQXFCLHNCQVFwQyxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUNKLEdBQUssRUFBVyxpQ0FBaUMsS0FBSyxLQUFLLE9BQVMsQ0FDbEUsR0FBSSxHQUFPLEVBQVMsR0FBRyxPQUNuQixFQUFVLEdBVWQsR0FUSSxFQUFLLFFBQVEsUUFBVSxJQUN6QixHQUNFLEtBQ0EsRUFDRyxNQUFNLE1BQ04sTUFBTSxHQUNOLEtBQUssTUFDVixFQUFPLEVBQUssTUFBTSxNQUFNLEdBQUcsUUFFekIsQ0FBQyxFQUFNLE9BR1gsT0FGSSxHQUFNLEtBQUssSUFBSSxRQUFTLEdBQ3hCLEVBQU0sRUFBUyxHQUFHLE9BQVMsRUFBUSxPQUNoQyxLQUFLLGFBQWEsS0FBSyxLQUFLLE1BQU0sT0FBTyxFQUFNLEtBQUssSUFDM0QsWUFBSyxnQkFBZ0IsR0FDckIsRUFBSSxLQUFPLFVBQ1gsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEtBQUssUUFBUSxFQUFTLEdBQUcsT0FBUyxFQUFRLFFBQzFDLEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQVEsT0FBUyxHQUNwRCxLQVFYLE9BQVEsVUFBVyxDQUNqQixHQUFJLEdBQ0osR0FBSyxFQUFXLGdDQUFnQyxLQUFLLEtBQUssT0FBUyxDQUNqRSxHQUFJLEdBQU8sRUFBUyxHQUFHLE9BQ25CLEVBQVUsR0FVZCxHQVRJLEVBQUssUUFBUSxRQUFVLElBQ3pCLEdBQ0UsS0FDQSxFQUNHLE1BQU0sTUFDTixNQUFNLEdBQ04sS0FBSyxNQUNWLEVBQU8sRUFBSyxNQUFNLE1BQU0sR0FBRyxRQUV6QixDQUFDLEVBQU0sT0FHWCxPQUZJLEdBQU0sS0FBSyxJQUFJLFFBQVMsR0FDeEIsRUFBTSxFQUFTLEdBQUcsT0FBUyxFQUFRLE9BQ2hDLEtBQUssYUFBYSxLQUFLLEtBQUssTUFBTSxPQUFPLEVBQU0sS0FBSyxJQUMzRCxZQUFLLGdCQUFnQixHQUNyQixFQUFJLEtBQU8sU0FDWCxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxRQUFRLEVBQVMsR0FBRyxPQUFTLEVBQVEsUUFDMUMsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLE9BQVMsRUFBUSxPQUFTLEdBQ3BELEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FDSixHQUFLLEVBQVcsbUJBQW1CLEtBQUssS0FBSyxPQUFTLENBQ3BELEdBQUksR0FBTyxFQUFTLEdBQUcsT0FDbkIsRUFBVSxHQVVkLEdBVEksRUFBSyxRQUFRLFFBQVUsSUFDekIsR0FDRSxLQUNBLEVBQ0csTUFBTSxNQUNOLE1BQU0sR0FDTixLQUFLLE1BQ1YsRUFBTyxFQUFLLE1BQU0sTUFBTSxHQUFHLFFBRXpCLENBQUMsRUFBTSxPQUdYLE9BRkksR0FBTSxLQUFLLElBQUksUUFBUyxHQUN4QixFQUFNLEVBQVMsR0FBRyxPQUFTLEVBQVEsT0FDaEMsS0FBSyxhQUFhLEtBQUssS0FBSyxNQUFNLE9BQU8sRUFBTSxLQUFLLElBQzNELFlBQUssZ0JBQWdCLEdBQ3JCLEVBQUksS0FBTyxVQUNYLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBUyxHQUFHLE9BQVMsRUFBUSxRQUMxQyxLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFRLE9BQVMsR0FDcEQsS0FRWCxXQUFZLFVBQVcsQ0FDckIsR0FBSSxHQUNKLEdBQUssRUFBTSxLQUFLLGNBQWMsU0FBVSxlQUN0QyxZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsSUFRWCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUFNLEtBQUssY0FBYyxTQUFVLFNBQ3ZDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFNLEtBQUssS0FBSyx1QkFBd0IsV0FDNUMsR0FBSSxFQUFLLENBRVAsSUFEQSxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsS0FBSyxrQkFBa0IsU0FBVSxDQUFDLFVBQVcsTUFBTyxDQUMzRCxNQUFLLE1BQUssa0JBQWtCLFNBQzFCLENBQUksV0FBVyxLQUFLLEtBQUssT0FFdkIsS0FBSyxPQUdMLEtBQUssTUFBTSxrQkFBbUIsNkJBRzNCLEdBRVQsQUFBSSxLQUFLLEtBQUssZUFDWixLQUFLLE1BQU0sb0JBQXFCLHNCQVFwQyxLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQU0sS0FBSyxjQUFjLGFBQWMsUUFDM0MsR0FBSSxHQUFRLEdBQUksSUFBTSxFQUFJLElBQUksUUFDNUIsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBUVgsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUFNLEtBQUssY0FBYyxrQkFBbUIsUUFDaEQsR0FBSSxFQUNGLFlBQUssZ0JBQWdCLENBQUMsRUFBSSxJQUFJLFFBQzlCLEtBQUssaUJBQWlCLEVBQUksS0FDMUIsS0FBSyxnQkFBZ0IsRUFBSSxJQUFJLFFBQzdCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixHQUVULEFBQUksS0FBSyxLQUFLLFlBQ1osS0FBSyxNQUFNLHFCQUFzQixnQ0FRckMsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUFNLEtBQUssY0FBYyxtQkFBb0IsUUFDakQsR0FBSSxFQUFLLENBRVAsT0FESSxHQUFTLEdBQWdCLEVBQUksS0FDMUIsRUFBTyxhQUFlLEVBQU8sWUFBWSxDQUM5QyxHQUFJLEdBQU8sYUFBYSxLQUFLLEtBQUssT0FDbEMsR0FBSSxDQUFDLEVBQU0sTUFFWCxFQUFJLEtBQU8sRUFBSyxHQUNoQixLQUFLLFFBQVEsRUFBSyxHQUFHLFFBQ3JCLEtBQUssZ0JBQWdCLEVBQUssR0FBRyxRQUM3QixFQUFTLEdBQWdCLEVBQUksS0FHL0IsWUFBSyxnQkFBZ0IsQ0FBQyxFQUFJLElBQUksUUFDOUIsS0FBSyxpQkFBaUIsRUFBSSxLQUMxQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEdBRVQsQUFBSSxLQUFLLEtBQUssWUFDWixLQUFLLE1BQU0scUJBQXNCLGdDQVFyQyxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFNLEtBQUssY0FBYyxXQUFZLFdBQ3pDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsR0FFVCxBQUFJLEtBQUssS0FBSyxlQUNaLEtBQUssTUFDSCwwQkFDQSwwQ0FTTixLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQUssRUFBVSxFQUNuQixHQUFLLEVBQVcsMkJBQTJCLEtBQUssS0FBSyxPQUFTLENBRTVELEdBQUksRUFBUyxHQUVYLEVBQVksRUFBUyxHQUFHLE9BQ3hCLEtBQUssUUFBUSxHQUNiLEVBQU0sS0FBSyxJQUFJLE9BQVEsRUFBUyxRQUMzQixDQUVMLEdBQUksR0FBUSxLQUFLLGtCQUFrQixFQUFJLEVBQVMsR0FBRyxRQUNuRCxFQUFZLEVBQU0sSUFBTSxFQUN4QixLQUFLLFFBQVEsR0FDYixLQUFLLGlCQUFpQixFQUFNLEtBQzVCLEVBQU0sS0FBSyxJQUFJLE9BQVEsS0FBTyxFQUFNLElBQU0sS0FPNUMsR0FKQSxLQUFLLGdCQUFnQixHQUVyQixFQUFJLEtBQU8sS0FFTixFQUFXLFFBQVEsS0FBSyxLQUFLLE9BQVMsQ0FDekMsR0FBSSxHQUFRLEtBQUssa0JBQWtCLEVBQVMsR0FBRyxPQUFTLEdBQ3hELEdBQUksQ0FBQyxnQkFBZ0IsS0FBSyxFQUFNLEtBQU0sQ0FFcEMsS0FBSyxnQkFBZ0IsR0FDckIsS0FBSyxRQUFRLEVBQU0sSUFBTSxHQUN6QixFQUFJLEtBQU8sRUFBTSxJQUNqQixLQUFLLGlCQUFpQixJQUFNLEVBQUksS0FBTyxLQUN2QyxPQUFTLEdBQUksRUFBRyxHQUFLLEVBQUksS0FBSyxPQUFRLElBQ3BDLEFBQUksRUFBSSxLQUFLLEtBQU87QUFBQSxFQUNsQixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsSUFLN0IsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FDSixHQUFLLEVBQVcsb0NBQW9DLEtBQUssS0FBSyxPQUFTLENBQ3JFLEtBQUssUUFBUSxFQUFTLEdBQUcsUUFDekIsR0FBSSxHQUFNLEtBQUssSUFBSSxRQUFTLEVBQVMsSUFDckMsU0FBSSxLQUFPLEVBQVMsSUFBTSxLQUMxQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsWUFBYSxVQUFXLENBQ3RCLEdBQUksR0FDSixHQUFLLEVBQVcsc0NBQXNDLEtBQUssS0FBSyxPQUFTLENBQ3ZFLEtBQUssUUFBUSxFQUFTLEdBQUcsUUFDekIsR0FBSSxHQUFPLEVBQVMsR0FBRyxRQUFRLEtBQU0sS0FDakMsRUFBSyxFQUFTLElBQU0sRUFBUyxHQUFHLE9BRWhDLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FHekIsT0FGQSxLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFHLFFBRXJDLE9BQ0QsU0FDQSxVQUNILEtBQUssaUJBQWlCLEdBQ3RCLFVBQ0csU0FDSCxLQUFLLGlCQUFpQixHQUN0QixFQUFJLElBQU0sS0FBTyxFQUFLLElBQ3RCLEVBQUksS0FBTyxLQUNYLFVBQ0csT0FDSCxBQUFJLEdBQ0YsS0FBSyxNQUNILGlCQUNBLCtEQUdKLE1BRUosWUFBSyxnQkFBZ0IsRUFBRyxRQUN4QixLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsS0FRWCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUFVLEVBQ2QsR0FBSyxFQUFXLG1CQUFtQixLQUFLLEtBQUssT0FDM0MsWUFBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixLQUFLLGlCQUFpQixFQUFTLElBQy9CLEVBQU0sS0FBSyxJQUFJLFFBQVMsRUFBUyxJQUNqQyxLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEdBRVQsQUFBSSxLQUFLLEtBQUssYUFDWixLQUFLLE1BQU0sc0JBQXVCLGlDQVF0QyxLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQ0osR0FDRyxFQUFXLCtFQUErRSxLQUN6RixLQUFLLE9BRVAsQ0FDQSxLQUFLLFFBQVEsRUFBUyxHQUFHLFFBQ3pCLEdBQUksR0FBTSxLQUFLLElBQUksT0FBUSxFQUFTLElBQ3BDLFNBQUksSUFBTSxFQUFTLElBQU0sS0FDekIsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLE9BQVMsRUFBUyxHQUFHLFFBQ3RELEtBQUssaUJBQWlCLEVBQVMsSUFDL0IsRUFBSSxLQUFPLEVBQVMsR0FDcEIsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLFFBQ2pDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixHQUVULEdBQU0sR0FBTyxVQUFVLEtBQUssS0FBSyxPQUFTLE9BQVMsTUFDbkQsQUFBSSxLQUFLLEtBQUssb0JBQ1osS0FBSyxNQUNILGlCQUNBLFNBQ0UsRUFDQSwwQkFDQSxFQUNBLHdDQUNBLEVBQ0Esb0NBSUgsR0FBVyxpRkFBaUYsS0FDM0YsS0FBSyxTQUdQLEtBQUssTUFDSCxpQkFDQSx1SEFTTixPQUFRLFVBQVcsQ0FDakIsR0FBSSxHQUNKLEdBQUssRUFBVyxtQ0FBbUMsS0FBSyxLQUFLLE9BQVMsQ0FDcEUsS0FBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLFNBQVUsRUFBUyxJQUN0QyxTQUFJLE1BQVEsRUFBUyxHQUNyQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFTLEdBQUcsUUFDdEQsS0FBSyxpQkFBaUIsRUFBUyxJQUMvQixFQUFJLEtBQU8sRUFBUyxHQUNwQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBSXpCLHFCQUFxQixLQUFLLEVBQUksTUFBTSxTQUNwQyxtREFBbUQsS0FDakQsRUFBSSxNQUFNLFNBSWQsS0FBSyxNQUNILHlCQUNBLGtKQUlHLEdBRVQsQUFDRyxHQUFXLGlGQUFpRixLQUMzRixLQUFLLFNBR1AsS0FBSyxNQUNILGlCQUNBLGlIQVNOLEtBQU0sVUFBVyxDQUNmLEdBQUksR0FDSixHQUFLLEVBQVcseUJBQXlCLEtBQUssS0FBSyxPQUFTLENBQzFELEdBQUksR0FBUSxFQUFTLEdBQ2pCLEVBQU8sRUFBUyxHQUNoQixFQUFZLEVBQ2hCLEdBQUksS0FBSyxhQUFjLENBQ3JCLEdBQUksR0FDSixHQUFJLENBQ0YsRUFBUyxHQUFnQixXQUFXLEVBQU0sV0FDbkMsRUFBUCxDQUlBLEdBSEksRUFBSSxRQUFVLFFBQ2hCLEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQUssT0FBUyxFQUFJLE9BRTFELEVBQUksT0FBUyx5Q0FDZixLQUFLLE1BQ0gsaUJBQ0EsOEVBRU8sRUFBSSxPQUFTLHNDQUN0QixLQUFLLE1BQU0sbUJBQW9CLEVBQUksYUFFbkMsTUFBTSxHQUdWLEVBQVksRUFBSyxPQUFTLEVBQU8sSUFDakMsRUFBTyxFQUFPLElBRWhCLEdBQUksR0FBVyxFQUFTLEdBQUcsT0FBUyxFQUNwQyxLQUFLLFFBQVEsR0FDYixHQUFJLEdBQU0sS0FBSyxJQUFJLE9BQVEsR0FDM0IsU0FBSSxXQUFhLEVBQU0sT0FBTyxLQUFPLElBQ3JDLEVBQUksT0FBUyxFQUFNLE9BQU8sS0FBTyxLQUFPLEVBQU0sT0FBTyxLQUFPLElBZTVELEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQVMsR0FBRyxRQUNsRCxFQUFJLFFBQVEsS0FBSyxpQkFBaUIsR0FDdEMsS0FBSyxPQUFPLEtBQUssR0FhakIsS0FBSyxnQkFBZ0IsRUFBSyxRQUMxQixLQUFLLE9BQU8sR0FDTCxLQU9YLFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQ0osR0FBSyxFQUFNLEtBQUssY0FBYyxLQUFNLGFBQ2xDLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLHFCQUF1QixHQUM1QixLQUFLLGtCQUFrQixnQkFDaEIsSUFPWCxVQUFXLFNBQVMsRUFBSyxDQUN2QixHQUFJLEdBQVEsR0FDUixFQUFVLE9BQ1YsRUFBTSxHQUNOLEVBR0osSUFBSyxFQUFJLEVBQUcsRUFBSSxFQUFJLFFBQ2IsS0FBSyxhQUFhLEtBQUssRUFBSSxJQUROLElBRTFCLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsR0FBSSxJQUFNLEVBQUksT0FDWixNQUFPLEdBR1QsR0FBSSxHQUFNLEtBQUssSUFBSSxhQVVuQixJQVBJLEVBQVEsS0FBSyxFQUFJLEtBQ25CLEdBQVEsRUFBSSxHQUNaLEtBQUssZ0JBQWdCLEdBQ3JCLEtBSUssRUFBSSxFQUFJLE9BQVEsSUFBSyxDQUMxQixHQUFJLEdBQ0YsR0FBSSxFQUFJLEtBQU8sRUFBTyxDQUNwQixLQUFLLGdCQUFnQixHQUNyQixJQUNBLGVBSUEsS0FBSyxhQUFhLEtBQUssRUFBSSxLQUMzQixFQUFJLEtBQU8sS0FDWCxFQUFJLEtBQU8sS0FDWCxFQUFJLEtBQU8sSUFFWCxNQUlKLEdBQU8sRUFBSSxHQUVYLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsRUFBSSxLQUFPLEVBRVgsR0FBSSxHQUFnQixLQUFLLGVBQWUsRUFBSSxPQUFPLElBZW5ELElBYkEsQUFBSSxFQUFjLElBQ2hCLEdBQUksSUFBTSxFQUFjLElBQ3hCLEVBQUksV0FBYSxFQUFjLFlBRy9CLEdBQUksSUFBTSxHQUNWLEVBQUksV0FBYSxJQUduQixFQUFNLEVBQWMsZ0JBRXBCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUV4QixFQUFJLEVBQUcsRUFBSSxFQUFJLFFBQ2IsS0FBSyxhQUFhLEtBQUssRUFBSSxJQUROLElBSTFCLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsTUFBSSxHQUFJLEtBQU8sS0FDYixNQUFLLGdCQUFnQixHQUNyQixLQUdLLEVBQUksT0FBTyxJQU1wQixlQUFnQixTQUFTLEVBQUssQ0FDNUIsR0FBSSxHQUFVLE9BQ1YsRUFBTSxHQUNOLEVBQU0sRUFBRyxFQUNULEVBQWEsR0FDYixFQUFRLEdBQWdCLGVBQ3hCLEVBQU0sS0FBSyxNQUNYLEVBQU8sS0FBSyxPQUdoQixJQUFLLEVBQUksRUFBRyxFQUFJLEVBQUksUUFDYixLQUFLLGFBQWEsS0FBSyxFQUFJLElBRE4sSUFFMUIsQUFBSSxFQUFJLEtBQU87QUFBQSxFQUNiLEtBQ0EsRUFBTSxHQUVOLElBSUosR0FBSSxJQUFNLEVBQUksT0FDWixNQUFPLENBQUMsZ0JBQWlCLEdBYzNCLEdBWEksRUFBSSxLQUFPLEtBQ2IsR0FBYSxHQUNiLElBQ0EsSUFDSSxFQUFJLEtBQU8sS0FDYixLQUFLLE1BQ0gsd0JBQ0Esd0JBQTBCLEVBQUksR0FBSyxrQkFJckMsRUFBSSxLQUFPLElBRWIsR0FBSSxJQUFNLEdBQUssR0FBTyxDQUFDLEtBQUssYUFBYSxLQUFLLEVBQUksS0FBTyxFQUFJLEtBQU8sSUFDbEUsS0FBSyxNQUNILHdCQUNBLHdCQUEwQixFQUFJLEdBQUsscUJBR3JDLE9BQU8sQ0FBQyxnQkFBaUIsR0FTN0IsSUFMQSxLQUFLLE9BQVMsRUFDZCxLQUFLLE1BQVEsRUFBTSxFQUNuQixJQUdPLEVBQUksRUFBSSxRQUNSLEtBQUssYUFBYSxLQUFLLEVBQUksSUFEWCxJQUVyQixBQUFJLEVBQUksS0FBTztBQUFBLEVBQ2IsS0FBSyxjQUFjLEdBRW5CLEtBQUssZ0JBQWdCLEdBUXpCLElBSkEsRUFBTyxLQUFLLE9BQ1osRUFBTSxLQUFLLE1BR0osRUFBSSxFQUFJLE9BQVEsSUFBSyxDQUUxQixHQUFJLENBQUUsR0FBTSxhQUFlLEVBQU0sWUFBYSxDQUM1QyxHQUFJLEtBQUssYUFBYSxLQUFLLEVBQUksSUFBSyxDQUlsQyxJQUhBLEVBQU8sR0FHRixFQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsSUFDMUIsR0FBSSxDQUFDLEtBQUssYUFBYSxLQUFLLEVBQUksSUFBSyxDQUduQyxHQUFNLEdBQWtCLENBQUMsR0FBZ0IsYUFBYSxFQUFJLElBQ3BELEVBQVUsRUFBUSxLQUFLLEVBQUksSUFDM0IsRUFBVSxFQUFJLEtBQU8sSUFDckIsRUFDSixFQUFJLEdBQUssRUFBSSxFQUFJLEdBQUssRUFBSSxFQUFJLEtBQU8sTUFDdkMsQUFDRyxJQUFtQixHQUFXLEdBQVcsSUFDMUMsS0FBSyxpQkFBaUIsRUFBSyxLQUUzQixHQUFPLElBRVQsTUFNSixHQUFJLEdBQVEsSUFBTSxFQUFJLE9BQ3BCLE1BTUosR0FBSSxFQUFJLEtBQU8sS0FBTyxLQUFLLGlCQUFpQixFQUFLLElBQy9DLE1BSUosRUFBUSxHQUFnQixVQUFVLEVBQUksR0FBSSxHQUMxQyxHQUFPLEVBQUksR0FFWCxBQUFJLEVBQUksS0FBTztBQUFBLEVBQ2IsS0FDQSxFQUFNLEdBRU4sSUFJSixZQUFLLGlCQUFpQixHQUV0QixLQUFLLE9BQVMsRUFDZCxLQUFLLE1BQVEsRUFFTixDQUFDLElBQUssRUFBSyxXQUFZLEVBQVksZ0JBQWlCLEVBQUksT0FBTyxLQU94RSxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUVKLEdBQUksQUFBTyxLQUFLLE1BQU0sT0FBTyxJQUF6QixJQUE2QixDQUMvQixFQUFNLEtBQUssSUFBSSxvQkFDZixHQUFJLEdBQVEsS0FBSyxvQkFBb0IsSUFDakMsRUFBTSxLQUFLLE1BQU0sT0FBTyxFQUFHLEVBQVEsR0FPdkMsSUFMQSxLQUFLLGdCQUFnQixHQUNyQixLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxxQkFBcUIsR0FDMUIsS0FBSyxRQUFRLEVBQVEsR0FFZCxHQUNMLEVBQU0sS0FBSyxVQUFVLEdBR3ZCLFNBQU0sS0FBSyxJQUFJLGtCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixLQU9YLGdCQUFpQixVQUFXLENBQzFCLEdBQUksaUJBQWlCLEtBQUssS0FBSyxPQUFRLENBQ3JDLEdBQUksR0FBVyxHQUNmLEtBQUssUUFBUSxHQUNiLEdBQUksR0FBTSxLQUFLLElBQUksZUFDbkIsS0FBSyxnQkFBZ0IsR0FDckIsR0FBSSxHQUFPLEtBQUssb0JBQ2hCLFNBQVcsRUFBSyxJQUFNLEVBQ3RCLEtBQUssUUFBUSxHQUNiLEVBQUksSUFBTSxFQUFLLElBQ2YsS0FBSyxnQkFBZ0IsR0FDckIsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsT0FBUSxVQUFXLENBQ2pCLEdBQUksR0FBVyxLQUFLLGtCQUNoQixFQUVKLEdBQUksRUFBVSxDQUNaLEdBQUksR0FBVSxFQUFTLEdBQUcsT0FhMUIsR0FYQSxLQUFLLGNBQWMsR0FDbkIsS0FBSyxRQUFRLEVBQVUsR0FFbkIsQ0FBTyxLQUFLLE1BQU0sSUFBbEIsS0FBd0IsQUFBUSxLQUFLLE1BQU0sSUFBbkIsTUFDMUIsS0FBSyxNQUNILHNCQUNBLGdFQUtBLEFBQVEsS0FBSyxNQUFNLElBQW5CO0FBQUEsRUFDRixZQUFLLHFCQUF1QixHQUNyQixLQUFLLE9BQU8sS0FBSyxJQUFJLFlBSTlCLEdBQUksRUFBVSxLQUFLLFlBQVksR0FBSSxDQUVqQyxPQURJLEdBQWdCLEVBQ2IsS0FBSyxZQUFZLEdBQUssR0FDM0IsQUFBSSxLQUFLLFlBQVksR0FBSyxHQUN4QixLQUFLLE1BQ0gsMkJBQ0EsOENBQ0UsS0FBSyxZQUFZLEdBQ2pCLE9BQ0EsS0FBSyxZQUFZLEdBQ2pCLGlCQUdOLElBQ0EsS0FBSyxZQUFZLFFBRW5CLEtBQU8sS0FDTCxLQUFLLE1BQVEsRUFDYixFQUFNLEtBQUssSUFBSSxXQUNmLEtBQUssTUFBUSxLQUFLLFlBQVksR0FBSyxFQUNuQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sUUFHMUIsQUFBSSxJQUFXLEdBQVcsS0FBSyxZQUFZLEdBQ2hELEdBQU0sS0FBSyxJQUFJLFNBQVUsR0FDekIsS0FBSyxNQUFRLEVBQUksRUFDakIsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEtBQUssWUFBWSxRQUFRLElBR3pCLEdBQU0sS0FBSyxJQUFJLFdBQ2YsS0FBSyxNQUFRLEVBQUksS0FBSyxJQUFJLEtBQUssWUFBWSxJQUFNLEVBQUcsR0FDcEQsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLEtBRy9CLFlBQUsscUJBQXVCLEdBQ3JCLEtBSVgsYUFBYyxXQUFzQixFQUFTLENBQzNDLEtBQU8sS0FBSyxrQkFBa0IsVUFBUyxDQUV2QyxHQUFJLEdBQVcsS0FBSyxrQkFHcEIsR0FEQSxFQUFVLEdBQVksR0FBWSxFQUFTLEdBQUcsT0FDMUMsRUFBVSxLQUFLLFlBQVksR0FBSSxDQUNqQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLHlCQUN0QyxHQUFJLEdBQVMsR0FDVCxFQUFlLEdBQ2YsRUFHQSxFQUFZLEVBQ2hCLEVBQUcsQ0FFRCxHQUFJLEdBQUksS0FBSyxNQUFNLE9BQU8sRUFBWSxHQUFHLFFBQVE7QUFBQSxHQUNqRCxBQUFJLEFBQU0sR0FBTixJQUFTLEdBQUksS0FBSyxNQUFNLE9BQVMsRUFBWSxHQUNqRCxHQUFJLEdBQU0sS0FBSyxNQUFNLE9BQU8sRUFBWSxFQUFHLEdBQ3ZDLEVBQWUsS0FBSyxTQUFTLEtBQUs7QUFBQSxFQUFPLEdBQ3pDLEVBQWMsR0FBZ0IsRUFBYSxHQUFHLE9BSWxELEdBSEEsRUFBVSxHQUFlLEVBQ3pCLEVBQWEsS0FBSyxHQUNsQixFQUFVLEdBQVcsQ0FBQyxFQUFJLE9BQ3RCLEVBRUYsR0FBYSxFQUFJLE9BQVMsRUFDMUIsRUFBTyxLQUFLLEVBQUksT0FBTyxZQUNkLEVBQWMsS0FBSyxZQUFZLEdBR3hDLFlBQUssT0FBTyxNQUNMLEVBQWEsS0FBSyxLQUFNLEVBQWEsR0FBRyxjQUUxQyxLQUFLLE1BQU0sT0FBUyxHQUFhLEdBRTFDLElBREEsS0FBSyxRQUFRLEdBQ04sS0FBSyxNQUFNLFNBQVcsR0FBSyxFQUFPLEVBQU8sT0FBUyxLQUFPLElBQzlELEVBQU8sTUFDVCxTQUFPLFFBQ0wsU0FBUyxFQUFPLEVBQUcsQ0FDakIsR0FBSSxHQUNKLEtBQUssY0FBYyxHQUNmLElBQU0sR0FBRyxHQUFNLEtBQUssSUFBSSxZQUN4QixFQUFhLElBQUksS0FBSyxnQkFBZ0IsR0FDdEMsR0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEMsS0FBSyxRQUFRLE9BQVEsSUFDckIsS0FBSyxPQUVULEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLElBQUksdUJBQy9CLEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FBTSxLQUFLLEtBQUssTUFBTyxTQUMzQixHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FBTSxLQUFLLEtBQUssT0FBUSxLQUM1QixHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBSVgsS0FBTSxVQUFXLENBQ2YsS0FBSyxNQUNILGtCQUNBLG9CQUFzQixLQUFLLE1BQU0sT0FBTyxFQUFHLEdBQUssTUFJcEQsa0JBQW1CLFNBQVMsRUFBTSxDQUVoQyxPQURJLEdBQU8sR0FDRixFQUFJLEVBQUcsRUFBSSxVQUFVLE9BQVEsSUFDcEMsRUFBSyxLQUFLLFVBQVUsSUFHdEIsT0FESSxHQUFhLENBQUMsTUFBTSxPQUFPLEdBQ3RCLEVBQUksRUFBRyxFQUFJLEtBQUssUUFBUSxPQUFRLElBQUssQ0FDNUMsR0FBSSxHQUFTLEtBQUssUUFBUSxHQUMxQixHQUFJLEVBQU8sSUFBUyxFQUFPLEdBQU0sTUFBTSxFQUFRLEdBQzdDLE1BQU8sR0FHWCxNQUFPLE1BQUssR0FBTSxNQUFNLEtBQU0sSUFTaEMsUUFBUyxVQUFXLENBQ2xCLE1BQ0UsTUFBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IscUJBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssa0JBQWtCLFlBQ3ZCLEtBQUssa0JBQWtCLGtCQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixXQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixVQUN2QixLQUFLLGtCQUFrQixlQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixVQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixnQkFDdkIsS0FBSyxrQkFBa0IsV0FDdkIsS0FBSyxrQkFBa0IsU0FDdkIsS0FBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IsV0FDdkIsS0FBSyxrQkFBa0IsY0FDdkIsS0FBSyxrQkFBa0IsU0FDdkIsS0FBSyxrQkFBa0IsT0FDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IsY0FDdkIsS0FBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0Isb0JBQ3ZCLEtBQUssa0JBQWtCLFdBQ3ZCLEtBQUssa0JBQWtCLFNBQ3ZCLEtBQUssa0JBQWtCLGFBQ3ZCLEtBQUssa0JBQWtCLFlBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssUUFVVCxVQUFXLFVBQVcsQ0FDcEIsS0FBTyxDQUFDLEtBQUssT0FDWCxLQUFLLGtCQUFrQixXQUV6QixNQUFPLE1BQUssV0MzcURoQix3Q0FFQSxHQUFJLElBQVEsS0FFWixHQUFPLFFBQVUsR0FFakIsWUFBeUIsRUFBTSxFQUFVLEVBQVUsRUFBTSxDQUN2RCxHQUFJLEdBQU0sSUFBTSxFQUFPLHNCQUF3QixFQUMvQyxLQUFNLElBQU0sbUJBQW9CLEVBQUssQ0FBQyxTQUFVLEVBQVUsS0FBTSxJQUdsRSxZQUF1QixFQUFPLEVBQVMsQ0FDckMsRUFBVSxHQUFXLEdBR3JCLEdBQUksR0FBa0IsRUFBUSxrQkFBb0IsR0FDOUMsRUFBZ0IsRUFBUSxnQkFBa0IsR0FDMUMsRUFBVyxFQUFRLFNBRW5CLEVBQU0sR0FHTixFQUFZLEdBR1osRUFBaUIsR0FFckIsTUFBTyxHQUFNLE9BQU8sU0FBUyxFQUFLLENBQ2hDLE9BQVEsRUFBSSxVQUNMLFVBQ0gsR0FBSSxFQUNGLEdBQ0UsVUFDQSx1QkFDQSxFQUNBLEVBQUksVUFHTixVQUFZLEVBQUksT0FBUyxFQUFnQixFQUNsQyxDQUFDLE1BRVAsc0JBQ0gsTUFBSyxHQUNELElBQ0YsR0FDRSxzQkFDQSxnQ0FDQSxFQUNBLEVBQUksTUFHUixFQUFpQixHQUNWLElBVmdCLE9BV3BCLG9CQUNILE1BQUssR0FDQSxJQUNILEdBQ0Usb0JBQ0EsNEJBQ0EsRUFDQSxFQUFJLE1BR1IsRUFBaUIsR0FDakIsRUFBWSxHQUNMLElBWGdCLE9BY3BCLE9BQ0gsTUFBTyxDQUFDLFVBRVIsTUFBSSxHQUF1QixHQUMzQixHQUFZLEdBQ0wsVUN6RWYsd0NBRUEsR0FBTyxRQUFVLEdBQ2pCLFlBQXFCLEVBQVEsQ0FDM0IsR0FBSSxDQUFDLE1BQU0sUUFBUSxHQUNqQixLQUFNLElBQUksV0FBVSxxREFFdEIsS0FBSyxRQUFVLEVBRWpCLEdBQVksVUFBVSxVQUFZLFNBQVUsRUFBTyxDQUNqRCxHQUFJLEtBQUssUUFBUSxRQUFVLEVBQ3pCLEtBQU0sSUFBSSxPQUFNLHdDQUVsQixNQUFPLE1BQUssUUFBUSxJQUV0QixHQUFZLFVBQVUsS0FBTyxVQUFZLENBQ3ZDLEdBQUksS0FBSyxRQUFRLFNBQVcsRUFDMUIsS0FBTSxJQUFJLE9BQU0sd0NBRWxCLE1BQU8sTUFBSyxRQUFRLElBRXRCLEdBQVksVUFBVSxRQUFVLFVBQVksQ0FDMUMsR0FBSSxLQUFLLFFBQVEsU0FBVyxFQUMxQixLQUFNLElBQUksT0FBTSx3Q0FFbEIsTUFBTyxNQUFLLFFBQVEsU0FFdEIsR0FBWSxVQUFVLE1BQVEsU0FBVSxFQUFPLENBQzdDLEtBQUssUUFBUSxRQUFRLE1DNUJ2Qix3Q0FFQSxHQUFPLFFBQVUsQ0FDZixJQUNBLE9BQ0EsVUFDQSxJQUNBLEtBQ0EsT0FDQSxLQUNBLE9BQ0EsSUFDQSxNQUNBLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsUUFDQSxPQUNBLFNBQ0EsTUFDQSxTQ3JCRix3Q0FFQSxHQUFJLElBQVMsS0FDVCxHQUFjLEtBQ2QsR0FBUSxLQUNSLEdBQWEsS0FFakIsR0FBTyxRQUFVLEdBQ2pCLEdBQU8sUUFBUSxPQUFTLEdBQ3hCLFlBQWUsRUFBUSxFQUFTLENBQzlCLEdBQUksR0FBUyxHQUFJLElBQU8sRUFBUSxHQUM1QixFQUFNLEVBQU8sUUFDakIsTUFBTyxNQUFLLE1BQU0sS0FBSyxVQUFVLElBWW5DLFlBQWdCLEVBQVEsRUFBUyxDQUUvQixHQURBLEVBQVUsR0FBVyxHQUNqQixDQUFDLE1BQU0sUUFBUSxHQUNqQixLQUFNLElBQUksT0FDUiwyQ0FBNkMsTUFBTyxHQUFTLEtBR2pFLEdBQUksTUFBTyxJQUFZLFNBQ3JCLEtBQU0sSUFBSSxPQUNSLCtDQUFpRCxNQUFPLEdBQVUsS0FHdEUsS0FBSyxPQUFTLEdBQUksSUFBWSxHQUM5QixLQUFLLFNBQVcsRUFBUSxTQUN4QixLQUFLLElBQU0sRUFBUSxJQUNuQixLQUFLLFFBQVUsRUFDZixLQUFLLFFBQVUsRUFBUSxTQUFXLEdBT3BDLEdBQU8sVUFBWSxDQUtqQixZQUFhLEdBRWIsTUFBTyxTQUFTLEVBQU0sRUFBUyxFQUFPLENBQ3BDLEdBQUksR0FBTSxHQUFNLEVBQU0sRUFBUyxDQUM3QixLQUFNLEVBQU0sSUFBSSxNQUFNLEtBQ3RCLE9BQVEsRUFBTSxJQUFJLE1BQU0sT0FDeEIsU0FBVSxLQUFLLFNBQ2YsSUFBSyxLQUFLLE1BRVosS0FBTSxJQVVSLFFBQVMsVUFBVyxDQUNsQixNQUFPLE1BQUssT0FBTyxXQVVyQixLQUFNLFVBQVcsQ0FDZixNQUFPLE1BQUssT0FBTyxRQVdyQixVQUFXLFNBQVMsRUFBRyxDQUNyQixNQUFPLE1BQUssT0FBTyxVQUFVLElBVS9CLE1BQU8sVUFBVyxDQUdoQixPQUZJLEdBQVEsS0FBSyxXQUFXLEdBRXJCLEFBQVMsS0FBSyxPQUFPLE1BQXJCLE9BQ0wsR0FBSSxBQUFhLEtBQUssT0FBTyxNQUF6QixVQUNGLEtBQUssa0JBQ0ksQUFBZSxLQUFLLE9BQU8sTUFBM0IsWUFDVCxFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sS0FBSyxxQkFDakMsQ0FDTCxHQUFJLEdBQU8sS0FBSyxZQUNoQixBQUFJLEdBQ0YsQ0FBSSxFQUFLLE9BQVMsUUFDaEIsRUFBTSxNQUFRLEVBQU0sTUFBTSxPQUFPLEVBQUssT0FFdEMsRUFBTSxNQUFNLEtBQUssSUFNekIsTUFBTyxJQVVULE9BQVEsU0FBUyxFQUFNLENBQ3JCLEdBQUksS0FBSyxPQUFPLE9BQVMsRUFDdkIsTUFBTyxNQUFLLFVBRVosS0FBSyxNQUNILGdCQUNBLGFBQWUsRUFBTyxlQUFpQixLQUFLLE9BQU8sS0FBTyxJQUMxRCxLQUFLLFNBWVgsT0FBUSxTQUFTLEVBQU0sQ0FDckIsR0FBSSxLQUFLLE9BQU8sT0FBUyxFQUN2QixNQUFPLE1BQUssV0FJaEIsVUFBVyxTQUFTLEVBQU0sRUFBTyxDQUUvQixHQUFLLEdBQU8sS0FBTyxFQUFNLEtBQU0sSUFBSSxPQUFNLDRCQUV6QyxHQUFJLENBQUMsTUFBTSxRQUFRLEdBQVEsS0FBTSxJQUFJLE9BQU0sMkJBQzNDLE1BQU8sQ0FDTCxLQUFNLFFBQ04sTUFBTyxFQUNQLEtBQU0sRUFDTixTQUFVLEtBQUssV0FJbkIsV0FBWSxTQUFTLEVBQU0sQ0FDekIsTUFBTyxNQUFLLFVBQVUsRUFBTSxLQUc5QixVQUFXLFNBQVMsRUFBUyxFQUFLLENBRWhDLE9BREksR0FBTyxDQUFDLE1BQ0gsRUFBSSxFQUFHLEVBQUksVUFBVSxPQUFRLElBQ3BDLEVBQUssS0FBSyxVQUFVLElBR3RCLE9BREksR0FDSyxFQUFJLEVBQUcsRUFBSSxLQUFLLFFBQVEsT0FBUSxJQUFLLENBQzVDLEdBQUksR0FBUyxLQUFLLFFBQVEsR0FDMUIsR0FBSSxFQUFPLElBQVksRUFBTyxHQUFTLEVBQUksTUFBTyxDQUNoRCxHQUFJLEVBQ0YsS0FBTSxJQUFJLE9BQ1IsOENBQ0UsS0FBSyxVQUFVLEdBQ2YsZ0JBQ0EsS0FBSyxVQUFVLEVBQUksT0FFekIsRUFBZ0IsRUFBTyxJQUczQixHQUFJLEVBQ0YsTUFBTyxHQUFjLEVBQUksTUFBTSxNQUFNLEVBQWUsSUFxQnhELFVBQVcsVUFBVyxDQUNwQixPQUFRLEtBQUssT0FBTyxVQUNiLE1BQ0gsTUFBTyxNQUFLLGVBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsY0FDSCxNQUFPLE1BQUssc0JBQ1QsT0FDSCxNQUFPLE1BQUssZ0JBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsU0FDSCxNQUFPLE1BQUssa0JBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsV0FDQSx3QkFDQSwwQkFDSCxNQUFPLE1BQUssVUFBVSxDQUFDLE1BQU8sU0FDM0IsWUFDSCxNQUFPLE1BQUssVUFBVSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQU0sS0FBSyxxQkFDcEQsTUFDSCxNQUFPLE1BQUssZUFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxTQUNILE1BQU8sTUFBSyxrQkFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxZQUNILE1BQU8sTUFBSyxxQkFDVCxLQUNILE1BQU8sTUFBSyx1QkFDVCxRQUNILE1BQU8sTUFBSyxpQkFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxnQkFDSCxNQUFPLE1BQUsseUJBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsU0FDQSxRQUNILEdBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxNQUFPLFNBQzVCLFlBQUssT0FBTyxNQUFNLENBQ2hCLEtBQU0sTUFDTixJQUFLLE1BQ0wsSUFBSyxLQUFLLE9BQU8sSUFDakIsU0FBVSxLQUFLLFdBRVYsS0FBSyxvQkFFWixHQUFJLEdBQWUsS0FBSyxVQUFVLG1CQUFvQixLQUFLLFFBQzNELEdBQUksRUFBYyxNQUFPLEdBQ3pCLEtBQUssTUFDSCxnQkFDQSxxQkFBdUIsS0FBSyxPQUFPLEtBQU8sSUFDMUMsS0FBSyxVQUtiLFNBQVUsVUFBVyxDQUNuQixZQUFLLFVBQ0UsS0FBSyxrQkFPZCxVQUFXLFNBQVMsRUFBUyxDQUMzQixHQUFJLEdBQU8sR0FDUCxFQUFTLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FDL0IsRUFBVSxLQUFLLE9BQ25CLEVBQU0sT0FBYSxDQUNqQixPQUFRLEVBQVEsVUFDVCxPQUNILEdBQUksR0FBTSxLQUFLLFVBQ2YsRUFBSyxLQUFLLENBQ1IsS0FBTSxPQUNOLElBQUssRUFBSSxJQUNULEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FFakIsVUFDRyxvQkFDSCxHQUFJLEdBQU0sS0FBSyxVQUNmLEVBQUssS0FBSyxDQUNSLEtBQU0sT0FDTixJQUFLLEVBQUksSUFDVCxPQUFRLEVBQUksT0FDWixXQUFZLEVBQUksYUFBZSxHQUMvQixTQUFVLEdBQ1YsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLFVBQ0gsR0FBSSxDQUFDLEdBQVcsQ0FBQyxFQUFRLE1BQU8sUUFDaEMsR0FBSSxHQUFNLEtBQUssVUFDWCxFQUFXLEtBQUssT0FBTyxLQUMzQixBQUFJLEtBQWEsUUFBVSxJQUFhLHNCQUN0QyxFQUFLLEtBQUssQ0FDUixLQUFNLE9BQ04sSUFBSztBQUFBLEVBQ0wsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUduQixVQUNHLDBCQUNILEtBQUssVUFDTCxFQUFLLEtBQUssS0FBSyxhQUNmLEtBQUssT0FBTyx5QkFDWixjQUVBLEdBQUksR0FBZSxLQUFLLFVBQVUsYUFBYyxFQUFTLEdBQ3pELEdBQUksRUFBYyxNQUNsQixRQUVKLEVBQVUsS0FBSyxPQUVqQixNQUFJLEdBQUssU0FBVyxFQUFVLEVBQUssR0FDdkIsS0FBSyxVQUFVLEVBQVEsSUFHckMsY0FBZSxVQUFXLENBQ3hCLEdBQUksR0FBUSxHQUNSLEVBQWMsS0FDbEIsRUFBTSxPQUNKLE9BQVEsS0FBSyxPQUFPLFVBQ2IsWUFDSCxHQUFJLEdBQU8sS0FBSyxVQUNoQixBQUFLLEVBV0gsRUFBWSxLQUFPO0FBQUEsRUFBTyxFQUFLLElBVi9CLEdBQWMsQ0FDWixLQUFNLE9BQ04sSUFBSyxFQUFLLElBQ1YsU0FBVSxLQUFLLFNBQ2YsS0FBTSxFQUFLLElBQUksTUFBTSxLQUNyQixPQUFRLEVBQUssSUFBSSxNQUFNLE9BQ3ZCLE9BQVEsSUFFVixFQUFNLEtBQUssSUFJYixVQUNHLFNBQ0gsR0FBSSxHQUFRLEtBQUssUUFDakIsRUFBTSxNQUFNLFFBQVEsU0FBUyxFQUFNLENBQ2pDLEFBQUksRUFBSyxPQUNQLEFBQUssRUFJSCxFQUFZLEtBQU87QUFBQSxFQUFPLEVBQUssSUFIL0IsR0FBYyxFQUNkLEVBQU0sS0FBSyxJQUtiLEdBQWMsS0FDZCxFQUFNLEtBQUssTUFHZixVQUNHLE9BQ0gsRUFBYyxLQUNkLEVBQU0sS0FBSyxLQUFLLFVBQVUsS0FDMUIsVUFDRyxVQUNILEtBQUssVUFDTCxjQUVBLFFBR04sTUFBTyxJQVFULG9CQUFxQixVQUFXLENBQzlCLEdBQUksR0FBTSxLQUFLLE9BQU8sS0FDdEIsR0FBSSxFQUFLLENBQ1AsR0FBSSxHQUFPLEtBQUssWUFDaEIsTUFBTyxHQUFLLE9BQVMsUUFDakIsRUFDQSxLQUFLLFVBQVUsRUFBSSxJQUFJLE1BQU0sS0FBTSxDQUFDLFFBRXhDLE9BQU8sTUFBSyxTQVFoQixVQUFXLFVBQVcsQ0FDcEIsR0FBSSxHQUFNLEtBQUssT0FBTyxRQUNsQixFQUFPLENBQ1QsS0FBTSxPQUNOLEtBQU0sRUFBSSxJQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFHYixFQUFRLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxLQUFPLEdBRWpELElBREEsS0FBSyxPQUFPLFVBQ0wsQUFBYSxLQUFLLE9BQU8sTUFBekIsV0FDTCxPQUFRLEtBQUssT0FBTyxVQUNiLGNBQ0EsVUFDSCxLQUFLLFVBQ0wsVUFDRyxPQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssYUFDdEIsVUFDRyxVQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssZ0JBQ3RCLGNBRUEsR0FBSSxHQUFlLEtBQUssVUFBVSxhQUFjLEtBQUssT0FBUSxHQUM3RCxHQUFJLEVBQWMsTUFDbEIsS0FBSyxNQUNILGdCQUNBLHFCQUNFLEtBQUssT0FBTyxLQUNaLDZDQUNGLEtBQUssUUFJYixZQUFLLE9BQU8sV0FFWixFQUFLLE1BQVEsRUFFTixHQU9ULFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQU0sS0FBSyxPQUFPLFFBQ3RCLE1BQUksTUFBSyxPQUFPLE9BQVMsVUFDaEIsQ0FDTCxLQUFNLE9BQ04sS0FBTSxFQUFJLElBQ1YsTUFBTyxLQUFLLHNCQUNaLE1BQU8sR0FDUCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR1YsQ0FDTCxLQUFNLE9BQ04sS0FBTSxFQUFJLElBQ1YsTUFBTyxHQUNQLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FTckIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDdEIsTUFBTyxDQUNMLEtBQU0sT0FDTixLQUFNLFVBQ04sTUFBTyxLQUFLLHNCQUNaLE1BQU8sR0FDUCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBUW5CLFVBQVcsU0FBUyxFQUFTLENBQzNCLEdBQUksR0FBTSxLQUFLLE9BQU8sUUFDdEIsR0FDRSxNQUFPLEdBQUksWUFBZSxVQUMxQixxREFFRixHQUFJLEdBQU8sQ0FDVCxLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsT0FBUSxFQUFJLE9BQ1osV0FBWSxFQUFJLGFBQWUsR0FDL0IsU0FBVSxDQUFDLENBQUMsRUFDWixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBS2pCLEdBRkksRUFBSyxJQUFJLE1BQU0sWUFBWSxHQUFLLE1BQVEsSUFFeEMsRUFBUyxNQUFPLEdBRXBCLEdBQUksR0FHSixTQUFRLEFBQVksS0FBSyxPQUFPLE1BQXhCLFNBQ0osR0FDRSxHQUFJLFFBQ04sS0FBSyxNQUNILHlCQUNBLG1EQUNBLEtBQUssUUFHVCxFQUFLLE1BQVEsS0FBSyxTQUdiLEdBRVQsaUJBQWtCLFVBQVcsQ0FDM0IsR0FBSSxHQUFNLEtBQUssT0FBTyxNQUNsQixFQUFPLENBQ1QsS0FBTSxjQUNOLEtBQU0sRUFBSSxJQUNWLFdBQVksS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQzFDLFVBQVcsS0FDWCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBSWpCLEFBQUksQUFBWSxLQUFLLE9BQU8sTUFBeEIsVUFDRixHQUFLLFdBQWEsS0FBSyxTQUl6QixPQURJLEdBQWMsSUFFaEIsR0FBSSxLQUFLLE9BQU8sT0FBUyxVQUN2QixLQUFLLE9BQU8sbUJBQ0gsS0FBSyxPQUFPLE9BQVMsVUFDOUIsRUFBTSxLQUFLLE9BQU8sV0FDbEIsRUFBYyxFQUFZLFVBQVksQ0FDcEMsS0FBTSxjQUNOLEtBQU0sRUFBSSxJQUNWLFdBQVksS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQzFDLFVBQVcsS0FDWCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWIsQUFBWSxLQUFLLE9BQU8sTUFBeEIsVUFDRixHQUFZLFdBQWEsS0FBSyxpQkFFdkIsS0FBSyxPQUFPLE9BQVMsT0FBUSxDQUN0QyxLQUFLLE9BQU8sUUFDUixLQUFLLE9BQU8sT0FBUyxVQUN2QixHQUFZLFVBQVksS0FBSyxTQUUvQixVQUVBLE9BSUosTUFBTyxJQUVULFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ2xCLEVBQU8sQ0FDVCxLQUFNLFFBQ04sS0FBTSxFQUFJLElBQ1YsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxVQUlqQixNQUFJLEFBQVksTUFBSyxPQUFPLE1BQXhCLFNBQ0YsRUFBSyxNQUFRLEtBQUssUUFFbEIsRUFBSyxNQUFRLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUd0QyxHQU9ULGVBQWdCLFVBQVcsQ0FDekIsR0FBSSxHQUFNLEtBQUssT0FBTyxhQUNsQixFQUFPLEVBQUksSUFBSSxNQUFNLEtBQ3JCLEVBQVMsRUFBSSxJQUFJLE1BQU0sT0FDdkIsRUFBTyxLQUFLLE9BQ1osRUFBTyxHQUNYLEdBQUksRUFBSyxPQUFTLHNCQUF1QixDQUV2QyxJQURBLEtBQUssVUFDRSxLQUFLLE9BQU8sT0FBUyxxQkFFMUIsT0FEQSxFQUFNLEtBQUssVUFDSCxFQUFJLFVBQ0wsT0FDSCxHQUFRLEVBQUksSUFDWixVQUNHLFVBQ0gsR0FBUTtBQUFBLEVBQ1IsY0FFQSxHQUFJLEdBQWUsS0FBSyxVQUFVLGtCQUFtQixFQUFLLEdBQzFELEdBQUksRUFBYyxDQUNoQixHQUFRLEVBQ1IsTUFFRixLQUFLLE1BQ0gsZ0JBQ0EsMEJBQTRCLEVBQUksS0FDaEMsR0FJUixLQUFLLFVBRVAsTUFBTyxDQUNMLEtBQU0sT0FDTixJQUFLLEVBQ0wsT0FBUSxHQUNSLFdBQVksR0FDWixTQUFVLEdBQ1YsS0FBTSxFQUNOLE9BQVEsRUFDUixTQUFVLEtBQUssV0FPbkIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDbEIsRUFDSixNQUFLLEdBQVEsS0FBSyxrQkFDVCxDQUNMLEtBQU0sZUFDTixJQUFLLEVBQUksSUFDVCxNQUFPLEVBQ1AsT0FBUSxFQUFJLE9BQ1osS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxVQUdWLENBQ0wsS0FBTSxVQUNOLElBQUssRUFBSSxJQUNULE9BQVEsRUFBSSxPQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FTckIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDdEIsTUFBTyxDQUNMLEtBQU0sVUFDTixJQUFLLEVBQUksSUFDVCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBSW5CLG1CQUFvQixVQUFXLENBQzdCLEdBQUksR0FBTSxLQUFLLE9BQU8sVUFDbEIsRUFBUSxHQUVaLE1BQUksTUFBSyxPQUFPLE9BQVMsb0JBQ3ZCLEdBQVEsS0FBSyxTQUdSLENBQ0wsS0FBTSxnQkFDTixLQUFNLEVBQUksSUFDVixNQUFPLEVBQ1AsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixZQUFhLFVBQVcsQ0FDdEIsR0FBSSxHQUFNLEtBQUssT0FBTyxVQUNsQixFQUNGLEVBQVEsR0FNVixHQUpJLEtBQUssT0FBTyxPQUFTLG9CQUN2QixHQUFRLEtBQUssU0FHWCxLQUFLLE9BQU8sT0FBUyxPQUFRLENBQy9CLEdBQUksR0FBWSxLQUFLLFVBQ3JCLEVBQVEsS0FBSyxVQUFVLEVBQVUsSUFBSSxNQUFNLEtBQU0sQ0FDL0MsQ0FDRSxLQUFNLE9BQ04sSUFBSyxFQUFVLElBQ2YsS0FBTSxFQUFVLElBQUksTUFBTSxLQUMxQixPQUFRLEVBQVUsSUFBSSxNQUFNLE9BQzVCLFNBQVUsS0FBSyxnQkFHZCxBQUFJLE1BQUssT0FBTyxPQUFTLFNBQzlCLEVBQVEsS0FBSyxVQUFVLEVBQUksSUFBSSxNQUFNLEtBQU0sQ0FBQyxLQUFLLGdCQUVqRCxFQUFRLEtBQUssa0JBQW9CLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUdqRSxNQUFPLENBQ0wsS0FBTSxTQUNOLEtBQU0sRUFBSSxJQUNWLE1BQU8sRUFDUCxNQUFPLEVBQ1AsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixVQUFXLFVBQVcsQ0FDcEIsR0FBSSxHQUFNLEtBQUssT0FBTyxRQUNsQixFQUFPLENBQ1QsS0FBTSxPQUNOLElBQUssRUFBSSxLQUNULElBQUssRUFBSSxJQUNULElBQUssRUFBSSxJQUNULE1BQU8sS0FBSyxRQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFFakIsTUFBSSxNQUFLLE9BQU8sTUFBUSxRQUN0QixNQUFLLFVBQ0wsRUFBSyxVQUFZLEtBQUssU0FFakIsR0FHVCxZQUFhLFVBQVcsQ0FDdEIsR0FBSSxHQUFNLEtBQUssT0FBTyxVQUNsQixFQUFPLENBQ1QsS0FBTSxTQUNOLElBQUssRUFBSSxLQUNULElBQUssRUFBSSxJQUNULE1BQU8sS0FBSyxRQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFFakIsTUFBTyxJQU1ULGFBQWMsVUFBVyxDQUN2QixHQUFJLEdBQU0sS0FBSyxPQUFPLFdBQ2xCLEVBQU8sS0FBSyxPQUFPLFFBQ3ZCLE1BQU8sQ0FDTCxLQUFNLFVBQ04sS0FBTSxDQUNKLEtBQU0sZ0JBQ04sS0FBTSxFQUFLLElBQUksT0FDZixLQUFNLEVBQUssSUFBSSxNQUFNLEtBQ3JCLE9BQVEsRUFBSyxJQUFJLE1BQU0sT0FDdkIsU0FBVSxLQUFLLFVBRWpCLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FRbkIsV0FBWSxVQUFXLENBQ3JCLEdBQUksR0FBTSxLQUFLLE9BQU8sU0FFbEIsRUFDRixBQUFZLEtBQUssT0FBTyxNQUF4QixTQUNJLEtBQUssUUFDTCxLQUFLLFdBQVcsRUFBSSxJQUFJLE1BQU0sTUFDcEMsU0FBSyxLQUFPLGFBQ1osRUFBSyxLQUFPLEVBQUksSUFBSSxPQUNwQixFQUFLLEtBQU8sRUFBSSxLQUNoQixFQUFLLEtBQU8sRUFBSSxJQUFJLE1BQU0sS0FDMUIsRUFBSyxPQUFTLEVBQUksSUFBSSxNQUFNLE9BRXJCLEdBR1QsZ0JBQWlCLFVBQVcsQ0FDMUIsR0FBSSxHQUFNLEtBQUssT0FBTyxlQUN0QixNQUFLLE1BQUssU0FDUixLQUFLLE1BQ0gsc0JBQ0Esb0VBQ0EsR0FHRyxDQUNMLEtBQU0sYUFDTixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBSW5CLFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ3RCLE1BQU8sQ0FDTCxLQUFNLGFBQ04sS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixhQUFjLFVBQVcsQ0FhdkIsT0FaSSxHQUFNLEtBQUssT0FBTyxXQUNsQixFQUFPLENBQ1QsS0FBTSxVQUNOLEtBQU0sQ0FDSixLQUFNLGdCQUNOLFNBQVUsS0FBSyxVQUVqQixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWIsRUFBVSxHQUNQLEtBQUssT0FBTyxPQUFTLFVBQzFCLEVBQVEsS0FBSyxLQUFLLHNCQUVwQixHQUFJLEdBQU8sS0FBSyxPQUFPLFFBRXZCLFNBQUssS0FBSyxLQUFPLEVBQUssSUFBSSxPQUMxQixFQUFLLEtBQUssS0FBTyxFQUFLLElBQUksTUFBTSxLQUNoQyxFQUFLLEtBQUssT0FBUyxFQUFLLElBQUksTUFBTSxPQUVsQyxBQUNHLFdBQVUsS0FBSyxFQUFLLEtBQUssT0FBUyxTQUFTLEtBQUssRUFBSyxLQUFLLFFBQzNELENBQUMsRUFBUSxPQUVULEdBQUssTUFDSCxBQUFZLEtBQUssT0FBTyxNQUF4QixTQUNJLEtBQUssUUFDTCxLQUFLLFdBQVcsRUFBSSxJQUFJLE1BQU0sTUFDaEMsVUFBVSxLQUFLLEVBQUssS0FBSyxPQUMzQixRQUFRLEtBQ04sS0FBSyxTQUNILFVBQ0EsRUFBSSxJQUFJLE1BQU0sS0FDZDtBQUFBLG1EQUNBLEVBQUssS0FBSyxLQUNWLE9BSU4sR0FBSyxLQUFPLGFBQ1osRUFBSyxRQUFVLEVBQ1gsS0FBSyxPQUFPLE9BQVMsVUFDdkIsS0FBSyxNQUNILG9CQUNBLHVDQUNBLEtBQUssU0FJSixHQU9ULFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQU0sS0FBSyxPQUFPLFFBQ2xCLEVBQU8sRUFBSSxJQUNYLEVBQU8sRUFBSSxLQUNYLEVBQVEsQ0FDVixLQUFNLFFBQ04sS0FBTSxFQUNOLEtBQU0sRUFDTixNQUFPLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUNyQyxLQUFNLEdBQ04sTUFBTyxHQUNQLGdCQUFpQixHQUNqQixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR2pCLFlBQUssSUFBSSxHQUNMLEVBQU0sTUFDUixHQUFNLE1BQU0sTUFBTSxLQUFLLEVBQU0sTUFDN0IsTUFBTyxHQUFNLE1BRVgsRUFBTSxNQUFNLE1BQU0sU0FBVyxHQUFHLEdBQU0sTUFBUSxNQUMzQyxHQU9ULFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ2xCLEVBQU8sRUFBSSxJQUNYLEVBQU8sRUFBSSxLQUVmLEdBQUksQUFBWSxLQUFLLE9BQU8sTUFBeEIsU0FBOEIsQ0FDaEMsS0FBSyxVQUNMLEdBQUksR0FBUSxDQUNWLEtBQU0sUUFDTixLQUFNLEVBQ04sS0FBTSxFQUNOLE1BQU8sS0FBSyxRQUNaLEtBQU0sR0FDTixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWpCLFlBQUssVUFDRSxNQUVQLE1BQUssTUFDSCxxQkFDQSxTQUFXLEVBQU8seUJBQ2xCLElBU04sZUFBZ0IsVUFBVyxDQUN6QixHQUFJLEdBQU0sS0FBSyxPQUFPLHVCQUN0QixHQUFJLEVBQUMsRUFFTCxRQURJLEdBQVEsS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ25DLEtBQUssT0FBTyxPQUFTLHFCQUFxQixDQUMvQyxHQUFJLEdBQU0sS0FBSyxVQUNmLE9BQVEsRUFBSSxVQUNMLE9BQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLFVBQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSztBQUFBLEVBQ0wsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLDBCQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssYUFDdEIsS0FBSyxPQUFPLHlCQUNaLFVBQ0csb0JBQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsT0FBUSxFQUFJLE9BQ1osV0FBWSxFQUFJLGFBQWUsR0FDL0IsU0FBVSxHQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FFakIsY0FFQSxHQUFJLEdBQWUsS0FBSyxVQUFVLGtCQUFtQixFQUFLLEVBQU8sR0FDakUsR0FBSSxFQUFjLE1BQ2xCLEtBQUssTUFDSCxnQkFDQSwwQkFBNEIsRUFBSSxLQUNoQyxJQUlSLFlBQUssVUFDRSxJQU9ULE1BQU8sVUFBVyxDQUdoQixPQUZJLEdBQU0sS0FBSyxPQUFPLFVBQ2xCLEVBQVEsS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ25DLEFBQWEsS0FBSyxPQUFPLE1BQXpCLFdBQ0wsR0FBSSxBQUFhLEtBQUssT0FBTyxNQUF6QixVQUNGLEtBQUssa0JBQ0ksQUFBZSxLQUFLLE9BQU8sTUFBM0IsWUFDVCxFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sS0FBSyxxQkFDakMsQ0FDTCxHQUFJLEdBQU8sS0FBSyxZQUNoQixBQUFJLEVBQUssT0FBUyxRQUNoQixFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sRUFBSyxPQUV0QyxFQUFNLE1BQU0sS0FBSyxHQUl2QixZQUFLLE9BQU8sV0FDTCxHQU9ULG1CQUFvQixVQUFXLENBQzdCLEdBQUksR0FBTSxLQUFLLFVBQ1gsRUFBTSxDQUNSLEtBQU0sa0JBQ04sS0FBTSxFQUFJLElBQ1YsWUFBYSxHQUNiLE1BQU8sS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ3JDLE1BQU8sR0FDUCxnQkFBaUIsR0FDakIsU0FBVSxHQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFHakIsTUFBTyxNQUFLLElBQUksRUFBSyxDQUFDLG1CQUFvQixNQU81QyxTQUFVLFVBQVcsQ0FDbkIsR0FBSSxHQUFNLEtBQUssVUFDWCxFQUFNLENBQ1IsS0FBTSxNQUNOLEtBQU0sRUFBSSxJQUNWLFlBQWEsR0FDYixNQUFPLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUNyQyxNQUFPLEdBQ1AsZ0JBQWlCLEdBQ2pCLFNBQVUsR0FBVyxRQUFRLEVBQUksT0FBUyxHQUMxQyxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR2pCLE1BQU8sTUFBSyxJQUFJLEVBQUssQ0FBQyxtQkFBb0IsTUFPNUMsSUFBSyxTQUFTLEVBQUssRUFBUyxDQUMxQixHQUFJLEdBQVksR0FDWixFQUFpQixHQUNqQixFQUFxQixHQUFXLEVBQVEsbUJBRTVDLEVBQUssT0FDSCxPQUFRLEtBQUssT0FBTyxVQUNiLFNBQ0EsUUFDSCxHQUFJLEdBQU0sS0FBSyxVQUNmLEFBQUksRUFBSSxPQUFTLE1BQ1gsR0FBZSxRQUFRLFFBQVUsSUFDbkMsS0FBSyxNQUNILGVBQ0EsMkNBQ0EsR0FHSixFQUFlLEtBQUssT0FFdEIsRUFBSSxNQUFNLEtBQUssQ0FDYixLQUFNLEVBQUksS0FDVixJQUFLLElBQU0sRUFBSSxJQUFNLElBQ3JCLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssU0FDZixXQUFZLEtBRWQsYUFDRyxtQkFDSCxBQUFJLEdBQ0YsUUFBUSxLQUNOLEtBQUssU0FDSCxVQUNBLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FDdEI7QUFBQSx5REFHTixFQUFZLEdBQ1osRUFBSSxNQUFRLEVBQUksTUFBTSxPQUFPLEtBQUssTUFBTSxJQUN4QyxhQUNHLGNBQ0gsR0FBSSxHQUFNLEtBQUssVUFDZixFQUFJLGdCQUFnQixLQUFLLENBQ3ZCLEtBQU0saUJBQ04sSUFBSyxFQUFJLElBQ1QsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixjQUVBLEdBQUksR0FBZSxLQUFLLFVBQ3RCLHFCQUNBLEtBQUssT0FDTCxFQUNBLEdBRUYsR0FBSSxFQUFjLE1BQ2xCLFFBV04sT0FOSSxBQUFTLEtBQUssT0FBTyxNQUFyQixPQUNGLEdBQUksU0FBVyxHQUNmLEtBQUssV0FJQyxLQUFLLE9BQU8sVUFDYixXQUNBLG9CQUNILEdBQUksR0FBTyxLQUFLLFlBQ2hCLEFBQUksRUFBSyxPQUFTLFFBQ2hCLEVBQUksTUFBTSxNQUFNLEtBQUssTUFBTSxFQUFJLE1BQU0sTUFBTyxFQUFLLE9BRWpELEVBQUksTUFBTSxNQUFNLEtBQUssR0FFdkIsVUFDRyxPQUNILEVBQUksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLEtBQ3BDLFVBQ0csSUFDSCxLQUFLLFVBQ0wsR0FBSSxHQUFPLEtBQUssWUFDaEIsRUFBSSxNQUNGLEVBQUssT0FBUyxRQUFVLEVBQU8sS0FBSyxVQUFVLEVBQUksS0FBTSxDQUFDLElBQzNELFVBQ0csY0FDQSxhQUNBLGNBQ0EsVUFDQSwwQkFDQSx3QkFDSCxVQUNHLFFBQ0gsR0FBSSxFQUFvQixDQUN0QixLQUFLLFVBQ0wsRUFBSSxZQUFjLEdBQ2xCLGNBR0YsR0FBSSxHQUFlLEtBQUssVUFDdEIsWUFDQSxLQUFLLE9BQ0wsRUFDQSxHQUVGLEdBQUksRUFBYyxNQUNsQixLQUFLLE1BQ0gsZ0JBQ0EscUJBQ0UsS0FBSyxPQUFPLEtBQ1osc0RBQ0MsR0FBcUIsWUFBYyxJQUNwQyx1QkFDRixLQUFLLFFBS1gsS0FBTyxBQUFhLEtBQUssT0FBTyxNQUF6QixXQUErQixLQUFLLFVBRzNDLEdBQUksRUFBSSxTQUNOLEVBQUksTUFBUSxLQUFLLGtCQUFvQixLQUFLLFdBQVcsRUFBSSxjQUNoRCxBQUFZLEtBQUssT0FBTyxNQUF4QixTQUVULE9BREksR0FBUSxLQUFLLFFBQ1IsRUFBSSxFQUFHLEVBQU0sRUFBTSxNQUFNLE9BQVEsRUFBSSxFQUFLLEVBQUUsRUFDbkQsRUFBSSxNQUFNLE1BQU0sS0FBSyxFQUFNLE1BQU0sSUFJckMsTUFBTyxJQUdULE1BQU8sU0FBUyxFQUFnQixDQUM5QixLQUFLLE9BQU8sb0JBSVosT0FGSSxHQUFRLEdBQ1IsRUFBTSxLQUFLLFVBQ1IsRUFBSSxPQUFTLGFBQ2xCLEFBQUksRUFBSSxPQUFTLFNBQVcsR0FDdEIsR0FBZSxRQUFRLEVBQUksUUFBVSxJQUN2QyxLQUFLLE1BQ0gsc0JBQ0Esd0JBQTBCLEVBQUksS0FBTyxvQkFDckMsR0FHSixFQUFlLEtBQUssRUFBSSxPQUUxQixFQUFNLEtBQUssQ0FDVCxLQUFNLEVBQUksS0FDVixJQUFLLEVBQUksSUFDVCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFNBQ2YsV0FBWSxFQUFJLGFBQWUsS0FFakMsRUFBTSxLQUFLLFVBRWIsWUFBSyxPQUFPLE1BQU0sR0FDbEIsS0FBSyxPQUFPLGtCQUNMLE1DanhDWCx3Q0FFQSxHQUFPLFFBQVUsR0FDakIsWUFBaUIsRUFBSyxFQUFRLEVBQU8sRUFBUyxDQUM1QyxBQUFJLEdBQVMsTUFBTyxJQUFVLFVBQVksTUFBTyxJQUFZLGFBQzNELEdBQVUsRUFDVixFQUFRLE1BRVYsRUFBVSxHQUFXLENBQUMsb0JBQXFCLElBQzNDLEdBQUksR0FBVyxFQUFRLFFBQVUsRUFBUSxTQUFXLEdBRWhELEVBQVUsV0FBaUIsRUFBYSxDQUMxQyxHQUFJLE1BQU0sUUFBUSxJQUFnQixDQUFDLEVBQVEsYUFDekMsS0FBTSxJQUFJLE9BQ1IsMEZBR0osRUFBTSxHQU9SLEdBTEEsRUFBUSxhQUNOLEVBQVEsSUFDUCxtQkFBa0IsS0FBSyxFQUFRLEdBQUcsT0FDaEMsRUFBUSxHQUFHLE9BQVMsY0FBZ0IsRUFBSSxPQUFTLGlCQUVsRCxFQUFRLENBQ1YsR0FBSSxHQUFTLEVBQU8sRUFBSyxHQUN6QixHQUFJLElBQVcsR0FDYixNQUFPLEdBQ0YsR0FBSSxNQUFNLFFBQVEsR0FFdkIsTUFBTyxHQUFrQixHQU03QixPQUZBLEVBQVEsUUFBUSxHQUVSLEVBQUksVUFDTCxpQkFDQSxRQUNILEVBQUksTUFBUSxFQUFrQixFQUFJLE9BQ2xDLFVBQ0csV0FDQSxhQUNBLFlBQ0EsVUFDQSxzQkFDQSxXQUNBLFdBQ0EsUUFDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRWhELFVBQ0csT0FDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRTVDLEVBQUksV0FDTixHQUFJLFVBQVksR0FBUSxFQUFJLFVBQVcsRUFBUSxFQUFPLElBRXhELFVBQ0csU0FDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRWhELFVBQ0csY0FDSCxBQUFJLEVBQUksWUFDTixHQUFJLFdBQWEsR0FBUSxFQUFJLFdBQVksRUFBUSxFQUFPLElBRXRELEVBQUksV0FDTixHQUFJLFVBQVksR0FBUSxFQUFJLFVBQVcsRUFBUSxFQUFPLElBRXhELFVBQ0csVUFDSCxHQUFRLEVBQUksTUFBTyxFQUFRLEVBQU8sR0FDbEMsR0FBUSxFQUFJLEtBQU0sRUFBUSxFQUFPLEdBQ2pDLFVBQ0csVUFDSCxHQUFRLEVBQUksS0FBTSxFQUFRLEVBQU8sR0FDakMsVUFDRyxhQUNILEVBQUksUUFBVSxFQUFrQixFQUFJLFNBQ3BDLEdBQVEsRUFBSSxLQUFNLEVBQVEsRUFBTyxHQUNqQyxVQUNHLFlBQ0EsbUJBQ0EsY0FDQSxjQUNBLG9CQUNBLGlCQUNBLGlCQUNBLE9BQ0gsVUFDRyxnQkFDSCxBQUFJLEVBQVEscUJBQXVCLEVBQUksS0FDckMsR0FBUSxFQUFJLElBQUssRUFBUSxFQUFPLEdBRWxDLGNBRUEsS0FBTSxJQUFJLE9BQU0sd0JBQTBCLEVBQUksTUFJbEQsU0FBUSxRQUVSLEdBQVMsRUFBTSxFQUFLLEdBQ2IsRUFFUCxXQUEyQixFQUFPLENBQ2hDLE1BQU8sR0FBTSxPQUFPLFNBQVMsRUFBTyxFQUFNLENBQ3hDLEdBQUksR0FBUyxHQUFRLEVBQU0sRUFBUSxFQUFPLEdBQzFDLE1BQUksT0FBTSxRQUFRLEdBQ1QsRUFBTSxPQUFPLEdBRWIsRUFBTSxPQUFPLENBQUMsS0FFdEIsUUNySFAsd0NBRUEsR0FBSSxJQUFLLEtBQ0wsR0FBTyxLQUNQLEdBQU8sS0FDUCxHQUFTLEtBRWIsR0FBTyxRQUFVLEdBQ2pCLFlBQWMsRUFBSyxFQUFTLENBQzFCLFNBQVUsR0FBVyxHQUVyQixFQUFNLEtBQUssTUFBTSxLQUFLLFVBQVUsSUFDekIsR0FBSyxFQUFLLFNBQVMsRUFBTSxDQUM5QixHQUFJLEVBQUssTUFBUSxRQUViLEdBQUssT0FBUyxXQUNkLEVBQUssT0FBUyxjQUNkLEVBQUssT0FBUyxXQUNkLENBQ0EsR0FBSSxHQUFPLEVBQUssS0FDaEIsR0FBSSxFQUFLLE9BQVMsZ0JBQ2hCLEtBQU0sSUFBSSxPQUFNLDRDQUVsQixHQUFJLEdBQU0sRUFBSyxFQUNmLEdBQUksQ0FDRixFQUFPLEVBQVEsUUFBUSxFQUFLLEtBQU0sRUFBSyxTQUFVLEdBQ2pELEVBQUssU0FBVyxFQUNoQixFQUFNLEVBQVEsS0FBSyxFQUFNLEdBQ3pCLEVBQU0sRUFBSSxTQUFTLGNBQ1osRUFBUCxDQUNBLFFBQUcsU0FBVztBQUFBLFNBQWMsRUFBSyxTQUFXLFNBQVcsRUFBSyxLQUN0RCxFQUVSLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNQLEdBQUssT0FBUyxXQUFhLEVBQUssT0FBUyxZQUMzQyxHQUFLLElBQU0sR0FBSyxPQUNkLEVBQ0EsR0FBTyxHQUFJLEVBQVMsQ0FDbEIsU0FBVSxTQVN4QixHQUFLLE9BQVMsU0FBb0IsRUFBSyxFQUFTLENBQzlDLEVBQVUsR0FBTyxHQUFXLEdBQVUsQ0FDcEMsSUFBSyxJQUVQLEdBQUksR0FBUyxFQUFRLElBQUksRUFBSyxHQUMxQixFQUFNLEVBQVEsTUFBTSxFQUFRLEdBQ2hDLE1BQU8sSUFBSyxFQUFLLElBRW5CLEdBQUssS0FBTyxTQUFrQixFQUFVLEVBQVMsQ0FDL0MsRUFBVSxHQUFPLEdBQVcsR0FBVSxDQUNwQyxTQUFVLElBRVosR0FBSSxHQUFNLEVBQVEsS0FBSyxHQUFVLFNBQVMsUUFDMUMsTUFBTyxJQUFLLE9BQU8sRUFBSyxJQUcxQixHQUFLLFFBQVUsU0FBaUIsRUFBVSxFQUFRLEVBQVMsQ0FFekQsR0FEQSxFQUFXLEVBQVMsT0FDaEIsRUFBUyxLQUFPLEtBQU8sQ0FBQyxFQUMxQixLQUFNLElBQUksT0FDUix1RkFHSixHQUFJLEVBQVMsS0FBTyxLQUFPLENBQUMsRUFBUSxRQUNsQyxLQUFNLElBQUksT0FDUixzRkFHSixTQUFXLEdBQUssS0FDZCxFQUFTLEtBQU8sSUFBTSxFQUFRLFFBQVUsR0FBSyxRQUFRLEVBQU8sUUFDNUQsR0FHSyxHQUVULEdBQUssS0FBTyxTQUFjLEVBQVUsRUFBUyxDQUMzQyxNQUFPLElBQUcsYUFBYSxJQUd6QixHQUFLLGdCQUFrQixTQUF5QixFQUFTLENBRXZELEdBQUksTUFBTyxJQUFZLFNBQ3JCLEtBQU0sSUFBSSxXQUFVLDZCQUd0QixHQUFJLE1BQU8sR0FBUSxLQUFRLFdBQ3pCLEtBQU0sSUFBSSxXQUFVLGtDQUd0QixHQUFJLE1BQU8sR0FBUSxPQUFVLFdBQzNCLEtBQU0sSUFBSSxXQUFVLG9DQUd0QixHQUFJLEVBQVEsU0FBVyxNQUFPLEdBQVEsU0FBWSxXQUNoRCxLQUFNLElBQUksV0FBVSxzQ0FHdEIsR0FBSSxFQUFRLE1BQVEsTUFBTyxHQUFRLE1BQVMsV0FDMUMsS0FBTSxJQUFJLFdBQVUsb0NBSXhCLFlBQW9CLEVBQVMsQ0FDM0IsVUFBSyxnQkFBZ0IsR0FDZCxHQUNMLENBQ0UsUUFBUyxHQUFLLFFBQ2QsS0FBTSxHQUFLLE1BRWIsTUNySEosd0NBWUEsR0FBTyxRQUFVLEdBQ2pCLFlBQWlCLEVBQU0sQ0FDbkIsQUFBSyxHQUFNLFFBQ1AsTUFDQSxHQUFXLElBR2YsR0FBTSxHQUFNLFFBQVUsRUFHMUIsR0FBSSxJQUFRLEdBR1IsR0FBVyxHQUlYLEdBSUEsR0FBUSxFQUlSLEdBQVcsS0FRZixhQUFpQixDQUNiLEtBQU8sR0FBUSxHQUFNLFFBQVEsQ0FDekIsR0FBSSxHQUFlLEdBVW5CLEdBUEEsR0FBUSxHQUFRLEVBQ2hCLEdBQU0sR0FBYyxPQU1oQixHQUFRLEdBQVUsQ0FHbEIsT0FBUyxHQUFPLEVBQUcsRUFBWSxHQUFNLE9BQVMsR0FBTyxFQUFPLEVBQVcsSUFDbkUsR0FBTSxHQUFRLEdBQU0sRUFBTyxJQUUvQixHQUFNLFFBQVUsR0FDaEIsR0FBUSxHQUdoQixHQUFNLE9BQVMsRUFDZixHQUFRLEVBQ1IsR0FBVyxHQWFmLEdBQUksSUFBUSxNQUFPLFNBQVcsWUFBYyxPQUFTLEtBQ2pELEdBQTBCLEdBQU0sa0JBQW9CLEdBQU0sdUJBYTlELEFBQUksTUFBTyxLQUE0QixXQUNuQyxHQUFlLEdBQW9DLElBOEJuRCxHQUFlLEdBQXlCLElBUTVDLEdBQVEsYUFBZSxHQUl2QixZQUE2QyxFQUFVLENBQ25ELEdBQUksR0FBUyxFQUNULEVBQVcsR0FBSSxJQUF3QixHQUN2QyxFQUFPLFNBQVMsZUFBZSxJQUNuQyxTQUFTLFFBQVEsRUFBTSxDQUFDLGNBQWUsS0FDaEMsVUFBdUIsQ0FDMUIsRUFBUyxDQUFDLEVBQ1YsRUFBSyxLQUFPLEdBNENwQixZQUFrQyxFQUFVLENBQ3hDLE1BQU8sV0FBdUIsQ0FLMUIsR0FBSSxHQUFnQixXQUFXLEVBQWEsR0FJeEMsRUFBaUIsWUFBWSxFQUFhLElBRTlDLFlBQXVCLENBR25CLGFBQWEsR0FDYixjQUFjLEdBQ2QsTUFRWixHQUFRLHlCQUEyQixLQ3ZObkMsd0NBRUEsR0FBSSxJQUFPLEtBRVgsYUFBZ0IsRUFtQmhCLEdBQUksSUFBYSxLQUNiLEdBQVcsR0FDZixZQUFpQixFQUFLLENBQ3BCLEdBQUksQ0FDRixNQUFPLEdBQUksV0FDSixFQUFQLENBQ0EsVUFBYSxFQUNOLElBSVgsWUFBb0IsRUFBSSxFQUFHLENBQ3pCLEdBQUksQ0FDRixNQUFPLEdBQUcsU0FDSCxFQUFQLENBQ0EsVUFBYSxFQUNOLElBR1gsWUFBb0IsRUFBSSxFQUFHLEVBQUcsQ0FDNUIsR0FBSSxDQUNGLEVBQUcsRUFBRyxTQUNDLEVBQVAsQ0FDQSxVQUFhLEVBQ04sSUFJWCxHQUFPLFFBQVUsR0FFakIsWUFBaUIsRUFBSSxDQUNuQixHQUFJLE1BQU8sT0FBUyxTQUNsQixLQUFNLElBQUksV0FBVSx3Q0FFdEIsR0FBSSxNQUFPLElBQU8sV0FDaEIsS0FBTSxJQUFJLFdBQVUsb0RBTXRCLEFBSkEsS0FBSyxJQUFNLEVBQ1gsS0FBSyxJQUFNLEVBQ1gsS0FBSyxJQUFNLEtBQ1gsS0FBSyxJQUFNLEtBQ1AsSUFBTyxJQUNYLEdBQVUsRUFBSSxNQUVoQixHQUFRLElBQU0sS0FDZCxHQUFRLElBQU0sS0FDZCxHQUFRLElBQU0sR0FFZCxHQUFRLFVBQVUsS0FBTyxTQUFTLEVBQWEsRUFBWSxDQUN6RCxHQUFJLEtBQUssY0FBZ0IsR0FDdkIsTUFBTyxJQUFTLEtBQU0sRUFBYSxHQUVyQyxHQUFJLEdBQU0sR0FBSSxJQUFRLElBQ3RCLFVBQU8sS0FBTSxHQUFJLElBQVEsRUFBYSxFQUFZLElBQzNDLEdBR1QsWUFBa0IsRUFBTSxFQUFhLEVBQVksQ0FDL0MsTUFBTyxJQUFJLEdBQUssWUFBWSxTQUFVLEVBQVMsRUFBUSxDQUNyRCxHQUFJLEdBQU0sR0FBSSxJQUFRLElBQ3RCLEVBQUksS0FBSyxFQUFTLEdBQ2xCLEdBQU8sRUFBTSxHQUFJLElBQVEsRUFBYSxFQUFZLE1BR3RELFlBQWdCLEVBQU0sRUFBVSxDQUM5QixLQUFPLEVBQUssTUFBUSxHQUNsQixFQUFPLEVBQUssSUFLZCxHQUhJLEdBQVEsS0FDVixHQUFRLElBQUksR0FFVixFQUFLLE1BQVEsRUFBRyxDQUNsQixHQUFJLEVBQUssTUFBUSxFQUFHLENBQ2xCLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNYLE9BRUYsR0FBSSxFQUFLLE1BQVEsRUFBRyxDQUNsQixFQUFLLElBQU0sRUFDWCxFQUFLLElBQU0sQ0FBQyxFQUFLLElBQUssR0FDdEIsT0FFRixFQUFLLElBQUksS0FBSyxHQUNkLE9BRUYsR0FBZSxFQUFNLEdBR3ZCLFlBQXdCLEVBQU0sRUFBVSxDQUN0QyxHQUFLLFVBQVcsQ0FDZCxHQUFJLEdBQUssRUFBSyxNQUFRLEVBQUksRUFBUyxZQUFjLEVBQVMsV0FDMUQsR0FBSSxJQUFPLEtBQU0sQ0FDZixBQUFJLEVBQUssTUFBUSxFQUNmLEdBQVEsRUFBUyxRQUFTLEVBQUssS0FFL0IsR0FBTyxFQUFTLFFBQVMsRUFBSyxLQUVoQyxPQUVGLEdBQUksR0FBTSxHQUFXLEVBQUksRUFBSyxLQUM5QixBQUFJLElBQVEsR0FDVixHQUFPLEVBQVMsUUFBUyxJQUV6QixHQUFRLEVBQVMsUUFBUyxLQUloQyxZQUFpQixFQUFNLEVBQVUsQ0FFL0IsR0FBSSxJQUFhLEVBQ2YsTUFBTyxJQUNMLEVBQ0EsR0FBSSxXQUFVLDhDQUdsQixHQUNFLEdBQ0MsT0FBTyxJQUFhLFVBQVksTUFBTyxJQUFhLFlBQ3JELENBQ0EsR0FBSSxHQUFPLEdBQVEsR0FDbkIsR0FBSSxJQUFTLEdBQ1gsTUFBTyxJQUFPLEVBQU0sSUFFdEIsR0FDRSxJQUFTLEVBQUssTUFDZCxZQUFvQixJQUNwQixDQUNBLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNYLEdBQU8sR0FDUCxlQUNTLE1BQU8sSUFBUyxXQUFZLENBQ3JDLEdBQVUsRUFBSyxLQUFLLEdBQVcsR0FDL0IsUUFHSixFQUFLLElBQU0sRUFDWCxFQUFLLElBQU0sRUFDWCxHQUFPLEdBR1QsWUFBZ0IsRUFBTSxFQUFVLENBQzlCLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNQLEdBQVEsS0FDVixHQUFRLElBQUksRUFBTSxHQUVwQixHQUFPLEdBRVQsWUFBZ0IsRUFBTSxDQUtwQixHQUpJLEVBQUssTUFBUSxHQUNmLElBQU8sRUFBTSxFQUFLLEtBQ2xCLEVBQUssSUFBTSxNQUVULEVBQUssTUFBUSxFQUFHLENBQ2xCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBSyxJQUFJLE9BQVEsSUFDbkMsR0FBTyxFQUFNLEVBQUssSUFBSSxJQUV4QixFQUFLLElBQU0sTUFJZixZQUFpQixFQUFhLEVBQVksRUFBUSxDQUNoRCxLQUFLLFlBQWMsTUFBTyxJQUFnQixXQUFhLEVBQWMsS0FDckUsS0FBSyxXQUFhLE1BQU8sSUFBZSxXQUFhLEVBQWEsS0FDbEUsS0FBSyxRQUFVLEVBU2pCLFlBQW1CLEVBQUksRUFBUyxDQUM5QixHQUFJLEdBQU8sR0FDUCxFQUFNLEdBQVcsRUFBSSxTQUFVLEVBQU8sQ0FDeEMsQUFBSSxHQUNKLEdBQU8sR0FDUCxHQUFRLEVBQVMsS0FDaEIsU0FBVSxFQUFRLENBQ25CLEFBQUksR0FDSixHQUFPLEdBQ1AsR0FBTyxFQUFTLE1BRWxCLEFBQUksQ0FBQyxHQUFRLElBQVEsSUFDbkIsR0FBTyxHQUNQLEdBQU8sRUFBUyxRQ2xOcEIsd0NBRUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBQ2pCLEdBQVEsVUFBVSxLQUFPLFNBQVUsRUFBYSxFQUFZLENBQzFELEdBQUksR0FBTyxVQUFVLE9BQVMsS0FBSyxLQUFLLE1BQU0sS0FBTSxXQUFhLEtBQ2pFLEVBQUssS0FBSyxLQUFNLFNBQVUsRUFBSyxDQUM3QixXQUFXLFVBQVksQ0FDckIsS0FBTSxJQUNMLFFDVlAsd0NBRUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBQ2pCLEdBQVEsVUFBVSxRQUFhLFNBQVUsRUFBRyxDQUMxQyxNQUFPLE1BQUssS0FBSyxTQUFVLEVBQU8sQ0FDaEMsTUFBTyxJQUFRLFFBQVEsS0FBSyxLQUFLLFVBQVksQ0FDM0MsTUFBTyxNQUVSLFNBQVUsRUFBSyxDQUNoQixNQUFPLElBQVEsUUFBUSxLQUFLLEtBQUssVUFBWSxDQUMzQyxLQUFNLFVDWlosd0NBSUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBSWpCLEdBQUksSUFBTyxHQUFhLElBQ3BCLEdBQVEsR0FBYSxJQUNyQixHQUFPLEdBQWEsTUFDcEIsR0FBWSxHQUFhLFFBQ3pCLEdBQU8sR0FBYSxHQUNwQixHQUFjLEdBQWEsSUFFL0IsWUFBc0IsRUFBTyxDQUMzQixHQUFJLEdBQUksR0FBSSxJQUFRLEdBQVEsS0FDNUIsU0FBRSxJQUFNLEVBQ1IsRUFBRSxJQUFNLEVBQ0QsRUFFVCxHQUFRLFFBQVUsU0FBVSxFQUFPLENBQ2pDLEdBQUksWUFBaUIsSUFBUyxNQUFPLEdBRXJDLEdBQUksSUFBVSxLQUFNLE1BQU8sSUFDM0IsR0FBSSxJQUFVLE9BQVcsTUFBTyxJQUNoQyxHQUFJLElBQVUsR0FBTSxNQUFPLElBQzNCLEdBQUksSUFBVSxHQUFPLE1BQU8sSUFDNUIsR0FBSSxJQUFVLEVBQUcsTUFBTyxJQUN4QixHQUFJLElBQVUsR0FBSSxNQUFPLElBRXpCLEdBQUksTUFBTyxJQUFVLFVBQVksTUFBTyxJQUFVLFdBQ2hELEdBQUksQ0FDRixHQUFJLEdBQU8sRUFBTSxLQUNqQixHQUFJLE1BQU8sSUFBUyxXQUNsQixNQUFPLElBQUksSUFBUSxFQUFLLEtBQUssVUFFeEIsRUFBUCxDQUNBLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sS0FJYixNQUFPLElBQWEsSUFHdEIsR0FBUSxJQUFNLFNBQVUsRUFBSyxDQUMzQixHQUFJLEdBQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxHQUV0QyxNQUFPLElBQUksSUFBUSxTQUFVLEVBQVMsRUFBUSxDQUM1QyxHQUFJLEVBQUssU0FBVyxFQUFHLE1BQU8sR0FBUSxJQUN0QyxHQUFJLEdBQVksRUFBSyxPQUNyQixXQUFhLEVBQUcsRUFBSyxDQUNuQixHQUFJLEdBQVEsT0FBTyxJQUFRLFVBQVksTUFBTyxJQUFRLFlBQ3BELEdBQUksWUFBZSxLQUFXLEVBQUksT0FBUyxHQUFRLFVBQVUsS0FBTSxDQUNqRSxLQUFPLEVBQUksTUFBUSxHQUNqQixFQUFNLEVBQUksSUFFWixHQUFJLEVBQUksTUFBUSxFQUFHLE1BQU8sR0FBSSxFQUFHLEVBQUksS0FDckMsQUFBSSxFQUFJLE1BQVEsR0FBRyxFQUFPLEVBQUksS0FDOUIsRUFBSSxLQUFLLFNBQVUsRUFBSyxDQUN0QixFQUFJLEVBQUcsSUFDTixHQUNILFdBQ0ssQ0FDTCxHQUFJLEdBQU8sRUFBSSxLQUNmLEdBQUksTUFBTyxJQUFTLFdBQVksQ0FDOUIsR0FBSSxHQUFJLEdBQUksSUFBUSxFQUFLLEtBQUssSUFDOUIsRUFBRSxLQUFLLFNBQVUsRUFBSyxDQUNwQixFQUFJLEVBQUcsSUFDTixHQUNILFFBSU4sRUFBSyxHQUFLLEVBQ04sRUFBRSxHQUFjLEdBQ2xCLEVBQVEsR0FHWixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQUssT0FBUSxJQUMvQixFQUFJLEVBQUcsRUFBSyxPQUtsQixHQUFRLE9BQVMsU0FBVSxFQUFPLENBQ2hDLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sTUFJWCxHQUFRLEtBQU8sU0FBVSxFQUFRLENBQy9CLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sUUFBUSxTQUFTLEVBQU0sQ0FDNUIsR0FBUSxRQUFRLEdBQU8sS0FBSyxFQUFTLFFBTzNDLEdBQVEsVUFBVSxNQUFXLFNBQVUsRUFBWSxDQUNqRCxNQUFPLE1BQUssS0FBSyxLQUFNLE1Dekd6Qix3Q0FHQSxHQUFJLElBQVUsS0FFVixHQUFZLEdBR1osR0FBZ0IsR0FDaEIsR0FBb0IsR0FBUSx5QkFBeUIsSUFFekQsYUFBMkIsQ0FDdkIsR0FBSSxHQUFjLE9BQ2QsS0FBTSxJQUFjLFFBWTVCLEdBQU8sUUFBVSxHQUNqQixZQUFjLEVBQU0sQ0FDaEIsR0FBSSxHQUNKLEFBQUksR0FBVSxPQUNWLEVBQVUsR0FBVSxNQUVwQixFQUFVLEdBQUksSUFFbEIsRUFBUSxLQUFPLEVBQ2YsR0FBUSxHQUtaLGFBQW1CLENBQ2YsS0FBSyxLQUFPLEtBS2hCLEdBQVEsVUFBVSxLQUFPLFVBQVksQ0FDakMsR0FBSSxDQUNBLEtBQUssS0FBSyxhQUNMLEVBQVAsQ0FDRSxBQUFJLEdBQUssUUFJTCxHQUFLLFFBQVEsR0FLYixJQUFjLEtBQUssR0FDbkIsYUFFTixDQUNFLEtBQUssS0FBTyxLQUNaLEdBQVUsR0FBVSxRQUFVLFNDL0R0Qyx3Q0FLQSxHQUFJLElBQVUsS0FDVixHQUFPLEtBRVgsR0FBTyxRQUFVLEdBSWpCLEdBQVEsVUFBWSxTQUFVLEVBQUksRUFBZSxDQUMvQyxNQUNFLE9BQU8sSUFBa0IsVUFBWSxJQUFrQixJQUVoRCxHQUFtQixFQUFJLEdBRXZCLEdBQXNCLElBSWpDLEdBQUksSUFDRixnRUFJRixZQUE0QixFQUFJLEVBQWUsQ0FFN0MsT0FESSxHQUFPLEdBQ0YsRUFBSSxFQUFHLEVBQUksRUFBZSxJQUNqQyxFQUFLLEtBQUssSUFBTSxHQUVsQixHQUFJLEdBQU8sQ0FDVCxvQkFBc0IsRUFBSyxLQUFLLEtBQU8sTUFDdkMsbUJBQ0EseUNBQ0EscUJBQ0EsQ0FBQyxRQUFRLE9BQU8sR0FBTSxPQUFPLENBQUMsS0FBYSxLQUFLLEtBQ2hELEtBQ0EsYUFDQSw0REFDQSxpQ0FDQSxlQUNBLE1BQ0EsTUFDQSxLQUFLLElBQ1AsTUFBTyxVQUFTLENBQUMsVUFBVyxNQUFPLEdBQU0sR0FBUyxHQUVwRCxZQUErQixFQUFJLENBR2pDLE9BRkksR0FBVyxLQUFLLElBQUksRUFBRyxPQUFTLEVBQUcsR0FDbkMsRUFBTyxHQUNGLEVBQUksRUFBRyxFQUFJLEVBQVUsSUFDNUIsRUFBSyxLQUFLLElBQU0sR0FFbEIsR0FBSSxHQUFPLENBQ1Qsb0JBQXNCLEVBQUssS0FBSyxLQUFPLE1BQ3ZDLG1CQUNBLFlBQ0Esb0NBQ0EsMEJBQTRCLEVBQVcsTUFDdkMsMENBQ0EsK0NBQ0EsMEJBQ0EsSUFDQSxJQUNBLHlDQUNBLFlBQWMsR0FBYSxJQUMzQixXQUNBLHVCQUNBLEVBQUssT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFVLEVBQUcsRUFBTyxDQUM3QyxNQUNFLFFBQVcsRUFBUyxrQkFDRCxDQUFDLFFBQVEsT0FBTyxFQUFLLE1BQU0sRUFBRyxJQUFRLE9BQU8sTUFBTSxLQUFLLEtBQU8sYUFHbkYsS0FBSyxJQUNSLFdBQ0Esd0JBQ0EsOEJBQ0EsSUFFQSxhQUNBLDREQUNBLGlDQUNBLGVBQ0EsTUFDQSxNQUNBLEtBQUssSUFFUCxNQUFPLFVBQ0wsQ0FBQyxVQUFXLE1BQ1osR0FDQSxHQUFTLEdBR2IsR0FBUSxRQUFVLFNBQVUsRUFBSSxDQUM5QixNQUFPLFdBQVksQ0FDakIsR0FBSSxHQUFPLE1BQU0sVUFBVSxNQUFNLEtBQUssV0FDbEMsRUFDRixNQUFPLEdBQUssRUFBSyxPQUFTLElBQU8sV0FBYSxFQUFLLE1BQVEsS0FDekQsRUFBTSxLQUNWLEdBQUksQ0FDRixNQUFPLEdBQUcsTUFBTSxLQUFNLFdBQVcsUUFBUSxFQUFVLFNBQzVDLEVBQVAsQ0FDQSxHQUFJLElBQWEsTUFBUSxNQUFPLElBQVksWUFDMUMsTUFBTyxJQUFJLElBQVEsU0FBVSxFQUFTLEVBQVEsQ0FDNUMsRUFBTyxLQUdULEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLFFBTzdCLEdBQVEsVUFBVSxRQUFVLFNBQVUsRUFBVSxFQUFLLENBQ25ELEdBQUksTUFBTyxJQUFZLFdBQVksTUFBTyxNQUUxQyxLQUFLLEtBQUssU0FBVSxFQUFPLENBQ3pCLEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLEtBQU0sTUFFMUIsU0FBVSxFQUFLLENBQ2hCLEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLFVDOUh6Qix3Q0FFQSxHQUFJLElBQVUsS0FFZCxHQUFPLFFBQVUsR0FDakIsR0FBUSxrQkFBb0IsVUFBWSxDQUN0QyxHQUFRLFVBQVUsVUFBWSxVQUFXLENBQ3ZDLE1BQU8sTUFBSyxZQUFjLEdBRzVCLEdBQVEsVUFBVSxZQUFjLFVBQVcsQ0FDekMsTUFBTyxNQUFLLFlBQWMsR0FHNUIsR0FBUSxVQUFVLFdBQWEsVUFBVyxDQUN4QyxNQUFPLE1BQUssWUFBYyxHQUc1QixHQUFRLFVBQVUsU0FBVyxVQUFZLENBQ3ZDLEdBQUksS0FBSyxNQUFRLEVBQ2YsTUFBTyxNQUFLLElBQUksV0FHbEIsR0FBSSxDQUFDLEtBQUssY0FDUixLQUFNLElBQUksT0FBTSxpREFHbEIsTUFBTyxNQUFLLEtBR2QsR0FBUSxVQUFVLFVBQVksVUFBWSxDQUN4QyxHQUFJLEtBQUssTUFBUSxFQUNmLE1BQU8sTUFBSyxJQUFJLFlBR2xCLEdBQUksQ0FBQyxLQUFLLGFBQ1IsS0FBTSxJQUFJLE9BQU0sNERBR2xCLE1BQU8sTUFBSyxLQUdkLEdBQVEsVUFBVSxTQUFXLFVBQVksQ0FDdkMsTUFBSSxNQUFLLE1BQVEsRUFDUixLQUFLLElBQUksV0FFZCxLQUFLLE1BQVEsSUFBTSxLQUFLLE1BQVEsR0FDM0IsRUFHRixLQUFLLE1BSWhCLEdBQVEsbUJBQXFCLFVBQVcsQ0FDdEMsR0FBUSxVQUFVLFVBQVksT0FDOUIsR0FBUSxVQUFVLFlBQWMsT0FDaEMsR0FBUSxVQUFVLFdBQWEsT0FDL0IsR0FBUSxVQUFVLFNBQVcsT0FDN0IsR0FBUSxVQUFVLFVBQVksT0FDOUIsR0FBUSxVQUFVLFNBQVcsVUM1RC9CLHdDQUVBLEdBQU8sUUFBVSxLQUNqQixLQUNBLEtBQ0EsS0FDQSxLQUNBLE9DUEEsd0NBRUEsR0FBTyxRQUFVLE9DRmpCLDhCQUFPLFFBQVUsR0FDakIsR0FBTyxRQUFRLFFBQVUsR0FFekIsWUFBbUIsRUFBSyxDQUN0QixNQUFPLENBQUMsQ0FBQyxHQUFRLE9BQU8sSUFBUSxVQUFZLE1BQU8sSUFBUSxhQUFlLE1BQU8sR0FBSSxNQUFTLGNDSmhHLHdDQUVBLEdBQUksSUFBSyxLQUNMLEdBQVMsS0FDVCxHQUFVLEtBQ1YsR0FBWSxLQUVaLEdBQU0sR0FBTyxRQUFVLFNBQVUsRUFBYSxDQUNoRCxNQUFPLElBQUksSUFBWSxJQUV6QixHQUFHLFlBQWMsR0FDakIsR0FBRyxZQUFjLEdBQ2pCLEdBQUcsaUJBQW1CLEdBQ3RCLEdBQUcsVUFBWSxHQUNmLEdBQUcsZUFBaUIsR0FDcEIsQUFBSSxHQUFHLFNBQ0wsSUFBRyxTQUFXLEdBQVEsVUFBVSxHQUFHLFVBQ25DLEdBQUcsYUFBZSxHQUFHLGNBRXJCLElBQUcsU0FBVyxVQUFZLENBQUUsS0FBTSxJQUFJLE9BQU0sNEJBQzVDLEdBQUcsYUFBZSxVQUFZLENBQUUsS0FBTSxJQUFJLE9BQU0saUNBR2xELFlBQXFCLEVBQVEsQ0FDM0IsR0FBSSxNQUFPLElBQVcsV0FDcEIsTUFBTyxDQUFDLEdBQUksRUFBUSxhQUFjLElBQzdCLEdBQUksR0FBVSxNQUFPLElBQVcsVUFBWSxNQUFPLEdBQU8sSUFBTyxXQUFZLENBQ2xGLEdBQUksZ0JBQWtCLElBQ3BCLEdBQUksQ0FBQyxNQUFNLFFBQVEsRUFBTyxjQUN4QixLQUFNLElBQUksT0FBTSxtRUFHbEIsR0FBTyxhQUFlLEdBRXhCLE1BQU8sT0FFUCxNQUFNLElBQUksT0FBTSx5Q0FHcEIsWUFBMEIsRUFBUSxFQUFJLENBQ3BDLE1BQU8sSUFBUSxRQUFRLEdBQVEsS0FBSyxTQUFVLEVBQVEsQ0FDcEQsTUFBSSxJQUFVLEdBQVUsRUFBTyxJQUN0QixFQUFPLEdBQUcsS0FBSyxTQUFVLEVBQUksQ0FDbEMsU0FBTyxHQUFLLEVBQ0wsSUFHSixJQUNOLEtBQUssR0FBRyxhQUFhLFFBQVEsR0FFbEMsWUFBbUIsRUFBUSxDQUN6QixHQUFJLE1BQU8sSUFBVyxTQUNwQixNQUFPLENBQUMsS0FBTSxFQUFRLGFBQWMsSUFDL0IsR0FBSSxHQUFVLE1BQU8sSUFBVyxVQUFZLE1BQU8sR0FBTyxNQUFTLFNBQVUsQ0FDbEYsR0FBSSxnQkFBa0IsSUFDcEIsR0FBSSxDQUFDLE1BQU0sUUFBUSxFQUFPLGNBQ3hCLEtBQU0sSUFBSSxPQUFNLG1FQUdsQixHQUFPLGFBQWUsR0FFeEIsTUFBTyxPQUVQLE1BQU0sSUFBSSxPQUFNLHlDQUdwQixZQUF3QixFQUFRLEVBQUksQ0FDbEMsTUFBTyxJQUFRLFFBQVEsR0FBUSxLQUFLLFNBQVUsRUFBUSxDQUNwRCxNQUFJLElBQVUsR0FBVSxFQUFPLE1BQ3RCLEVBQU8sS0FBSyxLQUFLLFNBQVUsRUFBTSxDQUN0QyxTQUFPLEtBQU8sRUFDUCxJQUdKLElBQ04sS0FBSyxHQUFHLFdBQVcsUUFBUSxHQUdoQyxZQUFxQixFQUFJLENBQ3ZCLEdBQU8sRUFBSSxpQ0FDWCxHQUFPLE1BQU8sR0FBRyxNQUFTLFNBQVUsZ0NBQ3BDLEdBQU8sTUFBTyxHQUFHLGNBQWlCLFNBQVUsMENBQzVDLEdBQU8sQ0FDTCxVQUNBLGVBQ0EsY0FDQSxtQkFDQSxnQkFDQSxxQkFDQSxvQkFDQSx5QkFDQSxTQUNBLGNBQ0EsYUFDQSxtQkFDQSxLQUFLLFNBQVUsRUFBUSxDQUN2QixNQUFPLE9BQU8sR0FBRyxJQUFZLGFBQzNCLHFFQUNKLEtBQUssSUFBTSxFQUNYLEtBQUssS0FBTyxLQUFLLElBQUksS0FDckIsS0FBSyxhQUFlLEtBQUssSUFBSSxhQUM3QixLQUFLLGFBQWUsS0FBSyxJQUFJLGNBQWdCLENBQUMsS0FBSyxNQUdyRCxHQUFJLElBQVksQ0FDZCxRQUFTLENBQUMsVUFBVyxVQUNyQixhQUFjLENBQUMsZUFBZ0IsVUFBVyxVQUMxQyxZQUFhLENBQUMsY0FBZSxVQUFXLGFBQWMsVUFDdEQsaUJBQWtCLENBQ2hCLG1CQUFvQixjQUFlLGVBQWdCLFVBQ25ELGFBQWMsVUFFaEIsY0FBZSxDQUFDLGlCQUNoQixtQkFBb0IsQ0FBQyxxQkFBc0IsaUJBQzNDLGtCQUFtQixDQUFDLG9CQUFxQixpQkFDekMsdUJBQXdCLENBQ3RCLHlCQUEwQixvQkFBcUIscUJBQXNCLGlCQUV2RSxPQUFRLENBQUMsU0FBVSxXQUNuQixZQUFhLENBQUMsY0FBZSxTQUFVLGVBQWdCLFdBQ3ZELFdBQVksQ0FBQyxhQUFjLFNBQVUsY0FBZSxXQUNwRCxnQkFBaUIsQ0FDZixrQkFBbUIsYUFBYyxjQUFlLFNBQ2hELG1CQUFvQixjQUFlLGVBQWdCLFlBSXZELEdBQVksVUFBVSxXQUFhLFNBQVUsRUFBUSxDQUNuRCxNQUFPLE9BQU8sTUFBSyxJQUFJLElBQVksWUFFckMsR0FBWSxVQUFVLElBQU0sU0FBVSxFQUFRLENBQzVDLE1BQU8sSUFBVSxHQUFRLEtBQUssU0FBVSxFQUFRLENBQzlDLE1BQU8sTUFBSyxXQUFXLElBQ3ZCLEtBQUssUUFLVCxHQUFZLFVBQVUsUUFBVSxTQUFVLEVBQUssRUFBUyxDQUN0RCxHQUFJLENBQUMsS0FBSyxXQUFXLFdBQVksQ0FDL0IsR0FBSSxLQUFLLElBQUksVUFBVyxDQUN0QixHQUFJLEdBQVEsS0FDWixNQUFPLENBQ0wsR0FBSSxTQUFVLEVBQVEsQ0FDcEIsTUFBTyxJQUFHLFVBQVUsRUFBTSxJQUFJLE9BQU8sRUFBSyxFQUFTLElBQVMsTUFFOUQsYUFBYyxJQUdsQixLQUFJLE1BQUssSUFBSSxnQkFDTCxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyw4Q0FDdkMsS0FBSyxJQUFJLG9CQUNaLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhDQUUxQyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyxrQ0FHcEQsTUFBTyxJQUFHLFlBQVksS0FBSyxJQUFJLFFBQVEsRUFBSyxLQUU5QyxHQUFZLFVBQVUsYUFBZSxTQUFVLEVBQUssRUFBUyxFQUFJLENBQy9ELE1BQUssTUFBSyxJQUFJLGdCQUdWLEtBQUssV0FBVyxnQkFDWCxHQUFHLGlCQUFpQixLQUFLLElBQUksYUFBYSxFQUFLLEdBQVUsR0FFekQsR0FBRyxpQkFBaUIsS0FBSyxRQUFRLEVBQUssR0FBVSxHQUxoRCxHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBQStDLFFBQVEsSUFRM0gsR0FBWSxVQUFVLFlBQWMsU0FBVSxFQUFVLEVBQVMsQ0FDL0QsR0FBSSxDQUFDLEtBQUssSUFBSSxlQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sOENBRWxELE1BQUksTUFBSyxXQUFXLGVBQ1gsR0FBRyxZQUFZLEtBQUssSUFBSSxZQUFZLEVBQVUsSUFDNUMsS0FBSyxXQUFXLGNBQ2xCLEdBQUcsWUFBWSxTQUFVLEVBQVEsQ0FDdEMsTUFBTyxJQUFHLFVBQVUsS0FBSyxJQUFJLFdBQVcsRUFBVSxFQUFTLElBQVMsTUFDcEUsS0FBSyxPQUVGLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsS0FBSyxRQUFRLEdBQUcsYUFBYSxFQUFVLFFBQVMsS0FHM0QsR0FBWSxVQUFVLGlCQUFtQixTQUFVLEVBQVUsRUFBUyxFQUFJLENBQ3hFLE1BQUssTUFBSyxJQUFJLG9CQUdWLEtBQUssV0FBVyxvQkFDWCxHQUFHLGlCQUFpQixLQUFLLElBQUksaUJBQWlCLEVBQVUsR0FBVSxHQUNoRSxLQUFLLFdBQVcsZ0JBQWtCLEtBQUssV0FBVyxjQUNwRCxHQUFHLGlCQUFpQixLQUFLLFlBQVksRUFBVSxHQUFVLEdBRTNELElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxpQkFBaUIsR0FBRyxTQUFTLEVBQVUsUUFBUSxLQUFLLFNBQVUsRUFBSyxDQUMzRSxNQUFJLE1BQUssV0FBVyxnQkFDWCxLQUFLLElBQUksYUFBYSxFQUFLLEdBRTNCLEtBQUssUUFBUSxFQUFLLElBRTNCLEtBQUssT0FBUSxJQWZSLEdBQVEsT0FBTyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyxvQ0FzQnBFLEdBQVksVUFBVSxjQUFnQixTQUFVLEVBQUssRUFBUyxDQUM1RCxHQUFJLENBQUMsS0FBSyxJQUFJLGlCQUNaLEtBQUksTUFBSyxJQUFJLHNCQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhEQUN2QyxLQUFLLElBQUksMEJBQ1osR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sOERBRTFDLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLCtDQUdwRCxNQUFPLElBQUcsVUFBVSxLQUFLLElBQUksY0FBYyxFQUFLLEtBRWxELEdBQVksVUFBVSxtQkFBcUIsU0FBVSxFQUFLLEVBQVMsRUFBSSxDQUNyRSxNQUFLLE1BQUssSUFBSSxzQkFPVixLQUFLLFdBQVcsc0JBQ1gsR0FBRyxlQUFlLEtBQUssSUFBSSxtQkFBbUIsRUFBSyxHQUFVLEdBRTdELEdBQUcsZUFBZSxLQUFLLElBQUksY0FBYyxFQUFLLEdBQVUsR0FUM0QsS0FBSyxJQUFJLDBCQUNKLEdBQVEsT0FBTyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrREFBK0QsUUFBUSxHQUVoSSxHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sZ0RBQWdELFFBQVEsSUFTOUgsR0FBWSxVQUFVLGtCQUFvQixTQUFVLEVBQVUsRUFBUyxDQUNyRSxHQUFJLENBQUMsS0FBSyxJQUFJLHFCQUNaLEtBQUksTUFBSyxJQUFJLDBCQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhEQUUxQyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrQ0FHcEQsTUFBSSxNQUFLLFdBQVcscUJBQ1gsR0FBRyxVQUFVLEtBQUssSUFBSSxrQkFBa0IsRUFBVSxJQUVwRCxJQUFTLEdBQVUsSUFDcEIsRUFBUSxXQUFhLFFBQVcsR0FBUSxTQUFXLEdBQ2hELEdBQUcsVUFBVSxLQUFLLElBQUksY0FBYyxHQUFHLGFBQWEsRUFBVSxRQUFTLE1BR2xGLEdBQVksVUFBVSx1QkFBeUIsU0FBVSxFQUFVLEVBQVMsRUFBSSxDQUM5RSxNQUFLLE1BQUssSUFBSSwwQkFHVixLQUFLLFdBQVcsMEJBQ1gsR0FBRyxlQUFlLEtBQUssSUFBSSx1QkFBdUIsRUFBVSxHQUFVLEdBQ3BFLEtBQUssV0FBVyxxQkFDbEIsR0FBRyxlQUFlLEtBQUssSUFBSSxrQkFBa0IsRUFBVSxHQUFVLEdBRW5FLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxlQUFlLEdBQUcsU0FBUyxFQUFVLFFBQVEsS0FBSyxTQUFVLEVBQUssQ0FDekUsTUFBSSxNQUFLLFdBQVcsc0JBQ1gsS0FBSyxJQUFJLG1CQUFtQixFQUFLLEdBRWpDLEtBQUssSUFBSSxjQUFjLEVBQUssSUFFckMsS0FBSyxPQUFRLElBZlIsR0FBUSxPQUFPLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGdEQUFnRCxRQUFRLElBcUI1SCxHQUFZLFVBQVUsT0FBUyxTQUFVLEVBQUssRUFBUyxFQUFRLENBQzdELEdBQUksQ0FBQyxLQUFLLElBQUksVUFDWixLQUFJLE1BQUssSUFBSSxlQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLCtDQUN2QyxLQUFLLElBQUksbUJBQ1osR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBRTFDLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGdDQUdwRCxHQUFJLEtBQUssV0FBVyxVQUNsQixNQUFPLElBQUcsVUFBVSxLQUFLLElBQUksT0FBTyxFQUFLLEVBQVMsSUFFbEQsR0FBSSxHQUFXLEdBQUcsWUFBWSxLQUFLLElBQUksUUFBUSxFQUFLLElBQ2hELEVBQU8sRUFBUyxHQUFHLEdBQVUsR0FDakMsR0FBSSxNQUFPLElBQVMsU0FDbEIsS0FBTSxJQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrQ0FFbEQsTUFBTyxJQUFHLFVBQVUsQ0FBQyxLQUFNLEVBQU0sYUFBYyxFQUFTLGdCQUc1RCxHQUFZLFVBQVUsWUFBYyxTQUFVLEVBQUssRUFBUyxFQUFRLEVBQUksQ0FLdEUsTUFKSSxPQUFPLElBQVcsWUFDcEIsR0FBSyxFQUNMLEVBQVMsR0FFUCxBQUFDLEtBQUssSUFBSSxlQU9WLEtBQUssV0FBVyxlQUNYLEdBQUcsZUFBZSxLQUFLLElBQUksWUFBWSxFQUFLLEVBQVMsR0FBUyxHQUM1RCxLQUFLLFdBQVcsVUFDbEIsR0FBRyxlQUFlLEtBQUssSUFBSSxPQUFPLEVBQUssRUFBUyxHQUFTLEdBRXpELEdBQUcsZUFBZSxLQUFLLGFBQWEsRUFBSyxHQUFTLEtBQUssU0FBVSxFQUFVLENBQ2hGLE1BQU8sQ0FBQyxLQUFNLEVBQVMsR0FBRyxHQUFVLEdBQVUsYUFBYyxFQUFTLGdCQUNuRSxHQWJBLEtBQUssSUFBSSxtQkFDSixHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sZ0RBQWdELFFBQVEsR0FFakgsR0FBUSxPQUFPLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGlDQUFpQyxRQUFRLElBYS9HLEdBQVksVUFBVSxXQUFhLFNBQVUsRUFBVSxFQUFTLEVBQVEsQ0FDdEUsR0FBSSxDQUFDLEtBQUssSUFBSSxjQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBR2xELEdBQUksS0FBSyxXQUFXLGNBQ2xCLE1BQU8sSUFBRyxVQUFVLEtBQUssSUFBSSxXQUFXLEVBQVUsRUFBUyxJQUN0RCxHQUFJLEtBQUssV0FBVyxVQUN6QixNQUFLLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxVQUFVLEtBQUssSUFBSSxPQUFPLEdBQUcsYUFBYSxFQUFVLFFBQVMsRUFBUyxJQUVoRixHQUFJLEdBQVcsS0FBSyxZQUFZLEVBQVUsR0FDMUMsTUFBTyxJQUFHLFVBQVUsQ0FBQyxLQUFNLEVBQVMsR0FBRyxHQUFVLEdBQVUsYUFBYyxFQUFTLGdCQUd0RixHQUFZLFVBQVUsZ0JBQWtCLFNBQVUsRUFBVSxFQUFTLEVBQVEsRUFBSSxDQUMvRSxHQUFJLENBQUMsS0FBSyxJQUFJLG1CQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8saUNBT2xELE1BSkksT0FBTyxJQUFXLFlBQ3BCLEdBQUssRUFDTCxFQUFTLEdBRVAsS0FBSyxXQUFXLG1CQUNYLEdBQUcsZUFBZSxLQUFLLElBQUksZ0JBQWdCLEVBQVUsRUFBUyxHQUFTLEdBQ3JFLEtBQUssV0FBVyxjQUNsQixHQUFHLGVBQWUsS0FBSyxJQUFJLFdBQVcsRUFBVSxFQUFTLEdBQVMsR0FDaEUsS0FBSyxXQUFXLFlBQWMsS0FBSyxXQUFXLGlCQUMzQyxLQUFLLFdBQVcsZ0JBQWtCLEtBQUssV0FBVyxvQkFDdkQsR0FBRyxlQUFlLEtBQUssaUJBQWlCLEVBQVUsR0FBUyxLQUFLLFNBQVUsRUFBVSxDQUN6RixNQUFPLENBQUMsS0FBTSxFQUFTLEdBQUcsR0FBVSxHQUFVLGFBQWMsRUFBUyxnQkFDbkUsR0FFQyxJQUFTLEdBQVUsSUFDcEIsRUFBUSxXQUFhLFFBQVcsR0FBUSxTQUFXLEdBQ2hELEdBQUcsZUFBZSxHQUFHLFNBQVMsRUFBVSxRQUFRLEtBQUssU0FBVSxFQUFLLENBQ3pFLE1BQU8sTUFBSyxZQUFZLEVBQUssRUFBUyxJQUN0QyxLQUFLLE9BQVEsT0NwV25CLCtSQXlCTyxhQUFzQixDQUMzQixHQUFJLE1BQU8sS0FBZ0IsWUFBYSxDQUN0QyxHQUFJLEdBQUksR0FBSSxhQUFZLEdBQ3BCLEVBQUksR0FBSSxZQUFXLEdBQ25CLEVBQUksR0FBSSxhQUFZLEdBR3hCLEdBRkEsRUFBRSxHQUFLLEVBQ1AsRUFBRSxHQUFLLEVBQ0gsRUFBRSxLQUFPLElBQ1gsR0FBYyxhQUNMLEVBQUUsS0FBTyxJQUNsQixHQUFjLFNBRWQsTUFBTSxJQUFJLE9BQU0sa0NBR3BCLE1BQU8sSUFHRixhQUFvQixDQUN6QixNQUFJLE9BQU8sUUFBTyxVQUFhLFlBQ3RCLE9BQU8sU0FBUyxTQUNYLEdBR1QsYUFBbUIsQ0FDeEIsTUFBTyxHQUdGLGFBQWtCLENBQ3ZCLE1BQU8sR0FHRixhQUFtQixDQUN4QixNQUFPLFFBQU8sVUFHVCxhQUFvQixDQUN6QixNQUFPLFFBQU8sVUFHVCxhQUFnQixDQUNyQixNQUFPLEdBR0YsYUFBZ0IsQ0FDckIsTUFBTyxVQUdGLGFBQW9CLENBQ3pCLE1BQUksT0FBTyxRQUFPLFdBQWMsWUFDdkIsT0FBTyxVQUFVLFdBRW5CLEdBR0YsYUFBNEIsRUFDNUIsYUFBK0IsRUFFL0IsYUFBZ0IsQ0FDckIsTUFBTyxhQUdGLGFBQW9CLENBQ3pCLE1BQU8sVUFHRixhQUFrQixDQUN2QixNQUFPLE9BNUZULEdBd0JJLElBc0VPLEdBRUEsR0FDSixHQWpHUCxtQkE4Rk8sQUFBSSxHQUFTLEdBRVQsR0FBTTtBQUFBLEVBQ1YsR0FBUSxDQUNiLElBQUssR0FDTCxPQUFRLEdBQ1IsT0FBUSxHQUNSLGtCQUFrQixHQUNsQixxQkFBc0IsR0FDdEIsUUFBUyxHQUNULEtBQU0sR0FDTixLQUFNLEdBQ04sU0FBVSxHQUNWLFFBQVMsR0FDVCxPQUFRLEdBQ1IsUUFBUyxHQUNULFNBQVUsR0FDVixXQUFZLE1DL0dkLDJCQUNBLEdBQU0sSUFBVyxVQUVqQixHQUFJLElBQVksR0FBUyxRQUFTLENBQzlCLEdBQU8sUUFBVSxHQUFTLFFBQzFCLE9BQVMsS0FBSyxJQUNWLEdBQU8sUUFBUSxHQUFLLEdBQVMsT0FFOUIsQUFBSSxLQUNQLElBQU8sUUFBVSxNQ1RyQix3Q0FFQSxHQUFJLElBQUssS0FJVCxHQUFPLFFBQVUsR0FBRyxTQUFXLFVBQW1CLENBQzlDLEdBQUksR0FBTyxFQUFRLElBQUksS0FDbkIsRUFBTyxFQUFRLElBQUksU0FBVyxFQUFRLElBQUksTUFBUSxFQUFRLElBQUksT0FBUyxFQUFRLElBQUksU0FFdkYsTUFBSSxHQUFRLFdBQWEsUUFDZCxFQUFRLElBQUksYUFBZSxFQUFRLElBQUksVUFBWSxFQUFRLElBQUksVUFBWSxHQUFRLEtBRzFGLEVBQVEsV0FBYSxTQUNkLEdBQVMsR0FBTyxVQUFZLEVBQU8sTUFHMUMsRUFBUSxXQUFhLFFBQ2QsR0FBUyxHQUFRLFdBQWEsRUFBSSxRQUFXLEVBQU8sU0FBVyxFQUFPLE1BRzFFLEdBQVEsUUN0Qm5CLDhCQUFPLFFBQVUsVUFBWSxDQUV6QixHQUFJLEdBQXdCLE1BQU0sa0JBQ2xDLE1BQU0sa0JBQW9CLFNBQVUsRUFBRyxFQUFPLENBQUUsTUFBTyxJQUN2RCxHQUFJLEdBQVMsR0FBSSxTQUFTLE1BQzFCLGFBQU0sa0JBQW9CLEVBQ25CLEVBQU0sR0FBRyxpQkNOcEIsd0NBRUEsR0FBSSxJQUFZLEVBQVEsV0FBYSxRQUdqQyxHQUNBLDZIQUVBLEdBQVEsR0FFWixZQUF3QixFQUFVLENBQ2hDLE1BQU8sSUFBZSxLQUFLLEdBQVUsTUFBTSxHQUc3QyxHQUFNLE1BQVEsU0FBUyxFQUFZLENBQ2pDLEdBQUksTUFBTyxJQUFlLFNBQ3hCLEtBQU0sSUFBSSxXQUNOLGdEQUFrRCxNQUFPLElBRy9ELEdBQUksR0FBVyxHQUFlLEdBQzlCLEdBQUksQ0FBQyxHQUFZLEVBQVMsU0FBVyxFQUNuQyxLQUFNLElBQUksV0FBVSxpQkFBbUIsRUFBYSxLQUV0RCxNQUFPLENBQ0wsS0FBTSxFQUFTLEdBQ2YsSUFBSyxFQUFTLEtBQU8sRUFBUyxHQUFLLEVBQVMsR0FBSyxFQUFTLEdBQUcsTUFBTSxFQUFHLElBQ3RFLEtBQU0sRUFBUyxHQUNmLElBQUssRUFBUyxHQUNkLEtBQU0sRUFBUyxLQVFuQixHQUFJLElBQ0EsOERBQ0EsR0FBUSxHQUdaLFlBQXdCLEVBQVUsQ0FDaEMsTUFBTyxJQUFZLEtBQUssR0FBVSxNQUFNLEdBSTFDLEdBQU0sTUFBUSxTQUFTLEVBQVksQ0FDakMsR0FBSSxNQUFPLElBQWUsU0FDeEIsS0FBTSxJQUFJLFdBQ04sZ0RBQWtELE1BQU8sSUFHL0QsR0FBSSxHQUFXLEdBQWUsR0FDOUIsR0FBSSxDQUFDLEdBQVksRUFBUyxTQUFXLEVBQ25DLEtBQU0sSUFBSSxXQUFVLGlCQUFtQixFQUFhLEtBR3RELE1BQU8sQ0FDTCxLQUFNLEVBQVMsR0FDZixJQUFLLEVBQVMsR0FBRyxNQUFNLEVBQUcsSUFDMUIsS0FBTSxFQUFTLEdBQ2YsSUFBSyxFQUFTLEdBQ2QsS0FBTSxFQUFTLEtBS25CLEFBQUksR0FDRixHQUFPLFFBQVUsR0FBTSxNQUV2QixHQUFPLFFBQVUsR0FBTSxNQUV6QixHQUFPLFFBQVEsTUFBUSxHQUFNLE1BQzdCLEdBQU8sUUFBUSxNQUFRLEdBQU0sUUMxRTdCLDhCQUFJLElBQU8sS0FDUCxHQUFRLEdBQUssT0FBUyxLQUV0QixHQUFxQixTQUE0QixFQUFlLEVBQVMsQ0FDekUsR0FBSSxHQUFTLElBQ2IsQUFBSyxlQUFnQixLQUFLLEdBQ3RCLEVBQVMsR0FDRCxRQUFTLEtBQUssSUFDdEIsR0FBUyxRQUtiLE9BRkksR0FBUSxDQUFDLEdBQ1QsRUFBUyxHQUFNLEdBQ1osRUFBTyxNQUFRLEVBQU0sRUFBTSxPQUFTLElBQ3ZDLEVBQU0sS0FBSyxFQUFPLEtBQ2xCLEVBQVMsR0FBTSxFQUFPLEtBRzFCLE1BQU8sR0FBTSxPQUFPLFNBQVUsRUFBTSxFQUFPLENBQ3ZDLE1BQU8sR0FBSyxPQUFPLEVBQVEsSUFBSSxTQUFVLEVBQVcsQ0FDaEQsTUFBTyxJQUFLLFFBQVEsRUFBUSxFQUFPLE9BRXhDLEtBR1AsR0FBTyxRQUFVLFNBQTBCLEVBQU8sRUFBTSxFQUFTLENBQzdELEdBQUksR0FBVSxHQUFRLEVBQUssZ0JBQ3JCLEdBQUcsT0FBTyxFQUFLLGlCQUNmLENBQUMsZ0JBRVAsR0FBSSxHQUFRLE1BQU8sR0FBSyxPQUFVLFdBQzlCLE1BQU8sR0FBSyxNQUNSLEVBQ0EsRUFDQSxVQUFZLENBQUUsTUFBTyxJQUFtQixFQUFPLElBQy9DLEdBSVIsR0FBSSxHQUFPLEdBQW1CLEVBQU8sR0FDckMsTUFBTyxJQUFRLEVBQUssTUFBUSxFQUFLLE9BQU8sRUFBSyxPQUFTLEtDeEMxRCw4QkFBTyxRQUFVLFNBQVUsRUFBRyxFQUFNLENBUWhDLE1BQU8sSUFBUSxvNkpDUm5CLHdDQUVBLEdBQUksSUFBTSxLQUVWLFlBQTJCLEVBQVMsRUFBVyxDQU05QyxPQUxJLEdBQVksRUFBUSxNQUFNLEtBQzFCLEVBQVEsRUFBVSxNQUFNLEtBQ3hCLEVBQUssRUFBTSxPQUFTLEVBQUksRUFBTSxHQUFLLElBQ25DLEVBQWdCLEdBQU0sT0FBUyxFQUFJLEVBQU0sR0FBSyxFQUFNLElBQUksTUFBTSxLQUV6RCxFQUFJLEVBQUcsRUFBSSxFQUFHLEVBQUUsRUFBRyxDQUMzQixHQUFJLEdBQU0sU0FBUyxFQUFVLElBQU0sRUFBRyxJQUNsQyxFQUFNLFNBQVMsRUFBYSxJQUFNLEVBQUcsSUFDekMsR0FBSSxJQUFRLEVBR1osTUFBSSxLQUFPLElBQ0gsRUFBTSxFQUVWLElBQU8sS0FDSCxHQUFPLEVBRVIsR0FFUixNQUFPLEtBQU8sS0FHZixZQUFzQixFQUFTLEVBQU8sQ0FDckMsR0FBSSxHQUFhLEVBQU0sTUFBTSxVQUM3QixHQUFJLEVBQVcsU0FBVyxFQUN6QixNQUFPLEdBRVIsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFXLE9BQVEsRUFBRSxFQUN4QyxHQUFJLENBQUMsR0FBa0IsRUFBUyxFQUFXLElBQzFDLE1BQU8sR0FHVCxNQUFPLEdBR1IsWUFBeUIsRUFBYSxFQUFnQixDQUNyRCxHQUFJLE1BQU8sSUFBbUIsVUFDN0IsTUFBTyxHQUdSLEdBQUksR0FBVSxNQUFPLElBQWdCLFlBQ2xDLEVBQVEsVUFBWSxFQUFRLFNBQVMsS0FDckMsRUFFSCxHQUFJLE1BQU8sSUFBWSxTQUN0QixNQUFPLEdBR1IsR0FBSSxHQUFrQixNQUFPLElBQW1CLFNBQVUsQ0FDekQsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFlLE9BQVEsRUFBRSxFQUM1QyxHQUFJLEdBQWEsRUFBUyxFQUFlLElBQ3hDLE1BQU8sR0FHVCxNQUFPLEdBRVIsTUFBTyxJQUFhLEVBQVMsR0FHOUIsR0FBSSxJQUFPLEtBRVgsR0FBTyxRQUFVLFNBQWdCLEVBQUcsRUFBYSxDQUNoRCxNQUFPLElBQUksR0FBTSxJQUFNLEdBQWdCLEVBQWEsR0FBSyxPQ25FMUQsOEJBQUksSUFBSyxLQUNMLEdBQWEsS0FDYixHQUFPLEtBQ1AsR0FBUyxLQUNULEdBQW1CLEtBQ25CLEdBQW1CLEtBQ25CLEdBQVMsS0FFVCxHQUFhLEVBQVEsV0FBYSxTQUFXLEdBQUcsVUFBWSxNQUFPLElBQUcsU0FBUyxRQUFXLFdBQWEsR0FBRyxTQUFTLE9BQVMsR0FBRyxTQUUvSCxHQUFVLEtBQ1YsR0FBZSxVQUFZLENBQzNCLE1BQU8sQ0FDSCxHQUFLLEtBQUssR0FBUyxpQkFDbkIsR0FBSyxLQUFLLEdBQVMscUJBSXZCLEdBQWdCLFNBQWdCLEVBQU0sRUFBSSxDQUMxQyxHQUFHLEtBQUssRUFBTSxTQUFVLEVBQUssRUFBTSxDQUMvQixNQUFLLEdBR0QsRUFBSSxPQUFTLFVBQVksRUFBSSxPQUFTLFVBQWtCLEVBQUcsS0FBTSxJQUM5RCxFQUFHLEdBSEMsRUFBRyxLQUFNLEVBQUssVUFBWSxFQUFLLGFBTzlDLEdBQWUsU0FBcUIsRUFBSyxFQUFJLENBQzdDLEdBQUcsS0FBSyxFQUFLLFNBQVUsRUFBSyxFQUFNLENBQzlCLE1BQUssR0FHRCxFQUFJLE9BQVMsVUFBWSxFQUFJLE9BQVMsVUFBa0IsRUFBRyxLQUFNLElBQzlELEVBQUcsR0FIQyxFQUFHLEtBQU0sRUFBSyxrQkFPN0IsR0FBa0IsU0FBa0IsRUFBRyxFQUFJLENBQzNDLEdBQVcsRUFBRyxTQUFVLEVBQWEsRUFBVSxDQUMzQyxBQUFJLEdBQWUsRUFBWSxPQUFTLFNBQVUsRUFBRyxHQUNoRCxFQUFHLEtBQU0sRUFBYyxFQUFJLE1BSXBDLEdBQWdCLFNBQXVCLEVBQVUsRUFBRyxFQUFNLEVBQUksQ0FDOUQsQUFBSSxHQUFRLEVBQUssbUJBQXFCLEdBQ2xDLEVBQVMsRUFBRyxHQUVaLEVBQUcsS0FBTSxJQUliLEdBQXFCLFNBQTRCLEVBQVUsRUFBUyxFQUFJLENBQ3hFLEVBQVMsRUFBUyxTQUFVLEVBQWEsRUFBTSxDQUMzQyxHQUFJLEVBQWEsRUFBRyxPQUVoQixJQUFJLENBQ0EsR0FBSSxHQUFNLEtBQUssTUFBTSxHQUNyQixFQUFHLEtBQU0sU0FDSixFQUFQLENBQ0UsRUFBRyxVQU1mLEdBQXVCLFNBQThCLEVBQUcsRUFBTyxFQUFNLENBRXJFLE9BREksR0FBTyxHQUFpQixFQUFPLEVBQU0sR0FDaEMsRUFBSSxFQUFHLEVBQUksRUFBSyxPQUFRLElBQzdCLEVBQUssR0FBSyxHQUFLLEtBQUssRUFBSyxHQUFJLEdBRWpDLE1BQU8sSUFHWCxHQUFPLFFBQVUsU0FBaUIsRUFBRyxFQUFTLEVBQVUsQ0FDcEQsR0FBSSxHQUFLLEVBQ0wsRUFBTyxFQUtYLEdBSkksTUFBTyxJQUFZLFlBQ25CLEdBQUssRUFDTCxFQUFPLElBRVAsTUFBTyxJQUFNLFNBQVUsQ0FDdkIsR0FBSSxHQUFNLEdBQUksV0FBVSwwQkFDeEIsTUFBTyxHQUFRLFNBQVMsVUFBWSxDQUNoQyxFQUFHLEtBSVgsRUFBTyxHQUFpQixFQUFHLEdBRTNCLEdBQUksR0FBUyxFQUFLLFFBQVUsR0FDeEIsRUFBYyxFQUFLLGFBQWUsR0FDbEMsRUFBVyxFQUFLLFVBQVksR0FBRyxTQUMvQixFQUFXLEVBQUssVUFBWSxHQUM1QixFQUFjLEVBQUssYUFBZSxHQUN0QyxHQUFJLEVBQUssVUFBWSxFQUFLLFlBQWEsQ0FDbkMsR0FBSSxHQUFjLEdBQUksV0FBVSx3REFDaEMsTUFBTyxHQUFRLFNBQVMsVUFBWSxDQUNoQyxFQUFHLEtBR1gsR0FBSSxHQUFrQixFQUFLLGdCQUV2QixFQUFhLEVBQUssWUFBYyxDQUFDLE9BQ2pDLEVBQXFCLEVBQUsscUJBQXVCLEdBQ2pELEVBQVUsRUFBSyxTQUFXLEdBQUssUUFBUSxNQUN2QyxFQUFTLEVBQUssVUFBWSxFQUU5QixFQUFLLE1BQVEsRUFBSyxPQUFTLEtBRzNCLEdBQUksSUFBZ0IsR0FBSyxRQUFRLEdBRWpDLEdBQ0ksRUFDQSxHQUNBLEVBQ0EsU0FBVSxHQUFLLEdBQVcsQ0FDdEIsQUFBSSxHQUFLLEVBQUcsSUFDUCxFQUFLLE1BSWxCLEdBQUksR0FDSixXQUFjLEdBQVMsQ0FDbkIsR0FBSywwQ0FBMkMsS0FBSyxHQUNqRCxFQUFNLEdBQUssUUFBUSxHQUFTLEdBQ3hCLEtBQU0sS0FBTyxJQUFNLE1BQVEsRUFBRSxNQUFNLE1BQVEsTUFBSyxJQUFPLEtBQzNELEFBQUssTUFBTyxLQUFLLElBQU0sSUFBUSxHQUMzQixHQUFnQixFQUFLLEVBQUssUUFBUyxJQUNoQyxHQUFXLEVBQUssRUFBSyxRQUFTLFFBQ2xDLElBQUksR0FBc0IsR0FBTyxHQUNwQyxNQUFPLEdBQUcsS0FBTSxHQUNiLEdBQWdCLEVBQUcsR0FBUyxTQUFVLEdBQUssR0FBRyxHQUFLLENBQ3RELEdBQUksR0FBSyxFQUFHLFFBQ1AsSUFBSSxHQUNMLE1BQU8sSUFBYyxFQUFVLEdBQUcsRUFBTSxTQUFVLEdBQUssR0FBTyxDQUMxRCxBQUFJLEdBQ0EsRUFBRyxJQUVILEVBQUcsS0FBTSxHQUFPLE1BSXhCLEdBQUksSUFBYyxHQUFJLE9BQU0sdUJBQXlCLEVBQUksV0FBYSxFQUFTLEtBQy9FLEdBQVksS0FBTyxtQkFDbkIsRUFBRyxRQUtmLFlBQWdCLEdBQUssR0FBRyxHQUFLLENBQ3pCLEFBQUksR0FBSyxFQUFHLElBQ1AsQUFBSSxHQUFHLEVBQUcsS0FBTSxHQUFHLElBQ25CLEdBQWdCLEVBQUssU0FBVSxHQUFLLEdBQUcsR0FBSyxDQUM3QyxHQUFJLEdBQUssRUFBRyxZQUNILEdBQ0wsR0FBYyxFQUFVLEdBQUcsRUFBTSxTQUFVLEdBQUssR0FBTyxDQUNuRCxBQUFJLEdBQ0EsRUFBRyxJQUVILEVBQUcsS0FBTSxHQUFPLFVBR3JCLENBQ0gsR0FBSSxJQUFjLEdBQUksT0FBTSx1QkFBeUIsRUFBSSxXQUFhLEVBQVMsS0FDL0UsR0FBWSxLQUFPLG1CQUNuQixFQUFHLE9BS2YsWUFBb0IsR0FBRyxHQUFZLEdBQVUsQ0FDekMsR0FBSSxJQUFvQixHQUNwQixHQUFLLEdBQ1QsQUFBSSxNQUFPLEtBQXNCLFlBQzdCLElBQUssR0FDTCxHQUFvQixRQUd4QixHQUFJLElBQU8sQ0FBQyxJQUFJLE9BQU8sR0FDdkIsR0FBSyxHQUFNLEdBQUcsSUFFZCxZQUFjLEdBQU0sR0FBRyxHQUFhLENBQ2hDLEdBQUksR0FBSyxTQUFXLEVBQUcsTUFBTyxJQUFHLEtBQU0sT0FBVyxJQUNsRCxHQUFJLElBQU8sR0FBSSxHQUFLLEdBRWhCLEdBQU0sR0FDVixBQUFJLEdBQUssR0FBTSxLQUFNLElBQ2hCLEdBQVEsR0FBSyxRQUFRLElBQU8sSUFFakMsWUFBZSxHQUFLLEdBQU0sR0FBSyxDQUUzQixHQURBLEdBQU0sR0FDRixHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLElBQU8sSUFBTyxFQUFLLFdBQVksQ0FDL0IsR0FBSSxJQUFRLEdBQUssU0FBUyxHQUFLLElBQzNCLEdBQU0sR0FBTSxNQUFNLEVBQUcsR0FBTSxPQUFTLEdBQUssR0FBRyxRQUM1QyxHQUFJLEVBQUssV0FBVyxHQUFLLEdBQUcsSUFDaEMsR0FBSSxHQUFHLE1BQU8sSUFDVixDQUFDLElBQUksT0FBTyxFQUFXLFNBQ3ZCLEdBQUssUUFBUSxHQUFLLElBQ2xCLElBR1IsRUFBTyxHQUFNLElBRWpCLFlBQWMsR0FBSyxHQUFJLENBQ25CLEdBQUksR0FBSyxNQUFPLElBQUcsSUFDbkIsR0FBSSxHQUFJLE1BQU8sSUFBRyxLQUFNLEdBQU0sSUFDOUIsR0FBSyxHQUFLLE1BQU0sR0FBSSxHQUFHLE1BS25DLFlBQWlCLEdBQUssR0FBSSxDQUt0QixHQUpJLEtBQVEsSUFBTSxLQUFRLEtBQ3RCLEVBQVEsV0FBYSxTQUFZLGNBQWUsS0FBSyxLQUdwRCwyQkFBNEIsS0FBSyxJQUFNLE1BQU8sSUFBRyxNQUV0RCxHQUFjLEVBQVUsR0FBSyxFQUFNLFNBQVUsR0FBVyxHQUFRLENBQzVELEdBQUksR0FBVyxNQUFPLElBQVEsR0FBSyxRQUFRLElBQU0sSUFDakQsR0FBSSxJQUFVLEdBQUssS0FBSyxHQUFRLGdCQUNoQyxFQUFPLEdBQVMsU0FBVSxHQUFLLEdBQUksQ0FFL0IsR0FBSSxDQUFDLEdBQUksTUFBTyxJQUFRLEdBQUssUUFBUSxJQUFNLElBRTNDLEVBQVksRUFBVSxHQUFTLFNBQVUsR0FBSyxHQUFVLENBQ3BELEFBQUksSUFBSyxHQUFHLElBRVosR0FBSSxJQUFNLEdBRVYsQUFBSSxJQUFPLEVBQUssZUFDWixJQUFNLEVBQUssY0FBYyxHQUFLLEtBRWxDLEdBQUcsS0FBTSxHQUFLLFVBTTlCLFlBQXlCLEdBQUcsR0FBd0IsR0FBVSxDQUMxRCxHQUFJLElBQUssR0FDTCxHQUFPLEdBQ1gsQUFBSSxNQUFPLEtBQVMsWUFDaEIsSUFBSyxHQUNMLEdBQU8sRUFBSyxTQUdoQixHQUFjLEVBQVUsR0FBRyxFQUFNLFNBQVUsR0FBVyxHQUFRLENBQzFELEdBQUksR0FBVyxNQUFPLElBQUcsSUFDekIsR0FBSSxJQUFVLEdBQUssS0FBSyxHQUFRLGdCQUNoQyxFQUFPLEdBQVMsU0FBVSxHQUFLLEdBQUksQ0FDL0IsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLENBQUMsR0FBSSxNQUFPLElBQVcsR0FBSyxLQUFLLEdBQUcsU0FBVSxHQUFNLElBRXhELEVBQVksRUFBVSxHQUFTLFNBQVUsR0FBSyxHQUFVLENBQ3BELEdBQUksR0FBSyxNQUFPLElBQUcsSUFFbkIsR0FBSSxJQUFNLEdBTVYsR0FKSSxJQUFPLEVBQUssZUFDWixJQUFNLEVBQUssY0FBYyxHQUFLLEtBRzlCLElBQU8sR0FBSSxLQUFNLENBQ2pCLEdBQUksTUFBTyxJQUFJLE1BQVMsU0FBVSxDQUM5QixHQUFJLElBQVksR0FBSSxXQUFVLGlCQUFjLEdBQUksS0FBTyxrQ0FDdkQsVUFBVSxLQUFPLHVCQUNWLEdBQUcsSUFFZCxBQUFJLElBQUksT0FBUyxLQUFPLEdBQUksT0FBUyxPQUNqQyxJQUFJLEtBQU8sU0FFZixHQUFXLEdBQUssUUFBUSxHQUFHLEdBQUksTUFBTyxHQUFLLFNBQVUsR0FBSyxHQUFHLEdBQUssQ0FDOUQsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLEdBQUcsTUFBTyxJQUFHLEtBQU0sR0FBRyxJQUMxQixHQUFJLENBQUMsR0FBSyxNQUFPLElBQVcsR0FBSyxLQUFLLEdBQUcsU0FBVSxHQUFLLElBRXhELEdBQUksSUFBTSxHQUFLLFFBQVEsR0FBRyxHQUFJLE1BQzlCLEdBQWdCLEdBQUssR0FBSyxTQUFVLEdBQUssR0FBRyxHQUFLLENBQzdDLEdBQUksR0FBSyxNQUFPLElBQUcsSUFDbkIsR0FBSSxHQUFHLE1BQU8sSUFBRyxLQUFNLEdBQUcsSUFDMUIsR0FBVyxHQUFLLEtBQUssR0FBRyxTQUFVLEdBQUssUUFHL0MsT0FHSixHQUFXLEdBQUssS0FBSyxHQUFHLFVBQVcsR0FBSyxVQU14RCxZQUFxQixHQUFJLEdBQU0sQ0FDM0IsR0FBSSxHQUFLLFNBQVcsRUFBRyxNQUFPLElBQUcsS0FBTSxRQUN2QyxHQUFJLElBQU0sR0FBSyxHQUVmLEVBQVksR0FBSyxRQUFRLElBQU0sSUFFL0IsWUFBZSxHQUFLLEdBQU8sQ0FDdkIsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLENBQUMsR0FBTyxNQUFPLElBQVksR0FBSSxHQUFLLE1BQU0sSUFDOUMsR0FBVyxHQUFLLEVBQUssUUFBUyxJQUdsQyxZQUFnQixHQUFLLEdBQUcsR0FBSyxDQUN6QixHQUFJLEdBQUssTUFBTyxJQUFHLElBQ25CLEdBQUksR0FBRyxNQUFPLElBQUcsS0FBTSxHQUFHLElBQzFCLEdBQWdCLEdBQUssRUFBSyxRQUFTLElBR3ZDLFlBQWUsR0FBSyxHQUFHLEdBQUssQ0FDeEIsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLEdBQUcsTUFBTyxJQUFHLEtBQU0sR0FBRyxJQUMxQixHQUFZLEdBQUksR0FBSyxNQUFNLEtBR25DLFlBQXlCLEdBQUcsR0FBTyxHQUFJLENBQ25DLEdBQUksSUFBUSxVQUFZLENBQUUsTUFBTyxJQUFxQixHQUFHLEdBQU8sSUFDaEUsR0FDSSxHQUNBLEVBQWtCLEVBQWdCLEdBQUcsR0FBTyxHQUFPLEdBQVEsMnpKQ3JVdkUsd0NBRUEsR0FBSSxJQUFlLEtBQ2YsR0FBTyxLQUVQLEdBQU8sR0FDWCxPQUFTLE1BQU8sSUFDWixBQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssR0FBTSxLQUMzQyxJQUFLLElBQU8sR0FBYSxLQUdqQyxHQUFPLFFBQVUsS0NYakIsOEJBQUksSUFBZSxLQUVuQixHQUFPLFFBQVUsU0FBZ0IsRUFBRyxDQUNoQyxNQUFPLElBQWEsTUNIeEIsOEJBQUksSUFBUyxLQUNULEdBQUssS0FDTCxHQUFPLEtBQ1AsR0FBYSxLQUNiLEdBQVMsS0FDVCxHQUFtQixLQUNuQixHQUFtQixLQUVuQixHQUFhLEVBQVEsV0FBYSxTQUFXLEdBQUcsY0FBZ0IsTUFBTyxJQUFHLGFBQWEsUUFBVyxXQUFhLEdBQUcsYUFBYSxPQUFTLEdBQUcsYUFFM0ksR0FBVSxLQUNWLEdBQWUsVUFBWSxDQUMzQixNQUFPLENBQ0gsR0FBSyxLQUFLLEdBQVMsaUJBQ25CLEdBQUssS0FBSyxHQUFTLHFCQUl2QixHQUFnQixTQUFnQixFQUFNLENBQ3RDLEdBQUksQ0FDQSxHQUFJLEdBQU8sR0FBRyxTQUFTLEVBQU0sQ0FBRSxlQUFnQixXQUMxQyxFQUFQLENBQ0UsR0FBSSxHQUFNLEdBQUUsT0FBUyxVQUFZLEVBQUUsT0FBUyxXQUFZLE1BQU8sR0FDL0QsS0FBTSxHQUVWLE1BQU8sQ0FBQyxDQUFDLEdBQVMsR0FBSyxVQUFZLEVBQUssV0FHeEMsR0FBZSxTQUFxQixFQUFLLENBQ3pDLEdBQUksQ0FDQSxHQUFJLEdBQU8sR0FBRyxTQUFTLEVBQUssQ0FBRSxlQUFnQixXQUN6QyxFQUFQLENBQ0UsR0FBSSxHQUFNLEdBQUUsT0FBUyxVQUFZLEVBQUUsT0FBUyxXQUFZLE1BQU8sR0FDL0QsS0FBTSxHQUVWLE1BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBSyxlQUd0QixHQUFzQixTQUFzQixFQUFHLENBQy9DLEdBQUksQ0FDQSxNQUFPLElBQVcsU0FDYixFQUFQLENBQ0UsR0FBSSxFQUFZLE9BQVMsU0FDckIsS0FBTSxHQUdkLE1BQU8sSUFHUCxHQUFvQixTQUEyQixFQUFjLEVBQUcsRUFBTSxDQUN0RSxNQUFJLElBQVEsRUFBSyxtQkFBcUIsR0FDM0IsRUFBYSxHQUVqQixHQUdQLEdBQXlCLFNBQWdDLEVBQWMsRUFBUyxDQUNoRixHQUFJLEdBQU8sRUFBYSxHQUN4QixHQUFJLENBQ0EsR0FBSSxHQUFNLEtBQUssTUFBTSxHQUNyQixNQUFPLFNBQ0YsRUFBUCxJQUdGLEdBQXVCLFNBQThCLEVBQUcsRUFBTyxFQUFNLENBRXJFLE9BREksR0FBTyxHQUFpQixFQUFPLEVBQU0sR0FDaEMsRUFBSSxFQUFHLEVBQUksRUFBSyxPQUFRLElBQzdCLEVBQUssR0FBSyxHQUFLLEtBQUssRUFBSyxHQUFJLEdBRWpDLE1BQU8sSUFHWCxHQUFPLFFBQVUsU0FBcUIsRUFBRyxFQUFTLENBQzlDLEdBQUksTUFBTyxJQUFNLFNBQ2IsS0FBTSxJQUFJLFdBQVUsMEJBRXhCLEdBQUksR0FBTyxHQUFpQixFQUFHLEdBRTNCLEVBQVMsRUFBSyxRQUFVLEdBQ3hCLEVBQWUsRUFBSyxjQUFnQixHQUFHLGFBQ3ZDLEVBQWMsRUFBSyxhQUFlLEdBQ2xDLEVBQWUsRUFBSyxjQUFnQixHQUNwQyxFQUFrQixFQUFLLGlCQUFtQixHQUM5QyxHQUFJLEVBQUssY0FBZ0IsRUFBSyxnQkFDMUIsS0FBTSxJQUFJLFdBQVUsZ0VBRXhCLEdBQUksR0FBa0IsRUFBSyxnQkFFdkIsRUFBYSxFQUFLLFlBQWMsQ0FBQyxPQUNqQyxFQUFxQixFQUFLLHFCQUF1QixHQUNqRCxFQUFVLEVBQUssU0FBVyxHQUFLLFFBQVEsTUFDdkMsRUFBUyxFQUFLLFVBQVksRUFFOUIsRUFBSyxNQUFRLEVBQUssT0FBUyxLQUczQixHQUFJLEdBQWdCLEdBQWtCLEVBQWMsR0FBSyxRQUFRLEdBQVUsR0FFM0UsR0FBSywwQ0FBMkMsS0FBSyxHQUFJLENBQ3JELEdBQUksR0FBTSxHQUFLLFFBQVEsRUFBZSxHQUN0QyxBQUFJLEtBQU0sS0FBTyxJQUFNLE1BQVEsRUFBRSxNQUFNLE1BQVEsTUFBSyxJQUFPLEtBQzNELEdBQUksR0FBSSxFQUFlLElBQVEsR0FBb0IsR0FDbkQsR0FBSSxFQUFHLE1BQU8sSUFBa0IsRUFBYyxFQUFHLE9BQzlDLElBQUksR0FBc0IsR0FBTyxHQUNwQyxNQUFPLEdBRVAsR0FBSSxHQUFJLEdBQW9CLEVBQUcsR0FDL0IsR0FBSSxFQUFHLE1BQU8sSUFBa0IsRUFBYyxFQUFHLEdBR3JELEdBQUksSUFBTSxHQUFJLE9BQU0sdUJBQXlCLEVBQUksV0FBYSxFQUFTLEtBQ3ZFLFNBQUksS0FBTyxtQkFDTCxHQUVOLFdBQXdCLEdBQUcsQ0FDdkIsR0FBSSxJQUFNLEVBQVEsR0FBSyxRQUFRLEtBRS9CLEdBQUksSUFBTyxHQUFJLEtBQU8sR0FBSSxLQUFPLEVBQUssV0FBWSxDQUM5QyxHQUFJLElBQVEsR0FBSyxTQUFTLEdBQUksSUFBSyxJQUMvQixHQUFJLEVBQUssV0FBVyxHQUFJLElBQUssR0FBRyxJQUNwQyxBQUFJLElBQ0EsSUFBSSxHQUFLLFFBQVEsR0FBSSxJQUFLLEtBSWxDLEdBQUksRUFBTyxJQUNQLE1BQU8sSUFHWCxPQUFTLElBQUksRUFBRyxHQUFJLEVBQVcsT0FBUSxLQUFLLENBQ3hDLEdBQUksSUFBTyxHQUFJLEVBQVcsSUFDMUIsR0FBSSxFQUFPLElBQ1AsTUFBTyxLQUtuQixXQUFpQixHQUFLLENBQ2xCLEdBQUksT0FBUSxJQUFNLEtBQVEsTUFDdEIsSUFBUSxXQUFhLFNBQVksY0FBZSxLQUFLLE1BR3BELDRCQUE0QixLQUFLLElBRXRDLElBQUksSUFBVSxHQUFLLEtBQUssR0FBa0IsRUFBYyxHQUFLLEdBQU8sZ0JBRXBFLEdBQUksQ0FBQyxFQUFPLElBQ1IsTUFBTyxHQUFRLEdBQUssUUFBUSxLQUdoQyxHQUFJLElBQU0sRUFBZ0IsRUFBYyxJQUV4QyxNQUFJLEtBQU8sRUFBSyxlQUVaLElBQU0sRUFBSyxjQUFjLEdBQWtCLEtBR3hDLENBQUUsSUFBSyxHQUFLLElBQUssS0FHNUIsWUFBNkIsR0FBRyxDQUM1QixHQUFJLElBQVUsR0FBSyxLQUFLLEdBQWtCLEVBQWMsR0FBRyxHQUFPLGlCQUNsRSxHQUFJLEVBQU8sSUFBVSxDQUNqQixHQUFJLENBQ0EsR0FBSSxJQUFNLEVBQWdCLEVBQWMsVUFDbkMsR0FBUCxFQU9GLEdBTEksSUFBTyxFQUFLLGVBRVosSUFBTSxFQUFLLGNBQWMsR0FBa0IsS0FHM0MsSUFBTyxHQUFJLEtBQU0sQ0FDakIsR0FBSSxNQUFPLElBQUksTUFBUyxTQUFVLENBQzlCLEdBQUksSUFBWSxHQUFJLFdBQVUsaUJBQWMsR0FBSSxLQUFPLGtDQUN2RCxTQUFVLEtBQU8sdUJBQ1gsR0FFVixBQUFJLElBQUksT0FBUyxLQUFPLEdBQUksT0FBUyxPQUNqQyxJQUFJLEtBQU8sU0FFZixHQUFJLENBQ0EsR0FBSSxJQUFJLEVBQWUsR0FBSyxRQUFRLEdBQUcsR0FBSSxPQUMzQyxHQUFJLEdBQUcsTUFBTyxJQUNkLEdBQUksSUFBSSxHQUFvQixHQUFLLFFBQVEsR0FBRyxHQUFJLE9BQ2hELEdBQUksR0FBRyxNQUFPLFVBQ1QsR0FBUCxJQUlWLE1BQU8sR0FBZSxHQUFLLEtBQUssR0FBRyxXQUd2QyxZQUE2QixHQUFHLEdBQU8sQ0FJbkMsT0FISSxJQUFRLFVBQVksQ0FBRSxNQUFPLElBQXFCLEdBQUcsR0FBTyxJQUM1RCxHQUFPLEVBQWtCLEVBQWdCLEdBQUcsR0FBTyxHQUFPLEdBQVEsS0FFN0QsR0FBSSxFQUFHLEdBQUksR0FBSyxPQUFRLEtBQUssQ0FDbEMsR0FBSSxJQUFNLEdBQUssSUFDZixHQUFJLEVBQVksR0FBSyxRQUFRLEtBQU8sQ0FDaEMsR0FBSSxJQUFJLEVBQWUsSUFDdkIsR0FBSSxHQUFHLE1BQU8sSUFDZCxHQUFJLElBQUksR0FBb0IsSUFDNUIsR0FBSSxHQUFHLE1BQU8sVUMzTTlCLDhCQUFJLElBQVEsS0FDWixHQUFNLEtBQU8sS0FDYixHQUFNLE9BQVMsS0FDZixHQUFNLEtBQU8sS0FFYixHQUFPLFFBQVUsS0NMakIsd0NBRUEsR0FBSSxJQUFnQixLQUNoQixHQUFVLEtBRWQsR0FBTyxRQUFVLEdBRWpCLFlBQWtDLEVBQWMsQ0FDOUMsT0FBUSxPQUNELEtBQ0gsTUFBTyxnQkFDSixNQUNILE1BQU8sYUFJYixZQUFnQixFQUFNLEVBQUssRUFBUyxFQUFrQixFQUFVLENBQzlELEVBQVcsR0FBWSxTQUN2QixHQUFJLEdBQ0osR0FBSSxDQUNGLEdBQUksQ0FDRixFQUFTLEdBQVEsS0FBSyxpQkFBbUIsRUFBTSxDQUM3QyxRQUFTLEdBQW9CLEVBQVEsY0FFaEMsRUFBUCxDQUNBLEVBQVMsR0FBUSxRQUFRLGlCQUFtQixVQUV2QyxFQUFQLENBQ0EsR0FBSSxHQUFNLEdBQUksT0FBTSxvQkFBc0IsRUFBTyxLQUNqRCxRQUFJLEtBQU8saUJBQ0wsRUFFUixHQUFJLEdBQUssR0FBYyxHQUFRLElBRTNCLEVBQVMsRUFBRyxHQUFVLEVBQUssRUFBUyxHQUFTLEtBQ2pELEdBQUksR0FBVyxFQUFRLE9BQVEsQ0FDN0IsR0FBSSxHQUFtQixHQUF5QixFQUFHLGNBQ25ELEdBQUksRUFDRixHQUFJLENBQ0YsRUFBUyxHQUFPLEVBQWtCLEVBQVEsS0FBTSxTQUN6QyxFQUFQLEdBS04sTUFBTyxxT0N0Q0YsWUFBZSxDQUtwQixZQUFZLEVBQWMsRUFBYSxFQUFlLENBQUEsS0FKdEQsS0FBSSxPQUFBLEtBQ0osT0FBTSxPQUFBLEtBQ04sTUFBSyxPQUdILEtBQUssS0FBTyxFQUNaLEtBQUssT0FBUyxFQUNkLEtBQUssTUFBUSxJQUlWLFFBQXFCLENBTTFCLFlBQVksRUFBaUIsRUFBZ0IsQ0FBQSxLQUw3QyxNQUFLLE9BQUEsS0FDTCxJQUFHLE9BQUEsS0FDSCxTQUFRLE9BQUEsS0FDUixlQUFjLE9BR1osS0FBSyxNQUFRLEVBRWIsS0FBSyxJQUFNLElBVVIsWUFDTCxFQUNBLEVBQ0EsQ0FDQSxHQUFNLENBQUUsT0FBTSxTQUFRLFNBQVUsRUFDaEMsTUFBTyxJQUFJLElBQVMsRUFBTSxFQUFTLEVBQWMsRUFBUSxHQzNDM0QsR0FBa0IsSUFBYyxDQUFBLFlBQUEsNEJBQUEsc0JBQUEsMkNBcUIxQixHQUFVLENBQUMsRUFBZ0IsRUFBTyxFQUFLLE9BQVMsSUFBTyxFQUMzRCxLQUE0QixDQUMxQixNQUFPLEdBQUssT0FDVixDQUFDLEVBQVEsSUFFUCxFQUFPLEdBQ1QsT0FHSixJQUFtQixFQUFnQixDQUNqQyxFQUFLLE9BRUgsQ0FBQyxFQUFNLEVBQUssSUFBTyxJQUFNLEVBQVEsRUFBSyxHQUFPLEVBQVMsRUFBSyxHQUMzRCxTQUtBLEdBQWMsQ0FDbEIsRUFDQSxFQUNBLElBRUEsT0FBTyxLQUFLLEdBQ1QsSUFBSSxHQUFPLENBQUMsRUFBSyxFQUFZLEtBQzdCLE9BQU8sQ0FBQyxDQUFBLENBQUcsS0FBZ0IsQ0FBQyxDQUFDLEdBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUssS0FBZ0IsQ0FDMUIsRUFDQSxNQUFPLElBQWUsV0FDbEIsQ0FBRSxNQUFPLEVBQVksV0FBWSxJQUNqQyxNQUFPLEdBQVcsU0FBWSxTQUFRLE9BQUEsT0FBQSxHQUNqQyxFQUFlLEdBQVEsRUFBVyxRQUFRLE1BQU0sT0FDckQsSUFFTCxPQUNDLENBQUMsRUFBVSxDQUFDLEVBQUssS0FDZixPQUFPLGVBQWUsRUFBVSxFQUFHLE9BQUEsT0FBQSxDQUNqQyxhQUFjLElBQ1gsSUFFUCxPQUFPLE9BQU8sR0FBSSxHQUFlLElDM0R4QixHQUFBLENBQ2Isd0JBQXlCLENBQ3ZCLFFBQWtFLDBEQUNsRSxLQUFNLEdBQWUsdUJBRXZCLG9CQUFxQixDQUNuQixRQUE0RSxvRUFDNUUsS0FBTSxHQUFlLHdCQ1RuQixHQUFtQixDQUN2QixhQUFjLDhCQUNkLHFCQUFzQix3QkFDdEIsa0JBQW1CLHdCQUNuQix3QkFBeUIsNEJBQ3pCLHNCQUF1Qix5QkFDdkIsWUFBYSxlQUNiLGVBQWdCLG1CQUNoQixlQUFnQixtQkFDaEIsYUFBYyxXQUNkLGlCQUFrQiwwQkFDbEIsV0FBWSxhQUNaLGdCQUFpQixtQkFDakIsdUJBQXdCLDJCQUN4Qix5QkFBMEIsNkJBQzFCLGNBQWUsK0JBQ2Ysd0JBQXlCLDJCQUN6QixZQUFhLGVBQ2IsaUJBQWtCLENBQ2hCLEtBQU0sbUJBQ04sTUFBTyxxQkFFVCxtQkFBb0IsdUJBQ3BCLGdCQUFpQixvQkFtQmIsR0FBb0IsQ0FBQyxDQUFFLE9BQU0sWUFDakMsSUFBUyxtQkFDTCxHQUFpQixpQkFBaUIsT0FBTyxJQUN6QyxHQUFpQixHQ3ZCUixHQUFBLENBQ2Isb0JBQXFCLENBQUMsQ0FBRSxVQUNqQixLQUFBLDhCQUNQLGlCQUNFLDhEQUNGLHNDQUNFLDJFQUNGLHVCQUNFLDhEQUNGLG9DQUNFLDJEQUNGLCtCQUNFLHVEQUNGLDRCQUNFLHlGQUNGLHVCQUNFLG1GQUNGLHdCQUF5QixrREFDekIsZUFBZ0Isd0RBQ2hCLGVBQWdCLDJEQUNoQix1QkFDRSxtRUFDRixzQkFBdUIsb0RBQ3ZCLDZCQUNFLDZEQUNGLHNCQUF1Qiw0Q0FDdkIsbUJBQW9CLDBDQUNwQix1QkFBd0Isb0NBQ3hCLDhCQUErQixDQUFDLENBQzlCLFVBRzhCLDBCQUFBLGlCQUNoQyxxQ0FDRSxrSEFDRixzQkFDRSw0SkFDRiw0QkFDRSxzSEFDRixxQkFDRSxrRkFDRixxQkFDRSw0SkFDRixtQkFBb0Isa0RBQ3BCLHFCQUFzQixnREFDdEIsbUJBQW9CLDJDQUNwQix1QkFDRSxxR0FDRixxQkFBc0IsMkNBQ3RCLHVCQUF3Qiw4Q0FDeEIsZ0JBQWlCLENBQUMsQ0FBRSxnQkFDYixLQUFBLHNFQUNQLGVBQWdCLHNDQUNoQixxQkFBc0IscUNBQ3RCLGlCQUFrQixxQ0FDbEIsMkJBQTRCLDBCQUM1QixzQkFBdUIsQ0FBQyxDQUN0QixZQUNBLGdCQUtDOzZCQUF1RyxVQUFrQiw2QkFDNUgsOEJBQ0UsaUVBRUYsdUJBQXdCLENBQUMsQ0FDdkIsVUFHRCxJQUVHLElBQVMsaUJBQW1CLFNBQVcsbUVBRTNDLFdBQVksc0RBRVosV0FBWSwwREFDWixTQUFVLGdFQUNWLGtDQUNFLHNFQUVGLHFCQUFzQixDQUFDLENBQ3JCLFVBR0QsZUFBb0IsSUFBUyxpQkFBbUIsUUFBVSxjQUUzRCw2QkFDRSw2RUFDRixjQUFlLGdDQUNmLDBCQUNFLDJOQUNGLHNCQUF1QixDQUFDLENBQUUsZ0JBQytEOzZCQUFBLGlCQUN6RixnQ0FDRSw2REFDRixnQkFBaUIsQ0FBQyxDQUFFLHNCQUErQyxpQ0FFL0QsSUFBcUIsRUFBSSxlQUFpQiwwQkFFOUMsMkJBQTRCLG1DQUM1Qix5QkFBMEIsc0NBQzFCLDRCQUNFLHFEQUNGLDZCQUE4Qiw0Q0FDOUIsMkJBQ0UsbURBQ0YsMEJBQ0UsK0VBQ0YscUJBQXNCLHlCQUN0QixpQkFBa0IsNEJBQ2xCLDRCQUE2QiwwQ0FDN0IsZUFBZ0IsbUJBQ2hCLGFBQWMsQ0FBQyxDQUFFLFdBQ2EsNEJBQUEsS0FDOUIsc0JBQXVCLGlDQUN2Qiw4QkFBK0IsdUNBQy9CLDJCQUE0QixDQUFDLENBQUUsa0JBQ0MsOEJBQUEsS0FDaEMsa0JBQW1CLENBQUMsQ0FBRSxvQkFDRSxzQkFBQSxLQUN4QixXQUFZLENBQUMsQ0FBRSxjQUNnQiw2QkFBQSxHQUFrQixNQUNqRCxrQkFBbUIsQ0FBQyxDQUFFLGNBQ2lCLHFDQUFBLEdBQWtCLE1BQ3pELGNBQWUsa0JBQ2YseUJBQ0UsaUVBQ0YseUJBQTBCLENBQUMsQ0FBRSxnQkFDRix5QkFBQSxNQUMzQiwrQkFBZ0MsNENBQ2hDLDhCQUErQixDQUFDLENBQzlCLG9CQUdxQixpQkFBQSxvQkFDdkIsOEJBQStCLDZCQUMvQixzQkFDRSx5RUFDRiw2QkFBOEIsb0NBQzlCLG1CQUFvQixDQUFDLENBQUUsZUFDWCxVQUFBLDBCQUNaLG9CQUNFLDhFQUNGLDBCQUEyQix3Q0FDM0IscUJBQXNCLG1DQUN0QixpQkFBa0IsNEJBQ2xCLHNCQUNFLDhEQUNGLGlCQUFrQixxQkFDbEIsY0FBZSxDQUFDLENBQUUsbUJBQTRDLGlFQUNLLEVBQzlELElBQUksR0FBUSxLQUFLLFVBQVUsSUFDM0IsS0FBSyxTQUdWLG9CQUFxQixDQUFDLENBQUUsbUJBQTRDLHFGQUNtQixFQUNsRixJQUFJLEdBQVEsS0FBSyxVQUFVLElBQzNCLEtBQUssU0FDVixxQkFBc0IsNkNBQ3RCLDBCQUNFLHNGQUNGLGlDQUNFLGdEQUNGLDRCQUNFLCtEQUNGLGtDQUFtQyxDQUFDLENBQUUsU0FDbEIsa0JBQUEsMENBQ3BCLGlDQUFrQyxDQUFDLENBQ2pDLHVCQUdELDZEQUM4RCxFQUFrQixTQUM3RSxRQUVKLHNCQUF1QixDQUFDLENBQUUsZUFDYixXQUFBLHFCQUNiLHlCQUEwQiw0QkFDMUIsa0JBQW1CLCtCQUNuQixpQkFBa0IsbUNBQ2xCLGlCQUFrQixvQ0FDbEIsaUNBQ0UsOEZBQ0Ysa0JBQ0UsMEZBQ0Ysc0JBQ0UsMkRBQ0YsMkJBQ0UsNkRBQ0Ysc0JBQ0Usa0VBQ0YsVUFBVyx1QkFDWCxtQkFBb0IsaURBQ3BCLGlCQUFrQix3Q0FDbEIsb0JBQXFCLENBQUMsQ0FBRSxvQkFDckIsK0RBQThELHFDQUFrRCxlQUNuSCx5QkFBMEIsQ0FBQyxDQUFFLG9CQUNBLDJCQUFBLEtBQzdCLDBDQUNFLG9JQUNGLDRDQUNFLHNJQUNGLDZDQUNFLHVJQUNGLGNBQWUsb0RBQ2Ysa0JBQW1CLGdEQUNuQixlQUNFLDBGQUNGLHFCQUNFLDJIQUNGLGdCQUFpQix3REFDakIsZ0JBQ0Usb0pBQ0Ysa0JBQW1CLDZDQUNuQixrQkFBbUIsa0RBQ25CLHlDQUNFLG1JQUNGLDJDQUNFLHFJQUNGLDRDQUNFLHNJQUNGLDhCQUErQixtQ0FDL0IsaUNBQ0UsMkZBQ0YseUJBQTBCLHFDQUMxQix1QkFDRSwwREFDRixrQkFBbUIsQ0FBQyxDQUFFLGFBQ0csdUJBQUEsTUFDekIsMkJBQ0UsOERBQ0YsNkJBQ0UsbUVBQ0Ysb0JBQ0Usa0VBQ0YsMkJBQ0UsMERBQ0YsdUJBQXdCLDJCQUN4Qix1QkFBd0IsQ0FBQyxDQUFFLGtCQUNJLDZCQUFBLE1BQy9CLGdCQUFpQix5REFDakIsZ0JBQWlCLENBQUMsQ0FDaEIsV0FDQSxnQkFLbUIsbUJBQUEsRUFBYyxLQUFJLE1BQWlCLEtBQ3BELEVBQVksZUFBYyxLQUFjLEtBRTVDLG1DQUNFLG1GQUNGLDJCQUNFLGlGQUNGLGdCQUFpQixrREFDakIsMkJBQ0Usc0RBQ0YseUJBQ0UsOEVBQ0Ysa0JBQ0UsNERBQ0Ysd0JBQXlCLENBQUMsQ0FDeEIsU0FDQSwyQkFLb0Msb0NBQUEsUUFBYSxLQUFVLEtBQzdELDhCQUNFLG9EQUNGLDZCQUNFLG1FQUNGLGlCQUNFLHdIQUNGLG9CQUFxQix3QkFDckIsbUJBQW9CLG1DQUNwQixtQkFBb0IsZ0NBQ3BCLHFCQUFzQix5QkFDdEIsa0NBQ0Usd0RBQ0YsaUJBQWtCLENBQUMsQ0FBRSxvQkFDSixlQUFBLGdDQUNqQix1QkFDRSx3REFDRixpQkFBa0Isd0RBQ2xCLDBCQUNFLHNEQ3pUVyxHQUFBLENBQ2IsYUFBYywwQ0FPZCxvQkFBcUIsQ0FBQyxDQUFFLG1CQUNMLGlCQUFBLHFCQU9uQiwyQkFBNEIsQ0FBQyxDQUFFLGlCQUNqQixZQUFBLHFCQUVkLGVBQ0Usc0ZBRUYsb0JBQXFCLHlEQUVyQixtQkFBb0Isd0RBRXBCLFdBQVksMEJDeEJELEdBQXNDLEdBQUksS0FBSSxDQUN6RCwwQkFDQSx1QkFDQSx3QkFDQSxvQkFXYSxHQUFBLENBRWIsa0JBQ0Usd0pBQ0YsMkJBQ0Usa0hBQ0YsaUJBQ0UsNkRBQ0YsMkJBQTRCLENBQUMsQ0FBRSxXQUNOLHVCQUFBLHNCQUEwQixvSEFBd0gsUUFDM0ssZ0JBQ0UsMEdBQ0Ysd0JBQXlCLENBQUMsQ0FBRSxVQUMyQixxREFBQSxHQUFrQixDQUNyRSwyQ0FPSixvQkFDRSxvR0FDRiwrQkFDRSxrRUFDRiwrQkFDRSxxRUFDRixvQkFDRSwrREFDRix1QkFDRSx1RUFDRixrQ0FDRSxtSkNBSixZQUFnQyxFQUc2QyxDQUFBLEdBSGYsQ0FDNUQsYUFFb0MsRUFEakMsRUFBVSxHQUFBLEVBQUEsSUFPYixNQUFPLFlBQXFCLENBQUUsTUFBSyxXQUFnQyxDQUNqRSxNQUFPLElBQ0wsWUFBVyxPQUFBLE9BQUEsR0FDTixFQUFVLENBQUUsUUFDakIsQ0FDRSxNQUNFLEVBR0ksR0FDSixDQUNBLEdBQU0sR0FBTyxFQUFVLEtBQU8sR0FDOUIsTUFBTyxHQUFZLENBQ2pCLElBQUssR0FBSSxJQUNQLFFBQVUsR0FBTSxFQUFJLEtBQU8sS0FBSyxJQUFJLEtBQ3BDLFVBQVksR0FBTSxFQUFJLE9BQVMsS0FBSyxJQUFJLE9BQ3hDLFNBQVcsR0FBTSxFQUFJLE1BQVEsS0FBSyxJQUFJLE9BRXhDLFFBQU8sT0FBQSxPQUFBLEdBQU8sS0FBSyxRQUFZLEVBQVUsWUFHN0MsUUFBUyxDQUFFLE1BQU8sRUFBUyxXQUFZLElBQ3ZDLFFBQVMsQ0FDUCxLQUF1QyxDQUNyQyxNQUFBLEdBQVUsRUFBVSxLQUFLLGFBQWEsS0FBSyxJQUFJLFFBQzdDLEtBQUssSUFBSSxXQUdiLElBQUksRUFBZSxDQUNqQixPQUFPLGVBQWUsS0FBTSxVQUFXLENBQUUsWUFHN0MsSUFBSyxDQUFFLFFBQVMsWUFBYSxXQUFZLElBQ3pDLGNBQWUsaUJBQW1CLElBQVcsQ0FDM0MsUUFBUyx3QkFDVCxXQUFZLE9Bc0VmLFlBQ0wsRUFDQSxFQUNBLENBSUEsR0FBSSxNQUFNLFFBQVEsR0FDaEIsTUFBUSxJQUNOLEdBQWUsRUFBcUIsRUFBUyxJQUdqRCxHQUFNLEdBQXlCLEdBSy9CLE9BQVcsS0FBYyxRQUFPLEtBQUssR0FBVyxDQUM5QyxHQUFNLEdBQVksRUFBaUMsR0FDbkQsRUFDRSxNQUFPLElBQWEsU0FDaEIsQ0FBRSxRQUFTLElBQU0sR0FDakIsTUFBTyxJQUFhLFdBQ3BCLENBQUUsUUFBUyxHQUNYLEVBTEEsQ0FBRSxXQUFrQixFQUFOLEVBQUksR0FBQSxFQUFBLElBTWxCLEVBQVksTUFBTyxJQUFZLFNBQVcsSUFBTSxFQUFVLEVBRWhFLEVBQXVCLEdBQWMsR0FBdUIsT0FBQSxPQUFBLENBQzFELEtBQU0sR0FBZSxZQUNyQixhQUNBLGFBQ0ksRUFBZSxDQUFFLGdCQUFpQixHQUNuQyxJQUlQLE1BQU8sR0FZRixHQUFNLEdBQU0sT0FBQSxPQUFBLEdBQ2QsR0FBZSxJQUNmLEdBQWUsSUFDZixHQUFlLElBQ2YscUJBQWlDLEtDN01oQyxDQUFFLG1CQUFtQixPQUNyQixHQUFpQixDQUFDLEVBQWEsSUFDbkMsR0FBZSxFQUFRLEVBQUssQ0FBRSxXQUFZLEdBQU8sTUFBTyxFQUFPLEtBRWpFLFlBQTBCLEVBQVcsQ0FDbkMsU0FBSyxJQUFJLE9BQVMsR0FBZSxFQUFLLElBQUksTUFBTyxTQUNqRCxFQUFLLElBQUksS0FBTyxHQUFlLEVBQUssSUFBSSxJQUFLLFNBRXRDLEVBR1QsR0FBQSxJQUFnQixHQUNkLGFBQWdDLEVBQTZCLENBQzNELE9BQWMsQ0FDWixHQUFNLEdBQU8sR0FBaUIsTUFBTSxTQUVwQyxNQUFJLE1BQUssUUFBUSxRQUNmLEdBQUssT0FBUyxFQUFLLE9BQU8sSUFBSSxLQUd6QixFQUlULG1CQUFtQixDQUFFLFVBQVMsU0FBZ0MsQ0FDNUQsR0FBSSxHQUF1QixLQUMzQixHQUFJLENBQ0YsRUFBUSxHQUFJLFFBQU8sRUFBUyxTQUNyQixFQUFQLEVBSUYsR0FBTSxHQUFPLEtBQUssbUJBQTBDLEdBQzVELFNBQUssTUFBUSxDQUFFLFVBQVMsU0FFakIsRUFJVCxtQkFBbUIsRUFBb0IsQ0FFckMsR0FBSSxHQUNKLEdBQUksQ0FDRixFQUFTLE9BQU8sU0FDaEIsRUFBQSxDQUNBLEVBQVMsS0FFWCxHQUFNLEdBQU8sS0FBSyxtQkFBMEMsR0FDNUQsU0FBSyxPQUFTLE9BQU8sRUFBSyxPQUFTLEdBRTVCLEVBSVQsb0JBQW9CLEVBQW9CLENBR3RDLEdBQU0sR0FBZ0IsS0FDaEIsRUFBTyxLQUFLLG1CQUFtQixHQUNyQyxTQUFLLFFBQVUsT0FBTyxFQUFLLE9BQVMsR0FFN0IsRUFHVCxtQkFBcUMsRUFBWSxDQUUvQyxNQUFPLE1BQUssYUFBZ0IsRUFBTyxXQUlyQyxtQkFBbUIsRUFBb0IsQ0FDckMsTUFBTyxNQUFLLG1CQUFtQixHQUdqQyxvQkFBb0IsRUFBaUIsQ0FDbkMsTUFBTyxNQUFLLG1CQUFtQixHQUlqQyxrQkFBMkIsQ0FDekIsTUFBTyxNQUFLLG1CQUFtQixNQUdqQyxvQkFBb0IsRUFBa0MsQ0FDcEQsTUFBTyxNQUFLLG1CQUFtQixHQUlqQyxnQkFBZ0IsRUFBK0MsQ0FDN0QsR0FBTSxHQUFhLEVBQVUsTUFDN0IsTUFBTyxHQUFVLE1BRWpCLEVBQVcsS0FBTyxVQUVsQixFQUFXLElBQU0sRUFBVyxNQUFNLElBQ2xDLEVBQVcsTUFBUSxFQUFXLE1BQU0sZ0JBRXBDLEdBQU0sR0FBTyxFQUNiLFNBQUssS0FBTyxzQkFDWixFQUFLLFdBQWEsRUFFbEIsRUFBSyxVQUFZLEVBQVcsTUFBTSxTQUVsQyxNQUFPLEdBQVcsTUFFWCxFQU9ULGFBQWEsRUFBc0MsRUFBd0IsQ0FDekUsTUFBTSxhQUFhLEVBQU0sR0FDekIsRUFBSyxXQUFhLEdBR3BCLGlCQUFpQixFQUEwQyxDQUN6RCxBQUFJLEdBQVEsTUFBUSxLQUFLLGlCQUFpQixHQUV4QyxLQUFLLGlCQUFrQixFQUFxQyxPQUU1RCxNQUFNLGlCQUFpQixHQUkzQiw2QkFBNkIsRUFBd0MsQ0FDbkUsTUFBUSxHQUNMLE1BQU0sT0FHWCxpQkFBaUIsRUFBNEIsQ0FBQSxHQUFBLEdBQzNDLE1BQ0UsR0FBSyxPQUFTLHVCQUNkLEVBQUssV0FBVyxPQUFTLFdBQ3pCLE1BQU8sR0FBSyxXQUFXLE9BQVUsVUFDakMsQ0FBQSxJQUFDLEVBQUssV0FBVyxRQUFoQixNQUFBLEVBQXVCLGVBSTVCLGVBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sTUFBTSxlQUNKLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixHQUFNLEdBQXNCLEVBQUssV0FBVyxJQUFJLEdBQzlDLEtBQUssZ0JBQWdCLElBR3ZCLEVBQUssS0FBTyxFQUFvQixPQUFPLEVBQUssTUFDNUMsTUFBTyxHQUFLLFdBR2QsZ0JBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixLQUFLLFlBQ0gsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLGNBQ0EsSUFFRSxFQUFPLGdCQUVULEdBQU8sTUFBTSxlQUFpQixFQUFPLGVBQ3JDLE1BQU8sR0FBTyxnQkFFaEIsRUFBVSxLQUFLLEtBQUssR0FHdEIsa0JBQXdCLENBQ3RCLEdBQU0sR0FBTyxNQUFNLG1CQUVqQixNQUFLLE1BQUssZ0JBQWdCLFNBQVUsaUJBSS9CLEtBQUssc0NBQXNDLEdBSHZDLEVBTWIsc0NBQ0UsRUFDMkIsQ0FDM0IsR0FBTSxHQUFPLE1BQU0saUJBQWlCLEdBQ3BDLFNBQU8sRUFDUCxNQUFPLEdBQUssR0FFWixFQUFLLEtBQU8sRUFFWixFQUFLLEtBQU8sb0JBQ0wsRUFHVCxjQUFjLEVBQXVCLENBRWpDLE1BQUssTUFBSyxnQkFBZ0IsU0FBVSxpQkFJL0IsRUFBSyxPQUFTLG9CQUhWLE1BQU0sY0FBYyxHQU1qQyxpQkFBaUIsRUFBc0IsQ0FFbkMsTUFBSyxNQUFLLGdCQUFnQixTQUFVLGlCQUkvQixFQUFLLEtBSEQsTUFBTSxpQkFBaUIsR0FPcEMsYUFBa0MsRUFBWSxFQUFvQixDQUNoRSxHQUFNLEdBQU8sTUFBTSxhQUFnQixFQUFPLEdBRTFDLFNBQUssSUFBTSxFQUFLLE1BQU0sSUFDdEIsTUFBTyxHQUFLLE1BRUwsRUFHVCxrQkFDRSxFQUNBLEVBQ0EsRUFBb0IsR0FDZCxDQUNOLE1BQU0sa0JBQWtCLEVBQU0sRUFBaUIsR0FDL0MsRUFBSyxXQUFhLEVBQUssS0FBSyxPQUFTLGlCQUl2QyxZQUdFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQXdCLEdBQ0UsQ0FDMUIsR0FBSSxHQUFXLEtBQUssWUFDcEIsU0FBUyxLQUFPLEVBQUssS0FDckIsRUFBVyxNQUFNLFlBRWYsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixFQUFTLEtBQU8scUJBQ2hCLE1BQU8sR0FBUyxLQUVoQixFQUFLLE1BQVEsRUFDVCxJQUFTLHNCQUNYLEdBQUssU0FBVyxJQUVYLEtBQUssV0FFVixFQUNBLG9CQUlKLHNCQUFzQixFQUE4QixDQUNsRCxHQUFNLEdBQWUsTUFBTSxtQkFBbUIsR0FBRyxHQUUvQyxNQUFLLE1BQUssZ0JBQWdCLFNBQVUsa0JBSXRDLEdBQWEsS0FBTyxzQkFDYixFQUdULDZCQUE2QixFQUFxQyxDQUNoRSxHQUFNLEdBQWUsTUFBTSwwQkFBMEIsR0FBRyxHQUV0RCxNQUFLLE1BQUssZ0JBQWdCLFNBQVUsa0JBSXRDLEdBQWEsS0FBTyxxQkFDcEIsRUFBYSxTQUFXLElBQ2pCLEVBR1Qsa0JBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNtQyxDQUNuQyxHQUFNLEdBQXlCLE1BQU0sa0JBQ25DLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixNQUFJLElBQ0YsR0FBSyxLQUFPLFdBQ1AsRUFBOEIsT0FBUyxVQUMxQyxHQUFLLEtBQU8sUUFFZCxFQUFLLFVBQVksSUFHWixFQUdULG9CQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ3FDLENBQ3JDLEdBQU0sR0FBeUIsTUFBTSxvQkFDbkMsRUFDQSxFQUNBLEVBQ0EsR0FHRixNQUFJLElBQ0YsR0FBSyxLQUFPLE9BQ1osRUFBSyxLQUFPLFlBR1AsRUFHVCxZQUNFLEVBQ0EsRUFDQSxFQUNBLENBQ0EsTUFBTyxLQUFTLFdBQ1osUUFDQSxNQUFNLFlBQVksRUFBTSxFQUEyQixHQUd6RCxhQUFhLEVBQWMsRUFBOEIsQ0FDdkQsTUFBSSxJQUFRLE1BQVEsS0FBSyxpQkFBaUIsR0FDakMsS0FBSyxhQUFhLEVBQUssTUFBTyxHQUVoQyxNQUFNLGFBQWEsRUFBTSxHQUdsQyxhQUFhLEVBQWMsRUFBaUIsR0FBYSxDQUN2RCxHQUFJLEdBQVEsTUFBUSxLQUFLLGlCQUFpQixHQUFPLENBQy9DLEdBQU0sQ0FBRSxNQUFLLFNBQVUsRUFDdkIsQUFBSSxLQUFLLGNBQWMsSUFDckIsS0FBSyxXQUFXLGVBQ2QsS0FBSyxpQkFBaUIsR0FDdEIsRUFBSSxJQUFJLE9BR1osS0FBSyxhQUFhLEVBQU8sT0FFekIsT0FBTSxhQUFhLEVBQU0sR0FJN0IsaUNBQ0UsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxBQUFJLEVBQUssT0FBUyxPQUFTLEVBQUssT0FBUyxNQUN2QyxLQUFLLE1BQU0sRUFBTyxtQkFBb0IsQ0FBRSxHQUFJLEVBQUssTUFDNUMsQUFBSSxFQUFLLE9BQ2QsS0FBSyxNQUFNLEVBQU8saUJBQWtCLENBQUUsR0FBSSxFQUFLLE1BRS9DLE1BQU0saUNBQWlDLEVBQU0sRUFBUSxHQUl6RCxxQkFDRSxFQUNBLEVBQ0csQ0FDSCxHQUFNLEdBQU8sTUFBTSxxQkFBcUIsRUFBWSxHQUVwRCxHQUFJLEVBQUssT0FBTyxPQUFTLFNBQVUsQ0FHakMsR0FGQyxFQUE0QyxLQUFPLG1CQUNuRCxFQUE0QyxPQUFTLEVBQUssVUFBVSxHQUVuRSxLQUFLLFVBQVUscUJBQ2YsS0FBSyxVQUFVLG9CQUNmLENBQUEsR0FBQSxHQUNDLEVBQTRDLFdBQVUsR0FDckQsRUFBSyxVQUFVLEtBQUUsS0FBQSxFQUFJLEtBR3pCLE1BQU8sR0FBSyxVQUVaLE1BQU8sR0FBSyxPQUdkLE1BQU8sR0FHVCxzQkFDRSxFQUtBLENBRUEsQUFBSSxFQUFLLE9BQVMsb0JBSWxCLE1BQU0sc0JBQXNCLEdBRzlCLFlBQ0UsRUFDQSxFQUNBLENBQ0EsR0FBTSxHQUFpQixLQUFLLE1BQU0sZ0JBQzVCLEVBQU8sTUFBTSxZQUFZLEVBQVksR0FFM0MsT0FBUSxFQUFLLFVBQ04sdUJBRUgsRUFBSyxTQUFXLEtBQ2hCLFVBRUcseUJBQ0gsQUFDRSxFQUFLLFdBQVcsU0FBVyxHQUUzQixFQUFLLFdBQVcsR0FBRyxPQUFTLDRCQUc1QixHQUFLLEtBQU8sdUJBRVosRUFBSyxTQUFXLEVBQUssV0FBVyxHQUFHLFNBQ25DLE1BQU8sR0FBSyxnQkFJWCwyQkFDSCxDQUFBLEdBQUEsR0FDRSxHQUFNLENBQUUsZUFBZ0IsRUFDeEIsQUFDRSxJQUFBLEtBQUEsT0FBQSxFQUFhLFFBQVMsb0JBQ3RCLElBQUEsRUFBWSxhQUFVLEtBQUEsT0FBdEIsRUFBd0IsUUFBUyxHQUVqQyxFQUFZLFFBQVUsRUFBSyxPQUUzQixLQUFLLG1CQUNILEVBS0EsR0FLTixNQUdKLE1BQU8sR0FHVCxlQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxHQUFNLEdBQU8sTUFBTSxlQUFlLEVBQU0sRUFBVSxFQUFTLEdBRTNELEdBQUksRUFBTSxxQkFRUixHQUxFLEdBQUssT0FBUyw0QkFDZCxFQUFLLE9BQVMsMkJBRWQsR0FBSyxLQUFPLEVBQUssS0FBSyxVQUFVLElBRTlCLEVBQU0sS0FBTSxDQUNkLEdBQU0sR0FBUSxLQUFLLGdCQUFnQixHQUNuQyxTQUFNLFdBQWEsRUFDWixLQUFLLFdBQVcsRUFBTyx3QkFFM0IsQUFDTCxHQUFLLE9BQVMsb0JBQ2QsRUFBSyxPQUFTLG1CQUVkLEdBQUssU0FBVyxJQUdsQixNQUFPLEdBR1QseUJBQXlCLEVBQXVCLENBQzlDLE1BQUksR0FBSyxPQUFTLG1CQUNoQixHQUFPLEVBQUssWUFFUCxNQUFNLHlCQUF5QixHQUl4QyxpQkFBaUIsRUFBdUIsQ0FDdEMsTUFBTyxHQUFLLE9BQVMsWUFBYyxFQUFLLE9BQVMsUUFBVSxDQUFDLEVBQUssT0FHbkUsZUFBZSxFQUF1QixDQUNwQyxNQUFPLEdBQUssUUFBVSxFQUFLLE9BQVMsT0FBUyxFQUFLLE9BQVMsTUFHN0QsYUFDRSxFQUNBLEVBQ0EsRUFDRyxDQUNILE1BQU8sSUFBaUIsTUFBTSxhQUFhLEVBQU0sRUFBTSxJQUd6RCxtQkFBbUIsRUFBYyxFQUFvQixDQUNuRCxNQUFNLG1CQUFtQixFQUFNLEdBQy9CLEdBQWlCLEdBR25CLGlCQUNFLEVBQ0EsRUFBbUIsS0FBSyxNQUFNLGNBQ3hCLENBQ04sTUFBTSxpQkFBaUIsRUFBTSxHQUM3QixHQUFpQixLQ3hqQmhCLFFBQWlCLENBQ3RCLFlBQVksRUFBZSxFQUF5QixDQUFBLEtBS3BELE1BQUssT0FBQSxLQUNMLGNBQWEsT0FMWCxLQUFLLE1BQVEsRUFDYixLQUFLLGNBQWdCLENBQUMsQ0FBQyxJQU9yQixHQUVGLENBQ0YsTUFBTyxHQUFJLElBQVcsS0FDdEIsT0FBUSxHQUFJLElBQVcsUUFDdkIsT0FBUSxHQUFJLElBQVcsU0FDdkIsT0FBUSxHQUFJLElBQVcsaUJBQWtCLEtBSXpDLEdBQU0sU0FBVyxHQUFJLElBQVcsSUFBSyxJQ0F2QyxHQUFNLElBQWEsR0FDYixFQUFhLEdBQ2IsR0FBUyxHQUNULEdBQVcsR0FDWCxHQUFTLEdBQ1QsR0FBVSxHQW9CVCxRQUF3QixDQWlCN0IsWUFBWSxFQUFlLEVBQXFCLEdBQUksQ0FBQSxLQWhCcEQsTUFBSyxPQUFBLEtBQ0wsUUFBTyxPQUFBLEtBQ1AsV0FBVSxPQUFBLEtBQ1YsV0FBVSxPQUFBLEtBQ1YsaUJBQWdCLE9BQUEsS0FDaEIsT0FBTSxPQUFBLEtBQ04sU0FBUSxPQUFBLEtBQ1IsT0FBTSxPQUFBLEtBQ04sUUFBTyxPQUFBLEtBQ1AsTUFBSyxPQVFILEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxFQUFLLFFBQ3BCLEtBQUssV0FBYSxDQUFDLENBQUMsRUFBSyxXQUN6QixLQUFLLFdBQWEsQ0FBQyxDQUFDLEVBQUssV0FDekIsS0FBSyxpQkFBbUIsQ0FBQyxDQUFDLEVBQUssaUJBQy9CLEtBQUssT0FBUyxDQUFDLENBQUMsRUFBSyxPQUNyQixLQUFLLFNBQVcsQ0FBQyxDQUFDLEVBQUssU0FDdkIsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUFLLE9BQ3JCLEtBQUssUUFBVSxDQUFDLENBQUMsRUFBSyxRQUN0QixLQUFLLE1BQVEsRUFBSyxPQUFTLEtBQU8sRUFBSyxNQUFRLEtBRTdDLEtBQUssY0FBZ0IsT0FNZCxHQUFXLEdBQUksS0FFNUIsWUFBdUIsRUFBYyxFQUF3QixHQUFlLENBQzFFLEVBQVEsUUFBVSxFQUNsQixHQUFNLEdBQVEsRUFBWSxFQUFNLEdBQ2hDLFVBQVMsSUFBSSxFQUFNLEdBQ1osRUFHVCxZQUFxQixFQUFjLEVBQWUsQ0FDaEQsTUFBTyxHQUFZLEVBQU0sQ0FBRSxjQUFZLFVBR3pDLEdBQUksSUFBbUIsR0FDVixHQUFrQyxHQUN6QyxHQUF3QixHQUN4QixHQUF3QixHQUN4QixHQUE4QixHQUM5QixHQUE4QixHQUM5QixHQUEyQixHQUVqQyxXQUFxQixFQUFjLEVBQXdCLEdBQWUsQ0FBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQ3hFLFFBQUUsR0FDRixHQUFZLEtBQUssR0FDakIsR0FBWSxLQUFJLEdBQUMsRUFBUSxRQUFLLEtBQUEsRUFBSSxJQUNsQyxHQUFpQixLQUFJLEdBQUMsRUFBUSxhQUFVLEtBQUEsRUFBSSxJQUM1QyxHQUFpQixLQUFJLEdBQUMsRUFBUSxhQUFVLEtBQUEsRUFBSSxJQUM1QyxHQUFjLEtBQUksR0FBQyxFQUFRLFNBQU0sS0FBQSxFQUFJLElBQ3JDLEdBQVcsS0FBSyxHQUFJLElBQWtCLEVBQU0sSUFFckMsR0FHVCxZQUNFLEVBQ0EsRUFBd0IsR0FDYixDQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFDWCxRQUFFLEdBQ0YsR0FBUyxJQUFJLEVBQU0sSUFDbkIsR0FBWSxLQUFLLEdBQ2pCLEdBQVksS0FBSSxHQUFDLEVBQVEsUUFBSyxLQUFBLEVBQUksSUFDbEMsR0FBaUIsS0FBSSxHQUFDLEVBQVEsYUFBVSxLQUFBLEVBQUksSUFDNUMsR0FBaUIsS0FBSSxHQUFDLEVBQVEsYUFBVSxLQUFBLEVBQUksSUFDNUMsR0FBYyxLQUFJLEdBQUMsRUFBUSxTQUFNLEtBQUEsRUFBSSxJQUVyQyxHQUFXLEtBQUssR0FBSSxJQUFrQixPQUFRLElBRXZDLEdBUUYsR0FBTSxJQUFLLENBRWhCLFNBQVUsRUFBWSxJQUFLLENBQUUsY0FBWSxlQUN6QyxhQUFjLEVBQVksS0FBTSxDQUFFLGNBQVksZUFDOUMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxjQUFZLGVBQzdDLFNBQVUsRUFBWSxLQUN0QixZQUFhLEVBQVksTUFDekIsT0FBUSxFQUFZLElBQUssQ0FBRSxjQUFZLGVBQ3ZDLFVBQVcsRUFBWSxLQUFNLENBQUUsY0FBWSxlQUMzQyxXQUFZLEVBQVksS0FBTSxDQUFFLGNBQVksZUFDNUMsT0FBUSxFQUFZLEtBQ3BCLFVBQVcsRUFBWSxNQUN2QixPQUFRLEVBQVksSUFBSyxDQUFFLGNBQVksZUFDdkMsT0FBUSxFQUFZLEtBQ3BCLE1BQU8sRUFBWSxJQUFLLENBQUUsZ0JBQzFCLEtBQU0sRUFBWSxJQUFLLENBQUUsZ0JBQ3pCLE1BQU8sRUFBWSxJQUFLLENBQUUsZ0JBQzFCLFlBQWEsRUFBWSxLQUFNLENBQUUsZ0JBQ2pDLElBQUssRUFBWSxLQUNqQixTQUFVLEVBQVksSUFBSyxDQUFFLGdCQUM3QixZQUFhLEVBQVksTUFDekIsTUFBTyxFQUFZLEtBQU0sQ0FBRSxnQkFDM0IsU0FBVSxFQUFZLFlBQ3RCLFNBQVUsRUFBWSxNQUFPLENBQUUsZ0JBQy9CLFVBQVcsRUFBWSxJQUFLLENBQUUsZUFDOUIsYUFBYyxFQUFZLEtBQU0sQ0FBRSxjQUFZLGVBRTlDLGFBQWMsRUFBWSxPQUFRLENBQUUsZUFDcEMsZ0JBQWlCLEVBQVksUUFBUyxDQUFFLGNBQVksZUFFcEQsR0FBSSxFQUFZLEtBQ2hCLEtBQU0sRUFBWSxJQUFLLENBQUUsZUFHekIscUJBQXNCLEVBQVksU0FpQmxDLEdBQUksRUFBWSxJQUFLLENBQUUsY0FBWSxjQUNuQyxPQUFRLEVBQVksS0FBTSxDQUFFLGNBQVksY0FDeEMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxjQUFZLGNBSTdDLFVBQVcsRUFBWSxLQUFNLENBQUUsY0FBWSxjQUMzQyxhQUFjLEVBQVksS0FBTSxDQUFFLGNBQVksY0FHOUMsT0FBUSxFQUFZLFFBQVMsQ0FBRSxVQUFRLFdBQVMsZUFDaEQsS0FBTSxFQUFZLElBQUssQ0FBRSxjQUFZLFVBQVEsZUFDN0MsTUFBTyxFQUFZLElBQUssQ0FBRSxjQUFZLFVBQVEsZUFJOUMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxlQUNqQyxTQUFVLEVBQVksS0FBTSxDQUFFLGVBRzlCLFNBQVUsR0FBWSxLQUFNLEdBQzVCLGtCQUFtQixHQUFZLEtBQU0sR0FDckMsVUFBVyxHQUFZLEtBQU0sR0FDN0IsV0FBWSxHQUFZLEtBQU0sR0FDOUIsVUFBVyxHQUFZLElBQUssR0FDNUIsV0FBWSxHQUFZLElBQUssR0FDN0IsV0FBWSxHQUFZLElBQUssR0FDN0IsU0FBVSxHQUFZLGdCQUFpQixHQUN2QyxHQUFJLEdBQVksWUFBYSxHQUM3QixHQUFJLEdBQVksWUFBYSxHQUM3QixXQUFZLEdBQVksWUFBYSxHQUNyQyxTQUFVLEdBQVksWUFBYSxHQUNuQyxVQUFXLEdBQVksWUFBYSxHQUNwQyxVQUFXLEdBQVksWUFBYSxHQUNwQyxRQUFTLEVBQVksTUFBTyxDQUFFLGNBQVksTUFBTyxFQUFHLFVBQVEsZUFFNUQsT0FBUSxFQUFZLElBQUssQ0FBRSxNQUFPLEdBQUksZUFFdEMsS0FBTSxFQUFZLElBQUssQ0FBRSxNQUFPLEtBQ2hDLE1BQU8sR0FBWSxJQUFLLElBQ3hCLFNBQVUsRUFBWSxLQUFNLENBQzFCLGNBQ0EsTUFBTyxHQUNQLGlCQUFrQixLQVFwQixJQUFLLEdBQWMsS0FBTSxDQUFFLGNBQVksTUFBTyxJQUM5QyxZQUFhLEdBQWMsYUFBYyxDQUFFLGNBQVksTUFBTyxJQUU5RCxPQUFRLEdBQWMsU0FDdEIsTUFBTyxHQUFjLE9BQVEsQ0FBRSxnQkFDL0IsT0FBUSxHQUFjLFNBQ3RCLFVBQVcsR0FBYyxZQUN6QixVQUFXLEdBQWMsWUFDekIsU0FBVSxHQUFjLFVBQVcsQ0FBRSxnQkFDckMsTUFBTyxHQUFjLE9BQVEsQ0FBRSxnQkFDL0IsU0FBVSxHQUFjLFdBQ3hCLFVBQVcsR0FBYyxXQUFZLENBQUUsZUFDdkMsSUFBSyxHQUFjLE1BQ25CLFFBQVMsR0FBYyxTQUFVLENBQUUsZ0JBQ25DLFFBQVMsR0FBYyxVQUN2QixPQUFRLEdBQWMsUUFBUyxDQUFFLGNBQVksVUFBUSxlQUNyRCxLQUFNLEdBQWMsT0FDcEIsS0FBTSxHQUFjLE9BQ3BCLE9BQVEsR0FBYyxTQUN0QixNQUFPLEdBQWMsUUFDckIsS0FBTSxHQUFjLE1BQU8sQ0FBRSxjQUFZLGVBQ3pDLE1BQU8sR0FBYyxPQUFRLENBQUUsZUFDL0IsT0FBUSxHQUFjLFFBQVMsQ0FBRSxlQUNqQyxPQUFRLEdBQWMsUUFBUyxDQUFFLGVBQ2pDLFNBQVUsR0FBYyxVQUFXLENBQUUsZ0JBQ3JDLFFBQVMsR0FBYyxVQUN2QixRQUFTLEdBQWMsU0FBVSxDQUFFLGVBQ25DLE1BQU8sR0FBYyxPQUFRLENBQUUsZUFDL0IsTUFBTyxHQUFjLE9BQVEsQ0FBRSxlQUMvQixPQUFRLEdBQWMsUUFBUyxDQUFFLGVBQ2pDLFFBQVMsR0FBYyxTQUFVLENBQUUsY0FBWSxVQUFRLGVBQ3ZELE1BQU8sR0FBYyxPQUFRLENBQUUsY0FBWSxVQUFRLGVBQ25ELFFBQVMsR0FBYyxTQUFVLENBQUUsY0FBWSxVQUFRLGVBRXZELElBQUssR0FBYyxLQUFNLENBQUUsVUFBUSxnQkFDbkMsS0FBTSxHQUFjLE1BQU8sQ0FBRSxZQUM3QixPQUFRLEdBQWMsUUFBUyxDQUFFLFlBTWpDLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBR3JDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFlBQWEsR0FBa0IsYUFBYyxDQUFFLGVBQy9DLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBQzdDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBRTdDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLFVBQVcsR0FBa0IsV0FBWSxDQUFFLGVBQzNDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBR3ZDLFVBQVcsR0FBa0IsV0FBWSxDQUFFLGVBQzNDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBRTdDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBQzdDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBRW5DLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBRXZDLEtBQU0sRUFBWSxPQUFRLENBQUUsZUFHNUIsT0FBUSxFQUFZLFNBQVUsQ0FBRSxlQUNoQyxJQUFLLEVBQVksTUFBTyxDQUFFLGVBQzFCLE9BQVEsRUFBWSxTQUFVLENBQUUsZUFDaEMsUUFBUyxFQUFZLFVBQVcsQ0FBRSxlQUVsQyxPQUFRLEVBQVksU0FBVSxDQUFFLGVBQ2hDLFlBQWEsRUFBWSxRQUFTLENBQUUsZUFDcEMsSUFBSyxFQUFZLE9BR2pCLFFBQVMsRUFBWSxXQUNyQixRQUFTLEVBQVksVUFBVyxDQUFFLFdBQVksS0FDOUMsWUFBYSxFQUFZLGNBQWUsQ0FBRSxXQUFZLEtBQ3RELFVBQVcsRUFBWSxhQUd2QixZQUFhLEVBQVksS0FBTSxDQUFFLFdBQVksTUFHeEMsWUFBMkIsRUFBMkIsQ0FDM0QsTUFBTyxJQUFLLElBQWMsR0FBZ0IsSUFHckMsWUFBMkMsRUFBMkIsQ0FHM0UsTUFBTyxJQUFrQixHQUdwQixZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQUssSUFBYyxHQUFnQixJQUdyQyxZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQUssSUFBYyxHQUFtQixJQUd4QyxZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQWlCLEdBR25CLFlBQWlDLEVBQTJCLENBQ2pFLE1BQU8sSUFBaUIsR0FHbkIsWUFBMkIsRUFBMkIsQ0FDM0QsTUFBTyxJQUFLLElBQWEsR0FBd0IsR0FHNUMsWUFBNEMsRUFBMkIsQ0FDNUUsTUFBTyxJQUFLLEtBQXFCLEdBQW1CLElBRy9DLFlBQXFCLEVBQTJCLENBQ3JELE1BQU8sSUFBSyxJQUFjLEdBQWtCLEdBR3ZDLFlBQXdCLEVBQTJCLENBQ3hELE1BQU8sSUFBSyxJQUFjLEdBQWtCLEdBR3ZDLFlBQXlCLEVBQTJCLENBQ3pELE1BQU8sSUFBSyxJQUFtQixHQUF1QixHQUdqRCxZQUF3QixFQUEyQixDQUN4RCxNQUFPLEtBQW1CLEdBR3JCLFlBQXVCLEVBQTJCLENBQ3ZELE1BQU8sSUFBYyxHQUdoQixZQUErQixFQUEyQixDQUMvRCxNQUFPLElBQUssS0FBaUIsR0FBbUIsSUFHM0MsWUFBbUMsRUFBMkIsQ0FDbkUsTUFBTyxJQUFLLEtBQW9CLEdBQWlCLElBRzVDLFlBQXdCLEVBQTBCLENBQ3ZELE1BQU8sSUFBWSxHQUdkLFlBQWlDLEVBQTBCLENBQ2hFLE1BQU8sSUFBWSxHQU9kLFlBQWlDLEVBQTJCLENBQ2pFLE1BQU8sS0FBcUIsR0FHdkIsWUFBeUIsRUFBMkIsQ0FDekQsTUFBTyxJQUFLLElBQXVCLEdBQTJCLEdBR3pELFlBQTBCLEVBQXFDLENBQ3BFLE1BQU8sSUFBVyxHQVFsQixHQUFxQixHQUFDLGNBQWdCLEdBQVcsQ0FDL0MsRUFBUSxPQUdWLEdBQXFCLEdBQUMsY0FDcEIsR0FBeUIsR0FBQyxjQUMxQixHQUEyQixJQUFDLGNBQzFCLEdBQVcsQ0FDVCxFQUFRLEtBQUssR0FBRyxRQUd0QixHQUF3QixJQUFDLGNBQWdCLEdBQVcsQ0FDbEQsQUFBSSxFQUFRLEVBQVEsT0FBUyxLQUFPLEdBQUcsU0FDckMsRUFBUSxNQUVSLEVBQVEsS0FBSyxHQUFHLFdBSXBCLEdBQTBCLEtBQUMsY0FBZ0IsR0FBVyxDQUNwRCxFQUFRLEtBQUssR0FBRyxPQUFRLEdBQUcsU0NqYy9CLEdBQUksSUFBK0IsK3FJQUUvQixHQUEwQixva0ZBRXhCLEdBQTBCLEdBQUksUUFDbEMsSUFBTSxHQUErQixLQUVqQyxHQUFxQixHQUFJLFFBQzdCLElBQU0sR0FBK0IsR0FBMEIsS0FHakUsR0FBK0IsR0FBMEIsS0FRekQsR0FBTSxJQUE2QixDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxFQUFFLE1BRXQ5QyxHQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEtBSzd2QixZQUF1QixFQUFjLEVBQWlDLENBQ3BFLEdBQUksR0FBTSxNQUNWLE9BQVMsR0FBSSxFQUFHLEVBQVMsRUFBSSxPQUFRLEVBQUksRUFBUSxHQUFLLEVBQUcsQ0FFdkQsR0FEQSxHQUFPLEVBQUksR0FDUCxFQUFNLEVBQU0sTUFBTyxHQUd2QixHQURBLEdBQU8sRUFBSSxFQUFJLEdBQ1gsR0FBTyxFQUFNLE1BQU8sR0FFMUIsTUFBTyxHQUtGLFlBQTJCLEVBQXVCLENBQ3ZELE1BQUksR0FBSSxHQUFnQyxJQUE2QixHQUNqRSxHQUFJLEdBQWlDLEdBQ3JDLEVBQUksR0FBZ0MsSUFBNkIsR0FDakUsR0FBSSxJQUFpQyxHQUNyQyxHQUFRLE1BRVIsR0FBUSxLQUFRLEdBQXdCLEtBQUssT0FBTyxhQUFhLElBRzlELEdBQWMsRUFBTSxJQUt0QixZQUEwQixFQUF1QixDQUN0RCxNQUFJLEdBQUksR0FBNEIsSUFBNkIsR0FDN0QsRUFBSSxHQUEyQixHQUMvQixFQUFJLEdBQWdDLEdBQ3BDLEdBQUksR0FBaUMsR0FDckMsRUFBSSxHQUFnQyxJQUE2QixHQUNqRSxHQUFJLElBQWlDLEdBQ3JDLEdBQVEsTUFDSCxHQUFRLEtBQVEsR0FBbUIsS0FBSyxPQUFPLGFBQWEsSUFHbkUsR0FBYyxFQUFNLEtBQ3BCLEdBQWMsRUFBTSxJQzlFeEIsR0FBTSxJQUFnQixDQUNwQixRQUFTLENBQ1AsUUFDQSxPQUNBLFFBQ0EsV0FDQSxXQUNBLFVBQ0EsS0FDQSxPQUNBLFVBQ0EsTUFDQSxXQUNBLEtBQ0EsU0FDQSxTQUNBLFFBQ0EsTUFDQSxNQUNBLFFBQ0EsUUFDQSxPQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsVUFDQSxTQUNBLFNBQ0EsT0FDQSxPQUNBLFFBQ0EsS0FDQSxhQUNBLFNBQ0EsT0FDQSxVQUVGLE9BQVEsQ0FDTixhQUNBLFlBQ0EsTUFDQSxVQUNBLFVBQ0EsWUFDQSxTQUNBLFNBQ0EsU0FFRixXQUFZLENBQUMsT0FBUSxjQUVqQixHQUFXLEdBQUksS0FBSSxHQUFjLFNBQ2pDLEdBQXlCLEdBQUksS0FBSSxHQUFjLFFBQy9DLEdBQTZCLEdBQUksS0FBSSxHQUFjLFlBS2xELFlBQXdCLEVBQWMsRUFBNEIsQ0FDdkUsTUFBUSxJQUFZLElBQVMsU0FBWSxJQUFTLE9BUTdDLFlBQThCLEVBQWMsRUFBNEIsQ0FDN0UsTUFBTyxJQUFlLEVBQU0sSUFBYSxHQUF1QixJQUFJLEdBTy9ELFlBQXNDLEVBQXVCLENBQ2xFLE1BQU8sSUFBMkIsSUFBSSxHQVFqQyxZQUNMLEVBQ0EsRUFDUyxDQUNULE1BQ0UsSUFBcUIsRUFBTSxJQUFhLEdBQTZCLEdBSWxFLFlBQW1CLEVBQXVCLENBQy9DLE1BQU8sSUFBUyxJQUFJLEdDM0VmLFlBQ0wsRUFDQSxFQUNBLEVBQ1MsQ0FDVCxNQUNFLEtBQU8sSUFDUCxJQUFJLElBQ0osR0FBa0IsR0FTdEIsR0FBTSxJQUFzQixHQUFJLEtBQUksQ0FDbEMsUUFDQSxPQUNBLFFBQ0EsV0FDQSxXQUNBLFVBQ0EsS0FDQSxPQUNBLFVBQ0EsTUFDQSxXQUNBLEtBQ0EsU0FDQSxTQUNBLFFBQ0EsTUFDQSxNQUNBLFFBQ0EsUUFDQSxPQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsVUFDQSxTQUNBLFNBQ0EsT0FDQSxPQUNBLFFBQ0EsS0FDQSxhQUNBLFNBQ0EsT0FDQSxTQUVBLGFBQ0EsWUFDQSxNQUNBLFVBQ0EsVUFDQSxZQUNBLFNBQ0EsU0FDQSxRQUVBLE9BQ0EsWUFFQSxPQUNBLFVBR0ssWUFBMkIsRUFBdUIsQ0FDdkQsTUFBTyxJQUFvQixJQUFJLEdDekYxQixHQUFNLElBQXFCLEVBQ3JCLEdBQXFCLEVBQ3JCLEdBQXFCLEVBQ3JCLEdBQXFCLEVBQ3JCLEdBQXFCLEVBQ3JCLEdBQXFCLEdBQ3JCLEdBQXFCLEdBQ3JCLEdBQXFCLEdBQ3JCLEdBQXFCLElBQ3JCLEdBQXFCLElBQ3JCLEdBQVksR0FBZ0IsR0FBaUIsR0FBcUIsR0FnQmxFLEdBQTZCLEVBQzdCLEdBQTZCLEVBRTdCLEdBQTZCLEVBQzdCLEdBQTZCLEVBQzdCLEdBQTZCLEdBSTdCLEdBQTZCLEdBQzdCLEdBQTZCLElBQzdCLEdBQTZCLElBQzdCLEdBQTZCLElBQzdCLEdBQTZCLEtBQzdCLEdBQTZCLEtBQzdCLEdBQTZCLEtBRTdCLEdBQStCLEtBSy9CLEdBQXFCLEdBQWtCLEdBQWlCLEdBQXNCLEdBQWlCLEdBQy9GLEdBQXFCLEdBQWtCLEVBQWlCLEdBQXNCLEdBQzlFLEdBQXFCLEdBQWtCLEVBQWlCLEdBQXNCLEVBQzlFLEdBQXFCLEdBQWtCLEVBQWlCLEdBQXNCLEVBQzlFLEdBQXFCLEdBQWtCLEVBQWlCLEdBQXNCLEVBQzlFLEdBQXFCLEVBQWtCLEdBQWlCLEVBQXNCLEdBQzlFLEdBQXFCLEVBQWtCLEdBQWlCLEVBQXNCLEVBQzlFLEdBQXFCLEdBQWtCLEdBQWlCLEdBQXNCLEdBQW1CLEdBQ2pHLEdBQXFCLEVBQWtCLEVBQWlCLEVBQWUsR0FHdkUsR0FBcUIsRUFBa0IsRUFBaUIsRUFBc0IsR0FDOUUsR0FBcUIsR0FBa0IsRUFBaUIsRUFBc0IsR0FFOUUsR0FBcUIsR0FBa0IsR0FDdkMsR0FBcUIsRUFBa0IsRUFBaUIsRUFBc0IsR0FDOUUsR0FBcUIsRUFBa0IsR0FBaUIsRUFBc0IsR0FFOUUsR0FBdUIsR0FnQnZCLEdBQTRCLEVBQzVCLEdBQTRCLEVBQzVCLEdBQTRCLEVBQzVCLEdBQThCLEdBQTRCLEdBRzFELEdBQWdDLEdBQTRCLEdBQzVELEdBQWdDLEdBQTRCLEdBQzVELEdBQWdDLEdBQ2hDLEdBQWdDLEdBQ2hDLEdBQWdDLEVDdkV0QyxRQUFZLENBU2pCLFlBQVksRUFBbUIsQ0FBQSxLQU4vQixJQUFtQixHQUFJLEtBQUssS0FFNUIsUUFBdUIsR0FBSSxLQUFLLEtBRWhDLFVBQXlCLEdBQUksS0FHM0IsS0FBSyxNQUFRLElBTUYsUUFBaUQsQ0FNOUQsWUFBWSxFQUFtQixFQUFtQixDQUFBLEtBTGxELE9BQU0sT0FBQSxLQUNOLFdBQTRCLEdBQUUsS0FDOUIsU0FBUSxPQUFBLEtBQ1IsaUJBQTBDLEdBQUksS0FHNUMsS0FBSyxPQUFTLEVBQ2QsS0FBSyxTQUFXLEtBR2QsYUFBYSxDQUNmLE1BQVEsTUFBSyxlQUFlLE1BQVEsSUFBaUIsS0FFbkQsYUFBYSxDQUNmLE1BQVEsTUFBSyx1QkFBeUIsSUFBa0IsS0FFdEQsYUFBYSxDQUNmLE1BQVEsTUFBSyx3QkFBMEIsSUFBZSxLQUVwRCxtQkFBbUIsQ0FDckIsTUFBUSxNQUFLLHdCQUEwQixJQUFzQixLQUUzRCxVQUFVLENBQ1osTUFBUSxNQUFLLHdCQUEwQixJQUFlLEtBRXBELGtDQUFrQyxDQUNwQyxHQUFNLEdBQVEsS0FBSyx3QkFDbkIsTUFBUSxHQUFRLElBQWUsR0FBTSxHQUFRLEtBQW9CLEtBRS9ELGdCQUFnQixDQUNsQixPQUFTLEdBQUksS0FBSyxXQUFXLE9BQVMsR0FBSyxJQUFLLENBQzlDLEdBQU0sQ0FBRSxTQUFVLEtBQUssV0FBVyxHQUNsQyxHQUFJLEVBQVEsR0FDVixNQUFPLEdBRVQsR0FBSSxFQUFTLElBQVksSUFFdkIsTUFBTyxPQUlULHFCQUFxQixDQUN2QixNQUFRLE1BQUssd0JBQTBCLElBQWtCLEtBRXZELHNCQUFzQixDQUN4QixNQUFPLE1BQUssMkJBQTJCLEtBQUssZ0JBRzlDLFlBQVksRUFBMEIsQ0FDcEMsTUFBTyxJQUFJLElBQU0sR0FHbkIsTUFBTSxFQUFtQixDQUd2QixLQUFLLFdBQVcsS0FBSyxLQUFLLFlBQVksSUFHeEMsTUFBbUIsQ0FFakIsTUFBTyxBQURPLE1BQUssV0FBVyxNQUNqQixNQU1mLDJCQUEyQixFQUF3QixDQUNqRCxNQUFPLENBQUMsQ0FDTixHQUFNLE1BQVMsSUFBaUIsS0FDL0IsQ0FBQyxLQUFLLE9BQU8sVUFBWSxFQUFNLE1BQVEsSUFJNUMsWUFBWSxFQUFjLEVBQTJCLEVBQWUsQ0FDbEUsR0FBSSxHQUFRLEtBQUssZUFDakIsR0FBSSxFQUFjLElBQXNCLEVBQWMsR0FDcEQsS0FBSywwQkFBMEIsRUFBTyxFQUFNLEVBQWEsR0FFekQsQUFBSSxFQUFjLEdBQ2hCLEVBQU0sVUFBVSxJQUFJLEdBRXBCLEVBQU0sUUFBUSxJQUFJLEdBR2hCLEVBQWMsSUFDaEIsS0FBSyxtQkFBbUIsRUFBTyxXQUV4QixFQUFjLEdBQ3ZCLE9BQVMsR0FBSSxLQUFLLFdBQVcsT0FBUyxFQUFHLEdBQUssR0FDNUMsR0FBUSxLQUFLLFdBQVcsR0FDeEIsS0FBSywwQkFBMEIsRUFBTyxFQUFNLEVBQWEsR0FDekQsRUFBTSxJQUFJLElBQUksR0FDZCxLQUFLLG1CQUFtQixFQUFPLEdBRTNCLElBQU0sTUFBUSxLQU42QixFQUFFLEVBTWpELENBR0osQUFBSSxLQUFLLE9BQU8sVUFBWSxFQUFNLE1BQVEsSUFDeEMsS0FBSyxpQkFBaUIsT0FBTyxHQUlqQyxtQkFBbUIsRUFBZSxFQUFjLENBQzlDLEFBQUksS0FBSyxPQUFPLFVBQVksRUFBTSxNQUFRLElBQ3hDLEtBQUssaUJBQWlCLE9BQU8sR0FJakMsMEJBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEFBQUksS0FBSyxvQkFBb0IsRUFBTyxFQUFNLElBQ3hDLEtBQUssT0FBTyxNQUFNLEVBQU8saUJBQWtCLENBQ3pDLEdBQUksRUFDSixlQUFnQixJQUt0QixvQkFDRSxFQUNBLEVBQ0EsRUFDUyxDQUNULE1BQU0sR0FBYyxHQUVoQixFQUFjLEdBRWQsRUFBTSxRQUFRLElBQUksSUFDbEIsRUFBTSxVQUFVLElBQUksSUFDcEIsRUFBTSxJQUFJLElBQUksR0FJZCxFQUFjLEdBRWQsRUFBTSxRQUFRLElBQUksSUFDakIsQ0FBQyxLQUFLLDJCQUEyQixJQUFVLEVBQU0sSUFBSSxJQUFJLEdBSzNELEVBQU0sUUFBUSxJQUFJLElBR2pCLENBQ0UsR0FBTSxNQUFRLElBQ2QsRUFBTSxRQUFRLFNBQVMsT0FBTyxRQUFVLElBRTNDLENBQUMsS0FBSywyQkFBMkIsSUFBVSxFQUFNLFVBQVUsSUFBSSxHQXpCckIsR0E2Qi9DLGlCQUFpQixFQUFrQixDQUNqQyxHQUFNLENBQUUsUUFBUyxFQUNYLEVBQWdCLEtBQUssV0FBVyxHQUN0QyxBQUNFLENBQUMsRUFBYyxRQUFRLElBQUksSUFDM0IsQ0FBQyxFQUFjLElBQUksSUFBSSxJQUl2QixDQUFDLEVBQWMsVUFBVSxJQUFJLElBRTdCLEtBQUssaUJBQWlCLElBQUksRUFBTSxFQUFHLElBQUksT0FJM0MsY0FBdUIsQ0FDckIsTUFBTyxNQUFLLFdBQVcsS0FBSyxXQUFXLE9BQVMsR0FHbEQsc0JBQW1DLENBQ2pDLE9BQVMsR0FBSSxLQUFLLFdBQVcsT0FBUyxHQUFLLElBQUssQ0FDOUMsR0FBTSxDQUFFLFNBQVUsS0FBSyxXQUFXLEdBQ2xDLEdBQUksRUFBUSxHQUNWLE1BQU8sSUFNYix1QkFBb0MsQ0FDbEMsT0FBUyxHQUFJLEtBQUssV0FBVyxPQUFTLEdBQUssSUFBSyxDQUM5QyxHQUFNLENBQUUsU0FBVSxLQUFLLFdBQVcsR0FDbEMsR0FBSSxFQUFTLElBQVksS0FBZ0IsQ0FBRSxHQUFRLElBQ2pELE1BQU8sTUMzTmYsZ0JBQXdCLEdBQU0sQ0FBQSxlQUFBLEVBQUEsQ0FBQSxNQUFBLEdBQUEsR0FBQSxLQUU1QixpQkFBZ0MsR0FBSSxPQUd2QixnQkFBK0IsR0FBd0IsQ0FDcEUsWUFBWSxFQUE4QixDQUN4QyxNQUFPLElBQUksSUFBVSxHQUd2QixZQUFZLEVBQWMsRUFBMkIsRUFBZSxDQUNsRSxHQUFNLEdBQVEsS0FBSyxlQUNuQixHQUFJLEVBQWMsR0FBNEIsQ0FDNUMsS0FBSywwQkFBMEIsRUFBTyxFQUFNLEVBQWEsR0FDekQsS0FBSyxtQkFBbUIsRUFBTyxHQUMvQixFQUFNLGlCQUFpQixJQUFJLEdBQzNCLE9BR0YsTUFBTSxZQUFZLEVBQU0sRUFBYSxHQUd2QyxvQkFDRSxFQUNBLEVBQ0EsRUFDUyxDQUNULE1BQUksT0FBTSxvQkFBb0IsRUFBTyxFQUFNLEdBQXFCLEdBRTVELEVBQWMsR0FFZCxDQUFDLEVBQU0saUJBQWlCLElBQUksSUFDM0IsR0FBTSxRQUFRLElBQUksSUFBUyxFQUFNLFVBQVUsSUFBSSxJQUk3QyxHQUdULGlCQUFpQixFQUFrQixDQUNqQyxBQUFLLEtBQUssV0FBVyxHQUFHLGlCQUFpQixJQUFJLEVBQUcsT0FDOUMsTUFBTSxpQkFBaUIsS0N0Q2QsUUFBaUIsQ0FBQSxhQUFBLENBQUEsS0FhOUIsa0JBQTZCLEdBQUssS0FDbEMsNEJBQXVDLEdBYXZDLFVBQVUsRUFBcUMsQ0FDN0MsR0FBSSxNQUFPLElBQWlCLFNBQzFCLE1BQU8sTUFBSyxRQUFRLElBQUksR0FDbkIsQ0FDTCxHQUFNLENBQUMsRUFBWSxHQUFpQixFQUNwQyxHQUFJLENBQUMsS0FBSyxVQUFVLEdBQ2xCLE1BQU8sR0FFVCxHQUFNLEdBQWdCLEtBQUssUUFBUSxJQUFJLEdBQ3ZDLE9BQVcsS0FBTyxRQUFPLEtBQ3ZCLEdBRUEsR0FBSSxJQUFBLEtBQUEsT0FBQSxFQUFnQixNQUFTLEVBQWMsR0FDekMsTUFBTyxHQUdYLE1BQU8sSUFJWCxnQkFHRSxFQUFvQixFQUFrQixDQUFBLEdBQUEsR0FDdEMsTUFBQSxHQUFRLEtBQUssUUFBUSxJQUFJLEtBQU8sS0FBQSxPQUF6QixFQUNMLEtDdkJOLFlBQTZCLEVBQW9CLEVBQTBCLENBQ3pFLEFBQUksRUFBSyxtQkFBcUIsT0FDNUIsRUFBSyxpQkFBbUIsRUFFeEIsRUFBSyxpQkFBaUIsUUFBUSxHQUFHLEdBU3JDLFlBQTRCLEVBQW9CLEVBQTBCLENBQ3hFLEFBQUksRUFBSyxrQkFBb0IsT0FDM0IsRUFBSyxnQkFBa0IsRUFFdkIsRUFBSyxnQkFBZ0IsUUFBUSxHQUFHLEdBUzdCLFlBQ0wsRUFDQSxFQUNBLENBQ0EsQUFBSSxFQUFLLGdCQUFrQixPQUN6QixFQUFLLGNBQWdCLEVBRXJCLEVBQUssY0FBYyxRQUFRLEdBQUcsR0FTbEMsWUFDRSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEdBQUksR0FBYyxLQUNkLEVBQUksRUFBUyxPQUNqQixLQUFPLElBQWdCLE1BQVEsRUFBSSxHQUNqQyxFQUFjLEVBQVMsRUFBRSxHQUUzQixBQUFJLElBQWdCLE1BQVEsRUFBWSxNQUFRLEVBQVUsTUFDeEQsR0FBaUIsRUFBTSxFQUFVLFVBRWpDLEdBQW9CLEVBQWEsRUFBVSxVQUloQyxvQkFBNkIsR0FBVyxDQUNyRCxXQUFXLEVBQXdCLENBQ2pDLEFBQUksS0FBSyxVQUFVLEdBQVEsSUFBSSxTQUFXLEtBQUssVUFDL0MsS0FBSyxNQUFNLFNBQVMsS0FBSyxHQU8zQixlQUFlLEVBQWtCLENBQy9CLEdBQU0sQ0FBRSxnQkFBaUIsS0FBSyxNQUN4QixFQUFxQixFQUFhLE9BQ3hDLEdBQUksSUFBdUIsRUFBRyxPQUM5QixHQUFJLEdBQUksRUFBcUIsRUFDdkIsRUFBZ0IsRUFBYSxHQUVuQyxBQUFJLEVBQWMsUUFBVSxFQUFLLEtBQy9CLEdBQWMsWUFBYyxFQUM1QixLQUdGLEdBQU0sQ0FBRSxNQUFPLEdBQWMsRUFFN0IsS0FBTyxHQUFLLEVBQUcsSUFBSyxDQUNsQixHQUFNLEdBQVksRUFBYSxHQUN6QixFQUFhLEVBQVUsSUFDN0IsR0FBSSxFQUFhLEVBT2YsRUFBVSxlQUFpQixFQUMzQixLQUFLLGdCQUFnQixHQUNyQixFQUFhLE9BQU8sRUFBRyxPQUNsQixDQUNMLEFBQUksSUFBZSxHQUNqQixHQUFVLGFBQWUsR0FHM0IsUUFTTixnQkFBZ0IsRUFBOEIsQ0FDNUMsR0FBTSxDQUFFLFlBQWEsRUFDckIsR0FBSSxFQUFVLGNBQWdCLE1BQVEsRUFBVSxlQUFpQixLQUMvRCxBQUFJLEVBQVUsY0FBZ0IsTUFDNUIsR0FBb0IsRUFBVSxZQUFhLEdBRXpDLEVBQVUsZUFBaUIsTUFDN0IsR0FBbUIsRUFBVSxhQUFjLE9BRXhDLENBRUwsR0FBTSxDQUFFLGVBQWdCLEVBQU0sTUFBTyxHQUFpQixFQUN0RCxHQUFJLEtBQUssTUFBTSxXQUFXLEVBQWUsS0FBRSxHQUl6QyxPQUFRLEVBQUssVUFDTix1QkFDQSxvQkFDQSxtQkFDSCxHQUFvQixFQUFNLEVBQUssV0FBWSxHQUMzQyxVQUNHLHFCQUNBLHlCQUNILEdBQW9CLEVBQU0sRUFBSyxVQUFXLEdBQzFDLFVBQ0csMEJBQ0EseUJBQ0EsOEJBQ0EsbUJBQ0Esa0JBQ0EscUJBQ0gsR0FBb0IsRUFBTSxFQUFLLE9BQVEsR0FDdkMsVUFDRyxzQkFDQSxtQkFDQSxrQkFDSCxHQUFvQixFQUFNLEVBQUssU0FBVSxHQUN6QyxVQUNHLDZCQUNBLG9CQUNILEdBQW9CLEVBQU0sRUFBSyxXQUFZLEdBQzNDLGNBRUEsR0FBaUIsRUFBTSxPQUkzQixJQUFpQixFQUFNLElBVzdCLDJCQUE0QixDQUMxQixHQUFNLENBQUUsZ0JBQWlCLEtBQUssTUFDOUIsT0FBUyxHQUFJLEVBQWEsT0FBUyxFQUFHLEdBQUssRUFBRyxJQUM1QyxLQUFLLGdCQUFnQixFQUFhLElBRXBDLEtBQUssTUFBTSxhQUFlLEdBc0I1QixrQ0FBa0MsRUFBWSxDQUM1QyxHQUFNLENBQUUsZ0JBQWlCLEtBQUssTUFDeEIsQ0FBRSxVQUFXLEVBQ25CLEdBQUksSUFBVyxFQUFHLE9BQ2xCLEdBQU0sR0FBWSxFQUFhLEVBQVMsR0FDeEMsQUFBSSxFQUFVLGNBQWdCLEdBQzVCLEdBQVUsWUFBYyxNQXdCNUIsdUNBQXVDLEVBQWtCLENBQ3ZELEdBQU0sQ0FBRSxnQkFBaUIsS0FBSyxNQUN4QixDQUFFLFVBQVcsRUFDbkIsQUFBSSxJQUFXLEdBRWYsQ0FBSSxFQUFhLEVBQVMsR0FBRyxlQUFpQixFQUM1QyxFQUFhLEVBQVMsR0FBRyxhQUFlLEtBQy9CLEdBQVUsR0FBSyxFQUFhLEVBQVMsR0FBRyxlQUFpQixHQUNsRSxHQUFhLEVBQVMsR0FBRyxhQUFlLE9BVzVDLHdCQUF3QixFQUFZLEVBQWUsRUFBYSxDQUM5RCxHQUFNLENBQUUsZ0JBQWlCLEtBQUssTUFDeEIsRUFBcUIsRUFBYSxPQUN4QyxHQUFJLElBQXVCLEVBQUcsT0FDOUIsR0FBSSxHQUFJLEVBQXFCLEVBRTdCLEtBQU8sR0FBSyxFQUFHLElBQUssQ0FDbEIsR0FBTSxHQUFZLEVBQWEsR0FDekIsRUFBYSxFQUFVLElBRzdCLEdBQUksQUFGaUIsRUFBVSxRQUVWLEVBQ25CLEVBQVUsWUFBYyxVQUNmLElBQWUsRUFDeEIsRUFBVSxhQUFlLFVBQ2hCLEVBQWEsRUFDdEIsU0MzU0ssR0FBWSx5QkFDWixHQUFhLEdBQUksUUFBTyxHQUFVLE9BQVEsS0FHaEQsWUFBbUIsRUFBdUIsQ0FDL0MsT0FBUSxPQUNOLFFBQ0EsUUFDQSxVQUNBLE1BQ0UsTUFBTyxXQUdQLE1BQU8sSUFJTixHQUFNLElBQWlCLGdDQUVqQixHQUNYLGlEQU1XLEdBQTRCLEdBQUksUUFJM0MsT0FHRSxHQUFxQixPQUNyQixRQUdBLDJDQUEyQyxPQUM3QyxLQUlLLFlBQXNCLEVBQXVCLENBQ2xELE9BQVEsT0FDRCxPQUNBLFFBQ0EsUUFDTCxRQUNBLFNBQ0EsVUFDSyxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFdBQ0EsT0FDSCxNQUFPLFdBR1AsTUFBTyxJQzlDRSxZQUFZLENBQUEsYUFBQSxDQUFBLEtBQ3pCLE9BQU0sT0FBQSxLQUNOLFFBQU8sT0FBQSxLQUNQLFVBQVMsT0FBQSxLQUlULFNBQVEsT0FBQSxLQUNSLE9BQU0sT0FBQSxLQWVOLE9BQTRCLEdBQUUsS0FHOUIsaUJBQTJCLEdBQUUsS0FNN0IsVUFBc0IsR0FBRSxLQVF4QiwwQkFBc0MsR0FBRSxLQUd4Qyx1QkFBa0MsR0FBSyxLQUN2QyxPQUFrQixHQUFLLEtBQ3ZCLG1CQUE4QixHQUFLLEtBQ25DLGVBQTBCLEdBQUssS0FDL0IsaUJBQTRCLEdBQUssS0FDakMsZ0JBQTJCLEdBQUssS0FDaEMsa0NBQTZDLEdBQUssS0FHbEQsYUFBa0MsQ0FDaEMseUJBQTBCLEVBQzFCLGNBQWUsTUFDaEIsS0FHRCxVQUFxQixHQUFLLEtBQzFCLDJCQUFzQyxHQUFLLEtBRzNDLE9BSUssR0FBRSxLQUdQLFNBQTZCLEdBQUUsS0FHL0IsYUFBeUMsR0FBRSxLQUczQyxJQUFjLEVBQUMsS0FJZixLQUFJLElBQUEsS0FHSixNQUFhLEtBQUksS0FHakIsTUFBZ0IsRUFBQyxLQUNqQixJQUFjLEVBQUMsS0FJZixjQUEwQixLQUFJLEtBRTlCLGdCQUE0QixLQUFJLEtBQ2hDLGFBQXVCLEVBQUMsS0FJeEIsUUFBNkIsQ0FBQyxHQUFHLE9BQU0sS0FFdkMsbUJBQThCLEdBQUksS0FLbEMsWUFBdUIsR0FBSyxLQUk1Qiw4QkFBaUQsS0FBSSxLQVVyRCxhQUE2RCxHQUFJLEtBQUssS0FHdEUsYUFBdUIsRUEvR3ZCLEtBQUssQ0FBRSxhQUFZLGFBQVksWUFBVyxlQUE4QixDQUN0RSxLQUFLLE9BQ0gsSUFBZSxHQUNYLEdBQ0EsSUFBZSxHQUNmLEdBQ0EsSUFBZSxTQUVyQixLQUFLLFFBQVUsRUFDZixLQUFLLFVBQVksQ0FBQyxFQUNsQixLQUFLLFNBQVcsS0FBSyxPQUFTLEdBQUksSUFBUyxFQUFXLEVBQWEsR0F1R3JFLGFBQXdCLENBQ3RCLE1BQU8sSUFBSSxJQUFTLEtBQUssUUFBUyxLQUFLLElBQU0sS0FBSyxVQUFXLEtBQUssS0FHcEUsTUFBTSxFQUE2QixDQUNqQyxHQUFNLEdBQVEsR0FBSSxJQUNaLEVBQU8sT0FBTyxLQUFLLE1BQ3pCLE9BQVMsR0FBSSxFQUFHLEVBQVMsRUFBSyxPQUFRLEVBQUksRUFBUSxJQUFLLENBQ3JELEdBQU0sR0FBTSxFQUFLLEdBQ2IsRUFBTSxLQUFLLEdBRWYsQUFBSSxDQUFDLEdBQWMsTUFBTSxRQUFRLElBQy9CLEdBQU0sRUFBSSxTQUlaLEVBQU0sR0FBTyxFQUdmLE1BQU8sUUN4S1gsU0FBaUIsRUFBTSxDQUNyQixNQUFPLElBQUksSUFBYyxHQUFjLElBR25DLEdBQW9DLENBQ3hDLFVBQVcsR0FBSSxLQUFZLENBQUEsR0FBQSxHQUFBLEdBQUEsR0FBQSxHQUFBLEdBQUEsSUFBQSxNQVUzQixJQUFLLEdBQUksS0FBWSxDQUtwQixHQUFBLEdBQUEsR0FBQSxPQUdHLEdBQW1DLENBRXZDLElBQU0sR0FBZSxJQUF1QixJQUFJLElBQXVCLEdBR3ZFLElBQU0sR0FBZSxHQUFzQixJQUFJLEdBQXNCLEdBR3JFLElBQU0sR0FBZSxHQUFzQixJQUFJLEdBQXNCLEdBR3JFLElBQU0sR0FDSCxHQUFzQixJQUFJLEdBQXNCLElBQ2hELEdBQUUsSUFBNEIsR0FBRSxJQUNoQyxHQUFFLElBQTRCLEdBQUUsS0FXOUIsWUFDTCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEdBQU0sR0FBYSxFQUNiLEVBQW1CLEVBQ25CLEVBQWlCLEVBRW5CLEVBQU0sR0FDTixFQUFrQixLQUNsQixFQUFhLEVBQ1gsQ0FBRSxVQUFXLEVBQ25CLE9BQVMsQ0FDUCxHQUFJLEdBQU8sRUFBUSxDQUNqQixFQUFPLGFBQWEsRUFBWSxFQUFrQixHQUNsRCxHQUFPLEVBQU0sTUFBTSxFQUFZLEdBQy9CLE1BRUYsR0FBTSxHQUFLLEVBQU0sV0FBVyxHQUM1QixHQUFJLEdBQVksRUFBTSxFQUFJLEVBQU8sR0FBTSxDQUNyQyxHQUFPLEVBQU0sTUFBTSxFQUFZLEdBQy9CLE1BRUYsR0FBSSxJQUFFLEdBQTBCLENBQzlCLEdBQU8sRUFBTSxNQUFNLEVBQVksR0FDL0IsR0FBTSxHQUFNLEdBQ1YsRUFDQSxFQUNBLEVBQ0EsRUFDQSxJQUFTLFdBQ1QsR0FFRixBQUFJLEVBQUksS0FBTyxNQUFRLENBQUMsRUFDdEIsRUFBa0IsQ0FBRSxNQUFLLFlBQVcsV0FFcEMsR0FBTyxFQUFJLEdBRVosQ0FBRSxNQUFLLFlBQVcsV0FBWSxFQUMvQixFQUFhLE1BQ1IsQUFDTCxLQUFFLE1BQ0YsSUFBRSxLQUVGLEdBQUUsRUFDRixFQUFFLEVBQ0YsRUFBWSxHQUNQLEFBQUksSUFBRSxJQUEyQixJQUFFLEdBQ3hDLEFBQUksSUFBUyxXQUNYLElBQU8sRUFBTSxNQUFNLEVBQVksR0FBTztFQUN0QyxFQUFFLEVBRUEsSUFBK0IsSUFDL0IsRUFBTSxXQUFXLEtBQUksSUFFckIsRUFBRSxFQUVKLEVBQUUsRUFDRixFQUFhLEVBQVksR0FFekIsRUFBTyxhQUFhLEVBQVksRUFBa0IsR0FHcEQsRUFBRSxFQUdOLE1BRUksQ0FDRSxNQUNBLElBQUssRUFDTCxrQkFDQSxZQUNBLFVBQ0EsZ0JBQWlCLENBQUMsQ0FBQyxHQUkzQixZQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxNQUFJLEtBQVMsV0FFVCxJQUFFLElBQ0QsSUFBRSxJQUNELEVBQU0sV0FBVyxFQUFNLEtBQWdDLElBSTNELElBQVEsS0FBUyxTQUFRLEdBQUEsSUFTN0IsWUFDRSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEdBQU0sR0FBaUIsQ0FBQyxFQUN4QixJQUVBLEdBQU0sR0FBTyxHQUF1QixFQUFFLE1BQUssS0FBSSxZQUFXLFlBRXBELEVBQUssRUFBTSxXQUFXLEtBQzVCLE9BQVEsT0FDTixLQUNFLE1BQU8sR0FBSTtPQUNiLEtBQ0UsTUFBTyxHQUFJLFVBQ2IsS0FBMkIsQ0FDekIsR0FBSSxHQUNKLE1BQUMsQ0FBRSxPQUFNLE9BQVEsR0FDZixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FDQSxFQUNBLEdBRUssRUFBSSxJQUFTLEtBQU8sS0FBTyxPQUFPLGFBQWEsUUFFeEQsS0FBMkIsQ0FDekIsR0FBSSxHQUNKLE1BQUMsQ0FBRSxPQUFNLE9BQVEsR0FDZixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FFSyxFQUFJLElBQVMsS0FBTyxLQUFPLE9BQU8sY0FBYyxRQUV6RCxLQUNFLE1BQU8sR0FBSSxTQUNiLElBQ0UsTUFBTyxHQUFJLFVBQ2IsS0FDRSxNQUFPLEdBQUksVUFDYixLQUNFLE1BQU8sR0FBSSxVQUNiLElBQ0UsQUFBSSxFQUFNLFdBQVcsS0FBSSxJQUN2QixFQUFFLE1BR04sSUFDRSxFQUFZLEVBQ1osRUFBRSxNQUVKLFVBQ0EsTUFDRSxNQUFPLEdBQUksUUFDYixRQUNBLElBQ0UsR0FBSSxFQUNGLE1BQU8sR0FBSSxNQUVYLEVBQU8sb0JBQW9CLEVBQU0sRUFBRyxFQUFXLFdBSWpELEdBQUksR0FBRSxJQUF3QixHQUFFLEdBQXNCLENBQ3BELEdBQU0sR0FBVyxFQUFNLEVBR25CLEVBQVcsQUFGRCxFQUFNLE1BQU0sRUFBVSxFQUFNLEdBQUcsTUFBTSxXQUU5QixHQUVqQixFQUFRLFNBQVMsRUFBVSxHQUMvQixBQUFJLEVBQVEsS0FDVixHQUFXLEVBQVMsTUFBTSxFQUFHLElBQzdCLEVBQVEsU0FBUyxFQUFVLElBRTdCLEdBQU8sRUFBUyxPQUFTLEVBQ3pCLEdBQU0sR0FBTyxFQUFNLFdBQVcsR0FDOUIsR0FDRSxJQUFhLEtBQ2IsSUFBeUIsSUFDekIsSUFBSSxHQUNKLENBQ0EsR0FBSSxFQUNGLE1BQU8sR0FBSSxNQUVYLEVBQU8sb0JBQW9CLEVBQVUsRUFBVyxHQUlwRCxNQUFPLEdBQUksT0FBTyxhQUFhLElBR2pDLE1BQU8sR0FBSSxPQUFPLGFBQWEsS0FTckMsWUFDRSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxHQUFNLEdBQWEsRUFDZixFQUNKLE1BQUMsQ0FBRSxJQUFHLE9BQVEsR0FDWixFQUNBLEVBQ0EsRUFDQSxFQUNBLEdBQ0EsRUFDQSxFQUNBLEdBQ0EsRUFDa0IsQ0FBQyxHQUVqQixJQUFNLE1BQ1IsQ0FBSSxFQUNGLEVBQU8sc0JBQXNCLEVBQVksRUFBVyxHQUVwRCxFQUFNLEVBQWEsR0FHaEIsQ0FBRSxLQUFNLEVBQUcsT0F3QmIsWUFDTCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLENBQ0EsR0FBTSxHQUFRLEVBQ1IsRUFDSixJQUFVLEdBQ04sR0FBa0MsSUFDbEMsR0FBa0MsVUFDbEMsRUFDSixJQUFVLEdBQ04sR0FBaUMsSUFDakMsSUFBVSxHQUNWLEdBQWlDLElBQ2pDLElBQVUsRUFDVixHQUFpQyxJQUNqQyxHQUFpQyxJQUVuQyxFQUFVLEdBQ1YsRUFBUSxFQUVaLE9BQVMsR0FBSSxFQUFHLEVBQUksR0FBYyxJQUFnQixFQUFJLEVBQUcsRUFBRSxFQUFHLENBQzVELEdBQU0sR0FBTyxFQUFNLFdBQVcsR0FDMUIsR0FFSixHQUFJLElBQTZCLElBQUksSUFBc0IsT0FBUSxDQUNqRSxHQUFNLEdBQU8sRUFBTSxXQUFXLEVBQU0sR0FDOUIsRUFBTyxFQUFNLFdBQVcsRUFBTSxHQUVwQyxHQUFLLEdBR0UsR0FDTCxPQUFPLE1BQU0sSUFDYixDQUFDLEVBQWlCLElBQ2xCLEVBQWtCLElBQUksSUFDdEIsRUFBa0IsSUFBSSxHQUN0QixDQUNBLEdBQUksRUFBYSxNQUFPLENBQUUsRUFBRyxLQUFNLE9BQ25DLEVBQU8sMkJBQTJCLEVBQUssRUFBVyxRQVY1QixDQUN0QixHQUFJLEVBQWEsTUFBTyxDQUFFLEVBQUcsS0FBTSxPQUNuQyxFQUFPLGlDQUFpQyxFQUFLLEVBQVcsR0FZMUQsRUFBRSxFQUNGLFNBWUYsR0FUQSxBQUFJLEdBQUksR0FDTixHQUFNLEVBQUksR0FBNEMsR0FDakQsQUFBSSxHQUFJLEdBQ2IsR0FBTSxFQUFJLEdBQTRDLEdBQ2pELEFBQUksR0FBa0IsR0FDM0IsR0FBTSxFQUF1QixHQUU3QixHQUFNLElBRUosSUFBTyxFQUFPLENBR2hCLEdBQUksSUFBTyxHQUFLLEVBQ2QsTUFBTyxDQUFFLEVBQUcsS0FBTSxPQUNiLEdBQ0wsSUFBTyxHQUNQLEVBQU8sYUFBYSxFQUFLLEVBQVcsRUFBUyxHQUU3QyxHQUFNLFVBQ0csRUFDVCxHQUFNLEVBQ04sRUFBVSxPQUVWLE9BR0osRUFBRSxFQUNGLEVBQVEsRUFBUSxFQUFRLEdBRTFCLE1BQUksS0FBUSxHQUFVLEdBQU8sTUFBUSxFQUFNLElBQVUsR0FBUSxFQUNwRCxDQUFFLEVBQUcsS0FBTSxPQUdiLENBQUUsRUFBRyxFQUFPLE9BT2QsWUFDTCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEdBQU0sR0FBSyxFQUFNLFdBQVcsR0FDeEIsRUFFSixHQUFJLElBQUUsS0FhSixHQVpBLEVBQUUsRUFDRCxDQUFFLE9BQU0sT0FBUSxHQUNmLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFBTSxRQUFRLElBQUssR0FBTyxFQUMxQixHQUNBLEVBQ0EsR0FFRixFQUFFLEVBQ0UsSUFBUyxNQUFRLEVBQU8sUUFDMUIsR0FBSSxFQUNGLEVBQU8saUJBQWlCLEVBQUssRUFBVyxPQUV4QyxPQUFPLENBQUUsS0FBTSxLQUFNLFdBSXpCLEFBQUMsRUFBRSxPQUFNLE9BQVEsR0FDZixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FDQSxFQUNBLElBR0osTUFBTyxDQUFFLE9BQU0sK0JDMVpqQixZQUF1QixFQUFhLEVBQW1CLEVBQWlCLENBQ3RFLE1BQU8sSUFBSSxJQUFTLEVBQVMsRUFBTSxFQUFXLEdBR2hELEdBQU0sSUFBb0IsR0FBSSxLQUFJLENBQUEsSUFBQSxJQUFBLElBQUEsSUFBQSxJQUFBLElBQUEsSUFBQSxNQWUzQixRQUFZLENBQ2pCLFlBQVksRUFBYyxDQUN4QixLQUFLLEtBQU8sRUFBTSxLQUNsQixLQUFLLE1BQVEsRUFBTSxNQUNuQixLQUFLLE1BQVEsRUFBTSxNQUNuQixLQUFLLElBQU0sRUFBTSxJQUNqQixLQUFLLElBQU0sR0FBSSxJQUFlLEVBQU0sU0FBVSxFQUFNLFVBWXpDLGdCQUFpQyxHQUFlLENBTTdELFlBQVksRUFBa0IsRUFBZSxDQUMzQyxRQUFRLEtBTlYsWUFBVyxPQUFBLEtBR1gsT0FBbUMsR0FBRSxLQWk4Q3JDLHNCQUEwQyxDQUN4QyxhQUFjLENBQUMsRUFBSyxFQUFXLEVBQVMsSUFDakMsS0FBSyxRQUFRLGNBRWxCLE1BQUssTUFBTSxFQUFPLGFBQWMsQ0FDOUIsR0FBSSxHQUFjLEVBQUssRUFBVyxHQUNsQyxVQUdLLElBUGlDLEdBUzFDLGlDQUFrQyxLQUFLLGFBQ3JDLEVBQU8sa0NBRVQsMkJBQTRCLEtBQUssYUFDL0IsRUFBTyw2QkFFVixLQUVELDRCQUEyQixPQUFBLE9BQ3RCLEdBQUEsS0FBSyxzQkFBcUIsQ0FDN0Isc0JBQXVCLEtBQUssYUFBYSxFQUFPLHVCQUNoRCxpQkFBa0IsS0FBSyxhQUFhLEVBQU8sb0JBQWlCLEtBRzlELHdDQUF1QyxPQUFBLE9BQ2xDLEdBQUEsS0FBSyw0QkFBMkIsQ0FDbkMsb0JBQXFCLENBQUMsRUFBSyxFQUFXLElBQVksQ0FDaEQsS0FBSyx1QkFBdUIsRUFBTyxvQkFBcUIsQ0FDdEQsR0FBSSxHQUFjLEVBQUssRUFBVyxNQUd0QyxhQUFjLENBQUMsRUFBSyxFQUFXLElBQVksQ0FDekMsS0FBTSxNQUFLLE1BQU0sRUFBTyxtQkFBb0IsQ0FFMUMsR0FBSSxHQUFjLEVBQU0sRUFBRyxFQUFXLFFBRXpDLEtBR0gsMENBQXlDLE9BQUEsT0FDcEMsR0FBQSxLQUFLLDRCQUEyQixDQUNuQyxvQkFBcUIsS0FBSyxhQUFhLEVBQU8scUJBQzlDLGFBQWMsQ0FBQyxFQUFLLEVBQVcsSUFBWSxDQUN6QyxLQUFNLE1BQUssTUFBTSxFQUFPLHFCQUFzQixDQUM1QyxHQUFJLEdBQWMsRUFBSyxFQUFXLFFBMStDdEMsS0FBSyxNQUFRLEdBQUksSUFDakIsS0FBSyxNQUFNLEtBQUssR0FDaEIsS0FBSyxNQUFRLEVBQ2IsS0FBSyxPQUFTLEVBQU0sT0FDcEIsS0FBSyxZQUFjLEdBR3JCLFVBQVUsRUFBMEIsQ0FHbEMsS0FBSyxPQUFPLE9BQVMsS0FBSyxNQUFNLGFBQ2hDLEtBQUssT0FBTyxLQUFLLEdBQ2pCLEVBQUUsS0FBSyxNQUFNLGFBS2YsTUFBYSxDQUNYLEtBQUssc0JBQ0QsS0FBSyxRQUFRLFFBQ2YsS0FBSyxVQUFVLEdBQUksSUFBTSxLQUFLLFFBR2hDLEtBQUssTUFBTSxhQUFlLEtBQUssTUFBTSxNQUNyQyxLQUFLLE1BQU0sY0FBZ0IsS0FBSyxNQUFNLE9BQ3RDLEtBQUssTUFBTSxnQkFBa0IsS0FBSyxNQUFNLFNBQ3hDLEtBQUssWUFHUCxJQUFJLEVBQTBCLENBQzVCLE1BQUksTUFBSyxNQUFNLEdBQ2IsTUFBSyxPQUNFLElBRUEsR0FPWCxNQUFNLEVBQTBCLENBQzlCLE1BQU8sTUFBSyxNQUFNLE9BQVMsRUFNN0IscUJBQXFCLEVBQThCLENBQ2pELE1BQU8sQ0FDTCxJQUFLLEVBQU0sSUFDWCxNQUFPLEtBQ1AsS0FBTSxFQUFNLEtBQ1osTUFBTyxFQUFNLE1BQ2IsSUFBSyxFQUFNLElBQ1gsUUFBUyxDQUFDLEtBQUssY0FDZixPQUFRLEVBQU0sT0FDZCxTQUFVLEVBQU0sU0FDaEIsY0FBZSxFQUFNLGNBQ3JCLFFBQVMsRUFBTSxRQUNmLFVBQVcsRUFBTSxVQUNqQixZQUFhLEVBQU0sYUFpQnZCLFdBQTRCLENBQzFCLEdBQU0sR0FBTSxLQUFLLE1BRWpCLEtBQUssTUFBUSxLQUFLLHFCQUFxQixHQUV2QyxLQUFLLFlBQWMsR0FDbkIsS0FBSyxZQUNMLEtBQUssWUFBYyxHQUVuQixHQUFNLEdBQU8sS0FBSyxNQUNsQixZQUFLLE1BQVEsRUFDTixFQUdULGdCQUF5QixDQUN2QixNQUFPLE1BQUssb0JBQW9CLEtBQUssTUFBTSxLQUc3QyxvQkFBb0IsRUFBcUIsQ0FDdkMsVUFBZSxVQUFZLEVBQ3BCLEdBQWUsS0FBSyxLQUFLLE9BQVMsR0FBZSxVQUFZLEVBR3RFLG1CQUE0QixDQUMxQixNQUFPLE1BQUssTUFBTSxXQUFXLEtBQUssa0JBU3BDLHNCQUErQixDQUM3QixNQUFPLE1BQUssMEJBQTBCLEtBQUssTUFBTSxLQUduRCwwQkFBMEIsRUFBcUIsQ0FDN0MsVUFBcUIsVUFBWSxFQUMxQixHQUFxQixLQUFLLEtBQUssT0FDbEMsR0FBcUIsVUFDckIsRUFVTix5QkFBa0MsQ0FDaEMsTUFBTyxNQUFLLE1BQU0sV0FBVyxLQUFLLHdCQUdwQyxlQUFlLEVBQXFCLENBS2xDLEdBQUksR0FBSyxLQUFLLE1BQU0sV0FBVyxHQUMvQixHQUFLLEdBQUssUUFBWSxPQUFVLEVBQUUsRUFBTSxLQUFLLE1BQU0sT0FBUSxDQUN6RCxHQUFNLEdBQVEsS0FBSyxNQUFNLFdBQVcsR0FDcEMsQUFBSyxHQUFRLFFBQVksT0FDdkIsR0FBSyxNQUFZLElBQUssT0FBVSxJQUFPLEdBQVEsT0FHbkQsTUFBTyxHQU1ULFVBQVUsRUFBdUIsQ0FDL0IsS0FBSyxNQUFNLE9BQVMsRUFDaEIsR0FLRixNQUFLLE1BQU0sYUFBYSxRQUFRLENBQUMsQ0FBQyxFQUFjLEtBQzlDLEtBQUssTUFBTSxFQUFjLENBQUUsUUFFN0IsS0FBSyxNQUFNLGFBQWEsU0FJNUIsWUFBeUIsQ0FDdkIsTUFBTyxNQUFLLE1BQU0sUUFBUSxLQUFLLE1BQU0sUUFBUSxPQUFTLEdBSXhELFdBQWtCLENBSWhCLEdBSEEsS0FBSyxZQUNMLEtBQUssTUFBTSxNQUFRLEtBQUssTUFBTSxJQUN6QixLQUFLLGFBQWEsTUFBSyxNQUFNLFNBQVcsS0FBSyxNQUFNLGVBQ3BELEtBQUssTUFBTSxLQUFPLEtBQUssT0FBUSxDQUNqQyxLQUFLLFlBQVcsS0FDaEIsT0FHRixLQUFLLGlCQUFpQixLQUFLLGVBQWUsS0FBSyxNQUFNLE1BTXZELGlCQUFpQixFQUFzRCxDQUNyRSxHQUFJLEdBQ0osQUFBSyxLQUFLLGFBQWEsR0FBVyxLQUFLLE1BQU0sZUFDN0MsR0FBTSxHQUFRLEtBQUssTUFBTSxJQUNuQixFQUFNLEtBQUssTUFBTSxRQUFRLEVBQVksRUFBUSxHQUNuRCxHQUFJLElBQVEsR0FJVixLQUFNLE1BQUssTUFBTSxFQUFPLG9CQUFxQixDQUMzQyxHQUFJLEtBQUssTUFBTSxnQkFNbkIsSUFGQSxLQUFLLE1BQU0sSUFBTSxFQUFNLEVBQVcsT0FDbEMsR0FBVyxVQUFZLEVBQVEsRUFDeEIsR0FBVyxLQUFLLEtBQUssUUFBVSxHQUFXLFdBQWEsR0FDNUQsRUFBRSxLQUFLLE1BQU0sUUFDYixLQUFLLE1BQU0sVUFBWSxHQUFXLFVBS3BDLEdBQUksS0FBSyxZQUFhLE9BR3RCLEdBQU0sR0FBMEIsQ0FDOUIsS0FBTSxlQUNOLE1BQU8sS0FBSyxNQUFNLE1BQU0sRUFBUSxFQUFHLEdBQ25DLFFBQ0EsSUFBSyxFQUFNLEVBQVcsT0FDdEIsSUFBSyxHQUFJLElBQWUsRUFBVSxLQUFLLE1BQU0sZ0JBRS9DLE1BQUksTUFBSyxRQUFRLFFBQVEsS0FBSyxVQUFVLEdBQ2pDLEVBR1QsZ0JBQWdCLEVBQThDLENBQzVELEdBQU0sR0FBUSxLQUFLLE1BQU0sSUFDckIsRUFDSixBQUFLLEtBQUssYUFBYSxHQUFXLEtBQUssTUFBTSxlQUM3QyxHQUFJLEdBQUssS0FBSyxNQUFNLFdBQVksS0FBSyxNQUFNLEtBQU8sR0FDbEQsR0FBSSxLQUFLLE1BQU0sSUFBTSxLQUFLLE9BQ3hCLEtBQU8sQ0FBQyxHQUFVLElBQU8sRUFBRSxLQUFLLE1BQU0sSUFBTSxLQUFLLFFBQy9DLEVBQUssS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLEtBTTFDLEdBQUksS0FBSyxZQUFhLE9BR3RCLEdBQU0sR0FBTSxLQUFLLE1BQU0sSUFDakIsRUFBUSxLQUFLLE1BQU0sTUFBTSxFQUFRLEVBQVcsR0FFNUMsRUFBeUIsQ0FDN0IsS0FBTSxjQUNOLFFBQ0EsUUFDQSxNQUNBLElBQUssR0FBSSxJQUFlLEVBQVUsS0FBSyxNQUFNLGdCQUUvQyxNQUFJLE1BQUssUUFBUSxRQUFRLEtBQUssVUFBVSxHQUNqQyxFQU1ULFdBQWtCLENBQ2hCLEdBQU0sR0FBYSxLQUFLLE1BQU0sSUFDeEIsRUFBVyxHQUNqQixFQUFNLEtBQU8sS0FBSyxNQUFNLElBQU0sS0FBSyxRQUFRLENBQ3pDLEdBQU0sR0FBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sS0FDNUMsT0FBUSxPQUNOLFFBQ0EsU0FDQSxHQUNFLEVBQUUsS0FBSyxNQUFNLElBQ2IsVUFDRixJQUNFLEFBQ0UsS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sS0FBRSxJQUV6QyxFQUFFLEtBQUssTUFBTSxRQUdqQixRQUNBLFVBQ0EsTUFDRSxFQUFFLEtBQUssTUFBTSxJQUNiLEVBQUUsS0FBSyxNQUFNLFFBQ2IsS0FBSyxNQUFNLFVBQVksS0FBSyxNQUFNLElBQ2xDLFVBRUYsSUFDRSxPQUFRLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLFFBQzdDLElBQXlCLENBQ3ZCLEdBQU0sR0FBVSxLQUFLLGlCQUFpQixNQUN0QyxBQUFJLElBQVksUUFDZCxNQUFLLFdBQVcsR0FDWixLQUFLLFFBQVEsZUFBZSxFQUFTLEtBQUssSUFFaEQsVUFHRixJQUFzQixDQUNwQixHQUFNLEdBQVUsS0FBSyxnQkFBZ0IsR0FDckMsQUFBSSxJQUFZLFFBQ2QsTUFBSyxXQUFXLEdBQ1osS0FBSyxRQUFRLGVBQWUsRUFBUyxLQUFLLElBRWhELGNBSUEsUUFFSixjQUdBLEdBQUksR0FBYSxHQUNmLEVBQUUsS0FBSyxNQUFNLFlBRWIsSUFBRSxJQUNGLENBQUMsS0FBSyxVQUNOLEtBQUssUUFBUSxPQUNiLENBQ0EsR0FBTSxHQUFNLEtBQUssTUFBTSxJQUN2QixHQUNFLEtBQUssTUFBTSxXQUFXLEVBQU0sS0FBRSxJQUM5QixLQUFLLE1BQU0sV0FBVyxFQUFNLEtBQUUsSUFDN0IsS0FBZSxHQUFLLEtBQUssTUFBTSxVQUFZLEdBQzVDLENBRUEsR0FBTSxHQUFVLEtBQUssZ0JBQWdCLEdBQ3JDLEFBQUksSUFBWSxRQUNkLE1BQUssV0FBVyxHQUNaLEtBQUssUUFBUSxlQUFlLEVBQVMsS0FBSyxRQUdoRCxpQkFHRixJQUFFLElBQ0YsQ0FBQyxLQUFLLFVBQ04sS0FBSyxRQUFRLE9BQ2IsQ0FDQSxHQUFNLEdBQU0sS0FBSyxNQUFNLElBQ3ZCLEdBQ0UsS0FBSyxNQUFNLFdBQVcsRUFBTSxLQUFnQyxJQUM1RCxLQUFLLE1BQU0sV0FBVyxFQUFNLEtBQXFCLElBQ2pELEtBQUssTUFBTSxXQUFXLEVBQU0sS0FBRSxHQUM5QixDQUVBLEdBQU0sR0FBVSxLQUFLLGdCQUFnQixHQUNyQyxBQUFJLElBQVksUUFDZCxNQUFLLFdBQVcsR0FDWixLQUFLLFFBQVEsZUFBZSxFQUFTLEtBQUssUUFHaEQsYUFHRixVQUtSLEdBQUksRUFBUyxPQUFTLEVBQUcsQ0FDdkIsR0FBTSxHQUFNLEtBQUssTUFBTSxJQUNqQixFQUF1QyxDQUMzQyxNQUFPLEVBQ1AsTUFDQSxXQUNBLFlBQWEsS0FDYixhQUFjLEtBQ2QsZUFBZ0IsTUFFbEIsS0FBSyxNQUFNLGFBQWEsS0FBSyxJQVNqQyxZQUFZLEVBQWlCLEVBQWlCLENBQzVDLEtBQUssTUFBTSxJQUFNLEtBQUssTUFBTSxJQUM1QixLQUFLLE1BQU0sT0FBUyxLQUFLLE1BQU0sY0FDL0IsR0FBTSxHQUFXLEtBQUssTUFBTSxLQUM1QixLQUFLLE1BQU0sS0FBTyxFQUNsQixLQUFLLE1BQU0sTUFBUSxFQUVkLEtBQUssYUFDUixLQUFLLGNBQWMsR0FJdkIsYUFBYSxFQUF1QixDQUNsQyxLQUFLLE1BQU0sS0FBTyxFQUdsQixLQUFLLGdCQWFQLHNCQUE2QixDQUMzQixHQUFJLEtBQUssTUFBTSxNQUFRLEdBQUssS0FBSyx3QkFDL0IsT0FHRixHQUFNLEdBQVUsS0FBSyxNQUFNLElBQU0sRUFDM0IsRUFBTyxLQUFLLGVBQWUsR0FDakMsR0FBSSxHQUFJLElBQXdCLEdBQUksR0FDbEMsS0FBTSxNQUFLLE1BQU0sRUFBTyx5QkFBMEIsQ0FDaEQsR0FBSSxLQUFLLE1BQU0sZ0JBSW5CLEdBQ0UsSUFBSSxLQUNILElBQW9DLElBQUksS0FBSyxVQUFVLGtCQUN4RCxDQU1BLEdBREEsS0FBSyxhQUFhLGtCQUNkLEtBQUssZ0JBQWdCLGlCQUFrQixnQkFBa0IsTUFDM0QsS0FBTSxNQUFLLE1BQ1QsSUFBaUMsSUFDN0IsRUFBTyw2Q0FDUCxFQUFPLDRDQUNYLENBQUUsR0FBSSxLQUFLLE1BQU0sZ0JBSXJCLEtBQUssTUFBTSxLQUFPLEVBQ2xCLEFBQUksSUFBSSxJQUVOLEtBQUssWUFBVyxHQUdoQixLQUFLLFlBQVcsT0FFYixBQUFJLElBQWtCLEdBQzNCLEdBQUUsS0FBSyxNQUFNLElBQ2IsS0FBSyxZQUE0QixJQUFBLEtBQUssVUFBVSxLQUMzQyxBQUFJLElBQUksR0FDYixHQUFFLEtBQUssTUFBTSxJQUNiLEtBQUssWUFBNEIsSUFBQSxLQUFLLGNBRXRDLEtBQUssU0FBa0IsR0FBQSxHQUkzQixlQUFzQixDQUNwQixHQUFNLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FDcEQsR0FBSSxHQUFJLElBQXdCLEdBQUksR0FBc0IsQ0FDeEQsS0FBSyxXQUFXLElBQ2hCLE9BR0YsQUFDRSxJQUFzQixJQUN0QixLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxLQUFFLEdBRXpDLE1BQUssTUFBTSxLQUFPLEVBQ2xCLEtBQUssWUFBVyxLQUVoQixHQUFFLEtBQUssTUFBTSxJQUNiLEtBQUssWUFBVyxLQUlwQixpQkFBd0IsQ0FFdEIsQUFBSSxBQURTLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLEtBQzVDLEdBQ04sS0FBSyxTQUF5QixHQUFBLEdBRTlCLEtBQUssU0FBbUIsR0FBQSxHQUk1Qix1QkFBaUMsQ0FDL0IsR0FBSSxLQUFLLE1BQU0sTUFBUSxHQUFLLEtBQUssT0FBUyxFQUFHLE1BQU8sR0FFcEQsR0FBSSxHQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLEdBQ2hELEdBQUksSUFBRSxHQUFnQyxNQUFPLEdBRTdDLEdBQU0sR0FBUSxLQUFLLE1BQU0sSUFHekIsSUFGQSxLQUFLLE1BQU0sS0FBTyxFQUVYLENBQUMsR0FBVSxJQUFPLEVBQUUsS0FBSyxNQUFNLElBQU0sS0FBSyxRQUMvQyxFQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxLQUd4QyxHQUFNLEdBQVEsS0FBSyxNQUFNLE1BQU0sRUFBUSxFQUFHLEtBQUssTUFBTSxLQUVyRCxZQUFLLFlBQXFDLEdBQUEsR0FFbkMsR0FHVCxzQkFBc0IsRUFBb0IsQ0FFeEMsR0FBSSxHQUFPLElBQUksR0FBNkMsR0FBQSxHQUN4RCxFQUFRLEVBQ1IsRUFBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxHQUdsRCxBQUFJLElBQUksSUFBMkIsSUFBSSxJQUNyQyxLQUNBLEVBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FDOUMsRUFBa0IsSUFJaEIsSUFBSSxJQUEyQixDQUFDLEtBQUssTUFBTSxRQUM3QyxLQUlBLEVBQU8sSUFBSSxHQUF3RCxHQUFBLElBR3JFLEtBQUssU0FBUyxFQUFNLEdBR3RCLG1CQUFtQixFQUFvQixDQUVyQyxHQUFNLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FFcEQsR0FBSSxJQUFTLEVBQU0sQ0FDakIsQUFBSSxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxLQUFFLEdBQzNDLEtBQUssU0FBb0IsR0FBQSxHQUV6QixLQUFLLFNBQ0gsSUFBSSxJQUF5RCxHQUFBLEdBQzdELEdBR0osT0FHRixHQUFJLElBQUksSUFBNEIsQ0FFbEMsR0FBSSxJQUFJLEdBQTRCLENBQ2xDLEtBQUssU0FBc0IsR0FBQSxHQUMzQixPQUdGLEdBQ0UsS0FBSyxVQUFVLG1CQUNmLElBQUksSUFDSixDQUNBLEdBQUksS0FBSyxnQkFBZ0IsaUJBQWtCLGdCQUFrQixNQUMzRCxLQUFNLE1BQUssTUFBTSxFQUFPLDBDQUEyQyxDQUNqRSxHQUFJLEtBQUssTUFBTSxnQkFHbkIsS0FBSyxNQUFNLEtBQU8sRUFDbEIsS0FBSyxZQUFXLEdBQ2hCLE9BSUYsR0FDRSxLQUFLLFVBQVUsbUJBQ2YsSUFBSSxHQUNKLENBQ0EsR0FBSSxLQUFLLGdCQUFnQixpQkFBa0IsZ0JBQWtCLE1BQzNELEtBQU0sTUFBSyxNQUFNLEVBQU8seUNBQTBDLENBQ2hFLEdBQUksS0FBSyxNQUFNLGdCQUduQixLQUFLLE1BQU0sS0FBTyxFQUNsQixLQUFLLFlBQVcsR0FDaEIsUUFJSixHQUFJLElBQUksR0FBeUIsQ0FDL0IsS0FBSyxTQUFvQixHQUFBLEdBQ3pCLE9BR0YsS0FBSyxTQUNILElBQUksSUFBeUQsR0FBQSxHQUM3RCxHQUlKLGlCQUF3QixDQUN0QixHQUFNLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FHcEQsQUFBSSxJQUFJLElBQTJCLENBQUMsS0FBSyxNQUFNLE9BSTdDLEtBQUssU0FBdUIsR0FBQSxHQUd6QixBQUNILElBQXdCLElBR3hCLEtBQUssVUFBVSxDQUNiLG1CQUNBLENBQUUsU0FBVSxPQUFRLFdBQVksUUFHbEMsTUFBSyxTQUF5QixHQUFBLEdBSTFCLEFBRGdCLEtBQUssTUFBTSxZQUFZLEtBQUssTUFBTSxPQUN2QyxJQUNiLEtBQUssY0FLUCxLQUFLLFNBQXdCLEdBQUEsR0FJakMsa0JBQXlCLENBSXZCLEFBQ0UsQUFKVyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxLQUk5QyxJQUNKLEtBQUssVUFBVSxDQUNiLG1CQUNBLENBQUUsU0FBVSxPQUFRLFdBQVksUUFHbEMsS0FBSyxTQUFzQixHQUFBLEdBSTNCLEtBQUssU0FBZ0IsR0FBQSxHQUl6QixtQkFBbUIsRUFBb0IsQ0FFckMsR0FBTSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLEdBRXBELEdBQUksSUFBUyxFQUFNLENBQ2pCLEtBQUssU0FBb0IsR0FBQSxHQUN6QixPQUdGLEFBQUksSUFBSSxHQUNOLEtBQUssU0FBb0IsR0FBQSxHQUV6QixLQUFLLFNBQXFCLEdBQUEsR0FJOUIsY0FBcUIsQ0FFbkIsR0FBTSxDQUFFLE9BQVEsS0FBSyxNQUNmLEVBQU8sS0FBSyxNQUFNLFdBQVcsRUFBTSxHQUV6QyxHQUFJLElBQUksR0FBeUIsQ0FDL0IsR0FBSSxLQUFLLE1BQU0sV0FBVyxFQUFNLEtBQUUsR0FBeUIsQ0FDekQsS0FBSyxTQUFvQixHQUFBLEdBQ3pCLE9BRUYsS0FBSyxTQUF1QixHQUFBLEdBQzVCLE9BR0YsR0FBSSxJQUFJLEdBQXlCLENBRS9CLEtBQUssU0FBd0IsR0FBQSxHQUM3QixPQUdGLEtBQUssU0FBZ0IsR0FBQSxHQUd2QixjQUFxQixDQUVuQixHQUFNLENBQUUsT0FBUSxLQUFLLE1BQ2YsRUFBTyxLQUFLLE1BQU0sV0FBVyxFQUFNLEdBRXpDLEdBQUksSUFBSSxHQUE0QixDQUNsQyxHQUFNLEdBQ0osS0FBSyxNQUFNLFdBQVcsRUFBTSxLQUFFLEdBQTZCLEVBQUksRUFDakUsR0FBSSxLQUFLLE1BQU0sV0FBVyxFQUFNLEtBQUssR0FBeUIsQ0FDNUQsS0FBSyxTQUFRLEdBQVksRUFBTyxHQUNoQyxPQUVGLEtBQUssU0FBdUIsR0FBQSxHQUM1QixPQUdGLEdBQUksSUFBSSxHQUF5QixDQUUvQixLQUFLLFNBQXdCLEdBQUEsR0FDN0IsT0FHRixLQUFLLFNBQWdCLEdBQUEsR0FHdkIsa0JBQWtCLEVBQW9CLENBRXBDLEdBQU0sR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxHQUNwRCxHQUFJLElBQUksR0FBeUIsQ0FDL0IsS0FBSyxTQUVILEdBQUEsS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sS0FBRSxHQUNyQyxFQUNBLEdBRU4sT0FFRixHQUFJLElBQUksSUFBMkIsSUFBSSxHQUE0QixDQUVqRSxLQUFLLE1BQU0sS0FBTyxFQUNsQixLQUFLLFlBQVcsSUFDaEIsT0FFRixLQUFLLFNBQVMsSUFBSSxHQUF5QyxHQUFBLEdBQUUsR0FHL0Qsb0JBQTJCLENBRXpCLEdBQU0sR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxHQUM5QyxFQUFRLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLEdBQ3JELEFBQUksSUFBSSxHQUNOLEFBQUksSUFBSyxHQUVQLEtBQUssU0FBb0IsR0FBQSxHQUd6QixLQUFLLFNBQStCLEdBQUEsR0FFakMsQUFDTCxJQUFJLElBQ0osQ0FBRSxJQUFLLElBQXdCLEdBQXlCLElBR3hELE1BQUssTUFBTSxLQUFPLEVBQ2xCLEtBQUssWUFBVyxLQUVoQixHQUFFLEtBQUssTUFBTSxJQUNiLEtBQUssWUFBVyxLQUlwQixpQkFBaUIsRUFBb0IsQ0FDbkMsT0FBUSxPQUlOLElBQ0UsS0FBSyxnQkFDTCxXQUVGLElBQ0UsRUFBRSxLQUFLLE1BQU0sSUFDYixLQUFLLFlBQVcsSUFDaEIsV0FDRixJQUNFLEVBQUUsS0FBSyxNQUFNLElBQ2IsS0FBSyxZQUFXLElBQ2hCLFdBQ0YsSUFDRSxFQUFFLEtBQUssTUFBTSxJQUNiLEtBQUssWUFBVyxJQUNoQixXQUNGLElBQ0UsRUFBRSxLQUFLLE1BQU0sSUFDYixLQUFLLFlBQVcsSUFDaEIsV0FDRixJQUNFLEdBQ0UsS0FBSyxVQUFVLG1CQUNmLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLEtBQUUsSUFDekMsQ0FDQSxHQUFJLEtBQUssZ0JBQWdCLGlCQUFrQixnQkFBa0IsTUFDM0QsS0FBTSxNQUFLLE1BQ1QsRUFBTywyQ0FDUCxDQUFFLEdBQUksS0FBSyxNQUFNLGdCQUtyQixLQUFLLE1BQU0sS0FBTyxFQUNsQixLQUFLLFlBQVcsT0FFaEIsRUFBRSxLQUFLLE1BQU0sSUFDYixLQUFLLFlBQVcsR0FFbEIsV0FDRixJQUNFLEVBQUUsS0FBSyxNQUFNLElBQ2IsS0FBSyxZQUFXLEdBQ2hCLFdBQ0YsS0FDRSxHQUNFLEtBQUssVUFBVSxtQkFDZixLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxLQUFFLElBQ3pDLENBQ0EsR0FBSSxLQUFLLGdCQUFnQixpQkFBa0IsZ0JBQWtCLE1BQzNELEtBQU0sTUFBSyxNQUNULEVBQU8sNENBQ1AsQ0FBRSxHQUFJLEtBQUssTUFBTSxnQkFLckIsS0FBSyxNQUFNLEtBQU8sRUFDbEIsS0FBSyxZQUFXLE9BRWhCLEVBQUUsS0FBSyxNQUFNLElBQ2IsS0FBSyxZQUFXLEdBRWxCLFdBQ0YsS0FDRSxFQUFFLEtBQUssTUFBTSxJQUNiLEtBQUssWUFBVyxHQUNoQixXQUVGLElBQ0UsQUFDRSxLQUFLLFVBQVUsaUJBQ2YsS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sS0FBRSxHQUV6QyxLQUFLLFNBQXlCLEdBQUEsR0FFOUIsR0FBRSxLQUFLLE1BQU0sSUFDYixLQUFLLFlBQVcsS0FFbEIsV0FFRixJQUNFLEtBQUsscUJBQ0wsV0FFRixJQUNFLEtBQUssb0JBQ0wsV0FFRixJQUF1QixDQUNyQixHQUFNLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FFcEQsR0FBSSxJQUFJLEtBQTZCLElBQUksR0FBMkIsQ0FDbEUsS0FBSyxnQkFBZ0IsSUFDckIsT0FHRixHQUFJLElBQUksS0FBNkIsSUFBSSxHQUEyQixDQUNsRSxLQUFLLGdCQUFnQixHQUNyQixPQUdGLEdBQUksSUFBSSxJQUE2QixJQUFJLEdBQTJCLENBQ2xFLEtBQUssZ0JBQWdCLEdBQ3JCLFlBS0osUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLElBQ0UsS0FBSyxXQUFXLElBQ2hCLFdBR0YsUUFDQSxJQUNFLEtBQUssV0FBVyxHQUNoQixXQU9GLElBQ0UsS0FBSyxrQkFDTCxXQUVGLFFBQ0EsSUFDRSxLQUFLLHNCQUFzQixHQUMzQixXQUVGLFNBQ0EsSUFDRSxLQUFLLG1CQUFtQixHQUN4QixXQUVGLElBQ0UsS0FBSyxrQkFDTCxXQUVGLFFBQ0EsSUFDRSxLQUFLLG1CQUFtQixHQUN4QixXQUVGLElBQ0UsS0FBSyxlQUNMLFdBRUYsSUFDRSxLQUFLLGVBQ0wsV0FFRixRQUNBLElBQ0UsS0FBSyxrQkFBa0IsR0FDdkIsV0FFRixLQUNFLEtBQUssU0FBbUIsR0FBQSxHQUN4QixXQUVGLElBQ0UsS0FBSyxtQkFDTCxXQUVGLElBQ0UsS0FBSyx1QkFDTCxXQUVGLElBQ0UsS0FBSyxXQUNMLGVBR0EsR0FBSSxHQUFrQixHQUFPLENBQzNCLEtBQUssU0FBUyxHQUNkLFFBSU4sS0FBTSxNQUFLLE1BQU0sRUFBTyx5QkFBMEIsQ0FDaEQsR0FBSSxLQUFLLE1BQU0sY0FDZixXQUFZLE9BQU8sY0FBYyxLQUlyQyxTQUFTLEVBQWlCLEVBQW9CLENBQzVDLEdBQU0sR0FBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sSUFBSyxLQUFLLE1BQU0sSUFBTSxHQUM5RCxLQUFLLE1BQU0sS0FBTyxFQUNsQixLQUFLLFlBQVksRUFBTSxHQUd6QixZQUFtQixDQUNqQixHQUFNLEdBQVcsS0FBSyxNQUFNLFNBQ3RCLEVBQVEsS0FBSyxNQUFNLE1BQVEsRUFDN0IsRUFBUyxFQUNULENBQUUsT0FBUSxLQUFLLE1BQ25CLE1BQVMsRUFBRSxFQUFLLENBQ2QsR0FBSSxHQUFPLEtBQUssT0FFZCxLQUFNLE1BQUssTUFBTSxFQUFPLG1CQUFvQixDQUMxQyxHQUFJLEdBQStCLEVBQVUsS0FHakQsR0FBTSxHQUFLLEtBQUssTUFBTSxXQUFXLEdBQ2pDLEdBQUksR0FBVSxHQUNaLEtBQU0sTUFBSyxNQUFNLEVBQU8sbUJBQW9CLENBQzFDLEdBQUksR0FBK0IsRUFBVSxLQUdqRCxHQUFJLEVBQ0YsRUFBVSxPQUNMLENBQ0wsR0FBSSxJQUFFLEdBQ0osRUFBVSxXQUNELElBQW1DLElBQUksRUFDaEQsRUFBVSxXQUNELElBQUUsSUFBd0IsQ0FBQyxFQUNwQyxNQUVGLEVBQVUsSUFBMEIsSUFHeEMsR0FBTSxHQUFVLEtBQUssTUFBTSxNQUFNLEVBQU8sR0FDeEMsRUFBRSxFQUVGLEdBQUksR0FBTyxHQUVMLEVBQVUsSUFFZCxHQUErQixFQUFVLEVBQU0sRUFBSSxHQUVyRCxLQUFPLEVBQU0sS0FBSyxRQUFRLENBQ3hCLEdBQU0sR0FBSyxLQUFLLGVBQWUsR0FFekIsRUFBTyxPQUFPLGFBQWEsR0FHakMsR0FBSSxHQUFrQixJQUFJLEdBQ3hCLEFBQUksSUFBRSxJQUNBLEVBQUssU0FBUyxNQUNoQixLQUFLLE1BQU0sRUFBTywwQkFBMkIsQ0FBRSxHQUFJLE1BRTVDLElBQUUsS0FDUCxFQUFLLFNBQVMsTUFDaEIsS0FBSyxNQUFNLEVBQU8sMEJBQTJCLENBQUUsR0FBSSxNQUduRCxFQUFLLFNBQVMsSUFDaEIsS0FBSyxNQUFNLEVBQU8scUJBQXNCLENBQUUsR0FBSSxjQUV2QyxHQUFpQixJQUFPLElBQUUsR0FDbkMsS0FBSyxNQUFNLEVBQU8scUJBQXNCLENBQUUsR0FBSSxVQUU5QyxPQUdGLEVBQUUsRUFDRixHQUFRLEVBRVYsS0FBSyxNQUFNLElBQU0sRUFFakIsS0FBSyxZQUF1QixJQUFBLENBQzFCLFFBQVMsRUFDVCxNQUFPLElBYVgsUUFDRSxFQUNBLEVBQ0EsRUFBb0IsR0FDcEIsRUFBc0MsR0FDdkIsQ0FDZixHQUFNLENBQUUsRUFBRyxPQUFRLEdBQ2pCLEtBQUssTUFDTCxLQUFLLE1BQU0sSUFDWCxLQUFLLE1BQU0sVUFDWCxLQUFLLE1BQU0sUUFDWCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEtBQUssc0JBQ2EsSUFFcEIsWUFBSyxNQUFNLElBQU0sRUFDVixFQUdULGdCQUFnQixFQUFxQixDQUNuQyxHQUFNLEdBQVcsS0FBSyxNQUFNLGNBQ3hCLEVBQVcsR0FFZixLQUFLLE1BQU0sS0FBTyxFQUNsQixHQUFNLEdBQU0sS0FBSyxRQUFRLEdBQ3pCLEFBQUksR0FBTyxNQUNULEtBQUssTUFBTSxFQUFPLGFBQWMsQ0FFOUIsR0FBSSxHQUErQixFQUFVLEdBQzdDLFVBR0osR0FBTSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxLQUU5QyxHQUFJLElBQUksSUFDTixFQUFFLEtBQUssTUFBTSxJQUNiLEVBQVcsV0FDRixJQUFJLElBQ2IsS0FBTSxNQUFLLE1BQU0sRUFBTyxlQUFnQixDQUFFLEdBQUksSUFHaEQsR0FBSSxHQUFrQixLQUFLLGVBQWUsS0FBSyxNQUFNLE1BQ25ELEtBQU0sTUFBSyxNQUFNLEVBQU8saUJBQWtCLENBQ3hDLEdBQUksS0FBSyxNQUFNLGdCQUluQixHQUFJLEVBQVUsQ0FDWixHQUFNLEdBQU0sS0FBSyxNQUNkLE1BQU0sRUFBUyxNQUFPLEtBQUssTUFBTSxLQUNqQyxRQUFRLFFBQVMsSUFDcEIsS0FBSyxZQUF1QixJQUFBLEdBQzVCLE9BR0YsS0FBSyxZQUFvQixJQUFBLEdBSzNCLFdBQVcsRUFBOEIsQ0FDdkMsR0FBTSxHQUFRLEtBQUssTUFBTSxJQUNuQixFQUFXLEtBQUssTUFBTSxjQUN4QixFQUFVLEdBQ1YsRUFBVyxHQUNYLEVBQVksR0FDWixFQUFjLEdBQ2QsRUFBVSxHQUVkLEFBQUksQ0FBQyxHQUFpQixLQUFLLFFBQVEsTUFBUSxNQUN6QyxLQUFLLE1BQU0sRUFBTyxjQUFlLENBQUUsR0FBSSxLQUFLLE1BQU0sZ0JBRXBELEdBQU0sR0FDSixLQUFLLE1BQU0sSUFBTSxHQUFTLEdBQzFCLEtBQUssTUFBTSxXQUFXLEtBQTJCLEdBRW5ELEdBQUksRUFBZ0IsQ0FDbEIsR0FBTSxHQUFVLEtBQUssTUFBTSxNQUFNLEVBQU8sS0FBSyxNQUFNLEtBRW5ELEdBREEsS0FBSyx1QkFBdUIsRUFBTyxtQkFBb0IsQ0FBRSxHQUFJLElBQ3pELENBQUMsS0FBSyxNQUFNLE9BQVEsQ0FFdEIsR0FBTSxHQUFnQixFQUFRLFFBQVEsS0FDdEMsQUFBSSxFQUFnQixHQUVsQixLQUFLLE1BQU0sRUFBTywwQkFBMkIsQ0FDM0MsR0FBSSxHQUErQixFQUFVLEtBSW5ELEVBQVUsR0FBa0IsQ0FBQyxPQUFPLEtBQUssR0FHM0MsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxLQTJDNUMsR0ExQ0ksSUFBSSxJQUFzQixDQUFDLEdBQzdCLEdBQUUsS0FBSyxNQUFNLElBQ2IsS0FBSyxRQUFRLElBQ2IsRUFBVSxHQUNWLEVBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLE1BSXZDLEtBQTZCLElBQUksSUFBNkIsTUFDL0QsQ0FBQyxHQUVELEdBQU8sS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLE1BQU0sS0FDdEMsS0FBSSxJQUEyQixJQUFJLEtBQ3JDLEVBQUUsS0FBSyxNQUFNLElBRVgsS0FBSyxRQUFRLE1BQVEsTUFDdkIsS0FBSyxNQUFNLEVBQU8seUJBQTBCLENBQUUsR0FBSSxJQUVwRCxFQUFVLEdBQ1YsRUFBYyxHQUNkLEVBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLE1BR3RDLElBQUksS0FHRixLQUFXLElBQ2IsS0FBSyxNQUFNLEVBQU8scUJBQXNCLENBQUUsR0FBSSxJQUVoRCxFQUFFLEtBQUssTUFBTSxJQUNiLEVBQVcsSUFHVCxJQUFJLEtBQ04sTUFBSyxhQUFhLFVBQVcsS0FBSyxNQUFNLGVBQ3BDLElBQWUsSUFDakIsS0FBSyxNQUFNLEVBQU8sZUFBZ0IsQ0FBRSxHQUFJLElBRTFDLEVBQUUsS0FBSyxNQUFNLElBQ2IsRUFBWSxJQUdWLEdBQWtCLEtBQUssZUFBZSxLQUFLLE1BQU0sTUFDbkQsS0FBTSxNQUFLLE1BQU0sRUFBTyxpQkFBa0IsQ0FDeEMsR0FBSSxLQUFLLE1BQU0sZ0JBS25CLEdBQU0sR0FBTSxLQUFLLE1BQU0sTUFBTSxFQUFPLEtBQUssTUFBTSxLQUFLLFFBQVEsU0FBVSxJQUV0RSxHQUFJLEVBQVUsQ0FDWixLQUFLLFlBQXVCLElBQUEsR0FDNUIsT0FHRixHQUFJLEVBQVcsQ0FDYixLQUFLLFlBQXdCLElBQUEsR0FDN0IsT0FHRixHQUFNLEdBQU0sRUFBVSxTQUFTLEVBQUssR0FBSyxXQUFXLEdBQ3BELEtBQUssWUFBb0IsSUFBQSxHQUszQixjQUFjLEVBQXdDLENBQ3BELEdBQU0sQ0FBRSxPQUFNLE9BQVEsR0FDcEIsS0FBSyxNQUNMLEtBQUssTUFBTSxJQUNYLEtBQUssTUFBTSxVQUNYLEtBQUssTUFBTSxRQUNYLEVBQ0EsS0FBSyw2QkFFUCxZQUFLLE1BQU0sSUFBTSxFQUNWLEVBR1QsV0FBVyxFQUFxQixDQUM5QixHQUFNLENBQUUsTUFBSyxNQUFLLFVBQVMsYUFBYyxHQUN2QyxJQUFLLEdBQStCLFNBQVcsU0FDL0MsS0FBSyxNQUNMLEtBQUssTUFBTSxJQUFNLEVBQ2pCLEtBQUssTUFBTSxVQUNYLEtBQUssTUFBTSxRQUNYLEtBQUsseUNBRVAsS0FBSyxNQUFNLElBQU0sRUFBTSxFQUN2QixLQUFLLE1BQU0sVUFBWSxFQUN2QixLQUFLLE1BQU0sUUFBVSxFQUNyQixLQUFLLFlBQXVCLElBQUEsR0FJOUIsMEJBQWlDLENBQy9CLEFBQUssS0FBSyxNQUFLLElBQ2IsS0FBSyxXQUFXLEtBQUksR0FHdEIsS0FBSyxNQUFNLE1BQ1gsS0FBSyxvQkFJUCxtQkFBMEIsQ0FDeEIsR0FBTSxHQUFVLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FDaEMsQ0FBRSxNQUFLLGtCQUFpQixNQUFLLFVBQVMsYUFDMUMsR0FDRSxXQUNBLEtBQUssTUFDTCxLQUFLLE1BQU0sSUFBTSxFQUNqQixLQUFLLE1BQU0sVUFDWCxLQUFLLE1BQU0sUUFDWCxLQUFLLDJDQUVULEtBQUssTUFBTSxJQUFNLEVBQU0sRUFDdkIsS0FBSyxNQUFNLFVBQVksRUFDdkIsS0FBSyxNQUFNLFFBQVUsRUFFakIsR0FDRixNQUFLLE1BQU0sOEJBQWdDLEdBQUksSUFDN0MsRUFBZ0IsUUFDaEIsRUFBZ0IsSUFBTSxFQUFnQixVQUN0QyxFQUFnQixNQUlwQixBQUFJLEtBQUssTUFBTSxZQUFZLEtBQUksR0FDN0IsS0FBSyxZQUVILEdBQUEsRUFBa0IsS0FBTyxFQUFVLEVBQU0sS0FHM0MsTUFBSyxNQUFNLE1BQ1gsS0FBSyxZQUVILEdBQUEsRUFBa0IsS0FBTyxFQUFVLEVBQU0sT0FLL0MsdUJBQ0UsRUFDQSxDQUFFLE1BQ0YsQ0FDQSxHQUFNLEdBQVEsRUFBRyxNQUVqQixBQUFJLEtBQUssTUFBTSxRQUFVLENBQUMsS0FBSyxNQUFNLGFBQWEsSUFBSSxHQUNwRCxLQUFLLE1BQU0sRUFBYyxDQUFFLE9BRTNCLEtBQUssTUFBTSxhQUFhLElBQUksRUFBTyxDQUFDLEVBQWMsSUFhdEQsVUFBVSxFQUE0QixDQUNwQyxLQUFLLE1BQU0sWUFBYyxHQUN6QixHQUFJLEdBQU8sR0FDTCxFQUFRLEtBQUssTUFBTSxJQUNyQixFQUFhLEtBQUssTUFBTSxJQUs1QixJQUpJLElBQWMsUUFDaEIsTUFBSyxNQUFNLEtBQU8sR0FBYSxNQUFTLEVBQUksR0FHdkMsS0FBSyxNQUFNLElBQU0sS0FBSyxRQUFRLENBQ25DLEdBQU0sR0FBSyxLQUFLLGVBQWUsS0FBSyxNQUFNLEtBQzFDLEdBQUksR0FBaUIsR0FDbkIsS0FBSyxNQUFNLEtBQU8sR0FBTSxNQUFTLEVBQUksVUFDNUIsSUFBRSxHQUEwQixDQUNyQyxLQUFLLE1BQU0sWUFBYyxHQUV6QixHQUFRLEtBQUssTUFBTSxNQUFNLEVBQVksS0FBSyxNQUFNLEtBQ2hELEdBQU0sR0FBVyxLQUFLLE1BQU0sY0FDdEIsRUFDSixLQUFLLE1BQU0sTUFBUSxFQUFRLEdBQW9CLEdBRWpELEdBQUksS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLE1BQU0sT0FBSSxJQUEyQixDQUNwRSxLQUFLLE1BQU0sRUFBTyxxQkFBc0IsQ0FDdEMsR0FBSSxLQUFLLE1BQU0sZ0JBRWpCLEVBQWEsS0FBSyxNQUFNLElBQU0sRUFDOUIsU0FHRixFQUFFLEtBQUssTUFBTSxJQUNiLEdBQU0sR0FBTSxLQUFLLGNBQWMsSUFDL0IsQUFBSSxJQUFRLE1BQ0wsR0FBZ0IsSUFDbkIsS0FBSyxNQUFNLEVBQU8sMkJBQTRCLENBQUUsR0FBSSxJQUd0RCxHQUFRLE9BQU8sY0FBYyxJQUUvQixFQUFhLEtBQUssTUFBTSxRQUV4QixPQUdKLE1BQU8sR0FBTyxLQUFLLE1BQU0sTUFBTSxFQUFZLEtBQUssTUFBTSxLQU14RCxTQUFTLEVBQTBCLENBQ2pDLEdBQU0sR0FBTyxLQUFLLFVBQVUsR0FDdEIsRUFBTyxHQUFhLElBQUksR0FDOUIsQUFBSSxJQUFTLE9BR1gsS0FBSyxZQUFZLEVBQU0sR0FBZSxJQUV0QyxLQUFLLFlBQXFCLElBQUEsR0FJOUIscUJBQTRCLENBQzFCLEdBQU0sQ0FBRSxRQUFTLEtBQUssTUFDdEIsQUFBSSxHQUFlLElBQVMsS0FBSyxNQUFNLGFBQ3JDLEtBQUssTUFBTSxFQUFPLDJCQUE0QixDQUM1QyxHQUFJLEtBQUssTUFBTSxTQUNmLGFBQWMsR0FBZSxLQWNuQyxNQUNFLEVBQ0EsRUFDMEIsQ0FDMUIsR0FBTSxDQUFFLE1BQW1CLEVBQVosRUFBTyxHQUFLLEVBQWUsSUFDcEMsRUFBTSxZQUFjLElBQVcsRUFBSyxFQUFHLElBQUksTUFFM0MsRUFBUSxFQUFhLENBQUUsTUFBSyxZQUVsQyxHQUFJLENBQUMsS0FBSyxRQUFRLGNBQWUsS0FBTSxHQUN2QyxNQUFLLE1BQUssYUFBYSxLQUFLLE1BQU0sT0FBTyxLQUFLLEdBRXZDLEVBU1QsZUFDRSxFQUNBLEVBQ2tDLENBQ2xDLEdBQU0sQ0FBRSxNQUFtQixFQUFaLEVBQU8sR0FBSyxFQUFlLElBQ3BDLEVBQU0sWUFBYyxJQUFXLEVBQUssRUFBRyxJQUFJLE1BQzNDLEVBQU0sRUFBSSxNQUNWLEVBQVMsS0FBSyxNQUFNLE9BRTFCLE9BQVMsR0FBSSxFQUFPLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFBSyxDQUMzQyxHQUFNLEdBQVEsRUFBTyxHQUNyQixHQUFJLEVBQU0sSUFBSSxRQUFVLEVBRXRCLE1BQVEsR0FBTyxHQUFLLEVBQWEsQ0FBRSxNQUFLLFlBRTFDLEdBQUksRUFBTSxJQUFJLE1BQVEsRUFBSyxNQUc3QixNQUFPLE1BQUssTUFBTSxFQUFjLEdBS2xDLGNBQWMsRUFBMkIsRUFHekMsV0FBVyxFQUF1QixFQUF3QixDQUN4RCxLQUFNLE1BQUssTUFBTSxFQUFPLGdCQUFpQixDQUN2QyxTQUFVLEVBQU8sR0FBZSxHQUFRLEtBQ3hDLEdBQUksR0FBb0IsS0FBSyxNQUFNLFdBSXZDLGFBQWEsRUFBb0IsRUFBc0IsQ0FDckQsR0FBSSxLQUFLLFVBQVUsR0FDakIsTUFBTyxHQUdULEtBQU0sTUFBSyxNQUFNLEVBQU8sY0FBZSxDQUNyQyxHQUFJLEdBQW9CLEtBQUssTUFBTSxTQUNuQyxjQUFlLENBQUMsS0FJcEIsZ0JBQWdCLEVBQTZCLENBQzNDLEdBQUksQ0FBQyxFQUFZLEtBQUssR0FBUSxLQUFLLFVBQVUsSUFDM0MsS0FBTSxNQUFLLE1BQU0sRUFBTyxvQkFBcUIsQ0FDM0MsR0FBSSxLQUFLLE1BQU0sU0FDZixjQUFlLElBS3JCLGFBQWEsRUFBa0MsQ0FDN0MsTUFBTyxDQUFDLEVBQWEsRUFBbUIsSUFBb0IsQ0FDMUQsS0FBSyxNQUFNLEVBQU8sQ0FDaEIsR0FBSSxHQUFjLEVBQUssRUFBVyxRQzNnRG5DLFFBQWlCLENBQUEsYUFBQSxDQUFBLEtBRXRCLGFBQTRCLEdBQUksS0FBSyxLQUdyQyxjQUFnRCxHQUFJLEtBQUssS0FJekQsc0JBQStDLEdBQUksT0FHdEMsUUFBd0IsQ0FLckMsWUFBWSxFQUFtQixDQUFBLEtBSi9CLE9BQU0sT0FBQSxLQUNOLE1BQTJCLEdBQUUsS0FDN0Isc0JBQStDLEdBQUksS0FHakQsS0FBSyxPQUFTLEVBR2hCLFNBQXNCLENBQ3BCLE1BQU8sTUFBSyxNQUFNLEtBQUssTUFBTSxPQUFTLEdBR3hDLE9BQVEsQ0FDTixLQUFLLE1BQU0sS0FBSyxHQUFJLEtBR3RCLE1BQU8sQ0FDTCxHQUFNLEdBQWdCLEtBQUssTUFBTSxNQUszQixFQUFVLEtBQUssVUFHckIsT0FBVyxDQUFDLEVBQU0sSUFBUSxPQUFNLEtBQUssRUFBYyx1QkFDakQsQUFBSSxFQUNHLEVBQVEsc0JBQXNCLElBQUksSUFDckMsRUFBUSxzQkFBc0IsSUFBSSxFQUFNLEdBRzFDLEtBQUssT0FBTyxNQUFNLEVBQU8sOEJBQStCLENBQ3RELEdBQUksRUFDSixlQUFnQixJQU14QixtQkFDRSxFQUNBLEVBQ0EsRUFDQSxDQUNBLEdBQU0sQ0FBRSxlQUFjLGdCQUFlLHlCQUNuQyxLQUFLLFVBQ0gsRUFBWSxFQUFhLElBQUksR0FFakMsR0FBSSxFQUFjLEdBQTZCLENBQzdDLEdBQU0sR0FBVyxHQUFhLEVBQWMsSUFBSSxHQUNoRCxHQUFJLEVBQVUsQ0FDWixHQUFNLEdBQVksRUFBVyxHQUN2QixFQUFZLEVBQWMsR0FFMUIsRUFBVSxFQUFXLEdBQ3JCLEVBQVUsRUFBYyxHQUs5QixFQUFZLElBQVksR0FBVyxJQUFjLEVBRTVDLEdBQVcsRUFBYyxPQUFPLE9BQ2hDLEFBQUssSUFDVixFQUFjLElBQUksRUFBTSxHQUk1QixBQUFJLEdBQ0YsS0FBSyxPQUFPLE1BQU0sRUFBTyx5QkFBMEIsQ0FDakQsR0FBSSxFQUNKLGVBQWdCLElBSXBCLEVBQWEsSUFBSSxHQUNqQixFQUFzQixPQUFPLEdBRy9CLGVBQWUsRUFBYyxFQUFlLENBQzFDLEdBQUksR0FDSixJQUFLLElBQWMsTUFBSyxNQUN0QixHQUFJLEVBQVcsYUFBYSxJQUFJLEdBQU8sT0FHekMsQUFBSSxFQUNGLEVBQVcsc0JBQXNCLElBQUksRUFBTSxHQUczQyxLQUFLLE9BQU8sTUFBTSxFQUFPLDhCQUErQixDQUN0RCxHQUFJLEVBQ0osZUFBZ0IsTUNoRWxCLEdBQWMsRUFDbEIsR0FBa0MsRUFDbEMsR0FBdUMsRUFDdkMsR0FBd0IsRUFJMUIsUUFBc0IsQ0FHcEIsWUFBWSxFQUE0QixHQUFhLENBQUEsS0FGckQsS0FBSSxPQUdGLEtBQUssS0FBTyxFQUdkLGdDQUFnRSxDQUM5RCxNQUNFLE1BQUssT0FBUyxJQUNkLEtBQUssT0FBUyxHQUlsQixpQ0FBa0MsQ0FDaEMsTUFBTyxNQUFLLE9BQVMsS0FZekIsZ0JBQW9DLEdBQWdCLENBR2xELFlBQVksRUFBYSxDQUN2QixNQUFNLEdBQU0sS0FIZCxrQkFDRSxHQUFJLEtBSU4sdUJBQ0UsRUFDQSxDQUNFLE1BSUYsQ0FDQSxHQUFNLEdBQVEsRUFBRyxNQUVqQixLQUFLLGtCQUFrQixJQUFJLEVBQU8sQ0FBQyxFQUFtQixJQUV4RCxzQkFBc0IsRUFBZSxDQUNuQyxLQUFLLGtCQUFrQixPQUFPLEdBRWhDLGNBQ0UsRUFDQSxDQUNBLEtBQUssa0JBQWtCLFFBQVEsS0FJcEIsUUFBNkIsQ0FJMUMsWUFBWSxFQUFtQixDQUFBLEtBSC9CLE9BQU0sT0FBQSxLQUNOLE1BQWdDLENBQUMsR0FBSSxLQUduQyxLQUFLLE9BQVMsRUFFaEIsTUFBTSxFQUF3QixDQUM1QixLQUFLLE1BQU0sS0FBSyxHQUdsQixNQUFPLENBQ0wsS0FBSyxNQUFNLE1BVWIsZ0NBQ0UsRUFDQSxDQUNFLEdBQUksR0FJQSxDQUNOLEdBQU0sR0FBUyxDQUFFLEdBQUksRUFBSyxJQUFJLE9BQ3hCLENBQUUsU0FBVSxLQUNkLEVBQUksRUFBTSxPQUFTLEVBQ25CLEVBQXlCLEVBQU0sR0FDbkMsS0FBTyxDQUFDLEVBQU0sbUNBQW1DLENBQy9DLEdBQUksRUFBTSxpQ0FDUixFQUFNLHVCQUF1QixFQUFjLE9BSTNDLFFBRUYsRUFBUSxFQUFNLEVBQUUsR0FFbEIsS0FBSyxPQUFPLE1BQU0sRUFBYyxHQXNCbEMsaUNBQ0UsRUFDQSxDQUNFLEdBQUksR0FJQSxDQUNOLEdBQU0sQ0FBRSxTQUFVLEtBQ1osRUFBeUIsRUFBTSxFQUFNLE9BQVMsR0FDOUMsRUFBUyxDQUFFLEdBQUksRUFBSyxJQUFJLE9BQzlCLEdBQUksRUFBTSxrQ0FDUixLQUFLLE9BQU8sTUFBTSxFQUFPLFdBQ2hCLEVBQU0saUNBQ2YsRUFBTSx1QkFBdUIsRUFBTyxPQUVwQyxRQVVKLGdDQUFnQyxDQUFFLE1BQThCLENBQzlELEdBQU0sQ0FBRSxTQUFVLEtBQ2QsRUFBSSxFQUFNLE9BQVMsRUFDbkIsRUFBeUIsRUFBTSxHQUNuQyxLQUFPLEVBQU0sa0NBQ1gsQUFBSSxFQUFNLE9BQVMsSUFDakIsRUFBTSx1QkFBdUIsRUFBTyx1QkFBd0IsQ0FBRSxPQUVoRSxFQUFRLEVBQU0sRUFBRSxHQUlwQixtQkFBMEIsQ0FDeEIsR0FBTSxDQUFFLFNBQVUsS0FDWixFQUFlLEVBQU0sRUFBTSxPQUFTLEdBQzFDLEFBQUksQ0FBQyxFQUFhLGtDQUNsQixFQUFhLGNBQWMsQ0FBQyxDQUFDLEVBQWMsS0FBUyxDQUNsRCxLQUFLLE9BQU8sTUFBTSxFQUFjLENBQUUsR0FBSSxJQUV0QyxHQUFJLEdBQUksRUFBTSxPQUFTLEVBQ25CLEVBQVEsRUFBTSxHQUNsQixLQUFPLEVBQU0sa0NBQ1gsRUFBTSxzQkFBc0IsRUFBSSxPQUNoQyxFQUFRLEVBQU0sRUFBRSxPQU1qQixhQUF3QyxDQUM3QyxNQUFPLElBQUksSUFBZ0IsSUFHdEIsYUFBNkIsQ0FDbEMsTUFBTyxJQUFJLElBQXNCLElBRzVCLGFBQThCLENBQ25DLE1BQU8sSUFBSSxJQUFzQixJQUc1QixhQUE4QixDQUNuQyxNQUFPLElBQUksSUNyUE4sR0FDTCxJQUFRLEVBRVIsR0FBYyxFQUVkLEdBQWMsRUFFZCxHQUFlLEVBQ2YsR0FBVyxFQWtDRSxRQUFpQyxDQUFBLGFBQUEsQ0FBQSxLQUM5QyxPQUF3QixHQUN4QixNQUFNLEVBQWUsQ0FDbkIsS0FBSyxPQUFPLEtBQUssR0FHbkIsTUFBTyxDQUNMLEtBQUssT0FBTyxNQUdkLGNBQXVCLENBQ3JCLE1BQU8sTUFBSyxPQUFPLEtBQUssT0FBTyxPQUFTLE1BR3RDLFdBQW9CLENBQ3RCLE1BQVEsTUFBSyxlQUFpQixJQUFlLEtBRzNDLFdBQW9CLENBQ3RCLE1BQVEsTUFBSyxlQUFpQixJQUFlLEtBRzNDLFlBQXFCLENBQ3ZCLE1BQVEsTUFBSyxlQUFpQixJQUFnQixLQUc1QyxRQUFpQixDQUNuQixNQUFRLE1BQUssZUFBaUIsSUFBWSxJQUl2QyxZQUNMLEVBQ0EsRUFDVyxDQUNYLE1BQVEsR0FBVSxHQUFjLEdBQU0sR0FBYyxHQUFjLEdDeENyRCxvQkFBa0MsR0FBVSxDQUl6RCxTQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQXNCLEdBQ2hCLENBQ04sR0FBSSxDQUFDLEVBQU0sT0FFWCxHQUFNLEdBQVMsRUFBSyxNQUFRLEVBQUssT0FBUyxHQUMxQyxBQUFJLEVBQ0YsRUFBTSxHQUFPLEVBRWIsT0FBTyxlQUFlLEVBQU8sRUFBSyxDQUFFLGFBQVksVUFNcEQsYUFBYSxFQUEyQixDQUN0QyxNQUFPLE1BQUssTUFBTSxPQUFTLEdBQVMsQ0FBQyxLQUFLLE1BQU0sWUFHbEQscUJBQXFCLEVBQW1CLEVBQXVCLENBQzdELEdBQU0sR0FBVSxFQUFZLEVBQUssT0FDakMsR0FBSSxLQUFLLE1BQU0sTUFBTSxFQUFXLEtBQWEsRUFBTSxDQUNqRCxHQUFNLEdBQVMsS0FBSyxNQUFNLFdBQVcsR0FDckMsTUFBTyxDQUNMLElBQWlCLElBSWhCLEdBQVMsUUFBWSxPQUcxQixNQUFPLEdBR1Qsc0JBQXNCLEVBQXVCLENBQzNDLEdBQU0sR0FBTyxLQUFLLGlCQUNsQixNQUFPLE1BQUsscUJBQXFCLEVBQU0sR0FLekMsY0FBYyxFQUEyQixDQUN2QyxNQUFJLE1BQUssYUFBYSxHQUNwQixNQUFLLE9BQ0UsSUFFRixHQUtULGlCQUNFLEVBQ0EsRUFDTSxDQUNOLEdBQUksQ0FBQyxLQUFLLGNBQWMsR0FBUSxDQUM5QixHQUFJLEdBQWdCLEtBQ2xCLEtBQU0sTUFBSyxNQUFNLEVBQWMsQ0FBRSxHQUFJLEtBQUssTUFBTSxXQUVsRCxLQUFLLFdBQVcsS0FBTSxJQU0xQixvQkFBOEIsQ0FDNUIsTUFDRSxNQUFLLE1BQVksTUFDakIsS0FBSyxNQUFLLElBQ1YsS0FBSyx3QkFJVCx1QkFBaUMsQ0FDL0IsTUFBTyxJQUFVLEtBQ2YsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLGNBQWMsTUFBTyxLQUFLLE1BQU0sUUFJaEUsdUJBQWlDLENBQy9CLFVBQTBCLFVBQVksS0FBSyxNQUFNLElBQzFDLEdBQTBCLEtBQUssS0FBSyxPQUc3QyxrQkFBNEIsQ0FDMUIsTUFBTyxNQUFLLElBQVcsS0FBSyxLQUFLLHFCQU1uQyxVQUFVLEVBQW9CLEdBQVksQ0FDeEMsQUFBSSxHQUFXLEtBQUssbUJBQXFCLEtBQUssSUFBRyxNQUNqRCxLQUFLLE1BQU0sRUFBTyxpQkFBa0IsQ0FBRSxHQUFJLEtBQUssTUFBTSxnQkFNdkQsT0FBTyxFQUFpQixFQUE2QixDQUNuRCxLQUFLLElBQUksSUFBUyxLQUFLLFdBQVcsRUFBSyxHQUt6QyxTQUNFLEVBQ0EsRUFBa0IsS0FBSyxNQUFNLFFBSWtCLENBQy9DLEdBQU0sR0FFRixDQUFFLEtBQU0sTUFDWixHQUFJLENBQ0YsR0FBTSxHQUFPLEVBQUcsQ0FBQyxFQUFPLE9BQVMsQ0FDL0IsUUFBWSxLQUFPLEVBQ2IsSUFFUixHQUFJLEtBQUssTUFBTSxPQUFPLE9BQVMsRUFBUyxPQUFPLE9BQVEsQ0FDckQsR0FBTSxHQUFZLEtBQUssTUFDdkIsWUFBSyxNQUFRLEVBSWIsS0FBSyxNQUFNLGFBQWUsRUFBVSxhQUM3QixDQUNMLE9BQ0EsTUFBTyxFQUFVLE9BQU8sRUFBUyxPQUFPLFFBQ3hDLE9BQVEsR0FDUixRQUFTLEdBQ1QsYUFJSixNQUFPLENBQ0wsT0FDQSxNQUFPLEtBQ1AsT0FBUSxHQUNSLFFBQVMsR0FDVCxVQUFXLFlBRU4sRUFBUCxDQUNBLEdBQU0sR0FBWSxLQUFLLE1BRXZCLEdBREEsS0FBSyxNQUFRLEVBQ1QsWUFBaUIsYUFFbkIsTUFBTyxDQUFFLEtBQU0sS0FBTSxRQUFPLE9BQVEsR0FBTSxRQUFTLEdBQU8sYUFFNUQsR0FBSSxJQUFVLEVBQ1osTUFBTyxDQUNMLEtBQU0sRUFBWSxLQUNsQixNQUFPLEtBQ1AsT0FBUSxHQUNSLFFBQVMsR0FDVCxhQUlKLEtBQU0sSUFJVixzQkFDRSxFQUNBLEVBQ0EsQ0FDQSxHQUFJLENBQUMsRUFBcUIsTUFBTyxHQUNqQyxHQUFNLENBQ0oscUJBQ0EsaUJBQ0EsZ0JBQ0EseUJBQ0UsRUFFRSxFQUNKLENBQUMsQ0FBQyxHQUNGLENBQUMsQ0FBQyxHQUNGLENBQUMsQ0FBQyxHQUNGLENBQUMsQ0FBQyxFQUVKLEdBQUksQ0FBQyxFQUNILE1BQU8sR0FHVCxBQUFJLEdBQXNCLE1BQ3hCLEtBQUssTUFBTSxFQUFPLDRCQUE2QixDQUM3QyxHQUFJLElBSUosR0FBa0IsTUFDcEIsS0FBSyxNQUFNLEVBQU8sZUFBZ0IsQ0FBRSxHQUFJLElBR3RDLEdBQWlCLE1BQ25CLEtBQUssTUFBTSxFQUFPLHVCQUF3QixDQUFFLEdBQUksSUFHOUMsR0FBeUIsTUFDM0IsS0FBSyxXQUFXLEdBYXBCLHVCQUFpQyxDQUMvQixNQUFPLElBQTJCLEtBQUssTUFBTSxNQU8vQyxjQUFjLEVBQXFCLENBQ2pDLE1BQU8sR0FBSyxPQUFTLGNBUXZCLGlCQUFpQixFQUFvQixDQUNuQyxNQUFPLEdBQUssR0FBRyxLQVFqQix5QkFBeUIsRUFBcUIsQ0FDNUMsTUFDRyxHQUFLLE9BQVMsb0JBQ2IsRUFBSyxPQUFTLDZCQUNoQixLQUFLLGNBQWMsRUFBSyxVQUk1QixpQkFDRSxFQUNtRCxDQUNuRCxNQUFPLEdBQUssT0FBUyxpQkFHdkIsZUFBZSxFQUFxQixDQUNsQyxNQUFPLEdBQUssT0FBUyxlQUd2QixpQkFFRSxFQUFvQixLQUFLLFFBQVEsYUFBZSxTQUNwQyxDQUVaLEdBQU0sR0FBWSxLQUFLLE1BQU0sT0FDN0IsS0FBSyxNQUFNLE9BQVMsR0FFcEIsR0FBTSxHQUF5QixLQUFLLG9CQUNwQyxLQUFLLG9CQUFzQixHQUFJLEtBRy9CLEdBQU0sR0FBYyxLQUFLLFNBQ3pCLEtBQUssU0FBVyxFQUVoQixHQUFNLEdBQVcsS0FBSyxNQUNoQixFQUFlLEtBQUssa0JBQzFCLEtBQUssTUFBUSxHQUFJLEdBQWEsS0FBTSxHQUVwQyxHQUFNLEdBQWUsS0FBSyxVQUMxQixLQUFLLFVBQVksR0FBSSxJQUVyQixHQUFNLEdBQWdCLEtBQUssV0FDM0IsS0FBSyxXQUFhLEdBQUksSUFBa0IsTUFFeEMsR0FBTSxHQUFxQixLQUFLLGdCQUNoQyxZQUFLLGdCQUFrQixHQUFJLElBQXVCLE1BRTNDLElBQU0sQ0FFWCxLQUFLLE1BQU0sT0FBUyxFQUNwQixLQUFLLG9CQUFzQixFQUczQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxNQUFRLEVBQ2IsS0FBSyxVQUFZLEVBQ2pCLEtBQUssV0FBYSxFQUNsQixLQUFLLGdCQUFrQixHQUkzQixvQkFBcUIsQ0FDbkIsR0FBSSxHQUFhLEdBQ2pCLEFBQUksS0FBSyxVQUNQLElBQWMsSUFFaEIsS0FBSyxNQUFNLE1BQU0sSUFDakIsS0FBSyxVQUFVLE1BQU0sR0FHdkIsMEJBQTBCLEVBQXVDLENBQy9ELEdBQU0sQ0FBRSxpQkFBa0IsRUFDMUIsQUFBSSxJQUFrQixNQUNwQixLQUFLLGFBQWEsdUJBQXdCLEtBa0J6QyxRQUF1QixDQUFBLGFBQUEsQ0FBQSxLQUM1QixtQkFBa0QsS0FBSSxLQUN0RCxlQUE4QyxLQUFJLEtBQ2xELGNBQTZDLEtBQUksS0FDakQsc0JBQXFELE9Dblh2RCxRQUErQixDQUM3QixZQUFZLEVBQWdCLEVBQWEsRUFBZSxDQUFBLEtBUXhELEtBQWUsR0FQYixLQUFLLE1BQVEsRUFDYixLQUFLLElBQU0sRUFDWCxLQUFLLElBQU0sR0FBSSxJQUFlLEdBQzFCLEdBQUEsTUFBQSxFQUFRLFFBQVEsUUFBUSxNQUFLLE1BQVEsQ0FBQyxFQUFLLElBQzNDLEdBQU0sTUFBTixFQUFRLFVBQVUsTUFBSyxJQUFJLFNBQVcsRUFBTyxZQWUvQyxHQUFnQixHQUFLLFVBSXpCLEdBQWMsUUFBVSxVQUFrQixDQUN4QyxHQUFNLEdBQVUsR0FBSSxJQUFLLE9BQVcsS0FBSyxNQUFPLEtBQUssSUFBSSxPQUNuRCxFQUFPLE9BQU8sS0FBSyxNQUN6QixPQUFTLEdBQUksRUFBRyxFQUFTLEVBQUssT0FBUSxFQUFJLEVBQVEsSUFBSyxDQUNyRCxHQUFNLEdBQU0sRUFBSyxHQUVqQixBQUNFLElBQVEsbUJBQ1IsSUFBUSxvQkFDUixJQUFRLGlCQUdSLEdBQVEsR0FBTyxLQUFLLElBSXhCLE1BQU8sSUFJWCxZQUEwQixFQUFnQixDQUN4QyxNQUFPLElBQWdCLEdBR2xCLFlBQXlCLEVBQWdCLENBSTlDLEdBQU0sQ0FBRSxPQUFNLFFBQU8sTUFBSyxNQUFLLFFBQU8sUUFBTyxRQUFTLEVBQ2hELEVBQVMsT0FBTyxPQUFPLElBQzdCLFNBQU8sS0FBTyxFQUNkLEVBQU8sTUFBUSxFQUNmLEVBQU8sSUFBTSxFQUNiLEVBQU8sSUFBTSxFQUNiLEVBQU8sTUFBUSxFQUNmLEVBQU8sTUFBUSxFQUNmLEVBQU8sS0FBTyxFQUNWLElBQVMsZUFDWCxHQUFPLGFBQWUsRUFBSyxjQUV0QixFQUdGLFlBQTRCLEVBQWdCLENBQ2pELEdBQU0sQ0FBRSxPQUFNLFFBQU8sTUFBSyxNQUFLLFFBQU8sU0FBVSxFQUNoRCxHQUFJLElBQVMsY0FDWCxNQUFPLElBQWlCLEdBRTFCLEdBQU0sR0FBUyxPQUFPLE9BQU8sSUFDN0IsU0FBTyxLQUFPLEVBQ2QsRUFBTyxNQUFRLEVBQ2YsRUFBTyxJQUFNLEVBQ2IsRUFBTyxJQUFNLEVBQ2IsRUFBTyxNQUFRLEVBQ2YsQUFBSSxFQUFLLE1BQVEsT0FFZixFQUFPLElBQU0sRUFBSyxJQUVsQixFQUFPLE1BQVEsRUFFakIsRUFBTyxNQUFRLEVBQUssTUFDYixFQUtGLG9CQUFpQyxHQUFXLENBQ2pELFdBQTJDLENBRXpDLE1BQU8sSUFBSSxJQUFLLEtBQU0sS0FBSyxNQUFNLE1BQU8sS0FBSyxNQUFNLFVBR3JELFlBQWdDLEVBQTBCLENBRXhELE1BQU8sSUFBSSxJQUFLLEtBQU0sRUFBSSxNQUFPLEdBSW5DLGdCQUFvQyxFQUFtQyxDQUNyRSxNQUFPLE1BQUssWUFBWSxFQUFLLElBQUksT0FLbkMsV0FBK0IsRUFBaUIsRUFBb0IsQ0FDbEUsTUFBTyxNQUFLLGFBQWEsRUFBTSxFQUFNLEtBQUssTUFBTSxlQUtsRCxhQUNFLEVBQ0EsRUFDQSxFQUNHLENBUUgsU0FBSyxLQUFPLEVBRVosRUFBSyxJQUFNLEVBQU8sTUFDbEIsRUFBSyxJQUFJLElBQU0sRUFDWCxLQUFLLFFBQVEsUUFBUSxHQUFLLE1BQU0sR0FBSyxFQUFPLE9BQzVDLEtBQUssUUFBUSxlQUFlLEtBQUssZUFBZSxHQUM3QyxFQUdULG1CQUFtQixFQUFnQixFQUEwQixDQUMzRCxFQUFLLE1BQVEsRUFBUyxNQUN0QixFQUFLLElBQUksTUFBUSxFQUNiLEtBQUssUUFBUSxRQUFRLEdBQUssTUFBTSxHQUFLLEVBQVMsT0FHcEQsaUJBQ0UsRUFDQSxFQUFtQixLQUFLLE1BQU0sY0FDeEIsQ0FDTixFQUFLLElBQU0sRUFBTyxNQUNsQixFQUFLLElBQUksSUFBTSxFQUNYLEtBQUssUUFBUSxRQUFRLEdBQUssTUFBTSxHQUFLLEVBQU8sT0FNbEQsMkJBQTJCLEVBQWdCLEVBQThCLENBQ3ZFLEtBQUssbUJBQW1CLEVBQU0sRUFBYSxJQUFJLFNDaEk3QyxHQUFnQixHQUFJLEtBQUksQ0FDNUIsSUFDQSxNQUNBLE9BQ0EsVUFDQSxRQUNBLFVBQ0EsUUFDQSxZQUNBLFFBQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDQSxPQUNBLFNBQ0EsU0FLSSxHQUFhLFNBQXFCLENBQ3RDLDBCQUNFLGlGQUNGLDJCQUNFLHlLQUdGLG1CQUFvQixDQUFDLENBQUUsa0JBQ2Esa0NBQUEsS0FDcEMsb0JBQ0UsMERBQ0YsNkJBQ0Usc0VBQ0YsOEJBQ0UsZ0RBQ0YsZ0NBQWlDLENBQUMsQ0FDaEMsYUFDQSxjQUs2RCw2REFBQSxvQkFBNkIsMEJBQW1DLE9BQy9ILHdCQUF5QixDQUFDLENBQ3hCLGFBQ0EsY0FLQyx1REFBc0QsOENBQXVELE9BQ2hILDZCQUE4QixDQUFDLENBQUUsY0FDckIsVUFBQSx5S0FDWix3QkFBeUIsQ0FBQyxDQUN4QixrQkFDQSxjQUtDLGVBQWMsNkZBQTJHLE9BQzVILHVDQUF3QyxDQUFDLENBQ3ZDLGNBSTRHLDRHQUFBLE9BYTlHLHdDQUF5QyxDQUFDLENBQ3hDLFdBQ0EsYUFDQSxrQkFLRCxVQUNXLGtCQUF5QixnQ0FBMkMscUJBQThCLGFBQzlHLHVDQUF3QyxDQUFDLENBQ3ZDLFdBQ0EsZ0JBTUMsb0RBQW1ELGtCQUEyQixPQUNqRix3Q0FBeUMsQ0FBQyxDQUN4QyxXQUNBLGdCQU1DLHFDQUFvQyw2RUFBc0YsT0FDN0gsc0JBQXVCLENBQUMsQ0FDdEIsV0FDQSxhQUNBLGdCQU1xRixxRkFBQSx5QkFBa0Msa0JBQTJCLE9BQ3BKLCtCQUFnQyxDQUFDLENBQy9CLFdBQ0EsZ0JBS0Msc0RBQXFELHFCQUE4QixPQUN0RiwwQ0FBMkMsQ0FBQyxDQUMxQyxjQUkyRywyR0FBQSxPQUM3RywwQkFBMkIsMkNBQzNCLDhCQUNFLHlFQUNGLG9DQUNFLHlLQUNGLG1CQUNFLDhFQUNGLHVCQUNFLDJFQUNGLGdCQUFpQixnREFDakIsb0NBQ0UsMEZBQ0Ysd0JBQ0UsMEdBQ0Ysb0JBQ0UsbUVBQ0Ysa0JBQW1CLDBEQUNuQixrQkFBaUIsT0FBQSxPQUFBLENBQ2YsUUFDRSxrRkFHRSxDQUFFLFdBQVksMkJBR3BCLDBCQUEyQiwyQ0FDM0IsZUFBZ0IsMENBQ2hCLDRCQUNFLDBEQUNGLDZCQUNFLG9HQUNGLDBCQUEyQiwyQ0FDM0IscUJBQ0UsNkRBQ0YsbUJBQW9CLHFEQUNwQixzQkFDRSxvSEFDRixrQkFDRSx1RUFDRixrQ0FDRSx1RUFDRix1QkFBd0IsQ0FBQyxDQUFFLGtCQUNHLDRCQUFBLEtBQzlCLDZCQUNFLHlEQUNGLG1DQUNFLHdEQUNGLHFCQUNFLG1FQUNGLDZCQUNFLG1EQUNGLGtDQUNFLG9FQUNGLGdEQUNFLG9IQUNGLDZCQUE4QixDQUFDLENBQzdCLHdCQUNBLGdCQUtDLG9CQUFtQiwrQkFBbUQsZUFDekUsb0NBQ0Usb0VBQ0Ysd0JBQXlCLCtCQUkzQixZQUF3QixFQUE4QixDQUNwRCxNQUNFLEdBQVksT0FBUywrQkFDcEIsRUFBWSxPQUFTLDRCQUNuQixFQUFDLEVBQVksYUFDWCxFQUFZLFlBQVksT0FBUyxhQUNoQyxFQUFZLFlBQVksT0FBUyx3QkFJM0MsWUFBMkIsRUFBdUIsQ0FDaEQsTUFBTyxHQUFLLGFBQWUsUUFBVSxFQUFLLGFBQWUsU0FHM0QsR0FBTSxJQUFvQixDQUN4QixNQUFPLHFCQUNQLElBQUsscUJBQ0wsS0FBTSxjQUNOLFVBQVcsb0JBSWIsWUFDRSxFQUNBLEVBQ1ksQ0FDWixHQUFNLEdBQWEsR0FDYixFQUFhLEdBQ25CLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBSyxPQUFRLElBQy9CLEFBQUMsR0FBSyxFQUFLLEdBQUksRUFBRyxHQUFRLEVBQVEsR0FBTyxLQUFLLEVBQUssSUFFckQsTUFBTyxDQUFDLEVBQU8sR0FHakIsR0FBTSxJQUFvQix5QkFvQzFCLEdBQWdCLEdBQ2QsYUFBOEIsRUFBNkIsQ0FBQSxlQUFBLEVBQUEsQ0FBQSxNQUFBLEdBQUEsR0FBQSxLQUl6RCxXQUE4QyxPQUU5QyxpQkFFRSxDQUNBLE1BQU8sSUFHVCxrQkFBNEIsQ0FDMUIsTUFBTyxNQUFLLGdCQUFnQixPQUFRLFFBQVUsS0FBSyxhQUFlLE9BR3BFLGtCQUE0QixDQUMxQixNQUFPLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixPQUFRLFNBR3hDLFlBQVksRUFBaUIsRUFBZ0IsQ0FDM0MsQUFDRSxJQUFJLEtBQ0osSUFBSSxJQUNKLElBQUksSUFFQSxLQUFLLGFBQWUsUUFDdEIsTUFBSyxXQUFhLE1BR3RCLE1BQU0sWUFBWSxFQUFNLEdBRzFCLFdBQVcsRUFBMEIsQ0FDbkMsR0FBSSxLQUFLLGFBQWUsT0FBVyxDQUVqQyxHQUFNLEdBQVUsR0FBa0IsS0FBSyxFQUFRLE9BQy9DLEdBQUssRUFFRSxHQUFJLEVBQVEsS0FBTyxPQUN4QixLQUFLLFdBQWEsZUFDVCxFQUFRLEtBQU8sU0FDeEIsS0FBSyxXQUFhLGFBRWxCLE1BQU0sSUFBSSxPQUFNLDBCQUdwQixNQUFNLFdBQVcsR0FHbkIseUJBQXlCLEVBQTZCLENBQ3BELEdBQU0sR0FBWSxLQUFLLE1BQU0sT0FDN0IsS0FBSyxNQUFNLE9BQVMsR0FDcEIsS0FBSyxPQUFPLEdBQUcsSUFFZixHQUFNLEdBQU8sS0FBSyxnQkFDbEIsWUFBSyxNQUFNLE9BQVMsRUFDYixFQUdULG9CQUFzQyxDQUNwQyxHQUFNLEdBQU8sS0FBSyxZQUNaLEVBQVksS0FBSyxNQUFNLFNBUzdCLE1BUkEsTUFBSyxPQUNMLEtBQUssaUJBQWdCLEtBRWpCLEtBQUssTUFBTSxhQUFlLEVBQVUsTUFBUSxHQUM5QyxLQUFLLE1BQU0sR0FBVyxtQ0FBb0MsQ0FDeEQsR0FBSSxJQUdKLEtBQUssSUFBRyxJQUNWLEdBQUssTUFBUSxNQUFNLGtCQUNuQixLQUFLLE9BQU0sSUFDSixLQUFLLFdBQVcsRUFBTSxzQkFFdEIsS0FBSyxXQUFXLEVBQU0scUJBSWpDLHNDQUdFLENBQ0EsR0FBTSxHQUFZLEtBQUssTUFBTSxPQUM3QixLQUFLLE1BQU0sT0FBUyxHQUNwQixLQUFLLE9BQU0sSUFDWCxHQUFJLEdBQU8sS0FDUCxFQUFZLEtBQ2hCLE1BQUksTUFBSyxNQUFLLElBQ1osTUFBSyxNQUFNLE9BQVMsRUFDcEIsRUFBWSxLQUFLLHNCQUVqQixHQUFPLEtBQUssZ0JBQ1osS0FBSyxNQUFNLE9BQVMsRUFDaEIsS0FBSyxNQUFLLEtBQ1osR0FBWSxLQUFLLHVCQUdkLENBQUMsRUFBTSxHQUdoQixzQkFDRSxFQUNvQixDQUNwQixZQUFLLE9BQ0wsS0FBSyxzQkFBc0IsRUFBa0IsSUFDdEMsS0FBSyxXQUFXLEVBQU0sZ0JBRy9CLHlCQUNFLEVBQ3VCLENBQ3ZCLEtBQUssT0FFTCxHQUFNLEdBQU0sRUFBSyxHQUFLLEtBQUssa0JBRXJCLEVBQVcsS0FBSyxZQUNoQixFQUFnQixLQUFLLFlBRTNCLEFBQUksS0FBSyxNQUFLLElBQ1osRUFBUyxlQUFpQixLQUFLLG9DQUUvQixFQUFTLGVBQWlCLEtBRzVCLEtBQUssT0FBTSxJQUNYLEdBQU0sR0FBTSxLQUFLLDhCQUNqQixTQUFTLE9BQVMsRUFBSSxPQUN0QixFQUFTLEtBQU8sRUFBSSxLQUNwQixFQUFTLEtBQU8sRUFBSSxNQUNwQixLQUFLLE9BQU0sSUFFWCxDQUFDLEVBQVMsV0FBWSxFQUFLLFdBQ3pCLEtBQUssdUNBRVAsRUFBYyxlQUFpQixLQUFLLFdBQ2xDLEVBQ0EsMEJBR0YsRUFBRyxlQUFpQixLQUFLLFdBQVcsRUFBZSxrQkFFbkQsS0FBSyxpQkFBaUIsR0FDdEIsS0FBSyxZQUVMLEtBQUssTUFBTSxZQUNULEVBQUssR0FBRyxLQUNSLEdBQ0EsRUFBSyxHQUFHLElBQUksT0FHUCxLQUFLLFdBQVcsRUFBTSxtQkFHL0IsaUJBQ0UsRUFDQSxFQUNlLENBQ2YsR0FBSSxLQUFLLE1BQUssSUFDWixNQUFPLE1BQUssc0JBQXNCLEdBQzdCLEdBQUksS0FBSyxNQUFLLElBQ25CLE1BQU8sTUFBSyx5QkFBeUIsR0FDaEMsR0FBSSxLQUFLLE1BQUssSUFDbkIsTUFBTyxNQUFLLHlCQUF5QixHQUNoQyxHQUFJLEtBQUssY0FBYSxLQUMzQixNQUFJLE1BQUssTUFBSyxJQUNMLEtBQUssOEJBQThCLEdBRXRDLElBQ0YsS0FBSyxNQUFNLEdBQVcsb0JBQXFCLENBQ3pDLEdBQUksS0FBSyxNQUFNLGtCQUdaLEtBQUssdUJBQXVCLElBRWhDLEdBQUksS0FBSyxhQUFZLEtBQzFCLE1BQU8sTUFBSywwQkFBMEIsR0FDakMsR0FBSSxLQUFLLGFBQVksS0FDMUIsTUFBTyxNQUFLLDJCQUEyQixHQUNsQyxHQUFJLEtBQUssYUFBWSxLQUMxQixNQUFPLE1BQUssMEJBQTBCLEdBQ2pDLEdBQUksS0FBSyxNQUFLLElBQ25CLE1BQU8sTUFBSyxrQ0FBa0MsRUFBTSxHQUVwRCxLQUFLLGFBSVQseUJBQ0UsRUFDdUIsQ0FDdkIsWUFBSyxPQUNMLEVBQUssR0FBSyxLQUFLLG1DQUNjLElBRTdCLEtBQUssTUFBTSxZQUFZLEVBQUssR0FBRyxLQUFNLEdBQVUsRUFBSyxHQUFHLElBQUksT0FDM0QsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLG1CQUcvQix1QkFDRSxFQUNxQixDQUNyQixLQUFLLE1BQU0sTUFBTSxJQUVqQixBQUFJLEtBQUssTUFBSyxLQUNaLEVBQUssR0FBSyxNQUFNLGdCQUVoQixFQUFLLEdBQUssS0FBSyxrQkFHakIsR0FBTSxHQUFZLEVBQUssS0FBTyxLQUFLLFlBRTdCLEVBQVEsRUFBUyxLQUFPLEdBRTlCLElBREEsS0FBSyxPQUFNLEdBQ0osQ0FBQyxLQUFLLE1BQUssSUFBYSxDQUM3QixHQUFJLEdBQVcsS0FBSyxZQUVwQixBQUFJLEtBQUssTUFBSyxJQUNaLE1BQUssT0FDRCxDQUFDLEtBQUssYUFBcUIsTUFBSyxDQUFDLEtBQUssTUFBSyxLQUM3QyxLQUFLLE1BQU0sR0FBVyxvQ0FBcUMsQ0FDekQsR0FBSSxLQUFLLE1BQU0sa0JBR25CLE1BQU0sWUFBWSxJQUVsQixNQUFLLGlCQUFnQixJQUVuQixHQUFXLHFDQUdiLEVBQVcsS0FBSyxpQkFBaUIsRUFBVSxLQUc3QyxFQUFLLEtBQUssR0FHWixLQUFLLE1BQU0sT0FFWCxLQUFLLE9BQU0sR0FFWCxLQUFLLFdBQVcsRUFBVSxrQkFFMUIsR0FBSSxHQUFpQyxLQUNqQyxFQUFrQixHQUN0QixTQUFLLFFBQVEsR0FBZSxDQUMxQixBQUFJLEdBQWUsR0FDYixLQUFTLFlBQ1gsS0FBSyxNQUFNLEdBQVcsMkJBQTRCLENBQ2hELEdBQUksSUFHUixFQUFPLE1BQ0UsRUFBWSxPQUFTLHdCQUMxQixJQUNGLEtBQUssTUFBTSxHQUFXLDhCQUErQixDQUNuRCxHQUFJLElBR0osSUFBUyxNQUNYLEtBQUssTUFBTSxHQUFXLDJCQUE0QixDQUNoRCxHQUFJLElBR1IsRUFBTyxXQUNQLEVBQWtCLE1BSXRCLEVBQUssS0FBTyxHQUFRLFdBQ2IsS0FBSyxXQUFXLEVBQU0saUJBRy9CLGtDQUNFLEVBQ0EsRUFDZ0MsQ0FHaEMsR0FGQSxLQUFLLE9BQU0sSUFFUCxLQUFLLElBQUcsSUFDVixNQUFJLE1BQUssTUFBa0IsS0FBSyxLQUFLLE1BQWUsSUFHbEQsRUFBSyxZQUFjLEtBQUssaUJBQWlCLEtBQUssYUFHOUMsR0FBSyxZQUFjLEtBQUssZ0JBQ3hCLEtBQUssYUFFUCxFQUFLLFFBQVUsR0FFUixLQUFLLFdBQVcsRUFBTSw0QkFFN0IsR0FDRSxLQUFLLE1BQWUsS0FDcEIsS0FBSyxTQUNILE1BQUssYUFBWSxNQUFjLEtBQUssYUFBWSxPQUNoRCxDQUFDLEVBQ0gsQ0FDQSxHQUFNLEdBQVEsS0FBSyxNQUFNLE1BS3pCLEtBQU0sTUFBSyxNQUFNLEdBQVcsNkJBQThCLENBQ3hELEdBQUksS0FBSyxNQUFNLFNBQ2Ysc0JBQXVCLEVBQ3ZCLFdBQVksR0FBa0IsS0FJbEMsR0FDRSxLQUFLLE1BQUssS0FDVixLQUFLLE1BQWtCLEtBQ3ZCLEtBQUssTUFBSyxLQUNWLEtBQUssYUFBdUIsS0FFNUIsU0FBSyxZQUFjLEtBQUssaUJBQWlCLEtBQUssYUFDOUMsRUFBSyxRQUFVLEdBRVIsS0FBSyxXQUFXLEVBQU0sNEJBQ3hCLEdBQ0wsS0FBSyxNQUFLLEtBQ1YsS0FBSyxNQUFLLElBQ1YsS0FBSyxhQUEwQixNQUMvQixLQUFLLGFBQVksTUFDakIsS0FBSyxhQUFZLEtBRWpCLFNBQU8sS0FBSyxZQUNWLEVBQ2lCLE1BRWYsRUFBSyxPQUFTLDBCQUNoQixHQUFLLEtBQU8sb0JBQ1osRUFBSyxRQUFVLEdBQ2YsTUFBTyxHQUFLLFlBR2QsRUFBSyxLQUFPLFVBQVksRUFBSyxLQUV0QixFQUlYLEtBQUssYUFHUCw4QkFDRSxFQUM0QixDQUM1QixZQUFLLE9BQ0wsS0FBSyxpQkFBZ0IsS0FDckIsRUFBSyxlQUFpQixLQUFLLDBCQUMzQixLQUFLLFlBRUUsS0FBSyxXQUFXLEVBQU0sd0JBRy9CLDBCQUNFLEVBQ3dCLENBQ3hCLEtBQUssT0FDTCxHQUFNLEdBQVcsS0FBSyxtQkFBbUIsR0FFekMsU0FBUyxLQUFPLG1CQUNULEVBR1QsMkJBQ0UsRUFDeUIsQ0FDekIsS0FBSyxPQUNMLEdBQU0sR0FBVyxLQUFLLG9CQUFvQixFQUFNLElBRWhELFNBQVMsS0FBTyxvQkFDVCxFQUdULDBCQUNFLEVBQ3dCLENBQ3hCLFlBQUssT0FDTCxLQUFLLHNCQUFzQixFQUFvQixJQUN4QyxLQUFLLFdBQVcsRUFBTSxvQkFLL0Isc0JBQXNCLEVBQTZCLEVBQXdCLENBb0J6RSxHQW5CQSxFQUFLLEdBQUssS0FBSyw4QkFDQyxDQUFDLEVBQ0csSUFHcEIsS0FBSyxNQUFNLFlBQ1QsRUFBSyxHQUFHLEtBQ1IsRUFBVSxHQUFnQixHQUMxQixFQUFLLEdBQUcsSUFBSSxPQUdkLEFBQUksS0FBSyxNQUFLLElBQ1osRUFBSyxlQUFpQixLQUFLLG9DQUUzQixFQUFLLGVBQWlCLEtBR3hCLEVBQUssUUFBVSxHQUVYLEtBQUssSUFBRyxJQUNWLEVBQ0UsR0FBSyxRQUFRLEtBQUssS0FBSyxtQ0FDaEIsQ0FBQyxHQUFXLEtBQUssSUFBRyxLQUcvQixHQUFJLEVBQVMsQ0FJWCxHQUhBLEVBQUssV0FBYSxHQUNsQixFQUFLLE9BQVMsR0FFVixLQUFLLGNBQWEsS0FDcEIsRUFDRSxHQUFLLE9BQU8sS0FBSyxLQUFLLG1DQUNmLEtBQUssSUFBRyxLQUduQixHQUFJLEtBQUssY0FBYSxLQUNwQixFQUNFLEdBQUssV0FBVyxLQUFLLEtBQUssbUNBQ25CLEtBQUssSUFBRyxLQUlyQixFQUFLLEtBQU8sS0FBSyxvQkFBb0IsQ0FDbkMsWUFBYSxFQUNiLFdBQVksR0FDWixZQUFhLEdBQ2IsV0FBWSxFQUNaLGFBQWMsS0FJbEIsMkJBQW9ELENBQ2xELEdBQU0sR0FBTyxLQUFLLFlBRWxCLFNBQUssR0FBSyxLQUFLLG1DQUNmLEFBQUksS0FBSyxNQUFLLElBQ1osRUFBSyxlQUFpQixLQUFLLHNDQUUzQixFQUFLLGVBQWlCLEtBR2pCLEtBQUssV0FBVyxFQUFNLG9CQUcvQixtQkFBbUIsRUFBZ0QsQ0FDakUsWUFBSyxzQkFBc0IsRUFBb0IsSUFDeEMsS0FBSyxXQUFXLEVBQU0sd0JBRy9CLG1CQUFtQixFQUFjLENBQy9CLEFBQUksSUFBUyxLQUNYLEtBQUssTUFBTSxHQUFXLDZCQUE4QixDQUNsRCxHQUFJLEtBQUssTUFBTSxXQUtyQixrQkFBa0IsRUFBYyxFQUFvQixFQUF1QixDQUN6RSxBQUFJLENBQUMsR0FBYyxJQUFJLElBRXZCLEtBQUssTUFDSCxFQUNJLEdBQVcsbUJBQ1gsR0FBVyx1QkFDZixDQUNFLEdBQUksRUFDSixhQUFjLElBS3BCLDhCQUNFLEVBQ0EsRUFDYyxDQUNkLFlBQUssa0JBQ0gsS0FBSyxNQUFNLE1BQ1gsS0FBSyxNQUFNLFNBQ1gsR0FFSyxLQUFLLGdCQUFnQixHQUs5QixtQkFBbUIsRUFBZ0QsQ0FDakUsU0FBSyxHQUFLLEtBQUssOEJBQ0MsR0FDSSxJQUVwQixLQUFLLE1BQU0sWUFBWSxFQUFLLEdBQUcsS0FBTSxHQUFjLEVBQUssR0FBRyxJQUFJLE9BRS9ELEFBQUksS0FBSyxNQUFLLElBQ1osRUFBSyxlQUFpQixLQUFLLG9DQUUzQixFQUFLLGVBQWlCLEtBR3hCLEVBQUssTUFBUSxLQUFLLHlCQUF3QixJQUMxQyxLQUFLLFlBRUUsS0FBSyxXQUFXLEVBQU0sYUFHL0Isb0JBQ0UsRUFDQSxFQUNrQixDQUNsQixZQUFLLGlCQUFnQixLQUNyQixFQUFLLEdBQUssS0FBSyw4QkFDQyxHQUNJLElBRXBCLEtBQUssTUFBTSxZQUFZLEVBQUssR0FBRyxLQUFNLEdBQWMsRUFBSyxHQUFHLElBQUksT0FFL0QsQUFBSSxLQUFLLE1BQUssSUFDWixFQUFLLGVBQWlCLEtBQUssb0NBRTNCLEVBQUssZUFBaUIsS0FJeEIsRUFBSyxVQUFZLEtBQ2IsS0FBSyxNQUFLLEtBQ1osR0FBSyxVQUFZLEtBQUsseUJBQXdCLEtBR2hELEVBQUssU0FBVyxLQUNYLEdBQ0gsR0FBSyxTQUFXLEtBQUsseUJBQXdCLEtBRS9DLEtBQUssWUFFRSxLQUFLLFdBQVcsRUFBTSxjQUsvQix1QkFBdUIsRUFBMEIsR0FBd0IsQ0FDdkUsR0FBTSxHQUFlLEtBQUssTUFBTSxTQUUxQixFQUFPLEtBQUssWUFFWixFQUFXLEtBQUssb0JBRWhCLEVBQVEsS0FBSyxxQ0FDbkIsU0FBSyxLQUFPLEVBQU0sS0FFbEIsRUFBSyxTQUFXLEVBRWhCLEVBQUssTUFBUSxFQUFNLGVBRW5CLEFBQUksS0FBSyxNQUFLLElBQ1osTUFBSyxJQUFHLElBRVIsRUFBSyxRQUFVLEtBQUssaUJBRWhCLEdBQ0YsS0FBSyxNQUFNLEdBQVcsd0JBQXlCLENBQUUsR0FBSSxJQUlsRCxLQUFLLFdBQVcsRUFBTSxpQkFHL0IsbUNBQWdFLENBQzlELEdBQU0sR0FBWSxLQUFLLE1BQU0sT0FDdkIsRUFBTyxLQUFLLFlBQ2xCLEVBQUssT0FBUyxHQUVkLEtBQUssTUFBTSxPQUFTLEdBR3BCLEFBQUksS0FBSyxNQUFXLEtBQUssS0FBSyxNQUFvQixLQUNoRCxLQUFLLE9BRUwsS0FBSyxhQUdQLEdBQUksR0FBa0IsR0FFdEIsRUFBRyxDQUNELEdBQU0sR0FBZ0IsS0FBSyx1QkFBdUIsR0FFbEQsRUFBSyxPQUFPLEtBQUssR0FFYixFQUFjLFNBQ2hCLEdBQWtCLElBR2YsS0FBSyxNQUFLLEtBQ2IsS0FBSyxPQUFNLFVBRU4sQ0FBQyxLQUFLLE1BQUssS0FDcEIsWUFBSyxPQUFNLElBRVgsS0FBSyxNQUFNLE9BQVMsRUFFYixLQUFLLFdBQVcsRUFBTSw0QkFHL0IscUNBQW9FLENBQ2xFLEdBQU0sR0FBTyxLQUFLLFlBQ1osRUFBWSxLQUFLLE1BQU0sT0FDN0IsRUFBSyxPQUFTLEdBRWQsS0FBSyxNQUFNLE9BQVMsR0FFcEIsS0FBSyxPQUFNLElBQ1gsR0FBTSxHQUF3QixLQUFLLE1BQU0sbUJBRXpDLElBREEsS0FBSyxNQUFNLG1CQUFxQixHQUN6QixDQUFDLEtBQUssTUFBSyxLQUNoQixFQUFLLE9BQU8sS0FBSyxLQUFLLGlCQUNqQixLQUFLLE1BQUssS0FDYixLQUFLLE9BQU0sSUFHZixZQUFLLE1BQU0sbUJBQXFCLEVBQ2hDLEtBQUssT0FBTSxJQUVYLEtBQUssTUFBTSxPQUFTLEVBRWIsS0FBSyxXQUFXLEVBQU0sOEJBRy9CLDhDQUE2RSxDQUMzRSxHQUFNLEdBQU8sS0FBSyxZQUNaLEVBQVksS0FBSyxNQUFNLE9BTTdCLElBTEEsRUFBSyxPQUFTLEdBRWQsS0FBSyxNQUFNLE9BQVMsR0FFcEIsS0FBSyxPQUFNLElBQ0osQ0FBQyxLQUFLLE1BQUssS0FDaEIsRUFBSyxPQUFPLEtBQUssS0FBSyx3Q0FDakIsS0FBSyxNQUFLLEtBQ2IsS0FBSyxPQUFNLElBR2YsWUFBSyxPQUFNLElBRVgsS0FBSyxNQUFNLE9BQVMsRUFFYixLQUFLLFdBQVcsRUFBTSw4QkFHL0Isd0JBQThDLENBQzVDLEdBQU0sR0FBTyxLQUFLLFlBSWxCLEdBSEEsS0FBSyxpQkFBZ0IsS0FFckIsRUFBSyxRQUFVLEdBQ1gsS0FBSyxJQUFHLElBQ1YsRUFDRSxHQUFLLFFBQVEsS0FBSyxLQUFLLG1DQUNoQixLQUFLLElBQUcsS0FHbkIsU0FBSyxLQUFPLEtBQUssb0JBQW9CLENBQ25DLFlBQWEsR0FDYixXQUFZLEdBQ1osWUFBYSxHQUNiLFdBQVksR0FDWixhQUFjLEtBR1QsS0FBSyxXQUFXLEVBQU0sMkJBRy9CLDRCQUEyQyxDQUN6QyxNQUFPLE1BQUssTUFBSyxNQUFZLEtBQUssTUFBZSxLQUM3QyxNQUFNLGdCQUNOLEtBQUssZ0JBQWdCLElBRzNCLDJCQUNFLEVBQ0EsRUFDQSxFQUN5QixDQUN6QixTQUFLLE9BQVMsRUFHZCxBQUFJLEtBQUssWUFBWSxPQUFJLEdBQ3ZCLEdBQUssR0FBSyxLQUFLLDZCQUNmLEVBQUssSUFBTSxLQUFLLDRCQUVoQixHQUFLLEdBQUssS0FDVixFQUFLLElBQU0sS0FBSyxpQkFFbEIsS0FBSyxPQUFNLEdBQ1gsRUFBSyxNQUFRLEtBQUssMkJBQ2xCLEVBQUssU0FBVyxFQUVULEtBQUssV0FBVyxFQUFNLHFCQUcvQixnQ0FDRSxFQUNBLEVBQzhCLENBQzlCLFNBQUssT0FBUyxFQUVkLEVBQUssR0FBSyxLQUFLLDZCQUNmLEtBQUssT0FBTSxHQUNYLEtBQUssT0FBTSxHQUNYLEFBQUksS0FBSyxNQUFXLEtBQUssS0FBSyxNQUFlLElBQzNDLEdBQUssT0FBUyxHQUNkLEVBQUssU0FBVyxHQUNoQixFQUFLLE1BQVEsS0FBSyw2QkFDaEIsS0FBSyxZQUFZLEVBQUssSUFBSSxTQUc1QixHQUFLLE9BQVMsR0FDVixLQUFLLElBQUcsS0FDVixHQUFLLFNBQVcsSUFFbEIsRUFBSyxNQUFRLEtBQUssNEJBRWIsS0FBSyxXQUFXLEVBQU0sMEJBRy9CLDZCQUNFLEVBQzhCLENBbUI5QixJQWxCQSxFQUFLLE9BQVMsR0FDZCxFQUFLLEtBQU8sS0FDWixFQUFLLGVBQWlCLEtBQ3RCLEVBQUssS0FBTyxLQUVSLEtBQUssTUFBSyxLQUNaLEdBQUssZUFBaUIsS0FBSyxxQ0FHN0IsS0FBSyxPQUFNLElBQ1AsS0FBSyxNQUFLLEtBQ1osR0FBSyxLQUFPLEtBQUssMkJBQXVDLElBRXhELEVBQUssS0FBSyxLQUFPLEtBQ1osS0FBSyxNQUFLLEtBQ2IsS0FBSyxPQUFNLEtBR1IsQ0FBQyxLQUFLLE1BQWUsS0FBSyxDQUFDLEtBQUssTUFBSyxLQUMxQyxFQUFLLE9BQU8sS0FBSyxLQUFLLDJCQUEyQixLQUM1QyxLQUFLLE1BQUssS0FDYixLQUFLLE9BQU0sSUFJZixNQUFJLE1BQUssSUFBRyxLQUNWLEdBQUssS0FBTyxLQUFLLDJCQUEyQixLQUU5QyxLQUFLLE9BQU0sSUFDWCxFQUFLLFdBQWEsS0FBSywyQkFFaEIsS0FBSyxXQUFXLEVBQU0sMEJBRy9CLGdDQUNFLEVBQ0EsRUFDOEIsQ0FDOUIsR0FBTSxHQUFZLEtBQUssWUFDdkIsU0FBSyxPQUFTLEVBQ2QsRUFBSyxNQUFRLEtBQUssNkJBQTZCLEdBQ3hDLEtBQUssV0FBVyxFQUFNLDBCQUcvQixvQkFBb0IsQ0FDbEIsY0FDQSxhQUNBLGNBQ0EsYUFDQSxnQkFPNkIsQ0FDN0IsR0FBTSxHQUFZLEtBQUssTUFBTSxPQUM3QixLQUFLLE1BQU0sT0FBUyxHQUVwQixHQUFNLEdBQVksS0FBSyxZQUV2QixFQUFVLGVBQWlCLEdBQzNCLEVBQVUsV0FBYSxHQUN2QixFQUFVLFNBQVcsR0FDckIsRUFBVSxjQUFnQixHQUUxQixHQUFJLEdBQ0EsRUFDQSxFQUFVLEdBYWQsSUFaQSxBQUFJLEdBQWMsS0FBSyxNQUFLLEdBQzFCLE1BQUssT0FBTSxHQUNYLEVBQXVCLEVBQ3ZCLEVBQVEsSUFFUixNQUFLLE9BQU0sR0FDWCxFQUFvQixFQUNwQixFQUFRLElBR1YsRUFBVSxNQUFRLEVBRVgsQ0FBQyxLQUFLLE1BQU0sSUFBVyxDQUM1QixHQUFJLEdBQVcsR0FDWCxFQUE2QyxLQUM3QyxFQUErQyxLQUM3QyxFQUFPLEtBQUssWUFFbEIsR0FBSSxHQUFjLEtBQUssYUFBWSxLQUFhLENBQzlDLEdBQU0sSUFBWSxLQUFLLFlBRXZCLEFBQUksR0FBVSxPQUFJLElBQWlCLEdBQVUsT0FBSSxJQUMvQyxNQUFLLE9BQ0wsRUFBZ0IsS0FBSyxNQUFNLFNBQzNCLEVBQWMsSUFJbEIsR0FBSSxHQUFlLEtBQUssYUFBWSxLQUFjLENBQ2hELEdBQU0sSUFBWSxLQUFLLFlBR3ZCLEFBQUksR0FBVSxPQUFJLElBQWlCLEdBQVUsT0FBSSxJQUMvQyxNQUFLLE9BQ0wsRUFBVyxJQUlmLEdBQU0sR0FBVyxLQUFLLG9CQUV0QixHQUFJLEtBQUssSUFBRyxHQUNWLEFBQUksR0FBaUIsTUFDbkIsS0FBSyxXQUFXLEdBRWxCLEFBQUksS0FBSyxJQUFHLEdBQ04sSUFDRixLQUFLLFdBQVcsRUFBUyxJQUFJLE9BRS9CLEVBQVUsY0FBYyxLQUN0QixLQUFLLGdDQUFnQyxFQUFNLEtBRzdDLEVBQVUsU0FBUyxLQUNqQixLQUFLLDJCQUEyQixFQUFNLEVBQVUsWUFHM0MsS0FBSyxNQUFLLEtBQWUsS0FBSyxNQUFLLElBQzVDLEFBQUksR0FBaUIsTUFDbkIsS0FBSyxXQUFXLEdBRWQsR0FDRixLQUFLLFdBQVcsRUFBUyxJQUFJLE9BRS9CLEVBQVUsZUFBZSxLQUN2QixLQUFLLGdDQUFnQyxFQUFNLFFBRXhDLENBQ0wsR0FBSSxJQUFPLE9BRVgsR0FBSSxLQUFLLGFBQW9CLEtBQUssS0FBSyxhQUFvQixLQUFHLENBQzVELEdBQU0sR0FBWSxLQUFLLFlBQ3ZCLEFBQUksR0FBMkIsRUFBVSxPQUN2QyxJQUFPLEtBQUssTUFBTSxNQUNsQixLQUFLLFFBSVQsR0FBTSxHQUFnQixLQUFLLDRCQUN6QixFQUNBLEVBQ0EsRUFDQSxFQUNBLEdBQ0EsRUFDQSxHQUFnQixDQUFDLEdBR25CLEFBQUksSUFBa0IsS0FDcEIsR0FBVSxHQUNWLEVBQWtCLEtBQUssTUFBTSxpQkFFN0IsRUFBVSxXQUFXLEtBQUssR0FJOUIsS0FBSywwQkFHSCxHQUNBLENBQUMsS0FBSyxNQUFLLElBQ1gsQ0FBQyxLQUFLLE1BQUssSUFFWCxLQUFLLE1BQU0sR0FBVyxrQ0FBbUMsQ0FDdkQsR0FBSSxJQUtWLEtBQUssT0FBTyxHQU9SLEdBQ0YsR0FBVSxRQUFVLEdBR3RCLEdBQU0sR0FBTSxLQUFLLFdBQVcsRUFBVyx3QkFFdkMsWUFBSyxNQUFNLE9BQVMsRUFFYixFQUdULDRCQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ2tFLENBQ2xFLEdBQUksS0FBSyxJQUFHLElBT1YsTUFMRSxNQUFLLE1BQUssS0FDVixLQUFLLE1BQUssS0FDVixLQUFLLE1BQWUsSUFDcEIsS0FBSyxNQUFLLEdBR1YsQ0FBSyxFQUlPLEdBQ1YsS0FBSyxNQUFNLEdBQVcsbUJBQW9CLENBQ3hDLEdBQUksS0FBSyxNQUFNLGtCQUxqQixLQUFLLE1BQU0sR0FBVyx1QkFBd0IsQ0FDNUMsR0FBSSxLQUFLLE1BQU0sa0JBT2YsR0FDRixLQUFLLE1BQU0sR0FBVyxnQkFBaUIsQ0FBRSxHQUFJLElBR3hDLE1BR0osSUFDSCxLQUFLLE1BQU0sR0FBVyxxQkFBc0IsQ0FDMUMsR0FBSSxLQUFLLE1BQU0sa0JBR2YsR0FBaUIsTUFDbkIsS0FBSyxXQUFXLEdBRWQsR0FDRixLQUFLLE1BQU0sR0FBVyxlQUFnQixDQUFFLEdBQUksSUFHOUMsRUFBSyxTQUFXLEtBQUssZ0JBQ2QsS0FBSyxXQUFXLEVBQU0sNkJBQ3hCLENBQ0wsRUFBSyxJQUFNLEtBQUssNkJBQ2hCLEVBQUssT0FBUyxFQUNkLEVBQUssTUFBUSxHQUFpQixLQUM5QixFQUFLLEtBQU8sRUFFWixHQUFJLEdBQVcsR0FDZixNQUFJLE1BQUssTUFBVyxLQUFLLEtBQUssTUFBZSxJQUUzQyxHQUFLLE9BQVMsR0FFVixHQUFpQixNQUNuQixLQUFLLFdBQVcsR0FFZCxHQUNGLEtBQUssV0FBVyxFQUFTLElBQUksT0FHL0IsRUFBSyxNQUFRLEtBQUssNkJBQ2hCLEtBQUssWUFBWSxFQUFLLElBQUksUUFFeEIsS0FBUyxPQUFTLElBQVMsUUFDN0IsS0FBSyw0QkFBNEIsR0FJakMsQ0FBQyxHQUNELEVBQUssSUFBSSxPQUFTLGVBQ2xCLEVBQUssTUFBTSxNQUVYLEtBQUssTUFBTSxHQUFXLDZCQUE4QixDQUNsRCxHQUFJLEVBQUssTUFBTSxRQUlmLEtBQVMsUUFBUSxLQUFLLGFBRTFCLEVBQUssT0FBUyxHQUVWLEtBQUssSUFBRyxLQUNWLEdBQVcsSUFFYixFQUFLLE1BQVEsS0FBSywyQkFDbEIsRUFBSyxTQUFXLEdBR2xCLEVBQUssU0FBVyxFQUVULEtBQUssV0FBVyxFQUFNLHVCQU1qQyw0QkFDRSxFQUdNLENBQ04sR0FBTSxHQUFhLEVBQVMsT0FBUyxNQUFRLEVBQUksRUFDM0MsRUFDSixFQUFTLE1BQU0sT0FBTyxPQUFVLEdBQVMsTUFBTSxLQUFPLEVBQUksR0FFNUQsQUFBSSxFQUFTLE1BQU0sTUFDakIsS0FBSyxNQUNILEVBQVMsT0FBUyxNQUNkLEdBQVcsMEJBQ1gsR0FBVywwQkFDZixDQUFFLEdBQUksRUFBUyxNQUFNLE9BSXJCLElBQVcsR0FDYixLQUFLLE1BQ0gsRUFBUyxPQUFTLE1BQ2QsRUFBTyxlQUNQLEVBQU8sZUFDWCxDQUFFLEdBQUksSUFJTixFQUFTLE9BQVMsT0FBUyxFQUFTLE1BQU0sTUFDNUMsS0FBSyxNQUFNLEVBQU8sdUJBQXdCLENBQUUsR0FBSSxJQUlwRCx5QkFBZ0MsQ0FDOUIsQUFDRSxDQUFDLEtBQUssSUFBRyxLQUNULENBQUMsS0FBSyxJQUFZLEtBQ2xCLENBQUMsS0FBSyxNQUFLLElBQ1gsQ0FBQyxLQUFLLE1BQWtCLElBRXhCLEtBQUssYUFJVCxpQ0FDRSxFQUNBLEVBQytCLENBQUEsR0FBQSxHQUMvQixBQUFBLEdBQUEsSUFBUSxNQUFSLEdBQWEsS0FBSyxNQUFNLFVBQ3hCLEdBQUksR0FDRixHQUFNLEtBQUssOEJBQThCLElBRTNDLEtBQU8sS0FBSyxJQUFHLEtBQVUsQ0FDdkIsR0FBTSxHQUFRLEtBQUssWUFBMkMsR0FDOUQsRUFBTSxjQUFnQixFQUN0QixFQUFNLEdBQUssS0FBSyw4QkFBOEIsSUFDOUMsRUFBTyxLQUFLLFdBQVcsRUFBTywyQkFHaEMsTUFBTyxHQUdULHFCQUNFLEVBQ0EsRUFDNkIsQ0FDN0IsR0FBTSxHQUFPLEtBQUssWUFBWSxHQUU5QixTQUFLLGVBQWlCLEtBQ3RCLEVBQUssR0FBSyxLQUFLLGlDQUFpQyxFQUFVLEdBRXRELEtBQUssTUFBSyxLQUNaLEdBQUssZUFBaUIsS0FBSyx1Q0FHdEIsS0FBSyxXQUFXLEVBQU0seUJBRy9CLHFCQUFrRCxDQUNoRCxHQUFNLEdBQU8sS0FBSyxZQUNsQixZQUFLLE9BQU0sSUFDWCxFQUFLLFNBQVcsS0FBSyx1QkFDZCxLQUFLLFdBQVcsRUFBTSx3QkFHL0Isb0JBQWdELENBQzlDLEdBQU0sR0FBTyxLQUFLLFlBSWxCLElBSEEsRUFBSyxNQUFRLEdBQ2IsS0FBSyxPQUFNLEdBRUosS0FBSyxNQUFNLElBQU0sS0FBSyxRQUFVLENBQUMsS0FBSyxNQUFLLElBQ2hELEdBQUssTUFBTSxLQUFLLEtBQUssaUJBQ2pCLE1BQUssTUFBSyxLQUNkLEtBQUssT0FBTSxJQUViLFlBQUssT0FBTSxHQUNKLEtBQUssV0FBVyxFQUFNLHVCQUcvQiwyQkFBMkIsRUFBeUMsQ0FDbEUsR0FBSSxHQUFPLEtBQ1AsRUFBVyxHQUNYLEVBQWlCLEtBQ2YsRUFBTyxLQUFLLFlBQ1osRUFBSyxLQUFLLFlBQ1YsRUFBUyxLQUFLLE1BQU0sT0FBaUIsR0FFM0MsTUFBSSxHQUFHLE9BQUksSUFBaUIsRUFBRyxPQUFJLEdBQzdCLElBQVUsQ0FBQyxHQUNiLEtBQUssTUFBTSxHQUFXLHFCQUFzQixDQUFFLEdBQUksSUFFcEQsRUFBTyxLQUFLLGdCQUFnQixHQUN4QixLQUFLLElBQUcsS0FDVixHQUFXLEdBQ1AsR0FDRixLQUFLLE1BQU0sR0FBVywwQkFBMkIsQ0FBRSxHQUFJLEtBRzNELEVBQWlCLEtBQUssNEJBRXRCLEVBQWlCLEtBQUssZ0JBRXhCLEVBQUssS0FBTyxFQUNaLEVBQUssU0FBVyxFQUNoQixFQUFLLGVBQWlCLEVBQ2YsS0FBSyxXQUFXLEVBQU0scUJBRy9CLG1DQUNFLEVBQ3lCLENBQ3pCLEdBQU0sR0FBTyxLQUFLLFlBQVksRUFBSyxJQUFJLE9BQ3ZDLFNBQUssS0FBTyxLQUNaLEVBQUssU0FBVyxHQUNoQixFQUFLLGVBQWlCLEVBQ2YsS0FBSyxXQUFXLEVBQU0scUJBRy9CLDRCQUE0QixFQUFvQyxHQUk5RCxDQUNBLEdBQUksR0FBbUQsS0FDbkQsRUFBb0QsS0FTeEQsSUFSSSxLQUFLLE1BQUssS0FDWixHQUFRLEtBQUssMkJBQXVDLElBRXBELEVBQU0sS0FBTyxLQUNSLEtBQUssTUFBSyxLQUNiLEtBQUssT0FBTSxLQUdSLENBQUMsS0FBSyxNQUFlLEtBQUssQ0FBQyxLQUFLLE1BQUssS0FDMUMsRUFBTyxLQUFLLEtBQUssMkJBQTJCLEtBQ3ZDLEtBQUssTUFBSyxLQUNiLEtBQUssT0FBTSxJQUdmLE1BQUksTUFBSyxJQUFHLEtBQ1YsR0FBTyxLQUFLLDJCQUEyQixLQUVsQyxDQUFFLFNBQVEsT0FBTSxTQUd6QiwwQkFDRSxFQUNBLEVBQ0EsRUFDc0IsQ0FDdEIsT0FBUSxFQUFHLFVBQ0osTUFDSCxNQUFPLE1BQUssV0FBVyxFQUFNLHlCQUUxQixXQUNBLFVBQ0gsTUFBTyxNQUFLLFdBQVcsRUFBTSw2QkFFMUIsUUFDSCxNQUFPLE1BQUssV0FBVyxFQUFNLDJCQUUxQixRQUNILE1BQU8sTUFBSyxXQUFXLEVBQU0sMkJBRTFCLFNBQ0gsTUFBTyxNQUFLLFdBQVcsRUFBTSw0QkFFMUIsU0FDSCxNQUFPLE1BQUssV0FBVyxFQUFNLDRCQUUxQixTQUNILE1BQU8sTUFBSyxXQUFXLEVBQU0sZ0NBRzdCLFlBQUssbUJBQW1CLEVBQUcsTUFDcEIsS0FBSyxxQkFBcUIsRUFBVSxJQU9qRCxzQkFBNkMsQ0FDM0MsR0FBTSxHQUFXLEtBQUssTUFBTSxTQUN0QixFQUFPLEtBQUssWUFDZCxFQUNBLEVBQ0EsRUFBZ0IsR0FDZCxFQUF3QixLQUFLLE1BQU0sbUJBRXpDLE9BQVEsS0FBSyxNQUFNLFVBQ2pCLEdBQ0UsTUFBTyxNQUFLLG9CQUFvQixDQUM5QixZQUFhLEdBQ2IsV0FBWSxHQUNaLFlBQWEsR0FDYixXQUFZLEdBQ1osYUFBYyxTQUdsQixHQUNFLE1BQU8sTUFBSyxvQkFBb0IsQ0FDOUIsWUFBYSxHQUNiLFdBQVksR0FDWixZQUFhLEdBQ2IsV0FBWSxHQUNaLGFBQWMsU0FHbEIsR0FDRSxZQUFLLE1BQU0sbUJBQXFCLEdBQ2hDLEVBQU8sS0FBSyxxQkFDWixLQUFLLE1BQU0sbUJBQXFCLEVBQ3pCLE1BRVQsSUFDRSxTQUFLLGVBQWlCLEtBQUssb0NBQzNCLEtBQUssT0FBTSxJQUNYLEVBQU0sS0FBSyw4QkFDWCxFQUFLLE9BQVMsRUFBSSxPQUNsQixFQUFLLEtBQU8sRUFBSSxLQUNoQixFQUFLLEtBQU8sRUFBSSxNQUNoQixLQUFLLE9BQU0sSUFFWCxLQUFLLE9BQU0sSUFFWCxFQUFLLFdBQWEsS0FBSyxnQkFFaEIsS0FBSyxXQUFXLEVBQU0sOEJBRS9CLElBSUUsR0FIQSxLQUFLLE9BR0QsQ0FBQyxLQUFLLE1BQWUsS0FBSyxDQUFDLEtBQUssTUFBSyxJQUN2QyxHQUFJLEdBQWtCLEtBQUssTUFBTSxPQUFTLEtBQUssTUFBSyxJQUFZLENBQzlELEdBQU0sR0FBUSxLQUFLLFlBQVksS0FDL0IsRUFBZ0IsSUFBcUIsSUFBSSxJQUFrQixPQUUzRCxHQUFnQixHQUlwQixHQUFJLEVBQWUsQ0FNakIsR0FMQSxLQUFLLE1BQU0sbUJBQXFCLEdBQ2hDLEVBQU8sS0FBSyxnQkFDWixLQUFLLE1BQU0sbUJBQXFCLEVBSTlCLEtBQUssTUFBTSxvQkFDWCxDQUNFLE1BQUssTUFBYyxLQUNsQixLQUFLLE1BQWUsS0FBSyxLQUFLLFlBQVksT0FBa0IsSUFHL0QsWUFBSyxPQUFNLElBQ0osRUFHUCxLQUFLLElBQUcsSUFJWixNQUFJLEdBQ0YsRUFBTSxLQUFLLDRCQUE0QixDQUNyQyxLQUFLLG1DQUFtQyxLQUcxQyxFQUFNLEtBQUssOEJBR2IsRUFBSyxPQUFTLEVBQUksT0FDbEIsRUFBSyxLQUFPLEVBQUksS0FDaEIsRUFBSyxLQUFPLEVBQUksTUFFaEIsS0FBSyxPQUFNLElBRVgsS0FBSyxPQUFNLElBRVgsRUFBSyxXQUFhLEtBQUssZ0JBRXZCLEVBQUssZUFBaUIsS0FFZixLQUFLLFdBQVcsRUFBTSw4QkFFL0IsS0FDRSxNQUFPLE1BQUssYUFDVixLQUFLLE1BQU0sTUFDWCxtQ0FHSixRQUNBLElBQ0UsU0FBSyxNQUFRLEtBQUssTUFBSyxJQUN2QixLQUFLLE9BQ0UsS0FBSyxXQUNWLEVBQ0Esb0NBR0osSUFDRSxHQUFJLEtBQUssTUFBTSxRQUFVLElBQUssQ0FFNUIsR0FEQSxLQUFLLE9BQ0QsS0FBSyxNQUFLLEtBQ1osTUFBTyxNQUFLLG1CQUNWLENBQUMsS0FBSyxNQUFNLE1BQ1osOEJBQ0EsR0FJSixHQUFJLEtBQUssTUFBSyxLQUNaLE1BQU8sTUFBSyxtQkFDVixDQUFDLEtBQUssTUFBTSxNQUNaLDhCQUNBLEdBSUosS0FBTSxNQUFLLE1BQU0sR0FBVyw2QkFBOEIsQ0FDeEQsR0FBSSxLQUFLLE1BQU0sV0FHbkIsS0FBSyxhQUNMLFdBQ0YsS0FDRSxNQUFPLE1BQUssYUFDVixLQUFLLE1BQU0sTUFDWCxtQ0FHSixLQUNFLE1BQU8sTUFBSyxhQUNWLEtBQUssTUFBTSxNQUNYLG1DQUdKLElBQ0UsWUFBSyxPQUNFLEtBQUssV0FBVyxFQUFNLDBCQUUvQixJQUNFLFlBQUssT0FDRSxLQUFLLFdBQVcsRUFBTSxpQ0FFL0IsSUFDRSxZQUFLLE9BQ0UsS0FBSyxXQUFXLEVBQU0sMEJBRS9CLElBQ0UsWUFBSyxPQUNFLEtBQUssV0FBVyxFQUFNLDRCQUUvQixJQUNFLE1BQU8sTUFBSyw4QkFHWixHQUFJLEdBQWUsS0FBSyxNQUFNLE1BQU8sQ0FDbkMsR0FBTSxHQUFRLEdBQWUsS0FBSyxNQUFNLE1BQ3hDLFlBQUssT0FDRSxNQUFNLGlCQUFpQixFQUE4QixXQUNuRCxHQUFrQixLQUFLLE1BQU0sTUFDdEMsTUFBSSxNQUFLLGFBQVksS0FDWixLQUFLLHlCQUdQLEtBQUssMEJBQ1YsRUFDQSxFQUNBLEtBQUssbUJBS2IsS0FBSyxhQUdQLHNCQUE2QyxDQUMzQyxHQUFNLEdBQVcsS0FBSyxNQUFNLFNBQ3hCLEVBQU8sS0FBSyx1QkFDWixFQUE0QixHQUNoQyxLQUNHLE1BQUssTUFBaUIsSUFBSyxLQUFLLE1BQW9CLE1BQ3JELENBQUMsS0FBSyxzQkFDTixDQUNBLEdBQU0sR0FBTyxLQUFLLFlBQVksR0FDeEIsRUFBVyxLQUFLLElBQUcsSUFDekIsRUFBNEIsR0FBNkIsRUFDekQsS0FBSyxPQUFNLEdBQ1gsQUFBSSxDQUFDLEdBQVksS0FBSyxNQUFLLEdBQ3pCLEdBQUssWUFBYyxFQUNuQixLQUFLLE9BQ0wsRUFBTyxLQUFLLFdBQVcsRUFBTSx3QkFFN0IsR0FBSyxXQUFhLEVBQ2xCLEVBQUssVUFBWSxLQUFLLGdCQUN0QixLQUFLLE9BQU0sR0FDWCxBQUFJLEVBQ0YsR0FBSyxTQUFXLEVBQ2hCLEVBQU8sS0FBSyxXQUVWLEVBQ0EsOEJBR0YsRUFBTyxLQUFLLFdBRVYsRUFDQSxzQkFLUixNQUFPLEdBR1QscUJBQTRDLENBQzFDLEdBQU0sR0FBTyxLQUFLLFlBQ2xCLE1BQUksTUFBSyxJQUFHLElBQ1YsR0FBSyxlQUFpQixLQUFLLHNCQUNwQixLQUFLLFdBQVcsRUFBTSwyQkFFdEIsS0FBSyx1QkFJaEIsb0NBQTJELENBQ3pELEdBQU0sR0FBUSxLQUFLLHNCQUNuQixHQUFJLENBQUMsS0FBSyxNQUFNLG9CQUFzQixLQUFLLElBQVksSUFBRyxDQUV4RCxHQUFNLEdBQU8sS0FBSyxZQUFZLEVBQU0sSUFBSSxPQUN4QyxTQUFLLE9BQVMsQ0FBQyxLQUFLLG1DQUFtQyxJQUN2RCxFQUFLLEtBQU8sS0FDWixFQUFLLEtBQU8sS0FDWixFQUFLLFdBQWEsS0FBSyxnQkFDdkIsRUFBSyxlQUFpQixLQUNmLEtBQUssV0FBVyxFQUFNLDBCQUUvQixNQUFPLEdBR1QsMkJBQWtELENBQ2hELEdBQU0sR0FBTyxLQUFLLFlBQ2xCLEtBQUssSUFBRyxJQUNSLEdBQU0sR0FBTyxLQUFLLHFDQUVsQixJQURBLEVBQUssTUFBUSxDQUFDLEdBQ1AsS0FBSyxJQUFHLEtBQ2IsRUFBSyxNQUFNLEtBQUssS0FBSyxzQ0FFdkIsTUFBTyxHQUFLLE1BQU0sU0FBVyxFQUN6QixFQUNBLEtBQUssV0FBVyxFQUFNLDhCQUc1QixvQkFBMkMsQ0FDekMsR0FBTSxHQUFPLEtBQUssWUFDbEIsS0FBSyxJQUFHLElBQ1IsR0FBTSxHQUFPLEtBQUssNEJBRWxCLElBREEsRUFBSyxNQUFRLENBQUMsR0FDUCxLQUFLLElBQUcsS0FDYixFQUFLLE1BQU0sS0FBSyxLQUFLLDZCQUV2QixNQUFPLEdBQUssTUFBTSxTQUFXLEVBQ3pCLEVBQ0EsS0FBSyxXQUFXLEVBQU0sdUJBRzVCLGVBQXNDLENBQ3BDLEdBQU0sR0FBWSxLQUFLLE1BQU0sT0FDN0IsS0FBSyxNQUFNLE9BQVMsR0FDcEIsR0FBTSxHQUFPLEtBQUsscUJBQ2xCLFlBQUssTUFBTSxPQUFTLEVBQ2IsRUFHVCxzQ0FBNkQsQ0FDM0QsR0FBSSxLQUFLLE1BQU0sT0FBZ0IsS0FBSSxLQUFLLE1BQU0sUUFBVSxJQUFLLENBQzNELEdBQU0sR0FBVyxLQUFLLE1BQU0sU0FDdEIsRUFBTyxLQUFLLGtCQUNsQixNQUFPLE1BQUsscUJBQXFCLEVBQVUsT0FFM0MsT0FBTyxNQUFLLGdCQUloQix5QkFBZ0QsQ0FDOUMsR0FBTSxHQUFPLEtBQUssWUFDbEIsU0FBSyxlQUFpQixLQUFLLDJCQUNwQixLQUFLLFdBQVcsRUFBTSxrQkFHL0IsbUNBQ0UsRUFDYyxDQUNkLEdBQU0sR0FBUSxFQUNWLEtBQUssa0JBQ0wsS0FBSyxnQ0FDVCxNQUFJLE1BQUssTUFBSyxLQUVaLEdBQU0sZUFBaUIsS0FBSywwQkFDNUIsS0FBSyxpQkFBaUIsSUFFakIsRUFHVCxvQkFBb0IsRUFBc0IsQ0FDeEMsU0FBSyxXQUFXLGVBQWlCLEVBQUssZUFFdEMsS0FBSyxpQkFBaUIsRUFBSyxXQUFZLEVBQUssZUFBZSxJQUFJLEtBRXhELEVBQUssV0FHZCxtQkFBdUQsQ0FDckQsR0FBSSxHQUFXLEtBQ2YsTUFBSSxNQUFLLE1BQUssSUFDWixHQUFXLEtBQUssWUFDaEIsQUFBSSxLQUFLLE1BQU0sUUFBVSxJQUN2QixFQUFTLEtBQU8sT0FFaEIsRUFBUyxLQUFPLFFBRWxCLEtBQUssT0FDRSxLQUFLLFdBQVcsRUFBVSxhQUU1QixFQU9ULGtCQUNFLEVBQ0EsRUFDQSxFQUFvQixHQUNkLENBQ04sR0FBSSxFQUFxQixDQUN2QixLQUFLLGlDQUFpQyxFQUFNLElBQzFDLE1BQU0sa0JBQWtCLEVBQU0sR0FBTSxJQUV0QyxPQUdGLE1BQU0sa0JBQWtCLEVBQU0sR0FBTyxHQUd2QywyQkFNRSxFQUFpQixFQUFpQixFQUFvQixHQUFVLENBQ2hFLEdBQUksS0FBSyxNQUFLLElBQVksQ0FDeEIsR0FBTSxHQUFXLEtBQUssWUFFdEIsQ0FDRSxFQUFTLGVBRVQsRUFBSyxXQUNILEtBQUssdUNBRVQsRUFBSyxXQUFhLEVBQVMsZUFDdkIsS0FBSyxXQUFXLEVBQVUsa0JBQzFCLEtBR04sTUFBTyxPQUFNLDJCQUEyQixFQUFNLEVBQU0sR0FJdEQsbUJBQW1CLEVBQXdDLENBRXpELEdBQUksS0FBSyxNQUFNLFFBQVUsS0FBSyxhQUEwQixLQUFHLENBQ3pELEdBQU0sR0FBWSxLQUFLLFlBQ3ZCLEdBQUksR0FBMkIsRUFBVSxNQUFPLENBQzlDLEdBQU0sR0FBTyxLQUFLLFlBQ2xCLFlBQUssT0FDRSxLQUFLLG1CQUFtQixZQUV4QixLQUFLLG9CQUFzQixLQUFLLGFBQVksS0FBWSxDQUNqRSxHQUFNLEdBQU8sS0FBSyxZQUNsQixZQUFLLE9BQ0UsS0FBSyx5QkFBeUIsR0FFdkMsR0FBTSxHQUFPLE1BQU0sbUJBQW1CLEdBRXRDLE1BQUksTUFBSyxhQUFlLFFBQWEsQ0FBQyxLQUFLLGlCQUFpQixJQUMxRCxNQUFLLFdBQWEsTUFFYixFQUlULHlCQUNFLEVBQ0EsRUFDQSxFQUN1QixDQUN2QixHQUFJLEVBQUssT0FBUyxjQUNoQixHQUFJLEVBQUssT0FBUyxXQUNoQixHQUNFLEtBQUssTUFBSyxLQUNWLEdBQWtCLEtBQUssTUFBTSxPQUM3QixLQUFLLE1BQWtCLEtBQ3ZCLEtBQUssTUFBSyxLQUNWLEtBQUssTUFBSyxJQUdWLE1BQU8sTUFBSyxpQkFBaUIsV0FFdEIsR0FBa0IsS0FBSyxNQUFNLE1BQU8sQ0FDN0MsR0FBSSxFQUFLLE9BQVMsWUFFaEIsTUFBTyxNQUFLLG1CQUFtQixHQUMxQixHQUFJLEVBQUssT0FBUyxPQUV2QixNQUFPLE1BQUssbUJBQW1CLEdBQzFCLEdBQUksRUFBSyxPQUFTLFNBRXZCLE1BQU8sTUFBSyxvQkFBb0IsRUFBTSxLQUs1QyxNQUFPLE9BQU0seUJBQXlCLEVBQU0sRUFBTSxHQUlwRCw4QkFBd0MsQ0FDdEMsR0FBTSxDQUFFLFFBQVMsS0FBSyxNQUN0QixNQUNFLElBQW1DLElBQ2xDLEtBQUssb0JBQXNCLElBQUksSUFFekIsQ0FBQyxLQUFLLE1BQU0sWUFFZCxNQUFNLCtCQUdmLDBCQUFvQyxDQUNsQyxHQUFNLENBQUUsUUFBUyxLQUFLLE1BQ3RCLE1BQ0UsSUFBbUMsSUFDbEMsS0FBSyxvQkFBc0IsSUFBSSxJQUV6QixLQUFLLE1BQU0sWUFHYixNQUFNLDJCQUdmLDhCQUE2RCxDQUMzRCxHQUFJLEtBQUssb0JBQXNCLEtBQUssYUFBcUIsS0FBRyxDQUMxRCxHQUFNLEdBQU8sS0FBSyxZQUNsQixZQUFLLE9BQ0UsS0FBSyx5QkFBeUIsR0FFdkMsTUFBTyxPQUFNLCtCQUdmLGlCQUNFLEVBRUEsRUFDQSxFQUNjLENBQ2QsR0FBSSxDQUFDLEtBQUssTUFBSyxJQUFlLE1BQU8sR0FFckMsR0FBSSxLQUFLLE1BQU0sdUJBQXdCLENBQ3JDLEdBQU0sR0FBUyxLQUFLLG9CQUlwQixHQUNFLElBQTBCLElBQzFCLElBQU0sSUFDTixJQUEwQixJQUMxQixJQUFNLEdBR04sWUFBSywyQkFBMkIsR0FDekIsRUFJWCxLQUFLLE9BQU0sSUFDWCxHQUFNLEdBQVEsS0FBSyxNQUFNLFFBQ25CLEVBQW9CLEtBQUssTUFBTSxVQUMvQixFQUFPLEtBQUssWUFBWSxHQUMxQixDQUFFLGFBQVksVUFBVyxLQUFLLGdDQUM5QixDQUFDLEVBQU8sR0FBVyxLQUFLLHdCQUF3QixHQUVwRCxHQUFJLEdBQVUsRUFBUSxPQUFTLEVBQUcsQ0FDaEMsR0FBTSxHQUFZLENBQUMsR0FBRyxHQUV0QixHQUFJLEVBQVEsT0FBUyxFQUFHLENBQ3RCLEtBQUssTUFBUSxFQUNiLEtBQUssTUFBTSxVQUFZLEVBRXZCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQ2xDLEVBQVUsS0FBSyxFQUFRLEdBQUcsT0FHNUIsQUFBQyxFQUFFLGFBQVksVUFBVyxLQUFLLGlDQUMvQixDQUFDLEVBQU8sR0FBVyxLQUFLLHdCQUF3QixHQUdsRCxBQUFJLEdBQVUsRUFBTSxPQUFTLEdBTTNCLEtBQUssTUFBTSxHQUFXLDBCQUEyQixDQUMvQyxHQUFJLEVBQU0sV0FJVixHQUFVLEVBQU0sU0FBVyxHQUM3QixNQUFLLE1BQVEsRUFDYixFQUFVLEtBQUssRUFBTSxHQUFHLE9BQ3hCLEtBQUssTUFBTSxVQUFZLEVBQ3RCLENBQUUsYUFBWSxVQUFXLEtBQUssaUNBSW5DLFlBQUssd0JBQXdCLEVBQVksSUFFekMsS0FBSyxNQUFNLFVBQVksRUFDdkIsS0FBSyxPQUFNLElBRVgsRUFBSyxLQUFPLEVBQ1osRUFBSyxXQUFhLEVBQ2xCLEVBQUssVUFBWSxLQUFLLGlDQUFpQyxFQUFNLElBQzNELEtBQUssaUJBQWlCLE9BQVcsU0FHNUIsS0FBSyxXQUFXLEVBQU0seUJBRy9CLCtCQUdFLENBQ0EsS0FBSyxNQUFNLDBCQUEwQixLQUFLLEtBQUssTUFBTSxPQUVyRCxHQUFNLEdBQWEsS0FBSywwQkFDbEIsRUFBUyxDQUFDLEtBQUssTUFBSyxJQUUxQixZQUFLLE1BQU0sMEJBQTBCLE1BRTlCLENBQUUsYUFBWSxVQVV2Qix3QkFDRSxFQUNBLEVBQzRELENBQzVELEdBQU0sR0FBUSxDQUFDLEdBQ1QsRUFBc0MsR0FFNUMsS0FBTyxFQUFNLFNBQVcsR0FBRyxDQUN6QixHQUFNLEdBQU8sRUFBTSxNQUNuQixBQUFJLEVBQUssT0FBUywwQkFDaEIsQ0FBSSxFQUFLLGdCQUFrQixDQUFDLEVBQUssV0FHL0IsS0FBSyxzQkFBc0IsR0FHM0IsRUFBTyxLQUFLLEdBRWQsRUFBTSxLQUFLLEVBQUssT0FDUCxFQUFLLE9BQVMseUJBQ3ZCLEdBQU0sS0FBSyxFQUFLLFlBQ2hCLEVBQU0sS0FBSyxFQUFLLFlBSXBCLE1BQUksR0FDRixHQUFPLFFBQVEsR0FBUSxLQUFLLHNCQUFzQixJQUMzQyxDQUFDLEVBQVEsS0FHWCxHQUFVLEVBQVEsR0FDdkIsRUFBSyxPQUFPLE1BQU0sR0FBUyxLQUFLLGFBQWEsRUFBTyxNQUl4RCxzQkFBc0IsRUFBaUMsQ0FBQSxHQUFBLEdBQ3JELEtBQUssaUJBR0gsRUFBSyxPQUFNLEdBQ1gsRUFBSyxRQUFMLEtBQUEsT0FBQSxFQUFZLGlCQUNBLElBR2QsS0FBSyxNQUFNLE1BQU0sR0FBaUIsSUFFbEMsTUFBTSxZQUFZLEVBQU0sR0FBTyxJQUMvQixLQUFLLE1BQU0sT0FHYixpQ0FDRSxFQUNBLEVBQ0csQ0FDSCxHQUFJLEdBQ0osTUFBSSxNQUFLLE1BQU0sMEJBQTBCLFFBQVEsRUFBSyxTQUFXLEdBQy9ELE1BQUssTUFBTSwwQkFBMEIsS0FBSyxLQUFLLE1BQU0sT0FDckQsRUFBUyxJQUNULEtBQUssTUFBTSwwQkFBMEIsT0FFckMsRUFBUyxJQUdKLEVBR1QsZUFDRSxFQUVBLEVBQ2MsQ0FVZCxHQVRBLEVBQU8sTUFBTSxlQUFlLEVBQU0sR0FDOUIsS0FBSyxJQUFHLEtBQ1YsR0FBSyxTQUFXLEdBSWhCLEtBQUssaUJBQWlCLElBR3BCLEtBQUssTUFBSyxJQUFZLENBQ3hCLEdBQU0sR0FBZSxLQUFLLFlBQVksR0FDdEMsU0FBYSxXQUFhLEVBQzFCLEVBQWEsZUFBaUIsS0FBSywwQkFFNUIsS0FBSyxXQUFXLEVBQWMsc0JBR3ZDLE1BQU8sR0FHVCx3QkFBd0IsRUFBYyxDQUNwQyxBQUNHLEVBQUssT0FBUyxxQkFDWixHQUFLLGFBQWUsUUFBVSxFQUFLLGFBQWUsV0FDcEQsRUFBSyxPQUFTLDBCQUNiLEVBQUssYUFBZSxRQUNyQixFQUFLLE9BQVMsd0JBQTBCLEVBQUssYUFBZSxRQU8vRCxNQUFNLHdCQUF3QixHQUdoQyx1QkFDRSxFQUNrQyxDQUNsQyxHQUFJLEtBQUssYUFBWSxLQUFZLENBQy9CLEVBQUssV0FBYSxPQUVsQixHQUFNLEdBQWtCLEtBQUssWUFHN0IsTUFGQSxNQUFLLE9BRUQsS0FBSyxNQUFLLEdBRVosR0FBSyxXQUFhLEtBQUssc0JBQ0EsSUFFdkIsTUFBTSxnQkFBZ0IsR0FDZixNQUlBLEtBQUssbUJBQW1CLFdBRXhCLEtBQUssYUFBWSxLQUFjLENBQ3hDLEVBQUssV0FBYSxPQUVsQixHQUFNLEdBQWtCLEtBQUssWUFDN0IsWUFBSyxPQUdFLEtBQUssb0JBQW9CLEVBQWlCLFlBQ3hDLEtBQUssYUFBWSxLQUFpQixDQUMzQyxFQUFLLFdBQWEsT0FDbEIsR0FBTSxHQUFrQixLQUFLLFlBQzdCLFlBQUssT0FFRSxLQUFLLG1CQUFtQixXQUN0QixLQUFLLG9CQUFzQixLQUFLLGFBQVksS0FBWSxDQUNqRSxFQUFLLFdBQWEsUUFDbEIsR0FBTSxHQUFrQixLQUFLLFlBQzdCLFlBQUssT0FFRSxLQUFLLHlCQUF5QixPQUVyQyxPQUFPLE9BQU0sdUJBQXVCLEdBSXhDLGNBQWMsRUFBdUIsQ0FDbkMsTUFBSSxPQUFNLGNBQWMsR0FBYyxHQUVsQyxLQUFLLGFBQVksTUFBYyxLQUFLLFlBQVksT0FBSSxHQUN0RCxHQUFLLFdBQWEsT0FDbEIsS0FBSyxPQUNMLEtBQUssT0FDRSxJQUdGLEdBR1QsbUNBQW1DLEVBQXVCLENBQ3hELEdBQU0sQ0FBRSxZQUFhLEtBQUssTUFDcEIsRUFBZSxNQUFNLG1DQUFtQyxHQUM5RCxNQUFJLElBQWdCLEVBQUssYUFBZSxRQUN0QyxLQUFLLFdBQVcsR0FFWCxFQUdULGFBQ0UsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxNQUFNLGFBQWEsRUFBTSxFQUFhLEdBQ2xDLEtBQUssTUFBSyxLQUNaLEdBQUssZUFBaUIsS0FBSyxxQ0FJL0IsaUJBQ0UsRUFDQSxFQUNBLEVBQ00sQ0FDTixHQUFNLENBQUUsWUFBYSxLQUFLLE1BQzFCLEdBQUksS0FBSyxhQUFZLEtBQWUsQ0FDbEMsR0FBSSxNQUFNLDZCQUE2QixFQUFXLEdBRWhELE9BR0YsRUFBTyxRQUFVLEdBR25CLE1BQU0saUJBQWlCLEVBQVcsRUFBUSxHQUV0QyxFQUFPLFNBQ1QsQ0FDRSxFQUFPLE9BQVMsaUJBQ2hCLEVBQU8sT0FBUyx3QkFDaEIsRUFBTyxPQUFTLHFCQUVoQixLQUFLLE1BQU0sR0FBVyxvQkFBcUIsQ0FBRSxHQUFJLElBQ3hDLEVBQU8sT0FDaEIsS0FBSyxNQUFNLEdBQVcsNkJBQThCLENBQ2xELEdBQUksRUFBTyxTQU1uQixXQUFXLEVBQXVCLENBQ2hDLE1BQU8sS0FBUyxZQUFjLElBQVMsZ0JBR3pDLGNBQXFCLENBQ25CLEdBQU0sR0FBTyxNQUFNLFlBQ2IsRUFBVyxLQUFPLEVBR3hCLEFBQUksRUFBQyxLQUFLLFdBQVcsSUFBUyxDQUFDLEtBQUssTUFBTSxTQUN4QyxLQUFLLE1BQU0sRUFBTyxrQkFBbUIsQ0FDbkMsR0FBSSxLQUFLLE1BQU0sY0FDZixlQUFnQixJQUlwQixLQUFLLFlBQXFCLElBQUEsR0FJNUIsaUJBQWlCLEVBQW9CLENBQ25DLEdBQU0sR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxHQUNwRCxBQUFJLElBQUksS0FBaUMsSUFBSSxJQUMzQyxLQUFLLFNBQXVCLEVBQUEsR0FDdkIsQUFDTCxLQUFLLE1BQU0sUUFDVixLQUE4QixJQUFJLElBQUksSUFFdkMsS0FBSyxTQUFTLElBQUksR0FBMEMsR0FBQSxHQUFFLEdBQ3pELEFBQUksS0FBSyxNQUFNLFFBQVUsSUFBSSxHQUNsQyxBQUFJLElBQUksR0FDTixLQUFLLFNBQXlCLEdBQUEsR0FHOUIsS0FBSyxTQUFzQixHQUFBLEdBRXhCLEFBQ0wsR0FBZ0IsRUFBTSxFQUFNLEtBQUssTUFBTSxXQUFXLEtBQUssTUFBTSxJQUFNLElBRW5FLE1BQUssTUFBTSxLQUFPLEVBQ2xCLEtBQUssZ0JBRUwsTUFBTSxpQkFBaUIsR0FJM0IsYUFBYSxFQUFjLEVBQThCLENBQ3ZELE1BQUksR0FBSyxPQUFTLHFCQUNULEtBQUssYUFBYSxFQUFLLFdBQVksR0FFbkMsTUFBTSxhQUFhLEVBQU0sR0FJcEMsYUFBYSxFQUFjLEVBQWlCLEdBQWEsQ0FDdkQsQUFDRSxDQUFDLEdBQ0QsRUFBSyxPQUFTLHdCQUNkLEVBQUssS0FBSyxPQUFTLHNCQUVuQixHQUFLLEtBQU8sS0FBSyxvQkFBb0IsRUFBSyxPQUU1QyxNQUFNLGFBQWEsRUFBTSxHQUkzQixpQkFDRSxFQUNBLEVBQ0EsRUFDTSxDQUNOLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBUyxPQUFRLElBQUssQ0FDeEMsR0FBTSxHQUFPLEVBQVMsR0FDdEIsQUFBSSxJQUFBLEtBQUEsT0FBQSxFQUFNLFFBQVMsc0JBQ2pCLEdBQVMsR0FBSyxLQUFLLG9CQUFvQixJQUczQyxNQUFNLGlCQUFpQixFQUFVLEVBQWtCLEdBS3JELGlCQUNFLEVBQ0EsRUFDZ0QsQ0FDaEQsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFTLE9BQVEsSUFBSyxDQUFBLEdBQUEsR0FDeEMsR0FBTSxHQUFPLEVBQVMsR0FDdEIsQUFDRSxHQUNBLEVBQUssT0FBUyxzQkFDZCxDQUFBLElBQUMsRUFBSyxRQUFMLE1BQUEsRUFBWSxnQkFDWixHQUFTLE9BQVMsR0FBSyxDQUFDLElBRXpCLEtBQUssTUFBTSxHQUFXLGtCQUFtQixDQUN2QyxHQUFJLEVBQUssaUJBS2YsTUFBTyxHQUdULGVBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDdUMsQ0FDdkMsR0FBTSxHQUFPLE1BQU0sZUFDakIsRUFDQSxFQUNBLEVBQ0EsR0FRRixNQUFJLElBQWdCLENBQUMsS0FBSyxNQUFNLHdCQUM5QixLQUFLLGlCQUFpQixFQUFLLFVBR3RCLEVBR1QsWUFBWSxFQUFjLEVBQTBCLEVBQXVCLENBQ3pFLE1BQ0UsS0FBUyxzQkFDVCxNQUFNLFlBQVksRUFBTSxFQUFpQixHQUs3QyxtQkFBbUIsRUFBd0MsQ0FDekQsTUFBSSxNQUFLLE1BQUssS0FFWixHQUFLLGVBQWlCLEtBQUssMkJBRXRCLE1BQU0sbUJBQW1CLEdBR2xDLDBCQUNFLEVBQ3dCLENBQ3hCLE1BQUksTUFBSyxNQUFLLEtBRVosR0FBSyxlQUFpQixLQUFLLDJCQUV0QixNQUFNLDBCQUEwQixHQUl6QyxlQUF5QixDQUN2QixNQUFPLE1BQUssTUFBVyxLQUFLLE1BQU0sZ0JBSXBDLGlCQUEyQixDQUN6QixNQUFPLE1BQUssTUFBYyxLQUFLLE1BQU0sa0JBR3ZDLHVCQUF1QixFQUFrRCxDQUN2RSxNQUFPLENBQUMsS0FBSyxNQUFjLEtBQUssTUFBTSx1QkFBdUIsR0FJL0QsZ0JBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FrQk4sR0FqQkssRUFBZSxVQUNsQixLQUFLLFdBQVksRUFBZSxTQUFTLElBQUksT0FFL0MsTUFBUSxHQUFlLFNBQ25CLEtBQUssTUFBSyxLQUNaLEdBQU8sZUFBaUIsS0FBSyxxQ0FHL0IsTUFBTSxnQkFDSixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRSxFQUFPLFFBQVUsRUFBZSxDQUNsQyxHQUFNLEdBQVMsRUFBTyxPQUN0QixBQUFJLEVBQU8sT0FBUyxHQUFLLEtBQUssWUFBWSxFQUFPLEtBQy9DLEtBQUssTUFBTSxHQUFXLDZCQUE4QixDQUFFLEdBQUksWUFLNUQsRUFBTyxPQUFTLG9CQUNoQixHQUVBLEVBQU8sTUFBTSxPQUNiLENBRUEsR0FBTSxHQUFTLEVBQU8sTUFBTSxPQUM1QixBQUFJLEVBQU8sT0FBUyxHQUFLLEtBQUssWUFBWSxFQUFPLEtBQy9DLEtBQUssTUFBTSxHQUFXLDZCQUE4QixDQUFFLEdBQUksS0FLaEUsdUJBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLEFBQUssRUFBZSxVQUNsQixLQUFLLFdBQVksRUFBZSxTQUFTLElBQUksT0FFL0MsTUFBUSxHQUFlLFNBQ25CLEtBQUssTUFBSyxLQUNaLEdBQU8sZUFBaUIsS0FBSyxxQ0FHL0IsTUFBTSx1QkFBdUIsRUFBVyxFQUFRLEVBQWEsR0FJL0QsZ0JBQWdCLEVBQXFCLENBS25DLEdBSkEsTUFBTSxnQkFBZ0IsR0FDbEIsRUFBSyxZQUFjLEtBQUssTUFBVyxLQUNyQyxHQUFLLG9CQUFzQixLQUFLLHVDQUU5QixLQUFLLGFBQVksS0FBa0IsQ0FDckMsS0FBSyxPQUNMLEdBQU0sR0FBd0MsRUFBSyxXQUFhLEdBQ2hFLEVBQUcsQ0FDRCxHQUFNLEdBQU8sS0FBSyxZQUNsQixFQUFLLEdBQUssS0FBSyw4QkFBMEMsSUFDekQsQUFBSSxLQUFLLE1BQUssSUFDWixFQUFLLGVBQWlCLEtBQUssc0NBRTNCLEVBQUssZUFBaUIsS0FFeEIsRUFBWSxLQUFLLEtBQUssV0FBVyxFQUFNLDBCQUNoQyxLQUFLLElBQUcsTUFJckIsd0JBQXdCLEVBQThDLENBQ3BFLE1BQU0sd0JBQXdCLEdBQzlCLEdBQU0sR0FBUyxLQUFLLDZCQUE2QixHQUNqRCxHQUFJLEVBQU8sT0FBUyxFQUFHLENBQ3JCLEdBQU0sR0FBUSxFQUFPLEdBQ3JCLEFBQUksS0FBSyxZQUFZLElBQVUsRUFBTyxPQUFTLE1BQzdDLEtBQUssTUFBTSxHQUFXLDBCQUEyQixDQUFFLEdBQUksSUFDOUMsS0FBSyxZQUFZLElBQzFCLEtBQUssTUFBTSxHQUFXLDBCQUEyQixDQUFFLEdBQUksS0FLN0QsZ0NBQ0UsRUFDTSxDQUNOLEVBQUssU0FBVyxLQUFLLG9CQUl2QixrQkFDRSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNtQyxDQUNuQyxBQUFLLEVBQWEsVUFDaEIsS0FBSyxXQUFZLEVBQWEsU0FBUyxJQUFJLE9BRTdDLE1BQVEsR0FBYSxTQUVyQixHQUFJLEdBR0osQUFBSSxLQUFLLE1BQUssS0FBVyxDQUFDLEdBQ3hCLEdBQWlCLEtBQUssb0NBQ2pCLEtBQUssTUFBSyxLQUFhLEtBQUssY0FHbkMsR0FBTSxHQUFTLE1BQU0sa0JBQ25CLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEdBSUYsTUFBSSxJQUNELElBQU8sT0FBUyxHQUFRLGVBQWlCLEdBRXJDLEVBR1QsNkJBQTZCLEVBQTZCLENBQ3hELE1BQUksTUFBSyxJQUFHLEtBQ04sR0FBTSxPQUFTLGNBQ2pCLEtBQUssTUFBTSxHQUFXLGtCQUFtQixDQUFFLEdBQUksSUFFN0MsS0FBSyxZQUFZLElBQ25CLEtBQUssTUFBTSxHQUFXLDBCQUEyQixDQUFFLEdBQUksSUFHeEQsRUFBOEIsU0FBVyxJQUU1QyxBQUFJLEtBQUssTUFBSyxJQUVaLEVBQU0sZUFBaUIsS0FBSywwQkFDbkIsS0FBSyxZQUFZLElBQzFCLEtBQUssTUFBTSxHQUFXLDRCQUE2QixDQUFFLEdBQUksSUFHdkQsS0FBSyxNQUFLLEtBQVcsS0FBSyxZQUFZLElBQ3hDLEtBQUssTUFBTSxHQUFXLG1CQUFvQixDQUFFLEdBQUksSUFHbEQsS0FBSyxpQkFBaUIsR0FDZixFQUdULGtCQUNFLEVBQ0EsRUFDVyxDQUNYLEdBQU0sR0FBTyxNQUFNLGtCQUFrQixFQUFVLEdBRS9DLE1BQ0UsR0FBSyxPQUFTLHFCQUNkLEVBQUssZ0JBQ0wsRUFBSyxNQUFNLE1BQVEsRUFBSyxlQUFlLE9BRXZDLEtBQUssTUFBTSxHQUFXLHNCQUF1QixDQUMzQyxHQUFJLEVBQUssaUJBSU4sRUFHVCxzQkFBc0IsRUFBbUMsQ0FDdkQsTUFBTSxzQkFBc0IsR0FDeEIsRUFBSyxRQUFVLEVBQUssYUFBZSxTQUNyQyxLQUFLLE1BQU0sR0FBVyw4QkFBK0IsQ0FDbkQsR0FBSSxFQUFLLFdBQVcsR0FBRyxJQUFJLFFBS2pDLDBCQUtFLEVBQTJCLEVBQXNCLEVBQXVCLENBQ3hFLEVBQVUsTUFBUSxHQUFrQixHQUNoQyxLQUFLLDhCQUNXLEdBQ0ksSUFFcEIsS0FBSyxrQkFFVCxFQUFLLFdBQVcsS0FBSyxLQUFLLHNCQUFzQixFQUFXLElBRzdELHVCQUF1QixFQUE0QixDQUNqRCxHQUFJLE1BQU0sdUJBQXVCLEdBQVcsTUFBTyxHQUNuRCxHQUFJLEtBQUssYUFBWSxLQUFZLENBQy9CLEdBQUksQ0FBQyxFQUFVLE1BQU8sR0FDdEIsR0FBTSxHQUFLLEtBQUssb0JBQ2hCLE1BQU8sS0FBRSxLQUFpQyxJQUF5QixHQUVyRSxNQUFPLENBQUMsR0FBWSxLQUFLLGFBQVksSUFHdkMsaUJBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUVOLEdBREEsTUFBTSxpQkFBaUIsRUFBTSxFQUFVLEVBQU8sR0FDMUMsRUFBVSxDQUNaLEdBQUksQ0FBQyxHQUFTLEtBQUssTUFBSyxJQUV0QixPQUVELEVBQWtDLFdBQ2pDLElBQVUsT0FBUyxFQUFRLFlBRTdCLEFBQUksS0FBVSxRQUFVLEtBQUssTUFBYSxLQUFHLEtBQUssYUFDakQsRUFBNkIsV0FDNUIsSUFBVSxRQUFVLElBQVUsU0FBVyxFQUFRLFFBS3ZELHFCQUNFLEVBQ0EsRUFDQSxFQUVBLEVBRUEsRUFDbUIsQ0FDbkIsR0FBTSxHQUFhLEVBQVUsU0FFekIsRUFBb0IsS0FDeEIsQUFBSSxFQUFXLE9BQVMsY0FDdEIsQ0FBSSxFQUFXLE9BQVMsT0FDdEIsRUFBb0IsT0FDWCxFQUFXLE9BQVMsVUFDN0IsR0FBb0IsV0FJeEIsR0FBSSxHQUFZLEdBQ2hCLEdBQUksS0FBSyxhQUFZLEtBQVksQ0FBQyxLQUFLLHNCQUFzQixNQUFPLENBQ2xFLEdBQU0sR0FBVyxLQUFLLGdCQUFnQixJQUN0QyxBQUNFLElBQXNCLE1BQ3RCLENBQUMsR0FBMkIsS0FBSyxNQUFNLE1BR3ZDLEdBQVUsU0FBVyxFQUNyQixFQUFVLFdBQWEsRUFDdkIsRUFBVSxNQUFRLEdBQWdCLElBR2xDLEdBQVUsU0FBVyxFQUNyQixFQUFVLFdBQWEsS0FDdkIsRUFBVSxNQUFRLEtBQUssdUJBRXBCLENBQ0wsR0FDRSxJQUFzQixNQUN0QixHQUEyQixLQUFLLE1BQU0sTUFHdEMsRUFBVSxTQUFXLEtBQUssZ0JBQWdCLElBQzFDLEVBQVUsV0FBYSxNQUNsQixDQUNMLEdBQUksRUFFRixLQUFNLE1BQUssTUFBTSxFQUFPLHNCQUF1QixDQUM3QyxHQUFJLEVBQ0osV0FBWSxFQUFXLFFBSTNCLEVBQVUsU0FBVyxFQUNyQixFQUFVLFdBQWEsS0FHekIsQUFBSSxLQUFLLGNBQWEsSUFDcEIsRUFBVSxNQUFRLEtBQUssa0JBRXZCLEdBQVksR0FDWixFQUFVLE1BQVEsR0FBZ0IsRUFBVSxXQUloRCxHQUFNLEdBQXdCLEdBQWtCLEdBRWhELE1BQUksSUFBc0IsR0FDeEIsS0FBSyxNQUFNLEdBQVcsb0NBQXFDLENBQ3pELEdBQUksSUFJSixJQUFzQixJQUN4QixLQUFLLGtCQUNILEVBQVUsTUFBTSxLQUNoQixFQUFVLE1BQU0sSUFBSSxNQUNGLElBSWxCLEdBQWEsQ0FBQyxHQUFzQixDQUFDLEdBQ3ZDLEtBQUssa0JBQ0gsRUFBVSxNQUFNLEtBQ2hCLEVBQVUsSUFBSSxNQUNkLEdBQ0EsSUFJRyxLQUFLLHNCQUFzQixFQUFXLG1CQUcvQyxrQkFBOEIsQ0FDNUIsT0FBUSxLQUFLLE1BQU0sVUFDakIsSUFFRSxNQUFPLE1BQUssZ0JBQThCLFlBRTFDLE1BQU8sT0FBTSxvQkFLbkIsb0JBQ0UsRUFDQSxFQUNNLENBRU4sR0FBTSxHQUFPLEVBQUssS0FDbEIsQUFBSSxJQUFTLE9BQVMsSUFBUyxPQUFTLEtBQUssTUFBSyxLQUNoRCxHQUFLLGVBQWlCLEtBQUsscUNBRTdCLE1BQU0sb0JBQW9CLEVBQU0sR0FJbEMsV0FDRSxFQUNBLEVBQ00sQ0FDTixNQUFNLFdBQVcsRUFBTSxHQUNuQixLQUFLLE1BQUssS0FFWixHQUFLLEdBQUcsZUFBaUIsS0FBSywwQkFDOUIsS0FBSyxpQkFBaUIsRUFBSyxLQUsvQixrQ0FDRSxFQUNBLEVBQzJCLENBQzNCLEdBQUksS0FBSyxNQUFLLElBQVksQ0FDeEIsR0FBTSxHQUF3QixLQUFLLE1BQU0sbUJBQ3pDLEtBQUssTUFBTSxtQkFBcUIsR0FFaEMsRUFBSyxXQUFhLEtBQUssMEJBQ3ZCLEtBQUssTUFBTSxtQkFBcUIsRUFHbEMsTUFBTyxPQUFNLGtDQUFrQyxFQUFNLEdBSXZELHVCQUFpQyxDQUMvQixNQUFPLE1BQUssTUFBYyxLQUFLLE1BQU0sd0JBYXZDLGlCQUNFLEVBQ0EsRUFDYyxDQUFBLEdBQUEsR0FDZCxHQUFJLEdBQVEsS0FFUixFQUVKLEdBQ0UsS0FBSyxVQUFVLFFBQ2QsTUFBSyxNQUFvQixNQUFLLEtBQUssTUFBVyxLQUMvQyxDQVVBLEdBVEEsRUFBUSxLQUFLLE1BQU0sUUFFbkIsRUFBTSxLQUFLLFNBQ1QsSUFBTSxNQUFNLGlCQUFpQixFQUFxQixHQUNsRCxHQUtFLENBQUMsRUFBSSxNQUFPLE1BQU8sR0FBSSxLQUszQixHQUFNLENBQUUsV0FBWSxLQUFLLE1BQ25CLEVBQWlCLEVBQVEsRUFBUSxPQUFTLEdBQ2hELEFBQUksS0FBbUIsR0FBRyxRQUFVLElBQW1CLEdBQUcsU0FDeEQsRUFBUSxNQUlaLEdBQUksR0FBQSxJQUFHLE1BQUgsRUFBSyxPQUFTLEtBQUssTUFBSyxJQUFTLENBQUEsR0FBQSxHQUFBLEVBQ25DLEVBQVEsR0FBUyxLQUFLLE1BQU0sUUFFNUIsR0FBSSxHQUVFLEVBQVEsS0FBSyxTQUFTLEdBQVMsQ0FBQSxHQUFBLEdBQ25DLEVBQWlCLEtBQUssb0NBRXRCLEdBQU0sR0FBa0IsS0FBSyxpQ0FDM0IsRUFDQSxJQUFNLENBQ0osR0FBTSxHQUFTLE1BQU0saUJBQ25CLEVBQ0EsR0FHRixZQUFLLDJCQUEyQixFQUFRLEdBRWpDLElBTVgsQUFBQSxHQUFJLEVBQWdCLFFBQUssTUFBckIsRUFBdUIsZUFBZSxJQUsxQyxHQUFNLEdBQU8sS0FBSyw4QkFBOEIsR0FFaEQsTUFBSSxHQUFLLE9BQVMsMkJBQTJCLElBRTdDLEVBQUssZUFBaUIsRUFDdEIsS0FBSywyQkFBMkIsRUFBTSxHQUUvQixHQUNOLEdBRUMsRUFJTyxLQUVYLEdBQ0UsRUFBTSxNQUVOLEtBQUssOEJBQThCLEVBQU0sTUFBTSxPQUM3QywwQkFDRixDQUNBLEdBQUksQ0FBQyxFQUFNLE9BQVMsQ0FBQyxFQUFNLFFBR3pCLE1BQUksR0FBTSxLQUFLLE9BRWIsS0FBSyxNQUNILEdBQVcsZ0RBQ1gsQ0FBRSxHQUFJLElBSUgsRUFBTSxLQUlmLEVBQWtCLEVBQU0sS0FTMUIsR0FBQSxHQUFJLElBQUcsTUFBSCxFQUFLLEtBRVAsWUFBSyxNQUFRLEVBQUksVUFDVixFQUFJLEtBR2IsR0FBSSxFQUVGLFlBQUssTUFBUSxFQUFNLFVBQ1osRUFHVCxLQUFBLEdBQUksSUFBQSxNQUFBLEVBQUssT0FBYyxFQUFJLE1BQ3ZCLEVBQU0sT0FBYyxFQUFNLE1BR3hCLEtBQUssTUFBTSxHQUFXLGtDQUFtQyxDQUM3RCxHQUFJLElBSVIsTUFBTyxPQUFNLGlCQUFpQixFQUFxQixHQUlyRCxXQUNFLEVBQ3NELENBQ3RELEdBQUksS0FBSyxNQUFLLElBQVksQ0FFeEIsR0FBTSxHQUFTLEtBQUssU0FBUyxJQUFNLENBQ2pDLEdBQU0sR0FBd0IsS0FBSyxNQUFNLG1CQUN6QyxLQUFLLE1BQU0sbUJBQXFCLEdBRWhDLEdBQU0sR0FBVyxLQUFLLFlBRXRCLE9BQ0UsRUFBUyxlQUVULEVBQUssV0FDSCxLQUFLLHVDQUVULEtBQUssTUFBTSxtQkFBcUIsRUFFNUIsS0FBSyxzQkFBc0IsS0FBSyxhQUMvQixLQUFLLE1BQUssS0FBWSxLQUFLLGFBRXpCLElBR1QsR0FBSSxFQUFPLE9BQVEsTUFBTyxNQUcxQixBQUFJLEVBQU8sT0FBTyxNQUFLLE1BQVEsRUFBTyxXQUl0QyxFQUFLLFdBQWEsRUFBTyxLQUFLLGVBQzFCLEtBQUssV0FBVyxFQUFPLEtBQU0sa0JBQzdCLEtBR04sTUFBTyxPQUFNLFdBQVcsR0FHMUIsaUJBQWlCLEVBQWdDLENBQy9DLE1BQU8sTUFBSyxNQUFjLEtBQUssTUFBTSxpQkFBaUIsR0FHeEQsMkJBQ0UsRUFDQSxFQUNNLENBQ04sQUFBSSxLQUFLLE1BQU0sMEJBQTBCLFFBQVEsRUFBSyxTQUFXLEdBQy9ELEVBQUssT0FBUyxFQUVkLE1BQU0sMkJBQTJCLEVBQU0sR0FJM0MsWUFDRSxFQUNBLEVBQ0EsRUFDQSxFQUE2QixHQUN2QixDQUNOLEdBQ0UsS0FDQSxLQUFLLE1BQU0sMEJBQTBCLFFBQVEsRUFBSyxTQUFXLElBTS9ELFFBQVMsR0FBSSxFQUFHLEVBQUksRUFBSyxPQUFPLE9BQVEsSUFDdEMsQUFBSSxLQUFLLFlBQVksRUFBSyxPQUFPLEtBQU8sRUFBSSxHQUMxQyxLQUFLLE1BQU0sR0FBVyxxQkFBc0IsQ0FBRSxHQUFJLEVBQUssT0FBTyxLQUlsRSxNQUFNLFlBQ0osRUFDQSxFQUNBLEVBQ0EsSUFJSixtQ0FBbUMsRUFBbUMsQ0FDcEUsTUFBTyxPQUFNLG1DQUNYLEdBQWMsS0FBSyxNQUFNLFVBQVUsUUFBUSxLQUFLLE1BQU0sU0FBVyxJQUlyRSxnQkFDRSxFQUVBLEVBQ0EsRUFDYyxDQUNkLEdBQ0UsRUFBSyxPQUFTLGNBQ2QsRUFBSyxPQUFTLFNBQ2QsS0FBSyxNQUFNLFVBQVUsUUFBUSxFQUFTLFNBQVcsR0FDakQsQ0FDQSxLQUFLLE9BRUwsR0FBTSxHQUFPLEtBQUssWUFBWSxHQUM5QixFQUFLLE9BQVMsRUFDZCxFQUFLLFVBQVksTUFBTSw2QkFBNEIsR0FBWSxJQUMvRCxFQUFPLEtBQUssV0FBVyxFQUFNLDBCQUU3QixFQUFLLE9BQVMsY0FDZCxFQUFLLE9BQVMsU0FDZCxLQUFLLE1BQUssSUFDVixDQUNBLEdBQU0sR0FBUSxLQUFLLE1BQU0sUUFDbkIsRUFBUSxLQUFLLFNBQ2pCLEdBQVMsS0FBSyxrQ0FBa0MsSUFBYSxJQUM3RCxHQUtGLEdBQUksQ0FBQyxFQUFNLE9BQVMsQ0FBQyxFQUFNLFFBQVMsTUFBTyxHQUFNLEtBRWpELEdBQU0sR0FBUyxLQUFLLFNBQ2xCLElBQU0sTUFBTSxnQkFBZ0IsRUFBTSxFQUFVLEdBQzVDLEdBR0YsR0FBSSxFQUFPLE1BQVEsQ0FBQyxFQUFPLE1BQU8sTUFBTyxHQUFPLEtBRWhELEdBQUksRUFBTSxLQUNSLFlBQUssTUFBUSxFQUFNLFVBRVosRUFBTSxLQUdmLEdBQUksRUFBTyxLQUNULFlBQUssTUFBUSxFQUFPLFVBQ2IsRUFBTyxLQUdoQixLQUFNLEdBQU0sT0FBUyxFQUFPLE1BRzlCLE1BQU8sT0FBTSxnQkFBZ0IsRUFBTSxFQUFVLEdBRy9DLGVBQ0UsRUFFQSxFQUNBLEVBQ0EsRUFDYyxDQUNkLEdBQUksS0FBSyxNQUFvQixLQUFLLEtBQUssc0JBQXVCLENBRTVELEdBREEsRUFBZSxvQkFBc0IsR0FDakMsRUFDRixTQUFlLEtBQU8sR0FDZixFQUVULEtBQUssT0FDTCxHQUFNLEdBQU8sS0FBSyxZQUFzQyxHQUN4RCxTQUFLLE9BQVMsRUFDZCxFQUFLLGNBQWdCLEtBQUssc0NBQzFCLEtBQUssT0FBTSxJQUNYLEVBQUssVUFBWSxLQUFLLDZCQUE0QixHQUFZLElBQzlELEVBQUssU0FBVyxHQUNULEtBQUsscUJBQXFCLEVBQXFCLFlBQzdDLENBQUMsR0FBVyxLQUFLLG9CQUFzQixLQUFLLE1BQUssSUFBUyxDQUNuRSxHQUFNLEdBQU8sS0FBSyxZQUVoQixHQUNGLEVBQUssT0FBUyxFQUVkLEdBQU0sR0FBUyxLQUFLLFNBQVMsSUFDM0IsR0FBSyxjQUNILEtBQUssK0NBQ1AsS0FBSyxPQUFNLElBQ1gsRUFBSyxVQUFZLE1BQU0sNkJBQTRCLEdBQVksSUFDM0QsRUFBZSxxQkFDaEIsR0FBMEMsU0FBVyxJQUVqRCxLQUFLLHFCQUNWLEVBQ0EsRUFBZSx1QkFJbkIsR0FBSSxFQUFPLEtBQ1QsTUFBSSxHQUFPLE9BQU8sTUFBSyxNQUFRLEVBQU8sV0FDL0IsRUFBTyxLQUlsQixNQUFPLE9BQU0sZUFDWCxFQUVBLEVBQ0EsRUFDQSxHQUlKLGVBQWUsRUFBNkIsQ0FDMUMsTUFBTSxlQUFlLEdBRXJCLEdBQUksR0FBUSxLQUNaLEFBQUksS0FBSyxvQkFBc0IsS0FBSyxNQUFXLEtBQzdDLEdBQVEsS0FBSyxTQUFTLElBQ3BCLEtBQUssZ0RBQ0wsTUFFSixFQUFLLGNBQWdCLEVBR3ZCLGtDQUNFLEVBQzhDLENBQzlDLEdBQU0sR0FBTyxLQUFLLFlBQXVDLEdBRXpELEdBREEsS0FBSyxvQkFBb0IsRUFBTSxJQUMzQixFQUFDLEtBQUssV0FBVyxHQUNyQixNQUFPLE9BQU0scUJBQ1gsRUFDYSxPQUNDLElBSWxCLHNCQUFzQixFQUFvQixDQUN4QyxHQUFNLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLElBQU0sR0FDcEQsR0FDRSxJQUEyQixJQUMzQixJQUFJLElBQ0osS0FBSyxNQUFNLGVBQ1gsQ0FDQSxLQUFLLE1BQU0sZUFBaUIsR0FDNUIsS0FBSyxNQUFNLEtBQU8sRUFDbEIsS0FBSyxZQUNMLE9BR0YsTUFBTSxzQkFBc0IsR0FHOUIsbUJBQW1CLEVBQW9CLENBQ3JDLEdBQU0sR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sSUFBTSxHQUNwRCxHQUNFLElBQUksS0FDSixJQUFJLElBQ0osQ0FFQSxLQUFLLFNBQXVCLEVBQUEsR0FDNUIsT0FHRixNQUFNLG1CQUFtQixHQUczQixjQUFjLEVBQWMsRUFBNEIsQ0FDdEQsR0FBTSxHQUFXLE1BQU0sY0FBYyxFQUFNLEdBQzNDLE1BQUksTUFBSyxNQUFNLGdCQUNiLEtBQUssTUFBTSxHQUFXLHdCQUF5QixDQUM3QyxHQUFJLEtBQUssTUFBTSxnQkFHWixFQUdULGtCQUErQyxDQUM3QyxHQUFJLEtBQUssVUFBVSxpQkFBbUIsS0FBSyxrQkFBbUIsQ0FDNUQsR0FBSSxLQUFLLE1BQU0sZUFDYixLQUFNLE1BQUssTUFBTSxHQUFXLGtCQUFtQixDQUM3QyxHQUFJLEtBQUssTUFBTSxXQUduQixLQUFLLDJCQUNMLEdBQU0sR0FBYyxLQUFLLGtCQUN6QixBQUFJLEdBQ0YsTUFBSyxNQUFNLEtBQU8sRUFDbEIsS0FBSyxNQUFNLGVBQWlCLElBRTlCLE9BR0YsTUFBTyxPQUFNLGlCQUFpQixLQUFLLE1BQU0sZUFBaUIsTUFBUSxNQUdwRSxpQkFBa0MsQ0FDaEMsR0FBTSxDQUFFLE9BQVEsS0FBSyxNQUNqQixFQUE0QixFQUNoQyxLQUNFLENBQWdDLEdBQUEsR0FBQyxTQUUvQixLQUFLLE1BQU0sV0FBVyxFQUFNLEtBRzlCLElBR0YsR0FBTSxHQUFNLEtBQUssTUFBTSxXQUFXLEVBQTRCLEdBQ3hELEVBQU0sS0FBSyxNQUFNLFdBQVcsRUFBNEIsRUFBTSxHQUVwRSxNQUFJLEtBQUcsSUFBd0IsSUFBRyxHQUN6QixFQUE0QixFQUduQyxLQUFLLE1BQU0sTUFDVCxFQUE0QixFQUM1QixFQUE0QixFQUFNLE1BQzlCLGVBRUMsRUFBNEIsR0FFakMsSUFBRyxJQUF3QixJQUFHLEdBQ3pCLEVBRUYsR0FHVCwwQkFBaUMsQ0FFL0IsR0FBSSxBQURRLEtBQUssTUFBTSxRQUFRLEtBQU0sS0FBSyxNQUFNLE9BQ3BDLEdBQ1YsS0FBTSxNQUFLLE1BQU0sRUFBTyxvQkFBcUIsQ0FDM0MsR0FBSSxLQUFLLE1BQU0sZ0JBT3JCLHlDQUNFLEVBQ0EsQ0FDRSxXQUNBLGNBS0ksQ0FDTixLQUFLLE1BQU0sR0FBVyxnQ0FBaUMsQ0FDckQsR0FBSSxFQUNKLGFBQ0EsYUFJSixzQ0FDRSxFQUNBLEVBQ0EsQ0FDQSxNQUFPLE1BQUssTUFDVixBQUFDLEVBQVksYUFFVCxFQUFZLGVBQWlCLFNBQzdCLEdBQVcsdUNBQ1gsR0FBVyx3Q0FIWCxHQUFXLHdDQUd1QyxPQUFBLE9BQUEsQ0FFcEQsR0FBSSxHQUNELElBS1Qsd0NBQ0UsRUFDQSxDQUNFLFdBQ0EsY0FLSSxDQUNOLEtBQUssTUFBTSxHQUFXLCtCQUFnQyxDQUNwRCxHQUFJLEVBQ0osV0FDQSxlQUlKLG1EQUNFLEVBQ0EsQ0FDRSxZQUlJLENBQ04sS0FBSyxNQUFNLEdBQVcsMENBQTJDLENBQy9ELEdBQUksRUFDSixhQUlKLG9CQUFxQyxDQUNuQyxHQUFNLEdBQVcsS0FBSyxNQUFNLFNBQ3RCLEVBQVksSUFBTSxLQUFLLE1BQWMsS0FBSyxLQUFLLE1BQUssR0FDMUQsT0FBUSxLQUFLLE1BQU0sVUFDakIsS0FBYSxDQUNYLEdBQU0sR0FBVSxLQUFLLG9CQUFvQixLQUFLLE1BQU0sT0FDcEQsTUFBSSxLQUNLLENBQUUsS0FBTSxTQUFVLElBQUssRUFBUSxJQUFJLE1BQU8sTUFBTyxHQUVuRCxDQUFFLEtBQU0sVUFBVyxJQUFLLE9BRWpDLEtBQWdCLENBQ2QsR0FBTSxHQUFVLEtBQUssbUJBQW1CLEtBQUssTUFBTSxPQUNuRCxNQUFJLEtBQ0ssQ0FBRSxLQUFNLFNBQVUsSUFBSyxFQUFRLElBQUksTUFBTyxNQUFPLEdBRW5ELENBQUUsS0FBTSxVQUFXLElBQUssT0FFakMsUUFDQSxJQUFnQixDQUNkLEdBQU0sR0FBVSxLQUFLLG9CQUFvQixLQUFLLE1BQWMsS0FDNUQsTUFBSSxLQUNLLENBQ0wsS0FBTSxVQUNOLElBQUssRUFBUSxJQUFJLE1BQ2pCLE1BQU8sR0FHSixDQUFFLEtBQU0sVUFBVyxJQUFLLFdBRy9CLE1BQU8sQ0FBRSxLQUFNLFVBQVcsSUFBSyxJQUlyQyxtQkFHRSxDQUNBLEdBQU0sR0FBTSxLQUFLLE1BQU0sU0FDakIsRUFBSyxLQUFLLGdCQUFnQixJQUMxQixFQUFPLEtBQUssSUFBRyxJQUNqQixLQUFLLHFCQUNMLENBQUUsS0FBTSxPQUFpQixPQUM3QixNQUFPLENBQUUsS0FBSSxRQUdmLGtDQUNFLEVBQ0EsRUFDQSxFQUNNLENBQ04sR0FBTSxDQUFFLGdCQUFpQixFQUN6QixBQUFJLElBQWlCLE1BR2pCLElBQWlCLEdBQ25CLEtBQUssc0NBQXNDLEVBQUssR0FJcEQsZ0JBQWdCLENBQ2QsV0FDQSxnQkFZQSxDQUNBLEdBQU0sR0FBWSxHQUFJLEtBQ2hCLEVBQVUsQ0FFZCxlQUFnQixHQUVoQixjQUFlLEdBRWYsY0FBZSxHQUVmLGlCQUFrQixJQUVoQixFQUFvQixHQUN4QixLQUFPLENBQUMsS0FBSyxNQUFLLElBQWEsQ0FDN0IsR0FBSSxLQUFLLElBQUcsSUFBZSxDQUN6QixFQUFvQixHQUNwQixNQUVGLEdBQU0sR0FBYSxLQUFLLFlBQ2xCLENBQUUsS0FBSSxRQUFTLEtBQUssb0JBQ3BCLEVBQWEsRUFBRyxLQUN0QixHQUFJLElBQWUsR0FDakIsU0FFRixBQUFJLFNBQVMsS0FBSyxJQUNoQixLQUFLLE1BQU0sR0FBVyxzQkFBdUIsQ0FDM0MsR0FBSSxFQUNKLGFBQ0EsV0FBWSxFQUFXLEdBQUcsY0FBZ0IsRUFBVyxNQUFNLEdBQzNELGFBR0EsRUFBVSxJQUFJLElBQ2hCLEtBQUssTUFBTSxHQUFXLHdCQUF5QixDQUM3QyxHQUFJLEVBQ0osYUFDQSxhQUdKLEVBQVUsSUFBSSxHQUNkLEdBQU0sR0FBVSxDQUFFLFdBQVUsZUFBYyxjQUUxQyxPQURBLEVBQVcsR0FBSyxFQUNSLEVBQUssVUFDTixVQUFXLENBQ2QsS0FBSyxrQ0FDSCxFQUFLLElBQ0wsRUFDQSxXQUVGLEVBQVcsS0FBTyxFQUFLLE1BQ3ZCLEVBQVEsZUFBZSxLQUNyQixLQUFLLFdBQVcsRUFBWSxzQkFFOUIsVUFFRyxTQUFVLENBQ2IsS0FBSyxrQ0FBa0MsRUFBSyxJQUFLLEVBQVMsVUFDMUQsRUFBVyxLQUFPLEVBQUssTUFDdkIsRUFBUSxjQUFjLEtBQ3BCLEtBQUssV0FBVyxFQUFZLHFCQUU5QixVQUVHLFNBQVUsQ0FDYixLQUFLLGtDQUFrQyxFQUFLLElBQUssRUFBUyxVQUMxRCxFQUFXLEtBQU8sRUFBSyxNQUN2QixFQUFRLGNBQWMsS0FDcEIsS0FBSyxXQUFXLEVBQVkscUJBRTlCLFVBRUcsVUFDSCxLQUFNLE1BQUssc0NBQXNDLEVBQUssSUFBSyxPQUV4RCxPQUNILE9BQVEsT0FDRCxVQUNILEtBQUsseUNBQ0gsRUFBSyxJQUNMLEdBRUYsVUFDRyxTQUNILEtBQUssd0NBQXdDLEVBQUssSUFBSyxHQUN2RCxjQUVBLEVBQVEsaUJBQWlCLEtBQ3ZCLEtBQUssV0FBVyxFQUFZLHlCQU10QyxBQUFLLEtBQUssTUFBSyxJQUNiLEtBQUssT0FBTSxJQUdmLE1BQU8sQ0FBRSxVQUFTLHFCQUdwQixzQkFDRSxFQUNBLEVBQ0EsQ0FDRSxZQUlhLENBQ2YsR0FBSSxFQUFtQixTQUFXLEVBQ2hDLE1BQU8sR0FDRixHQUFJLEVBQWlCLFNBQVcsRUFDckMsTUFBTyxHQUNGLEdBQUksRUFBaUIsT0FBUyxFQUFtQixPQUFRLENBQzlELE9BQVcsS0FBVSxHQUNuQixLQUFLLG1EQUFtRCxFQUFRLENBQzlELGFBR0osTUFBTyxPQUNGLENBQ0wsT0FBVyxLQUFVLEdBQ25CLEtBQUssbURBQW1ELEVBQVEsQ0FDOUQsYUFHSixNQUFPLElBSVgsMEJBQTBCLENBQ3hCLFlBR21CLENBQ25CLEdBQUksQ0FBQyxLQUFLLGNBQWEsS0FBVSxNQUFPLE1BRXhDLEdBQUksQ0FBQyxHQUFrQixLQUFLLE1BQU0sTUFDaEMsS0FBTSxNQUFLLE1BQU0sR0FBVyx1Q0FBd0MsQ0FDbEUsR0FBSSxLQUFLLE1BQU0sU0FDZixhQUlKLEdBQU0sQ0FBRSxTQUFVLEtBQUssTUFDdkIsWUFBSyxPQUdILElBQVUsV0FDVixJQUFVLFVBQ1YsSUFBVSxVQUNWLElBQVUsVUFFVixLQUFLLE1BQU0sR0FBVyx3QkFBeUIsQ0FDN0MsR0FBSSxLQUFLLE1BQU0sU0FDZixXQUNBLGdCQUFpQixJQUlkLEVBR1QsYUFBYSxFQUFzQixFQUFvQixDQUNyRCxHQUFNLEdBQVcsRUFBRyxLQUNkLEVBQVUsRUFBRyxJQUFJLE1BQ2pCLEVBQWUsS0FBSywwQkFBMEIsQ0FBRSxhQUN0RCxLQUFLLE9BQU0sR0FDWCxHQUFNLENBQUUsVUFBUyxxQkFBc0IsS0FBSyxnQkFBZ0IsQ0FDMUQsV0FDQSxpQkFJRixPQUZBLEVBQUssa0JBQW9CLEVBRWpCLE9BQ0QsVUFDSCxTQUFLLGFBQWUsR0FDcEIsRUFBSyxRQUFVLEVBQVEsZUFDdkIsS0FBSyxPQUFNLEdBQ0osS0FBSyxXQUFXLEVBQU0sdUJBQzFCLFNBQ0gsU0FBSyxhQUFlLEdBQ3BCLEVBQUssUUFBVSxFQUFRLGNBQ3ZCLEtBQUssT0FBTSxHQUNKLEtBQUssV0FBVyxFQUFNLHNCQUMxQixTQUNILFNBQUssYUFBZSxHQUNwQixFQUFLLFFBQVUsS0FBSyxzQkFDbEIsRUFBUSxjQUNSLEVBQVEsaUJBQ1IsQ0FBRSxhQUVKLEtBQUssT0FBTSxHQUNKLEtBQUssV0FBVyxFQUFNLHNCQUMxQixTQUNILFNBQUssUUFBVSxFQUFRLGlCQUN2QixLQUFLLE9BQU0sR0FDSixLQUFLLFdBQVcsRUFBTSwwQkFDdEIsQ0FFUCxHQUFNLEdBQVEsSUFDWixHQUFLLFFBQVUsR0FDZixLQUFLLE9BQU0sR0FDSixLQUFLLFdBQVcsRUFBTSxtQkFFL0IsRUFBSyxhQUFlLEdBRXBCLEdBQU0sR0FBVyxFQUFRLGVBQWUsT0FDbEMsRUFBVSxFQUFRLGNBQWMsT0FDaEMsRUFBVSxFQUFRLGNBQWMsT0FDaEMsRUFBZSxFQUFRLGlCQUFpQixPQUU5QyxHQUFJLENBQUMsR0FBWSxDQUFDLEdBQVcsQ0FBQyxHQUFXLENBQUMsRUFDeEMsTUFBTyxLQUNGLEdBQUksQ0FBQyxHQUFZLENBQUMsRUFDdkIsU0FBSyxRQUFVLEtBQUssc0JBQ2xCLEVBQVEsY0FDUixFQUFRLGlCQUNSLENBQUUsYUFFSixLQUFLLE9BQU0sR0FDSixLQUFLLFdBQVcsRUFBTSxrQkFDeEIsR0FBSSxDQUFDLEdBQVcsQ0FBQyxHQUFXLEdBQVksRUFBYyxDQUMzRCxPQUFXLEtBQVUsR0FBUSxpQkFDM0IsS0FBSyx5Q0FBeUMsRUFBTyxJQUFJLE1BQU8sQ0FDOUQsV0FDQSxXQUFZLEVBQU8sR0FBRyxPQUcxQixTQUFLLFFBQVUsRUFBUSxlQUN2QixLQUFLLE9BQU0sR0FDSixLQUFLLFdBQVcsRUFBTSwyQkFDcEIsQ0FBQyxHQUFZLENBQUMsR0FBVyxHQUFXLEVBQWMsQ0FDM0QsT0FBVyxLQUFVLEdBQVEsaUJBQzNCLEtBQUssd0NBQXdDLEVBQU8sSUFBSSxNQUFPLENBQzdELFdBQ0EsV0FBWSxFQUFPLEdBQUcsT0FHMUIsU0FBSyxRQUFVLEVBQVEsY0FDdkIsS0FBSyxPQUFNLEdBQ0osS0FBSyxXQUFXLEVBQU0sc0JBRTdCLGFBQUssTUFBTSxHQUFXLDZCQUE4QixDQUNsRCxHQUFJLEVBQ0osYUFFSyxNQU1mLHlCQUF5QixFQUE4QixDQUNyRCxHQUFNLEdBQUssS0FBSyxrQkFDaEIsU0FBSyxHQUFLLEVBQ1YsRUFBSyxLQUFPLEtBQUssYUFBYSxLQUFLLFlBQWEsR0FDekMsS0FBSyxXQUFXLEVBQU0sbUJBSS9CLHFCQUErQixDQUM3QixHQUFNLEdBQU8sS0FBSyxpQkFDbEIsR0FBSSxLQUFLLE1BQU0sV0FBVyxLQUFLLEdBQXlCLENBQ3RELEdBQU0sR0FBWSxLQUFLLE1BQU0sV0FBVyxFQUFPLEdBQy9DLE1BQ0UsS0FBUyxJQUEyQixJQUFnQyxHQUd4RSxNQUFPLEdBR1QsOEJBQThCLEVBQWMsQ0FDMUMsTUFBTyxHQUFLLE9BQVMscUJBQXVCLEVBQUssV0FBYSxJQzdzSDlELEdBR0YsQ0FDRixVQUFXLEtBQ1gsS0FBTSxJQUNOLElBQUssSUFDTCxLQUFNLElBQ04sR0FBSSxJQUNKLEdBQUksSUFDSixLQUFNLE9BQ04sTUFBTyxPQUNQLEtBQU0sT0FDTixNQUFPLE9BQ1AsT0FBUSxPQUNSLElBQUssT0FDTCxPQUFRLE9BQ1IsS0FBTSxPQUNOLElBQUssT0FDTCxLQUFNLE9BQ04sS0FBTSxPQUNOLE1BQU8sT0FDUCxJQUFLLE9BQ0wsSUFBSyxPQUNMLElBQUssT0FDTCxLQUFNLE9BQ04sSUFBSyxPQUNMLE9BQVEsT0FDUixLQUFNLE9BQ04sS0FBTSxPQUNOLE1BQU8sT0FDUCxNQUFPLE9BQ1AsS0FBTSxPQUNOLE9BQVEsT0FDUixNQUFPLE9BQ1AsS0FBTSxPQUNOLEtBQU0sT0FDTixNQUFPLE9BQ1AsT0FBUSxPQUNSLE9BQVEsT0FDUixPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixPQUFRLE9BQ1IsTUFBTyxPQUNQLE9BQVEsT0FDUixLQUFNLE9BQ04sTUFBTyxPQUNQLE1BQU8sT0FDUCxPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsS0FBTSxPQUNOLE9BQVEsT0FDUixPQUFRLE9BQ1IsTUFBTyxPQUNQLEtBQU0sT0FDTixJQUFLLE9BQ0wsT0FBUSxPQUNSLE9BQVEsT0FDUixPQUFRLE9BQ1IsTUFBTyxPQUNQLE9BQVEsT0FDUixLQUFNLE9BQ04sTUFBTyxPQUNQLE9BQVEsT0FDUixPQUFRLE9BQ1IsT0FBUSxPQUNSLE1BQU8sT0FDUCxLQUFNLE9BQ04sT0FBUSxPQUNSLE1BQU8sT0FDUCxNQUFPLE9BQ1AsT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsT0FBUSxPQUNSLEtBQU0sT0FDTixNQUFPLE9BQ1AsTUFBTyxPQUNQLE9BQVEsT0FDUixPQUFRLE9BQ1IsT0FBUSxPQUNSLE1BQU8sT0FDUCxLQUFNLE9BQ04sT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsS0FBTSxPQUNOLElBQUssT0FDTCxPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsT0FBUSxPQUNSLEtBQU0sT0FDTixPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixPQUFRLE9BQ1IsTUFBTyxPQUNQLEtBQU0sT0FDTixPQUFRLE9BQ1IsTUFBTyxPQUNQLEtBQU0sT0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE9BQVEsU0FDUixPQUFRLFNBQ1IsS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxRQUFTLFNBQ1QsS0FBTSxTQUNOLElBQUssU0FDTCxNQUFPLFNBQ1AsS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsR0FBSSxTQUNKLEdBQUksU0FDSixHQUFJLFNBQ0osUUFBUyxTQUNULEdBQUksU0FDSixJQUFLLFNBQ0wsTUFBTyxTQUNQLElBQUssU0FDTCxRQUFTLFNBQ1QsSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxRQUFTLFNBQ1QsS0FBTSxTQUNOLElBQUssU0FDTCxNQUFPLFNBQ1AsS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsR0FBSSxTQUNKLEdBQUksU0FDSixHQUFJLFNBQ0osUUFBUyxTQUNULEdBQUksU0FDSixJQUFLLFNBQ0wsT0FBUSxTQUNSLE1BQU8sU0FDUCxJQUFLLFNBQ0wsUUFBUyxTQUNULElBQUssU0FDTCxJQUFLLFNBQ0wsSUFBSyxTQUNMLE1BQU8sU0FDUCxTQUFVLFNBQ1YsTUFBTyxTQUNQLElBQUssU0FDTCxLQUFNLFNBQ04sS0FBTSxTQUNOLE9BQVEsU0FDUixLQUFNLFNBQ04sSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsTUFBTyxTQUNQLE1BQU8sU0FDUCxNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxPQUFRLFNBQ1IsT0FBUSxTQUNSLEtBQU0sU0FDTixPQUFRLFNBQ1IsT0FBUSxTQUNSLE1BQU8sU0FDUCxNQUFPLFNBQ1AsT0FBUSxTQUNSLE9BQVEsU0FDUixNQUFPLFNBQ1AsTUFBTyxTQUNQLEtBQU0sU0FDTixNQUFPLFNBQ1AsT0FBUSxTQUNSLEtBQU0sU0FDTixNQUFPLFNBQ1AsUUFBUyxTQUNULEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sTUFBTyxTQUNQLEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sT0FBUSxTQUNSLEtBQU0sU0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLEdBQUksU0FDSixLQUFNLFNBQ04sSUFBSyxTQUNMLE1BQU8sU0FDUCxPQUFRLFNBQ1IsTUFBTyxTQUNQLEtBQU0sU0FDTixNQUFPLFNBQ1AsSUFBSyxTQUNMLElBQUssU0FDTCxHQUFJLFNBQ0osSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsT0FBUSxTQUNSLElBQUssU0FDTCxLQUFNLFNBQ04sTUFBTyxTQUNQLEdBQUksU0FDSixNQUFPLFNBQ1AsR0FBSSxTQUNKLEdBQUksU0FDSixJQUFLLFNBQ0wsSUFBSyxTQUNMLEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsS0FBTSxTQUNOLEtBQU0sU0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE9BQVEsU0FDUixPQUFRLFNBQ1IsS0FBTSxTQUNOLEtBQU0sU0FDTixJQUFLLFNBQ0wsT0FBUSxTQUNSLE1BQU8sU0FD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QUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssRUFBRSxNQUV0OUMsR0FBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FB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QUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUNBLEdBQUEsSUFBQSxLQUFBLE9BQUEsS0FBQSxJQUFBLFFBQUEsU0FBQSxFQUFBLENBQUEsQUFBQSxJQUFBLFdBQUEsSUFBQSxjQUFBLE9BQUEsVUFBQSxlQUFBLEtBQUEsR0FBQSxJQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsR0FBQSxJQUFBLE9BQUEsZUFBQSxFQUFBLEVBQUEsQ0FBQSxXQUFBLEdBQUEsSUFBQSxVQUFBLENBQUEsTUFBQSxJQUFBLFFBR0EsR0FBQSxJQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUdBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FHQSxHQUFBLEtBQUEsT0FBQSxLQUFBLElBQUEsUUFBQSxTQUFBLEVBQUEsQ0FBQSxBQUFBLElBQUEsV0FBQSxJQUFBLGNBQUEsT0FBQSxVQUFBLGVBQUEsS0FBQSxHQUFBLElBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxHQUFBLElBQUEsT0FBQSxlQUFBLEVBQUEsRUFBQSxDQUFBLFdBQUEsR0FBQSxJQUFBLFVBQUEsQ0FBQSxNQUFBLElBQUEsUUFDQSxHQUFBLElBQUEsS0FBQSxPQUFBLEtBQUEsSUFBQSxRQUFBLFNBQUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUdBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUdBLEdBQUEsS0FBQSxPQUFBLEtBQUEsSUFBQSxRQUFBLFNBQUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUdBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUlBLEdBQUEsS0FDQSxHQUFBLEtBR0EsR0FBQSxLQUNBLEdBQUEsS0FHQSxHQUFBLEtBQ0EsT0FBQSxLQUFBLElBQUEsUUFBQSxTQUFBLEVBQUEsQ0FBQSxBQUFBLElBQUEsV0FBQSxJQUFBLGNBQUEsT0FBQSxVQUFBLGVBQUEsS0FBQSxHQUFBLElBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxHQUFBLElBQUEsT0FBQSxlQUFBLEVBQUEsRUFBQSxDQUFBLFdBQUEsR0FBQSxJQUFBLFVBQUEsQ0FBQSxNQUFBLElBQUEsUUFDQSxHQUFBLElBQUEsS0FHQSxHQUFBLEtBR0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUFBLE9BQUEsS0FBQSxJQUFBLFFBQUEsU0FBQSxFQUFBLENBQUEsQUFBQSxJQUFBLFdBQUEsSUFBQSxjQUFBLE9BQUEsVUFBQSxlQUFBLEtBQUEsR0FBQSxJQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsR0FBQSxJQUFBLE9B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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL0Blc2J1aWxkLXBsdWdpbnMvbm9kZS1nbG9iYWxzLXBvbHlmaWxsL192aXJ0dWFsLXByb2Nlc3MtcG9seWZpbGxfLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AZXNidWlsZC1wbHVnaW5zL25vZGUtZ2xvYmFscy1wb2x5ZmlsbC9CdWZmZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Blc2J1aWxkLXBsdWdpbnMvbm9kZS1nbG9iYWxzLXBvbHlmaWxsL19idWZmZXIuanMiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpmcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzLWNvbW1vbmpzOmZzIiwgIm5vZGUtbW9kdWxlcy1wb2x5ZmlsbHM6cGF0aCIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzLWNvbW1vbmpzOnBhdGgiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpidWZmZXIiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczpwcm9jZXNzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3BvbHlmaWxscy9pbmhlcml0cy5qcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzOnV0aWwiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxsczphc3NlcnQiLCAibm9kZS1tb2R1bGVzLXBvbHlmaWxscy1jb21tb25qczphc3NlcnQiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWV4cHJlc3Npb24vbm9kZV9tb2R1bGVzL2Fjb3JuL2Rpc3QvYWNvcm4uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWV4cHJlc3Npb24vaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFzLXByb3RvL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMvc3JjL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9jYWxsQm91bmQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy10b3N0cmluZ3RhZy9zaGFtcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1wYXJzZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1lcnJvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWxleGVyL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Rva2VuLXN0cmVhbS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLXBhcnNlci9saWIvaW5saW5lLXRhZ3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1wYXJzZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy13YWxrL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctbG9hZC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZG9uZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZmluYWxseS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9saWIvZXM2LWV4dGVuc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2FzYXAvYnJvd3Nlci1hc2FwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlL2xpYi9ub2RlLWV4dGVuc2lvbnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb21pc2UvbGliL3N5bmNocm9ub3VzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlL2xpYi9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtcHJvbWlzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvanN0cmFuc2Zvcm1lci9pbmRleC5qcyIsICJub2RlLW1vZHVsZXMtcG9seWZpbGxzOm9zIiwgIm5vZGUtbW9kdWxlcy1wb2x5ZmlsbHMtY29tbW9uanM6b3MiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2hvbWVkaXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2NhbGxlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcGF0aC1wYXJzZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcmVzb2x2ZS9saWIvbm9kZS1tb2R1bGVzLXBhdGhzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9ub3JtYWxpemUtb3B0aW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaXMtY29yZS1tb2R1bGUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Jlc29sdmUvbGliL2FzeW5jLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9pcy1jb3JlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2xpYi9zeW5jLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9yZXNvbHZlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctZmlsdGVycy9saWIvcnVuLWZpbHRlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9sb2NhdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2UtZXJyb3IvY3JlZGVudGlhbHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL21vZHVsZS1lcnJvcnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL3RvLW5vZGUtZGVzY3JpcHRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yL3N0YW5kYXJkLWVycm9ycy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2UtZXJyb3Ivc3RyaWN0LW1vZGUtZXJyb3JzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZS1lcnJvci9waXBlbGluZS1vcGVyYXRvci1lcnJvcnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlLWVycm9yLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL2VzdHJlZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdG9rZW5pemVyL2NvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3Rva2VuaXplci90eXBlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL2JhYmVsLWhlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllci9zcmMvaWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL2JhYmVsLWhlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllci9zcmMva2V5d29yZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy91dGlsL3Njb3BlZmxhZ3MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3V0aWwvc2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvZmxvdy9zY29wZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2VyL2Jhc2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9jb21tZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC93aGl0ZXNwYWNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy90b2tlbml6ZXIvc3RhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9iYWJlbC1oZWxwZXItc3RyaW5nLXBhcnNlci9zcmMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3Rva2VuaXplci9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9jbGFzcy1zY29wZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvdXRpbC9leHByZXNzaW9uLXNjb3BlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy91dGlsL3Byb2R1Y3Rpb24tcGFyYW1ldGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvdXRpbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGFyc2VyL25vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvZmxvdy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlci9zcmMvcGx1Z2lucy9qc3gveGh0bWwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvanN4L2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3R5cGVzY3JpcHQvc2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9sdmFsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3R5cGVzY3JpcHQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BsdWdpbnMvcGxhY2Vob2xkZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW5zL3Y4aW50cmluc2ljLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wbHVnaW4tdXRpbHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL29wdGlvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL3BhcnNlci9leHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvc3RhdGVtZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcGFyc2VyL3NyYy9wYXJzZXIvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wYXJzZXIvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3V0aWxzL3NoYWxsb3dFcXVhbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy91dGlscy9kZXByZWNhdGlvbldhcm5pbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9nZW5lcmF0ZWQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9tYXRjaGVzUGF0dGVybi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2J1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvcmVhY3QvaXNSZWFjdENvbXBvbmVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL3JlYWN0L2lzQ29tcGF0VGFnLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90by1mYXN0LXByb3BlcnRpZXMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1R5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1BsYWNlaG9sZGVyVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9pZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9rZXl3b3JkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzVmFsaWRJZGVudGlmaWVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLXN0cmluZy1wYXJzZXIvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnN0YW50cy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy91dGlscy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9jb3JlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2Zsb3cudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvZGVmaW5pdGlvbnMvanN4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL3BsYWNlaG9sZGVycy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9taXNjLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2V4cGVyaW1lbnRhbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy90eXBlc2NyaXB0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2RlZmluaXRpb25zL2RlcHJlY2F0ZWQtYWxpYXNlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9kZWZpbml0aW9ucy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL3ZhbGlkYXRlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3ZhbGlkYXRlTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9idWlsZGVycy9nZW5lcmF0ZWQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdXRpbHMvcmVhY3QvY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3JlYWN0L2J1aWxkQ2hpbGRyZW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc05vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvYXNzZXJ0cy9hc3NlcnROb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2Fzc2VydHMvZ2VuZXJhdGVkL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL2Zsb3cvY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvZmxvdy9yZW1vdmVUeXBlRHVwbGljYXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9idWlsZGVycy9mbG93L2NyZWF0ZUZsb3dVbmlvblR5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvbW9kaWZpY2F0aW9ucy90eXBlc2NyaXB0L3JlbW92ZVR5cGVEdXBsaWNhdGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2J1aWxkZXJzL3R5cGVzY3JpcHQvY3JlYXRlVFNVbmlvblR5cGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvYnVpbGRlcnMvZ2VuZXJhdGVkL3VwcGVyY2FzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jbG9uZS9jbG9uZU5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmVEZWVwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2Nsb25lL2Nsb25lRGVlcFdpdGhvdXRMb2MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY2xvbmUvY2xvbmVXaXRob3V0TG9jLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2FkZENvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2FkZENvbW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdXRpbHMvaW5oZXJpdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb21tZW50cy9pbmhlcml0SW5uZXJDb21tZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb21tZW50cy9pbmhlcml0TGVhZGluZ0NvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2luaGVyaXRUcmFpbGluZ0NvbW1lbnRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbW1lbnRzL2luaGVyaXRzQ29tbWVudHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29tbWVudHMvcmVtb3ZlQ29tbWVudHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29uc3RhbnRzL2dlbmVyYXRlZC9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvQmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy9lbnN1cmVCbG9jay50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvSWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvQmluZGluZ0lkZW50aWZpZXJOYW1lLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvdG9Db21wdXRlZEtleS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy90cmF2ZXJzZS90cmF2ZXJzZUZhc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvbW9kaWZpY2F0aW9ucy9yZW1vdmVQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXAudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy90b0tleUFsaWFzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9jb252ZXJ0ZXJzL3RvU2VxdWVuY2VFeHByZXNzaW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2NvbnZlcnRlcnMvdG9TdGF0ZW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvY29udmVydGVycy92YWx1ZVRvTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9tb2RpZmljYXRpb25zL2FwcGVuZFRvTWVtYmVyRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9tb2RpZmljYXRpb25zL2luaGVyaXRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL21vZGlmaWNhdGlvbnMvcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy9yZXRyaWV2ZXJzL2dldE91dGVyQmluZGluZ0lkZW50aWZpZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3RyYXZlcnNlL3RyYXZlcnNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNCaW5kaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNMZXQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc0Jsb2NrU2NvcGVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL3ZhbGlkYXRvcnMvaXNJbW11dGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc05vZGVzRXF1aXZhbGVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzUmVmZXJlbmNlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzU2NvcGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1NwZWNpZmllckRlZmF1bHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC90eXBlcy9zcmMvdmFsaWRhdG9ycy9pc1ZhbGlkRVMzSWRlbnRpZmllci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQGJhYmVsL3R5cGVzL3NyYy92YWxpZGF0b3JzL2lzVmFyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMvc3JjL2luZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb25zdGFudGlub3BsZS9saWIvYmluYXJ5T3BlcmF0aW9uLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb25zdGFudGlub3BsZS9saWIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1maWx0ZXJzL2xpYi9oYW5kbGUtZmlsdGVycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWZpbHRlcnMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1saW5rZXIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2RvY3R5cGVzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvZGVwZW5kZW5jaWVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvaW50ZXJuYWxzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS9saWIvc291cmNlcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLXJ1bnRpbWUvYnVpbGQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1ydW50aW1lL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9qcy1zdHJpbmdpZnkvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3B1Zy1hdHRycy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtd2Fsay9zcmMvZXhwbG9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtd2Fsay9zcmMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC1uZXZlci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvd2l0aC9zcmMvcmVmZXJlbmNlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy93aXRoL3NyYy9nbG9iYWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy93aXRoL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHVnLWNvZGUtZ2VuL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWctcnVudGltZS93cmFwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wdWcvbGliL2luZGV4LmpzIiwgIi4uLy4uL3ZlbmRvcl9tb2R1bGVzL2ltcG9ydHMvcHVnLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpXG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJylcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dFxudmFyIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXRcbmlmICh0eXBlb2YgZ2xvYmFsLnNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dFxufVxuaWYgKHR5cGVvZiBnbG9iYWwuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0XG59XG5cbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMClcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoXG4gICAgICAgIChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJlxuICAgICAgICBzZXRUaW1lb3V0XG4gICAgKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpXG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoXG4gICAgICAgIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiZcbiAgICAgICAgY2xlYXJUaW1lb3V0XG4gICAgKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dFxuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcilcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpXG4gICAgICAgIH1cbiAgICB9XG59XG52YXIgcXVldWUgPSBbXVxudmFyIGRyYWluaW5nID0gZmFsc2VcbnZhciBjdXJyZW50UXVldWVcbnZhciBxdWV1ZUluZGV4ID0gLTFcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZVxuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTFcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKClcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKVxuICAgIGRyYWluaW5nID0gdHJ1ZVxuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aFxuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWVcbiAgICAgICAgcXVldWUgPSBbXVxuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xXG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aFxuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsXG4gICAgZHJhaW5pbmcgPSBmYWxzZVxuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KVxufVxuZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSlcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpXG4gICAgfVxufVxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW5cbiAgICB0aGlzLmFycmF5ID0gYXJyYXlcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpXG59XG52YXIgdGl0bGUgPSAnYnJvd3NlcidcbnZhciBwbGF0Zm9ybSA9ICdicm93c2VyJ1xudmFyIGJyb3dzZXIgPSB0cnVlXG52YXIgZW52ID0ge31cbnZhciBhcmd2ID0gW11cbnZhciB2ZXJzaW9uID0gJycgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnZhciB2ZXJzaW9ucyA9IHt9XG52YXIgcmVsZWFzZSA9IHt9XG52YXIgY29uZmlnID0ge31cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBvbiA9IG5vb3BcbnZhciBhZGRMaXN0ZW5lciA9IG5vb3BcbnZhciBvbmNlID0gbm9vcFxudmFyIG9mZiA9IG5vb3BcbnZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3BcbnZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wXG52YXIgZW1pdCA9IG5vb3BcblxuZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpXG59XG5cbmZ1bmN0aW9uIGN3ZCgpIHtcbiAgICByZXR1cm4gJy8nXG59XG5mdW5jdGlvbiBjaGRpcihkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpXG59XG5mdW5jdGlvbiB1bWFzaygpIHtcbiAgICByZXR1cm4gMFxufVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbC5wZXJmb3JtYW5jZSB8fCB7fVxudmFyIHBlcmZvcm1hbmNlTm93ID1cbiAgICBwZXJmb3JtYW5jZS5ub3cgfHxcbiAgICBwZXJmb3JtYW5jZS5tb3pOb3cgfHxcbiAgICBwZXJmb3JtYW5jZS5tc05vdyB8fFxuICAgIHBlcmZvcm1hbmNlLm9Ob3cgfHxcbiAgICBwZXJmb3JtYW5jZS53ZWJraXROb3cgfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgfVxuXG4vLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSAqIDFlLTNcbiAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKVxuICAgIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoKGNsb2NrdGltZSAlIDEpICogMWU5KVxuICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgICAgICBzZWNvbmRzID0gc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzBdXG4gICAgICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXVxuICAgICAgICBpZiAobmFub3NlY29uZHMgPCAwKSB7XG4gICAgICAgICAgICBzZWNvbmRzLS1cbiAgICAgICAgICAgIG5hbm9zZWNvbmRzICs9IDFlOVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbc2Vjb25kcywgbmFub3NlY29uZHNdXG59XG5cbnZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKVxuICAgIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZVxuICAgIHJldHVybiBkaWYgLyAxMDAwXG59XG5cbmV4cG9ydCB2YXIgcHJvY2VzcyA9IHtcbiAgICBuZXh0VGljazogbmV4dFRpY2ssXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIGJyb3dzZXI6IGJyb3dzZXIsXG4gICAgZW52OiBlbnYsXG4gICAgYXJndjogYXJndixcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgIHZlcnNpb25zOiB2ZXJzaW9ucyxcbiAgICBvbjogb24sXG4gICAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICAgIG9uY2U6IG9uY2UsXG4gICAgb2ZmOiBvZmYsXG4gICAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICAgIHJlbW92ZUFsbExpc3RlbmVyczogcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICAgIGVtaXQ6IGVtaXQsXG4gICAgYmluZGluZzogYmluZGluZyxcbiAgICBjd2Q6IGN3ZCxcbiAgICBjaGRpcjogY2hkaXIsXG4gICAgdW1hc2s6IHVtYXNrLFxuICAgIGhydGltZTogaHJ0aW1lLFxuICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSxcbiAgICByZWxlYXNlOiByZWxlYXNlLFxuICAgIGNvbmZpZzogY29uZmlnLFxuICAgIHVwdGltZTogdXB0aW1lLFxufVxuXG4vLyByZXBsYWNlIHByb2Nlc3MuZW52LlZBUiB3aXRoIGRlZmluZVxuXG5jb25zdCBkZWZpbmVzID0ge1xuICBcImVudi5OT0RFX0VOVlwiOiBcInByb2R1Y3Rpb25cIixcbn1cbk9iamVjdC5rZXlzKGRlZmluZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoJy4nKVxuICAgIGxldCB0YXJnZXQgPSBwcm9jZXNzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlZyA9IHNlZ3NbaV1cbiAgICAgICAgaWYgKGkgPT09IHNlZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0W3NlZ10gPSBkZWZpbmVzW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtzZWddIHx8ICh0YXJnZXRbc2VnXSA9IHt9KVxuICAgICAgICB9XG4gICAgfVxufSlcbiIsICIvLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jYWx2aW5tZXRjYWxmL2J1ZmZlci1lczZcblxuLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcbnZhciBpbml0ZWQgPSBmYWxzZVxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBpbml0ZWQgPSB0cnVlXG4gICAgdmFyIGNvZGUgPVxuICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gICAgICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxuICAgIH1cblxuICAgIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxuICAgIHJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xufVxuXG5mdW5jdGlvbiBiYXNlNjR0b0J5dGVBcnJheShiNjQpIHtcbiAgICBpZiAoIWluaXRlZCkge1xuICAgICAgICBpbml0KClcbiAgICB9XG4gICAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gICAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gICAgfVxuXG4gICAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gICAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gICAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gICAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICAgIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcblxuICAgIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICAgIGFyciA9IG5ldyBBcnIoKGxlbiAqIDMpIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICAgIHZhciBMID0gMFxuXG4gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgICAgICB0bXAgPVxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgICAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgICAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweGZmXG4gICAgICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4ZmZcbiAgICAgICAgYXJyW0wrK10gPSB0bXAgJiAweGZmXG4gICAgfVxuXG4gICAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgICAgICB0bXAgPVxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgICAgIGFycltMKytdID0gdG1wICYgMHhmZlxuICAgIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgICAgIHRtcCA9XG4gICAgICAgICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgICAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgICAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweGZmXG4gICAgICAgIGFycltMKytdID0gdG1wICYgMHhmZlxuICAgIH1cblxuICAgIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIGxvb2t1cFsobnVtID4+IDE4KSAmIDB4M2ZdICtcbiAgICAgICAgbG9va3VwWyhudW0gPj4gMTIpICYgMHgzZl0gK1xuICAgICAgICBsb29rdXBbKG51bSA+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgbG9va3VwW251bSAmIDB4M2ZdXG4gICAgKVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayh1aW50OCwgc3RhcnQsIGVuZCkge1xuICAgIHZhciB0bXBcbiAgICB2YXIgb3V0cHV0ID0gW11cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgICAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArIHVpbnQ4W2kgKyAyXVxuICAgICAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRmcm9tQnl0ZUFycmF5KHVpbnQ4KSB7XG4gICAgaWYgKCFpbml0ZWQpIHtcbiAgICAgICAgaW5pdCgpXG4gICAgfVxuICAgIHZhciB0bXBcbiAgICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gICAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gICAgdmFyIG91dHB1dCA9ICcnXG4gICAgdmFyIHBhcnRzID0gW11cbiAgICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAgIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBlbmNvZGVDaHVuayhcbiAgICAgICAgICAgICAgICB1aW50OCxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGkgKyBtYXhDaHVua0xlbmd0aCA+IGxlbjIgPyBsZW4yIDogaSArIG1heENodW5rTGVuZ3RoLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgICAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNmXVxuICAgICAgICBvdXRwdXQgKz0gJz09J1xuICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgICAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgICAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzZl1cbiAgICAgICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzZl1cbiAgICAgICAgb3V0cHV0ICs9ICc9J1xuICAgIH1cblxuICAgIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG5cbnZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID1cbiAgICBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgOiB0cnVlXG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGgoKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID8gMHg3ZmZmZmZmZiA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aCkge1xuICAgIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgICB9XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgICAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgICAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB9XG5cbiAgICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGNhc2UuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gICAgfVxuICAgIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbihhcnIpIHtcbiAgICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICAgIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICAgIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXJcbiAgICApIHtcbiAgICAgICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICAgICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgICAgLy8gICB2YWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgLy8gfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gICAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYWxsb2ModGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpXG4gICAgaWYgKHNpemUgPD0gMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gICAgfVxuICAgIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAgICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgICAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24oc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlKHRoYXQsIHNpemUpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICB0aGF0W2ldID0gMFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gICAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgICAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgICAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICAgICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICAgIH1cblxuICAgIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgICB9XG4gICAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHNcIilcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kc1wiKVxuICAgIH1cblxuICAgIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICAgIH1cblxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICAgICAgdGhhdCA9IGFycmF5XG4gICAgICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICAgICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gICAgfVxuICAgIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QodGhhdCwgb2JqKSB7XG4gICAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgICAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICAgICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICAgICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhhdFxuICAgICAgICB9XG5cbiAgICAgICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIGlmIChvYmopIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAgICAgICAnbGVuZ3RoJyBpbiBvYmpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicsXG4gICAgKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkKGxlbmd0aCkge1xuICAgIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAgIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICAgIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArXG4gICAgICAgICAgICAgICAga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArXG4gICAgICAgICAgICAgICAgJyBieXRlcycsXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNsb3dCdWZmZXIobGVuZ3RoKSB7XG4gICAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgIGxlbmd0aCA9IDBcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuQnVmZmVyLmlzQnVmZmVyID0gaXNCdWZmZXJcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIoYikge1xuICAgIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGEpIHx8ICFpbnRlcm5hbElzQnVmZmVyKGIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICAgIH1cblxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gICAgdmFyIHggPSBhLmxlbmd0aFxuICAgIHZhciB5ID0gYi5sZW5ndGhcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgICAgICB4ID0gYVtpXVxuICAgICAgICAgICAgeSA9IGJbaV1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICAgIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KGxpc3QsIGxlbmd0aCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gICAgfVxuXG4gICAgdmFyIGlcbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgICB2YXIgcG9zID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgICAgICB9XG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykge1xuICAgIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gICAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5cbiAgICAgICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAgIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAgIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAwXG4gICAgfVxuICAgIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gICAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAoZW5kIDw9IDApIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgICBlbmQgPj4+PSAwXG4gICAgc3RhcnQgPj4+PSAwXG5cbiAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwKGIsIG4sIG0pIHtcbiAgICB2YXIgaSA9IGJbbl1cbiAgICBiW25dID0gYlttXVxuICAgIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2KCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICAgIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICAgICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgICAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICAgICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoYikge1xuICAgIGlmICghaW50ZXJuYWxJc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gICAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShcbiAgICB0YXJnZXQsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHRoaXNTdGFydCxcbiAgICB0aGlzRW5kLFxuKSB7XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnQgPSAwXG4gICAgfVxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICAgIH1cbiAgICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1N0YXJ0ID0gMFxuICAgIH1cbiAgICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgc3RhcnQgPCAwIHx8XG4gICAgICAgIGVuZCA+IHRhcmdldC5sZW5ndGggfHxcbiAgICAgICAgdGhpc1N0YXJ0IDwgMCB8fFxuICAgICAgICB0aGlzRW5kID4gdGhpcy5sZW5ndGhcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH1cbiAgICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICB9XG5cbiAgICBzdGFydCA+Pj49IDBcbiAgICBlbmQgPj4+PSAwXG4gICAgdGhpc1N0YXJ0ID4+Pj0gMFxuICAgIHRoaXNFbmQgPj4+PSAwXG5cbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gICAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gICAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICAgIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gICAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gICAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICAgICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgICAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgICBpZiAoeSA8IHgpIHJldHVybiAxXG4gICAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAgIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAgIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gICAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICAgICAgYnl0ZU9mZnNldCA9IDBcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICAgICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gICAgfVxuICAgIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICAgIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgICAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICAgICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiBidWZmZXIubGVuZ3RoIC0gMVxuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gICAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgICAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICAgICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICAgICAgZWxzZSByZXR1cm4gLTFcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdmFsXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgICBpZiAoaW50ZXJuYWxJc0J1ZmZlcih2YWwpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YWwgPSB2YWwgJiAweGZmIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGRpcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICAgIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbmNvZGluZyA9PT0gJ3VjczInIHx8XG4gICAgICAgICAgICBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fFxuICAgICAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYtMTZsZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgICAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICAgICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkKGJ1ZiwgaSkge1xuICAgICAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmW2ldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlcbiAgICBpZiAoZGlyKSB7XG4gICAgICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVhZChhcnIsIGkpID09PVxuICAgICAgICAgICAgICAgIHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICAgICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpXG4gICAgICAgICAgICBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gICAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICAgIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gICAgfVxuICAgIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcihcbiAgICAgICAgdXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSxcbiAgICAgICAgYnVmLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGxlbmd0aCxcbiAgICApXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoXG4gICAgICAgIHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksXG4gICAgICAgIGJ1ZixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBsZW5ndGgsXG4gICAgKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgICAgICBvZmZzZXQgPSAwXG4gICAgICAgIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICAgICAgb2Zmc2V0ID0gMFxuICAgICAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICAgIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJyxcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gICAgaWYgKFxuICAgICAgICAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8XG4gICAgICAgIG9mZnNldCA+IHRoaXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gICAgfVxuXG4gICAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICAgIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gICAgZm9yICg7Oykge1xuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAobG93ZXJlZENhc2UpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdCdWZmZXInLFxuICAgICAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMCksXG4gICAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBiYXNlNjRmcm9tQnl0ZUFycmF5KGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYmFzZTY0ZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICAgIHZhciByZXMgPSBbXVxuXG4gICAgdmFyIGkgPSBzdGFydFxuICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICAgICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICAgICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPVxuICAgICAgICAgICAgZmlyc3RCeXRlID4gMHhlZlxuICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgIDogZmlyc3RCeXRlID4gMHhkZlxuICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgIDogZmlyc3RCeXRlID4gMHhiZlxuICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgIDogMVxuXG4gICAgICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4YzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZpcnN0Qnl0ZSAmIDB4MWYpIDw8IDB4NikgfCAoc2Vjb25kQnl0ZSAmIDB4M2YpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZEJ5dGUgJiAweGMwKSA9PT0gMHg4MCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXJkQnl0ZSAmIDB4YzApID09PSAweDgwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmaXJzdEJ5dGUgJiAweGYpIDw8IDB4YykgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2Vjb25kQnl0ZSAmIDB4M2YpIDw8IDB4NikgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlyZEJ5dGUgJiAweDNmKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPiAweDdmZiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wQ29kZVBvaW50IDwgMHhkODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweGRmZmYpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZEJ5dGUgJiAweGMwKSA9PT0gMHg4MCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXJkQnl0ZSAmIDB4YzApID09PSAweDgwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZm91cnRoQnl0ZSAmIDB4YzApID09PSAweDgwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmaXJzdEJ5dGUgJiAweGYpIDw8IDB4MTIpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNlY29uZEJ5dGUgJiAweDNmKSA8PCAweGMpIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRoaXJkQnl0ZSAmIDB4M2YpIDw8IDB4NikgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3VydGhCeXRlICYgMHgzZilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID4gMHhmZmZmICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDB4ZmZmZFxuICAgICAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgICAgICAgcmVzLnB1c2goKChjb2RlUG9pbnQgPj4+IDEwKSAmIDB4M2ZmKSB8IDB4ZDgwMClcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDB4ZGMwMCB8IChjb2RlUG9pbnQgJiAweDNmZilcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICAgICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheShjb2RlUG9pbnRzKSB7XG4gICAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gICAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgICB9XG5cbiAgICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgdmFyIHJlcyA9ICcnXG4gICAgdmFyIGkgPSAwXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICAgICAgICBTdHJpbmcsXG4gICAgICAgICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIChpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSksXG4gICAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByZXQgPSAnJ1xuICAgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N2YpXG4gICAgfVxuICAgIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHJldCA9ICcnXG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gICAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gICAgdmFyIG91dCA9ICcnXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgICB9XG4gICAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgdmFyIHJlcyA9ICcnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICAgIHN0YXJ0ID0gfn5zdGFydFxuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgKz0gbGVuXG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICAgICAgc3RhcnQgPSBsZW5cbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuXG4gICAgICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gICAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICAgICAgZW5kID0gbGVuXG4gICAgfVxuXG4gICAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gICAgdmFyIG5ld0J1ZlxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICAgICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgICAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0KG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgICBpZiAob2Zmc2V0ICUgMSAhPT0gMCB8fCBvZmZzZXQgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUoXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBpID0gMFxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFKFxuICAgIG9mZnNldCxcbiAgICBieXRlTGVuZ3RoLFxuICAgIG5vQXNzZXJ0LFxuKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgICB9XG5cbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gICAgdmFyIG11bCA9IDFcbiAgICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICAgIH1cblxuICAgIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHwgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDBcbiAgICApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgdGhpc1tvZmZzZXRdICogMHgxMDAwMDAwICtcbiAgICAgICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8ICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAzXSlcbiAgICApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBpID0gMFxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gICAgfVxuICAgIG11bCAqPSAweDgwXG5cbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICAgIH1cbiAgICBtdWwgKj0gMHg4MFxuXG4gICAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICAgIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICAgIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gdGhpc1tvZmZzZXRdXG4gICAgcmV0dXJuICgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gICAgcmV0dXJuIHZhbCAmIDB4ODAwMCA/IHZhbCB8IDB4ZmZmZjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICAgIHJldHVybiB2YWwgJiAweDgwMDAgPyB2YWwgfCAweGZmZmYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICAgIHJldHVybiAoXG4gICAgICAgIHRoaXNbb2Zmc2V0XSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG4gICAgKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgICByZXR1cm4gKFxuICAgICAgICAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXVxuICAgIClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiBpZWVlNzU0cmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIGllZWU3NTRyZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgICByZXR1cm4gaWVlZTc1NHJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIGllZWU3NTRyZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUoXG4gICAgdmFsdWUsXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gICAgfVxuXG4gICAgdmFyIG11bCA9IDFcbiAgICB2YXIgaSA9IDBcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmZcbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4ZmZcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUoXG4gICAgdmFsdWUsXG4gICAgb2Zmc2V0LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gICAgfVxuXG4gICAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICAgIHZhciBtdWwgPSAxXG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4ZmZcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID1cbiAgICAgICAgICAgICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAgICAgICAoKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4KVxuICAgIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDhcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMihidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICAgIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAoKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSkgJiAweGZmXG4gICAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBieXRlTGVuZ3RoLFxuICAgIG5vQXNzZXJ0LFxuKSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gICAgfVxuXG4gICAgdmFyIGkgPSAwXG4gICAgdmFyIG11bCA9IDFcbiAgICB2YXIgc3ViID0gMFxuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICAgICAgICBzdWIgPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YikgJiAweGZmXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgYnl0ZUxlbmd0aCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgICB2YXIgbXVsID0gMVxuICAgIHZhciBzdWIgPSAwXG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhmZlxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgICAgICAgc3ViID0gMVxuICAgICAgICB9XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIpICYgMHhmZlxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gICAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZlxuICAgIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWVcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmZcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiA4XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4ZmZcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZVxuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmXG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gOFxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDE2XG4gICAgICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjRcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlXG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjRcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiAxNlxuICAgICAgICB0aGlzW29mZnNldCArIDJdID0gdmFsdWUgPj4+IDhcbiAgICAgICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZlxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICAgIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICAgIGNoZWNrSUVFRTc1NChcbiAgICAgICAgICAgIGJ1ZixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgNCxcbiAgICAgICAgICAgIDMuNDAyODIzNDY2Mzg1Mjg4NmUzOCxcbiAgICAgICAgICAgIC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgsXG4gICAgICAgIClcbiAgICB9XG4gICAgaWVlZTc1NHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgICBjaGVja0lFRUU3NTQoXG4gICAgICAgICAgICBidWYsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIDgsXG4gICAgICAgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LFxuICAgICAgICAgICAgLTEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsXG4gICAgICAgIClcbiAgICB9XG4gICAgaWVlZTc1NHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFKFxuICAgIHZhbHVlLFxuICAgIG9mZnNldCxcbiAgICBub0Fzc2VydCxcbikge1xuICAgIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRShcbiAgICB2YWx1ZSxcbiAgICBvZmZzZXQsXG4gICAgbm9Bc3NlcnQsXG4pIHtcbiAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICAgIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICAgIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gICAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gICAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gICAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gICAgfVxuICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAgIC8vIEFyZSB3ZSBvb2I/XG4gICAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgICAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICAgIH1cblxuICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICAgIHZhciBpXG5cbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAgICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgICAgICAgdGFyZ2V0U3RhcnQsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gICAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgICAgICAgIHN0YXJ0ID0gMFxuICAgICAgICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgICAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgdmFsID0gY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFsID0gdmFsICYgMjU1XG4gICAgfVxuXG4gICAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICAgIH1cblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gICAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICAgIHZhciBpXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgICAgICAgPyB2YWxcbiAgICAgICAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4oc3RyKSB7XG4gICAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gICAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAgIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAgIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICAgIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIgKyAnPSdcbiAgICB9XG4gICAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltKHN0cikge1xuICAgIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleChuKSB7XG4gICAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gICAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHtcbiAgICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gICAgdmFyIGNvZGVQb2ludFxuICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gICAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gICAgdmFyIGJ5dGVzID0gW11cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgICAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweGQ3ZmYgJiYgY29kZVBvaW50IDwgMHhlMDAwKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhkYmZmKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhlZiwgMHhiZiwgMHhiZClcbiAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgICAgIGNvZGVQb2ludCA9XG4gICAgICAgICAgICAgICAgKCgobGVhZFN1cnJvZ2F0ZSAtIDB4ZDgwMCkgPDwgMTApIHwgKGNvZGVQb2ludCAtIDB4ZGMwMCkpICtcbiAgICAgICAgICAgICAgICAweDEwMDAwXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4ZWYsIDB4YmYsIDB4YmQpXG4gICAgICAgIH1cblxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgICAgIC8vIGVuY29kZSB1dGY4XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goKGNvZGVQb2ludCA+PiAweDYpIHwgMHhjMCwgKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MClcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgICAgICAgICAgKGNvZGVQb2ludCA+PiAweGMpIHwgMHhlMCxcbiAgICAgICAgICAgICAgICAoKGNvZGVQb2ludCA+PiAweDYpICYgMHgzZikgfCAweDgwLFxuICAgICAgICAgICAgICAgIChjb2RlUG9pbnQgJiAweDNmKSB8IDB4ODAsXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgICAgICAgICAoY29kZVBvaW50ID4+IDB4MTIpIHwgMHhmMCxcbiAgICAgICAgICAgICAgICAoKGNvZGVQb2ludCA+PiAweGMpICYgMHgzZikgfCAweDgwLFxuICAgICAgICAgICAgICAgICgoY29kZVBvaW50ID4+IDB4NikgJiAweDNmKSB8IDB4ODAsXG4gICAgICAgICAgICAgICAgKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMoc3RyKSB7XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZilcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzdHIsIHVuaXRzKSB7XG4gICAgdmFyIGMsIGhpLCBsb1xuICAgIHZhciBieXRlQXJyYXkgPSBbXVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgICAgICBoaSA9IGMgPj4gOFxuICAgICAgICBsbyA9IGMgJSAyNTZcbiAgICAgICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICAgIH1cblxuICAgIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhzdHIpIHtcbiAgICByZXR1cm4gYmFzZTY0dG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlcihzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGggfHwgaSA+PSBzcmMubGVuZ3RoKSBicmVha1xuICAgICAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgICB9XG4gICAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4odmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIHJldHVybiAoXG4gICAgICAgIG9iaiAhPSBudWxsICYmXG4gICAgICAgICghIW9iai5faXNCdWZmZXIgfHwgaXNGYXN0QnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikpXG4gICAgKVxufVxuXG5mdW5jdGlvbiBpc0Zhc3RCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgISFvYmouY29uc3RydWN0b3IgJiZcbiAgICAgICAgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxuICAgIClcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbiAgICApXG59XG5cbmZ1bmN0aW9uIGllZWU3NTRyZWFkKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgICB2YXIgZSwgbVxuICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgICB2YXIgbkJpdHMgPSAtN1xuICAgIHZhciBpID0gaXNMRSA/IG5CeXRlcyAtIDEgOiAwXG4gICAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gICAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICAgIGkgKz0gZFxuXG4gICAgZSA9IHMgJiAoKDEgPDwgLW5CaXRzKSAtIDEpXG4gICAgcyA+Pj0gLW5CaXRzXG4gICAgbkJpdHMgKz0gZUxlblxuICAgIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgICBtID0gZSAmICgoMSA8PCAtbkJpdHMpIC0gMSlcbiAgICBlID4+PSAtbkJpdHNcbiAgICBuQml0cyArPSBtTGVuXG4gICAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICAgIGlmIChlID09PSAwKSB7XG4gICAgICAgIGUgPSAxIC0gZUJpYXNcbiAgICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICAgICAgcmV0dXJuIG0gPyBOYU4gOiAocyA/IC0xIDogMSkgKiBJbmZpbml0eVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICAgICAgZSA9IGUgLSBlQmlhc1xuICAgIH1cbiAgICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5mdW5jdGlvbiBpZWVlNzU0d3JpdGUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgICB2YXIgZSwgbSwgY1xuICAgIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMFxuICAgIHZhciBpID0gaXNMRSA/IDAgOiBuQnl0ZXMgLSAxXG4gICAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gICAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgICAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2Uge1xuICAgICAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICAgICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgICAgICAgZS0tXG4gICAgICAgICAgICBjICo9IDJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICAgICAgICBlKytcbiAgICAgICAgICAgIGMgLz0gMlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICAgICAgICBtID0gMFxuICAgICAgICAgICAgZSA9IGVNYXhcbiAgICAgICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICAgICAgICBlID0gZSArIGVCaWFzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgICAgICAgIGUgPSAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgICA7XG4gICAgICAgIG1MZW4gPj0gODtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOFxuICAgICkge31cblxuICAgIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgICBlTGVuICs9IG1MZW5cbiAgICBmb3IgKFxuICAgICAgICA7XG4gICAgICAgIGVMZW4gPiAwO1xuICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4XG4gICAgKSB7fVxuXG4gICAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCAiZXhwb3J0IHsgQnVmZmVyIH0gZnJvbSAnX25vZGUtYnVmZmVyLXBvbHlmaWxsXy5qcydcbiIsICJleHBvcnQgZGVmYXVsdCB7fTtcbiIsICJcbmNvbnN0IHBvbHlmaWxsID0gcmVxdWlyZSgnZnMnKVxuXG5pZiAocG9seWZpbGwgJiYgcG9seWZpbGwuZGVmYXVsdCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGwuZGVmYXVsdFxuICAgIGZvciAobGV0IGsgaW4gcG9seWZpbGwpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHNba10gPSBwb2x5ZmlsbFtrXVxuICAgIH1cbn0gZWxzZSBpZiAocG9seWZpbGwpICB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbFxufVxuXG5cbiIsICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMsIGVtcHR5IGVsZW1lbnRzLCBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgc3BsaXRQYXRoID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufTtcblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiAnLyc7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShwYXRoKSB7XG4gIHZhciBpc1BhdGhBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNQYXRoQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzUGF0aEFic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzUGF0aEFic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydCBmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydCBmdW5jdGlvbiBqb2luKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gbm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn1cblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gIGZyb20gPSByZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSByZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59XG5cbmV4cG9ydCB2YXIgc2VwID0gJy8nO1xuZXhwb3J0IHZhciBkZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBleHRuYW1lKHBhdGgpIHtcbiAgcmV0dXJuIHNwbGl0UGF0aChwYXRoKVszXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0bmFtZTogZXh0bmFtZSxcbiAgYmFzZW5hbWU6IGJhc2VuYW1lLFxuICBkaXJuYW1lOiBkaXJuYW1lLFxuICBzZXA6IHNlcCxcbiAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gIHJlbGF0aXZlOiByZWxhdGl2ZSxcbiAgam9pbjogam9pbixcbiAgaXNBYnNvbHV0ZTogaXNBYnNvbHV0ZSxcbiAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gIHJlc29sdmU6IHJlc29sdmVcbn07XG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJyA/XG4gICAgZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9IDpcbiAgICBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG5pZiAocG9seWZpbGwgJiYgcG9seWZpbGwuZGVmYXVsdCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGwuZGVmYXVsdFxuICAgIGZvciAobGV0IGsgaW4gcG9seWZpbGwpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHNba10gPSBwb2x5ZmlsbFtrXVxuICAgIH1cbn0gZWxzZSBpZiAocG9seWZpbGwpICB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbFxufVxuXG5cbiIsICJ2YXIgbG9va3VwID0gW107XG52YXIgcmV2TG9va3VwID0gW107XG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5O1xudmFyIGluaXRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIGluaXRlZCA9IHRydWU7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV07XG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpO1xuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyO1xuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjM7XG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnI7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwO1xuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKTtcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlbjtcblxuICB2YXIgTCA9IDA7XG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRjtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGO1xuICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KTtcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkY7XG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpO1xuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkY7XG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXA7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pO1xuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciB0bXA7XG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGg7XG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpO1xuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdO1xuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdO1xuICAgIG91dHB1dCArPSAnPT0nO1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gJz0nO1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gLTc7XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDA7XG4gIHZhciBkID0gaXNMRSA/IC0xIDogMTtcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07XG5cbiAgaSArPSBkO1xuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpO1xuICBzID4+PSAoLW5CaXRzKTtcbiAgbkJpdHMgKz0gZUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKTtcbiAgZSA+Pj0gKC1uQml0cyk7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKTtcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKTtcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMDtcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG59XG5cbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbnZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwO1xuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHRydWU7XG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbnZhciBfa01heExlbmd0aCA9IGtNYXhMZW5ndGgoKTtcblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpO1xuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MjsgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIHJldHVybiBhcnJcbn07XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufTtcblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGU7XG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn07XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59O1xuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwO1xuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aCk7XG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZyk7XG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpO1xuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMDtcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1O1xuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoOyAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMDtcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbik7XG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKTtcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMDtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5CdWZmZXIuaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihhKSB8fCAhaW50ZXJuYWxJc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufTtcblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaTtcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgdmFyIHBvcyA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV07XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKTtcbiAgICBwb3MgKz0gYnVmLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59O1xuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlO1xuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXTtcbiAgYltuXSA9IGJbbV07XG4gIGJbbV0gPSBpO1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMyk7XG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpO1xuICB9XG4gIHJldHVybiB0aGlzXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KTtcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNik7XG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpO1xuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnO1xuICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVM7XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnO1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDA7XG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMDtcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMDtcbiAgZW5kID4+Pj0gMDtcbiAgdGhpc1N0YXJ0ID4+Pj0gMDtcbiAgdGhpc0VuZCA+Pj49IDA7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnQ7XG4gIHZhciB5ID0gZW5kIC0gc3RhcnQ7XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KTtcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZCk7XG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXTtcbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQ7XG4gICAgYnl0ZU9mZnNldCA9IDA7XG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZjtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDA7XG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OyAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXQ7XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwO1xuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKGludGVybmFsSXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGOyAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGg7XG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyO1xuICAgICAgYXJyTGVuZ3RoIC89IDI7XG4gICAgICB2YWxMZW5ndGggLz0gMjtcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGk7XG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xO1xuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXg7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGg7XG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn07XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDtcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXQ7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWQ7XG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgb2Zmc2V0ID0gMDtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBvZmZzZXQgPSAwO1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwO1xuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmc7XG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcbiAgdmFyIHJlcyA9IFtdO1xuXG4gIHZhciBpID0gc3RhcnQ7XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXTtcbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbDtcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDE7XG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50O1xuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRDtcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KTtcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDA7XG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGg7XG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJyc7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnO1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlbjtcblxuICB2YXIgb3V0ID0gJyc7XG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIHN0YXJ0ID0gfn5zdGFydDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuO1xuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuO1xuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuO1xuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwO1xuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlbjtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgdmFyIG5ld0J1ZjtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydDtcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn07XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgdmFyIG11bCA9IDE7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdO1xuICB2YXIgbXVsID0gMTtcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICB9XG4gIG11bCAqPSAweDgwO1xuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXTtcbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bDtcbiAgfVxuICBtdWwgKj0gMHg4MDtcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcblxuICByZXR1cm4gdmFsXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KTtcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOCk7XG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59O1xuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gIH1cblxuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDE7XG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMTtcbiAgdmFyIG11bCA9IDE7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMCk7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxO1xuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogODtcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZik7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDE7XG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmO1xuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMTtcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxO1xuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDE7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKTtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCk7XG4gIH1cbiAgd3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTtcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn07XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgpO1xuICB9XG4gIHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7XG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59O1xuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aDtcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwO1xuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydDtcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgdmFyIGk7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBsZW5cbn07XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kO1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTU7XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDA7XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7XG5cbiAgaWYgKCF2YWwpIHZhbCA9IDA7XG5cbiAgdmFyIGk7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKTtcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufTtcblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2c7XG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJyk7XG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9JztcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTtcbiAgdmFyIGNvZGVQb2ludDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbDtcbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7XG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG87XG4gIHZhciBieXRlQXJyYXkgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBoaSA9IGMgPj4gODtcbiAgICBsbyA9IGMgJSAyNTY7XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pO1xuICAgIGJ5dGVBcnJheS5wdXNoKGhpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIHRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXTtcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNGYXN0QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cblxuZXhwb3J0IHsgQnVmZmVyLCBJTlNQRUNUX01BWF9CWVRFUywgU2xvd0J1ZmZlciwgaXNCdWZmZXIsIF9rTWF4TGVuZ3RoIGFzIGtNYXhMZW5ndGggfTtcbiIsICIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuaWYgKHR5cGVvZiBnbG9iYWwuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xufVxuaWYgKHR5cGVvZiBnbG9iYWwuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xufVxuXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5mdW5jdGlvbiBuZXh0VGljayhmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufVxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnZhciB0aXRsZSA9ICdicm93c2VyJztcbnZhciBwbGF0Zm9ybSA9ICdicm93c2VyJztcbnZhciBicm93c2VyID0gdHJ1ZTtcbnZhciBlbnYgPSB7fTtcbnZhciBhcmd2ID0gW107XG52YXIgdmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xudmFyIHZlcnNpb25zID0ge307XG52YXIgcmVsZWFzZSA9IHt9O1xudmFyIGNvbmZpZyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIG9uID0gbm9vcDtcbnZhciBhZGRMaXN0ZW5lciA9IG5vb3A7XG52YXIgb25jZSA9IG5vb3A7XG52YXIgb2ZmID0gbm9vcDtcbnZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG52YXIgcmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnZhciBlbWl0ID0gbm9vcDtcblxuZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG5mdW5jdGlvbiBjd2QgKCkgeyByZXR1cm4gJy8nIH1cbmZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufWZ1bmN0aW9uIHVtYXNrKCkgeyByZXR1cm4gMDsgfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbC5wZXJmb3JtYW5jZSB8fCB7fTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9O1xuXG4vLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zO1xuICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKTtcbiAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcigoY2xvY2t0aW1lJTEpKjFlOSk7XG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF07XG4gICAgbmFub3NlY29uZHMgPSBuYW5vc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzFdO1xuICAgIGlmIChuYW5vc2Vjb25kczwwKSB7XG4gICAgICBzZWNvbmRzLS07XG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbc2Vjb25kcyxuYW5vc2Vjb25kc11cbn1cblxudmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbnZhciBicm93c2VyJDEgPSB7XG4gIG5leHRUaWNrOiBuZXh0VGljayxcbiAgdGl0bGU6IHRpdGxlLFxuICBicm93c2VyOiBicm93c2VyLFxuICBlbnY6IGVudixcbiAgYXJndjogYXJndixcbiAgdmVyc2lvbjogdmVyc2lvbixcbiAgdmVyc2lvbnM6IHZlcnNpb25zLFxuICBvbjogb24sXG4gIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lcixcbiAgb25jZTogb25jZSxcbiAgb2ZmOiBvZmYsXG4gIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcixcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG4gIGVtaXQ6IGVtaXQsXG4gIGJpbmRpbmc6IGJpbmRpbmcsXG4gIGN3ZDogY3dkLFxuICBjaGRpcjogY2hkaXIsXG4gIHVtYXNrOiB1bWFzayxcbiAgaHJ0aW1lOiBocnRpbWUsXG4gIHBsYXRmb3JtOiBwbGF0Zm9ybSxcbiAgcmVsZWFzZTogcmVsZWFzZSxcbiAgY29uZmlnOiBjb25maWcsXG4gIHVwdGltZTogdXB0aW1lXG59O1xuXG5leHBvcnQgZGVmYXVsdCBicm93c2VyJDE7XG5leHBvcnQgeyBhZGRMaXN0ZW5lciwgYXJndiwgYmluZGluZywgYnJvd3NlciwgY2hkaXIsIGNvbmZpZywgY3dkLCBlbWl0LCBlbnYsIGhydGltZSwgbmV4dFRpY2ssIG9mZiwgb24sIG9uY2UsIHBsYXRmb3JtLCByZWxlYXNlLCByZW1vdmVBbGxMaXN0ZW5lcnMsIHJlbW92ZUxpc3RlbmVyLCB0aXRsZSwgdW1hc2ssIHVwdGltZSwgdmVyc2lvbiwgdmVyc2lvbnMgfTtcbiIsICJcbnZhciBpbmhlcml0cztcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyl7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGluaGVyaXRzO1xuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXQoZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnQgZnVuY3Rpb24gZGVidWdsb2coc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gMDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBfZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyKG1heWJlQnVmKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIobWF5YmVCdWYpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnQgZnVuY3Rpb24gbG9nKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG59XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmltcG9ydCBpbmhlcml0cyBmcm9tICcuL2luaGVyaXRzJztcbmV4cG9ydCB7aW5oZXJpdHN9XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0ZW5kKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzaWZ5KGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZm4oLi4uYXJndW1lbnRzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgaWYgKGVyciAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pXG4gICAgfSlcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5oZXJpdHM6IGluaGVyaXRzLFxuICBfZXh0ZW5kOiBfZXh0ZW5kLFxuICBsb2c6IGxvZyxcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzRXJyb3I6IGlzRXJyb3IsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc1N5bWJvbDogaXNTeW1ib2wsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsXG4gIGlzTnVsbDogaXNOdWxsLFxuICBpc0Jvb2xlYW46IGlzQm9vbGVhbixcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaW5zcGVjdDogaW5zcGVjdCxcbiAgZGVwcmVjYXRlOiBkZXByZWNhdGUsXG4gIGZvcm1hdDogZm9ybWF0LFxuICBkZWJ1Z2xvZzogZGVidWdsb2dcbn1cbiIsICJcbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5pbXBvcnQge2lzQnVmZmVyfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHtpc1ByaW1pdGl2ZSwgaW5oZXJpdHMsIGlzRXJyb3IsIGlzRnVuY3Rpb24sIGlzUmVnRXhwLCBpc0RhdGUsIGluc3BlY3QgYXMgdXRpbEluc3BlY3R9IGZyb20gJ3V0aWwnO1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBfZnVuY3Rpb25zSGF2ZU5hbWVzO1xuZnVuY3Rpb24gZnVuY3Rpb25zSGF2ZU5hbWVzKCkge1xuICBpZiAodHlwZW9mIF9mdW5jdGlvbnNIYXZlTmFtZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIF9mdW5jdGlvbnNIYXZlTmFtZXM7XG4gIH1cbiAgcmV0dXJuIF9mdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbiAgfSgpKTtcbn1cbmZ1bmN0aW9uIHBUb1N0cmluZyAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcbn1cbmZ1bmN0aW9uIGlzVmlldyhhcnJidWYpIHtcbiAgaWYgKGlzQnVmZmVyKGFycmJ1ZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmJ1Zik7XG4gIH1cbiAgaWYgKCFhcnJidWYpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFycmJ1ZiBpbnN0YW5jZW9mIERhdGFWaWV3KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGFycmJ1Zi5idWZmZXIgJiYgYXJyYnVmLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLy8gMS4gVGhlIGFzc2VydCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgdGhyb3dcbi8vIEFzc2VydGlvbkVycm9yJ3Mgd2hlbiBwYXJ0aWN1bGFyIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuIFRoZVxuLy8gYXNzZXJ0IG1vZHVsZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UuXG5cbmZ1bmN0aW9uIGFzc2VydCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBvayk7XG59XG5leHBvcnQgZGVmYXVsdCBhc3NlcnQ7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIWlzRnVuY3Rpb24oZnVuYykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcygpKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBBc3NlcnRpb25FcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG5pbmhlcml0cyhBc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMoKSB8fCAhaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWxJbnNwZWN0KHNvbWV0aGluZyk7XG4gIH1cbiAgdmFyIHJhd25hbWUgPSBnZXROYW1lKHNvbWV0aGluZyk7XG4gIHZhciBuYW1lID0gcmF3bmFtZSA/ICc6ICcgKyByYXduYW1lIDogJyc7XG4gIHJldHVybiAnW0Z1bmN0aW9uJyArICBuYW1lICsgJ10nO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZShzZWxmKSB7XG4gIHJldHVybiB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuYWN0dWFsKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5leHBlY3RlZCksIDEyOCk7XG59XG5cbi8vIEF0IHByZXNlbnQgb25seSB0aGUgdGhyZWUga2V5cyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgYW5kXG4vLyB1bmRlcnN0b29kIGJ5IHRoZSBzcGVjLiBJbXBsZW1lbnRhdGlvbnMgb3Igc3ViIG1vZHVsZXMgY2FuIHBhc3Ncbi8vIG90aGVyIGtleXMgdG8gdGhlIEFzc2VydGlvbkVycm9yJ3MgY29uc3RydWN0b3IgLSB0aGV5IHdpbGwgYmVcbi8vIGlnbm9yZWQuXG5cbi8vIDMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IHRocm93IGFuIEFzc2VydGlvbkVycm9yXG4vLyB3aGVuIGEgY29ycmVzcG9uZGluZyBjb25kaXRpb24gaXMgbm90IG1ldCwgd2l0aCBhIG1lc3NhZ2UgdGhhdFxuLy8gbWF5IGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQuICBBbGwgYXNzZXJ0aW9uIG1ldGhvZHMgcHJvdmlkZVxuLy8gYm90aCB0aGUgYWN0dWFsIGFuZCBleHBlY3RlZCB2YWx1ZXMgdG8gdGhlIGFzc2VydGlvbiBlcnJvciBmb3Jcbi8vIGRpc3BsYXkgcHVycG9zZXMuXG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGFjdHVhbDogYWN0dWFsLFxuICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgc3RhY2tTdGFydEZ1bmN0aW9uOiBzdGFja1N0YXJ0RnVuY3Rpb25cbiAgfSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgYWxsb3dzIGZvciB3ZWxsIGJlaGF2ZWQgZXJyb3JzIGRlZmluZWQgZWxzZXdoZXJlLlxuYXNzZXJ0LmZhaWwgPSBmYWlsO1xuXG4vLyA0LiBQdXJlIGFzc2VydGlvbiB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdHJ1dGh5LCBhcyBkZXRlcm1pbmVkXG4vLyBieSAhIWd1YXJkLlxuLy8gYXNzZXJ0Lm9rKGd1YXJkLCBtZXNzYWdlX29wdCk7XG4vLyBUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvIGFzc2VydC5lcXVhbCh0cnVlLCAhIWd1YXJkLFxuLy8gbWVzc2FnZV9vcHQpOy4gVG8gdGVzdCBzdHJpY3RseSBmb3IgdGhlIHZhbHVlIHRydWUsIHVzZVxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKHRydWUsIGd1YXJkLCBtZXNzYWdlX29wdCk7LlxuXG5leHBvcnQgZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgb2spO1xufVxuYXNzZXJ0Lm9rID0gb2s7XG5leHBvcnQge29rIGFzIGFzc2VydH07XG5cbi8vIDUuIFRoZSBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc2hhbGxvdywgY29lcmNpdmUgZXF1YWxpdHkgd2l0aFxuLy8gPT0uXG4vLyBhc3NlcnQuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0LmVxdWFsID0gZXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGVxdWFsKTtcbn1cblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdEVxdWFsID0gbm90RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT0nLCBub3RFcXVhbCk7XG4gIH1cbn1cblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcbmFzc2VydC5kZWVwRXF1YWwgPSBkZWVwRXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBFcXVhbCcsIGRlZXBFcXVhbCk7XG4gIH1cbn1cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBkZWVwU3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gZGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHRydWUpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcFN0cmljdEVxdWFsJywgZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAoaXNEYXRlKGFjdHVhbCkgJiYgaXNEYXRlKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XG5cbiAgLy8gNy4zIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIHRoZSBhY3R1YWwgdmFsdWUgaXNcbiAgLy8gZXF1aXZhbGVudCBpZiBpdCBpcyBhbHNvIGEgUmVnRXhwIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmRcbiAgLy8gcHJvcGVydGllcyAoYGdsb2JhbGAsIGBtdWx0aWxpbmVgLCBgbGFzdEluZGV4YCwgYGlnbm9yZUNhc2VgKS5cbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChhY3R1YWwpICYmIGlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKGlzUHJpbWl0aXZlKGEpIHx8IGlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IG5vdERlZXBFcXVhbDtcbmV4cG9ydCBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwRXF1YWwnLCBub3REZWVwRXF1YWwpO1xuICB9XG59XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBzdHJpY3RFcXVhbDtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT09Jywgc3RyaWN0RXF1YWwpO1xuICB9XG59XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gbm90U3RyaWN0RXF1YWw7XG5leHBvcnQgZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIG5vdFN0cmljdEVxdWFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXhwZWN0ZWQpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLnRlc3QoYWN0dWFsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUuICBUaGUgaW5zdGFuY2VvZiBjaGVjayBkb2Vzbid0IHdvcmsgZm9yIGFycm93IGZ1bmN0aW9ucy5cbiAgfVxuXG4gIGlmIChFcnJvci5pc1Byb3RvdHlwZU9mKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBfdHJ5QmxvY2soYmxvY2spIHtcbiAgdmFyIGVycm9yO1xuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5mdW5jdGlvbiBfdGhyb3dzKHNob3VsZFRocm93LCBibG9jaywgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGFjdHVhbDtcblxuICBpZiAodHlwZW9mIGJsb2NrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJibG9ja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICBtZXNzYWdlID0gZXhwZWN0ZWQ7XG4gICAgZXhwZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgYWN0dWFsID0gX3RyeUJsb2NrKGJsb2NrKTtcblxuICBtZXNzYWdlID0gKGV4cGVjdGVkICYmIGV4cGVjdGVkLm5hbWUgPyAnICgnICsgZXhwZWN0ZWQubmFtZSArICcpLicgOiAnLicpICtcbiAgICAgICAgICAgIChtZXNzYWdlID8gJyAnICsgbWVzc2FnZSA6ICcuJyk7XG5cbiAgaWYgKHNob3VsZFRocm93ICYmICFhY3R1YWwpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsICdNaXNzaW5nIGV4cGVjdGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIHZhciB1c2VyUHJvdmlkZWRNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnO1xuICB2YXIgaXNVbndhbnRlZEV4Y2VwdGlvbiA9ICFzaG91bGRUaHJvdyAmJiBpc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcbmFzc2VydC50aHJvd3MgPSB0aHJvd3M7XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dzKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59XG5cbi8vIEVYVEVOU0lPTiEgVGhpcyBpcyBhbm5veWluZyB0byB3cml0ZSBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGRvZXNOb3RUaHJvdztcbmV4cG9ydCBmdW5jdGlvbiBkb2VzTm90VGhyb3coYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59XG5cbmFzc2VydC5pZkVycm9yID0gaWZFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBpZkVycm9yKGVycikge1xuICBpZiAoZXJyKSB0aHJvdyBlcnI7XG59XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmlmIChwb2x5ZmlsbCAmJiBwb2x5ZmlsbC5kZWZhdWx0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwb2x5ZmlsbC5kZWZhdWx0XG4gICAgZm9yIChsZXQgayBpbiBwb2x5ZmlsbCkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0c1trXSA9IHBvbHlmaWxsW2tdXG4gICAgfVxufSBlbHNlIGlmIChwb2x5ZmlsbCkgIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsXG59XG5cblxuIiwgIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5hY29ybiA9IHt9KSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgLy8gUmVzZXJ2ZWQgd29yZCBsaXN0cyBmb3IgdmFyaW91cyBkaWFsZWN0cyBvZiB0aGUgbGFuZ3VhZ2VcblxuICB2YXIgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgICAzOiBcImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBjaGFyIGNsYXNzIGRvdWJsZSBlbnVtIGV4cG9ydCBleHRlbmRzIGZpbmFsIGZsb2F0IGdvdG8gaW1wbGVtZW50cyBpbXBvcnQgaW50IGludGVyZmFjZSBsb25nIG5hdGl2ZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzaG9ydCBzdGF0aWMgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgdm9sYXRpbGVcIixcbiAgICA1OiBcImNsYXNzIGVudW0gZXh0ZW5kcyBzdXBlciBjb25zdCBleHBvcnQgaW1wb3J0XCIsXG4gICAgNjogXCJlbnVtXCIsXG4gICAgc3RyaWN0OiBcImltcGxlbWVudHMgaW50ZXJmYWNlIGxldCBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzdGF0aWMgeWllbGRcIixcbiAgICBzdHJpY3RCaW5kOiBcImV2YWwgYXJndW1lbnRzXCJcbiAgfTtcblxuICAvLyBBbmQgdGhlIGtleXdvcmRzXG5cbiAgdmFyIGVjbWE1QW5kTGVzc0tleXdvcmRzID0gXCJicmVhayBjYXNlIGNhdGNoIGNvbnRpbnVlIGRlYnVnZ2VyIGRlZmF1bHQgZG8gZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiByZXR1cm4gc3dpdGNoIHRocm93IHRyeSB2YXIgd2hpbGUgd2l0aCBudWxsIHRydWUgZmFsc2UgaW5zdGFuY2VvZiB0eXBlb2Ygdm9pZCBkZWxldGUgbmV3IGluIHRoaXNcIjtcblxuICB2YXIga2V5d29yZHMgPSB7XG4gICAgNTogZWNtYTVBbmRMZXNzS2V5d29yZHMsXG4gICAgXCI1bW9kdWxlXCI6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgZXhwb3J0IGltcG9ydFwiLFxuICAgIDY6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgY29uc3QgY2xhc3MgZXh0ZW5kcyBleHBvcnQgaW1wb3J0IHN1cGVyXCJcbiAgfTtcblxuICB2YXIga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4gIC8vICMjIENoYXJhY3RlciBjYXRlZ29yaWVzXG5cbiAgLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlXG4gIC8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlXG4gIC8vIGFyZSBvbmx5IGFwcGxpZWQgd2hlbiBhIGNoYXJhY3RlciBpcyBmb3VuZCB0byBhY3R1YWxseSBoYXZlIGFcbiAgLy8gY29kZSBwb2ludCBhYm92ZSAxMjguXG4gIC8vIEdlbmVyYXRlZCBieSBgYmluL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IFwiXFx4YWFcXHhiNVxceGJhXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyYzFcXHUwMmM2LVxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVjXFx1MDJlZVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3YS1cXHUwMzdkXFx1MDM3ZlxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTJmXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjAtXFx1MDU4OFxcdTA1ZDAtXFx1MDVlYVxcdTA1ZWYtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NmFcXHUwOGEwLVxcdTA4YjRcXHUwOGI2LVxcdTA4YzdcXHUwOTA0LVxcdTA5MzlcXHUwOTNkXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Y1xcdTA5OGZcXHUwOTkwXFx1MDk5My1cXHUwOWE4XFx1MDlhYS1cXHUwOWIwXFx1MDliMlxcdTA5YjYtXFx1MDliOVxcdTA5YmRcXHUwOWNlXFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWYwXFx1MDlmMVxcdTA5ZmNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWY5XFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzlcXHUwYzNkXFx1MGM1OC1cXHUwYzVhXFx1MGM2MFxcdTBjNjFcXHUwYzgwXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZjFcXHUwY2YyXFx1MGQwNC1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZFxcdTBkNGVcXHUwZDU0LVxcdTBkNTZcXHUwZDVmLVxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg2LVxcdTBlOGFcXHUwZThjLVxcdTBlYTNcXHUwZWE1XFx1MGVhNy1cXHUwZWIwXFx1MGViMlxcdTBlYjNcXHUwZWJkXFx1MGVjMC1cXHUwZWM0XFx1MGVjNlxcdTBlZGMtXFx1MGVkZlxcdTBmMDBcXHUwZjQwLVxcdTBmNDdcXHUwZjQ5LVxcdTBmNmNcXHUwZjg4LVxcdTBmOGNcXHUxMDAwLVxcdTEwMmFcXHUxMDNmXFx1MTA1MC1cXHUxMDU1XFx1MTA1YS1cXHUxMDVkXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2ZS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4ZVxcdTEwYTAtXFx1MTBjNVxcdTEwYzdcXHUxMGNkXFx1MTBkMC1cXHUxMGZhXFx1MTBmYy1cXHUxMjQ4XFx1MTI0YS1cXHUxMjRkXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNWEtXFx1MTI1ZFxcdTEyNjAtXFx1MTI4OFxcdTEyOGEtXFx1MTI4ZFxcdTEyOTAtXFx1MTJiMFxcdTEyYjItXFx1MTJiNVxcdTEyYjgtXFx1MTJiZVxcdTEyYzBcXHUxMmMyLVxcdTEyYzVcXHUxMmM4LVxcdTEyZDZcXHUxMmQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNWFcXHUxMzgwLVxcdTEzOGZcXHUxM2EwLVxcdTEzZjVcXHUxM2Y4LVxcdTEzZmRcXHUxNDAxLVxcdTE2NmNcXHUxNjZmLVxcdTE2N2ZcXHUxNjgxLVxcdTE2OWFcXHUxNmEwLVxcdTE2ZWFcXHUxNmVlLVxcdTE2ZjhcXHUxNzAwLVxcdTE3MGNcXHUxNzBlLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NmNcXHUxNzZlLVxcdTE3NzBcXHUxNzgwLVxcdTE3YjNcXHUxN2Q3XFx1MTdkY1xcdTE4MjAtXFx1MTg3OFxcdTE4ODAtXFx1MThhOFxcdTE4YWFcXHUxOGIwLVxcdTE4ZjVcXHUxOTAwLVxcdTE5MWVcXHUxOTUwLVxcdTE5NmRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5YWJcXHUxOWIwLVxcdTE5YzlcXHUxYTAwLVxcdTFhMTZcXHUxYTIwLVxcdTFhNTRcXHUxYWE3XFx1MWIwNS1cXHUxYjMzXFx1MWI0NS1cXHUxYjRiXFx1MWI4My1cXHUxYmEwXFx1MWJhZVxcdTFiYWZcXHUxYmJhLVxcdTFiZTVcXHUxYzAwLVxcdTFjMjNcXHUxYzRkLVxcdTFjNGZcXHUxYzVhLVxcdTFjN2RcXHUxYzgwLVxcdTFjODhcXHUxYzkwLVxcdTFjYmFcXHUxY2JkLVxcdTFjYmZcXHUxY2U5LVxcdTFjZWNcXHUxY2VlLVxcdTFjZjNcXHUxY2Y1XFx1MWNmNlxcdTFjZmFcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyYzJlXFx1MmMzMC1cXHUyYzVlXFx1MmM2MC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM2NcXHUzMDQxLVxcdTMwOTZcXHUzMDliLVxcdTMwOWZcXHUzMGExLVxcdTMwZmFcXHUzMGZjLVxcdTMwZmZcXHUzMTA1LVxcdTMxMmZcXHUzMTMxLVxcdTMxOGVcXHUzMWEwLVxcdTMxYmZcXHUzMWYwLVxcdTMxZmZcXHUzNDAwLVxcdTRkYmZcXHU0ZTAwLVxcdTlmZmNcXHVhMDAwLVxcdWE0OGNcXHVhNGQwLVxcdWE0ZmRcXHVhNTAwLVxcdWE2MGNcXHVhNjEwLVxcdWE2MWZcXHVhNjJhXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2N2YtXFx1YTY5ZFxcdWE2YTAtXFx1YTZlZlxcdWE3MTctXFx1YTcxZlxcdWE3MjItXFx1YTc4OFxcdWE3OGItXFx1YTdiZlxcdWE3YzItXFx1YTdjYVxcdWE3ZjUtXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyMlxcdWE4NDAtXFx1YTg3M1xcdWE4ODItXFx1YThiM1xcdWE4ZjItXFx1YThmN1xcdWE4ZmJcXHVhOGZkXFx1YThmZVxcdWE5MGEtXFx1YTkyNVxcdWE5MzAtXFx1YTk0NlxcdWE5NjAtXFx1YTk3Y1xcdWE5ODQtXFx1YTliMlxcdWE5Y2ZcXHVhOWUwLVxcdWE5ZTRcXHVhOWU2LVxcdWE5ZWZcXHVhOWZhLVxcdWE5ZmVcXHVhYTAwLVxcdWFhMjhcXHVhYTQwLVxcdWFhNDJcXHVhYTQ0LVxcdWFhNGJcXHVhYTYwLVxcdWFhNzZcXHVhYTdhXFx1YWE3ZS1cXHVhYWFmXFx1YWFiMVxcdWFhYjVcXHVhYWI2XFx1YWFiOS1cXHVhYWJkXFx1YWFjMFxcdWFhYzJcXHVhYWRiLVxcdWFhZGRcXHVhYWUwLVxcdWFhZWFcXHVhYWYyLVxcdWFhZjRcXHVhYjAxLVxcdWFiMDZcXHVhYjA5LVxcdWFiMGVcXHVhYjExLVxcdWFiMTZcXHVhYjIwLVxcdWFiMjZcXHVhYjI4LVxcdWFiMmVcXHVhYjMwLVxcdWFiNWFcXHVhYjVjLVxcdWFiNjlcXHVhYjcwLVxcdWFiZTJcXHVhYzAwLVxcdWQ3YTNcXHVkN2IwLVxcdWQ3YzZcXHVkN2NiLVxcdWQ3ZmJcXHVmOTAwLVxcdWZhNmRcXHVmYTcwLVxcdWZhZDlcXHVmYjAwLVxcdWZiMDZcXHVmYjEzLVxcdWZiMTdcXHVmYjFkXFx1ZmIxZi1cXHVmYjI4XFx1ZmIyYS1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDBcXHVmYjQxXFx1ZmI0M1xcdWZiNDRcXHVmYjQ2LVxcdWZiYjFcXHVmYmQzLVxcdWZkM2RcXHVmZDUwLVxcdWZkOGZcXHVmZDkyLVxcdWZkYzdcXHVmZGYwLVxcdWZkZmJcXHVmZTcwLVxcdWZlNzRcXHVmZTc2LVxcdWZlZmNcXHVmZjIxLVxcdWZmM2FcXHVmZjQxLVxcdWZmNWFcXHVmZjY2LVxcdWZmYmVcXHVmZmMyLVxcdWZmYzdcXHVmZmNhLVxcdWZmY2ZcXHVmZmQyLVxcdWZmZDdcXHVmZmRhLVxcdWZmZGNcIjtcbiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gXCJcXHUyMDBjXFx1MjAwZFxceGI3XFx1MDMwMC1cXHUwMzZmXFx1MDM4N1xcdTA0ODMtXFx1MDQ4N1xcdTA1OTEtXFx1MDViZFxcdTA1YmZcXHUwNWMxXFx1MDVjMlxcdTA1YzRcXHUwNWM1XFx1MDVjN1xcdTA2MTAtXFx1MDYxYVxcdTA2NGItXFx1MDY2OVxcdTA2NzBcXHUwNmQ2LVxcdTA2ZGNcXHUwNmRmLVxcdTA2ZTRcXHUwNmU3XFx1MDZlOFxcdTA2ZWEtXFx1MDZlZFxcdTA2ZjAtXFx1MDZmOVxcdTA3MTFcXHUwNzMwLVxcdTA3NGFcXHUwN2E2LVxcdTA3YjBcXHUwN2MwLVxcdTA3YzlcXHUwN2ViLVxcdTA3ZjNcXHUwN2ZkXFx1MDgxNi1cXHUwODE5XFx1MDgxYi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJkXFx1MDg1OS1cXHUwODViXFx1MDhkMy1cXHUwOGUxXFx1MDhlMy1cXHUwOTAzXFx1MDkzYS1cXHUwOTNjXFx1MDkzZS1cXHUwOTRmXFx1MDk1MS1cXHUwOTU3XFx1MDk2MlxcdTA5NjNcXHUwOTY2LVxcdTA5NmZcXHUwOTgxLVxcdTA5ODNcXHUwOWJjXFx1MDliZS1cXHUwOWM0XFx1MDljN1xcdTA5YzhcXHUwOWNiLVxcdTA5Y2RcXHUwOWQ3XFx1MDllMlxcdTA5ZTNcXHUwOWU2LVxcdTA5ZWZcXHUwOWZlXFx1MGEwMS1cXHUwYTAzXFx1MGEzY1xcdTBhM2UtXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNjYtXFx1MGE3MVxcdTBhNzVcXHUwYTgxLVxcdTBhODNcXHUwYWJjXFx1MGFiZS1cXHUwYWM1XFx1MGFjNy1cXHUwYWM5XFx1MGFjYi1cXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYWU2LVxcdTBhZWZcXHUwYWZhLVxcdTBhZmZcXHUwYjAxLVxcdTBiMDNcXHUwYjNjXFx1MGIzZS1cXHUwYjQ0XFx1MGI0N1xcdTBiNDhcXHUwYjRiLVxcdTBiNGRcXHUwYjU1LVxcdTBiNTdcXHUwYjYyXFx1MGI2M1xcdTBiNjYtXFx1MGI2ZlxcdTBiODJcXHUwYmJlLVxcdTBiYzJcXHUwYmM2LVxcdTBiYzhcXHUwYmNhLVxcdTBiY2RcXHUwYmQ3XFx1MGJlNi1cXHUwYmVmXFx1MGMwMC1cXHUwYzA0XFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGQwMC1cXHUwZDAzXFx1MGQzYlxcdTBkM2NcXHUwZDNlLVxcdTBkNDRcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgxLVxcdTBkODNcXHUwZGNhXFx1MGRjZi1cXHUwZGQ0XFx1MGRkNlxcdTBkZDgtXFx1MGRkZlxcdTBkZTYtXFx1MGRlZlxcdTBkZjJcXHUwZGYzXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlNTAtXFx1MGU1OVxcdTBlYjFcXHUwZWI0LVxcdTBlYmNcXHUwZWM4LVxcdTBlY2RcXHUwZWQwLVxcdTBlZDlcXHUwZjE4XFx1MGYxOVxcdTBmMjAtXFx1MGYyOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmM2VcXHUwZjNmXFx1MGY3MS1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjhkLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyYi1cXHUxMDNlXFx1MTA0MC1cXHUxMDQ5XFx1MTA1Ni1cXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA2Mi1cXHUxMDY0XFx1MTA2Ny1cXHUxMDZkXFx1MTA3MS1cXHUxMDc0XFx1MTA4Mi1cXHUxMDhkXFx1MTA4Zi1cXHUxMDlkXFx1MTM1ZC1cXHUxMzVmXFx1MTM2OS1cXHUxMzcxXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjQtXFx1MTdkM1xcdTE3ZGRcXHUxN2UwLVxcdTE3ZTlcXHUxODBiLVxcdTE4MGRcXHUxODEwLVxcdTE4MTlcXHUxOGE5XFx1MTkyMC1cXHUxOTJiXFx1MTkzMC1cXHUxOTNiXFx1MTk0Ni1cXHUxOTRmXFx1MTlkMC1cXHUxOWRhXFx1MWExNy1cXHUxYTFiXFx1MWE1NS1cXHUxYTVlXFx1MWE2MC1cXHUxYTdjXFx1MWE3Zi1cXHUxYTg5XFx1MWE5MC1cXHUxYTk5XFx1MWFiMC1cXHUxYWJkXFx1MWFiZlxcdTFhYzBcXHUxYjAwLVxcdTFiMDRcXHUxYjM0LVxcdTFiNDRcXHUxYjUwLVxcdTFiNTlcXHUxYjZiLVxcdTFiNzNcXHUxYjgwLVxcdTFiODJcXHUxYmExLVxcdTFiYWRcXHUxYmIwLVxcdTFiYjlcXHUxYmU2LVxcdTFiZjNcXHUxYzI0LVxcdTFjMzdcXHUxYzQwLVxcdTFjNDlcXHUxYzUwLVxcdTFjNTlcXHUxY2QwLVxcdTFjZDJcXHUxY2Q0LVxcdTFjZThcXHUxY2VkXFx1MWNmNFxcdTFjZjctXFx1MWNmOVxcdTFkYzAtXFx1MWRmOVxcdTFkZmItXFx1MWRmZlxcdTIwM2ZcXHUyMDQwXFx1MjA1NFxcdTIwZDAtXFx1MjBkY1xcdTIwZTFcXHUyMGU1LVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZDdmXFx1MmRlMC1cXHUyZGZmXFx1MzAyYS1cXHUzMDJmXFx1MzA5OVxcdTMwOWFcXHVhNjIwLVxcdWE2MjlcXHVhNjZmXFx1YTY3NC1cXHVhNjdkXFx1YTY5ZVxcdWE2OWZcXHVhNmYwXFx1YTZmMVxcdWE4MDJcXHVhODA2XFx1YTgwYlxcdWE4MjMtXFx1YTgyN1xcdWE4MmNcXHVhODgwXFx1YTg4MVxcdWE4YjQtXFx1YThjNVxcdWE4ZDAtXFx1YThkOVxcdWE4ZTAtXFx1YThmMVxcdWE4ZmYtXFx1YTkwOVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1M1xcdWE5ODAtXFx1YTk4M1xcdWE5YjMtXFx1YTljMFxcdWE5ZDAtXFx1YTlkOVxcdWE5ZTVcXHVhOWYwLVxcdWE5ZjlcXHVhYTI5LVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhNGRcXHVhYTUwLVxcdWFhNTlcXHVhYTdiLVxcdWFhN2RcXHVhYWIwXFx1YWFiMi1cXHVhYWI0XFx1YWFiN1xcdWFhYjhcXHVhYWJlXFx1YWFiZlxcdWFhYzFcXHVhYWViLVxcdWFhZWZcXHVhYWY1XFx1YWFmNlxcdWFiZTMtXFx1YWJlYVxcdWFiZWNcXHVhYmVkXFx1YWJmMC1cXHVhYmY5XFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyZlxcdWZlMzNcXHVmZTM0XFx1ZmU0ZC1cXHVmZTRmXFx1ZmYxMC1cXHVmZjE5XFx1ZmYzZlwiO1xuXG4gIHZhciBub25BU0NJSWlkZW50aWZpZXJTdGFydCA9IG5ldyBSZWdFeHAoXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgXCJdXCIpO1xuICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cChcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBub25BU0NJSWlkZW50aWZpZXJDaGFycyArIFwiXVwiKTtcblxuICBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBudWxsO1xuXG4gIC8vIFRoZXNlIGFyZSBhIHJ1bi1sZW5ndGggYW5kIG9mZnNldCBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAvLyA+MHhmZmZmIGNvZGUgcG9pbnRzIHRoYXQgYXJlIGEgdmFsaWQgcGFydCBvZiBpZGVudGlmaWVycy4gVGhlXG4gIC8vIG9mZnNldCBzdGFydHMgYXQgMHgxMDAwMCwgYW5kIGVhY2ggcGFpciBvZiBudW1iZXJzIHJlcHJlc2VudHMgYW5cbiAgLy8gb2Zmc2V0IHRvIHRoZSBuZXh0IHJhbmdlLCBhbmQgdGhlbiBhIHNpemUgb2YgdGhlIHJhbmdlLiBUaGV5IHdlcmVcbiAgLy8gZ2VuZXJhdGVkIGJ5IGJpbi9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbW1hLXNwYWNpbmdcbiAgdmFyIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzID0gWzAsMTEsMiwyNSwyLDE4LDIsMSwyLDE0LDMsMTMsMzUsMTIyLDcwLDUyLDI2OCwyOCw0LDQ4LDQ4LDMxLDE0LDI5LDYsMzcsMTEsMjksMywzNSw1LDcsMiw0LDQzLDE1NywxOSwzNSw1LDM1LDUsMzksOSw1MSwxNTcsMzEwLDEwLDIxLDExLDcsMTUzLDUsMywwLDIsNDMsMiwxLDQsMCwzLDIyLDExLDIyLDEwLDMwLDY2LDE4LDIsMSwxMSwyMSwxMSwyNSw3MSw1NSw3LDEsNjUsMCwxNiwzLDIsMiwyLDI4LDQzLDI4LDQsMjgsMzYsNywyLDI3LDI4LDUzLDExLDIxLDExLDE4LDE0LDE3LDExMSw3Miw1Niw1MCwxNCw1MCwxNCwzNSwzNDksNDEsNywxLDc5LDI4LDExLDAsOSwyMSwxMDcsMjAsMjgsMjIsMTMsNTIsNzYsNDQsMzMsMjQsMjcsMzUsMzAsMCwzLDAsOSwzNCw0LDAsMTMsNDcsMTUsMywyMiwwLDIsMCwzNiwxNywyLDI0LDg1LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMywyMSwyLDMxLDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsMTQsMCw3MiwyNiwyMzAsNDMsMTE3LDYzLDMyLDcsMywwLDMsNywyLDEsMiwyMywxNiwwLDIsMCw5NSw3LDMsMzgsMTcsMCwyLDAsMjksMCwxMSwzOSw4LDAsMjIsMCwxMiw0NSwyMCwwLDM1LDU2LDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDI2LDUsMiwxLDIsMzEsMTUsMCwzMjgsMTgsMTkwLDAsODAsOTIxLDEwMywxMTAsMTgsMTk1LDI3NDksMTA3MCw0MDUwLDU4Miw4NjM0LDU2OCw4LDMwLDExNCwyOSwxOSw0NywxNywzLDMyLDIwLDYsMTgsNjg5LDYzLDEyOSw3NCw2LDAsNjcsMTIsNjUsMSwyLDAsMjksNjEzNSw5LDEyMzcsNDMsOCw4OTUyLDI4Niw1MCwyLDE4LDMsOSwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsMjM1Nyw0NCwxMSw2LDE3LDAsMzcwLDQzLDEzMDEsMTk2LDYwLDY3LDgsMCwxMjA1LDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzE3LDM1LDQxNDgsMTIsMjIxLDMsNTc2MSwxNSw3NDcyLDMxMDQsNTQxLDE1MDcsNDkzOF07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbW1hLXNwYWNpbmdcbiAgdmFyIGFzdHJhbElkZW50aWZpZXJDb2RlcyA9IFs1MDksMCwyMjcsMCwxNTAsNCwyOTQsOSwxMzY4LDIsMiwxLDYsMyw0MSwyLDUsMCwxNjYsMSw1NzQsMyw5LDksMzcwLDEsMTU0LDEwLDE3NiwyLDU0LDE0LDMyLDksMTYsMyw0NiwxMCw1NCw5LDcsMiwzNywxMywyLDksNiwxLDQ1LDAsMTMsMiw0OSwxMyw5LDMsMiwxMSw4MywxMSw3LDAsMTYxLDExLDYsOSw3LDMsNTYsMSwyLDYsMywxLDMsMiwxMCwwLDExLDEsMyw2LDQsNCwxOTMsMTcsMTAsOSw1LDAsODIsMTksMTMsOSwyMTQsNiwzLDgsMjgsMSw4MywxNiwxNiw5LDgyLDEyLDksOSw4NCwxNCw1LDksMjQzLDE0LDE2Niw5LDcxLDUsMiwxLDMsMywyLDAsMiwxLDEzLDksMTIwLDYsMyw2LDQsMCwyOSw5LDQxLDYsMiwzLDksMCwxMCwxMCw0NywxNSw0MDYsNywyLDcsMTcsOSw1NywyMSwyLDEzLDEyMyw1LDQsMCwyLDEsMiw2LDIsMCw5LDksNDksNCwyLDEsMiw0LDksOSwzMzAsMywxOTMwNiw5LDEzNSw0LDYwLDYsMjYsOSwxMDE0LDAsMiw1NCw4LDMsODIsMCwxMiwxLDE5NjI4LDEsNTMxOSw0LDQsNSw5LDcsMyw2LDMxLDMsMTQ5LDIsMTQxOCw0OSw1MTMsNTQsNSw0OSw5LDAsMTUsMCwyMyw0LDIsMTQsMTM2MSw2LDIsMTYsMyw2LDIsMSwyLDQsMjYyLDYsMTAsOSw0MTksMTMsMTQ5NSw2LDExMCw2LDYsOSw0NzU5LDksNzg3NzE5LDIzOV07XG5cbiAgLy8gVGhpcyBoYXMgYSBjb21wbGV4aXR5IGxpbmVhciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGUuIFRoZVxuICAvLyBhc3N1bXB0aW9uIGlzIHRoYXQgbG9va2luZyB1cCBhc3RyYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGlzXG4gIC8vIHJhcmUuXG4gIGZ1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZSwgc2V0KSB7XG4gICAgdmFyIHBvcyA9IDB4MTAwMDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHBvcyArPSBzZXRbaV07XG4gICAgICBpZiAocG9zID4gY29kZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgcG9zICs9IHNldFtpICsgMV07XG4gICAgICBpZiAocG9zID49IGNvZGUpIHsgcmV0dXJuIHRydWUgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG4gIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsIGFzdHJhbCkge1xuICAgIGlmIChjb2RlIDwgNjUpIHsgcmV0dXJuIGNvZGUgPT09IDM2IH1cbiAgICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgICBpZiAoY29kZSA8IDk3KSB7IHJldHVybiBjb2RlID09PSA5NSB9XG4gICAgaWYgKGNvZGUgPCAxMjMpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSkgfVxuICAgIGlmIChhc3RyYWwgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpXG4gIH1cblxuICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG4gIGZ1bmN0aW9uIGlzSWRlbnRpZmllckNoYXIoY29kZSwgYXN0cmFsKSB7XG4gICAgaWYgKGNvZGUgPCA0OCkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICAgIGlmIChjb2RlIDwgNTgpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDwgNjUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgICBpZiAoY29kZSA8IDk3KSB7IHJldHVybiBjb2RlID09PSA5NSB9XG4gICAgaWYgKGNvZGUgPCAxMjMpIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpIH1cbiAgICBpZiAoYXN0cmFsID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHJldHVybiBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzKSB8fCBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJDb2RlcylcbiAgfVxuXG4gIC8vICMjIFRva2VuIHR5cGVzXG5cbiAgLy8gVGhlIGFzc2lnbm1lbnQgb2YgZmluZS1ncmFpbmVkLCBpbmZvcm1hdGlvbi1jYXJyeWluZyB0eXBlIG9iamVjdHNcbiAgLy8gYWxsb3dzIHRoZSB0b2tlbml6ZXIgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBhXG4gIC8vIHRva2VuIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjaGVhcCBmb3IgdGhlIHBhcnNlciB0byBsb29rIHVwLlxuXG4gIC8vIEFsbCB0b2tlbiB0eXBlIHZhcmlhYmxlcyBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUsIHRvIG1ha2UgdGhlbVxuICAvLyBlYXN5IHRvIHJlY29nbml6ZS5cblxuICAvLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gcmVndWxhclxuICAvLyBleHByZXNzaW9ucyBhbmQgZGl2aXNpb25zLiBJdCBpcyBzZXQgb24gYWxsIHRva2VuIHR5cGVzIHRoYXQgY2FuXG4gIC8vIGJlIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gKHRodXMsIGEgc2xhc2ggYWZ0ZXIgdGhlbSB3b3VsZCBiZSBhXG4gIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbikuXG4gIC8vXG4gIC8vIFRoZSBgc3RhcnRzRXhwcmAgcHJvcGVydHkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdG9rZW4gZW5kcyBhXG4gIC8vIGB5aWVsZGAgZXhwcmVzc2lvbi4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IGVpdGhlciBjYW5cbiAgLy8gZGlyZWN0bHkgc3RhcnQgYW4gZXhwcmVzc2lvbiAobGlrZSBhIHF1b3RhdGlvbiBtYXJrKSBvciBjYW5cbiAgLy8gY29udGludWUgYW4gZXhwcmVzc2lvbiAobGlrZSB0aGUgYm9keSBvZiBhIHN0cmluZykuXG4gIC8vXG4gIC8vIGBpc0xvb3BgIG1hcmtzIGEga2V5d29yZCBhcyBzdGFydGluZyBhIGxvb3AsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuICAvLyBjb250aW51ZSBqdW1wcyB0byB0aGF0IGxhYmVsLlxuXG4gIHZhciBUb2tlblR5cGUgPSBmdW5jdGlvbiBUb2tlblR5cGUobGFiZWwsIGNvbmYpIHtcbiAgICBpZiAoIGNvbmYgPT09IHZvaWQgMCApIGNvbmYgPSB7fTtcblxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLmtleXdvcmQgPSBjb25mLmtleXdvcmQ7XG4gICAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gICAgdGhpcy5zdGFydHNFeHByID0gISFjb25mLnN0YXJ0c0V4cHI7XG4gICAgdGhpcy5pc0xvb3AgPSAhIWNvbmYuaXNMb29wO1xuICAgIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gICAgdGhpcy5wcmVmaXggPSAhIWNvbmYucHJlZml4O1xuICAgIHRoaXMucG9zdGZpeCA9ICEhY29uZi5wb3N0Zml4O1xuICAgIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wIHx8IG51bGw7XG4gICAgdGhpcy51cGRhdGVDb250ZXh0ID0gbnVsbDtcbiAgfTtcblxuICBmdW5jdGlvbiBiaW5vcChuYW1lLCBwcmVjKSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlblR5cGUobmFtZSwge2JlZm9yZUV4cHI6IHRydWUsIGJpbm9wOiBwcmVjfSlcbiAgfVxuICB2YXIgYmVmb3JlRXhwciA9IHtiZWZvcmVFeHByOiB0cnVlfSwgc3RhcnRzRXhwciA9IHtzdGFydHNFeHByOiB0cnVlfTtcblxuICAvLyBNYXAga2V5d29yZCBuYW1lcyB0byB0b2tlbiB0eXBlcy5cblxuICB2YXIga2V5d29yZHMkMSA9IHt9O1xuXG4gIC8vIFN1Y2NpbmN0IGRlZmluaXRpb25zIG9mIGtleXdvcmQgdG9rZW4gdHlwZXNcbiAgZnVuY3Rpb24ga3cobmFtZSwgb3B0aW9ucykge1xuICAgIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gICAgb3B0aW9ucy5rZXl3b3JkID0gbmFtZTtcbiAgICByZXR1cm4ga2V5d29yZHMkMVtuYW1lXSA9IG5ldyBUb2tlblR5cGUobmFtZSwgb3B0aW9ucylcbiAgfVxuXG4gIHZhciB0eXBlcyA9IHtcbiAgICBudW06IG5ldyBUb2tlblR5cGUoXCJudW1cIiwgc3RhcnRzRXhwciksXG4gICAgcmVnZXhwOiBuZXcgVG9rZW5UeXBlKFwicmVnZXhwXCIsIHN0YXJ0c0V4cHIpLFxuICAgIHN0cmluZzogbmV3IFRva2VuVHlwZShcInN0cmluZ1wiLCBzdGFydHNFeHByKSxcbiAgICBuYW1lOiBuZXcgVG9rZW5UeXBlKFwibmFtZVwiLCBzdGFydHNFeHByKSxcbiAgICBlb2Y6IG5ldyBUb2tlblR5cGUoXCJlb2ZcIiksXG5cbiAgICAvLyBQdW5jdHVhdGlvbiB0b2tlbiB0eXBlcy5cbiAgICBicmFja2V0TDogbmV3IFRva2VuVHlwZShcIltcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcbiAgICBicmFja2V0UjogbmV3IFRva2VuVHlwZShcIl1cIiksXG4gICAgYnJhY2VMOiBuZXcgVG9rZW5UeXBlKFwie1wiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIGJyYWNlUjogbmV3IFRva2VuVHlwZShcIn1cIiksXG4gICAgcGFyZW5MOiBuZXcgVG9rZW5UeXBlKFwiKFwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIHBhcmVuUjogbmV3IFRva2VuVHlwZShcIilcIiksXG4gICAgY29tbWE6IG5ldyBUb2tlblR5cGUoXCIsXCIsIGJlZm9yZUV4cHIpLFxuICAgIHNlbWk6IG5ldyBUb2tlblR5cGUoXCI7XCIsIGJlZm9yZUV4cHIpLFxuICAgIGNvbG9uOiBuZXcgVG9rZW5UeXBlKFwiOlwiLCBiZWZvcmVFeHByKSxcbiAgICBkb3Q6IG5ldyBUb2tlblR5cGUoXCIuXCIpLFxuICAgIHF1ZXN0aW9uOiBuZXcgVG9rZW5UeXBlKFwiP1wiLCBiZWZvcmVFeHByKSxcbiAgICBxdWVzdGlvbkRvdDogbmV3IFRva2VuVHlwZShcIj8uXCIpLFxuICAgIGFycm93OiBuZXcgVG9rZW5UeXBlKFwiPT5cIiwgYmVmb3JlRXhwciksXG4gICAgdGVtcGxhdGU6IG5ldyBUb2tlblR5cGUoXCJ0ZW1wbGF0ZVwiKSxcbiAgICBpbnZhbGlkVGVtcGxhdGU6IG5ldyBUb2tlblR5cGUoXCJpbnZhbGlkVGVtcGxhdGVcIiksXG4gICAgZWxsaXBzaXM6IG5ldyBUb2tlblR5cGUoXCIuLi5cIiwgYmVmb3JlRXhwciksXG4gICAgYmFja1F1b3RlOiBuZXcgVG9rZW5UeXBlKFwiYFwiLCBzdGFydHNFeHByKSxcbiAgICBkb2xsYXJCcmFjZUw6IG5ldyBUb2tlblR5cGUoXCIke1wiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuXG4gICAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgICAvLyBwYXJzZXIgdXNlIHRoZW0gcHJvcGVybHkgKHRoZSBwcmVzZW5jZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzXG4gICAgLy8gd2hhdCBjYXRlZ29yaXplcyB0aGVtIGFzIG9wZXJhdG9ycykuXG4gICAgLy9cbiAgICAvLyBgYmlub3BgLCB3aGVuIHByZXNlbnQsIHNwZWNpZmllcyB0aGF0IHRoaXMgb3BlcmF0b3IgaXMgYSBiaW5hcnlcbiAgICAvLyBvcGVyYXRvciwgYW5kIHdpbGwgcmVmZXIgdG8gaXRzIHByZWNlZGVuY2UuXG4gICAgLy9cbiAgICAvLyBgcHJlZml4YCBhbmQgYHBvc3RmaXhgIG1hcmsgdGhlIG9wZXJhdG9yIGFzIGEgcHJlZml4IG9yIHBvc3RmaXhcbiAgICAvLyB1bmFyeSBvcGVyYXRvci5cbiAgICAvL1xuICAgIC8vIGBpc0Fzc2lnbmAgbWFya3MgYWxsIG9mIGA9YCwgYCs9YCwgYC09YCBldGNldGVyYSwgd2hpY2ggYWN0IGFzXG4gICAgLy8gYmluYXJ5IG9wZXJhdG9ycyB3aXRoIGEgdmVyeSBsb3cgcHJlY2VkZW5jZSwgdGhhdCBzaG91bGQgcmVzdWx0XG4gICAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgICBlcTogbmV3IFRva2VuVHlwZShcIj1cIiwge2JlZm9yZUV4cHI6IHRydWUsIGlzQXNzaWduOiB0cnVlfSksXG4gICAgYXNzaWduOiBuZXcgVG9rZW5UeXBlKFwiXz1cIiwge2JlZm9yZUV4cHI6IHRydWUsIGlzQXNzaWduOiB0cnVlfSksXG4gICAgaW5jRGVjOiBuZXcgVG9rZW5UeXBlKFwiKysvLS1cIiwge3ByZWZpeDogdHJ1ZSwgcG9zdGZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICAgIHByZWZpeDogbmV3IFRva2VuVHlwZShcIiEvflwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgbG9naWNhbE9SOiBiaW5vcChcInx8XCIsIDEpLFxuICAgIGxvZ2ljYWxBTkQ6IGJpbm9wKFwiJiZcIiwgMiksXG4gICAgYml0d2lzZU9SOiBiaW5vcChcInxcIiwgMyksXG4gICAgYml0d2lzZVhPUjogYmlub3AoXCJeXCIsIDQpLFxuICAgIGJpdHdpc2VBTkQ6IGJpbm9wKFwiJlwiLCA1KSxcbiAgICBlcXVhbGl0eTogYmlub3AoXCI9PS8hPS89PT0vIT09XCIsIDYpLFxuICAgIHJlbGF0aW9uYWw6IGJpbm9wKFwiPC8+Lzw9Lz49XCIsIDcpLFxuICAgIGJpdFNoaWZ0OiBiaW5vcChcIjw8Lz4+Lz4+PlwiLCA4KSxcbiAgICBwbHVzTWluOiBuZXcgVG9rZW5UeXBlKFwiKy8tXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogOSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgbW9kdWxvOiBiaW5vcChcIiVcIiwgMTApLFxuICAgIHN0YXI6IGJpbm9wKFwiKlwiLCAxMCksXG4gICAgc2xhc2g6IGJpbm9wKFwiL1wiLCAxMCksXG4gICAgc3RhcnN0YXI6IG5ldyBUb2tlblR5cGUoXCIqKlwiLCB7YmVmb3JlRXhwcjogdHJ1ZX0pLFxuICAgIGNvYWxlc2NlOiBiaW5vcChcIj8/XCIsIDEpLFxuXG4gICAgLy8gS2V5d29yZCB0b2tlbiB0eXBlcy5cbiAgICBfYnJlYWs6IGt3KFwiYnJlYWtcIiksXG4gICAgX2Nhc2U6IGt3KFwiY2FzZVwiLCBiZWZvcmVFeHByKSxcbiAgICBfY2F0Y2g6IGt3KFwiY2F0Y2hcIiksXG4gICAgX2NvbnRpbnVlOiBrdyhcImNvbnRpbnVlXCIpLFxuICAgIF9kZWJ1Z2dlcjoga3coXCJkZWJ1Z2dlclwiKSxcbiAgICBfZGVmYXVsdDoga3coXCJkZWZhdWx0XCIsIGJlZm9yZUV4cHIpLFxuICAgIF9kbzoga3coXCJkb1wiLCB7aXNMb29wOiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlfSksXG4gICAgX2Vsc2U6IGt3KFwiZWxzZVwiLCBiZWZvcmVFeHByKSxcbiAgICBfZmluYWxseToga3coXCJmaW5hbGx5XCIpLFxuICAgIF9mb3I6IGt3KFwiZm9yXCIsIHtpc0xvb3A6IHRydWV9KSxcbiAgICBfZnVuY3Rpb246IGt3KFwiZnVuY3Rpb25cIiwgc3RhcnRzRXhwciksXG4gICAgX2lmOiBrdyhcImlmXCIpLFxuICAgIF9yZXR1cm46IGt3KFwicmV0dXJuXCIsIGJlZm9yZUV4cHIpLFxuICAgIF9zd2l0Y2g6IGt3KFwic3dpdGNoXCIpLFxuICAgIF90aHJvdzoga3coXCJ0aHJvd1wiLCBiZWZvcmVFeHByKSxcbiAgICBfdHJ5OiBrdyhcInRyeVwiKSxcbiAgICBfdmFyOiBrdyhcInZhclwiKSxcbiAgICBfY29uc3Q6IGt3KFwiY29uc3RcIiksXG4gICAgX3doaWxlOiBrdyhcIndoaWxlXCIsIHtpc0xvb3A6IHRydWV9KSxcbiAgICBfd2l0aDoga3coXCJ3aXRoXCIpLFxuICAgIF9uZXc6IGt3KFwibmV3XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX3RoaXM6IGt3KFwidGhpc1wiLCBzdGFydHNFeHByKSxcbiAgICBfc3VwZXI6IGt3KFwic3VwZXJcIiwgc3RhcnRzRXhwciksXG4gICAgX2NsYXNzOiBrdyhcImNsYXNzXCIsIHN0YXJ0c0V4cHIpLFxuICAgIF9leHRlbmRzOiBrdyhcImV4dGVuZHNcIiwgYmVmb3JlRXhwciksXG4gICAgX2V4cG9ydDoga3coXCJleHBvcnRcIiksXG4gICAgX2ltcG9ydDoga3coXCJpbXBvcnRcIiwgc3RhcnRzRXhwciksXG4gICAgX251bGw6IGt3KFwibnVsbFwiLCBzdGFydHNFeHByKSxcbiAgICBfdHJ1ZToga3coXCJ0cnVlXCIsIHN0YXJ0c0V4cHIpLFxuICAgIF9mYWxzZToga3coXCJmYWxzZVwiLCBzdGFydHNFeHByKSxcbiAgICBfaW46IGt3KFwiaW5cIiwge2JlZm9yZUV4cHI6IHRydWUsIGJpbm9wOiA3fSksXG4gICAgX2luc3RhbmNlb2Y6IGt3KFwiaW5zdGFuY2VvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgYmlub3A6IDd9KSxcbiAgICBfdHlwZW9mOiBrdyhcInR5cGVvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX3ZvaWQ6IGt3KFwidm9pZFwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gICAgX2RlbGV0ZToga3coXCJkZWxldGVcIiwge2JlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pXG4gIH07XG5cbiAgLy8gTWF0Y2hlcyBhIHdob2xlIGxpbmUgYnJlYWsgKHdoZXJlIENSTEYgaXMgY29uc2lkZXJlZCBhIHNpbmdsZVxuICAvLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy5cblxuICB2YXIgbGluZUJyZWFrID0gL1xcclxcbj98XFxufFxcdTIwMjh8XFx1MjAyOS87XG4gIHZhciBsaW5lQnJlYWtHID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCBcImdcIik7XG5cbiAgZnVuY3Rpb24gaXNOZXdMaW5lKGNvZGUsIGVjbWEyMDE5U3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IDEwIHx8IGNvZGUgPT09IDEzIHx8ICghZWNtYTIwMTlTdHJpbmcgJiYgKGNvZGUgPT09IDB4MjAyOCB8fCBjb2RlID09PSAweDIwMjkpKVxuICB9XG5cbiAgdmFyIG5vbkFTQ0lJd2hpdGVzcGFjZSA9IC9bXFx1MTY4MFxcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdWZlZmZdLztcblxuICB2YXIgc2tpcFdoaXRlU3BhY2UgPSAvKD86XFxzfFxcL1xcLy4qfFxcL1xcKlteXSo/XFwqXFwvKSovZztcblxuICB2YXIgcmVmID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093blByb3BlcnR5ID0gcmVmLmhhc093blByb3BlcnR5O1xuICB2YXIgdG9TdHJpbmcgPSByZWYudG9TdHJpbmc7XG5cbiAgLy8gQ2hlY2tzIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS5cblxuICBmdW5jdGlvbiBoYXMob2JqLCBwcm9wTmFtZSkge1xuICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcE5hbWUpXG4gIH1cblxuICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgKGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIChcbiAgICB0b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIlxuICApOyB9KTtcblxuICBmdW5jdGlvbiB3b3Jkc1JlZ2V4cCh3b3Jkcykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgd29yZHMucmVwbGFjZSgvIC9nLCBcInxcIikgKyBcIikkXCIpXG4gIH1cblxuICAvLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGZvciB0aGVcbiAgLy8gYHN0YXJ0TG9jYCBhbmQgYGVuZExvY2AgcHJvcGVydGllcy5cblxuICB2YXIgUG9zaXRpb24gPSBmdW5jdGlvbiBQb3NpdGlvbihsaW5lLCBjb2wpIHtcbiAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIHRoaXMuY29sdW1uID0gY29sO1xuICB9O1xuXG4gIFBvc2l0aW9uLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQgKG4pIHtcbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZSwgdGhpcy5jb2x1bW4gKyBuKVxuICB9O1xuXG4gIHZhciBTb3VyY2VMb2NhdGlvbiA9IGZ1bmN0aW9uIFNvdXJjZUxvY2F0aW9uKHAsIHN0YXJ0LCBlbmQpIHtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgaWYgKHAuc291cmNlRmlsZSAhPT0gbnVsbCkgeyB0aGlzLnNvdXJjZSA9IHAuc291cmNlRmlsZTsgfVxuICB9O1xuXG4gIC8vIFRoZSBgZ2V0TGluZUluZm9gIGZ1bmN0aW9uIGlzIG1vc3RseSB1c2VmdWwgd2hlbiB0aGVcbiAgLy8gYGxvY2F0aW9uc2Agb3B0aW9uIGlzIG9mZiAoZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMpIGFuZCB5b3VcbiAgLy8gd2FudCB0byBmaW5kIHRoZSBsaW5lL2NvbHVtbiBwb3NpdGlvbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXJcbiAgLy8gb2Zmc2V0LiBgaW5wdXRgIHNob3VsZCBiZSB0aGUgY29kZSBzdHJpbmcgdGhhdCB0aGUgb2Zmc2V0IHJlZmVyc1xuICAvLyBpbnRvLlxuXG4gIGZ1bmN0aW9uIGdldExpbmVJbmZvKGlucHV0LCBvZmZzZXQpIHtcbiAgICBmb3IgKHZhciBsaW5lID0gMSwgY3VyID0gMDs7KSB7XG4gICAgICBsaW5lQnJlYWtHLmxhc3RJbmRleCA9IGN1cjtcbiAgICAgIHZhciBtYXRjaCA9IGxpbmVCcmVha0cuZXhlYyhpbnB1dCk7XG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPCBvZmZzZXQpIHtcbiAgICAgICAgKytsaW5lO1xuICAgICAgICBjdXIgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24obGluZSwgb2Zmc2V0IC0gY3VyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBmdXJ0aGVyIGNvbmZpZ3VyZVxuICAvLyB0aGUgcGFyc2VyIHByb2Nlc3MuIFRoZXNlIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6XG5cbiAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIGBlY21hVmVyc2lvbmAgaW5kaWNhdGVzIHRoZSBFQ01BU2NyaXB0IHZlcnNpb24gdG8gcGFyc2UuIE11c3QgYmVcbiAgICAvLyBlaXRoZXIgMywgNSwgNiAoMjAxNSksIDcgKDIwMTYpLCA4ICgyMDE3KSwgOSAoMjAxOCksIG9yIDEwXG4gICAgLy8gKDIwMTkpLiBUaGlzIGluZmx1ZW5jZXMgc3VwcG9ydCBmb3Igc3RyaWN0IG1vZGUsIHRoZSBzZXQgb2ZcbiAgICAvLyByZXNlcnZlZCB3b3JkcywgYW5kIHN1cHBvcnQgZm9yIG5ldyBzeW50YXggZmVhdHVyZXMuIFRoZSBkZWZhdWx0XG4gICAgLy8gaXMgMTAuXG4gICAgZWNtYVZlcnNpb246IDEwLFxuICAgIC8vIGBzb3VyY2VUeXBlYCBpbmRpY2F0ZXMgdGhlIG1vZGUgdGhlIGNvZGUgc2hvdWxkIGJlIHBhcnNlZCBpbi5cbiAgICAvLyBDYW4gYmUgZWl0aGVyIGBcInNjcmlwdFwiYCBvciBgXCJtb2R1bGVcImAuIFRoaXMgaW5mbHVlbmNlcyBnbG9iYWxcbiAgICAvLyBzdHJpY3QgbW9kZSBhbmQgcGFyc2luZyBvZiBgaW1wb3J0YCBhbmQgYGV4cG9ydGAgZGVjbGFyYXRpb25zLlxuICAgIHNvdXJjZVR5cGU6IFwic2NyaXB0XCIsXG4gICAgLy8gYG9uSW5zZXJ0ZWRTZW1pY29sb25gIGNhbiBiZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWRcbiAgICAvLyB3aGVuIGEgc2VtaWNvbG9uIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQuIEl0IHdpbGwgYmUgcGFzc2VkXG4gICAgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb21tYSBhcyBhbiBvZmZzZXQsIGFuZCBpZiBgbG9jYXRpb25zYCBpc1xuICAgIC8vIGVuYWJsZWQsIGl0IGlzIGdpdmVuIHRoZSBsb2NhdGlvbiBhcyBhIGB7bGluZSwgY29sdW1ufWAgb2JqZWN0XG4gICAgLy8gYXMgc2Vjb25kIGFyZ3VtZW50LlxuICAgIG9uSW5zZXJ0ZWRTZW1pY29sb246IG51bGwsXG4gICAgLy8gYG9uVHJhaWxpbmdDb21tYWAgaXMgc2ltaWxhciB0byBgb25JbnNlcnRlZFNlbWljb2xvbmAsIGJ1dCBmb3JcbiAgICAvLyB0cmFpbGluZyBjb21tYXMuXG4gICAgb25UcmFpbGluZ0NvbW1hOiBudWxsLFxuICAgIC8vIEJ5IGRlZmF1bHQsIHJlc2VydmVkIHdvcmRzIGFyZSBvbmx5IGVuZm9yY2VkIGlmIGVjbWFWZXJzaW9uID49IDUuXG4gICAgLy8gU2V0IGBhbGxvd1Jlc2VydmVkYCB0byBhIGJvb2xlYW4gdmFsdWUgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb25cbiAgICAvLyBhbiBvZmYuIFdoZW4gdGhpcyBvcHRpb24gaGFzIHRoZSB2YWx1ZSBcIm5ldmVyXCIsIHJlc2VydmVkIHdvcmRzXG4gICAgLy8gYW5kIGtleXdvcmRzIGNhbiBhbHNvIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5IG5hbWVzLlxuICAgIGFsbG93UmVzZXJ2ZWQ6IG51bGwsXG4gICAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gICAgLy8gZXJyb3IuXG4gICAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGZhbHNlLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgaW1wb3J0L2V4cG9ydCBzdGF0ZW1lbnRzIGFyZSBub3QgY29uc3RyYWluZWQgdG9cbiAgICAvLyBhcHBlYXJpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbS5cbiAgICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGZhbHNlLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgYXdhaXQgaWRlbnRpZmllcnMgYXJlIGFsbG93ZWQgdG8gYXBwZWFyIGF0IHRoZSB0b3AtbGV2ZWwgc2NvcGUsXG4gICAgLy8gYnV0IHRoZXkgYXJlIHN0aWxsIG5vdCBhbGxvd2VkIGluIG5vbi1hc3luYyBmdW5jdGlvbnMuXG4gICAgYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gICAgLy8gV2hlbiBlbmFibGVkLCBoYXNoYmFuZyBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiBmaWxlXG4gICAgLy8gaXMgYWxsb3dlZCBhbmQgdHJlYXRlZCBhcyBhIGxpbmUgY29tbWVudC5cbiAgICBhbGxvd0hhc2hCYW5nOiBmYWxzZSxcbiAgICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCBgbG9jYCBwcm9wZXJ0aWVzIGhvbGRpbmcgb2JqZWN0cyB3aXRoXG4gICAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBpbiBge2xpbmUsIGNvbHVtbn1gIGZvcm0gKHdpdGhcbiAgICAvLyBsaW5lIGJlaW5nIDEtYmFzZWQgYW5kIGNvbHVtbiAwLWJhc2VkKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5vZGVzLlxuICAgIGxvY2F0aW9uczogZmFsc2UsXG4gICAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvblRva2VuYCBvcHRpb24sIHdoaWNoIHdpbGxcbiAgICAvLyBjYXVzZSBBY29ybiB0byBjYWxsIHRoYXQgZnVuY3Rpb24gd2l0aCBvYmplY3QgaW4gdGhlIHNhbWVcbiAgICAvLyBmb3JtYXQgYXMgdG9rZW5zIHJldHVybmVkIGZyb20gYHRva2VuaXplcigpLmdldFRva2VuKClgLiBOb3RlXG4gICAgLy8gdGhhdCB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgdGhlIHBhcnNlciBmcm9tIHRoZVxuICAgIC8vIGNhbGxiYWNrXHUyMDE0dGhhdCB3aWxsIGNvcnJ1cHQgaXRzIGludGVybmFsIHN0YXRlLlxuICAgIG9uVG9rZW46IG51bGwsXG4gICAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvbkNvbW1lbnRgIG9wdGlvbiwgd2hpY2ggd2lsbFxuICAgIC8vIGNhdXNlIEFjb3JuIHRvIGNhbGwgdGhhdCBmdW5jdGlvbiB3aXRoIGAoYmxvY2ssIHRleHQsIHN0YXJ0LFxuICAgIC8vIGVuZClgIHBhcmFtZXRlcnMgd2hlbmV2ZXIgYSBjb21tZW50IGlzIHNraXBwZWQuIGBibG9ja2AgaXMgYVxuICAgIC8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgYSBibG9jayAoYC8qICovYCkgY29tbWVudCxcbiAgICAvLyBgdGV4dGAgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnQsIGFuZCBgc3RhcnRgIGFuZCBgZW5kYCBhcmVcbiAgICAvLyBjaGFyYWN0ZXIgb2Zmc2V0cyB0aGF0IGRlbm90ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tbWVudC5cbiAgICAvLyBXaGVuIHRoZSBgbG9jYXRpb25zYCBvcHRpb24gaXMgb24sIHR3byBtb3JlIHBhcmFtZXRlcnMgYXJlXG4gICAgLy8gcGFzc2VkLCB0aGUgZnVsbCBge2xpbmUsIGNvbHVtbn1gIGxvY2F0aW9ucyBvZiB0aGUgc3RhcnQgYW5kXG4gICAgLy8gZW5kIG9mIHRoZSBjb21tZW50cy4gTm90ZSB0aGF0IHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCB0aGVcbiAgICAvLyBwYXJzZXIgZnJvbSB0aGUgY2FsbGJhY2tcdTIwMTR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuXG4gICAgb25Db21tZW50OiBudWxsLFxuICAgIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgICAvLyBgc3RhcnRgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzIChkaXJlY3RseSBvbiB0aGUgbm9kZSwgcmF0aGVyIHRoYW5cbiAgICAvLyB0aGUgYGxvY2Agb2JqZWN0LCB3aGljaCBob2xkcyBsaW5lL2NvbHVtbiBkYXRhLiBUbyBhbHNvIGFkZCBhXG4gICAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgICAvLyBlbmRdYCBhcnJheSB3aXRoIHRoZSBzYW1lIG51bWJlcnMsIHNldCB0aGUgYHJhbmdlc2Agb3B0aW9uIHRvXG4gICAgLy8gYHRydWVgLlxuICAgIC8vXG4gICAgLy8gW3JhbmdlXTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1Njc4XG4gICAgcmFuZ2VzOiBmYWxzZSxcbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0byBwYXJzZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIEFTVCBieVxuICAgIC8vIHBhc3NpbmcgdGhlIHRyZWUgcHJvZHVjZWQgYnkgcGFyc2luZyB0aGUgZmlyc3QgZmlsZSBhc1xuICAgIC8vIGBwcm9ncmFtYCBvcHRpb24gaW4gc3Vic2VxdWVudCBwYXJzZXMuIFRoaXMgd2lsbCBhZGQgdGhlXG4gICAgLy8gdG9wbGV2ZWwgZm9ybXMgb2YgdGhlIHBhcnNlZCBmaWxlIHRvIHRoZSBgUHJvZ3JhbWAgKHRvcCkgbm9kZVxuICAgIC8vIG9mIGFuIGV4aXN0aW5nIHBhcnNlIHRyZWUuXG4gICAgcHJvZ3JhbTogbnVsbCxcbiAgICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCB5b3UgY2FuIHBhc3MgdGhpcyB0byByZWNvcmQgdGhlIHNvdXJjZVxuICAgIC8vIGZpbGUgaW4gZXZlcnkgbm9kZSdzIGBsb2NgIG9iamVjdC5cbiAgICBzb3VyY2VGaWxlOiBudWxsLFxuICAgIC8vIFRoaXMgdmFsdWUsIGlmIGdpdmVuLCBpcyBzdG9yZWQgaW4gZXZlcnkgbm9kZSwgd2hldGhlclxuICAgIC8vIGBsb2NhdGlvbnNgIGlzIG9uIG9yIG9mZi5cbiAgICBkaXJlY3RTb3VyY2VGaWxlOiBudWxsLFxuICAgIC8vIFdoZW4gZW5hYmxlZCwgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucyBhcmUgcmVwcmVzZW50ZWQgYnlcbiAgICAvLyAobm9uLXN0YW5kYXJkKSBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2Rlc1xuICAgIHByZXNlcnZlUGFyZW5zOiBmYWxzZVxuICB9O1xuXG4gIC8vIEludGVycHJldCBhbmQgZGVmYXVsdCBhbiBvcHRpb25zIG9iamVjdFxuXG4gIGZ1bmN0aW9uIGdldE9wdGlvbnMob3B0cykge1xuICAgIHZhciBvcHRpb25zID0ge307XG5cbiAgICBmb3IgKHZhciBvcHQgaW4gZGVmYXVsdE9wdGlvbnMpXG4gICAgICB7IG9wdGlvbnNbb3B0XSA9IG9wdHMgJiYgaGFzKG9wdHMsIG9wdCkgPyBvcHRzW29wdF0gOiBkZWZhdWx0T3B0aW9uc1tvcHRdOyB9XG5cbiAgICBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA+PSAyMDE1KVxuICAgICAgeyBvcHRpb25zLmVjbWFWZXJzaW9uIC09IDIwMDk7IH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgPT0gbnVsbClcbiAgICAgIHsgb3B0aW9ucy5hbGxvd1Jlc2VydmVkID0gb3B0aW9ucy5lY21hVmVyc2lvbiA8IDU7IH1cblxuICAgIGlmIChpc0FycmF5KG9wdGlvbnMub25Ub2tlbikpIHtcbiAgICAgIHZhciB0b2tlbnMgPSBvcHRpb25zLm9uVG9rZW47XG4gICAgICBvcHRpb25zLm9uVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHsgcmV0dXJuIHRva2Vucy5wdXNoKHRva2VuKTsgfTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob3B0aW9ucy5vbkNvbW1lbnQpKVxuICAgICAgeyBvcHRpb25zLm9uQ29tbWVudCA9IHB1c2hDb21tZW50KG9wdGlvbnMsIG9wdGlvbnMub25Db21tZW50KTsgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2hDb21tZW50KG9wdGlvbnMsIGFycmF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGJsb2NrLCB0ZXh0LCBzdGFydCwgZW5kLCBzdGFydExvYywgZW5kTG9jKSB7XG4gICAgICB2YXIgY29tbWVudCA9IHtcbiAgICAgICAgdHlwZTogYmxvY2sgPyBcIkJsb2NrXCIgOiBcIkxpbmVcIixcbiAgICAgICAgdmFsdWU6IHRleHQsXG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmRcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgICAgIHsgY29tbWVudC5sb2MgPSBuZXcgU291cmNlTG9jYXRpb24odGhpcywgc3RhcnRMb2MsIGVuZExvYyk7IH1cbiAgICAgIGlmIChvcHRpb25zLnJhbmdlcylcbiAgICAgICAgeyBjb21tZW50LnJhbmdlID0gW3N0YXJ0LCBlbmRdOyB9XG4gICAgICBhcnJheS5wdXNoKGNvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggc2NvcGUgZ2V0cyBhIGJpdHNldCB0aGF0IG1heSBjb250YWluIHRoZXNlIGZsYWdzXG4gIHZhclxuICAgICAgU0NPUEVfVE9QID0gMSxcbiAgICAgIFNDT1BFX0ZVTkNUSU9OID0gMixcbiAgICAgIFNDT1BFX1ZBUiA9IFNDT1BFX1RPUCB8IFNDT1BFX0ZVTkNUSU9OLFxuICAgICAgU0NPUEVfQVNZTkMgPSA0LFxuICAgICAgU0NPUEVfR0VORVJBVE9SID0gOCxcbiAgICAgIFNDT1BFX0FSUk9XID0gMTYsXG4gICAgICBTQ09QRV9TSU1QTEVfQ0FUQ0ggPSAzMixcbiAgICAgIFNDT1BFX1NVUEVSID0gNjQsXG4gICAgICBTQ09QRV9ESVJFQ1RfU1VQRVIgPSAxMjg7XG5cbiAgZnVuY3Rpb24gZnVuY3Rpb25GbGFncyhhc3luYywgZ2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIFNDT1BFX0ZVTkNUSU9OIHwgKGFzeW5jID8gU0NPUEVfQVNZTkMgOiAwKSB8IChnZW5lcmF0b3IgPyBTQ09QRV9HRU5FUkFUT1IgOiAwKVxuICB9XG5cbiAgLy8gVXNlZCBpbiBjaGVja0xWYWwgYW5kIGRlY2xhcmVOYW1lIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhIGJpbmRpbmdcbiAgdmFyXG4gICAgICBCSU5EX05PTkUgPSAwLCAvLyBOb3QgYSBiaW5kaW5nXG4gICAgICBCSU5EX1ZBUiA9IDEsIC8vIFZhci1zdHlsZSBiaW5kaW5nXG4gICAgICBCSU5EX0xFWElDQUwgPSAyLCAvLyBMZXQtIG9yIGNvbnN0LXN0eWxlIGJpbmRpbmdcbiAgICAgIEJJTkRfRlVOQ1RJT04gPSAzLCAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgQklORF9TSU1QTEVfQ0FUQ0ggPSA0LCAvLyBTaW1wbGUgKGlkZW50aWZpZXIgcGF0dGVybikgY2F0Y2ggYmluZGluZ1xuICAgICAgQklORF9PVVRTSURFID0gNTsgLy8gU3BlY2lhbCBjYXNlIGZvciBmdW5jdGlvbiBuYW1lcyBhcyBib3VuZCBpbnNpZGUgdGhlIGZ1bmN0aW9uXG5cbiAgdmFyIFBhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihvcHRpb25zLCBpbnB1dCwgc3RhcnRQb3MpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gZ2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLnNvdXJjZUZpbGUgPSBvcHRpb25zLnNvdXJjZUZpbGU7XG4gICAgdGhpcy5rZXl3b3JkcyA9IHdvcmRzUmVnZXhwKGtleXdvcmRzW29wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiA/IDYgOiBvcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCIgPyBcIjVtb2R1bGVcIiA6IDVdKTtcbiAgICB2YXIgcmVzZXJ2ZWQgPSBcIlwiO1xuICAgIGlmIChvcHRpb25zLmFsbG93UmVzZXJ2ZWQgIT09IHRydWUpIHtcbiAgICAgIGZvciAodmFyIHYgPSBvcHRpb25zLmVjbWFWZXJzaW9uOzsgdi0tKVxuICAgICAgICB7IGlmIChyZXNlcnZlZCA9IHJlc2VydmVkV29yZHNbdl0pIHsgYnJlYWsgfSB9XG4gICAgICBpZiAob3B0aW9ucy5zb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiKSB7IHJlc2VydmVkICs9IFwiIGF3YWl0XCI7IH1cbiAgICB9XG4gICAgdGhpcy5yZXNlcnZlZFdvcmRzID0gd29yZHNSZWdleHAocmVzZXJ2ZWQpO1xuICAgIHZhciByZXNlcnZlZFN0cmljdCA9IChyZXNlcnZlZCA/IHJlc2VydmVkICsgXCIgXCIgOiBcIlwiKSArIHJlc2VydmVkV29yZHMuc3RyaWN0O1xuICAgIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdCA9IHdvcmRzUmVnZXhwKHJlc2VydmVkU3RyaWN0KTtcbiAgICB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3RCaW5kID0gd29yZHNSZWdleHAocmVzZXJ2ZWRTdHJpY3QgKyBcIiBcIiArIHJlc2VydmVkV29yZHMuc3RyaWN0QmluZCk7XG4gICAgdGhpcy5pbnB1dCA9IFN0cmluZyhpbnB1dCk7XG5cbiAgICAvLyBVc2VkIHRvIHNpZ25hbCB0byBjYWxsZXJzIG9mIGByZWFkV29yZDFgIHdoZXRoZXIgdGhlIHdvcmRcbiAgICAvLyBjb250YWluZWQgYW55IGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd29yZHMgd2l0aFxuICAgIC8vIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMga2V5d29yZHMuXG4gICAgdGhpcy5jb250YWluc0VzYyA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHVwIHRva2VuIHN0YXRlXG5cbiAgICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC5cbiAgICBpZiAoc3RhcnRQb3MpIHtcbiAgICAgIHRoaXMucG9zID0gc3RhcnRQb3M7XG4gICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5wdXQubGFzdEluZGV4T2YoXCJcXG5cIiwgc3RhcnRQb3MgLSAxKSArIDE7XG4gICAgICB0aGlzLmN1ckxpbmUgPSB0aGlzLmlucHV0LnNsaWNlKDAsIHRoaXMubGluZVN0YXJ0KS5zcGxpdChsaW5lQnJlYWspLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLmxpbmVTdGFydCA9IDA7XG4gICAgICB0aGlzLmN1ckxpbmUgPSAxO1xuICAgIH1cblxuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gICAgLy8gSXRzIHR5cGVcbiAgICB0aGlzLnR5cGUgPSB0eXBlcy5lb2Y7XG4gICAgLy8gRm9yIHRva2VucyB0aGF0IGluY2x1ZGUgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZWlyIHR5cGUsIHRoZSB2YWx1ZVxuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIC8vIEl0cyBzdGFydCBhbmQgZW5kIG9mZnNldFxuICAgIHRoaXMuc3RhcnQgPSB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICAgIC8vIEFuZCwgaWYgbG9jYXRpb25zIGFyZSB1c2VkLCB0aGUge2xpbmUsIGNvbHVtbn0gb2JqZWN0XG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aG9zZSBvZmZzZXRzXG4gICAgdGhpcy5zdGFydExvYyA9IHRoaXMuZW5kTG9jID0gdGhpcy5jdXJQb3NpdGlvbigpO1xuXG4gICAgLy8gUG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBwcmV2aW91cyB0b2tlblxuICAgIHRoaXMubGFzdFRva0VuZExvYyA9IHRoaXMubGFzdFRva1N0YXJ0TG9jID0gbnVsbDtcbiAgICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMubGFzdFRva0VuZCA9IHRoaXMucG9zO1xuXG4gICAgLy8gVGhlIGNvbnRleHQgc3RhY2sgaXMgdXNlZCB0byBzdXBlcmZpY2lhbGx5IHRyYWNrIHN5bnRhY3RpY1xuICAgIC8vIGNvbnRleHQgdG8gcHJlZGljdCB3aGV0aGVyIGEgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG93ZWQgaW4gYVxuICAgIC8vIGdpdmVuIHBvc2l0aW9uLlxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuaW5pdGlhbENvbnRleHQoKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcblxuICAgIC8vIEZpZ3VyZSBvdXQgaWYgaXQncyBhIG1vZHVsZSBjb2RlLlxuICAgIHRoaXMuaW5Nb2R1bGUgPSBvcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCI7XG4gICAgdGhpcy5zdHJpY3QgPSB0aGlzLmluTW9kdWxlIHx8IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMucG9zKTtcblxuICAgIC8vIFVzZWQgdG8gc2lnbmlmeSB0aGUgc3RhcnQgb2YgYSBwb3RlbnRpYWwgYXJyb3cgZnVuY3Rpb25cbiAgICB0aGlzLnBvdGVudGlhbEFycm93QXQgPSAtMTtcblxuICAgIC8vIFBvc2l0aW9ucyB0byBkZWxheWVkLWNoZWNrIHRoYXQgeWllbGQvYXdhaXQgZG9lcyBub3QgZXhpc3QgaW4gZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICAgIHRoaXMueWllbGRQb3MgPSB0aGlzLmF3YWl0UG9zID0gdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICAvLyBMYWJlbHMgaW4gc2NvcGUuXG4gICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAvLyBUaHVzLWZhciB1bmRlZmluZWQgZXhwb3J0cy5cbiAgICB0aGlzLnVuZGVmaW5lZEV4cG9ydHMgPSB7fTtcblxuICAgIC8vIElmIGVuYWJsZWQsIHNraXAgbGVhZGluZyBoYXNoYmFuZyBsaW5lLlxuICAgIGlmICh0aGlzLnBvcyA9PT0gMCAmJiBvcHRpb25zLmFsbG93SGFzaEJhbmcgJiYgdGhpcy5pbnB1dC5zbGljZSgwLCAyKSA9PT0gXCIjIVwiKVxuICAgICAgeyB0aGlzLnNraXBMaW5lQ29tbWVudCgyKTsgfVxuXG4gICAgLy8gU2NvcGUgdHJhY2tpbmcgZm9yIGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcyAoc2VlIHNjb3BlLmpzKVxuICAgIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICAgIHRoaXMuZW50ZXJTY29wZShTQ09QRV9UT1ApO1xuXG4gICAgLy8gRm9yIFJlZ0V4cCB2YWxpZGF0aW9uXG4gICAgdGhpcy5yZWdleHBTdGF0ZSA9IG51bGw7XG4gIH07XG5cbiAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgaW5GdW5jdGlvbjogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbkdlbmVyYXRvcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbkFzeW5jOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGFsbG93U3VwZXI6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxsb3dEaXJlY3RTdXBlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSx0cmVhdEZ1bmN0aW9uc0FzVmFyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlICgpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMub3B0aW9ucy5wcm9ncmFtIHx8IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRvcExldmVsKG5vZGUpXG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmluRnVuY3Rpb24uZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuY3VycmVudFZhclNjb3BlKCkuZmxhZ3MgJiBTQ09QRV9GVU5DVElPTikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5pbkdlbmVyYXRvci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0dFTkVSQVRPUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5pbkFzeW5jLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRWYXJTY29wZSgpLmZsYWdzICYgU0NPUEVfQVNZTkMpID4gMCB9O1xuICBwcm90b3R5cGVBY2Nlc3NvcnMuYWxsb3dTdXBlci5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MgJiBTQ09QRV9TVVBFUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy5hbGxvd0RpcmVjdFN1cGVyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwIH07XG4gIHByb3RvdHlwZUFjY2Vzc29ycy50cmVhdEZ1bmN0aW9uc0FzVmFyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodGhpcy5jdXJyZW50U2NvcGUoKSkgfTtcblxuICAvLyBTd2l0Y2ggdG8gYSBnZXR0ZXIgZm9yIDcuMC4wLlxuICBQYXJzZXIucHJvdG90eXBlLmluTm9uQXJyb3dGdW5jdGlvbiA9IGZ1bmN0aW9uIGluTm9uQXJyb3dGdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuZmxhZ3MgJiBTQ09QRV9GVU5DVElPTikgPiAwIH07XG5cbiAgUGFyc2VyLmV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZCAoKSB7XG4gICAgICB2YXIgcGx1Z2lucyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIHBsdWdpbnNbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgIHZhciBjbHMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgeyBjbHMgPSBwbHVnaW5zW2ldKGNscyk7IH1cbiAgICByZXR1cm4gY2xzXG4gIH07XG5cbiAgUGFyc2VyLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UgKGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpXG4gIH07XG5cbiAgUGFyc2VyLnBhcnNlRXhwcmVzc2lvbkF0ID0gZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uQXQgKGlucHV0LCBwb3MsIG9wdGlvbnMpIHtcbiAgICB2YXIgcGFyc2VyID0gbmV3IHRoaXMob3B0aW9ucywgaW5wdXQsIHBvcyk7XG4gICAgcGFyc2VyLm5leHRUb2tlbigpO1xuICAgIHJldHVybiBwYXJzZXIucGFyc2VFeHByZXNzaW9uKClcbiAgfTtcblxuICBQYXJzZXIudG9rZW5pemVyID0gZnVuY3Rpb24gdG9rZW5pemVyIChpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgdGhpcyhvcHRpb25zLCBpbnB1dClcbiAgfTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggUGFyc2VyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgdmFyIHBwID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyAjIyBQYXJzZXIgdXRpbGl0aWVzXG5cbiAgdmFyIGxpdGVyYWwgPSAvXig/OicoKD86XFxcXC58W14nXFxcXF0pKj8pJ3xcIigoPzpcXFxcLnxbXlwiXFxcXF0pKj8pXCIpLztcbiAgcHAuc3RyaWN0RGlyZWN0aXZlID0gZnVuY3Rpb24oc3RhcnQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBzdHJpbmcgbGl0ZXJhbC5cbiAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGg7XG4gICAgICB2YXIgbWF0Y2ggPSBsaXRlcmFsLmV4ZWModGhpcy5pbnB1dC5zbGljZShzdGFydCkpO1xuICAgICAgaWYgKCFtYXRjaCkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgaWYgKChtYXRjaFsxXSB8fCBtYXRjaFsyXSkgPT09IFwidXNlIHN0cmljdFwiKSB7XG4gICAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB2YXIgc3BhY2VBZnRlciA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCksIGVuZCA9IHNwYWNlQWZ0ZXIuaW5kZXggKyBzcGFjZUFmdGVyWzBdLmxlbmd0aDtcbiAgICAgICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJBdChlbmQpO1xuICAgICAgICByZXR1cm4gbmV4dCA9PT0gXCI7XCIgfHwgbmV4dCA9PT0gXCJ9XCIgfHxcbiAgICAgICAgICAobGluZUJyZWFrLnRlc3Qoc3BhY2VBZnRlclswXSkgJiZcbiAgICAgICAgICAgISgvWyhgLlsrXFwtLyolPD49LD9eJl0vLnRlc3QobmV4dCkgfHwgbmV4dCA9PT0gXCIhXCIgJiYgdGhpcy5pbnB1dC5jaGFyQXQoZW5kICsgMSkgPT09IFwiPVwiKSlcbiAgICAgIH1cbiAgICAgIHN0YXJ0ICs9IG1hdGNoWzBdLmxlbmd0aDtcblxuICAgICAgLy8gU2tpcCBzZW1pY29sb24sIGlmIGFueS5cbiAgICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGg7XG4gICAgICBpZiAodGhpcy5pbnB1dFtzdGFydF0gPT09IFwiO1wiKVxuICAgICAgICB7IHN0YXJ0Kys7IH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUHJlZGljYXRlIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW5cbiAgLy8gdHlwZSwgYW5kIGlmIHllcywgY29uc3VtZXMgaXQgYXMgYSBzaWRlIGVmZmVjdC5cblxuICBwcC5lYXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH07XG5cbiAgLy8gVGVzdHMgd2hldGhlciBwYXJzZWQgdG9rZW4gaXMgYSBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgcHAuaXNDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy52YWx1ZSA9PT0gbmFtZSAmJiAhdGhpcy5jb250YWluc0VzY1xuICB9O1xuXG4gIC8vIENvbnN1bWVzIGNvbnRleHR1YWwga2V5d29yZCBpZiBwb3NzaWJsZS5cblxuICBwcC5lYXRDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghdGhpcy5pc0NvbnRleHR1YWwobmFtZSkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIC8vIEFzc2VydHMgdGhhdCBmb2xsb3dpbmcgdG9rZW4gaXMgZ2l2ZW4gY29udGV4dHVhbCBrZXl3b3JkLlxuXG4gIHBwLmV4cGVjdENvbnRleHR1YWwgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmVhdENvbnRleHR1YWwobmFtZSkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgfTtcblxuICAvLyBUZXN0IHdoZXRoZXIgYSBzZW1pY29sb24gY2FuIGJlIGluc2VydGVkIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuXG4gIHBwLmNhbkluc2VydFNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzLmVvZiB8fFxuICAgICAgdGhpcy50eXBlID09PSB0eXBlcy5icmFjZVIgfHxcbiAgICAgIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSlcbiAgfTtcblxuICBwcC5pbnNlcnRTZW1pY29sb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKVxuICAgICAgICB7IHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKTsgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH07XG5cbiAgLy8gQ29uc3VtZSBhIHNlbWljb2xvbiwgb3IsIGZhaWxpbmcgdGhhdCwgc2VlIGlmIHdlIGFyZSBhbGxvd2VkIHRvXG4gIC8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG4gIHBwLnNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5lYXQodHlwZXMuc2VtaSkgJiYgIXRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgfTtcblxuICBwcC5hZnRlclRyYWlsaW5nQ29tbWEgPSBmdW5jdGlvbih0b2tUeXBlLCBub3ROZXh0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdG9rVHlwZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vblRyYWlsaW5nQ29tbWEpXG4gICAgICAgIHsgdGhpcy5vcHRpb25zLm9uVHJhaWxpbmdDb21tYSh0aGlzLmxhc3RUb2tTdGFydCwgdGhpcy5sYXN0VG9rU3RhcnRMb2MpOyB9XG4gICAgICBpZiAoIW5vdE5leHQpXG4gICAgICAgIHsgdGhpcy5uZXh0KCk7IH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9O1xuXG4gIC8vIEV4cGVjdCBhIHRva2VuIG9mIGEgZ2l2ZW4gdHlwZS4gSWYgZm91bmQsIGNvbnN1bWUgaXQsIG90aGVyd2lzZSxcbiAgLy8gcmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci5cblxuICBwcC5leHBlY3QgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdGhpcy5lYXQodHlwZSkgfHwgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH07XG5cbiAgLy8gUmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci5cblxuICBwcC51bmV4cGVjdGVkID0gZnVuY3Rpb24ocG9zKSB7XG4gICAgdGhpcy5yYWlzZShwb3MgIT0gbnVsbCA/IHBvcyA6IHRoaXMuc3RhcnQsIFwiVW5leHBlY3RlZCB0b2tlblwiKTtcbiAgfTtcblxuICBmdW5jdGlvbiBEZXN0cnVjdHVyaW5nRXJyb3JzKCkge1xuICAgIHRoaXMuc2hvcnRoYW5kQXNzaWduID1cbiAgICB0aGlzLnRyYWlsaW5nQ29tbWEgPVxuICAgIHRoaXMucGFyZW50aGVzaXplZEFzc2lnbiA9XG4gICAgdGhpcy5wYXJlbnRoZXNpemVkQmluZCA9XG4gICAgdGhpcy5kb3VibGVQcm90byA9XG4gICAgICAtMTtcbiAgfVxuXG4gIHBwLmNoZWNrUGF0dGVybkVycm9ycyA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGlzQXNzaWduKSB7XG4gICAgaWYgKCFyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHJldHVybiB9XG4gICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA+IC0xKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hLCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICAgIHZhciBwYXJlbnMgPSBpc0Fzc2lnbiA/IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA6IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQ7XG4gICAgaWYgKHBhcmVucyA+IC0xKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShwYXJlbnMsIFwiUGFyZW50aGVzaXplZCBwYXR0ZXJuXCIpOyB9XG4gIH07XG5cbiAgcHAuY2hlY2tFeHByZXNzaW9uRXJyb3JzID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgYW5kVGhyb3cpIHtcbiAgICBpZiAoIXJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgc2hvcnRoYW5kQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ247XG4gICAgdmFyIGRvdWJsZVByb3RvID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90bztcbiAgICBpZiAoIWFuZFRocm93KSB7IHJldHVybiBzaG9ydGhhbmRBc3NpZ24gPj0gMCB8fCBkb3VibGVQcm90byA+PSAwIH1cbiAgICBpZiAoc2hvcnRoYW5kQXNzaWduID49IDApXG4gICAgICB7IHRoaXMucmFpc2Uoc2hvcnRoYW5kQXNzaWduLCBcIlNob3J0aGFuZCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBhcmUgdmFsaWQgb25seSBpbiBkZXN0cnVjdHVyaW5nIHBhdHRlcm5zXCIpOyB9XG4gICAgaWYgKGRvdWJsZVByb3RvID49IDApXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShkb3VibGVQcm90bywgXCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5XCIpOyB9XG4gIH07XG5cbiAgcHAuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMueWllbGRQb3MgJiYgKCF0aGlzLmF3YWl0UG9zIHx8IHRoaXMueWllbGRQb3MgPCB0aGlzLmF3YWl0UG9zKSlcbiAgICAgIHsgdGhpcy5yYWlzZSh0aGlzLnlpZWxkUG9zLCBcIllpZWxkIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZVwiKTsgfVxuICAgIGlmICh0aGlzLmF3YWl0UG9zKVxuICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRQb3MsIFwiQXdhaXQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgYSBkZWZhdWx0IHZhbHVlXCIpOyB9XG4gIH07XG5cbiAgcHAuaXNTaW1wbGVBc3NpZ25UYXJnZXQgPSBmdW5jdGlvbihleHByKSB7XG4gICAgaWYgKGV4cHIudHlwZSA9PT0gXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgICAgeyByZXR1cm4gdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByLmV4cHJlc3Npb24pIH1cbiAgICByZXR1cm4gZXhwci50eXBlID09PSBcIklkZW50aWZpZXJcIiB8fCBleHByLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiXG4gIH07XG5cbiAgdmFyIHBwJDEgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vICMjIyBTdGF0ZW1lbnQgcGFyc2luZ1xuXG4gIC8vIFBhcnNlIGEgcHJvZ3JhbS4gSW5pdGlhbGl6ZXMgdGhlIHBhcnNlciwgcmVhZHMgYW55IG51bWJlciBvZlxuICAvLyBzdGF0ZW1lbnRzLCBhbmQgd3JhcHMgdGhlbSBpbiBhIFByb2dyYW0gbm9kZS4gIE9wdGlvbmFsbHkgdGFrZXMgYVxuICAvLyBgcHJvZ3JhbWAgYXJndW1lbnQuICBJZiBwcmVzZW50LCB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIGFwcGVuZGVkXG4gIC8vIHRvIGl0cyBib2R5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgbm9kZS5cblxuICBwcCQxLnBhcnNlVG9wTGV2ZWwgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgICBpZiAoIW5vZGUuYm9keSkgeyBub2RlLmJvZHkgPSBbXTsgfVxuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLmVvZikge1xuICAgICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwsIHRydWUsIGV4cG9ydHMpO1xuICAgICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluTW9kdWxlKVxuICAgICAgeyBmb3IgKHZhciBpID0gMCwgbGlzdCA9IE9iamVjdC5rZXlzKHRoaXMudW5kZWZpbmVkRXhwb3J0cyk7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMudW5kZWZpbmVkRXhwb3J0c1tuYW1lXS5zdGFydCwgKFwiRXhwb3J0ICdcIiArIG5hbWUgKyBcIicgaXMgbm90IGRlZmluZWRcIikpO1xuICAgICAgICB9IH1cbiAgICB0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLnNvdXJjZVR5cGUgPSB0aGlzLm9wdGlvbnMuc291cmNlVHlwZTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUHJvZ3JhbVwiKVxuICB9O1xuXG4gIHZhciBsb29wTGFiZWwgPSB7a2luZDogXCJsb29wXCJ9LCBzd2l0Y2hMYWJlbCA9IHtraW5kOiBcInN3aXRjaFwifTtcblxuICBwcCQxLmlzTGV0ID0gZnVuY3Rpb24oY29udGV4dCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2IHx8ICF0aGlzLmlzQ29udGV4dHVhbChcImxldFwiKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHRoaXMucG9zO1xuICAgIHZhciBza2lwID0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KTtcbiAgICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGgsIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgICAvLyBGb3IgYW1iaWd1b3VzIGNhc2VzLCBkZXRlcm1pbmUgaWYgYSBMZXhpY2FsRGVjbGFyYXRpb24gKG9yIG9ubHkgYVxuICAgIC8vIFN0YXRlbWVudCkgaXMgYWxsb3dlZCBoZXJlLiBJZiBjb250ZXh0IGlzIG5vdCBlbXB0eSB0aGVuIG9ubHkgYSBTdGF0ZW1lbnRcbiAgICAvLyBpcyBhbGxvd2VkLiBIb3dldmVyLCBgbGV0IFtgIGlzIGFuIGV4cGxpY2l0IG5lZ2F0aXZlIGxvb2thaGVhZCBmb3JcbiAgICAvLyBFeHByZXNzaW9uU3RhdGVtZW50LCBzbyBzcGVjaWFsLWNhc2UgaXQgZmlyc3QuXG4gICAgaWYgKG5leHRDaCA9PT0gOTEpIHsgcmV0dXJuIHRydWUgfSAvLyAnWydcbiAgICBpZiAoY29udGV4dCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKG5leHRDaCA9PT0gMTIzKSB7IHJldHVybiB0cnVlIH0gLy8gJ3snXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KG5leHRDaCwgdHJ1ZSkpIHtcbiAgICAgIHZhciBwb3MgPSBuZXh0ICsgMTtcbiAgICAgIHdoaWxlIChpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MpLCB0cnVlKSkgeyArK3BvczsgfVxuICAgICAgdmFyIGlkZW50ID0gdGhpcy5pbnB1dC5zbGljZShuZXh0LCBwb3MpO1xuICAgICAgaWYgKCFrZXl3b3JkUmVsYXRpb25hbE9wZXJhdG9yLnRlc3QoaWRlbnQpKSB7IHJldHVybiB0cnVlIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gY2hlY2sgJ2FzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBmdW5jdGlvbidcbiAgLy8gLSAnYXN5bmMgLypmb28qLyBmdW5jdGlvbicgaXMgT0suXG4gIC8vIC0gJ2FzeW5jIC8qXFxuKi8gZnVuY3Rpb24nIGlzIGludmFsaWQuXG4gIHBwJDEuaXNBc3luY0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDggfHwgIXRoaXMuaXNDb250ZXh0dWFsKFwiYXN5bmNcIikpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSB0aGlzLnBvcztcbiAgICB2YXIgc2tpcCA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7XG4gICAgdmFyIG5leHQgPSB0aGlzLnBvcyArIHNraXBbMF0ubGVuZ3RoO1xuICAgIHJldHVybiAhbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgbmV4dCkpICYmXG4gICAgICB0aGlzLmlucHV0LnNsaWNlKG5leHQsIG5leHQgKyA4KSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAobmV4dCArIDggPT09IHRoaXMuaW5wdXQubGVuZ3RoIHx8ICFpc0lkZW50aWZpZXJDaGFyKHRoaXMuaW5wdXQuY2hhckF0KG5leHQgKyA4KSkpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAvL1xuICAvLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuICAvLyByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbC4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgbGlrZVxuICAvLyBgaWYgKGZvbykgL2JsYWgvLmV4ZWMoZm9vKWAsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuXG4gIC8vIGRvZXMgbm90IGhlbHAuXG5cbiAgcHAkMS5wYXJzZVN0YXRlbWVudCA9IGZ1bmN0aW9uKGNvbnRleHQsIHRvcExldmVsLCBleHBvcnRzKSB7XG4gICAgdmFyIHN0YXJ0dHlwZSA9IHRoaXMudHlwZSwgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGtpbmQ7XG5cbiAgICBpZiAodGhpcy5pc0xldChjb250ZXh0KSkge1xuICAgICAgc3RhcnR0eXBlID0gdHlwZXMuX3ZhcjtcbiAgICAgIGtpbmQgPSBcImxldFwiO1xuICAgIH1cblxuICAgIC8vIE1vc3QgdHlwZXMgb2Ygc3RhdGVtZW50cyBhcmUgcmVjb2duaXplZCBieSB0aGUga2V5d29yZCB0aGV5XG4gICAgLy8gc3RhcnQgd2l0aC4gTWFueSBhcmUgdHJpdmlhbCB0byBwYXJzZSwgc29tZSByZXF1aXJlIGEgYml0IG9mXG4gICAgLy8gY29tcGxleGl0eS5cblxuICAgIHN3aXRjaCAoc3RhcnR0eXBlKSB7XG4gICAgY2FzZSB0eXBlcy5fYnJlYWs6IGNhc2UgdHlwZXMuX2NvbnRpbnVlOiByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgc3RhcnR0eXBlLmtleXdvcmQpXG4gICAgY2FzZSB0eXBlcy5fZGVidWdnZXI6IHJldHVybiB0aGlzLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9kbzogcmV0dXJuIHRoaXMucGFyc2VEb1N0YXRlbWVudChub2RlKVxuICAgIGNhc2UgdHlwZXMuX2ZvcjogcmV0dXJuIHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9mdW5jdGlvbjpcbiAgICAgIC8vIEZ1bmN0aW9uIGFzIHNvbGUgYm9keSBvZiBlaXRoZXIgYW4gaWYgc3RhdGVtZW50IG9yIGEgbGFiZWxlZCBzdGF0ZW1lbnRcbiAgICAgIC8vIHdvcmtzLCBidXQgbm90IHdoZW4gaXQgaXMgcGFydCBvZiBhIGxhYmVsZWQgc3RhdGVtZW50IHRoYXQgaXMgdGhlIHNvbGVcbiAgICAgIC8vIGJvZHkgb2YgYW4gaWYgc3RhdGVtZW50LlxuICAgICAgaWYgKChjb250ZXh0ICYmICh0aGlzLnN0cmljdCB8fCBjb250ZXh0ICE9PSBcImlmXCIgJiYgY29udGV4dCAhPT0gXCJsYWJlbFwiKSkgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQobm9kZSwgZmFsc2UsICFjb250ZXh0KVxuICAgIGNhc2UgdHlwZXMuX2NsYXNzOlxuICAgICAgaWYgKGNvbnRleHQpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3Mobm9kZSwgdHJ1ZSlcbiAgICBjYXNlIHR5cGVzLl9pZjogcmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlKVxuICAgIGNhc2UgdHlwZXMuX3JldHVybjogcmV0dXJuIHRoaXMucGFyc2VSZXR1cm5TdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9zd2l0Y2g6IHJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fdGhyb3c6IHJldHVybiB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl90cnk6IHJldHVybiB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fY29uc3Q6IGNhc2UgdHlwZXMuX3ZhcjpcbiAgICAgIGtpbmQgPSBraW5kIHx8IHRoaXMudmFsdWU7XG4gICAgICBpZiAoY29udGV4dCAmJiBraW5kICE9PSBcInZhclwiKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVZhclN0YXRlbWVudChub2RlLCBraW5kKVxuICAgIGNhc2UgdHlwZXMuX3doaWxlOiByZXR1cm4gdGhpcy5wYXJzZVdoaWxlU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5fd2l0aDogcmV0dXJuIHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KG5vZGUpXG4gICAgY2FzZSB0eXBlcy5icmFjZUw6IHJldHVybiB0aGlzLnBhcnNlQmxvY2sodHJ1ZSwgbm9kZSlcbiAgICBjYXNlIHR5cGVzLnNlbWk6IHJldHVybiB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLl9leHBvcnQ6XG4gICAgY2FzZSB0eXBlcy5faW1wb3J0OlxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+IDEwICYmIHN0YXJ0dHlwZSA9PT0gdHlwZXMuX2ltcG9ydCkge1xuICAgICAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSB0aGlzLnBvcztcbiAgICAgICAgdmFyIHNraXAgPSBza2lwV2hpdGVTcGFjZS5leGVjKHRoaXMuaW5wdXQpO1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGgsIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgaWYgKG5leHRDaCA9PT0gNDAgfHwgbmV4dENoID09PSA0NikgLy8gJygnIG9yICcuJ1xuICAgICAgICAgIHsgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIHRoaXMucGFyc2VFeHByZXNzaW9uKCkpIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlKSB7XG4gICAgICAgIGlmICghdG9wTGV2ZWwpXG4gICAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBvbmx5IGFwcGVhciBhdCB0aGUgdG9wIGxldmVsXCIpOyB9XG4gICAgICAgIGlmICghdGhpcy5pbk1vZHVsZSlcbiAgICAgICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IGFwcGVhciBvbmx5IHdpdGggJ3NvdXJjZVR5cGU6IG1vZHVsZSdcIik7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydHR5cGUgPT09IHR5cGVzLl9pbXBvcnQgPyB0aGlzLnBhcnNlSW1wb3J0KG5vZGUpIDogdGhpcy5wYXJzZUV4cG9ydChub2RlLCBleHBvcnRzKVxuXG4gICAgICAvLyBJZiB0aGUgc3RhdGVtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGF0ZW1lbnQga2V5d29yZCBvciBhXG4gICAgICAvLyBicmFjZSwgaXQncyBhbiBFeHByZXNzaW9uU3RhdGVtZW50IG9yIExhYmVsZWRTdGF0ZW1lbnQuIFdlXG4gICAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlXG4gICAgICAvLyBuZXh0IHRva2VuIGlzIGEgY29sb24gYW5kIHRoZSBleHByZXNzaW9uIHdhcyBhIHNpbXBsZVxuICAgICAgLy8gSWRlbnRpZmllciBub2RlLCB3ZSBzd2l0Y2ggdG8gaW50ZXJwcmV0aW5nIGl0IGFzIGEgbGFiZWwuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0aGlzLmlzQXN5bmNGdW5jdGlvbigpKSB7XG4gICAgICAgIGlmIChjb250ZXh0KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KG5vZGUsIHRydWUsICFjb250ZXh0KVxuICAgICAgfVxuXG4gICAgICB2YXIgbWF5YmVOYW1lID0gdGhpcy52YWx1ZSwgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICBpZiAoc3RhcnR0eXBlID09PSB0eXBlcy5uYW1lICYmIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgdGhpcy5lYXQodHlwZXMuY29sb24pKVxuICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlTGFiZWxlZFN0YXRlbWVudChub2RlLCBtYXliZU5hbWUsIGV4cHIsIGNvbnRleHQpIH1cbiAgICAgIGVsc2UgeyByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgZXhwcikgfVxuICAgIH1cbiAgfTtcblxuICBwcCQxLnBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGtleXdvcmQpIHtcbiAgICB2YXIgaXNCcmVhayA9IGtleXdvcmQgPT09IFwiYnJlYWtcIjtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAodGhpcy5lYXQodHlwZXMuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmxhYmVsID0gbnVsbDsgfVxuICAgIGVsc2UgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSkgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIGVsc2Uge1xuICAgICAgbm9kZS5sYWJlbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhbiBhY3R1YWwgZGVzdGluYXRpb24gdG8gYnJlYWsgb3JcbiAgICAvLyBjb250aW51ZSB0by5cbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGxhYiA9IHRoaXMubGFiZWxzW2ldO1xuICAgICAgaWYgKG5vZGUubGFiZWwgPT0gbnVsbCB8fCBsYWIubmFtZSA9PT0gbm9kZS5sYWJlbC5uYW1lKSB7XG4gICAgICAgIGlmIChsYWIua2luZCAhPSBudWxsICYmIChpc0JyZWFrIHx8IGxhYi5raW5kID09PSBcImxvb3BcIikpIHsgYnJlYWsgfVxuICAgICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IHRoaXMubGFiZWxzLmxlbmd0aCkgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiVW5zeW50YWN0aWMgXCIgKyBrZXl3b3JkKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgaXNCcmVhayA/IFwiQnJlYWtTdGF0ZW1lbnRcIiA6IFwiQ29udGludWVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRG9TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJkb1wiKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5fd2hpbGUpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpXG4gICAgICB7IHRoaXMuZWF0KHR5cGVzLnNlbWkpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLnNlbWljb2xvbigpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRvV2hpbGVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBEaXNhbWJpZ3VhdGluZyBiZXR3ZWVuIGEgYGZvcmAgYW5kIGEgYGZvcmAvYGluYCBvciBgZm9yYC9gb2ZgXG4gIC8vIGxvb3AgaXMgbm9uLXRyaXZpYWwuIEJhc2ljYWxseSwgd2UgaGF2ZSB0byBwYXJzZSB0aGUgaW5pdCBgdmFyYFxuICAvLyBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiwgZGlzYWxsb3dpbmcgdGhlIGBpbmAgb3BlcmF0b3IgKHNlZVxuICAvLyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgcGFyc2VFeHByZXNzaW9uYCksIGFuZCB0aGVuIGNoZWNrXG4gIC8vIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gaXMgYGluYCBvciBgb2ZgLiBXaGVuIHRoZXJlIGlzIG5vIGluaXRcbiAgLy8gcGFydCAoc2VtaWNvbG9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzKSwgaXRcbiAgLy8gaXMgYSByZWd1bGFyIGBmb3JgIGxvb3AuXG5cbiAgcHAkMS5wYXJzZUZvclN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB2YXIgYXdhaXRBdCA9ICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiAodGhpcy5pbkFzeW5jIHx8ICghdGhpcy5pbkZ1bmN0aW9uICYmIHRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uKSkgJiYgdGhpcy5lYXRDb250ZXh0dWFsKFwiYXdhaXRcIikpID8gdGhpcy5sYXN0VG9rU3RhcnQgOiAtMTtcbiAgICB0aGlzLmxhYmVscy5wdXNoKGxvb3BMYWJlbCk7XG4gICAgdGhpcy5lbnRlclNjb3BlKDApO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc2VtaSkge1xuICAgICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIG51bGwpXG4gICAgfVxuICAgIHZhciBpc0xldCA9IHRoaXMuaXNMZXQoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5fdmFyIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMuX2NvbnN0IHx8IGlzTGV0KSB7XG4gICAgICB2YXIgaW5pdCQxID0gdGhpcy5zdGFydE5vZGUoKSwga2luZCA9IGlzTGV0ID8gXCJsZXRcIiA6IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMucGFyc2VWYXIoaW5pdCQxLCB0cnVlLCBraW5kKTtcbiAgICAgIHRoaXMuZmluaXNoTm9kZShpbml0JDEsIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKTtcbiAgICAgIGlmICgodGhpcy50eXBlID09PSB0eXBlcy5faW4gfHwgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpKSAmJiBpbml0JDEuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5faW4pIHtcbiAgICAgICAgICAgIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gICAgICAgICAgfSBlbHNlIHsgbm9kZS5hd2FpdCA9IGF3YWl0QXQgPiAtMTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9ySW4obm9kZSwgaW5pdCQxKVxuICAgICAgfVxuICAgICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIGluaXQkMSlcbiAgICB9XG4gICAgdmFyIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICB2YXIgaW5pdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKHRydWUsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5faW4pIHtcbiAgICAgICAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgICAgICB9IGVsc2UgeyBub2RlLmF3YWl0ID0gYXdhaXRBdCA+IC0xOyB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShpbml0LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChpbml0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9ySW4obm9kZSwgaW5pdClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChhd2FpdEF0ID4gLTEpIHsgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgaW5pdClcbiAgfTtcblxuICBwcCQxLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBpc0FzeW5jLCBkZWNsYXJhdGlvblBvc2l0aW9uKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLCBGVU5DX1NUQVRFTUVOVCB8IChkZWNsYXJhdGlvblBvc2l0aW9uID8gMCA6IEZVTkNfSEFOR0lOR19TVEFURU1FTlQpLCBmYWxzZSwgaXNBc3luYylcbiAgfTtcblxuICBwcCQxLnBhcnNlSWZTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIC8vIGFsbG93IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiBicmFuY2hlcywgYnV0IG9ubHkgaW4gbm9uLXN0cmljdCBtb2RlXG4gICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpO1xuICAgIG5vZGUuYWx0ZXJuYXRlID0gdGhpcy5lYXQodHlwZXMuX2Vsc2UpID8gdGhpcy5wYXJzZVN0YXRlbWVudChcImlmXCIpIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSWZTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlUmV0dXJuU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghdGhpcy5pbkZ1bmN0aW9uICYmICF0aGlzLm9wdGlvbnMuYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb24pXG4gICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCIncmV0dXJuJyBvdXRzaWRlIG9mIGZ1bmN0aW9uXCIpOyB9XG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICAvLyBJbiBgcmV0dXJuYCAoYW5kIGBicmVha2AvYGNvbnRpbnVlYCksIHRoZSBrZXl3b3JkcyB3aXRoXG4gICAgLy8gb3B0aW9uYWwgYXJndW1lbnRzLCB3ZSBlYWdlcmx5IGxvb2sgZm9yIGEgc2VtaWNvbG9uIG9yIHRoZVxuICAgIC8vIHBvc3NpYmlsaXR5IHRvIGluc2VydCBvbmUuXG5cbiAgICBpZiAodGhpcy5lYXQodHlwZXMuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmFyZ3VtZW50ID0gbnVsbDsgfVxuICAgIGVsc2UgeyBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTsgdGhpcy5zZW1pY29sb24oKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXR1cm5TdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlU3dpdGNoU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIG5vZGUuY2FzZXMgPSBbXTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICAgIHRoaXMubGFiZWxzLnB1c2goc3dpdGNoTGFiZWwpO1xuICAgIHRoaXMuZW50ZXJTY29wZSgwKTtcblxuICAgIC8vIFN0YXRlbWVudHMgdW5kZXIgbXVzdCBiZSBncm91cGVkIChieSBsYWJlbCkgaW4gU3dpdGNoQ2FzZVxuICAgIC8vIG5vZGVzLiBgY3VyYCBpcyB1c2VkIHRvIGtlZXAgdGhlIG5vZGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5XG4gICAgLy8gYWRkaW5nIHN0YXRlbWVudHMgdG8uXG5cbiAgICB2YXIgY3VyO1xuICAgIGZvciAodmFyIHNhd0RlZmF1bHQgPSBmYWxzZTsgdGhpcy50eXBlICE9PSB0eXBlcy5icmFjZVI7KSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5fY2FzZSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLl9kZWZhdWx0KSB7XG4gICAgICAgIHZhciBpc0Nhc2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzLl9jYXNlO1xuICAgICAgICBpZiAoY3VyKSB7IHRoaXMuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTsgfVxuICAgICAgICBub2RlLmNhc2VzLnB1c2goY3VyID0gdGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICAgIGN1ci5jb25zZXF1ZW50ID0gW107XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBpZiAoaXNDYXNlKSB7XG4gICAgICAgICAgY3VyLnRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzYXdEZWZhdWx0KSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLmxhc3RUb2tTdGFydCwgXCJNdWx0aXBsZSBkZWZhdWx0IGNsYXVzZXNcIik7IH1cbiAgICAgICAgICBzYXdEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICBjdXIudGVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29sb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjdXIpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgICAgY3VyLmNvbnNlcXVlbnQucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICBpZiAoY3VyKSB7IHRoaXMuZmluaXNoTm9kZShjdXIsIFwiU3dpdGNoQ2FzZVwiKTsgfVxuICAgIHRoaXMubmV4dCgpOyAvLyBDbG9zaW5nIGJyYWNlXG4gICAgdGhpcy5sYWJlbHMucG9wKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN3aXRjaFN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAobGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsIHRoaXMuc3RhcnQpKSlcbiAgICAgIHsgdGhpcy5yYWlzZSh0aGlzLmxhc3RUb2tFbmQsIFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93XCIpOyB9XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhyb3dTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBSZXVzZWQgZW1wdHkgYXJyYXkgYWRkZWQgZm9yIG5vZGUgZmllbGRzIHRoYXQgYXJlIGFsd2F5cyBlbXB0eS5cblxuICB2YXIgZW1wdHkgPSBbXTtcblxuICBwcCQxLnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBub2RlLmhhbmRsZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9jYXRjaCkge1xuICAgICAgdmFyIGNsYXVzZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0eXBlcy5wYXJlbkwpKSB7XG4gICAgICAgIGNsYXVzZS5wYXJhbSA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgICAgICB2YXIgc2ltcGxlID0gY2xhdXNlLnBhcmFtLnR5cGUgPT09IFwiSWRlbnRpZmllclwiO1xuICAgICAgICB0aGlzLmVudGVyU2NvcGUoc2ltcGxlID8gU0NPUEVfU0lNUExFX0NBVENIIDogMCk7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGNsYXVzZS5wYXJhbSwgc2ltcGxlID8gQklORF9TSU1QTEVfQ0FUQ0ggOiBCSU5EX0xFWElDQUwpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDEwKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIGNsYXVzZS5wYXJhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW50ZXJTY29wZSgwKTtcbiAgICAgIH1cbiAgICAgIGNsYXVzZS5ib2R5ID0gdGhpcy5wYXJzZUJsb2NrKGZhbHNlKTtcbiAgICAgIHRoaXMuZXhpdFNjb3BlKCk7XG4gICAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICAgIH1cbiAgICBub2RlLmZpbmFsaXplciA9IHRoaXMuZWF0KHR5cGVzLl9maW5hbGx5KSA/IHRoaXMucGFyc2VCbG9jaygpIDogbnVsbDtcbiAgICBpZiAoIW5vZGUuaGFuZGxlciAmJiAhbm9kZS5maW5hbGl6ZXIpXG4gICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlXCIpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRyeVN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VWYXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBraW5kKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5wYXJzZVZhcihub2RlLCBmYWxzZSwga2luZCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VXaGlsZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gICAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aGlsZVwiKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2hpbGVTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAodGhpcy5zdHJpY3QpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUub2JqZWN0ID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aXRoXCIpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJXaXRoU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgcHAkMS5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVN0YXRlbWVudFwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VMYWJlbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgbWF5YmVOYW1lLCBleHByLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCA9IHRoaXMubGFiZWxzOyBpJDEgPCBsaXN0Lmxlbmd0aDsgaSQxICs9IDEpXG4gICAgICB7XG4gICAgICB2YXIgbGFiZWwgPSBsaXN0W2kkMV07XG5cbiAgICAgIGlmIChsYWJlbC5uYW1lID09PSBtYXliZU5hbWUpXG4gICAgICAgIHsgdGhpcy5yYWlzZShleHByLnN0YXJ0LCBcIkxhYmVsICdcIiArIG1heWJlTmFtZSArIFwiJyBpcyBhbHJlYWR5IGRlY2xhcmVkXCIpO1xuICAgIH0gfVxuICAgIHZhciBraW5kID0gdGhpcy50eXBlLmlzTG9vcCA/IFwibG9vcFwiIDogdGhpcy50eXBlID09PSB0eXBlcy5fc3dpdGNoID8gXCJzd2l0Y2hcIiA6IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGFiZWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGFiZWwkMSA9IHRoaXMubGFiZWxzW2ldO1xuICAgICAgaWYgKGxhYmVsJDEuc3RhdGVtZW50U3RhcnQgPT09IG5vZGUuc3RhcnQpIHtcbiAgICAgICAgLy8gVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzIGxhYmVscyBvbiB0aGlzIG5vZGVcbiAgICAgICAgbGFiZWwkMS5zdGF0ZW1lbnRTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIGxhYmVsJDEua2luZCA9IGtpbmQ7XG4gICAgICB9IGVsc2UgeyBicmVhayB9XG4gICAgfVxuICAgIHRoaXMubGFiZWxzLnB1c2goe25hbWU6IG1heWJlTmFtZSwga2luZDoga2luZCwgc3RhdGVtZW50U3RhcnQ6IHRoaXMuc3RhcnR9KTtcbiAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KGNvbnRleHQgPyBjb250ZXh0LmluZGV4T2YoXCJsYWJlbFwiKSA9PT0gLTEgPyBjb250ZXh0ICsgXCJsYWJlbFwiIDogY29udGV4dCA6IFwibGFiZWxcIik7XG4gICAgdGhpcy5sYWJlbHMucG9wKCk7XG4gICAgbm9kZS5sYWJlbCA9IGV4cHI7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkxhYmVsZWRTdGF0ZW1lbnRcIilcbiAgfTtcblxuICBwcCQxLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGV4cHIpIHtcbiAgICBub2RlLmV4cHJlc3Npb24gPSBleHByO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBQYXJzZSBhIHNlbWljb2xvbi1lbmNsb3NlZCBibG9jayBvZiBzdGF0ZW1lbnRzLCBoYW5kbGluZyBgXCJ1c2VcbiAgLy8gc3RyaWN0XCJgIGRlY2xhcmF0aW9ucyB3aGVuIGBhbGxvd1N0cmljdGAgaXMgdHJ1ZSAodXNlZCBmb3JcbiAgLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxuICBwcCQxLnBhcnNlQmxvY2sgPSBmdW5jdGlvbihjcmVhdGVOZXdMZXhpY2FsU2NvcGUsIG5vZGUsIGV4aXRTdHJpY3QpIHtcbiAgICBpZiAoIGNyZWF0ZU5ld0xleGljYWxTY29wZSA9PT0gdm9pZCAwICkgY3JlYXRlTmV3TGV4aWNhbFNjb3BlID0gdHJ1ZTtcbiAgICBpZiAoIG5vZGUgPT09IHZvaWQgMCApIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuXG4gICAgbm9kZS5ib2R5ID0gW107XG4gICAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgICBpZiAoY3JlYXRlTmV3TGV4aWNhbFNjb3BlKSB7IHRoaXMuZW50ZXJTY29wZSgwKTsgfVxuICAgIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNlUikge1xuICAgICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpO1xuICAgICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gICAgfVxuICAgIGlmIChleGl0U3RyaWN0KSB7IHRoaXMuc3RyaWN0ID0gZmFsc2U7IH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAoY3JlYXRlTmV3TGV4aWNhbFNjb3BlKSB7IHRoaXMuZXhpdFNjb3BlKCk7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgfTtcblxuICAvLyBQYXJzZSBhIHJlZ3VsYXIgYGZvcmAgbG9vcC4gVGhlIGRpc2FtYmlndWF0aW9uIGNvZGUgaW5cbiAgLy8gYHBhcnNlU3RhdGVtZW50YCB3aWxsIGFscmVhZHkgaGF2ZSBwYXJzZWQgdGhlIGluaXQgc3RhdGVtZW50IG9yXG4gIC8vIGV4cHJlc3Npb24uXG5cbiAgcHAkMS5wYXJzZUZvciA9IGZ1bmN0aW9uKG5vZGUsIGluaXQpIHtcbiAgICBub2RlLmluaXQgPSBpbml0O1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnNlbWkpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMudHlwZSA9PT0gdHlwZXMuc2VtaSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnNlbWkpO1xuICAgIG5vZGUudXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcy5wYXJlblIgPyBudWxsIDogdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBgZm9yYC9gaW5gIGFuZCBgZm9yYC9gb2ZgIGxvb3AsIHdoaWNoIGFyZSBhbG1vc3RcbiAgLy8gc2FtZSBmcm9tIHBhcnNlcidzIHBlcnNwZWN0aXZlLlxuXG4gIHBwJDEucGFyc2VGb3JJbiA9IGZ1bmN0aW9uKG5vZGUsIGluaXQpIHtcbiAgICB2YXIgaXNGb3JJbiA9IHRoaXMudHlwZSA9PT0gdHlwZXMuX2luO1xuICAgIHRoaXMubmV4dCgpO1xuXG4gICAgaWYgKFxuICAgICAgaW5pdC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiAmJlxuICAgICAgaW5pdC5kZWNsYXJhdGlvbnNbMF0uaW5pdCAhPSBudWxsICYmXG4gICAgICAoXG4gICAgICAgICFpc0ZvckluIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDggfHxcbiAgICAgICAgdGhpcy5zdHJpY3QgfHxcbiAgICAgICAgaW5pdC5raW5kICE9PSBcInZhclwiIHx8XG4gICAgICAgIGluaXQuZGVjbGFyYXRpb25zWzBdLmlkLnR5cGUgIT09IFwiSWRlbnRpZmllclwiXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBpbml0LnN0YXJ0LFxuICAgICAgICAoKGlzRm9ySW4gPyBcImZvci1pblwiIDogXCJmb3Itb2ZcIikgKyBcIiBsb29wIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG1heSBub3QgaGF2ZSBhbiBpbml0aWFsaXplclwiKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGluaXQudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICB0aGlzLnJhaXNlKGluaXQuc3RhcnQsIFwiSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItbG9vcFwiKTtcbiAgICB9XG4gICAgbm9kZS5sZWZ0ID0gaW5pdDtcbiAgICBub2RlLnJpZ2h0ID0gaXNGb3JJbiA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzRm9ySW4gPyBcIkZvckluU3RhdGVtZW50XCIgOiBcIkZvck9mU3RhdGVtZW50XCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYSBsaXN0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy5cblxuICBwcCQxLnBhcnNlVmFyID0gZnVuY3Rpb24obm9kZSwgaXNGb3IsIGtpbmQpIHtcbiAgICBub2RlLmRlY2xhcmF0aW9ucyA9IFtdO1xuICAgIG5vZGUua2luZCA9IGtpbmQ7XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIGRlY2wgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgdGhpcy5wYXJzZVZhcklkKGRlY2wsIGtpbmQpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmVxKSkge1xuICAgICAgICBkZWNsLmluaXQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oaXNGb3IpO1xuICAgICAgfSBlbHNlIGlmIChraW5kID09PSBcImNvbnN0XCIgJiYgISh0aGlzLnR5cGUgPT09IHR5cGVzLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfSBlbHNlIGlmIChkZWNsLmlkLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmICEoaXNGb3IgJiYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2luIHx8IHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpKSkge1xuICAgICAgICB0aGlzLnJhaXNlKHRoaXMubGFzdFRva0VuZCwgXCJDb21wbGV4IGJpbmRpbmcgcGF0dGVybnMgcmVxdWlyZSBhbiBpbml0aWFsaXphdGlvbiB2YWx1ZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY2wuaW5pdCA9IG51bGw7XG4gICAgICB9XG4gICAgICBub2RlLmRlY2xhcmF0aW9ucy5wdXNoKHRoaXMuZmluaXNoTm9kZShkZWNsLCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSk7XG4gICAgICBpZiAoIXRoaXMuZWF0KHR5cGVzLmNvbW1hKSkgeyBicmVhayB9XG4gICAgfVxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgcHAkMS5wYXJzZVZhcklkID0gZnVuY3Rpb24oZGVjbCwga2luZCkge1xuICAgIGRlY2wuaWQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICB0aGlzLmNoZWNrTFZhbChkZWNsLmlkLCBraW5kID09PSBcInZhclwiID8gQklORF9WQVIgOiBCSU5EX0xFWElDQUwsIGZhbHNlKTtcbiAgfTtcblxuICB2YXIgRlVOQ19TVEFURU1FTlQgPSAxLCBGVU5DX0hBTkdJTkdfU1RBVEVNRU5UID0gMiwgRlVOQ19OVUxMQUJMRV9JRCA9IDQ7XG5cbiAgLy8gUGFyc2UgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBsaXRlcmFsIChkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGBzdGF0ZW1lbnQgJiBGVU5DX1NUQVRFTUVOVGApLlxuXG4gIC8vIFJlbW92ZSBgYWxsb3dFeHByZXNzaW9uQm9keWAgZm9yIDcuMC4wLCBhcyBpdCBpcyBvbmx5IGNhbGxlZCB3aXRoIGZhbHNlXG4gIHBwJDEucGFyc2VGdW5jdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0YXRlbWVudCwgYWxsb3dFeHByZXNzaW9uQm9keSwgaXNBc3luYykge1xuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSB8fCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiAhaXNBc3luYykge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3RhciAmJiAoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIG5vZGUuZ2VuZXJhdG9yID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICAgIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgaWYgKHN0YXRlbWVudCAmIEZVTkNfU1RBVEVNRU5UKSB7XG4gICAgICBub2RlLmlkID0gKHN0YXRlbWVudCAmIEZVTkNfTlVMTEFCTEVfSUQpICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSA/IG51bGwgOiB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIGlmIChub2RlLmlkICYmICEoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcmVndWxhciBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbiBzbG9wcHkgbW9kZSwgdGhlbiBpdCBpc1xuICAgICAgICAvLyBzdWJqZWN0IHRvIEFubmV4IEIgc2VtYW50aWNzIChCSU5EX0ZVTkNUSU9OKS4gT3RoZXJ3aXNlLCB0aGUgYmluZGluZ1xuICAgICAgICAvLyBtb2RlIGRlcGVuZHMgb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBzY29wZSAoc2VlXG4gICAgICAgIC8vIHRyZWF0RnVuY3Rpb25zQXNWYXIpLlxuICAgICAgICB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsICh0aGlzLnN0cmljdCB8fCBub2RlLmdlbmVyYXRvciB8fCBub2RlLmFzeW5jKSA/IHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhciA/IEJJTkRfVkFSIDogQklORF9MRVhJQ0FMIDogQklORF9GVU5DVElPTik7IH1cbiAgICB9XG5cbiAgICB2YXIgb2xkWWllbGRQb3MgPSB0aGlzLnlpZWxkUG9zLCBvbGRBd2FpdFBvcyA9IHRoaXMuYXdhaXRQb3MsIG9sZEF3YWl0SWRlbnRQb3MgPSB0aGlzLmF3YWl0SWRlbnRQb3M7XG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhub2RlLmFzeW5jLCBub2RlLmdlbmVyYXRvcikpO1xuXG4gICAgaWYgKCEoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpKVxuICAgICAgeyBub2RlLmlkID0gdGhpcy50eXBlID09PSB0eXBlcy5uYW1lID8gdGhpcy5wYXJzZUlkZW50KCkgOiBudWxsOyB9XG5cbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCBhbGxvd0V4cHJlc3Npb25Cb2R5LCBmYWxzZSk7XG5cbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCAoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpID8gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKVxuICB9O1xuXG4gIHBwJDEucGFyc2VGdW5jdGlvblBhcmFtcyA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlbkwpO1xuICAgIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KHR5cGVzLnBhcmVuUiwgZmFsc2UsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KTtcbiAgICB0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpO1xuICB9O1xuXG4gIC8vIFBhcnNlIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbiAgcHAkMS5wYXJzZUNsYXNzID0gZnVuY3Rpb24obm9kZSwgaXNTdGF0ZW1lbnQpIHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIGVjbWEtMjYyIDE0LjYgQ2xhc3MgRGVmaW5pdGlvbnNcbiAgICAvLyBBIGNsYXNzIGRlZmluaXRpb24gaXMgYWx3YXlzIHN0cmljdCBtb2RlIGNvZGUuXG4gICAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0O1xuICAgIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcblxuICAgIHRoaXMucGFyc2VDbGFzc0lkKG5vZGUsIGlzU3RhdGVtZW50KTtcbiAgICB0aGlzLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICB2YXIgY2xhc3NCb2R5ID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB2YXIgaGFkQ29uc3RydWN0b3IgPSBmYWxzZTtcbiAgICBjbGFzc0JvZHkuYm9keSA9IFtdO1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLmJyYWNlTCk7XG4gICAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHlwZXMuYnJhY2VSKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VDbGFzc0VsZW1lbnQobm9kZS5zdXBlckNsYXNzICE9PSBudWxsKTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGNsYXNzQm9keS5ib2R5LnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiICYmIGVsZW1lbnQua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgICAgaWYgKGhhZENvbnN0cnVjdG9yKSB7IHRoaXMucmFpc2UoZWxlbWVudC5zdGFydCwgXCJEdXBsaWNhdGUgY29uc3RydWN0b3IgaW4gdGhlIHNhbWUgY2xhc3NcIik7IH1cbiAgICAgICAgICBoYWRDb25zdHJ1Y3RvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJpY3QgPSBvbGRTdHJpY3Q7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5maW5pc2hOb2RlKGNsYXNzQm9keSwgXCJDbGFzc0JvZHlcIik7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1N0YXRlbWVudCA/IFwiQ2xhc3NEZWNsYXJhdGlvblwiIDogXCJDbGFzc0V4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NFbGVtZW50ID0gZnVuY3Rpb24oY29uc3RydWN0b3JBbGxvd3NTdXBlcikge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnNlbWkpKSB7IHJldHVybiBudWxsIH1cblxuICAgIHZhciBtZXRob2QgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHZhciB0cnlDb250ZXh0dWFsID0gZnVuY3Rpb24gKGssIG5vTGluZUJyZWFrKSB7XG4gICAgICBpZiAoIG5vTGluZUJyZWFrID09PSB2b2lkIDAgKSBub0xpbmVCcmVhayA9IGZhbHNlO1xuXG4gICAgICB2YXIgc3RhcnQgPSB0aGlzJDEuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcyQxLnN0YXJ0TG9jO1xuICAgICAgaWYgKCF0aGlzJDEuZWF0Q29udGV4dHVhbChrKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgICAgaWYgKHRoaXMkMS50eXBlICE9PSB0eXBlcy5wYXJlbkwgJiYgKCFub0xpbmVCcmVhayB8fCAhdGhpcyQxLmNhbkluc2VydFNlbWljb2xvbigpKSkgeyByZXR1cm4gdHJ1ZSB9XG4gICAgICBpZiAobWV0aG9kLmtleSkgeyB0aGlzJDEudW5leHBlY3RlZCgpOyB9XG4gICAgICBtZXRob2QuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIG1ldGhvZC5rZXkgPSB0aGlzJDEuc3RhcnROb2RlQXQoc3RhcnQsIHN0YXJ0TG9jKTtcbiAgICAgIG1ldGhvZC5rZXkubmFtZSA9IGs7XG4gICAgICB0aGlzJDEuZmluaXNoTm9kZShtZXRob2Qua2V5LCBcIklkZW50aWZpZXJcIik7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9O1xuXG4gICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgIG1ldGhvZC5zdGF0aWMgPSB0cnlDb250ZXh0dWFsKFwic3RhdGljXCIpO1xuICAgIHZhciBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR5cGVzLnN0YXIpO1xuICAgIHZhciBpc0FzeW5jID0gZmFsc2U7XG4gICAgaWYgKCFpc0dlbmVyYXRvcikge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIHRyeUNvbnRleHR1YWwoXCJhc3luY1wiLCB0cnVlKSkge1xuICAgICAgICBpc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgaXNHZW5lcmF0b3IgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiB0aGlzLmVhdCh0eXBlcy5zdGFyKTtcbiAgICAgIH0gZWxzZSBpZiAodHJ5Q29udGV4dHVhbChcImdldFwiKSkge1xuICAgICAgICBtZXRob2Qua2luZCA9IFwiZ2V0XCI7XG4gICAgICB9IGVsc2UgaWYgKHRyeUNvbnRleHR1YWwoXCJzZXRcIikpIHtcbiAgICAgICAgbWV0aG9kLmtpbmQgPSBcInNldFwiO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1ldGhvZC5rZXkpIHsgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShtZXRob2QpOyB9XG4gICAgdmFyIGtleSA9IG1ldGhvZC5rZXk7XG4gICAgdmFyIGFsbG93c0RpcmVjdFN1cGVyID0gZmFsc2U7XG4gICAgaWYgKCFtZXRob2QuY29tcHV0ZWQgJiYgIW1ldGhvZC5zdGF0aWMgJiYgKGtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBrZXkubmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8XG4gICAgICAgIGtleS50eXBlID09PSBcIkxpdGVyYWxcIiAmJiBrZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikpIHtcbiAgICAgIGlmIChtZXRob2Qua2luZCAhPT0gXCJtZXRob2RcIikgeyB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBoYXZlIGdldC9zZXQgbW9kaWZpZXJcIik7IH1cbiAgICAgIGlmIChpc0dlbmVyYXRvcikgeyB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvclwiKTsgfVxuICAgICAgaWYgKGlzQXN5bmMpIHsgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYXN5bmMgbWV0aG9kXCIpOyB9XG4gICAgICBtZXRob2Qua2luZCA9IFwiY29uc3RydWN0b3JcIjtcbiAgICAgIGFsbG93c0RpcmVjdFN1cGVyID0gY29uc3RydWN0b3JBbGxvd3NTdXBlcjtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZC5zdGF0aWMgJiYga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGtleS5uYW1lID09PSBcInByb3RvdHlwZVwiKSB7XG4gICAgICB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDbGFzc2VzIG1heSBub3QgaGF2ZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBwcm90b3R5cGVcIik7XG4gICAgfVxuICAgIHRoaXMucGFyc2VDbGFzc01ldGhvZChtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcik7XG4gICAgaWYgKG1ldGhvZC5raW5kID09PSBcImdldFwiICYmIG1ldGhvZC52YWx1ZS5wYXJhbXMubGVuZ3RoICE9PSAwKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnN0YXJ0LCBcImdldHRlciBzaG91bGQgaGF2ZSBubyBwYXJhbXNcIik7IH1cbiAgICBpZiAobWV0aG9kLmtpbmQgPT09IFwic2V0XCIgJiYgbWV0aG9kLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IDEpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShtZXRob2QudmFsdWUuc3RhcnQsIFwic2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtXCIpOyB9XG4gICAgaWYgKG1ldGhvZC5raW5kID09PSBcInNldFwiICYmIG1ldGhvZC52YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobWV0aG9kLnZhbHVlLnBhcmFtc1swXS5zdGFydCwgXCJTZXR0ZXIgY2Fubm90IHVzZSByZXN0IHBhcmFtc1wiKTsgfVxuICAgIHJldHVybiBtZXRob2RcbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NNZXRob2QgPSBmdW5jdGlvbihtZXRob2QsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcikge1xuICAgIG1ldGhvZC52YWx1ZSA9IHRoaXMucGFyc2VNZXRob2QoaXNHZW5lcmF0b3IsIGlzQXN5bmMsIGFsbG93c0RpcmVjdFN1cGVyKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG1ldGhvZCwgXCJNZXRob2REZWZpbml0aW9uXCIpXG4gIH07XG5cbiAgcHAkMS5wYXJzZUNsYXNzSWQgPSBmdW5jdGlvbihub2RlLCBpc1N0YXRlbWVudCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUpIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIGlmIChpc1N0YXRlbWVudClcbiAgICAgICAgeyB0aGlzLmNoZWNrTFZhbChub2RlLmlkLCBCSU5EX0xFWElDQUwsIGZhbHNlKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNTdGF0ZW1lbnQgPT09IHRydWUpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBwcCQxLnBhcnNlQ2xhc3NTdXBlciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBub2RlLnN1cGVyQ2xhc3MgPSB0aGlzLmVhdCh0eXBlcy5fZXh0ZW5kcykgPyB0aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMoKSA6IG51bGw7XG4gIH07XG5cbiAgLy8gUGFyc2VzIG1vZHVsZSBleHBvcnQgZGVjbGFyYXRpb24uXG5cbiAgcHAkMS5wYXJzZUV4cG9ydCA9IGZ1bmN0aW9uKG5vZGUsIGV4cG9ydHMpIHtcbiAgICB0aGlzLm5leHQoKTtcbiAgICAvLyBleHBvcnQgKiBmcm9tICcuLi4nXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnN0YXIpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDExKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSkge1xuICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBub2RlLmV4cG9ydGVkLm5hbWUsIHRoaXMubGFzdFRva1N0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmV4cG9ydGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZnJvbVwiKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLnN0cmluZykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIilcbiAgICB9XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLl9kZWZhdWx0KSkgeyAvLyBleHBvcnQgZGVmYXVsdCAuLi5cbiAgICAgIHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgXCJkZWZhdWx0XCIsIHRoaXMubGFzdFRva1N0YXJ0KTtcbiAgICAgIHZhciBpc0FzeW5jO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuX2Z1bmN0aW9uIHx8IChpc0FzeW5jID0gdGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgdmFyIGZOb2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGlmIChpc0FzeW5jKSB7IHRoaXMubmV4dCgpOyB9XG4gICAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlRnVuY3Rpb24oZk5vZGUsIEZVTkNfU1RBVEVNRU5UIHwgRlVOQ19OVUxMQUJMRV9JRCwgZmFsc2UsIGlzQXN5bmMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLl9jbGFzcykge1xuICAgICAgICB2YXIgY05vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUNsYXNzKGNOb2RlLCBcIm51bGxhYmxlSURcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpXG4gICAgfVxuICAgIC8vIGV4cG9ydCB2YXJ8Y29uc3R8bGV0fGZ1bmN0aW9ufGNsYXNzIC4uLlxuICAgIGlmICh0aGlzLnNob3VsZFBhcnNlRXhwb3J0U3RhdGVtZW50KCkpIHtcbiAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpO1xuICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIHsgdGhpcy5jaGVja1ZhcmlhYmxlRXhwb3J0KGV4cG9ydHMsIG5vZGUuZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgbm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lLCBub2RlLmRlY2xhcmF0aW9uLmlkLnN0YXJ0KTsgfVxuICAgICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgICBub2RlLnNvdXJjZSA9IG51bGw7XG4gICAgfSBlbHNlIHsgLy8gZXhwb3J0IHsgeCwgeSBhcyB6IH0gW2Zyb20gJy4uLiddXG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gbnVsbDtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IHRoaXMucGFyc2VFeHBvcnRTcGVjaWZpZXJzKGV4cG9ydHMpO1xuICAgICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbChcImZyb21cIikpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMuc3RyaW5nKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuc3BlY2lmaWVyczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAvLyBjaGVjayBmb3Iga2V5d29yZHMgdXNlZCBhcyBsb2NhbCBuYW1lc1xuICAgICAgICAgIHZhciBzcGVjID0gbGlzdFtpXTtcblxuICAgICAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKHNwZWMubG9jYWwpO1xuICAgICAgICAgIC8vIGNoZWNrIGlmIGV4cG9ydCBpcyBkZWZpbmVkXG4gICAgICAgICAgdGhpcy5jaGVja0xvY2FsRXhwb3J0KHNwZWMubG9jYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIilcbiAgfTtcblxuICBwcCQxLmNoZWNrRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgcG9zKSB7XG4gICAgaWYgKCFleHBvcnRzKSB7IHJldHVybiB9XG4gICAgaWYgKGhhcyhleHBvcnRzLCBuYW1lKSlcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHBvcywgXCJEdXBsaWNhdGUgZXhwb3J0ICdcIiArIG5hbWUgKyBcIidcIik7IH1cbiAgICBleHBvcnRzW25hbWVdID0gdHJ1ZTtcbiAgfTtcblxuICBwcCQxLmNoZWNrUGF0dGVybkV4cG9ydCA9IGZ1bmN0aW9uKGV4cG9ydHMsIHBhdCkge1xuICAgIHZhciB0eXBlID0gcGF0LnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IFwiSWRlbnRpZmllclwiKVxuICAgICAgeyB0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMsIHBhdC5uYW1lLCBwYXQuc3RhcnQpOyB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICB7IGZvciAodmFyIGkgPSAwLCBsaXN0ID0gcGF0LnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByb3AgPSBsaXN0W2ldO1xuXG4gICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcHJvcCk7XG4gICAgICAgIH0gfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpXG4gICAgICB7IGZvciAodmFyIGkkMSA9IDAsIGxpc3QkMSA9IHBhdC5lbGVtZW50czsgaSQxIDwgbGlzdCQxLmxlbmd0aDsgaSQxICs9IDEpIHtcbiAgICAgICAgdmFyIGVsdCA9IGxpc3QkMVtpJDFdO1xuXG4gICAgICAgICAgaWYgKGVsdCkgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBlbHQpOyB9XG4gICAgICB9IH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBcIlByb3BlcnR5XCIpXG4gICAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC52YWx1ZSk7IH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG4gICAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC5sZWZ0KTsgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIilcbiAgICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LmFyZ3VtZW50KTsgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICAgIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgcGF0LmV4cHJlc3Npb24pOyB9XG4gIH07XG5cbiAgcHAkMS5jaGVja1ZhcmlhYmxlRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgZGVjbHMpIHtcbiAgICBpZiAoIWV4cG9ydHMpIHsgcmV0dXJuIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IGRlY2xzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICAgIHtcbiAgICAgIHZhciBkZWNsID0gbGlzdFtpXTtcblxuICAgICAgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgZGVjbC5pZCk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDEuc2hvdWxkUGFyc2VFeHBvcnRTdGF0ZW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLmtleXdvcmQgPT09IFwidmFyXCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImNvbnN0XCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImNsYXNzXCIgfHxcbiAgICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgIHRoaXMuaXNMZXQoKSB8fFxuICAgICAgdGhpcy5pc0FzeW5jRnVuY3Rpb24oKVxuICB9O1xuXG4gIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBleHBvcnRzLlxuXG4gIHBwJDEucGFyc2VFeHBvcnRTcGVjaWZpZXJzID0gZnVuY3Rpb24oZXhwb3J0cykge1xuICAgIHZhciBub2RlcyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgLy8gZXhwb3J0IHsgeCwgeSBhcyB6IH0gW2Zyb20gJy4uLiddXG4gICAgdGhpcy5leHBlY3QodHlwZXMuYnJhY2VMKTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICBub2RlLmV4cG9ydGVkID0gdGhpcy5lYXRDb250ZXh0dWFsKFwiYXNcIikgPyB0aGlzLnBhcnNlSWRlbnQodHJ1ZSkgOiBub2RlLmxvY2FsO1xuICAgICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBub2RlLmV4cG9ydGVkLm5hbWUsIG5vZGUuZXhwb3J0ZWQuc3RhcnQpO1xuICAgICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIikpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXNcbiAgfTtcblxuICAvLyBQYXJzZXMgaW1wb3J0IGRlY2xhcmF0aW9uLlxuXG4gIHBwJDEucGFyc2VJbXBvcnQgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgLy8gaW1wb3J0ICcuLi4nXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3RyaW5nKSB7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBlbXB0eTtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJzKCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwoXCJmcm9tXCIpO1xuICAgICAgbm9kZS5zb3VyY2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGltcG9ydHMuXG5cbiAgcHAkMS5wYXJzZUltcG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZXMgPSBbXSwgZmlyc3QgPSB0cnVlO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUpIHtcbiAgICAgIC8vIGltcG9ydCBkZWZhdWx0T2JqLCB7IHgsIHkgYXMgeiB9IGZyb20gJy4uLidcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKG5vZGUubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIikpO1xuICAgICAgaWYgKCF0aGlzLmVhdCh0eXBlcy5jb21tYSkpIHsgcmV0dXJuIG5vZGVzIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuc3Rhcikge1xuICAgICAgdmFyIG5vZGUkMSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImFzXCIpO1xuICAgICAgbm9kZSQxLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChub2RlJDEubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpKTtcbiAgICAgIHJldHVybiBub2Rlc1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZUwpO1xuICAgIHdoaWxlICghdGhpcy5lYXQodHlwZXMuYnJhY2VSKSkge1xuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5jb21tYSk7XG4gICAgICAgIGlmICh0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5icmFjZVIpKSB7IGJyZWFrIH1cbiAgICAgIH0gZWxzZSB7IGZpcnN0ID0gZmFsc2U7IH1cblxuICAgICAgdmFyIG5vZGUkMiA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBub2RlJDIuaW1wb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKFwiYXNcIikpIHtcbiAgICAgICAgbm9kZSQyLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVW5yZXNlcnZlZChub2RlJDIuaW1wb3J0ZWQpO1xuICAgICAgICBub2RlJDIubG9jYWwgPSBub2RlJDIuaW1wb3J0ZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrTFZhbChub2RlJDIubG9jYWwsIEJJTkRfTEVYSUNBTCk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDIsIFwiSW1wb3J0U3BlY2lmaWVyXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzXG4gIH07XG5cbiAgLy8gU2V0IGBFeHByZXNzaW9uU3RhdGVtZW50I2RpcmVjdGl2ZWAgcHJvcGVydHkgZm9yIGRpcmVjdGl2ZSBwcm9sb2d1ZXMuXG4gIHBwJDEuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZSA9IGZ1bmN0aW9uKHN0YXRlbWVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoICYmIHRoaXMuaXNEaXJlY3RpdmVDYW5kaWRhdGUoc3RhdGVtZW50c1tpXSk7ICsraSkge1xuICAgICAgc3RhdGVtZW50c1tpXS5kaXJlY3RpdmUgPSBzdGF0ZW1lbnRzW2ldLmV4cHJlc3Npb24ucmF3LnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gIH07XG4gIHBwJDEuaXNEaXJlY3RpdmVDYW5kaWRhdGUgPSBmdW5jdGlvbihzdGF0ZW1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RhdGVtZW50LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiICYmXG4gICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgdHlwZW9mIHN0YXRlbWVudC5leHByZXNzaW9uLnZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAvLyBSZWplY3QgcGFyZW50aGVzaXplZCBzdHJpbmdzLlxuICAgICAgKHRoaXMuaW5wdXRbc3RhdGVtZW50LnN0YXJ0XSA9PT0gXCJcXFwiXCIgfHwgdGhpcy5pbnB1dFtzdGF0ZW1lbnQuc3RhcnRdID09PSBcIidcIilcbiAgICApXG4gIH07XG5cbiAgdmFyIHBwJDIgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vIENvbnZlcnQgZXhpc3RpbmcgZXhwcmVzc2lvbiBhdG9tIHRvIGFzc2lnbmFibGUgcGF0dGVyblxuICAvLyBpZiBwb3NzaWJsZS5cblxuICBwcCQyLnRvQXNzaWduYWJsZSA9IGZ1bmN0aW9uKG5vZGUsIGlzQmluZGluZywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBub2RlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgaWYgKHRoaXMuaW5Bc3luYyAmJiBub2RlLm5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIHByb3AgPSBsaXN0W2ldO1xuXG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHByb3AsIGlzQmluZGluZyk7XG4gICAgICAgICAgLy8gRWFybHkgZXJyb3I6XG4gICAgICAgICAgLy8gICBBc3NpZ25tZW50UmVzdFByb3BlcnR5W1lpZWxkLCBBd2FpdF0gOlxuICAgICAgICAgIC8vICAgICBgLi4uYCBEZXN0cnVjdHVyaW5nQXNzaWdubWVudFRhcmdldFtZaWVsZCwgQXdhaXRdXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIEl0IGlzIGEgU3ludGF4IEVycm9yIGlmIHxEZXN0cnVjdHVyaW5nQXNzaWdubWVudFRhcmdldHwgaXMgYW4gfEFycmF5TGl0ZXJhbHwgb3IgYW4gfE9iamVjdExpdGVyYWx8LlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiICYmXG4gICAgICAgICAgICAocHJvcC5hcmd1bWVudC50eXBlID09PSBcIkFycmF5UGF0dGVyblwiIHx8IHByb3AuYXJndW1lbnQudHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKHByb3AuYXJndW1lbnQuc3RhcnQsIFwiVW5leHBlY3RlZCB0b2tlblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIlByb3BlcnR5XCI6XG4gICAgICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgICAgIGlmIChub2RlLmtpbmQgIT09IFwiaW5pdFwiKSB7IHRoaXMucmFpc2Uobm9kZS5rZXkuc3RhcnQsIFwiT2JqZWN0IHBhdHRlcm4gY2FuJ3QgY29udGFpbiBnZXR0ZXIgb3Igc2V0dGVyXCIpOyB9XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUudmFsdWUsIGlzQmluZGluZyk7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgbm9kZS50eXBlID0gXCJBcnJheVBhdHRlcm5cIjtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGVMaXN0KG5vZGUuZWxlbWVudHMsIGlzQmluZGluZyk7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgIG5vZGUudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCwgaXNCaW5kaW5nKTtcbiAgICAgICAgaWYgKG5vZGUuYXJndW1lbnQudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKVxuICAgICAgICAgIHsgdGhpcy5yYWlzZShub2RlLmFyZ3VtZW50LnN0YXJ0LCBcIlJlc3QgZWxlbWVudHMgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlXCIpOyB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAobm9kZS5vcGVyYXRvciAhPT0gXCI9XCIpIHsgdGhpcy5yYWlzZShub2RlLmxlZnQuZW5kLCBcIk9ubHkgJz0nIG9wZXJhdG9yIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGRlZmF1bHQgdmFsdWUuXCIpOyB9XG4gICAgICAgIG5vZGUudHlwZSA9IFwiQXNzaWdubWVudFBhdHRlcm5cIjtcbiAgICAgICAgZGVsZXRlIG5vZGUub3BlcmF0b3I7XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUubGVmdCwgaXNCaW5kaW5nKTtcbiAgICAgICAgLy8gZmFsbHMgdGhyb3VnaCB0byBBc3NpZ25tZW50UGF0dGVyblxuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbiwgaXNCaW5kaW5nLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBcIkNoYWluRXhwcmVzc2lvblwiOlxuICAgICAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJPcHRpb25hbCBjaGFpbmluZyBjYW5ub3QgYXBwZWFyIGluIGxlZnQtaGFuZCBzaWRlXCIpO1xuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAoIWlzQmluZGluZykgeyBicmVhayB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJBc3NpZ25pbmcgdG8gcnZhbHVlXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyB0aGlzLmNoZWNrUGF0dGVybkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTsgfVxuICAgIHJldHVybiBub2RlXG4gIH07XG5cbiAgLy8gQ29udmVydCBsaXN0IG9mIGV4cHJlc3Npb24gYXRvbXMgdG8gYmluZGluZyBsaXN0LlxuXG4gIHBwJDIudG9Bc3NpZ25hYmxlTGlzdCA9IGZ1bmN0aW9uKGV4cHJMaXN0LCBpc0JpbmRpbmcpIHtcbiAgICB2YXIgZW5kID0gZXhwckxpc3QubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHZhciBlbHQgPSBleHByTGlzdFtpXTtcbiAgICAgIGlmIChlbHQpIHsgdGhpcy50b0Fzc2lnbmFibGUoZWx0LCBpc0JpbmRpbmcpOyB9XG4gICAgfVxuICAgIGlmIChlbmQpIHtcbiAgICAgIHZhciBsYXN0ID0gZXhwckxpc3RbZW5kIC0gMV07XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIGlzQmluZGluZyAmJiBsYXN0ICYmIGxhc3QudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiICYmIGxhc3QuYXJndW1lbnQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpXG4gICAgICAgIHsgdGhpcy51bmV4cGVjdGVkKGxhc3QuYXJndW1lbnQuc3RhcnQpOyB9XG4gICAgfVxuICAgIHJldHVybiBleHByTGlzdFxuICB9O1xuXG4gIC8vIFBhcnNlcyBzcHJlYWQgZWxlbWVudC5cblxuICBwcCQyLnBhcnNlU3ByZWFkID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKVxuICB9O1xuXG4gIHBwJDIucGFyc2VSZXN0QmluZGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIFJlc3RFbGVtZW50IGluc2lkZSBvZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBtdXN0IGJlIGFuIGlkZW50aWZpZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIHRoaXMudHlwZSAhPT0gdHlwZXMubmFtZSlcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cblxuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXN0RWxlbWVudFwiKVxuICB9O1xuXG4gIC8vIFBhcnNlcyBsdmFsdWUgKGFzc2lnbmFibGUpIGF0b20uXG5cbiAgcHAkMi5wYXJzZUJpbmRpbmdBdG9tID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSB0eXBlcy5icmFja2V0TDpcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVBhdHRlcm5cIilcblxuICAgICAgY2FzZSB0eXBlcy5icmFjZUw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKHRydWUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnQoKVxuICB9O1xuXG4gIHBwJDIucGFyc2VCaW5kaW5nTGlzdCA9IGZ1bmN0aW9uKGNsb3NlLCBhbGxvd0VtcHR5LCBhbGxvd1RyYWlsaW5nQ29tbWEpIHtcbiAgICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICAgIGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyB9XG4gICAgICBlbHNlIHsgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpOyB9XG4gICAgICBpZiAoYWxsb3dFbXB0eSAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hKSB7XG4gICAgICAgIGVsdHMucHVzaChudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkge1xuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmVsbGlwc2lzKSB7XG4gICAgICAgIHZhciByZXN0ID0gdGhpcy5wYXJzZVJlc3RCaW5kaW5nKCk7XG4gICAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0ocmVzdCk7XG4gICAgICAgIGVsdHMucHVzaChyZXN0KTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICAgICAgICB0aGlzLmV4cGVjdChjbG9zZSk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWxlbSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCwgdGhpcy5zdGFydExvYyk7XG4gICAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0oZWxlbSk7XG4gICAgICAgIGVsdHMucHVzaChlbGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsdHNcbiAgfTtcblxuICBwcCQyLnBhcnNlQmluZGluZ0xpc3RJdGVtID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW1cbiAgfTtcblxuICAvLyBQYXJzZXMgYXNzaWdubWVudCBwYXR0ZXJuIGFyb3VuZCBnaXZlbiBhdG9tIGlmIHBvc3NpYmxlLlxuXG4gIHBwJDIucGFyc2VNYXliZURlZmF1bHQgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGxlZnQpIHtcbiAgICBsZWZ0ID0gbGVmdCB8fCB0aGlzLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiB8fCAhdGhpcy5lYXQodHlwZXMuZXEpKSB7IHJldHVybiBsZWZ0IH1cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICBub2RlLmxlZnQgPSBsZWZ0O1xuICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgfTtcblxuICAvLyBWZXJpZnkgdGhhdCBhIG5vZGUgaXMgYW4gbHZhbCBcdTIwMTQgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkXG4gIC8vIHRvLlxuICAvLyBiaW5kaW5nVHlwZSBjYW4gYmUgZWl0aGVyOlxuICAvLyAndmFyJyBpbmRpY2F0aW5nIHRoYXQgdGhlIGx2YWwgY3JlYXRlcyBhICd2YXInIGJpbmRpbmdcbiAgLy8gJ2xldCcgaW5kaWNhdGluZyB0aGF0IHRoZSBsdmFsIGNyZWF0ZXMgYSBsZXhpY2FsICgnbGV0JyBvciAnY29uc3QnKSBiaW5kaW5nXG4gIC8vICdub25lJyBpbmRpY2F0aW5nIHRoYXQgdGhlIGJpbmRpbmcgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGlsbGVnYWwgaWRlbnRpZmllcnMsIGJ1dCBub3QgZm9yIGR1cGxpY2F0ZSByZWZlcmVuY2VzXG5cbiAgcHAkMi5jaGVja0xWYWwgPSBmdW5jdGlvbihleHByLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKSB7XG4gICAgaWYgKCBiaW5kaW5nVHlwZSA9PT0gdm9pZCAwICkgYmluZGluZ1R5cGUgPSBCSU5EX05PTkU7XG5cbiAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfTEVYSUNBTCAmJiBleHByLm5hbWUgPT09IFwibGV0XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwibGV0IGlzIGRpc2FsbG93ZWQgYXMgYSBsZXhpY2FsbHkgYm91bmQgbmFtZVwiKTsgfVxuICAgICAgaWYgKHRoaXMuc3RyaWN0ICYmIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmQudGVzdChleHByLm5hbWUpKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCAoYmluZGluZ1R5cGUgPyBcIkJpbmRpbmcgXCIgOiBcIkFzc2lnbmluZyB0byBcIikgKyBleHByLm5hbWUgKyBcIiBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgICAgaWYgKGNoZWNrQ2xhc2hlcykge1xuICAgICAgICBpZiAoaGFzKGNoZWNrQ2xhc2hlcywgZXhwci5uYW1lKSlcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkFyZ3VtZW50IG5hbWUgY2xhc2hcIik7IH1cbiAgICAgICAgY2hlY2tDbGFzaGVzW2V4cHIubmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGJpbmRpbmdUeXBlICE9PSBCSU5EX05PTkUgJiYgYmluZGluZ1R5cGUgIT09IEJJTkRfT1VUU0lERSkgeyB0aGlzLmRlY2xhcmVOYW1lKGV4cHIubmFtZSwgYmluZGluZ1R5cGUsIGV4cHIuc3RhcnQpOyB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIkNoYWluRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwiT3B0aW9uYWwgY2hhaW5pbmcgY2Fubm90IGFwcGVhciBpbiBsZWZ0LWhhbmQgc2lkZVwiKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgaWYgKGJpbmRpbmdUeXBlKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkJpbmRpbmcgbWVtYmVyIGV4cHJlc3Npb25cIik7IH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBleHByLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAgICB7XG4gICAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMuY2hlY2tMVmFsKHByb3AsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgIH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiUHJvcGVydHlcIjpcbiAgICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLnZhbHVlLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgICBmb3IgKHZhciBpJDEgPSAwLCBsaXN0JDEgPSBleHByLmVsZW1lbnRzOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgICB2YXIgZWxlbSA9IGxpc3QkMVtpJDFdO1xuXG4gICAgICBpZiAoZWxlbSkgeyB0aGlzLmNoZWNrTFZhbChlbGVtLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTsgfVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5sZWZ0LCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIuYXJndW1lbnQsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5jaGVja0xWYWwoZXhwci5leHByZXNzaW9uLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy5yYWlzZShleHByLnN0YXJ0LCAoYmluZGluZ1R5cGUgPyBcIkJpbmRpbmdcIiA6IFwiQXNzaWduaW5nIHRvXCIpICsgXCIgcnZhbHVlXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbFxuXG4gIHZhciBwcCQzID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyBDaGVjayBpZiBwcm9wZXJ0eSBuYW1lIGNsYXNoZXMgd2l0aCBhbHJlYWR5IGFkZGVkLlxuICAvLyBPYmplY3QvY2xhc3MgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgbm90IGFsbG93ZWQgdG8gY2xhc2ggXHUyMDE0XG4gIC8vIGVpdGhlciB3aXRoIGVhY2ggb3RoZXIgb3Igd2l0aCBhbiBpbml0IHByb3BlcnR5IFx1MjAxNCBhbmQgaW5cbiAgLy8gc3RyaWN0IG1vZGUsIGluaXQgcHJvcGVydGllcyBhcmUgYWxzbyBub3QgYWxsb3dlZCB0byBiZSByZXBlYXRlZC5cblxuICBwcCQzLmNoZWNrUHJvcENsYXNoID0gZnVuY3Rpb24ocHJvcCwgcHJvcEhhc2gsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgcHJvcC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIilcbiAgICAgIHsgcmV0dXJuIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgKHByb3AuY29tcHV0ZWQgfHwgcHJvcC5tZXRob2QgfHwgcHJvcC5zaG9ydGhhbmQpKVxuICAgICAgeyByZXR1cm4gfVxuICAgIHZhciBrZXkgPSBwcm9wLmtleTtcbiAgICB2YXIgbmFtZTtcbiAgICBzd2l0Y2ggKGtleS50eXBlKSB7XG4gICAgY2FzZSBcIklkZW50aWZpZXJcIjogbmFtZSA9IGtleS5uYW1lOyBicmVha1xuICAgIGNhc2UgXCJMaXRlcmFsXCI6IG5hbWUgPSBTdHJpbmcoa2V5LnZhbHVlKTsgYnJlYWtcbiAgICBkZWZhdWx0OiByZXR1cm5cbiAgICB9XG4gICAgdmFyIGtpbmQgPSBwcm9wLmtpbmQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJfX3Byb3RvX19cIiAmJiBraW5kID09PSBcImluaXRcIikge1xuICAgICAgICBpZiAocHJvcEhhc2gucHJvdG8pIHtcbiAgICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG8gPCAwKVxuICAgICAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG8gPSBrZXkuc3RhcnQ7IH1cbiAgICAgICAgICAgIC8vIEJhY2t3YXJkcy1jb21wYXQga2x1ZGdlLiBDYW4gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDYuMFxuICAgICAgICAgIH0gZWxzZSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShrZXkuc3RhcnQsIFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eVwiKTsgfVxuICAgICAgICB9XG4gICAgICAgIHByb3BIYXNoLnByb3RvID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBuYW1lID0gXCIkXCIgKyBuYW1lO1xuICAgIHZhciBvdGhlciA9IHByb3BIYXNoW25hbWVdO1xuICAgIGlmIChvdGhlcikge1xuICAgICAgdmFyIHJlZGVmaW5pdGlvbjtcbiAgICAgIGlmIChraW5kID09PSBcImluaXRcIikge1xuICAgICAgICByZWRlZmluaXRpb24gPSB0aGlzLnN0cmljdCAmJiBvdGhlci5pbml0IHx8IG90aGVyLmdldCB8fCBvdGhlci5zZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWRlZmluaXRpb24gPSBvdGhlci5pbml0IHx8IG90aGVyW2tpbmRdO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVmaW5pdGlvbilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoa2V5LnN0YXJ0LCBcIlJlZGVmaW5pdGlvbiBvZiBwcm9wZXJ0eVwiKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdGhlciA9IHByb3BIYXNoW25hbWVdID0ge1xuICAgICAgICBpbml0OiBmYWxzZSxcbiAgICAgICAgZ2V0OiBmYWxzZSxcbiAgICAgICAgc2V0OiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgb3RoZXJba2luZF0gPSB0cnVlO1xuICB9O1xuXG4gIC8vICMjIyBFeHByZXNzaW9uIHBhcnNpbmdcblxuICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbiAgLy8gJ2F0b21pYycsIG5vbmRpdmlzaWJsZSBleHByZXNzaW9uIHR5cGVzIGF0IHRoZSBib3R0b20uIE1vc3Qgb2ZcbiAgLy8gdGhlIGZ1bmN0aW9ucyB3aWxsIHNpbXBseSBsZXQgdGhlIGZ1bmN0aW9uKHMpIGJlbG93IHRoZW0gcGFyc2UsXG4gIC8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwXG4gIC8vIHRoZSBBU1Qgbm9kZSB0aGF0IHRoZSBpbm5lciBwYXJzZXIgZ2F2ZSB0aGVtIGluIGFub3RoZXIgbm9kZS5cblxuICAvLyBQYXJzZSBhIGZ1bGwgZXhwcmVzc2lvbi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCB0b1xuICAvLyBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0YWxpemF0aW9uIGV4cHJlc3Npb25zKVxuICAvLyBhbmQgcHJvdmlkZSByZWZlcmVuY2UgZm9yIHN0b3JpbmcgJz0nIG9wZXJhdG9yIGluc2lkZSBzaG9ydGhhbmRcbiAgLy8gcHJvcGVydHkgYXNzaWdubWVudCBpbiBjb250ZXh0cyB3aGVyZSBib3RoIG9iamVjdCBleHByZXNzaW9uXG4gIC8vIGFuZCBvYmplY3QgcGF0dGVybiBtaWdodCBhcHBlYXIgKHNvIGl0J3MgcG9zc2libGUgdG8gcmFpc2VcbiAgLy8gZGVsYXllZCBzeW50YXggZXJyb3IgYXQgY29ycmVjdCBwb3NpdGlvbikuXG5cbiAgcHAkMy5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbZXhwcl07XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHlwZXMuY29tbWEpKSB7IG5vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlTWF5YmVBc3NpZ24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpOyB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU2VxdWVuY2VFeHByZXNzaW9uXCIpXG4gICAgfVxuICAgIHJldHVybiBleHByXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZlxuICAvLyBvcGVyYXRvcnMgbGlrZSBgKz1gLlxuXG4gIHBwJDMucGFyc2VNYXliZUFzc2lnbiA9IGZ1bmN0aW9uKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGFmdGVyTGVmdFBhcnNlKSB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKFwieWllbGRcIikpIHtcbiAgICAgIGlmICh0aGlzLmluR2VuZXJhdG9yKSB7IHJldHVybiB0aGlzLnBhcnNlWWllbGQobm9JbikgfVxuICAgICAgLy8gVGhlIHRva2VuaXplciB3aWxsIGFzc3VtZSBhbiBleHByZXNzaW9uIGlzIGFsbG93ZWQgYWZ0ZXJcbiAgICAgIC8vIGB5aWVsZGAsIGJ1dCB0aGlzIGlzbid0IHRoYXQga2luZCBvZiB5aWVsZFxuICAgICAgZWxzZSB7IHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTsgfVxuICAgIH1cblxuICAgIHZhciBvd25EZXN0cnVjdHVyaW5nRXJyb3JzID0gZmFsc2UsIG9sZFBhcmVuQXNzaWduID0gLTEsIG9sZFRyYWlsaW5nQ29tbWEgPSAtMTtcbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgb2xkUGFyZW5Bc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ247XG4gICAgICBvbGRUcmFpbGluZ0NvbW1hID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hO1xuICAgICAgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICAgIG93bkRlc3RydWN0dXJpbmdFcnJvcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5wYXJlbkwgfHwgdGhpcy50eXBlID09PSB0eXBlcy5uYW1lKVxuICAgICAgeyB0aGlzLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXJ0OyB9XG4gICAgdmFyIGxlZnQgPSB0aGlzLnBhcnNlTWF5YmVDb25kaXRpb25hbChub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBpZiAoYWZ0ZXJMZWZ0UGFyc2UpIHsgbGVmdCA9IGFmdGVyTGVmdFBhcnNlLmNhbGwodGhpcywgbGVmdCwgc3RhcnRQb3MsIHN0YXJ0TG9jKTsgfVxuICAgIGlmICh0aGlzLnR5cGUuaXNBc3NpZ24pIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlLmxlZnQgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmVxID8gdGhpcy50b0Fzc2lnbmFibGUobGVmdCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIDogbGVmdDtcbiAgICAgIGlmICghb3duRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvID0gLTE7XG4gICAgICB9XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ24gPj0gbm9kZS5sZWZ0LnN0YXJ0KVxuICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gLTE7IH0gLy8gcmVzZXQgYmVjYXVzZSBzaG9ydGhhbmQgZGVmYXVsdCB3YXMgdXNlZCBjb3JyZWN0bHlcbiAgICAgIHRoaXMuY2hlY2tMVmFsKGxlZnQpO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBub2RlLnJpZ2h0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvd25EZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpOyB9XG4gICAgfVxuICAgIGlmIChvbGRQYXJlbkFzc2lnbiA+IC0xKSB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IG9sZFBhcmVuQXNzaWduOyB9XG4gICAgaWYgKG9sZFRyYWlsaW5nQ29tbWEgPiAtMSkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSBvbGRUcmFpbGluZ0NvbW1hOyB9XG4gICAgcmV0dXJuIGxlZnRcbiAgfTtcblxuICAvLyBQYXJzZSBhIHRlcm5hcnkgY29uZGl0aW9uYWwgKGA/OmApIG9wZXJhdG9yLlxuXG4gIHBwJDMucGFyc2VNYXliZUNvbmRpdGlvbmFsID0gZnVuY3Rpb24obm9JbiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByT3BzKG5vSW4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLnF1ZXN0aW9uKSkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlLnRlc3QgPSBleHByO1xuICAgICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5jb2xvbik7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihub0luKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIilcbiAgICB9XG4gICAgcmV0dXJuIGV4cHJcbiAgfTtcblxuICAvLyBTdGFydCB0aGUgcHJlY2VkZW5jZSBwYXJzZXIuXG5cbiAgcHAkMy5wYXJzZUV4cHJPcHMgPSBmdW5jdGlvbihub0luLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZU1heWJlVW5hcnkocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZmFsc2UpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgcmV0dXJuIGV4cHIuc3RhcnQgPT09IHN0YXJ0UG9zICYmIGV4cHIudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiID8gZXhwciA6IHRoaXMucGFyc2VFeHByT3AoZXhwciwgc3RhcnRQb3MsIHN0YXJ0TG9jLCAtMSwgbm9JbilcbiAgfTtcblxuICAvLyBQYXJzZSBiaW5hcnkgb3BlcmF0b3JzIHdpdGggdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgcGFyc2luZ1xuICAvLyBhbGdvcml0aG0uIGBsZWZ0YCBpcyB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yLlxuICAvLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmRcbiAgLy8gZGVmZXIgZnVydGhlciBwYXJzZXIgdG8gb25lIG9mIGl0cyBjYWxsZXJzIHdoZW4gaXQgZW5jb3VudGVycyBhblxuICAvLyBvcGVyYXRvciB0aGF0IGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiB0aGUgc2V0IGl0IGlzIHBhcnNpbmcuXG5cbiAgcHAkMy5wYXJzZUV4cHJPcCA9IGZ1bmN0aW9uKGxlZnQsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBub0luKSB7XG4gICAgdmFyIHByZWMgPSB0aGlzLnR5cGUuYmlub3A7XG4gICAgaWYgKHByZWMgIT0gbnVsbCAmJiAoIW5vSW4gfHwgdGhpcy50eXBlICE9PSB0eXBlcy5faW4pKSB7XG4gICAgICBpZiAocHJlYyA+IG1pblByZWMpIHtcbiAgICAgICAgdmFyIGxvZ2ljYWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmxvZ2ljYWxPUiB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLmxvZ2ljYWxBTkQ7XG4gICAgICAgIHZhciBjb2FsZXNjZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuY29hbGVzY2U7XG4gICAgICAgIGlmIChjb2FsZXNjZSkge1xuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcHJlY2VkZW5jZSBvZiBgdHQuY29hbGVzY2VgIGFzIGVxdWFsIHRvIHRoZSByYW5nZSBvZiBsb2dpY2FsIGV4cHJlc3Npb25zLlxuICAgICAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBgbm9kZS5yaWdodGAgc2hvdWxkbid0IGNvbnRhaW4gbG9naWNhbCBleHByZXNzaW9ucyBpbiBvcmRlciB0byBjaGVjayB0aGUgbWl4ZWQgZXJyb3IuXG4gICAgICAgICAgcHJlYyA9IHR5cGVzLmxvZ2ljYWxBTkQuYmlub3A7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJPcCh0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIHN0YXJ0UG9zLCBzdGFydExvYywgcHJlYywgbm9Jbik7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5idWlsZEJpbmFyeShsZWZ0U3RhcnRQb3MsIGxlZnRTdGFydExvYywgbGVmdCwgcmlnaHQsIG9wLCBsb2dpY2FsIHx8IGNvYWxlc2NlKTtcbiAgICAgICAgaWYgKChsb2dpY2FsICYmIHRoaXMudHlwZSA9PT0gdHlwZXMuY29hbGVzY2UpIHx8IChjb2FsZXNjZSAmJiAodGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsT1IgfHwgdGhpcy50eXBlID09PSB0eXBlcy5sb2dpY2FsQU5EKSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJMb2dpY2FsIGV4cHJlc3Npb25zIGFuZCBjb2FsZXNjZSBleHByZXNzaW9ucyBjYW5ub3QgYmUgbWl4ZWQuIFdyYXAgZWl0aGVyIGJ5IHBhcmVudGhlc2VzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXhwck9wKG5vZGUsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBub0luKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVmdFxuICB9O1xuXG4gIHBwJDMuYnVpbGRCaW5hcnkgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGxlZnQsIHJpZ2h0LCBvcCwgbG9naWNhbCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUubGVmdCA9IGxlZnQ7XG4gICAgbm9kZS5vcGVyYXRvciA9IG9wO1xuICAgIG5vZGUucmlnaHQgPSByaWdodDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGxvZ2ljYWwgPyBcIkxvZ2ljYWxFeHByZXNzaW9uXCIgOiBcIkJpbmFyeUV4cHJlc3Npb25cIilcbiAgfTtcblxuICAvLyBQYXJzZSB1bmFyeSBvcGVyYXRvcnMsIGJvdGggcHJlZml4IGFuZCBwb3N0Zml4LlxuXG4gIHBwJDMucGFyc2VNYXliZVVuYXJ5ID0gZnVuY3Rpb24ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgc2F3VW5hcnkpIHtcbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGV4cHI7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKFwiYXdhaXRcIikgJiYgKHRoaXMuaW5Bc3luYyB8fCAoIXRoaXMuaW5GdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMuYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbikpKSB7XG4gICAgICBleHByID0gdGhpcy5wYXJzZUF3YWl0KCk7XG4gICAgICBzYXdVbmFyeSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUucHJlZml4KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIHVwZGF0ZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuaW5jRGVjO1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMudmFsdWU7XG4gICAgICBub2RlLnByZWZpeCA9IHRydWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCB0cnVlKTtcbiAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpO1xuICAgICAgaWYgKHVwZGF0ZSkgeyB0aGlzLmNoZWNrTFZhbChub2RlLmFyZ3VtZW50KTsgfVxuICAgICAgZWxzZSBpZiAodGhpcy5zdHJpY3QgJiYgbm9kZS5vcGVyYXRvciA9PT0gXCJkZWxldGVcIiAmJlxuICAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudC50eXBlID09PSBcIklkZW50aWZpZXJcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJEZWxldGluZyBsb2NhbCB2YXJpYWJsZSBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgICAgZWxzZSB7IHNhd1VuYXJ5ID0gdHJ1ZTsgfVxuICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCB1cGRhdGUgPyBcIlVwZGF0ZUV4cHJlc3Npb25cIiA6IFwiVW5hcnlFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgaWYgKHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKSB7IHJldHVybiBleHByIH1cbiAgICAgIHdoaWxlICh0aGlzLnR5cGUucG9zdGZpeCAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkge1xuICAgICAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgICBub2RlJDEub3BlcmF0b3IgPSB0aGlzLnZhbHVlO1xuICAgICAgICBub2RlJDEucHJlZml4ID0gZmFsc2U7XG4gICAgICAgIG5vZGUkMS5hcmd1bWVudCA9IGV4cHI7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGV4cHIpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiVXBkYXRlRXhwcmVzc2lvblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNhd1VuYXJ5ICYmIHRoaXMuZWF0KHR5cGVzLnN0YXJzdGFyKSlcbiAgICAgIHsgcmV0dXJuIHRoaXMuYnVpbGRCaW5hcnkoc3RhcnRQb3MsIHN0YXJ0TG9jLCBleHByLCB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSksIFwiKipcIiwgZmFsc2UpIH1cbiAgICBlbHNlXG4gICAgICB7IHJldHVybiBleHByIH1cbiAgfTtcblxuICAvLyBQYXJzZSBjYWxsLCBkb3QsIGFuZCBgW11gLXN1YnNjcmlwdCBleHByZXNzaW9ucy5cblxuICBwcCQzLnBhcnNlRXhwclN1YnNjcmlwdHMgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJBdG9tKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIGlmIChleHByLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiB0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva1N0YXJ0LCB0aGlzLmxhc3RUb2tFbmQpICE9PSBcIilcIilcbiAgICAgIHsgcmV0dXJuIGV4cHIgfVxuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlU3Vic2NyaXB0cyhleHByLCBzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzICYmIHJlc3VsdC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA+PSByZXN1bHQuc3RhcnQpIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID0gLTE7IH1cbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gLTE7IH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9O1xuXG4gIHBwJDMucGFyc2VTdWJzY3JpcHRzID0gZnVuY3Rpb24oYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzKSB7XG4gICAgdmFyIG1heWJlQXN5bmNBcnJvdyA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIGJhc2UudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICAgdGhpcy5sYXN0VG9rRW5kID09PSBiYXNlLmVuZCAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiBiYXNlLmVuZCAtIGJhc2Uuc3RhcnQgPT09IDUgJiZcbiAgICAgICAgdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID09PSBiYXNlLnN0YXJ0O1xuICAgIHZhciBvcHRpb25hbENoYWluZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzLCBtYXliZUFzeW5jQXJyb3csIG9wdGlvbmFsQ2hhaW5lZCk7XG5cbiAgICAgIGlmIChlbGVtZW50Lm9wdGlvbmFsKSB7IG9wdGlvbmFsQ2hhaW5lZCA9IHRydWU7IH1cbiAgICAgIGlmIChlbGVtZW50ID09PSBiYXNlIHx8IGVsZW1lbnQudHlwZSA9PT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGlmIChvcHRpb25hbENoYWluZWQpIHtcbiAgICAgICAgICB2YXIgY2hhaW5Ob2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgICAgIGNoYWluTm9kZS5leHByZXNzaW9uID0gZWxlbWVudDtcbiAgICAgICAgICBlbGVtZW50ID0gdGhpcy5maW5pc2hOb2RlKGNoYWluTm9kZSwgXCJDaGFpbkV4cHJlc3Npb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgYmFzZSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VTdWJzY3JpcHQgPSBmdW5jdGlvbihiYXNlLCBzdGFydFBvcywgc3RhcnRMb2MsIG5vQ2FsbHMsIG1heWJlQXN5bmNBcnJvdywgb3B0aW9uYWxDaGFpbmVkKSB7XG4gICAgdmFyIG9wdGlvbmFsU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDExO1xuICAgIHZhciBvcHRpb25hbCA9IG9wdGlvbmFsU3VwcG9ydGVkICYmIHRoaXMuZWF0KHR5cGVzLnF1ZXN0aW9uRG90KTtcbiAgICBpZiAobm9DYWxscyAmJiBvcHRpb25hbCkgeyB0aGlzLnJhaXNlKHRoaXMubGFzdFRva1N0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIGNhbGxlZSBvZiBuZXcgZXhwcmVzc2lvbnNcIik7IH1cblxuICAgIHZhciBjb21wdXRlZCA9IHRoaXMuZWF0KHR5cGVzLmJyYWNrZXRMKTtcbiAgICBpZiAoY29tcHV0ZWQgfHwgKG9wdGlvbmFsICYmIHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5MICYmIHRoaXMudHlwZSAhPT0gdHlwZXMuYmFja1F1b3RlKSB8fCB0aGlzLmVhdCh0eXBlcy5kb3QpKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICAgIG5vZGUucHJvcGVydHkgPSBjb21wdXRlZCA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiB0aGlzLnBhcnNlSWRlbnQodGhpcy5vcHRpb25zLmFsbG93UmVzZXJ2ZWQgIT09IFwibmV2ZXJcIik7XG4gICAgICBub2RlLmNvbXB1dGVkID0gISFjb21wdXRlZDtcbiAgICAgIGlmIChjb21wdXRlZCkgeyB0aGlzLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7IH1cbiAgICAgIGlmIChvcHRpb25hbFN1cHBvcnRlZCkge1xuICAgICAgICBub2RlLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgICB9XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTWVtYmVyRXhwcmVzc2lvblwiKTtcbiAgICB9IGVsc2UgaWYgKCFub0NhbGxzICYmIHRoaXMuZWF0KHR5cGVzLnBhcmVuTCkpIHtcbiAgICAgIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnMsIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBvbGRBd2FpdElkZW50UG9zID0gdGhpcy5hd2FpdElkZW50UG9zO1xuICAgICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgICB0aGlzLmF3YWl0UG9zID0gMDtcbiAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IDA7XG4gICAgICB2YXIgZXhwckxpc3QgPSB0aGlzLnBhcnNlRXhwckxpc3QodHlwZXMucGFyZW5SLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgaWYgKG1heWJlQXN5bmNBcnJvdyAmJiAhb3B0aW9uYWwgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkgJiYgdGhpcy5lYXQodHlwZXMuYXJyb3cpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTtcbiAgICAgICAgaWYgKHRoaXMuYXdhaXRJZGVudFBvcyA+IDApXG4gICAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRJZGVudFBvcywgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgICAgdGhpcy55aWVsZFBvcyA9IG9sZFlpZWxkUG9zO1xuICAgICAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgZXhwckxpc3QsIHRydWUpXG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcyB8fCB0aGlzLnlpZWxkUG9zO1xuICAgICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zIHx8IHRoaXMuYXdhaXRQb3M7XG4gICAgICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zIHx8IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgICAgIHZhciBub2RlJDEgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgICBub2RlJDEuY2FsbGVlID0gYmFzZTtcbiAgICAgIG5vZGUkMS5hcmd1bWVudHMgPSBleHByTGlzdDtcbiAgICAgIGlmIChvcHRpb25hbFN1cHBvcnRlZCkge1xuICAgICAgICBub2RlJDEub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICAgIH1cbiAgICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSQxLCBcIkNhbGxFeHByZXNzaW9uXCIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5iYWNrUXVvdGUpIHtcbiAgICAgIGlmIChvcHRpb25hbCB8fCBvcHRpb25hbENoYWluZWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIHRhZyBvZiB0YWdnZWQgdGVtcGxhdGUgZXhwcmVzc2lvbnNcIik7XG4gICAgICB9XG4gICAgICB2YXIgbm9kZSQyID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZSQyLnRhZyA9IGJhc2U7XG4gICAgICBub2RlJDIucXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGUoe2lzVGFnZ2VkOiB0cnVlfSk7XG4gICAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUkMiwgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHJldHVybiBiYXNlXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gYXRvbWljIGV4cHJlc3Npb24gXHUyMDE0IGVpdGhlciBhIHNpbmdsZSB0b2tlbiB0aGF0IGlzIGFuXG4gIC8vIGV4cHJlc3Npb24sIGFuIGV4cHJlc3Npb24gc3RhcnRlZCBieSBhIGtleXdvcmQgbGlrZSBgZnVuY3Rpb25gIG9yXG4gIC8vIGBuZXdgLCBvciBhbiBleHByZXNzaW9uIHdyYXBwZWQgaW4gcHVuY3R1YXRpb24gbGlrZSBgKClgLCBgW11gLFxuICAvLyBvciBge31gLlxuXG4gIHBwJDMucGFyc2VFeHByQXRvbSA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAvLyBJZiBhIGRpdmlzaW9uIG9wZXJhdG9yIGFwcGVhcnMgaW4gYW4gZXhwcmVzc2lvbiBwb3NpdGlvbiwgdGhlXG4gICAgLy8gdG9rZW5pemVyIGdvdCBjb25mdXNlZCwgYW5kIHdlIGZvcmNlIGl0IHRvIHJlYWQgYSByZWdleHAgaW5zdGVhZC5cbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5zbGFzaCkgeyB0aGlzLnJlYWRSZWdleHAoKTsgfVxuXG4gICAgdmFyIG5vZGUsIGNhbkJlQXJyb3cgPSB0aGlzLnBvdGVudGlhbEFycm93QXQgPT09IHRoaXMuc3RhcnQ7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIHR5cGVzLl9zdXBlcjpcbiAgICAgIGlmICghdGhpcy5hbGxvd1N1cGVyKVxuICAgICAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCInc3VwZXInIGtleXdvcmQgb3V0c2lkZSBhIG1ldGhvZFwiKTsgfVxuICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCAmJiAhdGhpcy5hbGxvd0RpcmVjdFN1cGVyKVxuICAgICAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJzdXBlcigpIGNhbGwgb3V0c2lkZSBjb25zdHJ1Y3RvciBvZiBhIHN1YmNsYXNzXCIpOyB9XG4gICAgICAvLyBUaGUgYHN1cGVyYCBrZXl3b3JkIGNhbiBhcHBlYXIgYXQgYmVsb3c6XG4gICAgICAvLyBTdXBlclByb3BlcnR5OlxuICAgICAgLy8gICAgIHN1cGVyIFsgRXhwcmVzc2lvbiBdXG4gICAgICAvLyAgICAgc3VwZXIgLiBJZGVudGlmaWVyTmFtZVxuICAgICAgLy8gU3VwZXJDYWxsOlxuICAgICAgLy8gICAgIHN1cGVyICggQXJndW1lbnRzIClcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzLmRvdCAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNrZXRMICYmIHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5MKVxuICAgICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3VwZXJcIilcblxuICAgIGNhc2UgdHlwZXMuX3RoaXM6XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRoaXNFeHByZXNzaW9uXCIpXG5cbiAgICBjYXNlIHR5cGVzLm5hbWU6XG4gICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGNvbnRhaW5zRXNjID0gdGhpcy5jb250YWluc0VzYztcbiAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VJZGVudChmYWxzZSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgIWNvbnRhaW5zRXNjICYmIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5fZnVuY3Rpb24pKVxuICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCAwLCBmYWxzZSwgdHJ1ZSkgfVxuICAgICAgaWYgKGNhbkJlQXJyb3cgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmFycm93KSlcbiAgICAgICAgICB7IHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgW2lkXSwgZmFsc2UpIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgJiYgIWNvbnRhaW5zRXNjKSB7XG4gICAgICAgICAgaWQgPSB0aGlzLnBhcnNlSWRlbnQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLmVhdCh0eXBlcy5hcnJvdykpXG4gICAgICAgICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBbaWRdLCB0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRcblxuICAgIGNhc2UgdHlwZXMucmVnZXhwOlxuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIG5vZGUgPSB0aGlzLnBhcnNlTGl0ZXJhbCh2YWx1ZS52YWx1ZSk7XG4gICAgICBub2RlLnJlZ2V4ID0ge3BhdHRlcm46IHZhbHVlLnBhdHRlcm4sIGZsYWdzOiB2YWx1ZS5mbGFnc307XG4gICAgICByZXR1cm4gbm9kZVxuXG4gICAgY2FzZSB0eXBlcy5udW06IGNhc2UgdHlwZXMuc3RyaW5nOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsKHRoaXMudmFsdWUpXG5cbiAgICBjYXNlIHR5cGVzLl9udWxsOiBjYXNlIHR5cGVzLl90cnVlOiBjYXNlIHR5cGVzLl9mYWxzZTpcbiAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgbm9kZS52YWx1ZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMuX251bGwgPyBudWxsIDogdGhpcy50eXBlID09PSB0eXBlcy5fdHJ1ZTtcbiAgICAgIG5vZGUucmF3ID0gdGhpcy50eXBlLmtleXdvcmQ7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG5cbiAgICBjYXNlIHR5cGVzLnBhcmVuTDpcbiAgICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQsIGV4cHIgPSB0aGlzLnBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb24oY2FuQmVBcnJvdyk7XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduIDwgMCAmJiAhdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByKSlcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IHN0YXJ0OyB9XG4gICAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kIDwgMClcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPSBzdGFydDsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cHJcblxuICAgIGNhc2UgdHlwZXMuYnJhY2tldEw6XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5lbGVtZW50cyA9IHRoaXMucGFyc2VFeHByTGlzdCh0eXBlcy5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyYXlFeHByZXNzaW9uXCIpXG5cbiAgICBjYXNlIHR5cGVzLmJyYWNlTDpcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKVxuXG4gICAgY2FzZSB0eXBlcy5fZnVuY3Rpb246XG4gICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihub2RlLCAwKVxuXG4gICAgY2FzZSB0eXBlcy5fY2xhc3M6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNsYXNzKHRoaXMuc3RhcnROb2RlKCksIGZhbHNlKVxuXG4gICAgY2FzZSB0eXBlcy5fbmV3OlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VOZXcoKVxuXG4gICAgY2FzZSB0eXBlcy5iYWNrUXVvdGU6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVRlbXBsYXRlKClcblxuICAgIGNhc2UgdHlwZXMuX2ltcG9ydDpcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFeHBySW1wb3J0KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuZXhwZWN0ZWQoKVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cbiAgfTtcblxuICBwcCQzLnBhcnNlRXhwckltcG9ydCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgIC8vIENvbnN1bWUgYGltcG9ydGAgYXMgYW4gaWRlbnRpZmllciBmb3IgYGltcG9ydC5tZXRhYC5cbiAgICAvLyBCZWNhdXNlIGB0aGlzLnBhcnNlSWRlbnQodHJ1ZSlgIGRvZXNuJ3QgY2hlY2sgZXNjYXBlIHNlcXVlbmNlcywgaXQgbmVlZHMgdGhlIGNoZWNrIG9mIGB0aGlzLmNvbnRhaW5zRXNjYC5cbiAgICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBpbXBvcnRcIik7IH1cbiAgICB2YXIgbWV0YSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSB0eXBlcy5wYXJlbkw6XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUR5bmFtaWNJbXBvcnQobm9kZSlcbiAgICBjYXNlIHR5cGVzLmRvdDpcbiAgICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydE1ldGEobm9kZSlcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VEeW5hbWljSW1wb3J0ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMubmV4dCgpOyAvLyBza2lwIGAoYFxuXG4gICAgLy8gUGFyc2Ugbm9kZS5zb3VyY2UuXG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcblxuICAgIC8vIFZlcmlmeSBlbmRpbmcuXG4gICAgaWYgKCF0aGlzLmVhdCh0eXBlcy5wYXJlblIpKSB7XG4gICAgICB2YXIgZXJyb3JQb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgaWYgKHRoaXMuZWF0KHR5cGVzLmNvbW1hKSAmJiB0aGlzLmVhdCh0eXBlcy5wYXJlblIpKSB7XG4gICAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShlcnJvclBvcywgXCJUcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZCBpbiBpbXBvcnQoKVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChlcnJvclBvcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEV4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQzLnBhcnNlSW1wb3J0TWV0YSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB0aGlzLm5leHQoKTsgLy8gc2tpcCBgLmBcblxuICAgIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcblxuICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IFwibWV0YVwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5wcm9wZXJ0eS5zdGFydCwgXCJUaGUgb25seSB2YWxpZCBtZXRhIHByb3BlcnR5IGZvciBpbXBvcnQgaXMgJ2ltcG9ydC5tZXRhJ1wiKTsgfVxuICAgIGlmIChjb250YWluc0VzYylcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiJ2ltcG9ydC5tZXRhJyBtdXN0IG5vdCBjb250YWluIGVzY2FwZWQgY2hhcmFjdGVyc1wiKTsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuc291cmNlVHlwZSAhPT0gXCJtb2R1bGVcIilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiQ2Fubm90IHVzZSAnaW1wb3J0Lm1ldGEnIG91dHNpZGUgYSBtb2R1bGVcIik7IH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZXRhUHJvcGVydHlcIilcbiAgfTtcblxuICBwcCQzLnBhcnNlTGl0ZXJhbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIG5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICBub2RlLnJhdyA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpO1xuICAgIGlmIChub2RlLnJhdy5jaGFyQ29kZUF0KG5vZGUucmF3Lmxlbmd0aCAtIDEpID09PSAxMTApIHsgbm9kZS5iaWdpbnQgPSBub2RlLnJhdy5zbGljZSgwLCAtMSkucmVwbGFjZSgvXy9nLCBcIlwiKTsgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVBhcmVuRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZXhwZWN0KHR5cGVzLnBhcmVuTCk7XG4gICAgdmFyIHZhbCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5SKTtcbiAgICByZXR1cm4gdmFsXG4gIH07XG5cbiAgcHAkMy5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uID0gZnVuY3Rpb24oY2FuQmVBcnJvdykge1xuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYywgdmFsLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gODtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICB2YXIgaW5uZXJTdGFydFBvcyA9IHRoaXMuc3RhcnQsIGlubmVyU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgdmFyIGV4cHJMaXN0ID0gW10sIGZpcnN0ID0gdHJ1ZSwgbGFzdElzQ29tbWEgPSBmYWxzZTtcbiAgICAgIHZhciByZWZEZXN0cnVjdHVyaW5nRXJyb3JzID0gbmV3IERlc3RydWN0dXJpbmdFcnJvcnMsIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBzcHJlYWRTdGFydDtcbiAgICAgIHRoaXMueWllbGRQb3MgPSAwO1xuICAgICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgICAvLyBEbyBub3Qgc2F2ZSBhd2FpdElkZW50UG9zIHRvIGFsbG93IGNoZWNraW5nIGF3YWl0cyBuZXN0ZWQgaW4gcGFyYW1ldGVyc1xuICAgICAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHlwZXMucGFyZW5SKSB7XG4gICAgICAgIGZpcnN0ID8gZmlyc3QgPSBmYWxzZSA6IHRoaXMuZXhwZWN0KHR5cGVzLmNvbW1hKTtcbiAgICAgICAgaWYgKGFsbG93VHJhaWxpbmdDb21tYSAmJiB0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcy5wYXJlblIsIHRydWUpKSB7XG4gICAgICAgICAgbGFzdElzQ29tbWEgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgICAgIHNwcmVhZFN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMucGFyc2VQYXJlbkl0ZW0odGhpcy5wYXJzZVJlc3RCaW5kaW5nKCkpKTtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5jb21tYSkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpOyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHByTGlzdC5wdXNoKHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdGhpcy5wYXJzZVBhcmVuSXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5uZXJFbmRQb3MgPSB0aGlzLnN0YXJ0LCBpbm5lckVuZExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5wYXJlblIpO1xuXG4gICAgICBpZiAoY2FuQmVBcnJvdyAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSAmJiB0aGlzLmVhdCh0eXBlcy5hcnJvdykpIHtcbiAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZmFsc2UpO1xuICAgICAgICB0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpO1xuICAgICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQYXJlbkFycm93TGlzdChzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4cHJMaXN0Lmxlbmd0aCB8fCBsYXN0SXNDb21tYSkgeyB0aGlzLnVuZXhwZWN0ZWQodGhpcy5sYXN0VG9rU3RhcnQpOyB9XG4gICAgICBpZiAoc3ByZWFkU3RhcnQpIHsgdGhpcy51bmV4cGVjdGVkKHNwcmVhZFN0YXJ0KTsgfVxuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3MgfHwgdGhpcy55aWVsZFBvcztcbiAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcyB8fCB0aGlzLmF3YWl0UG9zO1xuXG4gICAgICBpZiAoZXhwckxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICB2YWwgPSB0aGlzLnN0YXJ0Tm9kZUF0KGlubmVyU3RhcnRQb3MsIGlubmVyU3RhcnRMb2MpO1xuICAgICAgICB2YWwuZXhwcmVzc2lvbnMgPSBleHByTGlzdDtcbiAgICAgICAgdGhpcy5maW5pc2hOb2RlQXQodmFsLCBcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBpbm5lckVuZFBvcywgaW5uZXJFbmRMb2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gZXhwckxpc3RbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXNlcnZlUGFyZW5zKSB7XG4gICAgICB2YXIgcGFyID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgcGFyLmV4cHJlc3Npb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHBhciwgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VQYXJlbkl0ZW0gPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1cbiAgfTtcblxuICBwcCQzLnBhcnNlUGFyZW5BcnJvd0xpc3QgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0KSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBleHByTGlzdClcbiAgfTtcblxuICAvLyBOZXcncyBwcmVjZWRlbmNlIGlzIHNsaWdodGx5IHRyaWNreS4gSXQgbXVzdCBhbGxvdyBpdHMgYXJndW1lbnQgdG9cbiAgLy8gYmUgYSBgW11gIG9yIGRvdCBzdWJzY3JpcHQgZXhwcmVzc2lvbiwgYnV0IG5vdCBhIGNhbGwgXHUyMDE0IGF0IGxlYXN0LFxuICAvLyBub3Qgd2l0aG91dCB3cmFwcGluZyBpdCBpbiBwYXJlbnRoZXNlcy4gVGh1cywgaXQgdXNlcyB0aGUgbm9DYWxsc1xuICAvLyBhcmd1bWVudCB0byBwYXJzZVN1YnNjcmlwdHMgdG8gcHJldmVudCBpdCBmcm9tIGNvbnN1bWluZyB0aGVcbiAgLy8gYXJndW1lbnQgbGlzdC5cblxuICB2YXIgZW1wdHkkMSA9IFtdO1xuXG4gIHBwJDMucGFyc2VOZXcgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBuZXdcIik7IH1cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdmFyIG1ldGEgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuZWF0KHR5cGVzLmRvdCkpIHtcbiAgICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgICB2YXIgY29udGFpbnNFc2MgPSB0aGlzLmNvbnRhaW5zRXNjO1xuICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IFwidGFyZ2V0XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUucHJvcGVydHkuc3RhcnQsIFwiVGhlIG9ubHkgdmFsaWQgbWV0YSBwcm9wZXJ0eSBmb3IgbmV3IGlzICduZXcudGFyZ2V0J1wiKTsgfVxuICAgICAgaWYgKGNvbnRhaW5zRXNjKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIiduZXcudGFyZ2V0JyBtdXN0IG5vdCBjb250YWluIGVzY2FwZWQgY2hhcmFjdGVyc1wiKTsgfVxuICAgICAgaWYgKCF0aGlzLmluTm9uQXJyb3dGdW5jdGlvbigpKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIiduZXcudGFyZ2V0JyBjYW4gb25seSBiZSB1c2VkIGluIGZ1bmN0aW9uc1wiKTsgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1ldGFQcm9wZXJ0eVwiKVxuICAgIH1cbiAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0LCBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2MsIGlzSW1wb3J0ID0gdGhpcy50eXBlID09PSB0eXBlcy5faW1wb3J0O1xuICAgIG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZVN1YnNjcmlwdHModGhpcy5wYXJzZUV4cHJBdG9tKCksIHN0YXJ0UG9zLCBzdGFydExvYywgdHJ1ZSk7XG4gICAgaWYgKGlzSW1wb3J0ICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLnJhaXNlKHN0YXJ0UG9zLCBcIkNhbm5vdCB1c2UgbmV3IHdpdGggaW1wb3J0KClcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmVhdCh0eXBlcy5wYXJlbkwpKSB7IG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzLnBhcmVuUiwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgsIGZhbHNlKTsgfVxuICAgIGVsc2UgeyBub2RlLmFyZ3VtZW50cyA9IGVtcHR5JDE7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTmV3RXhwcmVzc2lvblwiKVxuICB9O1xuXG4gIC8vIFBhcnNlIHRlbXBsYXRlIGV4cHJlc3Npb24uXG5cbiAgcHAkMy5wYXJzZVRlbXBsYXRlRWxlbWVudCA9IGZ1bmN0aW9uKHJlZikge1xuICAgIHZhciBpc1RhZ2dlZCA9IHJlZi5pc1RhZ2dlZDtcblxuICAgIHZhciBlbGVtID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5pbnZhbGlkVGVtcGxhdGUpIHtcbiAgICAgIGlmICghaXNUYWdnZWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIFwiQmFkIGVzY2FwZSBzZXF1ZW5jZSBpbiB1bnRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsXCIpO1xuICAgICAgfVxuICAgICAgZWxlbS52YWx1ZSA9IHtcbiAgICAgICAgcmF3OiB0aGlzLnZhbHVlLFxuICAgICAgICBjb29rZWQ6IG51bGxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICAgIHJhdzogdGhpcy5pbnB1dC5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKSxcbiAgICAgICAgY29va2VkOiB0aGlzLnZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLm5leHQoKTtcbiAgICBlbGVtLnRhaWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzLmJhY2tRdW90ZTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGVsZW0sIFwiVGVtcGxhdGVFbGVtZW50XCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVRlbXBsYXRlID0gZnVuY3Rpb24ocmVmKSB7XG4gICAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICAgIHZhciBpc1RhZ2dlZCA9IHJlZi5pc1RhZ2dlZDsgaWYgKCBpc1RhZ2dlZCA9PT0gdm9pZCAwICkgaXNUYWdnZWQgPSBmYWxzZTtcblxuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmV4cHJlc3Npb25zID0gW107XG4gICAgdmFyIGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoe2lzVGFnZ2VkOiBpc1RhZ2dlZH0pO1xuICAgIG5vZGUucXVhc2lzID0gW2N1ckVsdF07XG4gICAgd2hpbGUgKCFjdXJFbHQudGFpbCkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuZW9mKSB7IHRoaXMucmFpc2UodGhpcy5wb3MsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlIGxpdGVyYWxcIik7IH1cbiAgICAgIHRoaXMuZXhwZWN0KHR5cGVzLmRvbGxhckJyYWNlTCk7XG4gICAgICBub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZUV4cHJlc3Npb24oKSk7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFjZVIpO1xuICAgICAgbm9kZS5xdWFzaXMucHVzaChjdXJFbHQgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KHtpc1RhZ2dlZDogaXNUYWdnZWR9KSk7XG4gICAgfVxuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIilcbiAgfTtcblxuICBwcCQzLmlzQXN5bmNQcm9wID0gZnVuY3Rpb24ocHJvcCkge1xuICAgIHJldHVybiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwcm9wLmtleS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICh0aGlzLnR5cGUgPT09IHR5cGVzLm5hbWUgfHwgdGhpcy50eXBlID09PSB0eXBlcy5udW0gfHwgdGhpcy50eXBlID09PSB0eXBlcy5zdHJpbmcgfHwgdGhpcy50eXBlID09PSB0eXBlcy5icmFja2V0TCB8fCB0aGlzLnR5cGUua2V5d29yZCB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy50eXBlID09PSB0eXBlcy5zdGFyKSkgJiZcbiAgICAgICFsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpXG4gIH07XG5cbiAgLy8gUGFyc2UgYW4gb2JqZWN0IGxpdGVyYWwgb3IgYmluZGluZyBwYXR0ZXJuLlxuXG4gIHBwJDMucGFyc2VPYmogPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGZpcnN0ID0gdHJ1ZSwgcHJvcEhhc2ggPSB7fTtcbiAgICBub2RlLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KHR5cGVzLmJyYWNlUikpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgdGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMuYnJhY2VSKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBwcm9wID0gdGhpcy5wYXJzZVByb3BlcnR5KGlzUGF0dGVybiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBpZiAoIWlzUGF0dGVybikgeyB0aGlzLmNoZWNrUHJvcENsYXNoKHByb3AsIHByb3BIYXNoLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTsgfVxuICAgICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgaXNQYXR0ZXJuID8gXCJPYmplY3RQYXR0ZXJuXCIgOiBcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgfTtcblxuICBwcCQzLnBhcnNlUHJvcGVydHkgPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgcHJvcCA9IHRoaXMuc3RhcnROb2RlKCksIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2M7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHRoaXMuZWF0KHR5cGVzLmVsbGlwc2lzKSkge1xuICAgICAgaWYgKGlzUGF0dGVybikge1xuICAgICAgICBwcm9wLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUlkZW50KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiQ29tbWEgaXMgbm90IHBlcm1pdHRlZCBhZnRlciB0aGUgcmVzdCBlbGVtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJSZXN0RWxlbWVudFwiKVxuICAgICAgfVxuICAgICAgLy8gVG8gZGlzYWxsb3cgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIHZpYSBgdGhpcy50b0Fzc2lnbmFibGUoKWAuXG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5wYXJlbkwgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduIDwgMCkge1xuICAgICAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPCAwKSB7XG4gICAgICAgICAgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQmluZCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFBhcnNlIGFyZ3VtZW50LlxuICAgICAgcHJvcC5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICAvLyBUbyBkaXNhbGxvdyB0cmFpbGluZyBjb21tYSB2aWEgYHRoaXMudG9Bc3NpZ25hYmxlKClgLlxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPCAwKSB7XG4gICAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA9IHRoaXMuc3RhcnQ7XG4gICAgICB9XG4gICAgICAvLyBGaW5pc2hcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJTcHJlYWRFbGVtZW50XCIpXG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgcHJvcC5tZXRob2QgPSBmYWxzZTtcbiAgICAgIHByb3Auc2hvcnRoYW5kID0gZmFsc2U7XG4gICAgICBpZiAoaXNQYXR0ZXJuIHx8IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICBzdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgICB9XG4gICAgICBpZiAoIWlzUGF0dGVybilcbiAgICAgICAgeyBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR5cGVzLnN0YXIpOyB9XG4gICAgfVxuICAgIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICBpZiAoIWlzUGF0dGVybiAmJiAhY29udGFpbnNFc2MgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDggJiYgIWlzR2VuZXJhdG9yICYmIHRoaXMuaXNBc3luY1Byb3AocHJvcCkpIHtcbiAgICAgIGlzQXN5bmMgPSB0cnVlO1xuICAgICAgaXNHZW5lcmF0b3IgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiB0aGlzLmVhdCh0eXBlcy5zdGFyKTtcbiAgICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzQXN5bmMgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5VmFsdWUocHJvcCwgaXNQYXR0ZXJuLCBpc0dlbmVyYXRvciwgaXNBc3luYywgc3RhcnRQb3MsIHN0YXJ0TG9jLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBjb250YWluc0VzYyk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwcm9wLCBcIlByb3BlcnR5XCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZVByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbihwcm9wLCBpc1BhdHRlcm4sIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2MsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGNvbnRhaW5zRXNjKSB7XG4gICAgaWYgKChpc0dlbmVyYXRvciB8fCBpc0FzeW5jKSAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbG9uKVxuICAgICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuXG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzLmNvbG9uKSkge1xuICAgICAgcHJvcC52YWx1ZSA9IGlzUGF0dGVybiA/IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGFydCwgdGhpcy5zdGFydExvYykgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLnBhcmVuTCkge1xuICAgICAgaWYgKGlzUGF0dGVybikgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgICBwcm9wLm1ldGhvZCA9IHRydWU7XG4gICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChpc0dlbmVyYXRvciwgaXNBc3luYyk7XG4gICAgfSBlbHNlIGlmICghaXNQYXR0ZXJuICYmICFjb250YWluc0VzYyAmJlxuICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiYgIXByb3AuY29tcHV0ZWQgJiYgcHJvcC5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgICAgIChwcm9wLmtleS5uYW1lID09PSBcImdldFwiIHx8IHByb3Aua2V5Lm5hbWUgPT09IFwic2V0XCIpICYmXG4gICAgICAgICAgICAgICAodGhpcy50eXBlICE9PSB0eXBlcy5jb21tYSAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmJyYWNlUiAmJiB0aGlzLnR5cGUgIT09IHR5cGVzLmVxKSkge1xuICAgICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzQXN5bmMpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHByb3Aua2luZCA9IHByb3Aua2V5Lm5hbWU7XG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO1xuICAgICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNZXRob2QoZmFsc2UpO1xuICAgICAgdmFyIHBhcmFtQ291bnQgPSBwcm9wLmtpbmQgPT09IFwiZ2V0XCIgPyAwIDogMTtcbiAgICAgIGlmIChwcm9wLnZhbHVlLnBhcmFtcy5sZW5ndGggIT09IHBhcmFtQ291bnQpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcHJvcC52YWx1ZS5zdGFydDtcbiAgICAgICAgaWYgKHByb3Aua2luZCA9PT0gXCJnZXRcIilcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJnZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcGFyYW1zXCIpOyB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJzZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1cIik7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9wLmtpbmQgPT09IFwic2V0XCIgJiYgcHJvcC52YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHByb3AudmFsdWUucGFyYW1zWzBdLnN0YXJ0LCBcIlNldHRlciBjYW5ub3QgdXNlIHJlc3QgcGFyYW1zXCIpOyB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzQXN5bmMpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKHByb3Aua2V5KTtcbiAgICAgIGlmIChwcm9wLmtleS5uYW1lID09PSBcImF3YWl0XCIgJiYgIXRoaXMuYXdhaXRJZGVudFBvcylcbiAgICAgICAgeyB0aGlzLmF3YWl0SWRlbnRQb3MgPSBzdGFydFBvczsgfVxuICAgICAgcHJvcC5raW5kID0gXCJpbml0XCI7XG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLCBzdGFydExvYywgcHJvcC5rZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLmVxICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduIDwgMClcbiAgICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuc2hvcnRoYW5kQXNzaWduID0gdGhpcy5zdGFydDsgfVxuICAgICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdChzdGFydFBvcywgc3RhcnRMb2MsIHByb3Aua2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3AudmFsdWUgPSBwcm9wLmtleTtcbiAgICAgIH1cbiAgICAgIHByb3Auc2hvcnRoYW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICB9O1xuXG4gIHBwJDMucGFyc2VQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihwcm9wKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgICBpZiAodGhpcy5lYXQodHlwZXMuYnJhY2tldEwpKSB7XG4gICAgICAgIHByb3AuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICBwcm9wLmtleSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0eXBlcy5icmFja2V0Uik7XG4gICAgICAgIHJldHVybiBwcm9wLmtleVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcC5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcC5rZXkgPSB0aGlzLnR5cGUgPT09IHR5cGVzLm51bSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzLnN0cmluZyA/IHRoaXMucGFyc2VFeHByQXRvbSgpIDogdGhpcy5wYXJzZUlkZW50KHRoaXMub3B0aW9ucy5hbGxvd1Jlc2VydmVkICE9PSBcIm5ldmVyXCIpXG4gIH07XG5cbiAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBmdW5jdGlvbiBub2RlLlxuXG4gIHBwJDMuaW5pdEZ1bmN0aW9uID0gZnVuY3Rpb24obm9kZSkge1xuICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikgeyBub2RlLmdlbmVyYXRvciA9IG5vZGUuZXhwcmVzc2lvbiA9IGZhbHNlOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4KSB7IG5vZGUuYXN5bmMgPSBmYWxzZTsgfVxuICB9O1xuXG4gIC8vIFBhcnNlIG9iamVjdCBvciBjbGFzcyBtZXRob2QuXG5cbiAgcHAkMy5wYXJzZU1ldGhvZCA9IGZ1bmN0aW9uKGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd0RpcmVjdFN1cGVyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcblxuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNilcbiAgICAgIHsgbm9kZS5nZW5lcmF0b3IgPSBpc0dlbmVyYXRvcjsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICAgIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBub2RlLmdlbmVyYXRvcikgfCBTQ09QRV9TVVBFUiB8IChhbGxvd0RpcmVjdFN1cGVyID8gU0NPUEVfRElSRUNUX1NVUEVSIDogMCkpO1xuXG4gICAgdGhpcy5leHBlY3QodHlwZXMucGFyZW5MKTtcbiAgICBub2RlLnBhcmFtcyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdCh0eXBlcy5wYXJlblIsIGZhbHNlLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCk7XG4gICAgdGhpcy5jaGVja1lpZWxkQXdhaXRJbkRlZmF1bHRQYXJhbXMoKTtcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGZhbHNlLCB0cnVlKTtcblxuICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gb2xkQXdhaXRJZGVudFBvcztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuXG5cbiAgcHAkMy5wYXJzZUFycm93RXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHBhcmFtcywgaXNBc3luYykge1xuICAgIHZhciBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcblxuICAgIHRoaXMuZW50ZXJTY29wZShmdW5jdGlvbkZsYWdzKGlzQXN5bmMsIGZhbHNlKSB8IFNDT1BFX0FSUk9XKTtcbiAgICB0aGlzLmluaXRGdW5jdGlvbihub2RlKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgpIHsgbm9kZS5hc3luYyA9ICEhaXNBc3luYzsgfVxuXG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcblxuICAgIG5vZGUucGFyYW1zID0gdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJ1ZSk7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCB0cnVlLCBmYWxzZSk7XG5cbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgLy8gUGFyc2UgZnVuY3Rpb24gYm9keSBhbmQgY2hlY2sgcGFyYW1ldGVycy5cblxuICBwcCQzLnBhcnNlRnVuY3Rpb25Cb2R5ID0gZnVuY3Rpb24obm9kZSwgaXNBcnJvd0Z1bmN0aW9uLCBpc01ldGhvZCkge1xuICAgIHZhciBpc0V4cHJlc3Npb24gPSBpc0Fycm93RnVuY3Rpb24gJiYgdGhpcy50eXBlICE9PSB0eXBlcy5icmFjZUw7XG4gICAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0LCB1c2VTdHJpY3QgPSBmYWxzZTtcblxuICAgIGlmIChpc0V4cHJlc3Npb24pIHtcbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2hlY2tQYXJhbXMobm9kZSwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uU2ltcGxlID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgIXRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpO1xuICAgICAgaWYgKCFvbGRTdHJpY3QgfHwgbm9uU2ltcGxlKSB7XG4gICAgICAgIHVzZVN0cmljdCA9IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMuZW5kKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0cmljdCBtb2RlIGZ1bmN0aW9uLCB2ZXJpZnkgdGhhdCBhcmd1bWVudCBuYW1lc1xuICAgICAgICAvLyBhcmUgbm90IHJlcGVhdGVkLCBhbmQgaXQgZG9lcyBub3QgdHJ5IHRvIGJpbmQgdGhlIHdvcmRzIGBldmFsYFxuICAgICAgICAvLyBvciBgYXJndW1lbnRzYC5cbiAgICAgICAgaWYgKHVzZVN0cmljdCAmJiBub25TaW1wbGUpXG4gICAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0XCIpOyB9XG4gICAgICB9XG4gICAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmBcbiAgICAgIC8vIGZsYWcgKHJlc3RvcmUgdGhlbSB0byB0aGVpciBvbGQgdmFsdWUgYWZ0ZXJ3YXJkcykuXG4gICAgICB2YXIgb2xkTGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICB0aGlzLmxhYmVscyA9IFtdO1xuICAgICAgaWYgKHVzZVN0cmljdCkgeyB0aGlzLnN0cmljdCA9IHRydWU7IH1cblxuICAgICAgLy8gQWRkIHRoZSBwYXJhbXMgdG8gdmFyRGVjbGFyZWROYW1lcyB0byBlbnN1cmUgdGhhdCBhbiBlcnJvciBpcyB0aHJvd25cbiAgICAgIC8vIGlmIGEgbGV0L2NvbnN0IGRlY2xhcmF0aW9uIGluIHRoZSBmdW5jdGlvbiBjbGFzaGVzIHdpdGggb25lIG9mIHRoZSBwYXJhbXMuXG4gICAgICB0aGlzLmNoZWNrUGFyYW1zKG5vZGUsICFvbGRTdHJpY3QgJiYgIXVzZVN0cmljdCAmJiAhaXNBcnJvd0Z1bmN0aW9uICYmICFpc01ldGhvZCAmJiB0aGlzLmlzU2ltcGxlUGFyYW1MaXN0KG5vZGUucGFyYW1zKSk7XG4gICAgICAvLyBFbnN1cmUgdGhlIGZ1bmN0aW9uIG5hbWUgaXNuJ3QgYSBmb3JiaWRkZW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSwgZS5nLiAnZXZhbCdcbiAgICAgIGlmICh0aGlzLnN0cmljdCAmJiBub2RlLmlkKSB7IHRoaXMuY2hlY2tMVmFsKG5vZGUuaWQsIEJJTkRfT1VUU0lERSk7IH1cbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VCbG9jayhmYWxzZSwgdW5kZWZpbmVkLCB1c2VTdHJpY3QgJiYgIW9sZFN0cmljdCk7XG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRhcHREaXJlY3RpdmVQcm9sb2d1ZShub2RlLmJvZHkuYm9keSk7XG4gICAgICB0aGlzLmxhYmVscyA9IG9sZExhYmVscztcbiAgICB9XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgfTtcblxuICBwcCQzLmlzU2ltcGxlUGFyYW1MaXN0ID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBwYXJhbXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgICAgaWYgKHBhcmFtLnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSB7IHJldHVybiBmYWxzZVxuICAgIH0gfVxuICAgIHJldHVybiB0cnVlXG4gIH07XG5cbiAgLy8gQ2hlY2tzIGZ1bmN0aW9uIHBhcmFtcyBmb3IgdmFyaW91cyBkaXNhbGxvd2VkIHBhdHRlcm5zIHN1Y2ggYXMgdXNpbmcgXCJldmFsXCJcbiAgLy8gb3IgXCJhcmd1bWVudHNcIiBhbmQgZHVwbGljYXRlIHBhcmFtZXRlcnMuXG5cbiAgcHAkMy5jaGVja1BhcmFtcyA9IGZ1bmN0aW9uKG5vZGUsIGFsbG93RHVwbGljYXRlcykge1xuICAgIHZhciBuYW1lSGFzaCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5wYXJhbXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgICAge1xuICAgICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgICAgdGhpcy5jaGVja0xWYWwocGFyYW0sIEJJTkRfVkFSLCBhbGxvd0R1cGxpY2F0ZXMgPyBudWxsIDogbmFtZUhhc2gpO1xuICAgIH1cbiAgfTtcblxuICAvLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucywgYW5kIHJldHVybnMgdGhlbSBhc1xuICAvLyBhbiBhcnJheS4gYGNsb3NlYCBpcyB0aGUgdG9rZW4gdHlwZSB0aGF0IGVuZHMgdGhlIGxpc3QsIGFuZFxuICAvLyBgYWxsb3dFbXB0eWAgY2FuIGJlIHR1cm5lZCBvbiB0byBhbGxvdyBzdWJzZXF1ZW50IGNvbW1hcyB3aXRoXG4gIC8vIG5vdGhpbmcgaW4gYmV0d2VlbiB0aGVtIHRvIGJlIHBhcnNlZCBhcyBgbnVsbGAgKHdoaWNoIGlzIG5lZWRlZFxuICAvLyBmb3IgYXJyYXkgbGl0ZXJhbHMpLlxuXG4gIHBwJDMucGFyc2VFeHByTGlzdCA9IGZ1bmN0aW9uKGNsb3NlLCBhbGxvd1RyYWlsaW5nQ29tbWEsIGFsbG93RW1wdHksIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICB2YXIgZWx0cyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHlwZXMuY29tbWEpO1xuICAgICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkgeyBicmVhayB9XG4gICAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICAgIHZhciBlbHQgPSAodm9pZCAwKTtcbiAgICAgIGlmIChhbGxvd0VtcHR5ICYmIHRoaXMudHlwZSA9PT0gdHlwZXMuY29tbWEpXG4gICAgICAgIHsgZWx0ID0gbnVsbDsgfVxuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcy5lbGxpcHNpcykge1xuICAgICAgICBlbHQgPSB0aGlzLnBhcnNlU3ByZWFkKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiB0aGlzLnR5cGUgPT09IHR5cGVzLmNvbW1hICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA8IDApXG4gICAgICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSB0aGlzLnN0YXJ0OyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgfVxuICAgICAgZWx0cy5wdXNoKGVsdCk7XG4gICAgfVxuICAgIHJldHVybiBlbHRzXG4gIH07XG5cbiAgcHAkMy5jaGVja1VucmVzZXJ2ZWQgPSBmdW5jdGlvbihyZWYpIHtcbiAgICB2YXIgc3RhcnQgPSByZWYuc3RhcnQ7XG4gICAgdmFyIGVuZCA9IHJlZi5lbmQ7XG4gICAgdmFyIG5hbWUgPSByZWYubmFtZTtcblxuICAgIGlmICh0aGlzLmluR2VuZXJhdG9yICYmIG5hbWUgPT09IFwieWllbGRcIilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2UgJ3lpZWxkJyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIGdlbmVyYXRvclwiKTsgfVxuICAgIGlmICh0aGlzLmluQXN5bmMgJiYgbmFtZSA9PT0gXCJhd2FpdFwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uXCIpOyB9XG4gICAgaWYgKHRoaXMua2V5d29yZHMudGVzdChuYW1lKSlcbiAgICAgIHsgdGhpcy5yYWlzZShzdGFydCwgKFwiVW5leHBlY3RlZCBrZXl3b3JkICdcIiArIG5hbWUgKyBcIidcIikpOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYgJiZcbiAgICAgIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCkuaW5kZXhPZihcIlxcXFxcIikgIT09IC0xKSB7IHJldHVybiB9XG4gICAgdmFyIHJlID0gdGhpcy5zdHJpY3QgPyB0aGlzLnJlc2VydmVkV29yZHNTdHJpY3QgOiB0aGlzLnJlc2VydmVkV29yZHM7XG4gICAgaWYgKHJlLnRlc3QobmFtZSkpIHtcbiAgICAgIGlmICghdGhpcy5pbkFzeW5jICYmIG5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSBrZXl3b3JkICdhd2FpdCcgb3V0c2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKTsgfVxuICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCAoXCJUaGUga2V5d29yZCAnXCIgKyBuYW1lICsgXCInIGlzIHJlc2VydmVkXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGFyc2UgdGhlIG5leHQgdG9rZW4gYXMgYW4gaWRlbnRpZmllci4gSWYgYGxpYmVyYWxgIGlzIHRydWUgKHVzZWRcbiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvXG4gIC8vIGlkZW50aWZpZXJzLlxuXG4gIHBwJDMucGFyc2VJZGVudCA9IGZ1bmN0aW9uKGxpYmVyYWwsIGlzQmluZGluZykge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcy5uYW1lKSB7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtleXdvcmQpIHtcbiAgICAgIG5vZGUubmFtZSA9IHRoaXMudHlwZS5rZXl3b3JkO1xuXG4gICAgICAvLyBUbyBmaXggaHR0cHM6Ly9naXRodWIuY29tL2Fjb3JuanMvYWNvcm4vaXNzdWVzLzU3NVxuICAgICAgLy8gYGNsYXNzYCBhbmQgYGZ1bmN0aW9uYCBrZXl3b3JkcyBwdXNoIG5ldyBjb250ZXh0IGludG8gdGhpcy5jb250ZXh0LlxuICAgICAgLy8gQnV0IHRoZXJlIGlzIG5vIGNoYW5jZSB0byBwb3AgdGhlIGNvbnRleHQgaWYgdGhlIGtleXdvcmQgaXMgY29uc3VtZWQgYXMgYW4gaWRlbnRpZmllciBzdWNoIGFzIGEgcHJvcGVydHkgbmFtZS5cbiAgICAgIC8vIElmIHRoZSBwcmV2aW91cyB0b2tlbiBpcyBhIGRvdCwgdGhpcyBkb2VzIG5vdCBhcHBseSBiZWNhdXNlIHRoZSBjb250ZXh0LW1hbmFnaW5nIGNvZGUgYWxyZWFkeSBpZ25vcmVkIHRoZSBrZXl3b3JkXG4gICAgICBpZiAoKG5vZGUubmFtZSA9PT0gXCJjbGFzc1wiIHx8IG5vZGUubmFtZSA9PT0gXCJmdW5jdGlvblwiKSAmJlxuICAgICAgICAgICh0aGlzLmxhc3RUb2tFbmQgIT09IHRoaXMubGFzdFRva1N0YXJ0ICsgMSB8fCB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5sYXN0VG9rU3RhcnQpICE9PSA0NikpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gICAgdGhpcy5uZXh0KCEhbGliZXJhbCk7XG4gICAgdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSWRlbnRpZmllclwiKTtcbiAgICBpZiAoIWxpYmVyYWwpIHtcbiAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKG5vZGUpO1xuICAgICAgaWYgKG5vZGUubmFtZSA9PT0gXCJhd2FpdFwiICYmICF0aGlzLmF3YWl0SWRlbnRQb3MpXG4gICAgICAgIHsgdGhpcy5hd2FpdElkZW50UG9zID0gbm9kZS5zdGFydDsgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZVxuICB9O1xuXG4gIC8vIFBhcnNlcyB5aWVsZCBleHByZXNzaW9uIGluc2lkZSBnZW5lcmF0b3IuXG5cbiAgcHAkMy5wYXJzZVlpZWxkID0gZnVuY3Rpb24obm9Jbikge1xuICAgIGlmICghdGhpcy55aWVsZFBvcykgeyB0aGlzLnlpZWxkUG9zID0gdGhpcy5zdGFydDsgfVxuXG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzLnNlbWkgfHwgdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSB8fCAodGhpcy50eXBlICE9PSB0eXBlcy5zdGFyICYmICF0aGlzLnR5cGUuc3RhcnRzRXhwcikpIHtcbiAgICAgIG5vZGUuZGVsZWdhdGUgPSBmYWxzZTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmRlbGVnYXRlID0gdGhpcy5lYXQodHlwZXMuc3Rhcik7XG4gICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKG5vSW4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgcHAkMy5wYXJzZUF3YWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmF3YWl0UG9zKSB7IHRoaXMuYXdhaXRQb3MgPSB0aGlzLnN0YXJ0OyB9XG5cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIGZhbHNlKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXdhaXRFeHByZXNzaW9uXCIpXG4gIH07XG5cbiAgdmFyIHBwJDQgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByYWlzZSBleGNlcHRpb25zIG9uIHBhcnNlIGVycm9ycy4gSXRcbiAgLy8gdGFrZXMgYW4gb2Zmc2V0IGludGVnZXIgKGludG8gdGhlIGN1cnJlbnQgYGlucHV0YCkgdG8gaW5kaWNhdGVcbiAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvciwgYXR0YWNoZXMgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbmRcbiAgLy8gb2YgdGhlIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIHJhaXNlcyBhIGBTeW50YXhFcnJvcmAgd2l0aCB0aGF0XG4gIC8vIG1lc3NhZ2UuXG5cbiAgcHAkNC5yYWlzZSA9IGZ1bmN0aW9uKHBvcywgbWVzc2FnZSkge1xuICAgIHZhciBsb2MgPSBnZXRMaW5lSW5mbyh0aGlzLmlucHV0LCBwb3MpO1xuICAgIG1lc3NhZ2UgKz0gXCIgKFwiICsgbG9jLmxpbmUgKyBcIjpcIiArIGxvYy5jb2x1bW4gKyBcIilcIjtcbiAgICB2YXIgZXJyID0gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICAgIGVyci5wb3MgPSBwb3M7IGVyci5sb2MgPSBsb2M7IGVyci5yYWlzZWRBdCA9IHRoaXMucG9zO1xuICAgIHRocm93IGVyclxuICB9O1xuXG4gIHBwJDQucmFpc2VSZWNvdmVyYWJsZSA9IHBwJDQucmFpc2U7XG5cbiAgcHAkNC5jdXJQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuY3VyTGluZSwgdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydClcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBwJDUgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHZhciBTY29wZSA9IGZ1bmN0aW9uIFNjb3BlKGZsYWdzKSB7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIC8vIEEgbGlzdCBvZiB2YXItZGVjbGFyZWQgbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZVxuICAgIHRoaXMudmFyID0gW107XG4gICAgLy8gQSBsaXN0IG9mIGxleGljYWxseS1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gICAgdGhpcy5sZXhpY2FsID0gW107XG4gICAgLy8gQSBsaXN0IG9mIGxleGljYWxseS1kZWNsYXJlZCBGdW5jdGlvbkRlY2xhcmF0aW9uIG5hbWVzIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGVcbiAgICB0aGlzLmZ1bmN0aW9ucyA9IFtdO1xuICB9O1xuXG4gIC8vIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUga2VlcCB0cmFjayBvZiBkZWNsYXJlZCB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUgaW4gb3JkZXIgdG8gZGV0ZWN0IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcy5cblxuICBwcCQ1LmVudGVyU2NvcGUgPSBmdW5jdGlvbihmbGFncykge1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKG5ldyBTY29wZShmbGFncykpO1xuICB9O1xuXG4gIHBwJDUuZXhpdFNjb3BlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vID4gQXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZ1bmN0aW9uLCBvciBzY3JpcHQsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhcmVcbiAgLy8gPiB0cmVhdGVkIGxpa2UgdmFyIGRlY2xhcmF0aW9ucyByYXRoZXIgdGhhbiBsaWtlIGxleGljYWwgZGVjbGFyYXRpb25zLlxuICBwcCQ1LnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlID0gZnVuY3Rpb24oc2NvcGUpIHtcbiAgICByZXR1cm4gKHNjb3BlLmZsYWdzICYgU0NPUEVfRlVOQ1RJT04pIHx8ICF0aGlzLmluTW9kdWxlICYmIChzY29wZS5mbGFncyAmIFNDT1BFX1RPUClcbiAgfTtcblxuICBwcCQ1LmRlY2xhcmVOYW1lID0gZnVuY3Rpb24obmFtZSwgYmluZGluZ1R5cGUsIHBvcykge1xuICAgIHZhciByZWRlY2xhcmVkID0gZmFsc2U7XG4gICAgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX0xFWElDQUwpIHtcbiAgICAgIHZhciBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlKCk7XG4gICAgICByZWRlY2xhcmVkID0gc2NvcGUubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTEgfHwgc2NvcGUuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZS52YXIuaW5kZXhPZihuYW1lKSA+IC0xO1xuICAgICAgc2NvcGUubGV4aWNhbC5wdXNoKG5hbWUpO1xuICAgICAgaWYgKHRoaXMuaW5Nb2R1bGUgJiYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVE9QKSlcbiAgICAgICAgeyBkZWxldGUgdGhpcy51bmRlZmluZWRFeHBvcnRzW25hbWVdOyB9XG4gICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSA9PT0gQklORF9TSU1QTEVfQ0FUQ0gpIHtcbiAgICAgIHZhciBzY29wZSQxID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICAgIHNjb3BlJDEubGV4aWNhbC5wdXNoKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfRlVOQ1RJT04pIHtcbiAgICAgIHZhciBzY29wZSQyID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICAgIGlmICh0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXIpXG4gICAgICAgIHsgcmVkZWNsYXJlZCA9IHNjb3BlJDIubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICAgIGVsc2VcbiAgICAgICAgeyByZWRlY2xhcmVkID0gc2NvcGUkMi5sZXhpY2FsLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZSQyLnZhci5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICAgIHNjb3BlJDIuZnVuY3Rpb25zLnB1c2gobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIHNjb3BlJDMgPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICAgIGlmIChzY29wZSQzLmxleGljYWwuaW5kZXhPZihuYW1lKSA+IC0xICYmICEoKHNjb3BlJDMuZmxhZ3MgJiBTQ09QRV9TSU1QTEVfQ0FUQ0gpICYmIHNjb3BlJDMubGV4aWNhbFswXSA9PT0gbmFtZSkgfHxcbiAgICAgICAgICAgICF0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHNjb3BlJDMpICYmIHNjb3BlJDMuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSkge1xuICAgICAgICAgIHJlZGVjbGFyZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUkMy52YXIucHVzaChuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5Nb2R1bGUgJiYgKHNjb3BlJDMuZmxhZ3MgJiBTQ09QRV9UT1ApKVxuICAgICAgICAgIHsgZGVsZXRlIHRoaXMudW5kZWZpbmVkRXhwb3J0c1tuYW1lXTsgfVxuICAgICAgICBpZiAoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1ZBUikgeyBicmVhayB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWRlY2xhcmVkKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShwb3MsIChcIklkZW50aWZpZXIgJ1wiICsgbmFtZSArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkXCIpKTsgfVxuICB9O1xuXG4gIHBwJDUuY2hlY2tMb2NhbEV4cG9ydCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgLy8gc2NvcGUuZnVuY3Rpb25zIG11c3QgYmUgZW1wdHkgYXMgTW9kdWxlIGNvZGUgaXMgYWx3YXlzIHN0cmljdC5cbiAgICBpZiAodGhpcy5zY29wZVN0YWNrWzBdLmxleGljYWwuaW5kZXhPZihpZC5uYW1lKSA9PT0gLTEgJiZcbiAgICAgICAgdGhpcy5zY29wZVN0YWNrWzBdLnZhci5pbmRleE9mKGlkLm5hbWUpID09PSAtMSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzW2lkLm5hbWVdID0gaWQ7XG4gICAgfVxuICB9O1xuXG4gIHBwJDUuY3VycmVudFNjb3BlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGVTdGFja1t0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMV1cbiAgfTtcblxuICBwcCQ1LmN1cnJlbnRWYXJTY29wZSA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTs7IGktLSkge1xuICAgICAgdmFyIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSKSB7IHJldHVybiBzY29wZSB9XG4gICAgfVxuICB9O1xuXG4gIC8vIENvdWxkIGJlIHVzZWZ1bCBmb3IgYHRoaXNgLCBgbmV3LnRhcmdldGAsIGBzdXBlcigpYCwgYHN1cGVyLnByb3BlcnR5YCwgYW5kIGBzdXBlcltwcm9wZXJ0eV1gLlxuICBwcCQ1LmN1cnJlbnRUaGlzU2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICAgIHZhciBzY29wZSA9IHRoaXMuc2NvcGVTdGFja1tpXTtcbiAgICAgIGlmIChzY29wZS5mbGFncyAmIFNDT1BFX1ZBUiAmJiAhKHNjb3BlLmZsYWdzICYgU0NPUEVfQVJST1cpKSB7IHJldHVybiBzY29wZSB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBOb2RlID0gZnVuY3Rpb24gTm9kZShwYXJzZXIsIHBvcywgbG9jKSB7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcbiAgICB0aGlzLnN0YXJ0ID0gcG9zO1xuICAgIHRoaXMuZW5kID0gMDtcbiAgICBpZiAocGFyc2VyLm9wdGlvbnMubG9jYXRpb25zKVxuICAgICAgeyB0aGlzLmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbihwYXJzZXIsIGxvYyk7IH1cbiAgICBpZiAocGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZSlcbiAgICAgIHsgdGhpcy5zb3VyY2VGaWxlID0gcGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZTsgfVxuICAgIGlmIChwYXJzZXIub3B0aW9ucy5yYW5nZXMpXG4gICAgICB7IHRoaXMucmFuZ2UgPSBbcG9zLCAwXTsgfVxuICB9O1xuXG4gIC8vIFN0YXJ0IGFuIEFTVCBub2RlLCBhdHRhY2hpbmcgYSBzdGFydCBvZmZzZXQuXG5cbiAgdmFyIHBwJDYgPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHBwJDYuc3RhcnROb2RlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpXG4gIH07XG5cbiAgcHAkNi5zdGFydE5vZGVBdCA9IGZ1bmN0aW9uKHBvcywgbG9jKSB7XG4gICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHBvcywgbG9jKVxuICB9O1xuXG4gIC8vIEZpbmlzaCBhbiBBU1Qgbm9kZSwgYWRkaW5nIGB0eXBlYCBhbmQgYGVuZGAgcHJvcGVydGllcy5cblxuICBmdW5jdGlvbiBmaW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgICBub2RlLnR5cGUgPSB0eXBlO1xuICAgIG5vZGUuZW5kID0gcG9zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKVxuICAgICAgeyBub2RlLmxvYy5lbmQgPSBsb2M7IH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcylcbiAgICAgIHsgbm9kZS5yYW5nZVsxXSA9IHBvczsgfVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICBwcCQ2LmZpbmlzaE5vZGUgPSBmdW5jdGlvbihub2RlLCB0eXBlKSB7XG4gICAgcmV0dXJuIGZpbmlzaE5vZGVBdC5jYWxsKHRoaXMsIG5vZGUsIHR5cGUsIHRoaXMubGFzdFRva0VuZCwgdGhpcy5sYXN0VG9rRW5kTG9jKVxuICB9O1xuXG4gIC8vIEZpbmlzaCBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXG5cbiAgcHAkNi5maW5pc2hOb2RlQXQgPSBmdW5jdGlvbihub2RlLCB0eXBlLCBwb3MsIGxvYykge1xuICAgIHJldHVybiBmaW5pc2hOb2RlQXQuY2FsbCh0aGlzLCBub2RlLCB0eXBlLCBwb3MsIGxvYylcbiAgfTtcblxuICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSByZWdleHAgY2FuIGFwcGVhciBhdCBhXG5cbiAgdmFyIFRva0NvbnRleHQgPSBmdW5jdGlvbiBUb2tDb250ZXh0KHRva2VuLCBpc0V4cHIsIHByZXNlcnZlU3BhY2UsIG92ZXJyaWRlLCBnZW5lcmF0b3IpIHtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy5pc0V4cHIgPSAhIWlzRXhwcjtcbiAgICB0aGlzLnByZXNlcnZlU3BhY2UgPSAhIXByZXNlcnZlU3BhY2U7XG4gICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlO1xuICAgIHRoaXMuZ2VuZXJhdG9yID0gISFnZW5lcmF0b3I7XG4gIH07XG5cbiAgdmFyIHR5cGVzJDEgPSB7XG4gICAgYl9zdGF0OiBuZXcgVG9rQ29udGV4dChcIntcIiwgZmFsc2UpLFxuICAgIGJfZXhwcjogbmV3IFRva0NvbnRleHQoXCJ7XCIsIHRydWUpLFxuICAgIGJfdG1wbDogbmV3IFRva0NvbnRleHQoXCIke1wiLCBmYWxzZSksXG4gICAgcF9zdGF0OiBuZXcgVG9rQ29udGV4dChcIihcIiwgZmFsc2UpLFxuICAgIHBfZXhwcjogbmV3IFRva0NvbnRleHQoXCIoXCIsIHRydWUpLFxuICAgIHFfdG1wbDogbmV3IFRva0NvbnRleHQoXCJgXCIsIHRydWUsIHRydWUsIGZ1bmN0aW9uIChwKSB7IHJldHVybiBwLnRyeVJlYWRUZW1wbGF0ZVRva2VuKCk7IH0pLFxuICAgIGZfc3RhdDogbmV3IFRva0NvbnRleHQoXCJmdW5jdGlvblwiLCBmYWxzZSksXG4gICAgZl9leHByOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIHRydWUpLFxuICAgIGZfZXhwcl9nZW46IG5ldyBUb2tDb250ZXh0KFwiZnVuY3Rpb25cIiwgdHJ1ZSwgZmFsc2UsIG51bGwsIHRydWUpLFxuICAgIGZfZ2VuOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIGZhbHNlLCBmYWxzZSwgbnVsbCwgdHJ1ZSlcbiAgfTtcblxuICB2YXIgcHAkNyA9IFBhcnNlci5wcm90b3R5cGU7XG5cbiAgcHAkNy5pbml0aWFsQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbdHlwZXMkMS5iX3N0YXRdXG4gIH07XG5cbiAgcHAkNy5icmFjZUlzQmxvY2sgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLmN1ckNvbnRleHQoKTtcbiAgICBpZiAocGFyZW50ID09PSB0eXBlcyQxLmZfZXhwciB8fCBwYXJlbnQgPT09IHR5cGVzJDEuZl9zdGF0KVxuICAgICAgeyByZXR1cm4gdHJ1ZSB9XG4gICAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5jb2xvbiAmJiAocGFyZW50ID09PSB0eXBlcyQxLmJfc3RhdCB8fCBwYXJlbnQgPT09IHR5cGVzJDEuYl9leHByKSlcbiAgICAgIHsgcmV0dXJuICFwYXJlbnQuaXNFeHByIH1cblxuICAgIC8vIFRoZSBjaGVjayBmb3IgYHR0Lm5hbWUgJiYgZXhwckFsbG93ZWRgIGRldGVjdHMgd2hldGhlciB3ZSBhcmVcbiAgICAvLyBhZnRlciBhIGB5aWVsZGAgb3IgYG9mYCBjb25zdHJ1Y3QuIFNlZSB0aGUgYHVwZGF0ZUNvbnRleHRgIGZvclxuICAgIC8vIGB0dC5uYW1lYC5cbiAgICBpZiAocHJldlR5cGUgPT09IHR5cGVzLl9yZXR1cm4gfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUgJiYgdGhpcy5leHByQWxsb3dlZClcbiAgICAgIHsgcmV0dXJuIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSkgfVxuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuX2Vsc2UgfHwgcHJldlR5cGUgPT09IHR5cGVzLnNlbWkgfHwgcHJldlR5cGUgPT09IHR5cGVzLmVvZiB8fCBwcmV2VHlwZSA9PT0gdHlwZXMucGFyZW5SIHx8IHByZXZUeXBlID09PSB0eXBlcy5hcnJvdylcbiAgICAgIHsgcmV0dXJuIHRydWUgfVxuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuYnJhY2VMKVxuICAgICAgeyByZXR1cm4gcGFyZW50ID09PSB0eXBlcyQxLmJfc3RhdCB9XG4gICAgaWYgKHByZXZUeXBlID09PSB0eXBlcy5fdmFyIHx8IHByZXZUeXBlID09PSB0eXBlcy5fY29uc3QgfHwgcHJldlR5cGUgPT09IHR5cGVzLm5hbWUpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuICF0aGlzLmV4cHJBbGxvd2VkXG4gIH07XG5cbiAgcHAkNy5pbkdlbmVyYXRvckNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dFtpXTtcbiAgICAgIGlmIChjb250ZXh0LnRva2VuID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHsgcmV0dXJuIGNvbnRleHQuZ2VuZXJhdG9yIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgcHAkNy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB2YXIgdXBkYXRlLCB0eXBlID0gdGhpcy50eXBlO1xuICAgIGlmICh0eXBlLmtleXdvcmQgJiYgcHJldlR5cGUgPT09IHR5cGVzLmRvdClcbiAgICAgIHsgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlOyB9XG4gICAgZWxzZSBpZiAodXBkYXRlID0gdHlwZS51cGRhdGVDb250ZXh0KVxuICAgICAgeyB1cGRhdGUuY2FsbCh0aGlzLCBwcmV2VHlwZSk7IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuZXhwckFsbG93ZWQgPSB0eXBlLmJlZm9yZUV4cHI7IH1cbiAgfTtcblxuICAvLyBUb2tlbi1zcGVjaWZpYyBjb250ZXh0IHVwZGF0ZSBjb2RlXG5cbiAgdHlwZXMucGFyZW5SLnVwZGF0ZUNvbnRleHQgPSB0eXBlcy5icmFjZVIudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbnRleHQubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgb3V0ID0gdGhpcy5jb250ZXh0LnBvcCgpO1xuICAgIGlmIChvdXQgPT09IHR5cGVzJDEuYl9zdGF0ICYmIHRoaXMuY3VyQ29udGV4dCgpLnRva2VuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIG91dCA9IHRoaXMuY29udGV4dC5wb3AoKTtcbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9ICFvdXQuaXNFeHByO1xuICB9O1xuXG4gIHR5cGVzLmJyYWNlTC51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB0aGlzLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayhwcmV2VHlwZSkgPyB0eXBlcyQxLmJfc3RhdCA6IHR5cGVzJDEuYl9leHByKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgfTtcblxuICB0eXBlcy5kb2xsYXJCcmFjZUwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEuYl90bXBsKTtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgfTtcblxuICB0eXBlcy5wYXJlbkwudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKHByZXZUeXBlKSB7XG4gICAgdmFyIHN0YXRlbWVudFBhcmVucyA9IHByZXZUeXBlID09PSB0eXBlcy5faWYgfHwgcHJldlR5cGUgPT09IHR5cGVzLl9mb3IgfHwgcHJldlR5cGUgPT09IHR5cGVzLl93aXRoIHx8IHByZXZUeXBlID09PSB0eXBlcy5fd2hpbGU7XG4gICAgdGhpcy5jb250ZXh0LnB1c2goc3RhdGVtZW50UGFyZW5zID8gdHlwZXMkMS5wX3N0YXQgOiB0eXBlcyQxLnBfZXhwcik7XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG4gIH07XG5cbiAgdHlwZXMuaW5jRGVjLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyB0b2tFeHByQWxsb3dlZCBzdGF5cyB1bmNoYW5nZWRcbiAgfTtcblxuICB0eXBlcy5fZnVuY3Rpb24udXBkYXRlQ29udGV4dCA9IHR5cGVzLl9jbGFzcy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICBpZiAocHJldlR5cGUuYmVmb3JlRXhwciAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuc2VtaSAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuX2Vsc2UgJiZcbiAgICAgICAgIShwcmV2VHlwZSA9PT0gdHlwZXMuX3JldHVybiAmJiBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpKSAmJlxuICAgICAgICAhKChwcmV2VHlwZSA9PT0gdHlwZXMuY29sb24gfHwgcHJldlR5cGUgPT09IHR5cGVzLmJyYWNlTCkgJiYgdGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDEuYl9zdGF0KSlcbiAgICAgIHsgdGhpcy5jb250ZXh0LnB1c2godHlwZXMkMS5mX2V4cHIpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQxLmZfc3RhdCk7IH1cbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7XG4gIH07XG5cbiAgdHlwZXMuYmFja1F1b3RlLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDEucV90bXBsKVxuICAgICAgeyB0aGlzLmNvbnRleHQucG9wKCk7IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDEucV90bXBsKTsgfVxuICAgIHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTtcbiAgfTtcblxuICB0eXBlcy5zdGFyLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICAgIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMuX2Z1bmN0aW9uKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTtcbiAgICAgIGlmICh0aGlzLmNvbnRleHRbaW5kZXhdID09PSB0eXBlcyQxLmZfZXhwcilcbiAgICAgICAgeyB0aGlzLmNvbnRleHRbaW5kZXhdID0gdHlwZXMkMS5mX2V4cHJfZ2VuOyB9XG4gICAgICBlbHNlXG4gICAgICAgIHsgdGhpcy5jb250ZXh0W2luZGV4XSA9IHR5cGVzJDEuZl9nZW47IH1cbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG4gIH07XG5cbiAgdHlwZXMubmFtZS51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgICB2YXIgYWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBwcmV2VHlwZSAhPT0gdHlwZXMuZG90KSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJvZlwiICYmICF0aGlzLmV4cHJBbGxvd2VkIHx8XG4gICAgICAgICAgdGhpcy52YWx1ZSA9PT0gXCJ5aWVsZFwiICYmIHRoaXMuaW5HZW5lcmF0b3JDb250ZXh0KCkpXG4gICAgICAgIHsgYWxsb3dlZCA9IHRydWU7IH1cbiAgICB9XG4gICAgdGhpcy5leHByQWxsb3dlZCA9IGFsbG93ZWQ7XG4gIH07XG5cbiAgLy8gVGhpcyBmaWxlIGNvbnRhaW5zIFVuaWNvZGUgcHJvcGVydGllcyBleHRyYWN0ZWQgZnJvbSB0aGUgRUNNQVNjcmlwdFxuICAvLyBzcGVjaWZpY2F0aW9uLiBUaGUgbGlzdHMgYXJlIGV4dHJhY3RlZCBsaWtlIHNvOlxuICAvLyAkJCgnI3RhYmxlLWJpbmFyeS11bmljb2RlLXByb3BlcnRpZXMgPiBmaWd1cmUgPiB0YWJsZSA+IHRib2R5ID4gdHIgPiB0ZDpudGgtY2hpbGQoMSkgY29kZScpLm1hcChlbCA9PiBlbC5pbm5lclRleHQpXG5cbiAgLy8gI3RhYmxlLWJpbmFyeS11bmljb2RlLXByb3BlcnRpZXNcbiAgdmFyIGVjbWE5QmluYXJ5UHJvcGVydGllcyA9IFwiQVNDSUkgQVNDSUlfSGV4X0RpZ2l0IEFIZXggQWxwaGFiZXRpYyBBbHBoYSBBbnkgQXNzaWduZWQgQmlkaV9Db250cm9sIEJpZGlfQyBCaWRpX01pcnJvcmVkIEJpZGlfTSBDYXNlX0lnbm9yYWJsZSBDSSBDYXNlZCBDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCBDV0NGIENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIENXQ00gQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQgQ1dMIENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQgQ1dLQ0YgQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQgQ1dUIENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkIENXVSBEYXNoIERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQgREkgRGVwcmVjYXRlZCBEZXAgRGlhY3JpdGljIERpYSBFbW9qaSBFbW9qaV9Db21wb25lbnQgRW1vamlfTW9kaWZpZXIgRW1vamlfTW9kaWZpZXJfQmFzZSBFbW9qaV9QcmVzZW50YXRpb24gRXh0ZW5kZXIgRXh0IEdyYXBoZW1lX0Jhc2UgR3JfQmFzZSBHcmFwaGVtZV9FeHRlbmQgR3JfRXh0IEhleF9EaWdpdCBIZXggSURTX0JpbmFyeV9PcGVyYXRvciBJRFNCIElEU19UcmluYXJ5X09wZXJhdG9yIElEU1QgSURfQ29udGludWUgSURDIElEX1N0YXJ0IElEUyBJZGVvZ3JhcGhpYyBJZGVvIEpvaW5fQ29udHJvbCBKb2luX0MgTG9naWNhbF9PcmRlcl9FeGNlcHRpb24gTE9FIExvd2VyY2FzZSBMb3dlciBNYXRoIE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IE5DaGFyIFBhdHRlcm5fU3ludGF4IFBhdF9TeW4gUGF0dGVybl9XaGl0ZV9TcGFjZSBQYXRfV1MgUXVvdGF0aW9uX01hcmsgUU1hcmsgUmFkaWNhbCBSZWdpb25hbF9JbmRpY2F0b3IgUkkgU2VudGVuY2VfVGVybWluYWwgU1Rlcm0gU29mdF9Eb3R0ZWQgU0QgVGVybWluYWxfUHVuY3R1YXRpb24gVGVybSBVbmlmaWVkX0lkZW9ncmFwaCBVSWRlbyBVcHBlcmNhc2UgVXBwZXIgVmFyaWF0aW9uX1NlbGVjdG9yIFZTIFdoaXRlX1NwYWNlIHNwYWNlIFhJRF9Db250aW51ZSBYSURDIFhJRF9TdGFydCBYSURTXCI7XG4gIHZhciBlY21hMTBCaW5hcnlQcm9wZXJ0aWVzID0gZWNtYTlCaW5hcnlQcm9wZXJ0aWVzICsgXCIgRXh0ZW5kZWRfUGljdG9ncmFwaGljXCI7XG4gIHZhciBlY21hMTFCaW5hcnlQcm9wZXJ0aWVzID0gZWNtYTEwQmluYXJ5UHJvcGVydGllcztcbiAgdmFyIHVuaWNvZGVCaW5hcnlQcm9wZXJ0aWVzID0ge1xuICAgIDk6IGVjbWE5QmluYXJ5UHJvcGVydGllcyxcbiAgICAxMDogZWNtYTEwQmluYXJ5UHJvcGVydGllcyxcbiAgICAxMTogZWNtYTExQmluYXJ5UHJvcGVydGllc1xuICB9O1xuXG4gIC8vICN0YWJsZS11bmljb2RlLWdlbmVyYWwtY2F0ZWdvcnktdmFsdWVzXG4gIHZhciB1bmljb2RlR2VuZXJhbENhdGVnb3J5VmFsdWVzID0gXCJDYXNlZF9MZXR0ZXIgTEMgQ2xvc2VfUHVuY3R1YXRpb24gUGUgQ29ubmVjdG9yX1B1bmN0dWF0aW9uIFBjIENvbnRyb2wgQ2MgY250cmwgQ3VycmVuY3lfU3ltYm9sIFNjIERhc2hfUHVuY3R1YXRpb24gUGQgRGVjaW1hbF9OdW1iZXIgTmQgZGlnaXQgRW5jbG9zaW5nX01hcmsgTWUgRmluYWxfUHVuY3R1YXRpb24gUGYgRm9ybWF0IENmIEluaXRpYWxfUHVuY3R1YXRpb24gUGkgTGV0dGVyIEwgTGV0dGVyX051bWJlciBObCBMaW5lX1NlcGFyYXRvciBabCBMb3dlcmNhc2VfTGV0dGVyIExsIE1hcmsgTSBDb21iaW5pbmdfTWFyayBNYXRoX1N5bWJvbCBTbSBNb2RpZmllcl9MZXR0ZXIgTG0gTW9kaWZpZXJfU3ltYm9sIFNrIE5vbnNwYWNpbmdfTWFyayBNbiBOdW1iZXIgTiBPcGVuX1B1bmN0dWF0aW9uIFBzIE90aGVyIEMgT3RoZXJfTGV0dGVyIExvIE90aGVyX051bWJlciBObyBPdGhlcl9QdW5jdHVhdGlvbiBQbyBPdGhlcl9TeW1ib2wgU28gUGFyYWdyYXBoX1NlcGFyYXRvciBacCBQcml2YXRlX1VzZSBDbyBQdW5jdHVhdGlvbiBQIHB1bmN0IFNlcGFyYXRvciBaIFNwYWNlX1NlcGFyYXRvciBacyBTcGFjaW5nX01hcmsgTWMgU3Vycm9nYXRlIENzIFN5bWJvbCBTIFRpdGxlY2FzZV9MZXR0ZXIgTHQgVW5hc3NpZ25lZCBDbiBVcHBlcmNhc2VfTGV0dGVyIEx1XCI7XG5cbiAgLy8gI3RhYmxlLXVuaWNvZGUtc2NyaXB0LXZhbHVlc1xuICB2YXIgZWNtYTlTY3JpcHRWYWx1ZXMgPSBcIkFkbGFtIEFkbG0gQWhvbSBBaG9tIEFuYXRvbGlhbl9IaWVyb2dseXBocyBIbHV3IEFyYWJpYyBBcmFiIEFybWVuaWFuIEFybW4gQXZlc3RhbiBBdnN0IEJhbGluZXNlIEJhbGkgQmFtdW0gQmFtdSBCYXNzYV9WYWggQmFzcyBCYXRhayBCYXRrIEJlbmdhbGkgQmVuZyBCaGFpa3N1a2kgQmhrcyBCb3BvbW9mbyBCb3BvIEJyYWhtaSBCcmFoIEJyYWlsbGUgQnJhaSBCdWdpbmVzZSBCdWdpIEJ1aGlkIEJ1aGQgQ2FuYWRpYW5fQWJvcmlnaW5hbCBDYW5zIENhcmlhbiBDYXJpIENhdWNhc2lhbl9BbGJhbmlhbiBBZ2hiIENoYWttYSBDYWttIENoYW0gQ2hhbSBDaGVyb2tlZSBDaGVyIENvbW1vbiBaeXl5IENvcHRpYyBDb3B0IFFhYWMgQ3VuZWlmb3JtIFhzdXggQ3lwcmlvdCBDcHJ0IEN5cmlsbGljIEN5cmwgRGVzZXJldCBEc3J0IERldmFuYWdhcmkgRGV2YSBEdXBsb3lhbiBEdXBsIEVneXB0aWFuX0hpZXJvZ2x5cGhzIEVneXAgRWxiYXNhbiBFbGJhIEV0aGlvcGljIEV0aGkgR2VvcmdpYW4gR2VvciBHbGFnb2xpdGljIEdsYWcgR290aGljIEdvdGggR3JhbnRoYSBHcmFuIEdyZWVrIEdyZWsgR3VqYXJhdGkgR3VqciBHdXJtdWtoaSBHdXJ1IEhhbiBIYW5pIEhhbmd1bCBIYW5nIEhhbnVub28gSGFubyBIYXRyYW4gSGF0ciBIZWJyZXcgSGViciBIaXJhZ2FuYSBIaXJhIEltcGVyaWFsX0FyYW1haWMgQXJtaSBJbmhlcml0ZWQgWmluaCBRYWFpIEluc2NyaXB0aW9uYWxfUGFobGF2aSBQaGxpIEluc2NyaXB0aW9uYWxfUGFydGhpYW4gUHJ0aSBKYXZhbmVzZSBKYXZhIEthaXRoaSBLdGhpIEthbm5hZGEgS25kYSBLYXRha2FuYSBLYW5hIEtheWFoX0xpIEthbGkgS2hhcm9zaHRoaSBLaGFyIEtobWVyIEtobXIgS2hvamtpIEtob2ogS2h1ZGF3YWRpIFNpbmQgTGFvIExhb28gTGF0aW4gTGF0biBMZXBjaGEgTGVwYyBMaW1idSBMaW1iIExpbmVhcl9BIExpbmEgTGluZWFyX0IgTGluYiBMaXN1IExpc3UgTHljaWFuIEx5Y2kgTHlkaWFuIEx5ZGkgTWFoYWphbmkgTWFoaiBNYWxheWFsYW0gTWx5bSBNYW5kYWljIE1hbmQgTWFuaWNoYWVhbiBNYW5pIE1hcmNoZW4gTWFyYyBNYXNhcmFtX0dvbmRpIEdvbm0gTWVldGVpX01heWVrIE10ZWkgTWVuZGVfS2lrYWt1aSBNZW5kIE1lcm9pdGljX0N1cnNpdmUgTWVyYyBNZXJvaXRpY19IaWVyb2dseXBocyBNZXJvIE1pYW8gUGxyZCBNb2RpIE1vZGkgTW9uZ29saWFuIE1vbmcgTXJvIE1yb28gTXVsdGFuaSBNdWx0IE15YW5tYXIgTXltciBOYWJhdGFlYW4gTmJhdCBOZXdfVGFpX0x1ZSBUYWx1IE5ld2EgTmV3YSBOa28gTmtvbyBOdXNodSBOc2h1IE9naGFtIE9nYW0gT2xfQ2hpa2kgT2xjayBPbGRfSHVuZ2FyaWFuIEh1bmcgT2xkX0l0YWxpYyBJdGFsIE9sZF9Ob3J0aF9BcmFiaWFuIE5hcmIgT2xkX1Blcm1pYyBQZXJtIE9sZF9QZXJzaWFuIFhwZW8gT2xkX1NvdXRoX0FyYWJpYW4gU2FyYiBPbGRfVHVya2ljIE9ya2ggT3JpeWEgT3J5YSBPc2FnZSBPc2dlIE9zbWFueWEgT3NtYSBQYWhhd2hfSG1vbmcgSG1uZyBQYWxteXJlbmUgUGFsbSBQYXVfQ2luX0hhdSBQYXVjIFBoYWdzX1BhIFBoYWcgUGhvZW5pY2lhbiBQaG54IFBzYWx0ZXJfUGFobGF2aSBQaGxwIFJlamFuZyBSam5nIFJ1bmljIFJ1bnIgU2FtYXJpdGFuIFNhbXIgU2F1cmFzaHRyYSBTYXVyIFNoYXJhZGEgU2hyZCBTaGF2aWFuIFNoYXcgU2lkZGhhbSBTaWRkIFNpZ25Xcml0aW5nIFNnbncgU2luaGFsYSBTaW5oIFNvcmFfU29tcGVuZyBTb3JhIFNveW9tYm8gU295byBTdW5kYW5lc2UgU3VuZCBTeWxvdGlfTmFncmkgU3lsbyBTeXJpYWMgU3lyYyBUYWdhbG9nIFRnbGcgVGFnYmFud2EgVGFnYiBUYWlfTGUgVGFsZSBUYWlfVGhhbSBMYW5hIFRhaV9WaWV0IFRhdnQgVGFrcmkgVGFrciBUYW1pbCBUYW1sIFRhbmd1dCBUYW5nIFRlbHVndSBUZWx1IFRoYWFuYSBUaGFhIFRoYWkgVGhhaSBUaWJldGFuIFRpYnQgVGlmaW5hZ2ggVGZuZyBUaXJodXRhIFRpcmggVWdhcml0aWMgVWdhciBWYWkgVmFpaSBXYXJhbmdfQ2l0aSBXYXJhIFlpIFlpaWkgWmFuYWJhemFyX1NxdWFyZSBaYW5iXCI7XG4gIHZhciBlY21hMTBTY3JpcHRWYWx1ZXMgPSBlY21hOVNjcmlwdFZhbHVlcyArIFwiIERvZ3JhIERvZ3IgR3VuamFsYV9Hb25kaSBHb25nIEhhbmlmaV9Sb2hpbmd5YSBSb2hnIE1ha2FzYXIgTWFrYSBNZWRlZmFpZHJpbiBNZWRmIE9sZF9Tb2dkaWFuIFNvZ28gU29nZGlhbiBTb2dkXCI7XG4gIHZhciBlY21hMTFTY3JpcHRWYWx1ZXMgPSBlY21hMTBTY3JpcHRWYWx1ZXMgKyBcIiBFbHltYWljIEVseW0gTmFuZGluYWdhcmkgTmFuZCBOeWlha2VuZ19QdWFjaHVlX0htb25nIEhtbnAgV2FuY2hvIFdjaG9cIjtcbiAgdmFyIHVuaWNvZGVTY3JpcHRWYWx1ZXMgPSB7XG4gICAgOTogZWNtYTlTY3JpcHRWYWx1ZXMsXG4gICAgMTA6IGVjbWExMFNjcmlwdFZhbHVlcyxcbiAgICAxMTogZWNtYTExU2NyaXB0VmFsdWVzXG4gIH07XG5cbiAgdmFyIGRhdGEgPSB7fTtcbiAgZnVuY3Rpb24gYnVpbGRVbmljb2RlRGF0YShlY21hVmVyc2lvbikge1xuICAgIHZhciBkID0gZGF0YVtlY21hVmVyc2lvbl0gPSB7XG4gICAgICBiaW5hcnk6IHdvcmRzUmVnZXhwKHVuaWNvZGVCaW5hcnlQcm9wZXJ0aWVzW2VjbWFWZXJzaW9uXSArIFwiIFwiICsgdW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyksXG4gICAgICBub25CaW5hcnk6IHtcbiAgICAgICAgR2VuZXJhbF9DYXRlZ29yeTogd29yZHNSZWdleHAodW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyksXG4gICAgICAgIFNjcmlwdDogd29yZHNSZWdleHAodW5pY29kZVNjcmlwdFZhbHVlc1tlY21hVmVyc2lvbl0pXG4gICAgICB9XG4gICAgfTtcbiAgICBkLm5vbkJpbmFyeS5TY3JpcHRfRXh0ZW5zaW9ucyA9IGQubm9uQmluYXJ5LlNjcmlwdDtcblxuICAgIGQubm9uQmluYXJ5LmdjID0gZC5ub25CaW5hcnkuR2VuZXJhbF9DYXRlZ29yeTtcbiAgICBkLm5vbkJpbmFyeS5zYyA9IGQubm9uQmluYXJ5LlNjcmlwdDtcbiAgICBkLm5vbkJpbmFyeS5zY3ggPSBkLm5vbkJpbmFyeS5TY3JpcHRfRXh0ZW5zaW9ucztcbiAgfVxuICBidWlsZFVuaWNvZGVEYXRhKDkpO1xuICBidWlsZFVuaWNvZGVEYXRhKDEwKTtcbiAgYnVpbGRVbmljb2RlRGF0YSgxMSk7XG5cbiAgdmFyIHBwJDggPSBQYXJzZXIucHJvdG90eXBlO1xuXG4gIHZhciBSZWdFeHBWYWxpZGF0aW9uU3RhdGUgPSBmdW5jdGlvbiBSZWdFeHBWYWxpZGF0aW9uU3RhdGUocGFyc2VyKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy52YWxpZEZsYWdzID0gXCJnaW1cIiArIChwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ID8gXCJ1eVwiIDogXCJcIikgKyAocGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSA/IFwic1wiIDogXCJcIik7XG4gICAgdGhpcy51bmljb2RlUHJvcGVydGllcyA9IGRhdGFbcGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgPyAxMSA6IHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uXTtcbiAgICB0aGlzLnNvdXJjZSA9IFwiXCI7XG4gICAgdGhpcy5mbGFncyA9IFwiXCI7XG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5zd2l0Y2hVID0gZmFsc2U7XG4gICAgdGhpcy5zd2l0Y2hOID0gZmFsc2U7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMubGFzdEludFZhbHVlID0gMDtcbiAgICB0aGlzLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gICAgdGhpcy5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgICB0aGlzLm51bUNhcHR1cmluZ1BhcmVucyA9IDA7XG4gICAgdGhpcy5tYXhCYWNrUmVmZXJlbmNlID0gMDtcbiAgICB0aGlzLmdyb3VwTmFtZXMgPSBbXTtcbiAgICB0aGlzLmJhY2tSZWZlcmVuY2VOYW1lcyA9IFtdO1xuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoc3RhcnQsIHBhdHRlcm4sIGZsYWdzKSB7XG4gICAgdmFyIHVuaWNvZGUgPSBmbGFncy5pbmRleE9mKFwidVwiKSAhPT0gLTE7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0IHwgMDtcbiAgICB0aGlzLnNvdXJjZSA9IHBhdHRlcm4gKyBcIlwiO1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLnN3aXRjaFUgPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgICB0aGlzLnN3aXRjaE4gPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOTtcbiAgfTtcblxuICBSZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLnJhaXNlID0gZnVuY3Rpb24gcmFpc2UgKG1lc3NhZ2UpIHtcbiAgICB0aGlzLnBhcnNlci5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIChcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAvXCIgKyAodGhpcy5zb3VyY2UpICsgXCIvOiBcIiArIG1lc3NhZ2UpKTtcbiAgfTtcblxuICAvLyBJZiB1IGZsYWcgaXMgZ2l2ZW4sIHRoaXMgcmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgaW5kZXggKGl0IGNvbWJpbmVzIGEgc3Vycm9nYXRlIHBhaXIpLlxuICAvLyBPdGhlcndpc2UsIHRoaXMgcmV0dXJucyB0aGUgY29kZSB1bml0IG9mIHRoZSBpbmRleCAoY2FuIGJlIGEgcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyKS5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIGF0IChpLCBmb3JjZVUpIHtcbiAgICAgIGlmICggZm9yY2VVID09PSB2b2lkIDAgKSBmb3JjZVUgPSBmYWxzZTtcblxuICAgIHZhciBzID0gdGhpcy5zb3VyY2U7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICBpZiAoaSA+PSBsKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKCEoZm9yY2VVIHx8IHRoaXMuc3dpdGNoVSkgfHwgYyA8PSAweEQ3RkYgfHwgYyA+PSAweEUwMDAgfHwgaSArIDEgPj0gbCkge1xuICAgICAgcmV0dXJuIGNcbiAgICB9XG4gICAgdmFyIG5leHQgPSBzLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIHJldHVybiBuZXh0ID49IDB4REMwMCAmJiBuZXh0IDw9IDB4REZGRiA/IChjIDw8IDEwKSArIG5leHQgLSAweDM1RkRDMDAgOiBjXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5uZXh0SW5kZXggPSBmdW5jdGlvbiBuZXh0SW5kZXggKGksIGZvcmNlVSkge1xuICAgICAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gICAgdmFyIHMgPSB0aGlzLnNvdXJjZTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIGlmIChpID49IGwpIHtcbiAgICAgIHJldHVybiBsXG4gICAgfVxuICAgIHZhciBjID0gcy5jaGFyQ29kZUF0KGkpLCBuZXh0O1xuICAgIGlmICghKGZvcmNlVSB8fCB0aGlzLnN3aXRjaFUpIHx8IGMgPD0gMHhEN0ZGIHx8IGMgPj0gMHhFMDAwIHx8IGkgKyAxID49IGwgfHxcbiAgICAgICAgKG5leHQgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4REMwMCB8fCBuZXh0ID4gMHhERkZGKSB7XG4gICAgICByZXR1cm4gaSArIDFcbiAgICB9XG4gICAgcmV0dXJuIGkgKyAyXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCAoZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5hdCh0aGlzLnBvcywgZm9yY2VVKVxuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUubG9va2FoZWFkID0gZnVuY3Rpb24gbG9va2FoZWFkIChmb3JjZVUpIHtcbiAgICAgIGlmICggZm9yY2VVID09PSB2b2lkIDAgKSBmb3JjZVUgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmF0KHRoaXMubmV4dEluZGV4KHRoaXMucG9zLCBmb3JjZVUpLCBmb3JjZVUpXG4gIH07XG5cbiAgUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24gYWR2YW5jZSAoZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICB0aGlzLnBvcyA9IHRoaXMubmV4dEluZGV4KHRoaXMucG9zLCBmb3JjZVUpO1xuICB9O1xuXG4gIFJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUuZWF0ID0gZnVuY3Rpb24gZWF0IChjaCwgZm9yY2VVKSB7XG4gICAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50KGZvcmNlVSkgPT09IGNoKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoZm9yY2VVKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvZGVQb2ludFRvU3RyaW5nKGNoKSB7XG4gICAgaWYgKGNoIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCkgfVxuICAgIGNoIC09IDB4MTAwMDA7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNoID4+IDEwKSArIDB4RDgwMCwgKGNoICYgMHgwM0ZGKSArIDB4REMwMClcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZmxhZ3MgcGFydCBvZiBhIGdpdmVuIFJlZ0V4cExpdGVyYWwuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVnRXhwVmFsaWRhdGlvblN0YXRlfSBzdGF0ZSBUaGUgc3RhdGUgdG8gdmFsaWRhdGUgUmVnRXhwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHBwJDgudmFsaWRhdGVSZWdFeHBGbGFncyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHZhbGlkRmxhZ3MgPSBzdGF0ZS52YWxpZEZsYWdzO1xuICAgIHZhciBmbGFncyA9IHN0YXRlLmZsYWdzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZsYWcgPSBmbGFncy5jaGFyQXQoaSk7XG4gICAgICBpZiAodmFsaWRGbGFncy5pbmRleE9mKGZsYWcpID09PSAtMSkge1xuICAgICAgICB0aGlzLnJhaXNlKHN0YXRlLnN0YXJ0LCBcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZsYWdcIik7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZ3MuaW5kZXhPZihmbGFnLCBpICsgMSkgPiAtMSkge1xuICAgICAgICB0aGlzLnJhaXNlKHN0YXRlLnN0YXJ0LCBcIkR1cGxpY2F0ZSByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ1wiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBwYXR0ZXJuIHBhcnQgb2YgYSBnaXZlbiBSZWdFeHBMaXRlcmFsLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlZ0V4cFZhbGlkYXRpb25TdGF0ZX0gc3RhdGUgVGhlIHN0YXRlIHRvIHZhbGlkYXRlIFJlZ0V4cC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcCQ4LnZhbGlkYXRlUmVnRXhwUGF0dGVybiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdGhpcy5yZWdleHBfcGF0dGVybihzdGF0ZSk7XG5cbiAgICAvLyBUaGUgZ29hbCBzeW1ib2wgZm9yIHRoZSBwYXJzZSBpcyB8UGF0dGVyblt+VSwgfk5dfC4gSWYgdGhlIHJlc3VsdCBvZlxuICAgIC8vIHBhcnNpbmcgY29udGFpbnMgYSB8R3JvdXBOYW1lfCwgcmVwYXJzZSB3aXRoIHRoZSBnb2FsIHN5bWJvbFxuICAgIC8vIHxQYXR0ZXJuW35VLCArTl18IGFuZCB1c2UgdGhpcyByZXN1bHQgaW5zdGVhZC4gVGhyb3cgYSAqU3ludGF4RXJyb3IqXG4gICAgLy8gZXhjZXB0aW9uIGlmIF9QXyBkaWQgbm90IGNvbmZvcm0gdG8gdGhlIGdyYW1tYXIsIGlmIGFueSBlbGVtZW50cyBvZiBfUF9cbiAgICAvLyB3ZXJlIG5vdCBtYXRjaGVkIGJ5IHRoZSBwYXJzZSwgb3IgaWYgYW55IEVhcmx5IEVycm9yIGNvbmRpdGlvbnMgZXhpc3QuXG4gICAgaWYgKCFzdGF0ZS5zd2l0Y2hOICYmIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHN0YXRlLmdyb3VwTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGUuc3dpdGNoTiA9IHRydWU7XG4gICAgICB0aGlzLnJlZ2V4cF9wYXR0ZXJuKHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUGF0dGVyblxuICBwcCQ4LnJlZ2V4cF9wYXR0ZXJuID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBzdGF0ZS5wb3MgPSAwO1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSBmYWxzZTtcbiAgICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgPSAwO1xuICAgIHN0YXRlLm1heEJhY2tSZWZlcmVuY2UgPSAwO1xuICAgIHN0YXRlLmdyb3VwTmFtZXMubGVuZ3RoID0gMDtcbiAgICBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXMubGVuZ3RoID0gMDtcblxuICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcblxuICAgIGlmIChzdGF0ZS5wb3MgIT09IHN0YXRlLnNvdXJjZS5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2UgdGhlIHNhbWUgbWVzc2FnZXMgYXMgVjguXG4gICAgICBpZiAoc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJVbm1hdGNoZWQgJyknXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmVhdCgweDVEIC8qIF0gKi8pIHx8IHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUubWF4QmFja1JlZmVyZW5jZSA+IHN0YXRlLm51bUNhcHR1cmluZ1BhcmVucykge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbmFtZSA9IGxpc3RbaV07XG5cbiAgICAgIGlmIChzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCBjYXB0dXJlIHJlZmVyZW5jZWRcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLURpc2p1bmN0aW9uXG4gIHBwJDgucmVnZXhwX2Rpc2p1bmN0aW9uID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7XG4gICAgd2hpbGUgKHN0YXRlLmVhdCgweDdDIC8qIHwgKi8pKSB7XG4gICAgICB0aGlzLnJlZ2V4cF9hbHRlcm5hdGl2ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlLCB0cnVlKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJOb3RoaW5nIHRvIHJlcGVhdFwiKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIkxvbmUgcXVhbnRpZmllciBicmFja2V0c1wiKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQWx0ZXJuYXRpdmVcbiAgcHAkOC5yZWdleHBfYWx0ZXJuYXRpdmUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHdoaWxlIChzdGF0ZS5wb3MgPCBzdGF0ZS5zb3VyY2UubGVuZ3RoICYmIHRoaXMucmVnZXhwX2VhdFRlcm0oc3RhdGUpKVxuICAgICAgeyB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLVRlcm1cbiAgcHAkOC5yZWdleHBfZWF0VGVybSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdEFzc2VydGlvbihzdGF0ZSkpIHtcbiAgICAgIC8vIEhhbmRsZSBgUXVhbnRpZmlhYmxlQXNzZXJ0aW9uIFF1YW50aWZpZXJgIGFsdGVybmF0aXZlLlxuICAgICAgLy8gYHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZWAgaXMgdHJ1ZSBpZiB0aGUgbGFzdCBlYXRlbiBBc3NlcnRpb25cbiAgICAgIC8vIGlzIGEgUXVhbnRpZmlhYmxlQXNzZXJ0aW9uLlxuICAgICAgaWYgKHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSAmJiB0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlKSkge1xuICAgICAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2UgYXMgVjguXG4gICAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHF1YW50aWZpZXJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnN3aXRjaFUgPyB0aGlzLnJlZ2V4cF9lYXRBdG9tKHN0YXRlKSA6IHRoaXMucmVnZXhwX2VhdEV4dGVuZGVkQXRvbShzdGF0ZSkpIHtcbiAgICAgIHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXIoc3RhdGUpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQXNzZXJ0aW9uXG4gIHBwJDgucmVnZXhwX2VhdEFzc2VydGlvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICAgIHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSA9IGZhbHNlO1xuXG4gICAgLy8gXiwgJFxuICAgIGlmIChzdGF0ZS5lYXQoMHg1RSAvKiBeICovKSB8fCBzdGF0ZS5lYXQoMHgyNCAvKiAkICovKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBcXGIgXFxCXG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHN0YXRlLmVhdCgweDQyIC8qIEIgKi8pIHx8IHN0YXRlLmVhdCgweDYyIC8qIGIgKi8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICAvLyBMb29rYWhlYWQgLyBMb29rYmVoaW5kXG4gICAgaWYgKHN0YXRlLmVhdCgweDI4IC8qICggKi8pICYmIHN0YXRlLmVhdCgweDNGIC8qID8gKi8pKSB7XG4gICAgICB2YXIgbG9va2JlaGluZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5KSB7XG4gICAgICAgIGxvb2tiZWhpbmQgPSBzdGF0ZS5lYXQoMHgzQyAvKiA8ICovKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgzRCAvKiA9ICovKSB8fCBzdGF0ZS5lYXQoMHgyMSAvKiAhICovKSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG4gICAgICAgIGlmICghc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBncm91cFwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgPSAhbG9va2JlaGluZDtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1RdWFudGlmaWVyXG4gIHBwJDgucmVnZXhwX2VhdFF1YW50aWZpZXIgPSBmdW5jdGlvbihzdGF0ZSwgbm9FcnJvcikge1xuICAgIGlmICggbm9FcnJvciA9PT0gdm9pZCAwICkgbm9FcnJvciA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXJQcmVmaXgoc3RhdGUsIG5vRXJyb3IpKSB7XG4gICAgICBzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVF1YW50aWZpZXJQcmVmaXhcbiAgcHAkOC5yZWdleHBfZWF0UXVhbnRpZmllclByZWZpeCA9IGZ1bmN0aW9uKHN0YXRlLCBub0Vycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0YXRlLmVhdCgweDJBIC8qICogKi8pIHx8XG4gICAgICBzdGF0ZS5lYXQoMHgyQiAvKiArICovKSB8fFxuICAgICAgc3RhdGUuZWF0KDB4M0YgLyogPyAqLykgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEJyYWNlZFF1YW50aWZpZXIoc3RhdGUsIG5vRXJyb3IpXG4gICAgKVxuICB9O1xuICBwcCQ4LnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyID0gZnVuY3Rpb24oc3RhdGUsIG5vRXJyb3IpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgaWYgKHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pKSB7XG4gICAgICB2YXIgbWluID0gMCwgbWF4ID0gLTE7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpIHtcbiAgICAgICAgbWluID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICBpZiAoc3RhdGUuZWF0KDB4MkMgLyogLCAqLykgJiYgdGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpIHtcbiAgICAgICAgICBtYXggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pKSB7XG4gICAgICAgICAgLy8gU3ludGF4RXJyb3IgaW4gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3NlYy10ZXJtXG4gICAgICAgICAgaWYgKG1heCAhPT0gLTEgJiYgbWF4IDwgbWluICYmICFub0Vycm9yKSB7XG4gICAgICAgICAgICBzdGF0ZS5yYWlzZShcIm51bWJlcnMgb3V0IG9mIG9yZGVyIGluIHt9IHF1YW50aWZpZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmICFub0Vycm9yKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW5jb21wbGV0ZSBxdWFudGlmaWVyXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUF0b21cbiAgcHAkOC5yZWdleHBfZWF0QXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzKHN0YXRlKSB8fFxuICAgICAgc3RhdGUuZWF0KDB4MkUgLyogLiAqLykgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdFJldmVyc2VTb2xpZHVzQXRvbUVzY2FwZShzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0VW5jYXB0dXJpbmdHcm91cChzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwKHN0YXRlKVxuICAgIClcbiAgfTtcbiAgcHAkOC5yZWdleHBfZWF0UmV2ZXJzZVNvbGlkdXNBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEF0b21Fc2NhcGUoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSAmJiBzdGF0ZS5lYXQoMHgzQSAvKiA6ICovKSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUucmFpc2UoXCJVbnRlcm1pbmF0ZWQgZ3JvdXBcIik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdENhcHR1cmluZ0dyb3VwID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgICB0aGlzLnJlZ2V4cF9ncm91cFNwZWNpZmllcihzdGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmN1cnJlbnQoKSA9PT0gMHgzRiAvKiA/ICovKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBncm91cFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHN0YXRlLnJhaXNlKFwiVW50ZXJtaW5hdGVkIGdyb3VwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItRXh0ZW5kZWRBdG9tXG4gIHBwJDgucmVnZXhwX2VhdEV4dGVuZGVkQXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0YXRlLmVhdCgweDJFIC8qIC4gKi8pIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRSZXZlcnNlU29saWR1c0F0b21Fc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyhzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDYXB0dXJpbmdHcm91cChzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyKHN0YXRlKVxuICAgIClcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSW52YWxpZEJyYWNlZFF1YW50aWZpZXJcbiAgcHAkOC5yZWdleHBfZWF0SW52YWxpZEJyYWNlZFF1YW50aWZpZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyKHN0YXRlLCB0cnVlKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJOb3RoaW5nIHRvIHJlcGVhdFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtU3ludGF4Q2hhcmFjdGVyXG4gIHBwJDgucmVnZXhwX2VhdFN5bnRheENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc1N5bnRheENoYXJhY3RlcihjaCkpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzU3ludGF4Q2hhcmFjdGVyKGNoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoID09PSAweDI0IC8qICQgKi8gfHxcbiAgICAgIGNoID49IDB4MjggLyogKCAqLyAmJiBjaCA8PSAweDJCIC8qICsgKi8gfHxcbiAgICAgIGNoID09PSAweDJFIC8qIC4gKi8gfHxcbiAgICAgIGNoID09PSAweDNGIC8qID8gKi8gfHxcbiAgICAgIGNoID49IDB4NUIgLyogWyAqLyAmJiBjaCA8PSAweDVFIC8qIF4gKi8gfHxcbiAgICAgIGNoID49IDB4N0IgLyogeyAqLyAmJiBjaCA8PSAweDdEIC8qIH0gKi9cbiAgICApXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1QYXR0ZXJuQ2hhcmFjdGVyXG4gIC8vIEJ1dCBlYXQgZWFnZXIuXG4gIHBwJDgucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGNoID0gMDtcbiAgICB3aGlsZSAoKGNoID0gc3RhdGUuY3VycmVudCgpKSAhPT0gLTEgJiYgIWlzU3ludGF4Q2hhcmFjdGVyKGNoKSkge1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1FeHRlbmRlZFBhdHRlcm5DaGFyYWN0ZXJcbiAgcHAkOC5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKFxuICAgICAgY2ggIT09IC0xICYmXG4gICAgICBjaCAhPT0gMHgyNCAvKiAkICovICYmXG4gICAgICAhKGNoID49IDB4MjggLyogKCAqLyAmJiBjaCA8PSAweDJCIC8qICsgKi8pICYmXG4gICAgICBjaCAhPT0gMHgyRSAvKiAuICovICYmXG4gICAgICBjaCAhPT0gMHgzRiAvKiA/ICovICYmXG4gICAgICBjaCAhPT0gMHg1QiAvKiBbICovICYmXG4gICAgICBjaCAhPT0gMHg1RSAvKiBeICovICYmXG4gICAgICBjaCAhPT0gMHg3QyAvKiB8ICovXG4gICAgKSB7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBHcm91cFNwZWNpZmllciA6OlxuICAvLyAgIFtlbXB0eV1cbiAgLy8gICBgP2AgR3JvdXBOYW1lXG4gIHBwJDgucmVnZXhwX2dyb3VwU3BlY2lmaWVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuZWF0KDB4M0YgLyogPyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRHcm91cE5hbWUoc3RhdGUpKSB7XG4gICAgICAgIGlmIChzdGF0ZS5ncm91cE5hbWVzLmluZGV4T2Yoc3RhdGUubGFzdFN0cmluZ1ZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIkR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZ3JvdXBOYW1lcy5wdXNoKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGdyb3VwXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBHcm91cE5hbWUgOjpcbiAgLy8gICBgPGAgUmVnRXhwSWRlbnRpZmllck5hbWUgYD5gXG4gIC8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxuICBwcCQ4LnJlZ2V4cF9lYXRHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gICAgaWYgKHN0YXRlLmVhdCgweDNDIC8qIDwgKi8pKSB7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllck5hbWUoc3RhdGUpICYmIHN0YXRlLmVhdCgweDNFIC8qID4gKi8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2FwdHVyZSBncm91cCBuYW1lXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBSZWdFeHBJZGVudGlmaWVyTmFtZSA6OlxuICAvLyAgIFJlZ0V4cElkZW50aWZpZXJTdGFydFxuICAvLyAgIFJlZ0V4cElkZW50aWZpZXJOYW1lIFJlZ0V4cElkZW50aWZpZXJQYXJ0XG4gIC8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxuICBwcCQ4LnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclN0YXJ0KHN0YXRlKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKHN0YXRlLmxhc3RJbnRWYWx1ZSk7XG4gICAgICB3aGlsZSAodGhpcy5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclBhcnQoc3RhdGUpKSB7XG4gICAgICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSArPSBjb2RlUG9pbnRUb1N0cmluZyhzdGF0ZS5sYXN0SW50VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gUmVnRXhwSWRlbnRpZmllclN0YXJ0IDo6XG4gIC8vICAgVW5pY29kZUlEU3RhcnRcbiAgLy8gICBgJGBcbiAgLy8gICBgX2BcbiAgLy8gICBgXFxgIFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZVsrVV1cbiAgcHAkOC5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclN0YXJ0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGZvcmNlVSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMTtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KGZvcmNlVSk7XG4gICAgc3RhdGUuYWR2YW5jZShmb3JjZVUpO1xuXG4gICAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSwgZm9yY2VVKSkge1xuICAgICAgY2ggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cElkZW50aWZpZXJTdGFydChjaCkpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcbiAgZnVuY3Rpb24gaXNSZWdFeHBJZGVudGlmaWVyU3RhcnQoY2gpIHtcbiAgICByZXR1cm4gaXNJZGVudGlmaWVyU3RhcnQoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqL1xuICB9XG5cbiAgLy8gUmVnRXhwSWRlbnRpZmllclBhcnQgOjpcbiAgLy8gICBVbmljb2RlSURDb250aW51ZVxuICAvLyAgIGAkYFxuICAvLyAgIGBfYFxuICAvLyAgIGBcXGAgUmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlWytVXVxuICAvLyAgIDxaV05KPlxuICAvLyAgIDxaV0o+XG4gIHBwJDgucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJQYXJ0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGZvcmNlVSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMTtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KGZvcmNlVSk7XG4gICAgc3RhdGUuYWR2YW5jZShmb3JjZVUpO1xuXG4gICAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSwgZm9yY2VVKSkge1xuICAgICAgY2ggPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cElkZW50aWZpZXJQYXJ0KGNoKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gY2g7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBmdW5jdGlvbiBpc1JlZ0V4cElkZW50aWZpZXJQYXJ0KGNoKSB7XG4gICAgcmV0dXJuIGlzSWRlbnRpZmllckNoYXIoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqLyB8fCBjaCA9PT0gMHgyMDBDIC8qIDxaV05KPiAqLyB8fCBjaCA9PT0gMHgyMDBEIC8qIDxaV0o+ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQXRvbUVzY2FwZVxuICBwcCQ4LnJlZ2V4cF9lYXRBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2V4cF9lYXRCYWNrUmVmZXJlbmNlKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpIHx8XG4gICAgICAoc3RhdGUuc3dpdGNoTiAmJiB0aGlzLnJlZ2V4cF9lYXRLR3JvdXBOYW1lKHN0YXRlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAvLyBNYWtlIHRoZSBzYW1lIG1lc3NhZ2UgYXMgVjguXG4gICAgICBpZiAoc3RhdGUuY3VycmVudCgpID09PSAweDYzIC8qIGMgKi8pIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHVuaWNvZGUgZXNjYXBlXCIpO1xuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0RGVjaW1hbEVzY2FwZShzdGF0ZSkpIHtcbiAgICAgIHZhciBuID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgLy8gRm9yIFN5bnRheEVycm9yIGluIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNzZWMtYXRvbWVzY2FwZVxuICAgICAgICBpZiAobiA+IHN0YXRlLm1heEJhY2tSZWZlcmVuY2UpIHtcbiAgICAgICAgICBzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlID0gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG4gPD0gc3RhdGUubnVtQ2FwdHVyaW5nUGFyZW5zKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIHBwJDgucmVnZXhwX2VhdEtHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHg2QiAvKiBrICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEdyb3VwTmFtZShzdGF0ZSkpIHtcbiAgICAgICAgc3RhdGUuYmFja1JlZmVyZW5jZU5hbWVzLnB1c2goc3RhdGUubGFzdFN0cmluZ1ZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCByZWZlcmVuY2VcIik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DaGFyYWN0ZXJFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q29udHJvbEVzY2FwZShzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdENDb250cm9sTGV0dGVyKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0WmVybyhzdGF0ZSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdEhleEVzY2FwZVNlcXVlbmNlKHN0YXRlKSB8fFxuICAgICAgdGhpcy5yZWdleHBfZWF0UmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlKHN0YXRlLCBmYWxzZSkgfHxcbiAgICAgICghc3RhdGUuc3dpdGNoVSAmJiB0aGlzLnJlZ2V4cF9lYXRMZWdhY3lPY3RhbEVzY2FwZVNlcXVlbmNlKHN0YXRlKSkgfHxcbiAgICAgIHRoaXMucmVnZXhwX2VhdElkZW50aXR5RXNjYXBlKHN0YXRlKVxuICAgIClcbiAgfTtcbiAgcHAkOC5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICBpZiAoc3RhdGUuZWF0KDB4NjMgLyogYyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDb250cm9sTGV0dGVyKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBwcCQ4LnJlZ2V4cF9lYXRaZXJvID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuY3VycmVudCgpID09PSAweDMwIC8qIDAgKi8gJiYgIWlzRGVjaW1hbERpZ2l0KHN0YXRlLmxvb2thaGVhZCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q29udHJvbEVzY2FwZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChjaCA9PT0gMHg3NCAvKiB0ICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDA5OyAvKiBcXHQgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg2RSAvKiBuICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBBOyAvKiBcXG4gKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg3NiAvKiB2ICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBCOyAvKiBcXHYgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg2NiAvKiBmICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBDOyAvKiBcXGYgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChjaCA9PT0gMHg3MiAvKiByICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBEOyAvKiBcXHIgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNvbnRyb2xMZXR0ZXJcbiAgcHAkOC5yZWdleHBfZWF0Q29udHJvbExldHRlciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc0NvbnRyb2xMZXR0ZXIoY2gpKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAlIDB4MjA7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcbiAgZnVuY3Rpb24gaXNDb250cm9sTGV0dGVyKGNoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg1QSAvKiBaICovKSB8fFxuICAgICAgKGNoID49IDB4NjEgLyogYSAqLyAmJiBjaCA8PSAweDdBIC8qIHogKi8pXG4gICAgKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUmVnRXhwVW5pY29kZUVzY2FwZVNlcXVlbmNlXG4gIHBwJDgucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZVUpIHtcbiAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIHN3aXRjaFUgPSBmb3JjZVUgfHwgc3RhdGUuc3dpdGNoVTtcblxuICAgIGlmIChzdGF0ZS5lYXQoMHg3NSAvKiB1ICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCA0KSkge1xuICAgICAgICB2YXIgbGVhZCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgICAgaWYgKHN3aXRjaFUgJiYgbGVhZCA+PSAweEQ4MDAgJiYgbGVhZCA8PSAweERCRkYpIHtcbiAgICAgICAgICB2YXIgbGVhZFN1cnJvZ2F0ZUVuZCA9IHN0YXRlLnBvcztcbiAgICAgICAgICBpZiAoc3RhdGUuZWF0KDB4NUMgLyogXFwgKi8pICYmIHN0YXRlLmVhdCgweDc1IC8qIHUgKi8pICYmIHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCA0KSkge1xuICAgICAgICAgICAgdmFyIHRyYWlsID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICAgICAgaWYgKHRyYWlsID49IDB4REMwMCAmJiB0cmFpbCA8PSAweERGRkYpIHtcbiAgICAgICAgICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUucG9zID0gbGVhZFN1cnJvZ2F0ZUVuZDtcbiAgICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBsZWFkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHN3aXRjaFUgJiZcbiAgICAgICAgc3RhdGUuZWF0KDB4N0IgLyogeyAqLykgJiZcbiAgICAgICAgdGhpcy5yZWdleHBfZWF0SGV4RGlnaXRzKHN0YXRlKSAmJlxuICAgICAgICBzdGF0ZS5lYXQoMHg3RCAvKiB9ICovKSAmJlxuICAgICAgICBpc1ZhbGlkVW5pY29kZShzdGF0ZS5sYXN0SW50VmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzd2l0Y2hVKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCB1bmljb2RlIGVzY2FwZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBmdW5jdGlvbiBpc1ZhbGlkVW5pY29kZShjaCkge1xuICAgIHJldHVybiBjaCA+PSAwICYmIGNoIDw9IDB4MTBGRkZGXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSWRlbnRpdHlFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0SWRlbnRpdHlFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICBpZiAodGhpcy5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmVhdCgweDJGIC8qIC8gKi8pKSB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MkY7IC8qIC8gKi9cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgICBpZiAoY2ggIT09IDB4NjMgLyogYyAqLyAmJiAoIXN0YXRlLnN3aXRjaE4gfHwgY2ggIT09IDB4NkIgLyogayAqLykpIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRXNjYXBlXG4gIHBwJDgucmVnZXhwX2VhdERlY2ltYWxFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChjaCA+PSAweDMxIC8qIDEgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDEwICogc3RhdGUubGFzdEludFZhbHVlICsgKGNoIC0gMHgzMCAvKiAwICovKTtcbiAgICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgfSB3aGlsZSAoKGNoID0gc3RhdGUuY3VycmVudCgpKSA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2hhcmFjdGVyQ2xhc3NFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcblxuICAgIGlmIChpc0NoYXJhY3RlckNsYXNzRXNjYXBlKGNoKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gLTE7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlLnN3aXRjaFUgJiZcbiAgICAgIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmXG4gICAgICAoY2ggPT09IDB4NTAgLyogUCAqLyB8fCBjaCA9PT0gMHg3MCAvKiBwICovKVxuICAgICkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gLTE7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHN0YXRlLmVhdCgweDdCIC8qIHsgKi8pICYmXG4gICAgICAgIHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbihzdGF0ZSkgJiZcbiAgICAgICAgc3RhdGUuZWF0KDB4N0QgLyogfSAqLylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzQ2hhcmFjdGVyQ2xhc3NFc2NhcGUoY2gpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2ggPT09IDB4NjQgLyogZCAqLyB8fFxuICAgICAgY2ggPT09IDB4NDQgLyogRCAqLyB8fFxuICAgICAgY2ggPT09IDB4NzMgLyogcyAqLyB8fFxuICAgICAgY2ggPT09IDB4NTMgLyogUyAqLyB8fFxuICAgICAgY2ggPT09IDB4NzcgLyogdyAqLyB8fFxuICAgICAgY2ggPT09IDB4NTcgLyogVyAqL1xuICAgIClcbiAgfVxuXG4gIC8vIFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eU5hbWUgYD1gIFVuaWNvZGVQcm9wZXJ0eVZhbHVlXG4gIC8vICAgTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG4gIHBwJDgucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gICAgLy8gVW5pY29kZVByb3BlcnR5TmFtZSBgPWAgVW5pY29kZVByb3BlcnR5VmFsdWVcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5TmFtZShzdGF0ZSkgJiYgc3RhdGUuZWF0KDB4M0QgLyogPSAqLykpIHtcbiAgICAgIHZhciBuYW1lID0gc3RhdGUubGFzdFN0cmluZ1ZhbHVlO1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlKHN0YXRlKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzdGF0ZS5sYXN0U3RyaW5nVmFsdWU7XG4gICAgICAgIHRoaXMucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZUFuZFZhbHVlKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuXG4gICAgLy8gTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZShzdGF0ZSkpIHtcbiAgICAgIHZhciBuYW1lT3JWYWx1ZSA9IHN0YXRlLmxhc3RTdHJpbmdWYWx1ZTtcbiAgICAgIHRoaXMucmVnZXhwX3ZhbGlkYXRlVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUoc3RhdGUsIG5hbWVPclZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuICBwcCQ4LnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICAgIGlmICghaGFzKHN0YXRlLnVuaWNvZGVQcm9wZXJ0aWVzLm5vbkJpbmFyeSwgbmFtZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpOyB9XG4gICAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5ub25CaW5hcnlbbmFtZV0udGVzdCh2YWx1ZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSB2YWx1ZVwiKTsgfVxuICB9O1xuICBwcCQ4LnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIG5hbWVPclZhbHVlKSB7XG4gICAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5iaW5hcnkudGVzdChuYW1lT3JWYWx1ZSkpXG4gICAgICB7IHN0YXRlLnJhaXNlKFwiSW52YWxpZCBwcm9wZXJ0eSBuYW1lXCIpOyB9XG4gIH07XG5cbiAgLy8gVW5pY29kZVByb3BlcnR5TmFtZSA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXJzXG4gIHBwJDgucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBjaCA9IDA7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgICB3aGlsZSAoaXNVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKGNoKTtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxuICB9O1xuICBmdW5jdGlvbiBpc1VuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXIoY2gpIHtcbiAgICByZXR1cm4gaXNDb250cm9sTGV0dGVyKGNoKSB8fCBjaCA9PT0gMHg1RiAvKiBfICovXG4gIH1cblxuICAvLyBVbmljb2RlUHJvcGVydHlWYWx1ZSA6OlxuICAvLyAgIFVuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyc1xuICBwcCQ4LnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gMDtcbiAgICBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgPSBcIlwiO1xuICAgIHdoaWxlIChpc1VuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKGNoKTtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxuICB9O1xuICBmdW5jdGlvbiBpc1VuaWNvZGVQcm9wZXJ0eVZhbHVlQ2hhcmFjdGVyKGNoKSB7XG4gICAgcmV0dXJuIGlzVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcihjaCkgfHwgaXNEZWNpbWFsRGlnaXQoY2gpXG4gIH1cblxuICAvLyBMb25lVW5pY29kZVByb3BlcnR5TmFtZU9yVmFsdWUgOjpcbiAgLy8gICBVbmljb2RlUHJvcGVydHlWYWx1ZUNoYXJhY3RlcnNcbiAgcHAkOC5yZWdleHBfZWF0TG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdleHBfZWF0VW5pY29kZVByb3BlcnR5VmFsdWUoc3RhdGUpXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2hhcmFjdGVyQ2xhc3NcbiAgcHAkOC5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3MgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHg1QiAvKiBbICovKSkge1xuICAgICAgc3RhdGUuZWF0KDB4NUUgLyogXiAqLyk7XG4gICAgICB0aGlzLnJlZ2V4cF9jbGFzc1JhbmdlcyhzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuZWF0KDB4NUQgLyogXSAqLykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIC8vIFVucmVhY2hhYmxlIHNpbmNlIGl0IHRocmV3IFwidW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiIGVycm9yIGJlZm9yZS5cbiAgICAgIHN0YXRlLnJhaXNlKFwiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2xhc3NSYW5nZXNcbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc1xuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1Ob25lbXB0eUNsYXNzUmFuZ2VzTm9EYXNoXG4gIHBwJDgucmVnZXhwX2NsYXNzUmFuZ2VzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB3aGlsZSAodGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgICAgdmFyIGxlZnQgPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICBpZiAoc3RhdGUuZWF0KDB4MkQgLyogLSAqLykgJiYgdGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgICAgICB2YXIgcmlnaHQgPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVICYmIChsZWZ0ID09PSAtMSB8fCByaWdodCA9PT0gLTEpKSB7XG4gICAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xICYmIGxlZnQgPiByaWdodCkge1xuICAgICAgICAgIHN0YXRlLnJhaXNlKFwiUmFuZ2Ugb3V0IG9mIG9yZGVyIGluIGNoYXJhY3RlciBjbGFzc1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc0F0b21cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2xhc3NBdG9tTm9EYXNoXG4gIHBwJDgucmVnZXhwX2VhdENsYXNzQXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gICAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdENsYXNzRXNjYXBlKHN0YXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgICAgICB2YXIgY2gkMSA9IHN0YXRlLmN1cnJlbnQoKTtcbiAgICAgICAgaWYgKGNoJDEgPT09IDB4NjMgLyogYyAqLyB8fCBpc09jdGFsRGlnaXQoY2gkMSkpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2xhc3MgZXNjYXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBlc2NhcGVcIik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKGNoICE9PSAweDVEIC8qIF0gKi8pIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2xhc3NFc2NhcGVcbiAgcHAkOC5yZWdleHBfZWF0Q2xhc3NFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcblxuICAgIGlmIChzdGF0ZS5lYXQoMHg2MiAvKiBiICovKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwODsgLyogPEJTPiAqL1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3dpdGNoVSAmJiBzdGF0ZS5lYXQoMHgyRCAvKiAtICovKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgyRDsgLyogLSAqL1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLnN3aXRjaFUgJiYgc3RhdGUuZWF0KDB4NjMgLyogYyAqLykpIHtcbiAgICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDbGFzc0NvbnRyb2xMZXR0ZXIoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgICB0aGlzLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUoc3RhdGUpXG4gICAgKVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1DbGFzc0NvbnRyb2xMZXR0ZXJcbiAgcHAkOC5yZWdleHBfZWF0Q2xhc3NDb250cm9sTGV0dGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgaWYgKGlzRGVjaW1hbERpZ2l0KGNoKSB8fCBjaCA9PT0gMHg1RiAvKiBfICovKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAlIDB4MjA7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhFc2NhcGVTZXF1ZW5jZVxuICBwcCQ4LnJlZ2V4cF9lYXRIZXhFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICAgIGlmIChzdGF0ZS5lYXQoMHg3OCAvKiB4ICovKSkge1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCAyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfTtcblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRGlnaXRzXG4gIHBwJDgucmVnZXhwX2VhdERlY2ltYWxEaWdpdHMgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgICB2YXIgY2ggPSAwO1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgd2hpbGUgKGlzRGVjaW1hbERpZ2l0KGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMTAgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyAoY2ggLSAweDMwIC8qIDAgKi8pO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUucG9zICE9PSBzdGFydFxuICB9O1xuICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhEaWdpdHNcbiAgcHAkOC5yZWdleHBfZWF0SGV4RGlnaXRzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgdmFyIGNoID0gMDtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICAgIHdoaWxlIChpc0hleERpZ2l0KGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMTYgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyBoZXhUb0ludChjaCk7XG4gICAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5wb3MgIT09IHN0YXJ0XG4gIH07XG4gIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNoID49IDB4MzAgLyogMCAqLyAmJiBjaCA8PSAweDM5IC8qIDkgKi8pIHx8XG4gICAgICAoY2ggPj0gMHg0MSAvKiBBICovICYmIGNoIDw9IDB4NDYgLyogRiAqLykgfHxcbiAgICAgIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKVxuICAgIClcbiAgfVxuICBmdW5jdGlvbiBoZXhUb0ludChjaCkge1xuICAgIGlmIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg0NiAvKiBGICovKSB7XG4gICAgICByZXR1cm4gMTAgKyAoY2ggLSAweDQxIC8qIEEgKi8pXG4gICAgfVxuICAgIGlmIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKSB7XG4gICAgICByZXR1cm4gMTAgKyAoY2ggLSAweDYxIC8qIGEgKi8pXG4gICAgfVxuICAgIHJldHVybiBjaCAtIDB4MzAgLyogMCAqL1xuICB9XG5cbiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUxlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2VcbiAgLy8gQWxsb3dzIG9ubHkgMC0zNzcob2N0YWwpIGkuZS4gMC0yNTUoZGVjaW1hbCkuXG4gIHBwJDgucmVnZXhwX2VhdExlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSkge1xuICAgICAgdmFyIG4xID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgaWYgKHRoaXMucmVnZXhwX2VhdE9jdGFsRGlnaXQoc3RhdGUpKSB7XG4gICAgICAgIHZhciBuMiA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgICAgaWYgKG4xIDw9IDMgJiYgdGhpcy5yZWdleHBfZWF0T2N0YWxEaWdpdChzdGF0ZSkpIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMSAqIDY0ICsgbjIgKiA4ICsgc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IG4xICogOCArIG4yO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLU9jdGFsRGlnaXRcbiAgcHAkOC5yZWdleHBfZWF0T2N0YWxEaWdpdCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmIChpc09jdGFsRGlnaXQoY2gpKSB7XG4gICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaCAtIDB4MzA7IC8qIDAgKi9cbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH07XG4gIGZ1bmN0aW9uIGlzT2N0YWxEaWdpdChjaCkge1xuICAgIHJldHVybiBjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzNyAvKiA3ICovXG4gIH1cblxuICAvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXg0RGlnaXRzXG4gIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleERpZ2l0XG4gIC8vIEFuZCBIZXhEaWdpdCBIZXhEaWdpdCBpbiBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhFc2NhcGVTZXF1ZW5jZVxuICBwcCQ4LnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cyA9IGZ1bmN0aW9uKHN0YXRlLCBsZW5ndGgpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gICAgICBpZiAoIWlzSGV4RGlnaXQoY2gpKSB7XG4gICAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDE2ICogc3RhdGUubGFzdEludFZhbHVlICsgaGV4VG9JbnQoY2gpO1xuICAgICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9O1xuXG4gIC8vIE9iamVjdCB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRva2Vucy4gTm90ZSB0aGF0IG5vcm1hbGx5LCB0b2tlbnNcbiAgLy8gc2ltcGx5IGV4aXN0IGFzIHByb3BlcnRpZXMgb24gdGhlIHBhcnNlciBvYmplY3QuIFRoaXMgaXMgb25seVxuICAvLyB1c2VkIGZvciB0aGUgb25Ub2tlbiBjYWxsYmFjayBhbmQgdGhlIGV4dGVybmFsIHRva2VuaXplci5cblxuICB2YXIgVG9rZW4gPSBmdW5jdGlvbiBUb2tlbihwKSB7XG4gICAgdGhpcy50eXBlID0gcC50eXBlO1xuICAgIHRoaXMudmFsdWUgPSBwLnZhbHVlO1xuICAgIHRoaXMuc3RhcnQgPSBwLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gcC5lbmQ7XG4gICAgaWYgKHAub3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgICB7IHRoaXMubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKHAsIHAuc3RhcnRMb2MsIHAuZW5kTG9jKTsgfVxuICAgIGlmIChwLm9wdGlvbnMucmFuZ2VzKVxuICAgICAgeyB0aGlzLnJhbmdlID0gW3Auc3RhcnQsIHAuZW5kXTsgfVxuICB9O1xuXG4gIC8vICMjIFRva2VuaXplclxuXG4gIHZhciBwcCQ5ID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG5cbiAgcHAkOS5uZXh0ID0gZnVuY3Rpb24oaWdub3JlRXNjYXBlU2VxdWVuY2VJbktleXdvcmQpIHtcbiAgICBpZiAoIWlnbm9yZUVzY2FwZVNlcXVlbmNlSW5LZXl3b3JkICYmIHRoaXMudHlwZS5rZXl3b3JkICYmIHRoaXMuY29udGFpbnNFc2MpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCBcIkVzY2FwZSBzZXF1ZW5jZSBpbiBrZXl3b3JkIFwiICsgdGhpcy50eXBlLmtleXdvcmQpOyB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vblRva2VuKVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Ub2tlbihuZXcgVG9rZW4odGhpcykpOyB9XG5cbiAgICB0aGlzLmxhc3RUb2tFbmQgPSB0aGlzLmVuZDtcbiAgICB0aGlzLmxhc3RUb2tTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgdGhpcy5sYXN0VG9rRW5kTG9jID0gdGhpcy5lbmRMb2M7XG4gICAgdGhpcy5sYXN0VG9rU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gIH07XG5cbiAgcHAkOS5nZXRUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiBuZXcgVG9rZW4odGhpcylcbiAgfTtcblxuICAvLyBJZiB3ZSdyZSBpbiBhbiBFUzYgZW52aXJvbm1lbnQsIG1ha2UgcGFyc2VycyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICB7IHBwJDlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzJDEuZ2V0VG9rZW4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdG9rZW4udHlwZSA9PT0gdHlwZXMuZW9mLFxuICAgICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTsgfVxuXG4gIC8vIFRvZ2dsZSBzdHJpY3QgbW9kZS4gUmUtcmVhZHMgdGhlIG5leHQgbnVtYmVyIG9yIHN0cmluZyB0byBwbGVhc2VcbiAgLy8gcGVkYW50aWMgdGVzdHMgKGBcInVzZSBzdHJpY3RcIjsgMDEwO2Agc2hvdWxkIGZhaWwpLlxuXG4gIHBwJDkuY3VyQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRbdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDFdXG4gIH07XG5cbiAgLy8gUmVhZCBhIHNpbmdsZSB0b2tlbiwgdXBkYXRpbmcgdGhlIHBhcnNlciBvYmplY3QncyB0b2tlbi1yZWxhdGVkXG4gIC8vIHByb3BlcnRpZXMuXG5cbiAgcHAkOS5uZXh0VG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3VyQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuICAgIGlmICghY3VyQ29udGV4dCB8fCAhY3VyQ29udGV4dC5wcmVzZXJ2ZVNwYWNlKSB7IHRoaXMuc2tpcFNwYWNlKCk7IH1cblxuICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvcztcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgeyB0aGlzLnN0YXJ0TG9jID0gdGhpcy5jdXJQb3NpdGlvbigpOyB9XG4gICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmVvZikgfVxuXG4gICAgaWYgKGN1ckNvbnRleHQub3ZlcnJpZGUpIHsgcmV0dXJuIGN1ckNvbnRleHQub3ZlcnJpZGUodGhpcykgfVxuICAgIGVsc2UgeyB0aGlzLnJlYWRUb2tlbih0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpOyB9XG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW4gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgLy8gSWRlbnRpZmllciBvciBrZXl3b3JkLiAnXFx1WFhYWCcgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIGluXG4gICAgLy8gaWRlbnRpZmllcnMsIHNvICdcXCcgYWxzbyBkaXNwYXRjaGVzIHRvIHRoYXQuXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB8fCBjb2RlID09PSA5MiAvKiAnXFwnICovKVxuICAgICAgeyByZXR1cm4gdGhpcy5yZWFkV29yZCgpIH1cblxuICAgIHJldHVybiB0aGlzLmdldFRva2VuRnJvbUNvZGUoY29kZSlcbiAgfTtcblxuICBwcCQ5LmZ1bGxDaGFyQ29kZUF0UG9zID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvZGUgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgIGlmIChjb2RlIDw9IDB4ZDdmZiB8fCBjb2RlID49IDB4ZTAwMCkgeyByZXR1cm4gY29kZSB9XG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICByZXR1cm4gKGNvZGUgPDwgMTApICsgbmV4dCAtIDB4MzVmZGMwMFxuICB9O1xuXG4gIHBwJDkuc2tpcEJsb2NrQ29tbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFydExvYyA9IHRoaXMub3B0aW9ucy5vbkNvbW1lbnQgJiYgdGhpcy5jdXJQb3NpdGlvbigpO1xuICAgIHZhciBzdGFydCA9IHRoaXMucG9zLCBlbmQgPSB0aGlzLmlucHV0LmluZGV4T2YoXCIqL1wiLCB0aGlzLnBvcyArPSAyKTtcbiAgICBpZiAoZW5kID09PSAtMSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zIC0gMiwgXCJVbnRlcm1pbmF0ZWQgY29tbWVudFwiKTsgfVxuICAgIHRoaXMucG9zID0gZW5kICsgMjtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgbGluZUJyZWFrRy5sYXN0SW5kZXggPSBzdGFydDtcbiAgICAgIHZhciBtYXRjaDtcbiAgICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lQnJlYWtHLmV4ZWModGhpcy5pbnB1dCkpICYmIG1hdGNoLmluZGV4IDwgdGhpcy5wb3MpIHtcbiAgICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KHRydWUsIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQgKyAyLCBlbmQpLCBzdGFydCwgdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TG9jLCB0aGlzLmN1clBvc2l0aW9uKCkpOyB9XG4gIH07XG5cbiAgcHAkOS5za2lwTGluZUNvbW1lbnQgPSBmdW5jdGlvbihzdGFydFNraXApIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB2YXIgc3RhcnRMb2MgPSB0aGlzLm9wdGlvbnMub25Db21tZW50ICYmIHRoaXMuY3VyUG9zaXRpb24oKTtcbiAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKz0gc3RhcnRTa2lwKTtcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCAmJiAhaXNOZXdMaW5lKGNoKSkge1xuICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMub25Db21tZW50KVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KGZhbHNlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgc3RhcnRTa2lwLCB0aGlzLnBvcyksIHN0YXJ0LCB0aGlzLnBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2MsIHRoaXMuY3VyUG9zaXRpb24oKSk7IH1cbiAgfTtcblxuICAvLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBhbmQgYWZ0ZXIgZXZlcnkgdG9rZW4uIFNraXBzXG4gIC8vIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBhbmQuXG5cbiAgcHAkOS5za2lwU3BhY2UgPSBmdW5jdGlvbigpIHtcbiAgICBsb29wOiB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgIGNhc2UgMzI6IGNhc2UgMTYwOiAvLyAnICdcbiAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTApIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9XG4gICAgICBjYXNlIDEwOiBjYXNlIDgyMzI6IGNhc2UgODIzMzpcbiAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHtcbiAgICAgICAgICArK3RoaXMuY3VyTGluZTtcbiAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSkge1xuICAgICAgICBjYXNlIDQyOiAvLyAnKidcbiAgICAgICAgICB0aGlzLnNraXBCbG9ja0NvbW1lbnQoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWsgbG9vcFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY2ggPiA4ICYmIGNoIDwgMTQgfHwgY2ggPj0gNTc2MCAmJiBub25BU0NJSXdoaXRlc3BhY2UudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSkpIHtcbiAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrIGxvb3BcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSB0b2tlbi4gU2V0cyBgZW5kYCwgYHZhbGAsIGFuZFxuICAvLyBtYWludGFpbnMgYGNvbnRleHRgIGFuZCBgZXhwckFsbG93ZWRgLCBhbmQgc2tpcHMgdGhlIHNwYWNlIGFmdGVyXG4gIC8vIHRoZSB0b2tlbiwgc28gdGhhdCB0aGUgbmV4dCBvbmUncyBgc3RhcnRgIHdpbGwgcG9pbnQgYXQgdGhlXG4gIC8vIHJpZ2h0IHBvc2l0aW9uLlxuXG4gIHBwJDkuZmluaXNoVG9rZW4gPSBmdW5jdGlvbih0eXBlLCB2YWwpIHtcbiAgICB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7IHRoaXMuZW5kTG9jID0gdGhpcy5jdXJQb3NpdGlvbigpOyB9XG4gICAgdmFyIHByZXZUeXBlID0gdGhpcy50eXBlO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcblxuICAgIHRoaXMudXBkYXRlQ29udGV4dChwcmV2VHlwZSk7XG4gIH07XG5cbiAgLy8gIyMjIFRva2VuIHJlYWRpbmdcblxuICAvLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBmZXRjaCB0aGUgbmV4dCB0b2tlbi4gSXRcbiAgLy8gaXMgc29tZXdoYXQgb2JzY3VyZSwgYmVjYXVzZSBpdCB3b3JrcyBpbiBjaGFyYWN0ZXIgY29kZXMgcmF0aGVyXG4gIC8vIHRoYW4gY2hhcmFjdGVycywgYW5kIGJlY2F1c2Ugb3BlcmF0b3IgcGFyc2luZyBoYXMgYmVlbiBpbmxpbmVkXG4gIC8vIGludG8gaXQuXG4gIC8vXG4gIC8vIEFsbCBpbiB0aGUgbmFtZSBvZiBzcGVlZC5cbiAgLy9cbiAgcHAkOS5yZWFkVG9rZW5fZG90ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSB7IHJldHVybiB0aGlzLnJlYWROdW1iZXIodHJ1ZSkgfVxuICAgIHZhciBuZXh0MiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBuZXh0ID09PSA0NiAmJiBuZXh0MiA9PT0gNDYpIHsgLy8gNDYgPSBkb3QgJy4nXG4gICAgICB0aGlzLnBvcyArPSAzO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuZWxsaXBzaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgICsrdGhpcy5wb3M7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5kb3QpXG4gICAgfVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3NsYXNoID0gZnVuY3Rpb24oKSB7IC8vICcvJ1xuICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgaWYgKHRoaXMuZXhwckFsbG93ZWQpIHsgKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMucmVhZFJlZ2V4cCgpIH1cbiAgICBpZiAobmV4dCA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLCAyKSB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuc2xhc2gsIDEpXG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW5fbXVsdF9tb2R1bG9fZXhwID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnJSonXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICB2YXIgc2l6ZSA9IDE7XG4gICAgdmFyIHRva2VudHlwZSA9IGNvZGUgPT09IDQyID8gdHlwZXMuc3RhciA6IHR5cGVzLm1vZHVsbztcblxuICAgIC8vIGV4cG9uZW50aWF0aW9uIG9wZXJhdG9yICoqIGFuZCAqKj1cbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDcgJiYgY29kZSA9PT0gNDIgJiYgbmV4dCA9PT0gNDIpIHtcbiAgICAgICsrc2l6ZTtcbiAgICAgIHRva2VudHlwZSA9IHR5cGVzLnN0YXJzdGFyO1xuICAgICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIHNpemUgKyAxKSB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodG9rZW50eXBlLCBzaXplKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3BpcGVfYW1wID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnfCYnXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMikge1xuICAgICAgICB2YXIgbmV4dDIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgICAgICAgaWYgKG5leHQyID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDMpIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IHR5cGVzLmxvZ2ljYWxPUiA6IHR5cGVzLmxvZ2ljYWxBTkQsIDIpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDIpIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSAxMjQgPyB0eXBlcy5iaXR3aXNlT1IgOiB0eXBlcy5iaXR3aXNlQU5ELCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2NhcmV0ID0gZnVuY3Rpb24oKSB7IC8vICdeJ1xuICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmFzc2lnbiwgMikgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLmJpdHdpc2VYT1IsIDEpXG4gIH07XG5cbiAgcHAkOS5yZWFkVG9rZW5fcGx1c19taW4gPSBmdW5jdGlvbihjb2RlKSB7IC8vICcrLSdcbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjb2RlKSB7XG4gICAgICBpZiAobmV4dCA9PT0gNDUgJiYgIXRoaXMuaW5Nb2R1bGUgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYyICYmXG4gICAgICAgICAgKHRoaXMubGFzdFRva0VuZCA9PT0gMCB8fCBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5wb3MpKSkpIHtcbiAgICAgICAgLy8gQSBgLS0+YCBsaW5lIGNvbW1lbnRcbiAgICAgICAgdGhpcy5za2lwTGluZUNvbW1lbnQoMyk7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRUb2tlbigpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5pbmNEZWMsIDIpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDIpIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5wbHVzTWluLCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2x0X2d0ID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnPD4nXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICB2YXIgc2l6ZSA9IDE7XG4gICAgaWYgKG5leHQgPT09IGNvZGUpIHtcbiAgICAgIHNpemUgPSBjb2RlID09PSA2MiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjIgPyAzIDogMjtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyBzaXplKSA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYXNzaWduLCBzaXplICsgMSkgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMuYml0U2hpZnQsIHNpemUpXG4gICAgfVxuICAgIGlmIChuZXh0ID09PSAzMyAmJiBjb2RlID09PSA2MCAmJiAhdGhpcy5pbk1vZHVsZSAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNDUgJiZcbiAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMykgPT09IDQ1KSB7XG4gICAgICAvLyBgPCEtLWAsIGFuIFhNTC1zdHlsZSBjb21tZW50IHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgbGluZSBjb21tZW50XG4gICAgICB0aGlzLnNraXBMaW5lQ29tbWVudCg0KTtcbiAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW4oKVxuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gNjEpIHsgc2l6ZSA9IDI7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5yZWxhdGlvbmFsLCBzaXplKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX2VxX2V4Y2wgPSBmdW5jdGlvbihjb2RlKSB7IC8vICc9ISdcbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5lcXVhbGl0eSwgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYxID8gMyA6IDIpIH1cbiAgICBpZiAoY29kZSA9PT0gNjEgJiYgbmV4dCA9PT0gNjIgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgLy8gJz0+J1xuICAgICAgdGhpcy5wb3MgKz0gMjtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmFycm93KVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSA2MSA/IHR5cGVzLmVxIDogdHlwZXMucHJlZml4LCAxKVxuICB9O1xuXG4gIHBwJDkucmVhZFRva2VuX3F1ZXN0aW9uID0gZnVuY3Rpb24oKSB7IC8vICc/J1xuICAgIHZhciBlY21hVmVyc2lvbiA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjtcbiAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICAgIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gICAgICBpZiAobmV4dCA9PT0gNDYpIHtcbiAgICAgICAgdmFyIG5leHQyID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMik7XG4gICAgICAgIGlmIChuZXh0MiA8IDQ4IHx8IG5leHQyID4gNTcpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucXVlc3Rpb25Eb3QsIDIpIH1cbiAgICAgIH1cbiAgICAgIGlmIChuZXh0ID09PSA2Mykge1xuICAgICAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTIpIHtcbiAgICAgICAgICB2YXIgbmV4dDIkMSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDIpO1xuICAgICAgICAgIGlmIChuZXh0MiQxID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5hc3NpZ24sIDMpIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcy5jb2FsZXNjZSwgMilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMucXVlc3Rpb24sIDEpXG4gIH07XG5cbiAgcHAkOS5nZXRUb2tlbkZyb21Db2RlID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHN3aXRjaCAoY29kZSkge1xuICAgIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWRcbiAgICAvLyBieSBhIGRpZ2l0IG9yIGFub3RoZXIgdHdvIGRvdHMuXG4gICAgY2FzZSA0NjogLy8gJy4nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZG90KClcblxuICAgIC8vIFB1bmN0dWF0aW9uIHRva2Vucy5cbiAgICBjYXNlIDQwOiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5wYXJlbkwpXG4gICAgY2FzZSA0MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMucGFyZW5SKVxuICAgIGNhc2UgNTk6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnNlbWkpXG4gICAgY2FzZSA0NDogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuY29tbWEpXG4gICAgY2FzZSA5MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldEwpXG4gICAgY2FzZSA5MzogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2tldFIpXG4gICAgY2FzZSAxMjM6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJyYWNlTClcbiAgICBjYXNlIDEyNTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYnJhY2VSKVxuICAgIGNhc2UgNTg6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmNvbG9uKVxuXG4gICAgY2FzZSA5NjogLy8gJ2AnXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNikgeyBicmVhayB9XG4gICAgICArK3RoaXMucG9zO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMuYmFja1F1b3RlKVxuXG4gICAgY2FzZSA0ODogLy8gJzAnXG4gICAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgICAgaWYgKG5leHQgPT09IDEyMCB8fCBuZXh0ID09PSA4OCkgeyByZXR1cm4gdGhpcy5yZWFkUmFkaXhOdW1iZXIoMTYpIH0gLy8gJzB4JywgJzBYJyAtIGhleCBudW1iZXJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgICBpZiAobmV4dCA9PT0gMTExIHx8IG5leHQgPT09IDc5KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcig4KSB9IC8vICcwbycsICcwTycgLSBvY3RhbCBudW1iZXJcbiAgICAgICAgaWYgKG5leHQgPT09IDk4IHx8IG5leHQgPT09IDY2KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcigyKSB9IC8vICcwYicsICcwQicgLSBiaW5hcnkgbnVtYmVyXG4gICAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGJlZ2lubmluZyB3aXRoIGEgZGlnaXQgaXMgYW4gaW50ZWdlciwgb2N0YWxcbiAgICAvLyBudW1iZXIsIG9yIGZsb2F0LlxuICAgIGNhc2UgNDk6IGNhc2UgNTA6IGNhc2UgNTE6IGNhc2UgNTI6IGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6IGNhc2UgNTc6IC8vIDEtOVxuICAgICAgcmV0dXJuIHRoaXMucmVhZE51bWJlcihmYWxzZSlcblxuICAgIC8vIFF1b3RlcyBwcm9kdWNlIHN0cmluZ3MuXG4gICAgY2FzZSAzNDogY2FzZSAzOTogLy8gJ1wiJywgXCInXCJcbiAgICAgIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoY29kZSlcblxuICAgIC8vIE9wZXJhdG9ycyBhcmUgcGFyc2VkIGlubGluZSBpbiB0aW55IHN0YXRlIG1hY2hpbmVzLiAnPScgKDYxKSBpc1xuICAgIC8vIG9mdGVuIHJlZmVycmVkIHRvLiBgZmluaXNoT3BgIHNpbXBseSBza2lwcyB0aGUgYW1vdW50IG9mXG4gICAgLy8gY2hhcmFjdGVycyBpdCBpcyBnaXZlbiBhcyBzZWNvbmQgYXJndW1lbnQsIGFuZCByZXR1cm5zIGEgdG9rZW5cbiAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9zbGFzaCgpXG5cbiAgICBjYXNlIDM3OiBjYXNlIDQyOiAvLyAnJSonXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fbXVsdF9tb2R1bG9fZXhwKGNvZGUpXG5cbiAgICBjYXNlIDEyNDogY2FzZSAzODogLy8gJ3wmJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BpcGVfYW1wKGNvZGUpXG5cbiAgICBjYXNlIDk0OiAvLyAnXidcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9jYXJldCgpXG5cbiAgICBjYXNlIDQzOiBjYXNlIDQ1OiAvLyAnKy0nXG4gICAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fcGx1c19taW4oY29kZSlcblxuICAgIGNhc2UgNjA6IGNhc2UgNjI6IC8vICc8PidcbiAgICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9sdF9ndChjb2RlKVxuXG4gICAgY2FzZSA2MTogY2FzZSAzMzogLy8gJz0hJ1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2VxX2V4Y2woY29kZSlcblxuICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3F1ZXN0aW9uKClcblxuICAgIGNhc2UgMTI2OiAvLyAnfidcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzLnByZWZpeCwgMSlcbiAgICB9XG5cbiAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICdcIiArIGNvZGVQb2ludFRvU3RyaW5nJDEoY29kZSkgKyBcIidcIik7XG4gIH07XG5cbiAgcHAkOS5maW5pc2hPcCA9IGZ1bmN0aW9uKHR5cGUsIHNpemUpIHtcbiAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgKyBzaXplKTtcbiAgICB0aGlzLnBvcyArPSBzaXplO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGUsIHN0cilcbiAgfTtcblxuICBwcCQ5LnJlYWRSZWdleHAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXNjYXBlZCwgaW5DbGFzcywgc3RhcnQgPSB0aGlzLnBvcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uXCIpOyB9XG4gICAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJBdCh0aGlzLnBvcyk7XG4gICAgICBpZiAobGluZUJyZWFrLnRlc3QoY2gpKSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTsgfVxuICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgIGlmIChjaCA9PT0gXCJbXCIpIHsgaW5DbGFzcyA9IHRydWU7IH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09IFwiXVwiICYmIGluQ2xhc3MpIHsgaW5DbGFzcyA9IGZhbHNlOyB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSBcIi9cIiAmJiAhaW5DbGFzcykgeyBicmVhayB9XG4gICAgICAgIGVzY2FwZWQgPSBjaCA9PT0gXCJcXFxcXCI7XG4gICAgICB9IGVsc2UgeyBlc2NhcGVkID0gZmFsc2U7IH1cbiAgICAgICsrdGhpcy5wb3M7XG4gICAgfVxuICAgIHZhciBwYXR0ZXJuID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpO1xuICAgICsrdGhpcy5wb3M7XG4gICAgdmFyIGZsYWdzU3RhcnQgPSB0aGlzLnBvcztcbiAgICB2YXIgZmxhZ3MgPSB0aGlzLnJlYWRXb3JkMSgpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5zRXNjKSB7IHRoaXMudW5leHBlY3RlZChmbGFnc1N0YXJ0KTsgfVxuXG4gICAgLy8gVmFsaWRhdGUgcGF0dGVyblxuICAgIHZhciBzdGF0ZSA9IHRoaXMucmVnZXhwU3RhdGUgfHwgKHRoaXMucmVnZXhwU3RhdGUgPSBuZXcgUmVnRXhwVmFsaWRhdGlvblN0YXRlKHRoaXMpKTtcbiAgICBzdGF0ZS5yZXNldChzdGFydCwgcGF0dGVybiwgZmxhZ3MpO1xuICAgIHRoaXMudmFsaWRhdGVSZWdFeHBGbGFncyhzdGF0ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVJlZ0V4cFBhdHRlcm4oc3RhdGUpO1xuXG4gICAgLy8gQ3JlYXRlIExpdGVyYWwjdmFsdWUgcHJvcGVydHkgdmFsdWUuXG4gICAgdmFyIHZhbHVlID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBFU1RyZWUgcmVxdWlyZXMgbnVsbCBpZiBpdCBmYWlsZWQgdG8gaW5zdGFudGlhdGUgUmVnRXhwIG9iamVjdC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2Jsb2IvYTI3MDAzYWRmNGZkN2JmYWQ0NGRlOWNlZjM3MmEyZWFjZDUyN2IxYy9lczUubWQjcmVnZXhwbGl0ZXJhbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLnJlZ2V4cCwge3BhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncywgdmFsdWU6IHZhbHVlfSlcbiAgfTtcblxuICAvLyBSZWFkIGFuIGludGVnZXIgaW4gdGhlIGdpdmVuIHJhZGl4LiBSZXR1cm4gbnVsbCBpZiB6ZXJvIGRpZ2l0c1xuICAvLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuICAvLyB3aWxsIHJldHVybiBgbnVsbGAgdW5sZXNzIHRoZSBpbnRlZ2VyIGhhcyBleGFjdGx5IGBsZW5gIGRpZ2l0cy5cblxuICBwcCQ5LnJlYWRJbnQgPSBmdW5jdGlvbihyYWRpeCwgbGVuLCBtYXliZUxlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHtcbiAgICAvLyBgbGVuYCBpcyB1c2VkIGZvciBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcy4gSW4gdGhhdCBjYXNlLCBkaXNhbGxvdyBzZXBhcmF0b3JzLlxuICAgIHZhciBhbGxvd1NlcGFyYXRvcnMgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTIgJiYgbGVuID09PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBgbWF5YmVMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsYCBpcyB0cnVlIGlmIGl0IGRvZXNuJ3QgaGF2ZSBwcmVmaXggKDB4LDBvLDBiKVxuICAgIC8vIGFuZCBpc24ndCBmcmFjdGlvbiBwYXJ0IG5vciBleHBvbmVudCBwYXJ0LiBJbiB0aGF0IGNhc2UsIGlmIHRoZSBmaXJzdCBkaWdpdFxuICAgIC8vIGlzIHplcm8gdGhlbiBkaXNhbGxvdyBzZXBhcmF0b3JzLlxuICAgIHZhciBpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwgPSBtYXliZUxlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gNDg7XG5cbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcywgdG90YWwgPSAwLCBsYXN0Q29kZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpLCArK3RoaXMucG9zKSB7XG4gICAgICB2YXIgY29kZSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyksIHZhbCA9ICh2b2lkIDApO1xuXG4gICAgICBpZiAoYWxsb3dTZXBhcmF0b3JzICYmIGNvZGUgPT09IDk1KSB7XG4gICAgICAgIGlmIChpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zLCBcIk51bWVyaWMgc2VwYXJhdG9yIGlzIG5vdCBhbGxvd2VkIGluIGxlZ2FjeSBvY3RhbCBudW1lcmljIGxpdGVyYWxzXCIpOyB9XG4gICAgICAgIGlmIChsYXN0Q29kZSA9PT0gOTUpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zLCBcIk51bWVyaWMgc2VwYXJhdG9yIG11c3QgYmUgZXhhY3RseSBvbmUgdW5kZXJzY29yZVwiKTsgfVxuICAgICAgICBpZiAoaSA9PT0gMCkgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5wb3MsIFwiTnVtZXJpYyBzZXBhcmF0b3IgaXMgbm90IGFsbG93ZWQgYXQgdGhlIGZpcnN0IG9mIGRpZ2l0c1wiKTsgfVxuICAgICAgICBsYXN0Q29kZSA9IGNvZGU7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjb2RlID49IDk3KSB7IHZhbCA9IGNvZGUgLSA5NyArIDEwOyB9IC8vIGFcbiAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNjUpIHsgdmFsID0gY29kZSAtIDY1ICsgMTA7IH0gLy8gQVxuICAgICAgZWxzZSBpZiAoY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3KSB7IHZhbCA9IGNvZGUgLSA0ODsgfSAvLyAwLTlcbiAgICAgIGVsc2UgeyB2YWwgPSBJbmZpbml0eTsgfVxuICAgICAgaWYgKHZhbCA+PSByYWRpeCkgeyBicmVhayB9XG4gICAgICBsYXN0Q29kZSA9IGNvZGU7XG4gICAgICB0b3RhbCA9IHRvdGFsICogcmFkaXggKyB2YWw7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93U2VwYXJhdG9ycyAmJiBsYXN0Q29kZSA9PT0gOTUpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zIC0gMSwgXCJOdW1lcmljIHNlcGFyYXRvciBpcyBub3QgYWxsb3dlZCBhdCB0aGUgbGFzdCBvZiBkaWdpdHNcIik7IH1cbiAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRoaXMucG9zIC0gc3RhcnQgIT09IGxlbikgeyByZXR1cm4gbnVsbCB9XG5cbiAgICByZXR1cm4gdG90YWxcbiAgfTtcblxuICBmdW5jdGlvbiBzdHJpbmdUb051bWJlcihzdHIsIGlzTGVnYWN5T2N0YWxOdW1lcmljTGl0ZXJhbCkge1xuICAgIGlmIChpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChzdHIsIDgpXG4gICAgfVxuXG4gICAgLy8gYHBhcnNlRmxvYXQodmFsdWUpYCBzdG9wcyBwYXJzaW5nIGF0IHRoZSBmaXJzdCBudW1lcmljIHNlcGFyYXRvciB0aGVuIHJldHVybnMgYSB3cm9uZyB2YWx1ZS5cbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCBcIlwiKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQmlnSW50KHN0cikge1xuICAgIGlmICh0eXBlb2YgQmlnSW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gYEJpZ0ludCh2YWx1ZSlgIHRocm93cyBzeW50YXggZXJyb3IgaWYgdGhlIHN0cmluZyBjb250YWlucyBudW1lcmljIHNlcGFyYXRvcnMuXG4gICAgcmV0dXJuIEJpZ0ludChzdHIucmVwbGFjZSgvXy9nLCBcIlwiKSlcbiAgfVxuXG4gIHBwJDkucmVhZFJhZGl4TnVtYmVyID0gZnVuY3Rpb24ocmFkaXgpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICB0aGlzLnBvcyArPSAyOyAvLyAweFxuICAgIHZhciB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQgKyAyLCBcIkV4cGVjdGVkIG51bWJlciBpbiByYWRpeCBcIiArIHJhZGl4KTsgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gMTEwKSB7XG4gICAgICB2YWwgPSBzdHJpbmdUb0JpZ0ludCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpO1xuICAgICAgKyt0aGlzLnBvcztcbiAgICB9IGVsc2UgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSkpIHsgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTsgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLm51bSwgdmFsKVxuICB9O1xuXG4gIC8vIFJlYWQgYW4gaW50ZWdlciwgb2N0YWwgaW50ZWdlciwgb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuXG4gIHBwJDkucmVhZE51bWJlciA9IGZ1bmN0aW9uKHN0YXJ0c1dpdGhEb3QpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcztcbiAgICBpZiAoIXN0YXJ0c1dpdGhEb3QgJiYgdGhpcy5yZWFkSW50KDEwLCB1bmRlZmluZWQsIHRydWUpID09PSBudWxsKSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgICB2YXIgb2N0YWwgPSB0aGlzLnBvcyAtIHN0YXJ0ID49IDIgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gNDg7XG4gICAgaWYgKG9jdGFsICYmIHRoaXMuc3RyaWN0KSB7IHRoaXMucmFpc2Uoc3RhcnQsIFwiSW52YWxpZCBudW1iZXJcIik7IH1cbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgaWYgKCFvY3RhbCAmJiAhc3RhcnRzV2l0aERvdCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgJiYgbmV4dCA9PT0gMTEwKSB7XG4gICAgICB2YXIgdmFsJDEgPSBzdHJpbmdUb0JpZ0ludCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpO1xuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIGlmIChpc0lkZW50aWZpZXJTdGFydCh0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpKSB7IHRoaXMucmFpc2UodGhpcy5wb3MsIFwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXJcIik7IH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLm51bSwgdmFsJDEpXG4gICAgfVxuICAgIGlmIChvY3RhbCAmJiAvWzg5XS8udGVzdCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpKSB7IG9jdGFsID0gZmFsc2U7IH1cbiAgICBpZiAobmV4dCA9PT0gNDYgJiYgIW9jdGFsKSB7IC8vICcuJ1xuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIHRoaXMucmVhZEludCgxMCk7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICB9XG4gICAgaWYgKChuZXh0ID09PSA2OSB8fCBuZXh0ID09PSAxMDEpICYmICFvY3RhbCkgeyAvLyAnZUUnXG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpO1xuICAgICAgaWYgKG5leHQgPT09IDQzIHx8IG5leHQgPT09IDQ1KSB7ICsrdGhpcy5wb3M7IH0gLy8gJystJ1xuICAgICAgaWYgKHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJJbnZhbGlkIG51bWJlclwiKTsgfVxuICAgIH1cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIklkZW50aWZpZXIgZGlyZWN0bHkgYWZ0ZXIgbnVtYmVyXCIpOyB9XG5cbiAgICB2YXIgdmFsID0gc3RyaW5nVG9OdW1iZXIodGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpLCBvY3RhbCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMubnVtLCB2YWwpXG4gIH07XG5cbiAgLy8gUmVhZCBhIHN0cmluZyB2YWx1ZSwgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaC1lc2NhcGVzLlxuXG4gIHBwJDkucmVhZENvZGVQb2ludCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyksIGNvZGU7XG5cbiAgICBpZiAoY2ggPT09IDEyMykgeyAvLyAneydcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICB2YXIgY29kZVBvcyA9ICsrdGhpcy5wb3M7XG4gICAgICBjb2RlID0gdGhpcy5yZWFkSGV4Q2hhcih0aGlzLmlucHV0LmluZGV4T2YoXCJ9XCIsIHRoaXMucG9zKSAtIHRoaXMucG9zKTtcbiAgICAgICsrdGhpcy5wb3M7XG4gICAgICBpZiAoY29kZSA+IDB4MTBGRkZGKSB7IHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKGNvZGVQb3MsIFwiQ29kZSBwb2ludCBvdXQgb2YgYm91bmRzXCIpOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKDQpO1xuICAgIH1cbiAgICByZXR1cm4gY29kZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvZGVQb2ludFRvU3RyaW5nJDEoY29kZSkge1xuICAgIC8vIFVURi0xNiBEZWNvZGluZ1xuICAgIGlmIChjb2RlIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSB9XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4RDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4REMwMClcbiAgfVxuXG4gIHBwJDkucmVhZFN0cmluZyA9IGZ1bmN0aW9uKHF1b3RlKSB7XG4gICAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSArK3RoaXMucG9zO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHsgYnJlYWsgfVxuICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXFwnXG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgb3V0ICs9IHRoaXMucmVhZEVzY2FwZWRDaGFyKGZhbHNlKTtcbiAgICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzTmV3TGluZShjaCwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDEwKSkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcysrKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5zdHJpbmcsIG91dClcbiAgfTtcblxuICAvLyBSZWFkcyB0ZW1wbGF0ZSBzdHJpbmcgdG9rZW5zLlxuXG4gIHZhciBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUiA9IHt9O1xuXG4gIHBwJDkudHJ5UmVhZFRlbXBsYXRlVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluVGVtcGxhdGVFbGVtZW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWFkVG1wbFRva2VuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyID09PSBJTlZBTElEX1RFTVBMQVRFX0VTQ0FQRV9FUlJPUikge1xuICAgICAgICB0aGlzLnJlYWRJbnZhbGlkVGVtcGxhdGVUb2tlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pblRlbXBsYXRlRWxlbWVudCA9IGZhbHNlO1xuICB9O1xuXG4gIHBwJDkuaW52YWxpZFN0cmluZ1Rva2VuID0gZnVuY3Rpb24ocG9zaXRpb24sIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5pblRlbXBsYXRlRWxlbWVudCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgICAgdGhyb3cgSU5WQUxJRF9URU1QTEFURV9FU0NBUEVfRVJST1JcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yYWlzZShwb3NpdGlvbiwgbWVzc2FnZSk7XG4gICAgfVxuICB9O1xuXG4gIHBwJDkucmVhZFRtcGxUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBcIlwiLCBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7IH1cbiAgICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgICBpZiAoY2ggPT09IDk2IHx8IGNoID09PSAzNiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTIzKSB7IC8vICdgJywgJyR7J1xuICAgICAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMuc3RhcnQgJiYgKHRoaXMudHlwZSA9PT0gdHlwZXMudGVtcGxhdGUgfHwgdGhpcy50eXBlID09PSB0eXBlcy5pbnZhbGlkVGVtcGxhdGUpKSB7XG4gICAgICAgICAgaWYgKGNoID09PSAzNikge1xuICAgICAgICAgICAgdGhpcy5wb3MgKz0gMjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmRvbGxhckJyYWNlTClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzLmJhY2tRdW90ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy50ZW1wbGF0ZSwgb3V0KVxuICAgICAgfVxuICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXFwnXG4gICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICAgb3V0ICs9IHRoaXMucmVhZEVzY2FwZWRDaGFyKHRydWUpO1xuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICB9IGVsc2UgaWYgKGlzTmV3TGluZShjaCkpIHtcbiAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7ICsrdGhpcy5wb3M7IH1cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBvdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgfVxuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBSZWFkcyBhIHRlbXBsYXRlIHRva2VuIHRvIHNlYXJjaCBmb3IgdGhlIGVuZCwgd2l0aG91dCB2YWxpZGF0aW5nIGFueSBlc2NhcGUgc2VxdWVuY2VzXG4gIHBwJDkucmVhZEludmFsaWRUZW1wbGF0ZVRva2VuID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICg7IHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGg7IHRoaXMucG9zKyspIHtcbiAgICAgIHN3aXRjaCAodGhpcy5pbnB1dFt0aGlzLnBvc10pIHtcbiAgICAgIGNhc2UgXCJcXFxcXCI6XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgXCIkXCI6XG4gICAgICAgIGlmICh0aGlzLmlucHV0W3RoaXMucG9zICsgMV0gIT09IFwie1wiKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwiYFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcy5pbnZhbGlkVGVtcGxhdGUsIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpKVxuXG4gICAgICAvLyBubyBkZWZhdWx0XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGVcIik7XG4gIH07XG5cbiAgLy8gVXNlZCB0byByZWFkIGVzY2FwZWQgY2hhcmFjdGVyc1xuXG4gIHBwJDkucmVhZEVzY2FwZWRDaGFyID0gZnVuY3Rpb24oaW5UZW1wbGF0ZSkge1xuICAgIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMucG9zKTtcbiAgICArK3RoaXMucG9zO1xuICAgIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIDExMDogcmV0dXJuIFwiXFxuXCIgLy8gJ24nIC0+ICdcXG4nXG4gICAgY2FzZSAxMTQ6IHJldHVybiBcIlxcclwiIC8vICdyJyAtPiAnXFxyJ1xuICAgIGNhc2UgMTIwOiByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRIZXhDaGFyKDIpKSAvLyAneCdcbiAgICBjYXNlIDExNzogcmV0dXJuIGNvZGVQb2ludFRvU3RyaW5nJDEodGhpcy5yZWFkQ29kZVBvaW50KCkpIC8vICd1J1xuICAgIGNhc2UgMTE2OiByZXR1cm4gXCJcXHRcIiAvLyAndCcgLT4gJ1xcdCdcbiAgICBjYXNlIDk4OiByZXR1cm4gXCJcXGJcIiAvLyAnYicgLT4gJ1xcYidcbiAgICBjYXNlIDExODogcmV0dXJuIFwiXFx1MDAwYlwiIC8vICd2JyAtPiAnXFx1MDAwYidcbiAgICBjYXNlIDEwMjogcmV0dXJuIFwiXFxmXCIgLy8gJ2YnIC0+ICdcXGYnXG4gICAgY2FzZSAxMzogaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7ICsrdGhpcy5wb3M7IH0gLy8gJ1xcclxcbidcbiAgICBjYXNlIDEwOiAvLyAnIFxcbidcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7IHRoaXMubGluZVN0YXJ0ID0gdGhpcy5wb3M7ICsrdGhpcy5jdXJMaW5lOyB9XG4gICAgICByZXR1cm4gXCJcIlxuICAgIGNhc2UgNTY6XG4gICAgY2FzZSA1NzpcbiAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBjb2RlUG9zID0gdGhpcy5wb3MgLSAxO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKFxuICAgICAgICAgIGNvZGVQb3MsXG4gICAgICAgICAgXCJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiB0ZW1wbGF0ZSBzdHJpbmdcIlxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaCA+PSA0OCAmJiBjaCA8PSA1NSkge1xuICAgICAgICB2YXIgb2N0YWxTdHIgPSB0aGlzLmlucHV0LnN1YnN0cih0aGlzLnBvcyAtIDEsIDMpLm1hdGNoKC9eWzAtN10rLylbMF07XG4gICAgICAgIHZhciBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgICAgaWYgKG9jdGFsID4gMjU1KSB7XG4gICAgICAgICAgb2N0YWxTdHIgPSBvY3RhbFN0ci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gb2N0YWxTdHIubGVuZ3RoIC0gMTtcbiAgICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoKG9jdGFsU3RyICE9PSBcIjBcIiB8fCBjaCA9PT0gNTYgfHwgY2ggPT09IDU3KSAmJiAodGhpcy5zdHJpY3QgfHwgaW5UZW1wbGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLmludmFsaWRTdHJpbmdUb2tlbihcbiAgICAgICAgICAgIHRoaXMucG9zIC0gMSAtIG9jdGFsU3RyLmxlbmd0aCxcbiAgICAgICAgICAgIGluVGVtcGxhdGVcbiAgICAgICAgICAgICAgPyBcIk9jdGFsIGxpdGVyYWwgaW4gdGVtcGxhdGUgc3RyaW5nXCJcbiAgICAgICAgICAgICAgOiBcIk9jdGFsIGxpdGVyYWwgaW4gc3RyaWN0IG1vZGVcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2N0YWwpXG4gICAgICB9XG4gICAgICBpZiAoaXNOZXdMaW5lKGNoKSkge1xuICAgICAgICAvLyBVbmljb2RlIG5ldyBsaW5lIGNoYXJhY3RlcnMgYWZ0ZXIgXFwgZ2V0IHJlbW92ZWQgZnJvbSBvdXRwdXQgaW4gYm90aFxuICAgICAgICAvLyB0ZW1wbGF0ZSBsaXRlcmFscyBhbmQgc3RyaW5nc1xuICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpXG4gICAgfVxuICB9O1xuXG4gIC8vIFVzZWQgdG8gcmVhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyAoJ1xceCcsICdcXHUnLCAnXFxVJykuXG5cbiAgcHAkOS5yZWFkSGV4Q2hhciA9IGZ1bmN0aW9uKGxlbikge1xuICAgIHZhciBjb2RlUG9zID0gdGhpcy5wb3M7XG4gICAgdmFyIG4gPSB0aGlzLnJlYWRJbnQoMTYsIGxlbik7XG4gICAgaWYgKG4gPT09IG51bGwpIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oY29kZVBvcywgXCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZVwiKTsgfVxuICAgIHJldHVybiBuXG4gIH07XG5cbiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiBTZXRzIGB0aGlzLmNvbnRhaW5zRXNjYFxuICAvLyB0byB3aGV0aGVyIHRoZSB3b3JkIGNvbnRhaW5lZCBhICdcXHUnIGVzY2FwZS5cbiAgLy9cbiAgLy8gSW5jcmVtZW50YWxseSBhZGRzIG9ubHkgZXNjYXBlZCBjaGFycywgYWRkaW5nIG90aGVyIGNodW5rcyBhcy1pc1xuICAvLyBhcyBhIG1pY3JvLW9wdGltaXphdGlvbi5cblxuICBwcCQ5LnJlYWRXb3JkMSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgICB2YXIgd29yZCA9IFwiXCIsIGZpcnN0ID0gdHJ1ZSwgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgIHZhciBhc3RyYWwgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gdGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpO1xuICAgICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gsIGFzdHJhbCkpIHtcbiAgICAgICAgdGhpcy5wb3MgKz0gY2ggPD0gMHhmZmZmID8gMSA6IDI7XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSA5MikgeyAvLyBcIlxcXCJcbiAgICAgICAgdGhpcy5jb250YWluc0VzYyA9IHRydWU7XG4gICAgICAgIHdvcmQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcyk7XG4gICAgICAgIHZhciBlc2NTdGFydCA9IHRoaXMucG9zO1xuICAgICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpICE9PSAxMTcpIC8vIFwidVwiXG4gICAgICAgICAgeyB0aGlzLmludmFsaWRTdHJpbmdUb2tlbih0aGlzLnBvcywgXCJFeHBlY3RpbmcgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UgXFxcXHVYWFhYXCIpOyB9XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIHZhciBlc2MgPSB0aGlzLnJlYWRDb2RlUG9pbnQoKTtcbiAgICAgICAgaWYgKCEoZmlyc3QgPyBpc0lkZW50aWZpZXJTdGFydCA6IGlzSWRlbnRpZmllckNoYXIpKGVzYywgYXN0cmFsKSlcbiAgICAgICAgICB7IHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKGVzY1N0YXJ0LCBcIkludmFsaWQgVW5pY29kZSBlc2NhcGVcIik7IH1cbiAgICAgICAgd29yZCArPSBjb2RlUG9pbnRUb1N0cmluZyQxKGVzYyk7XG4gICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBmaXJzdCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gd29yZCArIHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpXG4gIH07XG5cbiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQgdG9rZW4uIFdpbGwgY2hlY2sgZm9yIHJlc2VydmVkXG4gIC8vIHdvcmRzIHdoZW4gbmVjZXNzYXJ5LlxuXG4gIHBwJDkucmVhZFdvcmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgd29yZCA9IHRoaXMucmVhZFdvcmQxKCk7XG4gICAgdmFyIHR5cGUgPSB0eXBlcy5uYW1lO1xuICAgIGlmICh0aGlzLmtleXdvcmRzLnRlc3Qod29yZCkpIHtcbiAgICAgIHR5cGUgPSBrZXl3b3JkcyQxW3dvcmRdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlLCB3b3JkKVxuICB9O1xuXG4gIC8vIEFjb3JuIGlzIGEgdGlueSwgZmFzdCBKYXZhU2NyaXB0IHBhcnNlciB3cml0dGVuIGluIEphdmFTY3JpcHQuXG5cbiAgdmFyIHZlcnNpb24gPSBcIjcuNC4xXCI7XG5cbiAgUGFyc2VyLmFjb3JuID0ge1xuICAgIFBhcnNlcjogUGFyc2VyLFxuICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgZGVmYXVsdE9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICAgIFBvc2l0aW9uOiBQb3NpdGlvbixcbiAgICBTb3VyY2VMb2NhdGlvbjogU291cmNlTG9jYXRpb24sXG4gICAgZ2V0TGluZUluZm86IGdldExpbmVJbmZvLFxuICAgIE5vZGU6IE5vZGUsXG4gICAgVG9rZW5UeXBlOiBUb2tlblR5cGUsXG4gICAgdG9rVHlwZXM6IHR5cGVzLFxuICAgIGtleXdvcmRUeXBlczoga2V5d29yZHMkMSxcbiAgICBUb2tDb250ZXh0OiBUb2tDb250ZXh0LFxuICAgIHRva0NvbnRleHRzOiB0eXBlcyQxLFxuICAgIGlzSWRlbnRpZmllckNoYXI6IGlzSWRlbnRpZmllckNoYXIsXG4gICAgaXNJZGVudGlmaWVyU3RhcnQ6IGlzSWRlbnRpZmllclN0YXJ0LFxuICAgIFRva2VuOiBUb2tlbixcbiAgICBpc05ld0xpbmU6IGlzTmV3TGluZSxcbiAgICBsaW5lQnJlYWs6IGxpbmVCcmVhayxcbiAgICBsaW5lQnJlYWtHOiBsaW5lQnJlYWtHLFxuICAgIG5vbkFTQ0lJd2hpdGVzcGFjZTogbm9uQVNDSUl3aGl0ZXNwYWNlXG4gIH07XG5cbiAgLy8gVGhlIG1haW4gZXhwb3J0ZWQgaW50ZXJmYWNlICh1bmRlciBgc2VsZi5hY29ybmAgd2hlbiBpbiB0aGVcbiAgLy8gYnJvd3NlcikgaXMgYSBgcGFyc2VgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb2RlIHN0cmluZyBhbmRcbiAgLy8gcmV0dXJucyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBhcyBzcGVjaWZpZWQgYnkgW01vemlsbGEgcGFyc2VyXG4gIC8vIEFQSV1bYXBpXS5cbiAgLy9cbiAgLy8gW2FwaV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvU3BpZGVyTW9ua2V5L1BhcnNlcl9BUElcblxuICBmdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBQYXJzZXIucGFyc2UoaW5wdXQsIG9wdGlvbnMpXG4gIH1cblxuICAvLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHBhcnNlIGEgc2luZ2xlIGV4cHJlc3Npb24gYXQgYSBnaXZlblxuICAvLyBvZmZzZXQgaW4gYSBzdHJpbmcuIFVzZWZ1bCBmb3IgcGFyc2luZyBtaXhlZC1sYW5ndWFnZSBmb3JtYXRzXG4gIC8vIHRoYXQgZW1iZWQgSmF2YVNjcmlwdCBleHByZXNzaW9ucy5cblxuICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFBhcnNlci5wYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gQWNvcm4gaXMgb3JnYW5pemVkIGFzIGEgdG9rZW5pemVyIGFuZCBhIHJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNlci5cbiAgLy8gVGhlIGB0b2tlbml6ZXJgIGV4cG9ydCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci5cblxuICBmdW5jdGlvbiB0b2tlbml6ZXIoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gUGFyc2VyLnRva2VuaXplcihpbnB1dCwgb3B0aW9ucylcbiAgfVxuXG4gIGV4cG9ydHMuTm9kZSA9IE5vZGU7XG4gIGV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuICBleHBvcnRzLlBvc2l0aW9uID0gUG9zaXRpb247XG4gIGV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjtcbiAgZXhwb3J0cy5Ub2tDb250ZXh0ID0gVG9rQ29udGV4dDtcbiAgZXhwb3J0cy5Ub2tlbiA9IFRva2VuO1xuICBleHBvcnRzLlRva2VuVHlwZSA9IFRva2VuVHlwZTtcbiAgZXhwb3J0cy5kZWZhdWx0T3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICBleHBvcnRzLmdldExpbmVJbmZvID0gZ2V0TGluZUluZm87XG4gIGV4cG9ydHMuaXNJZGVudGlmaWVyQ2hhciA9IGlzSWRlbnRpZmllckNoYXI7XG4gIGV4cG9ydHMuaXNJZGVudGlmaWVyU3RhcnQgPSBpc0lkZW50aWZpZXJTdGFydDtcbiAgZXhwb3J0cy5pc05ld0xpbmUgPSBpc05ld0xpbmU7XG4gIGV4cG9ydHMua2V5d29yZFR5cGVzID0ga2V5d29yZHMkMTtcbiAgZXhwb3J0cy5saW5lQnJlYWsgPSBsaW5lQnJlYWs7XG4gIGV4cG9ydHMubGluZUJyZWFrRyA9IGxpbmVCcmVha0c7XG4gIGV4cG9ydHMubm9uQVNDSUl3aGl0ZXNwYWNlID0gbm9uQVNDSUl3aGl0ZXNwYWNlO1xuICBleHBvcnRzLnBhcnNlID0gcGFyc2U7XG4gIGV4cG9ydHMucGFyc2VFeHByZXNzaW9uQXQgPSBwYXJzZUV4cHJlc3Npb25BdDtcbiAgZXhwb3J0cy50b2tDb250ZXh0cyA9IHR5cGVzJDE7XG4gIGV4cG9ydHMudG9rVHlwZXMgPSB0eXBlcztcbiAgZXhwb3J0cy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7XG4gIGV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsICIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGFjb3JuID0gcmVxdWlyZSgnYWNvcm4nKTtcbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFeHByZXNzaW9uO1xuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICB0aHJvdzogZmFsc2UsXG4gIHN0cmljdDogZmFsc2UsXG4gIGxpbmVDb21tZW50OiBmYWxzZVxufTtcblxuZnVuY3Rpb24gaXNFeHByZXNzaW9uKHNyYywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb2JqZWN0QXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBhY29ybi5QYXJzZXIob3B0aW9ucywgc3JjLCAwKTtcblxuICAgIGlmIChvcHRpb25zLnN0cmljdCkge1xuICAgICAgcGFyc2VyLnN0cmljdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmxpbmVDb21tZW50KSB7XG4gICAgICBwYXJzZXIuc2tpcExpbmVDb21tZW50ID0gZnVuY3Rpb24gKHN0YXJ0U2tpcCkge1xuICAgICAgICB0aGlzLnJhaXNlKHRoaXMucG9zLCAnTGluZSBjb21tZW50cyBub3QgYWxsb3dlZCBpbiBhbiBleHByZXNzaW9uJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAocGFyc2VyLnR5cGUgIT09IGFjb3JuLnRva1R5cGVzLmVvZikge1xuICAgICAgcGFyc2VyLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgaWYgKCFvcHRpb25zLnRocm93KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhyb3cgZXg7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb28gJiYgISh7IF9fcHJvdG9fXzogbnVsbCB9IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIGhhc1Byb3RvID0gcmVxdWlyZSgnaGFzLXByb3RvJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IChcblx0aGFzUHJvdG9cblx0XHQ/IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cdFx0OiBudWxsXG4pO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG5cbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7IC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcblx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHN0cmluZywgMCwgMSk7XG5cdHZhciBsYXN0ID0gJHN0clNsaWNlKHN0cmluZywgLTEpO1xuXHRpZiAoZmlyc3QgPT09ICclJyAmJiBsYXN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgJyk7XG5cdH0gZWxzZSBpZiAobGFzdCA9PT0gJyUnICYmIGZpcnN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgJyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9IFtdO1xuXHQkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpY05hbWUgPSBuYW1lO1xuXHR2YXIgYWxpYXM7XG5cdGlmIChoYXNPd24oTEVHQUNZX0FMSUFTRVMsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0YWxpYXMgPSBMRUdBQ1lfQUxJQVNFU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpbnRyaW5zaWNOYW1lID0gJyUnICsgYWxpYXNbMF0gKyAnJSc7XG5cdH1cblxuXHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0dmFyIHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IG5lZWRzRXZhbCkge1xuXHRcdFx0dmFsdWUgPSBkb0V2YWwoaW50cmluc2ljTmFtZSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRuYW1lOiBpbnRyaW5zaWNOYW1lLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxuXG5cdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0aWYgKCRleGVjKC9eJT9bXiVdKiU/JC8sIG5hbWUpID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZScpO1xuXHR9XG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHQkZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyB2YWx1ZTogMSB9KTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGRlZmluZVByb3BlcnR5XG5cdFx0JGRlZmluZVByb3BlcnR5ID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRpZiAoJGdPUEQgJiYgJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dmFyIGRlc2MgPSAkZ09QRChmdW5jLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHQvLyBvcmlnaW5hbCBsZW5ndGgsIHBsdXMgdGhlIHJlY2VpdmVyLCBtaW51cyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgKGFmdGVyIHRoZSByZWNlaXZlcilcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZnVuYyxcblx0XHRcdFx0J2xlbmd0aCcsXG5cdFx0XHRcdHsgdmFsdWU6IDEgKyAkbWF4KDAsIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSkgfVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZ1bmM7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzVG9TdHJpbmdUYWdTaGFtcygpIHtcblx0cmV0dXJuIGhhc1N5bWJvbHMoKSAmJiAhIVN5bWJvbC50b1N0cmluZ1RhZztcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gcmVxdWlyZSgnaGFzLXRvc3RyaW5ndGFnL3NoYW1zJykoKTtcbnZhciBoYXM7XG52YXIgJGV4ZWM7XG52YXIgaXNSZWdleE1hcmtlcjtcbnZhciBiYWRTdHJpbmdpZmllcjtcblxuaWYgKGhhc1RvU3RyaW5nVGFnKSB7XG5cdGhhcyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eScpO1xuXHQkZXhlYyA9IGNhbGxCb3VuZCgnUmVnRXhwLnByb3RvdHlwZS5leGVjJyk7XG5cdGlzUmVnZXhNYXJrZXIgPSB7fTtcblxuXHR2YXIgdGhyb3dSZWdleE1hcmtlciA9IGZ1bmN0aW9uICgpIHtcblx0XHR0aHJvdyBpc1JlZ2V4TWFya2VyO1xuXHR9O1xuXHRiYWRTdHJpbmdpZmllciA9IHtcblx0XHR0b1N0cmluZzogdGhyb3dSZWdleE1hcmtlcixcblx0XHR2YWx1ZU9mOiB0aHJvd1JlZ2V4TWFya2VyXG5cdH07XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgPT09ICdzeW1ib2wnKSB7XG5cdFx0YmFkU3RyaW5naWZpZXJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IHRocm93UmVnZXhNYXJrZXI7XG5cdH1cbn1cblxudmFyICR0b1N0cmluZyA9IGNhbGxCb3VuZCgnT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZycpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcblxubW9kdWxlLmV4cG9ydHMgPSBoYXNUb1N0cmluZ1RhZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblx0PyBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKHZhbHVlLCAnbGFzdEluZGV4Jyk7XG5cdFx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRcdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdCRleGVjKHZhbHVlLCBiYWRTdHJpbmdpZmllcik7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGUgPT09IGlzUmVnZXhNYXJrZXI7XG5cdFx0fVxuXHR9XG5cdDogZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRcdC8vIEluIG9sZGVyIGJyb3dzZXJzLCB0eXBlb2YgcmVnZXggaW5jb3JyZWN0bHkgcmV0dXJucyAnZnVuY3Rpb24nXG5cdFx0aWYgKCF2YWx1ZSB8fCAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICR0b1N0cmluZyh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqSXNSZWdleCA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG5cbmV4cG9ydHMgPSAobW9kdWxlLmV4cG9ydHMgPSBwYXJzZSk7XG5cbnZhciBUT0tFTl9UWVBFUyA9IGV4cG9ydHMuVE9LRU5fVFlQRVMgPSB7XG4gIExJTkVfQ09NTUVOVDogJy8vJyxcbiAgQkxPQ0tfQ09NTUVOVDogJy8qKi8nLFxuICBTSU5HTEVfUVVPVEU6ICdcXCcnLFxuICBET1VCTEVfUVVPVEU6ICdcIicsXG4gIFRFTVBMQVRFX1FVT1RFOiAnYCcsXG4gIFJFR0VYUDogJy8vZydcbn1cblxudmFyIEJSQUNLRVRTID0gZXhwb3J0cy5CUkFDS0VUUyA9IHtcbiAgJygnOiAnKScsXG4gICd7JzogJ30nLFxuICAnWyc6ICddJ1xufTtcbnZhciBCUkFDS0VUU19SRVZFUlNFRCA9IHtcbiAgJyknOiAnKCcsXG4gICd9JzogJ3snLFxuICAnXSc6ICdbJ1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2Uoc3JjLCBzdGF0ZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgc3RhdGUgPSBzdGF0ZSB8fCBleHBvcnRzLmRlZmF1bHRTdGF0ZSgpO1xuICB2YXIgc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZCB8fCBzcmMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBzdGFydDtcbiAgd2hpbGUgKGluZGV4IDwgZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlQ2hhcihzcmNbaW5kZXhdLCBzdGF0ZSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGV4LmluZGV4ID0gaW5kZXg7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydHMucGFyc2VVbnRpbCA9IHBhcnNlVW50aWw7XG5mdW5jdGlvbiBwYXJzZVVudGlsKHNyYywgZGVsaW1pdGVyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHZhciBpbmRleCA9IHN0YXJ0O1xuICB2YXIgc3RhdGUgPSBleHBvcnRzLmRlZmF1bHRTdGF0ZSgpO1xuICB3aGlsZSAoaW5kZXggPCBzcmMubGVuZ3RoKSB7XG4gICAgaWYgKChvcHRpb25zLmlnbm9yZU5lc3RpbmcgfHwgIXN0YXRlLmlzTmVzdGluZyhvcHRpb25zKSkgJiYgbWF0Y2hlcyhzcmMsIGRlbGltaXRlciwgaW5kZXgpKSB7XG4gICAgICB2YXIgZW5kID0gaW5kZXg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgIGVuZDogZW5kLFxuICAgICAgICBzcmM6IHNyYy5zdWJzdHJpbmcoc3RhcnQsIGVuZClcbiAgICAgIH07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBwYXJzZUNoYXIoc3JjW2luZGV4XSwgc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBleC5pbmRleCA9IGluZGV4O1xuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICAgIGluZGV4Kys7XG4gIH1cbiAgdmFyIGVyciA9IG5ldyBFcnJvcignVGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdhcyByZWFjaGVkIHdpdGggbm8gY2xvc2luZyBicmFja2V0IGZvdW5kLicpO1xuICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCc7XG4gIGVyci5pbmRleCA9IGluZGV4O1xuICB0aHJvdyBlcnI7XG59XG5cbmV4cG9ydHMucGFyc2VDaGFyID0gcGFyc2VDaGFyO1xuZnVuY3Rpb24gcGFyc2VDaGFyKGNoYXJhY3Rlciwgc3RhdGUpIHtcbiAgaWYgKGNoYXJhY3Rlci5sZW5ndGggIT09IDEpIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdDaGFyYWN0ZXIgbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMScpO1xuICAgIGVyci5uYW1lID0gJ0ludmFsaWRBcmd1bWVudEVycm9yJztcbiAgICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOkNIQVJfTEVOR1RIX05PVF9PTkUnO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBzdGF0ZSA9IHN0YXRlIHx8IGV4cG9ydHMuZGVmYXVsdFN0YXRlKCk7XG4gIHN0YXRlLnNyYyArPSBjaGFyYWN0ZXI7XG4gIHZhciB3YXNDb21tZW50ID0gc3RhdGUuaXNDb21tZW50KCk7XG4gIHZhciBsYXN0Q2hhciA9IHN0YXRlLmhpc3RvcnkgPyBzdGF0ZS5oaXN0b3J5WzBdIDogJyc7XG5cblxuICBpZiAoc3RhdGUucmVnZXhwU3RhcnQpIHtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnLycgfHwgY2hhcmFjdGVyID09ICcqJykge1xuICAgICAgc3RhdGUuc3RhY2sucG9wKCk7XG4gICAgfVxuICAgIHN0YXRlLnJlZ2V4cFN0YXJ0ID0gZmFsc2U7XG4gIH1cbiAgc3dpdGNoIChzdGF0ZS5jdXJyZW50KCkpIHtcbiAgICBjYXNlIFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVDpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBUT0tFTl9UWVBFUy5CTE9DS19DT01NRU5UOlxuICAgICAgaWYgKHN0YXRlLmxhc3RDaGFyID09PSAnKicgJiYgY2hhcmFjdGVyID09PSAnLycpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucG9wKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlNJTkdMRV9RVU9URTpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXCcnICYmICFzdGF0ZS5lc2NhcGVkKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVE9LRU5fVFlQRVMuRE9VQkxFX1FVT1RFOlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1wiJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlRFTVBMQVRFX1FVT1RFOlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ2AnICYmICFzdGF0ZS5lc2NhcGVkKSB7XG4gICAgICAgIHN0YXRlLnN0YWNrLnBvcCgpO1xuICAgICAgICBzdGF0ZS5oYXNEb2xsYXIgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLmhhc0RvbGxhciA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICckJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5oYXNEb2xsYXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICd7JyAmJiBzdGF0ZS5oYXNEb2xsYXIpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChCUkFDS0VUU1tjaGFyYWN0ZXJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuaGFzRG9sbGFyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRPS0VOX1RZUEVTLlJFR0VYUDpcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICcvJyAmJiAhc3RhdGUuZXNjYXBlZCkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgIXN0YXRlLmVzY2FwZWQpIHtcbiAgICAgICAgc3RhdGUuZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5lc2NhcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKGNoYXJhY3RlciBpbiBCUkFDS0VUUykge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKEJSQUNLRVRTW2NoYXJhY3Rlcl0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgaW4gQlJBQ0tFVFNfUkVWRVJTRUQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmN1cnJlbnQoKSAhPT0gY2hhcmFjdGVyKSB7XG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBTeW50YXhFcnJvcignTWlzbWF0Y2hlZCBCcmFja2V0OiAnICsgY2hhcmFjdGVyKTtcbiAgICAgICAgICBlcnIuY29kZSA9ICdDSEFSQUNURVJfUEFSU0VSOk1JU01BVENIRURfQlJBQ0tFVCc7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9O1xuICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAobGFzdENoYXIgPT09ICcvJyAmJiBjaGFyYWN0ZXIgPT09ICcvJykge1xuICAgICAgICAvLyBEb24ndCBpbmNsdWRlIGNvbW1lbnRzIGluIGhpc3RvcnlcbiAgICAgICAgc3RhdGUuaGlzdG9yeSA9IHN0YXRlLmhpc3Rvcnkuc3Vic3RyKDEpO1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVCk7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RDaGFyID09PSAnLycgJiYgY2hhcmFjdGVyID09PSAnKicpIHtcbiAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBjb21tZW50IGluIGhpc3RvcnlcbiAgICAgICAgc3RhdGUuaGlzdG9yeSA9IHN0YXRlLmhpc3Rvcnkuc3Vic3RyKDEpO1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLkJMT0NLX0NPTU1FTlQpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcvJyAmJiBpc1JlZ2V4cChzdGF0ZS5oaXN0b3J5KSkge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLlJFR0VYUCk7XG4gICAgICAgIC8vIE4uQi4gaWYgdGhlIG5leHQgY2hhcmFjdGVyIHR1cm5zIG91dCB0byBiZSBhIGAqYCBvciBhIGAvYFxuICAgICAgICAvLyAgICAgIHRoZW4gdGhpcyBpc24ndCBhY3R1YWxseSBhIHJlZ2V4cFxuICAgICAgICBzdGF0ZS5yZWdleHBTdGFydCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJ1xcJycpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChUT0tFTl9UWVBFUy5TSU5HTEVfUVVPVEUpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgICAgc3RhdGUuc3RhY2sucHVzaChUT0tFTl9UWVBFUy5ET1VCTEVfUVVPVEUpO1xuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICdgJykge1xuICAgICAgICBzdGF0ZS5zdGFjay5wdXNoKFRPS0VOX1RZUEVTLlRFTVBMQVRFX1FVT1RFKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmICghc3RhdGUuaXNDb21tZW50KCkgJiYgIXdhc0NvbW1lbnQpIHtcbiAgICBzdGF0ZS5oaXN0b3J5ID0gY2hhcmFjdGVyICsgc3RhdGUuaGlzdG9yeTtcbiAgfVxuICBzdGF0ZS5sYXN0Q2hhciA9IGNoYXJhY3RlcjsgLy8gc3RvcmUgbGFzdCBjaGFyYWN0ZXIgZm9yIGVuZGluZyBibG9jayBjb21tZW50c1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydHMuZGVmYXVsdFN0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFN0YXRlKCkgfTtcbmZ1bmN0aW9uIFN0YXRlKCkge1xuICB0aGlzLnN0YWNrID0gW107XG5cbiAgdGhpcy5yZWdleHBTdGFydCA9IGZhbHNlO1xuICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcbiAgdGhpcy5oYXNEb2xsYXIgPSBmYWxzZTtcblxuICB0aGlzLnNyYyA9ICcnO1xuICB0aGlzLmhpc3RvcnkgPSAnJ1xuICB0aGlzLmxhc3RDaGFyID0gJydcbn1cblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xufTtcblN0YXRlLnByb3RvdHlwZS5pc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIChcbiAgICB0aGlzLmN1cnJlbnQoKSA9PT0gVE9LRU5fVFlQRVMuU0lOR0xFX1FVT1RFIHx8XG4gICAgdGhpcy5jdXJyZW50KCkgPT09IFRPS0VOX1RZUEVTLkRPVUJMRV9RVU9URSB8fFxuICAgIHRoaXMuY3VycmVudCgpID09PSBUT0tFTl9UWVBFUy5URU1QTEFURV9RVU9URVxuICApO1xufVxuU3RhdGUucHJvdG90eXBlLmlzQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VycmVudCgpID09PSBUT0tFTl9UWVBFUy5MSU5FX0NPTU1FTlQgfHwgdGhpcy5jdXJyZW50KCkgPT09IFRPS0VOX1RZUEVTLkJMT0NLX0NPTU1FTlQ7XG59XG5TdGF0ZS5wcm90b3R5cGUuaXNOZXN0aW5nID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgaWYgKFxuICAgIG9wdHMgJiYgb3B0cy5pZ25vcmVMaW5lQ29tbWVudCAmJlxuICAgIHRoaXMuc3RhY2subGVuZ3RoID09PSAxICYmIHRoaXMuc3RhY2tbMF0gPT09IFRPS0VOX1RZUEVTLkxJTkVfQ09NTUVOVFxuICApIHtcbiAgICAvLyBpZiB3ZSBhcmUgb25seSBpbnNpZGUgYSBsaW5lIGNvbW1lbnQsIGFuZCBsaW5lIGNvbW1lbnRzIGFyZSBpZ25vcmVkXG4gICAgLy8gZG9uJ3QgY291bnQgaXQgYXMgbmVzdGluZ1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gISF0aGlzLnN0YWNrLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyhzdHIsIG1hdGNoZXIsIGkpIHtcbiAgaWYgKG9iaklzUmVnZXgobWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci50ZXN0KHN0ci5zdWJzdHIoaSB8fCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoaSB8fCAwLCBtYXRjaGVyLmxlbmd0aCkgPT09IG1hdGNoZXI7XG4gIH1cbn1cblxuZXhwb3J0cy5pc1B1bmN0dWF0b3IgPSBpc1B1bmN0dWF0b3JcbmZ1bmN0aW9uIGlzUHVuY3R1YXRvcihjKSB7XG4gIGlmICghYykgcmV0dXJuIHRydWU7IC8vIHRoZSBzdGFydCBvZiBhIHN0cmluZyBpcyBhIHB1bmN0dWF0b3JcbiAgdmFyIGNvZGUgPSBjLmNoYXJDb2RlQXQoMClcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDQ2OiAgIC8vIC4gZG90XG4gICAgY2FzZSA0MDogICAvLyAoIG9wZW4gYnJhY2tldFxuICAgIGNhc2UgNDE6ICAgLy8gKSBjbG9zZSBicmFja2V0XG4gICAgY2FzZSA1OTogICAvLyA7IHNlbWljb2xvblxuICAgIGNhc2UgNDQ6ICAgLy8gLCBjb21tYVxuICAgIGNhc2UgMTIzOiAgLy8geyBvcGVuIGN1cmx5IGJyYWNlXG4gICAgY2FzZSAxMjU6ICAvLyB9IGNsb3NlIGN1cmx5IGJyYWNlXG4gICAgY2FzZSA5MTogICAvLyBbXG4gICAgY2FzZSA5MzogICAvLyBdXG4gICAgY2FzZSA1ODogICAvLyA6XG4gICAgY2FzZSA2MzogICAvLyA/XG4gICAgY2FzZSAxMjY6ICAvLyB+XG4gICAgY2FzZSAzNzogICAvLyAlXG4gICAgY2FzZSAzODogICAvLyAmXG4gICAgY2FzZSA0MjogICAvLyAqOlxuICAgIGNhc2UgNDM6ICAgLy8gK1xuICAgIGNhc2UgNDU6ICAgLy8gLVxuICAgIGNhc2UgNDc6ICAgLy8gL1xuICAgIGNhc2UgNjA6ICAgLy8gPFxuICAgIGNhc2UgNjI6ICAgLy8gPlxuICAgIGNhc2UgOTQ6ICAgLy8gXlxuICAgIGNhc2UgMTI0OiAgLy8gfFxuICAgIGNhc2UgMzM6ICAgLy8gIVxuICAgIGNhc2UgNjE6ICAgLy8gPVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnRzLmlzS2V5d29yZCA9IGlzS2V5d29yZFxuZnVuY3Rpb24gaXNLZXl3b3JkKGlkKSB7XG4gIHJldHVybiAoaWQgPT09ICdpZicpIHx8IChpZCA9PT0gJ2luJykgfHwgKGlkID09PSAnZG8nKSB8fCAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fFxuICAgICAgICAgKGlkID09PSAndHJ5JykgfHwgKGlkID09PSAnbGV0JykgfHwgKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgIChpZCA9PT0gJ3ZvaWQnKSB8fCAoaWQgPT09ICd3aXRoJykgfHwgKGlkID09PSAnZW51bScpIHx8IChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAoaWQgPT09ICd0aHJvdycpIHx8IChpZCA9PT0gJ2NvbnN0JykgfHwgKGlkID09PSAneWllbGQnKSB8fCAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJykgfHxcbiAgICAgICAgIChpZCA9PT0gJ3JldHVybicpIHx8IChpZCA9PT0gJ3R5cGVvZicpIHx8IChpZCA9PT0gJ2RlbGV0ZScpIHx8IChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8XG4gICAgICAgICAoaWQgPT09ICdpbXBvcnQnKSB8fCAoaWQgPT09ICdkZWZhdWx0JykgfHwgKGlkID09PSAnZmluYWxseScpIHx8IChpZCA9PT0gJ2V4dGVuZHMnKSB8fCAoaWQgPT09ICdmdW5jdGlvbicpIHx8XG4gICAgICAgICAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJykgfHwgKGlkID09PSAncGFja2FnZScpIHx8IChpZCA9PT0gJ3ByaXZhdGUnKSB8fCAoaWQgPT09ICdpbnRlcmZhY2UnKSB8fFxuICAgICAgICAgKGlkID09PSAnaW5zdGFuY2VvZicpIHx8IChpZCA9PT0gJ2ltcGxlbWVudHMnKSB8fCAoaWQgPT09ICdwcm90ZWN0ZWQnKSB8fCAoaWQgPT09ICdwdWJsaWMnKSB8fCAoaWQgPT09ICdzdGF0aWMnKTtcbn1cblxuZnVuY3Rpb24gaXNSZWdleHAoaGlzdG9yeSkge1xuICAvL2NvdWxkIGJlIHN0YXJ0IG9mIHJlZ2V4cCBvciBkaXZpZGUgc2lnblxuXG4gIGhpc3RvcnkgPSBoaXN0b3J5LnJlcGxhY2UoL15cXHMqLywgJycpO1xuXG4gIC8vdW5sZXNzIGl0cyBhbiBgaWZgLCBgd2hpbGVgLCBgZm9yYCBvciBgd2l0aGAgaXQncyBhIGRpdmlkZSwgc28gd2UgYXNzdW1lIGl0J3MgYSBkaXZpZGVcbiAgaWYgKGhpc3RvcnlbMF0gPT09ICcpJykgcmV0dXJuIGZhbHNlO1xuICAvL3VubGVzcyBpdCdzIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiwgaXQncyBhIHJlZ2V4cCwgc28gd2UgYXNzdW1lIGl0J3MgYSByZWdleHBcbiAgaWYgKGhpc3RvcnlbMF0gPT09ICd9JykgcmV0dXJuIHRydWU7XG4gIC8vYW55IHB1bmN0dWF0aW9uIG1lYW5zIGl0J3MgYSByZWdleHBcbiAgaWYgKGlzUHVuY3R1YXRvcihoaXN0b3J5WzBdKSkgcmV0dXJuIHRydWU7XG4gIC8vaWYgdGhlIGxhc3QgdGhpbmcgd2FzIGEga2V5d29yZCB0aGVuIGl0IG11c3QgYmUgYSByZWdleHAgKGUuZy4gYHR5cGVvZiAvZm9vL2ApXG4gIGlmICgvXlxcdytcXGIvLnRlc3QoaGlzdG9yeSkgJiYgaXNLZXl3b3JkKC9eXFx3K1xcYi8uZXhlYyhoaXN0b3J5KVswXS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpKSkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBtYWtlRXJyb3I7XG5mdW5jdGlvbiBtYWtlRXJyb3IoY29kZSwgbWVzc2FnZSwgb3B0aW9ucykge1xuICB2YXIgbGluZSA9IG9wdGlvbnMubGluZTtcbiAgdmFyIGNvbHVtbiA9IG9wdGlvbnMuY29sdW1uO1xuICB2YXIgZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lO1xuICB2YXIgc3JjID0gb3B0aW9ucy5zcmM7XG4gIHZhciBmdWxsTWVzc2FnZTtcbiAgdmFyIGxvY2F0aW9uID0gbGluZSArIChjb2x1bW4gPyAnOicgKyBjb2x1bW4gOiAnJyk7XG4gIGlmIChzcmMgJiYgbGluZSA+PSAxICYmIGxpbmUgPD0gc3JjLnNwbGl0KCdcXG4nKS5sZW5ndGgpIHtcbiAgICB2YXIgbGluZXMgPSBzcmMuc3BsaXQoJ1xcbicpO1xuICAgIHZhciBzdGFydCA9IE1hdGgubWF4KGxpbmUgLSAzLCAwKTtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBsaW5lICsgMyk7XG4gICAgLy8gRXJyb3IgY29udGV4dFxuICAgIHZhciBjb250ZXh0ID0gbGluZXNcbiAgICAgIC5zbGljZShzdGFydCwgZW5kKVxuICAgICAgLm1hcChmdW5jdGlvbih0ZXh0LCBpKSB7XG4gICAgICAgIHZhciBjdXJyID0gaSArIHN0YXJ0ICsgMTtcbiAgICAgICAgdmFyIHByZWFtYmxlID0gKGN1cnIgPT0gbGluZSA/ICcgID4gJyA6ICcgICAgJykgKyBjdXJyICsgJ3wgJztcbiAgICAgICAgdmFyIG91dCA9IHByZWFtYmxlICsgdGV4dDtcbiAgICAgICAgaWYgKGN1cnIgPT09IGxpbmUgJiYgY29sdW1uID4gMCkge1xuICAgICAgICAgIG91dCArPSAnXFxuJztcbiAgICAgICAgICBvdXQgKz0gQXJyYXkocHJlYW1ibGUubGVuZ3RoICsgY29sdW1uKS5qb2luKCctJykgKyAnXic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgZnVsbE1lc3NhZ2UgPVxuICAgICAgKGZpbGVuYW1lIHx8ICdQdWcnKSArICc6JyArIGxvY2F0aW9uICsgJ1xcbicgKyBjb250ZXh0ICsgJ1xcblxcbicgKyBtZXNzYWdlO1xuICB9IGVsc2Uge1xuICAgIGZ1bGxNZXNzYWdlID0gKGZpbGVuYW1lIHx8ICdQdWcnKSArICc6JyArIGxvY2F0aW9uICsgJ1xcblxcbicgKyBtZXNzYWdlO1xuICB9XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoZnVsbE1lc3NhZ2UpO1xuICBlcnIuY29kZSA9ICdQVUc6JyArIGNvZGU7XG4gIGVyci5tc2cgPSBtZXNzYWdlO1xuICBlcnIubGluZSA9IGxpbmU7XG4gIGVyci5jb2x1bW4gPSBjb2x1bW47XG4gIGVyci5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICBlcnIuc3JjID0gc3JjO1xuICBlcnIudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1zZzogdGhpcy5tc2csXG4gICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGVycjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBpc0V4cHJlc3Npb24gPSByZXF1aXJlKCdpcy1leHByZXNzaW9uJyk7XG52YXIgY2hhcmFjdGVyUGFyc2VyID0gcmVxdWlyZSgnY2hhcmFjdGVyLXBhcnNlcicpO1xudmFyIGVycm9yID0gcmVxdWlyZSgncHVnLWVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGV4O1xubW9kdWxlLmV4cG9ydHMuTGV4ZXIgPSBMZXhlcjtcbmZ1bmN0aW9uIGxleChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIGxleGVyID0gbmV3IExleGVyKHN0ciwgb3B0aW9ucyk7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxleGVyLmdldFRva2VucygpKSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgTGV4ZXJgIHdpdGggdGhlIGdpdmVuIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gTGV4ZXIoc3RyLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnRXhwZWN0ZWQgc291cmNlIGNvZGUgdG8gYmUgYSBzdHJpbmcgYnV0IGdvdCBcIicgKyB0eXBlb2Ygc3RyICsgJ1wiJ1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdFeHBlY3RlZCBcIm9wdGlvbnNcIiB0byBiZSBhbiBvYmplY3QgYnV0IGdvdCBcIicgKyB0eXBlb2Ygb3B0aW9ucyArICdcIidcbiAgICApO1xuICB9XG4gIC8vU3RyaXAgYW55IFVURi04IEJPTSBvZmYgb2YgdGhlIHN0YXJ0IG9mIGBzdHJgLCBpZiBpdCBleGlzdHMuXG4gIHN0ciA9IHN0ci5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgdGhpcy5pbnB1dCA9IHN0ci5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcbiAgdGhpcy5vcmlnaW5hbElucHV0ID0gdGhpcy5pbnB1dDtcbiAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIHRoaXMuaW50ZXJwb2xhdGVkID0gb3B0aW9ucy5pbnRlcnBvbGF0ZWQgfHwgZmFsc2U7XG4gIHRoaXMubGluZW5vID0gb3B0aW9ucy5zdGFydGluZ0xpbmUgfHwgMTtcbiAgdGhpcy5jb2xubyA9IG9wdGlvbnMuc3RhcnRpbmdDb2x1bW4gfHwgMTtcbiAgdGhpcy5wbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zIHx8IFtdO1xuICB0aGlzLmluZGVudFN0YWNrID0gWzBdO1xuICB0aGlzLmluZGVudFJlID0gbnVsbDtcbiAgLy8gSWYgI3t9LCAhe30gb3IgI1tdIHN5bnRheCBpcyBhbGxvd2VkIHdoZW4gYWRkaW5nIHRleHRcbiAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCA9IHRydWU7XG4gIHRoaXMud2hpdGVzcGFjZVJlID0gL1sgXFxuXFx0XS87XG5cbiAgdGhpcy50b2tlbnMgPSBbXTtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIExleGVyIHByb3RvdHlwZS5cbiAqL1xuXG5MZXhlci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBMZXhlcixcblxuICBlcnJvcjogZnVuY3Rpb24oY29kZSwgbWVzc2FnZSkge1xuICAgIHZhciBlcnIgPSBlcnJvcihjb2RlLCBtZXNzYWdlLCB7XG4gICAgICBsaW5lOiB0aGlzLmxpbmVubyxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2xubyxcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgc3JjOiB0aGlzLm9yaWdpbmFsSW5wdXQsXG4gICAgfSk7XG4gICAgdGhyb3cgZXJyO1xuICB9LFxuXG4gIGFzc2VydDogZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgICBpZiAoIXZhbHVlKSB0aGlzLmVycm9yKCdBU1NFUlRfRkFJTEVEJywgbWVzc2FnZSk7XG4gIH0sXG5cbiAgaXNFeHByZXNzaW9uOiBmdW5jdGlvbihleHApIHtcbiAgICByZXR1cm4gaXNFeHByZXNzaW9uKGV4cCwge1xuICAgICAgdGhyb3c6IHRydWUsXG4gICAgfSk7XG4gIH0sXG5cbiAgYXNzZXJ0RXhwcmVzc2lvbjogZnVuY3Rpb24oZXhwLCBub1Rocm93KSB7XG4gICAgLy90aGlzIHZlcmlmaWVzIHRoYXQgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaXMgdmFsaWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignaXNFeHByZXNzaW9uJywgZXhwKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAobm9UaHJvdykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBub3QgY29taW5nIGZyb20gYWNvcm5cbiAgICAgIGlmICghZXgubG9jKSB0aHJvdyBleDtcblxuICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKGV4LmxvYy5saW5lIC0gMSk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihleC5sb2MuY29sdW1uKTtcbiAgICAgIHZhciBtc2cgPVxuICAgICAgICAnU3ludGF4IEVycm9yOiAnICsgZXgubWVzc2FnZS5yZXBsYWNlKC8gXFwoWzAtOV0rOlswLTldK1xcKSQvLCAnJyk7XG4gICAgICB0aGlzLmVycm9yKCdTWU5UQVhfRVJST1InLCBtc2cpO1xuICAgIH1cbiAgfSxcblxuICBhc3NlcnROZXN0aW5nQ29ycmVjdDogZnVuY3Rpb24oZXhwKSB7XG4gICAgLy90aGlzIHZlcmlmaWVzIHRoYXQgY29kZSBpcyBwcm9wZXJseSBuZXN0ZWQsIGJ1dCBhbGxvd3NcbiAgICAvL2ludmFsaWQgSmF2YVNjcmlwdCBzdWNoIGFzIHRoZSBjb250ZW50cyBvZiBgYXR0cmlidXRlc2BcbiAgICB2YXIgcmVzID0gY2hhcmFjdGVyUGFyc2VyKGV4cCk7XG4gICAgaWYgKHJlcy5pc05lc3RpbmcoKSkge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ0lOQ09SUkVDVF9ORVNUSU5HJyxcbiAgICAgICAgJ05lc3RpbmcgbXVzdCBtYXRjaCBvbiBleHByZXNzaW9uIGAnICsgZXhwICsgJ2AnXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgdG9rZW4gd2l0aCB0aGUgZ2l2ZW4gYHR5cGVgIGFuZCBgdmFsYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICB0b2s6IGZ1bmN0aW9uKHR5cGUsIHZhbCkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbG9jOiB7XG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgbGluZTogdGhpcy5saW5lbm8sXG4gICAgICAgICAgY29sdW1uOiB0aGlzLmNvbG5vLFxuICAgICAgICB9LFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgcmVzLnZhbCA9IHZhbDtcblxuICAgIHJldHVybiByZXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4ncyBgbG9jLmVuZGAgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0b2tcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIHRva0VuZDogZnVuY3Rpb24odG9rKSB7XG4gICAgdG9rLmxvYy5lbmQgPSB7XG4gICAgICBsaW5lOiB0aGlzLmxpbmVubyxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2xubyxcbiAgICB9O1xuICAgIHJldHVybiB0b2s7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBgdGhpcy5saW5lbm9gIGFuZCByZXNldCBgdGhpcy5jb2xub2AuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmNyZW1lbnRcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGluY3JlbWVudExpbmU6IGZ1bmN0aW9uKGluY3JlbWVudCkge1xuICAgIHRoaXMubGluZW5vICs9IGluY3JlbWVudDtcbiAgICBpZiAoaW5jcmVtZW50KSB0aGlzLmNvbG5vID0gMTtcbiAgfSxcblxuICAvKipcbiAgICogSW5jcmVtZW50IGB0aGlzLmNvbG5vYC5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluY3JlbWVudFxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgaW5jcmVtZW50Q29sdW1uOiBmdW5jdGlvbihpbmNyZW1lbnQpIHtcbiAgICB0aGlzLmNvbG5vICs9IGluY3JlbWVudDtcbiAgfSxcblxuICAvKipcbiAgICogQ29uc3VtZSB0aGUgZ2l2ZW4gYGxlbmAgb2YgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGNvbnN1bWU6IGZ1bmN0aW9uKGxlbikge1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cihsZW4pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBgdHlwZWAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4cGAuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgc2NhbjogZnVuY3Rpb24ocmVnZXhwLCB0eXBlKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSByZWdleHAuZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGg7XG4gICAgICB2YXIgdmFsID0gY2FwdHVyZXNbMV07XG4gICAgICB2YXIgZGlmZiA9IGxlbiAtICh2YWwgPyB2YWwubGVuZ3RoIDogMCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2sodHlwZSwgdmFsKTtcbiAgICAgIHRoaXMuY29uc3VtZShsZW4pO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oZGlmZik7XG4gICAgICByZXR1cm4gdG9rO1xuICAgIH1cbiAgfSxcbiAgc2NhbkVuZE9mTGluZTogZnVuY3Rpb24ocmVnZXhwLCB0eXBlKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSByZWdleHAuZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHZhciB3aGl0ZXNwYWNlTGVuZ3RoID0gMDtcbiAgICAgIHZhciB3aGl0ZXNwYWNlO1xuICAgICAgdmFyIHRvaztcbiAgICAgIGlmICgod2hpdGVzcGFjZSA9IC9eKFsgXSspKFteIF0qKS8uZXhlYyhjYXB0dXJlc1swXSkpKSB7XG4gICAgICAgIHdoaXRlc3BhY2VMZW5ndGggPSB3aGl0ZXNwYWNlWzFdLmxlbmd0aDtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4od2hpdGVzcGFjZUxlbmd0aCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3SW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cihjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgaWYgKG5ld0lucHV0WzBdID09PSAnOicpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ld0lucHV0O1xuICAgICAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCBjYXB0dXJlc1sxXSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIHdoaXRlc3BhY2VMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgfVxuICAgICAgaWYgKC9eWyBcXHRdKihcXG58JCkvLnRlc3QobmV3SW5wdXQpKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBuZXdJbnB1dC5zdWJzdHIoL15bIFxcdF0qLy5leGVjKG5ld0lucHV0KVswXS5sZW5ndGgpO1xuICAgICAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCBjYXB0dXJlc1sxXSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIHdoaXRlc3BhY2VMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleE9mIGAoYCBvciBge2Agb3IgYFtgIC8gYClgIG9yIGB9YCBvciBgXWAgZGVsaW1pdGVycy5cbiAgICpcbiAgICogTWFrZSBzdXJlIHRoYXQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGNvbG5vIGlzIGF0IHRoZSBjaGFyYWN0ZXJcbiAgICogaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBiZWdpbm5pbmcuXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGJyYWNrZXRFeHByZXNzaW9uOiBmdW5jdGlvbihza2lwKSB7XG4gICAgc2tpcCA9IHNraXAgfHwgMDtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0W3NraXBdO1xuICAgIGFzc2VydChcbiAgICAgIHN0YXJ0ID09PSAnKCcgfHwgc3RhcnQgPT09ICd7JyB8fCBzdGFydCA9PT0gJ1snLFxuICAgICAgJ1RoZSBzdGFydCBjaGFyYWN0ZXIgc2hvdWxkIGJlIFwiKFwiLCBcIntcIiBvciBcIltcIidcbiAgICApO1xuICAgIHZhciBlbmQgPSBjaGFyYWN0ZXJQYXJzZXIuQlJBQ0tFVFNbc3RhcnRdO1xuICAgIHZhciByYW5nZTtcbiAgICB0cnkge1xuICAgICAgcmFuZ2UgPSBjaGFyYWN0ZXJQYXJzZXIucGFyc2VVbnRpbCh0aGlzLmlucHV0LCBlbmQsIHtzdGFydDogc2tpcCArIDF9KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4LmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGlkeCA9IGV4LmluZGV4O1xuICAgICAgICAvLyBzdGFydGluZyBmcm9tIHRoaXMuaW5wdXRbc2tpcF1cbiAgICAgICAgdmFyIHRtcCA9IHRoaXMuaW5wdXQuc3Vic3RyKHNraXApLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICAvLyBzdGFydGluZyBmcm9tIHRoaXMuaW5wdXRbMF1cbiAgICAgICAgdmFyIG5leHROZXdsaW5lID0gdG1wICsgc2tpcDtcbiAgICAgICAgdmFyIHB0ciA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPiBuZXh0TmV3bGluZSAmJiB0bXAgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKDEpO1xuICAgICAgICAgIGlkeCAtPSBuZXh0TmV3bGluZSArIDE7XG4gICAgICAgICAgcHRyICs9IG5leHROZXdsaW5lICsgMTtcbiAgICAgICAgICB0bXAgPSBuZXh0TmV3bGluZSA9IHRoaXMuaW5wdXQuc3Vic3RyKHB0cikuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbihpZHgpO1xuICAgICAgfVxuICAgICAgaWYgKGV4LmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCcpIHtcbiAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAnTk9fRU5EX0JSQUNLRVQnLFxuICAgICAgICAgICdUaGUgZW5kIG9mIHRoZSBzdHJpbmcgcmVhY2hlZCB3aXRoIG5vIGNsb3NpbmcgYnJhY2tldCAnICtcbiAgICAgICAgICAgIGVuZCArXG4gICAgICAgICAgICAnIGZvdW5kLidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXguY29kZSA9PT0gJ0NIQVJBQ1RFUl9QQVJTRVI6TUlTTUFUQ0hFRF9CUkFDS0VUJykge1xuICAgICAgICB0aGlzLmVycm9yKCdCUkFDS0VUX01JU01BVENIJywgZXgubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9LFxuXG4gIHNjYW5JbmRlbnRhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzLCByZTtcblxuICAgIC8vIGVzdGFibGlzaGVkIHJlZ2V4cFxuICAgIGlmICh0aGlzLmluZGVudFJlKSB7XG4gICAgICBjYXB0dXJlcyA9IHRoaXMuaW5kZW50UmUuZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgIC8vIGRldGVybWluZSByZWdleHBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGFic1xuICAgICAgcmUgPSAvXlxcbihcXHQqKSAqLztcbiAgICAgIGNhcHR1cmVzID0gcmUuZXhlYyh0aGlzLmlucHV0KTtcblxuICAgICAgLy8gc3BhY2VzXG4gICAgICBpZiAoY2FwdHVyZXMgJiYgIWNhcHR1cmVzWzFdLmxlbmd0aCkge1xuICAgICAgICByZSA9IC9eXFxuKCAqKS87XG4gICAgICAgIGNhcHR1cmVzID0gcmUuZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgIH1cblxuICAgICAgLy8gZXN0YWJsaXNoZWRcbiAgICAgIGlmIChjYXB0dXJlcyAmJiBjYXB0dXJlc1sxXS5sZW5ndGgpIHRoaXMuaW5kZW50UmUgPSByZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FwdHVyZXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGVuZC1vZi1zb3VyY2UuXG4gICAqL1xuXG4gIGVvczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaW5wdXQubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW50ZXJwb2xhdGVkKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnTk9fRU5EX0JSQUNLRVQnLFxuICAgICAgICAnRW5kIG9mIGxpbmUgd2FzIHJlYWNoZWQgd2l0aCBubyBjbG9zaW5nIGJyYWNrZXQgZm9yIGludGVycG9sYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IHRoaXMuaW5kZW50U3RhY2tbaV07IGkrKykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0aGlzLnRvaygnb3V0ZGVudCcpKSk7XG4gICAgfVxuICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodGhpcy50b2soJ2VvcycpKSk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJsYW5rIGxpbmUuXG4gICAqL1xuXG4gIGJsYW5rOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eXFxuWyBcXHRdKlxcbi8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29tbWVudC5cbiAgICovXG5cbiAgY29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXlxcL1xcLygtKT8oW15cXG5dKikvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnY29tbWVudCcsIGNhcHR1cmVzWzJdKTtcbiAgICAgIHRvay5idWZmZXIgPSAnLScgIT0gY2FwdHVyZXNbMV07XG4gICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gdG9rLmJ1ZmZlcjtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGlwZWxlc3NUZXh0Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludGVycG9sYXRlZCB0YWcuXG4gICAqL1xuXG4gIGludGVycG9sYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICgvXiNcXHsvLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHZhciBtYXRjaCA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oMSk7XG4gICAgICB0aGlzLmNvbnN1bWUobWF0Y2guZW5kICsgMSk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJ2ludGVycG9sYXRpb24nLCBtYXRjaC5zcmMpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMik7IC8vICcjeydcbiAgICAgIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihtYXRjaC5zcmMpO1xuXG4gICAgICB2YXIgc3BsaXR0ZWQgPSBtYXRjaC5zcmMuc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGxpbmVzID0gc3BsaXR0ZWQubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZShsaW5lcyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihzcGxpdHRlZFtsaW5lc10ubGVuZ3RoICsgMSk7IC8vICsgMSBcdTIxOTIgJ30nXG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBUYWcuXG4gICAqL1xuXG4gIHRhZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuXG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKFxcdyg/OlstOlxcd10qXFx3KT8pLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIHRvayxcbiAgICAgICAgbmFtZSA9IGNhcHR1cmVzWzFdLFxuICAgICAgICBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGg7XG4gICAgICB0aGlzLmNvbnN1bWUobGVuKTtcbiAgICAgIHRvayA9IHRoaXMudG9rKCd0YWcnLCBuYW1lKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGxlbik7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXIuXG4gICAqL1xuXG4gIGZpbHRlcjogZnVuY3Rpb24ob3B0cykge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL146KFtcXHdcXC1dKykvLCAnZmlsdGVyJyk7XG4gICAgdmFyIGluSW5jbHVkZSA9IG9wdHMgJiYgb3B0cy5pbkluY2x1ZGU7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tFbmQodG9rKTtcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJzJyk7XG4gICAgICBpZiAoIWluSW5jbHVkZSkge1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3BpcGVsZXNzVGV4dCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEb2N0eXBlLlxuICAgKi9cblxuICBkb2N0eXBlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc2NhbkVuZE9mTGluZSgvXmRvY3R5cGUgKihbXlxcbl0qKS8sICdkb2N0eXBlJyk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQobm9kZSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJZC5cbiAgICovXG5cbiAgaWQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL14jKFtcXHctXSspLywgJ2lkJyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2spO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tFbmQodG9rKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoL14jLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnSU5WQUxJRF9JRCcsXG4gICAgICAgICdcIicgK1xuICAgICAgICAgIC8uW14gXFx0XFwoXFwjXFwuXFw6XSovLmV4ZWModGhpcy5pbnB1dC5zdWJzdHIoMSkpWzBdICtcbiAgICAgICAgICAnXCIgaXMgbm90IGEgdmFsaWQgSUQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENsYXNzLlxuICAgKi9cblxuICBjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL15cXC4oW19hLXowLTlcXC1dKltfYS16XVtfYS16MC05XFwtXSopL2ksICdjbGFzcycpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHRvay52YWwubGVuZ3RoKTtcbiAgICAgIHRoaXMudG9rRW5kKHRvayk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKC9eXFwuW19hLXowLTlcXC1dKy9pLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdJTlZBTElEX0NMQVNTX05BTUUnLFxuICAgICAgICAnQ2xhc3MgbmFtZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBsZXR0ZXIgb3IgdW5kZXJzY29yZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoL15cXC4vLnRlc3QodGhpcy5pbnB1dCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdJTlZBTElEX0NMQVNTX05BTUUnLFxuICAgICAgICAnXCInICtcbiAgICAgICAgICAvLlteIFxcdFxcKFxcI1xcLlxcOl0qLy5leGVjKHRoaXMuaW5wdXQuc3Vic3RyKDEpKVswXSArXG4gICAgICAgICAgJ1wiIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuICBDbGFzcyBuYW1lcyBjYW4gb25seSBjb250YWluIFwiX1wiLCBcIi1cIiwgYS16IGFuZCAwLTksIGFuZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG9mIFwiX1wiLCBvciBhLXonXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVGV4dC5cbiAgICovXG4gIGVuZEludGVycG9sYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmludGVycG9sYXRlZCAmJiB0aGlzLmlucHV0WzBdID09PSAnXScpIHtcbiAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLmlucHV0LnN1YnN0cigxKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICBhZGRUZXh0OiBmdW5jdGlvbih0eXBlLCB2YWx1ZSwgcHJlZml4LCBlc2NhcGVkKSB7XG4gICAgdmFyIHRvaztcbiAgICBpZiAodmFsdWUgKyBwcmVmaXggPT09ICcnKSByZXR1cm47XG4gICAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuICAgIGVzY2FwZWQgPSBlc2NhcGVkIHx8IDA7XG4gICAgdmFyIGluZGV4T2ZFbmQgPSB0aGlzLmludGVycG9sYXRlZCA/IHZhbHVlLmluZGV4T2YoJ10nKSA6IC0xO1xuICAgIHZhciBpbmRleE9mU3RhcnQgPSB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID8gdmFsdWUuaW5kZXhPZignI1snKSA6IC0xO1xuICAgIHZhciBpbmRleE9mRXNjYXBlZCA9IHRoaXMuaW50ZXJwb2xhdGlvbkFsbG93ZWQgPyB2YWx1ZS5pbmRleE9mKCdcXFxcI1snKSA6IC0xO1xuICAgIHZhciBtYXRjaE9mU3RyaW5nSW50ZXJwID0gLyhcXFxcKT8oWyMhXSl7KCg/Oi58XFxuKSopJC8uZXhlYyh2YWx1ZSk7XG4gICAgdmFyIGluZGV4T2ZTdHJpbmdJbnRlcnAgPVxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCAmJiBtYXRjaE9mU3RyaW5nSW50ZXJwXG4gICAgICAgID8gbWF0Y2hPZlN0cmluZ0ludGVycC5pbmRleFxuICAgICAgICA6IEluZmluaXR5O1xuXG4gICAgaWYgKGluZGV4T2ZFbmQgPT09IC0xKSBpbmRleE9mRW5kID0gSW5maW5pdHk7XG4gICAgaWYgKGluZGV4T2ZTdGFydCA9PT0gLTEpIGluZGV4T2ZTdGFydCA9IEluZmluaXR5O1xuICAgIGlmIChpbmRleE9mRXNjYXBlZCA9PT0gLTEpIGluZGV4T2ZFc2NhcGVkID0gSW5maW5pdHk7XG5cbiAgICBpZiAoXG4gICAgICBpbmRleE9mRXNjYXBlZCAhPT0gSW5maW5pdHkgJiZcbiAgICAgIGluZGV4T2ZFc2NhcGVkIDwgaW5kZXhPZkVuZCAmJlxuICAgICAgaW5kZXhPZkVzY2FwZWQgPCBpbmRleE9mU3RhcnQgJiZcbiAgICAgIGluZGV4T2ZFc2NhcGVkIDwgaW5kZXhPZlN0cmluZ0ludGVycFxuICAgICkge1xuICAgICAgcHJlZml4ID0gcHJlZml4ICsgdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4T2ZFc2NhcGVkKSArICcjWyc7XG4gICAgICByZXR1cm4gdGhpcy5hZGRUZXh0KFxuICAgICAgICB0eXBlLFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoaW5kZXhPZkVzY2FwZWQgKyAzKSxcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBlc2NhcGVkICsgMVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaW5kZXhPZlN0YXJ0ICE9PSBJbmZpbml0eSAmJlxuICAgICAgaW5kZXhPZlN0YXJ0IDwgaW5kZXhPZkVuZCAmJlxuICAgICAgaW5kZXhPZlN0YXJ0IDwgaW5kZXhPZkVzY2FwZWQgJiZcbiAgICAgIGluZGV4T2ZTdGFydCA8IGluZGV4T2ZTdHJpbmdJbnRlcnBcbiAgICApIHtcbiAgICAgIHRvayA9IHRoaXMudG9rKHR5cGUsIHByZWZpeCArIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mU3RhcnQpKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHByZWZpeC5sZW5ndGggKyBpbmRleE9mU3RhcnQgKyBlc2NhcGVkKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0b2sgPSB0aGlzLnRvaygnc3RhcnQtcHVnLWludGVycG9sYXRpb24nKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDIpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHZhbHVlLnN1YnN0cihpbmRleE9mU3RhcnQgKyAyKSwge1xuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgaW50ZXJwb2xhdGVkOiB0cnVlLFxuICAgICAgICBzdGFydGluZ0xpbmU6IHRoaXMubGluZW5vLFxuICAgICAgICBzdGFydGluZ0NvbHVtbjogdGhpcy5jb2xubyxcbiAgICAgICAgcGx1Z2luczogdGhpcy5wbHVnaW5zLFxuICAgICAgfSk7XG4gICAgICB2YXIgaW50ZXJwb2xhdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW50ZXJwb2xhdGVkID0gY2hpbGQuZ2V0VG9rZW5zKCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZXguY29kZSAmJiAvXlBVRzovLnRlc3QoZXguY29kZSkpIHtcbiAgICAgICAgICB0aGlzLmNvbG5vID0gZXguY29sdW1uO1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXguY29kZS5zdWJzdHIoNCksIGV4Lm1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXg7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbG5vID0gY2hpbGQuY29sbm87XG4gICAgICB0aGlzLnRva2VucyA9IHRoaXMudG9rZW5zLmNvbmNhdChpbnRlcnBvbGF0ZWQpO1xuICAgICAgdG9rID0gdGhpcy50b2soJ2VuZC1wdWctaW50ZXJwb2xhdGlvbicpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5hZGRUZXh0KHR5cGUsIGNoaWxkLmlucHV0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaW5kZXhPZkVuZCAhPT0gSW5maW5pdHkgJiZcbiAgICAgIGluZGV4T2ZFbmQgPCBpbmRleE9mU3RhcnQgJiZcbiAgICAgIGluZGV4T2ZFbmQgPCBpbmRleE9mRXNjYXBlZCAmJlxuICAgICAgaW5kZXhPZkVuZCA8IGluZGV4T2ZTdHJpbmdJbnRlcnBcbiAgICApIHtcbiAgICAgIGlmIChwcmVmaXggKyB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXhPZkVuZCkpIHtcbiAgICAgICAgdGhpcy5hZGRUZXh0KHR5cGUsIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mRW5kKSwgcHJlZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbnB1dCA9IHZhbHVlLnN1YnN0cih2YWx1ZS5pbmRleE9mKCddJykgKyAxKSArIHRoaXMuaW5wdXQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleE9mU3RyaW5nSW50ZXJwICE9PSBJbmZpbml0eSkge1xuICAgICAgaWYgKG1hdGNoT2ZTdHJpbmdJbnRlcnBbMV0pIHtcbiAgICAgICAgcHJlZml4ID1cbiAgICAgICAgICBwcmVmaXggK1xuICAgICAgICAgIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleE9mU3RyaW5nSW50ZXJwKSArXG4gICAgICAgICAgbWF0Y2hPZlN0cmluZ0ludGVycFsyXSArXG4gICAgICAgICAgJ3snO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRUZXh0KFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKGluZGV4T2ZTdHJpbmdJbnRlcnAgKyAzKSxcbiAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgZXNjYXBlZCArIDFcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZhciBiZWZvcmUgPSB2YWx1ZS5zdWJzdHIoMCwgaW5kZXhPZlN0cmluZ0ludGVycCk7XG4gICAgICBpZiAocHJlZml4IHx8IGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUgPSBwcmVmaXggKyBiZWZvcmU7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKHR5cGUsIGJlZm9yZSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGJlZm9yZS5sZW5ndGggKyBlc2NhcGVkKTtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3QgPSBtYXRjaE9mU3RyaW5nSW50ZXJwWzNdO1xuICAgICAgdmFyIHJhbmdlO1xuICAgICAgdG9rID0gdGhpcy50b2soJ2ludGVycG9sYXRlZC1jb2RlJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJhbmdlID0gY2hhcmFjdGVyUGFyc2VyLnBhcnNlVW50aWwocmVzdCwgJ30nKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmIChleC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oZXguaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleC5jb2RlID09PSAnQ0hBUkFDVEVSX1BBUlNFUjpFTkRfT0ZfU1RSSU5HX1JFQUNIRUQnKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICdOT19FTkRfQlJBQ0tFVCcsXG4gICAgICAgICAgICAnRW5kIG9mIGxpbmUgd2FzIHJlYWNoZWQgd2l0aCBubyBjbG9zaW5nIGJyYWNrZXQgZm9yIGludGVycG9sYXRpb24uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXguY29kZSA9PT0gJ0NIQVJBQ1RFUl9QQVJTRVI6TUlTTUFUQ0hFRF9CUkFDS0VUJykge1xuICAgICAgICAgIHRoaXMuZXJyb3IoJ0JSQUNLRVRfTUlTTUFUQ0gnLCBleC5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdG9rLm11c3RFc2NhcGUgPSBtYXRjaE9mU3RyaW5nSW50ZXJwWzJdID09PSAnIyc7XG4gICAgICB0b2suYnVmZmVyID0gdHJ1ZTtcbiAgICAgIHRvay52YWwgPSByYW5nZS5zcmM7XG4gICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24ocmFuZ2Uuc3JjKTtcblxuICAgICAgaWYgKHJhbmdlLmVuZCArIDEgPCByZXN0Lmxlbmd0aCkge1xuICAgICAgICByZXN0ID0gcmVzdC5zdWJzdHIocmFuZ2UuZW5kICsgMSk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHJhbmdlLmVuZCArIDEpO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICB0aGlzLmFkZFRleHQodHlwZSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbihyZXN0Lmxlbmd0aCk7XG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwcmVmaXggKyB2YWx1ZTtcbiAgICB0b2sgPSB0aGlzLnRvayh0eXBlLCB2YWx1ZSk7XG4gICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odmFsdWUubGVuZ3RoICsgZXNjYXBlZCk7XG4gICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgfSxcblxuICB0ZXh0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID1cbiAgICAgIHRoaXMuc2NhbigvXig/OlxcfCA/fCApKFteXFxuXSspLywgJ3RleHQnKSB8fFxuICAgICAgdGhpcy5zY2FuKC9eKCApLywgJ3RleHQnKSB8fFxuICAgICAgdGhpcy5zY2FuKC9eXFx8KCA/KS8sICd0ZXh0Jyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy5hZGRUZXh0KCd0ZXh0JywgdG9rLnZhbCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgdGV4dEh0bWw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL14oPFteXFxuXSopLywgJ3RleHQtaHRtbCcpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMuYWRkVGV4dCgndGV4dC1odG1sJywgdG9rLnZhbCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERvdC5cbiAgICovXG5cbiAgZG90OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuICAgIGlmICgodG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eXFwuLywgJ2RvdCcpKSkge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3BpcGVsZXNzVGV4dCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFeHRlbmRzLlxuICAgKi9cblxuICBleHRlbmRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuKC9eZXh0ZW5kcz8oPz0gfCR8XFxuKS8sICdleHRlbmRzJyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIGlmICghdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGF0aCcpKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ05PX0VYVEVORFNfUEFUSCcsICdtaXNzaW5nIHBhdGggZm9yIGV4dGVuZHMnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9eZXh0ZW5kcz9cXGIvKSkge1xuICAgICAgdGhpcy5lcnJvcignTUFMRk9STUVEX0VYVEVORFMnLCAnbWFsZm9ybWVkIGV4dGVuZHMnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJsb2NrIHByZXBlbmQuXG4gICAqL1xuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoKGNhcHR1cmVzID0gL14oPzpibG9jayArKT9wcmVwZW5kICsoW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB2YXIgbmFtZSA9IGNhcHR1cmVzWzFdLnRyaW0oKTtcbiAgICAgIHZhciBjb21tZW50ID0gJyc7XG4gICAgICBpZiAobmFtZS5pbmRleE9mKCcvLycpICE9PSAtMSkge1xuICAgICAgICBjb21tZW50ID1cbiAgICAgICAgICAnLy8nICtcbiAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAuc3BsaXQoJy8vJylcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLmpvaW4oJy8vJyk7XG4gICAgICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcvLycpWzBdLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgICAgdmFyIHRvayA9IHRoaXMudG9rKCdibG9jaycsIG5hbWUpO1xuICAgICAgdmFyIGxlbiA9IGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoO1xuICAgICAgd2hpbGUgKHRoaXMud2hpdGVzcGFjZVJlLnRlc3QodGhpcy5pbnB1dC5jaGFyQXQobGVuIC0gMSkpKSBsZW4tLTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGxlbik7XG4gICAgICB0b2subW9kZSA9ICdwcmVwZW5kJztcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGgpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGggLSBsZW4pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jayBhcHBlbmQuXG4gICAqL1xuXG4gIGFwcGVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzO1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXig/OmJsb2NrICspP2FwcGVuZCArKFteXFxuXSspLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIG5hbWUgPSBjYXB0dXJlc1sxXS50cmltKCk7XG4gICAgICB2YXIgY29tbWVudCA9ICcnO1xuICAgICAgaWYgKG5hbWUuaW5kZXhPZignLy8nKSAhPT0gLTEpIHtcbiAgICAgICAgY29tbWVudCA9XG4gICAgICAgICAgJy8vJyArXG4gICAgICAgICAgbmFtZVxuICAgICAgICAgICAgLnNwbGl0KCcvLycpXG4gICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgIC5qb2luKCcvLycpO1xuICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLy8nKVswXS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnYmxvY2snLCBuYW1lKTtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGggLSBjb21tZW50Lmxlbmd0aDtcbiAgICAgIHdoaWxlICh0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHRoaXMuaW5wdXQuY2hhckF0KGxlbiAtIDEpKSkgbGVuLS07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihsZW4pO1xuICAgICAgdG9rLm1vZGUgPSAnYXBwZW5kJztcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGgpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29tbWVudC5sZW5ndGggLSBsZW4pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jay5cbiAgICovXG5cbiAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoKGNhcHR1cmVzID0gL15ibG9jayArKFteXFxuXSspLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdmFyIG5hbWUgPSBjYXB0dXJlc1sxXS50cmltKCk7XG4gICAgICB2YXIgY29tbWVudCA9ICcnO1xuICAgICAgaWYgKG5hbWUuaW5kZXhPZignLy8nKSAhPT0gLTEpIHtcbiAgICAgICAgY29tbWVudCA9XG4gICAgICAgICAgJy8vJyArXG4gICAgICAgICAgbmFtZVxuICAgICAgICAgICAgLnNwbGl0KCcvLycpXG4gICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgIC5qb2luKCcvLycpO1xuICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLy8nKVswXS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnYmxvY2snLCBuYW1lKTtcbiAgICAgIHZhciBsZW4gPSBjYXB0dXJlc1swXS5sZW5ndGggLSBjb21tZW50Lmxlbmd0aDtcbiAgICAgIHdoaWxlICh0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHRoaXMuaW5wdXQuY2hhckF0KGxlbiAtIDEpKSkgbGVuLS07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihsZW4pO1xuICAgICAgdG9rLm1vZGUgPSAncmVwbGFjZSc7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5jb25zdW1lKGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCAtIGNvbW1lbnQubGVuZ3RoIC0gbGVuKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWl4aW4gQmxvY2suXG4gICAqL1xuXG4gIG1peGluQmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2s7XG4gICAgaWYgKCh0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL15ibG9jay8sICdtaXhpbi1ibG9jaycpKSkge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogWWllbGQuXG4gICAqL1xuXG4gIHlpZWxkOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eeWllbGQvLCAneWllbGQnKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBJbmNsdWRlLlxuICAgKi9cblxuICBpbmNsdWRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuKC9eaW5jbHVkZSg/PTp8IHwkfFxcbikvLCAnaW5jbHVkZScpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB3aGlsZSAodGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZmlsdGVyJywge2luSW5jbHVkZTogdHJ1ZX0pKTtcbiAgICAgIGlmICghdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigncGF0aCcpKSB7XG4gICAgICAgIGlmICgvXlteIFxcbl0rLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbW9yZSB0ZXh0XG4gICAgICAgICAgdGhpcy5mYWlsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgbm90XG4gICAgICAgICAgdGhpcy5lcnJvcignTk9fSU5DTFVERV9QQVRIJywgJ21pc3NpbmcgcGF0aCBmb3IgaW5jbHVkZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NhbigvXmluY2x1ZGVcXGIvKSkge1xuICAgICAgdGhpcy5lcnJvcignTUFMRk9STUVEX0lOQ0xVREUnLCAnbWFsZm9ybWVkIGluY2x1ZGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhdGhcbiAgICovXG5cbiAgcGF0aDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuc2NhbkVuZE9mTGluZSgvXiAoW15cXG5dKykvLCAncGF0aCcpO1xuICAgIGlmICh0b2sgJiYgKHRvay52YWwgPSB0b2sudmFsLnRyaW0oKSkpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhc2UuXG4gICAqL1xuXG4gIGNhc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL15jYXNlICsoW15cXG5dKykvLCAnY2FzZScpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKC10b2sudmFsLmxlbmd0aCk7XG4gICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24odG9rLnZhbCk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbih0b2sudmFsLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYW4oL15jYXNlXFxiLykpIHtcbiAgICAgIHRoaXMuZXJyb3IoJ05PX0NBU0VfRVhQUkVTU0lPTicsICdtaXNzaW5nIGV4cHJlc3Npb24gZm9yIGNhc2UnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoZW4uXG4gICAqL1xuXG4gIHdoZW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW5FbmRPZkxpbmUoL153aGVuICsoW146XFxuXSspLywgJ3doZW4nKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB2YXIgcGFyc2VyID0gY2hhcmFjdGVyUGFyc2VyKHRvay52YWwpO1xuICAgICAgd2hpbGUgKHBhcnNlci5pc05lc3RpbmcoKSB8fCBwYXJzZXIuaXNTdHJpbmcoKSkge1xuICAgICAgICB2YXIgcmVzdCA9IC86KFteOlxcbl0rKS8uZXhlYyh0aGlzLmlucHV0KTtcbiAgICAgICAgaWYgKCFyZXN0KSBicmVhaztcblxuICAgICAgICB0b2sudmFsICs9IHJlc3RbMF07XG4gICAgICAgIHRoaXMuY29uc3VtZShyZXN0WzBdLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKHJlc3RbMF0ubGVuZ3RoKTtcbiAgICAgICAgcGFyc2VyID0gY2hhcmFjdGVyUGFyc2VyKHRvay52YWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigtdG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHRvay52YWwpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4odG9rLnZhbC5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9ed2hlblxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKCdOT19XSEVOX0VYUFJFU1NJT04nLCAnbWlzc2luZyBleHByZXNzaW9uIGZvciB3aGVuJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0LlxuICAgKi9cblxuICBkZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eZGVmYXVsdC8sICdkZWZhdWx0Jyk7XG4gICAgaWYgKHRvaykge1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuKC9eZGVmYXVsdFxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnREVGQVVMVF9XSVRIX0VYUFJFU1NJT04nLFxuICAgICAgICAnZGVmYXVsdCBzaG91bGQgbm90IGhhdmUgYW4gZXhwcmVzc2lvbidcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDYWxsIG1peGluLlxuICAgKi9cblxuICBjYWxsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rLCBjYXB0dXJlcywgaW5jcmVtZW50O1xuICAgIGlmICgoY2FwdHVyZXMgPSAvXlxcKyhcXHMqKSgoWy1cXHddKyl8KCNcXHspKS8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIC8vIHRyeSB0byBjb25zdW1lIHNpbXBsZSBvciBpbnRlcnBvbGF0ZWQgY2FsbFxuICAgICAgaWYgKGNhcHR1cmVzWzNdKSB7XG4gICAgICAgIC8vIHNpbXBsZSBjYWxsXG4gICAgICAgIGluY3JlbWVudCA9IGNhcHR1cmVzWzBdLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb25zdW1lKGluY3JlbWVudCk7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCdjYWxsJywgY2FwdHVyZXNbM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW50ZXJwb2xhdGVkIGNhbGxcbiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5icmFja2V0RXhwcmVzc2lvbigyICsgY2FwdHVyZXNbMV0ubGVuZ3RoKTtcbiAgICAgICAgaW5jcmVtZW50ID0gbWF0Y2guZW5kICsgMTtcbiAgICAgICAgdGhpcy5jb25zdW1lKGluY3JlbWVudCk7XG4gICAgICAgIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihtYXRjaC5zcmMpO1xuICAgICAgICB0b2sgPSB0aGlzLnRvaygnY2FsbCcsICcjeycgKyBtYXRjaC5zcmMgKyAnfScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihpbmNyZW1lbnQpO1xuXG4gICAgICB0b2suYXJncyA9IG51bGw7XG4gICAgICAvLyBDaGVjayBmb3IgYXJncyAobm90IGF0dHJpYnV0ZXMpXG4gICAgICBpZiAoKGNhcHR1cmVzID0gL14gKlxcKC8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5icmFja2V0RXhwcmVzc2lvbihjYXB0dXJlc1swXS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKCEvXlxccypbLVxcd10rICo9Ly50ZXN0KHJhbmdlLnNyYykpIHtcbiAgICAgICAgICAvLyBub3QgYXR0cmlidXRlc1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgIHRoaXMuY29uc3VtZShyYW5nZS5lbmQgKyAxKTtcbiAgICAgICAgICB0b2suYXJncyA9IHJhbmdlLnNyYztcbiAgICAgICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24oJ1snICsgdG9rLmFyZ3MgKyAnXScpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRvay5hcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodG9rLmFyZ3NbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTWl4aW4uXG4gICAqL1xuXG4gIG1peGluOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9ebWl4aW4gKyhbLVxcd10rKSg/OiAqXFwoKC4qKVxcKSk/ICovLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnbWl4aW4nLCBjYXB0dXJlc1sxXSk7XG4gICAgICB0b2suYXJncyA9IGNhcHR1cmVzWzJdIHx8IG51bGw7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ29uZGl0aW9uYWwuXG4gICAqL1xuXG4gIGNvbmRpdGlvbmFsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKGlmfHVubGVzc3xlbHNlIGlmfGVsc2UpXFxiKFteXFxuXSopLy5leGVjKHRoaXMuaW5wdXQpKSkge1xuICAgICAgdGhpcy5jb25zdW1lKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB2YXIgdHlwZSA9IGNhcHR1cmVzWzFdLnJlcGxhY2UoLyAvZywgJy0nKTtcbiAgICAgIHZhciBqcyA9IGNhcHR1cmVzWzJdICYmIGNhcHR1cmVzWzJdLnRyaW0oKTtcbiAgICAgIC8vIHR5cGUgY2FuIGJlIFwiaWZcIiwgXCJlbHNlLWlmXCIgYW5kIFwiZWxzZVwiXG4gICAgICB2YXIgdG9rID0gdGhpcy50b2sodHlwZSwganMpO1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0ganMubGVuZ3RoKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2lmJzpcbiAgICAgICAgY2FzZSAnZWxzZS1pZic6XG4gICAgICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5sZXNzJzpcbiAgICAgICAgICB0aGlzLmFzc2VydEV4cHJlc3Npb24oanMpO1xuICAgICAgICAgIHRvay52YWwgPSAnISgnICsganMgKyAnKSc7XG4gICAgICAgICAgdG9rLnR5cGUgPSAnaWYnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlbHNlJzpcbiAgICAgICAgICBpZiAoanMpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICdFTFNFX0NPTkRJVElPTicsXG4gICAgICAgICAgICAgICdgZWxzZWAgY2Fubm90IGhhdmUgYSBjb25kaXRpb24sIHBlcmhhcHMgeW91IG1lYW50IGBlbHNlIGlmYCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oanMubGVuZ3RoKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoaWxlLlxuICAgKi9cblxuICB3aGlsZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhcHR1cmVzLCB0b2s7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9ed2hpbGUgKyhbXlxcbl0rKS8uZXhlYyh0aGlzLmlucHV0KSkpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzFdKTtcbiAgICAgIHRvayA9IHRoaXMudG9rKCd3aGlsZScsIGNhcHR1cmVzWzFdKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNhcHR1cmVzWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYW4oL153aGlsZVxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKCdOT19XSElMRV9FWFBSRVNTSU9OJywgJ21pc3NpbmcgZXhwcmVzc2lvbiBmb3Igd2hpbGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVhY2guXG4gICAqL1xuXG4gIGVhY2g6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcztcbiAgICBpZiAoXG4gICAgICAoY2FwdHVyZXMgPSAvXig/OmVhY2h8Zm9yKSArKFthLXpBLVpfJF1bXFx3JF0qKSg/OiAqLCAqKFthLXpBLVpfJF1bXFx3JF0qKSk/ICogaW4gKihbXlxcbl0rKS8uZXhlYyhcbiAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29uc3VtZShjYXB0dXJlc1swXS5sZW5ndGgpO1xuICAgICAgdmFyIHRvayA9IHRoaXMudG9rKCdlYWNoJywgY2FwdHVyZXNbMV0pO1xuICAgICAgdG9rLmtleSA9IGNhcHR1cmVzWzJdIHx8IG51bGw7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1szXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzNdKTtcbiAgICAgIHRvay5jb2RlID0gY2FwdHVyZXNbM107XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1szXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gL15lYWNoXFxiLy5leGVjKHRoaXMuaW5wdXQpID8gJ2VhY2gnIDogJ2Zvcic7XG4gICAgaWYgKHRoaXMuc2NhbigvXig/OmVhY2h8Zm9yKVxcYi8pKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnTUFMRk9STUVEX0VBQ0gnLFxuICAgICAgICAnVGhpcyBgJyArXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgJ2AgaGFzIGEgc3ludGF4IGVycm9yLiBgJyArXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgJ2Agc3RhdGVtZW50cyBzaG91bGQgYmUgb2YgdGhlIGZvcm06IGAnICtcbiAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAnIFZBUklBQkxFX05BTUUgb2YgSlNfRVhQUkVTU0lPTmAnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAoY2FwdHVyZXMgPSAvXi0gKig/OmVhY2h8Zm9yKSArKFthLXpBLVpfJF1bXFx3JF0qKSg/OiAqLCAqKFthLXpBLVpfJF1bXFx3JF0qKSk/ICtpbiArKFteXFxuXSspLy5leGVjKFxuICAgICAgICB0aGlzLmlucHV0XG4gICAgICApKVxuICAgICkge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ01BTEZPUk1FRF9FQUNIJyxcbiAgICAgICAgJ1B1ZyBlYWNoIGFuZCBmb3Igc2hvdWxkIG5vIGxvbmdlciBiZSBwcmVmaXhlZCB3aXRoIGEgZGFzaCAoXCItXCIpLiBUaGV5IGFyZSBwdWcga2V5d29yZHMgYW5kIG5vdCBwYXJ0IG9mIEphdmFTY3JpcHQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVhY2hPZi5cbiAgICovXG5cbiAgZWFjaE9mOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKD86ZWFjaHxmb3IpICguKj8pIG9mICooW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2FwdHVyZXNbMF0ubGVuZ3RoKTtcbiAgICAgIHZhciB0b2sgPSB0aGlzLnRvaygnZWFjaE9mJywgY2FwdHVyZXNbMV0pO1xuICAgICAgdG9rLnZhbHVlID0gY2FwdHVyZXNbMV07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKGNhcHR1cmVzWzJdKTtcbiAgICAgIHRvay5jb2RlID0gY2FwdHVyZXNbMl07XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhKFxuICAgICAgICAgIC9eW2EtekEtWl8kXVtcXHckXSokLy50ZXN0KHRvay52YWx1ZS50cmltKCkpIHx8XG4gICAgICAgICAgL15cXFsgKlthLXpBLVpfJF1bXFx3JF0qICpcXCwgKlthLXpBLVpfJF1bXFx3JF0qICpcXF0kLy50ZXN0KFxuICAgICAgICAgICAgdG9rLnZhbHVlLnRyaW0oKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ01BTEZPUk1FRF9FQUNIX09GX0xWQUwnLFxuICAgICAgICAgICdUaGUgdmFsdWUgdmFyaWFibGUgZm9yIGVhY2ggbXVzdCBlaXRoZXIgYmUgYSB2YWxpZCBpZGVudGlmaWVyIChlLmcuIGBpdGVtYCkgb3IgYSBwYWlyIG9mIGlkZW50aWZpZXJzIGluIHNxdWFyZSBicmFja2V0cyAoZS5nLiBgW2tleSwgdmFsdWVdYCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKGNhcHR1cmVzID0gL14tICooPzplYWNofGZvcikgKyhbYS16QS1aXyRdW1xcdyRdKikoPzogKiwgKihbYS16QS1aXyRdW1xcdyRdKikpPyArb2YgKyhbXlxcbl0rKS8uZXhlYyhcbiAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICdNQUxGT1JNRURfRUFDSCcsXG4gICAgICAgICdQdWcgZWFjaCBhbmQgZm9yIHNob3VsZCBub3QgYmUgcHJlZml4ZWQgd2l0aCBhIGRhc2ggKFwiLVwiKS4gVGhleSBhcmUgcHVnIGtleXdvcmRzIGFuZCBub3QgcGFydCBvZiBKYXZhU2NyaXB0LidcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDb2RlLlxuICAgKi9cblxuICBjb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FwdHVyZXM7XG4gICAgaWYgKChjYXB0dXJlcyA9IC9eKCE/PXwtKVsgXFx0XSooW15cXG5dKykvLmV4ZWModGhpcy5pbnB1dCkpKSB7XG4gICAgICB2YXIgZmxhZ3MgPSBjYXB0dXJlc1sxXTtcbiAgICAgIHZhciBjb2RlID0gY2FwdHVyZXNbMl07XG4gICAgICB2YXIgc2hvcnRlbmVkID0gMDtcbiAgICAgIGlmICh0aGlzLmludGVycG9sYXRlZCkge1xuICAgICAgICB2YXIgcGFyc2VkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZCA9IGNoYXJhY3RlclBhcnNlci5wYXJzZVVudGlsKGNvZGUsICddJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oY2FwdHVyZXNbMF0ubGVuZ3RoIC0gY29kZS5sZW5ndGggKyBlcnIuaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOkVORF9PRl9TVFJJTkdfUkVBQ0hFRCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAgICdOT19FTkRfQlJBQ0tFVCcsXG4gICAgICAgICAgICAgICdFbmQgb2YgbGluZSB3YXMgcmVhY2hlZCB3aXRoIG5vIGNsb3NpbmcgYnJhY2tldCBmb3IgaW50ZXJwb2xhdGlvbi4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdDSEFSQUNURVJfUEFSU0VSOk1JU01BVENIRURfQlJBQ0tFVCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoJ0JSQUNLRVRfTUlTTUFUQ0gnLCBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2hvcnRlbmVkID0gY29kZS5sZW5ndGggLSBwYXJzZWQuZW5kO1xuICAgICAgICBjb2RlID0gcGFyc2VkLnNyYztcbiAgICAgIH1cbiAgICAgIHZhciBjb25zdW1lZCA9IGNhcHR1cmVzWzBdLmxlbmd0aCAtIHNob3J0ZW5lZDtcbiAgICAgIHRoaXMuY29uc3VtZShjb25zdW1lZCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJ2NvZGUnLCBjb2RlKTtcbiAgICAgIHRvay5tdXN0RXNjYXBlID0gZmxhZ3MuY2hhckF0KDApID09PSAnPSc7XG4gICAgICB0b2suYnVmZmVyID0gZmxhZ3MuY2hhckF0KDApID09PSAnPScgfHwgZmxhZ3MuY2hhckF0KDEpID09PSAnPSc7XG5cbiAgICAgIC8vIHAgI1shPSAgICBhYmNdIGhleVxuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIG9yaWdpbmFsIGNvbG5vXG4gICAgICAvLyAgICAgLS0tLS0tLS0tLS0tLS0gY2FwdHVyZXNbMF1cbiAgICAgIC8vICAgICAgICAgICAtLS0tLS0tLSBjYXB0dXJlc1syXVxuICAgICAgLy8gICAgIC0tLS0tLSAgICAgICAgIGNhcHR1cmVzWzBdIC0gY2FwdHVyZXNbMl1cbiAgICAgIC8vICAgICAgICAgICBeICAgICAgICBhZnRlciBjb2xub1xuXG4gICAgICAvLyA9ICAgYWJjXG4gICAgICAvLyBeICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgY29sbm9cbiAgICAgIC8vIC0tLS0tLS0gICAgICAgICAgICBjYXB0dXJlc1swXVxuICAgICAgLy8gICAgIC0tLSAgICAgICAgICAgIGNhcHR1cmVzWzJdXG4gICAgICAvLyAtLS0tICAgICAgICAgICAgICAgY2FwdHVyZXNbMF0gLSBjYXB0dXJlc1syXVxuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIGFmdGVyIGNvbG5vXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjYXB0dXJlc1swXS5sZW5ndGggLSBjYXB0dXJlc1syXS5sZW5ndGgpO1xuICAgICAgaWYgKHRvay5idWZmZXIpIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbihjb2RlKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rKTtcblxuICAgICAgLy8gcCAjWyE9ICAgIGFiY10gaGV5XG4gICAgICAvLyAgICAgICAgICAgXiAgICAgICAgb3JpZ2luYWwgY29sbm9cbiAgICAgIC8vICAgICAgICAgICAgICAtLS0tLSBzaG9ydGVuZWRcbiAgICAgIC8vICAgICAgICAgICAtLS0gICAgICBjb2RlXG4gICAgICAvLyAgICAgICAgICAgICAgXiAgICAgYWZ0ZXIgY29sbm9cblxuICAgICAgLy8gPSAgIGFiY1xuICAgICAgLy8gICAgIF4gICAgICAgICAgICAgIG9yaWdpbmFsIGNvbG5vXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgc2hvcnRlbmVkXG4gICAgICAvLyAgICAgLS0tICAgICAgICAgICAgY29kZVxuICAgICAgLy8gICAgICAgIF4gICAgICAgICAgIGFmdGVyIGNvbG5vXG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjb2RlLmxlbmd0aCk7XG4gICAgICB0aGlzLnRva0VuZCh0b2spO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBCbG9jayBjb2RlLlxuICAgKi9cbiAgYmxvY2tDb2RlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuICAgIGlmICgodG9rID0gdGhpcy5zY2FuRW5kT2ZMaW5lKC9eLS8sICdibG9ja2NvZGUnKSkpIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICB0aGlzLmludGVycG9sYXRpb25BbGxvd2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdwaXBlbGVzc1RleHQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQXR0cmlidXRlIE5hbWUuXG4gICAqL1xuICBhdHRyaWJ1dGU6IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBxdW90ZSA9ICcnO1xuICAgIHZhciBxdW90ZVJlID0gL1snXCJdLztcbiAgICB2YXIga2V5ID0gJyc7XG4gICAgdmFyIGk7XG5cbiAgICAvLyBjb25zdW1lIGFsbCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUga2V5XG4gICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLndoaXRlc3BhY2VSZS50ZXN0KHN0cltpXSkpIGJyZWFrO1xuICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRMaW5lKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGkgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgdG9rID0gdGhpcy50b2soJ2F0dHJpYnV0ZScpO1xuXG4gICAgLy8gcXVvdGU/XG4gICAgaWYgKHF1b3RlUmUudGVzdChzdHJbaV0pKSB7XG4gICAgICBxdW90ZSA9IHN0cltpXTtcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0IGxvb3BpbmcgdGhyb3VnaCB0aGUga2V5XG4gICAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdW90ZSkge1xuICAgICAgICBpZiAoc3RyW2ldID09PSBxdW90ZSkge1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSB8fFxuICAgICAgICAgIHN0cltpXSA9PT0gJyEnIHx8XG4gICAgICAgICAgc3RyW2ldID09PSAnPScgfHxcbiAgICAgICAgICBzdHJbaV0gPT09ICcsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBrZXkgKz0gc3RyW2ldO1xuXG4gICAgICBpZiAoc3RyW2ldID09PSAnXFxuJykge1xuICAgICAgICB0aGlzLmluY3JlbWVudExpbmUoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluY3JlbWVudENvbHVtbigxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0b2submFtZSA9IGtleTtcblxuICAgIHZhciB2YWx1ZVJlc3BvbnNlID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZShzdHIuc3Vic3RyKGkpKTtcblxuICAgIGlmICh2YWx1ZVJlc3BvbnNlLnZhbCkge1xuICAgICAgdG9rLnZhbCA9IHZhbHVlUmVzcG9uc2UudmFsO1xuICAgICAgdG9rLm11c3RFc2NhcGUgPSB2YWx1ZVJlc3BvbnNlLm11c3RFc2NhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdhcyBhIGJvb2xlYW4gYXR0cmlidXRlIChleDogYGlucHV0KGRpc2FibGVkKWApXG4gICAgICB0b2sudmFsID0gdHJ1ZTtcbiAgICAgIHRvay5tdXN0RXNjYXBlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdHIgPSB2YWx1ZVJlc3BvbnNlLnJlbWFpbmluZ1NvdXJjZTtcblxuICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaV0gPT09ICcsJykge1xuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoaSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZSBWYWx1ZS5cbiAgICovXG4gIGF0dHJpYnV0ZVZhbHVlOiBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcXVvdGVSZSA9IC9bJ1wiXS87XG4gICAgdmFyIHZhbCA9ICcnO1xuICAgIHZhciBkb25lLCBpLCB4O1xuICAgIHZhciBlc2NhcGVBdHRyID0gdHJ1ZTtcbiAgICB2YXIgc3RhdGUgPSBjaGFyYWN0ZXJQYXJzZXIuZGVmYXVsdFN0YXRlKCk7XG4gICAgdmFyIGNvbCA9IHRoaXMuY29sbm87XG4gICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVubztcblxuICAgIC8vIGNvbnN1bWUgYWxsIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBlcXVhbHMgc2lnblxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbaV0pKSBicmVhaztcbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIGxpbmUrKztcbiAgICAgICAgY29sID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge3JlbWFpbmluZ1NvdXJjZTogc3RyfTtcbiAgICB9XG5cbiAgICBpZiAoc3RyW2ldID09PSAnIScpIHtcbiAgICAgIGVzY2FwZUF0dHIgPSBmYWxzZTtcbiAgICAgIGNvbCsrO1xuICAgICAgaSsrO1xuICAgICAgaWYgKHN0cltpXSAhPT0gJz0nKVxuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX0tFWV9DSEFSQUNURVInLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGNoYXJhY3RlciAnICsgc3RyW2ldICsgJyBleHBlY3RlZCBgPWAnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpXSAhPT0gJz0nKSB7XG4gICAgICAvLyBjaGVjayBmb3IgYW50aS1wYXR0ZXJuIGBkaXYoXCJmb29cImJhcilgXG4gICAgICBpZiAoaSA9PT0gMCAmJiBzdHIgJiYgIXRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyWzBdKSAmJiBzdHJbMF0gIT09ICcsJykge1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX0tFWV9DSEFSQUNURVInLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGNoYXJhY3RlciAnICsgc3RyWzBdICsgJyBleHBlY3RlZCBgPWAnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3JlbWFpbmluZ1NvdXJjZTogc3RyfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpbmVubyA9IGxpbmU7XG4gICAgdGhpcy5jb2xubyA9IGNvbCArIDE7XG4gICAgaSsrO1xuXG4gICAgLy8gY29uc3VtZSBhbGwgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIHZhbHVlXG4gICAgZm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbaV0pKSBicmVhaztcbiAgICAgIGlmIChzdHJbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpbmUgPSB0aGlzLmxpbmVubztcbiAgICBjb2wgPSB0aGlzLmNvbG5vO1xuXG4gICAgLy8gc3RhcnQgbG9vcGluZyB0aHJvdWdoIHRoZSB2YWx1ZVxuICAgIGZvciAoOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBpZiB0aGUgY2hhcmFjdGVyIGlzIGluIGEgc3RyaW5nIG9yIGluIHBhcmVudGhlc2VzL2JyYWNrZXRzL2JyYWNlc1xuICAgICAgaWYgKCEoc3RhdGUuaXNOZXN0aW5nKCkgfHwgc3RhdGUuaXNTdHJpbmcoKSkpIHtcbiAgICAgICAgaWYgKHRoaXMud2hpdGVzcGFjZVJlLnRlc3Qoc3RyW2ldKSkge1xuICAgICAgICAgIGRvbmUgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlclxuICAgICAgICAgIGZvciAoeCA9IGk7IHggPCBzdHIubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aGl0ZXNwYWNlUmUudGVzdChzdHJbeF0pKSB7XG4gICAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgSmF2YVNjcmlwdCBwdW5jdHVhdG9yLCB0aGVuIGFzc3VtZSB0aGF0IGl0IGlzXG4gICAgICAgICAgICAgIC8vIGEgcGFydCBvZiB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgY29uc3QgaXNOb3RQdW5jdHVhdG9yID0gIWNoYXJhY3RlclBhcnNlci5pc1B1bmN0dWF0b3Ioc3RyW3hdKTtcbiAgICAgICAgICAgICAgY29uc3QgaXNRdW90ZSA9IHF1b3RlUmUudGVzdChzdHJbeF0pO1xuICAgICAgICAgICAgICBjb25zdCBpc0NvbG9uID0gc3RyW3hdID09PSAnOic7XG4gICAgICAgICAgICAgIGNvbnN0IGlzU3ByZWFkT3BlcmF0b3IgPVxuICAgICAgICAgICAgICAgIHN0clt4XSArIHN0clt4ICsgMV0gKyBzdHJbeCArIDJdID09PSAnLi4uJztcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc05vdFB1bmN0dWF0b3IgfHwgaXNRdW90ZSB8fCBpc0NvbG9uIHx8IGlzU3ByZWFkT3BlcmF0b3IpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHZhbCwgdHJ1ZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBlbHNlIGlzIHdoaXRlc3BhY2UsIHJldHVybiBub3cgc28gbGFzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAvLyBkb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgICBpZiAoZG9uZSB8fCB4ID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIHdoaXRlc3BhY2UgYW5kIHRoZSBjaGFyYWN0ZXIgaXMgbm90ICcsJywgdGhlXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBkaWQgbm90IGVuZC5cbiAgICAgICAgaWYgKHN0cltpXSA9PT0gJywnICYmIHRoaXMuYXNzZXJ0RXhwcmVzc2lvbih2YWwsIHRydWUpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RhdGUgPSBjaGFyYWN0ZXJQYXJzZXIucGFyc2VDaGFyKHN0cltpXSwgc3RhdGUpO1xuICAgICAgdmFsICs9IHN0cltpXTtcblxuICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgbGluZSsrO1xuICAgICAgICBjb2wgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnRFeHByZXNzaW9uKHZhbCk7XG5cbiAgICB0aGlzLmxpbmVubyA9IGxpbmU7XG4gICAgdGhpcy5jb2xubyA9IGNvbDtcblxuICAgIHJldHVybiB7dmFsOiB2YWwsIG11c3RFc2NhcGU6IGVzY2FwZUF0dHIsIHJlbWFpbmluZ1NvdXJjZTogc3RyLnN1YnN0cihpKX07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMuXG4gICAqL1xuXG4gIGF0dHJzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rO1xuXG4gICAgaWYgKCcoJyA9PSB0aGlzLmlucHV0LmNoYXJBdCgwKSkge1xuICAgICAgdG9rID0gdGhpcy50b2soJ3N0YXJ0LWF0dHJpYnV0ZXMnKTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oKS5lbmQ7XG4gICAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zdWJzdHIoMSwgaW5kZXggLSAxKTtcblxuICAgICAgdGhpcy5pbmNyZW1lbnRDb2x1bW4oMSk7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgdGhpcy5hc3NlcnROZXN0aW5nQ29ycmVjdChzdHIpO1xuICAgICAgdGhpcy5jb25zdW1lKGluZGV4ICsgMSk7XG5cbiAgICAgIHdoaWxlIChzdHIpIHtcbiAgICAgICAgc3RyID0gdGhpcy5hdHRyaWJ1dGUoc3RyKTtcbiAgICAgIH1cblxuICAgICAgdG9rID0gdGhpcy50b2soJ2VuZC1hdHRyaWJ1dGVzJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbigxKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqICZhdHRyaWJ1dGVzIGJsb2NrXG4gICAqL1xuICBhdHRyaWJ1dGVzQmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIGlmICgvXiZhdHRyaWJ1dGVzXFxiLy50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICB2YXIgY29uc3VtZWQgPSAxMTtcbiAgICAgIHRoaXMuY29uc3VtZShjb25zdW1lZCk7XG4gICAgICB2YXIgdG9rID0gdGhpcy50b2soJyZhdHRyaWJ1dGVzJyk7XG4gICAgICB0aGlzLmluY3JlbWVudENvbHVtbihjb25zdW1lZCk7XG4gICAgICB2YXIgYXJncyA9IHRoaXMuYnJhY2tldEV4cHJlc3Npb24oKTtcbiAgICAgIGNvbnN1bWVkID0gYXJncy5lbmQgKyAxO1xuICAgICAgdGhpcy5jb25zdW1lKGNvbnN1bWVkKTtcbiAgICAgIHRvay52YWwgPSBhcmdzLnNyYztcbiAgICAgIHRoaXMuaW5jcmVtZW50Q29sdW1uKGNvbnN1bWVkKTtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluZGVudCB8IE91dGRlbnQgfCBOZXdsaW5lLlxuICAgKi9cblxuICBpbmRlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjYXB0dXJlcyA9IHRoaXMuc2NhbkluZGVudGF0aW9uKCk7XG4gICAgdmFyIHRvaztcblxuICAgIGlmIChjYXB0dXJlcykge1xuICAgICAgdmFyIGluZGVudHMgPSBjYXB0dXJlc1sxXS5sZW5ndGg7XG5cbiAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgIHRoaXMuY29uc3VtZShpbmRlbnRzICsgMSk7XG5cbiAgICAgIGlmICgnICcgPT0gdGhpcy5pbnB1dFswXSB8fCAnXFx0JyA9PSB0aGlzLmlucHV0WzBdKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ0lOVkFMSURfSU5ERU5UQVRJT04nLFxuICAgICAgICAgICdJbnZhbGlkIGluZGVudGF0aW9uLCB5b3UgY2FuIHVzZSB0YWJzIG9yIHNwYWNlcyBidXQgbm90IGJvdGgnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJsYW5rIGxpbmVcbiAgICAgIGlmICgnXFxuJyA9PSB0aGlzLmlucHV0WzBdKSB7XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbkFsbG93ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tFbmQodGhpcy50b2soJ25ld2xpbmUnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG91dGRlbnRcbiAgICAgIGlmIChpbmRlbnRzIDwgdGhpcy5pbmRlbnRTdGFja1swXSkge1xuICAgICAgICB2YXIgb3V0ZGVudF9jb3VudCA9IDA7XG4gICAgICAgIHdoaWxlICh0aGlzLmluZGVudFN0YWNrWzBdID4gaW5kZW50cykge1xuICAgICAgICAgIGlmICh0aGlzLmluZGVudFN0YWNrWzFdIDwgaW5kZW50cykge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgJ0lOQ09OU0lTVEVOVF9JTkRFTlRBVElPTicsXG4gICAgICAgICAgICAgICdJbmNvbnNpc3RlbnQgaW5kZW50YXRpb24uIEV4cGVjdGluZyBlaXRoZXIgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRTdGFja1sxXSArXG4gICAgICAgICAgICAgICAgJyBvciAnICtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFN0YWNrWzBdICtcbiAgICAgICAgICAgICAgICAnIHNwYWNlcy90YWJzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dGRlbnRfY291bnQrKztcbiAgICAgICAgICB0aGlzLmluZGVudFN0YWNrLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG91dGRlbnRfY291bnQtLSkge1xuICAgICAgICAgIHRoaXMuY29sbm8gPSAxO1xuICAgICAgICAgIHRvayA9IHRoaXMudG9rKCdvdXRkZW50Jyk7XG4gICAgICAgICAgdGhpcy5jb2xubyA9IHRoaXMuaW5kZW50U3RhY2tbMF0gKyAxO1xuICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW5kZW50XG4gICAgICB9IGVsc2UgaWYgKGluZGVudHMgJiYgaW5kZW50cyAhPSB0aGlzLmluZGVudFN0YWNrWzBdKSB7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCdpbmRlbnQnLCBpbmRlbnRzKTtcbiAgICAgICAgdGhpcy5jb2xubyA9IDEgKyBpbmRlbnRzO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICB0aGlzLmluZGVudFN0YWNrLnVuc2hpZnQoaW5kZW50cyk7XG4gICAgICAgIC8vIG5ld2xpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvayA9IHRoaXMudG9rKCduZXdsaW5lJyk7XG4gICAgICAgIHRoaXMuY29sbm8gPSAxICsgTWF0aC5taW4odGhpcy5pbmRlbnRTdGFja1swXSB8fCAwLCBpbmRlbnRzKTtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0b2spKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uQWxsb3dlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgcGlwZWxlc3NUZXh0OiBmdW5jdGlvbiBwaXBlbGVzc1RleHQoaW5kZW50cykge1xuICAgIHdoaWxlICh0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdibGFuaycpKTtcblxuICAgIHZhciBjYXB0dXJlcyA9IHRoaXMuc2NhbkluZGVudGF0aW9uKCk7XG5cbiAgICBpbmRlbnRzID0gaW5kZW50cyB8fCAoY2FwdHVyZXMgJiYgY2FwdHVyZXNbMV0ubGVuZ3RoKTtcbiAgICBpZiAoaW5kZW50cyA+IHRoaXMuaW5kZW50U3RhY2tbMF0pIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodGhpcy50b2soJ3N0YXJ0LXBpcGVsZXNzLXRleHQnKSkpO1xuICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgdmFyIHRva2VuX2luZGVudCA9IFtdO1xuICAgICAgdmFyIGlzTWF0Y2g7XG4gICAgICAvLyBJbmRleCBpbiB0aGlzLmlucHV0LiBDYW4ndCB1c2UgdGhpcy5jb25zdW1lIGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCB0b1xuICAgICAgLy8gcmV0cnkgbGV4aW5nIHRoZSBibG9jay5cbiAgICAgIHZhciBzdHJpbmdQdHIgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICAvLyB0ZXh0IGhhcyBgXFxuYCBhcyBhIHByZWZpeFxuICAgICAgICB2YXIgaSA9IHRoaXMuaW5wdXQuc3Vic3RyKHN0cmluZ1B0ciArIDEpLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICBpZiAoLTEgPT0gaSkgaSA9IHRoaXMuaW5wdXQubGVuZ3RoIC0gc3RyaW5nUHRyIC0gMTtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuaW5wdXQuc3Vic3RyKHN0cmluZ1B0ciArIDEsIGkpO1xuICAgICAgICB2YXIgbGluZUNhcHR1cmVzID0gdGhpcy5pbmRlbnRSZS5leGVjKCdcXG4nICsgc3RyKTtcbiAgICAgICAgdmFyIGxpbmVJbmRlbnRzID0gbGluZUNhcHR1cmVzICYmIGxpbmVDYXB0dXJlc1sxXS5sZW5ndGg7XG4gICAgICAgIGlzTWF0Y2ggPSBsaW5lSW5kZW50cyA+PSBpbmRlbnRzO1xuICAgICAgICB0b2tlbl9pbmRlbnQucHVzaChpc01hdGNoKTtcbiAgICAgICAgaXNNYXRjaCA9IGlzTWF0Y2ggfHwgIXN0ci50cmltKCk7XG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgLy8gY29uc3VtZSB0ZXN0IGFsb25nIHdpdGggYFxcbmAgcHJlZml4IGlmIG1hdGNoXG4gICAgICAgICAgc3RyaW5nUHRyICs9IHN0ci5sZW5ndGggKyAxO1xuICAgICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoaW5kZW50cykpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVJbmRlbnRzID4gdGhpcy5pbmRlbnRTdGFja1swXSkge1xuICAgICAgICAgIC8vIGxpbmUgaXMgaW5kZW50ZWQgbGVzcyB0aGFuIHRoZSBmaXJzdCBsaW5lIGJ1dCBpcyBzdGlsbCBpbmRlbnRlZFxuICAgICAgICAgIC8vIG5lZWQgdG8gcmV0cnkgbGV4aW5nIHRoZSB0ZXh0IGJsb2NrXG4gICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG4gICAgICAgICAgcmV0dXJuIHBpcGVsZXNzVGV4dC5jYWxsKHRoaXMsIGxpbmVDYXB0dXJlc1sxXS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLmlucHV0Lmxlbmd0aCAtIHN0cmluZ1B0ciAmJiBpc01hdGNoKTtcbiAgICAgIHRoaXMuY29uc3VtZShzdHJpbmdQdHIpO1xuICAgICAgd2hpbGUgKHRoaXMuaW5wdXQubGVuZ3RoID09PSAwICYmIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPT09ICcnKVxuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICB0b2tlbnMuZm9yRWFjaChcbiAgICAgICAgZnVuY3Rpb24odG9rZW4sIGkpIHtcbiAgICAgICAgICB2YXIgdG9rO1xuICAgICAgICAgIHRoaXMuaW5jcmVtZW50TGluZSgxKTtcbiAgICAgICAgICBpZiAoaSAhPT0gMCkgdG9rID0gdGhpcy50b2soJ25ld2xpbmUnKTtcbiAgICAgICAgICBpZiAodG9rZW5faW5kZW50W2ldKSB0aGlzLmluY3JlbWVudENvbHVtbihpbmRlbnRzKTtcbiAgICAgICAgICBpZiAodG9rKSB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgICAgIHRoaXMuYWRkVGV4dCgndGV4dCcsIHRva2VuKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICApO1xuICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLnRva0VuZCh0aGlzLnRvaygnZW5kLXBpcGVsZXNzLXRleHQnKSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTbGFzaC5cbiAgICovXG5cbiAgc2xhc2g6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL15cXC8vLCAnc2xhc2gnKTtcbiAgICBpZiAodG9rKSB7XG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMudG9rRW5kKHRvaykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiAnOidcbiAgICovXG5cbiAgY29sb246IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLnNjYW4oL146ICsvLCAnOicpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy50b2tFbmQodG9rKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgZmFpbDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5lcnJvcihcbiAgICAgICdVTkVYUEVDVEVEX1RFWFQnLFxuICAgICAgJ3VuZXhwZWN0ZWQgdGV4dCBcIicgKyB0aGlzLmlucHV0LnN1YnN0cigwLCA1KSArICdcIidcbiAgICApO1xuICB9LFxuXG4gIGNhbGxMZXhlckZ1bmN0aW9uOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIHJlc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdC5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuICAgIHZhciBwbHVnaW5BcmdzID0gW3RoaXNdLmNvbmNhdChyZXN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBsdWdpbiA9IHRoaXMucGx1Z2luc1tpXTtcbiAgICAgIGlmIChwbHVnaW5bZnVuY10gJiYgcGx1Z2luW2Z1bmNdLmFwcGx5KHBsdWdpbiwgcGx1Z2luQXJncykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzW2Z1bmNdLmFwcGx5KHRoaXMsIHJlc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBhZHZhbmNlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYmxhbmsnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZW9zJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2VuZEludGVycG9sYXRpb24nKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigneWllbGQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZG9jdHlwZScpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbnRlcnBvbGF0aW9uJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2Nhc2UnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignd2hlbicpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdkZWZhdWx0JykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2V4dGVuZHMnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYXBwZW5kJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3ByZXBlbmQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignYmxvY2snKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignbWl4aW5CbG9jaycpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbmNsdWRlJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ21peGluJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2NhbGwnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY29uZGl0aW9uYWwnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignZWFjaE9mJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2VhY2gnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignd2hpbGUnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigndGFnJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2ZpbHRlcicpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdibG9ja0NvZGUnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY29kZScpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpZCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdkb3QnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbignY2xhc3NOYW1lJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJzJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2F0dHJpYnV0ZXNCbG9jaycpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdpbmRlbnQnKSB8fFxuICAgICAgdGhpcy5jYWxsTGV4ZXJGdW5jdGlvbigndGV4dCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCd0ZXh0SHRtbCcpIHx8XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdjb21tZW50JykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ3NsYXNoJykgfHxcbiAgICAgIHRoaXMuY2FsbExleGVyRnVuY3Rpb24oJ2NvbG9uJykgfHxcbiAgICAgIHRoaXMuZmFpbCgpXG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIHRva2VucyBmb3IgdGhlIGN1cnJlbnQgZmlsZVxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXkuPFRva2VuPn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGdldFRva2VuczogZnVuY3Rpb24oKSB7XG4gICAgd2hpbGUgKCF0aGlzLmVuZGVkKSB7XG4gICAgICB0aGlzLmNhbGxMZXhlckZ1bmN0aW9uKCdhZHZhbmNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfSxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXJyb3IgPSByZXF1aXJlKCdwdWctZXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpcENvbW1lbnRzO1xuXG5mdW5jdGlvbiB1bmV4cGVjdGVkVG9rZW4odHlwZSwgb2NjYXNpb24sIGZpbGVuYW1lLCBsaW5lKSB7XG4gIHZhciBtc2cgPSAnYCcgKyB0eXBlICsgJ2AgZW5jb3VudGVyZWQgd2hlbiAnICsgb2NjYXNpb247XG4gIHRocm93IGVycm9yKCdVTkVYUEVDVEVEX1RPS0VOJywgbXNnLCB7ZmlsZW5hbWU6IGZpbGVuYW1lLCBsaW5lOiBsaW5lfSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRGVmYXVsdDogc3RyaXAgdW5idWZmZXJlZCBjb21tZW50cyBhbmQgbGVhdmUgYnVmZmVyZWQgb25lcyBhbG9uZVxuICB2YXIgc3RyaXBVbmJ1ZmZlcmVkID0gb3B0aW9ucy5zdHJpcFVuYnVmZmVyZWQgIT09IGZhbHNlO1xuICB2YXIgc3RyaXBCdWZmZXJlZCA9IG9wdGlvbnMuc3RyaXBCdWZmZXJlZCA9PT0gdHJ1ZTtcbiAgdmFyIGZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZTtcblxuICB2YXIgb3V0ID0gW107XG4gIC8vIElmIHdlIGhhdmUgZW5jb3VudGVyZWQgYSBjb21tZW50IHRva2VuIGFuZCBhcmUgbm90IHN1cmUgaWYgd2UgaGF2ZSBnb3R0ZW5cbiAgLy8gb3V0IG9mIHRoZSBjb21tZW50IG9yIG5vdFxuICB2YXIgaW5Db21tZW50ID0gZmFsc2U7XG4gIC8vIElmIHdlIGFyZSBzdXJlIHRoYXQgd2UgYXJlIGluIGEgYmxvY2sgY29tbWVudCBhbmQgYWxsIHRva2VucyBleGNlcHRcbiAgLy8gYGVuZC1waXBlbGVzcy10ZXh0YCBzaG91bGQgYmUgaWdub3JlZFxuICB2YXIgaW5QaXBlbGVzc1RleHQgPSBmYWxzZTtcblxuICByZXR1cm4gaW5wdXQuZmlsdGVyKGZ1bmN0aW9uKHRvaykge1xuICAgIHN3aXRjaCAodG9rLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICBpZiAoaW5Db21tZW50KSB7XG4gICAgICAgICAgdW5leHBlY3RlZFRva2VuKFxuICAgICAgICAgICAgJ2NvbW1lbnQnLFxuICAgICAgICAgICAgJ2FscmVhZHkgaW4gYSBjb21tZW50JyxcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgdG9rLmxpbmVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluQ29tbWVudCA9IHRvay5idWZmZXIgPyBzdHJpcEJ1ZmZlcmVkIDogc3RyaXBVbmJ1ZmZlcmVkO1xuICAgICAgICAgIHJldHVybiAhaW5Db21tZW50O1xuICAgICAgICB9XG4gICAgICBjYXNlICdzdGFydC1waXBlbGVzcy10ZXh0JzpcbiAgICAgICAgaWYgKCFpbkNvbW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoaW5QaXBlbGVzc1RleHQpIHtcbiAgICAgICAgICB1bmV4cGVjdGVkVG9rZW4oXG4gICAgICAgICAgICAnc3RhcnQtcGlwZWxlc3MtdGV4dCcsXG4gICAgICAgICAgICAnYWxyZWFkeSBpbiBwaXBlbGVzcyB0ZXh0IG1vZGUnLFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICB0b2subGluZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaW5QaXBlbGVzc1RleHQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICdlbmQtcGlwZWxlc3MtdGV4dCc6XG4gICAgICAgIGlmICghaW5Db21tZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpblBpcGVsZXNzVGV4dCkge1xuICAgICAgICAgIHVuZXhwZWN0ZWRUb2tlbihcbiAgICAgICAgICAgICdlbmQtcGlwZWxlc3MtdGV4dCcsXG4gICAgICAgICAgICAnbm90IGluIHBpcGVsZXNzIHRleHQgbW9kZScsXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIHRvay5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpblBpcGVsZXNzVGV4dCA9IGZhbHNlO1xuICAgICAgICBpbkNvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgYSBgdGV4dGAgcmlnaHQgYWZ0ZXIgYGNvbW1lbnRgIGJ1dCBiZWZvcmVcbiAgICAgIC8vIGBzdGFydC1waXBlbGVzcy10ZXh0YC4gVHJlYXQgaXQgYWNjb3JkaW5nbHkuXG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmV0dXJuICFpbkNvbW1lbnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaW5QaXBlbGVzc1RleHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaW5Db21tZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRva2VuU3RyZWFtO1xuZnVuY3Rpb24gVG9rZW5TdHJlYW0odG9rZW5zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9rZW5zIG11c3QgYmUgcGFzc2VkIHRvIFRva2VuU3RyZWFtIGFzIGFuIGFycmF5LicpO1xuICB9XG4gIHRoaXMuX3Rva2VucyA9IHRva2Vucztcbn1cblRva2VuU3RyZWFtLnByb3RvdHlwZS5sb29rYWhlYWQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgaWYgKHRoaXMuX3Rva2Vucy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiBhIHN0cmVhbScpO1xuICB9XG4gIHJldHVybiB0aGlzLl90b2tlbnNbaW5kZXhdO1xufTtcblRva2VuU3RyZWFtLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fdG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCB0aGUgZW5kIG9mIGEgc3RyZWFtJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3Rva2Vuc1swXTtcbn07XG5Ub2tlblN0cmVhbS5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3Rva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgdGhlIGVuZCBvZiBhIHN0cmVhbScpO1xuICB9XG4gIHJldHVybiB0aGlzLl90b2tlbnMuc2hpZnQoKTtcbn07XG5Ub2tlblN0cmVhbS5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgdGhpcy5fdG9rZW5zLnVuc2hpZnQodG9rZW4pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAnYScsXG4gICdhYmJyJyxcbiAgJ2Fjcm9ueW0nLFxuICAnYicsXG4gICdicicsXG4gICdjb2RlJyxcbiAgJ2VtJyxcbiAgJ2ZvbnQnLFxuICAnaScsXG4gICdpbWcnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdtYXAnLFxuICAnc2FtcCcsXG4gICdzbWFsbCcsXG4gICdzcGFuJyxcbiAgJ3N0cm9uZycsXG4gICdzdWInLFxuICAnc3VwJyxcbl07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgVG9rZW5TdHJlYW0gPSByZXF1aXJlKCd0b2tlbi1zdHJlYW0nKTtcbnZhciBlcnJvciA9IHJlcXVpcmUoJ3B1Zy1lcnJvcicpO1xudmFyIGlubGluZVRhZ3MgPSByZXF1aXJlKCcuL2xpYi9pbmxpbmUtdGFncycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xubW9kdWxlLmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuZnVuY3Rpb24gcGFyc2UodG9rZW5zLCBvcHRpb25zKSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKHRva2Vucywgb3B0aW9ucyk7XG4gIHZhciBhc3QgPSBwYXJzZXIucGFyc2UoKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXN0KSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgUGFyc2VyYCB3aXRoIHRoZSBnaXZlbiBpbnB1dCBgc3RyYCBhbmQgYGZpbGVuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFBhcnNlcih0b2tlbnMsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0V4cGVjdGVkIHRva2VucyB0byBiZSBhbiBBcnJheSBidXQgZ290IFwiJyArIHR5cGVvZiB0b2tlbnMgKyAnXCInXG4gICAgKTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0V4cGVjdGVkIFwib3B0aW9uc1wiIHRvIGJlIGFuIG9iamVjdCBidXQgZ290IFwiJyArIHR5cGVvZiBvcHRpb25zICsgJ1wiJ1xuICAgICk7XG4gIH1cbiAgdGhpcy50b2tlbnMgPSBuZXcgVG9rZW5TdHJlYW0odG9rZW5zKTtcbiAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIHRoaXMuc3JjID0gb3B0aW9ucy5zcmM7XG4gIHRoaXMuaW5NaXhpbiA9IDA7XG4gIHRoaXMucGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucyB8fCBbXTtcbn1cblxuLyoqXG4gKiBQYXJzZXIgcHJvdG90eXBlLlxuICovXG5cblBhcnNlci5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBTYXZlIG9yaWdpbmFsIGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yOiBQYXJzZXIsXG5cbiAgZXJyb3I6IGZ1bmN0aW9uKGNvZGUsIG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdmFyIGVyciA9IGVycm9yKGNvZGUsIG1lc3NhZ2UsIHtcbiAgICAgIGxpbmU6IHRva2VuLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2tlbi5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICBzcmM6IHRoaXMuc3JjLFxuICAgIH0pO1xuICAgIHRocm93IGVycjtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBuZXh0IHRva2VuIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgYWR2YW5jZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmFkdmFuY2UoKTtcbiAgfSxcblxuICAvKipcbiAgICogU2luZ2xlIHRva2VuIGxvb2thaGVhZC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgcGVlazogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLnBlZWsoKTtcbiAgfSxcblxuICAvKipcbiAgICogYG5gIHRva2VuIGxvb2thaGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgbG9va2FoZWFkOiBmdW5jdGlvbihuKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmxvb2thaGVhZChuKTtcbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgaW5wdXQgcmV0dXJuaW5nIGEgc3RyaW5nIG9mIGpzIGZvciBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHBhcnNlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYmxvY2sgPSB0aGlzLmVtcHR5QmxvY2soMCk7XG5cbiAgICB3aGlsZSAoJ2VvcycgIT0gdGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgaWYgKCduZXdsaW5lJyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIGlmICgndGV4dC1odG1sJyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICAgIGJsb2NrLm5vZGVzID0gYmxvY2subm9kZXMuY29uY2F0KHRoaXMucGFyc2VUZXh0SHRtbCgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgICAgaWYgKGV4cHIpIHtcbiAgICAgICAgICBpZiAoZXhwci50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgICAgICBibG9jay5ub2RlcyA9IGJsb2NrLm5vZGVzLmNvbmNhdChleHByLm5vZGVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2subm9kZXMucHVzaChleHByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmxvY2s7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4cGVjdCB0aGUgZ2l2ZW4gdHlwZSwgb3IgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgZXhwZWN0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ0lOVkFMSURfVE9LRU4nLFxuICAgICAgICAnZXhwZWN0ZWQgXCInICsgdHlwZSArICdcIiwgYnV0IGdvdCBcIicgKyB0aGlzLnBlZWsoKS50eXBlICsgJ1wiJyxcbiAgICAgICAgdGhpcy5wZWVrKClcbiAgICAgICk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGdpdmVuIGB0eXBlYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGFjY2VwdDogZnVuY3Rpb24odHlwZSkge1xuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9LFxuXG4gIGluaXRCbG9jazogZnVuY3Rpb24obGluZSwgbm9kZXMpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoKGxpbmUgfCAwKSAhPT0gbGluZSkgdGhyb3cgbmV3IEVycm9yKCdgbGluZWAgaXMgbm90IGFuIGludGVnZXInKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2Bub2Rlc2AgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9jaycsXG4gICAgICBub2Rlczogbm9kZXMsXG4gICAgICBsaW5lOiBsaW5lLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfSxcblxuICBlbXB0eUJsb2NrOiBmdW5jdGlvbihsaW5lKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdEJsb2NrKGxpbmUsIFtdKTtcbiAgfSxcblxuICBydW5QbHVnaW46IGZ1bmN0aW9uKGNvbnRleHQsIHRvaykge1xuICAgIHZhciByZXN0ID0gW3RoaXNdO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0LnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG4gICAgdmFyIHBsdWdpbkNvbnRleHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbHVnaW4gPSB0aGlzLnBsdWdpbnNbaV07XG4gICAgICBpZiAocGx1Z2luW2NvbnRleHRdICYmIHBsdWdpbltjb250ZXh0XVt0b2sudHlwZV0pIHtcbiAgICAgICAgaWYgKHBsdWdpbkNvbnRleHQpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ011bHRpcGxlIHBsdWdpbiBoYW5kbGVycyBmb3VuZCBmb3IgY29udGV4dCAnICtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29udGV4dCkgK1xuICAgICAgICAgICAgICAnLCB0b2tlbiB0eXBlICcgK1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0b2sudHlwZSlcbiAgICAgICAgICApO1xuICAgICAgICBwbHVnaW5Db250ZXh0ID0gcGx1Z2luW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGx1Z2luQ29udGV4dClcbiAgICAgIHJldHVybiBwbHVnaW5Db250ZXh0W3Rvay50eXBlXS5hcHBseShwbHVnaW5Db250ZXh0LCByZXN0KTtcbiAgfSxcblxuICAvKipcbiAgICogICB0YWdcbiAgICogfCBkb2N0eXBlXG4gICAqIHwgbWl4aW5cbiAgICogfCBpbmNsdWRlXG4gICAqIHwgZmlsdGVyXG4gICAqIHwgY29tbWVudFxuICAgKiB8IHRleHRcbiAgICogfCB0ZXh0LWh0bWxcbiAgICogfCBkb3RcbiAgICogfCBlYWNoXG4gICAqIHwgY29kZVxuICAgKiB8IHlpZWxkXG4gICAqIHwgaWRcbiAgICogfCBjbGFzc1xuICAgKiB8IGludGVycG9sYXRpb25cbiAgICovXG5cbiAgcGFyc2VFeHByOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVGFnKCk7XG4gICAgICBjYXNlICdtaXhpbic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTWl4aW4oKTtcbiAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCbG9jaygpO1xuICAgICAgY2FzZSAnbWl4aW4tYmxvY2snOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU1peGluQmxvY2soKTtcbiAgICAgIGNhc2UgJ2Nhc2UnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNhc2UoKTtcbiAgICAgIGNhc2UgJ2V4dGVuZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4dGVuZHMoKTtcbiAgICAgIGNhc2UgJ2luY2x1ZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUluY2x1ZGUoKTtcbiAgICAgIGNhc2UgJ2RvY3R5cGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURvY3R5cGUoKTtcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRmlsdGVyKCk7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb21tZW50KCk7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGNhc2UgJ2ludGVycG9sYXRlZC1jb2RlJzpcbiAgICAgIGNhc2UgJ3N0YXJ0LXB1Zy1pbnRlcnBvbGF0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUZXh0KHtibG9jazogdHJ1ZX0pO1xuICAgICAgY2FzZSAndGV4dC1odG1sJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdEJsb2NrKHRoaXMucGVlaygpLmxvYy5zdGFydC5saW5lLCB0aGlzLnBhcnNlVGV4dEh0bWwoKSk7XG4gICAgICBjYXNlICdkb3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURvdCgpO1xuICAgICAgY2FzZSAnZWFjaCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRWFjaCgpO1xuICAgICAgY2FzZSAnZWFjaE9mJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFYWNoT2YoKTtcbiAgICAgIGNhc2UgJ2NvZGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNvZGUoKTtcbiAgICAgIGNhc2UgJ2Jsb2NrY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2tDb2RlKCk7XG4gICAgICBjYXNlICdpZic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgIGNhc2UgJ3doaWxlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VXaGlsZSgpO1xuICAgICAgY2FzZSAnY2FsbCc6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2FsbCgpO1xuICAgICAgY2FzZSAnaW50ZXJwb2xhdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlSW50ZXJwb2xhdGlvbigpO1xuICAgICAgY2FzZSAneWllbGQnOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVlpZWxkKCk7XG4gICAgICBjYXNlICdpZCc6XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIGlmICghdGhpcy5wZWVrKCkubG9jLnN0YXJ0KSBkZWJ1Z2dlcjtcbiAgICAgICAgdGhpcy50b2tlbnMuZGVmZXIoe1xuICAgICAgICAgIHR5cGU6ICd0YWcnLFxuICAgICAgICAgIHZhbDogJ2RpdicsXG4gICAgICAgICAgbG9jOiB0aGlzLnBlZWsoKS5sb2MsXG4gICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBwbHVnaW5SZXN1bHQgPSB0aGlzLnJ1blBsdWdpbignZXhwcmVzc2lvblRva2VucycsIHRoaXMucGVlaygpKTtcbiAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgcmV0dXJuIHBsdWdpblJlc3VsdDtcbiAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAnSU5WQUxJRF9UT0tFTicsXG4gICAgICAgICAgJ3VuZXhwZWN0ZWQgdG9rZW4gXCInICsgdGhpcy5wZWVrKCkudHlwZSArICdcIicsXG4gICAgICAgICAgdGhpcy5wZWVrKClcbiAgICAgICAgKTtcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VEb3Q6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGV4dEJsb2NrKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRleHRcbiAgICovXG5cbiAgcGFyc2VUZXh0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIHRhZ3MgPSBbXTtcbiAgICB2YXIgbGluZW5vID0gdGhpcy5wZWVrKCkubG9jLnN0YXJ0LmxpbmU7XG4gICAgdmFyIG5leHRUb2sgPSB0aGlzLnBlZWsoKTtcbiAgICBsb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChuZXh0VG9rLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ludGVycG9sYXRlZC1jb2RlJzpcbiAgICAgICAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDb2RlJyxcbiAgICAgICAgICAgIHZhbDogdG9rLnZhbCxcbiAgICAgICAgICAgIGJ1ZmZlcjogdG9rLmJ1ZmZlcixcbiAgICAgICAgICAgIG11c3RFc2NhcGU6IHRvay5tdXN0RXNjYXBlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIGlzSW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMuYmxvY2spIGJyZWFrIGxvb3A7XG4gICAgICAgICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHZhciBuZXh0VHlwZSA9IHRoaXMucGVlaygpLnR5cGU7XG4gICAgICAgICAgaWYgKG5leHRUeXBlID09PSAndGV4dCcgfHwgbmV4dFR5cGUgPT09ICdpbnRlcnBvbGF0ZWQtY29kZScpIHtcbiAgICAgICAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdmFsOiAnXFxuJyxcbiAgICAgICAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhcnQtcHVnLWludGVycG9sYXRpb24nOlxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRhZ3MucHVzaCh0aGlzLnBhcnNlRXhwcigpKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCgnZW5kLXB1Zy1pbnRlcnBvbGF0aW9uJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKCd0ZXh0VG9rZW5zJywgbmV4dFRvaywgdGFncyk7XG4gICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgYnJlYWs7XG4gICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgIH1cbiAgICAgIG5leHRUb2sgPSB0aGlzLnBlZWsoKTtcbiAgICB9XG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAxKSByZXR1cm4gdGFnc1swXTtcbiAgICBlbHNlIHJldHVybiB0aGlzLmluaXRCbG9jayhsaW5lbm8sIHRhZ3MpO1xuICB9LFxuXG4gIHBhcnNlVGV4dEh0bWw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBub2RlcyA9IFtdO1xuICAgIHZhciBjdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICd0ZXh0LWh0bWwnOlxuICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdmFsOiB0ZXh0LnZhbCxcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgICAgIGxpbmU6IHRleHQubG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogdGV4dC5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgICBpc0h0bWw6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnZhbCArPSAnXFxuJyArIHRleHQudmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaW5kZW50JzpcbiAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgICAgICAgYmxvY2subm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0h0bWwpIHtcbiAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS52YWwgKz0gJ1xcbicgKyBub2RlLnZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb2RlJzpcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgbm9kZXMucHVzaCh0aGlzLnBhcnNlQ29kZSh0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlcztcbiAgfSxcblxuICAvKipcbiAgICogICAnOicgZXhwclxuICAgKiB8IGJsb2NrXG4gICAqL1xuXG4gIHBhcnNlQmxvY2tFeHBhbnNpb246IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmFjY2VwdCgnOicpO1xuICAgIGlmICh0b2spIHtcbiAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHIoKTtcbiAgICAgIHJldHVybiBleHByLnR5cGUgPT09ICdCbG9jaydcbiAgICAgICAgPyBleHByXG4gICAgICAgIDogdGhpcy5pbml0QmxvY2sodG9rLmxvYy5zdGFydC5saW5lLCBbZXhwcl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5ibG9jaygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogY2FzZVxuICAgKi9cblxuICBwYXJzZUNhc2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnY2FzZScpO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0Nhc2UnLFxuICAgICAgZXhwcjogdG9rLnZhbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSArIDEpO1xuICAgIHRoaXMuZXhwZWN0KCdpbmRlbnQnKTtcbiAgICB3aGlsZSAoJ291dGRlbnQnICE9IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3doZW4nOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZVdoZW4oKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZURlZmF1bHQoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKCdjYXNlVG9rZW5zJywgdGhpcy5wZWVrKCksIGJsb2NrKTtcbiAgICAgICAgICBpZiAocGx1Z2luUmVzdWx0KSBicmVhaztcbiAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgJ0lOVkFMSURfVE9LRU4nLFxuICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgdG9rZW4gXCInICtcbiAgICAgICAgICAgICAgdGhpcy5wZWVrKCkudHlwZSArXG4gICAgICAgICAgICAgICdcIiwgZXhwZWN0ZWQgXCJ3aGVuXCIsIFwiZGVmYXVsdFwiIG9yIFwibmV3bGluZVwiJyxcbiAgICAgICAgICAgIHRoaXMucGVlaygpXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5leHBlY3QoJ291dGRlbnQnKTtcblxuICAgIG5vZGUuYmxvY2sgPSBibG9jaztcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuXG4gIC8qKlxuICAgKiB3aGVuXG4gICAqL1xuXG4gIHBhcnNlV2hlbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCd3aGVuJyk7XG4gICAgaWYgKHRoaXMucGVlaygpLnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ1doZW4nLFxuICAgICAgICBleHByOiB0b2sudmFsLFxuICAgICAgICBibG9jazogdGhpcy5wYXJzZUJsb2NrRXhwYW5zaW9uKCksXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdXaGVuJyxcbiAgICAgICAgZXhwcjogdG9rLnZhbCxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGRlZmF1bHRcbiAgICovXG5cbiAgcGFyc2VEZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5leHBlY3QoJ2RlZmF1bHQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1doZW4nLFxuICAgICAgZXhwcjogJ2RlZmF1bHQnLFxuICAgICAgYmxvY2s6IHRoaXMucGFyc2VCbG9ja0V4cGFuc2lvbigpLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvZGVcbiAgICovXG5cbiAgcGFyc2VDb2RlOiBmdW5jdGlvbihub0Jsb2NrKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdjb2RlJyk7XG4gICAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIHRvay5tdXN0RXNjYXBlID09PSAnYm9vbGVhbicsXG4gICAgICAnUGxlYXNlIHVwZGF0ZSB0byB0aGUgbmV3ZXN0IHZlcnNpb24gb2YgcHVnLWxleGVyLidcbiAgICApO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0NvZGUnLFxuICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgYnVmZmVyOiB0b2suYnVmZmVyLFxuICAgICAgbXVzdEVzY2FwZTogdG9rLm11c3RFc2NhcGUgIT09IGZhbHNlLFxuICAgICAgaXNJbmxpbmU6ICEhbm9CbG9jayxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICAgIC8vIHRvZG86IHdoeSBpcyB0aGlzIGhlcmU/ICBJdCBzZWVtcyBsaWtlIGEgaGFja3kgd29ya2Fyb3VuZFxuICAgIGlmIChub2RlLnZhbC5tYXRjaCgvXiAqZWxzZS8pKSBub2RlLmRlYnVnID0gZmFsc2U7XG5cbiAgICBpZiAobm9CbG9jaykgcmV0dXJuIG5vZGU7XG5cbiAgICB2YXIgYmxvY2s7XG5cbiAgICAvLyBoYW5kbGUgYmxvY2tcbiAgICBibG9jayA9ICdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGU7XG4gICAgaWYgKGJsb2NrKSB7XG4gICAgICBpZiAodG9rLmJ1ZmZlcikge1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdCTE9DS19JTl9CVUZGRVJFRF9DT0RFJyxcbiAgICAgICAgICAnQnVmZmVyZWQgY29kZSBjYW5ub3QgaGF2ZSBhIGJsb2NrIGF0dGFjaGVkIHRvIGl0JyxcbiAgICAgICAgICB0aGlzLnBlZWsoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbm9kZS5ibG9jayA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcbiAgcGFyc2VDb25kaXRpb25hbDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdpZicpO1xuICAgIHZhciBub2RlID0ge1xuICAgICAgdHlwZTogJ0NvbmRpdGlvbmFsJyxcbiAgICAgIHRlc3Q6IHRvay52YWwsXG4gICAgICBjb25zZXF1ZW50OiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGFsdGVybmF0ZTogbnVsbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgLy8gaGFuZGxlIGJsb2NrXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIG5vZGUuY29uc2VxdWVudCA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSBub2RlO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ25ld2xpbmUnKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KCduZXdsaW5lJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09ICdlbHNlLWlmJykge1xuICAgICAgICB0b2sgPSB0aGlzLmV4cGVjdCgnZWxzZS1pZicpO1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmFsdGVybmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiAnQ29uZGl0aW9uYWwnLFxuICAgICAgICAgIHRlc3Q6IHRvay52YWwsXG4gICAgICAgICAgY29uc2VxdWVudDogdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSksXG4gICAgICAgICAgYWx0ZXJuYXRlOiBudWxsLFxuICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoJ2luZGVudCcgPT0gdGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICAgIGN1cnJlbnROb2RlLmNvbnNlcXVlbnQgPSB0aGlzLmJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ2Vsc2UnKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KCdlbHNlJyk7XG4gICAgICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnaW5kZW50Jykge1xuICAgICAgICAgIGN1cnJlbnROb2RlLmFsdGVybmF0ZSA9IHRoaXMuYmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBwYXJzZVdoaWxlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5leHBlY3QoJ3doaWxlJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnV2hpbGUnLFxuICAgICAgdGVzdDogdG9rLnZhbCxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgLy8gaGFuZGxlIGJsb2NrXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIG5vZGUuYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYmxvY2sgPSB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcblxuICAvKipcbiAgICogYmxvY2sgY29kZVxuICAgKi9cblxuICBwYXJzZUJsb2NrQ29kZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdibG9ja2NvZGUnKTtcbiAgICB2YXIgbGluZSA9IHRvay5sb2Muc3RhcnQubGluZTtcbiAgICB2YXIgY29sdW1uID0gdG9rLmxvYy5zdGFydC5jb2x1bW47XG4gICAgdmFyIGJvZHkgPSB0aGlzLnBlZWsoKTtcbiAgICB2YXIgdGV4dCA9ICcnO1xuICAgIGlmIChib2R5LnR5cGUgPT09ICdzdGFydC1waXBlbGVzcy10ZXh0Jykge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB3aGlsZSAodGhpcy5wZWVrKCkudHlwZSAhPT0gJ2VuZC1waXBlbGVzcy10ZXh0Jykge1xuICAgICAgICB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgc3dpdGNoICh0b2sudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgdGV4dCArPSB0b2sudmFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICB0ZXh0ICs9ICdcXG4nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBwbHVnaW5SZXN1bHQgPSB0aGlzLnJ1blBsdWdpbignYmxvY2tDb2RlVG9rZW5zJywgdG9rLCB0b2spO1xuICAgICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkge1xuICAgICAgICAgICAgICB0ZXh0ICs9IHBsdWdpblJlc3VsdDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICAgICAnSU5WQUxJRF9UT0tFTicsXG4gICAgICAgICAgICAgICdVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICcgKyB0b2sudHlwZSxcbiAgICAgICAgICAgICAgdG9rXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdDb2RlJyxcbiAgICAgIHZhbDogdGV4dCxcbiAgICAgIGJ1ZmZlcjogZmFsc2UsXG4gICAgICBtdXN0RXNjYXBlOiBmYWxzZSxcbiAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBjb21tZW50XG4gICAqL1xuXG4gIHBhcnNlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdjb21tZW50Jyk7XG4gICAgdmFyIGJsb2NrO1xuICAgIGlmICgoYmxvY2sgPSB0aGlzLnBhcnNlVGV4dEJsb2NrKCkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnQmxvY2tDb21tZW50JyxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBibG9jazogYmxvY2ssXG4gICAgICAgIGJ1ZmZlcjogdG9rLmJ1ZmZlcixcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdDb21tZW50JyxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBidWZmZXI6IHRvay5idWZmZXIsXG4gICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogZG9jdHlwZVxuICAgKi9cblxuICBwYXJzZURvY3R5cGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZG9jdHlwZScpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRG9jdHlwZScsXG4gICAgICB2YWw6IHRvay52YWwsXG4gICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUluY2x1ZGVGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgdmFyIGF0dHJzID0gW107XG5cbiAgICBpZiAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ3N0YXJ0LWF0dHJpYnV0ZXMnKSB7XG4gICAgICBhdHRycyA9IHRoaXMuYXR0cnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0luY2x1ZGVGaWx0ZXInLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaWx0ZXIgYXR0cnM/IHRleHQtYmxvY2tcbiAgICovXG5cbiAgcGFyc2VGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZmlsdGVyJyk7XG4gICAgdmFyIGJsb2NrLFxuICAgICAgYXR0cnMgPSBbXTtcblxuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnc3RhcnQtYXR0cmlidXRlcycpIHtcbiAgICAgIGF0dHJzID0gdGhpcy5hdHRycygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHZhciB0ZXh0VG9rZW4gPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIGJsb2NrID0gdGhpcy5pbml0QmxvY2sodGV4dFRva2VuLmxvYy5zdGFydC5saW5lLCBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgdmFsOiB0ZXh0VG9rZW4udmFsLFxuICAgICAgICAgIGxpbmU6IHRleHRUb2tlbi5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICBjb2x1bW46IHRleHRUb2tlbi5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS50eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgYmxvY2sgPSB0aGlzLmluaXRCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUsIFt0aGlzLnBhcnNlRmlsdGVyKCldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmxvY2sgPSB0aGlzLnBhcnNlVGV4dEJsb2NrKCkgfHwgdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdGaWx0ZXInLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICAgIGF0dHJzOiBhdHRycyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBlYWNoIGJsb2NrXG4gICAqL1xuXG4gIHBhcnNlRWFjaDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdlYWNoJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnRWFjaCcsXG4gICAgICBvYmo6IHRvay5jb2RlLFxuICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAga2V5OiB0b2sua2V5LFxuICAgICAgYmxvY2s6IHRoaXMuYmxvY2soKSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLnBlZWsoKS50eXBlID09ICdlbHNlJykge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMuYmxvY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG5cbiAgcGFyc2VFYWNoT2Y6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZWFjaE9mJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnRWFjaE9mJyxcbiAgICAgIG9iajogdG9rLmNvZGUsXG4gICAgICB2YWw6IHRvay52YWwsXG4gICAgICBibG9jazogdGhpcy5ibG9jaygpLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG4gIC8qKlxuICAgKiAnZXh0ZW5kcycgbmFtZVxuICAgKi9cblxuICBwYXJzZUV4dGVuZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnZXh0ZW5kcycpO1xuICAgIHZhciBwYXRoID0gdGhpcy5leHBlY3QoJ3BhdGgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0V4dGVuZHMnLFxuICAgICAgZmlsZToge1xuICAgICAgICB0eXBlOiAnRmlsZVJlZmVyZW5jZScsXG4gICAgICAgIHBhdGg6IHBhdGgudmFsLnRyaW0oKSxcbiAgICAgICAgbGluZTogcGF0aC5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgY29sdW1uOiBwYXRoLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgfSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiAnYmxvY2snIG5hbWUgYmxvY2tcbiAgICovXG5cbiAgcGFyc2VCbG9jazogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdibG9jaycpO1xuXG4gICAgdmFyIG5vZGUgPVxuICAgICAgJ2luZGVudCcgPT0gdGhpcy5wZWVrKCkudHlwZVxuICAgICAgICA/IHRoaXMuYmxvY2soKVxuICAgICAgICA6IHRoaXMuZW1wdHlCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUpO1xuICAgIG5vZGUudHlwZSA9ICdOYW1lZEJsb2NrJztcbiAgICBub2RlLm5hbWUgPSB0b2sudmFsLnRyaW0oKTtcbiAgICBub2RlLm1vZGUgPSB0b2subW9kZTtcbiAgICBub2RlLmxpbmUgPSB0b2subG9jLnN0YXJ0LmxpbmU7XG4gICAgbm9kZS5jb2x1bW4gPSB0b2subG9jLnN0YXJ0LmNvbHVtbjtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuXG4gIHBhcnNlTWl4aW5CbG9jazogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdtaXhpbi1ibG9jaycpO1xuICAgIGlmICghdGhpcy5pbk1peGluKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICAnQkxPQ0tfT1VUSVNERV9NSVhJTicsXG4gICAgICAgICdBbm9ueW1vdXMgYmxvY2tzIGFyZSBub3QgYWxsb3dlZCB1bmxlc3MgdGhleSBhcmUgcGFydCBvZiBhIG1peGluLicsXG4gICAgICAgIHRva1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNaXhpbkJsb2NrJyxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuICB9LFxuXG4gIHBhcnNlWWllbGQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgneWllbGQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1lpZWxkQmxvY2snLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGluY2x1ZGUgYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlSW5jbHVkZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdpbmNsdWRlJyk7XG4gICAgdmFyIG5vZGUgPSB7XG4gICAgICB0eXBlOiAnSW5jbHVkZScsXG4gICAgICBmaWxlOiB7XG4gICAgICAgIHR5cGU6ICdGaWxlUmVmZXJlbmNlJyxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICB9LFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG4gICAgdmFyIGZpbHRlcnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5wZWVrKCkudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIGZpbHRlcnMucHVzaCh0aGlzLnBhcnNlSW5jbHVkZUZpbHRlcigpKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSB0aGlzLmV4cGVjdCgncGF0aCcpO1xuXG4gICAgbm9kZS5maWxlLnBhdGggPSBwYXRoLnZhbC50cmltKCk7XG4gICAgbm9kZS5maWxlLmxpbmUgPSBwYXRoLmxvYy5zdGFydC5saW5lO1xuICAgIG5vZGUuZmlsZS5jb2x1bW4gPSBwYXRoLmxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBpZiAoXG4gICAgICAoL1xcLmphZGUkLy50ZXN0KG5vZGUuZmlsZS5wYXRoKSB8fCAvXFwucHVnJC8udGVzdChub2RlLmZpbGUucGF0aCkpICYmXG4gICAgICAhZmlsdGVycy5sZW5ndGhcbiAgICApIHtcbiAgICAgIG5vZGUuYmxvY2sgPVxuICAgICAgICAnaW5kZW50JyA9PSB0aGlzLnBlZWsoKS50eXBlXG4gICAgICAgICAgPyB0aGlzLmJsb2NrKClcbiAgICAgICAgICA6IHRoaXMuZW1wdHlCbG9jayh0b2subG9jLnN0YXJ0LmxpbmUpO1xuICAgICAgaWYgKC9cXC5qYWRlJC8udGVzdChub2RlLmZpbGUucGF0aCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIHRoaXMuZmlsZW5hbWUgK1xuICAgICAgICAgICAgJywgbGluZSAnICtcbiAgICAgICAgICAgIHRvay5sb2Muc3RhcnQubGluZSArXG4gICAgICAgICAgICAnOlxcblRoZSAuamFkZSBleHRlbnNpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC5wdWcgZm9yIFwiJyArXG4gICAgICAgICAgICBub2RlLmZpbGUucGF0aCArXG4gICAgICAgICAgICAnXCIuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnR5cGUgPSAnUmF3SW5jbHVkZSc7XG4gICAgICBub2RlLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgaWYgKHRoaXMucGVlaygpLnR5cGUgPT09ICdpbmRlbnQnKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgJ1JBV19JTkNMVURFX0JMT0NLJyxcbiAgICAgICAgICAnUmF3IGluY2x1c2lvbiBjYW5ub3QgY29udGFpbiBhIGJsb2NrJyxcbiAgICAgICAgICB0aGlzLnBlZWsoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsbCBpZGVudCBibG9ja1xuICAgKi9cblxuICBwYXJzZUNhbGw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnY2FsbCcpO1xuICAgIHZhciBuYW1lID0gdG9rLnZhbDtcbiAgICB2YXIgYXJncyA9IHRvay5hcmdzO1xuICAgIHZhciBtaXhpbiA9IHtcbiAgICAgIHR5cGU6ICdNaXhpbicsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgYXJnczogYXJncyxcbiAgICAgIGJsb2NrOiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGNhbGw6IHRydWUsXG4gICAgICBhdHRyczogW10sXG4gICAgICBhdHRyaWJ1dGVCbG9ja3M6IFtdLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG5cbiAgICB0aGlzLnRhZyhtaXhpbik7XG4gICAgaWYgKG1peGluLmNvZGUpIHtcbiAgICAgIG1peGluLmJsb2NrLm5vZGVzLnB1c2gobWl4aW4uY29kZSk7XG4gICAgICBkZWxldGUgbWl4aW4uY29kZTtcbiAgICB9XG4gICAgaWYgKG1peGluLmJsb2NrLm5vZGVzLmxlbmd0aCA9PT0gMCkgbWl4aW4uYmxvY2sgPSBudWxsO1xuICAgIHJldHVybiBtaXhpbjtcbiAgfSxcblxuICAvKipcbiAgICogbWl4aW4gYmxvY2tcbiAgICovXG5cbiAgcGFyc2VNaXhpbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuZXhwZWN0KCdtaXhpbicpO1xuICAgIHZhciBuYW1lID0gdG9rLnZhbDtcbiAgICB2YXIgYXJncyA9IHRvay5hcmdzO1xuXG4gICAgaWYgKCdpbmRlbnQnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHRoaXMuaW5NaXhpbisrO1xuICAgICAgdmFyIG1peGluID0ge1xuICAgICAgICB0eXBlOiAnTWl4aW4nLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICBibG9jazogdGhpcy5ibG9jaygpLFxuICAgICAgICBjYWxsOiBmYWxzZSxcbiAgICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgIH07XG4gICAgICB0aGlzLmluTWl4aW4tLTtcbiAgICAgIHJldHVybiBtaXhpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgJ01JWElOX1dJVEhPVVRfQk9EWScsXG4gICAgICAgICdNaXhpbiAnICsgbmFtZSArICcgZGVjbGFyZWQgd2l0aG91dCBib2R5JyxcbiAgICAgICAgdG9rXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogaW5kZW50ICh0ZXh0IHwgbmV3bGluZSkqIG91dGRlbnRcbiAgICovXG5cbiAgcGFyc2VUZXh0QmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmFjY2VwdCgnc3RhcnQtcGlwZWxlc3MtdGV4dCcpO1xuICAgIGlmICghdG9rKSByZXR1cm47XG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgd2hpbGUgKHRoaXMucGVlaygpLnR5cGUgIT09ICdlbmQtcGlwZWxlc3MtdGV4dCcpIHtcbiAgICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHN3aXRjaCAodG9rLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHRvay5sb2Muc3RhcnQuY29sdW1uLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgICAgdmFsOiAnXFxuJyxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhcnQtcHVnLWludGVycG9sYXRpb24nOlxuICAgICAgICAgIGJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZUV4cHIoKSk7XG4gICAgICAgICAgdGhpcy5leHBlY3QoJ2VuZC1wdWctaW50ZXJwb2xhdGlvbicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpbnRlcnBvbGF0ZWQtY29kZSc6XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnQ29kZScsXG4gICAgICAgICAgICB2YWw6IHRvay52YWwsXG4gICAgICAgICAgICBidWZmZXI6IHRvay5idWZmZXIsXG4gICAgICAgICAgICBtdXN0RXNjYXBlOiB0b2subXVzdEVzY2FwZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICBpc0lubGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXIgcGx1Z2luUmVzdWx0ID0gdGhpcy5ydW5QbHVnaW4oJ3RleHRCbG9ja1Rva2VucycsIHRvaywgYmxvY2ssIHRvayk7XG4gICAgICAgICAgaWYgKHBsdWdpblJlc3VsdCkgYnJlYWs7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICdJTlZBTElEX1RPS0VOJyxcbiAgICAgICAgICAgICdVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICcgKyB0b2sudHlwZSxcbiAgICAgICAgICAgIHRva1xuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIHJldHVybiBibG9jaztcbiAgfSxcblxuICAvKipcbiAgICogaW5kZW50IGV4cHIqIG91dGRlbnRcbiAgICovXG5cbiAgYmxvY2s6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2sgPSB0aGlzLmV4cGVjdCgnaW5kZW50Jyk7XG4gICAgdmFyIGJsb2NrID0gdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSk7XG4gICAgd2hpbGUgKCdvdXRkZW50JyAhPSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICBpZiAoJ25ld2xpbmUnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9IGVsc2UgaWYgKCd0ZXh0LWh0bWwnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgICAgYmxvY2subm9kZXMgPSBibG9jay5ub2Rlcy5jb25jYXQodGhpcy5wYXJzZVRleHRIdG1sKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcigpO1xuICAgICAgICBpZiAoZXhwci50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgICAgYmxvY2subm9kZXMgPSBibG9jay5ub2Rlcy5jb25jYXQoZXhwci5ub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2subm9kZXMucHVzaChleHByKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmV4cGVjdCgnb3V0ZGVudCcpO1xuICAgIHJldHVybiBibG9jaztcbiAgfSxcblxuICAvKipcbiAgICogaW50ZXJwb2xhdGlvbiAoYXR0cnMgfCBjbGFzcyB8IGlkKSogKHRleHQgfCBjb2RlIHwgJzonKT8gbmV3bGluZSogYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlSW50ZXJwb2xhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIHZhciB0YWcgPSB7XG4gICAgICB0eXBlOiAnSW50ZXJwb2xhdGVkVGFnJyxcbiAgICAgIGV4cHI6IHRvay52YWwsXG4gICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICBibG9jazogdGhpcy5lbXB0eUJsb2NrKHRvay5sb2Muc3RhcnQubGluZSksXG4gICAgICBhdHRyczogW10sXG4gICAgICBhdHRyaWJ1dGVCbG9ja3M6IFtdLFxuICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgbGluZTogdG9rLmxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiB0b2subG9jLnN0YXJ0LmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy50YWcodGFnLCB7c2VsZkNsb3NpbmdBbGxvd2VkOiB0cnVlfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRhZyAoYXR0cnMgfCBjbGFzcyB8IGlkKSogKHRleHQgfCBjb2RlIHwgJzonKT8gbmV3bGluZSogYmxvY2s/XG4gICAqL1xuXG4gIHBhcnNlVGFnOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHRhZyA9IHtcbiAgICAgIHR5cGU6ICdUYWcnLFxuICAgICAgbmFtZTogdG9rLnZhbCxcbiAgICAgIHNlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgIGJsb2NrOiB0aGlzLmVtcHR5QmxvY2sodG9rLmxvYy5zdGFydC5saW5lKSxcbiAgICAgIGF0dHJzOiBbXSxcbiAgICAgIGF0dHJpYnV0ZUJsb2NrczogW10sXG4gICAgICBpc0lubGluZTogaW5saW5lVGFncy5pbmRleE9mKHRvay52YWwpICE9PSAtMSxcbiAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMudGFnKHRhZywge3NlbGZDbG9zaW5nQWxsb3dlZDogdHJ1ZX0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0YWcuXG4gICAqL1xuXG4gIHRhZzogZnVuY3Rpb24odGFnLCBvcHRpb25zKSB7XG4gICAgdmFyIHNlZW5BdHRycyA9IGZhbHNlO1xuICAgIHZhciBhdHRyaWJ1dGVOYW1lcyA9IFtdO1xuICAgIHZhciBzZWxmQ2xvc2luZ0FsbG93ZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuc2VsZkNsb3NpbmdBbGxvd2VkO1xuICAgIC8vIChhdHRycyB8IGNsYXNzIHwgaWQpKlxuICAgIG91dDogd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgICBjYXNlICdpZCc6XG4gICAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgICB2YXIgdG9rID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgaWYgKHRvay50eXBlID09PSAnaWQnKSB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5kZXhPZignaWQnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgICAgICAnRFVQTElDQVRFX0lEJyxcbiAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGF0dHJpYnV0ZSBcImlkXCIgaXMgbm90IGFsbG93ZWQuJyxcbiAgICAgICAgICAgICAgICB0b2tcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWVzLnB1c2goJ2lkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhZy5hdHRycy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHRvay50eXBlLFxuICAgICAgICAgICAgdmFsOiBcIidcIiArIHRvay52YWwgKyBcIidcIixcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICAgIG11c3RFc2NhcGU6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlICdzdGFydC1hdHRyaWJ1dGVzJzpcbiAgICAgICAgICBpZiAoc2VlbkF0dHJzKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWUgK1xuICAgICAgICAgICAgICAgICcsIGxpbmUgJyArXG4gICAgICAgICAgICAgICAgdGhpcy5wZWVrKCkubG9jLnN0YXJ0LmxpbmUgK1xuICAgICAgICAgICAgICAgICc6XFxuWW91IHNob3VsZCBub3QgaGF2ZSBwdWcgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VlbkF0dHJzID0gdHJ1ZTtcbiAgICAgICAgICB0YWcuYXR0cnMgPSB0YWcuYXR0cnMuY29uY2F0KHRoaXMuYXR0cnMoYXR0cmlidXRlTmFtZXMpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSAnJmF0dHJpYnV0ZXMnOlxuICAgICAgICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB0YWcuYXR0cmlidXRlQmxvY2tzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ0F0dHJpYnV0ZUJsb2NrJyxcbiAgICAgICAgICAgIHZhbDogdG9rLnZhbCxcbiAgICAgICAgICAgIGxpbmU6IHRvay5sb2Muc3RhcnQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB2YXIgcGx1Z2luUmVzdWx0ID0gdGhpcy5ydW5QbHVnaW4oXG4gICAgICAgICAgICAndGFnQXR0cmlidXRlVG9rZW5zJyxcbiAgICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwbHVnaW5SZXN1bHQpIGJyZWFrO1xuICAgICAgICAgIGJyZWFrIG91dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjaGVjayBpbW1lZGlhdGUgJy4nXG4gICAgaWYgKCdkb3QnID09IHRoaXMucGVlaygpLnR5cGUpIHtcbiAgICAgIHRhZy50ZXh0T25seSA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICAvLyAodGV4dCB8IGNvZGUgfCAnOicpP1xuICAgIHN3aXRjaCAodGhpcy5wZWVrKCkudHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBjYXNlICdpbnRlcnBvbGF0ZWQtY29kZSc6XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5wYXJzZVRleHQoKTtcbiAgICAgICAgaWYgKHRleHQudHlwZSA9PT0gJ0Jsb2NrJykge1xuICAgICAgICAgIHRhZy5ibG9jay5ub2Rlcy5wdXNoLmFwcGx5KHRhZy5ibG9jay5ub2RlcywgdGV4dC5ub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2RlJzpcbiAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2godGhpcy5wYXJzZUNvZGUodHJ1ZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzonOlxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcigpO1xuICAgICAgICB0YWcuYmxvY2sgPVxuICAgICAgICAgIGV4cHIudHlwZSA9PT0gJ0Jsb2NrJyA/IGV4cHIgOiB0aGlzLmluaXRCbG9jayh0YWcubGluZSwgW2V4cHJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgIGNhc2UgJ2luZGVudCc6XG4gICAgICBjYXNlICdvdXRkZW50JzpcbiAgICAgIGNhc2UgJ2Vvcyc6XG4gICAgICBjYXNlICdzdGFydC1waXBlbGVzcy10ZXh0JzpcbiAgICAgIGNhc2UgJ2VuZC1wdWctaW50ZXJwb2xhdGlvbic6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2xhc2gnOlxuICAgICAgICBpZiAoc2VsZkNsb3NpbmdBbGxvd2VkKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGFnLnNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIHBsdWdpblJlc3VsdCA9IHRoaXMucnVuUGx1Z2luKFxuICAgICAgICAgICd0YWdUb2tlbnMnLFxuICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwbHVnaW5SZXN1bHQpIGJyZWFrO1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgICdJTlZBTElEX1RPS0VOJyxcbiAgICAgICAgICAnVW5leHBlY3RlZCB0b2tlbiBgJyArXG4gICAgICAgICAgICB0aGlzLnBlZWsoKS50eXBlICtcbiAgICAgICAgICAgICdgIGV4cGVjdGVkIGB0ZXh0YCwgYGludGVycG9sYXRlZC1jb2RlYCwgYGNvZGVgLCBgOmAnICtcbiAgICAgICAgICAgIChzZWxmQ2xvc2luZ0FsbG93ZWQgPyAnLCBgc2xhc2hgJyA6ICcnKSArXG4gICAgICAgICAgICAnLCBgbmV3bGluZWAgb3IgYGVvc2AnLFxuICAgICAgICAgIHRoaXMucGVlaygpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbmV3bGluZSpcbiAgICB3aGlsZSAoJ25ld2xpbmUnID09IHRoaXMucGVlaygpLnR5cGUpIHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgLy8gYmxvY2s/XG4gICAgaWYgKHRhZy50ZXh0T25seSkge1xuICAgICAgdGFnLmJsb2NrID0gdGhpcy5wYXJzZVRleHRCbG9jaygpIHx8IHRoaXMuZW1wdHlCbG9jayh0YWcubGluZSk7XG4gICAgfSBlbHNlIGlmICgnaW5kZW50JyA9PSB0aGlzLnBlZWsoKS50eXBlKSB7XG4gICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2NrKCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmxvY2subm9kZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgdGFnLmJsb2NrLm5vZGVzLnB1c2goYmxvY2subm9kZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWc7XG4gIH0sXG5cbiAgYXR0cnM6IGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWVzKSB7XG4gICAgdGhpcy5leHBlY3QoJ3N0YXJ0LWF0dHJpYnV0ZXMnKTtcblxuICAgIHZhciBhdHRycyA9IFtdO1xuICAgIHZhciB0b2sgPSB0aGlzLmFkdmFuY2UoKTtcbiAgICB3aGlsZSAodG9rLnR5cGUgPT09ICdhdHRyaWJ1dGUnKSB7XG4gICAgICBpZiAodG9rLm5hbWUgIT09ICdjbGFzcycgJiYgYXR0cmlidXRlTmFtZXMpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluZGV4T2YodG9rLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgICAnRFVQTElDQVRFX0FUVFJJQlVURScsXG4gICAgICAgICAgICAnRHVwbGljYXRlIGF0dHJpYnV0ZSBcIicgKyB0b2submFtZSArICdcIiBpcyBub3QgYWxsb3dlZC4nLFxuICAgICAgICAgICAgdG9rXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVOYW1lcy5wdXNoKHRvay5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGF0dHJzLnB1c2goe1xuICAgICAgICBuYW1lOiB0b2submFtZSxcbiAgICAgICAgdmFsOiB0b2sudmFsLFxuICAgICAgICBsaW5lOiB0b2subG9jLnN0YXJ0LmxpbmUsXG4gICAgICAgIGNvbHVtbjogdG9rLmxvYy5zdGFydC5jb2x1bW4sXG4gICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxuICAgICAgICBtdXN0RXNjYXBlOiB0b2subXVzdEVzY2FwZSAhPT0gZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRvayA9IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICB0aGlzLnRva2Vucy5kZWZlcih0b2spO1xuICAgIHRoaXMuZXhwZWN0KCdlbmQtYXR0cmlidXRlcycpO1xuICAgIHJldHVybiBhdHRycztcbiAgfSxcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdhbGtBU1Q7XG5mdW5jdGlvbiB3YWxrQVNUKGFzdCwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucykge1xuICBpZiAoYWZ0ZXIgJiYgdHlwZW9mIGFmdGVyID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0gYWZ0ZXI7XG4gICAgYWZ0ZXIgPSBudWxsO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHtpbmNsdWRlRGVwZW5kZW5jaWVzOiBmYWxzZX07XG4gIHZhciBwYXJlbnRzID0gKG9wdGlvbnMucGFyZW50cyA9IG9wdGlvbnMucGFyZW50cyB8fCBbXSk7XG5cbiAgdmFyIHJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHJlcGxhY2VtZW50KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZW1lbnQpICYmICFyZXBsYWNlLmFycmF5QWxsb3dlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZSgpIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGFuIGFycmF5IGlmIHRoZSBsYXN0IHBhcmVudCBpcyBhIEJsb2NrIG9yIE5hbWVkQmxvY2snXG4gICAgICApO1xuICAgIH1cbiAgICBhc3QgPSByZXBsYWNlbWVudDtcbiAgfTtcbiAgcmVwbGFjZS5hcnJheUFsbG93ZWQgPVxuICAgIHBhcmVudHNbMF0gJiZcbiAgICAoL14oTmFtZWQpP0Jsb2NrJC8udGVzdChwYXJlbnRzWzBdLnR5cGUpIHx8XG4gICAgICAocGFyZW50c1swXS50eXBlID09PSAnUmF3SW5jbHVkZScgJiYgYXN0LnR5cGUgPT09ICdJbmNsdWRlRmlsdGVyJykpO1xuXG4gIGlmIChiZWZvcmUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmVmb3JlKGFzdCwgcmVwbGFjZSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBhc3Q7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFzdCkpIHtcbiAgICAgIC8vIHJldHVybiByaWdodCBoZXJlIHRvIHNraXAgYWZ0ZXIoKSBjYWxsIG9uIGFycmF5XG4gICAgICByZXR1cm4gd2Fsa0FuZE1lcmdlTm9kZXMoYXN0KTtcbiAgICB9XG4gIH1cblxuICBwYXJlbnRzLnVuc2hpZnQoYXN0KTtcblxuICBzd2l0Y2ggKGFzdC50eXBlKSB7XG4gICAgY2FzZSAnTmFtZWRCbG9jayc6XG4gICAgY2FzZSAnQmxvY2snOlxuICAgICAgYXN0Lm5vZGVzID0gd2Fsa0FuZE1lcmdlTm9kZXMoYXN0Lm5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Nhc2UnOlxuICAgIGNhc2UgJ0ZpbHRlcic6XG4gICAgY2FzZSAnTWl4aW4nOlxuICAgIGNhc2UgJ1RhZyc6XG4gICAgY2FzZSAnSW50ZXJwb2xhdGVkVGFnJzpcbiAgICBjYXNlICdXaGVuJzpcbiAgICBjYXNlICdDb2RlJzpcbiAgICBjYXNlICdXaGlsZSc6XG4gICAgICBpZiAoYXN0LmJsb2NrKSB7XG4gICAgICAgIGFzdC5ibG9jayA9IHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VhY2gnOlxuICAgICAgaWYgKGFzdC5ibG9jaykge1xuICAgICAgICBhc3QuYmxvY2sgPSB3YWxrQVNUKGFzdC5ibG9jaywgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAoYXN0LmFsdGVybmF0ZSkge1xuICAgICAgICBhc3QuYWx0ZXJuYXRlID0gd2Fsa0FTVChhc3QuYWx0ZXJuYXRlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0VhY2hPZic6XG4gICAgICBpZiAoYXN0LmJsb2NrKSB7XG4gICAgICAgIGFzdC5ibG9jayA9IHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0NvbmRpdGlvbmFsJzpcbiAgICAgIGlmIChhc3QuY29uc2VxdWVudCkge1xuICAgICAgICBhc3QuY29uc2VxdWVudCA9IHdhbGtBU1QoYXN0LmNvbnNlcXVlbnQsIGJlZm9yZSwgYWZ0ZXIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKGFzdC5hbHRlcm5hdGUpIHtcbiAgICAgICAgYXN0LmFsdGVybmF0ZSA9IHdhbGtBU1QoYXN0LmFsdGVybmF0ZSwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdJbmNsdWRlJzpcbiAgICAgIHdhbGtBU1QoYXN0LmJsb2NrLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIHdhbGtBU1QoYXN0LmZpbGUsIGJlZm9yZSwgYWZ0ZXIsIG9wdGlvbnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXh0ZW5kcyc6XG4gICAgICB3YWxrQVNUKGFzdC5maWxlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1Jhd0luY2x1ZGUnOlxuICAgICAgYXN0LmZpbHRlcnMgPSB3YWxrQW5kTWVyZ2VOb2Rlcyhhc3QuZmlsdGVycyk7XG4gICAgICB3YWxrQVNUKGFzdC5maWxlLCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0F0dHJzJzpcbiAgICBjYXNlICdCbG9ja0NvbW1lbnQnOlxuICAgIGNhc2UgJ0NvbW1lbnQnOlxuICAgIGNhc2UgJ0RvY3R5cGUnOlxuICAgIGNhc2UgJ0luY2x1ZGVGaWx0ZXInOlxuICAgIGNhc2UgJ01peGluQmxvY2snOlxuICAgIGNhc2UgJ1lpZWxkQmxvY2snOlxuICAgIGNhc2UgJ1RleHQnOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmlsZVJlZmVyZW5jZSc6XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVwZW5kZW5jaWVzICYmIGFzdC5hc3QpIHtcbiAgICAgICAgd2Fsa0FTVChhc3QuYXN0LCBiZWZvcmUsIGFmdGVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbm9kZSB0eXBlICcgKyBhc3QudHlwZSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHBhcmVudHMuc2hpZnQoKTtcblxuICBhZnRlciAmJiBhZnRlcihhc3QsIHJlcGxhY2UpO1xuICByZXR1cm4gYXN0O1xuXG4gIGZ1bmN0aW9uIHdhbGtBbmRNZXJnZU5vZGVzKG5vZGVzKSB7XG4gICAgcmV0dXJuIG5vZGVzLnJlZHVjZShmdW5jdGlvbihub2Rlcywgbm9kZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHdhbGtBU1Qobm9kZSwgYmVmb3JlLCBhZnRlciwgb3B0aW9ucyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5jb25jYXQocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoW3Jlc3VsdF0pO1xuICAgICAgfVxuICAgIH0sIFtdKTtcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHdhbGsgPSByZXF1aXJlKCdwdWctd2FsaycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb2FkO1xuZnVuY3Rpb24gbG9hZChhc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGNsb25lIHRoZSBhc3RcbiAgYXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhc3QpKTtcbiAgcmV0dXJuIHdhbGsoYXN0LCBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUuc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSAnSW5jbHVkZScgfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAnUmF3SW5jbHVkZScgfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAnRXh0ZW5kcydcbiAgICAgICkge1xuICAgICAgICB2YXIgZmlsZSA9IG5vZGUuZmlsZTtcbiAgICAgICAgaWYgKGZpbGUudHlwZSAhPT0gJ0ZpbGVSZWZlcmVuY2UnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmaWxlLnR5cGUgdG8gYmUgXCJGaWxlUmVmZXJlbmNlXCInKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCwgc3RyLCByYXc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aCA9IG9wdGlvbnMucmVzb2x2ZShmaWxlLnBhdGgsIGZpbGUuZmlsZW5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgIGZpbGUuZnVsbFBhdGggPSBwYXRoO1xuICAgICAgICAgIHJhdyA9IG9wdGlvbnMucmVhZChwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICBzdHIgPSByYXcudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBleC5tZXNzYWdlICs9ICdcXG4gICAgYXQgJyArIG5vZGUuZmlsZW5hbWUgKyAnIGxpbmUgJyArIG5vZGUubGluZTtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgICBmaWxlLnN0ciA9IHN0cjtcbiAgICAgICAgZmlsZS5yYXcgPSByYXc7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdFeHRlbmRzJyB8fCBub2RlLnR5cGUgPT09ICdJbmNsdWRlJykge1xuICAgICAgICAgIGZpbGUuYXN0ID0gbG9hZC5zdHJpbmcoXG4gICAgICAgICAgICBzdHIsXG4gICAgICAgICAgICBhc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhdGgsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5sb2FkLnN0cmluZyA9IGZ1bmN0aW9uIGxvYWRTdHJpbmcoc3JjLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBhc3NpZ24oZ2V0T3B0aW9ucyhvcHRpb25zKSwge1xuICAgIHNyYzogc3JjLFxuICB9KTtcbiAgdmFyIHRva2VucyA9IG9wdGlvbnMubGV4KHNyYywgb3B0aW9ucyk7XG4gIHZhciBhc3QgPSBvcHRpb25zLnBhcnNlKHRva2Vucywgb3B0aW9ucyk7XG4gIHJldHVybiBsb2FkKGFzdCwgb3B0aW9ucyk7XG59O1xubG9hZC5maWxlID0gZnVuY3Rpb24gbG9hZEZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IGFzc2lnbihnZXRPcHRpb25zKG9wdGlvbnMpLCB7XG4gICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICB9KTtcbiAgdmFyIHN0ciA9IG9wdGlvbnMucmVhZChmaWxlbmFtZSkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgcmV0dXJuIGxvYWQuc3RyaW5nKHN0ciwgb3B0aW9ucyk7XG59O1xuXG5sb2FkLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGZpbGVuYW1lLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgZmlsZW5hbWUgPSBmaWxlbmFtZS50cmltKCk7XG4gIGlmIChmaWxlbmFtZVswXSAhPT0gJy8nICYmICFzb3VyY2UpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3RoZSBcImZpbGVuYW1lXCIgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBpbmNsdWRlcyBhbmQgZXh0ZW5kcyB3aXRoIFwicmVsYXRpdmVcIiBwYXRocydcbiAgICApO1xuXG4gIGlmIChmaWxlbmFtZVswXSA9PT0gJy8nICYmICFvcHRpb25zLmJhc2VkaXIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3RoZSBcImJhc2VkaXJcIiBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdXNlIGluY2x1ZGVzIGFuZCBleHRlbmRzIHdpdGggXCJhYnNvbHV0ZVwiIHBhdGhzJ1xuICAgICk7XG5cbiAgZmlsZW5hbWUgPSBwYXRoLmpvaW4oXG4gICAgZmlsZW5hbWVbMF0gPT09ICcvJyA/IG9wdGlvbnMuYmFzZWRpciA6IHBhdGguZGlybmFtZShzb3VyY2UudHJpbSgpKSxcbiAgICBmaWxlbmFtZVxuICApO1xuXG4gIHJldHVybiBmaWxlbmFtZTtcbn07XG5sb2FkLnJlYWQgPSBmdW5jdGlvbiByZWFkKGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUpO1xufTtcblxubG9hZC52YWxpZGF0ZU9wdGlvbnMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmxleCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMubGV4IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIG9wdGlvbnMucGFyc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnBhcnNlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAob3B0aW9ucy5yZXNvbHZlICYmIHR5cGVvZiBvcHRpb25zLnJlc29sdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnJlc29sdmUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChvcHRpb25zLnJlYWQgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMucmVhZCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIGxvYWQudmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYXNzaWduKFxuICAgIHtcbiAgICAgIHJlc29sdmU6IGxvYWQucmVzb2x2ZSxcbiAgICAgIHJlYWQ6IGxvYWQucmVhZCxcbiAgICB9LFxuICAgIG9wdGlvbnNcbiAgKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cblxuLyogZ2xvYmFscyBzZWxmICovXG52YXIgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogc2VsZjtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgaGF2ZSBoaWdoIHByaW9yaXR5IGFuZCB3b3JrXG4vLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5pZiAodHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG5cbi8vIE1lc3NhZ2VDaGFubmVscyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBnaXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIEhUTUxcbi8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuXG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbn0gZWxzZSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGZsdXNoKTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLlxuLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4vLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc1x1MjAxOXNcbi8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxucmF3QXNhcC5yZXF1ZXN0Rmx1c2ggPSByZXF1ZXN0Rmx1c2g7XG5cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgdG9nZ2xlID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5cbi8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcblxuLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbi8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4vLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4vLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbi8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4vLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbi8vIGNsb3N1cmUuXG4vLyBOZXZlciBmb3JnZXQuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4vLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbi8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4vLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4vLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cblxuLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4vLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4vLyBldmVuIHRoZW4uXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgdmFyIGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4vLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuLy8gaXRzIGV4aXN0ZW5jZS5cbnJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbi8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4vLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbi8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbi8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcC9yYXcnKTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFN0YXRlczpcbi8vXG4vLyAwIC0gcGVuZGluZ1xuLy8gMSAtIGZ1bGZpbGxlZCB3aXRoIF92YWx1ZVxuLy8gMiAtIHJlamVjdGVkIHdpdGggX3ZhbHVlXG4vLyAzIC0gYWRvcHRlZCB0aGUgc3RhdGUgb2YgYW5vdGhlciBwcm9taXNlLCBfdmFsdWVcbi8vXG4vLyBvbmNlIHRoZSBzdGF0ZSBpcyBubyBsb25nZXIgcGVuZGluZyAoMCkgaXQgaXMgaW1tdXRhYmxlXG5cbi8vIEFsbCBgX2AgcHJlZml4ZWQgcHJvcGVydGllcyB3aWxsIGJlIHJlZHVjZWQgdG8gYF97cmFuZG9tIG51bWJlcn1gXG4vLyBhdCBidWlsZCB0aW1lIHRvIG9iZnVzY2F0ZSB0aGVtIGFuZCBkaXNjb3VyYWdlIHRoZWlyIHVzZS5cbi8vIFdlIGRvbid0IHVzZSBzeW1ib2xzIG9yIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBmdWxseSBoaWRlIHRoZW1cbi8vIGJlY2F1c2UgdGhlIHBlcmZvcm1hbmNlIGlzbid0IGdvb2QgZW5vdWdoLlxuXG5cbi8vIHRvIGF2b2lkIHVzaW5nIHRyeS9jYXRjaCBpbnNpZGUgY3JpdGljYWwgZnVuY3Rpb25zLCB3ZVxuLy8gZXh0cmFjdCB0aGVtIHRvIGhlcmUuXG52YXIgTEFTVF9FUlJPUiA9IG51bGw7XG52YXIgSVNfRVJST1IgPSB7fTtcbmZ1bmN0aW9uIGdldFRoZW4ob2JqKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG9iai50aGVuO1xuICB9IGNhdGNoIChleCkge1xuICAgIExBU1RfRVJST1IgPSBleDtcbiAgICByZXR1cm4gSVNfRVJST1I7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5Q2FsbE9uZShmbiwgYSkge1xuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICBMQVNUX0VSUk9SID0gZXg7XG4gICAgcmV0dXJuIElTX0VSUk9SO1xuICB9XG59XG5mdW5jdGlvbiB0cnlDYWxsVHdvKGZuLCBhLCBiKSB7XG4gIHRyeSB7XG4gICAgZm4oYSwgYik7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgTEFTVF9FUlJPUiA9IGV4O1xuICAgIHJldHVybiBJU19FUlJPUjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbmZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgaWYgKHR5cGVvZiB0aGlzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICB9XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIGNvbnN0cnVjdG9yXFwncyBhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG4gIHRoaXMuXzQwID0gMDtcbiAgdGhpcy5fNjUgPSAwO1xuICB0aGlzLl81NSA9IG51bGw7XG4gIHRoaXMuXzcyID0gbnVsbDtcbiAgaWYgKGZuID09PSBub29wKSByZXR1cm47XG4gIGRvUmVzb2x2ZShmbiwgdGhpcyk7XG59XG5Qcm9taXNlLl8zNyA9IG51bGw7XG5Qcm9taXNlLl84NyA9IG51bGw7XG5Qcm9taXNlLl82MSA9IG5vb3A7XG5cblByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICBpZiAodGhpcy5jb25zdHJ1Y3RvciAhPT0gUHJvbWlzZSkge1xuICAgIHJldHVybiBzYWZlVGhlbih0aGlzLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH1cbiAgdmFyIHJlcyA9IG5ldyBQcm9taXNlKG5vb3ApO1xuICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHJlcykpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gc2FmZVRoZW4oc2VsZiwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgcmV0dXJuIG5ldyBzZWxmLmNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVzID0gbmV3IFByb21pc2Uobm9vcCk7XG4gICAgcmVzLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICBoYW5kbGUoc2VsZiwgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHJlcykpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZShzZWxmLCBkZWZlcnJlZCkge1xuICB3aGlsZSAoc2VsZi5fNjUgPT09IDMpIHtcbiAgICBzZWxmID0gc2VsZi5fNTU7XG4gIH1cbiAgaWYgKFByb21pc2UuXzM3KSB7XG4gICAgUHJvbWlzZS5fMzcoc2VsZik7XG4gIH1cbiAgaWYgKHNlbGYuXzY1ID09PSAwKSB7XG4gICAgaWYgKHNlbGYuXzQwID09PSAwKSB7XG4gICAgICBzZWxmLl80MCA9IDE7XG4gICAgICBzZWxmLl83MiA9IGRlZmVycmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VsZi5fNDAgPT09IDEpIHtcbiAgICAgIHNlbGYuXzQwID0gMjtcbiAgICAgIHNlbGYuXzcyID0gW3NlbGYuXzcyLCBkZWZlcnJlZF07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbGYuXzcyLnB1c2goZGVmZXJyZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICBoYW5kbGVSZXNvbHZlZChzZWxmLCBkZWZlcnJlZCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJlc29sdmVkKHNlbGYsIGRlZmVycmVkKSB7XG4gIGFzYXAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNiID0gc2VsZi5fNjUgPT09IDEgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgICBpZiAoc2VsZi5fNjUgPT09IDEpIHtcbiAgICAgICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCBzZWxmLl81NSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoZGVmZXJyZWQucHJvbWlzZSwgc2VsZi5fNTUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmV0ID0gdHJ5Q2FsbE9uZShjYiwgc2VsZi5fNTUpO1xuICAgIGlmIChyZXQgPT09IElTX0VSUk9SKSB7XG4gICAgICByZWplY3QoZGVmZXJyZWQucHJvbWlzZSwgTEFTVF9FUlJPUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoZGVmZXJyZWQucHJvbWlzZSwgcmV0KTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICAvLyBQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtc3BlYyN0aGUtcHJvbWlzZS1yZXNvbHV0aW9uLXByb2NlZHVyZVxuICBpZiAobmV3VmFsdWUgPT09IHNlbGYpIHtcbiAgICByZXR1cm4gcmVqZWN0KFxuICAgICAgc2VsZixcbiAgICAgIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuJylcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBuZXdWYWx1ZSAmJlxuICAgICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJylcbiAgKSB7XG4gICAgdmFyIHRoZW4gPSBnZXRUaGVuKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhlbiA9PT0gSVNfRVJST1IpIHtcbiAgICAgIHJldHVybiByZWplY3Qoc2VsZiwgTEFTVF9FUlJPUik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoZW4gPT09IHNlbGYudGhlbiAmJlxuICAgICAgbmV3VmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlXG4gICAgKSB7XG4gICAgICBzZWxmLl82NSA9IDM7XG4gICAgICBzZWxmLl81NSA9IG5ld1ZhbHVlO1xuICAgICAgZmluYWxlKHNlbGYpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRvUmVzb2x2ZSh0aGVuLmJpbmQobmV3VmFsdWUpLCBzZWxmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgc2VsZi5fNjUgPSAxO1xuICBzZWxmLl81NSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIHJlamVjdChzZWxmLCBuZXdWYWx1ZSkge1xuICBzZWxmLl82NSA9IDI7XG4gIHNlbGYuXzU1ID0gbmV3VmFsdWU7XG4gIGlmIChQcm9taXNlLl84Nykge1xuICAgIFByb21pc2UuXzg3KHNlbGYsIG5ld1ZhbHVlKTtcbiAgfVxuICBmaW5hbGUoc2VsZik7XG59XG5mdW5jdGlvbiBmaW5hbGUoc2VsZikge1xuICBpZiAoc2VsZi5fNDAgPT09IDEpIHtcbiAgICBoYW5kbGUoc2VsZiwgc2VsZi5fNzIpO1xuICAgIHNlbGYuXzcyID0gbnVsbDtcbiAgfVxuICBpZiAoc2VsZi5fNDAgPT09IDIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuXzcyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGUoc2VsZiwgc2VsZi5fNzJbaV0pO1xuICAgIH1cbiAgICBzZWxmLl83MiA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvbWlzZSl7XG4gIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nID8gb25SZWplY3RlZCA6IG51bGw7XG4gIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG59XG5cbi8qKlxuICogVGFrZSBhIHBvdGVudGlhbGx5IG1pc2JlaGF2aW5nIHJlc29sdmVyIGZ1bmN0aW9uIGFuZCBtYWtlIHN1cmVcbiAqIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGFyZSBvbmx5IGNhbGxlZCBvbmNlLlxuICpcbiAqIE1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgYXN5bmNocm9ueS5cbiAqL1xuZnVuY3Rpb24gZG9SZXNvbHZlKGZuLCBwcm9taXNlKSB7XG4gIHZhciBkb25lID0gZmFsc2U7XG4gIHZhciByZXMgPSB0cnlDYWxsVHdvKGZuLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgfSk7XG4gIGlmICghZG9uZSAmJiByZXMgPT09IElTX0VSUk9SKSB7XG4gICAgZG9uZSA9IHRydWU7XG4gICAgcmVqZWN0KHByb21pc2UsIExBU1RfRVJST1IpO1xuICB9XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5Qcm9taXNlLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIHZhciBzZWxmID0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMudGhlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGhpcztcbiAgc2VsZi50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9LCAwKTtcbiAgfSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFByb21pc2UgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IGZ1bmN0aW9uIChmKSB7XG4gIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmKCkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vL1RoaXMgZmlsZSBjb250YWlucyB0aGUgRVM2IGV4dGVuc2lvbnMgdG8gdGhlIGNvcmUgUHJvbWlzZXMvQSsgQVBJXG5cbnZhciBQcm9taXNlID0gcmVxdWlyZSgnLi9jb3JlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcblxuLyogU3RhdGljIEZ1bmN0aW9ucyAqL1xuXG52YXIgVFJVRSA9IHZhbHVlUHJvbWlzZSh0cnVlKTtcbnZhciBGQUxTRSA9IHZhbHVlUHJvbWlzZShmYWxzZSk7XG52YXIgTlVMTCA9IHZhbHVlUHJvbWlzZShudWxsKTtcbnZhciBVTkRFRklORUQgPSB2YWx1ZVByb21pc2UodW5kZWZpbmVkKTtcbnZhciBaRVJPID0gdmFsdWVQcm9taXNlKDApO1xudmFyIEVNUFRZU1RSSU5HID0gdmFsdWVQcm9taXNlKCcnKTtcblxuZnVuY3Rpb24gdmFsdWVQcm9taXNlKHZhbHVlKSB7XG4gIHZhciBwID0gbmV3IFByb21pc2UoUHJvbWlzZS5fNjEpO1xuICBwLl82NSA9IDE7XG4gIHAuXzU1ID0gdmFsdWU7XG4gIHJldHVybiBwO1xufVxuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiB2YWx1ZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBOVUxMO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFVOREVGSU5FRDtcbiAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gVFJVRTtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIEZBTFNFO1xuICBpZiAodmFsdWUgPT09IDApIHJldHVybiBaRVJPO1xuICBpZiAodmFsdWUgPT09ICcnKSByZXR1cm4gRU1QVFlTVFJJTkc7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0aGVuID0gdmFsdWUudGhlbjtcbiAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UodGhlbi5iaW5kKHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdChleCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlUHJvbWlzZSh2YWx1ZSk7XG59O1xuXG5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgdmFyIHJlbWFpbmluZyA9IGFyZ3MubGVuZ3RoO1xuICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgIGlmICh2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBQcm9taXNlICYmIHZhbC50aGVuID09PSBQcm9taXNlLnByb3RvdHlwZS50aGVuKSB7XG4gICAgICAgICAgd2hpbGUgKHZhbC5fNjUgPT09IDMpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5fNTU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWwuXzY1ID09PSAxKSByZXR1cm4gcmVzKGksIHZhbC5fNTUpO1xuICAgICAgICAgIGlmICh2YWwuXzY1ID09PSAyKSByZWplY3QodmFsLl81NSk7XG4gICAgICAgICAgdmFsLnRoZW4oZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBwID0gbmV3IFByb21pc2UodGhlbi5iaW5kKHZhbCkpO1xuICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXJnc1tpXSA9IHZhbDtcbiAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICByZXNvbHZlKGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyhpLCBhcmdzW2ldKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWplY3QodmFsdWUpO1xuICB9KTtcbn07XG5cblByb21pc2UucmFjZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7XG4gICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKiBQcm90b3R5cGUgTWV0aG9kcyAqL1xuXG5Qcm9taXNlLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG59O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlbi9wcm9taXNlIHNwZWNpZmljIGV4dGVuc2lvbnMgdGhhdCBhcmUgb25seSB1c2VmdWxcbi8vIGZvciBub2RlLmpzIGludGVyb3BcblxudmFyIFByb21pc2UgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbi8qIFN0YXRpYyBGdW5jdGlvbnMgKi9cblxuUHJvbWlzZS5kZW5vZGVpZnkgPSBmdW5jdGlvbiAoZm4sIGFyZ3VtZW50Q291bnQpIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBhcmd1bWVudENvdW50ID09PSAnbnVtYmVyJyAmJiBhcmd1bWVudENvdW50ICE9PSBJbmZpbml0eVxuICApIHtcbiAgICByZXR1cm4gZGVub2RlaWZ5V2l0aENvdW50KGZuLCBhcmd1bWVudENvdW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVub2RlaWZ5V2l0aG91dENvdW50KGZuKTtcbiAgfVxufTtcblxudmFyIGNhbGxiYWNrRm4gPSAoXG4gICdmdW5jdGlvbiAoZXJyLCByZXMpIHsnICtcbiAgJ2lmIChlcnIpIHsgcmooZXJyKTsgfSBlbHNlIHsgcnMocmVzKTsgfScgK1xuICAnfSdcbik7XG5mdW5jdGlvbiBkZW5vZGVpZnlXaXRoQ291bnQoZm4sIGFyZ3VtZW50Q291bnQpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudENvdW50OyBpKyspIHtcbiAgICBhcmdzLnB1c2goJ2EnICsgaSk7XG4gIH1cbiAgdmFyIGJvZHkgPSBbXG4gICAgJ3JldHVybiBmdW5jdGlvbiAoJyArIGFyZ3Muam9pbignLCcpICsgJykgeycsXG4gICAgJ3ZhciBzZWxmID0gdGhpczsnLFxuICAgICdyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJzLCByaikgeycsXG4gICAgJ3ZhciByZXMgPSBmbi5jYWxsKCcsXG4gICAgWydzZWxmJ10uY29uY2F0KGFyZ3MpLmNvbmNhdChbY2FsbGJhY2tGbl0pLmpvaW4oJywnKSxcbiAgICAnKTsnLFxuICAgICdpZiAocmVzICYmJyxcbiAgICAnKHR5cGVvZiByZXMgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHJlcyA9PT0gXCJmdW5jdGlvblwiKSAmJicsXG4gICAgJ3R5cGVvZiByZXMudGhlbiA9PT0gXCJmdW5jdGlvblwiJyxcbiAgICAnKSB7cnMocmVzKTt9JyxcbiAgICAnfSk7JyxcbiAgICAnfTsnXG4gIF0uam9pbignJyk7XG4gIHJldHVybiBGdW5jdGlvbihbJ1Byb21pc2UnLCAnZm4nXSwgYm9keSkoUHJvbWlzZSwgZm4pO1xufVxuZnVuY3Rpb24gZGVub2RlaWZ5V2l0aG91dENvdW50KGZuKSB7XG4gIHZhciBmbkxlbmd0aCA9IE1hdGgubWF4KGZuLmxlbmd0aCAtIDEsIDMpO1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZuTGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzLnB1c2goJ2EnICsgaSk7XG4gIH1cbiAgdmFyIGJvZHkgPSBbXG4gICAgJ3JldHVybiBmdW5jdGlvbiAoJyArIGFyZ3Muam9pbignLCcpICsgJykgeycsXG4gICAgJ3ZhciBzZWxmID0gdGhpczsnLFxuICAgICd2YXIgYXJnczsnLFxuICAgICd2YXIgYXJnTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsnLFxuICAgICdpZiAoYXJndW1lbnRzLmxlbmd0aCA+ICcgKyBmbkxlbmd0aCArICcpIHsnLFxuICAgICdhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggKyAxKTsnLFxuICAgICdmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeycsXG4gICAgJ2FyZ3NbaV0gPSBhcmd1bWVudHNbaV07JyxcbiAgICAnfScsXG4gICAgJ30nLFxuICAgICdyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJzLCByaikgeycsXG4gICAgJ3ZhciBjYiA9ICcgKyBjYWxsYmFja0ZuICsgJzsnLFxuICAgICd2YXIgcmVzOycsXG4gICAgJ3N3aXRjaCAoYXJnTGVuZ3RoKSB7JyxcbiAgICBhcmdzLmNvbmNhdChbJ2V4dHJhJ10pLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICdjYXNlICcgKyAoaW5kZXgpICsgJzonICtcbiAgICAgICAgJ3JlcyA9IGZuLmNhbGwoJyArIFsnc2VsZiddLmNvbmNhdChhcmdzLnNsaWNlKDAsIGluZGV4KSkuY29uY2F0KCdjYicpLmpvaW4oJywnKSArICcpOycgK1xuICAgICAgICAnYnJlYWs7J1xuICAgICAgKTtcbiAgICB9KS5qb2luKCcnKSxcbiAgICAnZGVmYXVsdDonLFxuICAgICdhcmdzW2FyZ0xlbmd0aF0gPSBjYjsnLFxuICAgICdyZXMgPSBmbi5hcHBseShzZWxmLCBhcmdzKTsnLFxuICAgICd9JyxcbiAgICBcbiAgICAnaWYgKHJlcyAmJicsXG4gICAgJyh0eXBlb2YgcmVzID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiByZXMgPT09IFwiZnVuY3Rpb25cIikgJiYnLFxuICAgICd0eXBlb2YgcmVzLnRoZW4gPT09IFwiZnVuY3Rpb25cIicsXG4gICAgJykge3JzKHJlcyk7fScsXG4gICAgJ30pOycsXG4gICAgJ307J1xuICBdLmpvaW4oJycpO1xuXG4gIHJldHVybiBGdW5jdGlvbihcbiAgICBbJ1Byb21pc2UnLCAnZm4nXSxcbiAgICBib2R5XG4gICkoUHJvbWlzZSwgZm4pO1xufVxuXG5Qcm9taXNlLm5vZGVpZnkgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgdmFyIGNhbGxiYWNrID1cbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgPyBhcmdzLnBvcCgpIDogbnVsbDtcbiAgICB2YXIgY3R4ID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykubm9kZWlmeShjYWxsYmFjaywgY3R4KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2suY2FsbChjdHgsIGV4KTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblByb21pc2UucHJvdG90eXBlLm5vZGVpZnkgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGN0eCkge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHJldHVybiB0aGlzO1xuXG4gIHRoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBudWxsLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY3R4LCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5Qcm9taXNlLmVuYWJsZVN5bmNocm9ub3VzID0gZnVuY3Rpb24gKCkge1xuICBQcm9taXNlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpID09IDA7XG4gIH07XG5cbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNGdWxmaWxsZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpID09IDE7XG4gIH07XG5cbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXRlKCkgPT0gMjtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fNjUgPT09IDMpIHtcbiAgICAgIHJldHVybiB0aGlzLl81NS5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0Z1bGZpbGxlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSB2YWx1ZSBvZiBhbiB1bmZ1bGZpbGxlZCBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl81NTtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRSZWFzb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuXzY1ID09PSAzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fNTUuZ2V0UmVhc29uKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzUmVqZWN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgcmVqZWN0aW9uIHJlYXNvbiBvZiBhIG5vbi1yZWplY3RlZCBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl81NTtcbiAgfTtcblxuICBQcm9taXNlLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fNjUgPT09IDMpIHtcbiAgICAgIHJldHVybiB0aGlzLl81NS5nZXRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fNjUgPT09IC0xIHx8IHRoaXMuXzY1ID09PSAtMikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuXzY1O1xuICB9O1xufTtcblxuUHJvbWlzZS5kaXNhYmxlU3luY2hyb25vdXMgPSBmdW5jdGlvbigpIHtcbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNQZW5kaW5nID0gdW5kZWZpbmVkO1xuICBQcm9taXNlLnByb3RvdHlwZS5pc0Z1bGZpbGxlZCA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSB1bmRlZmluZWQ7XG4gIFByb21pc2UucHJvdG90eXBlLmdldFJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgUHJvbWlzZS5wcm90b3R5cGUuZ2V0U3RhdGUgPSB1bmRlZmluZWQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvcmUuanMnKTtcbnJlcXVpcmUoJy4vZG9uZS5qcycpO1xucmVxdWlyZSgnLi9maW5hbGx5LmpzJyk7XG5yZXF1aXJlKCcuL2VzNi1leHRlbnNpb25zLmpzJyk7XG5yZXF1aXJlKCcuL25vZGUtZXh0ZW5zaW9ucy5qcycpO1xucmVxdWlyZSgnLi9zeW5jaHJvbm91cy5qcycpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYicpXG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpc1Byb21pc2U7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gaXNQcm9taXNlO1xuXG5mdW5jdGlvbiBpc1Byb21pc2Uob2JqKSB7XG4gIHJldHVybiAhIW9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBQcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpO1xudmFyIGlzUHJvbWlzZSA9IHJlcXVpcmUoJ2lzLXByb21pc2UnKTtcblxudmFyIHRyID0gKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRyYW5zZm9ybWVyKSB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpO1xufSk7XG50ci5UcmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyO1xudHIubm9ybWFsaXplRm4gPSBub3JtYWxpemVGbjtcbnRyLm5vcm1hbGl6ZUZuQXN5bmMgPSBub3JtYWxpemVGbkFzeW5jO1xudHIubm9ybWFsaXplID0gbm9ybWFsaXplO1xudHIubm9ybWFsaXplQXN5bmMgPSBub3JtYWxpemVBc3luYztcbmlmIChmcy5yZWFkRmlsZSkge1xuICB0ci5yZWFkRmlsZSA9IFByb21pc2UuZGVub2RlaWZ5KGZzLnJlYWRGaWxlKTtcbiAgdHIucmVhZEZpbGVTeW5jID0gZnMucmVhZEZpbGVTeW5jO1xufSBlbHNlIHtcbiAgdHIucmVhZEZpbGUgPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBFcnJvcignZnMucmVhZEZpbGUgdW5zdXBwb3J0ZWQnKTsgfTtcbiAgdHIucmVhZEZpbGVTeW5jID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ZzLnJlYWRGaWxlU3luYyB1bnN1cHBvcnRlZCcpOyB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGbihyZXN1bHQpIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4ge2ZuOiByZXN1bHQsIGRlcGVuZGVuY2llczogW119O1xuICB9IGVsc2UgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LmZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCdkZXBlbmRlbmNpZXMnIGluIHJlc3VsdCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdC5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzdWx0IHNob3VsZCBoYXZlIGEgZGVwZW5kZW5jaWVzIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXknKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXN1bHQgb2JqZWN0IGZyb20gdHJhbnNmb3JtLicpO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVGbkFzeW5jKHJlc3VsdCwgY2IpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgJiYgaXNQcm9taXNlKHJlc3VsdC5mbikpIHtcbiAgICAgIHJldHVybiByZXN1bHQuZm4udGhlbihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmVzdWx0LmZuID0gZm47XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSkudGhlbih0ci5ub3JtYWxpemVGbikubm9kZWlmeShjYik7XG59XG5mdW5jdGlvbiBub3JtYWxpemUocmVzdWx0KSB7XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7Ym9keTogcmVzdWx0LCBkZXBlbmRlbmNpZXM6IFtdfTtcbiAgfSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdC5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICgnZGVwZW5kZW5jaWVzJyBpbiByZXN1bHQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3VsdCBzaG91bGQgaGF2ZSBhIGRlcGVuZGVuY2llcyBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVzdWx0IG9iamVjdCBmcm9tIHRyYW5zZm9ybS4nKTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQXN5bmMocmVzdWx0LCBjYikge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdCAmJiBpc1Byb21pc2UocmVzdWx0LmJvZHkpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmJvZHkudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgICByZXN1bHQuYm9keSA9IGJvZHk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSkudGhlbih0ci5ub3JtYWxpemUpLm5vZGVpZnkoY2IpO1xufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1lcih0cikge1xuICBhc3NlcnQodHIsICdUcmFuc2Zvcm1lciBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBhc3NlcnQodHlwZW9mIHRyLm5hbWUgPT09ICdzdHJpbmcnLCAnVHJhbnNmb3JtZXIgbXVzdCBoYXZlIGEgbmFtZScpO1xuICBhc3NlcnQodHlwZW9mIHRyLm91dHB1dEZvcm1hdCA9PT0gJ3N0cmluZycsICdUcmFuc2Zvcm1lciBtdXN0IGhhdmUgYW4gb3V0cHV0IGZvcm1hdCcpO1xuICBhc3NlcnQoW1xuICAgICdjb21waWxlJyxcbiAgICAnY29tcGlsZUFzeW5jJyxcbiAgICAnY29tcGlsZUZpbGUnLFxuICAgICdjb21waWxlRmlsZUFzeW5jJyxcbiAgICAnY29tcGlsZUNsaWVudCcsXG4gICAgJ2NvbXBpbGVDbGllbnRBc3luYycsXG4gICAgJ2NvbXBpbGVGaWxlQ2xpZW50JyxcbiAgICAnY29tcGlsZUZpbGVDbGllbnRBc3luYycsXG4gICAgJ3JlbmRlcicsXG4gICAgJ3JlbmRlckFzeW5jJyxcbiAgICAncmVuZGVyRmlsZScsXG4gICAgJ3JlbmRlckZpbGVBc3luYydcbiAgXS5zb21lKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRyW21ldGhvZF0gPT09ICdmdW5jdGlvbic7XG4gIH0pLCAnVHJhbnNmb3JtZXIgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3Qgb25lIG9mIHRoZSBwb3RlbnRpYWwgbWV0aG9kcy4nKTtcbiAgdGhpcy5fdHIgPSB0cjtcbiAgdGhpcy5uYW1lID0gdGhpcy5fdHIubmFtZTtcbiAgdGhpcy5vdXRwdXRGb3JtYXQgPSB0aGlzLl90ci5vdXRwdXRGb3JtYXQ7XG4gIHRoaXMuaW5wdXRGb3JtYXRzID0gdGhpcy5fdHIuaW5wdXRGb3JtYXRzIHx8IFt0aGlzLm5hbWVdO1xufVxuXG52YXIgZmFsbGJhY2tzID0ge1xuICBjb21waWxlOiBbJ2NvbXBpbGUnLCAncmVuZGVyJ10sXG4gIGNvbXBpbGVBc3luYzogWydjb21waWxlQXN5bmMnLCAnY29tcGlsZScsICdyZW5kZXInXSxcbiAgY29tcGlsZUZpbGU6IFsnY29tcGlsZUZpbGUnLCAnY29tcGlsZScsICdyZW5kZXJGaWxlJywgJ3JlbmRlciddLFxuICBjb21waWxlRmlsZUFzeW5jOiBbXG4gICAgJ2NvbXBpbGVGaWxlQXN5bmMnLCAnY29tcGlsZUZpbGUnLCAnY29tcGlsZUFzeW5jJywgJ2NvbXBpbGUnLFxuICAgICdyZW5kZXJGaWxlJywgJ3JlbmRlcidcbiAgXSxcbiAgY29tcGlsZUNsaWVudDogWydjb21waWxlQ2xpZW50J10sXG4gIGNvbXBpbGVDbGllbnRBc3luYzogWydjb21waWxlQ2xpZW50QXN5bmMnLCAnY29tcGlsZUNsaWVudCddLFxuICBjb21waWxlRmlsZUNsaWVudDogWydjb21waWxlRmlsZUNsaWVudCcsICdjb21waWxlQ2xpZW50J10sXG4gIGNvbXBpbGVGaWxlQ2xpZW50QXN5bmM6IFtcbiAgICAnY29tcGlsZUZpbGVDbGllbnRBc3luYycsICdjb21waWxlRmlsZUNsaWVudCcsICdjb21waWxlQ2xpZW50QXN5bmMnLCAnY29tcGlsZUNsaWVudCdcbiAgXSxcbiAgcmVuZGVyOiBbJ3JlbmRlcicsICdjb21waWxlJ10sXG4gIHJlbmRlckFzeW5jOiBbJ3JlbmRlckFzeW5jJywgJ3JlbmRlcicsICdjb21waWxlQXN5bmMnLCAnY29tcGlsZSddLFxuICByZW5kZXJGaWxlOiBbJ3JlbmRlckZpbGUnLCAncmVuZGVyJywgJ2NvbXBpbGVGaWxlJywgJ2NvbXBpbGUnXSxcbiAgcmVuZGVyRmlsZUFzeW5jOiBbXG4gICAgJ3JlbmRlckZpbGVBc3luYycsICdyZW5kZXJGaWxlJywgJ3JlbmRlckFzeW5jJywgJ3JlbmRlcicsXG4gICAgJ2NvbXBpbGVGaWxlQXN5bmMnLCAnY29tcGlsZUZpbGUnLCAnY29tcGlsZUFzeW5jJywgJ2NvbXBpbGUnXG4gIF1cbn07XG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZS5faGFzTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMuX3RyW21ldGhvZF0gPT09ICdmdW5jdGlvbic7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNhbiA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgcmV0dXJuIGZhbGxiYWNrc1ttZXRob2RdLnNvbWUoZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNNZXRob2QobWV0aG9kKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbi8qIENPTVBJTEUgKi9cblxuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5faGFzTWV0aG9kKCdjb21waWxlJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlcicpKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm46IGZ1bmN0aW9uIChsb2NhbHMpIHtcbiAgICAgICAgICByZXR1cm4gdHIubm9ybWFsaXplKF90aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpKS5ib2R5O1xuICAgICAgICB9LFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5jYW4oJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25vdXMgY29tcGlsYXRpb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgcGxhaW4gc3RyaW5ncycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsYXRpb24nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuKHRoaXMuX3RyLmNvbXBpbGUoc3RyLCBvcHRpb25zKSk7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVBc3luYycpKSB7IC8vIGNvbXBpbGVGaWxlKiB8fCByZW5kZXJGaWxlKiB8fCByZW5kZXJBc3luYyB8fCBjb21waWxlKkNsaWVudCpcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBwbGFpbiBzdHJpbmdzJykpLm5vZGVpZnkoY2IpO1xuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuQXN5bmModGhpcy5fdHIuY29tcGlsZUFzeW5jKHN0ciwgb3B0aW9ucyksIGNiKTtcbiAgfSBlbHNlIHsgLy8gcmVuZGVyIHx8IGNvbXBpbGVcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0aGlzLmNvbXBpbGUoc3RyLCBvcHRpb25zKSwgY2IpO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVGaWxlID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVGaWxlJykpIHsgLy8gY29tcGlsZSpDbGllbnQqIHx8IGNvbXBpbGUqQXN5bmMgfHwgcmVuZGVyKkFzeW5jXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHN5bmNocm9ub3VzIGNvbXBpbGF0aW9uJyk7XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVGbih0aGlzLl90ci5jb21waWxlRmlsZShmaWxlbmFtZSwgb3B0aW9ucykpO1xuICB9IGVsc2UgaWYgKHRoaXMuX2hhc01ldGhvZCgncmVuZGVyRmlsZScpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUZuKGZ1bmN0aW9uIChsb2NhbHMpIHtcbiAgICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIucmVuZGVyRmlsZShmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzKSkuYm9keTtcbiAgICB9LmJpbmQodGhpcykpO1xuICB9IGVsc2UgeyAvLyByZW5kZXIgfHwgY29tcGlsZVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdGhpcy5jb21waWxlKHRyLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKSwgb3B0aW9ucyk7XG4gIH1cbn07XG5UcmFuc2Zvcm1lci5wcm90b3R5cGUuY29tcGlsZUZpbGVBc3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgb3B0aW9ucywgY2IpIHtcbiAgaWYgKCF0aGlzLmNhbignY29tcGlsZUZpbGVBc3luYycpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxhdGlvbicpKTtcbiAgfVxuICBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlRmlsZUFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0aGlzLl90ci5jb21waWxlRmlsZUFzeW5jKGZpbGVuYW1lLCBvcHRpb25zKSwgY2IpO1xuICB9IGVsc2UgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSB8fCB0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVGbkFzeW5jKHRoaXMuY29tcGlsZUZpbGUoZmlsZW5hbWUsIG9wdGlvbnMpLCBjYik7XG4gIH0gZWxzZSB7IC8vIGNvbXBpbGVBc3luYyB8fCBjb21waWxlIHx8IHJlbmRlclxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplRm5Bc3luYyh0ci5yZWFkRmlsZShmaWxlbmFtZSwgJ3V0ZjgnKS50aGVuKGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIGlmICh0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVBc3luYycpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ci5jb21waWxlQXN5bmMoc3RyLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7IC8vIGNvbXBpbGUgfHwgcmVuZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGUoc3RyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpLCBjYik7XG4gIH1cbn07XG5cbi8qIENPTVBJTEUgQ0xJRU5UICovXG5cblxuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVDbGllbnQgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVDbGllbnQnKSkge1xuICAgIGlmICh0aGlzLmNhbignY29tcGlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQgc3luY2hyb25vdXNseS4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQgZnJvbSBhIHN0cmluZy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBmb3IgdGhlIGNsaWVudCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHIubm9ybWFsaXplKHRoaXMuX3RyLmNvbXBpbGVDbGllbnQoc3RyLCBvcHRpb25zKSk7XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVDbGllbnRBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVDbGllbnRBc3luYycpKSB7XG4gICAgaWYgKHRoaXMuY2FuKCdjb21waWxlRmlsZUNsaWVudEFzeW5jJykpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50IGZyb20gYSBzdHJpbmcuJykpLm5vZGVpZnkoY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBmb3IgdGhlIGNsaWVudCcpKS5ub2RlaWZ5KGNiKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUNsaWVudEFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIuY29tcGlsZUNsaWVudEFzeW5jKHN0ciwgb3B0aW9ucyksIGNiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpLCBjYik7XG4gIH1cbn07XG5UcmFuc2Zvcm1lci5wcm90b3R5cGUuY29tcGlsZUZpbGVDbGllbnQgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCF0aGlzLmNhbignY29tcGlsZUZpbGVDbGllbnQnKSkge1xuICAgIGlmICh0aGlzLmNhbignY29tcGlsZUZpbGVDbGllbnRBc3luYycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50IHN5bmNocm9ub3VzbHkuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCBjb21waWxpbmcgZm9yIHRoZSBjbGllbnQnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGVDbGllbnQnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIuY29tcGlsZUZpbGVDbGllbnQoZmlsZW5hbWUsIG9wdGlvbnMpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5maWxlbmFtZSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh0aGlzLl90ci5jb21waWxlQ2xpZW50KHRyLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKSwgb3B0aW9ucykpO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLmNvbXBpbGVGaWxlQ2xpZW50QXN5bmMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICghdGhpcy5jYW4oJ2NvbXBpbGVGaWxlQ2xpZW50QXN5bmMnKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgY29tcGlsaW5nIGZvciB0aGUgY2xpZW50JykpLm5vZGVpZnkoY2IpXG4gIH1cbiAgaWYgKHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGVDbGllbnRBc3luYycpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuX3RyLmNvbXBpbGVGaWxlQ2xpZW50QXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlRmlsZUNsaWVudCcpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuX3RyLmNvbXBpbGVGaWxlQ2xpZW50KGZpbGVuYW1lLCBvcHRpb25zKSwgY2IpO1xuICB9IGVsc2Uge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModHIucmVhZEZpbGUoZmlsZW5hbWUsICd1dGY4JykudGhlbihmdW5jdGlvbiAoc3RyKSB7XG4gICAgICBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlQ2xpZW50QXN5bmMnKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHIuY29tcGlsZUNsaWVudEFzeW5jKHN0ciwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHIuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0uYmluZCh0aGlzKSksIGNiKTtcbiAgfVxufTtcblxuLyogUkVOREVSICovXG5cblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoc3RyLCBvcHRpb25zLCBsb2NhbHMpIHtcbiAgaWYgKCF0aGlzLmNhbigncmVuZGVyJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlckFzeW5jJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FuKCdyZW5kZXJGaWxlQXN5bmMnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyBmcm9tIGEgc3RyaW5nLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBUcmFuc2Zvcm0gXCInICsgdGhpcy5uYW1lICsgJ1wiIGRvZXMgbm90IHN1cHBvcnQgcmVuZGVyaW5nJyk7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlcicpKSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh0aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29tcGlsZWQgPSB0ci5ub3JtYWxpemVGbih0aGlzLl90ci5jb21waWxlKHN0ciwgb3B0aW9ucykpO1xuICAgIHZhciBib2R5ID0gY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgYm9keSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh7Ym9keTogYm9keSwgZGVwZW5kZW5jaWVzOiBjb21waWxlZC5kZXBlbmRlbmNpZXN9KTtcbiAgfVxufTtcblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXJBc3luYyA9IGZ1bmN0aW9uIChzdHIsIG9wdGlvbnMsIGxvY2FscywgY2IpIHtcbiAgaWYgKHR5cGVvZiBsb2NhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGxvY2FscztcbiAgICBsb2NhbHMgPSBvcHRpb25zO1xuICB9XG4gIGlmICghdGhpcy5jYW4oJ3JlbmRlckFzeW5jJykpIHtcbiAgICBpZiAodGhpcy5jYW4oJ3JlbmRlckZpbGVBc3luYycpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZyBmcm9tIGEgc3RyaW5nLicpKS5ub2RlaWZ5KGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcnKSkubm9kZWlmeShjYik7XG4gICAgfVxuICB9XG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckFzeW5jJykpIHtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModGhpcy5fdHIucmVuZGVyQXN5bmMoc3RyLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXInKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXIoc3RyLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZUFzeW5jKHRoaXMuY29tcGlsZUFzeW5jKHN0ciwgb3B0aW9ucykudGhlbihmdW5jdGlvbiAoY29tcGlsZWQpIHtcbiAgICAgIHJldHVybiB7Ym9keTogY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpLCBkZXBlbmRlbmNpZXM6IGNvbXBpbGVkLmRlcGVuZGVuY2llc307XG4gICAgfSksIGNiKTtcbiAgfVxufTtcblRyYW5zZm9ybWVyLnByb3RvdHlwZS5yZW5kZXJGaWxlID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBvcHRpb25zLCBsb2NhbHMpIHtcbiAgaWYgKCF0aGlzLmNhbigncmVuZGVyRmlsZScpKSB7IC8vICpBc3luYywgKkNsaWVudFxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIFRyYW5zZm9ybSBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgc3luY2hyb25vdXNseS4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemUodGhpcy5fdHIucmVuZGVyRmlsZShmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzKSk7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXInKSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplKHRoaXMuX3RyLnJlbmRlcih0ci5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsICd1dGY4JyksIG9wdGlvbnMsIGxvY2FscykpO1xuICB9IGVsc2UgeyAvLyBjb21waWxlIHx8IGNvbXBpbGVGaWxlXG4gICAgdmFyIGNvbXBpbGVkID0gdGhpcy5jb21waWxlRmlsZShmaWxlbmFtZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyLm5vcm1hbGl6ZSh7Ym9keTogY29tcGlsZWQuZm4obG9jYWxzIHx8IG9wdGlvbnMpLCBkZXBlbmRlbmNpZXM6IGNvbXBpbGVkLmRlcGVuZGVuY2llc30pO1xuICB9XG59O1xuVHJhbnNmb3JtZXIucHJvdG90eXBlLnJlbmRlckZpbGVBc3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgb3B0aW9ucywgbG9jYWxzLCBjYikge1xuICBpZiAoIXRoaXMuY2FuKCdyZW5kZXJGaWxlQXN5bmMnKSkgeyAvLyAqQ2xpZW50XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgVHJhbnNmb3JtIFwiJyArIHRoaXMubmFtZSArICdcIiBkb2VzIG5vdCBzdXBwb3J0IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbG9jYWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBsb2NhbHM7XG4gICAgbG9jYWxzID0gb3B0aW9ucztcbiAgfVxuICBpZiAodGhpcy5faGFzTWV0aG9kKCdyZW5kZXJGaWxlQXN5bmMnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXJGaWxlQXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMsIGxvY2FscyksIGNiKTtcbiAgfSBlbHNlIGlmICh0aGlzLl9oYXNNZXRob2QoJ3JlbmRlckZpbGUnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLl90ci5yZW5kZXJGaWxlKGZpbGVuYW1lLCBvcHRpb25zLCBsb2NhbHMpLCBjYik7XG4gIH0gZWxzZSBpZiAodGhpcy5faGFzTWV0aG9kKCdjb21waWxlJykgfHwgdGhpcy5faGFzTWV0aG9kKCdjb21waWxlQXN5bmMnKVxuICAgICAgICAgICAgIHx8IHRoaXMuX2hhc01ldGhvZCgnY29tcGlsZUZpbGUnKSB8fCB0aGlzLl9oYXNNZXRob2QoJ2NvbXBpbGVGaWxlQXN5bmMnKSkge1xuICAgIHJldHVybiB0ci5ub3JtYWxpemVBc3luYyh0aGlzLmNvbXBpbGVGaWxlQXN5bmMoZmlsZW5hbWUsIG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKGNvbXBpbGVkKSB7XG4gICAgICByZXR1cm4ge2JvZHk6IGNvbXBpbGVkLmZuKGxvY2FscyB8fCBvcHRpb25zKSwgZGVwZW5kZW5jaWVzOiBjb21waWxlZC5kZXBlbmRlbmNpZXN9O1xuICAgIH0pLCBjYik7XG4gIH0gZWxzZSB7IC8vIHJlbmRlciB8fCByZW5kZXJBc3luY1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpIG9wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICByZXR1cm4gdHIubm9ybWFsaXplQXN5bmModHIucmVhZEZpbGUoZmlsZW5hbWUsICd1dGY4JykudGhlbihmdW5jdGlvbiAoc3RyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJBc3luYyhzdHIsIG9wdGlvbnMsIGxvY2Fscyk7XG4gICAgfS5iaW5kKHRoaXMpKSwgY2IpO1xuICB9XG59O1xuIiwgIi8qXG5UaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuQ29weXJpZ2h0IChjKSAyMDE2IENvZGVyUHVwcHlcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcblNPRlRXQVJFLlxuXG4qL1xudmFyIF9lbmRpYW5uZXNzO1xuZXhwb3J0IGZ1bmN0aW9uIGVuZGlhbm5lc3MoKSB7XG4gIGlmICh0eXBlb2YgX2VuZGlhbm5lc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGEgPSBuZXcgQXJyYXlCdWZmZXIoMik7XG4gICAgdmFyIGIgPSBuZXcgVWludDhBcnJheShhKTtcbiAgICB2YXIgYyA9IG5ldyBVaW50MTZBcnJheShhKTtcbiAgICBiWzBdID0gMTtcbiAgICBiWzFdID0gMjtcbiAgICBpZiAoY1swXSA9PT0gMjU4KSB7XG4gICAgICBfZW5kaWFubmVzcyA9ICdCRSc7XG4gICAgfSBlbHNlIGlmIChjWzBdID09PSA1MTMpe1xuICAgICAgX2VuZGlhbm5lc3MgPSAnTEUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBmaWd1cmUgb3V0IGVuZGlhbmVzcycpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2VuZGlhbm5lc3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBob3N0bmFtZSgpIHtcbiAgaWYgKHR5cGVvZiBnbG9iYWwubG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5sb2NhdGlvbi5ob3N0bmFtZVxuICB9IGVsc2UgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZGF2ZygpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXB0aW1lKCkge1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyZWVtZW0oKSB7XG4gIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG90YWxtZW0oKSB7XG4gIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3B1cygpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZSgpIHtcbiAgcmV0dXJuICdCcm93c2VyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2UgKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbC5uYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5uYXZpZ2F0b3IuYXBwVmVyc2lvbjtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXR3b3JrSW50ZXJmYWNlcygpe31cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXR3b3JrSW50ZXJmYWNlcygpe31cblxuZXhwb3J0IGZ1bmN0aW9uIGFyY2goKSB7XG4gIHJldHVybiAnamF2YXNjcmlwdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybSgpIHtcbiAgcmV0dXJuICdicm93c2VyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRtcERpcigpIHtcbiAgcmV0dXJuICcvdG1wJztcbn1cbmV4cG9ydCB2YXIgdG1wZGlyID0gdG1wRGlyO1xuXG5leHBvcnQgdmFyIEVPTCA9ICdcXG4nO1xuZXhwb3J0IGRlZmF1bHQge1xuICBFT0w6IEVPTCxcbiAgdG1wZGlyOiB0bXBkaXIsXG4gIHRtcERpcjogdG1wRGlyLFxuICBuZXR3b3JrSW50ZXJmYWNlczpuZXR3b3JrSW50ZXJmYWNlcyxcbiAgZ2V0TmV0d29ya0ludGVyZmFjZXM6IGdldE5ldHdvcmtJbnRlcmZhY2VzLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICB0eXBlOiB0eXBlLFxuICBjcHVzOiBjcHVzLFxuICB0b3RhbG1lbTogdG90YWxtZW0sXG4gIGZyZWVtZW06IGZyZWVtZW0sXG4gIHVwdGltZTogdXB0aW1lLFxuICBsb2FkYXZnOiBsb2FkYXZnLFxuICBob3N0bmFtZTogaG9zdG5hbWUsXG4gIGVuZGlhbm5lc3M6IGVuZGlhbm5lc3MsXG59XG4iLCAiXG5jb25zdCBwb2x5ZmlsbCA9IHJlcXVpcmUoJ29zJylcblxuaWYgKHBvbHlmaWxsICYmIHBvbHlmaWxsLmRlZmF1bHQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBvbHlmaWxsLmRlZmF1bHRcbiAgICBmb3IgKGxldCBrIGluIHBvbHlmaWxsKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzW2tdID0gcG9seWZpbGxba11cbiAgICB9XG59IGVsc2UgaWYgKHBvbHlmaWxsKSAge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcG9seWZpbGxcbn1cblxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3MgPSByZXF1aXJlKCdvcycpO1xuXG4vLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9vcy1ob21lZGlyL2Jsb2IvMTFlMDg5ZjQ3NTRkYjM4YmI1MzVlNWE4NDE2MzIwYzQ0NDZlOGNmZC9pbmRleC5qc1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9zLmhvbWVkaXIgfHwgZnVuY3Rpb24gaG9tZWRpcigpIHtcbiAgICB2YXIgaG9tZSA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgdmFyIHVzZXIgPSBwcm9jZXNzLmVudi5MT0dOQU1FIHx8IHByb2Nlc3MuZW52LlVTRVIgfHwgcHJvY2Vzcy5lbnYuTE5BTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUk5BTUU7XG5cbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUgfHwgcHJvY2Vzcy5lbnYuSE9NRURSSVZFICsgcHJvY2Vzcy5lbnYuSE9NRVBBVEggfHwgaG9tZSB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICAgICByZXR1cm4gaG9tZSB8fCAodXNlciA/ICcvVXNlcnMvJyArIHVzZXIgOiBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICByZXR1cm4gaG9tZSB8fCAocHJvY2Vzcy5nZXR1aWQoKSA9PT0gMCA/ICcvcm9vdCcgOiAodXNlciA/ICcvaG9tZS8nICsgdXNlciA6IG51bGwpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1leHRyYS1wYXJlbnNcbiAgICB9XG5cbiAgICByZXR1cm4gaG9tZSB8fCBudWxsO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBzZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC93aWtpL0phdmFTY3JpcHRTdGFja1RyYWNlQXBpXG4gICAgdmFyIG9yaWdQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnVuY3Rpb24gKF8sIHN0YWNrKSB7IHJldHVybiBzdGFjazsgfTtcbiAgICB2YXIgc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ1ByZXBhcmVTdGFja1RyYWNlO1xuICAgIHJldHVybiBzdGFja1syXS5nZXRGaWxlTmFtZSgpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vLyBSZWdleCB0byBzcGxpdCBhIHdpbmRvd3MgcGF0aCBpbnRvIGludG8gW2Rpciwgcm9vdCwgYmFzZW5hbWUsIG5hbWUsIGV4dF1cbnZhciBzcGxpdFdpbmRvd3NSZSA9XG4gICAgL14oKCg/OlthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXStbXlxcXFxcXC9dKyk/W1xcXFxcXC9dPykoPzpbXlxcXFxcXC9dKltcXFxcXFwvXSkqKSgoXFwuezEsMn18W15cXFxcXFwvXSs/fCkoXFwuW14uXFwvXFxcXF0qfCkpW1xcXFxcXC9dKiQvO1xuXG52YXIgd2luMzIgPSB7fTtcblxuZnVuY3Rpb24gd2luMzJTcGxpdFBhdGgoZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHNwbGl0V2luZG93c1JlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xufVxuXG53aW4zMi5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gd2luMzJTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA1KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm9vdDogYWxsUGFydHNbMV0sXG4gICAgZGlyOiBhbGxQYXJ0c1swXSA9PT0gYWxsUGFydHNbMV0gPyBhbGxQYXJ0c1swXSA6IGFsbFBhcnRzWzBdLnNsaWNlKDAsIC0xKSxcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcbiAgICBleHQ6IGFsbFBhcnRzWzRdLFxuICAgIG5hbWU6IGFsbFBhcnRzWzNdXG4gIH07XG59O1xuXG5cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtkaXIsIHJvb3QsIGJhc2VuYW1lLCBuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKChcXC8/KSg/OlteXFwvXSpcXC8pKikoKFxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSlbXFwvXSokLztcbnZhciBwb3NpeCA9IHt9O1xuXG5cbmZ1bmN0aW9uIHBvc2l4U3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn1cblxuXG5wb3NpeC5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gcG9zaXhTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA1KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIFxuICByZXR1cm4ge1xuICAgIHJvb3Q6IGFsbFBhcnRzWzFdLFxuICAgIGRpcjogYWxsUGFydHNbMF0uc2xpY2UoMCwgLTEpLFxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxuICAgIGV4dDogYWxsUGFydHNbNF0sXG4gICAgbmFtZTogYWxsUGFydHNbM10sXG4gIH07XG59O1xuXG5cbmlmIChpc1dpbmRvd3MpXG4gIG1vZHVsZS5leHBvcnRzID0gd2luMzIucGFyc2U7XG5lbHNlIC8qIHBvc2l4ICovXG4gIG1vZHVsZS5leHBvcnRzID0gcG9zaXgucGFyc2U7XG5cbm1vZHVsZS5leHBvcnRzLnBvc2l4ID0gcG9zaXgucGFyc2U7XG5tb2R1bGUuZXhwb3J0cy53aW4zMiA9IHdpbjMyLnBhcnNlO1xuIiwgInZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHBhcnNlID0gcGF0aC5wYXJzZSB8fCByZXF1aXJlKCdwYXRoLXBhcnNlJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcblxudmFyIGdldE5vZGVNb2R1bGVzRGlycyA9IGZ1bmN0aW9uIGdldE5vZGVNb2R1bGVzRGlycyhhYnNvbHV0ZVN0YXJ0LCBtb2R1bGVzKSB7XG4gICAgdmFyIHByZWZpeCA9ICcvJztcbiAgICBpZiAoKC9eKFtBLVphLXpdOikvKS50ZXN0KGFic29sdXRlU3RhcnQpKSB7XG4gICAgICAgIHByZWZpeCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoKC9eXFxcXFxcXFwvKS50ZXN0KGFic29sdXRlU3RhcnQpKSB7XG4gICAgICAgIHByZWZpeCA9ICdcXFxcXFxcXCc7XG4gICAgfVxuXG4gICAgdmFyIHBhdGhzID0gW2Fic29sdXRlU3RhcnRdO1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZShhYnNvbHV0ZVN0YXJ0KTtcbiAgICB3aGlsZSAocGFyc2VkLmRpciAhPT0gcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgcGF0aHMucHVzaChwYXJzZWQuZGlyKTtcbiAgICAgICAgcGFyc2VkID0gcGFyc2UocGFyc2VkLmRpcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhzLnJlZHVjZShmdW5jdGlvbiAoZGlycywgYVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGRpcnMuY29uY2F0KG1vZHVsZXMubWFwKGZ1bmN0aW9uIChtb2R1bGVEaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUocHJlZml4LCBhUGF0aCwgbW9kdWxlRGlyKTtcbiAgICAgICAgfSkpO1xuICAgIH0sIFtdKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9kZU1vZHVsZXNQYXRocyhzdGFydCwgb3B0cywgcmVxdWVzdCkge1xuICAgIHZhciBtb2R1bGVzID0gb3B0cyAmJiBvcHRzLm1vZHVsZURpcmVjdG9yeVxuICAgICAgICA/IFtdLmNvbmNhdChvcHRzLm1vZHVsZURpcmVjdG9yeSlcbiAgICAgICAgOiBbJ25vZGVfbW9kdWxlcyddO1xuXG4gICAgaWYgKG9wdHMgJiYgdHlwZW9mIG9wdHMucGF0aHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMucGF0aHMoXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXROb2RlTW9kdWxlc0RpcnMoc3RhcnQsIG1vZHVsZXMpOyB9LFxuICAgICAgICAgICAgb3B0c1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBkaXJzID0gZ2V0Tm9kZU1vZHVsZXNEaXJzKHN0YXJ0LCBtb2R1bGVzKTtcbiAgICByZXR1cm4gb3B0cyAmJiBvcHRzLnBhdGhzID8gZGlycy5jb25jYXQob3B0cy5wYXRocykgOiBkaXJzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh4LCBvcHRzKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWxlIGlzIHB1cnBvc2VmdWxseSBhIHBhc3N0aHJvdWdoLiBJdCdzIGV4cGVjdGVkIHRoYXQgdGhpcmQtcGFydHlcbiAgICAgKiBlbnZpcm9ubWVudHMgd2lsbCBvdmVycmlkZSBpdCBhdCBydW50aW1lIGluIG9yZGVyIHRvIGluamVjdCBzcGVjaWFsIGxvZ2ljXG4gICAgICogaW50byBgcmVzb2x2ZWAgKGJ5IG1hbmlwdWxhdGluZyB0aGUgb3B0aW9ucykuIE9uZSBzdWNoIGV4YW1wbGUgaXMgdGhlIFBuUFxuICAgICAqIGNvZGUgcGF0aCBpbiBZYXJuLlxuICAgICAqL1xuXG4gICAgcmV0dXJuIG9wdHMgfHwge307XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xuXG5mdW5jdGlvbiBzcGVjaWZpZXJJbmNsdWRlZChjdXJyZW50LCBzcGVjaWZpZXIpIHtcblx0dmFyIG5vZGVQYXJ0cyA9IGN1cnJlbnQuc3BsaXQoJy4nKTtcblx0dmFyIHBhcnRzID0gc3BlY2lmaWVyLnNwbGl0KCcgJyk7XG5cdHZhciBvcCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1swXSA6ICc9Jztcblx0dmFyIHZlcnNpb25QYXJ0cyA9IChwYXJ0cy5sZW5ndGggPiAxID8gcGFydHNbMV0gOiBwYXJ0c1swXSkuc3BsaXQoJy4nKTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IDM7ICsraSkge1xuXHRcdHZhciBjdXIgPSBwYXJzZUludChub2RlUGFydHNbaV0gfHwgMCwgMTApO1xuXHRcdHZhciB2ZXIgPSBwYXJzZUludCh2ZXJzaW9uUGFydHNbaV0gfHwgMCwgMTApO1xuXHRcdGlmIChjdXIgPT09IHZlcikge1xuXHRcdFx0Y29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG5cdFx0fVxuXHRcdGlmIChvcCA9PT0gJzwnKSB7XG5cdFx0XHRyZXR1cm4gY3VyIDwgdmVyO1xuXHRcdH1cblx0XHRpZiAob3AgPT09ICc+PScpIHtcblx0XHRcdHJldHVybiBjdXIgPj0gdmVyO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIG9wID09PSAnPj0nO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzUmFuZ2UoY3VycmVudCwgcmFuZ2UpIHtcblx0dmFyIHNwZWNpZmllcnMgPSByYW5nZS5zcGxpdCgvID8mJiA/Lyk7XG5cdGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwZWNpZmllcnMubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoIXNwZWNpZmllckluY2x1ZGVkKGN1cnJlbnQsIHNwZWNpZmllcnNbaV0pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2ZXJzaW9uSW5jbHVkZWQobm9kZVZlcnNpb24sIHNwZWNpZmllclZhbHVlKSB7XG5cdGlmICh0eXBlb2Ygc3BlY2lmaWVyVmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdHJldHVybiBzcGVjaWZpZXJWYWx1ZTtcblx0fVxuXG5cdHZhciBjdXJyZW50ID0gdHlwZW9mIG5vZGVWZXJzaW9uID09PSAndW5kZWZpbmVkJ1xuXHRcdD8gcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGVcblx0XHQ6IG5vZGVWZXJzaW9uO1xuXG5cdGlmICh0eXBlb2YgY3VycmVudCAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlOyAvLyByZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlOyAvLyByZXR1cm4gZmFsc2U7IC8vIHJldHVybiBmYWxzZTsgLy8gcmV0dXJuIGZhbHNlOyAvLyB0aHJvdyBuZXcgVHlwZUVycm9yKHR5cGVvZiBub2RlVmVyc2lvbiA9PT0gJ3VuZGVmaW5lZCcgPyAnVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IG5vZGUgdmVyc2lvbicgOiAnSWYgcHJvdmlkZWQsIGEgdmFsaWQgbm9kZSB2ZXJzaW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblxuXHRpZiAoc3BlY2lmaWVyVmFsdWUgJiYgdHlwZW9mIHNwZWNpZmllclZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY2lmaWVyVmFsdWUubGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmIChtYXRjaGVzUmFuZ2UoY3VycmVudCwgc3BlY2lmaWVyVmFsdWVbaV0pKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0cmV0dXJuIG1hdGNoZXNSYW5nZShjdXJyZW50LCBzcGVjaWZpZXJWYWx1ZSk7XG59XG5cbnZhciBkYXRhID0gcmVxdWlyZSgnLi9jb3JlLmpzb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NvcmUoeCwgbm9kZVZlcnNpb24pIHtcblx0cmV0dXJuIGhhcyhkYXRhLCB4KSAmJiB2ZXJzaW9uSW5jbHVkZWQobm9kZVZlcnNpb24sIGRhdGFbeF0pO1xufTtcbiIsICJ2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIGdldEhvbWVkaXIgPSByZXF1aXJlKCcuL2hvbWVkaXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGNhbGxlciA9IHJlcXVpcmUoJy4vY2FsbGVyJyk7XG52YXIgbm9kZU1vZHVsZXNQYXRocyA9IHJlcXVpcmUoJy4vbm9kZS1tb2R1bGVzLXBhdGhzJyk7XG52YXIgbm9ybWFsaXplT3B0aW9ucyA9IHJlcXVpcmUoJy4vbm9ybWFsaXplLW9wdGlvbnMnKTtcbnZhciBpc0NvcmUgPSByZXF1aXJlKCdpcy1jb3JlLW1vZHVsZScpO1xuXG52YXIgcmVhbHBhdGhGUyA9IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicgJiYgZnMucmVhbHBhdGggJiYgdHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWxwYXRoLm5hdGl2ZSA6IGZzLnJlYWxwYXRoO1xuXG52YXIgaG9tZWRpciA9IGdldEhvbWVkaXIoKTtcbnZhciBkZWZhdWx0UGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIsICcubm9kZV9tb2R1bGVzJyksXG4gICAgICAgIHBhdGguam9pbihob21lZGlyLCAnLm5vZGVfbGlicmFyaWVzJylcbiAgICBdO1xufTtcblxudmFyIGRlZmF1bHRJc0ZpbGUgPSBmdW5jdGlvbiBpc0ZpbGUoZmlsZSwgY2IpIHtcbiAgICBmcy5zdGF0KGZpbGUsIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBzdGF0LmlzRmlsZSgpIHx8IHN0YXQuaXNGSUZPKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXJyLmNvZGUgPT09ICdFTk9URElSJykgcmV0dXJuIGNiKG51bGwsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfSk7XG59O1xuXG52YXIgZGVmYXVsdElzRGlyID0gZnVuY3Rpb24gaXNEaXJlY3RvcnkoZGlyLCBjYikge1xuICAgIGZzLnN0YXQoZGlyLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgc3RhdC5pc0RpcmVjdG9yeSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnIHx8IGVyci5jb2RlID09PSAnRU5PVERJUicpIHJldHVybiBjYihudWxsLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH0pO1xufTtcblxudmFyIGRlZmF1bHRSZWFscGF0aCA9IGZ1bmN0aW9uIHJlYWxwYXRoKHgsIGNiKSB7XG4gICAgcmVhbHBhdGhGUyh4LCBmdW5jdGlvbiAocmVhbHBhdGhFcnIsIHJlYWxQYXRoKSB7XG4gICAgICAgIGlmIChyZWFscGF0aEVyciAmJiByZWFscGF0aEVyci5jb2RlICE9PSAnRU5PRU5UJykgY2IocmVhbHBhdGhFcnIpO1xuICAgICAgICBlbHNlIGNiKG51bGwsIHJlYWxwYXRoRXJyID8geCA6IHJlYWxQYXRoKTtcbiAgICB9KTtcbn07XG5cbnZhciBtYXliZVJlYWxwYXRoID0gZnVuY3Rpb24gbWF5YmVSZWFscGF0aChyZWFscGF0aCwgeCwgb3B0cywgY2IpIHtcbiAgICBpZiAob3B0cyAmJiBvcHRzLnByZXNlcnZlU3ltbGlua3MgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlYWxwYXRoKHgsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjYihudWxsLCB4KTtcbiAgICB9XG59O1xuXG52YXIgZGVmYXVsdFJlYWRQYWNrYWdlID0gZnVuY3Rpb24gZGVmYXVsdFJlYWRQYWNrYWdlKHJlYWRGaWxlLCBwa2dmaWxlLCBjYikge1xuICAgIHJlYWRGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChyZWFkRmlsZUVyciwgYm9keSkge1xuICAgICAgICBpZiAocmVhZEZpbGVFcnIpIGNiKHJlYWRGaWxlRXJyKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBwa2cgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICAgICAgICAgIGNiKG51bGwsIHBrZyk7XG4gICAgICAgICAgICB9IGNhdGNoIChqc29uRXJyKSB7XG4gICAgICAgICAgICAgICAgY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbnZhciBnZXRQYWNrYWdlQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKSB7XG4gICAgdmFyIGRpcnMgPSBub2RlTW9kdWxlc1BhdGhzKHN0YXJ0LCBvcHRzLCB4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlyc1tpXSA9IHBhdGguam9pbihkaXJzW2ldLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmUoeCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgY2IgPSBjYWxsYmFjaztcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0cztcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdQYXRoIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wdHMgPSBub3JtYWxpemVPcHRpb25zKHgsIG9wdHMpO1xuXG4gICAgdmFyIGlzRmlsZSA9IG9wdHMuaXNGaWxlIHx8IGRlZmF1bHRJc0ZpbGU7XG4gICAgdmFyIGlzRGlyZWN0b3J5ID0gb3B0cy5pc0RpcmVjdG9yeSB8fCBkZWZhdWx0SXNEaXI7XG4gICAgdmFyIHJlYWRGaWxlID0gb3B0cy5yZWFkRmlsZSB8fCBmcy5yZWFkRmlsZTtcbiAgICB2YXIgcmVhbHBhdGggPSBvcHRzLnJlYWxwYXRoIHx8IGRlZmF1bHRSZWFscGF0aDtcbiAgICB2YXIgcmVhZFBhY2thZ2UgPSBvcHRzLnJlYWRQYWNrYWdlIHx8IGRlZmF1bHRSZWFkUGFja2FnZTtcbiAgICBpZiAob3B0cy5yZWFkRmlsZSAmJiBvcHRzLnJlYWRQYWNrYWdlKSB7XG4gICAgICAgIHZhciBjb25mbGljdEVyciA9IG5ldyBUeXBlRXJyb3IoJ2ByZWFkRmlsZWAgYW5kIGByZWFkUGFja2FnZWAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4nKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2IoY29uZmxpY3RFcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHBhY2thZ2VJdGVyYXRvciA9IG9wdHMucGFja2FnZUl0ZXJhdG9yO1xuXG4gICAgdmFyIGV4dGVuc2lvbnMgPSBvcHRzLmV4dGVuc2lvbnMgfHwgWycuanMnXTtcbiAgICB2YXIgaW5jbHVkZUNvcmVNb2R1bGVzID0gb3B0cy5pbmNsdWRlQ29yZU1vZHVsZXMgIT09IGZhbHNlO1xuICAgIHZhciBiYXNlZGlyID0gb3B0cy5iYXNlZGlyIHx8IHBhdGguZGlybmFtZShjYWxsZXIoKSk7XG4gICAgdmFyIHBhcmVudCA9IG9wdHMuZmlsZW5hbWUgfHwgYmFzZWRpcjtcblxuICAgIG9wdHMucGF0aHMgPSBvcHRzLnBhdGhzIHx8IGRlZmF1bHRQYXRocygpO1xuXG4gICAgLy8gZW5zdXJlIHRoYXQgYGJhc2VkaXJgIGlzIGFuIGFic29sdXRlIHBhdGggYXQgdGhpcyBwb2ludCwgcmVzb2x2aW5nIGFnYWluc3QgdGhlIHByb2Nlc3MnIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICB2YXIgYWJzb2x1dGVTdGFydCA9IHBhdGgucmVzb2x2ZShiYXNlZGlyKTtcblxuICAgIG1heWJlUmVhbHBhdGgoXG4gICAgICAgIHJlYWxwYXRoLFxuICAgICAgICBhYnNvbHV0ZVN0YXJ0LFxuICAgICAgICBvcHRzLFxuICAgICAgICBmdW5jdGlvbiAoZXJyLCByZWFsU3RhcnQpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgICAgICBlbHNlIGluaXQocmVhbFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGZ1bmN0aW9uIGluaXQoYmFzZWRpcikge1xuICAgICAgICBpZiAoKC9eKD86XFwuXFwuPyg/OlxcL3wkKXxcXC98KFtBLVphLXpdOik/Wy9cXFxcXSkvKS50ZXN0KHgpKSB7XG4gICAgICAgICAgICByZXMgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgeCk7XG4gICAgICAgICAgICBpZiAoeCA9PT0gJy4nIHx8IHggPT09ICcuLicgfHwgeC5zbGljZSgtMSkgPT09ICcvJykgcmVzICs9ICcvJztcbiAgICAgICAgICAgIGlmICgoL1xcLyQvKS50ZXN0KHgpICYmIHJlcyA9PT0gYmFzZWRpcikge1xuICAgICAgICAgICAgICAgIGxvYWRBc0RpcmVjdG9yeShyZXMsIG9wdHMucGFja2FnZSwgb25maWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSBsb2FkQXNGaWxlKHJlcywgb3B0cy5wYWNrYWdlLCBvbmZpbGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVDb3JlTW9kdWxlcyAmJiBpc0NvcmUoeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCB4KTtcbiAgICAgICAgfSBlbHNlIGxvYWROb2RlTW9kdWxlcyh4LCBiYXNlZGlyLCBmdW5jdGlvbiAoZXJyLCBuLCBwa2cpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgICAgICBlbHNlIGlmIChuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1heWJlUmVhbHBhdGgocmVhbHBhdGgsIG4sIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlYWxOKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihudWxsLCByZWFsTiwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlRXJyb3IgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFcnJvci5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuICAgICAgICAgICAgICAgIGNiKG1vZHVsZUVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25maWxlKGVyciwgbSwgcGtnKSB7XG4gICAgICAgIGlmIChlcnIpIGNiKGVycik7XG4gICAgICAgIGVsc2UgaWYgKG0pIGNiKG51bGwsIG0sIHBrZyk7XG4gICAgICAgIGVsc2UgbG9hZEFzRGlyZWN0b3J5KHJlcywgZnVuY3Rpb24gKGVyciwgZCwgcGtnKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSBjYihlcnIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoZCkge1xuICAgICAgICAgICAgICAgIG1heWJlUmVhbHBhdGgocmVhbHBhdGgsIGQsIG9wdHMsIGZ1bmN0aW9uIChlcnIsIHJlYWxEKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihudWxsLCByZWFsRCwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlRXJyb3IgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFcnJvci5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuICAgICAgICAgICAgICAgIGNiKG1vZHVsZUVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZEFzRmlsZSh4LCB0aGVQYWNrYWdlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgbG9hZEFzRmlsZVBhY2thZ2UgPSB0aGVQYWNrYWdlO1xuICAgICAgICB2YXIgY2IgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBsb2FkQXNGaWxlUGFja2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2IgPSBsb2FkQXNGaWxlUGFja2FnZTtcbiAgICAgICAgICAgIGxvYWRBc0ZpbGVQYWNrYWdlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4dHMgPSBbJyddLmNvbmNhdChleHRlbnNpb25zKTtcbiAgICAgICAgbG9hZChleHRzLCB4LCBsb2FkQXNGaWxlUGFja2FnZSk7XG5cbiAgICAgICAgZnVuY3Rpb24gbG9hZChleHRzLCB4LCBsb2FkUGFja2FnZSkge1xuICAgICAgICAgICAgaWYgKGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm4gY2IobnVsbCwgdW5kZWZpbmVkLCBsb2FkUGFja2FnZSk7XG4gICAgICAgICAgICB2YXIgZmlsZSA9IHggKyBleHRzWzBdO1xuXG4gICAgICAgICAgICB2YXIgcGtnID0gbG9hZFBhY2thZ2U7XG4gICAgICAgICAgICBpZiAocGtnKSBvbnBrZyhudWxsLCBwa2cpO1xuICAgICAgICAgICAgZWxzZSBsb2FkcGtnKHBhdGguZGlybmFtZShmaWxlKSwgb25wa2cpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbnBrZyhlcnIsIHBrZ18sIGRpcikge1xuICAgICAgICAgICAgICAgIHBrZyA9IHBrZ187XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGRpciAmJiBwa2cgJiYgb3B0cy5wYXRoRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZmlsZSA9IHBhdGgucmVsYXRpdmUoZGlyLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHJmaWxlLnNsaWNlKDAsIHJmaWxlLmxlbmd0aCAtIGV4dHNbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBvcHRzLnBhdGhGaWx0ZXIocGtnLCB4LCByZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocikgcmV0dXJuIGxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBbJyddLmNvbmNhdChleHRlbnNpb25zLnNsaWNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGRpciwgciksXG4gICAgICAgICAgICAgICAgICAgICAgICBwa2dcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNGaWxlKGZpbGUsIG9uZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb25leChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKGV4KSByZXR1cm4gY2IobnVsbCwgZmlsZSwgcGtnKTtcbiAgICAgICAgICAgICAgICBsb2FkKGV4dHMuc2xpY2UoMSksIHgsIHBrZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkcGtnKGRpciwgY2IpIHtcbiAgICAgICAgaWYgKGRpciA9PT0gJycgfHwgZGlyID09PSAnLycpIHJldHVybiBjYihudWxsKTtcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgKC9eXFx3OlsvXFxcXF0qJC8pLnRlc3QoZGlyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoL1svXFxcXF1ub2RlX21vZHVsZXNbL1xcXFxdKiQvKS50ZXN0KGRpcikpIHJldHVybiBjYihudWxsKTtcblxuICAgICAgICBtYXliZVJlYWxwYXRoKHJlYWxwYXRoLCBkaXIsIG9wdHMsIGZ1bmN0aW9uICh1bndyYXBFcnIsIHBrZ2Rpcikge1xuICAgICAgICAgICAgaWYgKHVud3JhcEVycikgcmV0dXJuIGxvYWRwa2cocGF0aC5kaXJuYW1lKGRpciksIGNiKTtcbiAgICAgICAgICAgIHZhciBwa2dmaWxlID0gcGF0aC5qb2luKHBrZ2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgICAgaXNGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gb24gZXJyLCBleCBpcyBmYWxzZVxuICAgICAgICAgICAgICAgIGlmICghZXgpIHJldHVybiBsb2FkcGtnKHBhdGguZGlybmFtZShkaXIpLCBjYik7XG5cbiAgICAgICAgICAgICAgICByZWFkUGFja2FnZShyZWFkRmlsZSwgcGtnZmlsZSwgZnVuY3Rpb24gKGVyciwgcGtnUGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgY2IoZXJyKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgcGtnID0gcGtnUGFyYW07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAmJiBvcHRzLnBhY2thZ2VGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9IG9wdHMucGFja2FnZUZpbHRlcihwa2csIHBrZ2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNiKG51bGwsIHBrZywgZGlyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNEaXJlY3RvcnkoeCwgbG9hZEFzRGlyZWN0b3J5UGFja2FnZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNiID0gY2FsbGJhY2s7XG4gICAgICAgIHZhciBmcGtnID0gbG9hZEFzRGlyZWN0b3J5UGFja2FnZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmcGtnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYiA9IGZwa2c7XG4gICAgICAgICAgICBmcGtnID0gb3B0cy5wYWNrYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF5YmVSZWFscGF0aChyZWFscGF0aCwgeCwgb3B0cywgZnVuY3Rpb24gKHVud3JhcEVyciwgcGtnZGlyKSB7XG4gICAgICAgICAgICBpZiAodW53cmFwRXJyKSByZXR1cm4gY2IodW53cmFwRXJyKTtcbiAgICAgICAgICAgIHZhciBwa2dmaWxlID0gcGF0aC5qb2luKHBrZ2RpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgICAgaXNGaWxlKHBrZ2ZpbGUsIGZ1bmN0aW9uIChlcnIsIGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgaWYgKCFleCkgcmV0dXJuIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBmcGtnLCBjYik7XG5cbiAgICAgICAgICAgICAgICByZWFkUGFja2FnZShyZWFkRmlsZSwgcGtnZmlsZSwgZnVuY3Rpb24gKGVyciwgcGtnUGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHBrZyA9IHBrZ1BhcmFtO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwa2cgJiYgb3B0cy5wYWNrYWdlRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSBvcHRzLnBhY2thZ2VGaWx0ZXIocGtnLCBwa2dmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwa2cgJiYgcGtnLm1haW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGtnLm1haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1haW5FcnJvciA9IG5ldyBUeXBlRXJyb3IoJ3BhY2thZ2UgXHUyMDFDJyArIHBrZy5uYW1lICsgJ1x1MjAxRCBgbWFpbmAgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5FcnJvci5jb2RlID0gJ0lOVkFMSURfUEFDS0FHRV9NQUlOJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IobWFpbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa2cubWFpbiA9PT0gJy4nIHx8IHBrZy5tYWluID09PSAnLi8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLm1haW4gPSAnaW5kZXgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEFzRmlsZShwYXRoLnJlc29sdmUoeCwgcGtnLm1haW4pLCBwa2csIGZ1bmN0aW9uIChlcnIsIG0sIHBrZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSByZXR1cm4gY2IobnVsbCwgbSwgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZykgcmV0dXJuIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBwa2csIGNiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXIgPSBwYXRoLnJlc29sdmUoeCwgcGtnLm1haW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBc0RpcmVjdG9yeShkaXIsIHBrZywgZnVuY3Rpb24gKGVyciwgbiwgcGtnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgcmV0dXJuIGNiKG51bGwsIG4sIHBrZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBc0ZpbGUocGF0aC5qb2luKHgsICdpbmRleCcpLCBwa2csIGNiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbG9hZEFzRmlsZShwYXRoLmpvaW4oeCwgJy9pbmRleCcpLCBwa2csIGNiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzRGlycyhjYiwgZGlycykge1xuICAgICAgICBpZiAoZGlycy5sZW5ndGggPT09IDApIHJldHVybiBjYihudWxsLCB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZGlyID0gZGlyc1swXTtcblxuICAgICAgICBpc0RpcmVjdG9yeShwYXRoLmRpcm5hbWUoZGlyKSwgaXNkaXIpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGlzZGlyKGVyciwgaXNkaXIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgaWYgKCFpc2RpcikgcmV0dXJuIHByb2Nlc3NEaXJzKGNiLCBkaXJzLnNsaWNlKDEpKTtcbiAgICAgICAgICAgIGxvYWRBc0ZpbGUoZGlyLCBvcHRzLnBhY2thZ2UsIG9uZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbmZpbGUoZXJyLCBtLCBwa2cpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgaWYgKG0pIHJldHVybiBjYihudWxsLCBtLCBwa2cpO1xuICAgICAgICAgICAgbG9hZEFzRGlyZWN0b3J5KGRpciwgb3B0cy5wYWNrYWdlLCBvbmRpcik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbmRpcihlcnIsIG4sIHBrZykge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICBpZiAobikgcmV0dXJuIGNiKG51bGwsIG4sIHBrZyk7XG4gICAgICAgICAgICBwcm9jZXNzRGlycyhjYiwgZGlycy5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbG9hZE5vZGVNb2R1bGVzKHgsIHN0YXJ0LCBjYikge1xuICAgICAgICB2YXIgdGh1bmsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRQYWNrYWdlQ2FuZGlkYXRlcyh4LCBzdGFydCwgb3B0cyk7IH07XG4gICAgICAgIHByb2Nlc3NEaXJzKFxuICAgICAgICAgICAgY2IsXG4gICAgICAgICAgICBwYWNrYWdlSXRlcmF0b3IgPyBwYWNrYWdlSXRlcmF0b3IoeCwgc3RhcnQsIHRodW5rLCBvcHRzKSA6IHRodW5rKClcbiAgICAgICAgKTtcbiAgICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQ29yZU1vZHVsZSA9IHJlcXVpcmUoJ2lzLWNvcmUtbW9kdWxlJyk7XG52YXIgZGF0YSA9IHJlcXVpcmUoJy4vY29yZS5qc29uJyk7XG5cbnZhciBjb3JlID0ge307XG5mb3IgKHZhciBtb2QgaW4gZGF0YSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBtb2QpKSB7XG4gICAgICAgIGNvcmVbbW9kXSA9IGlzQ29yZU1vZHVsZShtb2QpO1xuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gY29yZTtcbiIsICJ2YXIgaXNDb3JlTW9kdWxlID0gcmVxdWlyZSgnaXMtY29yZS1tb2R1bGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NvcmUoeCkge1xuICAgIHJldHVybiBpc0NvcmVNb2R1bGUoeCk7XG59O1xuIiwgInZhciBpc0NvcmUgPSByZXF1aXJlKCdpcy1jb3JlLW1vZHVsZScpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGdldEhvbWVkaXIgPSByZXF1aXJlKCcuL2hvbWVkaXInKTtcbnZhciBjYWxsZXIgPSByZXF1aXJlKCcuL2NhbGxlcicpO1xudmFyIG5vZGVNb2R1bGVzUGF0aHMgPSByZXF1aXJlKCcuL25vZGUtbW9kdWxlcy1wYXRocycpO1xudmFyIG5vcm1hbGl6ZU9wdGlvbnMgPSByZXF1aXJlKCcuL25vcm1hbGl6ZS1vcHRpb25zJyk7XG5cbnZhciByZWFscGF0aEZTID0gcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJyAmJiBmcy5yZWFscGF0aFN5bmMgJiYgdHlwZW9mIGZzLnJlYWxwYXRoU3luYy5uYXRpdmUgPT09ICdmdW5jdGlvbicgPyBmcy5yZWFscGF0aFN5bmMubmF0aXZlIDogZnMucmVhbHBhdGhTeW5jO1xuXG52YXIgaG9tZWRpciA9IGdldEhvbWVkaXIoKTtcbnZhciBkZWZhdWx0UGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGF0aC5qb2luKGhvbWVkaXIsICcubm9kZV9tb2R1bGVzJyksXG4gICAgICAgIHBhdGguam9pbihob21lZGlyLCAnLm5vZGVfbGlicmFyaWVzJylcbiAgICBdO1xufTtcblxudmFyIGRlZmF1bHRJc0ZpbGUgPSBmdW5jdGlvbiBpc0ZpbGUoZmlsZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBzdGF0ID0gZnMuc3RhdFN5bmMoZmlsZSwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAmJiAoZS5jb2RlID09PSAnRU5PRU5UJyB8fCBlLmNvZGUgPT09ICdFTk9URElSJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuICEhc3RhdCAmJiAoc3RhdC5pc0ZpbGUoKSB8fCBzdGF0LmlzRklGTygpKTtcbn07XG5cbnZhciBkZWZhdWx0SXNEaXIgPSBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXIpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgc3RhdCA9IGZzLnN0YXRTeW5jKGRpciwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAmJiAoZS5jb2RlID09PSAnRU5PRU5UJyB8fCBlLmNvZGUgPT09ICdFTk9URElSJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuICEhc3RhdCAmJiBzdGF0LmlzRGlyZWN0b3J5KCk7XG59O1xuXG52YXIgZGVmYXVsdFJlYWxwYXRoU3luYyA9IGZ1bmN0aW9uIHJlYWxwYXRoU3luYyh4KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlYWxwYXRoRlMoeCk7XG4gICAgfSBjYXRjaCAocmVhbHBhdGhFcnIpIHtcbiAgICAgICAgaWYgKHJlYWxwYXRoRXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICB0aHJvdyByZWFscGF0aEVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbnZhciBtYXliZVJlYWxwYXRoU3luYyA9IGZ1bmN0aW9uIG1heWJlUmVhbHBhdGhTeW5jKHJlYWxwYXRoU3luYywgeCwgb3B0cykge1xuICAgIGlmIChvcHRzICYmIG9wdHMucHJlc2VydmVTeW1saW5rcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlYWxwYXRoU3luYyh4KTtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG52YXIgZGVmYXVsdFJlYWRQYWNrYWdlU3luYyA9IGZ1bmN0aW9uIGRlZmF1bHRSZWFkUGFja2FnZVN5bmMocmVhZEZpbGVTeW5jLCBwa2dmaWxlKSB7XG4gICAgdmFyIGJvZHkgPSByZWFkRmlsZVN5bmMocGtnZmlsZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHBrZyA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgIHJldHVybiBwa2c7XG4gICAgfSBjYXRjaCAoanNvbkVycikge31cbn07XG5cbnZhciBnZXRQYWNrYWdlQ2FuZGlkYXRlcyA9IGZ1bmN0aW9uIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKSB7XG4gICAgdmFyIGRpcnMgPSBub2RlTW9kdWxlc1BhdGhzKHN0YXJ0LCBvcHRzLCB4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlyc1tpXSA9IHBhdGguam9pbihkaXJzW2ldLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmVTeW5jKHgsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdGggbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgdmFyIG9wdHMgPSBub3JtYWxpemVPcHRpb25zKHgsIG9wdGlvbnMpO1xuXG4gICAgdmFyIGlzRmlsZSA9IG9wdHMuaXNGaWxlIHx8IGRlZmF1bHRJc0ZpbGU7XG4gICAgdmFyIHJlYWRGaWxlU3luYyA9IG9wdHMucmVhZEZpbGVTeW5jIHx8IGZzLnJlYWRGaWxlU3luYztcbiAgICB2YXIgaXNEaXJlY3RvcnkgPSBvcHRzLmlzRGlyZWN0b3J5IHx8IGRlZmF1bHRJc0RpcjtcbiAgICB2YXIgcmVhbHBhdGhTeW5jID0gb3B0cy5yZWFscGF0aFN5bmMgfHwgZGVmYXVsdFJlYWxwYXRoU3luYztcbiAgICB2YXIgcmVhZFBhY2thZ2VTeW5jID0gb3B0cy5yZWFkUGFja2FnZVN5bmMgfHwgZGVmYXVsdFJlYWRQYWNrYWdlU3luYztcbiAgICBpZiAob3B0cy5yZWFkRmlsZVN5bmMgJiYgb3B0cy5yZWFkUGFja2FnZVN5bmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYHJlYWRGaWxlU3luY2AgYW5kIGByZWFkUGFja2FnZVN5bmNgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJyk7XG4gICAgfVxuICAgIHZhciBwYWNrYWdlSXRlcmF0b3IgPSBvcHRzLnBhY2thZ2VJdGVyYXRvcjtcblxuICAgIHZhciBleHRlbnNpb25zID0gb3B0cy5leHRlbnNpb25zIHx8IFsnLmpzJ107XG4gICAgdmFyIGluY2x1ZGVDb3JlTW9kdWxlcyA9IG9wdHMuaW5jbHVkZUNvcmVNb2R1bGVzICE9PSBmYWxzZTtcbiAgICB2YXIgYmFzZWRpciA9IG9wdHMuYmFzZWRpciB8fCBwYXRoLmRpcm5hbWUoY2FsbGVyKCkpO1xuICAgIHZhciBwYXJlbnQgPSBvcHRzLmZpbGVuYW1lIHx8IGJhc2VkaXI7XG5cbiAgICBvcHRzLnBhdGhzID0gb3B0cy5wYXRocyB8fCBkZWZhdWx0UGF0aHMoKTtcblxuICAgIC8vIGVuc3VyZSB0aGF0IGBiYXNlZGlyYCBpcyBhbiBhYnNvbHV0ZSBwYXRoIGF0IHRoaXMgcG9pbnQsIHJlc29sdmluZyBhZ2FpbnN0IHRoZSBwcm9jZXNzJyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgdmFyIGFic29sdXRlU3RhcnQgPSBtYXliZVJlYWxwYXRoU3luYyhyZWFscGF0aFN5bmMsIHBhdGgucmVzb2x2ZShiYXNlZGlyKSwgb3B0cyk7XG5cbiAgICBpZiAoKC9eKD86XFwuXFwuPyg/OlxcL3wkKXxcXC98KFtBLVphLXpdOik/Wy9cXFxcXSkvKS50ZXN0KHgpKSB7XG4gICAgICAgIHZhciByZXMgPSBwYXRoLnJlc29sdmUoYWJzb2x1dGVTdGFydCwgeCk7XG4gICAgICAgIGlmICh4ID09PSAnLicgfHwgeCA9PT0gJy4uJyB8fCB4LnNsaWNlKC0xKSA9PT0gJy8nKSByZXMgKz0gJy8nO1xuICAgICAgICB2YXIgbSA9IGxvYWRBc0ZpbGVTeW5jKHJlcykgfHwgbG9hZEFzRGlyZWN0b3J5U3luYyhyZXMpO1xuICAgICAgICBpZiAobSkgcmV0dXJuIG1heWJlUmVhbHBhdGhTeW5jKHJlYWxwYXRoU3luYywgbSwgb3B0cyk7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlQ29yZU1vZHVsZXMgJiYgaXNDb3JlKHgpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuID0gbG9hZE5vZGVNb2R1bGVzU3luYyh4LCBhYnNvbHV0ZVN0YXJ0KTtcbiAgICAgICAgaWYgKG4pIHJldHVybiBtYXliZVJlYWxwYXRoU3luYyhyZWFscGF0aFN5bmMsIG4sIG9wdHMpO1xuICAgIH1cblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgeCArIFwiJyBmcm9tICdcIiArIHBhcmVudCArIFwiJ1wiKTtcbiAgICBlcnIuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcbiAgICB0aHJvdyBlcnI7XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNGaWxlU3luYyh4KSB7XG4gICAgICAgIHZhciBwa2cgPSBsb2FkcGtnKHBhdGguZGlybmFtZSh4KSk7XG5cbiAgICAgICAgaWYgKHBrZyAmJiBwa2cuZGlyICYmIHBrZy5wa2cgJiYgb3B0cy5wYXRoRmlsdGVyKSB7XG4gICAgICAgICAgICB2YXIgcmZpbGUgPSBwYXRoLnJlbGF0aXZlKHBrZy5kaXIsIHgpO1xuICAgICAgICAgICAgdmFyIHIgPSBvcHRzLnBhdGhGaWx0ZXIocGtnLnBrZywgeCwgcmZpbGUpO1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgICB4ID0gcGF0aC5yZXNvbHZlKHBrZy5kaXIsIHIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGaWxlKHgpKSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpbGUgPSB4ICsgZXh0ZW5zaW9uc1tpXTtcbiAgICAgICAgICAgIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRwa2coZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPT09ICcnIHx8IGRpciA9PT0gJy8nKSByZXR1cm47XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmICgvXlxcdzpbL1xcXFxdKiQvKS50ZXN0KGRpcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKC9bL1xcXFxdbm9kZV9tb2R1bGVzWy9cXFxcXSokLykudGVzdChkaXIpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHBrZ2ZpbGUgPSBwYXRoLmpvaW4obWF5YmVSZWFscGF0aFN5bmMocmVhbHBhdGhTeW5jLCBkaXIsIG9wdHMpLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICAgICAgaWYgKCFpc0ZpbGUocGtnZmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkcGtnKHBhdGguZGlybmFtZShkaXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwa2cgPSByZWFkUGFja2FnZVN5bmMocmVhZEZpbGVTeW5jLCBwa2dmaWxlKTtcblxuICAgICAgICBpZiAocGtnICYmIG9wdHMucGFja2FnZUZpbHRlcikge1xuICAgICAgICAgICAgLy8gdjIgd2lsbCBwYXNzIHBrZ2ZpbGVcbiAgICAgICAgICAgIHBrZyA9IG9wdHMucGFja2FnZUZpbHRlcihwa2csIC8qcGtnZmlsZSwqLyBkaXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNwYWNlZC1jb21tZW50XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBwa2c6IHBrZywgZGlyOiBkaXIgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkQXNEaXJlY3RvcnlTeW5jKHgpIHtcbiAgICAgICAgdmFyIHBrZ2ZpbGUgPSBwYXRoLmpvaW4obWF5YmVSZWFscGF0aFN5bmMocmVhbHBhdGhTeW5jLCB4LCBvcHRzKSwgJy9wYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGlzRmlsZShwa2dmaWxlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcGtnID0gcmVhZFBhY2thZ2VTeW5jKHJlYWRGaWxlU3luYywgcGtnZmlsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICBpZiAocGtnICYmIG9wdHMucGFja2FnZUZpbHRlcikge1xuICAgICAgICAgICAgICAgIC8vIHYyIHdpbGwgcGFzcyBwa2dmaWxlXG4gICAgICAgICAgICAgICAgcGtnID0gb3B0cy5wYWNrYWdlRmlsdGVyKHBrZywgLypwa2dmaWxlLCovIHgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNwYWNlZC1jb21tZW50XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwa2cgJiYgcGtnLm1haW4pIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBrZy5tYWluICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFpbkVycm9yID0gbmV3IFR5cGVFcnJvcigncGFja2FnZSBcdTIwMUMnICsgcGtnLm5hbWUgKyAnXHUyMDFEIGBtYWluYCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIG1haW5FcnJvci5jb2RlID0gJ0lOVkFMSURfUEFDS0FHRV9NQUlOJztcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbWFpbkVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGtnLm1haW4gPT09ICcuJyB8fCBwa2cubWFpbiA9PT0gJy4vJykge1xuICAgICAgICAgICAgICAgICAgICBwa2cubWFpbiA9ICdpbmRleCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbG9hZEFzRmlsZVN5bmMocGF0aC5yZXNvbHZlKHgsIHBrZy5tYWluKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtKSByZXR1cm4gbTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBsb2FkQXNEaXJlY3RvcnlTeW5jKHBhdGgucmVzb2x2ZSh4LCBwa2cubWFpbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobikgcmV0dXJuIG47XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2FkQXNGaWxlU3luYyhwYXRoLmpvaW4oeCwgJy9pbmRleCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTm9kZU1vZHVsZXNTeW5jKHgsIHN0YXJ0KSB7XG4gICAgICAgIHZhciB0aHVuayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldFBhY2thZ2VDYW5kaWRhdGVzKHgsIHN0YXJ0LCBvcHRzKTsgfTtcbiAgICAgICAgdmFyIGRpcnMgPSBwYWNrYWdlSXRlcmF0b3IgPyBwYWNrYWdlSXRlcmF0b3IoeCwgc3RhcnQsIHRodW5rLCBvcHRzKSA6IHRodW5rKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gZGlyc1tpXTtcbiAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeShwYXRoLmRpcm5hbWUoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IGxvYWRBc0ZpbGVTeW5jKGRpcik7XG4gICAgICAgICAgICAgICAgaWYgKG0pIHJldHVybiBtO1xuICAgICAgICAgICAgICAgIHZhciBuID0gbG9hZEFzRGlyZWN0b3J5U3luYyhkaXIpO1xuICAgICAgICAgICAgICAgIGlmIChuKSByZXR1cm4gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCAidmFyIGFzeW5jID0gcmVxdWlyZSgnLi9saWIvYXN5bmMnKTtcbmFzeW5jLmNvcmUgPSByZXF1aXJlKCcuL2xpYi9jb3JlJyk7XG5hc3luYy5pc0NvcmUgPSByZXF1aXJlKCcuL2xpYi9pcy1jb3JlJyk7XG5hc3luYy5zeW5jID0gcmVxdWlyZSgnLi9saWIvc3luYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGpzdHJhbnNmb3JtZXIgPSByZXF1aXJlKCdqc3RyYW5zZm9ybWVyJyk7XG52YXIgcmVzb2x2ZSA9IHJlcXVpcmUoJ3Jlc29sdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXI7XG5cbmZ1bmN0aW9uIGdldE1pbmlmeVRyYW5zZm9ybWVyTmFtZShvdXRwdXRGb3JtYXQpIHtcbiAgc3dpdGNoIChvdXRwdXRGb3JtYXQpIHtcbiAgICBjYXNlICdqcyc6XG4gICAgICByZXR1cm4gJ3VnbGlmeS1qcyc7XG4gICAgY2FzZSAnY3NzJzpcbiAgICAgIHJldHVybiAnY2xlYW4tY3NzJztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXIobmFtZSwgc3RyLCBvcHRpb25zLCBjdXJyZW50RGlyZWN0b3J5LCBmdW5jTmFtZSkge1xuICBmdW5jTmFtZSA9IGZ1bmNOYW1lIHx8ICdyZW5kZXInO1xuICB2YXIgdHJQYXRoO1xuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICB0clBhdGggPSByZXNvbHZlLnN5bmMoJ2pzdHJhbnNmb3JtZXItJyArIG5hbWUsIHtcbiAgICAgICAgYmFzZWRpcjogY3VycmVudERpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnanN0cmFuc2Zvcm1lci0nICsgbmFtZSk7XG4gICAgfVxuICB9IGNhdGNoIChleCkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3Vua25vd24gZmlsdGVyIFwiOicgKyBuYW1lICsgJ1wiJyk7XG4gICAgZXJyLmNvZGUgPSAnVU5LTk9XTl9GSUxURVInO1xuICAgIHRocm93IGVycjtcbiAgfVxuICB2YXIgdHIgPSBqc3RyYW5zZm9ybWVyKHJlcXVpcmUodHJQYXRoKSk7XG4gIC8vIFRPRE86IHdlIG1heSB3YW50IHRvIGFkZCBhIHdheSBmb3IgcGVvcGxlIHRvIHNlcGFyYXRlbHkgc3BlY2lmeSBcImxvY2Fsc1wiXG4gIHZhciByZXN1bHQgPSB0cltmdW5jTmFtZV0oc3RyLCBvcHRpb25zLCBvcHRpb25zKS5ib2R5O1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm1pbmlmeSkge1xuICAgIHZhciBtaW5pZnlUcmFuZm9ybWVyID0gZ2V0TWluaWZ5VHJhbnNmb3JtZXJOYW1lKHRyLm91dHB1dEZvcm1hdCk7XG4gICAgaWYgKG1pbmlmeVRyYW5mb3JtZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbHRlcihtaW5pZnlUcmFuZm9ybWVyLCByZXN1bHQsIG51bGwsIGN1cnJlbnREaXJlY3RvcnkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgLy8gYmV0dGVyIHRvIGZhaWwgdG8gbWluaWZ5IHRoYW4gb3V0cHV0IG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJleHBvcnQgdHlwZSBQb3MgPSB7XG4gIHN0YXJ0OiBudW1iZXI7XG59O1xuXG4vLyBUaGVzZSBhcmUgdXNlZCB3aGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgb24sIGZvciB0aGVcbi8vIGBzdGFydExvY2AgYW5kIGBlbmRMb2NgIHByb3BlcnRpZXMuXG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbiB7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29sdW1uOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobGluZTogbnVtYmVyLCBjb2w6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2w7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTb3VyY2VMb2NhdGlvbiB7XG4gIHN0YXJ0OiBQb3NpdGlvbjtcbiAgZW5kOiBQb3NpdGlvbjtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgaWRlbnRpZmllck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3Ioc3RhcnQ6IFBvc2l0aW9uLCBlbmQ/OiBQb3NpdGlvbikge1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAvLyAobWF5IHN0YXJ0IGFzIG51bGwsIGJ1dCBpbml0aWFsaXplZCBsYXRlcilcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxufVxuXG4vKipcbiAqIGNyZWF0ZXMgYSBuZXcgcG9zaXRpb24gd2l0aCBhIG5vbi16ZXJvIGNvbHVtbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGJlIHVzZWQgd2hlbiB3ZSBjcmVhdGUgQVNUIG5vZGUgb3V0IG9mIHRoZSB0b2tlblxuICogYm91bmRhcmllcywgc3VjaCBhcyBUZW1wbGF0ZUVsZW1lbnQgZW5kcyBiZWZvcmUgdHQudGVtcGxhdGVOb25UYWlsLiBUaGlzXG4gKiBmdW5jdGlvbiBkb2VzIG5vdCBza2lwIHdoaXRlc3BhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KFxuICBwb3NpdGlvbjogUG9zaXRpb24sXG4gIGNvbHVtbk9mZnNldDogbnVtYmVyLFxuKSB7XG4gIGNvbnN0IHsgbGluZSwgY29sdW1uLCBpbmRleCB9ID0gcG9zaXRpb247XG4gIHJldHVybiBuZXcgUG9zaXRpb24obGluZSwgY29sdW1uICsgY29sdW1uT2Zmc2V0LCBpbmRleCArIGNvbHVtbk9mZnNldCk7XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVudW0gUGFyc2VFcnJvckNvZGUge1xuICBTeW50YXhFcnJvciA9IFwiQkFCRUxfUEFSU0VSX1NZTlRBWF9FUlJPUlwiLFxuICBTb3VyY2VUeXBlTW9kdWxlRXJyb3IgPSBcIkJBQkVMX1BBUlNFUl9TT1VSQ0VUWVBFX01PRFVMRV9SRVFVSVJFRFwiLFxufVxuXG5leHBvcnQgdHlwZSBTeW50YXhQbHVnaW4gPVxuICB8IFwiZmxvd1wiXG4gIHwgXCJ0eXBlc2NyaXB0XCJcbiAgfCBcImpzeFwiXG4gIHwgXCJwaXBlbGluZU9wZXJhdG9yXCJcbiAgfCBcInBsYWNlaG9sZGVyc1wiO1xuXG5leHBvcnQgdHlwZSBUb01lc3NhZ2U8RXJyb3JEZXRhaWxzPiA9IChzZWxmOiBFcnJvckRldGFpbHMpID0+IHN0cmluZztcblxuZXhwb3J0IHR5cGUgUGFyc2VFcnJvckNyZWRlbnRpYWxzPEVycm9yRGV0YWlscz4gPSB7XG4gIGNvZGU6IFBhcnNlRXJyb3JDb2RlO1xuICByZWFzb25Db2RlOiBzdHJpbmc7XG4gIHN5bnRheFBsdWdpbj86IFN5bnRheFBsdWdpbjtcbiAgdG9NZXNzYWdlOiBUb01lc3NhZ2U8RXJyb3JEZXRhaWxzPjtcbn07XG5cbmNvbnN0IHJlZmxlY3QgPSAoa2V5czogc3RyaW5nW10sIGxhc3QgPSBrZXlzLmxlbmd0aCAtIDEpID0+ICh7XG4gIGdldCh0aGlzOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIGtleXMucmVkdWNlKFxuICAgICAgKG9iamVjdCwga2V5KSA9PlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBzaG91bGQgaW5kZXggb2JqZWN0XG4gICAgICAgIG9iamVjdFtrZXldLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9LFxuICBzZXQodGhpczogdW5rbm93biwgdmFsdWU6IHVua25vd24pIHtcbiAgICBrZXlzLnJlZHVjZShcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IHNob3VsZCBpbmRleCBpdGVtXG4gICAgICAoaXRlbSwga2V5LCBpKSA9PiAoaSA9PT0gbGFzdCA/IChpdGVtW2tleV0gPSB2YWx1ZSkgOiBpdGVtW2tleV0pLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9LFxufSk7XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gPFQ+KFxuICBjb25zdHJ1Y3RvcjogbmV3ICgpID0+IFQsXG4gIHByb3BlcnRpZXM6IGFueSxcbiAgZGVzY3JpcHRvcnM6IGFueSxcbikgPT5cbiAgT2JqZWN0LmtleXMoZGVzY3JpcHRvcnMpXG4gICAgLm1hcChrZXkgPT4gW2tleSwgZGVzY3JpcHRvcnNba2V5XV0pXG4gICAgLmZpbHRlcigoWywgZGVzY3JpcHRvcl0pID0+ICEhZGVzY3JpcHRvcilcbiAgICAubWFwKChba2V5LCBkZXNjcmlwdG9yXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgdHlwZW9mIGRlc2NyaXB0b3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IsIGVudW1lcmFibGU6IGZhbHNlIH1cbiAgICAgICAgOiB0eXBlb2YgZGVzY3JpcHRvci5yZWZsZWN0ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8geyAuLi5kZXNjcmlwdG9yLCAuLi5yZWZsZWN0KGRlc2NyaXB0b3IucmVmbGVjdC5zcGxpdChcIi5cIikpIH1cbiAgICAgICAgOiBkZXNjcmlwdG9yLFxuICAgIF0pXG4gICAgLnJlZHVjZShcbiAgICAgIChpbnN0YW5jZSwgW2tleSwgZGVzY3JpcHRvcl0pID0+XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgIH0pLFxuICAgICAgT2JqZWN0LmFzc2lnbihuZXcgY29uc3RydWN0b3IoKSwgcHJvcGVydGllcyksXG4gICAgKTtcblxuZXhwb3J0IHsgaW5zdGFudGlhdGUgfTtcbiIsICJpbXBvcnQgeyBQYXJzZUVycm9yQ29kZSB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIEltcG9ydE1ldGFPdXRzaWRlTW9kdWxlOiB7XG4gICAgbWVzc2FnZTogYGltcG9ydC5tZXRhIG1heSBhcHBlYXIgb25seSB3aXRoICdzb3VyY2VUeXBlOiBcIm1vZHVsZVwiJ2AsXG4gICAgY29kZTogUGFyc2VFcnJvckNvZGUuU291cmNlVHlwZU1vZHVsZUVycm9yLFxuICB9LFxuICBJbXBvcnRPdXRzaWRlTW9kdWxlOiB7XG4gICAgbWVzc2FnZTogYCdpbXBvcnQnIGFuZCAnZXhwb3J0JyBtYXkgYXBwZWFyIG9ubHkgd2l0aCAnc291cmNlVHlwZTogXCJtb2R1bGVcIidgLFxuICAgIGNvZGU6IFBhcnNlRXJyb3JDb2RlLlNvdXJjZVR5cGVNb2R1bGVFcnJvcixcbiAgfSxcbn07XG4iLCAiY29uc3QgTm9kZURlc2NyaXB0aW9ucyA9IHtcbiAgQXJyYXlQYXR0ZXJuOiBcImFycmF5IGRlc3RydWN0dXJpbmcgcGF0dGVyblwiLFxuICBBc3NpZ25tZW50RXhwcmVzc2lvbjogXCJhc3NpZ25tZW50IGV4cHJlc3Npb25cIixcbiAgQXNzaWdubWVudFBhdHRlcm46IFwiYXNzaWdubWVudCBleHByZXNzaW9uXCIsXG4gIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBcImFycm93IGZ1bmN0aW9uIGV4cHJlc3Npb25cIixcbiAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBcImNvbmRpdGlvbmFsIGV4cHJlc3Npb25cIixcbiAgQ2F0Y2hDbGF1c2U6IFwiY2F0Y2ggY2xhdXNlXCIsXG4gIEZvck9mU3RhdGVtZW50OiBcImZvci1vZiBzdGF0ZW1lbnRcIixcbiAgRm9ySW5TdGF0ZW1lbnQ6IFwiZm9yLWluIHN0YXRlbWVudFwiLFxuICBGb3JTdGF0ZW1lbnQ6IFwiZm9yLWxvb3BcIixcbiAgRm9ybWFsUGFyYW1ldGVyczogXCJmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdFwiLFxuICBJZGVudGlmaWVyOiBcImlkZW50aWZpZXJcIixcbiAgSW1wb3J0U3BlY2lmaWVyOiBcImltcG9ydCBzcGVjaWZpZXJcIixcbiAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogXCJpbXBvcnQgZGVmYXVsdCBzcGVjaWZpZXJcIixcbiAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiBcImltcG9ydCBuYW1lc3BhY2Ugc3BlY2lmaWVyXCIsXG4gIE9iamVjdFBhdHRlcm46IFwib2JqZWN0IGRlc3RydWN0dXJpbmcgcGF0dGVyblwiLFxuICBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjogXCJwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25cIixcbiAgUmVzdEVsZW1lbnQ6IFwicmVzdCBlbGVtZW50XCIsXG4gIFVwZGF0ZUV4cHJlc3Npb246IHtcbiAgICB0cnVlOiBcInByZWZpeCBvcGVyYXRpb25cIixcbiAgICBmYWxzZTogXCJwb3N0Zml4IG9wZXJhdGlvblwiLFxuICB9LFxuICBWYXJpYWJsZURlY2xhcmF0b3I6IFwidmFyaWFibGUgZGVjbGFyYXRpb25cIixcbiAgWWllbGRFeHByZXNzaW9uOiBcInlpZWxkIGV4cHJlc3Npb25cIixcbn07XG5cbnR5cGUgTm9kZVR5cGVzV2l0aERlc2NyaXB0aW9ucyA9IGtleW9mIE9taXQ8XG4gIHR5cGVvZiBOb2RlRGVzY3JpcHRpb25zLFxuICBcIlVwZGF0ZUV4cHJlc3Npb25cIlxuPjtcblxudHlwZSBOb2RlV2l0aERlc2NyaXB0aW9uID1cbiAgfCB7XG4gICAgICB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIjtcbiAgICAgIHByZWZpeDogYm9vbGVhbjtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogTm9kZVR5cGVzV2l0aERlc2NyaXB0aW9ucztcbiAgICB9O1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yIHByZWZpeCBpcyBzcGVjaWZpZWQgb25seSB3aGVuIHR5cGUgaXMgVXBkYXRlRXhwcmVzc2lvblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmZ1c2luZy1hcnJvd1xuY29uc3QgdG9Ob2RlRGVzY3JpcHRpb24gPSAoeyB0eXBlLCBwcmVmaXggfTogTm9kZVdpdGhEZXNjcmlwdGlvbikgPT5cbiAgdHlwZSA9PT0gXCJVcGRhdGVFeHByZXNzaW9uXCJcbiAgICA/IE5vZGVEZXNjcmlwdGlvbnMuVXBkYXRlRXhwcmVzc2lvbltTdHJpbmcocHJlZml4KSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIl1cbiAgICA6IE5vZGVEZXNjcmlwdGlvbnNbdHlwZV07XG5cbmV4cG9ydCBkZWZhdWx0IHRvTm9kZURlc2NyaXB0aW9uO1xuIiwgImltcG9ydCB0b05vZGVEZXNjcmlwdGlvbiBmcm9tIFwiLi90by1ub2RlLWRlc2NyaXB0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIExWYWxBbmNlc3RvciA9XG4gIHwgeyB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIjsgcHJlZml4OiBib29sZWFuIH1cbiAgfCB7XG4gICAgICB0eXBlOlxuICAgICAgICB8IFwiQXJyYXlQYXR0ZXJuXCJcbiAgICAgICAgfCBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIkNhdGNoQ2xhdXNlXCJcbiAgICAgICAgfCBcIkZvck9mU3RhdGVtZW50XCJcbiAgICAgICAgfCBcIkZvcm1hbFBhcmFtZXRlcnNcIlxuICAgICAgICB8IFwiRm9ySW5TdGF0ZW1lbnRcIlxuICAgICAgICB8IFwiRm9yU3RhdGVtZW50XCJcbiAgICAgICAgfCBcIkltcG9ydFNwZWNpZmllclwiXG4gICAgICAgIHwgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIlxuICAgICAgICB8IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiXG4gICAgICAgIHwgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiXG4gICAgICAgIHwgXCJPYmplY3RQYXR0ZXJuXCJcbiAgICAgICAgfCBcIlJlc3RFbGVtZW50XCJcbiAgICAgICAgfCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiO1xuICAgIH07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgQWNjZXNzb3JJc0dlbmVyYXRvcjogKHsga2luZCB9OiB7IGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIH0pID0+XG4gICAgYEEgJHtraW5kfXRlciBjYW5ub3QgYmUgYSBnZW5lcmF0b3IuYCxcbiAgQXJndW1lbnRzSW5DbGFzczpcbiAgICBcIidhcmd1bWVudHMnIGlzIG9ubHkgYWxsb3dlZCBpbiBmdW5jdGlvbnMgYW5kIGNsYXNzIG1ldGhvZHMuXCIsXG4gIEFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQ6XG4gICAgXCJBc3luYyBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdGhlIHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9jay5cIixcbiAgQXdhaXRCaW5kaW5nSWRlbnRpZmllcjpcbiAgICBcIkNhbiBub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb24uXCIsXG4gIEF3YWl0QmluZGluZ0lkZW50aWZpZXJJblN0YXRpY0Jsb2NrOlxuICAgIFwiQ2FuIG5vdCB1c2UgJ2F3YWl0JyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIHN0YXRpYyBibG9jay5cIixcbiAgQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyOlxuICAgIFwiJ2F3YWl0JyBpcyBub3QgYWxsb3dlZCBpbiBhc3luYyBmdW5jdGlvbiBwYXJhbWV0ZXJzLlwiLFxuICBBd2FpdFVzaW5nTm90SW5Bc3luY0NvbnRleHQ6XG4gICAgXCInYXdhaXQgdXNpbmcnIGlzIG9ubHkgYWxsb3dlZCB3aXRoaW4gYXN5bmMgZnVuY3Rpb25zIGFuZCBhdCB0aGUgdG9wIGxldmVscyBvZiBtb2R1bGVzLlwiLFxuICBBd2FpdE5vdEluQXN5bmNDb250ZXh0OlxuICAgIFwiJ2F3YWl0JyBpcyBvbmx5IGFsbG93ZWQgd2l0aGluIGFzeW5jIGZ1bmN0aW9ucyBhbmQgYXQgdGhlIHRvcCBsZXZlbHMgb2YgbW9kdWxlcy5cIixcbiAgQXdhaXROb3RJbkFzeW5jRnVuY3Rpb246IFwiJ2F3YWl0JyBpcyBvbmx5IGFsbG93ZWQgd2l0aGluIGFzeW5jIGZ1bmN0aW9ucy5cIixcbiAgQmFkR2V0dGVyQXJpdHk6IFwiQSAnZ2V0JyBhY2Nlc3NvciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVycy5cIixcbiAgQmFkU2V0dGVyQXJpdHk6IFwiQSAnc2V0JyBhY2Nlc3NvciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZm9ybWFsIHBhcmFtZXRlci5cIixcbiAgQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjpcbiAgICBcIkEgJ3NldCcgYWNjZXNzb3IgZnVuY3Rpb24gYXJndW1lbnQgbXVzdCBub3QgYmUgYSByZXN0IHBhcmFtZXRlci5cIixcbiAgQ29uc3RydWN0b3JDbGFzc0ZpZWxkOiBcIkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgZmllbGQgbmFtZWQgJ2NvbnN0cnVjdG9yJy5cIixcbiAgQ29uc3RydWN0b3JDbGFzc1ByaXZhdGVGaWVsZDpcbiAgICBcIkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJy5cIixcbiAgQ29uc3RydWN0b3JJc0FjY2Vzc29yOiBcIkNsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYWNjZXNzb3IuXCIsXG4gIENvbnN0cnVjdG9ySXNBc3luYzogXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvbi5cIixcbiAgQ29uc3RydWN0b3JJc0dlbmVyYXRvcjogXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhIGdlbmVyYXRvci5cIixcbiAgRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXI6ICh7XG4gICAga2luZCxcbiAgfToge1xuICAgIGtpbmQ6IFwiY29uc3RcIiB8IFwiZGVzdHJ1Y3R1cmluZ1wiO1xuICB9KSA9PiBgTWlzc2luZyBpbml0aWFsaXplciBpbiAke2tpbmR9IGRlY2xhcmF0aW9uLmAsXG4gIERlY29yYXRvckFyZ3VtZW50c091dHNpZGVQYXJlbnRoZXNlczpcbiAgICBcIkRlY29yYXRvciBhcmd1bWVudHMgbXVzdCBiZSBtb3ZlZCBpbnNpZGUgcGFyZW50aGVzZXM6IHVzZSAnQChkZWNvcmF0b3IoYXJncykpJyBpbnN0ZWFkIG9mICdAKGRlY29yYXRvcikoYXJncyknLlwiLFxuICBEZWNvcmF0b3JCZWZvcmVFeHBvcnQ6XG4gICAgXCJEZWNvcmF0b3JzIG11c3QgYmUgcGxhY2VkICpiZWZvcmUqIHRoZSAnZXhwb3J0JyBrZXl3b3JkLiBSZW1vdmUgdGhlICdkZWNvcmF0b3JzQmVmb3JlRXhwb3J0OiB0cnVlJyBvcHRpb24gdG8gdXNlIHRoZSAnZXhwb3J0IEBkZWNvcmF0b3IgY2xhc3Mge30nIHN5bnRheC5cIixcbiAgRGVjb3JhdG9yc0JlZm9yZUFmdGVyRXhwb3J0OlxuICAgIFwiRGVjb3JhdG9ycyBjYW4gYmUgcGxhY2VkICplaXRoZXIqIGJlZm9yZSBvciBhZnRlciB0aGUgJ2V4cG9ydCcga2V5d29yZCwgYnV0IG5vdCBpbiBib3RoIGxvY2F0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLlwiLFxuICBEZWNvcmF0b3JDb25zdHJ1Y3RvcjpcbiAgICBcIkRlY29yYXRvcnMgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgY29uc3RydWN0b3IuIERpZCB5b3UgbWVhbiAnQGRlYyBjbGFzcyB7IC4uLiB9Jz9cIixcbiAgRGVjb3JhdG9yRXhwb3J0Q2xhc3M6XG4gICAgXCJEZWNvcmF0b3JzIG11c3QgYmUgcGxhY2VkICphZnRlciogdGhlICdleHBvcnQnIGtleXdvcmQuIFJlbW92ZSB0aGUgJ2RlY29yYXRvcnNCZWZvcmVFeHBvcnQ6IGZhbHNlJyBvcHRpb24gdG8gdXNlIHRoZSAnQGRlY29yYXRvciBleHBvcnQgY2xhc3Mge30nIHN5bnRheC5cIixcbiAgRGVjb3JhdG9yU2VtaWNvbG9uOiBcIkRlY29yYXRvcnMgbXVzdCBub3QgYmUgZm9sbG93ZWQgYnkgYSBzZW1pY29sb24uXCIsXG4gIERlY29yYXRvclN0YXRpY0Jsb2NrOiBcIkRlY29yYXRvcnMgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgc3RhdGljIGJsb2NrLlwiLFxuICBEZWxldGVQcml2YXRlRmllbGQ6IFwiRGVsZXRpbmcgYSBwcml2YXRlIGZpZWxkIGlzIG5vdCBhbGxvd2VkLlwiLFxuICBEZXN0cnVjdHVyZU5hbWVkSW1wb3J0OlxuICAgIFwiRVMyMDE1IG5hbWVkIGltcG9ydHMgZG8gbm90IGRlc3RydWN0dXJlLiBVc2UgYW5vdGhlciBzdGF0ZW1lbnQgZm9yIGRlc3RydWN0dXJpbmcgYWZ0ZXIgdGhlIGltcG9ydC5cIixcbiAgRHVwbGljYXRlQ29uc3RydWN0b3I6IFwiRHVwbGljYXRlIGNvbnN0cnVjdG9yIGluIHRoZSBzYW1lIGNsYXNzLlwiLFxuICBEdXBsaWNhdGVEZWZhdWx0RXhwb3J0OiBcIk9ubHkgb25lIGRlZmF1bHQgZXhwb3J0IGFsbG93ZWQgcGVyIG1vZHVsZS5cIixcbiAgRHVwbGljYXRlRXhwb3J0OiAoeyBleHBvcnROYW1lIH06IHsgZXhwb3J0TmFtZTogc3RyaW5nIH0pID0+XG4gICAgYFxcYCR7ZXhwb3J0TmFtZX1cXGAgaGFzIGFscmVhZHkgYmVlbiBleHBvcnRlZC4gRXhwb3J0ZWQgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUuYCxcbiAgRHVwbGljYXRlUHJvdG86IFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eS5cIixcbiAgRHVwbGljYXRlUmVnRXhwRmxhZ3M6IFwiRHVwbGljYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnLlwiLFxuICBFbGVtZW50QWZ0ZXJSZXN0OiBcIlJlc3QgZWxlbWVudCBtdXN0IGJlIGxhc3QgZWxlbWVudC5cIixcbiAgRXNjYXBlZENoYXJOb3RBbklkZW50aWZpZXI6IFwiSW52YWxpZCBVbmljb2RlIGVzY2FwZS5cIixcbiAgRXhwb3J0QmluZGluZ0lzU3RyaW5nOiAoe1xuICAgIGxvY2FsTmFtZSxcbiAgICBleHBvcnROYW1lLFxuICB9OiB7XG4gICAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gICAgZXhwb3J0TmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBcXGBmcm9tXFxgLlxcbi0gRGlkIHlvdSBtZWFuIFxcYGV4cG9ydCB7ICcke2xvY2FsTmFtZX0nIGFzICcke2V4cG9ydE5hbWV9JyB9IGZyb20gJ3NvbWUtbW9kdWxlJ1xcYD9gLFxuICBFeHBvcnREZWZhdWx0RnJvbUFzSWRlbnRpZmllcjpcbiAgICBcIidmcm9tJyBpcyBub3QgYWxsb3dlZCBhcyBhbiBpZGVudGlmaWVyIGFmdGVyICdleHBvcnQgZGVmYXVsdCcuXCIsXG5cbiAgRm9ySW5PZkxvb3BJbml0aWFsaXplcjogKHtcbiAgICB0eXBlLFxuICB9OiB7XG4gICAgdHlwZTogXCJGb3JJblN0YXRlbWVudFwiIHwgXCJGb3JPZlN0YXRlbWVudFwiO1xuICB9KSA9PlxuICAgIGAnJHtcbiAgICAgIHR5cGUgPT09IFwiRm9ySW5TdGF0ZW1lbnRcIiA/IFwiZm9yLWluXCIgOiBcImZvci1vZlwiXG4gICAgfScgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuYCxcbiAgRm9ySW5Vc2luZzogXCJGb3ItaW4gbG9vcCBtYXkgbm90IHN0YXJ0IHdpdGggJ3VzaW5nJyBkZWNsYXJhdGlvbi5cIixcblxuICBGb3JPZkFzeW5jOiBcIlRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGZvci1vZiBsb29wIG1heSBub3QgYmUgJ2FzeW5jJy5cIixcbiAgRm9yT2ZMZXQ6IFwiVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgZm9yLW9mIGxvb3AgbWF5IG5vdCBzdGFydCB3aXRoICdsZXQnLlwiLFxuICBHZW5lcmF0b3JJblNpbmdsZVN0YXRlbWVudENvbnRleHQ6XG4gICAgXCJHZW5lcmF0b3JzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AgbGV2ZWwgb3IgaW5zaWRlIGEgYmxvY2suXCIsXG5cbiAgSWxsZWdhbEJyZWFrQ29udGludWU6ICh7XG4gICAgdHlwZSxcbiAgfToge1xuICAgIHR5cGU6IFwiQnJlYWtTdGF0ZW1lbnRcIiB8IFwiQ29udGludWVTdGF0ZW1lbnRcIjtcbiAgfSkgPT4gYFVuc3ludGFjdGljICR7dHlwZSA9PT0gXCJCcmVha1N0YXRlbWVudFwiID8gXCJicmVha1wiIDogXCJjb250aW51ZVwifS5gLFxuXG4gIElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmU6XG4gICAgXCJJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0LlwiLFxuICBJbGxlZ2FsUmV0dXJuOiBcIidyZXR1cm4nIG91dHNpZGUgb2YgZnVuY3Rpb24uXCIsXG4gIEltcG9ydEF0dHJpYnV0ZXNVc2VBc3NlcnQ6XG4gICAgXCJUaGUgYGFzc2VydGAga2V5d29yZCBpbiBpbXBvcnQgYXR0cmlidXRlcyBpcyBkZXByZWNhdGVkIGFuZCBpdCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYHdpdGhgIGtleXdvcmQuIFlvdSBjYW4gZW5hYmxlIHRoZSBgZGVwcmVjYXRlZEFzc2VydFN5bnRheDogdHJ1ZWAgb3B0aW9uIGluIHRoZSBpbXBvcnQgYXR0cmlidXRlcyBwbHVnaW4gdG8gc3VwcHJlc3MgdGhpcyBlcnJvci5cIixcbiAgSW1wb3J0QmluZGluZ0lzU3RyaW5nOiAoeyBpbXBvcnROYW1lIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nIH0pID0+XG4gICAgYEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gaW1wb3J0ZWQgYmluZGluZy5cXG4tIERpZCB5b3UgbWVhbiBcXGBpbXBvcnQgeyBcIiR7aW1wb3J0TmFtZX1cIiBhcyBmb28gfVxcYD9gLFxuICBJbXBvcnRDYWxsQXJndW1lbnRUcmFpbGluZ0NvbW1hOlxuICAgIFwiVHJhaWxpbmcgY29tbWEgaXMgZGlzYWxsb3dlZCBpbnNpZGUgaW1wb3J0KC4uLikgYXJndW1lbnRzLlwiLFxuICBJbXBvcnRDYWxsQXJpdHk6ICh7IG1heEFyZ3VtZW50Q291bnQgfTogeyBtYXhBcmd1bWVudENvdW50OiAxIHwgMiB9KSA9PlxuICAgIGBcXGBpbXBvcnQoKVxcYCByZXF1aXJlcyBleGFjdGx5ICR7XG4gICAgICBtYXhBcmd1bWVudENvdW50ID09PSAxID8gXCJvbmUgYXJndW1lbnRcIiA6IFwib25lIG9yIHR3byBhcmd1bWVudHNcIlxuICAgIH0uYCxcbiAgSW1wb3J0Q2FsbE5vdE5ld0V4cHJlc3Npb246IFwiQ2Fubm90IHVzZSBuZXcgd2l0aCBpbXBvcnQoLi4uKS5cIixcbiAgSW1wb3J0Q2FsbFNwcmVhZEFyZ3VtZW50OiBcImAuLi5gIGlzIG5vdCBhbGxvd2VkIGluIGBpbXBvcnQoKWAuXCIsXG4gIEltcG9ydEpTT05CaW5kaW5nTm90RGVmYXVsdDpcbiAgICBcIkEgSlNPTiBtb2R1bGUgY2FuIG9ubHkgYmUgaW1wb3J0ZWQgd2l0aCBgZGVmYXVsdGAuXCIsXG4gIEltcG9ydFJlZmxlY3Rpb25IYXNBc3NlcnRpb246IFwiYGltcG9ydCBtb2R1bGUgeGAgY2Fubm90IGhhdmUgYXNzZXJ0aW9ucy5cIixcbiAgSW1wb3J0UmVmbGVjdGlvbk5vdEJpbmRpbmc6XG4gICAgJ09ubHkgYGltcG9ydCBtb2R1bGUgeCBmcm9tIFwiLi9tb2R1bGVcImAgaXMgdmFsaWQuJyxcbiAgSW5jb21wYXRpYmxlUmVnRXhwVVZGbGFnczpcbiAgICBcIlRoZSAndScgYW5kICd2JyByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MgY2Fubm90IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZS5cIixcbiAgSW52YWxpZEJpZ0ludExpdGVyYWw6IFwiSW52YWxpZCBCaWdJbnRMaXRlcmFsLlwiLFxuICBJbnZhbGlkQ29kZVBvaW50OiBcIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kcy5cIixcbiAgSW52YWxpZENvdmVySW5pdGlhbGl6ZWROYW1lOiBcIkludmFsaWQgc2hvcnRoYW5kIHByb3BlcnR5IGluaXRpYWxpemVyLlwiLFxuICBJbnZhbGlkRGVjaW1hbDogXCJJbnZhbGlkIGRlY2ltYWwuXCIsXG4gIEludmFsaWREaWdpdDogKHsgcmFkaXggfTogeyByYWRpeDogbnVtYmVyIH0pID0+XG4gICAgYEV4cGVjdGVkIG51bWJlciBpbiByYWRpeCAke3JhZGl4fS5gLFxuICBJbnZhbGlkRXNjYXBlU2VxdWVuY2U6IFwiQmFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UuXCIsXG4gIEludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlOiBcIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHRlbXBsYXRlLlwiLFxuICBJbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZDogKHsgcmVzZXJ2ZWRXb3JkIH06IHsgcmVzZXJ2ZWRXb3JkOiBzdHJpbmcgfSkgPT5cbiAgICBgRXNjYXBlIHNlcXVlbmNlIGluIGtleXdvcmQgJHtyZXNlcnZlZFdvcmR9LmAsXG4gIEludmFsaWRJZGVudGlmaWVyOiAoeyBpZGVudGlmaWVyTmFtZSB9OiB7IGlkZW50aWZpZXJOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgSW52YWxpZCBpZGVudGlmaWVyICR7aWRlbnRpZmllck5hbWV9LmAsXG4gIEludmFsaWRMaHM6ICh7IGFuY2VzdG9yIH06IHsgYW5jZXN0b3I6IExWYWxBbmNlc3RvciB9KSA9PlxuICAgIGBJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluICR7dG9Ob2RlRGVzY3JpcHRpb24oYW5jZXN0b3IpfS5gLFxuICBJbnZhbGlkTGhzQmluZGluZzogKHsgYW5jZXN0b3IgfTogeyBhbmNlc3RvcjogTFZhbEFuY2VzdG9yIH0pID0+XG4gICAgYEJpbmRpbmcgaW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiAke3RvTm9kZURlc2NyaXB0aW9uKGFuY2VzdG9yKX0uYCxcbiAgSW52YWxpZE51bWJlcjogXCJJbnZhbGlkIG51bWJlci5cIixcbiAgSW52YWxpZE9yTWlzc2luZ0V4cG9uZW50OlxuICAgIFwiRmxvYXRpbmctcG9pbnQgbnVtYmVycyByZXF1aXJlIGEgdmFsaWQgZXhwb25lbnQgYWZ0ZXIgdGhlICdlJy5cIixcbiAgSW52YWxpZE9yVW5leHBlY3RlZFRva2VuOiAoeyB1bmV4cGVjdGVkIH06IHsgdW5leHBlY3RlZDogc3RyaW5nIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke3VuZXhwZWN0ZWR9Jy5gLFxuICBJbnZhbGlkUGFyZW50aGVzaXplZEFzc2lnbm1lbnQ6IFwiSW52YWxpZCBwYXJlbnRoZXNpemVkIGFzc2lnbm1lbnQgcGF0dGVybi5cIixcbiAgSW52YWxpZFByaXZhdGVGaWVsZFJlc29sdXRpb246ICh7XG4gICAgaWRlbnRpZmllck5hbWUsXG4gIH06IHtcbiAgICBpZGVudGlmaWVyTmFtZTogc3RyaW5nO1xuICB9KSA9PiBgUHJpdmF0ZSBuYW1lICMke2lkZW50aWZpZXJOYW1lfSBpcyBub3QgZGVmaW5lZC5gLFxuICBJbnZhbGlkUHJvcGVydHlCaW5kaW5nUGF0dGVybjogXCJCaW5kaW5nIG1lbWJlciBleHByZXNzaW9uLlwiLFxuICBJbnZhbGlkUmVjb3JkUHJvcGVydHk6XG4gICAgXCJPbmx5IHByb3BlcnRpZXMgYW5kIHNwcmVhZCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiByZWNvcmQgZGVmaW5pdGlvbnMuXCIsXG4gIEludmFsaWRSZXN0QXNzaWdubWVudFBhdHRlcm46IFwiSW52YWxpZCByZXN0IG9wZXJhdG9yJ3MgYXJndW1lbnQuXCIsXG4gIExhYmVsUmVkZWNsYXJhdGlvbjogKHsgbGFiZWxOYW1lIH06IHsgbGFiZWxOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgTGFiZWwgJyR7bGFiZWxOYW1lfScgaXMgYWxyZWFkeSBkZWNsYXJlZC5gLFxuICBMZXRJbkxleGljYWxCaW5kaW5nOlxuICAgIFwiJ2xldCcgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBhcyBhIG5hbWUgaW4gJ2xldCcgb3IgJ2NvbnN0JyBkZWNsYXJhdGlvbnMuXCIsXG4gIExpbmVUZXJtaW5hdG9yQmVmb3JlQXJyb3c6IFwiTm8gbGluZSBicmVhayBpcyBhbGxvd2VkIGJlZm9yZSAnPT4nLlwiLFxuICBNYWxmb3JtZWRSZWdFeHBGbGFnczogXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnLlwiLFxuICBNaXNzaW5nQ2xhc3NOYW1lOiBcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZC5cIixcbiAgTWlzc2luZ0VxSW5Bc3NpZ25tZW50OlxuICAgIFwiT25seSAnPScgb3BlcmF0b3IgY2FuIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgZGVmYXVsdCB2YWx1ZS5cIixcbiAgTWlzc2luZ1NlbWljb2xvbjogXCJNaXNzaW5nIHNlbWljb2xvbi5cIixcbiAgTWlzc2luZ1BsdWdpbjogKHsgbWlzc2luZ1BsdWdpbiB9OiB7IG1pc3NpbmdQbHVnaW46IFtzdHJpbmddIH0pID0+XG4gICAgYFRoaXMgZXhwZXJpbWVudGFsIHN5bnRheCByZXF1aXJlcyBlbmFibGluZyB0aGUgcGFyc2VyIHBsdWdpbjogJHttaXNzaW5nUGx1Z2luXG4gICAgICAubWFwKG5hbWUgPT4gSlNPTi5zdHJpbmdpZnkobmFtZSkpXG4gICAgICAuam9pbihcIiwgXCIpfS5gLFxuICAvLyBGSVhNRTogV291bGQgYmUgbmljZSB0byBtYWtlIHRoaXMgXCJtaXNzaW5nUGx1Z2luc1wiIGluc3RlYWQuXG4gIC8vIEFsc28sIHNlZW1zIGxpa2Ugd2UgY2FuIGRyb3AgdGhlIFwiKHMpXCIgZnJvbSB0aGUgbWVzc2FnZSBhbmQganVzdCBtYWtlIGl0IFwic1wiLlxuICBNaXNzaW5nT25lT2ZQbHVnaW5zOiAoeyBtaXNzaW5nUGx1Z2luIH06IHsgbWlzc2luZ1BsdWdpbjogc3RyaW5nW10gfSkgPT5cbiAgICBgVGhpcyBleHBlcmltZW50YWwgc3ludGF4IHJlcXVpcmVzIGVuYWJsaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcnNlciBwbHVnaW4ocyk6ICR7bWlzc2luZ1BsdWdpblxuICAgICAgLm1hcChuYW1lID0+IEpTT04uc3RyaW5naWZ5KG5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKX0uYCxcbiAgTWlzc2luZ1VuaWNvZGVFc2NhcGU6IFwiRXhwZWN0aW5nIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlIFxcXFx1WFhYWC5cIixcbiAgTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbDpcbiAgICBcIk51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnMuXCIsXG4gIE1vZHVsZUF0dHJpYnV0ZURpZmZlcmVudEZyb21UeXBlOlxuICAgIFwiVGhlIG9ubHkgYWNjZXB0ZWQgbW9kdWxlIGF0dHJpYnV0ZSBpcyBgdHlwZWAuXCIsXG4gIE1vZHVsZUF0dHJpYnV0ZUludmFsaWRWYWx1ZTpcbiAgICBcIk9ubHkgc3RyaW5nIGxpdGVyYWxzIGFyZSBhbGxvd2VkIGFzIG1vZHVsZSBhdHRyaWJ1dGUgdmFsdWVzLlwiLFxuICBNb2R1bGVBdHRyaWJ1dGVzV2l0aER1cGxpY2F0ZUtleXM6ICh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pID0+XG4gICAgYER1cGxpY2F0ZSBrZXkgXCIke2tleX1cIiBpcyBub3QgYWxsb3dlZCBpbiBtb2R1bGUgYXR0cmlidXRlcy5gLFxuICBNb2R1bGVFeHBvcnROYW1lSGFzTG9uZVN1cnJvZ2F0ZTogKHtcbiAgICBzdXJyb2dhdGVDaGFyQ29kZSxcbiAgfToge1xuICAgIHN1cnJvZ2F0ZUNoYXJDb2RlOiBudW1iZXI7XG4gIH0pID0+XG4gICAgYEFuIGV4cG9ydCBuYW1lIGNhbm5vdCBpbmNsdWRlIGEgbG9uZSBzdXJyb2dhdGUsIGZvdW5kICdcXFxcdSR7c3Vycm9nYXRlQ2hhckNvZGUudG9TdHJpbmcoXG4gICAgICAxNixcbiAgICApfScuYCxcbiAgTW9kdWxlRXhwb3J0VW5kZWZpbmVkOiAoeyBsb2NhbE5hbWUgfTogeyBsb2NhbE5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFeHBvcnQgJyR7bG9jYWxOYW1lfScgaXMgbm90IGRlZmluZWQuYCxcbiAgTXVsdGlwbGVEZWZhdWx0c0luU3dpdGNoOiBcIk11bHRpcGxlIGRlZmF1bHQgY2xhdXNlcy5cIixcbiAgTmV3bGluZUFmdGVyVGhyb3c6IFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93LlwiLFxuICBOb0NhdGNoT3JGaW5hbGx5OiBcIk1pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UuXCIsXG4gIE51bWJlcklkZW50aWZpZXI6IFwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXIuXCIsXG4gIE51bWVyaWNTZXBhcmF0b3JJbkVzY2FwZVNlcXVlbmNlOlxuICAgIFwiTnVtZXJpYyBzZXBhcmF0b3JzIGFyZSBub3QgYWxsb3dlZCBpbnNpZGUgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIG9yIGhleCBlc2NhcGUgc2VxdWVuY2VzLlwiLFxuICBPYnNvbGV0ZUF3YWl0U3RhcjpcbiAgICBcIidhd2FpdConIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb25zIHByb3Bvc2FsLiBVc2UgUHJvbWlzZS5hbGwoKSBpbnN0ZWFkLlwiLFxuICBPcHRpb25hbENoYWluaW5nTm9OZXc6XG4gICAgXCJDb25zdHJ1Y3RvcnMgaW4vYWZ0ZXIgYW4gT3B0aW9uYWwgQ2hhaW4gYXJlIG5vdCBhbGxvd2VkLlwiLFxuICBPcHRpb25hbENoYWluaW5nTm9UZW1wbGF0ZTpcbiAgICBcIlRhZ2dlZCBUZW1wbGF0ZSBMaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gb3B0aW9uYWxDaGFpbi5cIixcbiAgT3ZlcnJpZGVPbkNvbnN0cnVjdG9yOlxuICAgIFwiJ292ZXJyaWRlJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uXCIsXG4gIFBhcmFtRHVwZTogXCJBcmd1bWVudCBuYW1lIGNsYXNoLlwiLFxuICBQYXR0ZXJuSGFzQWNjZXNzb3I6IFwiT2JqZWN0IHBhdHRlcm4gY2FuJ3QgY29udGFpbiBnZXR0ZXIgb3Igc2V0dGVyLlwiLFxuICBQYXR0ZXJuSGFzTWV0aG9kOiBcIk9iamVjdCBwYXR0ZXJuIGNhbid0IGNvbnRhaW4gbWV0aG9kcy5cIixcbiAgUHJpdmF0ZUluRXhwZWN0ZWRJbjogKHsgaWRlbnRpZmllck5hbWUgfTogeyBpZGVudGlmaWVyTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYFByaXZhdGUgbmFtZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBwcm9wZXJ0eSBhY2Nlc3NlcyAoXFxgb2JqLiMke2lkZW50aWZpZXJOYW1lfVxcYCkgb3IgaW4gXFxgaW5cXGAgZXhwcmVzc2lvbnMgKFxcYCMke2lkZW50aWZpZXJOYW1lfSBpbiBvYmpcXGApLmAsXG4gIFByaXZhdGVOYW1lUmVkZWNsYXJhdGlvbjogKHsgaWRlbnRpZmllck5hbWUgfTogeyBpZGVudGlmaWVyTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYER1cGxpY2F0ZSBwcml2YXRlIG5hbWUgIyR7aWRlbnRpZmllck5hbWV9LmAsXG4gIFJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlOlxuICAgIFwiUmVjb3JkIGV4cHJlc3Npb25zIGVuZGluZyB3aXRoICd8fScgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2JhcicuXCIsXG4gIFJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RTdGFydFN5bnRheFR5cGU6XG4gICAgXCJSZWNvcmQgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAne3wnIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdiYXInLlwiLFxuICBSZWNvcmRFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZTpcbiAgICBcIlJlY29yZCBleHByZXNzaW9ucyBzdGFydGluZyB3aXRoICcjeycgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSAnc3ludGF4VHlwZScgb3B0aW9uIG9mIHRoZSAncmVjb3JkQW5kVHVwbGUnIHBsdWdpbiBpcyBzZXQgdG8gJ2hhc2gnLlwiLFxuICBSZWNvcmROb1Byb3RvOiBcIidfX3Byb3RvX18nIGlzIG5vdCBhbGxvd2VkIGluIFJlY29yZCBleHByZXNzaW9ucy5cIixcbiAgUmVzdFRyYWlsaW5nQ29tbWE6IFwiVW5leHBlY3RlZCB0cmFpbGluZyBjb21tYSBhZnRlciByZXN0IGVsZW1lbnQuXCIsXG4gIFNsb3BweUZ1bmN0aW9uOlxuICAgIFwiSW4gbm9uLXN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwgb3IgaW5zaWRlIGEgYmxvY2suXCIsXG4gIFNsb3BweUZ1bmN0aW9uQW5uZXhCOlxuICAgIFwiSW4gbm9uLXN0cmljdCBtb2RlIGNvZGUsIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwsIGluc2lkZSBhIGJsb2NrLCBvciBhcyB0aGUgYm9keSBvZiBhbiBpZiBzdGF0ZW1lbnQuXCIsXG4gIFN0YXRpY1Byb3RvdHlwZTogXCJDbGFzc2VzIG1heSBub3QgaGF2ZSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlLlwiLFxuICBTdXBlck5vdEFsbG93ZWQ6XG4gICAgXCJgc3VwZXIoKWAgaXMgb25seSB2YWxpZCBpbnNpZGUgYSBjbGFzcyBjb25zdHJ1Y3RvciBvZiBhIHN1YmNsYXNzLiBNYXliZSBhIHR5cG8gaW4gdGhlIG1ldGhvZCBuYW1lICgnY29uc3RydWN0b3InKSBvciBub3QgZXh0ZW5kaW5nIGFub3RoZXIgY2xhc3M/XCIsXG4gIFN1cGVyUHJpdmF0ZUZpZWxkOiBcIlByaXZhdGUgZmllbGRzIGNhbid0IGJlIGFjY2Vzc2VkIG9uIHN1cGVyLlwiLFxuICBUcmFpbGluZ0RlY29yYXRvcjogXCJEZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBlbGVtZW50LlwiLFxuICBUdXBsZUV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgZW5kaW5nIHdpdGggJ3xdJyBhcmUgb25seSBhbGxvd2VkIHdoZW4gdGhlICdzeW50YXhUeXBlJyBvcHRpb24gb2YgdGhlICdyZWNvcmRBbmRUdXBsZScgcGx1Z2luIGlzIHNldCB0byAnYmFyJy5cIixcbiAgVHVwbGVFeHByZXNzaW9uQmFySW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAnW3wnIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdiYXInLlwiLFxuICBUdXBsZUV4cHJlc3Npb25IYXNoSW5jb3JyZWN0U3RhcnRTeW50YXhUeXBlOlxuICAgIFwiVHVwbGUgZXhwcmVzc2lvbnMgc3RhcnRpbmcgd2l0aCAnI1snIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiB0aGUgJ3N5bnRheFR5cGUnIG9wdGlvbiBvZiB0aGUgJ3JlY29yZEFuZFR1cGxlJyBwbHVnaW4gaXMgc2V0IHRvICdoYXNoJy5cIixcbiAgVW5leHBlY3RlZEFyZ3VtZW50UGxhY2Vob2xkZXI6IFwiVW5leHBlY3RlZCBhcmd1bWVudCBwbGFjZWhvbGRlci5cIixcbiAgVW5leHBlY3RlZEF3YWl0QWZ0ZXJQaXBlbGluZUJvZHk6XG4gICAgJ1VuZXhwZWN0ZWQgXCJhd2FpdFwiIGFmdGVyIHBpcGVsaW5lIGJvZHk7IGF3YWl0IG11c3QgaGF2ZSBwYXJlbnRoZXNlcyBpbiBtaW5pbWFsIHByb3Bvc2FsLicsXG4gIFVuZXhwZWN0ZWREaWdpdEFmdGVySGFzaDogXCJVbmV4cGVjdGVkIGRpZ2l0IGFmdGVyIGhhc2ggdG9rZW4uXCIsXG4gIFVuZXhwZWN0ZWRJbXBvcnRFeHBvcnQ6XG4gICAgXCInaW1wb3J0JyBhbmQgJ2V4cG9ydCcgbWF5IG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwuXCIsXG4gIFVuZXhwZWN0ZWRLZXl3b3JkOiAoeyBrZXl3b3JkIH06IHsga2V5d29yZDogc3RyaW5nIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQga2V5d29yZCAnJHtrZXl3b3JkfScuYCxcbiAgVW5leHBlY3RlZExlYWRpbmdEZWNvcmF0b3I6XG4gICAgXCJMZWFkaW5nIGRlY29yYXRvcnMgbXVzdCBiZSBhdHRhY2hlZCB0byBhIGNsYXNzIGRlY2xhcmF0aW9uLlwiLFxuICBVbmV4cGVjdGVkTGV4aWNhbERlY2xhcmF0aW9uOlxuICAgIFwiTGV4aWNhbCBkZWNsYXJhdGlvbiBjYW5ub3QgYXBwZWFyIGluIGEgc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0LlwiLFxuICBVbmV4cGVjdGVkTmV3VGFyZ2V0OlxuICAgIFwiYG5ldy50YXJnZXRgIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb25zIG9yIGNsYXNzIHByb3BlcnRpZXMuXCIsXG4gIFVuZXhwZWN0ZWROdW1lcmljU2VwYXJhdG9yOlxuICAgIFwiQSBudW1lcmljIHNlcGFyYXRvciBpcyBvbmx5IGFsbG93ZWQgYmV0d2VlbiB0d28gZGlnaXRzLlwiLFxuICBVbmV4cGVjdGVkUHJpdmF0ZUZpZWxkOiBcIlVuZXhwZWN0ZWQgcHJpdmF0ZSBuYW1lLlwiLFxuICBVbmV4cGVjdGVkUmVzZXJ2ZWRXb3JkOiAoeyByZXNlcnZlZFdvcmQgfTogeyByZXNlcnZlZFdvcmQ6IHN0cmluZyB9KSA9PlxuICAgIGBVbmV4cGVjdGVkIHJlc2VydmVkIHdvcmQgJyR7cmVzZXJ2ZWRXb3JkfScuYCxcbiAgVW5leHBlY3RlZFN1cGVyOiBcIidzdXBlcicgaXMgb25seSBhbGxvd2VkIGluIG9iamVjdCBtZXRob2RzIGFuZCBjbGFzc2VzLlwiLFxuICBVbmV4cGVjdGVkVG9rZW46ICh7XG4gICAgZXhwZWN0ZWQsXG4gICAgdW5leHBlY3RlZCxcbiAgfToge1xuICAgIGV4cGVjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICB1bmV4cGVjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgfSkgPT5cbiAgICBgVW5leHBlY3RlZCB0b2tlbiR7dW5leHBlY3RlZCA/IGAgJyR7dW5leHBlY3RlZH0nLmAgOiBcIlwifSR7XG4gICAgICBleHBlY3RlZCA/IGAsIGV4cGVjdGVkIFwiJHtleHBlY3RlZH1cImAgOiBcIlwiXG4gICAgfWAsXG4gIFVuZXhwZWN0ZWRUb2tlblVuYXJ5RXhwb25lbnRpYXRpb246XG4gICAgXCJJbGxlZ2FsIGV4cHJlc3Npb24uIFdyYXAgbGVmdCBoYW5kIHNpZGUgb3IgZW50aXJlIGV4cG9uZW50aWF0aW9uIGluIHBhcmVudGhlc2VzLlwiLFxuICBVbmV4cGVjdGVkVXNpbmdEZWNsYXJhdGlvbjpcbiAgICBcIlVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCBhcHBlYXIgaW4gdGhlIHRvcCBsZXZlbCB3aGVuIHNvdXJjZSB0eXBlIGlzIGBzY3JpcHRgLlwiLFxuICBVbnN1cHBvcnRlZEJpbmQ6IFwiQmluZGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIG9iamVjdCBwcm9wZXJ0eS5cIixcbiAgVW5zdXBwb3J0ZWREZWNvcmF0b3JFeHBvcnQ6XG4gICAgXCJBIGRlY29yYXRlZCBleHBvcnQgbXVzdCBleHBvcnQgYSBjbGFzcyBkZWNsYXJhdGlvbi5cIixcbiAgVW5zdXBwb3J0ZWREZWZhdWx0RXhwb3J0OlxuICAgIFwiT25seSBleHByZXNzaW9ucywgZnVuY3Rpb25zIG9yIGNsYXNzZXMgYXJlIGFsbG93ZWQgYXMgdGhlIGBkZWZhdWx0YCBleHBvcnQuXCIsXG4gIFVuc3VwcG9ydGVkSW1wb3J0OlxuICAgIFwiYGltcG9ydGAgY2FuIG9ubHkgYmUgdXNlZCBpbiBgaW1wb3J0KClgIG9yIGBpbXBvcnQubWV0YWAuXCIsXG4gIFVuc3VwcG9ydGVkTWV0YVByb3BlcnR5OiAoe1xuICAgIHRhcmdldCxcbiAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWUsXG4gIH06IHtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgfSkgPT5cbiAgICBgVGhlIG9ubHkgdmFsaWQgbWV0YSBwcm9wZXJ0eSBmb3IgJHt0YXJnZXR9IGlzICR7dGFyZ2V0fS4ke29ubHlWYWxpZFByb3BlcnR5TmFtZX0uYCxcbiAgVW5zdXBwb3J0ZWRQYXJhbWV0ZXJEZWNvcmF0b3I6XG4gICAgXCJEZWNvcmF0b3JzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY29yYXRlIHBhcmFtZXRlcnMuXCIsXG4gIFVuc3VwcG9ydGVkUHJvcGVydHlEZWNvcmF0b3I6XG4gICAgXCJEZWNvcmF0b3JzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY29yYXRlIG9iamVjdCBsaXRlcmFsIHByb3BlcnRpZXMuXCIsXG4gIFVuc3VwcG9ydGVkU3VwZXI6XG4gICAgXCInc3VwZXInIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBmdW5jdGlvbiBjYWxscyAoaS5lLiBzdXBlcigpKSBvciBpbiBwcm9wZXJ0eSBhY2Nlc3NlcyAoaS5lLiBzdXBlci5wcm9wIG9yIHN1cGVyW3Byb3BdKS5cIixcbiAgVW50ZXJtaW5hdGVkQ29tbWVudDogXCJVbnRlcm1pbmF0ZWQgY29tbWVudC5cIixcbiAgVW50ZXJtaW5hdGVkUmVnRXhwOiBcIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24uXCIsXG4gIFVudGVybWluYXRlZFN0cmluZzogXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50LlwiLFxuICBVbnRlcm1pbmF0ZWRUZW1wbGF0ZTogXCJVbnRlcm1pbmF0ZWQgdGVtcGxhdGUuXCIsXG4gIFVzaW5nRGVjbGFyYXRpb25IYXNCaW5kaW5nUGF0dGVybjpcbiAgICBcIlVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIGRlc3RydWN0dXJpbmcgcGF0dGVybnMuXCIsXG4gIFZhclJlZGVjbGFyYXRpb246ICh7IGlkZW50aWZpZXJOYW1lIH06IHsgaWRlbnRpZmllck5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBJZGVudGlmaWVyICcke2lkZW50aWZpZXJOYW1lfScgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZC5gLFxuICBZaWVsZEJpbmRpbmdJZGVudGlmaWVyOlxuICAgIFwiQ2FuIG5vdCB1c2UgJ3lpZWxkJyBhcyBpZGVudGlmaWVyIGluc2lkZSBhIGdlbmVyYXRvci5cIixcbiAgWWllbGRJblBhcmFtZXRlcjogXCJZaWVsZCBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGZvcm1hbCBwYXJhbWV0ZXJzLlwiLFxuICBaZXJvRGlnaXROdW1lcmljU2VwYXJhdG9yOlxuICAgIFwiTnVtZXJpYyBzZXBhcmF0b3IgY2FuIG5vdCBiZSB1c2VkIGFmdGVyIGxlYWRpbmcgMC5cIixcbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQge1xuICBTdHJpY3REZWxldGU6IFwiRGVsZXRpbmcgbG9jYWwgdmFyaWFibGUgaW4gc3RyaWN0IG1vZGUuXCIsXG5cbiAgLy8gYHJlZmVyZW5jZU5hbWVgIGlzIHRoZSBTdHJpbmdWYWx1ZVsxXSBvZiBhbiBJZGVudGlmaWVyUmVmZXJlbmNlWzJdLCB3aGljaFxuICAvLyBpcyByZXByZXNlbnRlZCBhcyBqdXN0IGFuIGBJZGVudGlmaWVyYFszXSBpbiB0aGUgQmFiZWwgQVNULlxuICAvLyAxLiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0YXRpYy1zZW1hbnRpY3Mtc3RyaW5ndmFsdWVcbiAgLy8gMi4gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtSWRlbnRpZmllclJlZmVyZW5jZVxuICAvLyAzLiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLXBhcnNlci9hc3Qvc3BlYy5tZCNpZGVudGlmaWVyXG4gIFN0cmljdEV2YWxBcmd1bWVudHM6ICh7IHJlZmVyZW5jZU5hbWUgfTogeyByZWZlcmVuY2VOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgQXNzaWduaW5nIHRvICcke3JlZmVyZW5jZU5hbWV9JyBpbiBzdHJpY3QgbW9kZS5gLFxuXG4gIC8vIGBiaW5kaW5nTmFtZWAgaXMgdGhlIFN0cmluZ1ZhbHVlWzFdIG9mIGEgQmluZGluZ0lkZW50aWZpZXJbMl0sIHdoaWNoIGlzXG4gIC8vIHJlcHJlc2VudGVkIGFzIGp1c3QgYW4gYElkZW50aWZpZXJgWzNdIGluIHRoZSBCYWJlbCBBU1QuXG4gIC8vIDEuIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RhdGljLXNlbWFudGljcy1zdHJpbmd2YWx1ZVxuICAvLyAyLiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nSWRlbnRpZmllclxuICAvLyAzLiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLXBhcnNlci9hc3Qvc3BlYy5tZCNpZGVudGlmaWVyXG4gIFN0cmljdEV2YWxBcmd1bWVudHNCaW5kaW5nOiAoeyBiaW5kaW5nTmFtZSB9OiB7IGJpbmRpbmdOYW1lOiBzdHJpbmcgfSkgPT5cbiAgICBgQmluZGluZyAnJHtiaW5kaW5nTmFtZX0nIGluIHN0cmljdCBtb2RlLmAsXG5cbiAgU3RyaWN0RnVuY3Rpb246XG4gICAgXCJJbiBzdHJpY3QgbW9kZSBjb2RlLCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdG9wIGxldmVsIG9yIGluc2lkZSBhIGJsb2NrLlwiLFxuXG4gIFN0cmljdE51bWVyaWNFc2NhcGU6IFwiVGhlIG9ubHkgdmFsaWQgbnVtZXJpYyBlc2NhcGUgaW4gc3RyaWN0IG1vZGUgaXMgJ1xcXFwwJy5cIixcblxuICBTdHJpY3RPY3RhbExpdGVyYWw6IFwiTGVnYWN5IG9jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZS5cIixcblxuICBTdHJpY3RXaXRoOiBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZS5cIixcbn07XG4iLCAiaW1wb3J0IHRvTm9kZURlc2NyaXB0aW9uIGZyb20gXCIuL3RvLW5vZGUtZGVzY3JpcHRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFVucGFyZW50aGVzaXplZFBpcGVCb2R5RGVzY3JpcHRpb25zID0gbmV3IFNldChbXG4gIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIixcbiAgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLFxuICBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiLFxuICBcIllpZWxkRXhwcmVzc2lvblwiLFxuXSBhcyBjb25zdCk7XG5cbnR5cGUgR2V0U2V0TWVtYmVyVHlwZTxUIGV4dGVuZHMgU2V0PGFueT4+ID0gVCBleHRlbmRzIFNldDxpbmZlciBNPlxuICA/IE1cbiAgOiB1bmtub3duO1xuXG50eXBlIFVucGFyZW50aGVzaXplZFBpcGVCb2R5VHlwZXMgPSBHZXRTZXRNZW1iZXJUeXBlPFxuICB0eXBlb2YgVW5wYXJlbnRoZXNpemVkUGlwZUJvZHlEZXNjcmlwdGlvbnNcbj47XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gVGhpcyBlcnJvciBpcyBvbmx5IHVzZWQgYnkgdGhlIHNtYXJ0LW1peCBwcm9wb3NhbFxuICBQaXBlQm9keUlzVGlnaHRlcjpcbiAgICBcIlVuZXhwZWN0ZWQgeWllbGQgYWZ0ZXIgcGlwZWxpbmUgYm9keTsgYW55IHlpZWxkIGV4cHJlc3Npb24gYWN0aW5nIGFzIEhhY2stc3R5bGUgcGlwZSBib2R5IG11c3QgYmUgcGFyZW50aGVzaXplZCBkdWUgdG8gaXRzIGxvb3NlIG9wZXJhdG9yIHByZWNlZGVuY2UuXCIsXG4gIFBpcGVUb3BpY1JlcXVpcmVzSGFja1BpcGVzOlxuICAgICdUb3BpYyByZWZlcmVuY2UgaXMgdXNlZCwgYnV0IHRoZSBwaXBlbGluZU9wZXJhdG9yIHBsdWdpbiB3YXMgbm90IHBhc3NlZCBhIFwicHJvcG9zYWxcIjogXCJoYWNrXCIgb3IgXCJzbWFydFwiIG9wdGlvbi4nLFxuICBQaXBlVG9waWNVbmJvdW5kOlxuICAgIFwiVG9waWMgcmVmZXJlbmNlIGlzIHVuYm91bmQ7IGl0IG11c3QgYmUgaW5zaWRlIGEgcGlwZSBib2R5LlwiLFxuICBQaXBlVG9waWNVbmNvbmZpZ3VyZWRUb2tlbjogKHsgdG9rZW4gfTogeyB0b2tlbjogc3RyaW5nIH0pID0+XG4gICAgYEludmFsaWQgdG9waWMgdG9rZW4gJHt0b2tlbn0uIEluIG9yZGVyIHRvIHVzZSAke3Rva2VufSBhcyBhIHRvcGljIHJlZmVyZW5jZSwgdGhlIHBpcGVsaW5lT3BlcmF0b3IgcGx1Z2luIG11c3QgYmUgY29uZmlndXJlZCB3aXRoIHsgXCJwcm9wb3NhbFwiOiBcImhhY2tcIiwgXCJ0b3BpY1Rva2VuXCI6IFwiJHt0b2tlbn1cIiB9LmAsXG4gIFBpcGVUb3BpY1VudXNlZDpcbiAgICBcIkhhY2stc3R5bGUgcGlwZSBib2R5IGRvZXMgbm90IGNvbnRhaW4gYSB0b3BpYyByZWZlcmVuY2U7IEhhY2stc3R5bGUgcGlwZXMgbXVzdCB1c2UgdG9waWMgYXQgbGVhc3Qgb25jZS5cIixcbiAgUGlwZVVucGFyZW50aGVzaXplZEJvZHk6ICh7IHR5cGUgfTogeyB0eXBlOiBVbnBhcmVudGhlc2l6ZWRQaXBlQm9keVR5cGVzIH0pID0+XG4gICAgYEhhY2stc3R5bGUgcGlwZSBib2R5IGNhbm5vdCBiZSBhbiB1bnBhcmVudGhlc2l6ZWQgJHt0b05vZGVEZXNjcmlwdGlvbih7XG4gICAgICB0eXBlLFxuICAgIH0pfTsgcGxlYXNlIHdyYXAgaXQgaW4gcGFyZW50aGVzZXMuYCxcblxuICAvLyBNZXNzYWdlcyB3aG9zZSBjb2RlcyBzdGFydCB3aXRoIFx1MjAxQ1BpcGVsaW5lXHUyMDFEIG9yIFx1MjAxQ1ByaW1hcnlUb3BpY1x1MjAxRFxuICAvLyBhcmUgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIC8vIHdpdGggdGhlIGRlcHJlY2F0ZWQgc21hcnQtbWl4IHBpcGUgb3BlcmF0b3IgcHJvcG9zYWwgcGx1Z2luLlxuICAvLyBUaGV5IGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbi5cbiAgUGlwZWxpbmVCb2R5Tm9BcnJvdzpcbiAgICAnVW5leHBlY3RlZCBhcnJvdyBcIj0+XCIgYWZ0ZXIgcGlwZWxpbmUgYm9keTsgYXJyb3cgZnVuY3Rpb24gaW4gcGlwZWxpbmUgYm9keSBtdXN0IGJlIHBhcmVudGhlc2l6ZWQuJyxcbiAgUGlwZWxpbmVCb2R5U2VxdWVuY2VFeHByZXNzaW9uOlxuICAgIFwiUGlwZWxpbmUgYm9keSBtYXkgbm90IGJlIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIGV4cHJlc3Npb24uXCIsXG4gIFBpcGVsaW5lSGVhZFNlcXVlbmNlRXhwcmVzc2lvbjpcbiAgICBcIlBpcGVsaW5lIGhlYWQgc2hvdWxkIG5vdCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBleHByZXNzaW9uLlwiLFxuICBQaXBlbGluZVRvcGljVW51c2VkOlxuICAgIFwiUGlwZWxpbmUgaXMgaW4gdG9waWMgc3R5bGUgYnV0IGRvZXMgbm90IHVzZSB0b3BpYyByZWZlcmVuY2UuXCIsXG4gIFByaW1hcnlUb3BpY05vdEFsbG93ZWQ6XG4gICAgXCJUb3BpYyByZWZlcmVuY2Ugd2FzIHVzZWQgaW4gYSBsZXhpY2FsIGNvbnRleHQgd2l0aG91dCB0b3BpYyBiaW5kaW5nLlwiLFxuICBQcmltYXJ5VG9waWNSZXF1aXJlc1NtYXJ0UGlwZWxpbmU6XG4gICAgJ1RvcGljIHJlZmVyZW5jZSBpcyB1c2VkLCBidXQgdGhlIHBpcGVsaW5lT3BlcmF0b3IgcGx1Z2luIHdhcyBub3QgcGFzc2VkIGEgXCJwcm9wb3NhbFwiOiBcImhhY2tcIiBvciBcInNtYXJ0XCIgb3B0aW9uLicsXG59O1xuIiwgImltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGUsXG4gIFBhcnNlRXJyb3JDb2RlLFxuICB0eXBlIFBhcnNlRXJyb3JDcmVkZW50aWFscyxcbiAgdHlwZSBUb01lc3NhZ2UsXG4gIHR5cGUgU3ludGF4UGx1Z2luLFxufSBmcm9tIFwiLi9wYXJzZS1lcnJvci9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi9wYXJzZXIvbm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gQmFiZWwgdXNlcyBcIm5vcm1hbFwiIFN5bnRheEVycm9ycyBmb3IgaXQncyBlcnJvcnMsIGJ1dCBhZGRzIHNvbWUgZXh0cmFcbi8vIGZ1bmN0aW9uYWxpdHkuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBkZWZpbmVkIGluIHRoZVxuLy8gYFBhcnNlRXJyb3JTcGVjaWZpY2F0aW9uYCBpbnRlcmZhY2UgYmVsb3cuIFdlIG1heSBjaG9vc2UgdG8gY2hhbmdlIHRvIHNvbWVkYXlcbi8vIGdpdmUgb3VyIGVycm9ycyB0aGVpciBvd24gZnVsbC1ibG93biBjbGFzcywgYnV0IHVudGlsIHRoZW4gdGhpcyBhbGxvdyB1cyB0b1xuLy8ga2VlcCBhbGwgdGhlIGRlc2lyYWJsZSBwcm9wZXJ0aWVzIG9mIFN5bnRheEVycm9ycyAobGlrZSB0aGVpciBuYW1lIGluIHN0YWNrXG4vLyB0cmFjZXMsIGV0Yy4pLCBhbmQgYWxzbyBhbGxvd3MgdXMgdG8gcHVudCBvbiBhbnkgcHVibGljbHkgZmFjaW5nXG4vLyBjbGFzcy1oaWVyYXJjaHkgZGVjaXNpb25zIHVudGlsIEJhYmVsIDguXG5pbnRlcmZhY2UgUGFyc2VFcnJvclNwZWNpZmljYXRpb248RXJyb3JEZXRhaWxzPiB7XG4gIC8vIExvb2ssIHRoZXNlICpjb3VsZCogYmUgcmVhZG9ubHksIGJ1dCB0aGVuIEZsb3cgY29tcGxhaW5zIHdoZW4gd2UgaW5pdGlhbGx5XG4gIC8vIHNldCB0aGVtLiBXZSBjb3VsZCBkbyBhIHdob2xlIGRhbmNlIGFuZCBtYWtlIGEgc3BlY2lhbCBpbnRlcmZhY2UgdGhhdCdzIG5vdFxuICAvLyByZWFkb25seSBmb3Igd2hlbiB3ZSBjcmVhdGUgdGhlIGVycm9yLCB0aGVuIGNhc3QgaXQgdG8gdGhlIHJlYWRvbmx5XG4gIC8vIGludGVyZmFjZSBmb3IgcHVibGljIHVzZSwgYnV0IHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBkaWRuJ3QgaGF2ZSB0aGVtXG4gIC8vIGFzIHJlYWRvbmx5LCBzbyBsZXQncyBqdXN0IG5vdCB3b3JyeSBhYm91dCBpdCBmb3Igbm93LlxuICBjb2RlOiBQYXJzZUVycm9yQ29kZTtcbiAgcmVhc29uQ29kZTogc3RyaW5nO1xuICBzeW50YXhQbHVnaW4/OiBTeW50YXhQbHVnaW47XG4gIG1pc3NpbmdQbHVnaW4/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgbG9jOiBQb3NpdGlvbjtcbiAgZGV0YWlsczogRXJyb3JEZXRhaWxzO1xuXG4gIC8vIFdlIHNob3VsZCBjb25zaWRlciByZW1vdmluZyB0aGlzIGFzIGl0IG5vdyBqdXN0IGNvbnRhaW5zIHRoZSBzYW1lXG4gIC8vIGluZm9ybWF0aW9uIGFzIGBsb2MuaW5kZXhgLlxuICAvLyBwb3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgUGFyc2VFcnJvcjxFcnJvckRldGFpbHM+ID0gU3ludGF4RXJyb3IgJlxuICBQYXJzZUVycm9yU3BlY2lmaWNhdGlvbjxFcnJvckRldGFpbHM+O1xuXG4vLyBCeSBgUGFyc2VFcnJvckNvbnN0cnVjdG9yYCwgd2UgbWVhbiBzb21ldGhpbmcgbGlrZSB0aGUgbmV3LWxlc3Mgc3R5bGVcbi8vIGBFcnJvckNvbnN0cnVjdG9yYFsxXSwgc2luY2UgYFBhcnNlRXJyb3JgJ3MgYXJlIG5vdCB0aGVtc2VsdmVzIGFjdHVhbGx5XG4vLyBzZXBhcmF0ZSBjbGFzc2VzIGZyb20gYFN5bnRheEVycm9yYCdzLlxuLy9cbi8vIDEuIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL3Y0LjUuNS9saWIvbGliLmVzNS5kLnRzI0wxMDI3XG5leHBvcnQgdHlwZSBQYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzPiA9IChhOiB7XG4gIGxvYzogUG9zaXRpb247XG4gIGRldGFpbHM6IEVycm9yRGV0YWlscztcbn0pID0+IFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPjtcblxuZnVuY3Rpb24gdG9QYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzIGV4dGVuZHMgb2JqZWN0Pih7XG4gIHRvTWVzc2FnZSxcbiAgLi4ucHJvcGVydGllc1xufTogUGFyc2VFcnJvckNyZWRlbnRpYWxzPEVycm9yRGV0YWlscz4pOiBQYXJzZUVycm9yQ29uc3RydWN0b3I8RXJyb3JEZXRhaWxzPiB7XG4gIHR5cGUgQ29uc3RydWN0b3JBcmd1bWVudCA9IHtcbiAgICBsb2M6IFBvc2l0aW9uO1xuICAgIGRldGFpbHM6IEVycm9yRGV0YWlscztcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0b3IoeyBsb2MsIGRldGFpbHMgfTogQ29uc3RydWN0b3JBcmd1bWVudCkge1xuICAgIHJldHVybiBpbnN0YW50aWF0ZShcbiAgICAgIFN5bnRheEVycm9yLFxuICAgICAgeyAuLi5wcm9wZXJ0aWVzLCBsb2MgfSxcbiAgICAgIHtcbiAgICAgICAgY2xvbmUoXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBsb2M/OiBQb3NpdGlvbjtcbiAgICAgICAgICAgIGRldGFpbHM/OiBFcnJvckRldGFpbHM7XG4gICAgICAgICAgfSA9IHt9LFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsb2MgPSAob3ZlcnJpZGVzLmxvYyB8fCB7fSkgYXMgUGFydGlhbDxQb3NpdGlvbj47XG4gICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgICAgIGxvYzogbmV3IFBvc2l0aW9uKFxuICAgICAgICAgICAgICBcImxpbmVcIiBpbiBsb2MgPyBsb2MubGluZSA6IHRoaXMubG9jLmxpbmUsXG4gICAgICAgICAgICAgIFwiY29sdW1uXCIgaW4gbG9jID8gbG9jLmNvbHVtbiA6IHRoaXMubG9jLmNvbHVtbixcbiAgICAgICAgICAgICAgXCJpbmRleFwiIGluIGxvYyA/IGxvYy5pbmRleCA6IHRoaXMubG9jLmluZGV4LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRldGFpbHM6IHsgLi4udGhpcy5kZXRhaWxzLCAuLi5vdmVycmlkZXMuZGV0YWlscyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXRhaWxzOiB7IHZhbHVlOiBkZXRhaWxzLCBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgZ2V0KHRoaXM6IENvbnN0cnVjdG9yQXJndW1lbnQpOiBzdHJpbmcge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RvTWVzc2FnZSh0aGlzLmRldGFpbHMpfSAoJHt0aGlzLmxvYy5saW5lfToke1xuICAgICAgICAgICAgICB0aGlzLmxvYy5jb2x1bW5cbiAgICAgICAgICAgIH0pYDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJtZXNzYWdlXCIsIHsgdmFsdWUgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zOiB7IHJlZmxlY3Q6IFwibG9jLmluZGV4XCIsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICAgICAgbWlzc2luZ1BsdWdpbjogXCJtaXNzaW5nUGx1Z2luXCIgaW4gZGV0YWlscyAmJiB7XG4gICAgICAgICAgcmVmbGVjdDogXCJkZXRhaWxzLm1pc3NpbmdQbHVnaW5cIixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApIGFzIFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPjtcbiAgfTtcbn1cblxudHlwZSBQYXJzZUVycm9yVGVtcGxhdGUgPVxuICB8IHN0cmluZ1xuICB8IFRvTWVzc2FnZTxhbnk+XG4gIHwgeyBtZXNzYWdlOiBzdHJpbmcgfCBUb01lc3NhZ2U8YW55PiB9O1xuXG50eXBlIFBhcnNlRXJyb3JUZW1wbGF0ZXMgPSB7IFtyZWFzb25Db2RlOiBzdHJpbmddOiBQYXJzZUVycm9yVGVtcGxhdGUgfTtcblxuLy8gVGhpcyBpcyB0aGUgdGVtcGxhdGVkIGZvcm0gb2YgYFBhcnNlRXJyb3JFbnVtYC5cbi8vXG4vLyBOb3RlOiBXZSBjb3VsZCBmYWN0b3Igb3V0IHRoZSByZXR1cm4gdHlwZSBjYWxjdWxhdGlvbiBpbnRvIHNvbWV0aGluZyBsaWtlXG4vLyBgUGFyc2VFcnJvckNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBQYXJzZUVycm9yVGVtcGxhdGVzPmAsIGFuZCB0aGVuIHdlIGNvdWxkXG4vLyByZXVzZSBpdCBpbiB0aGUgbm9uLXRlbXBsYXRlZCBmb3JtIG9mIGBQYXJzZUVycm9yRW51bWAsIGJ1dCBUeXBlU2NyaXB0XG4vLyBkb2Vzbid0IHNlZW0gdG8gZHJpbGwgZG93biB0aGF0IGZhciB3aGVuIHNob3dpbmcgeW91IHRoZSBjb21wdXRlZCB0eXBlIG9mXG4vLyBhbiBvYmplY3QgaW4gYW4gZWRpdG9yLCBzbyB3ZSdsbCBsZWF2ZSBpdCBpbmxpbmVkIGZvciBub3cuXG5leHBvcnQgZnVuY3Rpb24gUGFyc2VFcnJvckVudW0oYTogVGVtcGxhdGVTdHJpbmdzQXJyYXkpOiA8XG4gIFQgZXh0ZW5kcyBQYXJzZUVycm9yVGVtcGxhdGVzLFxuPihcbiAgcGFyc2VFcnJvclRlbXBsYXRlczogVCxcbikgPT4ge1xuICBbSyBpbiBrZXlvZiBUXTogUGFyc2VFcnJvckNvbnN0cnVjdG9yPFxuICAgIFRbS10gZXh0ZW5kcyB7IG1lc3NhZ2U6IHN0cmluZyB8IFRvTWVzc2FnZTxhbnk+IH1cbiAgICAgID8gVFtLXVtcIm1lc3NhZ2VcIl0gZXh0ZW5kcyBUb01lc3NhZ2U8YW55PlxuICAgICAgICA/IFBhcmFtZXRlcnM8VFtLXVtcIm1lc3NhZ2VcIl0+WzBdXG4gICAgICAgIDoge31cbiAgICAgIDogVFtLXSBleHRlbmRzIFRvTWVzc2FnZTxhbnk+XG4gICAgICA/IFBhcmFtZXRlcnM8VFtLXT5bMF1cbiAgICAgIDoge31cbiAgPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBQYXJzZUVycm9yRW51bTxUIGV4dGVuZHMgUGFyc2VFcnJvclRlbXBsYXRlcz4oXG4gIHBhcnNlRXJyb3JUZW1wbGF0ZXM6IFQsXG4gIHN5bnRheFBsdWdpbj86IFN5bnRheFBsdWdpbixcbik6IHtcbiAgW0sgaW4ga2V5b2YgVF06IFBhcnNlRXJyb3JDb25zdHJ1Y3RvcjxcbiAgICBUW0tdIGV4dGVuZHMgeyBtZXNzYWdlOiBzdHJpbmcgfCBUb01lc3NhZ2U8YW55PiB9XG4gICAgICA/IFRbS11bXCJtZXNzYWdlXCJdIGV4dGVuZHMgVG9NZXNzYWdlPGFueT5cbiAgICAgICAgPyBQYXJhbWV0ZXJzPFRbS11bXCJtZXNzYWdlXCJdPlswXVxuICAgICAgICA6IHt9XG4gICAgICA6IFRbS10gZXh0ZW5kcyBUb01lc3NhZ2U8YW55PlxuICAgICAgPyBQYXJhbWV0ZXJzPFRbS10+WzBdXG4gICAgICA6IHt9XG4gID47XG59O1xuXG4vLyBZb3UgY2FsbCBgUGFyc2VFcnJvckVudW1gIHdpdGggYSBtYXBwaW5nIGZyb20gYFJlYXNvbkNvZGVgJ3MgdG8gZWl0aGVyOlxuLy9cbi8vIDEuIGEgc3RhdGljIGVycm9yIG1lc3NhZ2UsXG4vLyAyLiBgdG9NZXNzYWdlYCBmdW5jdGlvbnMgdGhhdCBkZWZpbmUgYWRkaXRpb25hbCBuZWNlc3NhcnkgYGRldGFpbHNgIG5lZWRlZCBieVxuLy8gICAgdGhlIGBQYXJzZUVycm9yYCwgb3Jcbi8vIDMuIE9iamVjdHMgdGhhdCBjb250YWluIGEgYG1lc3NhZ2VgIG9mIG9uZSBvZiB0aGUgYWJvdmUgYW5kIG92ZXJyaWRkZW4gYGNvZGVgXG4vLyAgICBhbmQvb3IgYHJlYXNvbkNvZGVgOlxuLy9cbi8vIFBhcnNlRXJyb3JFbnVtIGBvcHRpb25hbFN5bnRheFBsdWdpbmAgKHtcbi8vICAgRXJyb3JXaXRoU3RhdGljTWVzc2FnZTogXCJtZXNzYWdlXCIsXG4vLyAgIEVycm9yV2l0aER5bmFtaWNNZXNzYWdlOiAoeyB0eXBlIH0gOiB7IHR5cGU6IHN0cmluZyB9KSA9PiBgJHt0eXBlfWApLFxuLy8gICBFcnJvcldpdGhPdmVycmlkZGVuQ29kZUFuZE9yUmVhc29uQ29kZToge1xuLy8gICAgIG1lc3NhZ2U6ICh7IHR5cGUgfTogeyB0eXBlOiBzdHJpbmcgfSkgPT4gYCR7dHlwZX1gKSxcbi8vICAgICBjb2RlOiBQYXJzZUVycm9yQ29kZS5Tb3VyY2VUeXBlTW9kdWxlRXJyb3IsXG4vLyAgICAgLi4uKEJBQkVMXzhfQlJFQUtJTkcgPyB7IH0gOiB7IHJlYXNvbkNvZGU6IFwiQ3VzdG9tRXJyb3JSZWFzb25Db2RlXCIgfSlcbi8vICAgfVxuLy8gfSk7XG4vL1xuZXhwb3J0IGZ1bmN0aW9uIFBhcnNlRXJyb3JFbnVtKFxuICBhcmd1bWVudDogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBQYXJzZUVycm9yVGVtcGxhdGVzLFxuICBzeW50YXhQbHVnaW4/OiBTeW50YXhQbHVnaW4sXG4pIHtcbiAgLy8gSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhbiBhcnJheSwgdGhhdCBtZWFucyB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGEgdGFnZ2VkXG4gIC8vIHRlbXBsYXRlIGxpdGVyYWwuIEV4dHJhY3QgdGhlIHN5bnRheFBsdWdpbiBmcm9tIHRoaXMsIGFuZCBjYWxsIGFnYWluIGluXG4gIC8vIHRoZSBcIm5vcm1hbGl6ZWRcIiBmb3JtLlxuICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudCkpIHtcbiAgICByZXR1cm4gKHBhcnNlRXJyb3JUZW1wbGF0ZXM6IFBhcnNlRXJyb3JUZW1wbGF0ZXMpID0+XG4gICAgICBQYXJzZUVycm9yRW51bShwYXJzZUVycm9yVGVtcGxhdGVzLCBhcmd1bWVudFswXSk7XG4gIH1cblxuICBjb25zdCBQYXJzZUVycm9yQ29uc3RydWN0b3JzID0ge30gYXMgUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBQYXJzZUVycm9yQ29uc3RydWN0b3I8dW5rbm93bj5cbiAgPjtcblxuICBmb3IgKGNvbnN0IHJlYXNvbkNvZGUgb2YgT2JqZWN0LmtleXMoYXJndW1lbnQpKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSAoYXJndW1lbnQgYXMgUGFyc2VFcnJvclRlbXBsYXRlcylbcmVhc29uQ29kZV07XG4gICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPVxuICAgICAgdHlwZW9mIHRlbXBsYXRlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8geyBtZXNzYWdlOiAoKSA9PiB0ZW1wbGF0ZSB9XG4gICAgICAgIDogdHlwZW9mIHRlbXBsYXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyB7IG1lc3NhZ2U6IHRlbXBsYXRlIH1cbiAgICAgICAgOiB0ZW1wbGF0ZTtcbiAgICBjb25zdCB0b01lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/ICgpID0+IG1lc3NhZ2UgOiBtZXNzYWdlO1xuXG4gICAgUGFyc2VFcnJvckNvbnN0cnVjdG9yc1tyZWFzb25Db2RlXSA9IHRvUGFyc2VFcnJvckNvbnN0cnVjdG9yKHtcbiAgICAgIGNvZGU6IFBhcnNlRXJyb3JDb2RlLlN5bnRheEVycm9yLFxuICAgICAgcmVhc29uQ29kZSxcbiAgICAgIHRvTWVzc2FnZSxcbiAgICAgIC4uLihzeW50YXhQbHVnaW4gPyB7IHN5bnRheFBsdWdpbiB9IDoge30pLFxuICAgICAgLi4ucmVzdCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBQYXJzZUVycm9yQ29uc3RydWN0b3JzO1xufVxuXG5leHBvcnQgdHlwZSBSYWlzZVByb3BlcnRpZXM8RXJyb3JEZXRhaWxzPiA9IHtcbiAgYXQ6IFBvc2l0aW9uIHwgVW5kb25lPE5vZGU+O1xufSAmIEVycm9yRGV0YWlscztcblxuaW1wb3J0IE1vZHVsZUVycm9ycyBmcm9tIFwiLi9wYXJzZS1lcnJvci9tb2R1bGUtZXJyb3JzXCI7XG5pbXBvcnQgU3RhbmRhcmRFcnJvcnMgZnJvbSBcIi4vcGFyc2UtZXJyb3Ivc3RhbmRhcmQtZXJyb3JzXCI7XG5pbXBvcnQgU3RyaWN0TW9kZUVycm9ycyBmcm9tIFwiLi9wYXJzZS1lcnJvci9zdHJpY3QtbW9kZS1lcnJvcnNcIjtcbmltcG9ydCBQaXBlbGluZU9wZXJhdG9yRXJyb3JzIGZyb20gXCIuL3BhcnNlLWVycm9yL3BpcGVsaW5lLW9wZXJhdG9yLWVycm9yc1wiO1xuXG5leHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAuLi5QYXJzZUVycm9yRW51bShNb2R1bGVFcnJvcnMpLFxuICAuLi5QYXJzZUVycm9yRW51bShTdGFuZGFyZEVycm9ycyksXG4gIC4uLlBhcnNlRXJyb3JFbnVtKFN0cmljdE1vZGVFcnJvcnMpLFxuICAuLi5QYXJzZUVycm9yRW51bWBwaXBlbGluZU9wZXJhdG9yYChQaXBlbGluZU9wZXJhdG9yRXJyb3JzKSxcbn07XG5cbmV4cG9ydCB0eXBlIHsgTFZhbEFuY2VzdG9yIH0gZnJvbSBcIi4vcGFyc2UtZXJyb3Ivc3RhbmRhcmQtZXJyb3JzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3BhcnNlLWVycm9yL2NyZWRlbnRpYWxzXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBUb2tlblR5cGUgfSBmcm9tIFwiLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4uL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uRXJyb3JzIH0gZnJvbSBcIi4uL3BhcnNlci91dGlsXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgYXMgTm9kZVR5cGUsIE5vZGVCYXNlLCBGaWxlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vcGFyc2VyL25vZGVcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1R5cGVzIH0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnR5IH0gPSBPYmplY3Q7XG5jb25zdCB0b1VuZW51bWVyYWJsZSA9IChvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcpID0+XG4gIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqZWN0W2tleV0gfSk7XG5cbmZ1bmN0aW9uIHRvRVNUcmVlTG9jYXRpb24obm9kZTogYW55KSB7XG4gIG5vZGUubG9jLnN0YXJ0ICYmIHRvVW5lbnVtZXJhYmxlKG5vZGUubG9jLnN0YXJ0LCBcImluZGV4XCIpO1xuICBub2RlLmxvYy5lbmQgJiYgdG9VbmVudW1lcmFibGUobm9kZS5sb2MuZW5kLCBcImluZGV4XCIpO1xuXG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzczogdHlwZW9mIFBhcnNlcikgPT5cbiAgY2xhc3MgRVNUcmVlUGFyc2VyTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgUGFyc2VyIHtcbiAgICBwYXJzZSgpOiBGaWxlIHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0b0VTVHJlZUxvY2F0aW9uKHN1cGVyLnBhcnNlKCkpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRva2Vucykge1xuICAgICAgICBmaWxlLnRva2VucyA9IGZpbGUudG9rZW5zLm1hcCh0b0VTVHJlZUxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBFU1RyZWUgcGx1Z2luIGNoYW5nZXMgbm9kZSB0eXBlc1xuICAgIHBhcnNlUmVnRXhwTGl0ZXJhbCh7IHBhdHRlcm4sIGZsYWdzIH0pOiBOLkVzdHJlZVJlZ0V4cExpdGVyYWwge1xuICAgICAgbGV0IHJlZ2V4OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlc2UgZmxhZ3MgdmFsdWUgd2lsbFxuICAgICAgICAvLyBiZSBudWxsIGFzIHRoZSByZWdleCBjYW4ndCBiZSByZXByZXNlbnRlZCBuYXRpdmVseS5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbDxOLkVzdHJlZVJlZ0V4cExpdGVyYWw+KHJlZ2V4KTtcbiAgICAgIG5vZGUucmVnZXggPSB7IHBhdHRlcm4sIGZsYWdzIH07XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRVNUcmVlIHBsdWdpbiBjaGFuZ2VzIG5vZGUgdHlwZXNcbiAgICBwYXJzZUJpZ0ludExpdGVyYWwodmFsdWU6IGFueSk6IE4uTm9kZSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9lczIwMjAubWQjYmlnaW50bGl0ZXJhbFxuICAgICAgbGV0IGJpZ0ludDogQmlnSW50IHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludCA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYmlnSW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbDxOLkVzdHJlZUJpZ0ludExpdGVyYWw+KGJpZ0ludCk7XG4gICAgICBub2RlLmJpZ2ludCA9IFN0cmluZyhub2RlLnZhbHVlIHx8IHZhbHVlKTtcblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBFU1RyZWUgcGx1Z2luIGNoYW5nZXMgbm9kZSB0eXBlc1xuICAgIHBhcnNlRGVjaW1hbExpdGVyYWwodmFsdWU6IGFueSk6IE4uTm9kZSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9leHBlcmltZW50YWwvZGVjaW1hbC5tZFxuICAgICAgLy8gdG9kbzogdXNlIEJpZ0RlY2ltYWwgd2hlbiBub2RlIHN1cHBvcnRzIGl0LlxuICAgICAgY29uc3QgZGVjaW1hbDogbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5lc3RyZWVQYXJzZUxpdGVyYWwoZGVjaW1hbCk7XG4gICAgICBub2RlLmRlY2ltYWwgPSBTdHJpbmcobm9kZS52YWx1ZSB8fCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGVzdHJlZVBhcnNlTGl0ZXJhbDxUIGV4dGVuZHMgTi5Ob2RlPih2YWx1ZTogYW55KSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8VD4odmFsdWUsIFwiTGl0ZXJhbFwiKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgcGFyc2VTdHJpbmdMaXRlcmFsKHZhbHVlOiBhbnkpOiBOLk5vZGUge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwYXJzZU51bWVyaWNMaXRlcmFsKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEVTVHJlZSBwbHVnaW4gY2hhbmdlcyBub2RlIHR5cGVzXG4gICAgcGFyc2VOdWxsTGl0ZXJhbCgpOiBOLk5vZGUge1xuICAgICAgcmV0dXJuIHRoaXMuZXN0cmVlUGFyc2VMaXRlcmFsKG51bGwpO1xuICAgIH1cblxuICAgIHBhcnNlQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pOiBOLkJvb2xlYW5MaXRlcmFsIHtcbiAgICAgIHJldHVybiB0aGlzLmVzdHJlZVBhcnNlTGl0ZXJhbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ2FzdCBhIERpcmVjdGl2ZSB0byBhbiBFeHByZXNzaW9uU3RhdGVtZW50LiBNdXRhdGVzIHRoZSBpbnB1dCBEaXJlY3RpdmUuXG4gICAgZGlyZWN0aXZlVG9TdG10KGRpcmVjdGl2ZTogTi5EaXJlY3RpdmUpOiBOLkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGRpcmVjdGl2ZS52YWx1ZSBhcyBhbnkgYXMgTi5Fc3RyZWVMaXRlcmFsO1xuICAgICAgZGVsZXRlIGRpcmVjdGl2ZS52YWx1ZTtcblxuICAgICAgZXhwcmVzc2lvbi50eXBlID0gXCJMaXRlcmFsXCI7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE4uRXN0cmVlTGl0ZXJhbC5yYXcgaXMgbm90IGRlZmluZWQuXG4gICAgICBleHByZXNzaW9uLnJhdyA9IGV4cHJlc3Npb24uZXh0cmEucmF3O1xuICAgICAgZXhwcmVzc2lvbi52YWx1ZSA9IGV4cHJlc3Npb24uZXh0cmEuZXhwcmVzc2lvblZhbHVlO1xuXG4gICAgICBjb25zdCBzdG10ID0gZGlyZWN0aXZlIGFzIGFueSBhcyBOLkV4cHJlc3Npb25TdGF0ZW1lbnQ7XG4gICAgICBzdG10LnR5cGUgPSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjtcbiAgICAgIHN0bXQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE4uRXhwcmVzc2lvblN0YXRlbWVudC5kaXJlY3RpdmUgaXMgbm90IGRlZmluZWRcbiAgICAgIHN0bXQuZGlyZWN0aXZlID0gZXhwcmVzc2lvbi5leHRyYS5yYXdWYWx1ZTtcblxuICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZXh0cmE7XG5cbiAgICAgIHJldHVybiBzdG10O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBpbml0RnVuY3Rpb24obm9kZTogTi5Cb2RpbGVzc0Z1bmN0aW9uT3JNZXRob2RCYXNlLCBpc0FzeW5jOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBzdXBlci5pbml0RnVuY3Rpb24obm9kZSwgaXNBc3luYyk7XG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjaGVja0RlY2xhcmF0aW9uKG5vZGU6IE4uUGF0dGVybiB8IE4uT2JqZWN0UHJvcGVydHkpOiB2b2lkIHtcbiAgICAgIGlmIChub2RlICE9IG51bGwgJiYgdGhpcy5pc09iamVjdFByb3BlcnR5KG5vZGUpKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIHR5cGluZ3NcbiAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKChub2RlIGFzIHVua25vd24gYXMgTi5Fc3RyZWVQcm9wZXJ0eSkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VwZXIuY2hlY2tEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPYmplY3RPckNsYXNzTWV0aG9kUGFyYW1zKG1ldGhvZDogTi5PYmplY3RNZXRob2QgfCBOLkNsYXNzTWV0aG9kKSB7XG4gICAgICByZXR1cm4gKG1ldGhvZCBhcyBhbnkgYXMgTi5Fc3RyZWVQcm9wZXJ0eSB8IE4uRXN0cmVlTWV0aG9kRGVmaW5pdGlvbilcbiAgICAgICAgLnZhbHVlLnBhcmFtcztcbiAgICB9XG5cbiAgICBpc1ZhbGlkRGlyZWN0aXZlKHN0bXQ6IE4uU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdG10LnR5cGUgPT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiICYmXG4gICAgICAgIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgICB0eXBlb2Ygc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICFzdG10LmV4cHJlc3Npb24uZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VCbG9ja0JvZHkoXG4gICAgICBub2RlOiBOLkJsb2NrU3RhdGVtZW50TGlrZSxcbiAgICAgIGFsbG93RGlyZWN0aXZlczogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICAgIGVuZDogVG9rZW5UeXBlLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlPzogKGhhc1N0cmljdE1vZGVEaXJlY3RpdmU6IGJvb2xlYW4pID0+IHZvaWQsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZUJsb2NrQm9keShcbiAgICAgICAgbm9kZSxcbiAgICAgICAgYWxsb3dEaXJlY3RpdmVzLFxuICAgICAgICB0b3BMZXZlbCxcbiAgICAgICAgZW5kLFxuICAgICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXJlY3RpdmVTdGF0ZW1lbnRzID0gbm9kZS5kaXJlY3RpdmVzLm1hcChkID0+XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlVG9TdG10KGQpLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0cmVlIHBsdWdpbiB0eXBpbmdzXG4gICAgICBub2RlLmJvZHkgPSBkaXJlY3RpdmVTdGF0ZW1lbnRzLmNvbmNhdChub2RlLmJvZHkpO1xuICAgICAgZGVsZXRlIG5vZGUuZGlyZWN0aXZlcztcbiAgICB9XG5cbiAgICBwdXNoQ2xhc3NNZXRob2QoXG4gICAgICBjbGFzc0JvZHk6IE4uQ2xhc3NCb2R5LFxuICAgICAgbWV0aG9kOiBOLkNsYXNzTWV0aG9kLFxuICAgICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgICAgaXNDb25zdHJ1Y3RvcjogYm9vbGVhbixcbiAgICAgIGFsbG93c0RpcmVjdFN1cGVyOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgdGhpcy5wYXJzZU1ldGhvZChcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIsXG4gICAgICAgIFwiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBpZiAobWV0aG9kLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgICBtZXRob2QudmFsdWUudHlwZVBhcmFtZXRlcnMgPSBtZXRob2QudHlwZVBhcmFtZXRlcnM7XG4gICAgICAgIGRlbGV0ZSBtZXRob2QudHlwZVBhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgICBjbGFzc0JvZHkuYm9keS5wdXNoKG1ldGhvZCk7XG4gICAgfVxuXG4gICAgcGFyc2VQcml2YXRlTmFtZSgpOiBhbnkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlUHJpdmF0ZU5hbWUoKTtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UHJpdmF0ZU5hbWVUb1ByaXZhdGVJZGVudGlmaWVyKG5vZGUpO1xuICAgIH1cblxuICAgIGNvbnZlcnRQcml2YXRlTmFtZVRvUHJpdmF0ZUlkZW50aWZpZXIoXG4gICAgICBub2RlOiBOLlByaXZhdGVOYW1lLFxuICAgICk6IE4uRXN0cmVlUHJpdmF0ZUlkZW50aWZpZXIge1xuICAgICAgY29uc3QgbmFtZSA9IHN1cGVyLmdldFByaXZhdGVOYW1lU1Yobm9kZSk7XG4gICAgICBub2RlID0gbm9kZSBhcyBhbnk7XG4gICAgICBkZWxldGUgbm9kZS5pZDtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS50eXBlID0gXCJQcml2YXRlSWRlbnRpZmllclwiO1xuICAgICAgcmV0dXJuIG5vZGUgYXMgdW5rbm93biBhcyBOLkVzdHJlZVByaXZhdGVJZGVudGlmaWVyO1xuICAgIH1cblxuICAgIGlzUHJpdmF0ZU5hbWUobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFBsdWdpbk9wdGlvbihcImVzdHJlZVwiLCBcImNsYXNzRmVhdHVyZXNcIikpIHtcbiAgICAgICAgICByZXR1cm4gc3VwZXIuaXNQcml2YXRlTmFtZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJQcml2YXRlSWRlbnRpZmllclwiO1xuICAgIH1cblxuICAgIGdldFByaXZhdGVOYW1lU1Yobm9kZTogTi5Ob2RlKTogc3RyaW5nIHtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcml2YXRlTmFtZVNWKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5uYW1lO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIG1heSBvdmVycmlkZSBpbnRlcmZhY2VzXG4gICAgcGFyc2VMaXRlcmFsPFQgZXh0ZW5kcyBOLkxpdGVyYWw+KHZhbHVlOiBhbnksIHR5cGU6IFRbXCJ0eXBlXCJdKTogVCB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VMaXRlcmFsPFQ+KHZhbHVlLCB0eXBlKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRpbmcgQVNUIHR5cGVzXG4gICAgICBub2RlLnJhdyA9IG5vZGUuZXh0cmEucmF3O1xuICAgICAgZGVsZXRlIG5vZGUuZXh0cmE7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25Cb2R5KFxuICAgICAgbm9kZTogTi5GdW5jdGlvbixcbiAgICAgIGFsbG93RXhwcmVzc2lvbj86IGJvb2xlYW4gfCBudWxsLFxuICAgICAgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGFsbG93RXhwcmVzc2lvbiwgaXNNZXRob2QpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gbm9kZS5ib2R5LnR5cGUgIT09IFwiQmxvY2tTdGF0ZW1lbnRcIjtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsdWdpbiBtYXkgb3ZlcnJpZGUgaW50ZXJmYWNlc1xuICAgIHBhcnNlTWV0aG9kPFxuICAgICAgVCBleHRlbmRzIE4uQ2xhc3NQcml2YXRlTWV0aG9kIHwgTi5PYmplY3RNZXRob2QgfCBOLkNsYXNzTWV0aG9kLFxuICAgID4oXG4gICAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgaW5DbGFzc1Njb3BlOiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogTi5Fc3RyZWVNZXRob2REZWZpbml0aW9uIHtcbiAgICAgIGxldCBmdW5jTm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uTWV0aG9kTGlrZT4oKTtcbiAgICAgIGZ1bmNOb2RlLmtpbmQgPSBub2RlLmtpbmQ7IC8vIHByb3ZpZGUga2luZCwgc28gc3VwZXIgbWV0aG9kIGNvcnJlY3RseSBzZXRzIHN0YXRlXG4gICAgICBmdW5jTm9kZSA9IHN1cGVyLnBhcnNlTWV0aG9kKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGZ1bmNOb2RlLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dEaXJlY3RTdXBlcixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaW5DbGFzc1Njb3BlLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgZnVuY05vZGUudHlwZSA9IFwiRnVuY3Rpb25FeHByZXNzaW9uXCI7XG4gICAgICBkZWxldGUgZnVuY05vZGUua2luZDtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXV0YXRlIEFTVCB0eXBlc1xuICAgICAgbm9kZS52YWx1ZSA9IGZ1bmNOb2RlO1xuICAgICAgaWYgKHR5cGUgPT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpIHtcbiAgICAgICAgbm9kZS5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYXN0IG1ldGhvZHMgdG8gZXN0cmVlIHR5cGVzXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXN0cmVlTWV0aG9kRGVmaW5pdGlvbj4sXG4gICAgICAgIFwiTWV0aG9kRGVmaW5pdGlvblwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJvcGVydHkoLi4uYXJnczogW04uQ2xhc3NQcm9wZXJ0eV0pOiBhbnkge1xuICAgICAgY29uc3QgcHJvcGVydHlOb2RlID0gc3VwZXIucGFyc2VDbGFzc1Byb3BlcnR5KC4uLmFyZ3MpIGFzIGFueTtcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZXN0cmVlXCIsIFwiY2xhc3NGZWF0dXJlc1wiKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3BlcnR5Tm9kZS50eXBlID0gXCJQcm9wZXJ0eURlZmluaXRpb25cIjtcbiAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eSguLi5hcmdzOiBbTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eV0pOiBhbnkge1xuICAgICAgY29uc3QgcHJvcGVydHlOb2RlID0gc3VwZXIucGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eSguLi5hcmdzKSBhcyBhbnk7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFBsdWdpbk9wdGlvbihcImVzdHJlZVwiLCBcImNsYXNzRmVhdHVyZXNcIikpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcGVydHlOb2RlIGFzIE4uRXN0cmVlUHJvcGVydHlEZWZpbml0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9wZXJ0eU5vZGUudHlwZSA9IFwiUHJvcGVydHlEZWZpbml0aW9uXCI7XG4gICAgICBwcm9wZXJ0eU5vZGUuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiBwcm9wZXJ0eU5vZGUgYXMgTi5Fc3RyZWVQcm9wZXJ0eURlZmluaXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VPYmplY3RNZXRob2QoXG4gICAgICBwcm9wOiBOLk9iamVjdE1ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgKTogTi5PYmplY3RNZXRob2QgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGNvbnN0IG5vZGU6IE4uRXN0cmVlUHJvcGVydHkgPSBzdXBlci5wYXJzZU9iamVjdE1ldGhvZChcbiAgICAgICAgcHJvcCxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzUGF0dGVybixcbiAgICAgICAgaXNBY2Nlc3NvcixcbiAgICAgICkgYXMgYW55O1xuXG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlLnR5cGUgPSBcIlByb3BlcnR5XCI7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkgYXMgTi5DbGFzc01ldGhvZCkua2luZCA9PT0gXCJtZXRob2RcIikge1xuICAgICAgICAgIG5vZGUua2luZCA9IFwiaW5pdFwiO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2hvcnRoYW5kID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlIGFzIGFueTtcbiAgICB9XG5cbiAgICBwYXJzZU9iamVjdFByb3BlcnR5KFxuICAgICAgcHJvcDogTi5PYmplY3RQcm9wZXJ0eSxcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBpc1BhdHRlcm46IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5PYmplY3RQcm9wZXJ0eSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgY29uc3Qgbm9kZTogTi5Fc3RyZWVQcm9wZXJ0eSA9IHN1cGVyLnBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIHByb3AsXG4gICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApIGFzIGFueTtcblxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgbm9kZS5raW5kID0gXCJpbml0XCI7XG4gICAgICAgIG5vZGUudHlwZSA9IFwiUHJvcGVydHlcIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGUgYXMgYW55O1xuICAgIH1cblxuICAgIGlzVmFsaWRMVmFsKFxuICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgaXNVbnBhcmVudGhlc2l6ZWRJbkFzc2lnbjogYm9vbGVhbixcbiAgICAgIGJpbmRpbmc6IEJpbmRpbmdUeXBlcyxcbiAgICApIHtcbiAgICAgIHJldHVybiB0eXBlID09PSBcIlByb3BlcnR5XCJcbiAgICAgICAgPyBcInZhbHVlXCJcbiAgICAgICAgOiBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1VucGFyZW50aGVzaXplZEluQXNzaWduLCBiaW5kaW5nKTtcbiAgICB9XG5cbiAgICBpc0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmIHRoaXMuaXNPYmplY3RQcm9wZXJ0eShub2RlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Fzc2lnbmFibGUobm9kZS52YWx1ZSwgaXNCaW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5pc0Fzc2lnbmFibGUobm9kZSwgaXNCaW5kaW5nKTtcbiAgICB9XG5cbiAgICB0b0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0xIUzogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmIHRoaXMuaXNPYmplY3RQcm9wZXJ0eShub2RlKSkge1xuICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IG5vZGU7XG4gICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZU5hbWUoa2V5KSkge1xuICAgICAgICAgIHRoaXMuY2xhc3NTY29wZS51c2VQcml2YXRlTmFtZShcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihrZXkpLFxuICAgICAgICAgICAga2V5LmxvYy5zdGFydCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHZhbHVlLCBpc0xIUyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKFxuICAgICAgcHJvcDogTi5Ob2RlLFxuICAgICAgaXNMYXN0OiBib29sZWFuLFxuICAgICAgaXNMSFM6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICBpZiAocHJvcC5raW5kID09PSBcImdldFwiIHx8IHByb3Aua2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXR0ZXJuSGFzQWNjZXNzb3IsIHsgYXQ6IHByb3Aua2V5IH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wLm1ldGhvZCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXR0ZXJuSGFzTWV0aG9kLCB7IGF0OiBwcm9wLmtleSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKHByb3AsIGlzTGFzdCwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaENhbGxFeHByZXNzaW9uPFQgZXh0ZW5kcyBOLkNhbGxFeHByZXNzaW9uIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uPihcbiAgICAgIHVuZmluaXNoZWQ6IFVuZG9uZTxUPixcbiAgICAgIG9wdGlvbmFsOiBib29sZWFuLFxuICAgICk6IFQge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLmZpbmlzaENhbGxFeHByZXNzaW9uKHVuZmluaXNoZWQsIG9wdGlvbmFsKTtcblxuICAgICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0XCIpIHtcbiAgICAgICAgKG5vZGUgYXMgTi5Ob2RlIGFzIE4uRXN0cmVlSW1wb3J0RXhwcmVzc2lvbikudHlwZSA9IFwiSW1wb3J0RXhwcmVzc2lvblwiO1xuICAgICAgICAobm9kZSBhcyBOLk5vZGUgYXMgTi5Fc3RyZWVJbXBvcnRFeHByZXNzaW9uKS5zb3VyY2UgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXR0cmlidXRlc1wiKSB8fFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICAobm9kZSBhcyBOLk5vZGUgYXMgTi5Fc3RyZWVJbXBvcnRFeHByZXNzaW9uKS5hdHRyaWJ1dGVzID1cbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzWzFdID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJndW1lbnRzIGlzbid0IG9wdGlvbmFsIGluIHRoZSB0eXBlIGRlZmluaXRpb25cbiAgICAgICAgZGVsZXRlIG5vZGUuYXJndW1lbnRzO1xuICAgICAgICAvLyBjYWxsZWUgaXNuJ3Qgb3B0aW9uYWwgaW4gdGhlIHR5cGUgZGVmaW5pdGlvblxuICAgICAgICBkZWxldGUgbm9kZS5jYWxsZWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHRvUmVmZXJlbmNlZEFyZ3VtZW50cyhcbiAgICAgIG5vZGU6XG4gICAgICAgIHwgTi5DYWxsRXhwcmVzc2lvblxuICAgICAgICB8IE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvblxuICAgICAgICB8IE4uRXN0cmVlSW1wb3J0RXhwcmVzc2lvbixcbiAgICAgIC8qIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLCAqL1xuICAgICkge1xuICAgICAgLy8gSW1wb3J0RXhwcmVzc2lvbnMgZG8gbm90IGhhdmUgYW4gYXJndW1lbnRzIGFycmF5LlxuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJJbXBvcnRFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci50b1JlZmVyZW5jZWRBcmd1bWVudHMobm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQoXG4gICAgICB1bmZpbmlzaGVkOiBVbmRvbmU8Ti5BbnlFeHBvcnQ+LFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKSB7XG4gICAgICBjb25zdCBleHBvcnRTdGFydExvYyA9IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jO1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlRXhwb3J0KHVuZmluaXNoZWQsIGRlY29yYXRvcnMpO1xuXG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG11dGF0aW5nIEFTVCB0eXBlc1xuICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICAgIG5vZGUuc3BlY2lmaWVyc1swXS50eXBlID09PSBcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG11dGF0aW5nIEFTVCB0eXBlc1xuICAgICAgICAgICAgbm9kZS50eXBlID0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICAgIG5vZGUuZXhwb3J0ZWQgPSBub2RlLnNwZWNpZmllcnNbMF0uZXhwb3J0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgbm9kZS5zcGVjaWZpZXJzO1xuICAgICAgICAgIH1cblxuICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeyBkZWNsYXJhdGlvbiB9ID0gbm9kZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb24/LnR5cGUgPT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiICYmXG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmRlY29yYXRvcnM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgLy8gZGVjb3JhdG9yIGNvbWVzIGJlZm9yZSBleHBvcnRcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb24uc3RhcnQgPT09IG5vZGUuc3RhcnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggRVNMaW50J3Mga2V5d29yZC1zcGFjaW5nIHJ1bGUsIHdoaWNoIGFzc3VtZXMgdGhhdCBhblxuICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWNsYXJhdGlvbiBtdXN0IHN0YXJ0IHdpdGggZXhwb3J0LlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9pc3N1ZXMvMTUwODVcbiAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHJlc2V0IGV4cG9ydCBkZWNsYXJhdGlvbidzIHN0YXJ0IHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgZXhwb3J0IHRva2VuXG4gICAgICAgICAgICAgICAgZXhwb3J0U3RhcnRMb2MsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgICAgbm9DYWxsczogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICAgICkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN1cGVyLnBhcnNlU3Vic2NyaXB0KGJhc2UsIHN0YXJ0TG9jLCBub0NhbGxzLCBzdGF0ZSk7XG5cbiAgICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2Jsb2IvbWFzdGVyL2VzMjAyMC5tZCNjaGFpbmV4cHJlc3Npb25cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS50eXBlID0gbm9kZS50eXBlLnN1YnN0cmluZyg4KTsgLy8gc3RyaXAgT3B0aW9uYWwgcHJlZml4XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnN0b3ApIHtcbiAgICAgICAgICBjb25zdCBjaGFpbiA9IHRoaXMuc3RhcnROb2RlQXROb2RlKG5vZGUpO1xuICAgICAgICAgIGNoYWluLmV4cHJlc3Npb24gPSBub2RlO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoY2hhaW4sIFwiQ2hhaW5FeHByZXNzaW9uXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBub2RlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiIHx8XG4gICAgICAgIG5vZGUudHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBoYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkNoYWluRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuaGFzUHJvcGVydHlBc1ByaXZhdGVOYW1lKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igb3ZlcnJpZGUgaW50ZXJmYWNlc1xuICAgIGlzT2JqZWN0UHJvcGVydHkobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlByb3BlcnR5XCIgJiYgbm9kZS5raW5kID09PSBcImluaXRcIiAmJiAhbm9kZS5tZXRob2Q7XG4gICAgfVxuXG4gICAgaXNPYmplY3RNZXRob2Qobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gbm9kZS5tZXRob2QgfHwgbm9kZS5raW5kID09PSBcImdldFwiIHx8IG5vZGUua2luZCA9PT0gXCJzZXRcIjtcbiAgICB9XG5cbiAgICBmaW5pc2hOb2RlQXQ8VCBleHRlbmRzIE5vZGVUeXBlPihcbiAgICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgZW5kTG9jOiBQb3NpdGlvbixcbiAgICApOiBUIHtcbiAgICAgIHJldHVybiB0b0VTVHJlZUxvY2F0aW9uKHN1cGVyLmZpbmlzaE5vZGVBdChub2RlLCB0eXBlLCBlbmRMb2MpKTtcbiAgICB9XG5cbiAgICByZXNldFN0YXJ0TG9jYXRpb24obm9kZTogTi5Ob2RlLCBzdGFydExvYzogUG9zaXRpb24pIHtcbiAgICAgIHN1cGVyLnJlc2V0U3RhcnRMb2NhdGlvbihub2RlLCBzdGFydExvYyk7XG4gICAgICB0b0VTVHJlZUxvY2F0aW9uKG5vZGUpO1xuICAgIH1cblxuICAgIHJlc2V0RW5kTG9jYXRpb24oXG4gICAgICBub2RlOiBOb2RlQmFzZSxcbiAgICAgIGVuZExvYzogUG9zaXRpb24gPSB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5yZXNldEVuZExvY2F0aW9uKG5vZGUsIGVuZExvYyk7XG4gICAgICB0b0VTVHJlZUxvY2F0aW9uKG5vZGUpO1xuICAgIH1cbiAgfTtcbiIsICIvLyBUaGUgdG9rZW4gY29udGV4dCBpcyB1c2VkIGluIEpTWCBwbHVnaW4gdG8gdHJhY2tcbi8vIGpzeCB0YWcgLyBqc3ggdGV4dCAvIG5vcm1hbCBKYXZhU2NyaXB0IGV4cHJlc3Npb25cblxuZXhwb3J0IGNsYXNzIFRva0NvbnRleHQge1xuICBjb25zdHJ1Y3Rvcih0b2tlbjogc3RyaW5nLCBwcmVzZXJ2ZVNwYWNlPzogYm9vbGVhbikge1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB0aGlzLnByZXNlcnZlU3BhY2UgPSAhIXByZXNlcnZlU3BhY2U7XG4gIH1cblxuICB0b2tlbjogc3RyaW5nO1xuICBwcmVzZXJ2ZVNwYWNlOiBib29sZWFuO1xufVxuXG5jb25zdCB0eXBlczoge1xuICBba2V5OiBzdHJpbmddOiBUb2tDb250ZXh0O1xufSA9IHtcbiAgYnJhY2U6IG5ldyBUb2tDb250ZXh0KFwie1wiKSwgLy8gbm9ybWFsIEphdmFTY3JpcHQgZXhwcmVzc2lvblxuICBqX29UYWc6IG5ldyBUb2tDb250ZXh0KFwiPHRhZ1wiKSwgLy8gSlNYIG9wZW5pbmcgdGFnXG4gIGpfY1RhZzogbmV3IFRva0NvbnRleHQoXCI8L3RhZ1wiKSwgLy8gSlNYIGNsb3NpbmcgdGFnXG4gIGpfZXhwcjogbmV3IFRva0NvbnRleHQoXCI8dGFnPi4uLjwvdGFnPlwiLCB0cnVlKSwgLy8gSlNYIGV4cHJlc3Npb25zXG59O1xuXG5pZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgdHlwZXMudGVtcGxhdGUgPSBuZXcgVG9rQ29udGV4dChcImBcIiwgdHJ1ZSk7XG59XG5cbmV4cG9ydCB7IHR5cGVzIH07XG4iLCAiaW1wb3J0IHsgdHlwZXMgYXMgdGMsIHR5cGUgVG9rQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbi8vICMjIFRva2VuIHR5cGVzXG5cbi8vIFRoZSBhc3NpZ25tZW50IG9mIGZpbmUtZ3JhaW5lZCwgaW5mb3JtYXRpb24tY2FycnlpbmcgdHlwZSBvYmplY3RzXG4vLyBhbGxvd3MgdGhlIHRva2VuaXplciB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGFcbi8vIHRva2VuIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjaGVhcCBmb3IgdGhlIHBhcnNlciB0byBsb29rIHVwLlxuXG4vLyBBbGwgdG9rZW4gdHlwZSB2YXJpYWJsZXMgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlLCB0byBtYWtlIHRoZW1cbi8vIGVhc3kgdG8gcmVjb2duaXplLlxuXG4vLyBUaGUgYGJlZm9yZUV4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gMSkgYmluYXJ5XG4vLyBleHByZXNzaW9uICg8KSBhbmQgSlNYIFRhZyBzdGFydCAoPG5hbWU+KTsgMikgb2JqZWN0IGxpdGVyYWwgYW5kIEpTWFxuLy8gdGV4dHMuIEl0IGlzIHNldCBvbiB0aGUgYHVwZGF0ZUNvbnRleHRgIGZ1bmN0aW9uIGluIHRoZSBKU1ggcGx1Z2luLlxuXG4vLyBUaGUgYHN0YXJ0c0V4cHJgIHByb3BlcnR5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhwcmVzc2lvblxuLy8gbWF5IGJlIHRoZSBcdTIwMUNhcmd1bWVudFx1MjAxRCBzdWJleHByZXNzaW9uIG9mIGEgYHlpZWxkYCBleHByZXNzaW9uIG9yXG4vLyBgeWllbGRgIHN0YXRlbWVudC4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IG1heSBiZSBhdCB0aGVcbi8vIHN0YXJ0IG9mIGEgc3ViZXhwcmVzc2lvbi5cblxuLy8gYGlzTG9vcGAgbWFya3MgYSBrZXl3b3JkIGFzIHN0YXJ0aW5nIGEgbG9vcCwgd2hpY2ggaXMgaW1wb3J0YW50XG4vLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuLy8gY29udGludWUganVtcHMgdG8gdGhhdCBsYWJlbC5cblxuY29uc3QgYmVmb3JlRXhwciA9IHRydWU7XG5jb25zdCBzdGFydHNFeHByID0gdHJ1ZTtcbmNvbnN0IGlzTG9vcCA9IHRydWU7XG5jb25zdCBpc0Fzc2lnbiA9IHRydWU7XG5jb25zdCBwcmVmaXggPSB0cnVlO1xuY29uc3QgcG9zdGZpeCA9IHRydWU7XG5cbnR5cGUgVG9rZW5PcHRpb25zID0ge1xuICBrZXl3b3JkPzogc3RyaW5nO1xuICBiZWZvcmVFeHByPzogYm9vbGVhbjtcbiAgc3RhcnRzRXhwcj86IGJvb2xlYW47XG4gIHJpZ2h0QXNzb2NpYXRpdmU/OiBib29sZWFuO1xuICBpc0xvb3A/OiBib29sZWFuO1xuICBpc0Fzc2lnbj86IGJvb2xlYW47XG4gIHByZWZpeD86IGJvb2xlYW47XG4gIHBvc3RmaXg/OiBib29sZWFuO1xuICBiaW5vcD86IG51bWJlciB8IG51bGw7XG59O1xuXG4vLyBJbnRlcm5hbGx5IHRoZSB0b2tlbml6ZXIgc3RvcmVzIHRva2VuIGFzIGEgbnVtYmVyXG5leHBvcnQgdHlwZSBUb2tlblR5cGUgPSBudW1iZXI7XG5cbi8vIFRoZSBgRXhwb3J0ZWRUb2tlblR5cGVgIGlzIGV4cG9ydGVkIHZpYSBgdG9rVHlwZXNgIGFuZCBhY2Nlc3NpYmxlXG4vLyB3aGVuIGB0b2tlbnM6IHRydWVgIGlzIGVuYWJsZWQuIFVubGlrZSBpbnRlcm5hbCB0b2tlbiB0eXBlLCBpdCBwcm92aWRlc1xuLy8gbWV0YWRhdGEgb2YgdGhlIHRva2Vucy5cbmV4cG9ydCBjbGFzcyBFeHBvcnRlZFRva2VuVHlwZSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIGJlZm9yZUV4cHI6IGJvb2xlYW47XG4gIHN0YXJ0c0V4cHI6IGJvb2xlYW47XG4gIHJpZ2h0QXNzb2NpYXRpdmU6IGJvb2xlYW47XG4gIGlzTG9vcDogYm9vbGVhbjtcbiAgaXNBc3NpZ246IGJvb2xlYW47XG4gIHByZWZpeDogYm9vbGVhbjtcbiAgcG9zdGZpeDogYm9vbGVhbjtcbiAgYmlub3A6IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIC8vIHRvZG8oQmFiZWwgOCk6IHJlbW92ZSB1cGRhdGVDb250ZXh0IGZyb20gZXhwb3NlZCB0b2tlbiBsYXlvdXRcbiAgZGVjbGFyZSB1cGRhdGVDb250ZXh0OlxuICAgIHwgKChjb250ZXh0OiBBcnJheTxUb2tDb250ZXh0PikgPT4gdm9pZClcbiAgICB8IHVuZGVmaW5lZFxuICAgIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nLCBjb25mOiBUb2tlbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLmtleXdvcmQgPSBjb25mLmtleXdvcmQ7XG4gICAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gICAgdGhpcy5zdGFydHNFeHByID0gISFjb25mLnN0YXJ0c0V4cHI7XG4gICAgdGhpcy5yaWdodEFzc29jaWF0aXZlID0gISFjb25mLnJpZ2h0QXNzb2NpYXRpdmU7XG4gICAgdGhpcy5pc0xvb3AgPSAhIWNvbmYuaXNMb29wO1xuICAgIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gICAgdGhpcy5wcmVmaXggPSAhIWNvbmYucHJlZml4O1xuICAgIHRoaXMucG9zdGZpeCA9ICEhY29uZi5wb3N0Zml4O1xuICAgIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wICE9IG51bGwgPyBjb25mLmJpbm9wIDogbnVsbDtcbiAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIEEgbWFwIGZyb20ga2V5d29yZC9rZXl3b3JkLWxpa2Ugc3RyaW5nIHZhbHVlIHRvIHRoZSB0b2tlbiB0eXBlXG5leHBvcnQgY29uc3Qga2V5d29yZHMgPSBuZXcgTWFwPHN0cmluZywgVG9rZW5UeXBlPigpO1xuXG5mdW5jdGlvbiBjcmVhdGVLZXl3b3JkKG5hbWU6IHN0cmluZywgb3B0aW9uczogVG9rZW5PcHRpb25zID0ge30pOiBUb2tlblR5cGUge1xuICBvcHRpb25zLmtleXdvcmQgPSBuYW1lO1xuICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKG5hbWUsIG9wdGlvbnMpO1xuICBrZXl3b3Jkcy5zZXQobmFtZSwgdG9rZW4pO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJpbm9wKG5hbWU6IHN0cmluZywgYmlub3A6IG51bWJlcikge1xuICByZXR1cm4gY3JlYXRlVG9rZW4obmFtZSwgeyBiZWZvcmVFeHByLCBiaW5vcCB9KTtcbn1cblxubGV0IHRva2VuVHlwZUNvdW50ZXIgPSAtMTtcbmV4cG9ydCBjb25zdCB0b2tlblR5cGVzOiBFeHBvcnRlZFRva2VuVHlwZVtdID0gW107XG5jb25zdCB0b2tlbkxhYmVsczogc3RyaW5nW10gPSBbXTtcbmNvbnN0IHRva2VuQmlub3BzOiBudW1iZXJbXSA9IFtdO1xuY29uc3QgdG9rZW5CZWZvcmVFeHByczogYm9vbGVhbltdID0gW107XG5jb25zdCB0b2tlblN0YXJ0c0V4cHJzOiBib29sZWFuW10gPSBbXTtcbmNvbnN0IHRva2VuUHJlZml4ZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG5mdW5jdGlvbiBjcmVhdGVUb2tlbihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFRva2VuT3B0aW9ucyA9IHt9KTogVG9rZW5UeXBlIHtcbiAgKyt0b2tlblR5cGVDb3VudGVyO1xuICB0b2tlbkxhYmVscy5wdXNoKG5hbWUpO1xuICB0b2tlbkJpbm9wcy5wdXNoKG9wdGlvbnMuYmlub3AgPz8gLTEpO1xuICB0b2tlbkJlZm9yZUV4cHJzLnB1c2gob3B0aW9ucy5iZWZvcmVFeHByID8/IGZhbHNlKTtcbiAgdG9rZW5TdGFydHNFeHBycy5wdXNoKG9wdGlvbnMuc3RhcnRzRXhwciA/PyBmYWxzZSk7XG4gIHRva2VuUHJlZml4ZXMucHVzaChvcHRpb25zLnByZWZpeCA/PyBmYWxzZSk7XG4gIHRva2VuVHlwZXMucHVzaChuZXcgRXhwb3J0ZWRUb2tlblR5cGUobmFtZSwgb3B0aW9ucykpO1xuXG4gIHJldHVybiB0b2tlblR5cGVDb3VudGVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXl3b3JkTGlrZShcbiAgbmFtZTogc3RyaW5nLFxuICBvcHRpb25zOiBUb2tlbk9wdGlvbnMgPSB7fSxcbik6IFRva2VuVHlwZSB7XG4gICsrdG9rZW5UeXBlQ291bnRlcjtcbiAga2V5d29yZHMuc2V0KG5hbWUsIHRva2VuVHlwZUNvdW50ZXIpO1xuICB0b2tlbkxhYmVscy5wdXNoKG5hbWUpO1xuICB0b2tlbkJpbm9wcy5wdXNoKG9wdGlvbnMuYmlub3AgPz8gLTEpO1xuICB0b2tlbkJlZm9yZUV4cHJzLnB1c2gob3B0aW9ucy5iZWZvcmVFeHByID8/IGZhbHNlKTtcbiAgdG9rZW5TdGFydHNFeHBycy5wdXNoKG9wdGlvbnMuc3RhcnRzRXhwciA/PyBmYWxzZSk7XG4gIHRva2VuUHJlZml4ZXMucHVzaChvcHRpb25zLnByZWZpeCA/PyBmYWxzZSk7XG4gIC8vIEluIHRoZSBleHBvcnRlZCB0b2tlbiB0eXBlLCB3ZSBzZXQgdGhlIGxhYmVsIGFzIFwibmFtZVwiIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggQmFiZWwgN1xuICB0b2tlblR5cGVzLnB1c2gobmV3IEV4cG9ydGVkVG9rZW5UeXBlKFwibmFtZVwiLCBvcHRpb25zKSk7XG5cbiAgcmV0dXJuIHRva2VuVHlwZUNvdW50ZXI7XG59XG5cbi8vIEZvciBwZXJmb3JtYW5jZSB0aGUgdG9rZW4gdHlwZSBoZWxwZXJzIGRlcGVuZCBvbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyBvcmRlci5cbi8vIFdoZW4gYWRkaW5nIG5ldyB0b2tlbiB0eXBlcywgcGxlYXNlIGFsc28gY2hlY2sgaWYgdGhlIHRva2VuIGhlbHBlcnMgbmVlZCB1cGRhdGUuXG5cbmV4cG9ydCB0eXBlIEludGVybmFsVG9rZW5UeXBlcyA9IHR5cGVvZiB0dDtcblxuZXhwb3J0IGNvbnN0IHR0ID0ge1xuICAvLyBQdW5jdHVhdGlvbiB0b2tlbiB0eXBlcy5cbiAgYnJhY2tldEw6IGNyZWF0ZVRva2VuKFwiW1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNrZXRIYXNoTDogY3JlYXRlVG9rZW4oXCIjW1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNrZXRCYXJMOiBjcmVhdGVUb2tlbihcIlt8XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2tldFI6IGNyZWF0ZVRva2VuKFwiXVwiKSxcbiAgYnJhY2tldEJhclI6IGNyZWF0ZVRva2VuKFwifF1cIiksXG4gIGJyYWNlTDogY3JlYXRlVG9rZW4oXCJ7XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2VCYXJMOiBjcmVhdGVUb2tlbihcInt8XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgYnJhY2VIYXNoTDogY3JlYXRlVG9rZW4oXCIje1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIGJyYWNlUjogY3JlYXRlVG9rZW4oXCJ9XCIpLFxuICBicmFjZUJhclI6IGNyZWF0ZVRva2VuKFwifH1cIiksXG4gIHBhcmVuTDogY3JlYXRlVG9rZW4oXCIoXCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgcGFyZW5SOiBjcmVhdGVUb2tlbihcIilcIiksXG4gIGNvbW1hOiBjcmVhdGVUb2tlbihcIixcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBzZW1pOiBjcmVhdGVUb2tlbihcIjtcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBjb2xvbjogY3JlYXRlVG9rZW4oXCI6XCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgZG91YmxlQ29sb246IGNyZWF0ZVRva2VuKFwiOjpcIiwgeyBiZWZvcmVFeHByIH0pLFxuICBkb3Q6IGNyZWF0ZVRva2VuKFwiLlwiKSxcbiAgcXVlc3Rpb246IGNyZWF0ZVRva2VuKFwiP1wiLCB7IGJlZm9yZUV4cHIgfSksXG4gIHF1ZXN0aW9uRG90OiBjcmVhdGVUb2tlbihcIj8uXCIpLFxuICBhcnJvdzogY3JlYXRlVG9rZW4oXCI9PlwiLCB7IGJlZm9yZUV4cHIgfSksXG4gIHRlbXBsYXRlOiBjcmVhdGVUb2tlbihcInRlbXBsYXRlXCIpLFxuICBlbGxpcHNpczogY3JlYXRlVG9rZW4oXCIuLi5cIiwgeyBiZWZvcmVFeHByIH0pLFxuICBiYWNrUXVvdGU6IGNyZWF0ZVRva2VuKFwiYFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIGRvbGxhckJyYWNlTDogY3JlYXRlVG9rZW4oXCIke1wiLCB7IGJlZm9yZUV4cHIsIHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0OiBpc1RlbXBsYXRlXG4gIHRlbXBsYXRlVGFpbDogY3JlYXRlVG9rZW4oXCIuLi5gXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgdGVtcGxhdGVOb25UYWlsOiBjcmVhdGVUb2tlbihcIi4uLiR7XCIsIHsgYmVmb3JlRXhwciwgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RlbXBsYXRlXG4gIGF0OiBjcmVhdGVUb2tlbihcIkBcIiksXG4gIGhhc2g6IGNyZWF0ZVRva2VuKFwiI1wiLCB7IHN0YXJ0c0V4cHIgfSksXG5cbiAgLy8gU3BlY2lhbCBoYXNoYmFuZyB0b2tlbi5cbiAgaW50ZXJwcmV0ZXJEaXJlY3RpdmU6IGNyZWF0ZVRva2VuKFwiIyEuLi5cIiksXG5cbiAgLy8gT3BlcmF0b3JzLiBUaGVzZSBjYXJyeSBzZXZlcmFsIGtpbmRzIG9mIHByb3BlcnRpZXMgdG8gaGVscCB0aGVcbiAgLy8gcGFyc2VyIHVzZSB0aGVtIHByb3Blcmx5ICh0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgcHJvcGVydGllcyBpc1xuICAvLyB3aGF0IGNhdGVnb3JpemVzIHRoZW0gYXMgb3BlcmF0b3JzKS5cbiAgLy9cbiAgLy8gYGJpbm9wYCwgd2hlbiBwcmVzZW50LCBzcGVjaWZpZXMgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIGEgYmluYXJ5XG4gIC8vIG9wZXJhdG9yLCBhbmQgd2lsbCByZWZlciB0byBpdHMgcHJlY2VkZW5jZS5cbiAgLy9cbiAgLy8gYHByZWZpeGAgYW5kIGBwb3N0Zml4YCBtYXJrIHRoZSBvcGVyYXRvciBhcyBhIHByZWZpeCBvciBwb3N0Zml4XG4gIC8vIHVuYXJ5IG9wZXJhdG9yLlxuICAvL1xuICAvLyBgaXNBc3NpZ25gIG1hcmtzIGFsbCBvZiBgPWAsIGArPWAsIGAtPWAgZXRjZXRlcmEsIHdoaWNoIGFjdCBhc1xuICAvLyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYSB2ZXJ5IGxvdyBwcmVjZWRlbmNlLCB0aGF0IHNob3VsZCByZXN1bHRcbiAgLy8gaW4gQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZXMuXG5cbiAgLy8gc3RhcnQ6IGlzQXNzaWduXG4gIGVxOiBjcmVhdGVUb2tlbihcIj1cIiwgeyBiZWZvcmVFeHByLCBpc0Fzc2lnbiB9KSxcbiAgYXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIHNsYXNoQXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIC8vIFRoZXNlIGFyZSBvbmx5IG5lZWRlZCB0byBzdXBwb3J0ICUgYW5kIF4gYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gIC8vIFdoZW4gdGhlIHByb3Bvc2FsIHNldHRsZXMgb24gYSB0b2tlbiwgdGhlIG90aGVycyBjYW4gYmUgbWVyZ2VkIHdpdGhcbiAgLy8gdHQuYXNzaWduLlxuICB4b3JBc3NpZ246IGNyZWF0ZVRva2VuKFwiXz1cIiwgeyBiZWZvcmVFeHByLCBpc0Fzc2lnbiB9KSxcbiAgbW9kdWxvQXNzaWduOiBjcmVhdGVUb2tlbihcIl89XCIsIHsgYmVmb3JlRXhwciwgaXNBc3NpZ24gfSksXG4gIC8vIGVuZDogaXNBc3NpZ25cblxuICBpbmNEZWM6IGNyZWF0ZVRva2VuKFwiKysvLS1cIiwgeyBwcmVmaXgsIHBvc3RmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIGJhbmc6IGNyZWF0ZVRva2VuKFwiIVwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcbiAgdGlsZGU6IGNyZWF0ZVRva2VuKFwiflwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcblxuICAvLyBNb3JlIHBvc3NpYmxlIHRvcGljIHRva2Vucy5cbiAgLy8gV2hlbiB0aGUgcHJvcG9zYWwgc2V0dGxlcyBvbiBhIHRva2VuLCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgbWF5IGJlIHJlbW92ZWQuXG4gIGRvdWJsZUNhcmV0OiBjcmVhdGVUb2tlbihcIl5eXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgZG91YmxlQXQ6IGNyZWF0ZVRva2VuKFwiQEBcIiwgeyBzdGFydHNFeHByIH0pLFxuXG4gIC8vIHN0YXJ0OiBpc0Jpbm9wXG4gIHBpcGVsaW5lOiBjcmVhdGVCaW5vcChcInw+XCIsIDApLFxuICBudWxsaXNoQ29hbGVzY2luZzogY3JlYXRlQmlub3AoXCI/P1wiLCAxKSxcbiAgbG9naWNhbE9SOiBjcmVhdGVCaW5vcChcInx8XCIsIDEpLFxuICBsb2dpY2FsQU5EOiBjcmVhdGVCaW5vcChcIiYmXCIsIDIpLFxuICBiaXR3aXNlT1I6IGNyZWF0ZUJpbm9wKFwifFwiLCAzKSxcbiAgYml0d2lzZVhPUjogY3JlYXRlQmlub3AoXCJeXCIsIDQpLFxuICBiaXR3aXNlQU5EOiBjcmVhdGVCaW5vcChcIiZcIiwgNSksXG4gIGVxdWFsaXR5OiBjcmVhdGVCaW5vcChcIj09LyE9Lz09PS8hPT1cIiwgNiksXG4gIGx0OiBjcmVhdGVCaW5vcChcIjwvPi88PS8+PVwiLCA3KSxcbiAgZ3Q6IGNyZWF0ZUJpbm9wKFwiPC8+Lzw9Lz49XCIsIDcpLFxuICByZWxhdGlvbmFsOiBjcmVhdGVCaW5vcChcIjwvPi88PS8+PVwiLCA3KSxcbiAgYml0U2hpZnQ6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBiaXRTaGlmdEw6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBiaXRTaGlmdFI6IGNyZWF0ZUJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBwbHVzTWluOiBjcmVhdGVUb2tlbihcIisvLVwiLCB7IGJlZm9yZUV4cHIsIGJpbm9wOiA5LCBwcmVmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0c0V4cHI6IHJlcXVpcmVkIGJ5IHY4aW50cmluc2ljIHBsdWdpblxuICBtb2R1bG86IGNyZWF0ZVRva2VuKFwiJVwiLCB7IGJpbm9wOiAxMCwgc3RhcnRzRXhwciB9KSxcbiAgLy8gdW5zZXQgYGJlZm9yZUV4cHJgIGFzIGl0IGNhbiBiZSBgZnVuY3Rpb24gKmBcbiAgc3RhcjogY3JlYXRlVG9rZW4oXCIqXCIsIHsgYmlub3A6IDEwIH0pLFxuICBzbGFzaDogY3JlYXRlQmlub3AoXCIvXCIsIDEwKSxcbiAgZXhwb25lbnQ6IGNyZWF0ZVRva2VuKFwiKipcIiwge1xuICAgIGJlZm9yZUV4cHIsXG4gICAgYmlub3A6IDExLFxuICAgIHJpZ2h0QXNzb2NpYXRpdmU6IHRydWUsXG4gIH0pLFxuXG4gIC8vIEtleXdvcmRzXG4gIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgcGFja2FnZXMvYmFiZWwtaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyL3NyYy9rZXl3b3JkLmpzXG4gIC8vIHdoZW4gbmV3IGtleXdvcmRzIGFyZSBhZGRlZFxuICAvLyBzdGFydDogaXNMaXRlcmFsUHJvcGVydHlOYW1lXG4gIC8vIHN0YXJ0OiBpc0tleXdvcmRcbiAgX2luOiBjcmVhdGVLZXl3b3JkKFwiaW5cIiwgeyBiZWZvcmVFeHByLCBiaW5vcDogNyB9KSxcbiAgX2luc3RhbmNlb2Y6IGNyZWF0ZUtleXdvcmQoXCJpbnN0YW5jZW9mXCIsIHsgYmVmb3JlRXhwciwgYmlub3A6IDcgfSksXG4gIC8vIGVuZDogaXNCaW5vcFxuICBfYnJlYWs6IGNyZWF0ZUtleXdvcmQoXCJicmVha1wiKSxcbiAgX2Nhc2U6IGNyZWF0ZUtleXdvcmQoXCJjYXNlXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2NhdGNoOiBjcmVhdGVLZXl3b3JkKFwiY2F0Y2hcIiksXG4gIF9jb250aW51ZTogY3JlYXRlS2V5d29yZChcImNvbnRpbnVlXCIpLFxuICBfZGVidWdnZXI6IGNyZWF0ZUtleXdvcmQoXCJkZWJ1Z2dlclwiKSxcbiAgX2RlZmF1bHQ6IGNyZWF0ZUtleXdvcmQoXCJkZWZhdWx0XCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2Vsc2U6IGNyZWF0ZUtleXdvcmQoXCJlbHNlXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2ZpbmFsbHk6IGNyZWF0ZUtleXdvcmQoXCJmaW5hbGx5XCIpLFxuICBfZnVuY3Rpb246IGNyZWF0ZUtleXdvcmQoXCJmdW5jdGlvblwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9pZjogY3JlYXRlS2V5d29yZChcImlmXCIpLFxuICBfcmV0dXJuOiBjcmVhdGVLZXl3b3JkKFwicmV0dXJuXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX3N3aXRjaDogY3JlYXRlS2V5d29yZChcInN3aXRjaFwiKSxcbiAgX3Rocm93OiBjcmVhdGVLZXl3b3JkKFwidGhyb3dcIiwgeyBiZWZvcmVFeHByLCBwcmVmaXgsIHN0YXJ0c0V4cHIgfSksXG4gIF90cnk6IGNyZWF0ZUtleXdvcmQoXCJ0cnlcIiksXG4gIF92YXI6IGNyZWF0ZUtleXdvcmQoXCJ2YXJcIiksXG4gIF9jb25zdDogY3JlYXRlS2V5d29yZChcImNvbnN0XCIpLFxuICBfd2l0aDogY3JlYXRlS2V5d29yZChcIndpdGhcIiksXG4gIF9uZXc6IGNyZWF0ZUtleXdvcmQoXCJuZXdcIiwgeyBiZWZvcmVFeHByLCBzdGFydHNFeHByIH0pLFxuICBfdGhpczogY3JlYXRlS2V5d29yZChcInRoaXNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc3VwZXI6IGNyZWF0ZUtleXdvcmQoXCJzdXBlclwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9jbGFzczogY3JlYXRlS2V5d29yZChcImNsYXNzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2V4dGVuZHM6IGNyZWF0ZUtleXdvcmQoXCJleHRlbmRzXCIsIHsgYmVmb3JlRXhwciB9KSxcbiAgX2V4cG9ydDogY3JlYXRlS2V5d29yZChcImV4cG9ydFwiKSxcbiAgX2ltcG9ydDogY3JlYXRlS2V5d29yZChcImltcG9ydFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9udWxsOiBjcmVhdGVLZXl3b3JkKFwibnVsbFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF90cnVlOiBjcmVhdGVLZXl3b3JkKFwidHJ1ZVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9mYWxzZTogY3JlYXRlS2V5d29yZChcImZhbHNlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX3R5cGVvZjogY3JlYXRlS2V5d29yZChcInR5cGVvZlwiLCB7IGJlZm9yZUV4cHIsIHByZWZpeCwgc3RhcnRzRXhwciB9KSxcbiAgX3ZvaWQ6IGNyZWF0ZUtleXdvcmQoXCJ2b2lkXCIsIHsgYmVmb3JlRXhwciwgcHJlZml4LCBzdGFydHNFeHByIH0pLFxuICBfZGVsZXRlOiBjcmVhdGVLZXl3b3JkKFwiZGVsZXRlXCIsIHsgYmVmb3JlRXhwciwgcHJlZml4LCBzdGFydHNFeHByIH0pLFxuICAvLyBzdGFydDogaXNMb29wXG4gIF9kbzogY3JlYXRlS2V5d29yZChcImRvXCIsIHsgaXNMb29wLCBiZWZvcmVFeHByIH0pLFxuICBfZm9yOiBjcmVhdGVLZXl3b3JkKFwiZm9yXCIsIHsgaXNMb29wIH0pLFxuICBfd2hpbGU6IGNyZWF0ZUtleXdvcmQoXCJ3aGlsZVwiLCB7IGlzTG9vcCB9KSxcbiAgLy8gZW5kOiBpc0xvb3BcbiAgLy8gZW5kOiBpc0tleXdvcmRcblxuICAvLyBQcmltYXJ5IGxpdGVyYWxzXG4gIC8vIHN0YXJ0OiBpc0lkZW50aWZpZXJcbiAgX2FzOiBjcmVhdGVLZXl3b3JkTGlrZShcImFzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2Fzc2VydDogY3JlYXRlS2V5d29yZExpa2UoXCJhc3NlcnRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfYXN5bmM6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYXN5bmNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfYXdhaXQ6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYXdhaXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZnJvbTogY3JlYXRlS2V5d29yZExpa2UoXCJmcm9tXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2dldDogY3JlYXRlS2V5d29yZExpa2UoXCJnZXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfbGV0OiBjcmVhdGVLZXl3b3JkTGlrZShcImxldFwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9tZXRhOiBjcmVhdGVLZXl3b3JkTGlrZShcIm1ldGFcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfb2Y6IGNyZWF0ZUtleXdvcmRMaWtlKFwib2ZcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc2VudDogY3JlYXRlS2V5d29yZExpa2UoXCJzZW50XCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX3NldDogY3JlYXRlS2V5d29yZExpa2UoXCJzZXRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc3RhdGljOiBjcmVhdGVLZXl3b3JkTGlrZShcInN0YXRpY1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF91c2luZzogY3JlYXRlS2V5d29yZExpa2UoXCJ1c2luZ1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF95aWVsZDogY3JlYXRlS2V5d29yZExpa2UoXCJ5aWVsZFwiLCB7IHN0YXJ0c0V4cHIgfSksXG5cbiAgLy8gRmxvdyBhbmQgVHlwZVNjcmlwdCBLZXl3b3JkbGlrZVxuICBfYXNzZXJ0czogY3JlYXRlS2V5d29yZExpa2UoXCJhc3NlcnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2NoZWNrczogY3JlYXRlS2V5d29yZExpa2UoXCJjaGVja3NcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZXhwb3J0czogY3JlYXRlS2V5d29yZExpa2UoXCJleHBvcnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2dsb2JhbDogY3JlYXRlS2V5d29yZExpa2UoXCJnbG9iYWxcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaW1wbGVtZW50czogY3JlYXRlS2V5d29yZExpa2UoXCJpbXBsZW1lbnRzXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2ludHJpbnNpYzogY3JlYXRlS2V5d29yZExpa2UoXCJpbnRyaW5zaWNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaW5mZXI6IGNyZWF0ZUtleXdvcmRMaWtlKFwiaW5mZXJcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfaXM6IGNyZWF0ZUtleXdvcmRMaWtlKFwiaXNcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfbWl4aW5zOiBjcmVhdGVLZXl3b3JkTGlrZShcIm1peGluc1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9wcm90bzogY3JlYXRlS2V5d29yZExpa2UoXCJwcm90b1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9yZXF1aXJlOiBjcmVhdGVLZXl3b3JkTGlrZShcInJlcXVpcmVcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfc2F0aXNmaWVzOiBjcmVhdGVLZXl3b3JkTGlrZShcInNhdGlzZmllc1wiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIC8vIHN0YXJ0OiBpc1RTVHlwZU9wZXJhdG9yXG4gIF9rZXlvZjogY3JlYXRlS2V5d29yZExpa2UoXCJrZXlvZlwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9yZWFkb25seTogY3JlYXRlS2V5d29yZExpa2UoXCJyZWFkb25seVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF91bmlxdWU6IGNyZWF0ZUtleXdvcmRMaWtlKFwidW5pcXVlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RTVHlwZU9wZXJhdG9yXG4gIC8vIHN0YXJ0OiBpc1RTRGVjbGFyYXRpb25TdGFydFxuICBfYWJzdHJhY3Q6IGNyZWF0ZUtleXdvcmRMaWtlKFwiYWJzdHJhY3RcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfZGVjbGFyZTogY3JlYXRlS2V5d29yZExpa2UoXCJkZWNsYXJlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX2VudW06IGNyZWF0ZUtleXdvcmRMaWtlKFwiZW51bVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIF9tb2R1bGU6IGNyZWF0ZUtleXdvcmRMaWtlKFwibW9kdWxlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgX25hbWVzcGFjZTogY3JlYXRlS2V5d29yZExpa2UoXCJuYW1lc3BhY2VcIiwgeyBzdGFydHNFeHByIH0pLFxuICAvLyBzdGFydDogaXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWVcbiAgX2ludGVyZmFjZTogY3JlYXRlS2V5d29yZExpa2UoXCJpbnRlcmZhY2VcIiwgeyBzdGFydHNFeHByIH0pLFxuICBfdHlwZTogY3JlYXRlS2V5d29yZExpa2UoXCJ0eXBlXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc1RTRGVjbGFyYXRpb25TdGFydFxuICBfb3BhcXVlOiBjcmVhdGVLZXl3b3JkTGlrZShcIm9wYXF1ZVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIC8vIGVuZDogaXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWVcbiAgbmFtZTogY3JlYXRlVG9rZW4oXCJuYW1lXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgLy8gZW5kOiBpc0lkZW50aWZpZXJcblxuICBzdHJpbmc6IGNyZWF0ZVRva2VuKFwic3RyaW5nXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgbnVtOiBjcmVhdGVUb2tlbihcIm51bVwiLCB7IHN0YXJ0c0V4cHIgfSksXG4gIGJpZ2ludDogY3JlYXRlVG9rZW4oXCJiaWdpbnRcIiwgeyBzdGFydHNFeHByIH0pLFxuICBkZWNpbWFsOiBjcmVhdGVUb2tlbihcImRlY2ltYWxcIiwgeyBzdGFydHNFeHByIH0pLFxuICAvLyBlbmQ6IGlzTGl0ZXJhbFByb3BlcnR5TmFtZVxuICByZWdleHA6IGNyZWF0ZVRva2VuKFwicmVnZXhwXCIsIHsgc3RhcnRzRXhwciB9KSxcbiAgcHJpdmF0ZU5hbWU6IGNyZWF0ZVRva2VuKFwiI25hbWVcIiwgeyBzdGFydHNFeHByIH0pLFxuICBlb2Y6IGNyZWF0ZVRva2VuKFwiZW9mXCIpLFxuXG4gIC8vIGpzeCBwbHVnaW5cbiAganN4TmFtZTogY3JlYXRlVG9rZW4oXCJqc3hOYW1lXCIpLFxuICBqc3hUZXh0OiBjcmVhdGVUb2tlbihcImpzeFRleHRcIiwgeyBiZWZvcmVFeHByOiB0cnVlIH0pLFxuICBqc3hUYWdTdGFydDogY3JlYXRlVG9rZW4oXCJqc3hUYWdTdGFydFwiLCB7IHN0YXJ0c0V4cHI6IHRydWUgfSksXG4gIGpzeFRhZ0VuZDogY3JlYXRlVG9rZW4oXCJqc3hUYWdFbmRcIiksXG5cbiAgLy8gcGxhY2Vob2xkZXIgcGx1Z2luXG4gIHBsYWNlaG9sZGVyOiBjcmVhdGVUb2tlbihcIiUlXCIsIHsgc3RhcnRzRXhwcjogdHJ1ZSB9KSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzSWRlbnRpZmllcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5fYXMgJiYgdG9rZW4gPD0gdHQubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuS2V5d29yZE9ySWRlbnRpZmllcklzS2V5d29yZCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIC8vIHdlIGNhbiByZW1vdmUgdGhlIHRva2VuID49IHR0Ll9pbiBjaGVjayB3aGVuIHdlXG4gIC8vIGtub3cgYSB0b2tlbiBpcyBlaXRoZXIga2V5d29yZCBvciBpZGVudGlmaWVyXG4gIHJldHVybiB0b2tlbiA8PSB0dC5fd2hpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5faW4gJiYgdG9rZW4gPD0gdHQubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0Ll9pbiAmJiB0b2tlbiA8PSB0dC5kZWNpbWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Db21lc0JlZm9yZUV4cHJlc3Npb24odG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW5CZWZvcmVFeHByc1t0b2tlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlblN0YXJ0c0V4cHJzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNBc3NpZ25tZW50KHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0LmVxICYmIHRva2VuIDw9IHR0Lm1vZHVsb0Fzc2lnbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWUodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2ludGVyZmFjZSAmJiB0b2tlbiA8PSB0dC5fb3BhcXVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc0xvb3AodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2RvICYmIHRva2VuIDw9IHR0Ll93aGlsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNLZXl3b3JkKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0Ll9pbiAmJiB0b2tlbiA8PSB0dC5fd2hpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzT3BlcmF0b3IodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQucGlwZWxpbmUgJiYgdG9rZW4gPD0gdHQuX2luc3RhbmNlb2Y7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbklzUG9zdGZpeCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA9PT0gdHQuaW5jRGVjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1ByZWZpeCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlblByZWZpeGVzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNUU1R5cGVPcGVyYXRvcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbiA+PSB0dC5fa2V5b2YgJiYgdG9rZW4gPD0gdHQuX3VuaXF1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNUU0RlY2xhcmF0aW9uU3RhcnQodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPj0gdHQuX2Fic3RyYWN0ICYmIHRva2VuIDw9IHR0Ll90eXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5MYWJlbE5hbWUodG9rZW46IFRva2VuVHlwZSk6IHN0cmluZyB7XG4gIHJldHVybiB0b2tlbkxhYmVsc1t0b2tlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbk9wZXJhdG9yUHJlY2VkZW5jZSh0b2tlbjogVG9rZW5UeXBlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRva2VuQmlub3BzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuSXNCaW5hcnlPcGVyYXRvcih0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbkJpbm9wc1t0b2tlbl0gIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1JpZ2h0QXNzb2NpYXRpdmUodG9rZW46IFRva2VuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4gPT09IHR0LmV4cG9uZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5Jc1RlbXBsYXRlKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuID49IHR0LnRlbXBsYXRlVGFpbCAmJiB0b2tlbiA8PSB0dC50ZW1wbGF0ZU5vblRhaWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBvcnRlZFRva2VuKHRva2VuOiBUb2tlblR5cGUpOiBFeHBvcnRlZFRva2VuVHlwZSB7XG4gIHJldHVybiB0b2tlblR5cGVzW3Rva2VuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVG9rZW5UeXBlKG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm51bWJlclwiO1xufVxuXG5pZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgdG9rZW5UeXBlc1t0dC5icmFjZVJdLnVwZGF0ZUNvbnRleHQgPSBjb250ZXh0ID0+IHtcbiAgICBjb250ZXh0LnBvcCgpO1xuICB9O1xuXG4gIHRva2VuVHlwZXNbdHQuYnJhY2VMXS51cGRhdGVDb250ZXh0ID1cbiAgICB0b2tlblR5cGVzW3R0LmJyYWNlSGFzaExdLnVwZGF0ZUNvbnRleHQgPVxuICAgIHRva2VuVHlwZXNbdHQuZG9sbGFyQnJhY2VMXS51cGRhdGVDb250ZXh0ID1cbiAgICAgIGNvbnRleHQgPT4ge1xuICAgICAgICBjb250ZXh0LnB1c2godGMuYnJhY2UpO1xuICAgICAgfTtcblxuICB0b2tlblR5cGVzW3R0LmJhY2tRdW90ZV0udXBkYXRlQ29udGV4dCA9IGNvbnRleHQgPT4ge1xuICAgIGlmIChjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV0gPT09IHRjLnRlbXBsYXRlKSB7XG4gICAgICBjb250ZXh0LnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LnB1c2godGMudGVtcGxhdGUpO1xuICAgIH1cbiAgfTtcblxuICB0b2tlblR5cGVzW3R0LmpzeFRhZ1N0YXJ0XS51cGRhdGVDb250ZXh0ID0gY29udGV4dCA9PiB7XG4gICAgY29udGV4dC5wdXNoKHRjLmpfZXhwciwgdGMual9vVGFnKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyAjIyBDaGFyYWN0ZXIgY2F0ZWdvcmllc1xuXG4vLyBCaWcgdWdseSByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggY2hhcmFjdGVycyBpbiB0aGVcbi8vIHdoaXRlc3BhY2UsIGlkZW50aWZpZXIsIGFuZCBpZGVudGlmaWVyLXN0YXJ0IGNhdGVnb3JpZXMuIFRoZXNlXG4vLyBhcmUgb25seSBhcHBsaWVkIHdoZW4gYSBjaGFyYWN0ZXIgaXMgZm91bmQgdG8gYWN0dWFsbHkgaGF2ZSBhXG4vLyBjb2RlIHBvaW50IGJldHdlZW4gMHg4MCBhbmQgMHhmZmZmLlxuLy8gR2VuZXJhdGVkIGJ5IGBzY3JpcHRzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmxldCBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzID0gXCJcXHhhYVxceGI1XFx4YmFcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJjMVxcdTAyYzYtXFx1MDJkMVxcdTAyZTAtXFx1MDJlNFxcdTAyZWNcXHUwMmVlXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdhLVxcdTAzN2RcXHUwMzdmXFx1MDM4NlxcdTAzODgtXFx1MDM4YVxcdTAzOGNcXHUwMzhlLVxcdTAzYTFcXHUwM2EzLVxcdTAzZjVcXHUwM2Y3LVxcdTA0ODFcXHUwNDhhLVxcdTA1MmZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MC1cXHUwNTg4XFx1MDVkMC1cXHUwNWVhXFx1MDVlZi1cXHUwNWYyXFx1MDYyMC1cXHUwNjRhXFx1MDY2ZVxcdTA2NmZcXHUwNjcxLVxcdTA2ZDNcXHUwNmQ1XFx1MDZlNVxcdTA2ZTZcXHUwNmVlXFx1MDZlZlxcdTA2ZmEtXFx1MDZmY1xcdTA2ZmZcXHUwNzEwXFx1MDcxMi1cXHUwNzJmXFx1MDc0ZC1cXHUwN2E1XFx1MDdiMVxcdTA3Y2EtXFx1MDdlYVxcdTA3ZjRcXHUwN2Y1XFx1MDdmYVxcdTA4MDAtXFx1MDgxNVxcdTA4MWFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4NjAtXFx1MDg2YVxcdTA4NzAtXFx1MDg4N1xcdTA4ODktXFx1MDg4ZVxcdTA4YTAtXFx1MDhjOVxcdTA5MDQtXFx1MDkzOVxcdTA5M2RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThjXFx1MDk4ZlxcdTA5OTBcXHUwOTkzLVxcdTA5YThcXHUwOWFhLVxcdTA5YjBcXHUwOWIyXFx1MDliNi1cXHUwOWI5XFx1MDliZFxcdTA5Y2VcXHUwOWRjXFx1MDlkZFxcdTA5ZGYtXFx1MDllMVxcdTA5ZjBcXHUwOWYxXFx1MDlmY1xcdTBhMDUtXFx1MGEwYVxcdTBhMGZcXHUwYTEwXFx1MGExMy1cXHUwYTI4XFx1MGEyYS1cXHUwYTMwXFx1MGEzMlxcdTBhMzNcXHUwYTM1XFx1MGEzNlxcdTBhMzhcXHUwYTM5XFx1MGE1OS1cXHUwYTVjXFx1MGE1ZVxcdTBhNzItXFx1MGE3NFxcdTBhODUtXFx1MGE4ZFxcdTBhOGYtXFx1MGE5MVxcdTBhOTMtXFx1MGFhOFxcdTBhYWEtXFx1MGFiMFxcdTBhYjJcXHUwYWIzXFx1MGFiNS1cXHUwYWI5XFx1MGFiZFxcdTBhZDBcXHUwYWUwXFx1MGFlMVxcdTBhZjlcXHUwYjA1LVxcdTBiMGNcXHUwYjBmXFx1MGIxMFxcdTBiMTMtXFx1MGIyOFxcdTBiMmEtXFx1MGIzMFxcdTBiMzJcXHUwYjMzXFx1MGIzNS1cXHUwYjM5XFx1MGIzZFxcdTBiNWNcXHUwYjVkXFx1MGI1Zi1cXHUwYjYxXFx1MGI3MVxcdTBiODNcXHUwYjg1LVxcdTBiOGFcXHUwYjhlLVxcdTBiOTBcXHUwYjkyLVxcdTBiOTVcXHUwYjk5XFx1MGI5YVxcdTBiOWNcXHUwYjllXFx1MGI5ZlxcdTBiYTNcXHUwYmE0XFx1MGJhOC1cXHUwYmFhXFx1MGJhZS1cXHUwYmI5XFx1MGJkMFxcdTBjMDUtXFx1MGMwY1xcdTBjMGUtXFx1MGMxMFxcdTBjMTItXFx1MGMyOFxcdTBjMmEtXFx1MGMzOVxcdTBjM2RcXHUwYzU4LVxcdTBjNWFcXHUwYzVkXFx1MGM2MFxcdTBjNjFcXHUwYzgwXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZFxcdTBjZGRcXHUwY2RlXFx1MGNlMFxcdTBjZTFcXHUwY2YxXFx1MGNmMlxcdTBkMDQtXFx1MGQwY1xcdTBkMGUtXFx1MGQxMFxcdTBkMTItXFx1MGQzYVxcdTBkM2RcXHUwZDRlXFx1MGQ1NC1cXHUwZDU2XFx1MGQ1Zi1cXHUwZDYxXFx1MGQ3YS1cXHUwZDdmXFx1MGQ4NS1cXHUwZDk2XFx1MGQ5YS1cXHUwZGIxXFx1MGRiMy1cXHUwZGJiXFx1MGRiZFxcdTBkYzAtXFx1MGRjNlxcdTBlMDEtXFx1MGUzMFxcdTBlMzJcXHUwZTMzXFx1MGU0MC1cXHUwZTQ2XFx1MGU4MVxcdTBlODJcXHUwZTg0XFx1MGU4Ni1cXHUwZThhXFx1MGU4Yy1cXHUwZWEzXFx1MGVhNVxcdTBlYTctXFx1MGViMFxcdTBlYjJcXHUwZWIzXFx1MGViZFxcdTBlYzAtXFx1MGVjNFxcdTBlYzZcXHUwZWRjLVxcdTBlZGZcXHUwZjAwXFx1MGY0MC1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY4OC1cXHUwZjhjXFx1MTAwMC1cXHUxMDJhXFx1MTAzZlxcdTEwNTAtXFx1MTA1NVxcdTEwNWEtXFx1MTA1ZFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNmUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOGVcXHUxMGEwLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTBmYVxcdTEwZmMtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y1XFx1MTNmOC1cXHUxM2ZkXFx1MTQwMS1cXHUxNjZjXFx1MTY2Zi1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmVhXFx1MTZlZS1cXHUxNmY4XFx1MTcwMC1cXHUxNzExXFx1MTcxZi1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZjXFx1MTc2ZS1cXHUxNzcwXFx1MTc4MC1cXHUxN2IzXFx1MTdkN1xcdTE3ZGNcXHUxODIwLVxcdTE4NzhcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFlXFx1MTk1MC1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTliMC1cXHUxOWM5XFx1MWEwMC1cXHUxYTE2XFx1MWEyMC1cXHUxYTU0XFx1MWFhN1xcdTFiMDUtXFx1MWIzM1xcdTFiNDUtXFx1MWI0Y1xcdTFiODMtXFx1MWJhMFxcdTFiYWVcXHUxYmFmXFx1MWJiYS1cXHUxYmU1XFx1MWMwMC1cXHUxYzIzXFx1MWM0ZC1cXHUxYzRmXFx1MWM1YS1cXHUxYzdkXFx1MWM4MC1cXHUxYzg4XFx1MWM5MC1cXHUxY2JhXFx1MWNiZC1cXHUxY2JmXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YzXFx1MWNmNVxcdTFjZjZcXHUxY2ZhXFx1MWQwMC1cXHUxZGJmXFx1MWUwMC1cXHUxZjE1XFx1MWYxOC1cXHUxZjFkXFx1MWYyMC1cXHUxZjQ1XFx1MWY0OC1cXHUxZjRkXFx1MWY1MC1cXHUxZjU3XFx1MWY1OVxcdTFmNWJcXHUxZjVkXFx1MWY1Zi1cXHUxZjdkXFx1MWY4MC1cXHUxZmI0XFx1MWZiNi1cXHUxZmJjXFx1MWZiZVxcdTFmYzItXFx1MWZjNFxcdTFmYzYtXFx1MWZjY1xcdTFmZDAtXFx1MWZkM1xcdTFmZDYtXFx1MWZkYlxcdTFmZTAtXFx1MWZlY1xcdTFmZjItXFx1MWZmNFxcdTFmZjYtXFx1MWZmY1xcdTIwNzFcXHUyMDdmXFx1MjA5MC1cXHUyMDljXFx1MjEwMlxcdTIxMDdcXHUyMTBhLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFkXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyYS1cXHUyMTM5XFx1MjEzYy1cXHUyMTNmXFx1MjE0NS1cXHUyMTQ5XFx1MjE0ZVxcdTIxNjAtXFx1MjE4OFxcdTJjMDAtXFx1MmNlNFxcdTJjZWItXFx1MmNlZVxcdTJjZjJcXHUyY2YzXFx1MmQwMC1cXHUyZDI1XFx1MmQyN1xcdTJkMmRcXHUyZDMwLVxcdTJkNjdcXHUyZDZmXFx1MmQ4MC1cXHUyZDk2XFx1MmRhMC1cXHUyZGE2XFx1MmRhOC1cXHUyZGFlXFx1MmRiMC1cXHUyZGI2XFx1MmRiOC1cXHUyZGJlXFx1MmRjMC1cXHUyZGM2XFx1MmRjOC1cXHUyZGNlXFx1MmRkMC1cXHUyZGQ2XFx1MmRkOC1cXHUyZGRlXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNjXFx1MzA0MS1cXHUzMDk2XFx1MzA5Yi1cXHUzMDlmXFx1MzBhMS1cXHUzMGZhXFx1MzBmYy1cXHUzMGZmXFx1MzEwNS1cXHUzMTJmXFx1MzEzMS1cXHUzMThlXFx1MzFhMC1cXHUzMWJmXFx1MzFmMC1cXHUzMWZmXFx1MzQwMC1cXHU0ZGJmXFx1NGUwMC1cXHVhNDhjXFx1YTRkMC1cXHVhNGZkXFx1YTUwMC1cXHVhNjBjXFx1YTYxMC1cXHVhNjFmXFx1YTYyYVxcdWE2MmJcXHVhNjQwLVxcdWE2NmVcXHVhNjdmLVxcdWE2OWRcXHVhNmEwLVxcdWE2ZWZcXHVhNzE3LVxcdWE3MWZcXHVhNzIyLVxcdWE3ODhcXHVhNzhiLVxcdWE3Y2FcXHVhN2QwXFx1YTdkMVxcdWE3ZDNcXHVhN2Q1LVxcdWE3ZDlcXHVhN2YyLVxcdWE4MDFcXHVhODAzLVxcdWE4MDVcXHVhODA3LVxcdWE4MGFcXHVhODBjLVxcdWE4MjJcXHVhODQwLVxcdWE4NzNcXHVhODgyLVxcdWE4YjNcXHVhOGYyLVxcdWE4ZjdcXHVhOGZiXFx1YThmZFxcdWE4ZmVcXHVhOTBhLVxcdWE5MjVcXHVhOTMwLVxcdWE5NDZcXHVhOTYwLVxcdWE5N2NcXHVhOTg0LVxcdWE5YjJcXHVhOWNmXFx1YTllMC1cXHVhOWU0XFx1YTllNi1cXHVhOWVmXFx1YTlmYS1cXHVhOWZlXFx1YWEwMC1cXHVhYTI4XFx1YWE0MC1cXHVhYTQyXFx1YWE0NC1cXHVhYTRiXFx1YWE2MC1cXHVhYTc2XFx1YWE3YVxcdWFhN2UtXFx1YWFhZlxcdWFhYjFcXHVhYWI1XFx1YWFiNlxcdWFhYjktXFx1YWFiZFxcdWFhYzBcXHVhYWMyXFx1YWFkYi1cXHVhYWRkXFx1YWFlMC1cXHVhYWVhXFx1YWFmMi1cXHVhYWY0XFx1YWIwMS1cXHVhYjA2XFx1YWIwOS1cXHVhYjBlXFx1YWIxMS1cXHVhYjE2XFx1YWIyMC1cXHVhYjI2XFx1YWIyOC1cXHVhYjJlXFx1YWIzMC1cXHVhYjVhXFx1YWI1Yy1cXHVhYjY5XFx1YWI3MC1cXHVhYmUyXFx1YWMwMC1cXHVkN2EzXFx1ZDdiMC1cXHVkN2M2XFx1ZDdjYi1cXHVkN2ZiXFx1ZjkwMC1cXHVmYTZkXFx1ZmE3MC1cXHVmYWQ5XFx1ZmIwMC1cXHVmYjA2XFx1ZmIxMy1cXHVmYjE3XFx1ZmIxZFxcdWZiMWYtXFx1ZmIyOFxcdWZiMmEtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwXFx1ZmI0MVxcdWZiNDNcXHVmYjQ0XFx1ZmI0Ni1cXHVmYmIxXFx1ZmJkMy1cXHVmZDNkXFx1ZmQ1MC1cXHVmZDhmXFx1ZmQ5Mi1cXHVmZGM3XFx1ZmRmMC1cXHVmZGZiXFx1ZmU3MC1cXHVmZTc0XFx1ZmU3Ni1cXHVmZWZjXFx1ZmYyMS1cXHVmZjNhXFx1ZmY0MS1cXHVmZjVhXFx1ZmY2Ni1cXHVmZmJlXFx1ZmZjMi1cXHVmZmM3XFx1ZmZjYS1cXHVmZmNmXFx1ZmZkMi1cXHVmZmQ3XFx1ZmZkYS1cXHVmZmRjXCI7XG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmxldCBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IFwiXFx1MjAwY1xcdTIwMGRcXHhiN1xcdTAzMDAtXFx1MDM2ZlxcdTAzODdcXHUwNDgzLVxcdTA0ODdcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NjlcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZi1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNmYwLVxcdTA2ZjlcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdjMC1cXHUwN2M5XFx1MDdlYi1cXHUwN2YzXFx1MDdmZFxcdTA4MTYtXFx1MDgxOVxcdTA4MWItXFx1MDgyM1xcdTA4MjUtXFx1MDgyN1xcdTA4MjktXFx1MDgyZFxcdTA4NTktXFx1MDg1YlxcdTA4OTgtXFx1MDg5ZlxcdTA4Y2EtXFx1MDhlMVxcdTA4ZTMtXFx1MDkwM1xcdTA5M2EtXFx1MDkzY1xcdTA5M2UtXFx1MDk0ZlxcdTA5NTEtXFx1MDk1N1xcdTA5NjJcXHUwOTYzXFx1MDk2Ni1cXHUwOTZmXFx1MDk4MS1cXHUwOTgzXFx1MDliY1xcdTA5YmUtXFx1MDljNFxcdTA5YzdcXHUwOWM4XFx1MDljYi1cXHUwOWNkXFx1MDlkN1xcdTA5ZTJcXHUwOWUzXFx1MDllNi1cXHUwOWVmXFx1MDlmZVxcdTBhMDEtXFx1MGEwM1xcdTBhM2NcXHUwYTNlLVxcdTBhNDJcXHUwYTQ3XFx1MGE0OFxcdTBhNGItXFx1MGE0ZFxcdTBhNTFcXHUwYTY2LVxcdTBhNzFcXHUwYTc1XFx1MGE4MS1cXHUwYTgzXFx1MGFiY1xcdTBhYmUtXFx1MGFjNVxcdTBhYzctXFx1MGFjOVxcdTBhY2ItXFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGFlNi1cXHUwYWVmXFx1MGFmYS1cXHUwYWZmXFx1MGIwMS1cXHUwYjAzXFx1MGIzY1xcdTBiM2UtXFx1MGI0NFxcdTBiNDdcXHUwYjQ4XFx1MGI0Yi1cXHUwYjRkXFx1MGI1NS1cXHUwYjU3XFx1MGI2MlxcdTBiNjNcXHUwYjY2LVxcdTBiNmZcXHUwYjgyXFx1MGJiZS1cXHUwYmMyXFx1MGJjNi1cXHUwYmM4XFx1MGJjYS1cXHUwYmNkXFx1MGJkN1xcdTBiZTYtXFx1MGJlZlxcdTBjMDAtXFx1MGMwNFxcdTBjM2NcXHUwYzNlLVxcdTBjNDRcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGM2Ni1cXHUwYzZmXFx1MGM4MS1cXHUwYzgzXFx1MGNiY1xcdTBjYmUtXFx1MGNjNFxcdTBjYzYtXFx1MGNjOFxcdTBjY2EtXFx1MGNjZFxcdTBjZDVcXHUwY2Q2XFx1MGNlMlxcdTBjZTNcXHUwY2U2LVxcdTBjZWZcXHUwY2YzXFx1MGQwMC1cXHUwZDAzXFx1MGQzYlxcdTBkM2NcXHUwZDNlLVxcdTBkNDRcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZDY2LVxcdTBkNmZcXHUwZDgxLVxcdTBkODNcXHUwZGNhXFx1MGRjZi1cXHUwZGQ0XFx1MGRkNlxcdTBkZDgtXFx1MGRkZlxcdTBkZTYtXFx1MGRlZlxcdTBkZjJcXHUwZGYzXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlNTAtXFx1MGU1OVxcdTBlYjFcXHUwZWI0LVxcdTBlYmNcXHUwZWM4LVxcdTBlY2VcXHUwZWQwLVxcdTBlZDlcXHUwZjE4XFx1MGYxOVxcdTBmMjAtXFx1MGYyOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmM2VcXHUwZjNmXFx1MGY3MS1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjhkLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyYi1cXHUxMDNlXFx1MTA0MC1cXHUxMDQ5XFx1MTA1Ni1cXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA2Mi1cXHUxMDY0XFx1MTA2Ny1cXHUxMDZkXFx1MTA3MS1cXHUxMDc0XFx1MTA4Mi1cXHUxMDhkXFx1MTA4Zi1cXHUxMDlkXFx1MTM1ZC1cXHUxMzVmXFx1MTM2OS1cXHUxMzcxXFx1MTcxMi1cXHUxNzE1XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjQtXFx1MTdkM1xcdTE3ZGRcXHUxN2UwLVxcdTE3ZTlcXHUxODBiLVxcdTE4MGRcXHUxODBmLVxcdTE4MTlcXHUxOGE5XFx1MTkyMC1cXHUxOTJiXFx1MTkzMC1cXHUxOTNiXFx1MTk0Ni1cXHUxOTRmXFx1MTlkMC1cXHUxOWRhXFx1MWExNy1cXHUxYTFiXFx1MWE1NS1cXHUxYTVlXFx1MWE2MC1cXHUxYTdjXFx1MWE3Zi1cXHUxYTg5XFx1MWE5MC1cXHUxYTk5XFx1MWFiMC1cXHUxYWJkXFx1MWFiZi1cXHUxYWNlXFx1MWIwMC1cXHUxYjA0XFx1MWIzNC1cXHUxYjQ0XFx1MWI1MC1cXHUxYjU5XFx1MWI2Yi1cXHUxYjczXFx1MWI4MC1cXHUxYjgyXFx1MWJhMS1cXHUxYmFkXFx1MWJiMC1cXHUxYmI5XFx1MWJlNi1cXHUxYmYzXFx1MWMyNC1cXHUxYzM3XFx1MWM0MC1cXHUxYzQ5XFx1MWM1MC1cXHUxYzU5XFx1MWNkMC1cXHUxY2QyXFx1MWNkNC1cXHUxY2U4XFx1MWNlZFxcdTFjZjRcXHUxY2Y3LVxcdTFjZjlcXHUxZGMwLVxcdTFkZmZcXHUyMDNmXFx1MjA0MFxcdTIwNTRcXHUyMGQwLVxcdTIwZGNcXHUyMGUxXFx1MjBlNS1cXHUyMGYwXFx1MmNlZi1cXHUyY2YxXFx1MmQ3ZlxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTYyMC1cXHVhNjI5XFx1YTY2ZlxcdWE2NzQtXFx1YTY3ZFxcdWE2OWVcXHVhNjlmXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODIzLVxcdWE4MjdcXHVhODJjXFx1YTg4MFxcdWE4ODFcXHVhOGI0LVxcdWE4YzVcXHVhOGQwLVxcdWE4ZDlcXHVhOGUwLVxcdWE4ZjFcXHVhOGZmLVxcdWE5MDlcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTNcXHVhOTgwLVxcdWE5ODNcXHVhOWIzLVxcdWE5YzBcXHVhOWQwLVxcdWE5ZDlcXHVhOWU1XFx1YTlmMC1cXHVhOWY5XFx1YWEyOS1cXHVhYTM2XFx1YWE0M1xcdWFhNGNcXHVhYTRkXFx1YWE1MC1cXHVhYTU5XFx1YWE3Yi1cXHVhYTdkXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWFlYi1cXHVhYWVmXFx1YWFmNVxcdWFhZjZcXHVhYmUzLVxcdWFiZWFcXHVhYmVjXFx1YWJlZFxcdWFiZjAtXFx1YWJmOVxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMmZcXHVmZTMzXFx1ZmUzNFxcdWZlNGQtXFx1ZmU0ZlxcdWZmMTAtXFx1ZmYxOVxcdWZmM2ZcIjtcblxuY29uc3Qgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQgPSBuZXcgUmVnRXhwKFxuICBcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBcIl1cIixcbik7XG5jb25zdCBub25BU0NJSWlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKFxuICBcIltcIiArIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgKyBub25BU0NJSWlkZW50aWZpZXJDaGFycyArIFwiXVwiLFxuKTtcblxubm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gbnVsbDtcblxuLy8gVGhlc2UgYXJlIGEgcnVuLWxlbmd0aCBhbmQgb2Zmc2V0LWVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4vLyA+MHhmZmZmIGNvZGUgcG9pbnRzIHRoYXQgYXJlIGEgdmFsaWQgcGFydCBvZiBpZGVudGlmaWVycy4gVGhlXG4vLyBvZmZzZXQgc3RhcnRzIGF0IDB4MTAwMDAsIGFuZCBlYWNoIHBhaXIgb2YgbnVtYmVycyByZXByZXNlbnRzIGFuXG4vLyBvZmZzZXQgdG8gdGhlIG5leHQgcmFuZ2UsIGFuZCB0aGVuIGEgc2l6ZSBvZiB0aGUgcmFuZ2UuIFRoZXkgd2VyZVxuLy8gZ2VuZXJhdGVkIGJ5IGBzY3JpcHRzL2dlbmVyYXRlLWlkZW50aWZpZXItcmVnZXguanNgLlxuLyogcHJldHRpZXItaWdub3JlICovXG5jb25zdCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcyA9IFswLDExLDIsMjUsMiwxOCwyLDEsMiwxNCwzLDEzLDM1LDEyMiw3MCw1MiwyNjgsMjgsNCw0OCw0OCwzMSwxNCwyOSw2LDM3LDExLDI5LDMsMzUsNSw3LDIsNCw0MywxNTcsMTksMzUsNSwzNSw1LDM5LDksNTEsMTMsMTAsMiwxNCwyLDYsMiwxLDIsMTAsMiwxNCwyLDYsMiwxLDY4LDMxMCwxMCwyMSwxMSw3LDI1LDUsMiw0MSwyLDgsNzAsNSwzLDAsMiw0MywyLDEsNCwwLDMsMjIsMTEsMjIsMTAsMzAsNjYsMTgsMiwxLDExLDIxLDExLDI1LDcxLDU1LDcsMSw2NSwwLDE2LDMsMiwyLDIsMjgsNDMsMjgsNCwyOCwzNiw3LDIsMjcsMjgsNTMsMTEsMjEsMTEsMTgsMTQsMTcsMTExLDcyLDU2LDUwLDE0LDUwLDE0LDM1LDM0OSw0MSw3LDEsNzksMjgsMTEsMCw5LDIxLDQzLDE3LDQ3LDIwLDI4LDIyLDEzLDUyLDU4LDEsMywwLDE0LDQ0LDMzLDI0LDI3LDM1LDMwLDAsMywwLDksMzQsNCwwLDEzLDQ3LDE1LDMsMjIsMCwyLDAsMzYsMTcsMiwyNCwyMCwxLDY0LDYsMiwwLDIsMywyLDE0LDIsOSw4LDQ2LDM5LDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsNCwwLDE5LDAsMTMsNCwxNTksNTIsMTksMywyMSwyLDMxLDQ3LDIxLDEsMiwwLDE4NSw0Niw0MiwzLDM3LDQ3LDIxLDAsNjAsNDIsMTQsMCw3MiwyNiwzOCw2LDE4Niw0MywxMTcsNjMsMzIsNywzLDAsMyw3LDIsMSwyLDIzLDE2LDAsMiwwLDk1LDcsMywzOCwxNywwLDIsMCwyOSwwLDExLDM5LDgsMCwyMiwwLDEyLDQ1LDIwLDAsMTksNzIsMjY0LDgsMiwzNiwxOCwwLDUwLDI5LDExMyw2LDIsMSwyLDM3LDIyLDAsMjYsNSwyLDEsMiwzMSwxNSwwLDMyOCwxOCwxNiwwLDIsMTIsMiwzMywxMjUsMCw4MCw5MjEsMTAzLDExMCwxOCwxOTUsMjYzNyw5NiwxNiwxMDcxLDE4LDUsNDAyNiw1ODIsODYzNCw1NjgsOCwzMCwxOCw3OCwxOCwyOSwxOSw0NywxNywzLDMyLDIwLDYsMTgsNjg5LDYzLDEyOSw3NCw2LDAsNjcsMTIsNjUsMSwyLDAsMjksNjEzNSw5LDEyMzcsNDMsOCw4OTM2LDMsMiw2LDIsMSwyLDI5MCwxNiwwLDMwLDIsMywwLDE1LDMsOSwzOTUsMjMwOSwxMDYsNiwxMiw0LDgsOCw5LDU5OTEsODQsMiw3MCwyLDEsMywwLDMsMSwzLDMsMiwxMSwyLDAsMiw2LDIsNjQsMiwzLDMsNywyLDYsMiwyNywyLDMsMiw0LDIsMCw0LDYsMiwzMzksMywyNCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDcsMTg0NSwzMCw3LDUsMjYyLDYxLDE0Nyw0NCwxMSw2LDE3LDAsMzIyLDI5LDE5LDQzLDQ4NSwyNyw3NTcsNiwyLDMsMiwxLDIsMTQsMiwxOTYsNjAsNjcsOCwwLDEyMDUsMywyLDI2LDIsMSwyLDAsMywwLDIsOSwyLDMsMiwwLDIsMCw3LDAsNSwwLDIsMCwyLDAsMiwyLDIsMSwyLDAsMywwLDIsMCwyLDAsMiwwLDIsMCwyLDEsMiwwLDMsMywyLDYsMiwzLDIsMywyLDAsMiw5LDIsMTYsNiwyLDIsNCwyLDE2LDQ0MjEsNDI3MTksMzMsNDE1Myw3LDIyMSwzLDU3NjEsMTUsNzQ3MiwzMTA0LDU0MSwxNTA3LDQ5MzgsNiw0MTkxXTtcbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3QgYXN0cmFsSWRlbnRpZmllckNvZGVzID0gWzUwOSwwLDIyNywwLDE1MCw0LDI5NCw5LDEzNjgsMiwyLDEsNiwzLDQxLDIsNSwwLDE2NiwxLDU3NCwzLDksOSwzNzAsMSw4MSwyLDcxLDEwLDUwLDMsMTIzLDIsNTQsMTQsMzIsMTAsMywxLDExLDMsNDYsMTAsOCwwLDQ2LDksNywyLDM3LDEzLDIsOSw2LDEsNDUsMCwxMywyLDQ5LDEzLDksMywyLDExLDgzLDExLDcsMCwzLDAsMTU4LDExLDYsOSw3LDMsNTYsMSwyLDYsMywxLDMsMiwxMCwwLDExLDEsMyw2LDQsNCwxOTMsMTcsMTAsOSw1LDAsODIsMTksMTMsOSwyMTQsNiwzLDgsMjgsMSw4MywxNiwxNiw5LDgyLDEyLDksOSw4NCwxNCw1LDksMjQzLDE0LDE2Niw5LDcxLDUsMiwxLDMsMywyLDAsMiwxLDEzLDksMTIwLDYsMyw2LDQsMCwyOSw5LDQxLDYsMiwzLDksMCwxMCwxMCw0NywxNSw0MDYsNywyLDcsMTcsOSw1NywyMSwyLDEzLDEyMyw1LDQsMCwyLDEsMiw2LDIsMCw5LDksNDksNCwyLDEsMiw0LDksOSwzMzAsMywxMCwxLDIsMCw0OSw2LDQsNCwxNCw5LDUzNTEsMCw3LDE0LDEzODM1LDksODcsOSwzOSw0LDYwLDYsMjYsOSwxMDE0LDAsMiw1NCw4LDMsODIsMCwxMiwxLDE5NjI4LDEsNDcwNiw0NSwzLDIyLDU0Myw0LDQsNSw5LDcsMyw2LDMxLDMsMTQ5LDIsMTQxOCw0OSw1MTMsNTQsNSw0OSw5LDAsMTUsMCwyMyw0LDIsMTQsMTM2MSw2LDIsMTYsMyw2LDIsMSwyLDQsMTAxLDAsMTYxLDYsMTAsOSwzNTcsMCw2MiwxMyw0OTksMTMsOTgzLDYsMTEwLDYsNiw5LDQ3NTksOSw3ODc3MTksMjM5XTtcblxuLy8gVGhpcyBoYXMgYSBjb21wbGV4aXR5IGxpbmVhciB0byB0aGUgdmFsdWUgb2YgdGhlIGNvZGUuIFRoZVxuLy8gYXNzdW1wdGlvbiBpcyB0aGF0IGxvb2tpbmcgdXAgYXN0cmFsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBpc1xuLy8gcmFyZS5cbmZ1bmN0aW9uIGlzSW5Bc3RyYWxTZXQoY29kZTogbnVtYmVyLCBzZXQ6IHJlYWRvbmx5IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIGxldCBwb3MgPSAweDEwMDAwO1xuICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gc2V0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7XG4gICAgcG9zICs9IHNldFtpXTtcbiAgICBpZiAocG9zID4gY29kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcG9zICs9IHNldFtpICsgMV07XG4gICAgaWYgKHBvcyA+PSBjb2RlKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLnVwcGVyY2FzZUEpIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMuZG9sbGFyU2lnbjtcbiAgaWYgKGNvZGUgPD0gY2hhckNvZGVzLnVwcGVyY2FzZVopIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy5sb3dlcmNhc2VBKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLnVuZGVyc2NvcmU7XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy5sb3dlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPD0gMHhmZmZmKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvZGUgPj0gMHhhYSAmJiBub25BU0NJSWlkZW50aWZpZXJTdGFydC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2Rlcyk7XG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyBwYXJ0IG9mIGFuIGlkZW50aWZpZXIuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWZpZXJDaGFyKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy5kaWdpdDApIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMuZG9sbGFyU2lnbjtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMuY29sb24pIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMubG93ZXJjYXNlQSkgcmV0dXJuIGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMubG93ZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikge1xuICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJTdGFydENvZGVzKSB8fFxuICAgIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllckNvZGVzKVxuICApO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWVcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpZmllck5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21hc3Rlcjp2OC9zcmMvYnVpbHRpbnMvYnVpbHRpbnMtc3RyaW5nLWdlbi5jYztsPTE0NTU7ZHJjPTIyMWUzMzFiNDlkZmVmYWRiYzZmYTQwYjBjNjhlNmY5NzYwNmQwYjM7YnB2PTA7YnB0PTFcbiAgICAvLyBXZSByZWltcGxlbWVudCBgY29kZVBvaW50QXRgIGJlY2F1c2UgYGNvZGVQb2ludEF0YCBpcyBhIFY4IGJ1aWx0aW4gd2hpY2ggaXMgbm90IGlubGluZWQgYnkgVHVyYm9GYW4gKGFzIG9mIE05MSlcbiAgICAvLyBzaW5jZSBgbmFtZWAgaXMgbW9zdGx5IEFTQ0lJLCBhbiBpbmxpbmVkIGBjaGFyQ29kZUF0YCB3aW5zIGhlcmVcbiAgICBsZXQgY3AgPSBuYW1lLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKChjcCAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiBpICsgMSA8IG5hbWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0cmFpbCA9IG5hbWUuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgaWYgKCh0cmFpbCAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjcCA9IDB4MTAwMDAgKyAoKGNwICYgMHgzZmYpIDw8IDEwKSArICh0cmFpbCAmIDB4M2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICAgIGlmICghaXNJZGVudGlmaWVyU3RhcnQoY3ApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc0lkZW50aWZpZXJDaGFyKGNwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gIWlzRmlyc3Q7XG59XG4iLCAiY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAga2V5d29yZDogW1xuICAgIFwiYnJlYWtcIixcbiAgICBcImNhc2VcIixcbiAgICBcImNhdGNoXCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiZGVidWdnZXJcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRvXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJmaW5hbGx5XCIsXG4gICAgXCJmb3JcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJpZlwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInRocm93XCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInZhclwiLFxuICAgIFwiY29uc3RcIixcbiAgICBcIndoaWxlXCIsXG4gICAgXCJ3aXRoXCIsXG4gICAgXCJuZXdcIixcbiAgICBcInRoaXNcIixcbiAgICBcInN1cGVyXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiZXh0ZW5kc1wiLFxuICAgIFwiZXhwb3J0XCIsXG4gICAgXCJpbXBvcnRcIixcbiAgICBcIm51bGxcIixcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJpblwiLFxuICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgIFwidHlwZW9mXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJkZWxldGVcIixcbiAgXSxcbiAgc3RyaWN0OiBbXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcImxldFwiLFxuICAgIFwicGFja2FnZVwiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJwdWJsaWNcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwieWllbGRcIixcbiAgXSxcbiAgc3RyaWN0QmluZDogW1wiZXZhbFwiLCBcImFyZ3VtZW50c1wiXSxcbn07XG5jb25zdCBrZXl3b3JkcyA9IG5ldyBTZXQocmVzZXJ2ZWRXb3Jkcy5rZXl3b3JkKTtcbmNvbnN0IHJlc2VydmVkV29yZHNTdHJpY3RTZXQgPSBuZXcgU2V0KHJlc2VydmVkV29yZHMuc3RyaWN0KTtcbmNvbnN0IHJlc2VydmVkV29yZHNTdHJpY3RCaW5kU2V0ID0gbmV3IFNldChyZXNlcnZlZFdvcmRzLnN0cmljdEJpbmQpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBub24tc3RyaWN0IG1vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZywgaW5Nb2R1bGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChpbk1vZHVsZSAmJiB3b3JkID09PSBcImF3YWl0XCIpIHx8IHdvcmQgPT09IFwiZW51bVwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBub24tYmluZGluZyBzdHJpY3QgbW9kZVxuICpcbiAqIEluY2x1ZGVzIG5vbi1zdHJpY3QgcmVzZXJ2ZWQgd29yZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZywgaW5Nb2R1bGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUmVzZXJ2ZWRXb3JkKHdvcmQsIGluTW9kdWxlKSB8fCByZXNlcnZlZFdvcmRzU3RyaWN0U2V0Lmhhcyh3b3JkKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gYmluZGluZyBzdHJpY3QgbW9kZSwgYnV0IGl0IGlzIGFsbG93ZWQgYXNcbiAqIGEgbm9ybWFsIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkKHdvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVzZXJ2ZWRXb3Jkc1N0cmljdEJpbmRTZXQuaGFzKHdvcmQpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB3b3JkIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBiaW5kaW5nIHN0cmljdCBtb2RlXG4gKlxuICogSW5jbHVkZXMgbm9uLXN0cmljdCByZXNlcnZlZCB3b3JkcyBhbmQgbm9uLWJpbmRpbmcgc3RyaWN0IHJlc2VydmVkIHdvcmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQoXG4gIHdvcmQ6IHN0cmluZyxcbiAgaW5Nb2R1bGU6IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1N0cmljdFJlc2VydmVkV29yZCh3b3JkLCBpbk1vZHVsZSkgfHwgaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCh3b3JkKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLZXl3b3JkKHdvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5d29yZHMuaGFzKHdvcmQpO1xufVxuIiwgIi8qIGVzbGludCBtYXgtbGVuOiAwICovXG5cbmltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJTdGFydCB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbmV4cG9ydCB7XG4gIGlzSWRlbnRpZmllclN0YXJ0LFxuICBpc0lkZW50aWZpZXJDaGFyLFxuICBpc1Jlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkLFxuICBpc1N0cmljdFJlc2VydmVkV29yZCxcbiAgaXNLZXl3b3JkLFxufSBmcm9tIFwiQGJhYmVsL2hlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllclwiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4vLyBUZXN0IHdoZXRoZXIgYSBjdXJyZW50IHN0YXRlIGNoYXJhY3RlciBjb2RlIGFuZCBuZXh0IGNoYXJhY3RlciBjb2RlIGlzIEBcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlcmF0b3JTdGFydChcbiAgY3VycmVudDogbnVtYmVyLFxuICBuZXh0OiBudW1iZXIsXG4gIG5leHQyOiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdXJyZW50ID09PSBjaGFyQ29kZXMuYXRTaWduICYmXG4gICAgbmV4dCA9PT0gY2hhckNvZGVzLmF0U2lnbiAmJlxuICAgIGlzSWRlbnRpZmllclN0YXJ0KG5leHQyKVxuICApO1xufVxuXG4vLyBUaGlzIGlzIHRoZSBjb21wcmVoZW5zaXZlIHNldCBvZiBKYXZhU2NyaXB0IHJlc2VydmVkIHdvcmRzXG4vLyBJZiBhIHdvcmQgaXMgaW4gdGhpcyBzZXQsIGl0IGNvdWxkIGJlIGEgcmVzZXJ2ZWQgd29yZCxcbi8vIGRlcGVuZGluZyBvbiBzb3VyY2VUeXBlL3N0cmljdE1vZGUvYmluZGluZyBpbmZvLiBJbiBvdGhlciB3b3Jkc1xuLy8gaWYgYSB3b3JkIGlzIG5vdCBpbiB0aGlzIHNldCwgaXQgaXMgbm90IGEgcmVzZXJ2ZWQgd29yZCB1bmRlclxuLy8gYW55IGNpcmN1bXN0YW5jZS5cbmNvbnN0IHJlc2VydmVkV29yZExpa2VTZXQgPSBuZXcgU2V0KFtcbiAgXCJicmVha1wiLFxuICBcImNhc2VcIixcbiAgXCJjYXRjaFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZG9cIixcbiAgXCJlbHNlXCIsXG4gIFwiZmluYWxseVwiLFxuICBcImZvclwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwiaWZcIixcbiAgXCJyZXR1cm5cIixcbiAgXCJzd2l0Y2hcIixcbiAgXCJ0aHJvd1wiLFxuICBcInRyeVwiLFxuICBcInZhclwiLFxuICBcImNvbnN0XCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aXRoXCIsXG4gIFwibmV3XCIsXG4gIFwidGhpc1wiLFxuICBcInN1cGVyXCIsXG4gIFwiY2xhc3NcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZXhwb3J0XCIsXG4gIFwiaW1wb3J0XCIsXG4gIFwibnVsbFwiLFxuICBcInRydWVcIixcbiAgXCJmYWxzZVwiLFxuICBcImluXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcInR5cGVvZlwiLFxuICBcInZvaWRcIixcbiAgXCJkZWxldGVcIixcbiAgLy8gc3RyaWN0XG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxldFwiLFxuICBcInBhY2thZ2VcIixcbiAgXCJwcml2YXRlXCIsXG4gIFwicHJvdGVjdGVkXCIsXG4gIFwicHVibGljXCIsXG4gIFwic3RhdGljXCIsXG4gIFwieWllbGRcIixcbiAgLy8gc3RyaWN0QmluZFxuICBcImV2YWxcIixcbiAgXCJhcmd1bWVudHNcIixcbiAgLy8gcmVzZXJ2ZWRXb3JrTGlrZVxuICBcImVudW1cIixcbiAgXCJhd2FpdFwiLFxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW5CZVJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc2VydmVkV29yZExpa2VTZXQuaGFzKHdvcmQpO1xufVxuIiwgIi8vIEVhY2ggc2NvcGUgZ2V0cyBhIGJpdHNldCB0aGF0IG1heSBjb250YWluIHRoZXNlIGZsYWdzXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCBjb25zdCBTQ09QRV9PVEhFUiAgICAgICAgPSAwYjAwMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9QUk9HUkFNICAgICAgPSAwYjAwMDAwMDAwMSxcbiAgICAgICAgICAgICBTQ09QRV9GVU5DVElPTiAgICAgPSAwYjAwMDAwMDAxMCxcbiAgICAgICAgICAgICBTQ09QRV9BUlJPVyAgICAgICAgPSAwYjAwMDAwMDEwMCxcbiAgICAgICAgICAgICBTQ09QRV9TSU1QTEVfQ0FUQ0ggPSAwYjAwMDAwMTAwMCxcbiAgICAgICAgICAgICBTQ09QRV9TVVBFUiAgICAgICAgPSAwYjAwMDAxMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9ESVJFQ1RfU1VQRVIgPSAwYjAwMDEwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9DTEFTUyAgICAgICAgPSAwYjAwMTAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9TVEFUSUNfQkxPQ0sgPSAwYjAxMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9UU19NT0RVTEUgICAgPSAwYjEwMDAwMDAwMCxcbiAgICAgICAgICAgICBTQ09QRV9WQVIgPSBTQ09QRV9QUk9HUkFNIHwgU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9TVEFUSUNfQkxPQ0sgfCBTQ09QRV9UU19NT0RVTEU7XG5cbmV4cG9ydCB0eXBlIFNjb3BlRmxhZ3MgPVxuICB8IHR5cGVvZiBTQ09QRV9PVEhFUlxuICB8IHR5cGVvZiBTQ09QRV9QUk9HUkFNXG4gIHwgdHlwZW9mIFNDT1BFX0ZVTkNUSU9OXG4gIHwgdHlwZW9mIFNDT1BFX1ZBUlxuICB8IHR5cGVvZiBTQ09QRV9BUlJPV1xuICB8IHR5cGVvZiBTQ09QRV9TSU1QTEVfQ0FUQ0hcbiAgfCB0eXBlb2YgU0NPUEVfU1VQRVJcbiAgfCB0eXBlb2YgU0NPUEVfRElSRUNUX1NVUEVSXG4gIHwgdHlwZW9mIFNDT1BFX0NMQVNTXG4gIHwgdHlwZW9mIFNDT1BFX1NUQVRJQ19CTE9DSztcblxuLy8gVGhlc2UgZmxhZ3MgYXJlIG1lYW50IHRvIGJlIF9vbmx5XyB1c2VkIGluc2lkZSB0aGUgU2NvcGUgY2xhc3MgKG9yIHN1YmNsYXNzZXMpLlxuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgY29uc3QgQklORF9LSU5EX1ZBTFVFICAgICAgICAgICAgPSAwYjAwMDAwMDBfMDAwMF8wMSxcbiAgICAgICAgICAgICBCSU5EX0tJTkRfVFlQRSAgICAgICAgICAgICA9IDBiMDAwMDAwMF8wMDAwXzEwLFxuICAgICAgICAgICAgIC8vIFVzZWQgaW4gY2hlY2tMVmFsIGFuZCBkZWNsYXJlTmFtZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYSBiaW5kaW5nXG4gICAgICAgICAgICAgQklORF9TQ09QRV9WQVIgICAgICAgICAgICAgPSAwYjAwMDAwMDBfMDAwMV8wMCwgLy8gVmFyLXN0eWxlIGJpbmRpbmdcbiAgICAgICAgICAgICBCSU5EX1NDT1BFX0xFWElDQUwgICAgICAgICA9IDBiMDAwMDAwMF8wMDEwXzAwLCAvLyBMZXQtIG9yIGNvbnN0LXN0eWxlIGJpbmRpbmdcbiAgICAgICAgICAgICBCSU5EX1NDT1BFX0ZVTkNUSU9OICAgICAgICA9IDBiMDAwMDAwMF8wMTAwXzAwLCAvLyBGdW5jdGlvbiBkZWNsYXJhdGlvblxuICAgICAgICAgICAgIEJJTkRfU0NPUEVfT1VUU0lERSAgICAgICAgID0gMGIwMDAwMDAwXzEwMDBfMDAsIC8vIFNwZWNpYWwgY2FzZSBmb3IgZnVuY3Rpb24gbmFtZXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kIGluc2lkZSB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAvLyBNaXNjIGZsYWdzXG4gICAgICAgICAgICAgQklORF9GTEFHU19OT05FICAgICAgICAgICAgPSAwYjAwMDAwMDAxXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19DTEFTUyAgICAgICAgICAgPSAwYjAwMDAwMDEwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19FTlVNICAgICAgICAgPSAwYjAwMDAwMTAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19DT05TVF9FTlVNICAgPSAwYjAwMDAxMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19FWFBPUlRfT05MWSAgPSAwYjAwMDEwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19GTE9XX0RFQ0xBUkVfRk4gPSAwYjAwMTAwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgQklORF9GTEFHU19UU19JTVBPUlQgICAgICAgPSAwYjAxMDAwMDAwXzAwMDBfMDAsXG4gICAgICAgICAgICAgLy8gV2hldGhlciBcImxldFwiIHNob3VsZCBiZSBhbGxvd2VkIGluIGJvdW5kIG5hbWVzIGluIHNsb3BweSBtb2RlXG4gICAgICAgICAgICAgQklORF9GTEFHU19OT19MRVRfSU5fTEVYSUNBTCA9IDBiMTAwMDAwMDBfMDAwMF8wMDtcblxuLy8gVGhlc2UgZmxhZ3MgYXJlIG1lYW50IHRvIGJlIF9vbmx5XyB1c2VkIGJ5IFNjb3BlIGNvbnN1bWVyc1xuLy8gcHJldHRpZXItaWdub3JlXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gICAgaXMgdmFsdWU/ICAgIHwgICAgaXMgdHlwZT8gICAgfCAgICAgIHNjb3BlICAgICAgICAgIHwgICAgbWlzYyBmbGFncyAgICAqL1xuZXhwb3J0IGNvbnN0IEJJTkRfQ0xBU1MgICAgICAgICA9IEJJTkRfS0lORF9WQUxVRSB8IEJJTkRfS0lORF9UWVBFIHwgQklORF9TQ09QRV9MRVhJQ0FMICB8IEJJTkRfRkxBR1NfQ0xBU1N8QklORF9GTEFHU19OT19MRVRfSU5fTEVYSUNBTCxcbiAgICAgICAgICAgICBCSU5EX0xFWElDQUwgICAgICAgPSBCSU5EX0tJTkRfVkFMVUUgfCAwICAgICAgICAgICAgICB8IEJJTkRfU0NPUEVfTEVYSUNBTCAgfCBCSU5EX0ZMQUdTX05PX0xFVF9JTl9MRVhJQ0FMLFxuICAgICAgICAgICAgIEJJTkRfQ0FUQ0hfUEFSQU0gICA9IEJJTkRfS0lORF9WQUxVRSB8IDAgICAgICAgICAgICAgIHwgQklORF9TQ09QRV9MRVhJQ0FMICB8IDAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICBCSU5EX1ZBUiAgICAgICAgICAgPSBCSU5EX0tJTkRfVkFMVUUgfCAwICAgICAgICAgICAgICB8IEJJTkRfU0NPUEVfVkFSICAgICAgfCAwICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgQklORF9GVU5DVElPTiAgICAgID0gQklORF9LSU5EX1ZBTFVFIHwgMCAgICAgICAgICAgICAgfCBCSU5EX1NDT1BFX0ZVTkNUSU9OIHwgMCAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfVFNfSU5URVJGQUNFICA9IDAgICAgICAgICAgICAgICB8IEJJTkRfS0lORF9UWVBFIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfQ0xBU1MgICxcbiAgICAgICAgICAgICBCSU5EX1RTX1RZUEUgICAgICAgPSAwICAgICAgICAgICAgICAgfCBCSU5EX0tJTkRfVFlQRSB8IDAgICAgICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgQklORF9UU19FTlVNICAgICAgID0gQklORF9LSU5EX1ZBTFVFIHwgQklORF9LSU5EX1RZUEUgfCBCSU5EX1NDT1BFX0xFWElDQUwgIHwgQklORF9GTEFHU19UU19FTlVNfEJJTkRfRkxBR1NfTk9fTEVUX0lOX0xFWElDQUwsXG4gICAgICAgICAgICAgQklORF9UU19BTUJJRU5UICAgID0gMCAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZLFxuICAgICAgICAgICAgIC8vIFRoZXNlIGJpbmRpbmdzIGRvbid0IGludHJvZHVjZSBhbnl0aGluZyBpbiB0aGUgc2NvcGUuIFRoZXkgYXJlIHVzZWQgZm9yIGFzc2lnbm1lbnRzIGFuZFxuICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zIElEcy5cbiAgICAgICAgICAgICBCSU5EX05PTkUgICAgICAgICAgPSAwICAgICAgICAgICAgICAgfCAwICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgICAgICAgfCBCSU5EX0ZMQUdTX05PTkUgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfT1VUU0lERSAgICAgICA9IEJJTkRfS0lORF9WQUxVRSB8IDAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfTk9ORSAgICAgICAgICAsXG5cbiAgICAgICAgICAgICBCSU5EX1RTX0NPTlNUX0VOVU0gPSBCSU5EX1RTX0VOVU0gICAgfCBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgIEJJTkRfVFNfTkFNRVNQQUNFICA9IDAgICAgICAgICAgICAgICB8IDAgICAgICAgICAgICAgIHwgMCAgICAgICAgICAgICAgICAgICB8IEJJTkRfRkxBR1NfVFNfRVhQT1JUX09OTFksXG4gICAgICAgICAgICAgQklORF9UU19UWVBFX0lNUE9SVD0gMCAgICAgICAgICAgICAgIHwgQklORF9LSU5EX1RZUEUgfCAwICAgICAgICAgICAgICAgICAgIHwgQklORF9GTEFHU19UU19JTVBPUlQgICAgICxcblxuICAgICAgICAgICAgIEJJTkRfRkxPV19ERUNMQVJFX0ZOID0gQklORF9GTEFHU19GTE9XX0RFQ0xBUkVfRk47XG5cbmV4cG9ydCB0eXBlIEJpbmRpbmdUeXBlcyA9XG4gIHwgdHlwZW9mIEJJTkRfTk9ORVxuICB8IHR5cGVvZiBCSU5EX09VVFNJREVcbiAgfCB0eXBlb2YgQklORF9WQVJcbiAgfCB0eXBlb2YgQklORF9MRVhJQ0FMXG4gIHwgdHlwZW9mIEJJTkRfQ0xBU1NcbiAgfCB0eXBlb2YgQklORF9GVU5DVElPTlxuICB8IHR5cGVvZiBCSU5EX1RTX0lOVEVSRkFDRVxuICB8IHR5cGVvZiBCSU5EX1RTX1RZUEVcbiAgfCB0eXBlb2YgQklORF9UU19FTlVNXG4gIHwgdHlwZW9mIEJJTkRfVFNfQU1CSUVOVFxuICB8IHR5cGVvZiBCSU5EX1RTX05BTUVTUEFDRTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgY29uc3QgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQyA9IDBiMV8wMCxcbiAgICAgICAgICAgICBDTEFTU19FTEVNRU5UX0tJTkRfR0VUVEVSID0gMGIwXzEwLFxuICAgICAgICAgICAgIENMQVNTX0VMRU1FTlRfS0lORF9TRVRURVIgPSAwYjBfMDEsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9LSU5EX0FDQ0VTU09SID0gQ0xBU1NfRUxFTUVOVF9LSU5EX0dFVFRFUiB8IENMQVNTX0VMRU1FTlRfS0lORF9TRVRURVI7XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IGNvbnN0IENMQVNTX0VMRU1FTlRfU1RBVElDX0dFVFRFUiAgID0gQ0xBU1NfRUxFTUVOVF9LSU5EX0dFVFRFUiB8IENMQVNTX0VMRU1FTlRfRkxBR19TVEFUSUMsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSICAgPSBDTEFTU19FTEVNRU5UX0tJTkRfU0VUVEVSIHwgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQyxcbiAgICAgICAgICAgICBDTEFTU19FTEVNRU5UX0lOU1RBTkNFX0dFVFRFUiA9IENMQVNTX0VMRU1FTlRfS0lORF9HRVRURVIsXG4gICAgICAgICAgICAgQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9TRVRURVIgPSBDTEFTU19FTEVNRU5UX0tJTkRfU0VUVEVSLFxuICAgICAgICAgICAgIENMQVNTX0VMRU1FTlRfT1RIRVIgICAgICAgICAgID0gMDtcblxuZXhwb3J0IHR5cGUgQ2xhc3NFbGVtZW50VHlwZXMgPVxuICB8IHR5cGVvZiBDTEFTU19FTEVNRU5UX1NUQVRJQ19HRVRURVJcbiAgfCB0eXBlb2YgQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfR0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfU0VUVEVSXG4gIHwgdHlwZW9mIENMQVNTX0VMRU1FTlRfT1RIRVI7XG4iLCAiaW1wb3J0IHtcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0RJUkVDVF9TVVBFUixcbiAgU0NPUEVfRlVOQ1RJT04sXG4gIFNDT1BFX1NJTVBMRV9DQVRDSCxcbiAgU0NPUEVfU1VQRVIsXG4gIFNDT1BFX1BST0dSQU0sXG4gIFNDT1BFX1ZBUixcbiAgU0NPUEVfQ0xBU1MsXG4gIFNDT1BFX1NUQVRJQ19CTE9DSyxcbiAgQklORF9TQ09QRV9GVU5DVElPTixcbiAgQklORF9TQ09QRV9WQVIsXG4gIEJJTkRfU0NPUEVfTEVYSUNBTCxcbiAgQklORF9LSU5EX1ZBTFVFLFxuICB0eXBlIFNjb3BlRmxhZ3MsXG4gIHR5cGUgQmluZGluZ1R5cGVzLFxufSBmcm9tIFwiLi9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vbG9jYXRpb25cIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgVG9rZW5pemVyIGZyb20gXCIuLi90b2tlbml6ZXJcIjtcblxuLy8gU3RhcnQgYW4gQVNUIG5vZGUsIGF0dGFjaGluZyBhIHN0YXJ0IG9mZnNldC5cbmV4cG9ydCBjbGFzcyBTY29wZSB7XG4gIGRlY2xhcmUgZmxhZ3M6IFNjb3BlRmxhZ3M7XG4gIC8vIEEgc2V0IG9mIHZhci1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIHZhcjogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8vIEEgc2V0IG9mIGxleGljYWxseS1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIGxleGljYWw6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvLyBBIHNldCBvZiBsZXhpY2FsbHktZGVjbGFyZWQgRnVuY3Rpb25EZWNsYXJhdGlvbiBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIGZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoZmxhZ3M6IFNjb3BlRmxhZ3MpIHtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIH1cbn1cblxuLy8gVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBrZWVwIHRyYWNrIG9mIGRlY2xhcmVkIHZhcmlhYmxlcyBpbiB0aGVcbi8vIGN1cnJlbnQgc2NvcGUgaW4gb3JkZXIgdG8gZGV0ZWN0IGR1cGxpY2F0ZSB2YXJpYWJsZSBuYW1lcy5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3BlSGFuZGxlcjxJU2NvcGUgZXh0ZW5kcyBTY29wZSA9IFNjb3BlPiB7XG4gIHBhcnNlcjogVG9rZW5pemVyO1xuICBzY29wZVN0YWNrOiBBcnJheTxJU2NvcGU+ID0gW107XG4gIGluTW9kdWxlOiBib29sZWFuO1xuICB1bmRlZmluZWRFeHBvcnRzOiBNYXA8c3RyaW5nLCBQb3NpdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocGFyc2VyOiBUb2tlbml6ZXIsIGluTW9kdWxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5pbk1vZHVsZSA9IGluTW9kdWxlO1xuICB9XG5cbiAgZ2V0IGluVG9wTGV2ZWwoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRTY29wZSgpLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkgPiAwO1xuICB9XG4gIGdldCBpbkZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGVGbGFncygpICYgU0NPUEVfRlVOQ1RJT04pID4gMDtcbiAgfVxuICBnZXQgYWxsb3dTdXBlcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFRoaXNTY29wZUZsYWdzKCkgJiBTQ09QRV9TVVBFUikgPiAwO1xuICB9XG4gIGdldCBhbGxvd0RpcmVjdFN1cGVyKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwO1xuICB9XG4gIGdldCBpbkNsYXNzKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0NMQVNTKSA+IDA7XG4gIH1cbiAgZ2V0IGluQ2xhc3NBbmROb3RJbk5vbkFycm93RnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLmN1cnJlbnRUaGlzU2NvcGVGbGFncygpO1xuICAgIHJldHVybiAoZmxhZ3MgJiBTQ09QRV9DTEFTUykgPiAwICYmIChmbGFncyAmIFNDT1BFX0ZVTkNUSU9OKSA9PT0gMDtcbiAgfVxuICBnZXQgaW5TdGF0aWNCbG9jaygpIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IDsgaS0tKSB7XG4gICAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICBpZiAoZmxhZ3MgJiBTQ09QRV9TVEFUSUNfQkxPQ0spIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZmxhZ3MgJiAoU0NPUEVfVkFSIHwgU0NPUEVfQ0xBU1MpKSB7XG4gICAgICAgIC8vIGZ1bmN0aW9uIGJvZHksIG1vZHVsZSBib2R5LCBjbGFzcyBwcm9wZXJ0eSBpbml0aWFsaXplcnNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgaW5Ob25BcnJvd0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50VGhpc1Njb3BlRmxhZ3MoKSAmIFNDT1BFX0ZVTkNUSU9OKSA+IDA7XG4gIH1cbiAgZ2V0IHRyZWF0RnVuY3Rpb25zQXNWYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodGhpcy5jdXJyZW50U2NvcGUoKSk7XG4gIH1cblxuICBjcmVhdGVTY29wZShmbGFnczogU2NvcGVGbGFncyk6IFNjb3BlIHtcbiAgICByZXR1cm4gbmV3IFNjb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGVudGVyKGZsYWdzOiBTY29wZUZsYWdzKSB7XG4gICAgLyo6OiArY3JlYXRlU2NvcGU6IChmbGFnczogU2NvcGVGbGFncykgPT4gSVNjb3BlOyAqL1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBtZXRob2Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gICAgdGhpcy5zY29wZVN0YWNrLnB1c2godGhpcy5jcmVhdGVTY29wZShmbGFncykpO1xuICB9XG5cbiAgZXhpdCgpOiBTY29wZUZsYWdzIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gc2NvcGUuZmxhZ3M7XG4gIH1cblxuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyA+IEF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmdW5jdGlvbiwgb3Igc2NyaXB0LCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYXJlXG4gIC8vID4gdHJlYXRlZCBsaWtlIHZhciBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gbGlrZSBsZXhpY2FsIGRlY2xhcmF0aW9ucy5cbiAgdHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUoc2NvcGU6IElTY29wZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHNjb3BlLmZsYWdzICYgKFNDT1BFX0ZVTkNUSU9OIHwgU0NPUEVfU1RBVElDX0JMT0NLKSB8fFxuICAgICAgKCF0aGlzLnBhcnNlci5pbk1vZHVsZSAmJiBzY29wZS5mbGFncyAmIFNDT1BFX1BST0dSQU0pXG4gICAgKTtcbiAgfVxuXG4gIGRlY2xhcmVOYW1lKG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcywgbG9jOiBQb3NpdGlvbikge1xuICAgIGxldCBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlKCk7XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9MRVhJQ0FMIHx8IGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9GVU5DVElPTikge1xuICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcblxuICAgICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9TQ09QRV9GVU5DVElPTikge1xuICAgICAgICBzY29wZS5mdW5jdGlvbnMuYWRkKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NvcGUubGV4aWNhbC5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfU0NPUEVfTEVYSUNBTCkge1xuICAgICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfU0NPUEVfVkFSKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgICB0aGlzLmNoZWNrUmVkZWNsYXJhdGlvbkluU2NvcGUoc2NvcGUsIG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuICAgICAgICBzY29wZS52YXIuYWRkKG5hbWUpO1xuICAgICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGFyc2VyLmluTW9kdWxlICYmIHNjb3BlLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICBtYXliZUV4cG9ydERlZmluZWQoc2NvcGU6IElTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFyc2VyLmluTW9kdWxlICYmIHNjb3BlLmZsYWdzICYgU0NPUEVfUFJPR1JBTSkge1xuICAgICAgdGhpcy51bmRlZmluZWRFeHBvcnRzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICBjaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKFxuICAgIHNjb3BlOiBJU2NvcGUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMsXG4gICAgbG9jOiBQb3NpdGlvbixcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuVmFyUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICBhdDogbG9jLFxuICAgICAgICBpZGVudGlmaWVyTmFtZTogbmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVkZWNsYXJlZEluU2NvcGUoXG4gICAgc2NvcGU6IElTY29wZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcyxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCEoYmluZGluZ1R5cGUgJiBCSU5EX0tJTkRfVkFMVUUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX1NDT1BFX0xFWElDQUwpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNjb3BlLmxleGljYWwuaGFzKG5hbWUpIHx8XG4gICAgICAgIHNjb3BlLmZ1bmN0aW9ucy5oYXMobmFtZSkgfHxcbiAgICAgICAgc2NvcGUudmFyLmhhcyhuYW1lKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX1NDT1BFX0ZVTkNUSU9OKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzY29wZS5sZXhpY2FsLmhhcyhuYW1lKSB8fFxuICAgICAgICAoIXRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUoc2NvcGUpICYmIHNjb3BlLnZhci5oYXMobmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAoc2NvcGUubGV4aWNhbC5oYXMobmFtZSkgJiZcbiAgICAgICAgLy8gQW5uZXggQi4zLjRcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy12YXJpYWJsZXN0YXRlbWVudHMtaW4tY2F0Y2gtYmxvY2tzXG4gICAgICAgICEoXG4gICAgICAgICAgc2NvcGUuZmxhZ3MgJiBTQ09QRV9TSU1QTEVfQ0FUQ0ggJiZcbiAgICAgICAgICBzY29wZS5sZXhpY2FsLnZhbHVlcygpLm5leHQoKS52YWx1ZSA9PT0gbmFtZVxuICAgICAgICApKSB8fFxuICAgICAgKCF0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHNjb3BlKSAmJiBzY29wZS5mdW5jdGlvbnMuaGFzKG5hbWUpKVxuICAgICk7XG4gIH1cblxuICBjaGVja0xvY2FsRXhwb3J0KGlkOiBOLklkZW50aWZpZXIpIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGlkO1xuICAgIGNvbnN0IHRvcExldmVsU2NvcGUgPSB0aGlzLnNjb3BlU3RhY2tbMF07XG4gICAgaWYgKFxuICAgICAgIXRvcExldmVsU2NvcGUubGV4aWNhbC5oYXMobmFtZSkgJiZcbiAgICAgICF0b3BMZXZlbFNjb3BlLnZhci5oYXMobmFtZSkgJiZcbiAgICAgIC8vIEluIHN0cmljdCBtb2RlLCBzY29wZS5mdW5jdGlvbnMgd2lsbCBhbHdheXMgYmUgZW1wdHkuXG4gICAgICAvLyBNb2R1bGVzIGFyZSBzdHJpY3QgYnkgZGVmYXVsdCwgYnV0IHRoZSBgc2NyaXB0TW9kZWAgb3B0aW9uXG4gICAgICAvLyBjYW4gb3ZlcndyaXRlIHRoaXMgYmVoYXZpb3IuXG4gICAgICAhdG9wTGV2ZWxTY29wZS5mdW5jdGlvbnMuaGFzKG5hbWUpXG4gICAgKSB7XG4gICAgICB0aGlzLnVuZGVmaW5lZEV4cG9ydHMuc2V0KG5hbWUsIGlkLmxvYy5zdGFydCk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFNjb3BlKCk6IElTY29wZSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGVTdGFja1t0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBjdXJyZW50VmFyU2NvcGVGbGFncygpOiBTY29wZUZsYWdzIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IDsgaS0tKSB7XG4gICAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgICBpZiAoZmxhZ3MgJiBTQ09QRV9WQVIpIHtcbiAgICAgICAgcmV0dXJuIGZsYWdzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvdWxkIGJlIHVzZWZ1bCBmb3IgYGFyZ3VtZW50c2AsIGB0aGlzYCwgYG5ldy50YXJnZXRgLCBgc3VwZXIoKWAsIGBzdXBlci5wcm9wZXJ0eWAsIGFuZCBgc3VwZXJbcHJvcGVydHldYC5cbiAgY3VycmVudFRoaXNTY29wZUZsYWdzKCk6IFNjb3BlRmxhZ3Mge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgOyBpLS0pIHtcbiAgICAgIGNvbnN0IHsgZmxhZ3MgfSA9IHRoaXMuc2NvcGVTdGFja1tpXTtcbiAgICAgIGlmIChmbGFncyAmIChTQ09QRV9WQVIgfCBTQ09QRV9DTEFTUykgJiYgIShmbGFncyAmIFNDT1BFX0FSUk9XKSkge1xuICAgICAgICByZXR1cm4gZmxhZ3M7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgU2NvcGVIYW5kbGVyLCB7IFNjb3BlIH0gZnJvbSBcIi4uLy4uL3V0aWwvc2NvcGVcIjtcbmltcG9ydCB7XG4gIEJJTkRfRkxBR1NfRkxPV19ERUNMQVJFX0ZOLFxuICB0eXBlIFNjb3BlRmxhZ3MsXG4gIHR5cGUgQmluZGluZ1R5cGVzLFxufSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8vIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvYmxvYi8yM2FlYjJhMmVmNmViNDI0MWNlMTc4ZmRlNWQ4ZjE3YzVmNzQ3ZmI1L3NyYy90eXBpbmcvZW52Lm1sI0w1MzYtTDU4NFxuY2xhc3MgRmxvd1Njb3BlIGV4dGVuZHMgU2NvcGUge1xuICAvLyBkZWNsYXJlIGZ1bmN0aW9uIGZvbygpOiB0eXBlO1xuICBkZWNsYXJlRnVuY3Rpb25zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxvd1Njb3BlSGFuZGxlciBleHRlbmRzIFNjb3BlSGFuZGxlcjxGbG93U2NvcGU+IHtcbiAgY3JlYXRlU2NvcGUoZmxhZ3M6IFNjb3BlRmxhZ3MpOiBGbG93U2NvcGUge1xuICAgIHJldHVybiBuZXcgRmxvd1Njb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGRlY2xhcmVOYW1lKG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcywgbG9jOiBQb3NpdGlvbikge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX0ZMT1dfREVDTEFSRV9GTikge1xuICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcbiAgICAgIHRoaXMubWF5YmVFeHBvcnREZWZpbmVkKHNjb3BlLCBuYW1lKTtcbiAgICAgIHNjb3BlLmRlY2xhcmVGdW5jdGlvbnMuYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmRlY2xhcmVOYW1lKG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuICB9XG5cbiAgaXNSZWRlY2xhcmVkSW5TY29wZShcbiAgICBzY29wZTogRmxvd1Njb3BlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc3VwZXIuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfRkxPV19ERUNMQVJFX0ZOKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhc2NvcGUuZGVjbGFyZUZ1bmN0aW9ucy5oYXMobmFtZSkgJiZcbiAgICAgICAgKHNjb3BlLmxleGljYWwuaGFzKG5hbWUpIHx8IHNjb3BlLmZ1bmN0aW9ucy5oYXMobmFtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoZWNrTG9jYWxFeHBvcnQoaWQ6IE4uSWRlbnRpZmllcikge1xuICAgIGlmICghdGhpcy5zY29wZVN0YWNrWzBdLmRlY2xhcmVGdW5jdGlvbnMuaGFzKGlkLm5hbWUpKSB7XG4gICAgICBzdXBlci5jaGVja0xvY2FsRXhwb3J0KGlkKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5zTWFwIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB0eXBlIFNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9zY29wZVwiO1xuaW1wb3J0IHR5cGUgRXhwcmVzc2lvblNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgdHlwZSBDbGFzc1Njb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9jbGFzcy1zY29wZVwiO1xuaW1wb3J0IHR5cGUgUHJvZHVjdGlvblBhcmFtZXRlckhhbmRsZXIgZnJvbSBcIi4uL3V0aWwvcHJvZHVjdGlvbi1wYXJhbWV0ZXJcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGFyc2VyUGx1Z2luV2l0aE9wdGlvbnMsXG4gIFBsdWdpbkNvbmZpZyxcbiAgUGx1Z2luT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGluZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVBhcnNlciB7XG4gIC8vIFByb3BlcnRpZXMgc2V0IGJ5IGNvbnN0cnVjdG9yIGluIGluZGV4LmpzXG4gIGRlY2xhcmUgb3B0aW9uczogT3B0aW9ucztcbiAgZGVjbGFyZSBpbk1vZHVsZTogYm9vbGVhbjtcbiAgZGVjbGFyZSBzY29wZTogU2NvcGVIYW5kbGVyPGFueT47XG4gIGRlY2xhcmUgY2xhc3NTY29wZTogQ2xhc3NTY29wZUhhbmRsZXI7XG4gIGRlY2xhcmUgcHJvZFBhcmFtOiBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlcjtcbiAgZGVjbGFyZSBleHByZXNzaW9uU2NvcGU6IEV4cHJlc3Npb25TY29wZUhhbmRsZXI7XG4gIGRlY2xhcmUgcGx1Z2luczogUGx1Z2luc01hcDtcbiAgZGVjbGFyZSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgLy8gTmFtZXMgb2YgZXhwb3J0cyBzdG9yZS4gYGRlZmF1bHRgIGlzIHN0b3JlZCBhcyBhIG5hbWUgZm9yIGJvdGhcbiAgLy8gYGV4cG9ydCBkZWZhdWx0IGZvbztgIGFuZCBgZXhwb3J0IHsgZm9vIGFzIGRlZmF1bHQgfTtgLlxuICBkZWNsYXJlIGV4cG9ydGVkSWRlbnRpZmllcnM6IFNldDxzdHJpbmc+O1xuICBzYXdVbmFtYmlndW91c0VTTTogYm9vbGVhbiA9IGZhbHNlO1xuICBhbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBJbml0aWFsaXplZCBieSBUb2tlbml6ZXJcbiAgZGVjbGFyZSBzdGF0ZTogU3RhdGU7XG4gIC8vIGlucHV0IGFuZCBsZW5ndGggYXJlIG5vdCBpbiBzdGF0ZSBhcyB0aGV5IGFyZSBjb25zdGFudCBhbmQgd2UgZG9cbiAgLy8gbm90IHdhbnQgdG8gZXZlciBjb3B5IHRoZW0sIHdoaWNoIGhhcHBlbnMgaWYgc3RhdGUgZ2V0cyBjbG9uZWRcbiAgZGVjbGFyZSBpbnB1dDogc3RyaW5nO1xuICBkZWNsYXJlIGxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIFRoaXMgbWV0aG9kIGFjY2VwdHMgZWl0aGVyIGEgc3RyaW5nIChwbHVnaW4gbmFtZSkgb3IgYW4gYXJyYXkgcGFpclxuICAvLyAocGx1Z2luIG5hbWUgYW5kIG9wdGlvbnMgb2JqZWN0KS4gSWYgYW4gb3B0aW9ucyBvYmplY3QgaXMgZ2l2ZW4sXG4gIC8vIHRoZW4gZWFjaCB2YWx1ZSBpcyBub24tcmVjdXJzaXZlbHkgY2hlY2tlZCBmb3IgaWRlbnRpdHkgd2l0aCB0aGF0XG4gIC8vIHBsdWdpblx1MjAxOXMgYWN0dWFsIG9wdGlvbiB2YWx1ZS5cbiAgaGFzUGx1Z2luKHBsdWdpbkNvbmZpZzogUGx1Z2luQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW5Db25maWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbkNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5PcHRpb25zXSA9IHBsdWdpbkNvbmZpZztcbiAgICAgIGlmICghdGhpcy5oYXNQbHVnaW4ocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0dWFsT3B0aW9ucyA9IHRoaXMucGx1Z2lucy5nZXQocGx1Z2luTmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhcbiAgICAgICAgcGx1Z2luT3B0aW9ucyxcbiAgICAgICkgYXMgKGtleW9mIHR5cGVvZiBwbHVnaW5PcHRpb25zKVtdKSB7XG4gICAgICAgIGlmIChhY3R1YWxPcHRpb25zPy5ba2V5XSAhPT0gcGx1Z2luT3B0aW9uc1trZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRQbHVnaW5PcHRpb248XG4gICAgUGx1Z2luTmFtZSBleHRlbmRzIFBhcnNlclBsdWdpbldpdGhPcHRpb25zWzBdLFxuICAgIE9wdGlvbk5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+LFxuICA+KHBsdWdpbjogUGx1Z2luTmFtZSwgbmFtZTogT3B0aW9uTmFtZSkge1xuICAgIHJldHVybiAodGhpcy5wbHVnaW5zLmdldChwbHVnaW4pIGFzIG51bGwgfCBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+KT8uW1xuICAgICAgbmFtZVxuICAgIF07XG4gIH1cbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IEJhc2VQYXJzZXIgZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50LCBOb2RlLCBJZGVudGlmaWVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5cbi8qKlxuICogQSB3aGl0ZXNwYWNlIHRva2VuIGNvbnRhaW5pbmcgY29tbWVudHNcbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWVudFdoaXRlc3BhY2UgPSB7XG4gIC8qKlxuICAgKiB0aGUgc3RhcnQgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW4uXG4gICAqL1xuICBzdGFydDogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGVuZCBvZiB0aGUgd2hpdGVzcGFjZSB0b2tlbi5cbiAgICovXG4gIGVuZDogbnVtYmVyO1xuICAvKipcbiAgICogdGhlIGNvbnRhaW5pbmcgY29tbWVudHNcbiAgICovXG4gIGNvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgLyoqXG4gICAqIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgQVNUIG5vZGUgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW5cbiAgICovXG4gIGxlYWRpbmdOb2RlOiBOb2RlIHwgbnVsbDtcbiAgLyoqXG4gICAqIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgQVNUIG5vZGUgb2YgdGhlIHdoaXRlc3BhY2UgdG9rZW5cbiAgICovXG4gIHRyYWlsaW5nTm9kZTogTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiB0aGUgaW5uZXJtb3N0IEFTVCBub2RlIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2Ugd2l0aCBtaW5pbWFsIHNpemUgKHxlbmQgLSBzdGFydHwpXG4gICAqL1xuICBjb250YWluaW5nTm9kZTogTm9kZSB8IG51bGw7XG59O1xuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIHRyYWlsaW5nQ29tbWVudHMgb3IgYXNzaWduIGNvbW1lbnRzIHRvIGJlXG4gKiB0cmFpbGluZ0NvbW1lbnRzLiBOZXcgY29tbWVudHMgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIG9sZCBjb21tZW50c1xuICogYmVjYXVzZSB0aGUgY29tbWVudFN0YWNrIGlzIGVudW1lcmF0ZWQgcmV2ZXJzZWx5LlxuICovXG5mdW5jdGlvbiBzZXRUcmFpbGluZ0NvbW1lbnRzKG5vZGU6IFVuZG9uZTxOb2RlPiwgY29tbWVudHM6IEFycmF5PENvbW1lbnQ+KSB7XG4gIGlmIChub2RlLnRyYWlsaW5nQ29tbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5vZGUudHJhaWxpbmdDb21tZW50cyA9IGNvbW1lbnRzO1xuICB9IGVsc2Uge1xuICAgIG5vZGUudHJhaWxpbmdDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIGxlYWRpbmdDb21tZW50cyBvciBhc3NpZ24gY29tbWVudHMgdG8gYmVcbiAqIGxlYWRpbmdDb21tZW50cy4gTmV3IGNvbW1lbnRzIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSBvbGQgY29tbWVudHNcbiAqIGJlY2F1c2UgdGhlIGNvbW1lbnRTdGFjayBpcyBlbnVtZXJhdGVkIHJldmVyc2VseS5cbiAqL1xuZnVuY3Rpb24gc2V0TGVhZGluZ0NvbW1lbnRzKG5vZGU6IFVuZG9uZTxOb2RlPiwgY29tbWVudHM6IEFycmF5PENvbW1lbnQ+KSB7XG4gIGlmIChub2RlLmxlYWRpbmdDb21tZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbm9kZS5sZWFkaW5nQ29tbWVudHMgPSBjb21tZW50cztcbiAgfSBlbHNlIHtcbiAgICBub2RlLmxlYWRpbmdDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIGNvbW1lbnRzIHdpdGggbm9kZSdzIGlubmVyQ29tbWVudHMgb3IgYXNzaWduIGNvbW1lbnRzIHRvIGJlXG4gKiBpbm5lckNvbW1lbnRzLiBOZXcgY29tbWVudHMgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIG9sZCBjb21tZW50c1xuICogYmVjYXVzZSB0aGUgY29tbWVudFN0YWNrIGlzIGVudW1lcmF0ZWQgcmV2ZXJzZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5uZXJDb21tZW50cyhcbiAgbm9kZTogVW5kb25lPE5vZGU+LFxuICBjb21tZW50cz86IEFycmF5PENvbW1lbnQ+LFxuKSB7XG4gIGlmIChub2RlLmlubmVyQ29tbWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5vZGUuaW5uZXJDb21tZW50cyA9IGNvbW1lbnRzO1xuICB9IGVsc2Uge1xuICAgIG5vZGUuaW5uZXJDb21tZW50cy51bnNoaWZ0KC4uLmNvbW1lbnRzKTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIG5vZGUgYW5kIGVsZW1lbnRzIGFycmF5LCBpZiBlbGVtZW50cyBoYXMgbm9uLW51bGwgZWxlbWVudCxcbiAqIG1lcmdlIGNvbW1lbnRzIHRvIGl0cyB0cmFpbGluZ0NvbW1lbnRzLCBvdGhlcndpc2UgbWVyZ2UgY29tbWVudHNcbiAqIHRvIG5vZGUncyBpbm5lckNvbW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFkanVzdElubmVyQ29tbWVudHMoXG4gIG5vZGU6IFVuZG9uZTxOb2RlPixcbiAgZWxlbWVudHM6IEFycmF5PE5vZGU+LFxuICBjb21tZW50V1M6IENvbW1lbnRXaGl0ZXNwYWNlLFxuKSB7XG4gIGxldCBsYXN0RWxlbWVudCA9IG51bGw7XG4gIGxldCBpID0gZWxlbWVudHMubGVuZ3RoO1xuICB3aGlsZSAobGFzdEVsZW1lbnQgPT09IG51bGwgJiYgaSA+IDApIHtcbiAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnRzWy0taV07XG4gIH1cbiAgaWYgKGxhc3RFbGVtZW50ID09PSBudWxsIHx8IGxhc3RFbGVtZW50LnN0YXJ0ID4gY29tbWVudFdTLnN0YXJ0KSB7XG4gICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjb21tZW50V1MuY29tbWVudHMpO1xuICB9IGVsc2Uge1xuICAgIHNldFRyYWlsaW5nQ29tbWVudHMobGFzdEVsZW1lbnQsIGNvbW1lbnRXUy5jb21tZW50cyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tbWVudHNQYXJzZXIgZXh0ZW5kcyBCYXNlUGFyc2VyIHtcbiAgYWRkQ29tbWVudChjb21tZW50OiBDb21tZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsZW5hbWUpIGNvbW1lbnQubG9jLmZpbGVuYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICB0aGlzLnN0YXRlLmNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBuZXdseSBjcmVhdGVkIEFTVCBub2RlIF9uXywgYXR0YWNoIF9uXyB0byBhIGNvbW1lbnQgd2hpdGVzcGFjZSBfd18gaWYgYXBwbGljYWJsZVxuICAgKiB7QHNlZSB7QGxpbmsgQ29tbWVudFdoaXRlc3BhY2V9fVxuICAgKi9cbiAgcHJvY2Vzc0NvbW1lbnQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNvbW1lbnRTdGFja0xlbmd0aCA9IGNvbW1lbnRTdGFjay5sZW5ndGg7XG4gICAgaWYgKGNvbW1lbnRTdGFja0xlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGxldCBpID0gY29tbWVudFN0YWNrTGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0Q29tbWVudFdTID0gY29tbWVudFN0YWNrW2ldO1xuXG4gICAgaWYgKGxhc3RDb21tZW50V1Muc3RhcnQgPT09IG5vZGUuZW5kKSB7XG4gICAgICBsYXN0Q29tbWVudFdTLmxlYWRpbmdOb2RlID0gbm9kZTtcbiAgICAgIGktLTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXJ0OiBub2RlU3RhcnQgfSA9IG5vZGU7XG4gICAgLy8gaW52YXJpYW50OiBmb3IgYWxsIDAgPD0gaiA8PSBpLCBsZXQgYyA9IGNvbW1lbnRTdGFja1tqXSwgYyBtdXN0IHNhdGlzZnkgYy5lbmQgPCBub2RlLmVuZFxuICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY29tbWVudFdTID0gY29tbWVudFN0YWNrW2ldO1xuICAgICAgY29uc3QgY29tbWVudEVuZCA9IGNvbW1lbnRXUy5lbmQ7XG4gICAgICBpZiAoY29tbWVudEVuZCA+IG5vZGVTdGFydCkge1xuICAgICAgICAvLyBieSBkZWZpbml0aW9uIG9mIGNvbW1lbnRXaGl0ZVNwYWNlLCB0aGlzIGltcGxpZXMgY29tbWVudFdTLnN0YXJ0ID4gbm9kZVN0YXJ0XG4gICAgICAgIC8vIHNvIG5vZGUgY2FuIGJlIGEgY29udGFpbmluZ05vZGUgY2FuZGlkYXRlLiBBdCB0aGlzIHRpbWUgd2UgY2FuIGZpbmFsaXplIHRoZSBjb21tZW50XG4gICAgICAgIC8vIHdoaXRlc3BhY2UsIGJlY2F1c2VcbiAgICAgICAgLy8gMSkgaXRzIGxlYWRpbmdOb2RlIG9yIHRyYWlsaW5nTm9kZSwgaWYgZXhpc3RzLCB3aWxsIG5vdCBjaGFuZ2VcbiAgICAgICAgLy8gMikgaXRzIGNvbnRhaW5pbmdOb2RlIGhhdmUgYmVlbiBhc3NpZ25lZCBhbmQgd2lsbCBub3QgY2hhbmdlIGJlY2F1c2UgaXQgaXMgdGhlXG4gICAgICAgIC8vICAgIGlubmVybW9zdCBtaW5pbWFsLXNpemVkIEFTVCBub2RlXG4gICAgICAgIGNvbW1lbnRXUy5jb250YWluaW5nTm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuZmluYWxpemVDb21tZW50KGNvbW1lbnRXUyk7XG4gICAgICAgIGNvbW1lbnRTdGFjay5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29tbWVudEVuZCA9PT0gbm9kZVN0YXJ0KSB7XG4gICAgICAgICAgY29tbWVudFdTLnRyYWlsaW5nTm9kZSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcCB0aGUgbG9vcCB3aGVuIGNvbW1lbnRFbmQgPD0gbm9kZVN0YXJ0XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gdGhlIGNvbW1lbnRzIG9mIGNvbW1lbnQgd2hpdGVzcGFjZXMgdG8gcmVsYXRlZCBBU1Qgbm9kZXMuXG4gICAqIEFsc28gYWRqdXN0IGlubmVyQ29tbWVudHMgZm9sbG93aW5nIHRyYWlsaW5nIGNvbW1hLlxuICAgKi9cbiAgZmluYWxpemVDb21tZW50KGNvbW1lbnRXUzogQ29tbWVudFdoaXRlc3BhY2UpIHtcbiAgICBjb25zdCB7IGNvbW1lbnRzIH0gPSBjb21tZW50V1M7XG4gICAgaWYgKGNvbW1lbnRXUy5sZWFkaW5nTm9kZSAhPT0gbnVsbCB8fCBjb21tZW50V1MudHJhaWxpbmdOb2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAoY29tbWVudFdTLmxlYWRpbmdOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIHNldFRyYWlsaW5nQ29tbWVudHMoY29tbWVudFdTLmxlYWRpbmdOb2RlLCBjb21tZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoY29tbWVudFdTLnRyYWlsaW5nTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBzZXRMZWFkaW5nQ29tbWVudHMoY29tbWVudFdTLnRyYWlsaW5nTm9kZSwgY29tbWVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKjo6IGludmFyaWFudChjb21tZW50V1MuY29udGFpbmluZ05vZGUgIT09IG51bGwpICovXG4gICAgICBjb25zdCB7IGNvbnRhaW5pbmdOb2RlOiBub2RlLCBzdGFydDogY29tbWVudFN0YXJ0IH0gPSBjb21tZW50V1M7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KGNvbW1lbnRTdGFydCAtIDEpID09PSBjaGFyQ29kZXMuY29tbWEpIHtcbiAgICAgICAgLy8gSWYgYSBjb21tZW50V2hpdGVzcGFjZSBmb2xsb3dzIGEgY29tbWEgYW5kIHRoZSBjb250YWluaW5nTm9kZSBhbGxvd3NcbiAgICAgICAgLy8gbGlzdCBzdHJ1Y3R1cmVzIHdpdGggdHJhaWxpbmcgY29tbWEsIG1lcmdlIGl0IHRvIHRoZSB0cmFpbGluZ0NvbW1lbnRcbiAgICAgICAgLy8gb2YgdGhlIGxhc3Qgbm9uLW51bGwgbGlzdCBlbGVtZW50XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgICAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgICAgIGNhc2UgXCJSZWNvcmRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUucHJvcGVydGllcywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIGNhc2UgXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUuYXJndW1lbnRzLCBjb21tZW50V1MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICAgICAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgICAgICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgICAgICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICAgICAgICAgIGFkanVzdElubmVyQ29tbWVudHMobm9kZSwgbm9kZS5wYXJhbXMsIGNvbW1lbnRXUyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgICAgIGNhc2UgXCJUdXBsZUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIGFkanVzdElubmVyQ29tbWVudHMobm9kZSwgbm9kZS5lbGVtZW50cywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcIkltcG9ydERlY2xhcmF0aW9uXCI6XG4gICAgICAgICAgICBhZGp1c3RJbm5lckNvbW1lbnRzKG5vZGUsIG5vZGUuc3BlY2lmaWVycywgY29tbWVudFdTKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHNldElubmVyQ29tbWVudHMobm9kZSwgY29tbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjb21tZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyByZW1haW5pbmcgY29tbWVudFN0YWNrIGFuZCBhcHBsaWVzIGZpbmFsaXplQ29tbWVudFxuICAgKiB0byBlYWNoIGNvbW1lbnQgd2hpdGVzcGFjZS4gVXNlZCBvbmx5IGluIHBhcnNlRXhwcmVzc2lvblxuICAgKiB3aGVyZSB0aGUgdG9wIGxldmVsIEFTVCBub2RlIGlzIF9ub3RfIFByb2dyYW1cbiAgICoge0BzZWUge0BsaW5rIENvbW1lbnRzUGFyc2VyI2ZpbmFsaXplQ29tbWVudH19XG4gICAqL1xuICBmaW5hbGl6ZVJlbWFpbmluZ0NvbW1lbnRzKCkge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGZvciAobGV0IGkgPSBjb21tZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMuZmluYWxpemVDb21tZW50KGNvbW1lbnRTdGFja1tpXSk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUuY29tbWVudFN0YWNrID0gW107XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pcnJlZ3VsYXItd2hpdGVzcGFjZSAqL1xuICAvKipcbiAgICogUmVzZXQgcHJldmlvdXMgbm9kZSB0cmFpbGluZyBjb21tZW50cy4gVXNlZCBpbiBvYmplY3QgLyBjbGFzc1xuICAgKiBwcm9wZXJ0eSBwYXJzaW5nLiBXZSBwYXJzZSBgYXN5bmNgLCBgc3RhdGljYCwgYHNldGAgYW5kIGBnZXRgXG4gICAqIGFzIGFuIGlkZW50aWZpZXIgYnV0IG1heSByZWludGVycHJldCBpdCBpbnRvIGFuIGFzeW5jL3N0YXRpYy9hY2Nlc3NvclxuICAgKiBtZXRob2QgbGF0ZXIuIEluIHRoaXMgY2FzZSB0aGUgaWRlbnRpZmllciBpcyBub3QgcGFydCBvZiB0aGUgQVNUIGFuZCB3ZVxuICAgKiBzaG91bGQgc3luYyB0aGUga25vd2xlZGdlIHRvIGNvbW1lbnRTdGFja3NcbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gcGFyc2luZ1xuICAgKiBgYGBcbiAgICogYXN5bmMgLyogMSAqXHUyMDBCLyBmdW5jdGlvbiBmKCkge31cbiAgICogYGBgXG4gICAqIHRoZSBjb21tZW50IHdoaXRlc3BhY2UgYC8qIDEgKlx1MjAwQi9gIGhhcyBsZWFkaW5nIG5vZGUgSWRlbnRpZmllcihhc3luYykuIFdoZW5cbiAgICogd2Ugc2VlIHRoZSBmdW5jdGlvbiB0b2tlbiwgd2UgY3JlYXRlIGEgRnVuY3Rpb24gbm9kZSBhbmQgbWFyayBgLyogMSAqXHUyMDBCL2AgYXNcbiAgICogaW5uZXIgY29tbWVudHMuIFNvIGAvKiAxICpcdTIwMEIvYCBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgSWRlbnRpZmllciBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZSB0aGUgbGFzdCBmaW5pc2hlZCBBU1Qgbm9kZSBfYmVmb3JlXyBjdXJyZW50IHRva2VuXG4gICAqL1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWlycmVndWxhci13aGl0ZXNwYWNlICovXG4gIHJlc2V0UHJldmlvdXNOb2RlVHJhaWxpbmdDb21tZW50cyhub2RlOiBOb2RlKSB7XG4gICAgY29uc3QgeyBjb21tZW50U3RhY2sgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGNvbW1lbnRTdGFjaztcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY29tbWVudFdTID0gY29tbWVudFN0YWNrW2xlbmd0aCAtIDFdO1xuICAgIGlmIChjb21tZW50V1MubGVhZGluZ05vZGUgPT09IG5vZGUpIHtcbiAgICAgIGNvbW1lbnRXUy5sZWFkaW5nTm9kZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8taXJyZWd1bGFyLXdoaXRlc3BhY2UgKi9cbiAgLyoqXG4gICAqIFJlc2V0IHByZXZpb3VzIG5vZGUgbGVhZGluZyBjb21tZW50cywgYXNzdW1pbmcgdGhhdCBgbm9kZWAgaXMgYVxuICAgKiBzaW5nbGUtdG9rZW4gbm9kZS4gVXNlZCBpbiBpbXBvcnQgcGhhc2UgbW9kaWZpZXJzIHBhcnNpbmcuIFdlIHBhcnNlXG4gICAqIGBtb2R1bGVgIGluIGBpbXBvcnQgbW9kdWxlIGZvbyBmcm9tIC4uLmAgYXMgYW4gaWRlbnRpZmllciBidXQgbWF5XG4gICAqIHJlaW50ZXJwcmV0IGl0IGludG8gYSBwaGFzZSBtb2RpZmllciBsYXRlci4gSW4gdGhpcyBjYXNlIHRoZSBpZGVudGlmaWVyIGlzXG4gICAqIG5vdCBwYXJ0IG9mIHRoZSBBU1QgYW5kIHdlIHNob3VsZCBzeW5jIHRoZSBrbm93bGVkZ2UgdG8gY29tbWVudFN0YWNrc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBwYXJzaW5nXG4gICAqIGBgYFxuICAgKiBpbXBvcnQgLyogMSAqXHUyMDBCLyBtb2R1bGUgYSBmcm9tIFwiYVwiO1xuICAgKiBgYGBcbiAgICogdGhlIGNvbW1lbnQgd2hpdGVzcGFjZSBgLyogMSAqXHUyMDBCL2AgaGFzIHRyYWlsaW5nIG5vZGUgSWRlbnRpZmllcihtb2R1bGUpLiBXaGVuXG4gICAqIHdlIHNlZSB0aGF0IGBtb2R1bGVgIGlzIG5vdCBhIGRlZmF1bHQgaW1wb3J0IGJpbmRpbmcsIHdlIG1hcmsgYC8qIDEgKlx1MjAwQi9gIGFzXG4gICAqIGlubmVyIGNvbW1lbnRzIG9mIHRoZSBJbXBvcnREZWNsYXJhdGlvbi4gU28gYC8qIDEgKlx1MjAwQi9gIHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tXG4gICAqIHRoZSBJZGVudGlmaWVyIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBub2RlIHRoZSBsYXN0IGZpbmlzaGVkIEFTVCBub2RlIF9iZWZvcmVfIGN1cnJlbnQgdG9rZW5cbiAgICovXG4gIC8qIGVzbGludC1lbmFibGUgbm8taXJyZWd1bGFyLXdoaXRlc3BhY2UgKi9cbiAgcmVzZXRQcmV2aW91c0lkZW50aWZpZXJMZWFkaW5nQ29tbWVudHMobm9kZTogSWRlbnRpZmllcikge1xuICAgIGNvbnN0IHsgY29tbWVudFN0YWNrIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBjb21tZW50U3RhY2s7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKGNvbW1lbnRTdGFja1tsZW5ndGggLSAxXS50cmFpbGluZ05vZGUgPT09IG5vZGUpIHtcbiAgICAgIGNvbW1lbnRTdGFja1tsZW5ndGggLSAxXS50cmFpbGluZ05vZGUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDIgJiYgY29tbWVudFN0YWNrW2xlbmd0aCAtIDJdLnRyYWlsaW5nTm9kZSA9PT0gbm9kZSkge1xuICAgICAgY29tbWVudFN0YWNrW2xlbmd0aCAtIDJdLnRyYWlsaW5nTm9kZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIG5vZGUgdG8gdGhlIGNvbW1lbnQgd2hpdGVzcGFjZXMgcmlnaHQgYmVmb3JlL2FmdGVyXG4gICAqIHRoZSBnaXZlbiByYW5nZS5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIHRvIHByb3Blcmx5IGF0dGFjaCBjb21tZW50cyBhcm91bmQgcGFyZW50aGVzaXplZFxuICAgKiBleHByZXNzaW9ucyBhcyBsZWFkaW5nL3RyYWlsaW5nIGNvbW1lbnRzIG9mIHRoZSBpbm5lciBleHByZXNzaW9uLlxuICAgKi9cbiAgdGFrZVN1cnJvdW5kaW5nQ29tbWVudHMobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGNvbW1lbnRTdGFjayB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjb21tZW50U3RhY2tMZW5ndGggPSBjb21tZW50U3RhY2subGVuZ3RoO1xuICAgIGlmIChjb21tZW50U3RhY2tMZW5ndGggPT09IDApIHJldHVybjtcbiAgICBsZXQgaSA9IGNvbW1lbnRTdGFja0xlbmd0aCAtIDE7XG5cbiAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbW1lbnRXUyA9IGNvbW1lbnRTdGFja1tpXTtcbiAgICAgIGNvbnN0IGNvbW1lbnRFbmQgPSBjb21tZW50V1MuZW5kO1xuICAgICAgY29uc3QgY29tbWVudFN0YXJ0ID0gY29tbWVudFdTLnN0YXJ0O1xuXG4gICAgICBpZiAoY29tbWVudFN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgY29tbWVudFdTLmxlYWRpbmdOb2RlID0gbm9kZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tbWVudEVuZCA9PT0gc3RhcnQpIHtcbiAgICAgICAgY29tbWVudFdTLnRyYWlsaW5nTm9kZSA9IG5vZGU7XG4gICAgICB9IGVsc2UgaWYgKGNvbW1lbnRFbmQgPCBzdGFydCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyBNYXRjaGVzIGEgd2hvbGUgbGluZSBicmVhayAod2hlcmUgQ1JMRiBpcyBjb25zaWRlcmVkIGEgc2luZ2xlXG4vLyBsaW5lIGJyZWFrKS4gVXNlZCB0byBjb3VudCBsaW5lcy5cbmV4cG9ydCBjb25zdCBsaW5lQnJlYWsgPSAvXFxyXFxuP3xbXFxuXFx1MjAyOFxcdTIwMjldLztcbmV4cG9ydCBjb25zdCBsaW5lQnJlYWtHID0gbmV3IFJlZ0V4cChsaW5lQnJlYWsuc291cmNlLCBcImdcIik7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpbmUtdGVybWluYXRvcnNcbmV4cG9ydCBmdW5jdGlvbiBpc05ld0xpbmUoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVGZWVkOlxuICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgY2FzZSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBza2lwV2hpdGVTcGFjZSA9IC8oPzpcXHN8XFwvXFwvLip8XFwvXFwqW15dKj9cXCpcXC8pKi9nO1xuXG5leHBvcnQgY29uc3Qgc2tpcFdoaXRlU3BhY2VJbkxpbmUgPVxuICAvKD86W15cXFNcXG5cXHJcXHUyMDI4XFx1MjAyOV18XFwvXFwvLip8XFwvXFwqLio/XFwqXFwvKSovZztcblxuLy8gU2tpcCB3aGl0ZXNwYWNlIGFuZCBzaW5nbGUtbGluZSBjb21tZW50cywgaW5jbHVkaW5nIC8qIG5vIG5ld2xpbmUgaGVyZSAqLy5cbi8vIEFmdGVyIHRoaXMgUmVnRXhwIG1hdGNoZXMsIGl0cyBsYXN0SW5kZXggcG9pbnRzIHRvIGEgbGluZSB0ZXJtaW5hdG9yLCBvclxuLy8gdGhlIHN0YXJ0IG9mIG11bHRpLWxpbmUgY29tbWVudCAod2hpY2ggaXMgZWZmZWN0aXZlbHkgYSBsaW5lIHRlcm1pbmF0b3IpLFxuLy8gb3IgdGhlIGVuZCBvZiBzdHJpbmcuXG5leHBvcnQgY29uc3Qgc2tpcFdoaXRlU3BhY2VUb0xpbmVCcmVhayA9IG5ldyBSZWdFeHAoXG4gIC8vIFVuZm9ydHVuYXRlbHkgSlMgZG9lc24ndCBzdXBwb3J0IFBlcmwncyBhdG9taWMgLyg/PnBhdHRlcm4pLyBvclxuICAvLyBwb3NzZXNzaXZlIHF1YW50aWZpZXJzLCBzbyB3ZSB1c2UgYSB0cmljayB0byBwcmV2ZW50IGJhY2t0cmFja2luZ1xuICAvLyB3aGVuIHRoZSBsb29rLWFoZWFkIGZvciBsaW5lIHRlcm1pbmF0b3IgZmFpbHMuXG4gIFwiKD89KFwiICtcbiAgICAvLyBDYXB0dXJlIHRoZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGluc2lkZVxuICAgIC8vIGEgbG9vay1haGVhZCBhc3NlcnRpb24sIGFuZCB0aGVuIHJlLW1hdGNoIHRoZSBncm91cCBhcyBhIHVuaXQuXG4gICAgc2tpcFdoaXRlU3BhY2VJbkxpbmUuc291cmNlICtcbiAgICBcIikpXFxcXDFcIiArXG4gICAgLy8gTG9vay1haGVhZCBmb3IgZWl0aGVyIGxpbmUgdGVybWluYXRvciwgc3RhcnQgb2YgbXVsdGktbGluZSBjb21tZW50LFxuICAgIC8vIG9yIGVuZCBvZiBzdHJpbmcuXG4gICAgLyg/PVtcXG5cXHJcXHUyMDI4XFx1MjAyOV18XFwvXFwqKD8hLio/XFwqXFwvKXwkKS8uc291cmNlLFxuICBcInlcIiwgLy8gc3RpY2t5XG4pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aGl0ZS1zcGFjZVxuZXhwb3J0IGZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAweDAwMDk6IC8vIENIQVJBQ1RFUiBUQUJVTEFUSU9OXG4gICAgY2FzZSAweDAwMGI6IC8vIExJTkUgVEFCVUxBVElPTlxuICAgIGNhc2UgMHgwMDBjOiAvLyBGT1JNIEZFRURcbiAgICBjYXNlIGNoYXJDb2Rlcy5zcGFjZTpcbiAgICBjYXNlIGNoYXJDb2Rlcy5ub25CcmVha2luZ1NwYWNlOlxuICAgIGNhc2UgY2hhckNvZGVzLm9naGFtU3BhY2VNYXJrOlxuICAgIGNhc2UgMHgyMDAwOiAvLyBFTiBRVUFEXG4gICAgY2FzZSAweDIwMDE6IC8vIEVNIFFVQURcbiAgICBjYXNlIDB4MjAwMjogLy8gRU4gU1BBQ0VcbiAgICBjYXNlIDB4MjAwMzogLy8gRU0gU1BBQ0VcbiAgICBjYXNlIDB4MjAwNDogLy8gVEhSRUUtUEVSLUVNIFNQQUNFXG4gICAgY2FzZSAweDIwMDU6IC8vIEZPVVItUEVSLUVNIFNQQUNFXG4gICAgY2FzZSAweDIwMDY6IC8vIFNJWC1QRVItRU0gU1BBQ0VcbiAgICBjYXNlIDB4MjAwNzogLy8gRklHVVJFIFNQQUNFXG4gICAgY2FzZSAweDIwMDg6IC8vIFBVTkNUVUFUSU9OIFNQQUNFXG4gICAgY2FzZSAweDIwMDk6IC8vIFRISU4gU1BBQ0VcbiAgICBjYXNlIDB4MjAwYTogLy8gSEFJUiBTUEFDRVxuICAgIGNhc2UgMHgyMDJmOiAvLyBOQVJST1cgTk8tQlJFQUsgU1BBQ0VcbiAgICBjYXNlIDB4MjA1ZjogLy8gTUVESVVNIE1BVEhFTUFUSUNBTCBTUEFDRVxuICAgIGNhc2UgMHgzMDAwOiAvLyBJREVPR1JBUEhJQyBTUEFDRVxuICAgIGNhc2UgMHhmZWZmOiAvLyBaRVJPIFdJRFRIIE5PLUJSRUFLIFNQQUNFXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50V2hpdGVzcGFjZSB9IGZyb20gXCIuLi9wYXJzZXIvY29tbWVudHNcIjtcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcblxuaW1wb3J0IHsgdHlwZXMgYXMgY3QsIHR5cGUgVG9rQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IHR0LCB0eXBlIFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEVycm9ycyB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5cbmV4cG9ydCB0eXBlIERlZmVycmVkU3RyaWN0RXJyb3IgPVxuICB8IHR5cGVvZiBFcnJvcnMuU3RyaWN0TnVtZXJpY0VzY2FwZVxuICB8IHR5cGVvZiBFcnJvcnMuU3RyaWN0T2N0YWxMaXRlcmFsO1xuXG50eXBlIFRvcGljQ29udGV4dFN0YXRlID0ge1xuICAvLyBXaGVuIGEgdG9waWMgYmluZGluZyBoYXMgYmVlbiBjdXJyZW50bHkgZXN0YWJsaXNoZWQsXG4gIC8vIHRoZW4gdGhpcyBpcyAxLiBPdGhlcndpc2UsIGl0IGlzIDAuIFRoaXMgaXMgZm9yd2FyZHMgY29tcGF0aWJsZVxuICAvLyB3aXRoIGEgZnV0dXJlIHBsdWdpbiBmb3IgbXVsdGlwbGUgbGV4aWNhbCB0b3BpY3MuXG4gIG1heE51bU9mUmVzb2x2YWJsZVRvcGljczogbnVtYmVyO1xuICAvLyBXaGVuIGEgdG9waWMgYmluZGluZyBoYXMgYmVlbiBjdXJyZW50bHkgZXN0YWJsaXNoZWQsIGFuZCBpZiB0aGF0IGJpbmRpbmdcbiAgLy8gaGFzIGJlZW4gdXNlZCBhcyBhIHRvcGljIHJlZmVyZW5jZSBgI2AsIHRoZW4gdGhpcyBpcyAwLiBPdGhlcndpc2UsIGl0IGlzXG4gIC8vIGBudWxsYC4gVGhpcyBpcyBmb3J3YXJkcyBjb21wYXRpYmxlIHdpdGggYSBmdXR1cmUgcGx1Z2luIGZvciBtdWx0aXBsZVxuICAvLyBsZXhpY2FsIHRvcGljcy5cbiAgbWF4VG9waWNJbmRleDogbnVsbCB8IDA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0ZSB7XG4gIHN0cmljdDogYm9vbGVhbjtcbiAgY3VyTGluZTogbnVtYmVyO1xuICBsaW5lU3RhcnQ6IG51bWJlcjtcblxuICAvLyBBbmQsIGlmIGxvY2F0aW9ucyBhcmUgdXNlZCwgdGhlIHtsaW5lLCBjb2x1bW59IG9iamVjdFxuICAvLyBjb3JyZXNwb25kaW5nIHRvIHRob3NlIG9mZnNldHNcbiAgc3RhcnRMb2M6IFBvc2l0aW9uO1xuICBlbmRMb2M6IFBvc2l0aW9uO1xuXG4gIGluaXQoeyBzdHJpY3RNb2RlLCBzb3VyY2VUeXBlLCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uIH06IE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnN0cmljdCA9XG4gICAgICBzdHJpY3RNb2RlID09PSBmYWxzZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogc3RyaWN0TW9kZSA9PT0gdHJ1ZVxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBzb3VyY2VUeXBlID09PSBcIm1vZHVsZVwiO1xuXG4gICAgdGhpcy5jdXJMaW5lID0gc3RhcnRMaW5lO1xuICAgIHRoaXMubGluZVN0YXJ0ID0gLXN0YXJ0Q29sdW1uO1xuICAgIHRoaXMuc3RhcnRMb2MgPSB0aGlzLmVuZExvYyA9IG5ldyBQb3NpdGlvbihzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCAwKTtcbiAgfVxuXG4gIGVycm9yczogUGFyc2VFcnJvcjxhbnk+W10gPSBbXTtcblxuICAvLyBVc2VkIHRvIHNpZ25pZnkgdGhlIHN0YXJ0IG9mIGEgcG90ZW50aWFsIGFycm93IGZ1bmN0aW9uXG4gIHBvdGVudGlhbEFycm93QXQ6IG51bWJlciA9IC0xO1xuXG4gIC8vIFVzZWQgdG8gc2lnbmlmeSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiB3aGljaCBsb29rcyBsaWtlIGFcbiAgLy8gdHlwZWQgYXJyb3cgZnVuY3Rpb24sIGJ1dCBpdCBpc24ndFxuICAvLyBlLmcuIGEgPyAoYikgOiBjID0+IGRcbiAgLy8gICAgICAgICAgXlxuICBub0Fycm93QXQ6IG51bWJlcltdID0gW107XG5cbiAgLy8gVXNlZCB0byBzaWduaWZ5IHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uIHdob3NlIHBhcmFtcywgaWYgaXQgbG9va3MgbGlrZVxuICAvLyBhbiBhcnJvdyBmdW5jdGlvbiwgc2hvdWxkbid0IGJlIGNvbnZlcnRlZCB0byBhc3NpZ25hYmxlIG5vZGVzLlxuICAvLyBUaGlzIGlzIHVzZWQgdG8gZGVmZXIgdGhlIHZhbGlkYXRpb24gb2YgdHlwZWQgYXJyb3cgZnVuY3Rpb25zIGluc2lkZVxuICAvLyBjb25kaXRpb25hbCBleHByZXNzaW9ucy5cbiAgLy8gZS5nLiBhID8gKGIpIDogYyA9PiBkXG4gIC8vICAgICAgICAgIF5cbiAgbm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdDogbnVtYmVyW10gPSBbXTtcblxuICAvLyBGbGFncyB0byB0cmFja1xuICBtYXliZUluQXJyb3dQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIGluVHlwZTogYm9vbGVhbiA9IGZhbHNlO1xuICBub0Fub25GdW5jdGlvblR5cGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaGFzRmxvd0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNBbWJpZW50Q29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBpbkFic3RyYWN0Q2xhc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRm9yIHRoZSBIYWNrLXN0eWxlIHBpcGVsaW5lcyBwbHVnaW5cbiAgdG9waWNDb250ZXh0OiBUb3BpY0NvbnRleHRTdGF0ZSA9IHtcbiAgICBtYXhOdW1PZlJlc29sdmFibGVUb3BpY3M6IDAsXG4gICAgbWF4VG9waWNJbmRleDogbnVsbCxcbiAgfTtcblxuICAvLyBGb3IgdGhlIEYjLXN0eWxlIHBpcGVsaW5lcyBwbHVnaW5cbiAgc29sb0F3YWl0OiBib29sZWFuID0gZmFsc2U7XG4gIGluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gTGFiZWxzIGluIHNjb3BlLlxuICBsYWJlbHM6IEFycmF5PHtcbiAgICBraW5kOiBcImxvb3BcIiB8IFwic3dpdGNoXCIgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXRlbWVudFN0YXJ0PzogbnVtYmVyO1xuICB9PiA9IFtdO1xuXG4gIC8vIENvbW1lbnQgc3RvcmUgZm9yIFByb2dyYW0uY29tbWVudHNcbiAgY29tbWVudHM6IEFycmF5PE4uQ29tbWVudD4gPSBbXTtcblxuICAvLyBDb21tZW50IGF0dGFjaG1lbnQgc3RvcmVcbiAgY29tbWVudFN0YWNrOiBBcnJheTxDb21tZW50V2hpdGVzcGFjZT4gPSBbXTtcblxuICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9rZW5pemVyIGluIHRoZSBpbnB1dC5cbiAgcG9zOiBudW1iZXIgPSAwO1xuXG4gIC8vIFByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgdG9rZW46XG4gIC8vIEl0cyB0eXBlXG4gIHR5cGU6IFRva2VuVHlwZSA9IHR0LmVvZjtcblxuICAvLyBGb3IgdG9rZW5zIHRoYXQgaW5jbHVkZSBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlaXIgdHlwZSwgdGhlIHZhbHVlXG4gIHZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIC8vIEl0cyBzdGFydCBhbmQgZW5kIG9mZnNldFxuICBzdGFydDogbnVtYmVyID0gMDtcbiAgZW5kOiBudW1iZXIgPSAwO1xuXG4gIC8vIFBvc2l0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgcHJldmlvdXMgdG9rZW5cbiAgLy8gdGhpcyBpcyBpbml0aWFsaXplZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHNlY29uZCB0b2tlbi5cbiAgbGFzdFRva0VuZExvYzogUG9zaXRpb24gPSBudWxsO1xuICAvLyB0aGlzIGlzIGluaXRpYWxpemVkIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2Vjb25kIHRva2VuLlxuICBsYXN0VG9rU3RhcnRMb2M6IFBvc2l0aW9uID0gbnVsbDtcbiAgbGFzdFRva1N0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8vIFRoZSBjb250ZXh0IHN0YWNrIGlzIHVzZWQgdG8gdHJhY2sgd2hldGhlciB0aGUgYXBvc3Ryb3BoZSBcImBcIiBzdGFydHNcbiAgLy8gb3IgZW5kcyBhIHN0cmluZyB0ZW1wbGF0ZVxuICBjb250ZXh0OiBBcnJheTxUb2tDb250ZXh0PiA9IFtjdC5icmFjZV07XG4gIC8vIFVzZWQgdG8gdHJhY2sgd2hldGhlciBhIEpTWCBlbGVtZW50IGlzIGFsbG93ZWQgdG8gZm9ybVxuICBjYW5TdGFydEpTWEVsZW1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFVzZWQgdG8gc2lnbmFsIHRvIGNhbGxlcnMgb2YgYHJlYWRXb3JkMWAgd2hldGhlciB0aGUgd29yZFxuICAvLyBjb250YWluZWQgYW55IGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd29yZHMgd2l0aFxuICAvLyBlc2NhcGUgc2VxdWVuY2VzIG11c3Qgbm90IGJlIGludGVycHJldGVkIGFzIGtleXdvcmRzLlxuICBjb250YWluc0VzYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFVzZWQgdG8gdHJhY2sgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VzIGluIHRlbXBsYXRlIGxpdGVyYWxzLFxuICAvLyB0aGF0IG11c3QgYmUgcmVwb3J0ZWQgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCB0YWdnZWQuXG4gIGZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zOiBudWxsIHwgUG9zaXRpb24gPSBudWxsO1xuXG4gIC8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byB0cmFjayB0aGUgZm9sbG93aW5nIGVycm9yc1xuICAvLyAtIFN0cmljdE51bWVyaWNFc2NhcGVcbiAgLy8gLSBTdHJpY3RPY3RhbExpdGVyYWxcbiAgLy9cbiAgLy8gaW4gYSBsaXRlcmFsIHRoYXQgb2NjdXJzIHByaW9yIHRvL2ltbWVkaWF0ZWx5IGFmdGVyIGEgXCJ1c2Ugc3RyaWN0XCIgZGlyZWN0aXZlLlxuXG4gIC8vIHRvZG8oSkxId3VuZyk6IHNldCBzdHJpY3RFcnJvcnMgdG8gbnVsbCBhbmQgYXZvaWQgcmVjb3JkaW5nIHN0cmluZyBlcnJvcnNcbiAgLy8gYWZ0ZXIgYSBub24tZGlyZWN0aXZlIGlzIHBhcnNlZFxuICBzdHJpY3RFcnJvcnM6IE1hcDxudW1iZXIsIFtEZWZlcnJlZFN0cmljdEVycm9yLCBQb3NpdGlvbl0+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIFRva2VucyBsZW5ndGggaW4gdG9rZW4gc3RvcmVcbiAgdG9rZW5zTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gIGN1clBvc2l0aW9uKCk6IFBvc2l0aW9uIHtcbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMuY3VyTGluZSwgdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydCwgdGhpcy5wb3MpO1xuICB9XG5cbiAgY2xvbmUoc2tpcEFycmF5cz86IGJvb2xlYW4pOiBTdGF0ZSB7XG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcykgYXMgKGtleW9mIFN0YXRlKVtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgbGV0IHZhbCA9IHRoaXNba2V5XTtcblxuICAgICAgaWYgKCFza2lwQXJyYXlzICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YWwgPSB2YWwuc2xpY2UoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB2YWwgbXVzdCBjb25mb3JtIHRvIFNba2V5XVxuICAgICAgc3RhdGVba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9va2FoZWFkU3RhdGUgPSB7XG4gIHBvczogbnVtYmVyO1xuICB2YWx1ZTogYW55O1xuICB0eXBlOiBUb2tlblR5cGU7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICBjb250ZXh0OiBUb2tDb250ZXh0W107XG4gIHN0YXJ0TG9jOiBQb3NpdGlvbjtcbiAgbGFzdFRva0VuZExvYzogUG9zaXRpb247XG4gIGN1ckxpbmU6IG51bWJlcjtcbiAgbGluZVN0YXJ0OiBudW1iZXI7XG4gIGN1clBvc2l0aW9uOiAoKSA9PiBQb3NpdGlvbjtcbiAgLyogVXNlZCBvbmx5IGluIHJlYWRUb2tlbl9tdWx0X21vZHVsbyAqL1xuICBpblR5cGU6IGJvb2xlYW47XG4gIC8vIFRoZXNlIGJvb2xlYW4gcHJvcGVydGllcyBhcmUgbm90IGluaXRpYWxpemVkIGluIGNyZWF0ZUxvb2thaGVhZFN0YXRlKClcbiAgLy8gaW5zdGVhZCB0aGV5IHdpbGwgb25seSBiZSBzZXQgYnkgdGhlIHRva2VuaXplclxuICBjb250YWluc0VzYz86IGJvb2xlYW47XG59O1xuIiwgImltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5cbi8vIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGNvZGVzIGFyZSBmb3JiaWRkZW4gZnJvbSBiZWluZ1xuLy8gYW4gaW1tZWRpYXRlIHNpYmxpbmcgb2YgTnVtZXJpY0xpdGVyYWxTZXBhcmF0b3IgX1xuY29uc3QgZm9yYmlkZGVuTnVtZXJpY1NlcGFyYXRvclNpYmxpbmdzID0ge1xuICBkZWNCaW5PY3Q6IG5ldyBTZXQ8bnVtYmVyPihbXG4gICAgY2hhckNvZGVzLmRvdCxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlQixcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlRSxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlTyxcbiAgICBjaGFyQ29kZXMudW5kZXJzY29yZSwgLy8gbXVsdGlwbGUgc2VwYXJhdG9ycyBhcmUgbm90IGFsbG93ZWRcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlQixcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlRSxcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlTyxcbiAgXSksXG4gIGhleDogbmV3IFNldDxudW1iZXI+KFtcbiAgICBjaGFyQ29kZXMuZG90LFxuICAgIGNoYXJDb2Rlcy51cHBlcmNhc2VYLFxuICAgIGNoYXJDb2Rlcy51bmRlcnNjb3JlLCAvLyBtdWx0aXBsZSBzZXBhcmF0b3JzIGFyZSBub3QgYWxsb3dlZFxuICAgIGNoYXJDb2Rlcy5sb3dlcmNhc2VYLFxuICBdKSxcbn07XG5cbmNvbnN0IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nID0ge1xuICAvLyAwIC0gMVxuICBiaW46IChjaDogbnVtYmVyKSA9PiBjaCA9PT0gY2hhckNvZGVzLmRpZ2l0MCB8fCBjaCA9PT0gY2hhckNvZGVzLmRpZ2l0MSxcblxuICAvLyAwIC0gN1xuICBvY3Q6IChjaDogbnVtYmVyKSA9PiBjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDcsXG5cbiAgLy8gMCAtIDlcbiAgZGVjOiAoY2g6IG51bWJlcikgPT4gY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ5LFxuXG4gIC8vIDAgLSA5LCBBIC0gRiwgYSAtIGYsXG4gIGhleDogKGNoOiBudW1iZXIpID0+XG4gICAgKGNoID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgY2ggPD0gY2hhckNvZGVzLmRpZ2l0OSkgfHxcbiAgICAoY2ggPj0gY2hhckNvZGVzLnVwcGVyY2FzZUEgJiYgY2ggPD0gY2hhckNvZGVzLnVwcGVyY2FzZUYpIHx8XG4gICAgKGNoID49IGNoYXJDb2Rlcy5sb3dlcmNhc2VBICYmIGNoIDw9IGNoYXJDb2Rlcy5sb3dlcmNhc2VGKSxcbn07XG5cbmV4cG9ydCB0eXBlIFN0cmluZ0NvbnRlbnRzRXJyb3JIYW5kbGVycyA9IEVzY2FwZWRDaGFyRXJyb3JIYW5kbGVycyAmIHtcbiAgdW50ZXJtaW5hdGVkKFxuICAgIGluaXRpYWxQb3M6IG51bWJlcixcbiAgICBpbml0aWFsTGluZVN0YXJ0OiBudW1iZXIsXG4gICAgaW5pdGlhbEN1ckxpbmU6IG51bWJlcixcbiAgKTogdm9pZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nQ29udGVudHMoXG4gIHR5cGU6IFwic2luZ2xlXCIgfCBcImRvdWJsZVwiIHwgXCJ0ZW1wbGF0ZVwiLFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgZXJyb3JzOiBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgaW5pdGlhbFBvcyA9IHBvcztcbiAgY29uc3QgaW5pdGlhbExpbmVTdGFydCA9IGxpbmVTdGFydDtcbiAgY29uc3QgaW5pdGlhbEN1ckxpbmUgPSBjdXJMaW5lO1xuXG4gIGxldCBvdXQgPSBcIlwiO1xuICBsZXQgZmlyc3RJbnZhbGlkTG9jID0gbnVsbDtcbiAgbGV0IGNodW5rU3RhcnQgPSBwb3M7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBpbnB1dDtcbiAgZm9yICg7Oykge1xuICAgIGlmIChwb3MgPj0gbGVuZ3RoKSB7XG4gICAgICBlcnJvcnMudW50ZXJtaW5hdGVkKGluaXRpYWxQb3MsIGluaXRpYWxMaW5lU3RhcnQsIGluaXRpYWxDdXJMaW5lKTtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmIChpc1N0cmluZ0VuZCh0eXBlLCBjaCwgaW5wdXQsIHBvcykpIHtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgb3V0ICs9IGlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHBvcyk7XG4gICAgICBjb25zdCByZXMgPSByZWFkRXNjYXBlZENoYXIoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgdHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApO1xuICAgICAgaWYgKHJlcy5jaCA9PT0gbnVsbCAmJiAhZmlyc3RJbnZhbGlkTG9jKSB7XG4gICAgICAgIGZpcnN0SW52YWxpZExvYyA9IHsgcG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSByZXMuY2g7XG4gICAgICB9XG4gICAgICAoeyBwb3MsIGxpbmVTdGFydCwgY3VyTGluZSB9ID0gcmVzKTtcbiAgICAgIGNodW5rU3RhcnQgPSBwb3M7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoID09PSBjaGFyQ29kZXMubGluZVNlcGFyYXRvciB8fFxuICAgICAgY2ggPT09IGNoYXJDb2Rlcy5wYXJhZ3JhcGhTZXBhcmF0b3JcbiAgICApIHtcbiAgICAgICsrcG9zO1xuICAgICAgKytjdXJMaW5lO1xuICAgICAgbGluZVN0YXJ0ID0gcG9zO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IGNoYXJDb2Rlcy5saW5lRmVlZCB8fCBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuKSB7XG4gICAgICBpZiAodHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpICsgXCJcXG5cIjtcbiAgICAgICAgKytwb3M7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuICYmXG4gICAgICAgICAgaW5wdXQuY2hhckNvZGVBdChwb3MpID09PSBjaGFyQ29kZXMubGluZUZlZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgKytwb3M7XG4gICAgICAgIH1cbiAgICAgICAgKytjdXJMaW5lO1xuICAgICAgICBjaHVua1N0YXJ0ID0gbGluZVN0YXJ0ID0gcG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnVudGVybWluYXRlZChpbml0aWFsUG9zLCBpbml0aWFsTGluZVN0YXJ0LCBpbml0aWFsQ3VyTGluZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICsrcG9zO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgID8geyBwb3MsIHN0cjogb3V0LCBmaXJzdEludmFsaWRMb2MsIGxpbmVTdGFydCwgY3VyTGluZSB9XG4gICAgOiB7XG4gICAgICAgIHBvcyxcbiAgICAgICAgc3RyOiBvdXQsXG4gICAgICAgIGZpcnN0SW52YWxpZExvYyxcbiAgICAgICAgbGluZVN0YXJ0LFxuICAgICAgICBjdXJMaW5lLFxuICAgICAgICBjb250YWluc0ludmFsaWQ6ICEhZmlyc3RJbnZhbGlkTG9jLFxuICAgICAgfTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdFbmQoXG4gIHR5cGU6IFwic2luZ2xlXCIgfCBcImRvdWJsZVwiIHwgXCJ0ZW1wbGF0ZVwiLFxuICBjaDogbnVtYmVyLFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbikge1xuICBpZiAodHlwZSA9PT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoID09PSBjaGFyQ29kZXMuZ3JhdmVBY2NlbnQgfHxcbiAgICAgIChjaCA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ24gJiZcbiAgICAgICAgaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBjaCA9PT0gKHR5cGUgPT09IFwiZG91YmxlXCIgPyBjaGFyQ29kZXMucXVvdGF0aW9uTWFyayA6IGNoYXJDb2Rlcy5hcG9zdHJvcGhlKVxuICApO1xufVxuXG50eXBlIEVzY2FwZWRDaGFyRXJyb3JIYW5kbGVycyA9IEhleENoYXJFcnJvckhhbmRsZXJzICZcbiAgQ29kZVBvaW50RXJyb3JIYW5kbGVycyAmIHtcbiAgICBzdHJpY3ROdW1lcmljRXNjYXBlKHBvczogbnVtYmVyLCBsaW5lU3RhcnQ6IG51bWJlciwgY3VyTGluZTogbnVtYmVyKTogdm9pZDtcbiAgfTtcblxuZnVuY3Rpb24gcmVhZEVzY2FwZWRDaGFyKFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgaW5UZW1wbGF0ZTogYm9vbGVhbixcbiAgZXJyb3JzOiBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgdGhyb3dPbkludmFsaWQgPSAhaW5UZW1wbGF0ZTtcbiAgcG9zKys7IC8vIHNraXAgJ1xcJ1xuXG4gIGNvbnN0IHJlcyA9IChjaDogc3RyaW5nIHwgbnVsbCkgPT4gKHsgcG9zLCBjaCwgbGluZVN0YXJ0LCBjdXJMaW5lIH0pO1xuXG4gIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MrKyk7XG4gIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VOOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcblwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VSOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcclwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VYOiB7XG4gICAgICBsZXQgY29kZTtcbiAgICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgMixcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApKTtcbiAgICAgIHJldHVybiByZXMoY29kZSA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgICB9XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVToge1xuICAgICAgbGV0IGNvZGU7XG4gICAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRDb2RlUG9pbnQoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBwb3MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICkpO1xuICAgICAgcmV0dXJuIHJlcyhjb2RlID09PSBudWxsID8gbnVsbCA6IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpKTtcbiAgICB9XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVDpcbiAgICAgIHJldHVybiByZXMoXCJcXHRcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlQjpcbiAgICAgIHJldHVybiByZXMoXCJcXGJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlVjpcbiAgICAgIHJldHVybiByZXMoXCJcXHUwMDBiXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZUY6XG4gICAgICByZXR1cm4gcmVzKFwiXFxmXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocG9zKSA9PT0gY2hhckNvZGVzLmxpbmVGZWVkKSB7XG4gICAgICAgICsrcG9zO1xuICAgICAgfVxuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVGZWVkOlxuICAgICAgbGluZVN0YXJ0ID0gcG9zO1xuICAgICAgKytjdXJMaW5lO1xuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgY2FzZSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yOlxuICAgICAgcmV0dXJuIHJlcyhcIlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDg6XG4gICAgY2FzZSBjaGFyQ29kZXMuZGlnaXQ5OlxuICAgICAgaWYgKGluVGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHJlcyhudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy5zdHJpY3ROdW1lcmljRXNjYXBlKHBvcyAtIDEsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDcpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3MgLSAxO1xuICAgICAgICBjb25zdCBtYXRjaCA9IGlucHV0LnNsaWNlKHN0YXJ0UG9zLCBwb3MgKyAyKS5tYXRjaCgvXlswLTddKy8pITtcblxuICAgICAgICBsZXQgb2N0YWxTdHIgPSBtYXRjaFswXTtcblxuICAgICAgICBsZXQgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICAgIGlmIChvY3RhbCA+IDI1NSkge1xuICAgICAgICAgIG9jdGFsU3RyID0gb2N0YWxTdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgIG9jdGFsID0gcGFyc2VJbnQob2N0YWxTdHIsIDgpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyArPSBvY3RhbFN0ci5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgb2N0YWxTdHIgIT09IFwiMFwiIHx8XG4gICAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmRpZ2l0OCB8fFxuICAgICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5kaWdpdDlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGluVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXMobnVsbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5zdHJpY3ROdW1lcmljRXNjYXBlKHN0YXJ0UG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXMoU3RyaW5nLmZyb21DaGFyQ29kZShvY3RhbCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTtcbiAgfVxufVxuXG50eXBlIEhleENoYXJFcnJvckhhbmRsZXJzID0gSW50RXJyb3JIYW5kbGVycyAmIHtcbiAgaW52YWxpZEVzY2FwZVNlcXVlbmNlKHBvczogbnVtYmVyLCBsaW5lU3RhcnQ6IG51bWJlciwgY3VyTGluZTogbnVtYmVyKTogdm9pZDtcbn07XG5cbi8vIFVzZWQgdG8gcmVhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyAoJ1xceCcsICdcXHUnKS5cbmZ1bmN0aW9uIHJlYWRIZXhDaGFyKFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgbGVuOiBudW1iZXIsXG4gIGZvcmNlTGVuOiBib29sZWFuLFxuICB0aHJvd09uSW52YWxpZDogYm9vbGVhbixcbiAgZXJyb3JzOiBIZXhDaGFyRXJyb3JIYW5kbGVycyxcbikge1xuICBjb25zdCBpbml0aWFsUG9zID0gcG9zO1xuICBsZXQgbjtcbiAgKHsgbiwgcG9zIH0gPSByZWFkSW50KFxuICAgIGlucHV0LFxuICAgIHBvcyxcbiAgICBsaW5lU3RhcnQsXG4gICAgY3VyTGluZSxcbiAgICAxNixcbiAgICBsZW4sXG4gICAgZm9yY2VMZW4sXG4gICAgZmFsc2UsXG4gICAgZXJyb3JzLFxuICAgIC8qIGJhaWxPbkVycm9yICovICF0aHJvd09uSW52YWxpZCxcbiAgKSk7XG4gIGlmIChuID09PSBudWxsKSB7XG4gICAgaWYgKHRocm93T25JbnZhbGlkKSB7XG4gICAgICBlcnJvcnMuaW52YWxpZEVzY2FwZVNlcXVlbmNlKGluaXRpYWxQb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcyA9IGluaXRpYWxQb3MgLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjb2RlOiBuLCBwb3MgfTtcbn1cblxuZXhwb3J0IHR5cGUgSW50RXJyb3JIYW5kbGVycyA9IHtcbiAgbnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICApOiB2b2lkO1xuICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcihcbiAgICBwb3M6IG51bWJlcixcbiAgICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgICBjdXJMaW5lOiBudW1iZXIsXG4gICk6IHZvaWQ7XG4gIC8vIEl0IGNhbiByZXR1cm4gXCJ0cnVlXCIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3Igd2FzIGhhbmRsZWRcbiAgLy8gYW5kIHRoZSBpbnQgcGFyc2luZyBzaG91bGQgY29udGludWUuXG4gIGludmFsaWREaWdpdChcbiAgICBwb3M6IG51bWJlcixcbiAgICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgICBjdXJMaW5lOiBudW1iZXIsXG4gICAgcmFkaXg6IG51bWJlcixcbiAgKTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW50KFxuICBpbnB1dDogc3RyaW5nLFxuICBwb3M6IG51bWJlcixcbiAgbGluZVN0YXJ0OiBudW1iZXIsXG4gIGN1ckxpbmU6IG51bWJlcixcbiAgcmFkaXg6IG51bWJlcixcbiAgbGVuOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGZvcmNlTGVuOiBib29sZWFuLFxuICBhbGxvd051bVNlcGFyYXRvcjogYm9vbGVhbiB8IFwiYmFpbFwiLFxuICBlcnJvcnM6IEludEVycm9ySGFuZGxlcnMsXG4gIGJhaWxPbkVycm9yOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcG9zO1xuICBjb25zdCBmb3JiaWRkZW5TaWJsaW5ncyA9XG4gICAgcmFkaXggPT09IDE2XG4gICAgICA/IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncy5oZXhcbiAgICAgIDogZm9yYmlkZGVuTnVtZXJpY1NlcGFyYXRvclNpYmxpbmdzLmRlY0Jpbk9jdDtcbiAgY29uc3QgaXNBbGxvd2VkU2libGluZyA9XG4gICAgcmFkaXggPT09IDE2XG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLmhleFxuICAgICAgOiByYWRpeCA9PT0gMTBcbiAgICAgID8gaXNBbGxvd2VkTnVtZXJpY1NlcGFyYXRvclNpYmxpbmcuZGVjXG4gICAgICA6IHJhZGl4ID09PSA4XG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLm9jdFxuICAgICAgOiBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5iaW47XG5cbiAgbGV0IGludmFsaWQgPSBmYWxzZTtcbiAgbGV0IHRvdGFsID0gMDtcblxuICBmb3IgKGxldCBpID0gMCwgZSA9IGxlbiA9PSBudWxsID8gSW5maW5pdHkgOiBsZW47IGkgPCBlOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICAgIGxldCB2YWw7XG5cbiAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLnVuZGVyc2NvcmUgJiYgYWxsb3dOdW1TZXBhcmF0b3IgIT09IFwiYmFpbFwiKSB7XG4gICAgICBjb25zdCBwcmV2ID0gaW5wdXQuY2hhckNvZGVBdChwb3MgLSAxKTtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpO1xuXG4gICAgICBpZiAoIWFsbG93TnVtU2VwYXJhdG9yKSB7XG4gICAgICAgIGlmIChiYWlsT25FcnJvcikgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gICAgICAgIGVycm9ycy5udW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZShwb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBOdW1iZXIuaXNOYU4obmV4dCkgfHxcbiAgICAgICAgIWlzQWxsb3dlZFNpYmxpbmcobmV4dCkgfHxcbiAgICAgICAgZm9yYmlkZGVuU2libGluZ3MuaGFzKHByZXYpIHx8XG4gICAgICAgIGZvcmJpZGRlblNpYmxpbmdzLmhhcyhuZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChiYWlsT25FcnJvcikgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gICAgICAgIGVycm9ycy51bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcihwb3MsIGxpbmVTdGFydCwgY3VyTGluZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElnbm9yZSB0aGlzIF8gY2hhcmFjdGVyXG4gICAgICArK3BvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjb2RlID49IGNoYXJDb2Rlcy5sb3dlcmNhc2VBKSB7XG4gICAgICB2YWwgPSBjb2RlIC0gY2hhckNvZGVzLmxvd2VyY2FzZUEgKyBjaGFyQ29kZXMubGluZUZlZWQ7XG4gICAgfSBlbHNlIGlmIChjb2RlID49IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSB7XG4gICAgICB2YWwgPSBjb2RlIC0gY2hhckNvZGVzLnVwcGVyY2FzZUEgKyBjaGFyQ29kZXMubGluZUZlZWQ7XG4gICAgfSBlbHNlIGlmIChjaGFyQ29kZXMuaXNEaWdpdChjb2RlKSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy5kaWdpdDA7IC8vIDAtOVxuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSBJbmZpbml0eTtcbiAgICB9XG4gICAgaWYgKHZhbCA+PSByYWRpeCkge1xuICAgICAgLy8gSWYgd2UgZm91bmQgYSBkaWdpdCB3aGljaCBpcyB0b28gYmlnLCBlcnJvcnMuaW52YWxpZERpZ2l0IGNhbiByZXR1cm4gdHJ1ZSB0byBhdm9pZFxuICAgICAgLy8gYnJlYWtpbmcgdGhlIGxvb3AgKHRoaXMgaXMgdXNlZCBmb3IgZXJyb3IgcmVjb3ZlcnkpLlxuICAgICAgaWYgKHZhbCA8PSA5ICYmIGJhaWxPbkVycm9yKSB7XG4gICAgICAgIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsIDw9IDkgJiZcbiAgICAgICAgZXJyb3JzLmludmFsaWREaWdpdChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSwgcmFkaXgpXG4gICAgICApIHtcbiAgICAgICAgdmFsID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoZm9yY2VMZW4pIHtcbiAgICAgICAgdmFsID0gMDtcbiAgICAgICAgaW52YWxpZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgKytwb3M7XG4gICAgdG90YWwgPSB0b3RhbCAqIHJhZGl4ICsgdmFsO1xuICB9XG4gIGlmIChwb3MgPT09IHN0YXJ0IHx8IChsZW4gIT0gbnVsbCAmJiBwb3MgLSBzdGFydCAhPT0gbGVuKSB8fCBpbnZhbGlkKSB7XG4gICAgcmV0dXJuIHsgbjogbnVsbCwgcG9zIH07XG4gIH1cblxuICByZXR1cm4geyBuOiB0b3RhbCwgcG9zIH07XG59XG5cbmV4cG9ydCB0eXBlIENvZGVQb2ludEVycm9ySGFuZGxlcnMgPSBIZXhDaGFyRXJyb3JIYW5kbGVycyAmIHtcbiAgaW52YWxpZENvZGVQb2ludChwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvZGVQb2ludChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIHRocm93T25JbnZhbGlkOiBib29sZWFuLFxuICBlcnJvcnM6IENvZGVQb2ludEVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgY2ggPSBpbnB1dC5jaGFyQ29kZUF0KHBvcyk7XG4gIGxldCBjb2RlO1xuXG4gIGlmIChjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlKSB7XG4gICAgKytwb3M7XG4gICAgKHsgY29kZSwgcG9zIH0gPSByZWFkSGV4Q2hhcihcbiAgICAgIGlucHV0LFxuICAgICAgcG9zLFxuICAgICAgbGluZVN0YXJ0LFxuICAgICAgY3VyTGluZSxcbiAgICAgIGlucHV0LmluZGV4T2YoXCJ9XCIsIHBvcykgLSBwb3MsXG4gICAgICB0cnVlLFxuICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICBlcnJvcnMsXG4gICAgKSk7XG4gICAgKytwb3M7XG4gICAgaWYgKGNvZGUgIT09IG51bGwgJiYgY29kZSA+IDB4MTBmZmZmKSB7XG4gICAgICBpZiAodGhyb3dPbkludmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLmludmFsaWRDb2RlUG9pbnQocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogbnVsbCwgcG9zIH07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICBpbnB1dCxcbiAgICAgIHBvcyxcbiAgICAgIGxpbmVTdGFydCxcbiAgICAgIGN1ckxpbmUsXG4gICAgICA0LFxuICAgICAgZmFsc2UsXG4gICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgIGVycm9ycyxcbiAgICApKTtcbiAgfVxuICByZXR1cm4geyBjb2RlLCBwb3MgfTtcbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCB7XG4gIFBvc2l0aW9uLFxuICBTb3VyY2VMb2NhdGlvbixcbiAgY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0LFxufSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IENvbW1lbnRzUGFyc2VyLCB7IHR5cGUgQ29tbWVudFdoaXRlc3BhY2UgfSBmcm9tIFwiLi4vcGFyc2VyL2NvbW1lbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyU3RhcnQsIGlzSWRlbnRpZmllckNoYXIgfSBmcm9tIFwiLi4vdXRpbC9pZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICB0b2tlbklzS2V5d29yZCxcbiAgdG9rZW5MYWJlbE5hbWUsXG4gIHR0LFxuICBrZXl3b3JkcyBhcyBrZXl3b3JkVHlwZXMsXG4gIHR5cGUgVG9rZW5UeXBlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgRXJyb3JzLFxuICB0eXBlIFBhcnNlRXJyb3IsXG4gIHR5cGUgUGFyc2VFcnJvckNvbnN0cnVjdG9yLFxuICB0eXBlIFJhaXNlUHJvcGVydGllcyxcbn0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQge1xuICBsaW5lQnJlYWtHLFxuICBpc05ld0xpbmUsXG4gIGlzV2hpdGVzcGFjZSxcbiAgc2tpcFdoaXRlU3BhY2UsXG4gIHNraXBXaGl0ZVNwYWNlSW5MaW5lLFxufSBmcm9tIFwiLi4vdXRpbC93aGl0ZXNwYWNlXCI7XG5pbXBvcnQgU3RhdGUgZnJvbSBcIi4vc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgTG9va2FoZWFkU3RhdGUsIERlZmVycmVkU3RyaWN0RXJyb3IgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuXG5pbXBvcnQge1xuICByZWFkSW50LFxuICByZWFkQ29kZVBvaW50LFxuICByZWFkU3RyaW5nQ29udGVudHMsXG4gIHR5cGUgSW50RXJyb3JIYW5kbGVycyxcbiAgdHlwZSBDb2RlUG9pbnRFcnJvckhhbmRsZXJzLFxuICB0eXBlIFN0cmluZ0NvbnRlbnRzRXJyb3JIYW5kbGVycyxcbn0gZnJvbSBcIkBiYWJlbC9oZWxwZXItc3RyaW5nLXBhcnNlclwiO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCIuLi90eXBpbmdzXCI7XG5cbmZ1bmN0aW9uIGJ1aWxkUG9zaXRpb24ocG9zOiBudW1iZXIsIGxpbmVTdGFydDogbnVtYmVyLCBjdXJMaW5lOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQb3NpdGlvbihjdXJMaW5lLCBwb3MgLSBsaW5lU3RhcnQsIHBvcyk7XG59XG5cbmNvbnN0IFZBTElEX1JFR0VYX0ZMQUdTID0gbmV3IFNldChbXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VHLFxuICBjaGFyQ29kZXMubG93ZXJjYXNlTSxcbiAgY2hhckNvZGVzLmxvd2VyY2FzZVMsXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VJLFxuICBjaGFyQ29kZXMubG93ZXJjYXNlWSxcbiAgY2hhckNvZGVzLmxvd2VyY2FzZVUsXG4gIGNoYXJDb2Rlcy5sb3dlcmNhc2VELFxuICBjaGFyQ29kZXMubG93ZXJjYXNlVixcbl0pO1xuXG4vLyBPYmplY3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0b2tlbnMuIE5vdGUgdGhhdCBub3JtYWxseSwgdG9rZW5zXG4vLyBzaW1wbHkgZXhpc3QgYXMgcHJvcGVydGllcyBvbiB0aGUgcGFyc2VyIG9iamVjdC4gVGhpcyBpcyBvbmx5XG4vLyB1c2VkIGZvciB0aGUgb25Ub2tlbiBjYWxsYmFjayBhbmQgdGhlIGV4dGVybmFsIHRva2VuaXplci5cblxuZXhwb3J0IGNsYXNzIFRva2VuIHtcbiAgY29uc3RydWN0b3Ioc3RhdGU6IFN0YXRlKSB7XG4gICAgdGhpcy50eXBlID0gc3RhdGUudHlwZTtcbiAgICB0aGlzLnZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdGhpcy5zdGFydCA9IHN0YXRlLnN0YXJ0O1xuICAgIHRoaXMuZW5kID0gc3RhdGUuZW5kO1xuICAgIHRoaXMubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXRlLnN0YXJ0TG9jLCBzdGF0ZS5lbmRMb2MpO1xuICB9XG5cbiAgZGVjbGFyZSB0eXBlOiBUb2tlblR5cGU7XG4gIGRlY2xhcmUgdmFsdWU6IGFueTtcbiAgZGVjbGFyZSBzdGFydDogbnVtYmVyO1xuICBkZWNsYXJlIGVuZDogbnVtYmVyO1xuICBkZWNsYXJlIGxvYzogU291cmNlTG9jYXRpb247XG59XG5cbi8vICMjIFRva2VuaXplclxuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBUb2tlbml6ZXIgZXh0ZW5kcyBDb21tZW50c1BhcnNlciB7XG4gIGlzTG9va2FoZWFkOiBib29sZWFuO1xuXG4gIC8vIFRva2VuIHN0b3JlLlxuICB0b2tlbnM6IEFycmF5PFRva2VuIHwgTi5Db21tZW50PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMsIGlucHV0OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUoKTtcbiAgICB0aGlzLnN0YXRlLmluaXQob3B0aW9ucyk7XG4gICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgIHRoaXMuaXNMb29rYWhlYWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1c2hUb2tlbih0b2tlbjogVG9rZW4gfCBOLkNvbW1lbnQpIHtcbiAgICAvLyBQb3Agb3V0IGludmFsaWQgdG9rZW5zIHRyYXBwZWQgYnkgdHJ5LWNhdGNoIHBhcnNpbmcuXG4gICAgLy8gVGhvc2UgcGFyc2luZyBicmFuY2hlcyBhcmUgbWFpbmx5IGNyZWF0ZWQgYnkgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zLlxuICAgIHRoaXMudG9rZW5zLmxlbmd0aCA9IHRoaXMuc3RhdGUudG9rZW5zTGVuZ3RoO1xuICAgIHRoaXMudG9rZW5zLnB1c2godG9rZW4pO1xuICAgICsrdGhpcy5zdGF0ZS50b2tlbnNMZW5ndGg7XG4gIH1cblxuICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHRva2VuXG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrS2V5d29yZEVzY2FwZXMoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRva2Vucykge1xuICAgICAgdGhpcy5wdXNoVG9rZW4obmV3IFRva2VuKHRoaXMuc3RhdGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCA9IHRoaXMuc3RhdGUuc3RhcnQ7XG4gICAgdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jID0gdGhpcy5zdGF0ZS5lbmRMb2M7XG4gICAgdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gIH1cblxuICBlYXQodHlwZTogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWF0Y2godHlwZSkpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBjdXJyZW50IHRva2VuIG1hdGNoZXMgZ2l2ZW4gdHlwZVxuICAgKi9cbiAgbWF0Y2godHlwZTogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUudHlwZSA9PT0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMb29rYWhlYWRTdGF0ZSBmcm9tIGN1cnJlbnQgcGFyc2VyIHN0YXRlXG4gICAqL1xuICBjcmVhdGVMb29rYWhlYWRTdGF0ZShzdGF0ZTogU3RhdGUpOiBMb29rYWhlYWRTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvczogc3RhdGUucG9zLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB0eXBlOiBzdGF0ZS50eXBlLFxuICAgICAgc3RhcnQ6IHN0YXRlLnN0YXJ0LFxuICAgICAgZW5kOiBzdGF0ZS5lbmQsXG4gICAgICBjb250ZXh0OiBbdGhpcy5jdXJDb250ZXh0KCldLFxuICAgICAgaW5UeXBlOiBzdGF0ZS5pblR5cGUsXG4gICAgICBzdGFydExvYzogc3RhdGUuc3RhcnRMb2MsXG4gICAgICBsYXN0VG9rRW5kTG9jOiBzdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgY3VyTGluZTogc3RhdGUuY3VyTGluZSxcbiAgICAgIGxpbmVTdGFydDogc3RhdGUubGluZVN0YXJ0LFxuICAgICAgY3VyUG9zaXRpb246IHN0YXRlLmN1clBvc2l0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogbG9va2FoZWFkIHBlZWtzIHRoZSBuZXh0IHRva2VuLCBza2lwcGluZyBjaGFuZ2VzIHRvIHRva2VuIGNvbnRleHQgYW5kXG4gICAqIGNvbW1lbnQgc3RhY2suIEZvciBwZXJmb3JtYW5jZSBpdCByZXR1cm5zIGEgbGltaXRlZCBMb29rYWhlYWRTdGF0ZVxuICAgKiBpbnN0ZWFkIG9mIGZ1bGwgcGFyc2VyIHN0YXRlLlxuICAgKlxuICAgKiBUaGUgeyBjb2x1bW4sIGxpbmUgfSBMb2MgaW5mbyBpcyBub3QgaW5jbHVkZWQgaW4gbG9va2FoZWFkIHNpbmNlIHN1Y2ggdXNhZ2VcbiAgICogaXMgcmFyZS4gQWx0aG91Z2ggaXQgbWF5IHJldHVybiBvdGhlciBsb2NhdGlvbiBwcm9wZXJ0aWVzIGUuZy4gYGN1ckxpbmVgIGFuZFxuICAgKiBgbGluZVN0YXJ0YCwgdGhlc2UgcHJvcGVydGllcyBhcmUgbm90IGxpc3RlZCBpbiB0aGUgTG9va2FoZWFkU3RhdGUgaW50ZXJmYWNlXG4gICAqIGFuZCB0aHVzIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBfTk9UXyByZWxpYWJsZS5cbiAgICpcbiAgICogVGhlIHRva2VuaXplciBzaG91bGQgbWFrZSBiZXN0IGVmZm9ydHMgdG8gYXZvaWQgdXNpbmcgYW55IHBhcnNlciBzdGF0ZVxuICAgKiBvdGhlciB0aGFuIHRob3NlIGRlZmluZWQgaW4gTG9va2FoZWFkU3RhdGVcbiAgICovXG4gIGxvb2thaGVhZCgpOiBMb29rYWhlYWRTdGF0ZSB7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5zdGF0ZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZvciBwZXJmb3JtYW5jZSB3ZSB1c2UgYSBzaW1wbGlmaWVkIHRva2VuaXplciBzdGF0ZSBzdHJ1Y3R1cmVcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5jcmVhdGVMb29rYWhlYWRTdGF0ZShvbGQpO1xuXG4gICAgdGhpcy5pc0xvb2thaGVhZCA9IHRydWU7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB0aGlzLmlzTG9va2FoZWFkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjdXJyID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnN0YXRlID0gb2xkO1xuICAgIHJldHVybiBjdXJyO1xuICB9XG5cbiAgbmV4dFRva2VuU3RhcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW5TdGFydFNpbmNlKHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIG5leHRUb2tlblN0YXJ0U2luY2UocG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA9IHBvcztcbiAgICByZXR1cm4gc2tpcFdoaXRlU3BhY2UudGVzdCh0aGlzLmlucHV0KSA/IHNraXBXaGl0ZVNwYWNlLmxhc3RJbmRleCA6IHBvcztcbiAgfVxuXG4gIGxvb2thaGVhZENoYXJDb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLm5leHRUb2tlblN0YXJ0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gbmV4dFRva2VuLCBidXQgaXQgd2lsbCBzdG9wIGF0IGxpbmUgYnJlYWsgd2hlbiBpdCBpcyBzZWVuIGJlZm9yZSB0aGUgbmV4dCB0b2tlblxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0b2tlbiBzdGFydCBvciBsaW5lIGJyZWFrLCB3aGljaGV2ZXIgaXMgc2VlbiBmaXJzdC5cbiAgICogQG1lbWJlcm9mIFRva2VuaXplclxuICAgKi9cbiAgbmV4dFRva2VuSW5MaW5lU3RhcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydFNpbmNlKHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIG5leHRUb2tlbkluTGluZVN0YXJ0U2luY2UocG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHNraXBXaGl0ZVNwYWNlSW5MaW5lLmxhc3RJbmRleCA9IHBvcztcbiAgICByZXR1cm4gc2tpcFdoaXRlU3BhY2VJbkxpbmUudGVzdCh0aGlzLmlucHV0KVxuICAgICAgPyBza2lwV2hpdGVTcGFjZUluTGluZS5sYXN0SW5kZXhcbiAgICAgIDogcG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gbG9va2FoZWFkQ2hhckNvZGUsIGJ1dCBpdCB3aWxsIHJldHVybiB0aGUgY2hhciBjb2RlIG9mIGxpbmUgYnJlYWsgaWYgaXQgaXNcbiAgICogc2VlbiBiZWZvcmUgdGhlIG5leHQgdG9rZW5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gY2hhciBjb2RlIG9mIHRoZSBuZXh0IHRva2VuIHN0YXJ0IG9yIGxpbmUgYnJlYWssIHdoaWNoZXZlciBpcyBzZWVuIGZpcnN0LlxuICAgKiBAbWVtYmVyb2YgVG9rZW5pemVyXG4gICAqL1xuICBsb29rYWhlYWRJbkxpbmVDaGFyQ29kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydCgpKTtcbiAgfVxuXG4gIGNvZGVQb2ludEF0UG9zKHBvczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb25cbiAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFzdGVyOnY4L3NyYy9idWlsdGlucy9idWlsdGlucy1zdHJpbmctZ2VuLmNjO2w9MTQ1NTtkcmM9MjIxZTMzMWI0OWRmZWZhZGJjNmZhNDBiMGM2OGU2Zjk3NjA2ZDBiMzticHY9MDticHQ9MVxuICAgIC8vIFdlIHJlaW1wbGVtZW50IGBjb2RlUG9pbnRBdGAgYmVjYXVzZSBgY29kZVBvaW50QXRgIGlzIGEgVjggYnVpbHRpbiB3aGljaCBpcyBub3QgaW5saW5lZCBieSBUdXJib0ZhbiAoYXMgb2YgTTkxKVxuICAgIC8vIHNpbmNlIGBpbnB1dGAgaXMgbW9zdGx5IEFTQ0lJLCBhbiBpbmxpbmVkIGBjaGFyQ29kZUF0YCB3aW5zIGhlcmVcbiAgICBsZXQgY3AgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoKGNwICYgMHhmYzAwKSA9PT0gMHhkODAwICYmICsrcG9zIDwgdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRyYWlsID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoKHRyYWlsICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGNwID0gMHgxMDAwMCArICgoY3AgJiAweDNmZikgPDwgMTApICsgKHRyYWlsICYgMHgzZmYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3A7XG4gIH1cblxuICAvLyBUb2dnbGUgc3RyaWN0IG1vZGUuIFJlLXJlYWRzIHRoZSBuZXh0IG51bWJlciBvciBzdHJpbmcgdG8gcGxlYXNlXG4gIC8vIHBlZGFudGljIHRlc3RzIChgXCJ1c2Ugc3RyaWN0XCI7IDAxMDtgIHNob3VsZCBmYWlsKS5cblxuICBzZXRTdHJpY3Qoc3RyaWN0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zdHJpY3QgPSBzdHJpY3Q7XG4gICAgaWYgKHN0cmljdCkge1xuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgZm9yIGFueSBzdHJpbmcgZGVjaW1hbCBlc2NhcGUgZm91bmQgYmVmb3JlL2ltbWVkaWF0ZWx5XG4gICAgICAvLyBhZnRlciBhIFwidXNlIHN0cmljdFwiIGRpcmVjdGl2ZS4gU3RyaWN0IG1vZGUgd2lsbCBiZSBzZXQgYXQgcGFyc2VcbiAgICAgIC8vIHRpbWUgZm9yIGFueSBsaXRlcmFscyB0aGF0IG9jY3VyIGFmdGVyIHRoZSBuZXh0IG5vZGUgb2YgdGhlIHN0cmljdFxuICAgICAgLy8gZGlyZWN0aXZlLlxuICAgICAgdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuZm9yRWFjaCgoW3RvUGFyc2VFcnJvciwgYXRdKSA9PlxuICAgICAgICB0aGlzLnJhaXNlKHRvUGFyc2VFcnJvciwgeyBhdCB9KSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0YXRlLnN0cmljdEVycm9ycy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGN1ckNvbnRleHQoKTogVG9rQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuY29udGV4dFt0aGlzLnN0YXRlLmNvbnRleHQubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBSZWFkIGEgc2luZ2xlIHRva2VuLCB1cGRhdGluZyB0aGUgcGFyc2VyIG9iamVjdCdzIHRva2VuLXJlbGF0ZWQgcHJvcGVydGllcy5cbiAgbmV4dFRva2VuKCk6IHZvaWQge1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIGlmICghdGhpcy5pc0xvb2thaGVhZCkgdGhpcy5zdGF0ZS5zdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuZW9mKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmdldFRva2VuRnJvbUNvZGUodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykpO1xuICB9XG5cbiAgLy8gU2tpcHMgYSBibG9jayBjb21tZW50LCB3aG9zZSBlbmQgaXMgbWFya2VkIGJ5IGNvbW1lbnRFbmQuXG4gIC8vICotLyBpcyB1c2VkIGJ5IHRoZSBGbG93IHBsdWdpbiwgd2hlbiBwYXJzaW5nIGJsb2NrIGNvbW1lbnRzIG5lc3RlZFxuICAvLyBpbnNpZGUgRmxvdyBjb21tZW50cy5cbiAgc2tpcEJsb2NrQ29tbWVudChjb21tZW50RW5kOiBcIiovXCIgfCBcIiotL1wiKTogTi5Db21tZW50QmxvY2sgfCB1bmRlZmluZWQge1xuICAgIGxldCBzdGFydExvYztcbiAgICBpZiAoIXRoaXMuaXNMb29rYWhlYWQpIHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dC5pbmRleE9mKGNvbW1lbnRFbmQsIHN0YXJ0ICsgMik7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIGhhdmUgdG8gY2FsbCB0aGlzIGFnYWluIGhlcmUgYmVjYXVzZSBzdGFydExvYyBtYXkgbm90IGJlIHNldC4uLlxuICAgICAgLy8gVGhpcyBzZWVtcyB0byBiZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9jb21taXQvYWNmMmExMDg5OWY2OTZhOGFhZjM0ZGY3OGJmOTcyNWI1ZWE3ZjJkYVxuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkQ29tbWVudCwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBlbmQgKyBjb21tZW50RW5kLmxlbmd0aDtcbiAgICBsaW5lQnJlYWtHLmxhc3RJbmRleCA9IHN0YXJ0ICsgMjtcbiAgICB3aGlsZSAobGluZUJyZWFrRy50ZXN0KHRoaXMuaW5wdXQpICYmIGxpbmVCcmVha0cubGFzdEluZGV4IDw9IGVuZCkge1xuICAgICAgKyt0aGlzLnN0YXRlLmN1ckxpbmU7XG4gICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCA9IGxpbmVCcmVha0cubGFzdEluZGV4O1xuICAgIH1cblxuICAgIC8vIElmIHdlIGFyZSBkb2luZyBhIGxvb2thaGVhZCByaWdodCBub3cgd2UgbmVlZCB0byBhZHZhbmNlIHRoZSBwb3NpdGlvbiAoYWJvdmUgY29kZSlcbiAgICAvLyBidXQgd2UgZG8gbm90IHdhbnQgdG8gcHVzaCB0aGUgY29tbWVudCB0byB0aGUgc3RhdGUuXG4gICAgaWYgKHRoaXMuaXNMb29rYWhlYWQpIHJldHVybjtcbiAgICAvKjo6IGludmFyaWFudChzdGFydExvYykgKi9cblxuICAgIGNvbnN0IGNvbW1lbnQ6IE4uQ29tbWVudEJsb2NrID0ge1xuICAgICAgdHlwZTogXCJDb21tZW50QmxvY2tcIixcbiAgICAgIHZhbHVlOiB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgZW5kKSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kOiBlbmQgKyBjb21tZW50RW5kLmxlbmd0aCxcbiAgICAgIGxvYzogbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXJ0TG9jLCB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkpLFxuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbnMpIHRoaXMucHVzaFRva2VuKGNvbW1lbnQpO1xuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgc2tpcExpbmVDb21tZW50KHN0YXJ0U2tpcDogbnVtYmVyKTogTi5Db21tZW50TGluZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBsZXQgc3RhcnRMb2M7XG4gICAgaWYgKCF0aGlzLmlzTG9va2FoZWFkKSBzdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBsZXQgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKHRoaXMuc3RhdGUucG9zICs9IHN0YXJ0U2tpcCkpO1xuICAgIGlmICh0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICB3aGlsZSAoIWlzTmV3TGluZShjaCkgJiYgKyt0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBhcmUgZG9pbmcgYSBsb29rYWhlYWQgcmlnaHQgbm93IHdlIG5lZWQgdG8gYWR2YW5jZSB0aGUgcG9zaXRpb24gKGFib3ZlIGNvZGUpXG4gICAgLy8gYnV0IHdlIGRvIG5vdCB3YW50IHRvIHB1c2ggdGhlIGNvbW1lbnQgdG8gdGhlIHN0YXRlLlxuICAgIGlmICh0aGlzLmlzTG9va2FoZWFkKSByZXR1cm47XG4gICAgLyo6OiBpbnZhcmlhbnQoc3RhcnRMb2MpICovXG5cbiAgICBjb25zdCBlbmQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQgKyBzdGFydFNraXAsIGVuZCk7XG5cbiAgICBjb25zdCBjb21tZW50OiBOLkNvbW1lbnRMaW5lID0ge1xuICAgICAgdHlwZTogXCJDb21tZW50TGluZVwiLFxuICAgICAgdmFsdWUsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZCxcbiAgICAgIGxvYzogbmV3IFNvdXJjZUxvY2F0aW9uKHN0YXJ0TG9jLCB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkpLFxuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b2tlbnMpIHRoaXMucHVzaFRva2VuKGNvbW1lbnQpO1xuICAgIHJldHVybiBjb21tZW50O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgYW5kIGFmdGVyIGV2ZXJ5IHRva2VuLiBTa2lwc1xuICAvLyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgYW5kLlxuXG4gIHNraXBTcGFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzcGFjZVN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgY29uc3QgY29tbWVudHMgPSBbXTtcbiAgICBsb29wOiB3aGlsZSAodGhpcy5zdGF0ZS5wb3MgPCB0aGlzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIGNoYXJDb2Rlcy5zcGFjZTpcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMubm9uQnJlYWtpbmdTcGFjZTpcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMudGFiOlxuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMubGluZUZlZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgfVxuICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgY2FzZSBjaGFyQ29kZXMubGluZUZlZWQ6XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLmxpbmVTZXBhcmF0b3I6XG4gICAgICAgIGNhc2UgY2hhckNvZGVzLnBhcmFncmFwaFNlcGFyYXRvcjpcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5jdXJMaW5lO1xuICAgICAgICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjaGFyQ29kZXMuc2xhc2g6XG4gICAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKSkge1xuICAgICAgICAgICAgY2FzZSBjaGFyQ29kZXMuYXN0ZXJpc2s6IHtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcEJsb2NrQ29tbWVudChcIiovXCIpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBjaGFyQ29kZXMuc2xhc2g6IHtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNoKSkge1xuICAgICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5kYXNoICYmXG4gICAgICAgICAgICAhdGhpcy5pbk1vZHVsZSAmJlxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFubmV4QlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gY2hhckNvZGVzLmRhc2ggJiZcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDIpID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gJiZcbiAgICAgICAgICAgICAgKHNwYWNlU3RhcnQgPT09IDAgfHwgdGhpcy5zdGF0ZS5saW5lU3RhcnQgPiBzcGFjZVN0YXJ0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEEgYC0tPmAgbGluZSBjb21tZW50XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLnNraXBMaW5lQ29tbWVudCgzKTtcbiAgICAgICAgICAgICAgaWYgKGNvbW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF0dGFjaENvbW1lbnQpIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNoID09PSBjaGFyQ29kZXMubGVzc1RoYW4gJiZcbiAgICAgICAgICAgICF0aGlzLmluTW9kdWxlICYmXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYW5uZXhCXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrICYmXG4gICAgICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAyKSA9PT0gY2hhckNvZGVzLmRhc2ggJiZcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDMpID09PSBjaGFyQ29kZXMuZGFzaFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIGA8IS0tYCwgYW4gWE1MLXN0eWxlIGNvbW1lbnQgdGhhdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lIGNvbW1lbnRcbiAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuc2tpcExpbmVDb21tZW50KDQpO1xuICAgICAgICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuc3RhdGUucG9zO1xuICAgICAgY29uc3QgY29tbWVudFdoaXRlc3BhY2U6IENvbW1lbnRXaGl0ZXNwYWNlID0ge1xuICAgICAgICBzdGFydDogc3BhY2VTdGFydCxcbiAgICAgICAgZW5kLFxuICAgICAgICBjb21tZW50cyxcbiAgICAgICAgbGVhZGluZ05vZGU6IG51bGwsXG4gICAgICAgIHRyYWlsaW5nTm9kZTogbnVsbCxcbiAgICAgICAgY29udGFpbmluZ05vZGU6IG51bGwsXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0ZS5jb21tZW50U3RhY2sucHVzaChjb21tZW50V2hpdGVzcGFjZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgdG9rZW4uIFNldHMgYGVuZGAsIGB2YWxgLCBhbmRcbiAgLy8gbWFpbnRhaW5zIGBjb250ZXh0YCBhbmQgYGNhblN0YXJ0SlNYRWxlbWVudGAsIGFuZCBza2lwcyB0aGUgc3BhY2UgYWZ0ZXJcbiAgLy8gdGhlIHRva2VuLCBzbyB0aGF0IHRoZSBuZXh0IG9uZSdzIGBzdGFydGAgd2lsbCBwb2ludCBhdCB0aGVcbiAgLy8gcmlnaHQgcG9zaXRpb24uXG5cbiAgZmluaXNoVG9rZW4odHlwZTogVG9rZW5UeXBlLCB2YWw/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmVuZCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIHRoaXMuc3RhdGUuZW5kTG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGNvbnN0IHByZXZUeXBlID0gdGhpcy5zdGF0ZS50eXBlO1xuICAgIHRoaXMuc3RhdGUudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHZhbDtcblxuICAgIGlmICghdGhpcy5pc0xvb2thaGVhZCkge1xuICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHByZXZUeXBlKTtcbiAgICB9XG4gIH1cblxuICByZXBsYWNlVG9rZW4odHlwZTogVG9rZW5UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS50eXBlID0gdHlwZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBwcmV2VHlwZSBvZiB1cGRhdGVDb250ZXh0IGlzIHJlcXVpcmVkXG4gICAgLy8gb25seSB3aGVuIHRoZSBuZXcgdHlwZSBpcyB0dC5zbGFzaC90dC5qc3hUYWdFbmRcbiAgICB0aGlzLnVwZGF0ZUNvbnRleHQoKTtcbiAgfVxuXG4gIC8vICMjIyBUb2tlbiByZWFkaW5nXG5cbiAgLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gZmV0Y2ggdGhlIG5leHQgdG9rZW4uIEl0XG4gIC8vIGlzIHNvbWV3aGF0IG9ic2N1cmUsIGJlY2F1c2UgaXQgd29ya3MgaW4gY2hhcmFjdGVyIGNvZGVzIHJhdGhlclxuICAvLyB0aGFuIGNoYXJhY3RlcnMsIGFuZCBiZWNhdXNlIG9wZXJhdG9yIHBhcnNpbmcgaGFzIGJlZW4gaW5saW5lZFxuICAvLyBpbnRvIGl0LlxuICAvL1xuICAvLyBBbGwgaW4gdGhlIG5hbWUgb2Ygc3BlZWQuXG5cbiAgLy8gbnVtYmVyIHNpZ24gaXMgXCIjXCJcbiAgcmVhZFRva2VuX251bWJlclNpZ24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUucG9zID09PSAwICYmIHRoaXMucmVhZFRva2VuX2ludGVycHJldGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9zID0gdGhpcy5zdGF0ZS5wb3MgKyAxO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHRQb3MpO1xuICAgIGlmIChuZXh0ID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dCA8PSBjaGFyQ29kZXMuZGlnaXQ5KSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkRGlnaXRBZnRlckhhc2gsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSB8fFxuICAgICAgKG5leHQgPT09IGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldCAmJiB0aGlzLmhhc1BsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpKVxuICAgICkge1xuICAgICAgLy8gV2hlbiB3ZSBzZWUgYCN7YCwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgaGFzaCByZWNvcmQuXG4gICAgICAvLyBIb3dldmVyIHdlIGRvbid0IHllbGwgYXQgYCNbYCBzaW5jZSB1c2VycyBtYXkgaW50ZW5kIHRvIHVzZSBcImNvbXB1dGVkIHByaXZhdGUgZmllbGRzXCIsXG4gICAgICAvLyB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgc3BlYy4gVGhyb3dpbmcgZXhwZWN0aW5nIHJlY29yZEFuZFR1cGxlIGlzXG4gICAgICAvLyBtaXNsZWFkaW5nXG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpO1xuICAgICAgaWYgKHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwicmVjb3JkQW5kVHVwbGVcIiwgXCJzeW50YXhUeXBlXCIpID09PSBcImJhclwiKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoXG4gICAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlXG4gICAgICAgICAgICA/IEVycm9ycy5SZWNvcmRFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZVxuICAgICAgICAgICAgOiBFcnJvcnMuVHVwbGVFeHByZXNzaW9uSGFzaEluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICB7IGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2UpIHtcbiAgICAgICAgLy8gI3tcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFjZUhhc2hMKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICNbXG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2tldEhhc2hMKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzSWRlbnRpZmllclN0YXJ0KG5leHQpKSB7XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5wcml2YXRlTmFtZSwgdGhpcy5yZWFkV29yZDEobmV4dCkpO1xuICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQucHJpdmF0ZU5hbWUsIHRoaXMucmVhZFdvcmQxKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0Lmhhc2gsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRUb2tlbl9kb3QoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dCA8PSBjaGFyQ29kZXMuZGlnaXQ5KSB7XG4gICAgICB0aGlzLnJlYWROdW1iZXIodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLmRvdCAmJlxuICAgICAgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikgPT09IGNoYXJDb2Rlcy5kb3RcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDM7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmVsbGlwc2lzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuZG90KTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fc2xhc2goKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuc2xhc2hBc3NpZ24sIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LnNsYXNoLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5faW50ZXJwcmV0ZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3RhdGUucG9zICE9PSAwIHx8IHRoaXMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG4gICAgaWYgKGNoICE9PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIHRoaXMuc3RhdGUucG9zICs9IDE7XG5cbiAgICB3aGlsZSAoIWlzTmV3TGluZShjaCkgJiYgKyt0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgdGhpcy5zdGF0ZS5wb3MpO1xuXG4gICAgdGhpcy5maW5pc2hUb2tlbih0dC5pbnRlcnByZXRlckRpcmVjdGl2ZSwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZWFkVG9rZW5fbXVsdF9tb2R1bG8oY29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gJyUnIG9yICcqJ1xuICAgIGxldCB0eXBlID0gY29kZSA9PT0gY2hhckNvZGVzLmFzdGVyaXNrID8gdHQuc3RhciA6IHR0Lm1vZHVsbztcbiAgICBsZXQgd2lkdGggPSAxO1xuICAgIGxldCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG5cbiAgICAvLyBFeHBvbmVudGlhdGlvbiBvcGVyYXRvciAnKionXG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5hc3RlcmlzayAmJiBuZXh0ID09PSBjaGFyQ29kZXMuYXN0ZXJpc2spIHtcbiAgICAgIHdpZHRoKys7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMik7XG4gICAgICB0eXBlID0gdHQuZXhwb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gJyU9JyBvciAnKj0nXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbyAmJiAhdGhpcy5zdGF0ZS5pblR5cGUpIHtcbiAgICAgIHdpZHRoKys7XG4gICAgICAvLyBgdHQubW9kdWxvQXNzaWduYCBpcyBvbmx5IG5lZWRlZCB0byBzdXBwb3J0ICUgYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gICAgICAvLyBJZiB0aGUgcHJvcG9zYWwgZW5kcyB1cCBjaG9vc2luZyBhIGRpZmZlcmVudCB0b2tlbixcbiAgICAgIC8vIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCB0dC5hc3NpZ24uXG4gICAgICB0eXBlID0gY29kZSA9PT0gY2hhckNvZGVzLnBlcmNlbnRTaWduID8gdHQubW9kdWxvQXNzaWduIDogdHQuYXNzaWduO1xuICAgIH1cblxuICAgIHRoaXMuZmluaXNoT3AodHlwZSwgd2lkdGgpO1xuICB9XG5cbiAgcmVhZFRva2VuX3BpcGVfYW1wKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vICd8fCcgJyYmJyAnfHw9JyAnJiY9J1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcblxuICAgIGlmIChuZXh0ID09PSBjb2RlKSB7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKFxuICAgICAgICAgIGNvZGUgPT09IGNoYXJDb2Rlcy52ZXJ0aWNhbEJhciA/IHR0LmxvZ2ljYWxPUiA6IHR0LmxvZ2ljYWxBTkQsXG4gICAgICAgICAgMixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyKSB7XG4gICAgICAvLyAnfD4nXG4gICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuKSB7XG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQucGlwZWxpbmUsIDIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyAnfH0nXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnJpZ2h0Q3VybHlCcmFjZVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlJlY29yZEV4cHJlc3Npb25CYXJJbmNvcnJlY3RFbmRTeW50YXhUeXBlLCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2VCYXJSKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyAnfF0nXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlR1cGxlRXhwcmVzc2lvbkJhckluY29ycmVjdEVuZFN5bnRheFR5cGUsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFja2V0QmFyUik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maW5pc2hPcChcbiAgICAgIGNvZGUgPT09IGNoYXJDb2Rlcy52ZXJ0aWNhbEJhciA/IHR0LmJpdHdpc2VPUiA6IHR0LmJpdHdpc2VBTkQsXG4gICAgICAxLFxuICAgICk7XG4gIH1cblxuICByZWFkVG9rZW5fY2FyZXQoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuXG4gICAgLy8gJ149J1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8gJiYgIXRoaXMuc3RhdGUuaW5UeXBlKSB7XG4gICAgICAvLyBgdHQueG9yQXNzaWduYCBpcyBvbmx5IG5lZWRlZCB0byBzdXBwb3J0IF4gYXMgYSBIYWNrLXBpcGUgdG9waWMgdG9rZW4uXG4gICAgICAvLyBJZiB0aGUgcHJvcG9zYWwgZW5kcyB1cCBjaG9vc2luZyBhIGRpZmZlcmVudCB0b2tlbixcbiAgICAgIC8vIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCB0dC5hc3NpZ24uXG4gICAgICB0aGlzLmZpbmlzaE9wKHR0LnhvckFzc2lnbiwgMik7XG4gICAgfVxuICAgIC8vICdeXidcbiAgICBlbHNlIGlmIChcbiAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5jYXJldCAmJlxuICAgICAgLy8gSWYgdGhlIF5eIHRva2VuIGlzIG5vdCBlbmFibGVkLCB3ZSBkb24ndCB0aHJvdyBidXQgcGFyc2UgdHdvIHNpbmdsZSBec1xuICAgICAgLy8gYmVjYXVzZSBpdCBjb3VsZCBiZSBhIF4gaGFjayB0b2tlbiBmb2xsb3dlZCBieSBhIF4gYmluYXJ5IG9wZXJhdG9yLlxuICAgICAgdGhpcy5oYXNQbHVnaW4oW1xuICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgeyBwcm9wb3NhbDogXCJoYWNrXCIsIHRvcGljVG9rZW46IFwiXl5cIiB9LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuZG91YmxlQ2FyZXQsIDIpO1xuXG4gICAgICAvLyBgXl5eYCBpcyBmb3JiaWRkZW4gYW5kIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gICAgICBjb25zdCBsb29rYWhlYWRDaCA9IHRoaXMuaW5wdXQuY29kZVBvaW50QXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGxvb2thaGVhZENoID09PSBjaGFyQ29kZXMuY2FyZXQpIHtcbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vICdeJ1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5iaXR3aXNlWE9SLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fYXRTaWduKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcblxuICAgIC8vICdAQCdcbiAgICBpZiAoXG4gICAgICBuZXh0ID09PSBjaGFyQ29kZXMuYXRTaWduICYmXG4gICAgICB0aGlzLmhhc1BsdWdpbihbXG4gICAgICAgIFwicGlwZWxpbmVPcGVyYXRvclwiLFxuICAgICAgICB7IHByb3Bvc2FsOiBcImhhY2tcIiwgdG9waWNUb2tlbjogXCJAQFwiIH0sXG4gICAgICBdKVxuICAgICkge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5kb3VibGVBdCwgMik7XG4gICAgfVxuICAgIC8vICdAJ1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5hdCwgMSk7XG4gICAgfVxuICB9XG5cbiAgcmVhZFRva2VuX3BsdXNfbWluKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vICcrLSdcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG5cbiAgICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5pbmNEZWMsIDIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AodHQuYXNzaWduLCAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maW5pc2hPcCh0dC5wbHVzTWluLCAxKTtcbiAgICB9XG4gIH1cblxuICByZWFkVG9rZW5fbHQoKTogdm9pZCB7XG4gICAgLy8gJzwnXG4gICAgY29uc3QgeyBwb3MgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKTtcblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubGVzc1RoYW4pIHtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zICsgMikgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoT3AodHQuYml0U2hpZnRMLCAyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAvLyA8PVxuICAgICAgdGhpcy5maW5pc2hPcCh0dC5yZWxhdGlvbmFsLCAyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaE9wKHR0Lmx0LCAxKTtcbiAgfVxuXG4gIHJlYWRUb2tlbl9ndCgpOiB2b2lkIHtcbiAgICAvLyAnPidcbiAgICBjb25zdCB7IHBvcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIDEpO1xuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5ncmVhdGVyVGhhbikge1xuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChwb3MgKyAyKSA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuID8gMyA6IDI7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHBvcyArIHNpemUpID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5hc3NpZ24sIHNpemUgKyAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5maW5pc2hPcCh0dC5iaXRTaGlmdFIsIHNpemUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIC8vIDw9IHwgPj1cbiAgICAgIHRoaXMuZmluaXNoT3AodHQucmVsYXRpb25hbCwgMik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maW5pc2hPcCh0dC5ndCwgMSk7XG4gIH1cblxuICByZWFkVG9rZW5fZXFfZXhjbChjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyAnPSEnXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMuZXF1YWxzVG8pIHtcbiAgICAgIHRoaXMuZmluaXNoT3AoXG4gICAgICAgIHR0LmVxdWFsaXR5LFxuICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAyKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICAgICAgPyAzXG4gICAgICAgICAgOiAyLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbyAmJiBuZXh0ID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4pIHtcbiAgICAgIC8vICc9PidcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmFycm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hPcChjb2RlID09PSBjaGFyQ29kZXMuZXF1YWxzVG8gPyB0dC5lcSA6IHR0LmJhbmcsIDEpO1xuICB9XG5cbiAgcmVhZFRva2VuX3F1ZXN0aW9uKCk6IHZvaWQge1xuICAgIC8vICc/J1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcbiAgICBjb25zdCBuZXh0MiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDIpO1xuICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMucXVlc3Rpb25NYXJrKSB7XG4gICAgICBpZiAobmV4dDIgPT09IGNoYXJDb2Rlcy5lcXVhbHNUbykge1xuICAgICAgICAvLyAnPz89J1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LmFzc2lnbiwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAnPz8nXG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQubnVsbGlzaENvYWxlc2NpbmcsIDIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBuZXh0ID09PSBjaGFyQ29kZXMuZG90ICYmXG4gICAgICAhKG5leHQyID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgbmV4dDIgPD0gY2hhckNvZGVzLmRpZ2l0OSlcbiAgICApIHtcbiAgICAgIC8vICcuJyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXJcbiAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnF1ZXN0aW9uRG90KTtcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQucXVlc3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldFRva2VuRnJvbUNvZGUoY29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAvLyBUaGUgaW50ZXJwcmV0YXRpb24gb2YgYSBkb3QgZGVwZW5kcyBvbiB3aGV0aGVyIGl0IGlzIGZvbGxvd2VkXG4gICAgICAvLyBieSBhIGRpZ2l0IG9yIGFub3RoZXIgdHdvIGRvdHMuXG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmRvdDpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fZG90KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIFB1bmN0dWF0aW9uIHRva2Vucy5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlZnRQYXJlbnRoZXNpczpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5wYXJlbkwpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzOlxuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnBhcmVuUik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLnNlbWljb2xvbjpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5zZW1pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBjaGFyQ29kZXMuY29tbWE6XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuY29tbWEpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLmdldFBsdWdpbk9wdGlvbihcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSAhPT0gXCJiYXJcIikge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShcbiAgICAgICAgICAgICAgRXJyb3JzLlR1cGxlRXhwcmVzc2lvbkJhckluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFt8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNrZXRCYXJMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYnJhY2tldEwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldDpcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5icmFja2V0Uik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5oYXNQbHVnaW4oXCJyZWNvcmRBbmRUdXBsZVwiKSAmJlxuICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMudmVydGljYWxCYXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwicmVjb3JkQW5kVHVwbGVcIiwgXCJzeW50YXhUeXBlXCIpICE9PSBcImJhclwiKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKFxuICAgICAgICAgICAgICBFcnJvcnMuUmVjb3JkRXhwcmVzc2lvbkJhckluY29ycmVjdFN0YXJ0U3ludGF4VHlwZSxcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHt8XG4gICAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjtcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlQmFyTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlTCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlOlxuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJyYWNlUik7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBjaGFyQ29kZXMuY29sb246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmhhc1BsdWdpbihcImZ1bmN0aW9uQmluZFwiKSAmJlxuICAgICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMuY29sb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5kb3VibGVDb2xvbiwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmNvbG9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnF1ZXN0aW9uTWFyazpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fcXVlc3Rpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5ncmF2ZUFjY2VudDpcbiAgICAgICAgdGhpcy5yZWFkVGVtcGxhdGVUb2tlbigpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmRpZ2l0MDoge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMSk7XG4gICAgICAgIC8vICcweCcsICcwWCcgLSBoZXggbnVtYmVyXG4gICAgICAgIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlWCB8fCBuZXh0ID09PSBjaGFyQ29kZXMudXBwZXJjYXNlWCkge1xuICAgICAgICAgIHRoaXMucmVhZFJhZGl4TnVtYmVyKDE2KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gJzBvJywgJzBPJyAtIG9jdGFsIG51bWJlclxuICAgICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZU8gfHwgbmV4dCA9PT0gY2hhckNvZGVzLnVwcGVyY2FzZU8pIHtcbiAgICAgICAgICB0aGlzLnJlYWRSYWRpeE51bWJlcig4KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gJzBiJywgJzBCJyAtIGJpbmFyeSBudW1iZXJcbiAgICAgICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VCIHx8IG5leHQgPT09IGNoYXJDb2Rlcy51cHBlcmNhc2VCKSB7XG4gICAgICAgICAgdGhpcy5yZWFkUmFkaXhOdW1iZXIoMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbnl0aGluZyBlbHNlIGJlZ2lubmluZyB3aXRoIGEgZGlnaXQgaXMgYW4gaW50ZWdlciwgb2N0YWxcbiAgICAgIC8vIG51bWJlciwgb3IgZmxvYXQuIChmYWxsIHRocm91Z2gpXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDE6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDI6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDM6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDQ6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDU6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDY6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDc6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDg6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5kaWdpdDk6XG4gICAgICAgIHRoaXMucmVhZE51bWJlcihmYWxzZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gUXVvdGVzIHByb2R1Y2Ugc3RyaW5ncy5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnF1b3RhdGlvbk1hcms6XG4gICAgICBjYXNlIGNoYXJDb2Rlcy5hcG9zdHJvcGhlOlxuICAgICAgICB0aGlzLnJlYWRTdHJpbmcoY29kZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgLy8gT3BlcmF0b3JzIGFyZSBwYXJzZWQgaW5saW5lIGluIHRpbnkgc3RhdGUgbWFjaGluZXMuICc9JyAoY2hhckNvZGVzLmVxdWFsc1RvKSBpc1xuICAgICAgLy8gb2Z0ZW4gcmVmZXJyZWQgdG8uIGBmaW5pc2hPcGAgc2ltcGx5IHNraXBzIHRoZSBhbW91bnQgb2ZcbiAgICAgIC8vIGNoYXJhY3RlcnMgaXQgaXMgZ2l2ZW4gYXMgc2Vjb25kIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhIHRva2VuXG4gICAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnNsYXNoOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9zbGFzaCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnBlcmNlbnRTaWduOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuYXN0ZXJpc2s6XG4gICAgICAgIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnZlcnRpY2FsQmFyOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuYW1wZXJzYW5kOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9waXBlX2FtcChjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5jYXJldDpcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fY2FyZXQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5wbHVzU2lnbjpcbiAgICAgIGNhc2UgY2hhckNvZGVzLmRhc2g6XG4gICAgICAgIHRoaXMucmVhZFRva2VuX3BsdXNfbWluKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmxlc3NUaGFuOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9sdCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmdyZWF0ZXJUaGFuOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9ndCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLmVxdWFsc1RvOlxuICAgICAgY2FzZSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrOlxuICAgICAgICB0aGlzLnJlYWRUb2tlbl9lcV9leGNsKGNvZGUpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLnRpbGRlOlxuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LnRpbGRlLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5hdFNpZ246XG4gICAgICAgIHRoaXMucmVhZFRva2VuX2F0U2lnbigpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgY2hhckNvZGVzLm51bWJlclNpZ246XG4gICAgICAgIHRoaXMucmVhZFRva2VuX251bWJlclNpZ24oKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIGNoYXJDb2Rlcy5iYWNrc2xhc2g6XG4gICAgICAgIHRoaXMucmVhZFdvcmQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY29kZSkpIHtcbiAgICAgICAgICB0aGlzLnJlYWRXb3JkKGNvZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRPclVuZXhwZWN0ZWRUb2tlbiwge1xuICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIHVuZXhwZWN0ZWQ6IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpLFxuICAgIH0pO1xuICB9XG5cbiAgZmluaXNoT3AodHlwZTogVG9rZW5UeXBlLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhdGUucG9zLCB0aGlzLnN0YXRlLnBvcyArIHNpemUpO1xuICAgIHRoaXMuc3RhdGUucG9zICs9IHNpemU7XG4gICAgdGhpcy5maW5pc2hUb2tlbih0eXBlLCBzdHIpO1xuICB9XG5cbiAgcmVhZFJlZ2V4cCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnN0YXJ0ICsgMTtcbiAgICBsZXQgZXNjYXBlZCwgaW5DbGFzcztcbiAgICBsZXQgeyBwb3MgfSA9IHRoaXMuc3RhdGU7XG4gICAgZm9yICg7IDsgKytwb3MpIHtcbiAgICAgIGlmIChwb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gRklYTUU6IGV4cGxhaW5cbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkUmVnRXhwLCB7XG4gICAgICAgICAgYXQ6IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChzdGFydExvYywgMSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICAgIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVudGVybWluYXRlZFJlZ0V4cCwge1xuICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIDEpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjaCA9PT0gY2hhckNvZGVzLmxlZnRTcXVhcmVCcmFja2V0KSB7XG4gICAgICAgICAgaW5DbGFzcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IGNoYXJDb2Rlcy5yaWdodFNxdWFyZUJyYWNrZXQgJiYgaW5DbGFzcykge1xuICAgICAgICAgIGluQ2xhc3MgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLnNsYXNoICYmICFpbkNsYXNzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZCA9IGNoID09PSBjaGFyQ29kZXMuYmFja3NsYXNoO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgcG9zKTtcbiAgICArK3BvcztcblxuICAgIGxldCBtb2RzID0gXCJcIjtcblxuICAgIGNvbnN0IG5leHRQb3MgPSAoKSA9PlxuICAgICAgLy8gKHBvcyArIDEpICsgMSAtIHN0YXJ0XG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIHBvcyArIDIgLSBzdGFydCk7XG5cbiAgICB3aGlsZSAocG9zIDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNwID0gdGhpcy5jb2RlUG9pbnRBdFBvcyhwb3MpO1xuICAgICAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3AgPiAweGZmZmYsIHRoZSBsb29wIHdpbGwgZWl0aGVyIHRocm93IG9yIGJyZWFrIGJlY2F1c2Ugd2UgY2hlY2sgb24gY3BcbiAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKTtcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBWQUxJRF9SRUdFWF9GTEFHUy5oYXMgc2hvdWxkIGFjY2VwdCBleHBhbmRlZCB0eXBlOiBudW1iZXJcbiAgICAgIGlmIChWQUxJRF9SRUdFWF9GTEFHUy5oYXMoY3ApKSB7XG4gICAgICAgIGlmIChjcCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZVYpIHtcbiAgICAgICAgICBpZiAobW9kcy5pbmNsdWRlcyhcInVcIikpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkluY29tcGF0aWJsZVJlZ0V4cFVWRmxhZ3MsIHsgYXQ6IG5leHRQb3MoKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VVKSB7XG4gICAgICAgICAgaWYgKG1vZHMuaW5jbHVkZXMoXCJ2XCIpKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbmNvbXBhdGlibGVSZWdFeHBVVkZsYWdzLCB7IGF0OiBuZXh0UG9zKCkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RzLmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRHVwbGljYXRlUmVnRXhwRmxhZ3MsIHsgYXQ6IG5leHRQb3MoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0lkZW50aWZpZXJDaGFyKGNwKSB8fCBjcCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5NYWxmb3JtZWRSZWdFeHBGbGFncywgeyBhdDogbmV4dFBvcygpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgICsrcG9zO1xuICAgICAgbW9kcyArPSBjaGFyO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcztcblxuICAgIHRoaXMuZmluaXNoVG9rZW4odHQucmVnZXhwLCB7XG4gICAgICBwYXR0ZXJuOiBjb250ZW50LFxuICAgICAgZmxhZ3M6IG1vZHMsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGFuIGludGVnZXIgaW4gdGhlIGdpdmVuIHJhZGl4LiBSZXR1cm4gbnVsbCBpZiB6ZXJvIGRpZ2l0c1xuICAvLyB3ZXJlIHJlYWQsIHRoZSBpbnRlZ2VyIHZhbHVlIG90aGVyd2lzZS4gV2hlbiBgbGVuYCBpcyBnaXZlbiwgdGhpc1xuICAvLyB3aWxsIHJldHVybiBgbnVsbGAgdW5sZXNzIHRoZSBpbnRlZ2VyIGhhcyBleGFjdGx5IGBsZW5gIGRpZ2l0cy5cbiAgLy8gV2hlbiBgZm9yY2VMZW5gIGlzIGB0cnVlYCwgaXQgbWVhbnMgdGhhdCB3ZSBhbHJlYWR5IGtub3cgdGhhdCBpbiBjYXNlXG4gIC8vIG9mIGEgbWFsZm9ybWVkIG51bWJlciB3ZSBoYXZlIHRvIHNraXAgYGxlbmAgY2hhcmFjdGVycyBhbnl3YXksIGluc3RlYWRcbiAgLy8gb2YgYmFpbGluZyBvdXQgZWFybHkuIEZvciBleGFtcGxlLCBpbiBcIlxcdXsxMjNafVwiIHdlIHdhbnQgdG8gcmVhZCB1cCB0byB9XG4gIC8vIGFueXdheSwgd2hpbGUgaW4gXCJcXHUwMFpcIiB3ZSB3aWxsIHN0b3AgYXQgWiBpbnN0ZWFkIG9mIGNvbnN1bWluZyBmb3VyXG4gIC8vIGNoYXJhY3RlcnMgKGFuZCB0aHVzIHRoZSBjbG9zaW5nIHF1b3RlKS5cblxuICByZWFkSW50KFxuICAgIHJhZGl4OiBudW1iZXIsXG4gICAgbGVuPzogbnVtYmVyLFxuICAgIGZvcmNlTGVuOiBib29sZWFuID0gZmFsc2UsXG4gICAgYWxsb3dOdW1TZXBhcmF0b3I6IGJvb2xlYW4gfCBcImJhaWxcIiA9IHRydWUsXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHsgbiwgcG9zIH0gPSByZWFkSW50KFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zLFxuICAgICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQsXG4gICAgICB0aGlzLnN0YXRlLmN1ckxpbmUsXG4gICAgICByYWRpeCxcbiAgICAgIGxlbixcbiAgICAgIGZvcmNlTGVuLFxuICAgICAgYWxsb3dOdW1TZXBhcmF0b3IsXG4gICAgICB0aGlzLmVycm9ySGFuZGxlcnNfcmVhZEludCxcbiAgICAgIC8qIGJhaWxPbkVycm9yICovIGZhbHNlLFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBwb3M7XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICByZWFkUmFkaXhOdW1iZXIocmFkaXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpO1xuICAgIGxldCBpc0JpZ0ludCA9IGZhbHNlO1xuXG4gICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjsgLy8gMHhcbiAgICBjb25zdCB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZERpZ2l0LCB7XG4gICAgICAgIC8vIE51bWVyaWMgbGl0ZXJhbHMgY2FuJ3QgaGF2ZSBuZXdsaW5lcywgc28gdGhpcyBpcyBzYWZlIHRvIGRvLlxuICAgICAgICBhdDogY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KHN0YXJ0TG9jLCAyKSxcbiAgICAgICAgcmFkaXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG5cbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZU4pIHtcbiAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpc0JpZ0ludCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlTSkge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZERlY2ltYWwsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGVQb2ludEF0UG9zKHRoaXMuc3RhdGUucG9zKSkpIHtcbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLk51bWJlcklkZW50aWZpZXIsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0JpZ0ludCkge1xuICAgICAgY29uc3Qgc3RyID0gdGhpcy5pbnB1dFxuICAgICAgICAuc2xpY2Uoc3RhcnRMb2MuaW5kZXgsIHRoaXMuc3RhdGUucG9zKVxuICAgICAgICAucmVwbGFjZSgvW19uXS9nLCBcIlwiKTtcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuYmlnaW50LCBzdHIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmluaXNoVG9rZW4odHQubnVtLCB2YWwpO1xuICB9XG5cbiAgLy8gUmVhZCBhbiBpbnRlZ2VyLCBvY3RhbCBpbnRlZ2VyLCBvciBmbG9hdGluZy1wb2ludCBudW1iZXIuXG5cbiAgcmVhZE51bWJlcihzdGFydHNXaXRoRG90OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICBsZXQgaXNGbG9hdCA9IGZhbHNlO1xuICAgIGxldCBpc0JpZ0ludCA9IGZhbHNlO1xuICAgIGxldCBpc0RlY2ltYWwgPSBmYWxzZTtcbiAgICBsZXQgaGFzRXhwb25lbnQgPSBmYWxzZTtcbiAgICBsZXQgaXNPY3RhbCA9IGZhbHNlO1xuXG4gICAgaWYgKCFzdGFydHNXaXRoRG90ICYmIHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWROdW1iZXIsIHsgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSB9KTtcbiAgICB9XG4gICAgY29uc3QgaGFzTGVhZGluZ1plcm8gPVxuICAgICAgdGhpcy5zdGF0ZS5wb3MgLSBzdGFydCA+PSAyICYmXG4gICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQoc3RhcnQpID09PSBjaGFyQ29kZXMuZGlnaXQwO1xuXG4gICAgaWYgKGhhc0xlYWRpbmdaZXJvKSB7XG4gICAgICBjb25zdCBpbnRlZ2VyID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgdGhpcy5yZWNvcmRTdHJpY3RNb2RlRXJyb3JzKEVycm9ycy5TdHJpY3RPY3RhbExpdGVyYWwsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLnN0cmljdCkge1xuICAgICAgICAvLyBkaXNhbGxvdyBudW1lcmljIHNlcGFyYXRvcnMgaW4gbm9uIG9jdGFsIGRlY2ltYWxzIGFuZCBsZWdhY3kgb2N0YWwgbGlrZXNcbiAgICAgICAgY29uc3QgdW5kZXJzY29yZVBvcyA9IGludGVnZXIuaW5kZXhPZihcIl9cIik7XG4gICAgICAgIGlmICh1bmRlcnNjb3JlUG9zID4gMCkge1xuICAgICAgICAgIC8vIE51bWVyaWMgbGl0ZXJhbHMgY2FuJ3QgaGF2ZSBuZXdsaW5lcywgc28gdGhpcyBpcyBzYWZlIHRvIGRvLlxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlplcm9EaWdpdE51bWVyaWNTZXBhcmF0b3IsIHtcbiAgICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIHVuZGVyc2NvcmVQb3MpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpc09jdGFsID0gaGFzTGVhZGluZ1plcm8gJiYgIS9bODldLy50ZXN0KGludGVnZXIpO1xuICAgIH1cblxuICAgIGxldCBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmRvdCAmJiAhaXNPY3RhbCkge1xuICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgIHRoaXMucmVhZEludCgxMCk7XG4gICAgICBpc0Zsb2F0ID0gdHJ1ZTtcbiAgICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChuZXh0ID09PSBjaGFyQ29kZXMudXBwZXJjYXNlRSB8fCBuZXh0ID09PSBjaGFyQ29kZXMubG93ZXJjYXNlRSkgJiZcbiAgICAgICFpc09jdGFsXG4gICAgKSB7XG4gICAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5wbHVzU2lnbiB8fCBuZXh0ID09PSBjaGFyQ29kZXMuZGFzaCkge1xuICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVhZEludCgxMCkgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZE9yTWlzc2luZ0V4cG9uZW50LCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIGlzRmxvYXQgPSB0cnVlO1xuICAgICAgaGFzRXhwb25lbnQgPSB0cnVlO1xuICAgICAgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VOKSB7XG4gICAgICAvLyBkaXNhbGxvdyBmbG9hdHMsIGxlZ2FjeSBvY3RhbCBzeW50YXggYW5kIG5vbiBvY3RhbCBkZWNpbWFsc1xuICAgICAgLy8gbmV3IHN0eWxlIG9jdGFsIChcIjBvXCIpIGlzIGhhbmRsZWQgaW4gdGhpcy5yZWFkUmFkaXhOdW1iZXJcbiAgICAgIGlmIChpc0Zsb2F0IHx8IGhhc0xlYWRpbmdaZXJvKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRCaWdJbnRMaXRlcmFsLCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpc0JpZ0ludCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5leHQgPT09IGNoYXJDb2Rlcy5sb3dlcmNhc2VNKSB7XG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcImRlY2ltYWxcIiwgdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpKTtcbiAgICAgIGlmIChoYXNFeHBvbmVudCB8fCBoYXNMZWFkaW5nWmVybykge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRGVjaW1hbCwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgICB9XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgaXNEZWNpbWFsID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5OdW1iZXJJZGVudGlmaWVyLCB7XG4gICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgXCJfXCIgZm9yIG51bWVyaWMgbGl0ZXJhbCBzZXBhcmF0b3IsIGFuZCB0cmFpbGluZyBgbWAgb3IgYG5gXG4gICAgY29uc3Qgc3RyID0gdGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5zdGF0ZS5wb3MpLnJlcGxhY2UoL1tfbW5dL2csIFwiXCIpO1xuXG4gICAgaWYgKGlzQmlnSW50KSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmJpZ2ludCwgc3RyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNEZWNpbWFsKSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LmRlY2ltYWwsIHN0cik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gaXNPY3RhbCA/IHBhcnNlSW50KHN0ciwgOCkgOiBwYXJzZUZsb2F0KHN0cik7XG4gICAgdGhpcy5maW5pc2hUb2tlbih0dC5udW0sIHZhbCk7XG4gIH1cblxuICAvLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuXG5cbiAgcmVhZENvZGVQb2ludCh0aHJvd09uSW52YWxpZDogYm9vbGVhbik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHsgY29kZSwgcG9zIH0gPSByZWFkQ29kZVBvaW50KFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zLFxuICAgICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQsXG4gICAgICB0aGlzLnN0YXRlLmN1ckxpbmUsXG4gICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyc19yZWFkQ29kZVBvaW50LFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZS5wb3MgPSBwb3M7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICByZWFkU3RyaW5nKHF1b3RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0ciwgcG9zLCBjdXJMaW5lLCBsaW5lU3RhcnQgfSA9IHJlYWRTdHJpbmdDb250ZW50cyhcbiAgICAgIHF1b3RlID09PSBjaGFyQ29kZXMucXVvdGF0aW9uTWFyayA/IFwiZG91YmxlXCIgOiBcInNpbmdsZVwiLFxuICAgICAgdGhpcy5pbnB1dCxcbiAgICAgIHRoaXMuc3RhdGUucG9zICsgMSwgLy8gc2tpcCB0aGUgcXVvdGVcbiAgICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0LFxuICAgICAgdGhpcy5zdGF0ZS5jdXJMaW5lLFxuICAgICAgdGhpcy5lcnJvckhhbmRsZXJzX3JlYWRTdHJpbmdDb250ZW50c19zdHJpbmcsXG4gICAgKTtcbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcyArIDE7IC8vIHNraXAgdGhlIHF1b3RlXG4gICAgdGhpcy5zdGF0ZS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgdGhpcy5zdGF0ZS5jdXJMaW5lID0gY3VyTGluZTtcbiAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnN0cmluZywgc3RyKTtcbiAgfVxuXG4gIC8vIFJlYWRzIHRlbXBsYXRlIGNvbnRpbnVhdGlvbiBgfS4uLmBcbiAgcmVhZFRlbXBsYXRlQ29udGludWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQobnVsbCwgdHQuYnJhY2VSKTtcbiAgICB9XG4gICAgLy8gcmV3aW5kIHBvcyB0byBgfWBcbiAgICB0aGlzLnN0YXRlLnBvcy0tO1xuICAgIHRoaXMucmVhZFRlbXBsYXRlVG9rZW4oKTtcbiAgfVxuXG4gIC8vIFJlYWRzIHRlbXBsYXRlIHN0cmluZyB0b2tlbnMuXG4gIHJlYWRUZW1wbGF0ZVRva2VuKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wZW5pbmcgPSB0aGlzLmlucHV0W3RoaXMuc3RhdGUucG9zXTtcbiAgICBjb25zdCB7IHN0ciwgZmlyc3RJbnZhbGlkTG9jLCBwb3MsIGN1ckxpbmUsIGxpbmVTdGFydCB9ID1cbiAgICAgIHJlYWRTdHJpbmdDb250ZW50cyhcbiAgICAgICAgXCJ0ZW1wbGF0ZVwiLFxuICAgICAgICB0aGlzLmlucHV0LFxuICAgICAgICB0aGlzLnN0YXRlLnBvcyArIDEsIC8vIHNraXAgJ2AnIG9yIGB9YFxuICAgICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCxcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJMaW5lLFxuICAgICAgICB0aGlzLmVycm9ySGFuZGxlcnNfcmVhZFN0cmluZ0NvbnRlbnRzX3RlbXBsYXRlLFxuICAgICAgKTtcbiAgICB0aGlzLnN0YXRlLnBvcyA9IHBvcyArIDE7IC8vIHNraXAgJ2AnIG9yIGAkYFxuICAgIHRoaXMuc3RhdGUubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgIHRoaXMuc3RhdGUuY3VyTGluZSA9IGN1ckxpbmU7XG5cbiAgICBpZiAoZmlyc3RJbnZhbGlkTG9jKSB7XG4gICAgICB0aGlzLnN0YXRlLmZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zID0gbmV3IFBvc2l0aW9uKFxuICAgICAgICBmaXJzdEludmFsaWRMb2MuY3VyTGluZSxcbiAgICAgICAgZmlyc3RJbnZhbGlkTG9jLnBvcyAtIGZpcnN0SW52YWxpZExvYy5saW5lU3RhcnQsXG4gICAgICAgIGZpcnN0SW52YWxpZExvYy5wb3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlucHV0LmNvZGVQb2ludEF0KHBvcykgPT09IGNoYXJDb2Rlcy5ncmF2ZUFjY2VudCkge1xuICAgICAgdGhpcy5maW5pc2hUb2tlbihcbiAgICAgICAgdHQudGVtcGxhdGVUYWlsLFxuICAgICAgICBmaXJzdEludmFsaWRMb2MgPyBudWxsIDogb3BlbmluZyArIHN0ciArIFwiYFwiLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZS5wb3MrKzsgLy8gc2tpcCAneydcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4oXG4gICAgICAgIHR0LnRlbXBsYXRlTm9uVGFpbCxcbiAgICAgICAgZmlyc3RJbnZhbGlkTG9jID8gbnVsbCA6IG9wZW5pbmcgKyBzdHIgKyBcIiR7XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlY29yZFN0cmljdE1vZGVFcnJvcnMoXG4gICAgdG9QYXJzZUVycm9yOiBEZWZlcnJlZFN0cmljdEVycm9yLFxuICAgIHsgYXQgfTogeyBhdDogUG9zaXRpb24gfSxcbiAgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhdC5pbmRleDtcblxuICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiAhdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuaGFzKGluZGV4KSkge1xuICAgICAgdGhpcy5yYWlzZSh0b1BhcnNlRXJyb3IsIHsgYXQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUuc3RyaWN0RXJyb3JzLnNldChpbmRleCwgW3RvUGFyc2VFcnJvciwgYXRdKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFkIGFuIGlkZW50aWZpZXIsIGFuZCByZXR1cm4gaXQgYXMgYSBzdHJpbmcuIFNldHMgYHRoaXMuc3RhdGUuY29udGFpbnNFc2NgXG4gIC8vIHRvIHdoZXRoZXIgdGhlIHdvcmQgY29udGFpbmVkIGEgJ1xcdScgZXNjYXBlLlxuICAvL1xuICAvLyBJbmNyZW1lbnRhbGx5IGFkZHMgb25seSBlc2NhcGVkIGNoYXJzLCBhZGRpbmcgb3RoZXIgY2h1bmtzIGFzLWlzXG4gIC8vIGFzIGEgbWljcm8tb3B0aW1pemF0aW9uLlxuICAvL1xuICAvLyBXaGVuIGBmaXJzdENvZGVgIGlzIGdpdmVuLCBpdCBhc3N1bWVzIGl0IGlzIGFsd2F5cyBhbiBpZGVudGlmaWVyIHN0YXJ0IGFuZFxuICAvLyB3aWxsIHNraXAgcmVhZGluZyBzdGFydCBwb3NpdGlvbiBhZ2FpblxuXG4gIHJlYWRXb3JkMShmaXJzdENvZGU/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRoaXMuc3RhdGUuY29udGFpbnNFc2MgPSBmYWxzZTtcbiAgICBsZXQgd29yZCA9IFwiXCI7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICBsZXQgY2h1bmtTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgIGlmIChmaXJzdENvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gZmlyc3RDb2RlIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaCA9IHRoaXMuY29kZVBvaW50QXRQb3ModGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gpKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IGNoIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjID0gdHJ1ZTtcblxuICAgICAgICB3b3JkICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgICBjb25zdCBlc2NTdGFydCA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllckNoZWNrID1cbiAgICAgICAgICB0aGlzLnN0YXRlLnBvcyA9PT0gc3RhcnQgPyBpc0lkZW50aWZpZXJTdGFydCA6IGlzSWRlbnRpZmllckNoYXI7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMuc3RhdGUucG9zKSAhPT0gY2hhckNvZGVzLmxvd2VyY2FzZVUpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5NaXNzaW5nVW5pY29kZUVzY2FwZSwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3MgLSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgY29uc3QgZXNjID0gdGhpcy5yZWFkQ29kZVBvaW50KHRydWUpO1xuICAgICAgICBpZiAoZXNjICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKCFpZGVudGlmaWVyQ2hlY2soZXNjKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRXNjYXBlZENoYXJOb3RBbklkZW50aWZpZXIsIHsgYXQ6IGVzY1N0YXJ0IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdvcmQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoZXNjKTtcbiAgICAgICAgfVxuICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmQgKyB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgfVxuXG4gIC8vIFJlYWQgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkIHRva2VuLiBXaWxsIGNoZWNrIGZvciByZXNlcnZlZFxuICAvLyB3b3JkcyB3aGVuIG5lY2Vzc2FyeS5cblxuICByZWFkV29yZChmaXJzdENvZGU/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JkID0gdGhpcy5yZWFkV29yZDEoZmlyc3RDb2RlKTtcbiAgICBjb25zdCB0eXBlID0ga2V5d29yZFR5cGVzLmdldCh3b3JkKTtcbiAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBXZSBkb24ndCB1c2Ugd29yZCBhcyBzdGF0ZS52YWx1ZSBoZXJlIGJlY2F1c2Ugd29yZCBpcyBhIGR5bmFtaWMgc3RyaW5nXG4gICAgICAvLyB3aGlsZSB0b2tlbiBsYWJlbCBpcyBhIHNoYXJlZCBjb25zdGFudCBzdHJpbmdcbiAgICAgIHRoaXMuZmluaXNoVG9rZW4odHlwZSwgdG9rZW5MYWJlbE5hbWUodHlwZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0Lm5hbWUsIHdvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrS2V5d29yZEVzY2FwZXMoKTogdm9pZCB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0b2tlbklzS2V5d29yZCh0eXBlKSAmJiB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZCwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgcmVzZXJ2ZWRXb3JkOiB0b2tlbkxhYmVsTmFtZSh0eXBlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSYWlzZSBhIGBQYXJzZUVycm9yYCBnaXZlbiB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcy4gSWYgcGFzc2VkIGFcbiAgICogYFBvc2l0aW9uYCBmb3IgdGhlIGBhdGAgcHJvcGVydHksIHJhaXNlcyB0aGUgYFBhcnNlRXJyb3JgIGF0IHRoYXQgbG9jYXRpb24uXG4gICAqIE90aGVyd2lzZSwgaWYgcGFzc2VkIGEgYE5vZGVgLCByYWlzZXMgdGhlIGBQYXJzZUVycm9yYCBhdCB0aGUgc3RhcnRcbiAgICogbG9jYXRpb24gb2YgdGhhdCBgTm9kZWAuXG4gICAqXG4gICAqIElmIGBlcnJvclJlY292ZXJ5YCBpcyBgdHJ1ZWAsIHRoZSBlcnJvciBpcyBwdXNoZWQgdG8gdGhlIGVycm9ycyBhcnJheSBhbmRcbiAgICogcmV0dXJuZWQuIElmIGBlcnJvclJlY292ZXJ5YCBpcyBgZmFsc2VgLCB0aGUgZXJyb3IgaXMgaW5zdGVhZCB0aHJvd24uXG4gICAqL1xuICByYWlzZTxFcnJvckRldGFpbHM+KFxuICAgIHRvUGFyc2VFcnJvcjogUGFyc2VFcnJvckNvbnN0cnVjdG9yPEVycm9yRGV0YWlscz4sXG4gICAgcmFpc2VQcm9wZXJ0aWVzOiBSYWlzZVByb3BlcnRpZXM8RXJyb3JEZXRhaWxzPixcbiAgKTogUGFyc2VFcnJvcjxFcnJvckRldGFpbHM+IHtcbiAgICBjb25zdCB7IGF0LCAuLi5kZXRhaWxzIH0gPSByYWlzZVByb3BlcnRpZXM7XG4gICAgY29uc3QgbG9jID0gYXQgaW5zdGFuY2VvZiBQb3NpdGlvbiA/IGF0IDogYXQubG9jLnN0YXJ0O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSBkZXRhaWxzIHR5cGluZ1xuICAgIGNvbnN0IGVycm9yID0gdG9QYXJzZUVycm9yKHsgbG9jLCBkZXRhaWxzIH0pO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZXJyb3JSZWNvdmVyeSkgdGhyb3cgZXJyb3I7XG4gICAgaWYgKCF0aGlzLmlzTG9va2FoZWFkKSB0aGlzLnN0YXRlLmVycm9ycy5wdXNoKGVycm9yKTtcblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgZXJyb3JSZWNvdmVyeWAgaXMgYGZhbHNlYCwgdGhpcyBtZXRob2QgYmVoYXZlcyBpZGVudGljYWxseSB0byBgcmFpc2VgLlxuICAgKiBJZiBgZXJyb3JSZWNvdmVyeWAgaXMgYHRydWVgLCB0aGlzIG1ldGhvZCB3aWxsIGZpcnN0IHNlZSBpZiB0aGVyZSBpc1xuICAgKiBhbHJlYWR5IGFuIGVycm9yIHN0b3JlZCBhdCB0aGUgc2FtZSBgUG9zaXRpb25gLCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGVcbiAgICogb25lIGdlbmVyYXRlZCBoZXJlLlxuICAgKi9cbiAgcmFpc2VPdmVyd3JpdGU8RXJyb3JEZXRhaWxzPihcbiAgICB0b1BhcnNlRXJyb3I6IFBhcnNlRXJyb3JDb25zdHJ1Y3RvcjxFcnJvckRldGFpbHM+LFxuICAgIHJhaXNlUHJvcGVydGllczogUmFpc2VQcm9wZXJ0aWVzPEVycm9yRGV0YWlscz4sXG4gICk6IFBhcnNlRXJyb3I8RXJyb3JEZXRhaWxzPiB8IG5ldmVyIHtcbiAgICBjb25zdCB7IGF0LCAuLi5kZXRhaWxzIH0gPSByYWlzZVByb3BlcnRpZXM7XG4gICAgY29uc3QgbG9jID0gYXQgaW5zdGFuY2VvZiBQb3NpdGlvbiA/IGF0IDogYXQubG9jLnN0YXJ0O1xuICAgIGNvbnN0IHBvcyA9IGxvYy5pbmRleDtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLnN0YXRlLmVycm9ycztcblxuICAgIGZvciAobGV0IGkgPSBlcnJvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVycm9yID0gZXJyb3JzW2ldO1xuICAgICAgaWYgKGVycm9yLmxvYy5pbmRleCA9PT0gcG9zKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSBkZXRhaWxzIHR5cGluZ1xuICAgICAgICByZXR1cm4gKGVycm9yc1tpXSA9IHRvUGFyc2VFcnJvcih7IGxvYywgZGV0YWlscyB9KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IubG9jLmluZGV4IDwgcG9zKSBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYWlzZSh0b1BhcnNlRXJyb3IsIHJhaXNlUHJvcGVydGllcyk7XG4gIH1cblxuICAvLyB1cGRhdGVDb250ZXh0IGlzIHVzZWQgYnkgdGhlIGpzeCBwbHVnaW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB1cGRhdGVDb250ZXh0KHByZXZUeXBlOiBUb2tlblR5cGUpOiB2b2lkIHt9XG5cbiAgLy8gUmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci4gQ2FuIHRha2UgdGhlIGV4cGVjdGVkIHRva2VuIHR5cGUuXG4gIHVuZXhwZWN0ZWQobG9jPzogUG9zaXRpb24gfCBudWxsLCB0eXBlPzogVG9rZW5UeXBlKTogdm9pZCB7XG4gICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFRva2VuLCB7XG4gICAgICBleHBlY3RlZDogdHlwZSA/IHRva2VuTGFiZWxOYW1lKHR5cGUpIDogbnVsbCxcbiAgICAgIGF0OiBsb2MgIT0gbnVsbCA/IGxvYyA6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgfSk7XG4gIH1cblxuICBleHBlY3RQbHVnaW4ocGx1Z2luTmFtZTogUGx1Z2luLCBsb2M/OiBQb3NpdGlvbik6IHRydWUge1xuICAgIGlmICh0aGlzLmhhc1BsdWdpbihwbHVnaW5OYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ1BsdWdpbiwge1xuICAgICAgYXQ6IGxvYyAhPSBudWxsID8gbG9jIDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgIG1pc3NpbmdQbHVnaW46IFtwbHVnaW5OYW1lXSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4cGVjdE9uZVBsdWdpbihwbHVnaW5OYW1lczogUGx1Z2luW10pOiB2b2lkIHtcbiAgICBpZiAoIXBsdWdpbk5hbWVzLnNvbWUobmFtZSA9PiB0aGlzLmhhc1BsdWdpbihuYW1lKSkpIHtcbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLk1pc3NpbmdPbmVPZlBsdWdpbnMsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIG1pc3NpbmdQbHVnaW46IHBsdWdpbk5hbWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3JCdWlsZGVyKGVycm9yOiBQYXJzZUVycm9yQ29uc3RydWN0b3I8e30+KSB7XG4gICAgcmV0dXJuIChwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5yYWlzZShlcnJvciwge1xuICAgICAgICBhdDogYnVpbGRQb3NpdGlvbihwb3MsIGxpbmVTdGFydCwgY3VyTGluZSksXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZXJyb3JIYW5kbGVyc19yZWFkSW50OiBJbnRFcnJvckhhbmRsZXJzID0ge1xuICAgIGludmFsaWREaWdpdDogKHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lLCByYWRpeCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXJyb3JSZWNvdmVyeSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkRGlnaXQsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgICByYWRpeCxcbiAgICAgIH0pO1xuICAgICAgLy8gQ29udGludWUgcGFyc2luZyB0aGUgbnVtYmVyIGFzIGlmIHRoZXJlIHdhcyBubyBpbnZhbGlkIGRpZ2l0LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBudW1lcmljU2VwYXJhdG9ySW5Fc2NhcGVTZXF1ZW5jZTogdGhpcy5lcnJvckJ1aWxkZXIoXG4gICAgICBFcnJvcnMuTnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UsXG4gICAgKSxcbiAgICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcjogdGhpcy5lcnJvckJ1aWxkZXIoXG4gICAgICBFcnJvcnMuVW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IsXG4gICAgKSxcbiAgfTtcblxuICBlcnJvckhhbmRsZXJzX3JlYWRDb2RlUG9pbnQ6IENvZGVQb2ludEVycm9ySGFuZGxlcnMgPSB7XG4gICAgLi4udGhpcy5lcnJvckhhbmRsZXJzX3JlYWRJbnQsXG4gICAgaW52YWxpZEVzY2FwZVNlcXVlbmNlOiB0aGlzLmVycm9yQnVpbGRlcihFcnJvcnMuSW52YWxpZEVzY2FwZVNlcXVlbmNlKSxcbiAgICBpbnZhbGlkQ29kZVBvaW50OiB0aGlzLmVycm9yQnVpbGRlcihFcnJvcnMuSW52YWxpZENvZGVQb2ludCksXG4gIH07XG5cbiAgZXJyb3JIYW5kbGVyc19yZWFkU3RyaW5nQ29udGVudHNfc3RyaW5nOiBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMgPSB7XG4gICAgLi4udGhpcy5lcnJvckhhbmRsZXJzX3JlYWRDb2RlUG9pbnQsXG4gICAgc3RyaWN0TnVtZXJpY0VzY2FwZTogKHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZFN0cmljdE1vZGVFcnJvcnMoRXJyb3JzLlN0cmljdE51bWVyaWNFc2NhcGUsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1bnRlcm1pbmF0ZWQ6IChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSkgPT4ge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkU3RyaW5nLCB7XG4gICAgICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgYXQgdGhlIHN0cmluZyBxdW90ZVxuICAgICAgICBhdDogYnVpbGRQb3NpdGlvbihwb3MgLSAxLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICBlcnJvckhhbmRsZXJzX3JlYWRTdHJpbmdDb250ZW50c190ZW1wbGF0ZTogU3RyaW5nQ29udGVudHNFcnJvckhhbmRsZXJzID0ge1xuICAgIC4uLnRoaXMuZXJyb3JIYW5kbGVyc19yZWFkQ29kZVBvaW50LFxuICAgIHN0cmljdE51bWVyaWNFc2NhcGU6IHRoaXMuZXJyb3JCdWlsZGVyKEVycm9ycy5TdHJpY3ROdW1lcmljRXNjYXBlKSxcbiAgICB1bnRlcm1pbmF0ZWQ6IChwb3MsIGxpbmVTdGFydCwgY3VyTGluZSkgPT4ge1xuICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkVGVtcGxhdGUsIHtcbiAgICAgICAgYXQ6IGJ1aWxkUG9zaXRpb24ocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQge1xuICBDTEFTU19FTEVNRU5UX0tJTkRfQUNDRVNTT1IsXG4gIENMQVNTX0VMRU1FTlRfRkxBR19TVEFUSUMsXG4gIHR5cGUgQ2xhc3NFbGVtZW50VHlwZXMsXG59IGZyb20gXCIuL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9sb2NhdGlvblwiO1xuaW1wb3J0IHsgRXJyb3JzIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBUb2tlbml6ZXIgZnJvbSBcIi4uL3Rva2VuaXplclwiO1xuXG5leHBvcnQgY2xhc3MgQ2xhc3NTY29wZSB7XG4gIC8vIEEgbGlzdCBvZiBwcml2YXRlIG5hbWVkIGRlY2xhcmVkIGluIHRoZSBjdXJyZW50IGNsYXNzXG4gIHByaXZhdGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gQSBsaXN0IG9mIHByaXZhdGUgZ2V0dGVycyBvZiBzZXR0ZXJzIHdpdGhvdXQgdGhlaXIgY291bnRlcnBhcnRcbiAgbG9uZUFjY2Vzc29yczogTWFwPHN0cmluZywgQ2xhc3NFbGVtZW50VHlwZXM+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIEEgbGlzdCBvZiBwcml2YXRlIG5hbWVzIHVzZWQgYmVmb3JlIGJlaW5nIGRlZmluZWQsIG1hcHBpbmcgdG9cbiAgLy8gdGhlaXIgcG9zaXRpb24uXG4gIHVuZGVmaW5lZFByaXZhdGVOYW1lczogTWFwPHN0cmluZywgUG9zaXRpb24+ID0gbmV3IE1hcCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFzc1Njb3BlSGFuZGxlciB7XG4gIHBhcnNlcjogVG9rZW5pemVyO1xuICBzdGFjazogQXJyYXk8Q2xhc3NTY29wZT4gPSBbXTtcbiAgdW5kZWZpbmVkUHJpdmF0ZU5hbWVzOiBNYXA8c3RyaW5nLCBQb3NpdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocGFyc2VyOiBUb2tlbml6ZXIpIHtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgfVxuXG4gIGN1cnJlbnQoKTogQ2xhc3NTY29wZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIGVudGVyKCkge1xuICAgIHRoaXMuc3RhY2sucHVzaChuZXcgQ2xhc3NTY29wZSgpKTtcbiAgfVxuXG4gIGV4aXQoKSB7XG4gICAgY29uc3Qgb2xkQ2xhc3NTY29wZSA9IHRoaXMuc3RhY2sucG9wKCk7XG5cbiAgICAvLyBNaWdyYXRlIHRoZSB1c2FnZSBvZiBub3QgeWV0IGRlZmluZWQgcHJpdmF0ZSBuYW1lcyB0byB0aGUgb3V0ZXJcbiAgICAvLyBjbGFzcyBzY29wZSwgb3IgcmFpc2UgYW4gZXJyb3IgaWYgd2UgcmVhY2hlZCB0aGUgdG9wLWxldmVsIHNjb3BlLlxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudCgpO1xuXG4gICAgLy8gQXJyYXkuZnJvbSBpcyBuZWVkZWQgYmVjYXVzZSB0aGlzIGlzIGNvbXBpbGVkIHRvIGFuIGFycmF5LWxpa2UgZm9yIGxvb3BcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBsb2NdIG9mIEFycmF5LmZyb20ob2xkQ2xhc3NTY29wZS51bmRlZmluZWRQcml2YXRlTmFtZXMpKSB7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgIGN1cnJlbnQudW5kZWZpbmVkUHJpdmF0ZU5hbWVzLnNldChuYW1lLCBsb2MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuSW52YWxpZFByaXZhdGVGaWVsZFJlc29sdXRpb24sIHtcbiAgICAgICAgICBhdDogbG9jLFxuICAgICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWNsYXJlUHJpdmF0ZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBDbGFzc0VsZW1lbnRUeXBlcyxcbiAgICBsb2M6IFBvc2l0aW9uLFxuICApIHtcbiAgICBjb25zdCB7IHByaXZhdGVOYW1lcywgbG9uZUFjY2Vzc29ycywgdW5kZWZpbmVkUHJpdmF0ZU5hbWVzIH0gPVxuICAgICAgdGhpcy5jdXJyZW50KCk7XG4gICAgbGV0IHJlZGVmaW5lZCA9IHByaXZhdGVOYW1lcy5oYXMobmFtZSk7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgJiBDTEFTU19FTEVNRU5UX0tJTkRfQUNDRVNTT1IpIHtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gcmVkZWZpbmVkICYmIGxvbmVBY2Nlc3NvcnMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgIGNvbnN0IG9sZFN0YXRpYyA9IGFjY2Vzc29yICYgQ0xBU1NfRUxFTUVOVF9GTEFHX1NUQVRJQztcbiAgICAgICAgY29uc3QgbmV3U3RhdGljID0gZWxlbWVudFR5cGUgJiBDTEFTU19FTEVNRU5UX0ZMQUdfU1RBVElDO1xuXG4gICAgICAgIGNvbnN0IG9sZEtpbmQgPSBhY2Nlc3NvciAmIENMQVNTX0VMRU1FTlRfS0lORF9BQ0NFU1NPUjtcbiAgICAgICAgY29uc3QgbmV3S2luZCA9IGVsZW1lbnRUeXBlICYgQ0xBU1NfRUxFTUVOVF9LSU5EX0FDQ0VTU09SO1xuXG4gICAgICAgIC8vIFRoZSBwcml2YXRlIG5hbWUgY2FuIGJlIGR1cGxpY2F0ZWQgb25seSBpZiBpdCBpcyB1c2VkIGJ5XG4gICAgICAgIC8vIHR3byBhY2Nlc3NvcnMgd2l0aCBkaWZmZXJlbnQga2luZCAoZ2V0IGFuZCBzZXQpLCBhbmQgaWZcbiAgICAgICAgLy8gdGhleSBoYXZlIHRoZSBzYW1lIHBsYWNlbWVudCAoc3RhdGljIG9yIG5vdCkuXG4gICAgICAgIHJlZGVmaW5lZCA9IG9sZEtpbmQgPT09IG5ld0tpbmQgfHwgb2xkU3RhdGljICE9PSBuZXdTdGF0aWM7XG5cbiAgICAgICAgaWYgKCFyZWRlZmluZWQpIGxvbmVBY2Nlc3NvcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIGlmICghcmVkZWZpbmVkKSB7XG4gICAgICAgIGxvbmVBY2Nlc3NvcnMuc2V0KG5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVkZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuUHJpdmF0ZU5hbWVSZWRlY2xhcmF0aW9uLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZU5hbWVzLmFkZChuYW1lKTtcbiAgICB1bmRlZmluZWRQcml2YXRlTmFtZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgdXNlUHJpdmF0ZU5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFBvc2l0aW9uKSB7XG4gICAgbGV0IGNsYXNzU2NvcGU7XG4gICAgZm9yIChjbGFzc1Njb3BlIG9mIHRoaXMuc3RhY2spIHtcbiAgICAgIGlmIChjbGFzc1Njb3BlLnByaXZhdGVOYW1lcy5oYXMobmFtZSkpIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xhc3NTY29wZSkge1xuICAgICAgY2xhc3NTY29wZS51bmRlZmluZWRQcml2YXRlTmFtZXMuc2V0KG5hbWUsIGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvcC1sZXZlbFxuICAgICAgdGhpcy5wYXJzZXIucmFpc2UoRXJyb3JzLkludmFsaWRQcml2YXRlRmllbGRSZXNvbHV0aW9uLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGlkZW50aWZpZXJOYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgRXJyb3JzLCB0eXBlIFBhcnNlRXJyb3JDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuL2xvY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIFRva2VuaXplciBmcm9tIFwiLi4vdG9rZW5pemVyXCI7XG5cbi8qKlxuICogQG1vZHVsZSB1dGlsL2V4cHJlc3Npb24tc2NvcGVcblxuRXhwcmVzc2lvblNjb3BlIGlzIHVzZWQgdG8gdHJhY2sgZGVjbGFyYXRpb24gZXJyb3JzIGluIHRoZXNlIGFtYmlndW91cyBwYXR0ZXJuczpcblxuLSBDb3ZlclBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQW5kQXJyb3dQYXJhbWV0ZXJMaXN0XG4gIGUuZy4gd2UgZG9uJ3Qga25vdyBpZiBgKHsgeCB9KWAgaXMgYW4gcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG9yIGFuXG4gIGFycm93IGZ1bmN0aW9uIHBhcmFtZXRlcnMgdW50aWwgd2Ugc2VlIGFuIGA9PmAgYWZ0ZXIgYClgLlxuXG4tIENvdmVyQ2FsbEV4cHJlc3Npb25BbmRBc3luY0Fycm93SGVhZFxuICBlLmcuIHdlIGRvbid0IGtub3cgaWYgYGFzeW5jKHsgeCB9KWAgaXMgYSBjYWxsIGV4cHJlc3Npb24gb3IgYW4gYXN5bmMgYXJyb3dcbiAgZnVuY3Rpb24gcGFyYW1ldGVycyB1bnRpbCB3ZSBzZWUgYW4gYD0+YCBhZnRlciBgKWBcblxuVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBlcnJvcnMgKEBzZWUgcGFyc2VyLWVycm9ycy9zdGFuZGFyZCkgd2lsbCBiZSByZWNvcmRlZCBpblxuc29tZSBleHByZXNzaW9uIHNjb3BlcyBhbmQgdGhyb3duIGxhdGVyIHdoZW4gd2Uga25vdyB3aGF0IHRoZSBhbWJpZ3VvdXMgcGF0dGVybiBpc1xuXG4tIEF3YWl0QmluZGluZ0lkZW50aWZpZXJcbi0gQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyXG4tIFlpZWxkSW5QYXJhbWV0ZXJcbi0gSW52YWxpZFBhcmVudGhlc2l6ZWRBc3NpZ25tZW50IHdoZW4gcGFyZW50aGVzaXplZCBpcyBhbiBpZGVudGlmaWVyXG5cblRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCBleHByZXNzaW9uIHNjb3BlXG4tIEV4cHJlc3Npb25cbiAgQSBnZW5lcmFsIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBwcm9ncmFtIC8gZnVuY3Rpb24gYm9keSAvIHN0YXRpYyBibG9jay4gTm8gZXJyb3JzXG4gIHdpbGwgYmUgcmVjb3JkZWQgbm9yIHRocm93biBpbiB0aGlzIHNjb3BlLlxuXG4tIE1heWJlQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICBBIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBhbWJpZ3VvdXMgYXJyb3cgaGVhZCBlLmcuIGAoeClgLiBFcnJvcnMgd2lsbCBiZSByZWNvcmRlZFxuICBhbG9uZ3NpZGUgcGFyZW50IHNjb3BlcyBhbmQgdGhyb3duIHdoZW4gYEV4cHJlc3Npb25TY29wZUhhbmRsZXIjdmFsaWRhdGVBc1BhdHRlcm5gXG4gIGlzIGNhbGxlZC5cblxuLSBNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICBBIHNjb3BlIHRoYXQgcmVwcmVzZW50cyBhbWJpZ3VvdXMgYXN5bmMgYXJyb3cgaGVhZCBlLmcuIGBhc3luYyh4KWAuIEVycm9ycyB3aWxsXG4gIGJlIHJlY29yZGVkIGFsb25nc2lkZSBwYXJlbnQgc2NvcGVzIGFuZCB0aHJvd24gd2hlblxuICBgRXhwcmVzc2lvblNjb3BlSGFuZGxlciN2YWxpZGF0ZUFzUGF0dGVybmAgaXMgY2FsbGVkLlxuXG4tIFBhcmFtZXRlckRlY2xhcmF0aW9uXG4gIEEgc2NvcGUgdGhhdCByZXByZXNlbnRzIHVuYW1iaWd1b3VzIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYGZ1bmN0aW9uKHgpYC4gRXJyb3JzXG4gIHJlY29yZGVkIGluIHRoaXMgc2NvcGUgd2lsbCBiZSB0aHJvd24gaW1tZWRpYXRlbHkuIE5vIGVycm9ycyB3aWxsIGJlIHJlY29yZGVkIGluXG4gIHRoaXMgc2NvcGUuXG5cbi8vIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUZBdkVwOUVVSy1HOGtIZkRJRW9fMzg1SHMyU1VCQ1liSjVILU5uTHZxOE18VjggRXhwcmVzc2lvbiBTY29wZSBkZXNpZ24gZG9jc31cbiAqL1xuXG5jb25zdCBrRXhwcmVzc2lvbiA9IDAsXG4gIGtNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24gPSAxLFxuICBrTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb24gPSAyLFxuICBrUGFyYW1ldGVyRGVjbGFyYXRpb24gPSAzO1xuXG50eXBlIEV4cHJlc3Npb25TY29wZVR5cGUgPSAwIHwgMSB8IDIgfCAzO1xuXG5jbGFzcyBFeHByZXNzaW9uU2NvcGUge1xuICB0eXBlOiBFeHByZXNzaW9uU2NvcGVUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IEV4cHJlc3Npb25TY29wZVR5cGUgPSBrRXhwcmVzc2lvbikge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBjYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKTogdGhpcyBpcyBBcnJvd0hlYWRQYXJzaW5nU2NvcGUge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnR5cGUgPT09IGtNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8fFxuICAgICAgdGhpcy50eXBlID09PSBrTWF5YmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGlzQ2VydGFpbmx5UGFyYW1ldGVyRGVjbGFyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0ga1BhcmFtZXRlckRlY2xhcmF0aW9uO1xuICB9XG59XG5cbnR5cGUgQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3IgPVxuICB8IHR5cGVvZiBFcnJvcnMuQXdhaXRFeHByZXNzaW9uRm9ybWFsUGFyYW1ldGVyXG4gIHwgdHlwZW9mIEVycm9ycy5ZaWVsZEluUGFyYW1ldGVyO1xudHlwZSBBcnJvd0hlYWRQYXJzaW5nRGVjbGFyYXRpb25FcnJvciA9XG4gIHwgQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3JcbiAgfCB0eXBlb2YgRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudFxuICB8IHR5cGVvZiBFcnJvcnMuQXdhaXRCaW5kaW5nSWRlbnRpZmllcjtcblxuY2xhc3MgQXJyb3dIZWFkUGFyc2luZ1Njb3BlIGV4dGVuZHMgRXhwcmVzc2lvblNjb3BlIHtcbiAgZGVjbGFyYXRpb25FcnJvcnM6IE1hcDxudW1iZXIsIFtQYXJzZUVycm9yQ29uc3RydWN0b3I8e30+LCBQb3NpdGlvbl0+ID1cbiAgICBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHR5cGU6IDEgfCAyKSB7XG4gICAgc3VwZXIodHlwZSk7XG4gIH1cbiAgcmVjb3JkRGVjbGFyYXRpb25FcnJvcihcbiAgICBQYXJzaW5nRXJyb3JDbGFzczogUGFyc2VFcnJvckNvbnN0cnVjdG9yPHt9PixcbiAgICB7XG4gICAgICBhdCxcbiAgICB9OiB7XG4gICAgICBhdDogUG9zaXRpb247XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgaW5kZXggPSBhdC5pbmRleDtcblxuICAgIHRoaXMuZGVjbGFyYXRpb25FcnJvcnMuc2V0KGluZGV4LCBbUGFyc2luZ0Vycm9yQ2xhc3MsIGF0XSk7XG4gIH1cbiAgY2xlYXJEZWNsYXJhdGlvbkVycm9yKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9uRXJyb3JzLmRlbGV0ZShpbmRleCk7XG4gIH1cbiAgaXRlcmF0ZUVycm9ycyhcbiAgICBpdGVyYXRvcjogKGE6IFtBcnJvd0hlYWRQYXJzaW5nRGVjbGFyYXRpb25FcnJvciwgUG9zaXRpb25dKSA9PiB2b2lkLFxuICApIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9uRXJyb3JzLmZvckVhY2goaXRlcmF0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cHJlc3Npb25TY29wZUhhbmRsZXIge1xuICBwYXJzZXI6IFRva2VuaXplcjtcbiAgc3RhY2s6IEFycmF5PEV4cHJlc3Npb25TY29wZT4gPSBbbmV3IEV4cHJlc3Npb25TY29wZSgpXTtcblxuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFRva2VuaXplcikge1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICB9XG4gIGVudGVyKHNjb3BlOiBFeHByZXNzaW9uU2NvcGUpIHtcbiAgICB0aGlzLnN0YWNrLnB1c2goc2NvcGUpO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBsaWtlbHkgcGFyYW1ldGVyIGluaXRpYWxpemVyIGVycm9yc1xuICAgKlxuICAgKiBXaGVuIGN1cnJlbnQgc2NvcGUgaXMgYSBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgdGhlIGVycm9yIHdpbGwgYmUgdGhyb3duIGltbWVkaWF0ZWx5LFxuICAgKiBvdGhlcndpc2UgaXQgd2lsbCBiZSByZWNvcmRlZCB0byBhbnkgYW5jZXN0cnkgTWF5YmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uIGFuZFxuICAgKiBNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbiBzY29wZSB1bnRpbCBhbiBFeHByZXNzaW9uIHNjb3BlIGlzIHNlZW4uXG4gICAqL1xuICByZWNvcmRQYXJhbWV0ZXJJbml0aWFsaXplckVycm9yKFxuICAgIHRvUGFyc2VFcnJvcjogQXJyb3dIZWFkUGFyc2luZ1BhcmFtZXRlckluaXRpYWxpemVyRXJyb3IsXG4gICAge1xuICAgICAgYXQ6IG5vZGUsXG4gICAgfToge1xuICAgICAgYXQ6IE5vZGU7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luID0geyBhdDogbm9kZS5sb2Muc3RhcnQgfTtcbiAgICBjb25zdCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBsZXQgc2NvcGU6IEV4cHJlc3Npb25TY29wZSA9IHN0YWNrW2ldO1xuICAgIHdoaWxlICghc2NvcGUuaXNDZXJ0YWlubHlQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICBpZiAoc2NvcGUuY2FuQmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uKCkpIHtcbiAgICAgICAgc2NvcGUucmVjb3JkRGVjbGFyYXRpb25FcnJvcih0b1BhcnNlRXJyb3IsIG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKjo6IGludmFyaWFudChzY29wZS50eXBlID09IGtFeHByZXNzaW9uKSAqL1xuICAgICAgICAvLyBUeXBlLUV4cHJlc3Npb24gaXMgdGhlIGJvdW5kYXJ5IHdoZXJlIGluaXRpYWxpemVyIGVycm9yIGNhbiBwb3B1bGF0ZSB0b1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzY29wZSA9IHN0YWNrWy0taV07XG4gICAgfVxuICAgIHRoaXMucGFyc2VyLnJhaXNlKHRvUGFyc2VFcnJvciwgb3JpZ2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgZXJyb3JzIHRoYXQgbXVzdCBiZSB0aHJvd24gaWYgdGhlIGN1cnJlbnQgcGF0dGVybiBlbmRzIHVwIGJlaW5nIGFuIGFycm93XG4gICAqIGZ1bmN0aW9uIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIHRvIHJlY29yZCBwYXJlbnRoZXNpemVkIGlkZW50aWZpZXJzLCBhbmQgdG8gcmVjb3JkXG4gICAqIFwiYSBhcyBUXCIgYW5kIFwiPFQ+IGFcIiB0eXBlIGFzc2VydGlvbnMgd2hlbiBwYXJzaW5nIHR5cGVzY3JpcHQuXG4gICAqXG4gICAqIEEgcGFyZW50aGVzaXplZCBpZGVudGlmaWVyIChvciB0eXBlIGFzc2VydGlvbikgaW4gTEhTIGNhbiBiZSBhbWJpZ3VvdXMgYmVjYXVzZSB0aGUgYXNzaWdubWVudFxuICAgKiBjYW4gYmUgdHJhbnNmb3JtZWQgdG8gYW4gYXNzaWduYWJsZSBsYXRlciwgYnV0IG5vdCB2aWNlIHZlcnNhOlxuICAgKiBGb3IgZXhhbXBsZSwgaW4gYChbKGEpID0gW11dID0gW10pID0+IHt9YCwgd2UgdGhpbmsgYChhKSA9IFtdYCBpcyBhbiBMSFMgaW4gYFsoYSkgPSBbXV1gLFxuICAgKiBhbiBMSFMgd2l0aGluIGBbKGEpID0gW11dID0gW11gLiBIb3dldmVyIHRoZSBMSFMgY2hhaW4gaXMgdGhlbiB0cmFuc2Zvcm1lZCBieSB0b0Fzc2lnbmFibGUsXG4gICAqIGFuZCB3ZSBzaG91bGQgdGhyb3cgYXNzaWdubWVudCBgKGEpYCwgd2hpY2ggaXMgb25seSB2YWxpZCBpbiBMSFMuIEhlbmNlIHdlIHJlY29yZCB0aGVcbiAgICogbG9jYXRpb24gb2YgcGFyZW50aGVzaXplZCBgKGEpYCB0byBjdXJyZW50IHNjb3BlIGlmIGl0IGlzIG9uZSBvZiBNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICogYW5kIE1heWJlQXN5bmNBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uXG4gICAqXG4gICAqIFVubGlrZSBgcmVjb3JkUGFyYW1ldGVySW5pdGlhbGl6ZXJFcnJvcmAsIHdlIGRvbid0IHJlY29yZCB0byBhbmNlc3RyeSBzY29wZSBiZWNhdXNlIHdlXG4gICAqIHZhbGlkYXRlIGFycm93IGhlYWQgcGFyc2luZyBzY29wZSBiZWZvcmUgZXhpdCwgYW5kIHRoZW4gdGhlIExIUyB3aWxsIGJlIHVuYW1iaWd1b3VzOlxuICAgKiBGb3IgZXhhbXBsZSwgaW4gYCggeCA9ICggWyhhKSA9IFtdXSA9IFtdICkgKSA9PiB7fWAsIHdlIHNob3VsZCBub3QgcmVjb3JkIGAoYSlgIGluIGAoIHggPSAuLi4gKSA9PmBcbiAgICogYXJyb3cgc2NvcGUgYmVjYXVzZSB3aGVuIHdlIGZpbmlzaCBwYXJzaW5nIGAoIFsoYSkgPSBbXV0gPSBbXSApYCwgaXQgaXMgYW4gdW5hbWJpZ3VvdXMgYXNzaWdubWVudFxuICAgKiBleHByZXNzaW9uIGFuZCBjYW4gbm90IGJlIGNhc3QgdG8gcGF0dGVyblxuICAgKi9cbiAgcmVjb3JkQXJyb3dQYXJhbWV0ZXJCaW5kaW5nRXJyb3IoXG4gICAgZXJyb3I6IFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcjx7fT4sXG4gICAge1xuICAgICAgYXQ6IG5vZGUsXG4gICAgfToge1xuICAgICAgYXQ6IE5vZGU7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBzdGFjayB9ID0gdGhpcztcbiAgICBjb25zdCBzY29wZTogRXhwcmVzc2lvblNjb3BlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3Qgb3JpZ2luID0geyBhdDogbm9kZS5sb2Muc3RhcnQgfTtcbiAgICBpZiAoc2NvcGUuaXNDZXJ0YWlubHlQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICB0aGlzLnBhcnNlci5yYWlzZShlcnJvciwgb3JpZ2luKTtcbiAgICB9IGVsc2UgaWYgKHNjb3BlLmNhbkJlQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbigpKSB7XG4gICAgICBzY29wZS5yZWNvcmREZWNsYXJhdGlvbkVycm9yKGVycm9yLCBvcmlnaW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBsaWtlbHkgYXN5bmMgYXJyb3cgcGFyYW1ldGVyIGVycm9yc1xuICAgKlxuICAgKiBFcnJvcnMgd2lsbCBiZSByZWNvcmRlZCB0byBhbnkgYW5jZXN0cnkgTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICogc2NvcGUgdW50aWwgYW4gRXhwcmVzc2lvbiBzY29wZSBpcyBzZWVuLlxuICAgKi9cbiAgcmVjb3JkQXN5bmNBcnJvd1BhcmFtZXRlcnNFcnJvcih7IGF0IH06IHsgYXQ6IFBvc2l0aW9uIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBsZXQgc2NvcGU6IEV4cHJlc3Npb25TY29wZSA9IHN0YWNrW2ldO1xuICAgIHdoaWxlIChzY29wZS5jYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKSkge1xuICAgICAgaWYgKHNjb3BlLnR5cGUgPT09IGtNYXliZUFzeW5jQXJyb3dQYXJhbWV0ZXJEZWNsYXJhdGlvbikge1xuICAgICAgICBzY29wZS5yZWNvcmREZWNsYXJhdGlvbkVycm9yKEVycm9ycy5Bd2FpdEJpbmRpbmdJZGVudGlmaWVyLCB7IGF0IH0pO1xuICAgICAgfVxuICAgICAgc2NvcGUgPSBzdGFja1stLWldO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQXNQYXR0ZXJuKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc3RhY2sgfSA9IHRoaXM7XG4gICAgY29uc3QgY3VycmVudFNjb3BlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKCFjdXJyZW50U2NvcGUuY2FuQmVBcnJvd1BhcmFtZXRlckRlY2xhcmF0aW9uKCkpIHJldHVybjtcbiAgICBjdXJyZW50U2NvcGUuaXRlcmF0ZUVycm9ycygoW3RvUGFyc2VFcnJvciwgbG9jXSkgPT4ge1xuICAgICAgdGhpcy5wYXJzZXIucmFpc2UodG9QYXJzZUVycm9yLCB7IGF0OiBsb2MgfSk7XG4gICAgICAvLyBpdGVyYXRlIGZyb20gcGFyZW50IHNjb3BlXG4gICAgICBsZXQgaSA9IHN0YWNrLmxlbmd0aCAtIDI7XG4gICAgICBsZXQgc2NvcGUgPSBzdGFja1tpXTtcbiAgICAgIHdoaWxlIChzY29wZS5jYW5CZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24oKSkge1xuICAgICAgICBzY29wZS5jbGVhckRlY2xhcmF0aW9uRXJyb3IobG9jLmluZGV4KTtcbiAgICAgICAgc2NvcGUgPSBzdGFja1stLWldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdQYXJhbWV0ZXJEZWNsYXJhdGlvblNjb3BlKCkge1xuICByZXR1cm4gbmV3IEV4cHJlc3Npb25TY29wZShrUGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3QXJyb3dIZWFkU2NvcGUoKSB7XG4gIHJldHVybiBuZXcgQXJyb3dIZWFkUGFyc2luZ1Njb3BlKGtNYXliZUFycm93UGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3QXN5bmNBcnJvd1Njb3BlKCkge1xuICByZXR1cm4gbmV3IEFycm93SGVhZFBhcnNpbmdTY29wZShrTWF5YmVBc3luY0Fycm93UGFyYW1ldGVyRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3RXhwcmVzc2lvblNjb3BlKCkge1xuICByZXR1cm4gbmV3IEV4cHJlc3Npb25TY29wZSgpO1xufVxuIiwgImV4cG9ydCBjb25zdCAvLyBJbml0aWFsIFBhcmFtZXRlciBmbGFnc1xuICBQQVJBTSA9IDBiMDAwMCxcbiAgLy8gdHJhY2sgW1lpZWxkXSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuICBQQVJBTV9ZSUVMRCA9IDBiMDAwMSxcbiAgLy8gdHJhY2sgW0F3YWl0XSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuICBQQVJBTV9BV0FJVCA9IDBiMDAxMCxcbiAgLy8gdHJhY2sgW1JldHVybl0gcHJvZHVjdGlvbiBwYXJhbWV0ZXJcbiAgUEFSQU1fUkVUVVJOID0gMGIwMTAwLFxuICBQQVJBTV9JTiA9IDBiMTAwMDsgLy8gdHJhY2sgW0luXSBwcm9kdWN0aW9uIHBhcmFtZXRlclxuXG4vLyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlciBpcyBhIHN0YWNrIGZhc2hpb25lZCBwcm9kdWN0aW9uIHBhcmFtZXRlciB0cmFja2VyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdyYW1tYXItbm90YXRpb25cbi8vIFRoZSB0cmFja2VkIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYWJvdmUuXG4vL1xuLy8gV2hlbmV2ZXIgWytBd2FpdF0vWytZaWVsZF0gYXBwZWFycyBpbiB0aGUgcmlnaHQtaGFuZCBzaWRlcyBvZiBhIHByb2R1Y3Rpb24sXG4vLyB3ZSBtdXN0IGVudGVyIGEgbmV3IHRyYWNraW5nIHN0YWNrLiBGb3IgZXhhbXBsZSB3aGVuIHBhcnNpbmdcbi8vXG4vLyBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gW1lpZWxkLCBBd2FpdF06XG4vLyAgIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBmdW5jdGlvbiBCaW5kaW5nSWRlbnRpZmllcls/WWllbGQsID9Bd2FpdF1cbi8vICAgICAoIEZvcm1hbFBhcmFtZXRlcnNbfllpZWxkLCArQXdhaXRdICkgeyBBc3luY0Z1bmN0aW9uQm9keSB9XG4vL1xuLy8gd2UgbXVzdCBmb2xsb3cgc3VjaCBwcm9jZXNzOlxuLy9cbi8vIDEuIHBhcnNlIGFzeW5jIGtleXdvcmRcbi8vIDIuIHBhcnNlIGZ1bmN0aW9uIGtleXdvcmRcbi8vIDMuIHBhcnNlIGJpbmRpbmdJZGVudGlmaWVyIDw9IGluaGVyaXQgY3VycmVudCBwYXJhbWV0ZXJzOiBbP0F3YWl0XVxuLy8gNC4gZW50ZXIgbmV3IHN0YWNrIHdpdGggKFBBUkFNX0FXQUlUKVxuLy8gNS4gcGFyc2UgZm9ybWFsIHBhcmFtZXRlcnMgPD0gbXVzdCBoYXZlIFtBd2FpdF0gcGFyYW1ldGVyIFsrQXdhaXRdXG4vLyA2LiBwYXJzZSBmdW5jdGlvbiBib2R5XG4vLyA3LiBleGl0IGN1cnJlbnQgc3RhY2tcblxuZXhwb3J0IHR5cGUgUGFyYW1LaW5kID0gbnVtYmVyO1xuXG4vLyB0b2RvKGZsb3ctPnRzKSAtIGNoZWNrIGlmIG1vcmUgZ3JhbnVsYXIgdHlwZSBjYW4gYmUgdXNlZCxcbi8vICB0eXBlIGJlbG93IGlzIG5vdCBnb29kIGJlY2F1c2UgdGhpbmdzIGxpa2UgUEFSQU1fQVdBSVR8UEFSQU1fWUlFTEQgYXJlIG5vdCBpbmNsdWRlZFxuLy8gZXhwb3J0IHR5cGUgUGFyYW1LaW5kID1cbi8vICAgfCB0eXBlb2YgUEFSQU1cbi8vICAgfCB0eXBlb2YgUEFSQU1fQVdBSVRcbi8vICAgfCB0eXBlb2YgUEFSQU1fSU5cbi8vICAgfCB0eXBlb2YgUEFSQU1fUkVUVVJOXG4vLyAgIHwgdHlwZW9mIFBBUkFNX1lJRUxEO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlciB7XG4gIHN0YWNrczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICBlbnRlcihmbGFnczogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFja3MucHVzaChmbGFncyk7XG4gIH1cblxuICBleGl0KCkge1xuICAgIHRoaXMuc3RhY2tzLnBvcCgpO1xuICB9XG5cbiAgY3VycmVudEZsYWdzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tzW3RoaXMuc3RhY2tzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ2V0IGhhc0F3YWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50RmxhZ3MoKSAmIFBBUkFNX0FXQUlUKSA+IDA7XG4gIH1cblxuICBnZXQgaGFzWWllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fWUlFTEQpID4gMDtcbiAgfVxuXG4gIGdldCBoYXNSZXR1cm4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fUkVUVVJOKSA+IDA7XG4gIH1cblxuICBnZXQgaGFzSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRGbGFncygpICYgUEFSQU1fSU4pID4gMDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25GbGFncyhcbiAgaXNBc3luYzogYm9vbGVhbixcbiAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4pOiBQYXJhbUtpbmQge1xuICByZXR1cm4gKGlzQXN5bmMgPyBQQVJBTV9BV0FJVCA6IDApIHwgKGlzR2VuZXJhdG9yID8gUEFSQU1fWUlFTEQgOiAwKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7XG4gIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lLFxuICB0dCxcbiAgdHlwZSBUb2tlblR5cGUsXG59IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCBUb2tlbml6ZXIgZnJvbSBcIi4uL3Rva2VuaXplclwiO1xuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBFc3RyZWVQcm9wZXJ0eURlZmluaXRpb24sIE5vZGUsIE9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBsaW5lQnJlYWssIHNraXBXaGl0ZVNwYWNlVG9MaW5lQnJlYWsgfSBmcm9tIFwiLi4vdXRpbC93aGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJDaGFyIH0gZnJvbSBcIi4uL3V0aWwvaWRlbnRpZmllclwiO1xuaW1wb3J0IENsYXNzU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL2NsYXNzLXNjb3BlXCI7XG5pbXBvcnQgRXhwcmVzc2lvblNjb3BlSGFuZGxlciBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgeyBTQ09QRV9QUk9HUkFNIH0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuaW1wb3J0IFByb2R1Y3Rpb25QYXJhbWV0ZXJIYW5kbGVyLCB7XG4gIFBBUkFNX0FXQUlULFxuICBQQVJBTSxcbn0gZnJvbSBcIi4uL3V0aWwvcHJvZHVjdGlvbi1wYXJhbWV0ZXJcIjtcbmltcG9ydCB7XG4gIEVycm9ycyxcbiAgdHlwZSBQYXJzZUVycm9yLFxuICB0eXBlIFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL3Njb3BlXCI7XG5cbnR5cGUgVHJ5UGFyc2U8Tm9kZSwgRXJyb3IsIFRocm93biwgQWJvcnRlZCwgRmFpbFN0YXRlPiA9IHtcbiAgbm9kZTogTm9kZTtcbiAgZXJyb3I6IEVycm9yO1xuICB0aHJvd246IFRocm93bjtcbiAgYWJvcnRlZDogQWJvcnRlZDtcbiAgZmFpbFN0YXRlOiBGYWlsU3RhdGU7XG59O1xuXG4vLyAjIyBQYXJzZXIgdXRpbGl0aWVzXG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFV0aWxQYXJzZXIgZXh0ZW5kcyBUb2tlbml6ZXIge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIHBhcnNlci9pbmRleC5qc1xuICBhYnN0cmFjdCBnZXRTY29wZUhhbmRsZXIoKTogeyBuZXcgKC4uLmFyZ3M6IGFueSk6IFNjb3BlSGFuZGxlciB9O1xuXG4gIGFkZEV4dHJhKFxuICAgIG5vZGU6IFBhcnRpYWw8Tm9kZT4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBlbnVtZXJhYmxlOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYSA9IChub2RlLmV4dHJhID0gbm9kZS5leHRyYSB8fCB7fSk7XG4gICAgaWYgKGVudW1lcmFibGUpIHtcbiAgICAgIGV4dHJhW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4dHJhLCBrZXksIHsgZW51bWVyYWJsZSwgdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdHMgd2hldGhlciBwYXJzZWQgdG9rZW4gaXMgYSBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgaXNDb250ZXh0dWFsKHRva2VuOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS50eXBlID09PSB0b2tlbiAmJiAhdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgfVxuXG4gIGlzVW5wYXJzZWRDb250ZXh0dWFsKG5hbWVTdGFydDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYW1lRW5kID0gbmFtZVN0YXJ0ICsgbmFtZS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaW5wdXQuc2xpY2UobmFtZVN0YXJ0LCBuYW1lRW5kKSA9PT0gbmFtZSkge1xuICAgICAgY29uc3QgbmV4dENoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KG5hbWVFbmQpO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGlzSWRlbnRpZmllckNoYXIobmV4dENoKSB8fFxuICAgICAgICAvLyBjaGVjayBpZiBgbmV4dENoIGlzIGJldHdlZW4gMHhkODAwIC0gMHhkYmZmLFxuICAgICAgICAvLyBpZiBgbmV4dENoYCBpcyBOYU4sIGBOYU4gJiAweGZjMDBgIGlzIDAsIHRoZSBmdW5jdGlvblxuICAgICAgICAvLyByZXR1cm5zIHRydWVcbiAgICAgICAgKG5leHRDaCAmIDB4ZmMwMCkgPT09IDB4ZDgwMFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNMb29rYWhlYWRDb250ZXh0dWFsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgcmV0dXJuIHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgbmFtZSk7XG4gIH1cblxuICAvLyBDb25zdW1lcyBjb250ZXh0dWFsIGtleXdvcmQgaWYgcG9zc2libGUuXG5cbiAgZWF0Q29udGV4dHVhbCh0b2tlbjogVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHRva2VuKSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQXNzZXJ0cyB0aGF0IGZvbGxvd2luZyB0b2tlbiBpcyBnaXZlbiBjb250ZXh0dWFsIGtleXdvcmQuXG5cbiAgZXhwZWN0Q29udGV4dHVhbChcbiAgICB0b2tlbjogVG9rZW5UeXBlLFxuICAgIHRvUGFyc2VFcnJvcj86IFBhcnNlRXJyb3JDb25zdHJ1Y3Rvcjxhbnk+LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWF0Q29udGV4dHVhbCh0b2tlbikpIHtcbiAgICAgIGlmICh0b1BhcnNlRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKHRvUGFyc2VFcnJvciwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdCB3aGV0aGVyIGEgc2VtaWNvbG9uIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi5cblxuICBjYW5JbnNlcnRTZW1pY29sb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubWF0Y2godHQuZW9mKSB8fFxuICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZVIpIHx8XG4gICAgICB0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpXG4gICAgKTtcbiAgfVxuXG4gIGhhc1ByZWNlZGluZ0xpbmVCcmVhaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGluZUJyZWFrLnRlc3QoXG4gICAgICB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhdGUubGFzdFRva0VuZExvYy5pbmRleCwgdGhpcy5zdGF0ZS5zdGFydCksXG4gICAgKTtcbiAgfVxuXG4gIGhhc0ZvbGxvd2luZ0xpbmVCcmVhaygpOiBib29sZWFuIHtcbiAgICBza2lwV2hpdGVTcGFjZVRvTGluZUJyZWFrLmxhc3RJbmRleCA9IHRoaXMuc3RhdGUuZW5kO1xuICAgIHJldHVybiBza2lwV2hpdGVTcGFjZVRvTGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dCk7XG4gIH1cblxuICBpc0xpbmVUZXJtaW5hdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVhdCh0dC5zZW1pKSB8fCB0aGlzLmNhbkluc2VydFNlbWljb2xvbigpO1xuICB9XG5cbiAgLy8gQ29uc3VtZSBhIHNlbWljb2xvbiwgb3IsIGZhaWxpbmcgdGhhdCwgc2VlIGlmIHdlIGFyZSBhbGxvd2VkIHRvXG4gIC8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG4gIHNlbWljb2xvbihhbGxvd0FzaTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoYWxsb3dBc2kgPyB0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSA6IHRoaXMuZWF0KHR0LnNlbWkpKSByZXR1cm47XG4gICAgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ1NlbWljb2xvbiwgeyBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jIH0pO1xuICB9XG5cbiAgLy8gRXhwZWN0IGEgdG9rZW4gb2YgYSBnaXZlbiB0eXBlLiBJZiBmb3VuZCwgY29uc3VtZSBpdCwgb3RoZXJ3aXNlLFxuICAvLyByYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yIGF0IGdpdmVuIHBvcy5cblxuICBleHBlY3QodHlwZTogVG9rZW5UeXBlLCBsb2M/OiBQb3NpdGlvbiB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVhdCh0eXBlKSB8fCB0aGlzLnVuZXhwZWN0ZWQobG9jLCB0eXBlKTtcbiAgfVxuXG4gIC8vIHRyeVBhcnNlIHdpbGwgY2xvbmUgcGFyc2VyIHN0YXRlLlxuICAvLyBJdCBpcyBleHBlbnNpdmUgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbnNcbiAgdHJ5UGFyc2U8VCBleHRlbmRzIE5vZGUgfCBSZWFkb25seUFycmF5PE5vZGU+PihcbiAgICBmbjogKGFib3J0OiAobm9kZT86IFQpID0+IG5ldmVyKSA9PiBULFxuICAgIG9sZFN0YXRlOiBTdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKSxcbiAgKTpcbiAgICB8IFRyeVBhcnNlPFQsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbD5cbiAgICB8IFRyeVBhcnNlPFQgfCBudWxsLCBQYXJzZUVycm9yPGFueT4sIGJvb2xlYW4sIGZhbHNlLCBTdGF0ZT5cbiAgICB8IFRyeVBhcnNlPFQgfCBudWxsLCBudWxsLCBmYWxzZSwgdHJ1ZSwgU3RhdGU+IHtcbiAgICBjb25zdCBhYm9ydFNpZ25hbDoge1xuICAgICAgbm9kZTogVCB8IG51bGw7XG4gICAgfSA9IHsgbm9kZTogbnVsbCB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlID0gZm4oKG5vZGUgPSBudWxsKSA9PiB7XG4gICAgICAgIGFib3J0U2lnbmFsLm5vZGUgPSBub2RlO1xuICAgICAgICB0aHJvdyBhYm9ydFNpZ25hbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3JzLmxlbmd0aCA+IG9sZFN0YXRlLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmFpbFN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICAvLyB0b2tlbnNMZW5ndGggc2hvdWxkIGJlIHByZXNlcnZlZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkgbW9kZVxuICAgICAgICAvLyBzaW5jZSB0aGUgcGFyc2VyIGRvZXMgbm90IGhhbHQgYW5kIHdpbGwgaW5zdGVhZCBwYXJzZSB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHRva2Vuc1xuICAgICAgICB0aGlzLnN0YXRlLnRva2Vuc0xlbmd0aCA9IGZhaWxTdGF0ZS50b2tlbnNMZW5ndGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBlcnJvcjogZmFpbFN0YXRlLmVycm9yc1tvbGRTdGF0ZS5lcnJvcnMubGVuZ3RoXSxcbiAgICAgICAgICB0aHJvd246IGZhbHNlLFxuICAgICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGZhaWxTdGF0ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIHRocm93bjogZmFsc2UsXG4gICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICBmYWlsU3RhdGU6IG51bGwsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBmYWlsU3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYXN0aW5nIGdlbmVyYWwgc3ludGF4IGVycm9yIHRvIHBhcnNlIGVycm9yXG4gICAgICAgIHJldHVybiB7IG5vZGU6IG51bGwsIGVycm9yLCB0aHJvd246IHRydWUsIGFib3J0ZWQ6IGZhbHNlLCBmYWlsU3RhdGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvciA9PT0gYWJvcnRTaWduYWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBhYm9ydFNpZ25hbC5ub2RlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHRocm93bjogZmFsc2UsXG4gICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICBmYWlsU3RhdGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRXhwcmVzc2lvbkVycm9ycyhcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBhbmRUaHJvdzogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKCFyZWZFeHByZXNzaW9uRXJyb3JzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qge1xuICAgICAgc2hvcnRoYW5kQXNzaWduTG9jLFxuICAgICAgZG91YmxlUHJvdG9Mb2MsXG4gICAgICBwcml2YXRlS2V5TG9jLFxuICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzTG9jLFxuICAgIH0gPSByZWZFeHByZXNzaW9uRXJyb3JzO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID1cbiAgICAgICEhc2hvcnRoYW5kQXNzaWduTG9jIHx8XG4gICAgICAhIWRvdWJsZVByb3RvTG9jIHx8XG4gICAgICAhIW9wdGlvbmFsUGFyYW1ldGVyc0xvYyB8fFxuICAgICAgISFwcml2YXRlS2V5TG9jO1xuXG4gICAgaWYgKCFhbmRUaHJvdykge1xuICAgICAgcmV0dXJuIGhhc0Vycm9ycztcbiAgICB9XG5cbiAgICBpZiAoc2hvcnRoYW5kQXNzaWduTG9jICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRDb3ZlckluaXRpYWxpemVkTmFtZSwge1xuICAgICAgICBhdDogc2hvcnRoYW5kQXNzaWduTG9jLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRvdWJsZVByb3RvTG9jICE9IG51bGwpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZVByb3RvLCB7IGF0OiBkb3VibGVQcm90b0xvYyB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJpdmF0ZUtleUxvYyAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkUHJpdmF0ZUZpZWxkLCB7IGF0OiBwcml2YXRlS2V5TG9jIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25hbFBhcmFtZXRlcnNMb2MgIT0gbnVsbCkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKG9wdGlvbmFsUGFyYW1ldGVyc0xvYyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgY3VycmVudCB0b2tlbiBpcyBhIGxpdGVyYWwgcHJvcGVydHkgbmFtZVxuICAgKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1MaXRlcmFsUHJvcGVydHlOYW1lXG4gICAqIExpdGVyYWxQcm9wZXJ0eU5hbWU6XG4gICAqICAgSWRlbnRpZmllck5hbWVcbiAgICogICBTdHJpbmdMaXRlcmFsXG4gICAqICAgTnVtZXJpY0xpdGVyYWxcbiAgICogICBCaWdJbnRMaXRlcmFsXG4gICAqL1xuICBpc0xpdGVyYWxQcm9wZXJ0eU5hbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBpZiBnaXZlbiBub2RlIGlzIGEgUHJpdmF0ZU5hbWVcbiAgICogd2lsbCBiZSBvdmVycmlkZGVuIGluIEVTVHJlZSBwbHVnaW5cbiAgICovXG4gIGlzUHJpdmF0ZU5hbWUobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiUHJpdmF0ZU5hbWVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBvZiBhIGdpdmVuIHByaXZhdGUgbmFtZVxuICAgKiBXSVRIT1VUIGAjYFxuICAgKiBAc2VlIHtAbGluayBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0YXRpYy1zZW1hbnRpY3Mtc3RyaW5ndmFsdWV9XG4gICAqL1xuICBnZXRQcml2YXRlTmFtZVNWKG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBub2RlLmlkLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgaXMgYSBtZW1iZXIvb3B0aW9uYWwgY2hhaW4gdGhhdFxuICAgKiBjb250YWlucyBhIHByaXZhdGUgbmFtZSBhcyBpdHMgcHJvcGVydHlcbiAgICogSXQgaXMgb3ZlcnJpZGRlbiBpbiBFU1RyZWUgcGx1Z2luXG4gICAqL1xuICBoYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAobm9kZS50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICBub2RlLnR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpICYmXG4gICAgICB0aGlzLmlzUHJpdmF0ZU5hbWUobm9kZS5wcm9wZXJ0eSlcbiAgICApO1xuICB9XG5cbiAgaXNPYmplY3RQcm9wZXJ0eShcbiAgICBub2RlOiBOb2RlLFxuICApOiBub2RlIGlzIE9iamVjdFByb3BlcnR5IHwgRXN0cmVlUHJvcGVydHlEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCI7XG4gIH1cblxuICBpc09iamVjdE1ldGhvZChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gXCJPYmplY3RNZXRob2RcIjtcbiAgfVxuXG4gIGluaXRpYWxpemVTY29wZXMoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGluTW9kdWxlOiBib29sZWFuID0gdGhpcy5vcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCIsXG4gICk6ICgpID0+IHZvaWQge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBvbGRMYWJlbHMgPSB0aGlzLnN0YXRlLmxhYmVscztcbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IFtdO1xuXG4gICAgY29uc3Qgb2xkRXhwb3J0ZWRJZGVudGlmaWVycyA9IHRoaXMuZXhwb3J0ZWRJZGVudGlmaWVycztcbiAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBpbml0aWFsaXplIHNjb3Blc1xuICAgIGNvbnN0IG9sZEluTW9kdWxlID0gdGhpcy5pbk1vZHVsZTtcbiAgICB0aGlzLmluTW9kdWxlID0gaW5Nb2R1bGU7XG5cbiAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc2NvcGU7XG4gICAgY29uc3QgU2NvcGVIYW5kbGVyID0gdGhpcy5nZXRTY29wZUhhbmRsZXIoKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlSGFuZGxlcih0aGlzLCBpbk1vZHVsZSk7XG5cbiAgICBjb25zdCBvbGRQcm9kUGFyYW0gPSB0aGlzLnByb2RQYXJhbTtcbiAgICB0aGlzLnByb2RQYXJhbSA9IG5ldyBQcm9kdWN0aW9uUGFyYW1ldGVySGFuZGxlcigpO1xuXG4gICAgY29uc3Qgb2xkQ2xhc3NTY29wZSA9IHRoaXMuY2xhc3NTY29wZTtcbiAgICB0aGlzLmNsYXNzU2NvcGUgPSBuZXcgQ2xhc3NTY29wZUhhbmRsZXIodGhpcyk7XG5cbiAgICBjb25zdCBvbGRFeHByZXNzaW9uU2NvcGUgPSB0aGlzLmV4cHJlc3Npb25TY29wZTtcbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZSA9IG5ldyBFeHByZXNzaW9uU2NvcGVIYW5kbGVyKHRoaXMpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIC8vIFJldmVydCBzdGF0ZVxuICAgICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBvbGRMYWJlbHM7XG4gICAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMgPSBvbGRFeHBvcnRlZElkZW50aWZpZXJzO1xuXG4gICAgICAvLyBSZXZlcnQgc2NvcGVzXG4gICAgICB0aGlzLmluTW9kdWxlID0gb2xkSW5Nb2R1bGU7XG4gICAgICB0aGlzLnNjb3BlID0gb2xkU2NvcGU7XG4gICAgICB0aGlzLnByb2RQYXJhbSA9IG9sZFByb2RQYXJhbTtcbiAgICAgIHRoaXMuY2xhc3NTY29wZSA9IG9sZENsYXNzU2NvcGU7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZSA9IG9sZEV4cHJlc3Npb25TY29wZTtcbiAgICB9O1xuICB9XG5cbiAgZW50ZXJJbml0aWFsU2NvcGVzKCkge1xuICAgIGxldCBwYXJhbUZsYWdzID0gUEFSQU07XG4gICAgaWYgKHRoaXMuaW5Nb2R1bGUpIHtcbiAgICAgIHBhcmFtRmxhZ3MgfD0gUEFSQU1fQVdBSVQ7XG4gICAgfVxuICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfUFJPR1JBTSk7XG4gICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIocGFyYW1GbGFncyk7XG4gIH1cblxuICBjaGVja0Rlc3RydWN0dXJpbmdQcml2YXRlKHJlZkV4cHJlc3Npb25FcnJvcnM6IEV4cHJlc3Npb25FcnJvcnMpIHtcbiAgICBjb25zdCB7IHByaXZhdGVLZXlMb2MgfSA9IHJlZkV4cHJlc3Npb25FcnJvcnM7XG4gICAgaWYgKHByaXZhdGVLZXlMb2MgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZGVzdHJ1Y3R1cmluZ1ByaXZhdGVcIiwgcHJpdmF0ZUtleUxvYyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIEV4cHJlc3Npb25FcnJvcnMgaXMgYSBjb250ZXh0IHN0cnVjdCB1c2VkIHRvIHRyYWNrIGFtYmlndW91cyBwYXR0ZXJuc1xuICogV2hlbiB3ZSBhcmUgc3VyZSB0aGUgcGFyc2VkIHBhdHRlcm4gaXMgYSBSSFMsIHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBhIHBhdHRlcm4sXG4gKiB3ZSB3aWxsIHRocm93IG9uIHRoaXMgcG9zaXRpb24gb24gaW52YWxpZCBhc3NpZ24gc3ludGF4LCBvdGhlcndpc2UgaXQgd2lsbCBiZSByZXNldCB0byAtMVxuICpcbiAqIFR5cGVzIG9mIEV4cHJlc3Npb25FcnJvcnM6XG4gKlxuICogLSAqKnNob3J0aGFuZEFzc2lnbkxvYyoqOiB0cmFjayBpbml0aWFsaXplciBgPWAgcG9zaXRpb25cbiAqIC0gKipkb3VibGVQcm90b0xvYyoqOiB0cmFjayB0aGUgZHVwbGljYXRlIGBfX3Byb3RvX19gIGtleSBwb3NpdGlvblxuICogLSAqKnByaXZhdGVLZXkqKjogdHJhY2sgcHJpdmF0ZSBrZXkgYCNwYCBwb3NpdGlvblxuICogLSAqKm9wdGlvbmFsUGFyYW1ldGVyc0xvYyoqOiB0cmFjayB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIChgP2ApLlxuICogSXQncyBvbmx5IHVzZWQgYnkgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uRXJyb3JzIHtcbiAgc2hvcnRoYW5kQXNzaWduTG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICBkb3VibGVQcm90b0xvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZUtleUxvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgb3B0aW9uYWxQYXJhbWV0ZXJzTG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xufVxuIiwgImltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IFV0aWxQYXJzZXIgZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIHR5cGUgUG9zaXRpb24gfSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBDb21tZW50LCBOb2RlIGFzIE5vZGVUeXBlLCBOb2RlQmFzZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0LlxuXG5jbGFzcyBOb2RlIGltcGxlbWVudHMgTm9kZUJhc2Uge1xuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFBhcnNlciwgcG9zOiBudW1iZXIsIGxvYzogUG9zaXRpb24pIHtcbiAgICB0aGlzLnN0YXJ0ID0gcG9zO1xuICAgIHRoaXMuZW5kID0gMDtcbiAgICB0aGlzLmxvYyA9IG5ldyBTb3VyY2VMb2NhdGlvbihsb2MpO1xuICAgIGlmIChwYXJzZXI/Lm9wdGlvbnMucmFuZ2VzKSB0aGlzLnJhbmdlID0gW3BvcywgMF07XG4gICAgaWYgKHBhcnNlcj8uZmlsZW5hbWUpIHRoaXMubG9jLmZpbGVuYW1lID0gcGFyc2VyLmZpbGVuYW1lO1xuICB9XG5cbiAgdHlwZTogc3RyaW5nID0gXCJcIjtcbiAgZGVjbGFyZSBzdGFydDogbnVtYmVyO1xuICBkZWNsYXJlIGVuZDogbnVtYmVyO1xuICBkZWNsYXJlIGxvYzogU291cmNlTG9jYXRpb247XG4gIGRlY2xhcmUgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIGRlY2xhcmUgbGVhZGluZ0NvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSB0cmFpbGluZ0NvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSBpbm5lckNvbW1lbnRzOiBBcnJheTxDb21tZW50PjtcbiAgZGVjbGFyZSBleHRyYToge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cbmNvbnN0IE5vZGVQcm90b3R5cGUgPSBOb2RlLnByb3RvdHlwZTtcblxuaWYgKCFwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgX19jbG9uZSBpcyBub3QgZGVmaW5lZCBpbiBOb2RlIHByb3RvdHlwZVxuICBOb2RlUHJvdG90eXBlLl9fY2xvbmUgPSBmdW5jdGlvbiAoKTogTm9kZSB7XG4gICAgY29uc3QgbmV3Tm9kZSA9IG5ldyBOb2RlKHVuZGVmaW5lZCwgdGhpcy5zdGFydCwgdGhpcy5sb2Muc3RhcnQpO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKSBhcyAoa2V5b2YgTm9kZSlbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIC8vIERvIG5vdCBjbG9uZSBjb21tZW50cyB0aGF0IGFyZSBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBub2RlXG4gICAgICBpZiAoXG4gICAgICAgIGtleSAhPT0gXCJsZWFkaW5nQ29tbWVudHNcIiAmJlxuICAgICAgICBrZXkgIT09IFwidHJhaWxpbmdDb21tZW50c1wiICYmXG4gICAgICAgIGtleSAhPT0gXCJpbm5lckNvbW1lbnRzXCJcbiAgICAgICkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNsb25pbmcgdGhpcyB0byBuZXdOb2RlXG4gICAgICAgIG5ld05vZGVba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Tm9kZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xvbmVQbGFjZWhvbGRlcihub2RlOiBhbnkpOiBhbnkge1xuICByZXR1cm4gY2xvbmVJZGVudGlmaWVyKG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVJZGVudGlmaWVyKG5vZGU6IGFueSk6IGFueSB7XG4gIC8vIFdlIGRvbid0IG5lZWQgdG8gY2xvbmUgYHR5cGVBbm5vdGF0aW9uc2AgYW5kIGBvcHRpb25hbGA6IGJlY2F1c2VcbiAgLy8gY2xvbmVJZGVudGlmaWVyIGlzIG9ubHkgdXNlZCBpbiBvYmplY3Qgc2hvcnRoYW5kIGFuZCBuYW1lZCBpbXBvcnQvZXhwb3J0LlxuICAvLyBOZWl0aGVyIG9mIHRoZW0gYWxsb3cgdHlwZSBhbm5vdGF0aW9ucyBhZnRlciB0aGUgaWRlbnRpZmllciBvciBvcHRpb25hbCBpZGVudGlmaWVyXG4gIGNvbnN0IHsgdHlwZSwgc3RhcnQsIGVuZCwgbG9jLCByYW5nZSwgZXh0cmEsIG5hbWUgfSA9IG5vZGU7XG4gIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoTm9kZVByb3RvdHlwZSk7XG4gIGNsb25lZC50eXBlID0gdHlwZTtcbiAgY2xvbmVkLnN0YXJ0ID0gc3RhcnQ7XG4gIGNsb25lZC5lbmQgPSBlbmQ7XG4gIGNsb25lZC5sb2MgPSBsb2M7XG4gIGNsb25lZC5yYW5nZSA9IHJhbmdlO1xuICBjbG9uZWQuZXh0cmEgPSBleHRyYTtcbiAgY2xvbmVkLm5hbWUgPSBuYW1lO1xuICBpZiAodHlwZSA9PT0gXCJQbGFjZWhvbGRlclwiKSB7XG4gICAgY2xvbmVkLmV4cGVjdGVkTm9kZSA9IG5vZGUuZXhwZWN0ZWROb2RlO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVN0cmluZ0xpdGVyYWwobm9kZTogYW55KTogYW55IHtcbiAgY29uc3QgeyB0eXBlLCBzdGFydCwgZW5kLCBsb2MsIHJhbmdlLCBleHRyYSB9ID0gbm9kZTtcbiAgaWYgKHR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIikge1xuICAgIHJldHVybiBjbG9uZVBsYWNlaG9sZGVyKG5vZGUpO1xuICB9XG4gIGNvbnN0IGNsb25lZCA9IE9iamVjdC5jcmVhdGUoTm9kZVByb3RvdHlwZSk7XG4gIGNsb25lZC50eXBlID0gdHlwZTtcbiAgY2xvbmVkLnN0YXJ0ID0gc3RhcnQ7XG4gIGNsb25lZC5lbmQgPSBlbmQ7XG4gIGNsb25lZC5sb2MgPSBsb2M7XG4gIGNsb25lZC5yYW5nZSA9IHJhbmdlO1xuICBpZiAobm9kZS5yYXcgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGVzdHJlZSBzZXQgbm9kZS5yYXcgaW5zdGVhZCBvZiBub2RlLmV4dHJhXG4gICAgY2xvbmVkLnJhdyA9IG5vZGUucmF3O1xuICB9IGVsc2Uge1xuICAgIGNsb25lZC5leHRyYSA9IGV4dHJhO1xuICB9XG4gIGNsb25lZC52YWx1ZSA9IG5vZGUudmFsdWU7XG4gIHJldHVybiBjbG9uZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFVuZG9uZTxUIGV4dGVuZHMgTm9kZVR5cGU+ID0gT21pdDxULCBcInR5cGVcIj47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb2RlVXRpbHMgZXh0ZW5kcyBVdGlsUGFyc2VyIHtcbiAgc3RhcnROb2RlPFQgZXh0ZW5kcyBOb2RlVHlwZT4oKTogVW5kb25lPFQ+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhc3QgTm9kZSBhcyBVbmRvbmU8VD5cbiAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5zdGF0ZS5zdGFydCwgdGhpcy5zdGF0ZS5zdGFydExvYyk7XG4gIH1cblxuICBzdGFydE5vZGVBdDxUIGV4dGVuZHMgTm9kZVR5cGU+KGxvYzogUG9zaXRpb24pOiBVbmRvbmU8VD4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBOb2RlIGFzIFVuZG9uZTxUPlxuICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCBsb2MuaW5kZXgsIGxvYyk7XG4gIH1cblxuICAvKiogU3RhcnQgYSBuZXcgbm9kZSB3aXRoIGEgcHJldmlvdXMgbm9kZSdzIGxvY2F0aW9uLiAqL1xuICBzdGFydE5vZGVBdE5vZGU8VCBleHRlbmRzIE5vZGVUeXBlPih0eXBlOiBVbmRvbmU8Tm9kZVR5cGU+KTogVW5kb25lPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFydE5vZGVBdCh0eXBlLmxvYy5zdGFydCk7XG4gIH1cblxuICAvLyBGaW5pc2ggYW4gQVNUIG5vZGUsIGFkZGluZyBgdHlwZWAgYW5kIGBlbmRgIHByb3BlcnRpZXMuXG5cbiAgZmluaXNoTm9kZTxUIGV4dGVuZHMgTm9kZVR5cGU+KG5vZGU6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0pOiBUIHtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jKTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXG5cbiAgZmluaXNoTm9kZUF0PFQgZXh0ZW5kcyBOb2RlVHlwZT4oXG4gICAgbm9kZTogT21pdDxULCBcInR5cGVcIj4sXG4gICAgdHlwZTogVFtcInR5cGVcIl0sXG4gICAgZW5kTG9jOiBQb3NpdGlvbixcbiAgKTogVCB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBub2RlLmVuZCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJEbyBub3QgY2FsbCBmaW5pc2hOb2RlKigpIHR3aWNlIG9uIHRoZSBzYW1lIG5vZGUuXCIgK1xuICAgICAgICAgIFwiIEluc3RlYWQgdXNlIHJlc2V0RW5kTG9jYXRpb24oKSBvciBjaGFuZ2UgdHlwZSBkaXJlY3RseS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlcyBBU1QgdHlwaW5nc1xuICAgIG5vZGUudHlwZSA9IHR5cGU7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzIEFTVCB0eXBpbmdzXG4gICAgbm9kZS5lbmQgPSBlbmRMb2MuaW5kZXg7XG4gICAgbm9kZS5sb2MuZW5kID0gZW5kTG9jO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSBub2RlLnJhbmdlWzFdID0gZW5kTG9jLmluZGV4O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0YWNoQ29tbWVudCkgdGhpcy5wcm9jZXNzQ29tbWVudChub2RlIGFzIFQpO1xuICAgIHJldHVybiBub2RlIGFzIFQ7XG4gIH1cblxuICByZXNldFN0YXJ0TG9jYXRpb24obm9kZTogTm9kZUJhc2UsIHN0YXJ0TG9jOiBQb3NpdGlvbik6IHZvaWQge1xuICAgIG5vZGUuc3RhcnQgPSBzdGFydExvYy5pbmRleDtcbiAgICBub2RlLmxvYy5zdGFydCA9IHN0YXJ0TG9jO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSBub2RlLnJhbmdlWzBdID0gc3RhcnRMb2MuaW5kZXg7XG4gIH1cblxuICByZXNldEVuZExvY2F0aW9uKFxuICAgIG5vZGU6IE5vZGVCYXNlLFxuICAgIGVuZExvYzogUG9zaXRpb24gPSB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICk6IHZvaWQge1xuICAgIG5vZGUuZW5kID0gZW5kTG9jLmluZGV4O1xuICAgIG5vZGUubG9jLmVuZCA9IGVuZExvYztcbiAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgbm9kZS5yYW5nZVsxXSA9IGVuZExvYy5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhcnQgbG9jYXRpb24gb2Ygbm9kZSB0byB0aGUgc3RhcnQgbG9jYXRpb24gb2YgbG9jYXRpb25Ob2RlXG4gICAqL1xuICByZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShub2RlOiBOb2RlQmFzZSwgbG9jYXRpb25Ob2RlOiBOb2RlQmFzZSk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uKG5vZGUsIGxvY2F0aW9uTm9kZS5sb2Muc3RhcnQpO1xuICB9XG59XG4iLCAiLyo6OiBkZWNsYXJlIHZhciBpbnZhcmlhbnQ7ICovXG5cbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi4vLi4vcGFyc2VyXCI7XG5pbXBvcnQge1xuICB0b2tlbklzSWRlbnRpZmllcixcbiAgdG9rZW5Jc0tleXdvcmQsXG4gIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyLFxuICB0b2tlbklzTGl0ZXJhbFByb3BlcnR5TmFtZSxcbiAgdG9rZW5MYWJlbE5hbWUsXG4gIHR0LFxuICB0eXBlIFRva2VuVHlwZSxcbiAgdG9rZW5Jc0Zsb3dJbnRlcmZhY2VPclR5cGVPck9wYXF1ZSxcbn0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgeyB0eXBlcyBhcyB0YyB9IGZyb20gXCIuLi8uLi90b2tlbml6ZXIvY29udGV4dFwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB7IGlzSXRlcmF0b3JTdGFydCB9IGZyb20gXCIuLi8uLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCBGbG93U2NvcGVIYW5kbGVyIGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQge1xuICBCSU5EX0xFWElDQUwsXG4gIEJJTkRfVkFSLFxuICBCSU5EX0ZVTkNUSU9OLFxuICBCSU5EX0ZMT1dfREVDTEFSRV9GTixcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0ZVTkNUSU9OLFxuICBTQ09QRV9PVEhFUixcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG59IGZyb20gXCIuLi8uLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZVN0YXRlbWVudEZsYWcgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL3N0YXRlbWVudFwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuLi8uLi9wYXJzZXIvbm9kZVwiO1xuXG5jb25zdCByZXNlcnZlZFR5cGVzID0gbmV3IFNldChbXG4gIFwiX1wiLFxuICBcImFueVwiLFxuICBcImJvb2xcIixcbiAgXCJib29sZWFuXCIsXG4gIFwiZW1wdHlcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJpbnRlcmZhY2VcIixcbiAgXCJtaXhlZFwiLFxuICBcIm51bGxcIixcbiAgXCJudW1iZXJcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJ0cnVlXCIsXG4gIFwidHlwZW9mXCIsXG4gIFwidm9pZFwiLFxuXSk7XG5cbi8qIGVzbGludCBzb3J0LWtleXM6IFwiZXJyb3JcIiAqL1xuLy8gVGhlIEVycm9ycyBrZXkgZm9sbG93cyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9ibG9iL21hc3Rlci9zcmMvcGFyc2VyL3BhcnNlX2Vycm9yLm1sIHVubGVzcyBpdCBkb2VzIG5vdCBleGlzdFxuY29uc3QgRmxvd0Vycm9ycyA9IFBhcnNlRXJyb3JFbnVtYGZsb3dgKHtcbiAgQW1iaWd1b3VzQ29uZGl0aW9uYWxBcnJvdzpcbiAgICBcIkFtYmlndW91cyBleHByZXNzaW9uOiB3cmFwIHRoZSBhcnJvdyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXMgdG8gZGlzYW1iaWd1YXRlLlwiLFxuICBBbWJpZ3VvdXNEZWNsYXJlTW9kdWxlS2luZDpcbiAgICBcIkZvdW5kIGJvdGggYGRlY2xhcmUgbW9kdWxlLmV4cG9ydHNgIGFuZCBgZGVjbGFyZSBleHBvcnRgIGluIHRoZSBzYW1lIG1vZHVsZS4gTW9kdWxlcyBjYW4gb25seSBoYXZlIDEgc2luY2UgdGhleSBhcmUgZWl0aGVyIGFuIEVTIG1vZHVsZSBvciB0aGV5IGFyZSBhIENvbW1vbkpTIG1vZHVsZS5cIixcbiAgLy8gVE9ETzogV2hlbiB3ZSBnZXQgcHJvcGVyIHN0cmluZyBlbnVtcyBpbiB0eXBlc2NyaXB0IG1ha2UgdGhpcyBSZXNlcnZlZFR5cGUuXG4gIC8vIE5vdCByZWFsbHkgd29ydGggaXQgdG8gZG8gdGhlIHdob2xlICRWYWx1ZXMgZGFuY2Ugd2l0aCByZXNlcnZlZFR5cGVzIHNldC5cbiAgQXNzaWduUmVzZXJ2ZWRUeXBlOiAoeyByZXNlcnZlZFR5cGUgfTogeyByZXNlcnZlZFR5cGU6IHN0cmluZyB9KSA9PlxuICAgIGBDYW5ub3Qgb3ZlcndyaXRlIHJlc2VydmVkIHR5cGUgJHtyZXNlcnZlZFR5cGV9LmAsXG4gIERlY2xhcmVDbGFzc0VsZW1lbnQ6XG4gICAgXCJUaGUgYGRlY2xhcmVgIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBjbGFzcyBmaWVsZHMuXCIsXG4gIERlY2xhcmVDbGFzc0ZpZWxkSW5pdGlhbGl6ZXI6XG4gICAgXCJJbml0aWFsaXplcnMgYXJlIG5vdCBhbGxvd2VkIGluIGZpZWxkcyB3aXRoIHRoZSBgZGVjbGFyZWAgbW9kaWZpZXIuXCIsXG4gIER1cGxpY2F0ZURlY2xhcmVNb2R1bGVFeHBvcnRzOlxuICAgIFwiRHVwbGljYXRlIGBkZWNsYXJlIG1vZHVsZS5leHBvcnRzYCBzdGF0ZW1lbnQuXCIsXG4gIEVudW1Cb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQ6ICh7XG4gICAgbWVtYmVyTmFtZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBCb29sZWFuIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLiBVc2UgZWl0aGVyIFxcYCR7bWVtYmVyTmFtZX0gPSB0cnVlLFxcYCBvciBcXGAke21lbWJlck5hbWV9ID0gZmFsc2UsXFxgIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bUR1cGxpY2F0ZU1lbWJlck5hbWU6ICh7XG4gICAgbWVtYmVyTmFtZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBFbnVtIG1lbWJlciBuYW1lcyBuZWVkIHRvIGJlIHVuaXF1ZSwgYnV0IHRoZSBuYW1lIFxcYCR7bWVtYmVyTmFtZX1cXGAgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGJlZm9yZSBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG4gIEVudW1JbmNvbnNpc3RlbnRNZW1iZXJWYWx1ZXM6ICh7IGVudW1OYW1lIH06IHsgZW51bU5hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFbnVtIFxcYCR7ZW51bU5hbWV9XFxgIGhhcyBpbmNvbnNpc3RlbnQgbWVtYmVyIGluaXRpYWxpemVycy4gRWl0aGVyIHVzZSBubyBpbml0aWFsaXplcnMsIG9yIGNvbnNpc3RlbnRseSB1c2UgbGl0ZXJhbHMgKGVpdGhlciBib29sZWFucywgbnVtYmVycywgb3Igc3RyaW5ncykgZm9yIGFsbCBtZW1iZXIgaW5pdGlhbGl6ZXJzLmAsXG4gIEVudW1JbnZhbGlkRXhwbGljaXRUeXBlOiAoe1xuICAgIGludmFsaWRFbnVtVHlwZSxcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIGludmFsaWRFbnVtVHlwZTogc3RyaW5nO1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYEVudW0gdHlwZSBcXGAke2ludmFsaWRFbnVtVHlwZX1cXGAgaXMgbm90IHZhbGlkLiBVc2Ugb25lIG9mIFxcYGJvb2xlYW5cXGAsIFxcYG51bWJlclxcYCwgXFxgc3RyaW5nXFxgLCBvciBcXGBzeW1ib2xcXGAgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBFbnVtSW52YWxpZEV4cGxpY2l0VHlwZVVua25vd25TdXBwbGllZDogKHtcbiAgICBlbnVtTmFtZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFN1cHBsaWVkIGVudW0gdHlwZSBpcyBub3QgdmFsaWQuIFVzZSBvbmUgb2YgXFxgYm9vbGVhblxcYCwgXFxgbnVtYmVyXFxgLCBcXGBzdHJpbmdcXGAsIG9yIFxcYHN5bWJvbFxcYCBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG5cbiAgLy8gVE9ETzogV2hlbiBtb3ZpbmcgdG8gdHlwZXNjcmlwdCwgd2Ugc2hvdWxkIGVpdGhlciBoYXZlIGVhY2ggb2YgdGhlXG4gIC8vIGZvbGxvd2luZyBlcnJvcnMgb25seSBhY2NlcHQgdGhlIHNwZWNpZmljIHN0cmluZ3MgdGhleSB3YW50OlxuICAvL1xuICAvLyAuLi5QcmltYXJ5VHlwZTogZXhwbGljaXRUeXBlOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiXG4gIC8vIC4uLlN5bWJvbFR5cGU6IGV4cGxpY2l0VHlwZTogXCJzeW1ib2xcIlxuICAvLyAuLi5Vbmtub3duVHlwZTogZXhwbGljaXRUeXBlOiBudWxsXG4gIC8vXG4gIC8vIE9yLCBhbHRlcm5hdGl2ZWx5LCBtZXJnZSB0aGVzZSB0aHJlZSBlcnJvcnMgdG9nZXRoZXIgaW50byBvbmVcbiAgLy8gYEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJgIGVycm9yIHRoYXQgY2FuIGFjY2VwdCBgRW51bUV4cGxpY2l0VHlwZWBcbiAgLy8gd2l0aG91dCBhbHRlcmF0aW9uLCBhbmQgdGhlbiBqdXN0IGhhdmUgaXRzIG1lc3NhZ2UgY2hhbmdlIGJhc2VkIG9uIHRoZVxuICAvLyBleHBsaWNpdFR5cGUuXG4gIEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJQcmltYXJ5VHlwZTogKHtcbiAgICBlbnVtTmFtZSxcbiAgICBtZW1iZXJOYW1lLFxuICAgIGV4cGxpY2l0VHlwZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgbWVtYmVyTmFtZTogc3RyaW5nO1xuICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgfSkgPT5cbiAgICBgRW51bSBcXGAke2VudW1OYW1lfVxcYCBoYXMgdHlwZSBcXGAke2V4cGxpY2l0VHlwZX1cXGAsIHNvIHRoZSBpbml0aWFsaXplciBvZiBcXGAke21lbWJlck5hbWV9XFxgIG5lZWRzIHRvIGJlIGEgJHtleHBsaWNpdFR5cGV9IGxpdGVyYWwuYCxcbiAgRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclN5bWJvbFR5cGU6ICh7XG4gICAgZW51bU5hbWUsXG4gICAgbWVtYmVyTmFtZSxcbiAgfToge1xuICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgbWVtYmVyTmFtZTogc3RyaW5nO1xuICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgfSkgPT5cbiAgICBgU3ltYm9sIGVudW0gbWVtYmVycyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuIFVzZSBcXGAke21lbWJlck5hbWV9LFxcYCBpbiBlbnVtIFxcYCR7ZW51bU5hbWV9XFxgLmAsXG4gIEVudW1JbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXJVbmtub3duVHlwZTogKHtcbiAgICBlbnVtTmFtZSxcbiAgICBtZW1iZXJOYW1lLFxuICB9OiB7XG4gICAgZW51bU5hbWU6IHN0cmluZztcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmc7XG4gICAgZXhwbGljaXRUeXBlOiBFbnVtRXhwbGljaXRUeXBlO1xuICB9KSA9PlxuICAgIGBUaGUgZW51bSBtZW1iZXIgaW5pdGlhbGl6ZXIgZm9yIFxcYCR7bWVtYmVyTmFtZX1cXGAgbmVlZHMgdG8gYmUgYSBsaXRlcmFsIChlaXRoZXIgYSBib29sZWFuLCBudW1iZXIsIG9yIHN0cmluZykgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBFbnVtSW52YWxpZE1lbWJlck5hbWU6ICh7XG4gICAgZW51bU5hbWUsXG4gICAgbWVtYmVyTmFtZSxcbiAgICBzdWdnZXN0aW9uLFxuICB9OiB7XG4gICAgZW51bU5hbWU6IHN0cmluZztcbiAgICBtZW1iZXJOYW1lOiBzdHJpbmc7XG4gICAgc3VnZ2VzdGlvbjogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBFbnVtIG1lbWJlciBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBsb3dlcmNhc2UgJ2EnIHRocm91Z2ggJ3onLiBJbnN0ZWFkIG9mIHVzaW5nIFxcYCR7bWVtYmVyTmFtZX1cXGAsIGNvbnNpZGVyIHVzaW5nIFxcYCR7c3VnZ2VzdGlvbn1cXGAsIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bU51bWJlck1lbWJlck5vdEluaXRpYWxpemVkOiAoe1xuICAgIGVudW1OYW1lLFxuICAgIG1lbWJlck5hbWUsXG4gIH06IHtcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgfSkgPT5cbiAgICBgTnVtYmVyIGVudW0gbWVtYmVycyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLCBlLmcuIFxcYCR7bWVtYmVyTmFtZX0gPSAxXFxgIGluIGVudW0gXFxgJHtlbnVtTmFtZX1cXGAuYCxcbiAgRW51bVN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQ6ICh7XG4gICAgZW51bU5hbWUsXG4gIH06IHtcbiAgICBlbnVtTmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBTdHJpbmcgZW51bSBtZW1iZXJzIG5lZWQgdG8gY29uc2lzdGVudGx5IGVpdGhlciBhbGwgdXNlIGluaXRpYWxpemVycywgb3IgdXNlIG5vIGluaXRpYWxpemVycywgaW4gZW51bSBcXGAke2VudW1OYW1lfVxcYC5gLFxuICBHZXR0ZXJNYXlOb3RIYXZlVGhpc1BhcmFtOiBcIkEgZ2V0dGVyIGNhbm5vdCBoYXZlIGEgYHRoaXNgIHBhcmFtZXRlci5cIixcbiAgSW1wb3J0UmVmbGVjdGlvbkhhc0ltcG9ydFR5cGU6XG4gICAgXCJBbiBgaW1wb3J0IG1vZHVsZWAgZGVjbGFyYXRpb24gY2FuIG5vdCB1c2UgYHR5cGVgIG9yIGB0eXBlb2ZgIGtleXdvcmQuXCIsXG4gIEltcG9ydFR5cGVTaG9ydGhhbmRPbmx5SW5QdXJlSW1wb3J0OlxuICAgIFwiVGhlIGB0eXBlYCBhbmQgYHR5cGVvZmAga2V5d29yZHMgb24gbmFtZWQgaW1wb3J0cyBjYW4gb25seSBiZSB1c2VkIG9uIHJlZ3VsYXIgYGltcG9ydGAgc3RhdGVtZW50cy4gSXQgY2Fubm90IGJlIHVzZWQgd2l0aCBgaW1wb3J0IHR5cGVgIG9yIGBpbXBvcnQgdHlwZW9mYCBzdGF0ZW1lbnRzLlwiLFxuICBJbmV4YWN0SW5zaWRlRXhhY3Q6XG4gICAgXCJFeHBsaWNpdCBpbmV4YWN0IHN5bnRheCBjYW5ub3QgYXBwZWFyIGluc2lkZSBhbiBleHBsaWNpdCBleGFjdCBvYmplY3QgdHlwZS5cIixcbiAgSW5leGFjdEluc2lkZU5vbk9iamVjdDpcbiAgICBcIkV4cGxpY2l0IGluZXhhY3Qgc3ludGF4IGNhbm5vdCBhcHBlYXIgaW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGRlZmluaXRpb25zLlwiLFxuICBJbmV4YWN0VmFyaWFuY2U6IFwiRXhwbGljaXQgaW5leGFjdCBzeW50YXggY2Fubm90IGhhdmUgdmFyaWFuY2UuXCIsXG4gIEludmFsaWROb25UeXBlSW1wb3J0SW5EZWNsYXJlTW9kdWxlOlxuICAgIFwiSW1wb3J0cyB3aXRoaW4gYSBgZGVjbGFyZSBtb2R1bGVgIGJvZHkgbXVzdCBhbHdheXMgYmUgYGltcG9ydCB0eXBlYCBvciBgaW1wb3J0IHR5cGVvZmAuXCIsXG4gIE1pc3NpbmdUeXBlUGFyYW1EZWZhdWx0OlxuICAgIFwiVHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gbmVlZHMgYSBkZWZhdWx0LCBzaW5jZSBhIHByZWNlZGluZyB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBoYXMgYSBkZWZhdWx0LlwiLFxuICBOZXN0ZWREZWNsYXJlTW9kdWxlOlxuICAgIFwiYGRlY2xhcmUgbW9kdWxlYCBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgYW5vdGhlciBgZGVjbGFyZSBtb2R1bGVgLlwiLFxuICBOZXN0ZWRGbG93Q29tbWVudDogXCJDYW5ub3QgaGF2ZSBhIGZsb3cgY29tbWVudCBpbnNpZGUgYW5vdGhlciBmbG93IGNvbW1lbnQuXCIsXG4gIFBhdHRlcm5Jc09wdGlvbmFsOiB7XG4gICAgbWVzc2FnZTpcbiAgICAgIFwiQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuXCIsXG4gICAgLy8gRm9yIGNvbnNpc3RlbmN5IGluIFR5cGVTY3JpcHQgYW5kIEZsb3cgZXJyb3IgY29kZXNcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8geyByZWFzb25Db2RlOiBcIk9wdGlvbmFsQmluZGluZ1BhdHRlcm5cIiB9XG4gICAgICA6IHt9KSxcbiAgfSxcbiAgU2V0dGVyTWF5Tm90SGF2ZVRoaXNQYXJhbTogXCJBIHNldHRlciBjYW5ub3QgaGF2ZSBhIGB0aGlzYCBwYXJhbWV0ZXIuXCIsXG4gIFNwcmVhZFZhcmlhbmNlOiBcIlNwcmVhZCBwcm9wZXJ0aWVzIGNhbm5vdCBoYXZlIHZhcmlhbmNlLlwiLFxuICBUaGlzUGFyYW1Bbm5vdGF0aW9uUmVxdWlyZWQ6XG4gICAgXCJBIHR5cGUgYW5ub3RhdGlvbiBpcyByZXF1aXJlZCBmb3IgdGhlIGB0aGlzYCBwYXJhbWV0ZXIuXCIsXG4gIFRoaXNQYXJhbUJhbm5lZEluQ29uc3RydWN0b3I6XG4gICAgXCJDb25zdHJ1Y3RvcnMgY2Fubm90IGhhdmUgYSBgdGhpc2AgcGFyYW1ldGVyOyBjb25zdHJ1Y3RvcnMgZG9uJ3QgYmluZCBgdGhpc2AgbGlrZSBvdGhlciBmdW5jdGlvbnMuXCIsXG4gIFRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWw6IFwiVGhlIGB0aGlzYCBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsLlwiLFxuICBUaGlzUGFyYW1NdXN0QmVGaXJzdDpcbiAgICBcIlRoZSBgdGhpc2AgcGFyYW1ldGVyIG11c3QgYmUgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhcmFtZXRlci5cIixcbiAgVGhpc1BhcmFtTm9EZWZhdWx0OiBcIlRoZSBgdGhpc2AgcGFyYW1ldGVyIG1heSBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuXCIsXG4gIFR5cGVCZWZvcmVJbml0aWFsaXplcjpcbiAgICBcIlR5cGUgYW5ub3RhdGlvbnMgbXVzdCBjb21lIGJlZm9yZSBkZWZhdWx0IGFzc2lnbm1lbnRzLCBlLmcuIGluc3RlYWQgb2YgYGFnZSA9IDI1OiBudW1iZXJgIHVzZSBgYWdlOiBudW1iZXIgPSAyNWAuXCIsXG4gIFR5cGVDYXN0SW5QYXR0ZXJuOlxuICAgIFwiVGhlIHR5cGUgY2FzdCBleHByZXNzaW9uIGlzIGV4cGVjdGVkIHRvIGJlIHdyYXBwZWQgd2l0aCBwYXJlbnRoZXNpcy5cIixcbiAgVW5leHBlY3RlZEV4cGxpY2l0SW5leGFjdEluT2JqZWN0OlxuICAgIFwiRXhwbGljaXQgaW5leGFjdCBzeW50YXggbXVzdCBhcHBlYXIgYXQgdGhlIGVuZCBvZiBhbiBpbmV4YWN0IG9iamVjdC5cIixcbiAgVW5leHBlY3RlZFJlc2VydmVkVHlwZTogKHsgcmVzZXJ2ZWRUeXBlIH06IHsgcmVzZXJ2ZWRUeXBlOiBzdHJpbmcgfSkgPT5cbiAgICBgVW5leHBlY3RlZCByZXNlcnZlZCB0eXBlICR7cmVzZXJ2ZWRUeXBlfS5gLFxuICBVbmV4cGVjdGVkUmVzZXJ2ZWRVbmRlcnNjb3JlOlxuICAgIFwiYF9gIGlzIG9ubHkgYWxsb3dlZCBhcyBhIHR5cGUgYXJndW1lbnQgdG8gY2FsbCBvciBuZXcuXCIsXG4gIFVuZXhwZWN0ZWRTcGFjZUJldHdlZW5Nb2R1bG9DaGVja3M6XG4gICAgXCJTcGFjZXMgYmV0d2VlbiBgJWAgYW5kIGBjaGVja3NgIGFyZSBub3QgYWxsb3dlZCBoZXJlLlwiLFxuICBVbmV4cGVjdGVkU3ByZWFkVHlwZTpcbiAgICBcIlNwcmVhZCBvcGVyYXRvciBjYW5ub3QgYXBwZWFyIGluIGNsYXNzIG9yIGludGVyZmFjZSBkZWZpbml0aW9ucy5cIixcbiAgVW5leHBlY3RlZFN1YnRyYWN0aW9uT3BlcmFuZDpcbiAgICAnVW5leHBlY3RlZCB0b2tlbiwgZXhwZWN0ZWQgXCJudW1iZXJcIiBvciBcImJpZ2ludFwiLicsXG4gIFVuZXhwZWN0ZWRUb2tlbkFmdGVyVHlwZVBhcmFtZXRlcjpcbiAgICBcIkV4cGVjdGVkIGFuIGFycm93IGZ1bmN0aW9uIGFmdGVyIHRoaXMgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uXCIsXG4gIFVuZXhwZWN0ZWRUeXBlUGFyYW1ldGVyQmVmb3JlQXN5bmNBcnJvd0Z1bmN0aW9uOlxuICAgIFwiVHlwZSBwYXJhbWV0ZXJzIG11c3QgY29tZSBhZnRlciB0aGUgYXN5bmMga2V5d29yZCwgZS5nLiBpbnN0ZWFkIG9mIGA8VD4gYXN5bmMgKCkgPT4ge31gLCB1c2UgYGFzeW5jIDxUPigpID0+IHt9YC5cIixcbiAgVW5zdXBwb3J0ZWREZWNsYXJlRXhwb3J0S2luZDogKHtcbiAgICB1bnN1cHBvcnRlZEV4cG9ydEtpbmQsXG4gICAgc3VnZ2VzdGlvbixcbiAgfToge1xuICAgIHVuc3VwcG9ydGVkRXhwb3J0S2luZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb246IHN0cmluZztcbiAgfSkgPT5cbiAgICBgXFxgZGVjbGFyZSBleHBvcnQgJHt1bnN1cHBvcnRlZEV4cG9ydEtpbmR9XFxgIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBcXGAke3N1Z2dlc3Rpb259XFxgIGluc3RlYWQuYCxcbiAgVW5zdXBwb3J0ZWRTdGF0ZW1lbnRJbkRlY2xhcmVNb2R1bGU6XG4gICAgXCJPbmx5IGRlY2xhcmVzIGFuZCB0eXBlIGltcG9ydHMgYXJlIGFsbG93ZWQgaW5zaWRlIGRlY2xhcmUgbW9kdWxlLlwiLFxuICBVbnRlcm1pbmF0ZWRGbG93Q29tbWVudDogXCJVbnRlcm1pbmF0ZWQgZmxvdy1jb21tZW50LlwiLFxufSk7XG4vKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWtleXMgKi9cblxuZnVuY3Rpb24gaXNFc01vZHVsZVR5cGUoYm9keUVsZW1lbnQ6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGJvZHlFbGVtZW50LnR5cGUgPT09IFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIgfHxcbiAgICAoYm9keUVsZW1lbnQudHlwZSA9PT0gXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIiAmJlxuICAgICAgKCFib2R5RWxlbWVudC5kZWNsYXJhdGlvbiB8fFxuICAgICAgICAoYm9keUVsZW1lbnQuZGVjbGFyYXRpb24udHlwZSAhPT0gXCJUeXBlQWxpYXNcIiAmJlxuICAgICAgICAgIGJvZHlFbGVtZW50LmRlY2xhcmF0aW9uLnR5cGUgIT09IFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIikpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNUeXBlSW1wb3J0S2luZChub2RlOiBOLk5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgfHwgbm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVvZlwiO1xufVxuXG5jb25zdCBleHBvcnRTdWdnZXN0aW9ucyA9IHtcbiAgY29uc3Q6IFwiZGVjbGFyZSBleHBvcnQgdmFyXCIsXG4gIGxldDogXCJkZWNsYXJlIGV4cG9ydCB2YXJcIixcbiAgdHlwZTogXCJleHBvcnQgdHlwZVwiLFxuICBpbnRlcmZhY2U6IFwiZXhwb3J0IGludGVyZmFjZVwiLFxufTtcblxuLy8gTGlrZSBBcnJheSNmaWx0ZXIsIGJ1dCByZXR1cm5zIGEgdHVwbGUgWyBhY2NlcHRlZEVsZW1lbnRzLCBkaXNjYXJkZWRFbGVtZW50cyBdXG5mdW5jdGlvbiBwYXJ0aXRpb248VD4oXG4gIGxpc3Q6IFRbXSxcbiAgdGVzdDogKGM6IFQsIGI6IG51bWJlciwgYTogVFtdKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbik6IFtUW10sIFRbXV0ge1xuICBjb25zdCBsaXN0MTogVFtdID0gW107XG4gIGNvbnN0IGxpc3QyOiBUW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgKHRlc3QobGlzdFtpXSwgaSwgbGlzdCkgPyBsaXN0MSA6IGxpc3QyKS5wdXNoKGxpc3RbaV0pO1xuICB9XG4gIHJldHVybiBbbGlzdDEsIGxpc3QyXTtcbn1cblxuY29uc3QgRkxPV19QUkFHTUFfUkVHRVggPSAvXFwqP1xccypAKCg/Om5vKT9mbG93KVxcYi87XG5cbi8vIEZsb3cgZW51bXMgdHlwZXNcbnR5cGUgRW51bUV4cGxpY2l0VHlwZSA9IG51bGwgfCBcImJvb2xlYW5cIiB8IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJzeW1ib2xcIjtcblxudHlwZSBFbnVtQ29udGV4dCA9IHtcbiAgZW51bU5hbWU6IHN0cmluZztcbiAgZXhwbGljaXRUeXBlOiBFbnVtRXhwbGljaXRUeXBlO1xuICBtZW1iZXJOYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEVudW1NZW1iZXJJbml0ID1cbiAgfCB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiO1xuICAgICAgbG9jOiBQb3NpdGlvbjtcbiAgICAgIHZhbHVlOiBOLk5vZGU7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgICAgdmFsdWU6IE4uTm9kZTtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJib29sZWFuXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgICAgdmFsdWU6IE4uTm9kZTtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJpbnZhbGlkXCI7XG4gICAgICBsb2M6IFBvc2l0aW9uO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcIm5vbmVcIjtcbiAgICAgIGxvYzogUG9zaXRpb247XG4gICAgfTtcblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IHR5cGVvZiBQYXJzZXIpID0+XG4gIGNsYXNzIEZsb3dQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgQGZsb3cvQG5vZmxvdyBwcmFnbWEuIEluaXRpYWxseSB1bmRlZmluZWQsIHRyYW5zaXRpb25zXG4gICAgLy8gdG8gXCJAZmxvd1wiIG9yIFwiQG5vZmxvd1wiIGlmIHdlIHNlZSBhIHByYWdtYS4gVHJhbnNpdGlvbnMgdG8gbnVsbCBpZiB3ZSBhcmVcbiAgICAvLyBwYXN0IHRoZSBpbml0aWFsIGNvbW1lbnQuXG4gICAgZmxvd1ByYWdtYTogdm9pZCB8IG51bGwgfCBcImZsb3dcIiB8IFwibm9mbG93XCIgPSB1bmRlZmluZWQ7XG5cbiAgICBnZXRTY29wZUhhbmRsZXIoKToge1xuICAgICAgbmV3ICguLi5hcmdzOiBhbnkpOiBGbG93U2NvcGVIYW5kbGVyO1xuICAgIH0ge1xuICAgICAgcmV0dXJuIEZsb3dTY29wZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VUeXBlcygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBsdWdpbk9wdGlvbihcImZsb3dcIiwgXCJhbGxcIikgfHwgdGhpcy5mbG93UHJhZ21hID09PSBcImZsb3dcIjtcbiAgICB9XG5cbiAgICBzaG91bGRQYXJzZUVudW1zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJmbG93XCIsIFwiZW51bXNcIik7XG4gICAgfVxuXG4gICAgZmluaXNoVG9rZW4odHlwZTogVG9rZW5UeXBlLCB2YWw6IGFueSk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlICE9PSB0dC5zdHJpbmcgJiZcbiAgICAgICAgdHlwZSAhPT0gdHQuc2VtaSAmJlxuICAgICAgICB0eXBlICE9PSB0dC5pbnRlcnByZXRlckRpcmVjdGl2ZVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmZpbmlzaFRva2VuKHR5cGUsIHZhbCk7XG4gICAgfVxuXG4gICAgYWRkQ29tbWVudChjb21tZW50OiBOLkNvbW1lbnQpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUcnkgdG8gcGFyc2UgYSBmbG93IHByYWdtYS5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IEZMT1dfUFJBR01BX1JFR0VYLmV4ZWMoY29tbWVudC52YWx1ZSk7XG4gICAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVzWzFdID09PSBcImZsb3dcIikge1xuICAgICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IFwiZmxvd1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZXNbMV0gPT09IFwibm9mbG93XCIpIHtcbiAgICAgICAgICB0aGlzLmZsb3dQcmFnbWEgPSBcIm5vZmxvd1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZmxvdyBwcmFnbWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmFkZENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHRvaz86IFRva2VuVHlwZSk6IE4uRmxvd1R5cGUge1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG4gICAgICB0aGlzLmV4cGVjdCh0b2sgfHwgdHQuY29sb24pO1xuXG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVByZWRpY2F0ZSgpOiBOLkZsb3dQcmVkaWNhdGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBjb25zdCBtb2R1bG9Mb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCBgJWBcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fY2hlY2tzKTtcbiAgICAgIC8vIEZvcmNlICclJyBhbmQgJ2NoZWNrcycgdG8gYmUgYWRqYWNlbnRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCA+IG1vZHVsb0xvYy5pbmRleCArIDEpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRTcGFjZUJldHdlZW5Nb2R1bG9DaGVja3MsIHtcbiAgICAgICAgICBhdDogbW9kdWxvTG9jLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVhdCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSBzdXBlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVkUHJlZGljYXRlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkluZmVycmVkUHJlZGljYXRlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpOiBbXG4gICAgICBOLkZsb3dUeXBlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIE4uRmxvd1ByZWRpY2F0ZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgXSB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgIGxldCBwcmVkaWNhdGUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQubW9kdWxvKSkge1xuICAgICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgICAgcHJlZGljYXRlID0gdGhpcy5mbG93UGFyc2VQcmVkaWNhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSBvbGRJblR5cGU7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lm1vZHVsbykpIHtcbiAgICAgICAgICBwcmVkaWNhdGUgPSB0aGlzLmZsb3dQYXJzZVByZWRpY2F0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIHByZWRpY2F0ZV07XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRGVjbGFyZUNsYXNzKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVDbGFzcz4sXG4gICAgKTogTi5GbG93RGVjbGFyZUNsYXNzIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZSwgLyppc0NsYXNzKi8gdHJ1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUNsYXNzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVGdW5jdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlRnVuY3Rpb24+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVGdW5jdGlvbiB7XG4gICAgICB0aGlzLm5leHQoKTtcblxuICAgICAgY29uc3QgaWQgPSAobm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCkpO1xuXG4gICAgICBjb25zdCB0eXBlTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBjb25zdCB0eXBlQ29udGFpbmVyID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHR5cGVOb2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVOb2RlLnR5cGVQYXJhbWV0ZXJzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcbiAgICAgIGNvbnN0IHRtcCA9IHRoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW1zKCk7XG4gICAgICB0eXBlTm9kZS5wYXJhbXMgPSB0bXAucGFyYW1zO1xuICAgICAgdHlwZU5vZGUucmVzdCA9IHRtcC5yZXN0O1xuICAgICAgdHlwZU5vZGUudGhpcyA9IHRtcC5fdGhpcztcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAgIFt0eXBlTm9kZS5yZXR1cm5UeXBlLCBub2RlLnByZWRpY2F0ZV0gPVxuICAgICAgICB0aGlzLmZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpO1xuXG4gICAgICB0eXBlQ29udGFpbmVyLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgICB0eXBlTm9kZSxcbiAgICAgICAgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICApO1xuXG4gICAgICBpZC50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmluaXNoTm9kZSh0eXBlQ29udGFpbmVyLCBcIlR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oaWQpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShcbiAgICAgICAgbm9kZS5pZC5uYW1lLFxuICAgICAgICBCSU5EX0ZMT1dfREVDTEFSRV9GTixcbiAgICAgICAgbm9kZS5pZC5sb2Muc3RhcnQsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmUoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93RGVjbGFyZT4sXG4gICAgICBpbnNpZGVNb2R1bGU/OiBib29sZWFuLFxuICAgICk6IE4uRmxvd0RlY2xhcmUge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlQ2xhc3Mobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuX2Z1bmN0aW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlRnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuX3ZhcikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRGVjbGFyZVZhcmlhYmxlKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX21vZHVsZSkpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZURlY2xhcmVNb2R1bGVFeHBvcnRzKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpbnNpZGVNb2R1bGUpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5OZXN0ZWREZWNsYXJlTW9kdWxlLCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlTW9kdWxlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlVHlwZUFsaWFzKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fb3BhcXVlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlT3BhcXVlVHlwZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2ludGVyZmFjZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRGVjbGFyZUludGVyZmFjZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5fZXhwb3J0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24obm9kZSwgaW5zaWRlTW9kdWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVWYXJpYWJsZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlVmFyaWFibGU+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVWYXJpYWJsZSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0YWJsZUlkZW50aWZpZXIoXG4gICAgICAgIC8qYWxsb3dQcmltaXRpdmVPdmVycmlkZSovIHRydWUsXG4gICAgICApO1xuICAgICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShub2RlLmlkLm5hbWUsIEJJTkRfVkFSLCBub2RlLmlkLmxvYy5zdGFydCk7XG4gICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVWYXJpYWJsZVwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VEZWNsYXJlTW9kdWxlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVNb2R1bGU+LFxuICAgICk6IE4uRmxvd0RlY2xhcmVNb2R1bGUge1xuICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0cmluZykpIHtcbiAgICAgICAgbm9kZS5pZCA9IHN1cGVyLnBhcnNlRXhwckF0b20oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5Tm9kZSA9IChub2RlLmJvZHkgPSB0aGlzLnN0YXJ0Tm9kZSgpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJvZHkgPSAoYm9keU5vZGUuYm9keSA9IFtdKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgICB3aGlsZSAoIXRoaXMubWF0Y2godHQuYnJhY2VSKSkge1xuICAgICAgICBsZXQgYm9keU5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkltcG9ydERlY2xhcmF0aW9uPigpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9pbXBvcnQpKSB7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkgJiYgIXRoaXMubWF0Y2godHQuX3R5cGVvZikpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5JbnZhbGlkTm9uVHlwZUltcG9ydEluRGVjbGFyZU1vZHVsZSwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucGFyc2VJbXBvcnQoYm9keU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcbiAgICAgICAgICAgIHR0Ll9kZWNsYXJlLFxuICAgICAgICAgICAgRmxvd0Vycm9ycy5VbnN1cHBvcnRlZFN0YXRlbWVudEluRGVjbGFyZU1vZHVsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICBib2R5Tm9kZSA9IHRoaXMuZmxvd1BhcnNlRGVjbGFyZShib2R5Tm9kZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5LnB1c2goYm9keU5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNjb3BlLmV4aXQoKTtcblxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIkJsb2NrU3RhdGVtZW50XCIpO1xuXG4gICAgICBsZXQga2luZDogXCJDb21tb25KU1wiIHwgXCJFU1wiIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFzTW9kdWxlRXhwb3J0ID0gZmFsc2U7XG4gICAgICBib2R5LmZvckVhY2goYm9keUVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoaXNFc01vZHVsZVR5cGUoYm9keUVsZW1lbnQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiQ29tbW9uSlNcIikge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0RlY2xhcmVNb2R1bGVLaW5kLCB7XG4gICAgICAgICAgICAgIGF0OiBib2R5RWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBraW5kID0gXCJFU1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGJvZHlFbGVtZW50LnR5cGUgPT09IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIikge1xuICAgICAgICAgIGlmIChoYXNNb2R1bGVFeHBvcnQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5EdXBsaWNhdGVEZWNsYXJlTW9kdWxlRXhwb3J0cywge1xuICAgICAgICAgICAgICBhdDogYm9keUVsZW1lbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiRVNcIikge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0RlY2xhcmVNb2R1bGVLaW5kLCB7XG4gICAgICAgICAgICAgIGF0OiBib2R5RWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBraW5kID0gXCJDb21tb25KU1wiO1xuICAgICAgICAgIGhhc01vZHVsZUV4cG9ydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBub2RlLmtpbmQgPSBraW5kIHx8IFwiQ29tbW9uSlNcIjtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJEZWNsYXJlTW9kdWxlXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVFeHBvcnREZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24+LFxuICAgICAgaW5zaWRlTW9kdWxlPzogYm9vbGVhbiB8IG51bGwsXG4gICAgKTogTi5GbG93RGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIHtcbiAgICAgIHRoaXMuZXhwZWN0KHR0Ll9leHBvcnQpO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQuX2RlZmF1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHwgdGhpcy5tYXRjaCh0dC5fY2xhc3MpKSB7XG4gICAgICAgICAgLy8gZGVjbGFyZSBleHBvcnQgZGVmYXVsdCBjbGFzcyAuLi5cbiAgICAgICAgICAvLyBkZWNsYXJlIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIC4uLlxuICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLmZsb3dQYXJzZURlY2xhcmUodGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGVjbGFyZSBleHBvcnQgZGVmYXVsdCBbdHlwZV07XG4gICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5kZWZhdWx0ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuX2NvbnN0KSB8fFxuICAgICAgICAgIHRoaXMuaXNMZXQoKSB8fFxuICAgICAgICAgICgodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpIHx8IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSAmJlxuICAgICAgICAgICAgIWluc2lkZU1vZHVsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnN0YXRlLnZhbHVlIGFzXG4gICAgICAgICAgICB8IFwiY29uc3RcIlxuICAgICAgICAgICAgfCBcImxldFwiXG4gICAgICAgICAgICB8IFwidHlwZVwiXG4gICAgICAgICAgICB8IFwiaW50ZXJmYWNlXCI7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuc3VwcG9ydGVkRGVjbGFyZUV4cG9ydEtpbmQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgdW5zdXBwb3J0ZWRFeHBvcnRLaW5kOiBsYWJlbCxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb246IGV4cG9ydFN1Z2dlc3Rpb25zW2xhYmVsXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll92YXIpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IHZhciAuLi5cbiAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHwgLy8gZGVjbGFyZSBleHBvcnQgZnVuY3Rpb24gLi4uXG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5fY2xhc3MpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IGNsYXNzIC4uLlxuICAgICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9vcGFxdWUpIC8vIGRlY2xhcmUgZXhwb3J0IG9wYXF1ZSAuLlxuICAgICAgICApIHtcbiAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5mbG93UGFyc2VEZWNsYXJlKHRoaXMuc3RhcnROb2RlKCkpO1xuICAgICAgICAgIG5vZGUuZGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpIHx8IC8vIGRlY2xhcmUgZXhwb3J0ICogZnJvbSAnJ1xuICAgICAgICAgIHRoaXMubWF0Y2godHQuYnJhY2VMKSB8fCAvLyBkZWNsYXJlIGV4cG9ydCB7fSAuLi5cbiAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSB8fCAvLyBkZWNsYXJlIGV4cG9ydCBpbnRlcmZhY2UgLi4uXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpIHx8IC8vIGRlY2xhcmUgZXhwb3J0IHR5cGUgLi4uXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX29wYXF1ZSkgLy8gZGVjbGFyZSBleHBvcnQgb3BhcXVlIHR5cGUgLi4uXG4gICAgICAgICkge1xuICAgICAgICAgIG5vZGUgPSB0aGlzLnBhcnNlRXhwb3J0KFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5FeHBvcnRBbGxEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgICAvKiBkZWNvcmF0b3JzICovIG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIikge1xuICAgICAgICAgICAgbm9kZS50eXBlID0gXCJFeHBvcnREZWNsYXJhdGlvblwiO1xuICAgICAgICAgICAgbm9kZS5kZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBkZWxldGUgbm9kZS5leHBvcnRLaW5kO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vZGUudHlwZSA9IFwiRGVjbGFyZVwiICsgbm9kZS50eXBlO1xuXG4gICAgICAgICAgcmV0dXJuIG5vZGUgYXMgTi5Ob2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVNb2R1bGVFeHBvcnRzKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVNb2R1bGVFeHBvcnRzPixcbiAgICApOiBOLkZsb3dEZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fZXhwb3J0cyk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVUeXBlQWxpYXMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93RGVjbGFyZVR5cGVBbGlhcz4sXG4gICAgKTogTi5GbG93RGVjbGFyZVR5cGVBbGlhcyB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IGZpbmlzaGVkID0gdGhpcy5mbG93UGFyc2VUeXBlQWxpYXMobm9kZSk7XG4gICAgICAvLyBEb24ndCBkbyBmaW5pc2hOb2RlIGFzIHdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBjb21tZW50cyB0d2ljZVxuICAgICAgZmluaXNoZWQudHlwZSA9IFwiRGVjbGFyZVR5cGVBbGlhc1wiO1xuICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZURlY2xhcmVPcGFxdWVUeXBlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmVPcGFxdWVUeXBlPixcbiAgICApOiBOLkZsb3dEZWNsYXJlT3BhcXVlVHlwZSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IGZpbmlzaGVkID0gdGhpcy5mbG93UGFyc2VPcGFxdWVUeXBlKG5vZGUsIHRydWUpO1xuICAgICAgLy8gRG9uJ3QgZG8gZmluaXNoTm9kZSBhcyB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgY29tbWVudHMgdHdpY2VcbiAgICAgIGZpbmlzaGVkLnR5cGUgPSBcIkRlY2xhcmVPcGFxdWVUeXBlXCI7XG4gICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRGVjbGFyZUludGVyZmFjZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dEZWNsYXJlSW50ZXJmYWNlPixcbiAgICApOiBOLkZsb3dEZWNsYXJlSW50ZXJmYWNlIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5mbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZSwgLyogaXNDbGFzcyAqLyBmYWxzZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjbGFyZUludGVyZmFjZVwiKTtcbiAgICB9XG5cbiAgICAvLyBJbnRlcmZhY2VzXG5cbiAgICBmbG93UGFyc2VJbnRlcmZhY2Vpc2gobm9kZTogVW5kb25lPE4uRmxvd0RlY2xhcmU+LCBpc0NsYXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyAhaXNDbGFzcyxcbiAgICAgICAgLyogZGVjbGFyYXRpb24gKi8gdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUoXG4gICAgICAgIG5vZGUuaWQubmFtZSxcbiAgICAgICAgaXNDbGFzcyA/IEJJTkRfRlVOQ1RJT04gOiBCSU5EX0xFWElDQUwsXG4gICAgICAgIG5vZGUuaWQubG9jLnN0YXJ0LFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuZXh0ZW5kcyA9IFtdO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQuX2V4dGVuZHMpKSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBub2RlLmV4dGVuZHMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKSk7XG4gICAgICAgIH0gd2hpbGUgKCFpc0NsYXNzICYmIHRoaXMuZWF0KHR0LmNvbW1hKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NsYXNzKSB7XG4gICAgICAgIG5vZGUuaW1wbGVtZW50cyA9IFtdO1xuICAgICAgICBub2RlLm1peGlucyA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX21peGlucykpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBub2RlLm1peGlucy5wdXNoKHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlRXh0ZW5kcygpKTtcbiAgICAgICAgICB9IHdoaWxlICh0aGlzLmVhdCh0dC5jb21tYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5faW1wbGVtZW50cykpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBub2RlLmltcGxlbWVudHMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKSk7XG4gICAgICAgICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICBhbGxvd1N0YXRpYzogaXNDbGFzcyxcbiAgICAgICAgYWxsb3dFeGFjdDogZmFsc2UsXG4gICAgICAgIGFsbG93U3ByZWFkOiBmYWxzZSxcbiAgICAgICAgYWxsb3dQcm90bzogaXNDbGFzcyxcbiAgICAgICAgYWxsb3dJbmV4YWN0OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyZmFjZUV4dGVuZHMoKTogTi5GbG93SW50ZXJmYWNlRXh0ZW5kcyB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgbm9kZS5pZCA9IHRoaXMuZmxvd1BhcnNlUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcmZhY2VFeHRlbmRzXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyZmFjZShub2RlOiBVbmRvbmU8Ti5GbG93SW50ZXJmYWNlPik6IE4uRmxvd0ludGVyZmFjZSB7XG4gICAgICB0aGlzLmZsb3dQYXJzZUludGVyZmFjZWlzaChub2RlLCAvKiBpc0NsYXNzICovIGZhbHNlKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjaGVja05vdFVuZGVyc2NvcmUod29yZDogc3RyaW5nKSB7XG4gICAgICBpZiAod29yZCA9PT0gXCJfXCIpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRSZXNlcnZlZFVuZGVyc2NvcmUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tSZXNlcnZlZFR5cGUod29yZDogc3RyaW5nLCBzdGFydExvYzogUG9zaXRpb24sIGRlY2xhcmF0aW9uPzogYm9vbGVhbikge1xuICAgICAgaWYgKCFyZXNlcnZlZFR5cGVzLmhhcyh3b3JkKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBkZWNsYXJhdGlvblxuICAgICAgICAgID8gRmxvd0Vycm9ycy5Bc3NpZ25SZXNlcnZlZFR5cGVcbiAgICAgICAgICA6IEZsb3dFcnJvcnMuVW5leHBlY3RlZFJlc2VydmVkVHlwZSxcbiAgICAgICAge1xuICAgICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAgICByZXNlcnZlZFR5cGU6IHdvcmQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKFxuICAgICAgbGliZXJhbD86IGJvb2xlYW4sXG4gICAgICBkZWNsYXJhdGlvbj86IGJvb2xlYW4sXG4gICAgKTogTi5JZGVudGlmaWVyIHtcbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFR5cGUoXG4gICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIGRlY2xhcmF0aW9uLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcihsaWJlcmFsKTtcbiAgICB9XG5cbiAgICAvLyBUeXBlIGFsaWFzZXNcblxuICAgIGZsb3dQYXJzZVR5cGVBbGlhcyhub2RlOiBVbmRvbmU8Ti5GbG93VHlwZUFsaWFzPik6IE4uRmxvd1R5cGVBbGlhcyB7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyBmYWxzZSxcbiAgICAgICAgLyogZGVjbGFyYXRpb24gKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjb3BlLmRlY2xhcmVOYW1lKG5vZGUuaWQubmFtZSwgQklORF9MRVhJQ0FMLCBub2RlLmlkLmxvYy5zdGFydCk7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJpZ2h0ID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIodHQuZXEpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVBbGlhc1wiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VPcGFxdWVUeXBlKFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd09wYXF1ZVR5cGU+LFxuICAgICAgZGVjbGFyZTogYm9vbGVhbixcbiAgICApOiBOLkZsb3dPcGFxdWVUeXBlIHtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5fdHlwZSk7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgLyogbGliZXJhbCAqLyB0cnVlLFxuICAgICAgICAvKiBkZWNsYXJhdGlvbiAqLyB0cnVlLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2NvcGUuZGVjbGFyZU5hbWUobm9kZS5pZC5uYW1lLCBCSU5EX0xFWElDQUwsIG5vZGUuaWQubG9jLnN0YXJ0KTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBzdXBlcnR5cGVcbiAgICAgIG5vZGUuc3VwZXJ0eXBlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICBub2RlLnN1cGVydHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHR0LmNvbG9uKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5pbXBsdHlwZSA9IG51bGw7XG4gICAgICBpZiAoIWRlY2xhcmUpIHtcbiAgICAgICAgbm9kZS5pbXBsdHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKHR0LmVxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJPcGFxdWVUeXBlXCIpO1xuICAgIH1cblxuICAgIC8vIFR5cGUgYW5ub3RhdGlvbnNcblxuICAgIGZsb3dQYXJzZVR5cGVQYXJhbWV0ZXIocmVxdWlyZURlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IE4uVHlwZVBhcmFtZXRlciB7XG4gICAgICBjb25zdCBub2RlU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlUGFyYW1ldGVyPigpO1xuXG4gICAgICBjb25zdCB2YXJpYW5jZSA9IHRoaXMuZmxvd1BhcnNlVmFyaWFuY2UoKTtcblxuICAgICAgY29uc3QgaWRlbnQgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0YWJsZUlkZW50aWZpZXIoKTtcbiAgICAgIG5vZGUubmFtZSA9IGlkZW50Lm5hbWU7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgIG5vZGUudmFyaWFuY2UgPSB2YXJpYW5jZTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlc1xuICAgICAgbm9kZS5ib3VuZCA9IGlkZW50LnR5cGVBbm5vdGF0aW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5lcSkpIHtcbiAgICAgICAgdGhpcy5lYXQodHQuZXEpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgbm9kZS5kZWZhdWx0ID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVxdWlyZURlZmF1bHQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuTWlzc2luZ1R5cGVQYXJhbURlZmF1bHQsIHsgYXQ6IG5vZGVTdGFydExvYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVHlwZVBhcmFtZXRlclwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTogTi5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+KCk7XG4gICAgICBub2RlLnBhcmFtcyA9IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG5cbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiB0aGlzIGNvbmRpdGlvbiBpcyBhbHJlYWR5IGNoZWNrZWQgYXQgYWxsIGNhbGwgc2l0ZXNcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVmYXVsdFJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlciA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlcihkZWZhdWx0UmVxdWlyZWQpO1xuXG4gICAgICAgIG5vZGUucGFyYW1zLnB1c2godHlwZVBhcmFtZXRlcik7XG5cbiAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXIuZGVmYXVsdCkge1xuICAgICAgICAgIGRlZmF1bHRSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQuZ3QpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICghdGhpcy5tYXRjaCh0dC5ndCkpO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpOiBOLlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uPigpO1xuICAgICAgY29uc3Qgb2xkSW5UeXBlID0gdGhpcy5zdGF0ZS5pblR5cGU7XG4gICAgICBub2RlLnBhcmFtcyA9IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IHRydWU7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0Lmx0KTtcbiAgICAgIGNvbnN0IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZSA9IHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5ndCkpIHtcbiAgICAgICAgbm9kZS5wYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZVR5cGUoKSk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5ndCkpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gb2xkTm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uQ2FsbE9yTmV3KCk6IE4uVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KCk7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIG5vZGUucGFyYW1zID0gW107XG5cbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcblxuICAgICAgdGhpcy5leHBlY3QodHQubHQpO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0Lmd0KSkge1xuICAgICAgICBub2RlLnBhcmFtcy5wdXNoKHRoaXMuZmxvd1BhcnNlVHlwZU9ySW1wbGljaXRJbnN0YW50aWF0aW9uKCkpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQuZ3QpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCh0dC5ndCk7XG5cbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gb2xkSW5UeXBlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlSW50ZXJmYWNlVHlwZSgpOiBOLkZsb3dJbnRlcmZhY2VUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkZsb3dJbnRlcmZhY2VUeXBlPigpO1xuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpO1xuXG4gICAgICBub2RlLmV4dGVuZHMgPSBbXTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5fZXh0ZW5kcykpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG5vZGUuZXh0ZW5kcy5wdXNoKHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlRXh0ZW5kcygpKTtcbiAgICAgICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5ib2R5ID0gdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlKHtcbiAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICBhbGxvd0V4YWN0OiBmYWxzZSxcbiAgICAgICAgYWxsb3dTcHJlYWQ6IGZhbHNlLFxuICAgICAgICBhbGxvd1Byb3RvOiBmYWxzZSxcbiAgICAgICAgYWxsb3dJbmV4YWN0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Lm51bSkgfHwgdGhpcy5tYXRjaCh0dC5zdHJpbmcpXG4gICAgICAgID8gc3VwZXIucGFyc2VFeHByQXRvbSgpXG4gICAgICAgIDogdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZUluZGV4ZXIoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZUluZGV4ZXI+LFxuICAgICAgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgICB2YXJpYW5jZT86IE4uRmxvd1ZhcmlhbmNlIHwgbnVsbCxcbiAgICApOiBOLkZsb3dPYmplY3RUeXBlSW5kZXhlciB7XG4gICAgICBub2RlLnN0YXRpYyA9IGlzU3RhdGljO1xuXG4gICAgICAvLyBOb3RlOiBicmFja2V0TCBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkXG4gICAgICBpZiAodGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5jb2xvbikge1xuICAgICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuICAgICAgICBub2RlLmtleSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmlkID0gbnVsbDtcbiAgICAgICAgbm9kZS5rZXkgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgbm9kZS52YXJpYW5jZSA9IHZhcmlhbmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiT2JqZWN0VHlwZUluZGV4ZXJcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZUludGVybmFsU2xvdChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dPYmplY3RUeXBlSW50ZXJuYWxTbG90PixcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICk6IE4uRmxvd09iamVjdFR5cGVJbnRlcm5hbFNsb3Qge1xuICAgICAgbm9kZS5zdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgIC8vIE5vdGU6IGJvdGggYnJhY2tldEwgaGF2ZSBhbHJlYWR5IGJlZW4gY29uc3VtZWRcbiAgICAgIG5vZGUuaWQgPSB0aGlzLmZsb3dQYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIG5vZGUubWV0aG9kID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IGZhbHNlO1xuICAgICAgICBub2RlLnZhbHVlID0gdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlTWV0aG9kaXNoKFxuICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXQobm9kZS5sb2Muc3RhcnQpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5tZXRob2QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkZsb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uPixcbiAgICApOiBOLkZsb3dGdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIG5vZGUucGFyYW1zID0gW107XG4gICAgICBub2RlLnJlc3QgPSBudWxsO1xuICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICBub2RlLnRoaXMgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgbm9kZS50aGlzID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbSgvKiBmaXJzdCAqLyB0cnVlKTtcbiAgICAgICAgLy8gbWF0Y2ggRmxvdyBwYXJzZXIgYmVoYXZpb3JcbiAgICAgICAgbm9kZS50aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikgJiYgIXRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIG5vZGUucGFyYW1zLnB1c2godGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbShmYWxzZSkpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lYXQodHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIG5vZGUucmVzdCA9IHRoaXMuZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW0oZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZUluaXRpYWxpc2VyKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZU9iamVjdFR5cGVDYWxsUHJvcGVydHkoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4sXG4gICAgICBpc1N0YXRpYzogYm9vbGVhbixcbiAgICApOiBOLkZsb3dPYmplY3RUeXBlQ2FsbFByb3BlcnR5IHtcbiAgICAgIGNvbnN0IHZhbHVlTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBub2RlLnN0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgbm9kZS52YWx1ZSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaCh2YWx1ZU5vZGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlT2JqZWN0VHlwZSh7XG4gICAgICBhbGxvd1N0YXRpYyxcbiAgICAgIGFsbG93RXhhY3QsXG4gICAgICBhbGxvd1NwcmVhZCxcbiAgICAgIGFsbG93UHJvdG8sXG4gICAgICBhbGxvd0luZXhhY3QsXG4gICAgfToge1xuICAgICAgYWxsb3dTdGF0aWM6IGJvb2xlYW47XG4gICAgICBhbGxvd0V4YWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTcHJlYWQ6IGJvb2xlYW47XG4gICAgICBhbGxvd1Byb3RvOiBib29sZWFuO1xuICAgICAgYWxsb3dJbmV4YWN0OiBib29sZWFuO1xuICAgIH0pOiBOLkZsb3dPYmplY3RUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcblxuICAgICAgY29uc3Qgbm9kZVN0YXJ0ID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgbm9kZVN0YXJ0LmNhbGxQcm9wZXJ0aWVzID0gW107XG4gICAgICBub2RlU3RhcnQucHJvcGVydGllcyA9IFtdO1xuICAgICAgbm9kZVN0YXJ0LmluZGV4ZXJzID0gW107XG4gICAgICBub2RlU3RhcnQuaW50ZXJuYWxTbG90cyA9IFtdO1xuXG4gICAgICBsZXQgZW5kRGVsaW07XG4gICAgICBsZXQgZXhhY3Q7XG4gICAgICBsZXQgaW5leGFjdCA9IGZhbHNlO1xuICAgICAgaWYgKGFsbG93RXhhY3QgJiYgdGhpcy5tYXRjaCh0dC5icmFjZUJhckwpKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlQmFyTCk7XG4gICAgICAgIGVuZERlbGltID0gdHQuYnJhY2VCYXJSO1xuICAgICAgICBleGFjdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgICAgICBlbmREZWxpbSA9IHR0LmJyYWNlUjtcbiAgICAgICAgZXhhY3QgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0LmV4YWN0ID0gZXhhY3Q7XG5cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaChlbmREZWxpbSkpIHtcbiAgICAgICAgbGV0IGlzU3RhdGljID0gZmFsc2U7XG4gICAgICAgIGxldCBwcm90b1N0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgaW5leGFjdFN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgICBpZiAoYWxsb3dQcm90byAmJiB0aGlzLmlzQ29udGV4dHVhbCh0dC5fcHJvdG8pKSB7XG4gICAgICAgICAgY29uc3QgbG9va2FoZWFkID0gdGhpcy5sb29rYWhlYWQoKTtcblxuICAgICAgICAgIGlmIChsb29rYWhlYWQudHlwZSAhPT0gdHQuY29sb24gJiYgbG9va2FoZWFkLnR5cGUgIT09IHR0LnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIHByb3RvU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgYWxsb3dTdGF0aWMgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsb3dTdGF0aWMgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX3N0YXRpYykpIHtcbiAgICAgICAgICBjb25zdCBsb29rYWhlYWQgPSB0aGlzLmxvb2thaGVhZCgpO1xuXG4gICAgICAgICAgLy8gc3RhdGljIGlzIGEgdmFsaWQgaWRlbnRpZmllciBuYW1lXG4gICAgICAgICAgaWYgKGxvb2thaGVhZC50eXBlICE9PSB0dC5jb2xvbiAmJiBsb29rYWhlYWQudHlwZSAhPT0gdHQucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgaXNTdGF0aWMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhcmlhbmNlID0gdGhpcy5mbG93UGFyc2VWYXJpYW5jZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQocHJvdG9TdGFydExvYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQodmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVTdGFydC5pbnRlcm5hbFNsb3RzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZUludGVybmFsU2xvdChub2RlLCBpc1N0YXRpYyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlU3RhcnQuaW5kZXhlcnMucHVzaChcbiAgICAgICAgICAgICAgdGhpcy5mbG93UGFyc2VPYmplY3RUeXBlSW5kZXhlcihub2RlLCBpc1N0YXRpYywgdmFyaWFuY2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5wYXJlbkwpIHx8IHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgICAgaWYgKHByb3RvU3RhcnRMb2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHByb3RvU3RhcnRMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMudW5leHBlY3RlZCh2YXJpYW5jZS5sb2Muc3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlU3RhcnQuY2FsbFByb3BlcnRpZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eShub2RlLCBpc1N0YXRpYyksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQga2luZCA9IFwiaW5pdFwiO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9nZXQpIHx8IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBsb29rYWhlYWQgPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAgICAgaWYgKHRva2VuSXNMaXRlcmFsUHJvcGVydHlOYW1lKGxvb2thaGVhZC50eXBlKSkge1xuICAgICAgICAgICAgICBraW5kID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvcE9ySW5leGFjdCA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZVByb3BlcnR5KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGlzU3RhdGljLFxuICAgICAgICAgICAgcHJvdG9TdGFydExvYyxcbiAgICAgICAgICAgIHZhcmlhbmNlLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGFsbG93U3ByZWFkLFxuICAgICAgICAgICAgYWxsb3dJbmV4YWN0ID8/ICFleGFjdCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByb3BPckluZXhhY3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGluZXhhY3QgPSB0cnVlO1xuICAgICAgICAgICAgaW5leGFjdFN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVTdGFydC5wcm9wZXJ0aWVzLnB1c2gocHJvcE9ySW5leGFjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93T2JqZWN0VHlwZVNlbWljb2xvbigpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbmV4YWN0U3RhcnRMb2MgJiZcbiAgICAgICAgICAhdGhpcy5tYXRjaCh0dC5icmFjZVIpICYmXG4gICAgICAgICAgIXRoaXMubWF0Y2godHQuYnJhY2VCYXJSKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW5leHBlY3RlZEV4cGxpY2l0SW5leGFjdEluT2JqZWN0LCB7XG4gICAgICAgICAgICBhdDogaW5leGFjdFN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KGVuZERlbGltKTtcblxuICAgICAgLyogVGhlIGluZXhhY3QgZmxhZyBzaG91bGQgb25seSBiZSBhZGRlZCBvbiBPYmplY3RUeXBlQW5ub3RhdGlvbnMgdGhhdFxuICAgICAgICogYXJlIG5vdCB0aGUgYm9keSBvZiBhbiBpbnRlcmZhY2UsIGRlY2xhcmUgaW50ZXJmYWNlLCBvciBkZWNsYXJlIGNsYXNzLlxuICAgICAgICogU2luY2Ugc3ByZWFkcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCB0eXBlcywgY2hlY2tpbmcgdGhhdCBpc1xuICAgICAgICogc3VmZmljaWVudCBoZXJlLlxuICAgICAgICovXG4gICAgICBpZiAoYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgbm9kZVN0YXJ0LmluZXhhY3QgPSBpbmV4YWN0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXQgPSB0aGlzLmZpbmlzaE5vZGUobm9kZVN0YXJ0LCBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcblxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VPYmplY3RUeXBlUHJvcGVydHkoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GbG93T2JqZWN0VHlwZVByb3BlcnR5IHwgTi5GbG93T2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5PixcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICAgcHJvdG9TdGFydExvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgICAgdmFyaWFuY2U6IE4uRmxvd1ZhcmlhbmNlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGtpbmQ6IHN0cmluZyxcbiAgICAgIGFsbG93U3ByZWFkOiBib29sZWFuLFxuICAgICAgYWxsb3dJbmV4YWN0OiBib29sZWFuLFxuICAgICk6IE4uRmxvd09iamVjdFR5cGVQcm9wZXJ0eSB8IE4uRmxvd09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eSB8IG51bGwge1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmVsbGlwc2lzKSkge1xuICAgICAgICBjb25zdCBpc0luZXhhY3RUb2tlbiA9XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5jb21tYSkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnNlbWkpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZVIpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFjZUJhclIpO1xuXG4gICAgICAgIGlmIChpc0luZXhhY3RUb2tlbikge1xuICAgICAgICAgIGlmICghYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5JbmV4YWN0SW5zaWRlTm9uT2JqZWN0LCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93SW5leGFjdCkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkluZXhhY3RJbnNpZGVFeGFjdCwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuSW5leGFjdFZhcmlhbmNlLCB7IGF0OiB2YXJpYW5jZSB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWxsb3dTcHJlYWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW5leHBlY3RlZFNwcmVhZFR5cGUsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHByb3RvU3RhcnRMb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5TcHJlYWRWYXJpYW5jZSwgeyBhdDogdmFyaWFuY2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmtleSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcbiAgICAgICAgbm9kZS5zdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgICAgbm9kZS5wcm90byA9IHByb3RvU3RhcnRMb2MgIT0gbnVsbDtcbiAgICAgICAgbm9kZS5raW5kID0ga2luZDtcblxuICAgICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpIHx8IHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2QgcHJvcGVydHlcbiAgICAgICAgICBub2RlLm1ldGhvZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAocHJvdG9TdGFydExvYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQocHJvdG9TdGFydExvYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJpYW5jZSkge1xuICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKHZhcmlhbmNlLmxvYy5zdGFydCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9kZS52YWx1ZSA9IHRoaXMuZmxvd1BhcnNlT2JqZWN0VHlwZU1ldGhvZGlzaChcbiAgICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXQobm9kZS5sb2Muc3RhcnQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZ2V0XCIgfHwga2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5mbG93Q2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKiBEZWNsYXJlZCBjbGFzc2VzL2ludGVyZmFjZXMgZG8gbm90IGFsbG93IHNwcmVhZCAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFhbGxvd1NwcmVhZCAmJlxuICAgICAgICAgICAgbm9kZS5rZXkubmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgICBub2RlLnZhbHVlLnRoaXNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1CYW5uZWRJbkNvbnN0cnVjdG9yLCB7XG4gICAgICAgICAgICAgIGF0OiBub2RlLnZhbHVlLnRoaXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGtpbmQgIT09IFwiaW5pdFwiKSB0aGlzLnVuZXhwZWN0ZWQoKTtcblxuICAgICAgICAgIG5vZGUubWV0aG9kID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUudmFsdWUgPSB0aGlzLmZsb3dQYXJzZVR5cGVJbml0aWFsaXNlcigpO1xuICAgICAgICAgIG5vZGUudmFyaWFuY2UgPSB2YXJpYW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgc2ltaWxhciB0byBjaGVja0dldHRlclNldHRlclBhcmFtcywgYnV0IGFzXG4gICAgLy8gQGJhYmVsL3BhcnNlciB1c2VzIG5vbiBlc3RyZWUgcHJvcGVydGllcyB3ZSBjYW5ub3QgcmV1c2UgaXQgaGVyZVxuICAgIGZsb3dDaGVja0dldHRlclNldHRlclBhcmFtcyhcbiAgICAgIHByb3BlcnR5OiBVbmRvbmU8XG4gICAgICAgIE4uRmxvd09iamVjdFR5cGVQcm9wZXJ0eSB8IE4uRmxvd09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVxuICAgICAgPixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSBwcm9wZXJ0eS5raW5kID09PSBcImdldFwiID8gMCA6IDE7XG4gICAgICBjb25zdCBsZW5ndGggPVxuICAgICAgICBwcm9wZXJ0eS52YWx1ZS5wYXJhbXMubGVuZ3RoICsgKHByb3BlcnR5LnZhbHVlLnJlc3QgPyAxIDogMCk7XG5cbiAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS50aGlzKSB7XG4gICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgcHJvcGVydHkua2luZCA9PT0gXCJnZXRcIlxuICAgICAgICAgICAgPyBGbG93RXJyb3JzLkdldHRlck1heU5vdEhhdmVUaGlzUGFyYW1cbiAgICAgICAgICAgIDogRmxvd0Vycm9ycy5TZXR0ZXJNYXlOb3RIYXZlVGhpc1BhcmFtLFxuICAgICAgICAgIHsgYXQ6IHByb3BlcnR5LnZhbHVlLnRoaXMgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbmd0aCAhPT0gcGFyYW1Db3VudCkge1xuICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgIHByb3BlcnR5LmtpbmQgPT09IFwiZ2V0XCJcbiAgICAgICAgICAgID8gRXJyb3JzLkJhZEdldHRlckFyaXR5XG4gICAgICAgICAgICA6IEVycm9ycy5CYWRTZXR0ZXJBcml0eSxcbiAgICAgICAgICB7IGF0OiBwcm9wZXJ0eSB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkua2luZCA9PT0gXCJzZXRcIiAmJiBwcm9wZXJ0eS52YWx1ZS5yZXN0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlclJlc3RQYXJhbWV0ZXIsIHsgYXQ6IHByb3BlcnR5IH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dPYmplY3RUeXBlU2VtaWNvbG9uKCk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5lYXQodHQuc2VtaSkgJiZcbiAgICAgICAgIXRoaXMuZWF0KHR0LmNvbW1hKSAmJlxuICAgICAgICAhdGhpcy5tYXRjaCh0dC5icmFjZVIpICYmXG4gICAgICAgICF0aGlzLm1hdGNoKHR0LmJyYWNlQmFyUilcbiAgICAgICkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93UGFyc2VRdWFsaWZpZWRUeXBlSWRlbnRpZmllcihcbiAgICAgIHN0YXJ0TG9jPzogUG9zaXRpb24sXG4gICAgICBpZD86IE4uSWRlbnRpZmllcixcbiAgICApOiBOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllciB7XG4gICAgICBzdGFydExvYyA/Pz0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCBub2RlOiBOLklkZW50aWZpZXIgfCBOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllciA9XG4gICAgICAgIGlkIHx8IHRoaXMuZmxvd1BhcnNlUmVzdHJpY3RlZElkZW50aWZpZXIodHJ1ZSk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5kb3QpKSB7XG4gICAgICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFydE5vZGVBdDxOLkZsb3dRdWFsaWZpZWRUeXBlSWRlbnRpZmllcj4oc3RhcnRMb2MpO1xuICAgICAgICBub2RlMi5xdWFsaWZpY2F0aW9uID0gbm9kZTtcbiAgICAgICAgbm9kZTIuaWQgPSB0aGlzLmZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKHRydWUpO1xuICAgICAgICBub2RlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUyLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VHZW5lcmljVHlwZShcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIGlkOiBOLklkZW50aWZpZXIsXG4gICAgKTogTi5GbG93R2VuZXJpY1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcblxuICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VRdWFsaWZpZWRUeXBlSWRlbnRpZmllcihzdGFydExvYywgaWQpO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlb2ZUeXBlKCk6IE4uRmxvd1R5cGVvZlR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQuX3R5cGVvZik7XG4gICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5mbG93UGFyc2VQcmltYXJ5VHlwZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR1cGxlVHlwZSgpOiBOLkZsb3dUdXBsZVR5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgbm9kZS50eXBlcyA9IFtdO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldEwpO1xuICAgICAgLy8gV2UgYWxsb3cgdHJhaWxpbmcgY29tbWFzXG4gICAgICB3aGlsZSAodGhpcy5zdGF0ZS5wb3MgPCB0aGlzLmxlbmd0aCAmJiAhdGhpcy5tYXRjaCh0dC5icmFja2V0UikpIHtcbiAgICAgICAgbm9kZS50eXBlcy5wdXNoKHRoaXMuZmxvd1BhcnNlVHlwZSgpKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2tldFIpKSBicmVhaztcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldFIpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlR1cGxlVHlwZUFubm90YXRpb25cIik7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlRnVuY3Rpb25UeXBlUGFyYW0oZmlyc3Q6IGJvb2xlYW4pOiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbSB7XG4gICAgICBsZXQgbmFtZSA9IG51bGw7XG4gICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgIGxldCB0eXBlQW5ub3RhdGlvbiA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93RnVuY3Rpb25UeXBlUGFyYW0+KCk7XG4gICAgICBjb25zdCBsaCA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgICBjb25zdCBpc1RoaXMgPSB0aGlzLnN0YXRlLnR5cGUgPT09IHR0Ll90aGlzO1xuXG4gICAgICBpZiAobGgudHlwZSA9PT0gdHQuY29sb24gfHwgbGgudHlwZSA9PT0gdHQucXVlc3Rpb24pIHtcbiAgICAgICAgaWYgKGlzVGhpcyAmJiAhZmlyc3QpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVGhpc1BhcmFtTXVzdEJlRmlyc3QsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKGlzVGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzVGhpcykge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWwsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlKCk7XG4gICAgICB9XG4gICAgICBub2RlLm5hbWUgPSBuYW1lO1xuICAgICAgbm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9uO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpO1xuICAgIH1cblxuICAgIHJlaW50ZXJwcmV0VHlwZUFzRnVuY3Rpb25UeXBlUGFyYW0oXG4gICAgICB0eXBlOiBOLkZsb3dUeXBlLFxuICAgICk6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHR5cGUubG9jLnN0YXJ0KTtcbiAgICAgIG5vZGUubmFtZSA9IG51bGw7XG4gICAgICBub2RlLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdHlwZTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVQYXJhbVwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMocGFyYW1zOiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbVtdID0gW10pOiB7XG4gICAgICBwYXJhbXM6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtW107XG4gICAgICByZXN0OiBOLkZsb3dGdW5jdGlvblR5cGVQYXJhbSB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICBfdGhpczogTi5GbG93RnVuY3Rpb25UeXBlUGFyYW0gfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIH0ge1xuICAgICAgbGV0IHJlc3Q6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgX3RoaXM6IE4uRmxvd0Z1bmN0aW9uVHlwZVBhcmFtIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgX3RoaXMgPSB0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKC8qIGZpcnN0ICovIHRydWUpO1xuICAgICAgICAvLyBtYXRjaCBGbG93IHBhcnNlciBiZWhhdmlvclxuICAgICAgICBfdGhpcy5uYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5wYXJlblIpICYmICF0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgICBwYXJhbXMucHVzaCh0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKGZhbHNlKSk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5wYXJlblIpKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lYXQodHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIHJlc3QgPSB0aGlzLmZsb3dQYXJzZUZ1bmN0aW9uVHlwZVBhcmFtKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHBhcmFtcywgcmVzdCwgX3RoaXMgfTtcbiAgICB9XG5cbiAgICBmbG93SWRlbnRUb1R5cGVBbm5vdGF0aW9uKFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgICAgbm9kZTogVW5kb25lPE4uRmxvd1R5cGVBbm5vdGF0aW9uPixcbiAgICAgIGlkOiBOLklkZW50aWZpZXIsXG4gICAgKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgc3dpdGNoIChpZC5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQW55VHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSBcImJvb2xcIjpcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJtaXhlZFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJlbXB0eVwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVtYmVyVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKTtcblxuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5jaGVja05vdFVuZGVyc2NvcmUoaWQubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlR2VuZXJpY1R5cGUoc3RhcnRMb2MsIGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcGFyc2luZyBvZiB0eXBlcyByb3VnaGx5IHBhcmFsbGVscyB0aGUgcGFyc2luZyBvZiBleHByZXNzaW9ucywgYW5kXG4gICAgLy8gcHJpbWFyeSB0eXBlcyBhcmUga2luZCBvZiBsaWtlIHByaW1hcnkgZXhwcmVzc2lvbnMuLi50aGV5J3JlIHRoZVxuICAgIC8vIHByaW1pdGl2ZXMgd2l0aCB3aGljaCBvdGhlciB0eXBlcyBhcmUgY29uc3RydWN0ZWQuXG4gICAgZmxvd1BhcnNlUHJpbWFyeVR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBsZXQgdG1wO1xuICAgICAgbGV0IHR5cGU7XG4gICAgICBsZXQgaXNHcm91cGVkVHlwZSA9IGZhbHNlO1xuICAgICAgY29uc3Qgb2xkTm9Bbm9uRnVuY3Rpb25UeXBlID0gdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dFeGFjdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1NwcmVhZDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93UHJvdG86IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dJbmV4YWN0OiB0cnVlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgdHQuYnJhY2VCYXJMOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9iamVjdFR5cGUoe1xuICAgICAgICAgICAgYWxsb3dTdGF0aWM6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dFeGFjdDogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93U3ByZWFkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dQcm90bzogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0luZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgdHQuYnJhY2tldEw6XG4gICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBmYWxzZTtcbiAgICAgICAgICB0eXBlID0gdGhpcy5mbG93UGFyc2VUdXBsZVR5cGUoKTtcbiAgICAgICAgICB0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSA9IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZTtcbiAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICBjYXNlIHR0Lmx0OlxuICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKTtcbiAgICAgICAgICBub2RlLnBhcmFtcyA9IHRtcC5wYXJhbXM7XG4gICAgICAgICAgbm9kZS5yZXN0ID0gdG1wLnJlc3Q7XG4gICAgICAgICAgbm9kZS50aGlzID0gdG1wLl90aGlzO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5hcnJvdyk7XG5cbiAgICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQucGFyZW5MOlxuICAgICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYWN0dWFsbHkgYSBncm91cGVkIHR5cGVcbiAgICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5SKSAmJiAhdGhpcy5tYXRjaCh0dC5lbGxpcHNpcykpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpIHx8IHRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb29rYWhlYWQoKS50eXBlO1xuICAgICAgICAgICAgICBpc0dyb3VwZWRUeXBlID0gdG9rZW4gIT09IHR0LnF1ZXN0aW9uICYmIHRva2VuICE9PSB0dC5jb2xvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlzR3JvdXBlZFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0dyb3VwZWRUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgdHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBvbGROb0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgICAgICAgIC8vIEEgYCxgIG9yIGEgYCkgPT5gIG1lYW5zIHRoaXMgaXMgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHR5cGVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgfHxcbiAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoKHR0LmNvbW1hKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLm1hdGNoKHR0LnBhcmVuUikgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5hcnJvdylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG4gICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRWF0IGEgY29tbWEgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgICAgICAgIHRoaXMuZWF0KHR0LmNvbW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoW1xuICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0VHlwZUFzRnVuY3Rpb25UeXBlUGFyYW0odHlwZSksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG1wID0gdGhpcy5mbG93UGFyc2VGdW5jdGlvblR5cGVQYXJhbXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2RlLnBhcmFtcyA9IHRtcC5wYXJhbXM7XG4gICAgICAgICAgbm9kZS5yZXN0ID0gdG1wLnJlc3Q7XG4gICAgICAgICAgbm9kZS50aGlzID0gdG1wLl90aGlzO1xuXG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmFycm93KTtcblxuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMuZmxvd1BhcnNlVHlwZSgpO1xuXG4gICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKTtcblxuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgICAgIFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICBub2RlLnZhbHVlID0gdGhpcy5tYXRjaCh0dC5fdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4sXG4gICAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgdHQucGx1c01pbjpcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQubnVtKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWxBdE5vZGU8Ti5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgICAgIC10aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICAgIFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYmlnaW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWxBdE5vZGU8Ti5CaWdJbnRMaXRlcmFsVHlwZUFubm90YXRpb24+KFxuICAgICAgICAgICAgICAgIC10aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICAgIFwiQmlnSW50TGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLlVuZXhwZWN0ZWRTdWJ0cmFjdGlvbk9wZXJhbmQsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIHR0Lm51bTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgdHQuYmlnaW50OlxuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICBcIkJpZ0ludExpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgY2FzZSB0dC5fdm9pZDpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQuX251bGw6XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSB0dC5fdGhpczpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIpO1xuXG4gICAgICAgIGNhc2UgdHQuc3RhcjpcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIik7XG5cbiAgICAgICAgY2FzZSB0dC5fdHlwZW9mOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGVvZlR5cGUoKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICh0b2tlbklzS2V5d29yZCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRva2VuTGFiZWxOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJZGVudGlmaWVyKG5vZGUgYXMgVW5kb25lPE4uSWRlbnRpZmllcj4sIGxhYmVsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VJbnRlcmZhY2VUeXBlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dJZGVudFRvVHlwZUFubm90YXRpb24oXG4gICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB0aGlzLnBhcnNlSWRlbnRpZmllcigpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVBvc3RmaXhUeXBlKCk6IE4uRmxvd1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCB0eXBlID0gdGhpcy5mbG93UGFyc2VQcmltYXJ5VHlwZSgpO1xuICAgICAgbGV0IHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgKHRoaXMubWF0Y2godHQuYnJhY2tldEwpIHx8IHRoaXMubWF0Y2godHQucXVlc3Rpb25Eb3QpKSAmJlxuICAgICAgICAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSB0aGlzLmVhdCh0dC5xdWVzdGlvbkRvdCk7XG4gICAgICAgIHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MgPSBzZWVuT3B0aW9uYWxJbmRleGVkQWNjZXNzIHx8IG9wdGlvbmFsO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICAgIGlmICghb3B0aW9uYWwgJiYgdGhpcy5tYXRjaCh0dC5icmFja2V0UikpIHtcbiAgICAgICAgICBub2RlLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBdYFxuICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUub2JqZWN0VHlwZSA9IHR5cGU7XG4gICAgICAgICAgbm9kZS5pbmRleFR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICAgICAgaWYgKHNlZW5PcHRpb25hbEluZGV4ZWRBY2Nlc3MpIHtcbiAgICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGU8Ti5GbG93T3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZT4oXG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlPE4uRmxvd0luZGV4ZWRBY2Nlc3NUeXBlPihcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlUHJlZml4VHlwZSgpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVBvc3RmaXhUeXBlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmxvd1BhcnNlQW5vbkZ1bmN0aW9uV2l0aG91dFBhcmVucygpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuZmxvd1BhcnNlUHJlZml4VHlwZSgpO1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLm5vQW5vbkZ1bmN0aW9uVHlwZSAmJiB0aGlzLmVhdCh0dC5hcnJvdykpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYSB0eXBlIGVycm9yLiBQYXNzaW5nIGluIGEgU291cmNlTG9jYXRpb24sIGFuZCBpdCBleHBlY3RzIGEgUG9zaXRpb24uXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHBhcmFtLmxvYy5zdGFydCk7XG4gICAgICAgIG5vZGUucGFyYW1zID0gW3RoaXMucmVpbnRlcnByZXRUeXBlQXNGdW5jdGlvblR5cGVQYXJhbShwYXJhbSldO1xuICAgICAgICBub2RlLnJlc3QgPSBudWxsO1xuICAgICAgICBub2RlLnRoaXMgPSBudWxsO1xuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmFtO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZUludGVyc2VjdGlvblR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLmVhdCh0dC5iaXR3aXNlQU5EKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZsb3dQYXJzZUFub25GdW5jdGlvbldpdGhvdXRQYXJlbnMoKTtcbiAgICAgIG5vZGUudHlwZXMgPSBbdHlwZV07XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHQuYml0d2lzZUFORCkpIHtcbiAgICAgICAgbm9kZS50eXBlcy5wdXNoKHRoaXMuZmxvd1BhcnNlQW5vbkZ1bmN0aW9uV2l0aG91dFBhcmVucygpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnR5cGVzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHR5cGVcbiAgICAgICAgOiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VVbmlvblR5cGUoKTogTi5GbG93VHlwZUFubm90YXRpb24ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLmVhdCh0dC5iaXR3aXNlT1IpO1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZmxvd1BhcnNlSW50ZXJzZWN0aW9uVHlwZSgpO1xuICAgICAgbm9kZS50eXBlcyA9IFt0eXBlXTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5iaXR3aXNlT1IpKSB7XG4gICAgICAgIG5vZGUudHlwZXMucHVzaCh0aGlzLmZsb3dQYXJzZUludGVyc2VjdGlvblR5cGUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS50eXBlcy5sZW5ndGggPT09IDFcbiAgICAgICAgPyB0eXBlXG4gICAgICAgIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVW5pb25UeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlKCk6IE4uRmxvd1R5cGVBbm5vdGF0aW9uIHtcbiAgICAgIGNvbnN0IG9sZEluVHlwZSA9IHRoaXMuc3RhdGUuaW5UeXBlO1xuICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSB0cnVlO1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZmxvd1BhcnNlVW5pb25UeXBlKCk7XG4gICAgICB0aGlzLnN0YXRlLmluVHlwZSA9IG9sZEluVHlwZTtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIGZsb3dQYXJzZVR5cGVPckltcGxpY2l0SW5zdGFudGlhdGlvbigpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS50eXBlID09PSB0dC5uYW1lICYmIHRoaXMuc3RhdGUudmFsdWUgPT09IFwiX1wiKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUdlbmVyaWNUeXBlKHN0YXJ0TG9jLCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZVR5cGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpOiBOLkZsb3dUeXBlQW5ub3RhdGlvbiB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93VHlwZUFubm90YXRpb24+KCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlSW5pdGlhbGlzZXIoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VUeXBlQW5ub3RhdGFibGVJZGVudGlmaWVyKFxuICAgICAgYWxsb3dQcmltaXRpdmVPdmVycmlkZT86IGJvb2xlYW4sXG4gICAgKTogTi5JZGVudGlmaWVyIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gYWxsb3dQcmltaXRpdmVPdmVycmlkZVxuICAgICAgICA/IHRoaXMucGFyc2VJZGVudGlmaWVyKClcbiAgICAgICAgOiB0aGlzLmZsb3dQYXJzZVJlc3RyaWN0ZWRJZGVudGlmaWVyKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgaWRlbnQudHlwZUFubm90YXRpb24gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihpZGVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRlbnQ7XG4gICAgfVxuXG4gICAgdHlwZUNhc3RUb1BhcmFtZXRlcihub2RlOiBOLk5vZGUpOiBOLk5vZGUge1xuICAgICAgbm9kZS5leHByZXNzaW9uLnR5cGVBbm5vdGF0aW9uID0gbm9kZS50eXBlQW5ub3RhdGlvbjtcblxuICAgICAgdGhpcy5yZXNldEVuZExvY2F0aW9uKG5vZGUuZXhwcmVzc2lvbiwgbm9kZS50eXBlQW5ub3RhdGlvbi5sb2MuZW5kKTtcblxuICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBmbG93UGFyc2VWYXJpYW5jZSgpOiBOLkZsb3dWYXJpYW5jZSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgbGV0IHZhcmlhbmNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBsdXNNaW4pKSB7XG4gICAgICAgIHZhcmlhbmNlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93VmFyaWFuY2U+KCk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlID09PSBcIitcIikge1xuICAgICAgICAgIHZhcmlhbmNlLmtpbmQgPSBcInBsdXNcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXJpYW5jZS5raW5kID0gXCJtaW51c1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHZhcmlhbmNlLCBcIlZhcmlhbmNlXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhcmlhbmNlO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBwYXJzZUZ1bmN0aW9uQm9keShcbiAgICAgIG5vZGU6IE4uRnVuY3Rpb24sXG4gICAgICBhbGxvd0V4cHJlc3Npb25Cb2R5PzogYm9vbGVhbiB8IG51bGwsXG4gICAgICBpc01ldGhvZDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKGFsbG93RXhwcmVzc2lvbkJvZHkpIHtcbiAgICAgICAgdGhpcy5mb3J3YXJkTm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdChub2RlLCAoKSA9PlxuICAgICAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIHRydWUsIGlzTWV0aG9kKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCBmYWxzZSwgaXNNZXRob2QpO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoPFxuICAgICAgVCBleHRlbmRzXG4gICAgICAgIHwgTi5GdW5jdGlvblxuICAgICAgICB8IE4uVFNEZWNsYXJlTWV0aG9kXG4gICAgICAgIHwgTi5UU0RlY2xhcmVGdW5jdGlvblxuICAgICAgICB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgID4obm9kZTogVW5kb25lPFQ+LCB0eXBlOiBUW1widHlwZVwiXSwgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgICBbXG4gICAgICAgICAgdHlwZU5vZGUudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwcmVkaWNhdGUgbWF5IG5vdCBleGlzdFxuICAgICAgICAgIG5vZGUucHJlZGljYXRlLFxuICAgICAgICBdID0gdGhpcy5mbG93UGFyc2VUeXBlQW5kUHJlZGljYXRlSW5pdGlhbGlzZXIoKTtcblxuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0eXBlTm9kZS50eXBlQW5ub3RhdGlvblxuICAgICAgICAgID8gdGhpcy5maW5pc2hOb2RlKHR5cGVOb2RlLCBcIlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2gobm9kZSwgdHlwZSwgaXNNZXRob2QpO1xuICAgIH1cblxuICAgIC8vIGludGVyZmFjZXMgYW5kIGVudW1zXG4gICAgcGFyc2VTdGF0ZW1lbnRMaWtlKGZsYWdzOiBQYXJzZVN0YXRlbWVudEZsYWcpOiBOLlN0YXRlbWVudCB7XG4gICAgICAvLyBzdHJpY3QgbW9kZSBoYW5kbGluZyBvZiBgaW50ZXJmYWNlYCBzaW5jZSBpdCdzIGEgcmVzZXJ2ZWQgd29yZFxuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RyaWN0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIGNvbnN0IGxvb2thaGVhZCA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgICAgIGlmICh0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcihsb29rYWhlYWQudHlwZSkpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5GbG93SW50ZXJmYWNlPigpO1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUludGVyZmFjZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZFBhcnNlRW51bXMoKSAmJiB0aGlzLmlzQ29udGV4dHVhbCh0dC5fZW51bSkpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VFbnVtRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG10ID0gc3VwZXIucGFyc2VTdGF0ZW1lbnRMaWtlKGZsYWdzKTtcbiAgICAgIC8vIFdlIHdpbGwgcGFyc2UgYSBmbG93IHByYWdtYSBpbiBhbnkgY29tbWVudCBiZWZvcmUgdGhlIGZpcnN0IHN0YXRlbWVudC5cbiAgICAgIGlmICh0aGlzLmZsb3dQcmFnbWEgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1ZhbGlkRGlyZWN0aXZlKHN0bXQpKSB7XG4gICAgICAgIHRoaXMuZmxvd1ByYWdtYSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RtdDtcbiAgICB9XG5cbiAgICAvLyBkZWNsYXJlcywgaW50ZXJmYWNlcyBhbmQgdHlwZSBhbGlhc2VzXG4gICAgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uU3RhdGVtZW50LFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uU3RhdGVtZW50IHtcbiAgICAgIGlmIChleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgIGlmIChleHByLm5hbWUgPT09IFwiZGVjbGFyZVwiKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYXRjaCh0dC5fY2xhc3MpIHx8XG4gICAgICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpIHx8XG4gICAgICAgICAgICB0aGlzLm1hdGNoKHR0Ll9mdW5jdGlvbikgfHxcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuX3ZhcikgfHxcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuX2V4cG9ydClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VEZWNsYXJlKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgICAgaWYgKGV4cHIubmFtZSA9PT0gXCJpbnRlcmZhY2VcIikge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZUludGVyZmFjZShub2RlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV4cHIubmFtZSA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VUeXBlQWxpYXMobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChleHByLm5hbWUgPT09IFwib3BhcXVlXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VPcGFxdWVUeXBlKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBleHByLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICAvLyBleHBvcnQgdHlwZVxuICAgIHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuSXNGbG93SW50ZXJmYWNlT3JUeXBlT3JPcGFxdWUodHlwZSkgfHxcbiAgICAgICAgKHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpICYmIHR5cGUgPT09IHR0Ll9lbnVtKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCk7XG4gICAgfVxuXG4gICAgaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbklzRmxvd0ludGVyZmFjZU9yVHlwZU9yT3BhcXVlKHR5cGUpIHx8XG4gICAgICAgICh0aGlzLnNob3VsZFBhcnNlRW51bXMoKSAmJiB0eXBlID09PSB0dC5fZW51bSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLmlzRXhwb3J0RGVmYXVsdFNwZWNpZmllcigpO1xuICAgIH1cblxuICAgIHBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKTogTi5FeHByZXNzaW9uIHwgTi5EZWNsYXJhdGlvbiB7XG4gICAgICBpZiAodGhpcy5zaG91bGRQYXJzZUVudW1zKCkgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX2VudW0pKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlRW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwb3J0RGVmYXVsdEV4cHJlc3Npb24oKTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5xdWVzdGlvbikpIHJldHVybiBleHByO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgLy8gVGhlc2UgdG9rZW5zIGNhbm5vdCBzdGFydCBhbiBleHByZXNzaW9uLCBzbyBpZiBvbmUgb2YgdGhlbSBmb2xsb3dzXG4gICAgICAgIC8vID8gdGhlbiB3ZSBhcmUgcHJvYmFibHkgaW4gYW4gYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVycyBsaXN0IGFuZCB3ZVxuICAgICAgICAvLyBkb24ndCBwYXJzZSB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRDaCA9PT0gY2hhckNvZGVzLmNvbW1hIHx8IC8vIChhPywgYikgPT4gY1xuICAgICAgICAgIG5leHRDaCA9PT0gY2hhckNvZGVzLmVxdWFsc1RvIHx8IC8vIChhPyA9IGIpID0+IGNcbiAgICAgICAgICBuZXh0Q2ggPT09IGNoYXJDb2Rlcy5jb2xvbiB8fCAvLyAoYT86IGIpID0+IGNcbiAgICAgICAgICBuZXh0Q2ggPT09IGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzIC8vIChhPykgPT4gY1xuICAgICAgICApIHtcbiAgICAgICAgICAvKjo6IGludmFyaWFudChyZWZFeHByZXNzaW9uRXJyb3JzICE9IG51bGwpICovXG4gICAgICAgICAgdGhpcy5zZXRPcHRpb25hbFBhcmFtZXRlcnNFcnJvcihyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTm9BcnJvd0F0ID0gdGhpcy5zdGF0ZS5ub0Fycm93QXQ7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBsZXQgeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKTtcbiAgICAgIGxldCBbdmFsaWQsIGludmFsaWRdID0gdGhpcy5nZXRBcnJvd0xpa2VFeHByZXNzaW9ucyhjb25zZXF1ZW50KTtcblxuICAgICAgaWYgKGZhaWxlZCB8fCBpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9BcnJvd0F0ID0gWy4uLm9yaWdpbmFsTm9BcnJvd0F0XTtcblxuICAgICAgICBpZiAoaW52YWxpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd0F0ID0gbm9BcnJvd0F0O1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnZhbGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBub0Fycm93QXQucHVzaChpbnZhbGlkW2ldLnN0YXJ0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAoeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKSk7XG4gICAgICAgICAgW3ZhbGlkLCBpbnZhbGlkXSA9IHRoaXMuZ2V0QXJyb3dMaWtlRXhwcmVzc2lvbnMoY29uc2VxdWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFpbGVkICYmIHZhbGlkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgcG9zc2libGUgY29ycmVjdCB3YXlzIG9mIHBhcnNpbmcsIHRocm93IGFuXG4gICAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgICAgLy8gZS5nLiAgIFNvdXJjZTogYSA/IChiKTogYyA9PiAoZCk6IGUgPT4gZlxuICAgICAgICAgIC8vICAgICAgUmVzdWx0IDE6IGEgPyBiIDogKGMgPT4gKChkKTogZSA9PiBmKSlcbiAgICAgICAgICAvLyAgICAgIFJlc3VsdCAyOiBhID8gKChiKTogYyA9PiBkKSA6IChlID0+IGYpXG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkFtYmlndW91c0NvbmRpdGlvbmFsQXJyb3csIHtcbiAgICAgICAgICAgIGF0OiBzdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmYWlsZWQgJiYgdmFsaWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgIG5vQXJyb3dBdC5wdXNoKHZhbGlkWzBdLnN0YXJ0KTtcbiAgICAgICAgICB0aGlzLnN0YXRlLm5vQXJyb3dBdCA9IG5vQXJyb3dBdDtcbiAgICAgICAgICAoeyBjb25zZXF1ZW50LCBmYWlsZWQgfSA9IHRoaXMudHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRBcnJvd0xpa2VFeHByZXNzaW9ucyhjb25zZXF1ZW50LCB0cnVlKTtcblxuICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93QXQgPSBvcmlnaW5hbE5vQXJyb3dBdDtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcblxuICAgICAgbm9kZS50ZXN0ID0gZXhwcjtcbiAgICAgIG5vZGUuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG4gICAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMuZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQobm9kZSwgKCkgPT5cbiAgICAgICAgdGhpcy5wYXJzZU1heWJlQXNzaWduKHVuZGVmaW5lZCwgdW5kZWZpbmVkKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIik7XG4gICAgfVxuXG4gICAgdHJ5UGFyc2VDb25kaXRpb25hbENvbnNlcXVlbnQoKToge1xuICAgICAgY29uc2VxdWVudDogTi5FeHByZXNzaW9uO1xuICAgICAgZmFpbGVkOiBib29sZWFuO1xuICAgIH0ge1xuICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnB1c2godGhpcy5zdGF0ZS5zdGFydCk7XG5cbiAgICAgIGNvbnN0IGNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgICBjb25zdCBmYWlsZWQgPSAhdGhpcy5tYXRjaCh0dC5jb2xvbik7XG5cbiAgICAgIHRoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5wb3AoKTtcblxuICAgICAgcmV0dXJuIHsgY29uc2VxdWVudCwgZmFpbGVkIH07XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gZXhwcmVzc2lvbiwgd2Fsa3MgdGhyb3VnaCBvdXQgaXRzIGFycm93IGZ1bmN0aW9ucyB3aG9zZSBib2R5IGlzXG4gICAgLy8gYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3VnaCBvdXQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMuIEl0IHJldHVybnMgZXZlcnlcbiAgICAvLyBmdW5jdGlvbiB3aGljaCBoYXMgYmVlbiBwYXJzZWQgd2l0aCBhIHJldHVybiB0eXBlIGJ1dCBjb3VsZCBoYXZlIGJlZW5cbiAgICAvLyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLlxuICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc2VwYXJhdGVkIGludG8gdHdvIGFycmF5czogb25lIGNvbnRhaW5pbmcgdGhlIG9uZXNcbiAgICAvLyB3aG9zZSBwYXJhbWV0ZXJzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYXNzaWduYWJsZSBsaXN0cywgb25lIGNvbnRhaW5pbmcgdGhlXG4gICAgLy8gb3RoZXJzLlxuICAgIGdldEFycm93TGlrZUV4cHJlc3Npb25zKFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uLFxuICAgICAgZGlzYWxsb3dJbnZhbGlkPzogYm9vbGVhbixcbiAgICApOiBbTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbltdLCBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uW11dIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gW25vZGVdO1xuICAgICAgY29uc3QgYXJyb3dzOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uW10gPSBbXTtcblxuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIikge1xuICAgICAgICAgIGlmIChub2RlLnR5cGVQYXJhbWV0ZXJzIHx8ICFub2RlLnJldHVyblR5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXJyb3cgZXhwcmVzc2lvbiB3aXRob3V0IGFtYmlndWl0eSwgc28gY2hlY2sgaXRzIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgICB0aGlzLmZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIGFycm93cy5wdXNoKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKG5vZGUuYm9keSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChub2RlLmNvbnNlcXVlbnQpO1xuICAgICAgICAgIHN0YWNrLnB1c2gobm9kZS5hbHRlcm5hdGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhbGxvd0ludmFsaWQpIHtcbiAgICAgICAgYXJyb3dzLmZvckVhY2gobm9kZSA9PiB0aGlzLmZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlKSk7XG4gICAgICAgIHJldHVybiBbYXJyb3dzLCBbXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0aXRpb24oYXJyb3dzLCBub2RlID0+XG4gICAgICAgIG5vZGUucGFyYW1zLmV2ZXJ5KHBhcmFtID0+IHRoaXMuaXNBc3NpZ25hYmxlKHBhcmFtLCB0cnVlKSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZpbmlzaEFycm93VmFsaWRhdGlvbihub2RlOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3QoXG4gICAgICAgIC8vIG5vZGUucGFyYW1zIGlzIEV4cHJlc3Npb25bXSBpbnN0ZWFkIG9mICRSZWFkT25seUFycmF5PFBhdHRlcm4+IGJlY2F1c2UgaXRcbiAgICAgICAgLy8gaGFzIG5vdCBiZWVuIGNvbnZlcnRlZCB5ZXQuXG4gICAgICAgIG5vZGUucGFyYW1zIGFzIGFueSBhcyBOLkV4cHJlc3Npb25bXSxcbiAgICAgICAgbm9kZS5leHRyYT8udHJhaWxpbmdDb21tYUxvYyxcbiAgICAgICAgLyogaXNMSFMgKi8gZmFsc2UsXG4gICAgICApO1xuICAgICAgLy8gRW50ZXIgc2NvcGUsIGFzIGNoZWNrUGFyYW1zIGRlZmluZXMgYmluZGluZ3NcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9BUlJPVyk7XG4gICAgICAvLyBVc2Ugc3VwZXIncyBtZXRob2QgdG8gZm9yY2UgdGhlIHBhcmFtZXRlcnMgdG8gYmUgY2hlY2tlZFxuICAgICAgc3VwZXIuY2hlY2tQYXJhbXMobm9kZSwgZmFsc2UsIHRydWUpO1xuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgfVxuXG4gICAgZm9yd2FyZE5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQ8VD4oXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICAgIHBhcnNlOiAoKSA9PiBULFxuICAgICk6IFQge1xuICAgICAgbGV0IHJlc3VsdDogVDtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQuaW5kZXhPZihub2RlLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LnB1c2godGhpcy5zdGF0ZS5zdGFydCk7XG4gICAgICAgIHJlc3VsdCA9IHBhcnNlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd1BhcmFtc0NvbnZlcnNpb25BdC5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcnNlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcGFyc2VQYXJlbkl0ZW0oXG4gICAgICBub2RlOiBOLkV4cHJlc3Npb24sXG5cbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgbm9kZSA9IHN1cGVyLnBhcnNlUGFyZW5JdGVtKG5vZGUsIHN0YXJ0TG9jKTtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5xdWVzdGlvbikpIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIC8vIEluY2x1ZGUgcXVlc3Rpb25tYXJrIGluIGxvY2F0aW9uIG9mIG5vZGVcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHRoaXMuZmluaXNoTm9kZSgpIGFzIG90aGVyd2lzZSB3ZSBtaWdodCBwcm9jZXNzIGNvbW1lbnRzIHR3aWNlIGFuZFxuICAgICAgICAvLyBpbmNsdWRlIGFscmVhZHkgY29uc3VtZWQgcGFyZW5zXG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDYXN0Tm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgICB0eXBlQ2FzdE5vZGUuZXhwcmVzc2lvbiA9IG5vZGU7XG4gICAgICAgIHR5cGVDYXN0Tm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHR5cGVDYXN0Tm9kZSwgXCJUeXBlQ2FzdEV4cHJlc3Npb25cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGFzc2VydE1vZHVsZU5vZGVBbGxvd2VkKG5vZGU6IE4uTm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICAobm9kZS50eXBlID09PSBcIkltcG9ydERlY2xhcmF0aW9uXCIgJiZcbiAgICAgICAgICAobm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVcIiB8fCBub2RlLmltcG9ydEtpbmQgPT09IFwidHlwZW9mXCIpKSB8fFxuICAgICAgICAobm9kZS50eXBlID09PSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIiAmJlxuICAgICAgICAgIG5vZGUuZXhwb3J0S2luZCA9PT0gXCJ0eXBlXCIpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09IFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIiAmJiBub2RlLmV4cG9ydEtpbmQgPT09IFwidHlwZVwiKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFsbG93IEZsb3d0eXBlIGltcG9ydHMgYW5kIGV4cG9ydHMgaW4gYWxsIGNvbmRpdGlvbnMgYmVjYXVzZVxuICAgICAgICAvLyBGbG93IGl0c2VsZiBkb2VzIG5vdCBjYXJlIGFib3V0ICdzb3VyY2VUeXBlJy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5hc3NlcnRNb2R1bGVOb2RlQWxsb3dlZChub2RlKTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICAgICk6IE4uRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkpIHtcbiAgICAgICAgbm9kZS5leHBvcnRLaW5kID0gXCJ0eXBlXCI7XG5cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2VMKSkge1xuICAgICAgICAgIC8vIGV4cG9ydCB0eXBlIHsgZm9vLCBiYXIgfTtcbiAgICAgICAgICBub2RlLnNwZWNpZmllcnMgPSB0aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhcbiAgICAgICAgICAgIC8qIGlzSW5UeXBlRXhwb3J0ICovIHRydWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdXBlci5wYXJzZUV4cG9ydEZyb20obm9kZSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXhwb3J0IHR5cGUgRm9vID0gQmFyO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlVHlwZUFsaWFzKGRlY2xhcmF0aW9uTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX29wYXF1ZSkpIHtcbiAgICAgICAgbm9kZS5leHBvcnRLaW5kID0gXCJ0eXBlXCI7XG5cbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIC8vIGV4cG9ydCBvcGFxdWUgdHlwZSBGb28gPSBCYXI7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dQYXJzZU9wYXF1ZVR5cGUoZGVjbGFyYXRpb25Ob2RlLCBmYWxzZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbk5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1BhcnNlSW50ZXJmYWNlKGRlY2xhcmF0aW9uTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkUGFyc2VFbnVtcygpICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9lbnVtKSkge1xuICAgICAgICBub2RlLmV4cG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93UGFyc2VFbnVtRGVjbGFyYXRpb24oZGVjbGFyYXRpb25Ob2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVhdEV4cG9ydFN0YXIobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICBpZiAoc3VwZXIuZWF0RXhwb3J0U3Rhcihub2RlKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5fdHlwZSkgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5zdGFyKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWF5YmVQYXJzZUV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcihub2RlOiBOLk5vZGUpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2MgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBoYXNOYW1lc3BhY2UgPSBzdXBlci5tYXliZVBhcnNlRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyKG5vZGUpO1xuICAgICAgaWYgKGhhc05hbWVzcGFjZSAmJiBub2RlLmV4cG9ydEtpbmQgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChzdGFydExvYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzTmFtZXNwYWNlO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NJZChcbiAgICAgIG5vZGU6IE4uQ2xhc3MsXG4gICAgICBpc1N0YXRlbWVudDogYm9vbGVhbixcbiAgICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuIHwgbnVsbCxcbiAgICApIHtcbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NJZChub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc01lbWJlcihcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZW1iZXI6IGFueSxcbiAgICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRMb2MgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2RlY2xhcmUpKSB7XG4gICAgICAgIGlmIChzdXBlci5wYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKGNsYXNzQm9keSwgbWVtYmVyKSkge1xuICAgICAgICAgIC8vICdkZWNsYXJlJyBpcyBhIGNsYXNzIGVsZW1lbnQgbmFtZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlci5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucGFyc2VDbGFzc01lbWJlcihjbGFzc0JvZHksIG1lbWJlciwgc3RhdGUpO1xuXG4gICAgICBpZiAobWVtYmVyLmRlY2xhcmUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1lbWJlci50eXBlICE9PSBcIkNsYXNzUHJvcGVydHlcIiAmJlxuICAgICAgICAgIG1lbWJlci50eXBlICE9PSBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIgJiZcbiAgICAgICAgICBtZW1iZXIudHlwZSAhPT0gXCJQcm9wZXJ0eURlZmluaXRpb25cIiAvLyBVc2VkIGJ5IGVzdHJlZSBwbHVnaW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkRlY2xhcmVDbGFzc0VsZW1lbnQsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci52YWx1ZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5EZWNsYXJlQ2xhc3NGaWVsZEluaXRpYWxpemVyLCB7XG4gICAgICAgICAgICBhdDogbWVtYmVyLnZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNJdGVyYXRvcih3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB3b3JkID09PSBcIml0ZXJhdG9yXCIgfHwgd29yZCA9PT0gXCJhc3luY0l0ZXJhdG9yXCI7XG4gICAgfVxuXG4gICAgcmVhZEl0ZXJhdG9yKCk6IHZvaWQge1xuICAgICAgY29uc3Qgd29yZCA9IHN1cGVyLnJlYWRXb3JkMSgpO1xuICAgICAgY29uc3QgZnVsbFdvcmQgPSBcIkBAXCIgKyB3b3JkO1xuXG4gICAgICAvLyBBbGxvdyBAQGl0ZXJhdG9yIGFuZCBAQGFzeW5jSXRlcmF0b3IgYXMgYSBpZGVudGlmaWVyIG9ubHkgaW5zaWRlIHR5cGVcbiAgICAgIGlmICghdGhpcy5pc0l0ZXJhdG9yKHdvcmQpIHx8ICF0aGlzLnN0YXRlLmluVHlwZSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkSWRlbnRpZmllciwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IGZ1bGxXb3JkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5uYW1lLCBmdWxsV29yZCk7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgaW5zaWRlIGZsb3cgdHlwZXMsIHdlIGJ5cGFzcyB0aGUganN4IHBhcnNlciBwbHVnaW5cbiAgICBnZXRUb2tlbkZyb21Db2RlKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSAmJiBuZXh0ID09PSBjaGFyQ29kZXMudmVydGljYWxCYXIpIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5icmFjZUJhckwsIDIpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgJiZcbiAgICAgICAgKGNvZGUgPT09IGNoYXJDb2Rlcy5ncmVhdGVyVGhhbiB8fCBjb2RlID09PSBjaGFyQ29kZXMubGVzc1RoYW4pXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5maW5pc2hPcChjb2RlID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gPyB0dC5ndCA6IHR0Lmx0LCAxKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pblR5cGUgJiYgY29kZSA9PT0gY2hhckNvZGVzLnF1ZXN0aW9uTWFyaykge1xuICAgICAgICBpZiAobmV4dCA9PT0gY2hhckNvZGVzLmRvdCkge1xuICAgICAgICAgIHRoaXMuZmluaXNoT3AodHQucXVlc3Rpb25Eb3QsIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsbG93IGRvdWJsZSBudWxsYWJsZSB0eXBlcyBpbiBGbG93OiA/P3N0cmluZ1xuICAgICAgICAgIHRoaXMuZmluaXNoT3AodHQucXVlc3Rpb24sIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc0l0ZXJhdG9yU3RhcnQoY29kZSwgbmV4dCwgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zICsgMikpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgKz0gMjsgLy8gZWF0IFwiQEBcIlxuICAgICAgICB0aGlzLnJlYWRJdGVyYXRvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VwZXIuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc0Fzc2lnbmFibGUobm9kZTogTi5Ob2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzQmluZGluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3VwZXIuaXNBc3NpZ25hYmxlKG5vZGUsIGlzQmluZGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9Bc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICAhaXNMSFMgJiZcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgbm9kZS5sZWZ0LnR5cGUgPT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCJcbiAgICAgICkge1xuICAgICAgICBub2RlLmxlZnQgPSB0aGlzLnR5cGVDYXN0VG9QYXJhbWV0ZXIobm9kZS5sZWZ0KTtcbiAgICAgIH1cbiAgICAgIHN1cGVyLnRvQXNzaWduYWJsZShub2RlLCBpc0xIUyk7XG4gICAgfVxuXG4gICAgLy8gdHVybiB0eXBlIGNhc3RzIHRoYXQgd2UgZm91bmQgaW4gZnVuY3Rpb24gcGFyYW1ldGVyIGhlYWQgaW50byB0eXBlIGFubm90YXRlZCBwYXJhbXNcbiAgICB0b0Fzc2lnbmFibGVMaXN0KFxuICAgICAgZXhwckxpc3Q6IE4uRXhwcmVzc2lvbltdLFxuICAgICAgdHJhaWxpbmdDb21tYUxvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgICAgaXNMSFM6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBleHByTGlzdFtpXTtcbiAgICAgICAgaWYgKGV4cHI/LnR5cGUgPT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBleHByTGlzdFtpXSA9IHRoaXMudHlwZUNhc3RUb1BhcmFtZXRlcihleHByKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3VwZXIudG9Bc3NpZ25hYmxlTGlzdChleHByTGlzdCwgdHJhaWxpbmdDb21tYUxvYywgaXNMSFMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYSBsaXN0IG9mIG5vZGVzLCBmcm9tIHNvbWV0aGluZyBsaWtlIGEgY2FsbCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvIGZpbHRlciB0aGVcbiAgICAvLyB0eXBlIGNhc3RzIHRoYXQgd2UndmUgZm91bmQgdGhhdCBhcmUgaWxsZWdhbCBpbiB0aGlzIGNvbnRleHRcbiAgICB0b1JlZmVyZW5jZWRMaXN0KFxuICAgICAgZXhwckxpc3Q6IFJlYWRvbmx5QXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgICBpc1BhcmVudGhlc2l6ZWRFeHByPzogYm9vbGVhbixcbiAgICApOiBSZWFkb25seUFycmF5PE4uRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGw+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGV4cHJMaXN0W2ldO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhwciAmJlxuICAgICAgICAgIGV4cHIudHlwZSA9PT0gXCJUeXBlQ2FzdEV4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICFleHByLmV4dHJhPy5wYXJlbnRoZXNpemVkICYmXG4gICAgICAgICAgKGV4cHJMaXN0Lmxlbmd0aCA+IDEgfHwgIWlzUGFyZW50aGVzaXplZEV4cHIpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UeXBlQ2FzdEluUGF0dGVybiwge1xuICAgICAgICAgICAgYXQ6IGV4cHIudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cHJMaXN0O1xuICAgIH1cblxuICAgIHBhcnNlQXJyYXlMaWtlKFxuICAgICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICAgIGNhbkJlUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzVHVwbGU6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5BcnJheUV4cHJlc3Npb24gfCBOLlR1cGxlRXhwcmVzc2lvbiB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VBcnJheUxpa2UoXG4gICAgICAgIGNsb3NlLFxuICAgICAgICBjYW5CZVBhdHRlcm4sXG4gICAgICAgIGlzVHVwbGUsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuXG4gICAgICAvLyBUaGlzIGNvdWxkIGJlIGFuIGFycmF5IHBhdHRlcm46XG4gICAgICAvLyAgIChbYTogc3RyaW5nLCBiOiBzdHJpbmddKSA9PiB7fVxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCBoYXZlIHRvIGNhbGwgdG9SZWZlcmVuY2VkTGlzdC4gV2Ugd2lsbFxuICAgICAgLy8gY2FsbCBpdCwgaWYgbmVlZGVkLCB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgaXQgaXMgYSBwYXJlbnRoZXNpemVkXG4gICAgICAvLyBleHByZXNzaW9uIGJ5IGNhbGxpbmcgdG9SZWZlcmVuY2VkTGlzdERlZXAuXG4gICAgICBpZiAoY2FuQmVQYXR0ZXJuICYmICF0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy50b1JlZmVyZW5jZWRMaXN0KG5vZGUuZWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpc1ZhbGlkTFZhbCh0eXBlOiBzdHJpbmcsIGlzUGFyZW50aGVzaXplZDogYm9vbGVhbiwgYmluZGluZzogQmluZGluZ1R5cGVzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiIHx8XG4gICAgICAgIHN1cGVyLmlzVmFsaWRMVmFsKHR5cGUsIGlzUGFyZW50aGVzaXplZCwgYmluZGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcGFyc2UgY2xhc3MgcHJvcGVydHkgdHlwZSBhbm5vdGF0aW9uc1xuICAgIHBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlOiBOLkNsYXNzUHJvcGVydHkpOiBOLkNsYXNzUHJvcGVydHkge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUNsYXNzUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eShcbiAgICAgIG5vZGU6IE4uQ2xhc3NQcml2YXRlUHJvcGVydHksXG4gICAgKTogTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy5mbG93UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQ2xhc3NQcml2YXRlUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGN1cnJlbnRseSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgYSBjbGFzcyBtZXRob2Qgd291bGQgYXBwZWFyXG4gICAgaXNDbGFzc01ldGhvZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Lmx0KSB8fCBzdXBlci5pc0NsYXNzTWV0aG9kKCk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGN1cnJlbnRseSBpbiB0aGUgcG9zaXRpb24gd2hlcmUgYSBjbGFzcyBwcm9wZXJ0eSB3b3VsZCBhcHBlYXJcbiAgICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuaXNDbGFzc1Byb3BlcnR5KCk7XG4gICAgfVxuXG4gICAgaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2Q6IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJvcGVydHkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhdGhpcy5tYXRjaCh0dC5jb2xvbikgJiYgc3VwZXIuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2QpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHR5cGUgcGFyYW1ldGVycyBmb3IgY2xhc3MgbWV0aG9kc1xuICAgIHB1c2hDbGFzc01ldGhvZChcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZXRob2Q6IE4uQ2xhc3NNZXRob2QsXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dzRGlyZWN0U3VwZXI6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoKG1ldGhvZCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgobWV0aG9kIGFzIGFueSkudmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSAobWV0aG9kIGFzIGFueSkudmFyaWFuY2U7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbWV0aG9kLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucHVzaENsYXNzTWV0aG9kKFxuICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzQ29uc3RydWN0b3IsXG4gICAgICAgIGFsbG93c0RpcmVjdFN1cGVyLFxuICAgICAgKTtcblxuICAgICAgaWYgKG1ldGhvZC5wYXJhbXMgJiYgaXNDb25zdHJ1Y3Rvcikge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXRob2QucGFyYW1zO1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5pc1RoaXNQYXJhbShwYXJhbXNbMF0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbUJhbm5lZEluQ29uc3RydWN0b3IsIHsgYXQ6IG1ldGhvZCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc3RyZWUgc3VwcG9ydFxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUyBkb2VzIG5vdCBrbm93IGFib3V0IHRoZSBmYWNlIHRoYXQgZXN0cmVlIGNhbiByZXBsYWNlIENsYXNzTWV0aG9kIHdpdGggTWV0aG9kRGVmaW5pdGlvblxuICAgICAgICBtZXRob2QudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiZcbiAgICAgICAgaXNDb25zdHJ1Y3RvciAmJlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGVzdHJlZVxuICAgICAgICBtZXRob2QudmFsdWUucGFyYW1zXG4gICAgICApIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBlc3RyZWVcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbWV0aG9kLnZhbHVlLnBhcmFtcztcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwICYmIHRoaXMuaXNUaGlzUGFyYW0ocGFyYW1zWzBdKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1CYW5uZWRJbkNvbnN0cnVjdG9yLCB7IGF0OiBtZXRob2QgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoQ2xhc3NQcml2YXRlTWV0aG9kKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1ldGhvZDogTi5DbGFzc1ByaXZhdGVNZXRob2QsXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoKG1ldGhvZCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgobWV0aG9kIGFzIGFueSkudmFyaWFuY2UubG9jLnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSAobWV0aG9kIGFzIGFueSkudmFyaWFuY2U7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbWV0aG9kLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIG1ldGhvZCwgaXNHZW5lcmF0b3IsIGlzQXN5bmMpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIGEgdGhlIHN1cGVyIGNsYXNzIHR5cGUgcGFyYW1ldGVycyBhbmQgaW1wbGVtZW50c1xuICAgIHBhcnNlQ2xhc3NTdXBlcihub2RlOiBOLkNsYXNzKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZUNsYXNzU3VwZXIobm9kZSk7XG4gICAgICBpZiAobm9kZS5zdXBlckNsYXNzICYmIHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIG5vZGUuc3VwZXJUeXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW1wbGVtZW50cykpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGNvbnN0IGltcGxlbWVudGVkOiBOLkZsb3dDbGFzc0ltcGxlbWVudHNbXSA9IChub2RlLmltcGxlbWVudHMgPSBbXSk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgICBub2RlLmlkID0gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcigvKmxpYmVyYWwqLyB0cnVlKTtcbiAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBsZW1lbnRlZC5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkNsYXNzSW1wbGVtZW50c1wiKSk7XG4gICAgICAgIH0gd2hpbGUgKHRoaXMuZWF0KHR0LmNvbW1hKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmNoZWNrR2V0dGVyU2V0dGVyUGFyYW1zKG1ldGhvZCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcbiAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pICYmIG1ldGhvZC5raW5kID09PSBcImdldFwiKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkdldHRlck1heU5vdEhhdmVUaGlzUGFyYW0sIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlNldHRlck1heU5vdEhhdmVUaGlzUGFyYW0sIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihcbiAgICAgIG5vZGU6IE4uT2JqZWN0T3JDbGFzc01lbWJlciB8IE4uQ2xhc3NNZW1iZXIsXG4gICAgKTogdm9pZCB7XG4gICAgICBub2RlLnZhcmlhbmNlID0gdGhpcy5mbG93UGFyc2VWYXJpYW5jZSgpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHR5cGUgcGFyYW1ldGVycyBmb3Igb2JqZWN0IG1ldGhvZCBzaG9ydGhhbmRcbiAgICBwYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5PYmplY3RNZXRob2QgfCBOLk9iamVjdFByb3BlcnR5IHtcbiAgICAgIGlmICgocHJvcCBhcyBhbnkpLnZhcmlhbmNlKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgocHJvcCBhcyBhbnkpLnZhcmlhbmNlLmxvYy5zdGFydCk7XG4gICAgICB9XG4gICAgICBkZWxldGUgKHByb3AgYXMgYW55KS52YXJpYW5jZTtcblxuICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzO1xuXG4gICAgICAvLyBtZXRob2Qgc2hvcnRoYW5kXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgJiYgIWlzQWNjZXNzb3IpIHtcbiAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLmZsb3dQYXJzZVR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2godHQucGFyZW5MKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlT2JqUHJvcFZhbHVlKFxuICAgICAgICBwcm9wLFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgaXNHZW5lcmF0b3IsXG4gICAgICAgIGlzQXN5bmMsXG4gICAgICAgIGlzUGF0dGVybixcbiAgICAgICAgaXNBY2Nlc3NvcixcbiAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICk7XG5cbiAgICAgIC8vIGFkZCB0eXBlUGFyYW1ldGVycyBpZiB3ZSBmb3VuZCB0aGVtXG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgKHJlc3VsdC52YWx1ZSB8fCByZXN1bHQpLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMocGFyYW06IE4uUGF0dGVybik6IE4uUGF0dGVybiB7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIGlmIChwYXJhbS50eXBlICE9PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5QYXR0ZXJuSXNPcHRpb25hbCwgeyBhdDogcGFyYW0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNUaGlzUGFyYW0ocGFyYW0pKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbU1heU5vdEJlT3B0aW9uYWwsIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgKHBhcmFtIGFzIGFueSBhcyBOLklkZW50aWZpZXIpLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmxvd1BhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RoaXNQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLlRoaXNQYXJhbUFubm90YXRpb25SZXF1aXJlZCwgeyBhdDogcGFyYW0gfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmVxKSAmJiB0aGlzLmlzVGhpc1BhcmFtKHBhcmFtKSkge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVGhpc1BhcmFtTm9EZWZhdWx0LCB7IGF0OiBwYXJhbSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNldEVuZExvY2F0aW9uKHBhcmFtKTtcbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG5cbiAgICBwYXJzZU1heWJlRGVmYXVsdChcbiAgICAgIHN0YXJ0TG9jPzogUG9zaXRpb24gfCBudWxsLFxuICAgICAgbGVmdD86IE4uUGF0dGVybiB8IG51bGwsXG4gICAgKTogTi5QYXR0ZXJuIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdXBlci5wYXJzZU1heWJlRGVmYXVsdChzdGFydExvYywgbGVmdCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgJiZcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiAmJlxuICAgICAgICBub2RlLnJpZ2h0LnN0YXJ0IDwgbm9kZS50eXBlQW5ub3RhdGlvbi5zdGFydFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UeXBlQmVmb3JlSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgICBhdDogbm9kZS50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICAgIHN1cGVyLmNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlKTtcbiAgICAgIGlmIChub2RlLm1vZHVsZSAmJiBub2RlLmltcG9ydEtpbmQgIT09IFwidmFsdWVcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuSW1wb3J0UmVmbGVjdGlvbkhhc0ltcG9ydFR5cGUsIHtcbiAgICAgICAgICBhdDogbm9kZS5zcGVjaWZpZXJzWzBdLmxvYy5zdGFydCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbDxcbiAgICAgIFQgZXh0ZW5kc1xuICAgICAgICB8IE4uSW1wb3J0U3BlY2lmaWVyXG4gICAgICAgIHwgTi5JbXBvcnREZWZhdWx0U3BlY2lmaWVyXG4gICAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gICAgPihub2RlOiBOLkltcG9ydERlY2xhcmF0aW9uLCBzcGVjaWZpZXI6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0pOiB2b2lkIHtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IGhhc1R5cGVJbXBvcnRLaW5kKG5vZGUpXG4gICAgICAgID8gdGhpcy5mbG93UGFyc2VSZXN0cmljdGVkSWRlbnRpZmllcihcbiAgICAgICAgICAgIC8qIGxpYmVyYWwgKi8gdHJ1ZSxcbiAgICAgICAgICAgIC8qIGRlY2xhcmF0aW9uICovIHRydWUsXG4gICAgICAgICAgKVxuICAgICAgICA6IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgIG5vZGUuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKHNwZWNpZmllciwgdHlwZSkpO1xuICAgIH1cblxuICAgIGlzUG90ZW50aWFsSW1wb3J0UGhhc2UoaXNFeHBvcnQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIGlmIChzdXBlci5pc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpKSB7XG4gICAgICAgIGlmICghaXNFeHBvcnQpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgcmV0dXJuIGNoID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2UgfHwgY2ggPT09IGNoYXJDb2Rlcy5hc3RlcmlzaztcbiAgICAgIH1cbiAgICAgIHJldHVybiAhaXNFeHBvcnQgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGVvZik7XG4gICAgfVxuXG4gICAgYXBwbHlJbXBvcnRQaGFzZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgICAgIGlzRXhwb3J0OiBib29sZWFuLFxuICAgICAgcGhhc2U6IHN0cmluZyB8IG51bGwsXG4gICAgICBsb2M/OiBQb3NpdGlvbixcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLmFwcGx5SW1wb3J0UGhhc2Uobm9kZSwgaXNFeHBvcnQsIHBoYXNlLCBsb2MpO1xuICAgICAgaWYgKGlzRXhwb3J0KSB7XG4gICAgICAgIGlmICghcGhhc2UgJiYgdGhpcy5tYXRjaCh0dC5fZGVmYXVsdCkpIHtcbiAgICAgICAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIG91ciBUUyBBU1QgYW5kIGFsd2F5cyBhZGQgLmV4cG9ydEtpbmRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKG5vZGUgYXMgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uKS5leHBvcnRLaW5kID1cbiAgICAgICAgICBwaGFzZSA9PT0gXCJ0eXBlXCIgPyBwaGFzZSA6IFwidmFsdWVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwaGFzZSA9PT0gXCJ0eXBlXCIgJiYgdGhpcy5tYXRjaCh0dC5zdGFyKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgIChub2RlIGFzIE4uSW1wb3J0RGVjbGFyYXRpb24pLmltcG9ydEtpbmQgPVxuICAgICAgICAgIHBoYXNlID09PSBcInR5cGVcIiB8fCBwaGFzZSA9PT0gXCJ0eXBlb2ZcIiA/IHBoYXNlIDogXCJ2YWx1ZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIGltcG9ydC10eXBlL3R5cGVvZiBzaG9ydGhhbmRcbiAgICBwYXJzZUltcG9ydFNwZWNpZmllcihcbiAgICAgIHNwZWNpZmllcjogYW55LFxuICAgICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgfCB1bmRlZmluZWQsXG4gICAgKTogTi5JbXBvcnRTcGVjaWZpZXIge1xuICAgICAgY29uc3QgZmlyc3RJZGVudCA9IHNwZWNpZmllci5pbXBvcnRlZDtcblxuICAgICAgbGV0IHNwZWNpZmllclR5cGVLaW5kID0gbnVsbDtcbiAgICAgIGlmIChmaXJzdElkZW50LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgIGlmIChmaXJzdElkZW50Lm5hbWUgPT09IFwidHlwZVwiKSB7XG4gICAgICAgICAgc3BlY2lmaWVyVHlwZUtpbmQgPSBcInR5cGVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChmaXJzdElkZW50Lm5hbWUgPT09IFwidHlwZW9mXCIpIHtcbiAgICAgICAgICBzcGVjaWZpZXJUeXBlS2luZCA9IFwidHlwZW9mXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGlzQmluZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hcykgJiYgIXRoaXMuaXNMb29rYWhlYWRDb250ZXh0dWFsKFwiYXNcIikpIHtcbiAgICAgICAgY29uc3QgYXNfaWRlbnQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWNpZmllclR5cGVLaW5kICE9PSBudWxsICYmXG4gICAgICAgICAgIXRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYGltcG9ydCB7dHlwZSBhcyAsYCBvciBgaW1wb3J0IHt0eXBlIGFzIH1gXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gYXNfaWRlbnQ7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBzcGVjaWZpZXJUeXBlS2luZDtcbiAgICAgICAgICBzcGVjaWZpZXIubG9jYWwgPSBjbG9uZUlkZW50aWZpZXIoYXNfaWRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGBpbXBvcnQge3R5cGUgYXMgZm9vYFxuICAgICAgICAgIHNwZWNpZmllci5pbXBvcnRlZCA9IGZpcnN0SWRlbnQ7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBudWxsO1xuICAgICAgICAgIHNwZWNpZmllci5sb2NhbCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzcGVjaWZpZXJUeXBlS2luZCAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYGltcG9ydCB7dHlwZSBmb29gXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBzcGVjaWZpZXJUeXBlS2luZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaW1wb3J0ZWRJc1N0cmluZykge1xuICAgICAgICAgICAgLyo6OiBpbnZhcmlhbnQoZmlyc3RJZGVudCBpbnN0YW5jZW9mIE4uU3RyaW5nTGl0ZXJhbCkgKi9cbiAgICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydEJpbmRpbmdJc1N0cmluZywge1xuICAgICAgICAgICAgICBhdDogc3BlY2lmaWVyLFxuICAgICAgICAgICAgICBpbXBvcnROYW1lOiBmaXJzdElkZW50LnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qOjogaW52YXJpYW50KGZpcnN0SWRlbnQgaW5zdGFuY2VvZiBOLk5vZGUpICovXG4gICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkID0gZmlyc3RJZGVudDtcbiAgICAgICAgICBzcGVjaWZpZXIuaW1wb3J0S2luZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgICAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQmluZGluZyA9IHRydWU7XG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsID0gY2xvbmVJZGVudGlmaWVyKHNwZWNpZmllci5pbXBvcnRlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWVySXNUeXBlSW1wb3J0ID0gaGFzVHlwZUltcG9ydEtpbmQoc3BlY2lmaWVyKTtcblxuICAgICAgaWYgKGlzSW5UeXBlT25seUltcG9ydCAmJiBzcGVjaWZpZXJJc1R5cGVJbXBvcnQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkltcG9ydFR5cGVTaG9ydGhhbmRPbmx5SW5QdXJlSW1wb3J0LCB7XG4gICAgICAgICAgYXQ6IHNwZWNpZmllcixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0luVHlwZU9ubHlJbXBvcnQgfHwgc3BlY2lmaWVySXNUeXBlSW1wb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFR5cGUoXG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsLm5hbWUsXG4gICAgICAgICAgc3BlY2lmaWVyLmxvY2FsLmxvYy5zdGFydCxcbiAgICAgICAgICAvKiBkZWNsYXJhdGlvbiAqLyB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCaW5kaW5nICYmICFpc0luVHlwZU9ubHlJbXBvcnQgJiYgIXNwZWNpZmllcklzVHlwZUltcG9ydCkge1xuICAgICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgICAgICAgIHNwZWNpZmllci5sb2NhbC5uYW1lLFxuICAgICAgICAgIHNwZWNpZmllci5sb2Muc3RhcnQsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hJbXBvcnRTcGVjaWZpZXIoc3BlY2lmaWVyLCBcIkltcG9ydFNwZWNpZmllclwiKTtcbiAgICB9XG5cbiAgICBwYXJzZUJpbmRpbmdBdG9tKCk6IE4uUGF0dGVybiB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0Ll90aGlzOlxuICAgICAgICAgIC8vIFwidGhpc1wiIG1heSBiZSB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlciwgc28gYWxsb3cgaXQuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJZGVudGlmaWVyKC8qIGxpYmVyYWwgKi8gdHJ1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQmluZGluZ0F0b20oKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZSBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlcnMgLSBmdW5jdGlvbiBmb288VD4oKSB7fVxuICAgIHBhcnNlRnVuY3Rpb25QYXJhbXMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBraW5kIG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgY29uc3Qga2luZCA9IG5vZGUua2luZDtcbiAgICAgIGlmIChraW5kICE9PSBcImdldFwiICYmIGtpbmQgIT09IFwic2V0XCIgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG4gICAgICB9XG4gICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUsIGlzQ29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIGZsb3cgdHlwZSBhbm5vdGF0aW9ucyBvbiB2YXJpYWJsZSBkZWNsYXJhdG9yIGhlYWRzIC0gbGV0IGZvbzogc3RyaW5nID0gYmFyXG4gICAgcGFyc2VWYXJJZChcbiAgICAgIGRlY2w6IE4uVmFyaWFibGVEZWNsYXJhdG9yLFxuICAgICAga2luZDogXCJ2YXJcIiB8IFwibGV0XCIgfCBcImNvbnN0XCIsXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5wYXJzZVZhcklkKGRlY2wsIGtpbmQpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgIGRlY2wuaWQudHlwZUFubm90YXRpb24gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihkZWNsLmlkKTsgLy8gc2V0IGVuZCBwb3NpdGlvbiB0byBlbmQgb2YgdHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSByZXR1cm4gdHlwZSBvZiBhbiBhc3luYyBhcnJvdyBmdW5jdGlvbiAtIGxldCBmb28gPSAoYXN5bmMgKCk6IG51bWJlciA9PiB7fSk7XG4gICAgcGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKFxuICAgICAgbm9kZTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbixcbiAgICAgIGNhbGw6IE4uQ2FsbEV4cHJlc3Npb24sXG4gICAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgY29uc3Qgb2xkTm9Bbm9uRnVuY3Rpb25UeXBlID0gdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGU7XG4gICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLnJldHVyblR5cGUgPSB0aGlzLmZsb3dQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gb2xkTm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKG5vZGUsIGNhbGwpO1xuICAgIH1cblxuICAgIC8vIHRvZG8gZGVzY3JpcHRpb25cbiAgICBzaG91bGRQYXJzZUFzeW5jQXJyb3coKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuc2hvdWxkUGFyc2VBc3luY0Fycm93KCk7XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byBzdXBwb3J0IHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBmb3IgYXJyb3cgZnVuY3Rpb25zLiBUaGlzXG4gICAgLy8gaXMgdHJpY2t5LiBUaGVyZSBhcmUgdGhyZWUgc2l0dWF0aW9ucyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgIC8vXG4gICAgLy8gMS4gVGhpcyBpcyBlaXRoZXIgSlNYIG9yIGFuIGFycm93IGZ1bmN0aW9uLiBXZSdsbCB0cnkgSlNYIGZpcnN0LiBJZiB0aGF0XG4gICAgLy8gICAgZmFpbHMsIHdlJ2xsIHRyeSBhbiBhcnJvdyBmdW5jdGlvbi4gSWYgdGhhdCBmYWlscywgd2UnbGwgdGhyb3cgdGhlIEpTWFxuICAgIC8vICAgIGVycm9yLlxuICAgIC8vIDIuIFRoaXMgaXMgYW4gYXJyb3cgZnVuY3Rpb24uIFdlJ2xsIHBhcnNlIHRoZSB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbixcbiAgICAvLyAgICBwYXJzZSB0aGUgcmVzdCwgbWFrZSBzdXJlIHRoZSByZXN0IGlzIGFuIGFycm93IGZ1bmN0aW9uLCBhbmQgZ28gZnJvbVxuICAgIC8vICAgIHRoZXJlXG4gICAgLy8gMy4gVGhpcyBpcyBuZWl0aGVyLiBKdXN0IGNhbGwgdGhlIHN1cGVyIG1ldGhvZFxuICAgIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBsZXQgc3RhdGUgPSBudWxsO1xuXG4gICAgICBsZXQganN4O1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmXG4gICAgICAgICh0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSlcbiAgICAgICkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcblxuICAgICAgICBqc3ggPSB0aGlzLnRyeVBhcnNlKFxuICAgICAgICAgICgpID0+IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24ocmVmRXhwcmVzc2lvbkVycm9ycywgYWZ0ZXJMZWZ0UGFyc2UpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qOjogaW52YXJpYW50KCFqc3guYWJvcnRlZCkgKi9cbiAgICAgICAgLyo6OiBpbnZhcmlhbnQoanN4Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgICAgaWYgKCFqc3guZXJyb3IpIHJldHVybiBqc3gubm9kZTtcblxuICAgICAgICAvLyBSZW1vdmUgYHRjLmpfZXhwcmAgYW5kIGB0Yy5qX29UYWdgIGZyb20gY29udGV4dCBhZGRlZFxuICAgICAgICAvLyBieSBwYXJzaW5nIGBqc3hUYWdTdGFydGAgdG8gc3RvcCB0aGUgSlNYIHBsdWdpbiBmcm9tXG4gICAgICAgIC8vIG1lc3Npbmcgd2l0aCB0aGUgdG9rZW5zXG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dCA9PT0gdGMual9vVGFnIHx8IGN1cnJlbnRDb250ZXh0ID09PSB0Yy5qX2V4cHIpIHtcbiAgICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChqc3g/LmVycm9yIHx8IHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHN0YXRlID0gc3RhdGUgfHwgdGhpcy5zdGF0ZS5jbG9uZSgpO1xuXG4gICAgICAgIGxldCB0eXBlUGFyYW1ldGVyczogTi5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247XG5cbiAgICAgICAgY29uc3QgYXJyb3cgPSB0aGlzLnRyeVBhcnNlKGFib3J0ID0+IHtcbiAgICAgICAgICB0eXBlUGFyYW1ldGVycyA9IHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCk7XG5cbiAgICAgICAgICBjb25zdCBhcnJvd0V4cHJlc3Npb24gPSB0aGlzLmZvcndhcmROb0Fycm93UGFyYW1zQ29udmVyc2lvbkF0KFxuICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgICAgICAgICBhZnRlckxlZnRQYXJzZSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHJlc3VsdCwgdHlwZVBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyA8VD4oKCkgPT4ge30pO1xuICAgICAgICAgIC8vIDxUPigoKSA9PiB7fTogYW55KTtcbiAgICAgICAgICBpZiAoYXJyb3dFeHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkKSBhYm9ydCgpO1xuXG4gICAgICAgICAgLy8gVGhlIGFib3ZlIGNhbiByZXR1cm4gYSBUeXBlQ2FzdEV4cHJlc3Npb24gd2hlbiB0aGUgYXJyb3dcbiAgICAgICAgICAvLyBleHByZXNzaW9uIGlzIG5vdCB3cmFwcGVkIGluIHBhcmVucy4gU2VlIGFsc28gYHRoaXMucGFyc2VQYXJlbkl0ZW1gLlxuICAgICAgICAgIC8vICg8VD4oKSA9PiB7fTogYW55KTtcbiAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5tYXliZVVud3JhcFR5cGVDYXN0RXhwcmVzc2lvbihhcnJvd0V4cHJlc3Npb24pO1xuXG4gICAgICAgICAgaWYgKGV4cHIudHlwZSAhPT0gXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKSBhYm9ydCgpO1xuXG4gICAgICAgICAgZXhwci50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuICAgICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUoZXhwciwgdHlwZVBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgcmV0dXJuIGFycm93RXhwcmVzc2lvbjtcbiAgICAgICAgfSwgc3RhdGUpO1xuXG4gICAgICAgIGxldCBhcnJvd0V4cHJlc3Npb246XG4gICAgICAgICAgfCBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uXG4gICAgICAgICAgfCBOLlR5cGVDYXN0RXhwcmVzc2lvblxuICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgICAgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYXJyb3cubm9kZSAmJlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgdGhpcy5tYXliZVVud3JhcFR5cGVDYXN0RXhwcmVzc2lvbihhcnJvdy5ub2RlKS50eXBlID09PVxuICAgICAgICAgICAgXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICghYXJyb3cuZXJyb3IgJiYgIWFycm93LmFib3J0ZWQpIHtcbiAgICAgICAgICAgIC8vIDxUPiBhc3luYyAoKSA9PiB7fVxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHRyeVBhcnNlIHR5cGluZ3NcbiAgICAgICAgICAgIGlmIChhcnJvdy5ub2RlLmFzeW5jKSB7XG4gICAgICAgICAgICAgIC8qOjogaW52YXJpYW50KHR5cGVQYXJhbWV0ZXJzKSAqL1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgICAgICAgIEZsb3dFcnJvcnMuVW5leHBlY3RlZFR5cGVQYXJhbWV0ZXJCZWZvcmVBc3luY0Fycm93RnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgeyBhdDogdHlwZVBhcmFtZXRlcnMgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgICByZXR1cm4gYXJyb3cubm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICAgIGFycm93RXhwcmVzc2lvbiA9IGFycm93Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgYm90aCBKU1ggYW5kIEZsb3cgcGFyc2luZyBhdHRlbXB0cyBmYWlsZWQuXG4gICAgICAgIC8vIEdpdmUgdGhlIHByZWNlZGVuY2UgdG8gdGhlIEpTWCBlcnJvciwgZXhjZXB0IGlmIEpTWCBoYWQgYW5cbiAgICAgICAgLy8gdW5yZWNvdmVyYWJsZSBlcnJvciB3aGlsZSBGbG93IGRpZG4ndC5cbiAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIHJlY292ZXJhYmxlLCB3ZSBjYW4gb25seSByZS1yZXBvcnQgaXQgaWYgdGhlcmUgaXNcbiAgICAgICAgLy8gYSBub2RlIHdlIGNhbiByZXR1cm4uXG5cbiAgICAgICAgaWYgKGpzeD8ubm9kZSkge1xuICAgICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5mYWlsU3RhdGUpICovXG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IGpzeC5mYWlsU3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGpzeC5ub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycm93RXhwcmVzc2lvbikge1xuICAgICAgICAgIC8qOjogaW52YXJpYW50KGFycm93LmZhaWxTdGF0ZSkgKi9cbiAgICAgICAgICB0aGlzLnN0YXRlID0gYXJyb3cuZmFpbFN0YXRlO1xuICAgICAgICAgIHJldHVybiBhcnJvd0V4cHJlc3Npb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanN4Py50aHJvd24pIHRocm93IGpzeC5lcnJvcjtcbiAgICAgICAgaWYgKGFycm93LnRocm93bikgdGhyb3cgYXJyb3cuZXJyb3I7XG5cbiAgICAgICAgLyo6OiBpbnZhcmlhbnQodHlwZVBhcmFtZXRlcnMpICovXG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRmxvd0Vycm9ycy5VbmV4cGVjdGVkVG9rZW5BZnRlclR5cGVQYXJhbWV0ZXIsIHtcbiAgICAgICAgICBhdDogdHlwZVBhcmFtZXRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIHJldHVybiB0eXBlcyBmb3IgYXJyb3cgZnVuY3Rpb25zXG4gICAgcGFyc2VBcnJvdyhcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgICApOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHJ5UGFyc2UoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9sZE5vQW5vbkZ1bmN0aW9uVHlwZSA9IHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlO1xuICAgICAgICAgIHRoaXMuc3RhdGUubm9Bbm9uRnVuY3Rpb25UeXBlID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IHR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5UeXBlQW5ub3RhdGlvbj4oKTtcblxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHR5cGVOb2RlLnR5cGVBbm5vdGF0aW9uLFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAoZGVzdHJ1Y3R1cmluZyBub3Qgc3VwcG9ydGVkIHlldClcbiAgICAgICAgICAgIG5vZGUucHJlZGljYXRlLFxuICAgICAgICAgIF0gPSB0aGlzLmZsb3dQYXJzZVR5cGVBbmRQcmVkaWNhdGVJbml0aWFsaXNlcigpO1xuXG4gICAgICAgICAgdGhpcy5zdGF0ZS5ub0Fub25GdW5jdGlvblR5cGUgPSBvbGROb0Fub25GdW5jdGlvblR5cGU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKSkgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LmFycm93KSkgdGhpcy51bmV4cGVjdGVkKCk7XG5cbiAgICAgICAgICByZXR1cm4gdHlwZU5vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQudGhyb3duKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLyo6OiBpbnZhcmlhbnQocmVzdWx0Lm5vZGUpICovXG5cbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG5cbiAgICAgICAgLy8gYXNzaWduIGFmdGVyIGl0IGlzIGNsZWFyIGl0IGlzIGFuIGFycm93XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgbm9kZS5yZXR1cm5UeXBlID0gcmVzdWx0Lm5vZGUudHlwZUFubm90YXRpb25cbiAgICAgICAgICA/IHRoaXMuZmluaXNoTm9kZShyZXN1bHQubm9kZSwgXCJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQXJyb3cobm9kZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VBcnJvdyhwYXJhbXM6IEFycmF5PE4uTm9kZT4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmNvbG9uKSB8fCBzdXBlci5zaG91bGRQYXJzZUFycm93KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgICBub2RlOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uLFxuICAgICAgcGFyYW1zOiBOLlBhdHRlcm5bXSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLm5vQXJyb3dQYXJhbXNDb252ZXJzaW9uQXQuaW5kZXhPZihub2RlLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgbm9kZS5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlci5zZXRBcnJvd0Z1bmN0aW9uUGFyYW1ldGVycyhub2RlLCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrUGFyYW1zKFxuICAgICAgbm9kZTogTi5GdW5jdGlvbixcbiAgICAgIGFsbG93RHVwbGljYXRlczogYm9vbGVhbixcbiAgICAgIGlzQXJyb3dGdW5jdGlvbj86IGJvb2xlYW4gfCBudWxsLFxuICAgICAgc3RyaWN0TW9kZUNoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICBpc0Fycm93RnVuY3Rpb24gJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5ub0Fycm93UGFyYW1zQ29udmVyc2lvbkF0LmluZGV4T2Yobm9kZS5zdGFydCkgIT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhlIGB0aGlzYCBwYXJhbSBpcyBmaXJzdCwgaWYgaXQgZXhpc3RzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVGhpc1BhcmFtKG5vZGUucGFyYW1zW2ldKSAmJiBpID4gMCkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5UaGlzUGFyYW1NdXN0QmVGaXJzdCwgeyBhdDogbm9kZS5wYXJhbXNbaV0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3VwZXIuY2hlY2tQYXJhbXMoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGFsbG93RHVwbGljYXRlcyxcbiAgICAgICAgaXNBcnJvd0Z1bmN0aW9uLFxuICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93OiBib29sZWFuKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uKFxuICAgICAgICBjYW5CZUFycm93ICYmIHRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2YodGhpcy5zdGF0ZS5zdGFydCkgPT09IC0xLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZVN1YnNjcmlwdHMoXG4gICAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG5cbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIG5vQ2FsbHM/OiBib29sZWFuIHwgbnVsbCxcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgaWYgKFxuICAgICAgICBiYXNlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgIGJhc2UubmFtZSA9PT0gXCJhc3luY1wiICYmXG4gICAgICAgIHRoaXMuc3RhdGUubm9BcnJvd0F0LmluZGV4T2Yoc3RhcnRMb2MuaW5kZXgpICE9PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0TG9jKTtcbiAgICAgICAgbm9kZS5jYWxsZWUgPSBiYXNlO1xuICAgICAgICBub2RlLmFyZ3VtZW50cyA9IHN1cGVyLnBhcnNlQ2FsbEV4cHJlc3Npb25Bcmd1bWVudHModHQucGFyZW5SLCBmYWxzZSk7XG4gICAgICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGJhc2UudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgICAgdGhpcy5tYXRjaCh0dC5sdClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgYXJyb3cgPSB0aGlzLnRyeVBhcnNlKFxuICAgICAgICAgIGFib3J0ID0+IHRoaXMucGFyc2VBc3luY0Fycm93V2l0aFR5cGVQYXJhbWV0ZXJzKHN0YXJ0TG9jKSB8fCBhYm9ydCgpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qOjogaW52YXJpYW50KGFycm93Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcmVmaW5lIHRyeVBhcnNlIHR5cGluZ3NcbiAgICAgICAgaWYgKCFhcnJvdy5lcnJvciAmJiAhYXJyb3cuYWJvcnRlZCkgcmV0dXJuIGFycm93Lm5vZGU7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cnlQYXJzZShcbiAgICAgICAgICAoKSA9PiBzdXBlci5wYXJzZVN1YnNjcmlwdHMoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMpLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQubm9kZSAmJiAhcmVzdWx0LmVycm9yKSByZXR1cm4gcmVzdWx0Lm5vZGU7XG5cbiAgICAgICAgaWYgKGFycm93Lm5vZGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gYXJyb3cuZmFpbFN0YXRlO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0cnlQYXJzZSB0eXBpbmdzXG4gICAgICAgICAgcmV0dXJuIGFycm93Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0Lm5vZGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gcmVzdWx0LmZhaWxTdGF0ZTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0Lm5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBhcnJvdy5lcnJvciB8fCByZXN1bHQuZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVN1YnNjcmlwdHMoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMpO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIHN1YnNjcmlwdFN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnF1ZXN0aW9uRG90KSAmJiB0aGlzLmlzTG9va2FoZWFkVG9rZW5fbHQoKSkge1xuICAgICAgICBzdWJzY3JpcHRTdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vQ2FsbHMpIHtcbiAgICAgICAgICBzdWJzY3JpcHRTdGF0ZS5zdG9wID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5PcHRpb25hbENhbGxFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICAgIG5vZGUuY2FsbGVlID0gYmFzZTtcbiAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzID0gdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbigpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICBub2RlLmFyZ3VtZW50cyA9IHRoaXMucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyh0dC5wYXJlblIsIGZhbHNlKTtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKG5vZGUsIC8qIG9wdGlvbmFsICovIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghbm9DYWxscyAmJiB0aGlzLnNob3VsZFBhcnNlVHlwZXMoKSAmJiB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxcbiAgICAgICAgICBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24gfCBOLkNhbGxFeHByZXNzaW9uXG4gICAgICAgID4oc3RhcnRMb2MpO1xuICAgICAgICBub2RlLmNhbGxlZSA9IGJhc2U7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cnlQYXJzZSgoKSA9PiB7XG4gICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzID1cbiAgICAgICAgICAgIHRoaXMuZmxvd1BhcnNlVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25DYWxsT3JOZXcoKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICAgIG5vZGUuYXJndW1lbnRzID0gc3VwZXIucGFyc2VDYWxsRXhwcmVzc2lvbkFyZ3VtZW50cyh0dC5wYXJlblIsIGZhbHNlKTtcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0U3RhdGUub3B0aW9uYWxDaGFpbk1lbWJlcikge1xuICAgICAgICAgICAgKG5vZGUgYXMgVW5kb25lPE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4pLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdFN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5ub2RlKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5ub2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZVN1YnNjcmlwdChcbiAgICAgICAgYmFzZSxcblxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgbm9DYWxscyxcbiAgICAgICAgc3Vic2NyaXB0U3RhdGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlTmV3Q2FsbGVlKG5vZGU6IE4uTmV3RXhwcmVzc2lvbik6IHZvaWQge1xuICAgICAgc3VwZXIucGFyc2VOZXdDYWxsZWUobm9kZSk7XG5cbiAgICAgIGxldCB0YXJncyA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zaG91bGRQYXJzZVR5cGVzKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgdGFyZ3MgPSB0aGlzLnRyeVBhcnNlKCgpID0+XG4gICAgICAgICAgdGhpcy5mbG93UGFyc2VUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbkNhbGxPck5ldygpLFxuICAgICAgICApLm5vZGU7XG4gICAgICB9XG4gICAgICBub2RlLnR5cGVBcmd1bWVudHMgPSB0YXJncztcbiAgICB9XG5cbiAgICBwYXJzZUFzeW5jQXJyb3dXaXRoVHlwZVBhcmFtZXRlcnMoXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgdGhpcy5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUsIGZhbHNlKTtcbiAgICAgIGlmICghdGhpcy5wYXJzZUFycm93KG5vZGUpKSByZXR1cm47XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBcnJvd0V4cHJlc3Npb24oXG4gICAgICAgIG5vZGUsXG4gICAgICAgIC8qIHBhcmFtcyAqLyB1bmRlZmluZWQsXG4gICAgICAgIC8qIGlzQXN5bmMgKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpO1xuICAgICAgaWYgKFxuICAgICAgICBjb2RlID09PSBjaGFyQ29kZXMuYXN0ZXJpc2sgJiZcbiAgICAgICAgbmV4dCA9PT0gY2hhckNvZGVzLnNsYXNoICYmXG4gICAgICAgIHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnN0YXRlLmhhc0Zsb3dDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zICs9IDI7XG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VwZXIucmVhZFRva2VuX211bHRfbW9kdWxvKGNvZGUpO1xuICAgIH1cblxuICAgIHJlYWRUb2tlbl9waXBlX2FtcChjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5zdGF0ZS5wb3MgKyAxKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLnZlcnRpY2FsQmFyICYmXG4gICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5yaWdodEN1cmx5QnJhY2VcbiAgICAgICkge1xuICAgICAgICAvLyAnfH0nXG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQuYnJhY2VCYXJSLCAyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdXBlci5yZWFkVG9rZW5fcGlwZV9hbXAoY29kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VUb3BMZXZlbChmaWxlOiBOLkZpbGUsIHByb2dyYW06IE4uUHJvZ3JhbSk6IE4uRmlsZSB7XG4gICAgICBjb25zdCBmaWxlTm9kZSA9IHN1cGVyLnBhcnNlVG9wTGV2ZWwoZmlsZSwgcHJvZ3JhbSk7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCkge1xuICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuVW50ZXJtaW5hdGVkRmxvd0NvbW1lbnQsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWxlTm9kZTtcbiAgICB9XG5cbiAgICBza2lwQmxvY2tDb21tZW50KCk6IE4uQ29tbWVudEJsb2NrIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImZsb3dDb21tZW50c1wiKSAmJiB0aGlzLnNraXBGbG93Q29tbWVudCgpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmhhc0Zsb3dDb21tZW50KSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLk5lc3RlZEZsb3dDb21tZW50LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc0Zsb3dDb21tZW50Q29tcGxldGlvbigpO1xuICAgICAgICBjb25zdCBjb21tZW50U2tpcCA9IHRoaXMuc2tpcEZsb3dDb21tZW50KCk7XG4gICAgICAgIGlmIChjb21tZW50U2tpcCkge1xuICAgICAgICAgIHRoaXMuc3RhdGUucG9zICs9IGNvbW1lbnRTa2lwO1xuICAgICAgICAgIHRoaXMuc3RhdGUuaGFzRmxvd0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnNraXBCbG9ja0NvbW1lbnQodGhpcy5zdGF0ZS5oYXNGbG93Q29tbWVudCA/IFwiKi0vXCIgOiBcIiovXCIpO1xuICAgIH1cblxuICAgIHNraXBGbG93Q29tbWVudCgpOiBudW1iZXIgfCBmYWxzZSB7XG4gICAgICBjb25zdCB7IHBvcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGxldCBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlID0gMjtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgW2NoYXJDb2Rlcy5zcGFjZSwgY2hhckNvZGVzLnRhYl0uaW5jbHVkZXMoXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0ZXN0aW5nIHdoZXRoZXIgYSBudW1iZXIgaXMgaW5jbHVkZWRcbiAgICAgICAgICB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zICsgc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSksXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlKys7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoMiA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zKTtcbiAgICAgIGNvbnN0IGNoMyA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zICsgMSk7XG5cbiAgICAgIGlmIChjaDIgPT09IGNoYXJDb2Rlcy5jb2xvbiAmJiBjaDMgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIDI7IC8vIGNoZWNrIGZvciAvKjo6XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaW5wdXQuc2xpY2UoXG4gICAgICAgICAgc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIHBvcyxcbiAgICAgICAgICBzaGlmdFRvRmlyc3ROb25XaGl0ZVNwYWNlICsgcG9zICsgMTIsXG4gICAgICAgICkgPT09IFwiZmxvdy1pbmNsdWRlXCJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZSArIDEyOyAvLyBjaGVjayBmb3IgLypmbG93LWluY2x1ZGVcbiAgICAgIH1cbiAgICAgIGlmIChjaDIgPT09IGNoYXJDb2Rlcy5jb2xvbiAmJiBjaDMgIT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICByZXR1cm4gc2hpZnRUb0ZpcnN0Tm9uV2hpdGVTcGFjZTsgLy8gY2hlY2sgZm9yIC8qOiwgYWR2YW5jZSB1cCB0byA6XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzRmxvd0NvbW1lbnRDb21wbGV0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dC5pbmRleE9mKFwiKi9cIiwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW50ZXJtaW5hdGVkQ29tbWVudCwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZsb3cgZW51bSBwYXJzaW5nXG5cbiAgICBmbG93RW51bUVycm9yQm9vbGVhbk1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIG1lbWJlck5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICAgIH0sXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUJvb2xlYW5NZW1iZXJOb3RJbml0aWFsaXplZCwge1xuICAgICAgICBhdDogbG9jLFxuICAgICAgICBtZW1iZXJOYW1lLFxuICAgICAgICBlbnVtTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsb3dFbnVtRXJyb3JJbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXIoXG4gICAgICBsb2M6IFBvc2l0aW9uLFxuICAgICAgZW51bUNvbnRleHQ6IEVudW1Db250ZXh0LFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucmFpc2UoXG4gICAgICAgICFlbnVtQ29udGV4dC5leHBsaWNpdFR5cGVcbiAgICAgICAgICA/IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclVua25vd25UeXBlXG4gICAgICAgICAgOiBlbnVtQ29udGV4dC5leHBsaWNpdFR5cGUgPT09IFwic3ltYm9sXCJcbiAgICAgICAgICA/IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclN5bWJvbFR5cGVcbiAgICAgICAgICA6IEZsb3dFcnJvcnMuRW51bUludmFsaWRNZW1iZXJJbml0aWFsaXplclByaW1hcnlUeXBlLFxuICAgICAgICB7XG4gICAgICAgICAgYXQ6IGxvYyxcbiAgICAgICAgICAuLi5lbnVtQ29udGV4dCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZmxvd0VudW1FcnJvck51bWJlck1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIG1lbWJlck5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICAgIG1lbWJlck5hbWU6IHN0cmluZztcbiAgICAgIH0sXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bU51bWJlck1lbWJlck5vdEluaXRpYWxpemVkLCB7XG4gICAgICAgIGF0OiBsb2MsXG4gICAgICAgIGVudW1OYW1lLFxuICAgICAgICBtZW1iZXJOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxvd0VudW1FcnJvclN0cmluZ01lbWJlckluY29uc2lzdGVudGx5SW5pdGFpbGl6ZWQoXG4gICAgICBub2RlOiBOLk5vZGUsXG4gICAgICB7XG4gICAgICAgIGVudW1OYW1lLFxuICAgICAgfToge1xuICAgICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICApOiB2b2lkIHtcbiAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5FbnVtU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZCwge1xuICAgICAgICBhdDogbm9kZSxcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmbG93RW51bU1lbWJlckluaXQoKTogRW51bU1lbWJlckluaXQge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgY29uc3QgZW5kT2ZJbml0ID0gKCkgPT4gdGhpcy5tYXRjaCh0dC5jb21tYSkgfHwgdGhpcy5tYXRjaCh0dC5icmFjZVIpO1xuICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSB0dC5udW06IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID0gdGhpcy5wYXJzZU51bWVyaWNMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgICAgIGlmIChlbmRPZkluaXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJudW1iZXJcIiwgbG9jOiBsaXRlcmFsLmxvYy5zdGFydCwgdmFsdWU6IGxpdGVyYWwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbnZhbGlkXCIsIGxvYzogc3RhcnRMb2MgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHR0LnN0cmluZzoge1xuICAgICAgICAgIGNvbnN0IGxpdGVyYWwgPSB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCh0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICAgICAgICBpZiAoZW5kT2ZJbml0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIGxvYzogbGl0ZXJhbC5sb2Muc3RhcnQsIHZhbHVlOiBsaXRlcmFsIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW52YWxpZFwiLCBsb2M6IHN0YXJ0TG9jIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSB0dC5fdHJ1ZTpcbiAgICAgICAgY2FzZSB0dC5fZmFsc2U6IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID0gdGhpcy5wYXJzZUJvb2xlYW5MaXRlcmFsKHRoaXMubWF0Y2godHQuX3RydWUpKTtcbiAgICAgICAgICBpZiAoZW5kT2ZJbml0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgICBsb2M6IGxpdGVyYWwubG9jLnN0YXJ0LFxuICAgICAgICAgICAgICB2YWx1ZTogbGl0ZXJhbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW52YWxpZFwiLCBsb2M6IHN0YXJ0TG9jIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImludmFsaWRcIiwgbG9jOiBzdGFydExvYyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dFbnVtTWVtYmVyUmF3KCk6IHtcbiAgICAgIGlkOiBOLk5vZGU7XG4gICAgICBpbml0OiBFbnVtTWVtYmVySW5pdDtcbiAgICB9IHtcbiAgICAgIGNvbnN0IGxvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgY29uc3QgaW5pdCA9IHRoaXMuZWF0KHR0LmVxKVxuICAgICAgICA/IHRoaXMuZmxvd0VudW1NZW1iZXJJbml0KClcbiAgICAgICAgOiB7IHR5cGU6IFwibm9uZVwiIGFzIGNvbnN0LCBsb2MgfTtcbiAgICAgIHJldHVybiB7IGlkLCBpbml0IH07XG4gICAgfVxuXG4gICAgZmxvd0VudW1DaGVja0V4cGxpY2l0VHlwZU1pc21hdGNoKFxuICAgICAgbG9jOiBQb3NpdGlvbixcbiAgICAgIGNvbnRleHQ6IEVudW1Db250ZXh0LFxuICAgICAgZXhwZWN0ZWRUeXBlOiBFbnVtRXhwbGljaXRUeXBlLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgeyBleHBsaWNpdFR5cGUgfSA9IGNvbnRleHQ7XG4gICAgICBpZiAoZXhwbGljaXRUeXBlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChleHBsaWNpdFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JJbnZhbGlkTWVtYmVySW5pdGlhbGl6ZXIobG9jLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbG93RW51bU1lbWJlcnMoe1xuICAgICAgZW51bU5hbWUsXG4gICAgICBleHBsaWNpdFR5cGUsXG4gICAgfToge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGV4cGxpY2l0VHlwZTogRW51bUV4cGxpY2l0VHlwZTtcbiAgICB9KToge1xuICAgICAgbWVtYmVyczoge1xuICAgICAgICBib29sZWFuTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgbnVtYmVyTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgc3RyaW5nTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgICAgZGVmYXVsdGVkTWVtYmVyczogQXJyYXk8Ti5Ob2RlPjtcbiAgICAgIH07XG4gICAgICBoYXNVbmtub3duTWVtYmVyczogYm9vbGVhbjtcbiAgICB9IHtcbiAgICAgIGNvbnN0IHNlZW5OYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgYm9vbGVhbk1lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIG51bWJlck1lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIHN0cmluZ01lbWJlcnM6IFtdLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIGRlZmF1bHRlZE1lbWJlcnM6IFtdLFxuICAgICAgfTtcbiAgICAgIGxldCBoYXNVbmtub3duTWVtYmVycyA9IGZhbHNlO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmVsbGlwc2lzKSkge1xuICAgICAgICAgIGhhc1Vua25vd25NZW1iZXJzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZW1iZXJOb2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgY29uc3QgeyBpZCwgaW5pdCB9ID0gdGhpcy5mbG93RW51bU1lbWJlclJhdygpO1xuICAgICAgICBjb25zdCBtZW1iZXJOYW1lID0gaWQubmFtZTtcbiAgICAgICAgaWYgKG1lbWJlck5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoL15bYS16XS8udGVzdChtZW1iZXJOYW1lKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRmxvd0Vycm9ycy5FbnVtSW52YWxpZE1lbWJlck5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBpZCxcbiAgICAgICAgICAgIG1lbWJlck5hbWUsXG4gICAgICAgICAgICBzdWdnZXN0aW9uOiBtZW1iZXJOYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBtZW1iZXJOYW1lLnNsaWNlKDEpLFxuICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZW5OYW1lcy5oYXMobWVtYmVyTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUR1cGxpY2F0ZU1lbWJlck5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBpZCxcbiAgICAgICAgICAgIG1lbWJlck5hbWUsXG4gICAgICAgICAgICBlbnVtTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuTmFtZXMuYWRkKG1lbWJlck5hbWUpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0geyBlbnVtTmFtZSwgZXhwbGljaXRUeXBlLCBtZW1iZXJOYW1lIH07XG4gICAgICAgIG1lbWJlck5vZGUuaWQgPSBpZDtcbiAgICAgICAgc3dpdGNoIChpbml0LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgICAgICB0aGlzLmZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaChcbiAgICAgICAgICAgICAgaW5pdC5sb2MsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1lbWJlck5vZGUuaW5pdCA9IGluaXQudmFsdWU7XG4gICAgICAgICAgICBtZW1iZXJzLmJvb2xlYW5NZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTm9kZShtZW1iZXJOb2RlLCBcIkVudW1Cb29sZWFuTWVtYmVyXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICAgIHRoaXMuZmxvd0VudW1DaGVja0V4cGxpY2l0VHlwZU1pc21hdGNoKGluaXQubG9jLCBjb250ZXh0LCBcIm51bWJlclwiKTtcbiAgICAgICAgICAgIG1lbWJlck5vZGUuaW5pdCA9IGluaXQudmFsdWU7XG4gICAgICAgICAgICBtZW1iZXJzLm51bWJlck1lbWJlcnMucHVzaChcbiAgICAgICAgICAgICAgdGhpcy5maW5pc2hOb2RlKG1lbWJlck5vZGUsIFwiRW51bU51bWJlck1lbWJlclwiKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiB7XG4gICAgICAgICAgICB0aGlzLmZsb3dFbnVtQ2hlY2tFeHBsaWNpdFR5cGVNaXNtYXRjaChpbml0LmxvYywgY29udGV4dCwgXCJzdHJpbmdcIik7XG4gICAgICAgICAgICBtZW1iZXJOb2RlLmluaXQgPSBpbml0LnZhbHVlO1xuICAgICAgICAgICAgbWVtYmVycy5zdHJpbmdNZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTm9kZShtZW1iZXJOb2RlLCBcIkVudW1TdHJpbmdNZW1iZXJcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJpbnZhbGlkXCI6IHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZmxvd0VudW1FcnJvckludmFsaWRNZW1iZXJJbml0aWFsaXplcihpbml0LmxvYywgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJub25lXCI6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXhwbGljaXRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93RW51bUVycm9yQm9vbGVhbk1lbWJlck5vdEluaXRpYWxpemVkKFxuICAgICAgICAgICAgICAgICAgaW5pdC5sb2MsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JOdW1iZXJNZW1iZXJOb3RJbml0aWFsaXplZChpbml0LmxvYywgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaE5vZGUobWVtYmVyTm9kZSwgXCJFbnVtRGVmYXVsdGVkTWVtYmVyXCIpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1lbWJlcnMsIGhhc1Vua25vd25NZW1iZXJzIH07XG4gICAgfVxuXG4gICAgZmxvd0VudW1TdHJpbmdNZW1iZXJzKFxuICAgICAgaW5pdGlhbGl6ZWRNZW1iZXJzOiBBcnJheTxOLk5vZGU+LFxuICAgICAgZGVmYXVsdGVkTWVtYmVyczogQXJyYXk8Ti5Ob2RlPixcbiAgICAgIHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICB9OiB7XG4gICAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICB9LFxuICAgICk6IEFycmF5PE4uTm9kZT4ge1xuICAgICAgaWYgKGluaXRpYWxpemVkTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRlZE1lbWJlcnM7XG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRlZE1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplZE1lbWJlcnM7XG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRlZE1lbWJlcnMubGVuZ3RoID4gaW5pdGlhbGl6ZWRNZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBpbml0aWFsaXplZE1lbWJlcnMpIHtcbiAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JTdHJpbmdNZW1iZXJJbmNvbnNpc3RlbnRseUluaXRhaWxpemVkKG1lbWJlciwge1xuICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRlZE1lbWJlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBkZWZhdWx0ZWRNZW1iZXJzKSB7XG4gICAgICAgICAgdGhpcy5mbG93RW51bUVycm9yU3RyaW5nTWVtYmVySW5jb25zaXN0ZW50bHlJbml0YWlsaXplZChtZW1iZXIsIHtcbiAgICAgICAgICAgIGVudW1OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplZE1lbWJlcnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmxvd0VudW1QYXJzZUV4cGxpY2l0VHlwZSh7XG4gICAgICBlbnVtTmFtZSxcbiAgICB9OiB7XG4gICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgIH0pOiBFbnVtRXhwbGljaXRUeXBlIHtcbiAgICAgIGlmICghdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9vZikpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShGbG93RXJyb3JzLkVudW1JbnZhbGlkRXhwbGljaXRUeXBlVW5rbm93blN1cHBsaWVkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgIT09IFwiYm9vbGVhblwiICYmXG4gICAgICAgIHZhbHVlICE9PSBcIm51bWJlclwiICYmXG4gICAgICAgIHZhbHVlICE9PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHZhbHVlICE9PSBcInN5bWJvbFwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShGbG93RXJyb3JzLkVudW1JbnZhbGlkRXhwbGljaXRUeXBlLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgaW52YWxpZEVudW1UeXBlOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmbG93RW51bUJvZHkobm9kZTogVW5kb25lPE4uTm9kZT4sIGlkOiBOLk5vZGUpOiBOLk5vZGUge1xuICAgICAgY29uc3QgZW51bU5hbWUgPSBpZC5uYW1lO1xuICAgICAgY29uc3QgbmFtZUxvYyA9IGlkLmxvYy5zdGFydDtcbiAgICAgIGNvbnN0IGV4cGxpY2l0VHlwZSA9IHRoaXMuZmxvd0VudW1QYXJzZUV4cGxpY2l0VHlwZSh7IGVudW1OYW1lIH0pO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcbiAgICAgIGNvbnN0IHsgbWVtYmVycywgaGFzVW5rbm93bk1lbWJlcnMgfSA9IHRoaXMuZmxvd0VudW1NZW1iZXJzKHtcbiAgICAgICAgZW51bU5hbWUsXG4gICAgICAgIGV4cGxpY2l0VHlwZSxcbiAgICAgIH0pO1xuICAgICAgbm9kZS5oYXNVbmtub3duTWVtYmVycyA9IGhhc1Vua25vd25NZW1iZXJzO1xuXG4gICAgICBzd2l0Y2ggKGV4cGxpY2l0VHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLmJvb2xlYW5NZW1iZXJzO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1Cb29sZWFuQm9keVwiKTtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIG5vZGUuZXhwbGljaXRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLm51bWJlck1lbWJlcnM7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bU51bWJlckJvZHlcIik7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICBub2RlLmV4cGxpY2l0VHlwZSA9IHRydWU7XG4gICAgICAgICAgbm9kZS5tZW1iZXJzID0gdGhpcy5mbG93RW51bVN0cmluZ01lbWJlcnMoXG4gICAgICAgICAgICBtZW1iZXJzLnN0cmluZ01lbWJlcnMsXG4gICAgICAgICAgICBtZW1iZXJzLmRlZmF1bHRlZE1lbWJlcnMsXG4gICAgICAgICAgICB7IGVudW1OYW1lIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbnVtU3RyaW5nQm9keVwiKTtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIG5vZGUubWVtYmVycyA9IG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycztcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFbnVtU3ltYm9sQm9keVwiKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIGBleHBsaWNpdFR5cGVgIGlzIGBudWxsYFxuICAgICAgICAgIGNvbnN0IGVtcHR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgbm9kZS5tZW1iZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1TdHJpbmdCb2R5XCIpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5leHBsaWNpdFR5cGUgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGJvb2xzTGVuID0gbWVtYmVycy5ib29sZWFuTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbnVtc0xlbiA9IG1lbWJlcnMubnVtYmVyTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgc3Ryc0xlbiA9IG1lbWJlcnMuc3RyaW5nTWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdGVkTGVuID0gbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzLmxlbmd0aDtcblxuICAgICAgICAgIGlmICghYm9vbHNMZW4gJiYgIW51bXNMZW4gJiYgIXN0cnNMZW4gJiYgIWRlZmF1bHRlZExlbikge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghYm9vbHNMZW4gJiYgIW51bXNMZW4pIHtcbiAgICAgICAgICAgIG5vZGUubWVtYmVycyA9IHRoaXMuZmxvd0VudW1TdHJpbmdNZW1iZXJzKFxuICAgICAgICAgICAgICBtZW1iZXJzLnN0cmluZ01lbWJlcnMsXG4gICAgICAgICAgICAgIG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycyxcbiAgICAgICAgICAgICAgeyBlbnVtTmFtZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bVN0cmluZ0JvZHlcIik7XG4gICAgICAgICAgfSBlbHNlIGlmICghbnVtc0xlbiAmJiAhc3Ryc0xlbiAmJiBib29sc0xlbiA+PSBkZWZhdWx0ZWRMZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMuZGVmYXVsdGVkTWVtYmVycykge1xuICAgICAgICAgICAgICB0aGlzLmZsb3dFbnVtRXJyb3JCb29sZWFuTWVtYmVyTm90SW5pdGlhbGl6ZWQobWVtYmVyLmxvYy5zdGFydCwge1xuICAgICAgICAgICAgICAgIGVudW1OYW1lLFxuICAgICAgICAgICAgICAgIG1lbWJlck5hbWU6IG1lbWJlci5pZC5uYW1lLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUubWVtYmVycyA9IG1lbWJlcnMuYm9vbGVhbk1lbWJlcnM7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1Cb29sZWFuQm9keVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFib29sc0xlbiAmJiAhc3Ryc0xlbiAmJiBudW1zTGVuID49IGRlZmF1bHRlZExlbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5kZWZhdWx0ZWRNZW1iZXJzKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmxvd0VudW1FcnJvck51bWJlck1lbWJlck5vdEluaXRpYWxpemVkKG1lbWJlci5sb2Muc3RhcnQsIHtcbiAgICAgICAgICAgICAgICBlbnVtTmFtZSxcbiAgICAgICAgICAgICAgICBtZW1iZXJOYW1lOiBtZW1iZXIuaWQubmFtZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLm1lbWJlcnMgPSBtZW1iZXJzLm51bWJlck1lbWJlcnM7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVudW1OdW1iZXJCb2R5XCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEZsb3dFcnJvcnMuRW51bUluY29uc2lzdGVudE1lbWJlclZhbHVlcywge1xuICAgICAgICAgICAgICBhdDogbmFtZUxvYyxcbiAgICAgICAgICAgICAgZW51bU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsb3dQYXJzZUVudW1EZWNsYXJhdGlvbihub2RlOiBVbmRvbmU8Ti5Ob2RlPik6IE4uTm9kZSB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBub2RlLmlkID0gaWQ7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZsb3dFbnVtQm9keSh0aGlzLnN0YXJ0Tm9kZSgpLCBpZCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRW51bURlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IHRva2VuIGlzIGEgdHQubHRcbiAgICBpc0xvb2thaGVhZFRva2VuX2x0KCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMubmV4dFRva2VuU3RhcnQoKTtcbiAgICAgIGlmICh0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCkgPT09IGNoYXJDb2Rlcy5sZXNzVGhhbikge1xuICAgICAgICBjb25zdCBhZnRlck5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCArIDEpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGFmdGVyTmV4dCAhPT0gY2hhckNvZGVzLmxlc3NUaGFuICYmIGFmdGVyTmV4dCAhPT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWF5YmVVbndyYXBUeXBlQ2FzdEV4cHJlc3Npb24obm9kZTogTi5Ob2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50eXBlID09PSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiID8gbm9kZS5leHByZXNzaW9uIDogbm9kZTtcbiAgICB9XG4gIH07XG4iLCAiY29uc3QgZW50aXRpZXM6IHtcbiAgX19wcm90b19fOiBudWxsO1xuICBbbmFtZTogc3RyaW5nXTogc3RyaW5nO1xufSA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBxdW90OiBcIlxcdTAwMjJcIixcbiAgYW1wOiBcIiZcIixcbiAgYXBvczogXCJcXHUwMDI3XCIsXG4gIGx0OiBcIjxcIixcbiAgZ3Q6IFwiPlwiLFxuICBuYnNwOiBcIlxcdTAwQTBcIixcbiAgaWV4Y2w6IFwiXFx1MDBBMVwiLFxuICBjZW50OiBcIlxcdTAwQTJcIixcbiAgcG91bmQ6IFwiXFx1MDBBM1wiLFxuICBjdXJyZW46IFwiXFx1MDBBNFwiLFxuICB5ZW46IFwiXFx1MDBBNVwiLFxuICBicnZiYXI6IFwiXFx1MDBBNlwiLFxuICBzZWN0OiBcIlxcdTAwQTdcIixcbiAgdW1sOiBcIlxcdTAwQThcIixcbiAgY29weTogXCJcXHUwMEE5XCIsXG4gIG9yZGY6IFwiXFx1MDBBQVwiLFxuICBsYXF1bzogXCJcXHUwMEFCXCIsXG4gIG5vdDogXCJcXHUwMEFDXCIsXG4gIHNoeTogXCJcXHUwMEFEXCIsXG4gIHJlZzogXCJcXHUwMEFFXCIsXG4gIG1hY3I6IFwiXFx1MDBBRlwiLFxuICBkZWc6IFwiXFx1MDBCMFwiLFxuICBwbHVzbW46IFwiXFx1MDBCMVwiLFxuICBzdXAyOiBcIlxcdTAwQjJcIixcbiAgc3VwMzogXCJcXHUwMEIzXCIsXG4gIGFjdXRlOiBcIlxcdTAwQjRcIixcbiAgbWljcm86IFwiXFx1MDBCNVwiLFxuICBwYXJhOiBcIlxcdTAwQjZcIixcbiAgbWlkZG90OiBcIlxcdTAwQjdcIixcbiAgY2VkaWw6IFwiXFx1MDBCOFwiLFxuICBzdXAxOiBcIlxcdTAwQjlcIixcbiAgb3JkbTogXCJcXHUwMEJBXCIsXG4gIHJhcXVvOiBcIlxcdTAwQkJcIixcbiAgZnJhYzE0OiBcIlxcdTAwQkNcIixcbiAgZnJhYzEyOiBcIlxcdTAwQkRcIixcbiAgZnJhYzM0OiBcIlxcdTAwQkVcIixcbiAgaXF1ZXN0OiBcIlxcdTAwQkZcIixcbiAgQWdyYXZlOiBcIlxcdTAwQzBcIixcbiAgQWFjdXRlOiBcIlxcdTAwQzFcIixcbiAgQWNpcmM6IFwiXFx1MDBDMlwiLFxuICBBdGlsZGU6IFwiXFx1MDBDM1wiLFxuICBBdW1sOiBcIlxcdTAwQzRcIixcbiAgQXJpbmc6IFwiXFx1MDBDNVwiLFxuICBBRWxpZzogXCJcXHUwMEM2XCIsXG4gIENjZWRpbDogXCJcXHUwMEM3XCIsXG4gIEVncmF2ZTogXCJcXHUwMEM4XCIsXG4gIEVhY3V0ZTogXCJcXHUwMEM5XCIsXG4gIEVjaXJjOiBcIlxcdTAwQ0FcIixcbiAgRXVtbDogXCJcXHUwMENCXCIsXG4gIElncmF2ZTogXCJcXHUwMENDXCIsXG4gIElhY3V0ZTogXCJcXHUwMENEXCIsXG4gIEljaXJjOiBcIlxcdTAwQ0VcIixcbiAgSXVtbDogXCJcXHUwMENGXCIsXG4gIEVUSDogXCJcXHUwMEQwXCIsXG4gIE50aWxkZTogXCJcXHUwMEQxXCIsXG4gIE9ncmF2ZTogXCJcXHUwMEQyXCIsXG4gIE9hY3V0ZTogXCJcXHUwMEQzXCIsXG4gIE9jaXJjOiBcIlxcdTAwRDRcIixcbiAgT3RpbGRlOiBcIlxcdTAwRDVcIixcbiAgT3VtbDogXCJcXHUwMEQ2XCIsXG4gIHRpbWVzOiBcIlxcdTAwRDdcIixcbiAgT3NsYXNoOiBcIlxcdTAwRDhcIixcbiAgVWdyYXZlOiBcIlxcdTAwRDlcIixcbiAgVWFjdXRlOiBcIlxcdTAwREFcIixcbiAgVWNpcmM6IFwiXFx1MDBEQlwiLFxuICBVdW1sOiBcIlxcdTAwRENcIixcbiAgWWFjdXRlOiBcIlxcdTAwRERcIixcbiAgVEhPUk46IFwiXFx1MDBERVwiLFxuICBzemxpZzogXCJcXHUwMERGXCIsXG4gIGFncmF2ZTogXCJcXHUwMEUwXCIsXG4gIGFhY3V0ZTogXCJcXHUwMEUxXCIsXG4gIGFjaXJjOiBcIlxcdTAwRTJcIixcbiAgYXRpbGRlOiBcIlxcdTAwRTNcIixcbiAgYXVtbDogXCJcXHUwMEU0XCIsXG4gIGFyaW5nOiBcIlxcdTAwRTVcIixcbiAgYWVsaWc6IFwiXFx1MDBFNlwiLFxuICBjY2VkaWw6IFwiXFx1MDBFN1wiLFxuICBlZ3JhdmU6IFwiXFx1MDBFOFwiLFxuICBlYWN1dGU6IFwiXFx1MDBFOVwiLFxuICBlY2lyYzogXCJcXHUwMEVBXCIsXG4gIGV1bWw6IFwiXFx1MDBFQlwiLFxuICBpZ3JhdmU6IFwiXFx1MDBFQ1wiLFxuICBpYWN1dGU6IFwiXFx1MDBFRFwiLFxuICBpY2lyYzogXCJcXHUwMEVFXCIsXG4gIGl1bWw6IFwiXFx1MDBFRlwiLFxuICBldGg6IFwiXFx1MDBGMFwiLFxuICBudGlsZGU6IFwiXFx1MDBGMVwiLFxuICBvZ3JhdmU6IFwiXFx1MDBGMlwiLFxuICBvYWN1dGU6IFwiXFx1MDBGM1wiLFxuICBvY2lyYzogXCJcXHUwMEY0XCIsXG4gIG90aWxkZTogXCJcXHUwMEY1XCIsXG4gIG91bWw6IFwiXFx1MDBGNlwiLFxuICBkaXZpZGU6IFwiXFx1MDBGN1wiLFxuICBvc2xhc2g6IFwiXFx1MDBGOFwiLFxuICB1Z3JhdmU6IFwiXFx1MDBGOVwiLFxuICB1YWN1dGU6IFwiXFx1MDBGQVwiLFxuICB1Y2lyYzogXCJcXHUwMEZCXCIsXG4gIHV1bWw6IFwiXFx1MDBGQ1wiLFxuICB5YWN1dGU6IFwiXFx1MDBGRFwiLFxuICB0aG9ybjogXCJcXHUwMEZFXCIsXG4gIHl1bWw6IFwiXFx1MDBGRlwiLFxuICBPRWxpZzogXCJcXHUwMTUyXCIsXG4gIG9lbGlnOiBcIlxcdTAxNTNcIixcbiAgU2Nhcm9uOiBcIlxcdTAxNjBcIixcbiAgc2Nhcm9uOiBcIlxcdTAxNjFcIixcbiAgWXVtbDogXCJcXHUwMTc4XCIsXG4gIGZub2Y6IFwiXFx1MDE5MlwiLFxuICBjaXJjOiBcIlxcdTAyQzZcIixcbiAgdGlsZGU6IFwiXFx1MDJEQ1wiLFxuICBBbHBoYTogXCJcXHUwMzkxXCIsXG4gIEJldGE6IFwiXFx1MDM5MlwiLFxuICBHYW1tYTogXCJcXHUwMzkzXCIsXG4gIERlbHRhOiBcIlxcdTAzOTRcIixcbiAgRXBzaWxvbjogXCJcXHUwMzk1XCIsXG4gIFpldGE6IFwiXFx1MDM5NlwiLFxuICBFdGE6IFwiXFx1MDM5N1wiLFxuICBUaGV0YTogXCJcXHUwMzk4XCIsXG4gIElvdGE6IFwiXFx1MDM5OVwiLFxuICBLYXBwYTogXCJcXHUwMzlBXCIsXG4gIExhbWJkYTogXCJcXHUwMzlCXCIsXG4gIE11OiBcIlxcdTAzOUNcIixcbiAgTnU6IFwiXFx1MDM5RFwiLFxuICBYaTogXCJcXHUwMzlFXCIsXG4gIE9taWNyb246IFwiXFx1MDM5RlwiLFxuICBQaTogXCJcXHUwM0EwXCIsXG4gIFJobzogXCJcXHUwM0ExXCIsXG4gIFNpZ21hOiBcIlxcdTAzQTNcIixcbiAgVGF1OiBcIlxcdTAzQTRcIixcbiAgVXBzaWxvbjogXCJcXHUwM0E1XCIsXG4gIFBoaTogXCJcXHUwM0E2XCIsXG4gIENoaTogXCJcXHUwM0E3XCIsXG4gIFBzaTogXCJcXHUwM0E4XCIsXG4gIE9tZWdhOiBcIlxcdTAzQTlcIixcbiAgYWxwaGE6IFwiXFx1MDNCMVwiLFxuICBiZXRhOiBcIlxcdTAzQjJcIixcbiAgZ2FtbWE6IFwiXFx1MDNCM1wiLFxuICBkZWx0YTogXCJcXHUwM0I0XCIsXG4gIGVwc2lsb246IFwiXFx1MDNCNVwiLFxuICB6ZXRhOiBcIlxcdTAzQjZcIixcbiAgZXRhOiBcIlxcdTAzQjdcIixcbiAgdGhldGE6IFwiXFx1MDNCOFwiLFxuICBpb3RhOiBcIlxcdTAzQjlcIixcbiAga2FwcGE6IFwiXFx1MDNCQVwiLFxuICBsYW1iZGE6IFwiXFx1MDNCQlwiLFxuICBtdTogXCJcXHUwM0JDXCIsXG4gIG51OiBcIlxcdTAzQkRcIixcbiAgeGk6IFwiXFx1MDNCRVwiLFxuICBvbWljcm9uOiBcIlxcdTAzQkZcIixcbiAgcGk6IFwiXFx1MDNDMFwiLFxuICByaG86IFwiXFx1MDNDMVwiLFxuICBzaWdtYWY6IFwiXFx1MDNDMlwiLFxuICBzaWdtYTogXCJcXHUwM0MzXCIsXG4gIHRhdTogXCJcXHUwM0M0XCIsXG4gIHVwc2lsb246IFwiXFx1MDNDNVwiLFxuICBwaGk6IFwiXFx1MDNDNlwiLFxuICBjaGk6IFwiXFx1MDNDN1wiLFxuICBwc2k6IFwiXFx1MDNDOFwiLFxuICBvbWVnYTogXCJcXHUwM0M5XCIsXG4gIHRoZXRhc3ltOiBcIlxcdTAzRDFcIixcbiAgdXBzaWg6IFwiXFx1MDNEMlwiLFxuICBwaXY6IFwiXFx1MDNENlwiLFxuICBlbnNwOiBcIlxcdTIwMDJcIixcbiAgZW1zcDogXCJcXHUyMDAzXCIsXG4gIHRoaW5zcDogXCJcXHUyMDA5XCIsXG4gIHp3bmo6IFwiXFx1MjAwQ1wiLFxuICB6d2o6IFwiXFx1MjAwRFwiLFxuICBscm06IFwiXFx1MjAwRVwiLFxuICBybG06IFwiXFx1MjAwRlwiLFxuICBuZGFzaDogXCJcXHUyMDEzXCIsXG4gIG1kYXNoOiBcIlxcdTIwMTRcIixcbiAgbHNxdW86IFwiXFx1MjAxOFwiLFxuICByc3F1bzogXCJcXHUyMDE5XCIsXG4gIHNicXVvOiBcIlxcdTIwMUFcIixcbiAgbGRxdW86IFwiXFx1MjAxQ1wiLFxuICByZHF1bzogXCJcXHUyMDFEXCIsXG4gIGJkcXVvOiBcIlxcdTIwMUVcIixcbiAgZGFnZ2VyOiBcIlxcdTIwMjBcIixcbiAgRGFnZ2VyOiBcIlxcdTIwMjFcIixcbiAgYnVsbDogXCJcXHUyMDIyXCIsXG4gIGhlbGxpcDogXCJcXHUyMDI2XCIsXG4gIHBlcm1pbDogXCJcXHUyMDMwXCIsXG4gIHByaW1lOiBcIlxcdTIwMzJcIixcbiAgUHJpbWU6IFwiXFx1MjAzM1wiLFxuICBsc2FxdW86IFwiXFx1MjAzOVwiLFxuICByc2FxdW86IFwiXFx1MjAzQVwiLFxuICBvbGluZTogXCJcXHUyMDNFXCIsXG4gIGZyYXNsOiBcIlxcdTIwNDRcIixcbiAgZXVybzogXCJcXHUyMEFDXCIsXG4gIGltYWdlOiBcIlxcdTIxMTFcIixcbiAgd2VpZXJwOiBcIlxcdTIxMThcIixcbiAgcmVhbDogXCJcXHUyMTFDXCIsXG4gIHRyYWRlOiBcIlxcdTIxMjJcIixcbiAgYWxlZnN5bTogXCJcXHUyMTM1XCIsXG4gIGxhcnI6IFwiXFx1MjE5MFwiLFxuICB1YXJyOiBcIlxcdTIxOTFcIixcbiAgcmFycjogXCJcXHUyMTkyXCIsXG4gIGRhcnI6IFwiXFx1MjE5M1wiLFxuICBoYXJyOiBcIlxcdTIxOTRcIixcbiAgY3JhcnI6IFwiXFx1MjFCNVwiLFxuICBsQXJyOiBcIlxcdTIxRDBcIixcbiAgdUFycjogXCJcXHUyMUQxXCIsXG4gIHJBcnI6IFwiXFx1MjFEMlwiLFxuICBkQXJyOiBcIlxcdTIxRDNcIixcbiAgaEFycjogXCJcXHUyMUQ0XCIsXG4gIGZvcmFsbDogXCJcXHUyMjAwXCIsXG4gIHBhcnQ6IFwiXFx1MjIwMlwiLFxuICBleGlzdDogXCJcXHUyMjAzXCIsXG4gIGVtcHR5OiBcIlxcdTIyMDVcIixcbiAgbmFibGE6IFwiXFx1MjIwN1wiLFxuICBpc2luOiBcIlxcdTIyMDhcIixcbiAgbm90aW46IFwiXFx1MjIwOVwiLFxuICBuaTogXCJcXHUyMjBCXCIsXG4gIHByb2Q6IFwiXFx1MjIwRlwiLFxuICBzdW06IFwiXFx1MjIxMVwiLFxuICBtaW51czogXCJcXHUyMjEyXCIsXG4gIGxvd2FzdDogXCJcXHUyMjE3XCIsXG4gIHJhZGljOiBcIlxcdTIyMUFcIixcbiAgcHJvcDogXCJcXHUyMjFEXCIsXG4gIGluZmluOiBcIlxcdTIyMUVcIixcbiAgYW5nOiBcIlxcdTIyMjBcIixcbiAgYW5kOiBcIlxcdTIyMjdcIixcbiAgb3I6IFwiXFx1MjIyOFwiLFxuICBjYXA6IFwiXFx1MjIyOVwiLFxuICBjdXA6IFwiXFx1MjIyQVwiLFxuICBpbnQ6IFwiXFx1MjIyQlwiLFxuICB0aGVyZTQ6IFwiXFx1MjIzNFwiLFxuICBzaW06IFwiXFx1MjIzQ1wiLFxuICBjb25nOiBcIlxcdTIyNDVcIixcbiAgYXN5bXA6IFwiXFx1MjI0OFwiLFxuICBuZTogXCJcXHUyMjYwXCIsXG4gIGVxdWl2OiBcIlxcdTIyNjFcIixcbiAgbGU6IFwiXFx1MjI2NFwiLFxuICBnZTogXCJcXHUyMjY1XCIsXG4gIHN1YjogXCJcXHUyMjgyXCIsXG4gIHN1cDogXCJcXHUyMjgzXCIsXG4gIG5zdWI6IFwiXFx1MjI4NFwiLFxuICBzdWJlOiBcIlxcdTIyODZcIixcbiAgc3VwZTogXCJcXHUyMjg3XCIsXG4gIG9wbHVzOiBcIlxcdTIyOTVcIixcbiAgb3RpbWVzOiBcIlxcdTIyOTdcIixcbiAgcGVycDogXCJcXHUyMkE1XCIsXG4gIHNkb3Q6IFwiXFx1MjJDNVwiLFxuICBsY2VpbDogXCJcXHUyMzA4XCIsXG4gIHJjZWlsOiBcIlxcdTIzMDlcIixcbiAgbGZsb29yOiBcIlxcdTIzMEFcIixcbiAgcmZsb29yOiBcIlxcdTIzMEJcIixcbiAgbGFuZzogXCJcXHUyMzI5XCIsXG4gIHJhbmc6IFwiXFx1MjMyQVwiLFxuICBsb3o6IFwiXFx1MjVDQVwiLFxuICBzcGFkZXM6IFwiXFx1MjY2MFwiLFxuICBjbHViczogXCJcXHUyNjYzXCIsXG4gIGhlYXJ0czogXCJcXHUyNjY1XCIsXG4gIGRpYW1zOiBcIlxcdTI2NjZcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgZGVmYXVsdCBlbnRpdGllcztcbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG5pbXBvcnQgWEhUTUxFbnRpdGllcyBmcm9tIFwiLi94aHRtbFwiO1xuaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuLi8uLi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHtcbiAgdG9rZW5Db21lc0JlZm9yZUV4cHJlc3Npb24sXG4gIHRva2VuSXNLZXl3b3JkLFxuICB0b2tlbkxhYmVsTmFtZSxcbiAgdHlwZSBUb2tlblR5cGUsXG4gIHR0LFxufSBmcm9tIFwiLi4vLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFRva0NvbnRleHQgfSBmcm9tIFwiLi4vLi4vdG9rZW5pemVyL2NvbnRleHRcIjtcbmltcG9ydCB7IHR5cGVzIGFzIHRjIH0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0lkZW50aWZpZXJDaGFyLCBpc0lkZW50aWZpZXJTdGFydCB9IGZyb20gXCIuLi8uLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHsgaXNOZXdMaW5lIH0gZnJvbSBcIi4uLy4uL3V0aWwvd2hpdGVzcGFjZVwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL25vZGVcIjtcblxuLyogZXNsaW50IHNvcnQta2V5czogXCJlcnJvclwiICovXG5jb25zdCBKc3hFcnJvcnMgPSBQYXJzZUVycm9yRW51bWBqc3hgKHtcbiAgQXR0cmlidXRlSXNFbXB0eTpcbiAgICBcIkpTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uLlwiLFxuICBNaXNzaW5nQ2xvc2luZ1RhZ0VsZW1lbnQ6ICh7IG9wZW5pbmdUYWdOYW1lIH06IHsgb3BlbmluZ1RhZ05hbWU6IHN0cmluZyB9KSA9PlxuICAgIGBFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPCR7b3BlbmluZ1RhZ05hbWV9Pi5gLFxuICBNaXNzaW5nQ2xvc2luZ1RhZ0ZyYWdtZW50OiBcIkV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8Pi5cIixcbiAgVW5leHBlY3RlZFNlcXVlbmNlRXhwcmVzc2lvbjpcbiAgICBcIlNlcXVlbmNlIGV4cHJlc3Npb25zIGNhbm5vdCBiZSBkaXJlY3RseSBuZXN0ZWQgaW5zaWRlIEpTWC4gRGlkIHlvdSBtZWFuIHRvIHdyYXAgaXQgaW4gcGFyZW50aGVzZXMgKC4uLik/XCIsXG4gIC8vIEZJWE1FOiBVbmlmeSB3aXRoIEVycm9ycy5VbmV4cGVjdGVkVG9rZW5cbiAgVW5leHBlY3RlZFRva2VuOiAoe1xuICAgIHVuZXhwZWN0ZWQsXG4gICAgSFRNTEVudGl0eSxcbiAgfToge1xuICAgIHVuZXhwZWN0ZWQ6IHN0cmluZztcbiAgICBIVE1MRW50aXR5OiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFVuZXhwZWN0ZWQgdG9rZW4gXFxgJHt1bmV4cGVjdGVkfVxcYC4gRGlkIHlvdSBtZWFuIFxcYCR7SFRNTEVudGl0eX1cXGAgb3IgXFxgeycke3VuZXhwZWN0ZWR9J31cXGA/YCxcbiAgVW5zdXBwb3J0ZWRKc3hWYWx1ZTpcbiAgICBcIkpTWCB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIGFuIGV4cHJlc3Npb24gb3IgYSBxdW90ZWQgSlNYIHRleHQuXCIsXG4gIFVudGVybWluYXRlZEpzeENvbnRlbnQ6IFwiVW50ZXJtaW5hdGVkIEpTWCBjb250ZW50cy5cIixcbiAgVW53cmFwcGVkQWRqYWNlbnRKU1hFbGVtZW50czpcbiAgICBcIkFkamFjZW50IEpTWCBlbGVtZW50cyBtdXN0IGJlIHdyYXBwZWQgaW4gYW4gZW5jbG9zaW5nIHRhZy4gRGlkIHlvdSB3YW50IGEgSlNYIGZyYWdtZW50IDw+Li4uPC8+P1wiLFxufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIHNvcnQta2V5cyAqL1xuXG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdD86IE4uSlNYRWxlbWVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iamVjdFxuICAgID8gb2JqZWN0LnR5cGUgPT09IFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIgfHxcbiAgICAgICAgb2JqZWN0LnR5cGUgPT09IFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCJcbiAgICA6IGZhbHNlO1xufVxuXG4vLyBUcmFuc2Zvcm1zIEpTWCBlbGVtZW50IG5hbWUgdG8gc3RyaW5nLlxuXG5mdW5jdGlvbiBnZXRRdWFsaWZpZWRKU1hOYW1lKFxuICBvYmplY3Q6IE4uSlNYSWRlbnRpZmllciB8IE4uSlNYTmFtZXNwYWNlZE5hbWUgfCBOLkpTWE1lbWJlckV4cHJlc3Npb24sXG4pOiBzdHJpbmcge1xuICBpZiAob2JqZWN0LnR5cGUgPT09IFwiSlNYSWRlbnRpZmllclwiKSB7XG4gICAgcmV0dXJuIG9iamVjdC5uYW1lO1xuICB9XG5cbiAgaWYgKG9iamVjdC50eXBlID09PSBcIkpTWE5hbWVzcGFjZWROYW1lXCIpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm5hbWVzcGFjZS5uYW1lICsgXCI6XCIgKyBvYmplY3QubmFtZS5uYW1lO1xuICB9XG5cbiAgaWYgKG9iamVjdC50eXBlID09PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikge1xuICAgIHJldHVybiAoXG4gICAgICBnZXRRdWFsaWZpZWRKU1hOYW1lKG9iamVjdC5vYmplY3QpICtcbiAgICAgIFwiLlwiICtcbiAgICAgIGdldFF1YWxpZmllZEpTWE5hbWUob2JqZWN0LnByb3BlcnR5KVxuICAgICk7XG4gIH1cblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGhhZCB1bmV4cGVjdGVkIHR5cGU6IFwiICsgb2JqZWN0LnR5cGUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElKU1hQYXJzZXJNaXhpbiB7XG4gIGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgbm9kZTogTi5KU1hPcGVuaW5nRWxlbWVudCxcbiAgKTogTi5KU1hPcGVuaW5nRWxlbWVudDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IHR5cGVvZiBQYXJzZXIpID0+XG4gIGNsYXNzIEpTWFBhcnNlck1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIFBhcnNlciwgSUpTWFBhcnNlck1peGluIHtcbiAgICAvLyBSZWFkcyBpbmxpbmUgSlNYIGNvbnRlbnRzIHRva2VuLlxuXG4gICAganN4UmVhZFRva2VuKCk6IHZvaWQge1xuICAgICAgbGV0IG91dCA9IFwiXCI7XG4gICAgICBsZXQgY2h1bmtTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbnRlcm1pbmF0ZWRKc3hDb250ZW50LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcblxuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMubGVzc1RoYW46XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2U6XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5wb3MgPT09IHRoaXMuc3RhdGUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgaWYgKGNoID09PSBjaGFyQ29kZXMubGVzc1RoYW4gJiYgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGFnU3RhcnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY2gpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGV4dCwgb3V0KTtcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgIGNhc2UgY2hhckNvZGVzLmFtcGVyc2FuZDpcbiAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgIG91dCArPSB0aGlzLmpzeFJlYWRFbnRpdHkoKTtcbiAgICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMuZ3JlYXRlclRoYW46XG4gICAgICAgICAgY2FzZSBjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlOlxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShKc3hFcnJvcnMuVW5leHBlY3RlZFRva2VuLCB7XG4gICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICAgICAgICB1bmV4cGVjdGVkOiB0aGlzLmlucHV0W3RoaXMuc3RhdGUucG9zXSxcbiAgICAgICAgICAgICAgICBIVE1MRW50aXR5OlxuICAgICAgICAgICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5yaWdodEN1cmx5QnJhY2UgPyBcIiZyYnJhY2U7XCIgOiBcIiZndDtcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgICAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICAgICAgb3V0ICs9IHRoaXMuanN4UmVhZE5ld0xpbmUodHJ1ZSk7XG4gICAgICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBqc3hSZWFkTmV3TGluZShub3JtYWxpemVDUkxGOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMuc3RhdGUucG9zKTtcbiAgICAgIGxldCBvdXQ7XG4gICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgaWYgKFxuICAgICAgICBjaCA9PT0gY2hhckNvZGVzLmNhcnJpYWdlUmV0dXJuICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcykgPT09IGNoYXJDb2Rlcy5saW5lRmVlZFxuICAgICAgKSB7XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIG91dCA9IG5vcm1hbGl6ZUNSTEYgPyBcIlxcblwiIDogXCJcXHJcXG5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgfVxuICAgICAgKyt0aGlzLnN0YXRlLmN1ckxpbmU7XG4gICAgICB0aGlzLnN0YXRlLmxpbmVTdGFydCA9IHRoaXMuc3RhdGUucG9zO1xuXG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGpzeFJlYWRTdHJpbmcocXVvdGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgbGV0IG91dCA9IFwiXCI7XG4gICAgICBsZXQgY2h1bmtTdGFydCA9ICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBvcyA+PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVudGVybWluYXRlZFN0cmluZywge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyk7XG4gICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIGJyZWFrO1xuICAgICAgICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5hbXBlcnNhbmQpIHtcbiAgICAgICAgICBvdXQgKz0gdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnN0YXRlLnBvcyk7XG4gICAgICAgICAgb3V0ICs9IHRoaXMuanN4UmVhZEVudGl0eSgpO1xuICAgICAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfSBlbHNlIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MpO1xuICAgICAgICAgIG91dCArPSB0aGlzLmpzeFJlYWROZXdMaW5lKGZhbHNlKTtcbiAgICAgICAgICBjaHVua1N0YXJ0ID0gdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5zdGF0ZS5wb3MrKyk7XG4gICAgICB0aGlzLmZpbmlzaFRva2VuKHR0LnN0cmluZywgb3V0KTtcbiAgICB9XG5cbiAgICBqc3hSZWFkRW50aXR5KCk6IHN0cmluZyB7XG4gICAgICBjb25zdCBzdGFydFBvcyA9ICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICBpZiAodGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykgPT09IGNoYXJDb2Rlcy5udW1iZXJTaWduKSB7XG4gICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG5cbiAgICAgICAgbGV0IHJhZGl4ID0gMTA7XG4gICAgICAgIGlmICh0aGlzLmNvZGVQb2ludEF0UG9zKHRoaXMuc3RhdGUucG9zKSA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZVgpIHtcbiAgICAgICAgICByYWRpeCA9IDE2O1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSB0aGlzLnJlYWRJbnQoXG4gICAgICAgICAgcmFkaXgsXG4gICAgICAgICAgLyogbGVuICovIHVuZGVmaW5lZCxcbiAgICAgICAgICAvKiBmb3JjZUxlbiAqLyBmYWxzZSxcbiAgICAgICAgICAvKiBhbGxvd051bVNlcGFyYXRvciAqLyBcImJhaWxcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvZGVQb2ludCAhPT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMuY29kZVBvaW50QXRQb3ModGhpcy5zdGF0ZS5wb3MpID09PSBjaGFyQ29kZXMuc2VtaWNvbG9uXG4gICAgICAgICkge1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCBzZW1pID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBjb3VudCsrIDwgMTAgJiZcbiAgICAgICAgICB0aGlzLnN0YXRlLnBvcyA8IHRoaXMubGVuZ3RoICYmXG4gICAgICAgICAgIShzZW1pID0gdGhpcy5jb2RlUG9pbnRBdFBvcyh0aGlzLnN0YXRlLnBvcykgPT0gY2hhckNvZGVzLnNlbWljb2xvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZW1pKSB7XG4gICAgICAgICAgY29uc3QgZGVzYyA9IHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnRQb3MsIHRoaXMuc3RhdGUucG9zKTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBYSFRNTEVudGl0aWVzW2Rlc2NdO1xuICAgICAgICAgICsrdGhpcy5zdGF0ZS5wb3M7XG5cbiAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSB2YWxpZCBlbnRpdHlcbiAgICAgIHRoaXMuc3RhdGUucG9zID0gc3RhcnRQb3M7XG4gICAgICByZXR1cm4gXCImXCI7XG4gICAgfVxuXG4gICAgLy8gUmVhZCBhIEpTWCBpZGVudGlmaWVyICh2YWxpZCB0YWcgb3IgYXR0cmlidXRlIG5hbWUpLlxuICAgIC8vXG4gICAgLy8gT3B0aW1pemVkIHZlcnNpb24gc2luY2UgSlNYIGlkZW50aWZpZXJzIGNhblwidCBjb250YWluXG4gICAgLy8gZXNjYXBlIGNoYXJhY3RlcnMgYW5kIHNvIGNhbiBiZSByZWFkIGFzIHNpbmdsZSBzbGljZS5cbiAgICAvLyBBbHNvIGFzc3VtZXMgdGhhdCBmaXJzdCBjaGFyYWN0ZXIgd2FzIGFscmVhZHkgY2hlY2tlZFxuICAgIC8vIGJ5IGlzSWRlbnRpZmllclN0YXJ0IGluIHJlYWRUb2tlbi5cblxuICAgIGpzeFJlYWRXb3JkKCk6IHZvaWQge1xuICAgICAgbGV0IGNoO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXRlLnBvcztcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnN0YXRlLnBvcyk7XG4gICAgICB9IHdoaWxlIChpc0lkZW50aWZpZXJDaGFyKGNoKSB8fCBjaCA9PT0gY2hhckNvZGVzLmRhc2gpO1xuICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5qc3hOYW1lLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnN0YXRlLnBvcykpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5leHQgdG9rZW4gYXMgSlNYIGlkZW50aWZpZXJcblxuICAgIGpzeFBhcnNlSWRlbnRpZmllcigpOiBOLkpTWElkZW50aWZpZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5qc3hOYW1lKSkge1xuICAgICAgICBub2RlLm5hbWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbklzS2V5d29yZCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICAgIG5vZGUubmFtZSA9IHRva2VuTGFiZWxOYW1lKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWElkZW50aWZpZXJcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgbmFtZXNwYWNlZCBpZGVudGlmaWVyLlxuXG4gICAganN4UGFyc2VOYW1lc3BhY2VkTmFtZSgpOiBOLkpTWE5hbWVzcGFjZWROYW1lIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmpzeFBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgaWYgKCF0aGlzLmVhdCh0dC5jb2xvbikpIHJldHVybiBuYW1lO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBub2RlLm5hbWVzcGFjZSA9IG5hbWU7XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmpzeFBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWE5hbWVzcGFjZWROYW1lXCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBlbGVtZW50IG5hbWUgaW4gYW55IGZvcm0gLSBuYW1lc3BhY2VkLCBtZW1iZXJcbiAgICAvLyBvciBzaW5nbGUgaWRlbnRpZmllci5cblxuICAgIGpzeFBhcnNlRWxlbWVudE5hbWUoKTpcbiAgICAgIHwgTi5KU1hJZGVudGlmaWVyXG4gICAgICB8IE4uSlNYTmFtZXNwYWNlZE5hbWVcbiAgICAgIHwgTi5KU1hNZW1iZXJFeHByZXNzaW9uIHtcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgIGxldCBub2RlID0gdGhpcy5qc3hQYXJzZU5hbWVzcGFjZWROYW1lKCk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkpTWE5hbWVzcGFjZWROYW1lXCIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB3aGlsZSAodGhpcy5lYXQodHQuZG90KSkge1xuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICAgIG5ld05vZGUub2JqZWN0ID0gbm9kZTtcbiAgICAgICAgbmV3Tm9kZS5wcm9wZXJ0eSA9IHRoaXMuanN4UGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgIG5vZGUgPSB0aGlzLmZpbmlzaE5vZGUobmV3Tm9kZSwgXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGFueSB0eXBlIG9mIEpTWCBhdHRyaWJ1dGUgdmFsdWUuXG5cbiAgICBqc3hQYXJzZUF0dHJpYnV0ZVZhbHVlKCk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBsZXQgbm9kZTtcbiAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgICAgIHRoaXMuc2V0Q29udGV4dCh0Yy5icmFjZSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgbm9kZSA9IHRoaXMuanN4UGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKG5vZGUsIHRjLmpfb1RhZyk7XG4gICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi50eXBlID09PSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5BdHRyaWJ1dGVJc0VtcHR5LCB7IGF0OiBub2RlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9kZTtcblxuICAgICAgICBjYXNlIHR0LmpzeFRhZ1N0YXJ0OlxuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbnN1cHBvcnRlZEpzeFZhbHVlLCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKU1hFbXB0eUV4cHJlc3Npb24gaXMgdW5pcXVlIHR5cGUgc2luY2UgaXQgZG9lc24ndCBhY3R1YWxseSBwYXJzZSBhbnl0aGluZyxcbiAgICAvLyBhbmQgc28gaXQgc2hvdWxkIHN0YXJ0IGF0IHRoZSBlbmQgb2YgbGFzdCByZWFkIHRva2VuIChsZWZ0IGJyYWNlKSBhbmQgZmluaXNoXG4gICAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBvbmUgKHJpZ2h0IGJyYWNlKS5cblxuICAgIGpzeFBhcnNlRW1wdHlFeHByZXNzaW9uKCk6IE4uSlNYRW1wdHlFeHByZXNzaW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHRoaXMuc3RhdGUubGFzdFRva0VuZExvYyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlQXQobm9kZSwgXCJKU1hFbXB0eUV4cHJlc3Npb25cIiwgdGhpcy5zdGF0ZS5zdGFydExvYyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgSlNYIHNwcmVhZCBjaGlsZFxuXG4gICAganN4UGFyc2VTcHJlYWRDaGlsZChub2RlOiBVbmRvbmU8Ti5KU1hTcHJlYWRDaGlsZD4pOiBOLkpTWFNwcmVhZENoaWxkIHtcbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlbGxpcHNpc1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuc2V0Q29udGV4dCh0Yy5qX2V4cHIpO1xuICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWFNwcmVhZENoaWxkXCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBKU1ggZXhwcmVzc2lvbiBlbmNsb3NlZCBpbnRvIGN1cmx5IGJyYWNrZXRzLlxuXG4gICAganN4UGFyc2VFeHByZXNzaW9uQ29udGFpbmVyKFxuICAgICAgbm9kZTogVW5kb25lPE4uSlNYRXhwcmVzc2lvbkNvbnRhaW5lcj4sXG4gICAgICBwcmV2aW91c0NvbnRleHQ6IFRva0NvbnRleHQsXG4gICAgKTogTi5KU1hFeHByZXNzaW9uQ29udGFpbmVyIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlUikpIHtcbiAgICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5qc3hQYXJzZUVtcHR5RXhwcmVzc2lvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBleHByZXNzaW9uLnR5cGUgPT09IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgICAgICFleHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5VbmV4cGVjdGVkU2VxdWVuY2VFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIGF0OiBleHByZXNzaW9uLmV4cHJlc3Npb25zWzFdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q29udGV4dChwcmV2aW91c0NvbnRleHQpO1xuICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VSKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIik7XG4gICAgfVxuXG4gICAgLy8gUGFyc2VzIGZvbGxvd2luZyBKU1ggYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpci5cblxuICAgIGpzeFBhcnNlQXR0cmlidXRlKCk6IE4uSlNYQXR0cmlidXRlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuYnJhY2VMKSkge1xuICAgICAgICB0aGlzLnNldENvbnRleHQodGMuYnJhY2UpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuZWxsaXBzaXMpO1xuICAgICAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgICAgICB0aGlzLnNldENvbnRleHQodGMual9vVGFnKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpO1xuICAgICAgfVxuICAgICAgbm9kZS5uYW1lID0gdGhpcy5qc3hQYXJzZU5hbWVzcGFjZWROYW1lKCk7XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5lYXQodHQuZXEpID8gdGhpcy5qc3hQYXJzZUF0dHJpYnV0ZVZhbHVlKCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEF0dHJpYnV0ZVwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgSlNYIG9wZW5pbmcgdGFnIHN0YXJ0aW5nIGFmdGVyIFwiPFwiLlxuXG4gICAganN4UGFyc2VPcGVuaW5nRWxlbWVudEF0KHN0YXJ0TG9jOiBQb3NpdGlvbik6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5KU1hPcGVuaW5nRWxlbWVudCB8IE4uSlNYT3BlbmluZ0ZyYWdtZW50PihcbiAgICAgICAgc3RhcnRMb2MsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmpzeFRhZ0VuZCkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtaWdyYXRlIHRvIEJhYmVsIHR5cGVzXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJKU1hPcGVuaW5nRnJhZ21lbnRcIik7XG4gICAgICB9XG4gICAgICBub2RlLm5hbWUgPSB0aGlzLmpzeFBhcnNlRWxlbWVudE5hbWUoKTtcbiAgICAgIHJldHVybiB0aGlzLmpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uSlNYT3BlbmluZ0VsZW1lbnQ+LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBqc3hQYXJzZU9wZW5pbmdFbGVtZW50QWZ0ZXJOYW1lKFxuICAgICAgbm9kZTogVW5kb25lPE4uSlNYT3BlbmluZ0VsZW1lbnQ+LFxuICAgICk6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgY29uc3QgYXR0cmlidXRlczogTi5KU1hBdHRyaWJ1dGVbXSA9IFtdO1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnNsYXNoKSAmJiAhdGhpcy5tYXRjaCh0dC5qc3hUYWdFbmQpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaCh0aGlzLmpzeFBhcnNlQXR0cmlidXRlKCkpO1xuICAgICAgfVxuICAgICAgbm9kZS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgIG5vZGUuc2VsZkNsb3NpbmcgPSB0aGlzLmVhdCh0dC5zbGFzaCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5qc3hUYWdFbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWE9wZW5pbmdFbGVtZW50XCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlcyBKU1ggY2xvc2luZyB0YWcgc3RhcnRpbmcgYWZ0ZXIgXCI8L1wiLlxuXG4gICAganN4UGFyc2VDbG9zaW5nRWxlbWVudEF0KHN0YXJ0TG9jOiBQb3NpdGlvbik6IE4uSlNYQ2xvc2luZ0VsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmpzeFRhZ0VuZCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWENsb3NpbmdGcmFnbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIG5vZGUubmFtZSA9IHRoaXMuanN4UGFyc2VFbGVtZW50TmFtZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQuanN4VGFnRW5kKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJKU1hDbG9zaW5nRWxlbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgZW50aXJlIEpTWCBlbGVtZW50LCBpbmNsdWRpbmcgaXRcInMgb3BlbmluZyB0YWdcbiAgICAvLyAoc3RhcnRpbmcgYWZ0ZXIgXCI8XCIpLCBhdHRyaWJ1dGVzLCBjb250ZW50cyBhbmQgY2xvc2luZyB0YWcuXG5cbiAgICBqc3hQYXJzZUVsZW1lbnRBdChzdGFydExvYzogUG9zaXRpb24pOiBOLkpTWEVsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgIGNvbnN0IG9wZW5pbmdFbGVtZW50ID0gdGhpcy5qc3hQYXJzZU9wZW5pbmdFbGVtZW50QXQoc3RhcnRMb2MpO1xuICAgICAgbGV0IGNsb3NpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgICAgaWYgKCFvcGVuaW5nRWxlbWVudC5zZWxmQ2xvc2luZykge1xuICAgICAgICBjb250ZW50czogZm9yICg7Oykge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIHR0LmpzeFRhZ1N0YXJ0OlxuICAgICAgICAgICAgICBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5lYXQodHQuc2xhc2gpKSB7XG4gICAgICAgICAgICAgICAgY2xvc2luZ0VsZW1lbnQgPSB0aGlzLmpzeFBhcnNlQ2xvc2luZ0VsZW1lbnRBdChzdGFydExvYyk7XG4gICAgICAgICAgICAgICAgYnJlYWsgY29udGVudHM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmpzeFBhcnNlRWxlbWVudEF0KHN0YXJ0TG9jKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIHR0LmpzeFRleHQ6XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5wYXJzZUV4cHJBdG9tKCkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSB0dC5icmFjZUw6IHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPFxuICAgICAgICAgICAgICAgIE4uSlNYU3ByZWFkQ2hpbGQgfCBOLkpTWEV4cHJlc3Npb25Db250YWluZXJcbiAgICAgICAgICAgICAgPigpO1xuICAgICAgICAgICAgICB0aGlzLnNldENvbnRleHQodGMuYnJhY2UpO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmpzeFBhcnNlU3ByZWFkQ2hpbGQobm9kZSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLmpzeFBhcnNlRXhwcmVzc2lvbkNvbnRhaW5lcihub2RlLCB0Yy5qX2V4cHIpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzRnJhZ21lbnQob3BlbmluZ0VsZW1lbnQpICYmXG4gICAgICAgICAgIWlzRnJhZ21lbnQoY2xvc2luZ0VsZW1lbnQpICYmXG4gICAgICAgICAgY2xvc2luZ0VsZW1lbnQgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShKc3hFcnJvcnMuTWlzc2luZ0Nsb3NpbmdUYWdGcmFnbWVudCwge1xuICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0ZyYWdtZW50KG9wZW5pbmdFbGVtZW50KSAmJiBpc0ZyYWdtZW50KGNsb3NpbmdFbGVtZW50KSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoSnN4RXJyb3JzLk1pc3NpbmdDbG9zaW5nVGFnRWxlbWVudCwge1xuICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgICAgb3BlbmluZ1RhZ05hbWU6IGdldFF1YWxpZmllZEpTWE5hbWUob3BlbmluZ0VsZW1lbnQubmFtZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRnJhZ21lbnQob3BlbmluZ0VsZW1lbnQpICYmICFpc0ZyYWdtZW50KGNsb3NpbmdFbGVtZW50KSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGdldFF1YWxpZmllZEpTWE5hbWUoY2xvc2luZ0VsZW1lbnQubmFtZSkgIT09XG4gICAgICAgICAgICBnZXRRdWFsaWZpZWRKU1hOYW1lKG9wZW5pbmdFbGVtZW50Lm5hbWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEpzeEVycm9ycy5NaXNzaW5nQ2xvc2luZ1RhZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgYXQ6IGNsb3NpbmdFbGVtZW50LFxuICAgICAgICAgICAgICBvcGVuaW5nVGFnTmFtZTogZ2V0UXVhbGlmaWVkSlNYTmFtZShvcGVuaW5nRWxlbWVudC5uYW1lKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNGcmFnbWVudChvcGVuaW5nRWxlbWVudCkpIHtcbiAgICAgICAgbm9kZS5vcGVuaW5nRnJhZ21lbnQgPSBvcGVuaW5nRWxlbWVudDtcbiAgICAgICAgbm9kZS5jbG9zaW5nRnJhZ21lbnQgPSBjbG9zaW5nRWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUub3BlbmluZ0VsZW1lbnQgPSBvcGVuaW5nRWxlbWVudDtcbiAgICAgICAgbm9kZS5jbG9zaW5nRWxlbWVudCA9IGNsb3NpbmdFbGVtZW50O1xuICAgICAgfVxuICAgICAgbm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoSnN4RXJyb3JzLlVud3JhcHBlZEFkamFjZW50SlNYRWxlbWVudHMsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0ZyYWdtZW50KG9wZW5pbmdFbGVtZW50KVxuICAgICAgICA/IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkpTWEZyYWdtZW50XCIpXG4gICAgICAgIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSlNYRWxlbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgZW50aXJlIEpTWCBlbGVtZW50IGZyb20gY3VycmVudCBwb3NpdGlvbi5cblxuICAgIGpzeFBhcnNlRWxlbWVudCgpOiBOLkpTWEVsZW1lbnQge1xuICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnRBdChzdGFydExvYyk7XG4gICAgfVxuXG4gICAgc2V0Q29udGV4dChuZXdDb250ZXh0OiBUb2tDb250ZXh0KSB7XG4gICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV0gPSBuZXdDb250ZXh0O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBPdmVycmlkZXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBwYXJzZUV4cHJBdG9tKHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5qc3hUZXh0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSwgXCJKU1hUZXh0XCIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMubWF0Y2godHQubHQpICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcykgIT09IGNoYXJDb2Rlcy5leGNsYW1hdGlvbk1hcmtcbiAgICAgICkge1xuICAgICAgICAvLyBJbiBjYXNlIHdlIGVuY291bnRlciBhbiBsdCB0b2tlbiBoZXJlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzdGFydCBvZlxuICAgICAgICAvLyBqc3ggYXMgdGhlIGx0IHNpZ24gaXMgbm90IGFsbG93ZWQgaW4gcGxhY2VzIHRoYXQgZXhwZWN0IGFuIGV4cHJlc3Npb25cbiAgICAgICAgdGhpcy5yZXBsYWNlVG9rZW4odHQuanN4VGFnU3RhcnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5qc3hQYXJzZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cHJBdG9tKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNraXBTcGFjZSgpIHtcbiAgICAgIGNvbnN0IGN1ckNvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQoKTtcbiAgICAgIGlmICghY3VyQ29udGV4dC5wcmVzZXJ2ZVNwYWNlKSBzdXBlci5za2lwU3BhY2UoKTtcbiAgICB9XG5cbiAgICBnZXRUb2tlbkZyb21Db2RlKGNvZGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuXG4gICAgICBpZiAoY29udGV4dCA9PT0gdGMual9leHByKSB7XG4gICAgICAgIHRoaXMuanN4UmVhZFRva2VuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRleHQgPT09IHRjLmpfb1RhZyB8fCBjb250ZXh0ID09PSB0Yy5qX2NUYWcpIHtcbiAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNvZGUpKSB7XG4gICAgICAgICAgdGhpcy5qc3hSZWFkV29yZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4pIHtcbiAgICAgICAgICArK3RoaXMuc3RhdGUucG9zO1xuICAgICAgICAgIHRoaXMuZmluaXNoVG9rZW4odHQuanN4VGFnRW5kKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGNvZGUgPT09IGNoYXJDb2Rlcy5xdW90YXRpb25NYXJrIHx8IGNvZGUgPT09IGNoYXJDb2Rlcy5hcG9zdHJvcGhlKSAmJlxuICAgICAgICAgIGNvbnRleHQgPT09IHRjLmpfb1RhZ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmpzeFJlYWRTdHJpbmcoY29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLmxlc3NUaGFuICYmXG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpICE9PSBjaGFyQ29kZXMuZXhjbGFtYXRpb25NYXJrXG4gICAgICApIHtcbiAgICAgICAgKyt0aGlzLnN0YXRlLnBvcztcbiAgICAgICAgdGhpcy5maW5pc2hUb2tlbih0dC5qc3hUYWdTdGFydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VwZXIuZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVDb250ZXh0KHByZXZUeXBlOiBUb2tlblR5cGUpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHsgY29udGV4dCwgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmICh0eXBlID09PSB0dC5zbGFzaCAmJiBwcmV2VHlwZSA9PT0gdHQuanN4VGFnU3RhcnQpIHtcbiAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIEpTWCBleHByIC0+IEpTWCBvcGVuIHRhZyAtPiAuLi4gYW55bW9yZVxuICAgICAgICAvLyByZWNvbnNpZGVyIGFzIGNsb3NpbmcgdGFnIGNvbnRleHRcbiAgICAgICAgY29udGV4dC5zcGxpY2UoLTIsIDIsIHRjLmpfY1RhZyk7XG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LmpzeFRhZ1N0YXJ0KSB7XG4gICAgICAgIC8vIHN0YXJ0IG9wZW5pbmcgdGFnIGNvbnRleHRcbiAgICAgICAgY29udGV4dC5wdXNoKHRjLmpfb1RhZyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHR0LmpzeFRhZ0VuZCkge1xuICAgICAgICBjb25zdCBvdXQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICgob3V0ID09PSB0Yy5qX29UYWcgJiYgcHJldlR5cGUgPT09IHR0LnNsYXNoKSB8fCBvdXQgPT09IHRjLmpfY1RhZykge1xuICAgICAgICAgIGNvbnRleHQucG9wKCk7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPVxuICAgICAgICAgICAgY29udGV4dFtjb250ZXh0Lmxlbmd0aCAtIDFdID09PSB0Yy5qX2V4cHI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRDb250ZXh0KHRjLmpfZXhwcik7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5jYW5TdGFydEpTWEVsZW1lbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLmNhblN0YXJ0SlNYRWxlbWVudCA9IHRva2VuQ29tZXNCZWZvcmVFeHByZXNzaW9uKHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiIsICJpbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCBTY29wZUhhbmRsZXIsIHsgU2NvcGUgfSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZVwiO1xuaW1wb3J0IHtcbiAgQklORF9LSU5EX1RZUEUsXG4gIEJJTkRfRkxBR1NfVFNfRU5VTSxcbiAgQklORF9GTEFHU19UU19DT05TVF9FTlVNLFxuICBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZLFxuICBCSU5EX0tJTkRfVkFMVUUsXG4gIEJJTkRfRkxBR1NfQ0xBU1MsXG4gIHR5cGUgU2NvcGVGbGFncyxcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIEJJTkRfRkxBR1NfVFNfSU1QT1JULFxuICBTQ09QRV9UU19NT0RVTEUsXG59IGZyb20gXCIuLi8uLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuXG5jbGFzcyBUeXBlU2NyaXB0U2NvcGUgZXh0ZW5kcyBTY29wZSB7XG4gIHR5cGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBlbnVtcyAod2hpY2ggYXJlIGFsc28gaW4gLnR5cGVzKVxuICBlbnVtczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gY29uc3QgZW51bXMgKHdoaWNoIGFyZSBhbHNvIGluIC5lbnVtcyBhbmQgLnR5cGVzKVxuICBjb25zdEVudW1zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBjbGFzc2VzICh3aGljaCBhcmUgYWxzbyBpbiAubGV4aWNhbCkgYW5kIGludGVyZmFjZSAod2hpY2ggYXJlIGFsc28gaW4gLnR5cGVzKVxuICBjbGFzc2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBuYW1lc3BhY2VzIGFuZCBhbWJpZW50IGZ1bmN0aW9ucyAob3IgY2xhc3NlcykgYXJlIHRvbyBkaWZmaWN1bHQgdG8gdHJhY2ssXG4gIC8vIGVzcGVjaWFsbHkgd2l0aG91dCB0eXBlIGFuYWx5c2lzLlxuICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZW0gYW55d2F5LCB0byBhdm9pZCBcIlggaXMgbm90IGRlZmluZWRcIiBlcnJvcnNcbiAgLy8gd2hlbiBleHBvcnRpbmcgdGhlbS5cbiAgZXhwb3J0T25seUJpbmRpbmdzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbn1cblxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzk3NjYjZGlzY3Vzc2lvbl9yMjY4OTIwNzMwIGZvciBhblxuLy8gZXhwbGFuYXRpb24gb2YgaG93IHR5cGVzY3JpcHQgaGFuZGxlcyBzY29wZS5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZVNjcmlwdFNjb3BlSGFuZGxlciBleHRlbmRzIFNjb3BlSGFuZGxlcjxUeXBlU2NyaXB0U2NvcGU+IHtcbiAgaW1wb3J0c1N0YWNrOiBTZXQ8c3RyaW5nPltdID0gW107XG5cbiAgY3JlYXRlU2NvcGUoZmxhZ3M6IFNjb3BlRmxhZ3MpOiBUeXBlU2NyaXB0U2NvcGUge1xuICAgIHRoaXMuaW1wb3J0c1N0YWNrLnB1c2gobmV3IFNldCgpKTsgLy8gQWx3YXlzIGtlZXAgdGhlIHRvcC1sZXZlbCBzY29wZSBmb3IgZXhwb3J0IGNoZWNrcy5cblxuICAgIHJldHVybiBuZXcgVHlwZVNjcmlwdFNjb3BlKGZsYWdzKTtcbiAgfVxuXG4gIGVudGVyKGZsYWdzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZmxhZ3MgPT0gU0NPUEVfVFNfTU9EVUxFKSB7XG4gICAgICB0aGlzLmltcG9ydHNTdGFjay5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuXG4gICAgc3VwZXIuZW50ZXIoZmxhZ3MpO1xuICB9XG5cbiAgZXhpdCgpIHtcbiAgICBjb25zdCBmbGFncyA9IHN1cGVyLmV4aXQoKTtcblxuICAgIGlmIChmbGFncyA9PSBTQ09QRV9UU19NT0RVTEUpIHtcbiAgICAgIHRoaXMuaW1wb3J0c1N0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIGhhc0ltcG9ydChuYW1lOiBzdHJpbmcsIGFsbG93U2hhZG93PzogYm9vbGVhbikge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMuaW1wb3J0c1N0YWNrLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbXBvcnRzU3RhY2tbbGVuIC0gMV0uaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd1NoYWRvdyAmJiBsZW4gPiAxKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRzU3RhY2tbaV0uaGFzKG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVjbGFyZU5hbWUobmFtZTogc3RyaW5nLCBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLCBsb2M6IFBvc2l0aW9uKSB7XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9GTEFHU19UU19JTVBPUlQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0ltcG9ydChuYW1lLCB0cnVlKSkge1xuICAgICAgICB0aGlzLnBhcnNlci5yYWlzZShFcnJvcnMuVmFyUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICAgIGF0OiBsb2MsXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5pbXBvcnRzU3RhY2tbdGhpcy5pbXBvcnRzU3RhY2subGVuZ3RoIC0gMV0uYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VYUE9SVF9PTkxZKSB7XG4gICAgICB0aGlzLm1heWJlRXhwb3J0RGVmaW5lZChzY29wZSwgbmFtZSk7XG4gICAgICBzY29wZS5leHBvcnRPbmx5QmluZGluZ3MuYWRkKG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmRlY2xhcmVOYW1lKG5hbWUsIGJpbmRpbmdUeXBlLCBsb2MpO1xuXG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1RZUEUpIHtcbiAgICAgIGlmICghKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1ZBTFVFKSkge1xuICAgICAgICAvLyBcIlZhbHVlXCIgYmluZGluZ3MgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGUgc3VwZXJjbGFzcy5cbiAgICAgICAgdGhpcy5jaGVja1JlZGVjbGFyYXRpb25JblNjb3BlKHNjb3BlLCBuYW1lLCBiaW5kaW5nVHlwZSwgbG9jKTtcbiAgICAgICAgdGhpcy5tYXliZUV4cG9ydERlZmluZWQoc2NvcGUsIG5hbWUpO1xuICAgICAgfVxuICAgICAgc2NvcGUudHlwZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VOVU0pIHNjb3BlLmVudW1zLmFkZChuYW1lKTtcbiAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0pIHNjb3BlLmNvbnN0RW51bXMuYWRkKG5hbWUpO1xuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfQ0xBU1MpIHNjb3BlLmNsYXNzZXMuYWRkKG5hbWUpO1xuICB9XG5cbiAgaXNSZWRlY2xhcmVkSW5TY29wZShcbiAgICBzY29wZTogVHlwZVNjcmlwdFNjb3BlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoc2NvcGUuZW51bXMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0VOVU0pIHtcbiAgICAgICAgLy8gRW51bXMgY2FuIGJlIG1lcmdlZCB3aXRoIG90aGVyIGVudW1zIGlmIHRoZXkgYXJlIGJvdGhcbiAgICAgICAgLy8gIGNvbnN0IG9yIGJvdGggbm9uLWNvbnN0LlxuICAgICAgICBjb25zdCBpc0NvbnN0ID0gISEoYmluZGluZ1R5cGUgJiBCSU5EX0ZMQUdTX1RTX0NPTlNUX0VOVU0pO1xuICAgICAgICBjb25zdCB3YXNDb25zdCA9IHNjb3BlLmNvbnN0RW51bXMuaGFzKG5hbWUpO1xuICAgICAgICByZXR1cm4gaXNDb25zdCAhPT0gd2FzQ29uc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9GTEFHU19DTEFTUyAmJiBzY29wZS5jbGFzc2VzLmhhcyhuYW1lKSkge1xuICAgICAgaWYgKHNjb3BlLmxleGljYWwuaGFzKG5hbWUpKSB7XG4gICAgICAgIC8vIENsYXNzZXMgY2FuIGJlIG1lcmdlZCB3aXRoIGludGVyZmFjZXNcbiAgICAgICAgcmV0dXJuICEhKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1ZBTFVFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVyZmFjZSBjYW4gYmUgbWVyZ2VkIHdpdGggb3RoZXIgY2xhc3NlcyBvciBpbnRlcmZhY2VzXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJpbmRpbmdUeXBlICYgQklORF9LSU5EX1RZUEUgJiYgc2NvcGUudHlwZXMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuaXNSZWRlY2xhcmVkSW5TY29wZShzY29wZSwgbmFtZSwgYmluZGluZ1R5cGUpO1xuICB9XG5cbiAgY2hlY2tMb2NhbEV4cG9ydChpZDogTi5JZGVudGlmaWVyKSB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSBpZDtcblxuICAgIGlmICh0aGlzLmhhc0ltcG9ydChuYW1lKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGVuID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgaWYgKHNjb3BlLnR5cGVzLmhhcyhuYW1lKSB8fCBzY29wZS5leHBvcnRPbmx5QmluZGluZ3MuaGFzKG5hbWUpKSByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIuY2hlY2tMb2NhbEV4cG9ydChpZCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHsgdHQsIHR5cGUgVG9rZW5UeXBlIH0gZnJvbSBcIi4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUge1xuICBBc3NpZ25tZW50UGF0dGVybixcbiAgVFNQYXJhbWV0ZXJQcm9wZXJ0eSxcbiAgRGVjb3JhdG9yLFxuICBFeHByZXNzaW9uLFxuICBJZGVudGlmaWVyLFxuICBOb2RlLFxuICBQYXR0ZXJuLFxuICBSZXN0RWxlbWVudCxcbiAgU3ByZWFkRWxlbWVudCxcbiAgT2JqZWN0T3JDbGFzc01lbWJlcixcbiAgQ2xhc3NNZW1iZXIsXG4gIE9iamVjdE1lbWJlcixcbiAgVHNOYW1lZFR5cGVFbGVtZW50QmFzZSxcbiAgUHJpdmF0ZU5hbWUsXG4gIE9iamVjdEV4cHJlc3Npb24sXG4gIE9iamVjdFBhdHRlcm4sXG4gIEFycmF5RXhwcmVzc2lvbixcbiAgQXJyYXlQYXR0ZXJuLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUG9zLCBQb3NpdGlvbiB9IGZyb20gXCIuLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQge1xuICBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkLFxuICBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQsXG59IGZyb20gXCIuLi91dGlsL2lkZW50aWZpZXJcIjtcbmltcG9ydCB7IE5vZGVVdGlscywgdHlwZSBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5pbXBvcnQge1xuICB0eXBlIEJpbmRpbmdUeXBlcyxcbiAgQklORF9OT05FLFxuICBCSU5EX0ZMQUdTX05PX0xFVF9JTl9MRVhJQ0FMLFxufSBmcm9tIFwiLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25FcnJvcnMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBFcnJvcnMsIHR5cGUgTFZhbEFuY2VzdG9yIH0gZnJvbSBcIi4uL3BhcnNlLWVycm9yXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgZ2V0T3duID0gPFQgZXh0ZW5kcyB7fT4ob2JqZWN0OiBULCBrZXk6IGtleW9mIFQpID0+XG4gIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBvYmplY3Rba2V5XTtcblxuY29uc3QgdW53cmFwUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSAobm9kZTogTm9kZSk6IE5vZGUgPT4ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCJcbiAgICA/IHVud3JhcFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbilcbiAgICA6IG5vZGU7XG59O1xuXG5leHBvcnQgY29uc3QgZW51bSBQYXJzZUJpbmRpbmdMaXN0RmxhZ3Mge1xuICBBTExPV19FTVBUWSA9IDEgPDwgMCxcbiAgSVNfRlVOQ1RJT05fUEFSQU1TID0gMSA8PCAxLFxuICBJU19DT05TVFJVQ1RPUl9QQVJBTVMgPSAxIDw8IDIsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIExWYWxQYXJzZXIgZXh0ZW5kcyBOb2RlVXRpbHMge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIGV4cHJlc3Npb24uanNcbiAgYWJzdHJhY3QgcGFyc2VJZGVudGlmaWVyKGxpYmVyYWw/OiBib29sZWFuKTogSWRlbnRpZmllcjtcbiAgYWJzdHJhY3QgcGFyc2VNYXliZUFzc2lnbihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWZ0ZXJMZWZ0UGFyc2U/OiBGdW5jdGlvbixcbiAgICByZWZOZWVkc0Fycm93UG9zPzogUG9zIHwgbnVsbCxcbiAgKTogRXhwcmVzc2lvbjtcblxuICBhYnN0cmFjdCBwYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWZ0ZXJMZWZ0UGFyc2U/OiBGdW5jdGlvbixcbiAgICByZWZOZWVkc0Fycm93UG9zPzogUG9zIHwgbnVsbCxcbiAgKTogRXhwcmVzc2lvbjtcblxuICBhYnN0cmFjdCBwYXJzZU9iamVjdExpa2U8VCBleHRlbmRzIE9iamVjdFBhdHRlcm4gfCBPYmplY3RFeHByZXNzaW9uPihcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICBpc1JlY29yZD86IGJvb2xlYW4sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMsXG4gICk6IFQ7XG4gIGFic3RyYWN0IHBhcnNlT2JqUHJvcFZhbHVlKFxuICAgIHByb3A6IGFueSxcbiAgICBzdGFydExvYzogUG9zaXRpb24gfCBudWxsLFxuICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiB2b2lkO1xuICBhYnN0cmFjdCBwYXJzZVByb3BlcnR5TmFtZShcbiAgICBwcm9wOiBPYmplY3RPckNsYXNzTWVtYmVyIHwgQ2xhc3NNZW1iZXIgfCBUc05hbWVkVHlwZUVsZW1lbnRCYXNlLFxuICApOiBFeHByZXNzaW9uIHwgSWRlbnRpZmllcjtcbiAgYWJzdHJhY3QgcGFyc2VQcml2YXRlTmFtZSgpOiBQcml2YXRlTmFtZTtcbiAgLy8gRm9yd2FyZC1kZWNsYXJhdGlvbjogZGVmaW5lZCBpbiBzdGF0ZW1lbnQuanNcbiAgYWJzdHJhY3QgcGFyc2VEZWNvcmF0b3IoKTogRGVjb3JhdG9yO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGV4aXN0aW5nIGV4cHJlc3Npb24gYXRvbSB0byBhc3NpZ25hYmxlIHBhdHRlcm5cbiAgICogaWYgcG9zc2libGUuIEFsc28gY2hlY2tzIGludmFsaWQgZGVzdHJ1Y3R1cmluZyB0YXJnZXRzOlxuICAgKlxuICAgKiAtIFBhcmVudGhlc2l6ZWQgRGVzdHJ1Y3R1cmluZyBwYXR0ZXJuc1xuICAgKiAtIFJlc3RFbGVtZW50IGlzIG5vdCB0aGUgbGFzdCBlbGVtZW50XG4gICAqIC0gTWlzc2luZyBgPWAgaW4gYXNzaWdubWVudCBwYXR0ZXJuXG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBcImlzQXNzaWduYWJsZVwiIG1ldGhvZC5cbiAgICogV2hlbiB0aGlzIG9uZSBpcyB1cGRhdGVkLCBwbGVhc2UgY2hlY2sgaWYgYWxzbyB0aGF0IG9uZSBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZSBUaGUgZXhwcmVzc2lvbiBhdG9tXG4gICAqIEBwYXJhbSBpc0xIUyBXaGV0aGVyIHdlIGFyZSBwYXJzaW5nIGEgTGVmdEhhbmRTaWRlRXhwcmVzc2lvbi5cbiAgICogICAgICAgICAgICAgIElmIGlzTEhTIGlzIGB0cnVlYCwgdGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgYWxsb3dlZDogYFsoYSldID0gWzBdYCwgYFsoYS5iKV0gPSBbMF1gXG4gICAqICAgICAgICAgICAgICBJZiBpc0xIUyBpcyBgZmFsc2VgLCB3ZSBhcmUgaW4gYW4gYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVycyBsaXN0LlxuICAgKi9cbiAgdG9Bc3NpZ25hYmxlKG5vZGU6IE5vZGUsIGlzTEhTOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBsZXQgcGFyZW50aGVzaXplZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZS50eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIgfHwgbm9kZS5leHRyYT8ucGFyZW50aGVzaXplZCkge1xuICAgICAgcGFyZW50aGVzaXplZCA9IHVud3JhcFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGUpO1xuICAgICAgaWYgKGlzTEhTKSB7XG4gICAgICAgIC8vIGFuIExIUyBjYW4gYmUgcmVpbnRlcnByZXRlZCB0byBhIGJpbmRpbmcgcGF0dGVybiBidXQgbm90IHZpY2UgdmVyc2EuXG4gICAgICAgIC8vIHRoZXJlZm9yZSBhIHBhcmVudGhlc2l6ZWQgaWRlbnRpZmllciBpcyBhbWJpZ3VvdXMgdW50aWwgd2UgYXJlIHN1cmUgaXQgaXMgYW4gYXNzaWdubWVudCBleHByZXNzaW9uXG4gICAgICAgIC8vIGkuZS4gYChbKGEpID0gW11dID0gW10pID0+IHt9YFxuICAgICAgICAvLyBzZWUgYWxzbyBgcmVjb3JkQXJyb3dQYXJhbWV0ZXJCaW5kaW5nRXJyb3JgIHNpZ25hdHVyZSBpbiBwYWNrYWdlcy9iYWJlbC1wYXJzZXIvc3JjL3V0aWwvZXhwcmVzc2lvbi1zY29wZS5qc1xuICAgICAgICBpZiAocGFyZW50aGVzaXplZC50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFycm93UGFyYW1ldGVyQmluZGluZ0Vycm9yKFxuICAgICAgICAgICAgRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudCxcbiAgICAgICAgICAgIHsgYXQ6IG5vZGUgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudGhlc2l6ZWQudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAvLyBBIHBhcmVudGhlc2l6ZWQgbWVtYmVyIGV4cHJlc3Npb24gY2FuIGJlIGluIExIUyBidXQgbm90IGluIHBhdHRlcm4uXG4gICAgICAgICAgLy8gSWYgdGhlIExIUyBpcyBsYXRlciBpbnRlcnByZXRlZCBhcyBhIHBhdHRlcm4sIGBjaGVja0xWYWxgIHdpbGwgdGhyb3cgZm9yIG1lbWJlciBleHByZXNzaW9uIGJpbmRpbmdcbiAgICAgICAgICAvLyBpLmUuIGAoWyhhLmIpID0gW11dID0gW10pID0+IHt9YFxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRQYXJlbnRoZXNpemVkQXNzaWdubWVudCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZFBhcmVudGhlc2l6ZWRBc3NpZ25tZW50LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBsZXQgaSA9IDAsIGxlbmd0aCA9IG5vZGUucHJvcGVydGllcy5sZW5ndGgsIGxhc3QgPSBsZW5ndGggLSAxO1xuICAgICAgICAgIGkgPCBsZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBub2RlLnByb3BlcnRpZXNbaV07XG4gICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gbGFzdDtcbiAgICAgICAgICB0aGlzLnRvQXNzaWduYWJsZU9iamVjdEV4cHJlc3Npb25Qcm9wKHByb3AsIGlzTGFzdCwgaXNMSFMpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNMYXN0ICYmXG4gICAgICAgICAgICBwcm9wLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIiAmJlxuICAgICAgICAgICAgbm9kZS5leHRyYT8udHJhaWxpbmdDb21tYUxvY1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgYXQ6IG5vZGUuZXh0cmEudHJhaWxpbmdDb21tYUxvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk9iamVjdFByb3BlcnR5XCI6IHtcbiAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBub2RlO1xuICAgICAgICBpZiAodGhpcy5pc1ByaXZhdGVOYW1lKGtleSkpIHtcbiAgICAgICAgICB0aGlzLmNsYXNzU2NvcGUudXNlUHJpdmF0ZU5hbWUoXG4gICAgICAgICAgICB0aGlzLmdldFByaXZhdGVOYW1lU1Yoa2V5KSxcbiAgICAgICAgICAgIGtleS5sb2Muc3RhcnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZSh2YWx1ZSwgaXNMSFMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbnRlcm5hbCBAYmFiZWwvcGFyc2VyIGVycm9yICh0aGlzIGlzIGEgYnVnLCBwbGVhc2UgcmVwb3J0IGl0KS5cIiArXG4gICAgICAgICAgICBcIiBTcHJlYWRFbGVtZW50IHNob3VsZCBiZSBjb252ZXJ0ZWQgYnkgLnRvQXNzaWduYWJsZSdzIGNhbGxlci5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcIkFycmF5RXhwcmVzc2lvblwiOlxuICAgICAgICBub2RlLnR5cGUgPSBcIkFycmF5UGF0dGVyblwiO1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZUxpc3QoXG4gICAgICAgICAgbm9kZS5lbGVtZW50cyxcbiAgICAgICAgICBub2RlLmV4dHJhPy50cmFpbGluZ0NvbW1hTG9jLFxuICAgICAgICAgIGlzTEhTLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICAgIGlmIChub2RlLm9wZXJhdG9yICE9PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1pc3NpbmdFcUluQXNzaWdubWVudCwgeyBhdDogbm9kZS5sZWZ0LmxvYy5lbmQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnR5cGUgPSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI7XG4gICAgICAgIGRlbGV0ZSBub2RlLm9wZXJhdG9yO1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmxlZnQsIGlzTEhTKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgICAgICAvKjo6aW52YXJpYW50IChwYXJlbnRoZXNpemVkICE9PSB1bmRlZmluZWQpICovXG4gICAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHBhcmVudGhlc2l6ZWQsIGlzTEhTKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBXZSBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggdGhpcyBub2RlLiBJdCB3aWxsXG4gICAgICAvLyBiZSByZXBvcnRlZCBieSBhIGxhdGVyIGNhbGwgdG8gY2hlY2tMVmFsXG4gICAgfVxuICB9XG5cbiAgdG9Bc3NpZ25hYmxlT2JqZWN0RXhwcmVzc2lvblByb3AoXG4gICAgcHJvcDogTm9kZSxcbiAgICBpc0xhc3Q6IGJvb2xlYW4sXG4gICAgaXNMSFM6IGJvb2xlYW4sXG4gICkge1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiT2JqZWN0TWV0aG9kXCIpIHtcbiAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgIHByb3Aua2luZCA9PT0gXCJnZXRcIiB8fCBwcm9wLmtpbmQgPT09IFwic2V0XCJcbiAgICAgICAgICA/IEVycm9ycy5QYXR0ZXJuSGFzQWNjZXNzb3JcbiAgICAgICAgICA6IEVycm9ycy5QYXR0ZXJuSGFzTWV0aG9kLFxuICAgICAgICB7IGF0OiBwcm9wLmtleSB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByb3AudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpIHtcbiAgICAgIHByb3AudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgIGNvbnN0IGFyZyA9IHByb3AuYXJndW1lbnQ7XG4gICAgICB0aGlzLmNoZWNrVG9SZXN0Q29udmVyc2lvbihhcmcsIC8qIGFsbG93UGF0dGVybiAqLyBmYWxzZSk7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShhcmcsIGlzTEhTKTtcblxuICAgICAgaWYgKCFpc0xhc3QpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWEsIHsgYXQ6IHByb3AgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHByb3AsIGlzTEhTKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb252ZXJ0IGxpc3Qgb2YgZXhwcmVzc2lvbiBhdG9tcyB0byBiaW5kaW5nIGxpc3QuXG5cbiAgdG9Bc3NpZ25hYmxlTGlzdChcbiAgICBleHByTGlzdDogRXhwcmVzc2lvbltdLFxuICAgIHRyYWlsaW5nQ29tbWFMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBpc0xIUzogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZW5kID0gZXhwckxpc3QubGVuZ3RoIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSBleHByTGlzdFtpXTtcbiAgICAgIGlmICghZWx0KSBjb250aW51ZTtcblxuICAgICAgaWYgKGVsdC50eXBlID09PSBcIlNwcmVhZEVsZW1lbnRcIikge1xuICAgICAgICBlbHQudHlwZSA9IFwiUmVzdEVsZW1lbnRcIjtcbiAgICAgICAgY29uc3QgYXJnID0gZWx0LmFyZ3VtZW50O1xuICAgICAgICB0aGlzLmNoZWNrVG9SZXN0Q29udmVyc2lvbihhcmcsIC8qIGFsbG93UGF0dGVybiAqLyB0cnVlKTtcbiAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUoYXJnLCBpc0xIUyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShlbHQsIGlzTEhTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsdC50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgICAgaWYgKGkgPCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5SZXN0VHJhaWxpbmdDb21tYSwgeyBhdDogZWx0IH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWlsaW5nQ29tbWFMb2MpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5SZXN0VHJhaWxpbmdDb21tYSwgeyBhdDogdHJhaWxpbmdDb21tYUxvYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzQXNzaWduYWJsZShub2RlOiBOb2RlLCBpc0JpbmRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGNhc2UgXCJPYmplY3RFeHByZXNzaW9uXCI6IHtcbiAgICAgICAgY29uc3QgbGFzdCA9IG5vZGUucHJvcGVydGllcy5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gKG5vZGUucHJvcGVydGllcyBhcyBPYmplY3RFeHByZXNzaW9uW1wicHJvcGVydGllc1wiXSkuZXZlcnkoXG4gICAgICAgICAgKHByb3AsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHByb3AudHlwZSAhPT0gXCJPYmplY3RNZXRob2RcIiAmJlxuICAgICAgICAgICAgICAoaSA9PT0gbGFzdCB8fCBwcm9wLnR5cGUgIT09IFwiU3ByZWFkRWxlbWVudFwiKSAmJlxuICAgICAgICAgICAgICB0aGlzLmlzQXNzaWduYWJsZShwcm9wKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUudmFsdWUpO1xuXG4gICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0Fzc2lnbmFibGUobm9kZS5hcmd1bWVudCk7XG5cbiAgICAgIGNhc2UgXCJBcnJheUV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIChub2RlIGFzIEFycmF5RXhwcmVzc2lvbikuZWxlbWVudHMuZXZlcnkoXG4gICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50ID09PSBudWxsIHx8IHRoaXMuaXNBc3NpZ25hYmxlKGVsZW1lbnQpLFxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUub3BlcmF0b3IgPT09IFwiPVwiO1xuXG4gICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbik7XG5cbiAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgIHJldHVybiAhaXNCaW5kaW5nO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBsaXN0IG9mIGV4cHJlc3Npb24gYXRvbXMgdG8gYSBsaXN0IG9mXG5cbiAgdG9SZWZlcmVuY2VkTGlzdChcbiAgICBleHByTGlzdDogUmVhZG9ubHlBcnJheTxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLFxuICApOiBSZWFkb25seUFycmF5PEV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgcmV0dXJuIGV4cHJMaXN0O1xuICB9XG5cbiAgdG9SZWZlcmVuY2VkTGlzdERlZXAoXG4gICAgZXhwckxpc3Q6IFJlYWRvbmx5QXJyYXk8RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB8IG51bGw+LFxuICAgIGlzUGFyZW50aGVzaXplZEV4cHI/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3QoZXhwckxpc3QsIGlzUGFyZW50aGVzaXplZEV4cHIpO1xuXG4gICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJMaXN0KSB7XG4gICAgICBpZiAoZXhwcj8udHlwZSA9PT0gXCJBcnJheUV4cHJlc3Npb25cIikge1xuICAgICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3REZWVwKGV4cHIuZWxlbWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBzcHJlYWQgZWxlbWVudC5cblxuICBwYXJzZVNwcmVhZChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBTcHJlYWRFbGVtZW50IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8U3ByZWFkRWxlbWVudD4oKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJpbmRpbmdSZXN0UHJvcGVydHlcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1Jlc3RFbGVtZW50XG4gIHBhcnNlUmVzdEJpbmRpbmcodGhpczogUGFyc2VyKTogUmVzdEVsZW1lbnQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxSZXN0RWxlbWVudD4oKTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAuLi5gXG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXN0RWxlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBsdmFsdWUgKGFzc2lnbmFibGUpIGF0b20uXG4gIHBhcnNlQmluZGluZ0F0b20odGhpczogUGFyc2VyKTogUGF0dGVybiB7XG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1BhdHRlcm5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgY2FzZSB0dC5icmFja2V0TDoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8QXJyYXlQYXR0ZXJuPigpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogRml4bWU6IFRTUGFyYW1ldGVyUHJvcGVydHkgY2FuIG5vdCBiZSBhc3NpZ25lZCB0byBub2RlLmVsZW1lbnRzXG4gICAgICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlQmluZGluZ0xpc3QoXG4gICAgICAgICAgdHQuYnJhY2tldFIsXG4gICAgICAgICAgY2hhckNvZGVzLnJpZ2h0U3F1YXJlQnJhY2tldCxcbiAgICAgICAgICBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuQUxMT1dfRU1QVFksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheVBhdHRlcm5cIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuYnJhY2VMOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU9iamVjdExpa2UodHQuYnJhY2VSLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nSWRlbnRpZmllclxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ0VsZW1lbnRMaXN0XG4gIHBhcnNlQmluZGluZ0xpc3QoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgY2xvc2VDaGFyQ29kZTogKHR5cGVvZiBjaGFyQ29kZXMpW2tleW9mIHR5cGVvZiBjaGFyQ29kZXNdLFxuICAgIGZsYWdzOiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MsXG4gICk6IEFycmF5PFBhdHRlcm4gfCBUU1BhcmFtZXRlclByb3BlcnR5PiB7XG4gICAgY29uc3QgYWxsb3dFbXB0eSA9IGZsYWdzICYgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLkFMTE9XX0VNUFRZO1xuXG4gICAgY29uc3QgZWx0czogQXJyYXk8UGF0dGVybiB8IFRTUGFyYW1ldGVyUHJvcGVydHk+ID0gW107XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICB3aGlsZSAoIXRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dFbXB0eSAmJiB0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgICBlbHRzLnB1c2gobnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5lbGxpcHNpcykpIHtcbiAgICAgICAgZWx0cy5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyh0aGlzLnBhcnNlUmVzdEJpbmRpbmcoKSwgZmxhZ3MpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tDb21tYUFmdGVyUmVzdChjbG9zZUNoYXJDb2RlKSkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KGNsb3NlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5hdCkgJiYgdGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRQYXJhbWV0ZXJEZWNvcmF0b3IsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludmFyaWFudDogaGFzUGx1Z2luKFwiZGVjb3JhdG9ycy1sZWdhY3lcIilcbiAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWx0cy5wdXNoKHRoaXMucGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW0oZmxhZ3MsIGRlY29yYXRvcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsdHM7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nUmVzdFByb3BlcnR5XG4gIHBhcnNlQmluZGluZ1Jlc3RQcm9wZXJ0eShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcHJvcDogVW5kb25lPFJlc3RFbGVtZW50PixcbiAgKTogUmVzdEVsZW1lbnQge1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJy4uLidcbiAgICAvLyBEb24ndCB1c2UgcGFyc2VSZXN0QmluZGluZygpIGFzIHdlIG9ubHkgYWxsb3cgSWRlbnRpZmllciBoZXJlLlxuICAgIHByb3AuYXJndW1lbnQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIHRoaXMuY2hlY2tDb21tYUFmdGVyUmVzdChjaGFyQ29kZXMucmlnaHRDdXJseUJyYWNlKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiUmVzdEVsZW1lbnRcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1CaW5kaW5nUHJvcGVydHlcbiAgcGFyc2VCaW5kaW5nUHJvcGVydHkodGhpczogUGFyc2VyKTogT2JqZWN0TWVtYmVyIHwgUmVzdEVsZW1lbnQge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnN0YXJ0Tm9kZTxPYmplY3RNZW1iZXIgfCBSZXN0RWxlbWVudD4oKTtcbiAgICBjb25zdCB7IHR5cGUsIHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0eXBlID09PSB0dC5lbGxpcHNpcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VCaW5kaW5nUmVzdFByb3BlcnR5KHByb3AgYXMgVW5kb25lPFJlc3RFbGVtZW50Pik7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSB0dC5wcml2YXRlTmFtZSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJkZXN0cnVjdHVyaW5nUHJpdmF0ZVwiLCBzdGFydExvYyk7XG4gICAgICB0aGlzLmNsYXNzU2NvcGUudXNlUHJpdmF0ZU5hbWUodGhpcy5zdGF0ZS52YWx1ZSwgc3RhcnRMb2MpO1xuICAgICAgKHByb3AgYXMgVW5kb25lPE9iamVjdE1lbWJlcj4pLmtleSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3AgYXMgVW5kb25lPE9iamVjdE1lbWJlcj4pO1xuICAgIH1cbiAgICAocHJvcCBhcyBVbmRvbmU8T2JqZWN0TWVtYmVyPikubWV0aG9kID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgICBwcm9wIGFzIFVuZG9uZTxPYmplY3RNZW1iZXI+LFxuICAgICAgc3RhcnRMb2MsXG4gICAgICBmYWxzZSAvKiBpc0dlbmVyYXRvciAqLyxcbiAgICAgIGZhbHNlIC8qIGlzQXN5bmMgKi8sXG4gICAgICB0cnVlIC8qIGlzUGF0dGVybiAqLyxcbiAgICAgIGZhbHNlIC8qIGlzQWNjZXNzb3IgKi8sXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgIGRlY29yYXRvcnM6IERlY29yYXRvcltdLFxuICApOiBQYXR0ZXJuIHwgVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQoKTtcbiAgICB0aGlzLnBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMobGVmdCwgZmxhZ3MpO1xuICAgIGNvbnN0IGVsdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQobGVmdC5sb2Muc3RhcnQsIGxlZnQpO1xuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgbGVmdC5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICB9XG4gICAgcmV0dXJuIGVsdDtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgZmxvdy90eXBlc2NyaXB0IHBsdWdpbiB0byBhZGQgdHlwZSBhbm5vdGF0aW9ucyB0byBiaW5kaW5nIGVsZW1lbnRzXG4gIHBhcnNlQXNzaWduYWJsZUxpc3RJdGVtVHlwZXMoXG4gICAgcGFyYW06IFBhdHRlcm4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGZsYWdzOiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MsXG4gICk6IFBhdHRlcm4ge1xuICAgIHJldHVybiBwYXJhbTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBhc3NpZ25tZW50IHBhdHRlcm4gYXJvdW5kIGdpdmVuIGF0b20gaWYgcG9zc2libGUuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJpbmRpbmdFbGVtZW50XG4gIHBhcnNlTWF5YmVEZWZhdWx0KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBzdGFydExvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgICBsZWZ0PzogUGF0dGVybiB8IG51bGwsXG4gICk6IFBhdHRlcm4ge1xuICAgIHN0YXJ0TG9jID8/PSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGxlZnQgPSBsZWZ0ID8/IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIGlmICghdGhpcy5lYXQodHQuZXEpKSByZXR1cm4gbGVmdDtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PEFzc2lnbm1lbnRQYXR0ZXJuPihzdGFydExvYyk7XG4gICAgbm9kZS5sZWZ0ID0gbGVmdDtcbiAgICBub2RlLnJpZ2h0ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBc3NpZ25tZW50UGF0dGVyblwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGluZm9ybWF0aW9uIHVzZSBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgTm9kZSBvZiBhIGdpdmVuIHR5cGUgaXMgYW4gTFZhbCxcbiAgICogcG9zc2libHkgZ2l2ZW4gY2VydGFpbiBhZGRpdGlvbmFsIGNvbnRleHQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFN1YmNsYXNzZXIgbm90ZXM6IFRoaXMgbWV0aG9kIGhhcyBraW5kIG9mIGEgbG90IG9mIG1peGVkLCBidXQgcmVsYXRlZCxcbiAgICogcmVzcG9uc2liaWxpdGllcy4gSWYgd2UgY2FuIGRlZmluaXRpdmVseSBkZXRlcm1pbmUgd2l0aCB0aGUgaW5mb3JtYXRpb25cbiAgICogcHJvdmlkZWQgdGhhdCB0aGlzIGVpdGhlciAqaXMqIG9yICppc24ndCogYSB2YWxpZCBgTFZhbGAsIHRoZW4gdGhlIHJldHVyblxuICAgKiB2YWx1ZSBpcyBlYXN5OiBqdXN0IHJldHVybiBgdHJ1ZWAgb3IgYGZhbHNlYC4gSG93ZXZlciwgaWYgaXQgaXMgYSB2YWxpZFxuICAgKiBMVmFsICphbmNlc3RvciosIGFuZCB0aHVzIGl0cyBkZXNjZW5kYW50cyBtdXN0IGJlIHN1YnNlcXVlbnRseSB2aXNpdGVkIHRvXG4gICAqIGNvbnRpbnVlIHRoZSBcImludmVzdGlnYXRpb25cIiwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSByZWxldmFudFxuICAgKiBjaGlsZCBrZXkgYXMgYSBgc3RyaW5nYC4gSW4gc29tZSBzcGVjaWFsIGNhc2VzLCB5b3UgYWRkaXRpb25hbGx5IHdhbnQgdG9cbiAgICogY29udmV5IHRoYXQgdGhpcyBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgcGFyZW50aGVzaXplZC4gSW5cbiAgICogdGhhdCBjYXNlLCBhIHR1cGxlIG9mIFtrZXk6IHN0cmluZywgcGFyZW50aGVzaXplZDogYm9vbGVhbl0gaXMgcmV0dXJuZWQuXG4gICAqIFRoZSBgc3RyaW5nYC1vbmx5IHJldHVybiBvcHRpb24gaXMgYWN0dWFsbHkganVzdCBhIHNob3J0aGFuZCBmb3I6XG4gICAqIGBba2V5OiBzdHJpbmcsIHBhcmVudGhlc2l6ZWQ6IGZhbHNlXWAuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIEEgTm9kZSBgdHlwZWAgc3RyaW5nXG4gICAqIEBwYXJhbSBpc1VucGFyZW50aGVzaXplZEluQXNzaWduXG4gICAqICAgICAgICBXaGV0aGVyIHRoZSBub2RlIGluIHF1ZXN0aW9uIGlzIHVucGFyZW50aGVzaXplZCBhbmQgaXRzIHBhcmVudFxuICAgKiAgICAgICAgaXMgZWl0aGVyIGFuIGFzc2lnbm1lbnQgcGF0dGVybiBvciBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSBiaW5kaW5nXG4gICAqICAgICAgICBUaGUgYmluZGluZyBvcGVyYXRpb24gdGhhdCBpcyBiZWluZyBjb25zaWRlcmVkIGZvciB0aGlzIHBvdGVudGlhbFxuICAgKiAgICAgICAgTFZhbC5cbiAgICogQHJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGRldGVybWluZSB3aGV0aGVyIHRoZSBub2RlXG4gICAqICAgICAgICAgIHR5cGUgaW4gcXVlc3Rpb24gY2FuIGJlIHRyZWF0ZWQgYXMgYW4gYExWYWxgLlxuICAgKiAgICAgICAgICBBIGBzdHJpbmdgIGtleSB0byB0cmF2ZXJzZSBpZiB3ZSBtdXN0IGNoZWNrIHRoaXMgY2hpbGQuXG4gICAqICAgICAgICAgIEEgYFtzdHJpbmcsIGJvb2xlYW5dYCB0dXBsZSBpZiB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgY2hpbGQgYW5kXG4gICAqICAgICAgICAgIHRyZWF0IGlzIGFzIHBhcmVudGhlc2l6ZWQuXG4gICAqL1xuICBpc1ZhbGlkTFZhbChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGlzVW5wYXJlbnRoZXNpemVkSW5Bc3NpZ246IGJvb2xlYW4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGJpbmRpbmc6IEJpbmRpbmdUeXBlcyxcbiAgKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE93bihcbiAgICAgIHtcbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IFwibGVmdFwiLFxuICAgICAgICBSZXN0RWxlbWVudDogXCJhcmd1bWVudFwiLFxuICAgICAgICBPYmplY3RQcm9wZXJ0eTogXCJ2YWx1ZVwiLFxuICAgICAgICBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjogXCJleHByZXNzaW9uXCIsXG4gICAgICAgIEFycmF5UGF0dGVybjogXCJlbGVtZW50c1wiLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBcInByb3BlcnRpZXNcIixcbiAgICAgIH0sXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSBzdHJpbmcgdG8gZW51bVxuICAgICAgdHlwZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYW4gbHZhbCAoc29tZXRoaW5nIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvKS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gaW4gcXVlc3Rpb24gdG8gY2hlY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIEEgc2V0IG9mIG9wdGlvbnMgZGVzY3JpYmVkIGJlbG93LlxuICAgKiBAcGFyYW0gb3B0aW9ucy5pblxuICAgKiAgICAgICAgVGhlIHJlbGV2YW50IGFuY2VzdG9yIHRvIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVycm9yXG4gICAqICAgICAgICBpZiB0aGUgY2hlY2sgZmFpbHMuXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbmRpbmdcbiAgICogICAgICAgIFRoZSBkZXNpcmVkIGJpbmRpbmcgdHlwZS4gSWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgYW4gaWRlbnRpZmllclxuICAgKiAgICAgICAgYW5kIGBiaW5kaW5nYCBpcyBub3QgYEJJTkRfTk9ORWAsIGBjaGVja0xWYWxgIHdpbGwgcmVnaXN0ZXIgYmluZGluZ1xuICAgKiAgICAgICAgdG8gdGhlIHBhcnNlciBzY29wZSBTZWUgYWxzbyBgc3JjL3V0aWwvc2NvcGVmbGFncy5qc2BcbiAgICogQHBhcmFtIG9wdGlvbnMuY2hlY2tDbGFzaGVzXG4gICAqICAgICAgICBBbiBvcHRpb25hbCBzdHJpbmcgc2V0IHRvIGNoZWNrIGlmIGFuIGlkZW50aWZpZXIgbmFtZSBpcyBpbmNsdWRlZC5cbiAgICogICAgICAgIGBjaGVja0xWYWxgIHdpbGwgYWRkIGNoZWNrZWQgaWRlbnRpZmllciBuYW1lIHRvIGBjaGVja0NsYXNoZXNgIEl0IGlzXG4gICAqICAgICAgICB1c2VkIGluIHRyYWNraW5nIGR1cGxpY2F0ZXMgaW4gZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzLiBJZiBpdCBpc1xuICAgKiAgICAgICAgZmFsc2UsIGBjaGVja0xWYWxgIHdpbGwgc2tpcCBkdXBsaWNhdGUgY2hlY2tzXG4gICAqIEBwYXJhbSBvcHRpb25zLnN0cmljdE1vZGVDaGFuZ2VkXG4gICAqICAgICAgICBXaGV0aGVyIGFuIGlkZW50aWZpZXIgaGFzIGJlZW4gcGFyc2VkIGluIGEgc2xvcHB5IGNvbnRleHQgYnV0IHNob3VsZFxuICAgKiAgICAgICAgYmUgcmVpbnRlcnByZXRlZCBhcyBzdHJpY3QtbW9kZS4gZS5nLiBgKGFyZ3VtZW50cykgPT4geyBcInVzZSBzdHJpY3QgXCJ9YFxuICAgKiBAcGFyYW0gb3B0aW9ucy5oYXNQYXJlbnRoZXNpemVkQW5jZXN0b3JcbiAgICogICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGludGVybmFsbHkgZHVyaW5nIHJlY3Vyc2l2ZSBjYWxscywgYW5kIHlvdSBzaG91bGRcbiAgICogICAgICAgIG5vdCBoYXZlIHRvIHNldCBpdCB5b3Vyc2VsZi5cbiAgICovXG5cbiAgY2hlY2tMVmFsKFxuICAgIGV4cHJlc3Npb246IEV4cHJlc3Npb24gfCBPYmplY3RNZW1iZXIgfCBSZXN0RWxlbWVudCxcbiAgICB7XG4gICAgICBpbjogYW5jZXN0b3IsXG4gICAgICBiaW5kaW5nID0gQklORF9OT05FLFxuICAgICAgY2hlY2tDbGFzaGVzID0gZmFsc2UsXG4gICAgICBzdHJpY3RNb2RlQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgaW46IExWYWxBbmNlc3RvcjtcbiAgICAgIGJpbmRpbmc/OiBCaW5kaW5nVHlwZXM7XG4gICAgICBjaGVja0NsYXNoZXM/OiBTZXQ8c3RyaW5nPiB8IGZhbHNlO1xuICAgICAgc3RyaWN0TW9kZUNoYW5nZWQ/OiBib29sZWFuO1xuICAgICAgaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eXBlID0gZXhwcmVzc2lvbi50eXBlO1xuXG4gICAgLy8gSWYgd2UgZmluZCBoZXJlIGFuIE9iamVjdE1ldGhvZCwgaXQncyBiZWNhdXNlIHRoaXMgd2FzIG9yaWdpbmFsbHlcbiAgICAvLyBhbiBPYmplY3RFeHByZXNzaW9uIHdoaWNoIGhhcyB0aGVuIGJlZW4gY29udmVydGVkLlxuICAgIC8vIHRvQXNzaWduYWJsZSBhbHJlYWR5IHJlcG9ydGVkIHRoaXMgZXJyb3Igd2l0aCBhIG5pY2VyIG1lc3NhZ2UuXG4gICAgaWYgKHRoaXMuaXNPYmplY3RNZXRob2QoZXhwcmVzc2lvbikpIHJldHVybjtcblxuICAgIGlmICh0eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgaWYgKGJpbmRpbmcgIT09IEJJTkRfTk9ORSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkUHJvcGVydHlCaW5kaW5nUGF0dGVybiwgeyBhdDogZXhwcmVzc2lvbiB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgIHRoaXMuY2hlY2tJZGVudGlmaWVyKFxuICAgICAgICBleHByZXNzaW9uIGFzIElkZW50aWZpZXIsXG4gICAgICAgIGJpbmRpbmcsXG4gICAgICAgIHN0cmljdE1vZGVDaGFuZ2VkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeyBuYW1lIH0gPSBleHByZXNzaW9uIGFzIElkZW50aWZpZXI7XG5cbiAgICAgIGlmIChjaGVja0NsYXNoZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrQ2xhc2hlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5QYXJhbUR1cGUsIHsgYXQ6IGV4cHJlc3Npb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2tDbGFzaGVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRpdHkgPSB0aGlzLmlzVmFsaWRMVmFsKFxuICAgICAgdHlwZSxcbiAgICAgICEoaGFzUGFyZW50aGVzaXplZEFuY2VzdG9yIHx8IGV4cHJlc3Npb24uZXh0cmE/LnBhcmVudGhlc2l6ZWQpICYmXG4gICAgICAgIGFuY2VzdG9yLnR5cGUgPT09IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIixcbiAgICAgIGJpbmRpbmcsXG4gICAgKTtcblxuICAgIGlmICh2YWxpZGl0eSA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIGlmICh2YWxpZGl0eSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IFBhcnNlRXJyb3JDbGFzcyA9XG4gICAgICAgIGJpbmRpbmcgPT09IEJJTkRfTk9ORSA/IEVycm9ycy5JbnZhbGlkTGhzIDogRXJyb3JzLkludmFsaWRMaHNCaW5kaW5nO1xuXG4gICAgICB0aGlzLnJhaXNlKFBhcnNlRXJyb3JDbGFzcywgeyBhdDogZXhwcmVzc2lvbiwgYW5jZXN0b3IgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl0gPSBBcnJheS5pc0FycmF5KHZhbGlkaXR5KVxuICAgICAgPyB2YWxpZGl0eVxuICAgICAgOiBbdmFsaWRpdHksIHR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIl07XG4gICAgY29uc3QgbmV4dEFuY2VzdG9yID1cbiAgICAgIHR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIgfHxcbiAgICAgIHR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiIHx8XG4gICAgICB0eXBlID09PSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgPyAoeyB0eXBlIH0gYXMgY29uc3QpXG4gICAgICAgIDogYW5jZXN0b3I7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtYXkgbm90IGluZGV4IGV4cHJlc3Npb24uXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBbXS5jb25jYXQoZXhwcmVzc2lvbltrZXldKSkge1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIHRoaXMuY2hlY2tMVmFsKGNoaWxkLCB7XG4gICAgICAgICAgaW46IG5leHRBbmNlc3RvcixcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICAgIGNoZWNrQ2xhc2hlcyxcbiAgICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgICAgICBoYXNQYXJlbnRoZXNpemVkQW5jZXN0b3I6IGlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrSWRlbnRpZmllcihcbiAgICBhdDogSWRlbnRpZmllcixcbiAgICBiaW5kaW5nVHlwZTogQmluZGluZ1R5cGVzLFxuICAgIHN0cmljdE1vZGVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuc3RyaWN0ICYmXG4gICAgICAoc3RyaWN0TW9kZUNoYW5nZWRcbiAgICAgICAgPyBpc1N0cmljdEJpbmRSZXNlcnZlZFdvcmQoYXQubmFtZSwgdGhpcy5pbk1vZHVsZSlcbiAgICAgICAgOiBpc1N0cmljdEJpbmRPbmx5UmVzZXJ2ZWRXb3JkKGF0Lm5hbWUpKVxuICAgICkge1xuICAgICAgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX05PTkUpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3RyaWN0RXZhbEFyZ3VtZW50cywgeyBhdCwgcmVmZXJlbmNlTmFtZTogYXQubmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlN0cmljdEV2YWxBcmd1bWVudHNCaW5kaW5nLCB7XG4gICAgICAgICAgYXQsXG4gICAgICAgICAgYmluZGluZ05hbWU6IGF0Lm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiaW5kaW5nVHlwZSAmIEJJTkRfRkxBR1NfTk9fTEVUX0lOX0xFWElDQUwgJiYgYXQubmFtZSA9PT0gXCJsZXRcIikge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuTGV0SW5MZXhpY2FsQmluZGluZywgeyBhdCB9KTtcbiAgICB9XG5cbiAgICBpZiAoIShiaW5kaW5nVHlwZSAmIEJJTkRfTk9ORSkpIHtcbiAgICAgIHRoaXMuZGVjbGFyZU5hbWVGcm9tSWRlbnRpZmllcihhdCwgYmluZGluZ1R5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGRlY2xhcmVOYW1lRnJvbUlkZW50aWZpZXIoaWRlbnRpZmllcjogSWRlbnRpZmllciwgYmluZGluZzogQmluZGluZ1R5cGVzKSB7XG4gICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShpZGVudGlmaWVyLm5hbWUsIGJpbmRpbmcsIGlkZW50aWZpZXIubG9jLnN0YXJ0KTtcbiAgfVxuXG4gIGNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlOiBOb2RlLCBhbGxvd1BhdHRlcm46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgIHRoaXMuY2hlY2tUb1Jlc3RDb252ZXJzaW9uKG5vZGUuZXhwcmVzc2lvbiwgYWxsb3dQYXR0ZXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgICAgICBpZiAoYWxsb3dQYXR0ZXJuKSBicmVhaztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRSZXN0QXNzaWdubWVudFBhdHRlcm4sIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDb21tYUFmdGVyUmVzdChcbiAgICBjbG9zZTogKHR5cGVvZiBjaGFyQ29kZXMpW2tleW9mIHR5cGVvZiBjaGFyQ29kZXNdLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yYWlzZShcbiAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2xvc2VcbiAgICAgICAgPyBFcnJvcnMuUmVzdFRyYWlsaW5nQ29tbWFcbiAgICAgICAgOiBFcnJvcnMuRWxlbWVudEFmdGVyUmVzdCxcbiAgICAgIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICIvKjo6IGRlY2xhcmUgdmFyIGludmFyaWFudDsgKi9cblxuaW1wb3J0IHR5cGUgU3RhdGUgZnJvbSBcIi4uLy4uL3Rva2VuaXplci9zdGF0ZVwiO1xuaW1wb3J0IHtcbiAgdG9rZW5Jc0lkZW50aWZpZXIsXG4gIHRva2VuSXNUU0RlY2xhcmF0aW9uU3RhcnQsXG4gIHRva2VuSXNUU1R5cGVPcGVyYXRvcixcbiAgdG9rZW5PcGVyYXRvclByZWNlZGVuY2UsXG4gIHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyLFxuICB0dCxcbiAgdHlwZSBUb2tlblR5cGUsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdG9rZW5DYW5TdGFydEV4cHJlc3Npb24sXG59IGZyb20gXCIuLi8uLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGVzIGFzIHRjIH0gZnJvbSBcIi4uLy4uL3Rva2VuaXplci9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldCB9IGZyb20gXCIuLi8uLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi4uLy4uL3BhcnNlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIFNDT1BFX1RTX01PRFVMRSxcbiAgU0NPUEVfT1RIRVIsXG4gIEJJTkRfVFNfRU5VTSxcbiAgQklORF9UU19DT05TVF9FTlVNLFxuICBCSU5EX1RTX1RZUEUsXG4gIEJJTkRfVFNfSU5URVJGQUNFLFxuICBCSU5EX1RTX0FNQklFTlQsXG4gIEJJTkRfVFNfTkFNRVNQQUNFLFxuICBCSU5EX1RTX1RZUEVfSU1QT1JULFxuICBCSU5EX0NMQVNTLFxuICBCSU5EX05PTkUsXG4gIEJJTkRfRkxBR1NfVFNfSU1QT1JULFxufSBmcm9tIFwiLi4vLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgVHlwZVNjcmlwdFNjb3BlSGFuZGxlciBmcm9tIFwiLi9zY29wZVwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi8uLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZVN0YXRlbWVudEZsYWcgfSBmcm9tIFwiLi4vLi4vcGFyc2VyL3N0YXRlbWVudFwiO1xuaW1wb3J0IHsgUEFSQU0gfSBmcm9tIFwiLi4vLi4vdXRpbC9wcm9kdWN0aW9uLXBhcmFtZXRlclwiO1xuaW1wb3J0IHsgRXJyb3JzLCBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi8uLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuLi8uLi9wYXJzZXIvbm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBQYXR0ZXJuIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgSUpTWFBhcnNlck1peGluIH0gZnJvbSBcIi4uL2pzeFwiO1xuaW1wb3J0IHsgUGFyc2VCaW5kaW5nTGlzdEZsYWdzIH0gZnJvbSBcIi4uLy4uL3BhcnNlci9sdmFsXCI7XG5cbmNvbnN0IGdldE93biA9IDxUIGV4dGVuZHMge30+KG9iamVjdDogVCwga2V5OiBrZXlvZiBUKSA9PlxuICBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgb2JqZWN0W2tleV07XG5cbnR5cGUgVHNNb2RpZmllciA9XG4gIHwgXCJyZWFkb25seVwiXG4gIHwgXCJhYnN0cmFjdFwiXG4gIHwgXCJkZWNsYXJlXCJcbiAgfCBcInN0YXRpY1wiXG4gIHwgXCJvdmVycmlkZVwiXG4gIHwgXCJjb25zdFwiXG4gIHwgTi5BY2Nlc3NpYmlsaXR5XG4gIHwgTi5WYXJpYW5jZUFubm90YXRpb25zO1xuXG5mdW5jdGlvbiBub25OdWxsPFQ+KHg/OiBUIHwgbnVsbCk6IFQge1xuICBpZiAoeCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkICR7eH0gdmFsdWUuYCk7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIGFzc2VydCh4OiBib29sZWFuKTogdm9pZCB7XG4gIGlmICgheCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFzc2VydCBmYWlsXCIpO1xuICB9XG59XG5cbnR5cGUgUGFyc2luZ0NvbnRleHQgPVxuICB8IFwiRW51bU1lbWJlcnNcIlxuICB8IFwiSGVyaXRhZ2VDbGF1c2VFbGVtZW50XCJcbiAgfCBcIlR1cGxlRWxlbWVudFR5cGVzXCJcbiAgfCBcIlR5cGVNZW1iZXJzXCJcbiAgfCBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIjtcblxudHlwZSBNb2RpZmllckJhc2UgPSB7XG4gIGFjY2Vzc2liaWxpdHk/OiBOLkFjY2Vzc2liaWxpdHk7XG59ICYge1xuICBba2V5IGluIFRzTW9kaWZpZXJdPzogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG4vKiBlc2xpbnQgc29ydC1rZXlzOiBcImVycm9yXCIgKi9cbmNvbnN0IFRTRXJyb3JzID0gUGFyc2VFcnJvckVudW1gdHlwZXNjcmlwdGAoe1xuICBBYnN0cmFjdE1ldGhvZEhhc0ltcGxlbWVudGF0aW9uOiAoeyBtZXRob2ROYW1lIH06IHsgbWV0aG9kTmFtZTogc3RyaW5nIH0pID0+XG4gICAgYE1ldGhvZCAnJHttZXRob2ROYW1lfScgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gYmVjYXVzZSBpdCBpcyBtYXJrZWQgYWJzdHJhY3QuYCxcbiAgQWJzdHJhY3RQcm9wZXJ0eUhhc0luaXRpYWxpemVyOiAoe1xuICAgIHByb3BlcnR5TmFtZSxcbiAgfToge1xuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICB9KSA9PlxuICAgIGBQcm9wZXJ0eSAnJHtwcm9wZXJ0eU5hbWV9JyBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplciBiZWNhdXNlIGl0IGlzIG1hcmtlZCBhYnN0cmFjdC5gLFxuICBBY2Nlc29yQ2Fubm90RGVjbGFyZVRoaXNQYXJhbWV0ZXI6XG4gICAgXCInZ2V0JyBhbmQgJ3NldCcgYWNjZXNzb3JzIGNhbm5vdCBkZWNsYXJlICd0aGlzJyBwYXJhbWV0ZXJzLlwiLFxuICBBY2Nlc29yQ2Fubm90SGF2ZVR5cGVQYXJhbWV0ZXJzOiBcIkFuIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHR5cGUgcGFyYW1ldGVycy5cIixcbiAgQWNjZXNzb3JDYW5ub3RCZU9wdGlvbmFsOlxuICAgIFwiQW4gJ2FjY2Vzc29yJyBwcm9wZXJ0eSBjYW5ub3QgYmUgZGVjbGFyZWQgb3B0aW9uYWwuXCIsXG4gIENsYXNzTWV0aG9kSGFzRGVjbGFyZTogXCJDbGFzcyBtZXRob2RzIGNhbm5vdCBoYXZlIHRoZSAnZGVjbGFyZScgbW9kaWZpZXIuXCIsXG4gIENsYXNzTWV0aG9kSGFzUmVhZG9ubHk6IFwiQ2xhc3MgbWV0aG9kcyBjYW5ub3QgaGF2ZSB0aGUgJ3JlYWRvbmx5JyBtb2RpZmllci5cIixcbiAgQ29uc3RJbml0aWFpbGl6ZXJNdXN0QmVTdHJpbmdPck51bWVyaWNMaXRlcmFsT3JMaXRlcmFsRW51bVJlZmVyZW5jZTpcbiAgICBcIkEgJ2NvbnN0JyBpbml0aWFsaXplciBpbiBhbiBhbWJpZW50IGNvbnRleHQgbXVzdCBiZSBhIHN0cmluZyBvciBudW1lcmljIGxpdGVyYWwgb3IgbGl0ZXJhbCBlbnVtIHJlZmVyZW5jZS5cIixcbiAgQ29uc3RydWN0b3JIYXNUeXBlUGFyYW1ldGVyczpcbiAgICBcIlR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uXCIsXG4gIERlY2xhcmVBY2Nlc3NvcjogKHsga2luZCB9OiB7IGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIH0pID0+XG4gICAgYCdkZWNsYXJlJyBpcyBub3QgYWxsb3dlZCBpbiAke2tpbmR9dGVycy5gLFxuICBEZWNsYXJlQ2xhc3NGaWVsZEhhc0luaXRpYWxpemVyOlxuICAgIFwiSW5pdGlhbGl6ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiBhbWJpZW50IGNvbnRleHRzLlwiLFxuICBEZWNsYXJlRnVuY3Rpb25IYXNJbXBsZW1lbnRhdGlvbjpcbiAgICBcIkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzLlwiLFxuICBEdXBsaWNhdGVBY2Nlc3NpYmlsaXR5TW9kaWZpZXI6XG4gICAgLy8gYEFjY2Vzc2liaWxpdHkgbW9kaWZpZXIgYWxyZWFkeSBzZWVuOiAke21vZGlmaWVyfWAgd291bGQgYmUgbW9yZSBoZWxwZnVsLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAoeyBtb2RpZmllciB9OiB7IG1vZGlmaWVyOiBOLkFjY2Vzc2liaWxpdHkgfSkgPT5cbiAgICAgIGBBY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGFscmVhZHkgc2Vlbi5gLFxuICBEdXBsaWNhdGVNb2RpZmllcjogKHsgbW9kaWZpZXIgfTogeyBtb2RpZmllcjogVHNNb2RpZmllciB9KSA9PlxuICAgIGBEdXBsaWNhdGUgbW9kaWZpZXI6ICcke21vZGlmaWVyfScuYCxcbiAgLy8gYHRva2VuYCBtYXRjaGVzIHRoZSB0ZXJtaW5vbG9neSB1c2VkIGJ5IHR5cGVzY3JpcHQ6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vc3JjL2NvbXBpbGVyL3R5cGVzLnRzI0wyOTE1XG4gIEVtcHR5SGVyaXRhZ2VDbGF1c2VUeXBlOiAoeyB0b2tlbiB9OiB7IHRva2VuOiBcImV4dGVuZHNcIiB8IFwiaW1wbGVtZW50c1wiIH0pID0+XG4gICAgYCcke3Rva2VufScgbGlzdCBjYW5ub3QgYmUgZW1wdHkuYCxcbiAgRW1wdHlUeXBlQXJndW1lbnRzOiBcIlR5cGUgYXJndW1lbnQgbGlzdCBjYW5ub3QgYmUgZW1wdHkuXCIsXG4gIEVtcHR5VHlwZVBhcmFtZXRlcnM6IFwiVHlwZSBwYXJhbWV0ZXIgbGlzdCBjYW5ub3QgYmUgZW1wdHkuXCIsXG4gIEV4cGVjdGVkQW1iaWVudEFmdGVyRXhwb3J0RGVjbGFyZTpcbiAgICBcIidleHBvcnQgZGVjbGFyZScgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBhbWJpZW50IGRlY2xhcmF0aW9uLlwiLFxuICBJbXBvcnRBbGlhc0hhc0ltcG9ydFR5cGU6IFwiQW4gaW1wb3J0IGFsaWFzIGNhbiBub3QgdXNlICdpbXBvcnQgdHlwZScuXCIsXG4gIEltcG9ydFJlZmxlY3Rpb25IYXNJbXBvcnRUeXBlOlxuICAgIFwiQW4gYGltcG9ydCBtb2R1bGVgIGRlY2xhcmF0aW9uIGNhbiBub3QgdXNlIGB0eXBlYCBtb2RpZmllclwiLFxuICBJbmNvbXBhdGlibGVNb2RpZmllcnM6ICh7XG4gICAgbW9kaWZpZXJzLFxuICB9OiB7XG4gICAgbW9kaWZpZXJzOiBbVHNNb2RpZmllciwgVHNNb2RpZmllcl07XG4gIH0pID0+XG4gICAgYCcke21vZGlmaWVyc1swXX0nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJyR7bW9kaWZpZXJzWzFdfScgbW9kaWZpZXIuYCxcbiAgSW5kZXhTaWduYXR1cmVIYXNBYnN0cmFjdDpcbiAgICBcIkluZGV4IHNpZ25hdHVyZXMgY2Fubm90IGhhdmUgdGhlICdhYnN0cmFjdCcgbW9kaWZpZXIuXCIsXG4gIEluZGV4U2lnbmF0dXJlSGFzQWNjZXNzaWJpbGl0eTogKHtcbiAgICBtb2RpZmllcixcbiAgfToge1xuICAgIG1vZGlmaWVyOiBOLkFjY2Vzc2liaWxpdHk7XG4gIH0pID0+XG4gICAgYEluZGV4IHNpZ25hdHVyZXMgY2Fubm90IGhhdmUgYW4gYWNjZXNzaWJpbGl0eSBtb2RpZmllciAoJyR7bW9kaWZpZXJ9JykuYCxcbiAgSW5kZXhTaWduYXR1cmVIYXNEZWNsYXJlOlxuICAgIFwiSW5kZXggc2lnbmF0dXJlcyBjYW5ub3QgaGF2ZSB0aGUgJ2RlY2xhcmUnIG1vZGlmaWVyLlwiLFxuICBJbmRleFNpZ25hdHVyZUhhc092ZXJyaWRlOlxuICAgIFwiJ292ZXJyaWRlJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGFuIGluZGV4IHNpZ25hdHVyZS5cIixcbiAgSW5kZXhTaWduYXR1cmVIYXNTdGF0aWM6XG4gICAgXCJJbmRleCBzaWduYXR1cmVzIGNhbm5vdCBoYXZlIHRoZSAnc3RhdGljJyBtb2RpZmllci5cIixcbiAgSW5pdGlhbGl6ZXJOb3RBbGxvd2VkSW5BbWJpZW50Q29udGV4dDpcbiAgICBcIkluaXRpYWxpemVycyBhcmUgbm90IGFsbG93ZWQgaW4gYW1iaWVudCBjb250ZXh0cy5cIixcbiAgSW52YWxpZE1vZGlmaWVyT25UeXBlTWVtYmVyOiAoeyBtb2RpZmllciB9OiB7IG1vZGlmaWVyOiBUc01vZGlmaWVyIH0pID0+XG4gICAgYCcke21vZGlmaWVyfScgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIHR5cGUgbWVtYmVyLmAsXG4gIEludmFsaWRNb2RpZmllck9uVHlwZVBhcmFtZXRlcjogKHsgbW9kaWZpZXIgfTogeyBtb2RpZmllcjogVHNNb2RpZmllciB9KSA9PlxuICAgIGAnJHttb2RpZmllcn0nIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlci5gLFxuICBJbnZhbGlkTW9kaWZpZXJPblR5cGVQYXJhbWV0ZXJQb3NpdGlvbnM6ICh7XG4gICAgbW9kaWZpZXIsXG4gIH06IHtcbiAgICBtb2RpZmllcjogVHNNb2RpZmllcjtcbiAgfSkgPT5cbiAgICBgJyR7bW9kaWZpZXJ9JyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcy5gLFxuICBJbnZhbGlkTW9kaWZpZXJzT3JkZXI6ICh7XG4gICAgb3JkZXJlZE1vZGlmaWVycyxcbiAgfToge1xuICAgIG9yZGVyZWRNb2RpZmllcnM6IFtUc01vZGlmaWVyLCBUc01vZGlmaWVyXTtcbiAgfSkgPT5cbiAgICBgJyR7b3JkZXJlZE1vZGlmaWVyc1swXX0nIG1vZGlmaWVyIG11c3QgcHJlY2VkZSAnJHtvcmRlcmVkTW9kaWZpZXJzWzFdfScgbW9kaWZpZXIuYCxcbiAgSW52YWxpZFByb3BlcnR5QWNjZXNzQWZ0ZXJJbnN0YW50aWF0aW9uRXhwcmVzc2lvbjpcbiAgICBcIkludmFsaWQgcHJvcGVydHkgYWNjZXNzIGFmdGVyIGFuIGluc3RhbnRpYXRpb24gZXhwcmVzc2lvbi4gXCIgK1xuICAgIFwiWW91IGNhbiBlaXRoZXIgd3JhcCB0aGUgaW5zdGFudGlhdGlvbiBleHByZXNzaW9uIGluIHBhcmVudGhlc2VzLCBvciBkZWxldGUgdGhlIHR5cGUgYXJndW1lbnRzLlwiLFxuICBJbnZhbGlkVHVwbGVNZW1iZXJMYWJlbDpcbiAgICBcIlR1cGxlIG1lbWJlcnMgbXVzdCBiZSBsYWJlbGVkIHdpdGggYSBzaW1wbGUgaWRlbnRpZmllci5cIixcbiAgTWlzc2luZ0ludGVyZmFjZU5hbWU6XG4gICAgXCInaW50ZXJmYWNlJyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyLlwiLFxuICBNaXhlZExhYmVsZWRBbmRVbmxhYmVsZWRFbGVtZW50czpcbiAgICBcIlR1cGxlIG1lbWJlcnMgbXVzdCBhbGwgaGF2ZSBuYW1lcyBvciBhbGwgbm90IGhhdmUgbmFtZXMuXCIsXG4gIE5vbkFic3RyYWN0Q2xhc3NIYXNBYnN0cmFjdE1ldGhvZDpcbiAgICBcIkFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5cIixcbiAgTm9uQ2xhc3NNZXRob2RQcm9wZXJ0eUhhc0Fic3RyYWN0TW9kaWZlcjpcbiAgICBcIidhYnN0cmFjdCcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgY2xhc3MsIG1ldGhvZCwgb3IgcHJvcGVydHkgZGVjbGFyYXRpb24uXCIsXG4gIE9wdGlvbmFsVHlwZUJlZm9yZVJlcXVpcmVkOlxuICAgIFwiQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5cIixcbiAgT3ZlcnJpZGVOb3RJblN1YkNsYXNzOlxuICAgIFwiVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLlwiLFxuICBQYXR0ZXJuSXNPcHRpb25hbDpcbiAgICBcIkEgYmluZGluZyBwYXR0ZXJuIHBhcmFtZXRlciBjYW5ub3QgYmUgb3B0aW9uYWwgaW4gYW4gaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlLlwiLFxuICBQcml2YXRlRWxlbWVudEhhc0Fic3RyYWN0OlxuICAgIFwiUHJpdmF0ZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSB0aGUgJ2Fic3RyYWN0JyBtb2RpZmllci5cIixcbiAgUHJpdmF0ZUVsZW1lbnRIYXNBY2Nlc3NpYmlsaXR5OiAoe1xuICAgIG1vZGlmaWVyLFxuICB9OiB7XG4gICAgbW9kaWZpZXI6IE4uQWNjZXNzaWJpbGl0eTtcbiAgfSkgPT5cbiAgICBgUHJpdmF0ZSBlbGVtZW50cyBjYW5ub3QgaGF2ZSBhbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyICgnJHttb2RpZmllcn0nKS5gLFxuICBSZWFkb25seUZvck1ldGhvZFNpZ25hdHVyZTpcbiAgICBcIidyZWFkb25seScgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgcHJvcGVydHkgZGVjbGFyYXRpb24gb3IgaW5kZXggc2lnbmF0dXJlLlwiLFxuICBSZXNlcnZlZEFycm93VHlwZVBhcmFtOlxuICAgIFwiVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gQWRkIGEgdHJhaWxpbmcgY29tbWEsIGFzIGluIGA8VCw+KCkgPT4gLi4uYC5cIixcbiAgUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uOlxuICAgIFwiVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gVXNlIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnN0ZWFkLlwiLFxuICAvLyBUT0RPOiBBY2Nlc29yIC0+IEFjY2Vzc29yXG4gIFNldEFjY2Vzb3JDYW5ub3RIYXZlT3B0aW9uYWxQYXJhbWV0ZXI6XG4gICAgXCJBICdzZXQnIGFjY2Vzc29yIGNhbm5vdCBoYXZlIGFuIG9wdGlvbmFsIHBhcmFtZXRlci5cIixcbiAgU2V0QWNjZXNvckNhbm5vdEhhdmVSZXN0UGFyYW1ldGVyOlxuICAgIFwiQSAnc2V0JyBhY2Nlc3NvciBjYW5ub3QgaGF2ZSByZXN0IHBhcmFtZXRlci5cIixcbiAgU2V0QWNjZXNvckNhbm5vdEhhdmVSZXR1cm5UeXBlOlxuICAgIFwiQSAnc2V0JyBhY2Nlc3NvciBjYW5ub3QgaGF2ZSBhIHJldHVybiB0eXBlIGFubm90YXRpb24uXCIsXG4gIFNpbmdsZVR5cGVQYXJhbWV0ZXJXaXRob3V0VHJhaWxpbmdDb21tYTogKHtcbiAgICB0eXBlUGFyYW1ldGVyTmFtZSxcbiAgfToge1xuICAgIHR5cGVQYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIH0pID0+XG4gICAgYFNpbmdsZSB0eXBlIHBhcmFtZXRlciAke3R5cGVQYXJhbWV0ZXJOYW1lfSBzaG91bGQgaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLiBFeGFtcGxlIHVzYWdlOiA8JHt0eXBlUGFyYW1ldGVyTmFtZX0sPi5gLFxuICBTdGF0aWNCbG9ja0Nhbm5vdEhhdmVNb2RpZmllcjpcbiAgICBcIlN0YXRpYyBjbGFzcyBibG9ja3MgY2Fubm90IGhhdmUgYW55IG1vZGlmaWVyLlwiLFxuICBUdXBsZU9wdGlvbmFsQWZ0ZXJUeXBlOlxuICAgIFwiQSBsYWJlbGVkIHR1cGxlIG9wdGlvbmFsIGVsZW1lbnQgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyBhIHF1ZXN0aW9uIG1hcmsgYWZ0ZXIgdGhlIG5hbWUgYW5kIGJlZm9yZSB0aGUgY29sb24gKGBuYW1lPzogdHlwZWApLCByYXRoZXIgdGhhbiBhZnRlciB0aGUgdHlwZSAoYG5hbWU6IHR5cGU/YCkuXCIsXG4gIFR5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ246XG4gICAgXCJUeXBlIGFubm90YXRpb25zIG11c3QgY29tZSBiZWZvcmUgZGVmYXVsdCBhc3NpZ25tZW50cywgZS5nLiBpbnN0ZWFkIG9mIGBhZ2UgPSAyNTogbnVtYmVyYCB1c2UgYGFnZTogbnVtYmVyID0gMjVgLlwiLFxuICBUeXBlSW1wb3J0Q2Fubm90U3BlY2lmeURlZmF1bHRBbmROYW1lZDpcbiAgICBcIkEgdHlwZS1vbmx5IGltcG9ydCBjYW4gc3BlY2lmeSBhIGRlZmF1bHQgaW1wb3J0IG9yIG5hbWVkIGJpbmRpbmdzLCBidXQgbm90IGJvdGguXCIsXG4gIFR5cGVNb2RpZmllcklzVXNlZEluVHlwZUV4cG9ydHM6XG4gICAgXCJUaGUgJ3R5cGUnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIG9uIGEgbmFtZWQgZXhwb3J0IHdoZW4gJ2V4cG9ydCB0eXBlJyBpcyB1c2VkIG9uIGl0cyBleHBvcnQgc3RhdGVtZW50LlwiLFxuICBUeXBlTW9kaWZpZXJJc1VzZWRJblR5cGVJbXBvcnRzOlxuICAgIFwiVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGltcG9ydCB3aGVuICdpbXBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgaW1wb3J0IHN0YXRlbWVudC5cIixcbiAgVW5leHBlY3RlZFBhcmFtZXRlck1vZGlmaWVyOlxuICAgIFwiQSBwYXJhbWV0ZXIgcHJvcGVydHkgaXMgb25seSBhbGxvd2VkIGluIGEgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb24uXCIsXG4gIFVuZXhwZWN0ZWRSZWFkb25seTpcbiAgICBcIidyZWFkb25seScgdHlwZSBtb2RpZmllciBpcyBvbmx5IHBlcm1pdHRlZCBvbiBhcnJheSBhbmQgdHVwbGUgbGl0ZXJhbCB0eXBlcy5cIixcbiAgVW5leHBlY3RlZFR5cGVBbm5vdGF0aW9uOiBcIkRpZCBub3QgZXhwZWN0IGEgdHlwZSBhbm5vdGF0aW9uIGhlcmUuXCIsXG4gIFVuZXhwZWN0ZWRUeXBlQ2FzdEluUGFyYW1ldGVyOiBcIlVuZXhwZWN0ZWQgdHlwZSBjYXN0IGluIHBhcmFtZXRlciBwb3NpdGlvbi5cIixcbiAgVW5zdXBwb3J0ZWRJbXBvcnRUeXBlQXJndW1lbnQ6XG4gICAgXCJBcmd1bWVudCBpbiBhIHR5cGUgaW1wb3J0IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC5cIixcbiAgVW5zdXBwb3J0ZWRQYXJhbWV0ZXJQcm9wZXJ0eUtpbmQ6XG4gICAgXCJBIHBhcmFtZXRlciBwcm9wZXJ0eSBtYXkgbm90IGJlIGRlY2xhcmVkIHVzaW5nIGEgYmluZGluZyBwYXR0ZXJuLlwiLFxuICBVbnN1cHBvcnRlZFNpZ25hdHVyZVBhcmFtZXRlcktpbmQ6ICh7IHR5cGUgfTogeyB0eXBlOiBzdHJpbmcgfSkgPT5cbiAgICBgTmFtZSBpbiBhIHNpZ25hdHVyZSBtdXN0IGJlIGFuIElkZW50aWZpZXIsIE9iamVjdFBhdHRlcm4gb3IgQXJyYXlQYXR0ZXJuLCBpbnN0ZWFkIGdvdCAke3R5cGV9LmAsXG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgc29ydC1rZXlzICovXG5cbi8vIERvZXNuJ3QgaGFuZGxlIFwidm9pZFwiIG9yIFwibnVsbFwiIGJlY2F1c2UgdGhvc2UgYXJlIGtleXdvcmRzLCBub3QgaWRlbnRpZmllcnMuXG4vLyBJdCBhbHNvIGRvZXNuJ3QgaGFuZGxlIFwiaW50cmluc2ljXCIsIHNpbmNlIHVzdWFsbHkgaXQncyBub3QgYSBrZXl3b3JkLlxuZnVuY3Rpb24ga2V5d29yZFR5cGVGcm9tTmFtZSh2YWx1ZTogc3RyaW5nKTogTi5Uc0tleXdvcmRUeXBlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJUU0FueUtleXdvcmRcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiVFNCb29sZWFuS2V5d29yZFwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcIlRTQmlnSW50S2V5d29yZFwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiVFNOZXZlcktleXdvcmRcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJUU051bWJlcktleXdvcmRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICByZXR1cm4gXCJUU09iamVjdEtleXdvcmRcIjtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJUU1N0cmluZ0tleXdvcmRcIjtcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICByZXR1cm4gXCJUU1N5bWJvbEtleXdvcmRcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJUU1VuZGVmaW5lZEtleXdvcmRcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiVFNVbmtub3duS2V5d29yZFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRzSXNBY2Nlc3NNb2RpZmllcihtb2RpZmllcjogc3RyaW5nKTogbW9kaWZpZXIgaXMgTi5BY2Nlc3NpYmlsaXR5IHtcbiAgcmV0dXJuIChcbiAgICBtb2RpZmllciA9PT0gXCJwcml2YXRlXCIgfHwgbW9kaWZpZXIgPT09IFwicHVibGljXCIgfHwgbW9kaWZpZXIgPT09IFwicHJvdGVjdGVkXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gdHNJc1ZhcmlhbmNlQW5ub3RhdGlvbnMoXG4gIG1vZGlmaWVyOiBzdHJpbmcsXG4pOiBtb2RpZmllciBpcyBOLlZhcmlhbmNlQW5ub3RhdGlvbnMge1xuICByZXR1cm4gbW9kaWZpZXIgPT09IFwiaW5cIiB8fCBtb2RpZmllciA9PT0gXCJvdXRcIjtcbn1cblxudHlwZSBDbGFzc1dpdGhNaXhpbjxcbiAgVCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55KSA9PiBhbnksXG4gIE0gZXh0ZW5kcyBvYmplY3QsXG4+ID0gVCBleHRlbmRzIG5ldyAoLi4uYXJnczogaW5mZXIgUCkgPT4gaW5mZXIgSVxuICA/IG5ldyAoLi4uYXJnczogUCkgPT4gSSAmIE1cbiAgOiBuZXZlcjtcblxuZXhwb3J0IGRlZmF1bHQgKHN1cGVyQ2xhc3M6IENsYXNzV2l0aE1peGluPHR5cGVvZiBQYXJzZXIsIElKU1hQYXJzZXJNaXhpbj4pID0+XG4gIGNsYXNzIFR5cGVTY3JpcHRQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIGdldFNjb3BlSGFuZGxlcigpOiB7XG4gICAgICBuZXcgKC4uLmFyZ3M6IGFueSk6IFR5cGVTY3JpcHRTY29wZUhhbmRsZXI7XG4gICAgfSB7XG4gICAgICByZXR1cm4gVHlwZVNjcmlwdFNjb3BlSGFuZGxlcjtcbiAgICB9XG5cbiAgICB0c0lzSWRlbnRpZmllcigpOiBib29sZWFuIHtcbiAgICAgIC8vIFRPRE86IGFjdHVhbGx5IGEgYml0IG1vcmUgY29tcGxleCBpbiBUeXBlU2NyaXB0LCBidXQgc2hvdWxkbid0IG1hdHRlci5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE1MDA4XG4gICAgICByZXR1cm4gdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKTtcbiAgICB9XG5cbiAgICB0c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5tYXRjaCh0dC5icmFja2V0TCkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNlTCkgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5lbGxpcHNpcykgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LnByaXZhdGVOYW1lKSB8fFxuICAgICAgICAgIHRoaXMuaXNMaXRlcmFsUHJvcGVydHlOYW1lKCkpICYmXG4gICAgICAgICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzTmV4dFRva2VuQ2FuRm9sbG93TW9kaWZpZXIoKSB7XG4gICAgICAvLyBOb3RlOiBUeXBlU2NyaXB0J3MgaW1wbGVtZW50YXRpb24gaXMgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2VcbiAgICAgIC8vIG1vcmUgdGhpbmdzIGFyZSBjb25zaWRlcmVkIG1vZGlmaWVycyB0aGVyZS5cbiAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBoYW5kbGVzIG1vZGlmaWVycyBub3QgaGFuZGxlZCBieSBAYmFiZWwvcGFyc2VyIGl0c2VsZi4gQW5kIFwic3RhdGljXCIuXG4gICAgICAvLyBUT0RPOiBXb3VsZCBiZSBuaWNlIHRvIGF2b2lkIGxvb2thaGVhZC4gV2FudCBhIGhhc0xpbmVCcmVha1VwTmV4dCgpIG1ldGhvZC4uLlxuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy50c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKTtcbiAgICB9XG5cbiAgICAvKiogUGFyc2VzIGEgbW9kaWZpZXIgbWF0Y2hpbmcgb25lIHRoZSBnaXZlbiBtb2RpZmllciBuYW1lcy4gKi9cbiAgICB0c1BhcnNlTW9kaWZpZXI8VCBleHRlbmRzIFRzTW9kaWZpZXI+KFxuICAgICAgYWxsb3dlZE1vZGlmaWVyczogVFtdLFxuICAgICAgc3RvcE9uU3RhcnRPZkNsYXNzU3RhdGljQmxvY2s/OiBib29sZWFuLFxuICAgICk6IFQgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS50eXBlICE9PSB0dC5faW4gJiZcbiAgICAgICAgdGhpcy5zdGF0ZS50eXBlICE9PSB0dC5fY29uc3RcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RpZmllciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBpZiAoYWxsb3dlZE1vZGlmaWVycy5pbmRleE9mKG1vZGlmaWVyKSAhPT0gLTEpIHtcbiAgICAgICAgaWYgKHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrICYmIHRoaXMudHNJc1N0YXJ0T2ZTdGF0aWNCbG9ja3MoKSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudHNUcnlQYXJzZSh0aGlzLnRzTmV4dFRva2VuQ2FuRm9sbG93TW9kaWZpZXIuYmluZCh0aGlzKSkpIHtcbiAgICAgICAgICByZXR1cm4gbW9kaWZpZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIFBhcnNlcyBhIGxpc3Qgb2YgbW9kaWZpZXJzLCBpbiBhbnkgb3JkZXIuXG4gICAgICogIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgb3JkZXIsIHlvdSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lczpcbiAgICAgKiAgICB0aGlzLnRzUGFyc2VNb2RpZmllcnMoeyBtb2RpZmllZDogbm9kZSwgYWxsb3dlZE1vZGlmaWVyczogW1wicHVibGljXCJdIH0pO1xuICAgICAqICAgIHRoaXMudHNQYXJzZU1vZGlmaWVycyh7IG1vZGlmaWVkOiBub2RlLCBhbGxvd2VkTW9kaWZpZXJzOiBbXCJhYnN0cmFjdFwiLCBcInJlYWRvbmx5XCJdIH0pO1xuICAgICAqL1xuICAgIHRzUGFyc2VNb2RpZmllcnM8TiBleHRlbmRzIE1vZGlmaWVyQmFzZT4oXG4gICAgICB7XG4gICAgICAgIGFsbG93ZWRNb2RpZmllcnMsXG4gICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnMsXG4gICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrLFxuICAgICAgICBlcnJvclRlbXBsYXRlID0gVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlTWVtYmVyLFxuICAgICAgfToge1xuICAgICAgICBhbGxvd2VkTW9kaWZpZXJzOiByZWFkb25seSBUc01vZGlmaWVyW107XG4gICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM/OiBUc01vZGlmaWVyW107XG4gICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrPzogYm9vbGVhbjtcbiAgICAgICAgZXJyb3JUZW1wbGF0ZT86IHR5cGVvZiBUU0Vycm9ycy5JbnZhbGlkTW9kaWZpZXJPblR5cGVNZW1iZXI7XG4gICAgICB9LFxuICAgICAgbW9kaWZpZWQ6IE4sXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBlbmZvcmNlT3JkZXIgPSAoXG4gICAgICAgIGxvYzogUG9zaXRpb24sXG4gICAgICAgIG1vZGlmaWVyOiBUc01vZGlmaWVyLFxuICAgICAgICBiZWZvcmU6IFRzTW9kaWZpZXIsXG4gICAgICAgIGFmdGVyOiBUc01vZGlmaWVyLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChtb2RpZmllciA9PT0gYmVmb3JlICYmIG1vZGlmaWVkW2FmdGVyXSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyc09yZGVyLCB7XG4gICAgICAgICAgICBhdDogbG9jLFxuICAgICAgICAgICAgb3JkZXJlZE1vZGlmaWVyczogW2JlZm9yZSwgYWZ0ZXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgaW5jb21wYXRpYmxlID0gKFxuICAgICAgICBsb2M6IFBvc2l0aW9uLFxuICAgICAgICBtb2RpZmllcjogVHNNb2RpZmllcixcbiAgICAgICAgbW9kMTogVHNNb2RpZmllcixcbiAgICAgICAgbW9kMjogVHNNb2RpZmllcixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKG1vZGlmaWVkW21vZDFdICYmIG1vZGlmaWVyID09PSBtb2QyKSB8fFxuICAgICAgICAgIChtb2RpZmllZFttb2QyXSAmJiBtb2RpZmllciA9PT0gbW9kMSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmNvbXBhdGlibGVNb2RpZmllcnMsIHtcbiAgICAgICAgICAgIGF0OiBsb2MsXG4gICAgICAgICAgICBtb2RpZmllcnM6IFttb2QxLCBtb2QyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCB7IHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBtb2RpZmllcjogVHNNb2RpZmllciB8IHVuZGVmaW5lZCB8IG51bGwgPSB0aGlzLnRzUGFyc2VNb2RpZmllcihcbiAgICAgICAgICBhbGxvd2VkTW9kaWZpZXJzLmNvbmNhdChkaXNhbGxvd2VkTW9kaWZpZXJzID8/IFtdKSxcbiAgICAgICAgICBzdG9wT25TdGFydE9mQ2xhc3NTdGF0aWNCbG9jayxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW1vZGlmaWVyKSBicmVhaztcblxuICAgICAgICBpZiAodHNJc0FjY2Vzc01vZGlmaWVyKG1vZGlmaWVyKSkge1xuICAgICAgICAgIGlmIChtb2RpZmllZC5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkR1cGxpY2F0ZUFjY2Vzc2liaWxpdHlNb2RpZmllciwge1xuICAgICAgICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgICAgICAgIG1vZGlmaWVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIG1vZGlmaWVyLCBcIm92ZXJyaWRlXCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgbW9kaWZpZXIsIFwic3RhdGljXCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgbW9kaWZpZXIsIFwicmVhZG9ubHlcIik7XG5cbiAgICAgICAgICAgIG1vZGlmaWVkLmFjY2Vzc2liaWxpdHkgPSBtb2RpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHNJc1ZhcmlhbmNlQW5ub3RhdGlvbnMobW9kaWZpZXIpKSB7XG4gICAgICAgICAgaWYgKG1vZGlmaWVkW21vZGlmaWVyXSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EdXBsaWNhdGVNb2RpZmllciwgeyBhdDogc3RhcnRMb2MsIG1vZGlmaWVyIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZFttb2RpZmllcl0gPSB0cnVlO1xuXG4gICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJpblwiLCBcIm91dFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kaWZpZWQsIG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EdXBsaWNhdGVNb2RpZmllciwgeyBhdDogc3RhcnRMb2MsIG1vZGlmaWVyIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmZvcmNlT3JkZXIoc3RhcnRMb2MsIG1vZGlmaWVyLCBcInN0YXRpY1wiLCBcInJlYWRvbmx5XCIpO1xuICAgICAgICAgICAgZW5mb3JjZU9yZGVyKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJzdGF0aWNcIiwgXCJvdmVycmlkZVwiKTtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIFwib3ZlcnJpZGVcIiwgXCJyZWFkb25seVwiKTtcbiAgICAgICAgICAgIGVuZm9yY2VPcmRlcihzdGFydExvYywgbW9kaWZpZXIsIFwiYWJzdHJhY3RcIiwgXCJvdmVycmlkZVwiKTtcblxuICAgICAgICAgICAgaW5jb21wYXRpYmxlKHN0YXJ0TG9jLCBtb2RpZmllciwgXCJkZWNsYXJlXCIsIFwib3ZlcnJpZGVcIik7XG4gICAgICAgICAgICBpbmNvbXBhdGlibGUoc3RhcnRMb2MsIG1vZGlmaWVyLCBcInN0YXRpY1wiLCBcImFic3RyYWN0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZFttb2RpZmllcl0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc2FsbG93ZWRNb2RpZmllcnM/LmluY2x1ZGVzKG1vZGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoZXJyb3JUZW1wbGF0ZSwge1xuICAgICAgICAgICAgYXQ6IHN0YXJ0TG9jLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0lzTGlzdFRlcm1pbmF0b3Ioa2luZDogUGFyc2luZ0NvbnRleHQpOiBib29sZWFuIHtcbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIFwiRW51bU1lbWJlcnNcIjpcbiAgICAgICAgY2FzZSBcIlR5cGVNZW1iZXJzXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQuYnJhY2VSKTtcbiAgICAgICAgY2FzZSBcIkhlcml0YWdlQ2xhdXNlRWxlbWVudFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmJyYWNlTCk7XG4gICAgICAgIGNhc2UgXCJUdXBsZUVsZW1lbnRUeXBlc1wiOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmJyYWNrZXRSKTtcbiAgICAgICAgY2FzZSBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5ndCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZUxpc3Q8VCBleHRlbmRzIE4uTm9kZT4oXG4gICAgICBraW5kOiBQYXJzaW5nQ29udGV4dCxcbiAgICAgIHBhcnNlRWxlbWVudDogKCkgPT4gVCxcbiAgICApOiBUW10ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgICAgIHdoaWxlICghdGhpcy50c0lzTGlzdFRlcm1pbmF0b3Ioa2luZCkpIHtcbiAgICAgICAgLy8gU2tpcHBpbmcgXCJwYXJzZUxpc3RFbGVtZW50XCIgZnJvbSB0aGUgVFMgc291cmNlIHNpbmNlIHRoYXQncyBqdXN0IGZvciBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VFbGVtZW50KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlRGVsaW1pdGVkTGlzdDxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICAgIGtpbmQ6IFBhcnNpbmdDb250ZXh0LFxuICAgICAgcGFyc2VFbGVtZW50OiAoKSA9PiBULFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHtcbiAgICAgIHJldHVybiBub25OdWxsKFxuICAgICAgICB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0V29ya2VyKFxuICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgcGFyc2VFbGVtZW50LFxuICAgICAgICAgIC8qIGV4cGVjdFN1Y2Nlc3MgKi8gdHJ1ZSxcbiAgICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiAhZXhwZWN0U3VjY2VzcywgcmV0dXJucyB1bmRlZmluZWQgaW5zdGVhZCBvZiBmYWlsaW5nIHRvIHBhcnNlLlxuICAgICAqIElmIGV4cGVjdFN1Y2Nlc3MsIHBhcnNlRWxlbWVudCBzaG91bGQgYWx3YXlzIHJldHVybiBhIGRlZmluZWQgdmFsdWUuXG4gICAgICovXG4gICAgdHNQYXJzZURlbGltaXRlZExpc3RXb3JrZXI8VCBleHRlbmRzIE4uTm9kZT4oXG4gICAgICBraW5kOiBQYXJzaW5nQ29udGV4dCxcbiAgICAgIHBhcnNlRWxlbWVudDogKCkgPT4gVCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgICBleHBlY3RTdWNjZXNzOiBib29sZWFuLFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgIGxldCB0cmFpbGluZ0NvbW1hUG9zID0gLTE7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMudHNJc0xpc3RUZXJtaW5hdG9yKGtpbmQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdHJhaWxpbmdDb21tYVBvcyA9IC0xO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJzZUVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmNvbW1hKSkge1xuICAgICAgICAgIHRyYWlsaW5nQ29tbWFQb3MgPSB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRzSXNMaXN0VGVybWluYXRvcihraW5kKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cGVjdFN1Y2Nlc3MpIHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIGFib3V0IGEgbWlzc2luZyBjb21tYVxuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmVHJhaWxpbmdDb21tYVBvcykge1xuICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLnZhbHVlID0gdHJhaWxpbmdDb21tYVBvcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlQnJhY2tldGVkTGlzdDxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICAgIGtpbmQ6IFBhcnNpbmdDb250ZXh0LFxuICAgICAgcGFyc2VFbGVtZW50OiAoKSA9PiBULFxuICAgICAgYnJhY2tldDogYm9vbGVhbixcbiAgICAgIHNraXBGaXJzdFRva2VuOiBib29sZWFuLFxuICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcz86IHtcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgKTogVFtdIHtcbiAgICAgIGlmICghc2tpcEZpcnN0VG9rZW4pIHtcbiAgICAgICAgaWYgKGJyYWNrZXQpIHtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQubHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHNQYXJzZURlbGltaXRlZExpc3QoXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHBhcnNlRWxlbWVudCxcbiAgICAgICAgcmVmVHJhaWxpbmdDb21tYVBvcyxcbiAgICAgICk7XG5cbiAgICAgIGlmIChicmFja2V0KSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0Lmd0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW1wb3J0VHlwZSgpOiBOLlRzSW1wb3J0VHlwZSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0ltcG9ydFR5cGU+KCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5faW1wb3J0KTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkSW1wb3J0VHlwZUFyZ3VtZW50LCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB0byBlc3RyZWUgd2UgY2Fubm90IGNhbGwgcGFyc2VMaXRlcmFsIGRpcmVjdGx5IGhlcmVcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBzdXBlci5wYXJzZUV4cHJBdG9tKCkgYXMgTi5TdHJpbmdMaXRlcmFsO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgdGhlIGVudGl0eSBuYW1lIHdpbGwgYWN0dWFsbHkgaXRzZWxmIGJlIGFcbiAgICAgICAgLy8gcXVhbGlmaWVyLCBzbyBhbGxvdyBpdCB0byBiZSBhIHJlc2VydmVkIHdvcmQgYXMgd2VsbC5cbiAgICAgICAgbm9kZS5xdWFsaWZpZXIgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0ltcG9ydFR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUVudGl0eU5hbWUoYWxsb3dSZXNlcnZlZFdvcmRzOiBib29sZWFuID0gdHJ1ZSk6IE4uVHNFbnRpdHlOYW1lIHtcbiAgICAgIGxldCBlbnRpdHk6IE4uVHNFbnRpdHlOYW1lID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoYWxsb3dSZXNlcnZlZFdvcmRzKTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5kb3QpKSB7XG4gICAgICAgIGNvbnN0IG5vZGU6IFVuZG9uZTxOLlRzUXVhbGlmaWVkTmFtZT4gPVxuICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXROb2RlPE4uVHNRdWFsaWZpZWROYW1lPihlbnRpdHkpO1xuICAgICAgICBub2RlLmxlZnQgPSBlbnRpdHk7XG4gICAgICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcihhbGxvd1Jlc2VydmVkV29yZHMpO1xuICAgICAgICBlbnRpdHkgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1F1YWxpZmllZE5hbWVcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlUmVmZXJlbmNlKCk6IE4uVHNUeXBlUmVmZXJlbmNlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVJlZmVyZW5jZT4oKTtcbiAgICAgIG5vZGUudHlwZU5hbWUgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICBpZiAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVSZWZlcmVuY2VcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVRoaXNUeXBlUHJlZGljYXRlKGxoczogTi5Uc1RoaXNUeXBlKTogTi5Uc1R5cGVQcmVkaWNhdGUge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc1R5cGVQcmVkaWNhdGU+KGxocyk7XG4gICAgICBub2RlLnBhcmFtZXRlck5hbWUgPSBsaHM7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZUFubm90YXRpb24oLyogZWF0Q29sb24gKi8gZmFsc2UpO1xuICAgICAgbm9kZS5hc3NlcnRzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUHJlZGljYXRlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUaGlzVHlwZU5vZGUoKTogTi5Uc1RoaXNUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVGhpc1R5cGU+KCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1RoaXNUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlUXVlcnkoKTogTi5Uc1R5cGVRdWVyeSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVRdWVyeT4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0Ll90eXBlb2YpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2ltcG9ydCkpIHtcbiAgICAgICAgbm9kZS5leHByTmFtZSA9IHRoaXMudHNQYXJzZUltcG9ydFR5cGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuZXhwck5hbWUgPSB0aGlzLnRzUGFyc2VFbnRpdHlOYW1lKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVRdWVyeVwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW5PdXRNb2RpZmllcnMgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJpblwiLCBcIm91dFwiXSxcbiAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcbiAgICAgICAgXCJjb25zdFwiLFxuICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgXCJyZWFkb25seVwiLFxuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICBdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZUNvbnN0TW9kaWZpZXIgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJjb25zdFwiXSxcbiAgICAgIC8vIGZvciBiZXR0ZXIgZXJyb3IgcmVjb3ZlcnlcbiAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcImluXCIsIFwib3V0XCJdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyUG9zaXRpb25zLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZUluT3V0Q29uc3RNb2RpZmllcnMgPSB0aGlzLnRzUGFyc2VNb2RpZmllcnMuYmluZCh0aGlzLCB7XG4gICAgICBhbGxvd2VkTW9kaWZpZXJzOiBbXCJpblwiLCBcIm91dFwiLCBcImNvbnN0XCJdLFxuICAgICAgZGlzYWxsb3dlZE1vZGlmaWVyczogW1xuICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgXCJyZWFkb25seVwiLFxuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICBdLFxuICAgICAgZXJyb3JUZW1wbGF0ZTogVFNFcnJvcnMuSW52YWxpZE1vZGlmaWVyT25UeXBlUGFyYW1ldGVyLFxuICAgIH0pO1xuXG4gICAgdHNQYXJzZVR5cGVQYXJhbWV0ZXIoXG4gICAgICBwYXJzZU1vZGlmaWVyczogKG5vZGU6IFVuZG9uZTxOLlRzVHlwZVBhcmFtZXRlcj4pID0+IHZvaWQsXG4gICAgKTogTi5Uc1R5cGVQYXJhbWV0ZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyPigpO1xuXG4gICAgICBwYXJzZU1vZGlmaWVycyhub2RlKTtcblxuICAgICAgbm9kZS5uYW1lID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlck5hbWUoKTtcbiAgICAgIG5vZGUuY29uc3RyYWludCA9IHRoaXMudHNFYXRUaGVuUGFyc2VUeXBlKHR0Ll9leHRlbmRzKTtcbiAgICAgIG5vZGUuZGVmYXVsdCA9IHRoaXMudHNFYXRUaGVuUGFyc2VUeXBlKHR0LmVxKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVQYXJhbWV0ZXJcIik7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgcGFyc2VNb2RpZmllcnM6IChub2RlOiBOLlRzVHlwZVBhcmFtZXRlcikgPT4gdm9pZCxcbiAgICApOiBOLlRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJzKHBhcnNlTW9kaWZpZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZVBhcmFtZXRlcnMocGFyc2VNb2RpZmllcnM6IChub2RlOiBOLlRzVHlwZVBhcmFtZXRlcikgPT4gdm9pZCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+KCk7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmpzeFRhZ1N0YXJ0KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWZUcmFpbGluZ0NvbW1hUG9zID0geyB2YWx1ZTogLTEgfTtcblxuICAgICAgbm9kZS5wYXJhbXMgPSB0aGlzLnRzUGFyc2VCcmFja2V0ZWRMaXN0KFxuICAgICAgICBcIlR5cGVQYXJhbWV0ZXJzT3JBcmd1bWVudHNcIixcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlUGFyYW1ldGVyLmJpbmQodGhpcywgcGFyc2VNb2RpZmllcnMpLFxuICAgICAgICAvKiBicmFja2V0ICovIGZhbHNlLFxuICAgICAgICAvKiBza2lwRmlyc3RUb2tlbiAqLyB0cnVlLFxuICAgICAgICByZWZUcmFpbGluZ0NvbW1hUG9zLFxuICAgICAgKTtcbiAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5FbXB0eVR5cGVQYXJhbWV0ZXJzLCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZlRyYWlsaW5nQ29tbWFQb3MudmFsdWUgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuYWRkRXh0cmEobm9kZSwgXCJ0cmFpbGluZ0NvbW1hXCIsIHJlZlRyYWlsaW5nQ29tbWFQb3MudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IEluIFR5cGVTY3JpcHQgaW1wbGVtZW50YXRpb24gd2UgbXVzdCBwcm92aWRlIGB5aWVsZENvbnRleHRgIGFuZCBgYXdhaXRDb250ZXh0YCxcbiAgICAvLyBidXQgaGVyZSBpdCdzIGFsd2F5cyBmYWxzZSwgYmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdHlwZXMuXG4gICAgdHNGaWxsU2lnbmF0dXJlKFxuICAgICAgcmV0dXJuVG9rZW46IFRva2VuVHlwZSxcbiAgICAgIHNpZ25hdHVyZTogVW5kb25lPE4uVHNTaWduYXR1cmVEZWNsYXJhdGlvbj4sXG4gICAgKTogdm9pZCB7XG4gICAgICAvLyBBcnJvdyBmbnMgKm11c3QqIGhhdmUgcmV0dXJuIHRva2VuIChgPT5gKS4gTm9ybWFsIGZ1bmN0aW9ucyBjYW4gb21pdCBpdC5cbiAgICAgIGNvbnN0IHJldHVyblRva2VuUmVxdWlyZWQgPSByZXR1cm5Ub2tlbiA9PT0gdHQuYXJyb3c7XG5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9pc3N1ZXMvOTIzMVxuICAgICAgY29uc3QgcGFyYW1zS2V5ID0gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IFwicGFyYW1zXCIgOiBcInBhcmFtZXRlcnNcIjtcbiAgICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgID8gXCJyZXR1cm5UeXBlXCJcbiAgICAgICAgOiBcInR5cGVBbm5vdGF0aW9uXCI7XG5cbiAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBzaWduYXR1cmVbcGFyYW1zS2V5XSA9IHRoaXMudHNQYXJzZUJpbmRpbmdMaXN0Rm9yU2lnbmF0dXJlKCk7XG4gICAgICBpZiAocmV0dXJuVG9rZW5SZXF1aXJlZCkge1xuICAgICAgICBzaWduYXR1cmVbcmV0dXJuVHlwZUtleV0gPVxuICAgICAgICAgIHRoaXMudHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKHJldHVyblRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChyZXR1cm5Ub2tlbikpIHtcbiAgICAgICAgc2lnbmF0dXJlW3JldHVyblR5cGVLZXldID1cbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlT3JUeXBlUHJlZGljYXRlQW5ub3RhdGlvbihyZXR1cm5Ub2tlbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZUJpbmRpbmdMaXN0Rm9yU2lnbmF0dXJlKCk6IEFycmF5PFxuICAgICAgTi5JZGVudGlmaWVyIHwgTi5SZXN0RWxlbWVudCB8IE4uT2JqZWN0UGF0dGVybiB8IE4uQXJyYXlQYXR0ZXJuXG4gICAgPiB7XG4gICAgICBjb25zdCBsaXN0ID0gc3VwZXIucGFyc2VCaW5kaW5nTGlzdChcbiAgICAgICAgdHQucGFyZW5SLFxuICAgICAgICBjaGFyQ29kZXMucmlnaHRQYXJlbnRoZXNpcyxcbiAgICAgICAgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0ZVTkNUSU9OX1BBUkFNUyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgbGlzdCkge1xuICAgICAgICBjb25zdCB7IHR5cGUgfSA9IHBhdHRlcm47XG4gICAgICAgIGlmICh0eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgfHwgdHlwZSA9PT0gXCJUU1BhcmFtZXRlclByb3BlcnR5XCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkU2lnbmF0dXJlUGFyYW1ldGVyS2luZCwge1xuICAgICAgICAgICAgYXQ6IHBhdHRlcm4sXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdCBhcyBFeGNsdWRlPFxuICAgICAgICAodHlwZW9mIGxpc3QpWzBdLFxuICAgICAgICBOLkFzc2lnbm1lbnRQYXR0ZXJuIHwgTi5UU1BhcmFtZXRlclByb3BlcnR5XG4gICAgICA+W107XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVNZW1iZXJTZW1pY29sb24oKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuZWF0KHR0LmNvbW1hKSAmJiAhdGhpcy5pc0xpbmVUZXJtaW5hdG9yKCkpIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuc2VtaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZVNpZ25hdHVyZU1lbWJlcihcbiAgICAgIGtpbmQ6IFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIiB8IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgICAgbm9kZTogVW5kb25lPFxuICAgICAgICBOLlRzQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uIHwgTi5Uc0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXG4gICAgICA+LFxuICAgICk6IE4uVHNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24gfCBOLlRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICAgICAgdGhpcy50c0ZpbGxTaWduYXR1cmUodHQuY29sb24sIG5vZGUpO1xuICAgICAgdGhpcy50c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBraW5kKTtcbiAgICB9XG5cbiAgICB0c0lzVW5hbWJpZ3VvdXNseUluZGV4U2lnbmF0dXJlKCkge1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIFNraXAgJ3snXG4gICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQuY29sb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VJbmRleFNpZ25hdHVyZShcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzSW5kZXhTaWduYXR1cmU+LFxuICAgICk6IE4uVHNJbmRleFNpZ25hdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoXG4gICAgICAgICEoXG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5icmFja2V0TCkgJiZcbiAgICAgICAgICB0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1VuYW1iaWd1b3VzbHlJbmRleFNpZ25hdHVyZS5iaW5kKHRoaXMpKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0TCk7XG4gICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBpZC50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oaWQpOyAvLyBzZXQgZW5kIHBvc2l0aW9uIHRvIGVuZCBvZiB0eXBlXG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICAgIG5vZGUucGFyYW1ldGVycyA9IFtpZF07XG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgaWYgKHR5cGUpIG5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgdGhpcy50c1BhcnNlVHlwZU1lbWJlclNlbWljb2xvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTSW5kZXhTaWduYXR1cmVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUoXG4gICAgICBub2RlOiBOLlRzUHJvcGVydHlTaWduYXR1cmUgfCBOLlRzTWV0aG9kU2lnbmF0dXJlLFxuICAgICAgcmVhZG9ubHk6IGJvb2xlYW4sXG4gICAgKTogTi5Uc1Byb3BlcnR5U2lnbmF0dXJlIHwgTi5Uc01ldGhvZFNpZ25hdHVyZSB7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSBub2RlLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG5vZGVBbnk6IGFueSA9IG5vZGU7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkgfHwgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5SZWFkb25seUZvck1ldGhvZFNpZ25hdHVyZSwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRob2Q6IE4uVHNNZXRob2RTaWduYXR1cmUgPSBub2RlQW55O1xuICAgICAgICBpZiAobWV0aG9kLmtpbmQgJiYgdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFjY2Vzb3JDYW5ub3RIYXZlVHlwZVBhcmFtZXRlcnMsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50c0ZpbGxTaWduYXR1cmUodHQuY29sb24sIG1ldGhvZCk7XG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVNZW1iZXJTZW1pY29sb24oKTtcbiAgICAgICAgY29uc3QgcGFyYW1zS2V5ID0gcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICAgID8gXCJwYXJhbXNcIlxuICAgICAgICAgIDogXCJwYXJhbWV0ZXJzXCI7XG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgICAgPyBcInJldHVyblR5cGVcIlxuICAgICAgICAgIDogXCJ0eXBlQW5ub3RhdGlvblwiO1xuICAgICAgICBpZiAobWV0aG9kLmtpbmQgPT09IFwiZ2V0XCIpIHtcbiAgICAgICAgICBpZiAobWV0aG9kW3BhcmFtc0tleV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQmFkR2V0dGVyQXJpdHksIHsgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVGhpc1BhcmFtKG1ldGhvZFtwYXJhbXNLZXldWzBdKSkge1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFjY2Vzb3JDYW5ub3REZWNsYXJlVGhpc1BhcmFtZXRlciwge1xuICAgICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2Qua2luZCA9PT0gXCJzZXRcIikge1xuICAgICAgICAgIGlmIChtZXRob2RbcGFyYW1zS2V5XS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlckFyaXR5LCB7IGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCkgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gbWV0aG9kW3BhcmFtc0tleV1bMF07XG4gICAgICAgICAgICBpZiAodGhpcy5pc1RoaXNQYXJhbShmaXJzdFBhcmFtZXRlcikpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5BY2Nlc29yQ2Fubm90RGVjbGFyZVRoaXNQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmlyc3RQYXJhbWV0ZXIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgICAgZmlyc3RQYXJhbWV0ZXIub3B0aW9uYWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlNldEFjY2Vzb3JDYW5ub3RIYXZlT3B0aW9uYWxQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFBhcmFtZXRlci50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TZXRBY2Nlc29yQ2Fubm90SGF2ZVJlc3RQYXJhbWV0ZXIsIHtcbiAgICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGhvZFtyZXR1cm5UeXBlS2V5XSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TZXRBY2Nlc29yQ2Fubm90SGF2ZVJldHVyblR5cGUsIHtcbiAgICAgICAgICAgICAgYXQ6IG1ldGhvZFtyZXR1cm5UeXBlS2V5XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXRob2Qua2luZCA9IFwibWV0aG9kXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShtZXRob2QsIFwiVFNNZXRob2RTaWduYXR1cmVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eTogTi5Uc1Byb3BlcnR5U2lnbmF0dXJlID0gbm9kZUFueTtcbiAgICAgICAgaWYgKHJlYWRvbmx5KSBwcm9wZXJ0eS5yZWFkb25seSA9IHRydWU7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgICBpZiAodHlwZSkgcHJvcGVydHkudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlTWVtYmVyU2VtaWNvbG9uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcGVydHksIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZU1lbWJlcigpOiBOLlRzVHlwZUVsZW1lbnQge1xuICAgICAgY29uc3Qgbm9kZTogYW55ID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlU2lnbmF0dXJlTWVtYmVyKFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIiwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9uZXcpKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5zdGFydE5vZGU8Ti5JZGVudGlmaWVyPigpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSB8fCB0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VTaWduYXR1cmVNZW1iZXIoXG4gICAgICAgICAgICBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmtleSA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihpZCwgXCJuZXdcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUobm9kZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHNQYXJzZU1vZGlmaWVycyhcbiAgICAgICAge1xuICAgICAgICAgIGFsbG93ZWRNb2RpZmllcnM6IFtcInJlYWRvbmx5XCJdLFxuICAgICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcbiAgICAgICAgICAgIFwiZGVjbGFyZVwiLFxuICAgICAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICAgICAgXCJwcml2YXRlXCIsXG4gICAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgICAgXCJwdWJsaWNcIixcbiAgICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgICBcIm92ZXJyaWRlXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMudHNUcnlQYXJzZUluZGV4U2lnbmF0dXJlKG5vZGUpO1xuICAgICAgaWYgKGlkeCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgfVxuXG4gICAgICBzdXBlci5wYXJzZVByb3BlcnR5TmFtZShub2RlKTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5vZGUuY29tcHV0ZWQgJiZcbiAgICAgICAgbm9kZS5rZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgKG5vZGUua2V5Lm5hbWUgPT09IFwiZ2V0XCIgfHwgbm9kZS5rZXkubmFtZSA9PT0gXCJzZXRcIikgJiZcbiAgICAgICAgdGhpcy50c1Rva2VuQ2FuRm9sbG93TW9kaWZpZXIoKVxuICAgICAgKSB7XG4gICAgICAgIG5vZGUua2luZCA9IG5vZGUua2V5Lm5hbWU7XG4gICAgICAgIHN1cGVyLnBhcnNlUHJvcGVydHlOYW1lKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVByb3BlcnR5T3JNZXRob2RTaWduYXR1cmUobm9kZSwgISFub2RlLnJlYWRvbmx5KTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUxpdGVyYWwoKTogTi5Uc1R5cGVMaXRlcmFsIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZUxpdGVyYWw+KCk7XG4gICAgICBub2RlLm1lbWJlcnMgPSB0aGlzLnRzUGFyc2VPYmplY3RUeXBlTWVtYmVycygpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZUxpdGVyYWxcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZU9iamVjdFR5cGVNZW1iZXJzKCk6IEFycmF5PE4uVHNUeXBlRWxlbWVudD4ge1xuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLnRzUGFyc2VMaXN0KFxuICAgICAgICBcIlR5cGVNZW1iZXJzXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVNZW1iZXIuYmluZCh0aGlzKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgfVxuXG4gICAgdHNJc1N0YXJ0T2ZNYXBwZWRUeXBlKCk6IGJvb2xlYW4ge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAodGhpcy5lYXQodHQucGx1c01pbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9yZWFkb25seSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3JlYWRvbmx5KSkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoIXRoaXMudHNJc0lkZW50aWZpZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIHJldHVybiB0aGlzLm1hdGNoKHR0Ll9pbik7XG4gICAgfVxuXG4gICAgdHNQYXJzZU1hcHBlZFR5cGVQYXJhbWV0ZXIoKTogTi5Uc1R5cGVQYXJhbWV0ZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUGFyYW1ldGVyPigpO1xuICAgICAgbm9kZS5uYW1lID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlck5hbWUoKTtcbiAgICAgIG5vZGUuY29uc3RyYWludCA9IHRoaXMudHNFeHBlY3RUaGVuUGFyc2VUeXBlKHR0Ll9pbik7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUGFyYW1ldGVyXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNYXBwZWRUeXBlKCk6IE4uVHNNYXBwZWRUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTWFwcGVkVHlwZT4oKTtcblxuICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2VMKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGx1c01pbikpIHtcbiAgICAgICAgbm9kZS5yZWFkb25seSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX3JlYWRvbmx5KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9yZWFkb25seSkpIHtcbiAgICAgICAgbm9kZS5yZWFkb25seSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRMKTtcbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlciA9IHRoaXMudHNQYXJzZU1hcHBlZFR5cGVQYXJhbWV0ZXIoKTtcbiAgICAgIG5vZGUubmFtZVR5cGUgPSB0aGlzLmVhdENvbnRleHR1YWwodHQuX2FzKSA/IHRoaXMudHNQYXJzZVR5cGUoKSA6IG51bGw7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGx1c01pbikpIHtcbiAgICAgICAgbm9kZS5vcHRpb25hbCA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICBub2RlLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNUcnlQYXJzZVR5cGUoKTtcbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNNYXBwZWRUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUdXBsZVR5cGUoKTogTi5Uc1R1cGxlVHlwZSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R1cGxlVHlwZT4oKTtcbiAgICAgIG5vZGUuZWxlbWVudFR5cGVzID0gdGhpcy50c1BhcnNlQnJhY2tldGVkTGlzdChcbiAgICAgICAgXCJUdXBsZUVsZW1lbnRUeXBlc1wiLFxuICAgICAgICB0aGlzLnRzUGFyc2VUdXBsZUVsZW1lbnRUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIC8qIGJyYWNrZXQgKi8gdHJ1ZSxcbiAgICAgICAgLyogc2tpcEZpcnN0VG9rZW4gKi8gZmFsc2UsXG4gICAgICApO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgZWxlbWVudFR5cGVzIHRvIGVuc3VyZSB0aGF0IG5vIG1hbmRhdG9yeSBlbGVtZW50c1xuICAgICAgLy8gZm9sbG93IG9wdGlvbmFsIGVsZW1lbnRzXG4gICAgICBsZXQgc2Vlbk9wdGlvbmFsRWxlbWVudCA9IGZhbHNlO1xuICAgICAgbGV0IGxhYmVsZWRFbGVtZW50czogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICAgICAgbm9kZS5lbGVtZW50VHlwZXMuZm9yRWFjaChlbGVtZW50Tm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gZWxlbWVudE5vZGU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlZW5PcHRpb25hbEVsZW1lbnQgJiZcbiAgICAgICAgICB0eXBlICE9PSBcIlRTUmVzdFR5cGVcIiAmJlxuICAgICAgICAgIHR5cGUgIT09IFwiVFNPcHRpb25hbFR5cGVcIiAmJlxuICAgICAgICAgICEodHlwZSA9PT0gXCJUU05hbWVkVHVwbGVNZW1iZXJcIiAmJiBlbGVtZW50Tm9kZS5vcHRpb25hbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5PcHRpb25hbFR5cGVCZWZvcmVSZXF1aXJlZCwge1xuICAgICAgICAgICAgYXQ6IGVsZW1lbnROb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2Vlbk9wdGlvbmFsRWxlbWVudCB8fD1cbiAgICAgICAgICAodHlwZSA9PT0gXCJUU05hbWVkVHVwbGVNZW1iZXJcIiAmJiBlbGVtZW50Tm9kZS5vcHRpb25hbCkgfHxcbiAgICAgICAgICB0eXBlID09PSBcIlRTT3B0aW9uYWxUeXBlXCI7XG5cbiAgICAgICAgLy8gV2hlbiBjaGVja2luZyBsYWJlbHMsIGNoZWNrIHRoZSBhcmd1bWVudCBvZiB0aGUgc3ByZWFkIG9wZXJhdG9yXG4gICAgICAgIGxldCBjaGVja1R5cGUgPSB0eXBlO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJUU1Jlc3RUeXBlXCIpIHtcbiAgICAgICAgICBlbGVtZW50Tm9kZSA9IGVsZW1lbnROb2RlLnR5cGVBbm5vdGF0aW9uO1xuICAgICAgICAgIGNoZWNrVHlwZSA9IGVsZW1lbnROb2RlLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhYmVsZWQgPSBjaGVja1R5cGUgPT09IFwiVFNOYW1lZFR1cGxlTWVtYmVyXCI7XG4gICAgICAgIGxhYmVsZWRFbGVtZW50cyA/Pz0gaXNMYWJlbGVkO1xuICAgICAgICBpZiAobGFiZWxlZEVsZW1lbnRzICE9PSBpc0xhYmVsZWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLk1peGVkTGFiZWxlZEFuZFVubGFiZWxlZEVsZW1lbnRzLCB7XG4gICAgICAgICAgICBhdDogZWxlbWVudE5vZGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUdXBsZVR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR1cGxlRWxlbWVudFR5cGUoKTogTi5Uc05hbWVkVHVwbGVNZW1iZXIgfCBOLlRzVHlwZSB7XG4gICAgICAvLyBwYXJzZXMgYC4uLlRzVHlwZVtdYFxuXG4gICAgICBjb25zdCB7IHN0YXJ0TG9jIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICBjb25zdCByZXN0ID0gdGhpcy5lYXQodHQuZWxsaXBzaXMpO1xuXG4gICAgICBsZXQgbGFiZWxlZDogYm9vbGVhbjtcbiAgICAgIGxldCBsYWJlbDogTi5JZGVudGlmaWVyO1xuICAgICAgbGV0IG9wdGlvbmFsOiBib29sZWFuO1xuICAgICAgbGV0IHR5cGU6IE4uVHNOYW1lZFR1cGxlTWVtYmVyIHwgTi5Uc1R5cGU7XG5cbiAgICAgIGNvbnN0IGlzV29yZCA9IHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICBjb25zdCBjaEFmdGVyV29yZCA9IGlzV29yZCA/IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA6IG51bGw7XG4gICAgICBpZiAoY2hBZnRlcldvcmQgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICBsYWJlbGVkID0gdHJ1ZTtcbiAgICAgICAgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgbGFiZWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgfSBlbHNlIGlmIChjaEFmdGVyV29yZCA9PT0gY2hhckNvZGVzLnF1ZXN0aW9uTWFyaykge1xuICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgY29uc3Qgd29yZE5hbWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgICBjb25zdCB0eXBlT3JMYWJlbCA9IHRoaXMudHNQYXJzZU5vbkFycmF5VHlwZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5jb2xvbikge1xuICAgICAgICAgIGxhYmVsZWQgPSB0cnVlO1xuICAgICAgICAgIGxhYmVsID0gdGhpcy5jcmVhdGVJZGVudGlmaWVyKFxuICAgICAgICAgICAgdGhpcy5zdGFydE5vZGVBdDxOLklkZW50aWZpZXI+KHN0YXJ0TG9jKSxcbiAgICAgICAgICAgIHdvcmROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucXVlc3Rpb24pO1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhYmVsZWQgPSBmYWxzZTtcbiAgICAgICAgICB0eXBlID0gdHlwZU9yTGFiZWw7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQucXVlc3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICBvcHRpb25hbCA9IHRoaXMuZWF0KHR0LnF1ZXN0aW9uKTtcbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlIChsYWJlbGVkID09PSB0cnVlKSBjb3VsZCBiZSBvbmx5IGluIGludmFsaWQgbGFiZWwuXG4gICAgICAgIC8vIEUuZy4gW3gueTp0eXBlXVxuICAgICAgICAvLyBBbiBlcnJvciBpcyByYWlzZWQgd2hpbGUgcHJvY2Vzc2luZyBub2RlLlxuICAgICAgICBsYWJlbGVkID0gdGhpcy5lYXQodHQuY29sb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFiZWxlZCkge1xuICAgICAgICBsZXQgbGFiZWxlZE5vZGU6IFVuZG9uZTxOLlRzTmFtZWRUdXBsZU1lbWJlcj47XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgIGxhYmVsZWROb2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc05hbWVkVHVwbGVNZW1iZXI+KGxhYmVsKTtcbiAgICAgICAgICBsYWJlbGVkTm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgIGxhYmVsZWROb2RlLmxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgbGFiZWxlZE5vZGUuZWxlbWVudFR5cGUgPSB0eXBlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgICAgbGFiZWxlZE5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5UdXBsZU9wdGlvbmFsQWZ0ZXJUeXBlLCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYWJlbGVkTm9kZSA9IHRoaXMuc3RhcnROb2RlQXROb2RlPE4uVHNOYW1lZFR1cGxlTWVtYmVyPih0eXBlKTtcbiAgICAgICAgICBsYWJlbGVkTm9kZS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW52YWxpZFR1cGxlTWVtYmVyTGFiZWwsIHsgYXQ6IHR5cGUgfSk7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGlzIHByb2R1Y2VzIGFuIGludmFsaWQgQVNULCBidXQgYXQgbGVhc3Qgd2UgZG9uJ3QgZHJvcFxuICAgICAgICAgIC8vIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgaW52YWxpZCBzb3VyY2UuXG4gICAgICAgICAgbGFiZWxlZE5vZGUubGFiZWwgPSB0eXBlO1xuICAgICAgICAgIGxhYmVsZWROb2RlLmVsZW1lbnRUeXBlID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgICB9XG4gICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobGFiZWxlZE5vZGUsIFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25hbCkge1xuICAgICAgICBjb25zdCBvcHRpb25hbFR5cGVOb2RlID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5Uc09wdGlvbmFsVHlwZT4odHlwZSk7XG4gICAgICAgIG9wdGlvbmFsVHlwZU5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlKG9wdGlvbmFsVHlwZU5vZGUsIFwiVFNPcHRpb25hbFR5cGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgIGNvbnN0IHJlc3ROb2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlRzUmVzdFR5cGU+KHN0YXJ0TG9jKTtcbiAgICAgICAgcmVzdE5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0eXBlID0gdGhpcy5maW5pc2hOb2RlKHJlc3ROb2RlLCBcIlRTUmVzdFR5cGVcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHRzUGFyc2VQYXJlbnRoZXNpemVkVHlwZSgpOiBOLlRzUGFyZW50aGVzaXplZFR5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNQYXJlbnRoZXNpemVkVHlwZT4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VGdW5jdGlvbk9yQ29uc3RydWN0b3JUeXBlKFxuICAgICAgdHlwZTogXCJUU0Z1bmN0aW9uVHlwZVwiIHwgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgICAgYWJzdHJhY3Q/OiBib29sZWFuLFxuICAgICk6IE4uVHNGdW5jdGlvbk9yQ29uc3RydWN0b3JUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxcbiAgICAgICAgTi5Uc0Z1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUgfCBOLlRzQ29uc3RydWN0b3JUeXBlXG4gICAgICA+KCk7XG4gICAgICBpZiAodHlwZSA9PT0gXCJUU0NvbnN0cnVjdG9yVHlwZVwiKSB7XG4gICAgICAgIChub2RlIGFzIFVuZG9uZTxOLlRzQ29uc3RydWN0b3JUeXBlPikuYWJzdHJhY3QgPSAhIWFic3RyYWN0O1xuICAgICAgICBpZiAoYWJzdHJhY3QpIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBuZXdgXG4gICAgICB9XG4gICAgICB0aGlzLnRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0KCgpID0+XG4gICAgICAgIHRoaXMudHNGaWxsU2lnbmF0dXJlKHR0LmFycm93LCBub2RlKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIHR5cGUpO1xuICAgIH1cblxuICAgIHRzUGFyc2VMaXRlcmFsVHlwZU5vZGUoKTogTi5Uc0xpdGVyYWxUeXBlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTGl0ZXJhbFR5cGU+KCk7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0Lm51bTpcbiAgICAgICAgY2FzZSB0dC5iaWdpbnQ6XG4gICAgICAgIGNhc2UgdHQuc3RyaW5nOlxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB0byBlc3RyZWUgd2UgY2Fubm90IGNhbGwgcGFyc2VMaXRlcmFsIGRpcmVjdGx5IGhlcmVcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgbm9kZS5saXRlcmFsID0gc3VwZXIucGFyc2VFeHByQXRvbSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTGl0ZXJhbFR5cGVcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVRlbXBsYXRlTGl0ZXJhbFR5cGUoKTogTi5Uc1R5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNMaXRlcmFsVHlwZT4oKTtcbiAgICAgIG5vZGUubGl0ZXJhbCA9IHN1cGVyLnBhcnNlVGVtcGxhdGUoZmFsc2UpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTGl0ZXJhbFR5cGVcIik7XG4gICAgfVxuXG4gICAgcGFyc2VUZW1wbGF0ZVN1YnN0aXR1dGlvbigpOiBOLlRzVHlwZSB8IE4uTm9kZSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5pblR5cGUpIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VUZW1wbGF0ZVN1YnN0aXR1dGlvbigpO1xuICAgIH1cblxuICAgIHRzUGFyc2VUaGlzVHlwZU9yVGhpc1R5cGVQcmVkaWNhdGUoKTogTi5Uc1RoaXNUeXBlIHwgTi5Uc1R5cGVQcmVkaWNhdGUge1xuICAgICAgY29uc3QgdGhpc0tleXdvcmQgPSB0aGlzLnRzUGFyc2VUaGlzVHlwZU5vZGUoKTtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faXMpICYmICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUaGlzVHlwZVByZWRpY2F0ZSh0aGlzS2V5d29yZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpc0tleXdvcmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZU5vbkFycmF5VHlwZSgpOiBOLlRzVHlwZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlIHR0LnN0cmluZzpcbiAgICAgICAgY2FzZSB0dC5udW06XG4gICAgICAgIGNhc2UgdHQuYmlnaW50OlxuICAgICAgICBjYXNlIHR0Ll90cnVlOlxuICAgICAgICBjYXNlIHR0Ll9mYWxzZTpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTGl0ZXJhbFR5cGVOb2RlKCk7XG4gICAgICAgIGNhc2UgdHQucGx1c01pbjpcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTGl0ZXJhbFR5cGU+KCk7XG4gICAgICAgICAgICBjb25zdCBuZXh0VG9rZW4gPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAgICAgaWYgKG5leHRUb2tlbi50eXBlICE9PSB0dC5udW0gJiYgbmV4dFRva2VuLnR5cGUgIT09IHR0LmJpZ2ludCkge1xuICAgICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHBhcnNlTWF5YmVVbmFyeSBtdXN0IHJldHVybnMgdW5hcnkgZXhwcmVzc2lvblxuICAgICAgICAgICAgbm9kZS5saXRlcmFsID0gdGhpcy5wYXJzZU1heWJlVW5hcnkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0xpdGVyYWxUeXBlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0dC5fdGhpczpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVGhpc1R5cGVPclRoaXNUeXBlUHJlZGljYXRlKCk7XG4gICAgICAgIGNhc2UgdHQuX3R5cGVvZjpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHlwZVF1ZXJ5KCk7XG4gICAgICAgIGNhc2UgdHQuX2ltcG9ydDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlSW1wb3J0VHlwZSgpO1xuICAgICAgICBjYXNlIHR0LmJyYWNlTDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c0xvb2tBaGVhZCh0aGlzLnRzSXNTdGFydE9mTWFwcGVkVHlwZS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgPyB0aGlzLnRzUGFyc2VNYXBwZWRUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy50c1BhcnNlVHlwZUxpdGVyYWwoKTtcbiAgICAgICAgY2FzZSB0dC5icmFja2V0TDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHVwbGVUeXBlKCk7XG4gICAgICAgIGNhc2UgdHQucGFyZW5MOlxuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jcmVhdGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRFeHRyYSh0eXBlLCBcInBhcmVudGhlc2l6ZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkRXh0cmEodHlwZSwgXCJwYXJlblN0YXJ0XCIsIHN0YXJ0TG9jLmluZGV4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVBhcmVudGhlc2l6ZWRUeXBlKCk7XG4gICAgICAgIGNhc2UgdHQudGVtcGxhdGVOb25UYWlsOlxuICAgICAgICBjYXNlIHR0LnRlbXBsYXRlVGFpbDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVGVtcGxhdGVMaXRlcmFsVHlwZSgpO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRva2VuSXNJZGVudGlmaWVyKHR5cGUpIHx8XG4gICAgICAgICAgICB0eXBlID09PSB0dC5fdm9pZCB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gdHQuX251bGxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gdHQuX3ZvaWRcbiAgICAgICAgICAgICAgICA/IFwiVFNWb2lkS2V5d29yZFwiXG4gICAgICAgICAgICAgICAgOiB0eXBlID09PSB0dC5fbnVsbFxuICAgICAgICAgICAgICAgID8gXCJUU051bGxLZXl3b3JkXCJcbiAgICAgICAgICAgICAgICA6IGtleXdvcmRUeXBlRnJvbU5hbWUodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5vZGVUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpICE9PSBjaGFyQ29kZXMuZG90XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNLZXl3b3JkVHlwZT4oKTtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgbm9kZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVSZWZlcmVuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZUFycmF5VHlwZU9ySGlnaGVyKCk6IE4uVHNUeXBlIHtcbiAgICAgIGxldCB0eXBlID0gdGhpcy50c1BhcnNlTm9uQXJyYXlUeXBlKCk7XG4gICAgICB3aGlsZSAoIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiYgdGhpcy5lYXQodHQuYnJhY2tldEwpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNrZXRSKSkge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzQXJyYXlUeXBlPih0eXBlKTtcbiAgICAgICAgICBub2RlLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5icmFja2V0Uik7XG4gICAgICAgICAgdHlwZSA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTQXJyYXlUeXBlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzSW5kZXhlZEFjY2Vzc1R5cGU+KHR5cGUpO1xuICAgICAgICAgIG5vZGUub2JqZWN0VHlwZSA9IHR5cGU7XG4gICAgICAgICAgbm9kZS5pbmRleFR5cGUgPSB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYnJhY2tldFIpO1xuICAgICAgICAgIHR5cGUgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZU9wZXJhdG9yKCk6IE4uVHNUeXBlT3BlcmF0b3Ige1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlT3BlcmF0b3I+KCk7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IG9wZXJhdG9yXG4gICAgICBub2RlLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yT3JIaWdoZXIoKTtcblxuICAgICAgaWYgKG9wZXJhdG9yID09PSBcInJlYWRvbmx5XCIpIHtcbiAgICAgICAgdGhpcy50c0NoZWNrVHlwZUFubm90YXRpb25Gb3JSZWFkT25seShcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZU9wZXJhdG9yXCIpO1xuICAgIH1cblxuICAgIHRzQ2hlY2tUeXBlQW5ub3RhdGlvbkZvclJlYWRPbmx5KG5vZGU6IE4uTm9kZSkge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGVBbm5vdGF0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgICAgIGNhc2UgXCJUU0FycmF5VHlwZVwiOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuZXhwZWN0ZWRSZWFkb25seSwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlSW5mZXJUeXBlKCk6IE4uVHNJbmZlclR5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNJbmZlclR5cGU+KCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2luZmVyKTtcbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVBhcmFtZXRlcj4oKTtcbiAgICAgIHR5cGVQYXJhbWV0ZXIubmFtZSA9IHRoaXMudHNQYXJzZVR5cGVQYXJhbWV0ZXJOYW1lKCk7XG4gICAgICB0eXBlUGFyYW1ldGVyLmNvbnN0cmFpbnQgPSB0aGlzLnRzVHJ5UGFyc2UoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RyYWludEZvckluZmVyVHlwZSgpLFxuICAgICAgKTtcbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlciA9IHRoaXMuZmluaXNoTm9kZSh0eXBlUGFyYW1ldGVyLCBcIlRTVHlwZVBhcmFtZXRlclwiKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0luZmVyVHlwZVwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlQ29uc3RyYWludEZvckluZmVyVHlwZSgpIHtcbiAgICAgIGlmICh0aGlzLmVhdCh0dC5fZXh0ZW5kcykpIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludCA9IHRoaXMudHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlKCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCB8fFxuICAgICAgICAgICF0aGlzLm1hdGNoKHR0LnF1ZXN0aW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29uc3RyYWludDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRzUGFyc2VUeXBlT3BlcmF0b3JPckhpZ2hlcigpOiBOLlRzVHlwZSB7XG4gICAgICBjb25zdCBpc1R5cGVPcGVyYXRvciA9XG4gICAgICAgIHRva2VuSXNUU1R5cGVPcGVyYXRvcih0aGlzLnN0YXRlLnR5cGUpICYmICF0aGlzLnN0YXRlLmNvbnRhaW5zRXNjO1xuICAgICAgcmV0dXJuIGlzVHlwZU9wZXJhdG9yXG4gICAgICAgID8gdGhpcy50c1BhcnNlVHlwZU9wZXJhdG9yKClcbiAgICAgICAgOiB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW5mZXIpXG4gICAgICAgID8gdGhpcy50c1BhcnNlSW5mZXJUeXBlKClcbiAgICAgICAgOiB0aGlzLnRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0KCgpID0+XG4gICAgICAgICAgICB0aGlzLnRzUGFyc2VBcnJheVR5cGVPckhpZ2hlcigpLFxuICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgdHNQYXJzZVVuaW9uT3JJbnRlcnNlY3Rpb25UeXBlKFxuICAgICAga2luZDogXCJUU1VuaW9uVHlwZVwiIHwgXCJUU0ludGVyc2VjdGlvblR5cGVcIixcbiAgICAgIHBhcnNlQ29uc3RpdHVlbnRUeXBlOiAoKSA9PiBOLlRzVHlwZSxcbiAgICAgIG9wZXJhdG9yOiBUb2tlblR5cGUsXG4gICAgKTogTi5Uc1R5cGUge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNVbmlvblR5cGUgfCBOLlRzSW50ZXJzZWN0aW9uVHlwZT4oKTtcbiAgICAgIGNvbnN0IGhhc0xlYWRpbmdPcGVyYXRvciA9IHRoaXMuZWF0KG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gW107XG4gICAgICBkbyB7XG4gICAgICAgIHR5cGVzLnB1c2gocGFyc2VDb25zdGl0dWVudFR5cGUoKSk7XG4gICAgICB9IHdoaWxlICh0aGlzLmVhdChvcGVyYXRvcikpO1xuICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMSAmJiAhaGFzTGVhZGluZ09wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiB0eXBlc1swXTtcbiAgICAgIH1cbiAgICAgIG5vZGUudHlwZXMgPSB0eXBlcztcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwga2luZCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZUludGVyc2VjdGlvblR5cGVPckhpZ2hlcigpOiBOLlRzVHlwZSB7XG4gICAgICByZXR1cm4gdGhpcy50c1BhcnNlVW5pb25PckludGVyc2VjdGlvblR5cGUoXG4gICAgICAgIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZVR5cGVPcGVyYXRvck9ySGlnaGVyLmJpbmQodGhpcyksXG4gICAgICAgIHR0LmJpdHdpc2VBTkQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VVbmlvblR5cGVPckhpZ2hlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VVbmlvbk9ySW50ZXJzZWN0aW9uVHlwZShcbiAgICAgICAgXCJUU1VuaW9uVHlwZVwiLFxuICAgICAgICB0aGlzLnRzUGFyc2VJbnRlcnNlY3Rpb25UeXBlT3JIaWdoZXIuYmluZCh0aGlzKSxcbiAgICAgICAgdHQuYml0d2lzZU9SLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0c0lzU3RhcnRPZkZ1bmN0aW9uVHlwZSgpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgICB0aGlzLnRzTG9va0FoZWFkKHRoaXMudHNJc1VuYW1iaWd1b3VzbHlTdGFydE9mRnVuY3Rpb25UeXBlLmJpbmQodGhpcykpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzU2tpcFBhcmFtZXRlclN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgfHwgdGhpcy5tYXRjaCh0dC5fdGhpcykpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJzZSBhbiBvYmplY3QgcGF0dGVybiB3aXRob3V0IGVycm9yc1xuICAgICAgICBjb25zdCB7IGVycm9ycyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFcnJvckNvdW50ID0gZXJyb3JzLmxlbmd0aDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBhcnNlT2JqZWN0TGlrZSh0dC5icmFjZVIsIHRydWUpO1xuICAgICAgICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID09PSBwcmV2aW91c0Vycm9yQ291bnQ7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFja2V0TCkpIHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBwYXJzZSBhbiBhcnJheSBwYXR0ZXJuIHdpdGhvdXQgZXJyb3JzXG4gICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBwcmV2aW91c0Vycm9yQ291bnQgPSBlcnJvcnMubGVuZ3RoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN1cGVyLnBhcnNlQmluZGluZ0xpc3QoXG4gICAgICAgICAgICB0dC5icmFja2V0UixcbiAgICAgICAgICAgIGNoYXJDb2Rlcy5yaWdodFNxdWFyZUJyYWNrZXQsXG4gICAgICAgICAgICBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuQUxMT1dfRU1QVFksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA9PT0gcHJldmlvdXNFcnJvckNvdW50O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRzSXNVbmFtYmlndW91c2x5U3RhcnRPZkZ1bmN0aW9uVHlwZSgpOiBib29sZWFuIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSB8fCB0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgICAvLyAoIClcbiAgICAgICAgLy8gKCAuLi5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50c1NraXBQYXJhbWV0ZXJTdGFydCgpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmNvbG9uKSB8fFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuY29tbWEpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5xdWVzdGlvbikgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmVxKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyAoIHh4eCA6XG4gICAgICAgICAgLy8gKCB4eHggLFxuICAgICAgICAgIC8vICggeHh4ID9cbiAgICAgICAgICAvLyAoIHh4eCA9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmFycm93KSkge1xuICAgICAgICAgICAgLy8gKCB4eHggKSA9PlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKFxuICAgICAgcmV0dXJuVG9rZW46IFRva2VuVHlwZSxcbiAgICApOiBOLlRzVHlwZUFubm90YXRpb24ge1xuICAgICAgcmV0dXJuIHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVBbm5vdGF0aW9uPigpO1xuICAgICAgICB0aGlzLmV4cGVjdChyZXR1cm5Ub2tlbik7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlUHJlZGljYXRlPigpO1xuXG4gICAgICAgIGNvbnN0IGFzc2VydHMgPSAhIXRoaXMudHNUcnlQYXJzZShcbiAgICAgICAgICB0aGlzLnRzUGFyc2VUeXBlUHJlZGljYXRlQXNzZXJ0cy5iaW5kKHRoaXMpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhc3NlcnRzICYmIHRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgICAgLy8gV2hlbiBhc3NlcnRzIGlzIGZhbHNlLCB0aGlzS2V5d29yZCBpcyBoYW5kbGVkIGJ5IHRzUGFyc2VOb25BcnJheVR5cGVcbiAgICAgICAgICAvLyA6IGFzc2VydHMgdGhpcyBpcyB0eXBlXG4gICAgICAgICAgbGV0IHRoaXNUeXBlUHJlZGljYXRlID0gdGhpcy50c1BhcnNlVGhpc1R5cGVPclRoaXNUeXBlUHJlZGljYXRlKCk7XG4gICAgICAgICAgLy8gaWYgaXQgdHVybnMgb3V0IHRvIGJlIGEgYFRTVGhpc1R5cGVgLCB3cmFwIGl0IHdpdGggYFRTVHlwZVByZWRpY2F0ZWBcbiAgICAgICAgICAvLyA6IGFzc2VydHMgdGhpc1xuICAgICAgICAgIGlmICh0aGlzVHlwZVByZWRpY2F0ZS50eXBlID09PSBcIlRTVGhpc1R5cGVcIikge1xuICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJOYW1lID0gdGhpc1R5cGVQcmVkaWNhdGU7XG4gICAgICAgICAgICBub2RlLmFzc2VydHMgPSB0cnVlO1xuICAgICAgICAgICAgKG5vZGUgYXMgTi5Uc1R5cGVQcmVkaWNhdGUpLnR5cGVBbm5vdGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXNUeXBlUHJlZGljYXRlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUHJlZGljYXRlXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKHRoaXNUeXBlUHJlZGljYXRlLCBub2RlKTtcbiAgICAgICAgICAgIHRoaXNUeXBlUHJlZGljYXRlLmFzc2VydHMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0LnR5cGVBbm5vdGF0aW9uID0gdGhpc1R5cGVQcmVkaWNhdGU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlUHJlZGljYXRlVmFyaWFibGUgPVxuICAgICAgICAgIHRoaXMudHNJc0lkZW50aWZpZXIoKSAmJlxuICAgICAgICAgIHRoaXMudHNUcnlQYXJzZSh0aGlzLnRzUGFyc2VUeXBlUHJlZGljYXRlUHJlZml4LmJpbmQodGhpcykpO1xuXG4gICAgICAgIGlmICghdHlwZVByZWRpY2F0ZVZhcmlhYmxlKSB7XG4gICAgICAgICAgaWYgKCFhc3NlcnRzKSB7XG4gICAgICAgICAgICAvLyA6IHR5cGVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigvKiBlYXRDb2xvbiAqLyBmYWxzZSwgdCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gOiBhc3NlcnRzIGZvb1xuICAgICAgICAgIG5vZGUucGFyYW1ldGVyTmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgICAgbm9kZS5hc3NlcnRzID0gYXNzZXJ0cztcbiAgICAgICAgICAobm9kZSBhcyBOLlRzVHlwZVByZWRpY2F0ZSkudHlwZUFubm90YXRpb24gPSBudWxsO1xuICAgICAgICAgIHQudHlwZUFubm90YXRpb24gPSB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVQcmVkaWNhdGVcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA6IGFzc2VydHMgZm9vIGlzIHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKC8qIGVhdENvbG9uICovIGZhbHNlKTtcbiAgICAgICAgbm9kZS5wYXJhbWV0ZXJOYW1lID0gdHlwZVByZWRpY2F0ZVZhcmlhYmxlO1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdHlwZTtcbiAgICAgICAgbm9kZS5hc3NlcnRzID0gYXNzZXJ0cztcbiAgICAgICAgdC50eXBlQW5ub3RhdGlvbiA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTVHlwZVByZWRpY2F0ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZSh0LCBcIlRTVHlwZUFubm90YXRpb25cIik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24oKTogTi5Uc1R5cGVBbm5vdGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24odHQuY29sb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpOiBOLlRzVHlwZUFubm90YXRpb24gfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzVHJ5UGFyc2VUeXBlKCk6IE4uVHNUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRzRWF0VGhlblBhcnNlVHlwZSh0dC5jb2xvbik7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQcmVkaWNhdGVQcmVmaXgoKTogTi5JZGVudGlmaWVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faXMpICYmICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQcmVkaWNhdGVBc3NlcnRzKCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudHlwZSAhPT0gdHQuX2Fzc2VydHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbnNFc2MgPSB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoIXRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiYgIXRoaXMubWF0Y2godHQuX3RoaXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRhaW5zRXNjKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRFc2NhcGVkUmVzZXJ2ZWRXb3JkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgIHJlc2VydmVkV29yZDogXCJhc3NlcnRzXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFubm90YXRpb24oXG4gICAgICBlYXRDb2xvbiA9IHRydWUsXG4gICAgICB0OiBVbmRvbmU8Ti5Uc1R5cGVBbm5vdGF0aW9uPiA9IHRoaXMuc3RhcnROb2RlPE4uVHNUeXBlQW5ub3RhdGlvbj4oKSxcbiAgICApOiBOLlRzVHlwZUFubm90YXRpb24ge1xuICAgICAgdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgIGlmIChlYXRDb2xvbikgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgICB0LnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c1BhcnNlVHlwZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHQsIFwiVFNUeXBlQW5ub3RhdGlvblwiKTtcbiAgICB9XG5cbiAgICAvKiogQmUgc3VyZSB0byBiZSBpbiBhIHR5cGUgY29udGV4dCBiZWZvcmUgY2FsbGluZyB0aGlzLCB1c2luZyBgdHNJblR5cGVgLiAqL1xuICAgIHRzUGFyc2VUeXBlKCk6IE4uVHNUeXBlIHtcbiAgICAgIC8vIE5lZWQgdG8gc2V0IGBzdGF0ZS5pblR5cGVgIHNvIHRoYXQgd2UgZG9uJ3QgcGFyc2UgSlNYIGluIGEgdHlwZSBjb250ZXh0LlxuICAgICAgYXNzZXJ0KHRoaXMuc3RhdGUuaW5UeXBlKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzUGFyc2VOb25Db25kaXRpb25hbFR5cGUoKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCB8fFxuICAgICAgICB0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpIHx8XG4gICAgICAgICF0aGlzLmVhdCh0dC5fZXh0ZW5kcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLlRzQ29uZGl0aW9uYWxUeXBlPih0eXBlKTtcbiAgICAgIG5vZGUuY2hlY2tUeXBlID0gdHlwZTtcblxuICAgICAgbm9kZS5leHRlbmRzVHlwZSA9IHRoaXMudHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlTm9uQ29uZGl0aW9uYWxUeXBlKCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5xdWVzdGlvbik7XG4gICAgICBub2RlLnRydWVUeXBlID0gdGhpcy50c0luQWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCgoKSA9PlxuICAgICAgICB0aGlzLnRzUGFyc2VUeXBlKCksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5jb2xvbik7XG4gICAgICBub2RlLmZhbHNlVHlwZSA9IHRoaXMudHNJbkFsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQoKCkgPT5cbiAgICAgICAgdGhpcy50c1BhcnNlVHlwZSgpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTQ29uZGl0aW9uYWxUeXBlXCIpO1xuICAgIH1cblxuICAgIGlzQWJzdHJhY3RDb25zdHJ1Y3RvclNpZ25hdHVyZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hYnN0cmFjdCkgJiYgdGhpcy5sb29rYWhlYWQoKS50eXBlID09PSB0dC5fbmV3XG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VOb25Db25kaXRpb25hbFR5cGUoKTogTi5Uc1R5cGUge1xuICAgICAgaWYgKHRoaXMudHNJc1N0YXJ0T2ZGdW5jdGlvblR5cGUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRnVuY3Rpb25PckNvbnN0cnVjdG9yVHlwZShcIlRTRnVuY3Rpb25UeXBlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX25ldykpIHtcbiAgICAgICAgLy8gQXMgaW4gYG5ldyAoKSA9PiBEYXRlYFxuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRnVuY3Rpb25PckNvbnN0cnVjdG9yVHlwZShcIlRTQ29uc3RydWN0b3JUeXBlXCIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQWJzdHJhY3RDb25zdHJ1Y3RvclNpZ25hdHVyZSgpKSB7XG4gICAgICAgIC8vIEFzIGluIGBhYnN0cmFjdCBuZXcgKCkgPT4gRGF0ZWBcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUZ1bmN0aW9uT3JDb25zdHJ1Y3RvclR5cGUoXG4gICAgICAgICAgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgICAgICAgIC8qIGFic3RyYWN0ICovIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50c1BhcnNlVW5pb25UeXBlT3JIaWdoZXIoKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFzc2VydGlvbigpOiBOLlRzVHlwZUFzc2VydGlvbiB7XG4gICAgICBpZiAodGhpcy5nZXRQbHVnaW5PcHRpb24oXCJ0eXBlc2NyaXB0XCIsIFwiZGlzYWxsb3dBbWJpZ3VvdXNKU1hMaWtlXCIpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uLCB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc1R5cGVBc3NlcnRpb24+KCk7XG4gICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubmV4dCgpOyAvLyBcIjxcIlxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5fY29uc3QpXG4gICAgICAgICAgPyB0aGlzLnRzUGFyc2VUeXBlUmVmZXJlbmNlKClcbiAgICAgICAgICA6IHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leHBlY3QodHQuZ3QpO1xuICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy5wYXJzZU1heWJlVW5hcnkoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVBc3NlcnRpb25cIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUhlcml0YWdlQ2xhdXNlKFxuICAgICAgdG9rZW46IFwiZXh0ZW5kc1wiIHwgXCJpbXBsZW1lbnRzXCIsXG4gICAgKTogQXJyYXk8Ti5Uc0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICAgIGNvbnN0IGRlbGltaXRlZExpc3QgPSB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0KFxuICAgICAgICBcIkhlcml0YWdlQ2xhdXNlRWxlbWVudFwiLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+KCk7XG4gICAgICAgICAgbm9kZS5leHByZXNzaW9uID0gdGhpcy50c1BhcnNlRW50aXR5TmFtZSgpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSkge1xuICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIik7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoIWRlbGltaXRlZExpc3QubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuRW1wdHlIZXJpdGFnZUNsYXVzZVR5cGUsIHtcbiAgICAgICAgICBhdDogb3JpZ2luYWxTdGFydExvYyxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWxpbWl0ZWRMaXN0O1xuICAgIH1cblxuICAgIHRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzSW50ZXJmYWNlRGVjbGFyYXRpb24+LFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBkZWNsYXJlPzogdHJ1ZTtcbiAgICAgIH0gPSB7fSxcbiAgICApOiBOLlRzSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBudWxsIHtcbiAgICAgIGlmICh0aGlzLmhhc0ZvbGxvd2luZ0xpbmVCcmVhaygpKSByZXR1cm4gbnVsbDtcbiAgICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbCh0dC5faW50ZXJmYWNlKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmRlY2xhcmUpIG5vZGUuZGVjbGFyZSA9IHRydWU7XG4gICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19JTlRFUkZBQ0UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5pZCA9IG51bGw7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuTWlzc2luZ0ludGVyZmFjZU5hbWUsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRDb25zdE1vZGlmaWVycyxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5lYXQodHQuX2V4dGVuZHMpKSB7XG4gICAgICAgIG5vZGUuZXh0ZW5kcyA9IHRoaXMudHNQYXJzZUhlcml0YWdlQ2xhdXNlKFwiZXh0ZW5kc1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRTSW50ZXJmYWNlQm9keT4oKTtcbiAgICAgIGJvZHkuYm9keSA9IHRoaXMudHNJblR5cGUodGhpcy50c1BhcnNlT2JqZWN0VHlwZU1lbWJlcnMuYmluZCh0aGlzKSk7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLmZpbmlzaE5vZGUoYm9keSwgXCJUU0ludGVyZmFjZUJvZHlcIik7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlVHlwZUFsaWFzRGVjbGFyYXRpb24oXG4gICAgICBub2RlOiBOLlRzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gICAgKTogTi5Uc1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19UWVBFKTtcblxuICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiA9IHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1RyeVBhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRNb2RpZmllcnMsXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5leHBlY3QodHQuZXEpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50cmluc2ljKSAmJlxuICAgICAgICAgIHRoaXMubG9va2FoZWFkKCkudHlwZSAhPT0gdHQuZG90XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzS2V5d29yZFR5cGU+KCk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTSW50cmluc2ljS2V5d29yZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzSW5Ob0NvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLnN0YXRlLmNvbnRleHQ7XG4gICAgICB0aGlzLnN0YXRlLmNvbnRleHQgPSBbb2xkQ29udGV4dFswXV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY29udGV4dCA9IG9sZENvbnRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBgY2JgIGluIGEgdHlwZSBjb250ZXh0LlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmUgdG9rZW4gKmJlZm9yZSogdGhlIGZpcnN0IHR5cGUgdG9rZW4sXG4gICAgICogc28gdGhhdCB0aGUgY2FsbCB0byBgbmV4dCgpYCBpcyBydW4gaW4gdHlwZSBjb250ZXh0LlxuICAgICAqL1xuICAgIHRzSW5UeXBlPFQ+KGNiOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBvbGRJblR5cGUgPSB0aGlzLnN0YXRlLmluVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUuaW5UeXBlID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5pblR5cGUgPSBvbGRJblR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZEluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCA9XG4gICAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0O1xuICAgICAgdGhpcy5zdGF0ZS5pbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dCA9XG4gICAgICAgICAgb2xkSW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzSW5BbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0PFQ+KGNiOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBvbGRJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQgPVxuICAgICAgICB0aGlzLnN0YXRlLmluRGlzYWxsb3dDb25kaXRpb25hbFR5cGVzQ29udGV4dDtcbiAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0ID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RhdGUuaW5EaXNhbGxvd0NvbmRpdGlvbmFsVHlwZXNDb250ZXh0ID1cbiAgICAgICAgICBvbGRJbkRpc2FsbG93Q29uZGl0aW9uYWxUeXBlc0NvbnRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHNFYXRUaGVuUGFyc2VUeXBlKHRva2VuOiBUb2tlblR5cGUpOiBOLlRzVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHNOZXh0VGhlblBhcnNlVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRzRXhwZWN0VGhlblBhcnNlVHlwZSh0b2tlbjogVG9rZW5UeXBlKTogTi5Uc1R5cGUge1xuICAgICAgcmV0dXJuIHRoaXMudHNJblR5cGUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGVjdCh0b2tlbik7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c05leHRUaGVuUGFyc2VUeXBlKCk6IE4uVHNUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLnRzSW5UeXBlKCgpID0+IHtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0c1BhcnNlRW51bU1lbWJlcigpOiBOLlRzRW51bU1lbWJlciB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1NZW1iZXI+KCk7XG4gICAgICAvLyBDb21wdXRlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgZ3JhbW1hciBlcnJvcnMgaW4gYW4gZW51bSwgc28gYWNjZXB0IGp1c3Qgc3RyaW5nIGxpdGVyYWwgb3IgaWRlbnRpZmllci5cbiAgICAgIG5vZGUuaWQgPSB0aGlzLm1hdGNoKHR0LnN0cmluZylcbiAgICAgICAgPyBzdXBlci5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSlcbiAgICAgICAgOiB0aGlzLnBhcnNlSWRlbnRpZmllcigvKiBsaWJlcmFsICovIHRydWUpO1xuICAgICAgaWYgKHRoaXMuZWF0KHR0LmVxKSkge1xuICAgICAgICBub2RlLmluaXRpYWxpemVyID0gc3VwZXIucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0VudW1NZW1iZXJcIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUVudW1EZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IFVuZG9uZTxOLlRzRW51bURlY2xhcmF0aW9uPixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgY29uc3Q/OiB0cnVlO1xuICAgICAgICBkZWNsYXJlPzogdHJ1ZTtcbiAgICAgIH0gPSB7fSxcbiAgICApOiBOLlRzRW51bURlY2xhcmF0aW9uIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnN0KSBub2RlLmNvbnN0ID0gdHJ1ZTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmRlY2xhcmUpIG5vZGUuZGVjbGFyZSA9IHRydWU7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2VudW0pO1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICB0aGlzLmNoZWNrSWRlbnRpZmllcihcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5jb25zdCA/IEJJTkRfVFNfQ09OU1RfRU5VTSA6IEJJTkRfVFNfRU5VTSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgICBub2RlLm1lbWJlcnMgPSB0aGlzLnRzUGFyc2VEZWxpbWl0ZWRMaXN0KFxuICAgICAgICBcIkVudW1NZW1iZXJzXCIsXG4gICAgICAgIHRoaXMudHNQYXJzZUVudW1NZW1iZXIuYmluZCh0aGlzKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZVIpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTRW51bURlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNb2R1bGVCbG9jaygpOiBOLlRzTW9kdWxlQmxvY2sge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVHNNb2R1bGVCbG9jaz4oKTtcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfT1RIRVIpO1xuXG4gICAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgICAgLy8gSW5zaWRlIG9mIGEgbW9kdWxlIGJsb2NrIGlzIGNvbnNpZGVyZWQgXCJ0b3AtbGV2ZWxcIiwgbWVhbmluZyBpdCBjYW4gaGF2ZSBpbXBvcnRzIGFuZCBleHBvcnRzLlxuICAgICAgc3VwZXIucGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KFxuICAgICAgICAobm9kZS5ib2R5ID0gW10pLFxuICAgICAgICAvKiBkaXJlY3RpdmVzICovIHVuZGVmaW5lZCxcbiAgICAgICAgLyogdG9wTGV2ZWwgKi8gdHJ1ZSxcbiAgICAgICAgLyogZW5kICovIHR0LmJyYWNlUixcbiAgICAgICk7XG4gICAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU01vZHVsZUJsb2NrXCIpO1xuICAgIH1cblxuICAgIHRzUGFyc2VNb2R1bGVPck5hbWVzcGFjZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogVW5kb25lPE4uVHNNb2R1bGVEZWNsYXJhdGlvbj4sXG4gICAgICBuZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiBOLlRzTW9kdWxlRGVjbGFyYXRpb24ge1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgIGlmICghbmVzdGVkKSB7XG4gICAgICAgIHRoaXMuY2hlY2tJZGVudGlmaWVyKG5vZGUuaWQsIEJJTkRfVFNfTkFNRVNQQUNFKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzTW9kdWxlRGVjbGFyYXRpb24+KCk7XG4gICAgICAgIHRoaXMudHNQYXJzZU1vZHVsZU9yTmFtZXNwYWNlRGVjbGFyYXRpb24oaW5uZXIsIHRydWUpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBub2RlLmJvZHkgPSBpbm5lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfVFNfTU9EVUxFKTtcbiAgICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoUEFSQU0pO1xuICAgICAgICBub2RlLmJvZHkgPSB0aGlzLnRzUGFyc2VNb2R1bGVCbG9jaygpO1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIik7XG4gICAgfVxuXG4gICAgdHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5Uc01vZHVsZURlY2xhcmF0aW9uLFxuICAgICk6IE4uVHNNb2R1bGVEZWNsYXJhdGlvbiB7XG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2dsb2JhbCkpIHtcbiAgICAgICAgbm9kZS5nbG9iYWwgPSB0cnVlO1xuICAgICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIG5vZGUuaWQgPSBzdXBlci5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlTCkpIHtcbiAgICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9UU19NT0RVTEUpO1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgICAgIG5vZGUuYm9keSA9IHRoaXMudHNQYXJzZU1vZHVsZUJsb2NrKCk7XG4gICAgICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24oXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXI/OiBOLklkZW50aWZpZXIgfCBudWxsLFxuICAgICAgaXNFeHBvcnQ/OiBib29sZWFuLFxuICAgICk6IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB7XG4gICAgICBub2RlLmlzRXhwb3J0ID0gaXNFeHBvcnQgfHwgZmFsc2U7XG4gICAgICBub2RlLmlkID0gbWF5YmVEZWZhdWx0SWRlbnRpZmllciB8fCB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9GTEFHU19UU19JTVBPUlQpO1xuICAgICAgdGhpcy5leHBlY3QodHQuZXEpO1xuICAgICAgY29uc3QgbW9kdWxlUmVmZXJlbmNlID0gdGhpcy50c1BhcnNlTW9kdWxlUmVmZXJlbmNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgJiZcbiAgICAgICAgbW9kdWxlUmVmZXJlbmNlLnR5cGUgIT09IFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbXBvcnRBbGlhc0hhc0ltcG9ydFR5cGUsIHtcbiAgICAgICAgICBhdDogbW9kdWxlUmVmZXJlbmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5vZGUubW9kdWxlUmVmZXJlbmNlID0gbW9kdWxlUmVmZXJlbmNlO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRzSXNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9yZXF1aXJlKSAmJlxuICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHNQYXJzZU1vZHVsZVJlZmVyZW5jZSgpOiBOLlRzTW9kdWxlUmVmZXJlbmNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRzSXNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSgpXG4gICAgICAgID8gdGhpcy50c1BhcnNlRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoKVxuICAgICAgICA6IHRoaXMudHNQYXJzZUVudGl0eU5hbWUoLyogYWxsb3dSZXNlcnZlZFdvcmRzICovIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0c1BhcnNlRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoKTogTi5Uc0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+KCk7XG4gICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX3JlcXVpcmUpO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgfVxuICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgdG8gZXN0cmVlIHdlIGNhbm5vdCBjYWxsIHBhcnNlTGl0ZXJhbCBkaXJlY3RseSBoZXJlXG4gICAgICBub2RlLmV4cHJlc3Npb24gPSBzdXBlci5wYXJzZUV4cHJBdG9tKCkgYXMgTi5TdHJpbmdMaXRlcmFsO1xuICAgICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICAgIHRoaXMuc2F3VW5hbWJpZ3VvdXNFU00gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIik7XG4gICAgfVxuXG4gICAgLy8gVXRpbGl0aWVzXG5cbiAgICB0c0xvb2tBaGVhZDxUPihmOiAoKSA9PiBUKTogVCB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZUFuZENhdGNoPFQgZXh0ZW5kcyBOLk5vZGVCYXNlIHwgdW5kZWZpbmVkIHwgbnVsbD4oXG4gICAgICBmOiAoKSA9PiBULFxuICAgICk6IFQgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHJ5UGFyc2UoXG4gICAgICAgIGFib3J0ID0+XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICAgIGYoKSB8fCBhYm9ydCgpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5hYm9ydGVkIHx8ICFyZXN1bHQubm9kZSkgcmV0dXJuO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICByZXR1cm4gcmVzdWx0Lm5vZGU7XG4gICAgfVxuXG4gICAgdHNUcnlQYXJzZTxUPihmOiAoKSA9PiBUIHwgdW5kZWZpbmVkIHwgZmFsc2UpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZS5jbG9uZSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZigpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlRGVjbGFyZShuYW55OiBhbnkpOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgc3RhcnRUeXBlID0gdGhpcy5zdGF0ZS50eXBlO1xuICAgICAgbGV0IGtpbmQ6IFwibGV0XCIgfCBudWxsO1xuXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2xldCkpIHtcbiAgICAgICAgc3RhcnRUeXBlID0gdHQuX3ZhcjtcbiAgICAgICAga2luZCA9IFwibGV0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgIHJldHVybiB0aGlzLnRzSW5BbWJpZW50Q29udGV4dCgoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoc3RhcnRUeXBlKSB7XG4gICAgICAgICAgY2FzZSB0dC5fZnVuY3Rpb246XG4gICAgICAgICAgICBuYW55LmRlY2xhcmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQoXG4gICAgICAgICAgICAgIG5hbnksXG4gICAgICAgICAgICAgIC8qIGFzeW5jICovIGZhbHNlLFxuICAgICAgICAgICAgICAvKiBpc0hhbmdpbmdEZWNsYXJhdGlvbiAqLyBmYWxzZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSB0dC5fY2xhc3M6XG4gICAgICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGFsc28gc2V0IGJ5IHRzUGFyc2VFeHByZXNzaW9uU3RhdGVtZW50LCB3ZSBuZWVkIHRvIHNldCBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIHBhcnNpbmcgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIHRvIGtub3cgaG93IHRvIHJlZ2lzdGVyIGl0IGluIHRoZSBzY29wZS5cbiAgICAgICAgICAgIG5hbnkuZGVjbGFyZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUNsYXNzKFxuICAgICAgICAgICAgICBuYW55LFxuICAgICAgICAgICAgICAvKiBpc1N0YXRlbWVudCAqLyB0cnVlLFxuICAgICAgICAgICAgICAvKiBvcHRpb25hbElkICovIGZhbHNlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIHR0Ll9lbnVtOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihuYW55LCB7IGRlY2xhcmU6IHRydWUgfSk7XG4gICAgICAgICAgY2FzZSB0dC5fZ2xvYmFsOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUFtYmllbnRFeHRlcm5hbE1vZHVsZURlY2xhcmF0aW9uKG5hbnkpO1xuICAgICAgICAgIGNhc2UgdHQuX2NvbnN0OlxuICAgICAgICAgIGNhc2UgdHQuX3ZhcjpcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5fY29uc3QpIHx8ICF0aGlzLmlzTG9va2FoZWFkQ29udGV4dHVhbChcImVudW1cIikpIHtcbiAgICAgICAgICAgICAgbmFueS5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgICAgICAgbmFueSxcbiAgICAgICAgICAgICAgICBraW5kIHx8IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYGNvbnN0IGVudW0gPSAwO2Agbm90IGFsbG93ZWQgYmVjYXVzZSBcImVudW1cIiBpcyBhIHN0cmljdCBtb2RlIHJlc2VydmVkIHdvcmQuXG4gICAgICAgICAgICB0aGlzLmV4cGVjdCh0dC5fY29uc3QpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihuYW55LCB7XG4gICAgICAgICAgICAgIGNvbnN0OiB0cnVlLFxuICAgICAgICAgICAgICBkZWNsYXJlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY2FzZSB0dC5faW50ZXJmYWNlOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihuYW55LCB7XG4gICAgICAgICAgICAgIGRlY2xhcmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICh0b2tlbklzSWRlbnRpZmllcihzdGFydFR5cGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgICBuYW55LFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgICAgICAgICAgLyogbmV4dCAqLyB0cnVlLFxuICAgICAgICAgICAgICAgIC8qIGRlY29yYXRvcnMgKi8gbnVsbCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogdGhpcyB3b24ndCBiZSBjYWxsZWQgdW5sZXNzIHRoZSBrZXl3b3JkIGlzIGFsbG93ZWQgaW4gYHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb25gLlxuICAgIHRzVHJ5UGFyc2VFeHBvcnREZWNsYXJhdGlvbigpOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgdGhpcy5zdGFydE5vZGUoKSxcbiAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgLyogbmV4dCAqLyB0cnVlLFxuICAgICAgICAvKiBkZWNvcmF0b3JzICovIG51bGwsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRzUGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogVW5kb25lPE4uVHNNb2R1bGVEZWNsYXJhdGlvbj4sXG4gICAgICBleHByOiBOLklkZW50aWZpZXIsXG4gICAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIHN3aXRjaCAoZXhwci5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJkZWNsYXJlXCI6IHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMudHNUcnlQYXJzZURlY2xhcmUobm9kZSk7XG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbi5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJnbG9iYWxcIjpcbiAgICAgICAgICAvLyBgZ2xvYmFsIHsgfWAgKHdpdGggbm8gYGRlY2xhcmVgKSBtYXkgYXBwZWFyIGluc2lkZSBhbiBhbWJpZW50IG1vZHVsZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICAvLyBXb3VsZCBsaWtlIHRvIHVzZSB0c1BhcnNlQW1iaWVudEV4dGVybmFsTW9kdWxlRGVjbGFyYXRpb24gaGVyZSwgYnV0IGFscmVhZHkgcmFuIHBhc3QgXCJnbG9iYWxcIi5cbiAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICAgICAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX1RTX01PRFVMRSk7XG4gICAgICAgICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBub2RlO1xuICAgICAgICAgICAgbW9kLmdsb2JhbCA9IHRydWU7XG4gICAgICAgICAgICBtb2QuaWQgPSBleHByO1xuICAgICAgICAgICAgbW9kLmJvZHkgPSB0aGlzLnRzUGFyc2VNb2R1bGVCbG9jaygpO1xuICAgICAgICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG1vZCwgXCJUU01vZHVsZURlY2xhcmF0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBleHByLm5hbWUsXG4gICAgICAgICAgICAvKiBuZXh0ICovIGZhbHNlLFxuICAgICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1vbiB0byB0c1RyeVBhcnNlRGVjbGFyZSwgdHNUcnlQYXJzZUV4cG9ydERlY2xhcmF0aW9uLCBhbmQgdHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQuXG4gICAgdHNQYXJzZURlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogYW55LFxuICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgIG5leHQ6IGJvb2xlYW4sXG4gICAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICAvLyBubyBkZWNsYXJhdGlvbiBhcGFydCBmcm9tIGVudW0gY2FuIGJlIGZvbGxvd2VkIGJ5IGEgbGluZSBicmVhay5cbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSBcImFic3RyYWN0XCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy50c0NoZWNrTGluZVRlcm1pbmF0b3IobmV4dCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1hdGNoKHR0Ll9jbGFzcykgfHwgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VBYnN0cmFjdERlY2xhcmF0aW9uKG5vZGUsIGRlY29yYXRvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwibW9kdWxlXCI6XG4gICAgICAgICAgaWYgKHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yKG5leHQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VBbWJpZW50RXh0ZXJuYWxNb2R1bGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTW9kdWxlT3JOYW1lc3BhY2VEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIm5hbWVzcGFjZVwiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudHNDaGVja0xpbmVUZXJtaW5hdG9yKG5leHQpICYmXG4gICAgICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlTW9kdWxlT3JOYW1lc3BhY2VEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInR5cGVcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnRzQ2hlY2tMaW5lVGVybWluYXRvcihuZXh0KSAmJlxuICAgICAgICAgICAgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0NoZWNrTGluZVRlcm1pbmF0b3IobmV4dDogYm9vbGVhbikge1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9sbG93aW5nTGluZUJyZWFrKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICF0aGlzLmlzTGluZVRlcm1pbmF0b3IoKTtcbiAgICB9XG5cbiAgICB0c1RyeVBhcnNlR2VuZXJpY0FzeW5jQXJyb3dGdW5jdGlvbihcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICApOiBOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghdGhpcy5tYXRjaCh0dC5sdCkpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICAgIHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHJlczogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1BhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRG9uJ3QgdXNlIG92ZXJsb2FkZWQgcGFyc2VGdW5jdGlvblBhcmFtcyB3aGljaCB3b3VsZCBsb29rIGZvciBcIjxcIiBhZ2Fpbi5cbiAgICAgICAgICBzdXBlci5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO1xuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMudHNUcnlQYXJzZVR5cGVPclR5cGVQcmVkaWNhdGVBbm5vdGF0aW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3QodHQuYXJyb3cpO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycztcblxuICAgICAgaWYgKCFyZXMpIHJldHVybjtcblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQXJyb3dFeHByZXNzaW9uKFxuICAgICAgICByZXMsXG4gICAgICAgIC8qIHBhcmFtcyBhcmUgYWxyZWFkeSBzZXQgKi8gbnVsbCxcbiAgICAgICAgLyogYXN5bmMgKi8gdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlZCB3aGVuIHBhcnNpbmcgdHlwZSBhcmd1bWVudHMgZnJvbSBFUyBwcm9kdWN0aW9ucywgd2hlcmUgdGhlIGZpcnN0IHRva2VuXG4gICAgLy8gaGFzIGJlZW4gY3JlYXRlZCB3aXRob3V0IHN0YXRlLmluVHlwZS4gVGh1cyB3ZSBuZWVkIHRvIHJlc2NhbiB0aGUgbHQgdG9rZW4uXG4gICAgdHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTogTi5Uc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHwgdm9pZCB7XG4gICAgICBpZiAodGhpcy5yZVNjYW5fbHQoKSAhPT0gdHQubHQpIHJldHVybjtcbiAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQXJndW1lbnRzKCk7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVBcmd1bWVudHMoKTogTi5Uc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlRzVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KCk7XG4gICAgICBub2RlLnBhcmFtcyA9IHRoaXMudHNJblR5cGUoKCkgPT5cbiAgICAgICAgLy8gVGVtcG9yYXJpbHkgcmVtb3ZlIGEgSlNYIHBhcnNpbmcgY29udGV4dCwgd2hpY2ggbWFrZXMgdXMgc2NhbiBkaWZmZXJlbnQgdG9rZW5zLlxuICAgICAgICB0aGlzLnRzSW5Ob0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwZWN0KHR0Lmx0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlRGVsaW1pdGVkTGlzdChcbiAgICAgICAgICAgIFwiVHlwZVBhcmFtZXRlcnNPckFyZ3VtZW50c1wiLFxuICAgICAgICAgICAgdGhpcy50c1BhcnNlVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGlmIChub2RlLnBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5FbXB0eVR5cGVBcmd1bWVudHMsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlLmluVHlwZSAmJiB0aGlzLmN1ckNvbnRleHQoKSA9PT0gdGMuYnJhY2UpIHtcbiAgICAgICAgLy8gcmVzY2FuIGA+YCB3aGVuIHdlIGFyZSBubyBsb25nZXIgaW4gdHlwZSBjb250ZXh0IGFuZCBKU1ggcGFyc2luZyBjb250ZXh0XG4gICAgICAgIC8vIHNpbmNlIGl0IHdhcyB0b2tlbml6ZWQgd2hlbiBgaW5UeXBlYCBpcyBgdHJ1ZWAuXG4gICAgICAgIHRoaXMucmVTY2FuX2x0X2d0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4cGVjdCh0dC5ndCk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKTtcbiAgICB9XG5cbiAgICB0c0lzRGVjbGFyYXRpb25TdGFydCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0b2tlbklzVFNEZWNsYXJhdGlvblN0YXJ0KHRoaXMuc3RhdGUudHlwZSk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gT1ZFUlJJREVTXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcy50c0lzRGVjbGFyYXRpb25TdGFydCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gc3VwZXIuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk7XG4gICAgfVxuXG4gICAgcGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW0oXG4gICAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSxcbiAgICApOiBOLlBhdHRlcm4gfCBOLlRTUGFyYW1ldGVyUHJvcGVydHkge1xuICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgbG9jYXRpb24gdG8gaW5jbHVkZSBtb2RpZmllcnMgaW4gcmFuZ2VcbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcblxuICAgICAgY29uc3QgbW9kaWZpZWQ6IE1vZGlmaWVyQmFzZSA9IHt9O1xuICAgICAgdGhpcy50c1BhcnNlTW9kaWZpZXJzKFxuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZE1vZGlmaWVyczogW1xuICAgICAgICAgICAgXCJwdWJsaWNcIixcbiAgICAgICAgICAgIFwicHJpdmF0ZVwiLFxuICAgICAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgICAgIFwib3ZlcnJpZGVcIixcbiAgICAgICAgICAgIFwicmVhZG9ubHlcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBtb2RpZmllZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBhY2Nlc3NpYmlsaXR5ID0gbW9kaWZpZWQuYWNjZXNzaWJpbGl0eTtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gbW9kaWZpZWQub3ZlcnJpZGU7XG4gICAgICBjb25zdCByZWFkb25seSA9IG1vZGlmaWVkLnJlYWRvbmx5O1xuICAgICAgaWYgKFxuICAgICAgICAhKGZsYWdzICYgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0NPTlNUUlVDVE9SX1BBUkFNUykgJiZcbiAgICAgICAgKGFjY2Vzc2liaWxpdHkgfHwgcmVhZG9ubHkgfHwgb3ZlcnJpZGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5VbmV4cGVjdGVkUGFyYW1ldGVyTW9kaWZpZXIsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdCgpO1xuICAgICAgdGhpcy5wYXJzZUFzc2lnbmFibGVMaXN0SXRlbVR5cGVzKGxlZnQsIGZsYWdzKTtcbiAgICAgIGNvbnN0IGVsdCA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQobGVmdC5sb2Muc3RhcnQsIGxlZnQpO1xuICAgICAgaWYgKGFjY2Vzc2liaWxpdHkgfHwgcmVhZG9ubHkgfHwgb3ZlcnJpZGUpIHtcbiAgICAgICAgY29uc3QgcHAgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eT4oc3RhcnRMb2MpO1xuICAgICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBwcC5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eSkgcHAuYWNjZXNzaWJpbGl0eSA9IGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIGlmIChyZWFkb25seSkgcHAucmVhZG9ubHkgPSByZWFkb25seTtcbiAgICAgICAgaWYgKG92ZXJyaWRlKSBwcC5vdmVycmlkZSA9IG92ZXJyaWRlO1xuICAgICAgICBpZiAoZWx0LnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmIGVsdC50eXBlICE9PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuc3VwcG9ydGVkUGFyYW1ldGVyUHJvcGVydHlLaW5kLCB7IGF0OiBwcCB9KTtcbiAgICAgICAgfVxuICAgICAgICBwcC5wYXJhbWV0ZXIgPSBlbHQgYXMgYW55IGFzIE4uSWRlbnRpZmllciB8IE4uQXNzaWdubWVudFBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHAsIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuXG4gICAgaXNTaW1wbGVQYXJhbWV0ZXIobm9kZTogTi5QYXR0ZXJuIHwgTi5UU1BhcmFtZXRlclByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAobm9kZS50eXBlID09PSBcIlRTUGFyYW1ldGVyUHJvcGVydHlcIiAmJlxuICAgICAgICAgIHN1cGVyLmlzU2ltcGxlUGFyYW1ldGVyKG5vZGUucGFyYW1ldGVyKSkgfHxcbiAgICAgICAgc3VwZXIuaXNTaW1wbGVQYXJhbWV0ZXIobm9kZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHNEaXNhbGxvd09wdGlvbmFsUGF0dGVybihub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4pIHtcbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygbm9kZS5wYXJhbXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcmFtLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgICAgKHBhcmFtIGFzIGFueSkub3B0aW9uYWwgJiZcbiAgICAgICAgICAhdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUGF0dGVybklzT3B0aW9uYWwsIHsgYXQ6IHBhcmFtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4sXG4gICAgICBwYXJhbXM6IE4uRXhwcmVzc2lvbltdLFxuICAgICAgdHJhaWxpbmdDb21tYUxvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgICApOiB2b2lkIHtcbiAgICAgIHN1cGVyLnNldEFycm93RnVuY3Rpb25QYXJhbWV0ZXJzKG5vZGUsIHBhcmFtcywgdHJhaWxpbmdDb21tYUxvYyk7XG4gICAgICB0aGlzLnRzRGlzYWxsb3dPcHRpb25hbFBhdHRlcm4obm9kZSk7XG4gICAgfVxuXG4gICAgcGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2g8XG4gICAgICBUIGV4dGVuZHNcbiAgICAgICAgfCBOLkZ1bmN0aW9uXG4gICAgICAgIHwgTi5UU0RlY2xhcmVNZXRob2RcbiAgICAgICAgfCBOLlRTRGVjbGFyZUZ1bmN0aW9uXG4gICAgICAgIHwgTi5DbGFzc1ByaXZhdGVNZXRob2QsXG4gICAgPihub2RlOiBVbmRvbmU8VD4sIHR5cGU6IFRbXCJ0eXBlXCJdLCBpc01ldGhvZDogYm9vbGVhbiA9IGZhbHNlKTogVCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgbm9kZS5yZXR1cm5UeXBlID0gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24odHQuY29sb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2RpbGVzc1R5cGUgPVxuICAgICAgICB0eXBlID09PSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIlxuICAgICAgICAgID8gXCJUU0RlY2xhcmVGdW5jdGlvblwiXG4gICAgICAgICAgOiB0eXBlID09PSBcIkNsYXNzTWV0aG9kXCIgfHwgdHlwZSA9PT0gXCJDbGFzc1ByaXZhdGVNZXRob2RcIlxuICAgICAgICAgID8gXCJUU0RlY2xhcmVNZXRob2RcIlxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGJvZGlsZXNzVHlwZSAmJiAhdGhpcy5tYXRjaCh0dC5icmFjZUwpICYmIHRoaXMuaXNMaW5lVGVybWluYXRvcigpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgYm9kaWxlc3NUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmIChib2RpbGVzc1R5cGUgPT09IFwiVFNEZWNsYXJlRnVuY3Rpb25cIiAmJiB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EZWNsYXJlRnVuY3Rpb25IYXNJbXBsZW1lbnRhdGlvbiwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgaWYgKChub2RlIGFzIFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+KS5kZWNsYXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRnVuY3Rpb25Cb2R5QW5kRmluaXNoKG5vZGUsIGJvZGlsZXNzVHlwZSwgaXNNZXRob2QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRzRGlzYWxsb3dPcHRpb25hbFBhdHRlcm4obm9kZSk7XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaChub2RlLCB0eXBlLCBpc01ldGhvZCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGdW5jdGlvblN0YXRlbWVudElkKG5vZGU6IE4uRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgIGlmICghbm9kZS5ib2R5ICYmIG5vZGUuaWQpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gaWRzIGFyZSB2YWxpZGF0ZWQgYWZ0ZXIgcGFyc2luZyB0aGVpciBib2R5LlxuICAgICAgICAvLyBGb3IgYm9kaWxlc3MgZnVuY3Rpb24sIHdlIG5lZWQgdG8gZG8gaXQgaGVyZS5cbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIobm9kZS5pZCwgQklORF9UU19BTUJJRU5UKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnJlZ2lzdGVyRnVuY3Rpb25TdGF0ZW1lbnRJZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c0NoZWNrRm9ySW52YWxpZFR5cGVDYXN0cyhpdGVtczogQXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4pIHtcbiAgICAgIGl0ZW1zLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmIChub2RlPy50eXBlID09PSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlVuZXhwZWN0ZWRUeXBlQW5ub3RhdGlvbiwge1xuICAgICAgICAgICAgYXQ6IG5vZGUudHlwZUFubm90YXRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvUmVmZXJlbmNlZExpc3QoXG4gICAgICBleHByTGlzdDogQXJyYXk8Ti5FeHByZXNzaW9uIHwgdW5kZWZpbmVkIHwgbnVsbD4sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBpc0luUGFyZW5zPzogYm9vbGVhbixcbiAgICApOiBBcnJheTxOLkV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgICAvLyBIYW5kbGVzIGludmFsaWQgc2NlbmFyaW9zIGxpa2U6IGBmKGE6YilgLCBgKGE6Yik7YCwgYW5kIGAoYTpiLGM6ZClgLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCBgZjxUPihhOmIpYCBnb2VzIHRocm91Z2ggYSBkaWZmZXJlbnQgcGF0aCBhbmQgaXMgaGFuZGxlZFxuICAgICAgLy8gaW4gYHBhcnNlU3Vic2NyaXB0YCBkaXJlY3RseS5cbiAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMoZXhwckxpc3QpO1xuICAgICAgcmV0dXJuIGV4cHJMaXN0O1xuICAgIH1cblxuICAgIHBhcnNlQXJyYXlMaWtlKFxuICAgICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICAgIGNhbkJlUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzVHVwbGU6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5BcnJheUV4cHJlc3Npb24gfCBOLlR1cGxlRXhwcmVzc2lvbiB7XG4gICAgICBjb25zdCBub2RlID0gc3VwZXIucGFyc2VBcnJheUxpa2UoXG4gICAgICAgIGNsb3NlLFxuICAgICAgICBjYW5CZVBhdHRlcm4sXG4gICAgICAgIGlzVHVwbGUsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuXG4gICAgICBpZiAobm9kZS50eXBlID09PSBcIkFycmF5RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMobm9kZS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHBhcnNlU3Vic2NyaXB0KFxuICAgICAgYmFzZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICghdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJiB0aGlzLm1hdGNoKHR0LmJhbmcpKSB7XG4gICAgICAgIC8vIFdoZW4gISBpcyBjb25zdW1lZCBhcyBhIHBvc3RmaXggb3BlcmF0b3IgKG5vbi1udWxsIGFzc2VydGlvbiksXG4gICAgICAgIC8vIGRpc2FsbG93IEpTWCB0YWcgZm9ybWluZyBhZnRlci4gZS5nLiBXaGVuIHBhcnNpbmcgYHAhIDwgbi5wIWBcbiAgICAgICAgLy8gYDxuLnBgIGNhbiBub3QgYmUgYSBzdGFydCBvZiBKU1ggdGFnXG4gICAgICAgIHRoaXMuc3RhdGUuY2FuU3RhcnRKU1hFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGNvbnN0IG5vbk51bGxFeHByZXNzaW9uID1cbiAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0PE4uVHNOb25OdWxsRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgICBub25OdWxsRXhwcmVzc2lvbi5leHByZXNzaW9uID0gYmFzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub25OdWxsRXhwcmVzc2lvbiwgXCJUU05vbk51bGxFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNPcHRpb25hbENhbGwgPSBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXRjaCh0dC5xdWVzdGlvbkRvdCkgJiZcbiAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVzc1RoYW5cbiAgICAgICkge1xuICAgICAgICBpZiAobm9DYWxscykge1xuICAgICAgICAgIHN0YXRlLnN0b3AgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgPSBpc09wdGlvbmFsQ2FsbCA9IHRydWU7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBoYW5kbGVzICdmPDxUPidcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lmx0KSB8fCB0aGlzLm1hdGNoKHR0LmJpdFNoaWZ0TCkpIHtcbiAgICAgICAgbGV0IG1pc3NpbmdQYXJlbkVycm9yTG9jO1xuICAgICAgICAvLyB0c1RyeVBhcnNlQW5kQ2F0Y2ggaXMgZXhwZW5zaXZlLCBzbyBhdm9pZCBpZiBub3QgbmVjZXNzYXJ5LlxuICAgICAgICAvLyBUaGVyZSBhcmUgbnVtYmVyIG9mIHRoaW5ncyB3ZSBhcmUgZ29pbmcgdG8gXCJtYXliZVwiIHBhcnNlLCBsaWtlIHR5cGUgYXJndW1lbnRzIG9uXG4gICAgICAgIC8vIHRhZ2dlZCB0ZW1wbGF0ZSBleHByZXNzaW9ucy4gSWYgYW55IG9mIHRoZW0gZmFpbCwgd2FsayBpdCBiYWNrIGFuZCBjb250aW51ZS5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50c1RyeVBhcnNlQW5kQ2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghbm9DYWxscyAmJiB0aGlzLmF0UG9zc2libGVBc3luY0Fycm93KGJhc2UpKSB7XG4gICAgICAgICAgICAvLyBBbG1vc3QgY2VydGFpbmx5IHRoaXMgaXMgYSBnZW5lcmljIGFzeW5jIGZ1bmN0aW9uIGBhc3luYyA8VD4oKSA9PiAuLi5cbiAgICAgICAgICAgIC8vIEJ1dCBpdCBtaWdodCBiZSBhIGNhbGwgd2l0aCBhIHR5cGUgYXJndW1lbnQgYGFzeW5jPFQ+KCk7YFxuICAgICAgICAgICAgY29uc3QgYXN5bmNBcnJvd0ZuID1cbiAgICAgICAgICAgICAgdGhpcy50c1RyeVBhcnNlR2VuZXJpY0FzeW5jQXJyb3dGdW5jdGlvbihzdGFydExvYyk7XG4gICAgICAgICAgICBpZiAoYXN5bmNBcnJvd0ZuKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhc3luY0Fycm93Rm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTtcbiAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMpIHJldHVybjtcblxuICAgICAgICAgIGlmIChpc09wdGlvbmFsQ2FsbCAmJiAhdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgICAgICBtaXNzaW5nUGFyZW5FcnJvckxvYyA9IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodG9rZW5Jc1RlbXBsYXRlKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnBhcnNlVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBiYXNlLFxuXG4gICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXN1bHQudHlwZVBhcmFtZXRlcnMgPSB0eXBlQXJndW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5vQ2FsbHMgJiYgdGhpcy5lYXQodHQucGFyZW5MKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8XG4gICAgICAgICAgICAgIE4uQ2FsbEV4cHJlc3Npb24gfCBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cbiAgICAgICAgICAgID4oc3RhcnRMb2MpO1xuICAgICAgICAgICAgbm9kZS5jYWxsZWUgPSBiYXNlO1xuICAgICAgICAgICAgLy8gcG9zc2libGVBc3luYyBhbHdheXMgZmFsc2UgaGVyZSwgYmVjYXVzZSB3ZSB3b3VsZCBoYXZlIGhhbmRsZWQgaXQgYWJvdmUuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICh3b24ndCBiZSBhbnkgdW5kZWZpbmVkIGFyZ3VtZW50cylcbiAgICAgICAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICAgICAgICB0dC5wYXJlblIsXG4gICAgICAgICAgICAgIC8qIHBvc3NpYmxlQXN5bmMgKi8gZmFsc2UsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGVzIGludmFsaWQgY2FzZTogYGY8VD4oYTpiKWBcbiAgICAgICAgICAgIHRoaXMudHNDaGVja0ZvckludmFsaWRUeXBlQ2FzdHMobm9kZS5hcmd1bWVudHMpO1xuXG4gICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICAgICAgICAgIChub2RlIGFzIFVuZG9uZTxOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24+KS5vcHRpb25hbCA9XG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbENhbGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMuc3RhdGUudHlwZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBhPGI+PmMgaXMgbm90IChhPGI+KT5jLCBidXQgYTwoYj4+YylcbiAgICAgICAgICAgIHRva2VuVHlwZSA9PT0gdHQuZ3QgfHxcbiAgICAgICAgICAgIC8vIGE8Yj4+PmMgaXMgbm90IChhPGI+KT4+YywgYnV0IGE8KGI+Pj5jKVxuICAgICAgICAgICAgdG9rZW5UeXBlID09PSB0dC5iaXRTaGlmdFIgfHxcbiAgICAgICAgICAgIC8vIGE8Yj5jIGlzIChhPGIpPmNcbiAgICAgICAgICAgICh0b2tlblR5cGUgIT09IHR0LnBhcmVuTCAmJlxuICAgICAgICAgICAgICB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbih0b2tlblR5cGUpICYmXG4gICAgICAgICAgICAgICF0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQmFpbCBvdXQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5Uc0luc3RhbnRpYXRpb25FeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICAgICAgbm9kZS5leHByZXNzaW9uID0gYmFzZTtcbiAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG1pc3NpbmdQYXJlbkVycm9yTG9jKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKG1pc3NpbmdQYXJlbkVycm9yTG9jLCB0dC5wYXJlbkwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdC50eXBlID09PSBcIlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICAgKHRoaXMubWF0Y2godHQuZG90KSB8fFxuICAgICAgICAgICAgICAodGhpcy5tYXRjaCh0dC5xdWVzdGlvbkRvdCkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgIT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXMpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShcbiAgICAgICAgICAgICAgVFNFcnJvcnMuSW52YWxpZFByb3BlcnR5QWNjZXNzQWZ0ZXJJbnN0YW50aWF0aW9uRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMsIHN0YXRlKTtcbiAgICB9XG5cbiAgICBwYXJzZU5ld0NhbGxlZShub2RlOiBOLk5ld0V4cHJlc3Npb24pOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlTmV3Q2FsbGVlKG5vZGUpO1xuXG4gICAgICBjb25zdCB7IGNhbGxlZSB9ID0gbm9kZTtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsbGVlLnR5cGUgPT09IFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiICYmXG4gICAgICAgICFjYWxsZWUuZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICkge1xuICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzID0gY2FsbGVlLnR5cGVQYXJhbWV0ZXJzO1xuICAgICAgICBub2RlLmNhbGxlZSA9IGNhbGxlZS5leHByZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlRXhwck9wKFxuICAgICAgbGVmdDogTi5FeHByZXNzaW9uLFxuICAgICAgbGVmdFN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIG1pblByZWM6IG51bWJlcixcbiAgICApOiBOLkV4cHJlc3Npb24ge1xuICAgICAgbGV0IGlzU2F0aXNmaWVzOiBib29sZWFuO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbk9wZXJhdG9yUHJlY2VkZW5jZSh0dC5faW4pID4gbWluUHJlYyAmJlxuICAgICAgICAhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJlxuICAgICAgICAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSB8fFxuICAgICAgICAgIChpc1NhdGlzZmllcyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zYXRpc2ZpZXMpKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxcbiAgICAgICAgICBOLlRzQXNFeHByZXNzaW9uIHwgTi5Uc1NhdGlzZmllc0V4cHJlc3Npb25cbiAgICAgICAgPihsZWZ0U3RhcnRMb2MpO1xuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSBsZWZ0O1xuICAgICAgICBub2RlLnR5cGVBbm5vdGF0aW9uID0gdGhpcy50c0luVHlwZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7IC8vIFwiYXNcIiBvciBcInNhdGlzZmllc1wiXG4gICAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NvbnN0KSkge1xuICAgICAgICAgICAgaWYgKGlzU2F0aXNmaWVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRLZXl3b3JkLCB7XG4gICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICAgICAga2V5d29yZDogXCJjb25zdFwiLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlUmVmZXJlbmNlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZVR5cGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlzU2F0aXNmaWVzID8gXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIiA6IFwiVFNBc0V4cHJlc3Npb25cIixcbiAgICAgICAgKTtcbiAgICAgICAgLy8gcmVzY2FuIGA8YCwgYD5gIGJlY2F1c2UgdGhleSB3ZXJlIHNjYW5uZWQgd2hlbiB0aGlzLnN0YXRlLmluVHlwZSB3YXMgdHJ1ZVxuICAgICAgICB0aGlzLnJlU2Nhbl9sdF9ndCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBsZWZ0U3RhcnRMb2MsXG4gICAgICAgICAgbWluUHJlYyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlRXhwck9wKGxlZnQsIGxlZnRTdGFydExvYywgbWluUHJlYyk7XG4gICAgfVxuXG4gICAgY2hlY2tSZXNlcnZlZFdvcmQoXG4gICAgICB3b3JkOiBzdHJpbmcsXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICBjaGVja0tleXdvcmRzOiBib29sZWFuLFxuICAgICAgaXNCaW5kaW5nOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgLy8gU3RyaWN0IG1vZGUgd29yZHMgbWF5IGJlIGFsbG93ZWQgYXMgaW4gYGRlY2xhcmUgbmFtZXNwYWNlIE4geyBjb25zdCBzdGF0aWM6IG51bWJlcjsgfWAuXG4gICAgICAvLyBBbmQgd2UgaGF2ZSBhIHR5cGUgY2hlY2tlciBhbnl3YXksIHNvIGRvbid0IGJvdGhlciBoYXZpbmcgdGhlIHBhcnNlciBkbyBpdC5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyLmNoZWNrUmVzZXJ2ZWRXb3JkKHdvcmQsIHN0YXJ0TG9jLCBjaGVja0tleXdvcmRzLCBpc0JpbmRpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICAgIHN1cGVyLmNoZWNrSW1wb3J0UmVmbGVjdGlvbihub2RlKTtcbiAgICAgIGlmIChub2RlLm1vZHVsZSAmJiBub2RlLmltcG9ydEtpbmQgIT09IFwidmFsdWVcIikge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkltcG9ydFJlZmxlY3Rpb25IYXNJbXBvcnRUeXBlLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgRG9uJ3QgYm90aGVyIGRvaW5nIHRoaXMgY2hlY2sgaW4gVHlwZVNjcmlwdCBjb2RlIGJlY2F1c2U6XG4gICAgMS4gV2UgbWF5IGhhdmUgYSBuZXN0ZWQgZXhwb3J0IHN0YXRlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWU6XG4gICAgICBleHBvcnQgY29uc3QgeCA9IDA7XG4gICAgICBleHBvcnQgbmFtZXNwYWNlIE4ge1xuICAgICAgICBleHBvcnQgY29uc3QgeCA9IDE7XG4gICAgICB9XG4gICAgMi4gV2UgaGF2ZSBhIHR5cGUgY2hlY2tlciB0byB3YXJuIHVzIGFib3V0IHRoaXMgc29ydCBvZiB0aGluZy5cbiAgICAqL1xuICAgIGNoZWNrRHVwbGljYXRlRXhwb3J0cygpIHt9XG5cbiAgICBpc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICBpZiAoc3VwZXIuaXNQb3RlbnRpYWxJbXBvcnRQaGFzZShpc0V4cG9ydCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKSkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKTtcbiAgICAgICAgcmV0dXJuIGlzRXhwb3J0XG4gICAgICAgICAgPyBjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlIHx8IGNoID09PSBjaGFyQ29kZXMuYXN0ZXJpc2tcbiAgICAgICAgICA6IGNoICE9PSBjaGFyQ29kZXMuZXF1YWxzVG87XG4gICAgICB9XG4gICAgICByZXR1cm4gIWlzRXhwb3J0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlb2YpO1xuICAgIH1cblxuICAgIGFwcGx5SW1wb3J0UGhhc2UoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgICBpc0V4cG9ydDogYm9vbGVhbixcbiAgICAgIHBoYXNlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgbG9jPzogUG9zaXRpb24sXG4gICAgKTogdm9pZCB7XG4gICAgICBzdXBlci5hcHBseUltcG9ydFBoYXNlKG5vZGUsIGlzRXhwb3J0LCBwaGFzZSwgbG9jKTtcbiAgICAgIGlmIChpc0V4cG9ydCkge1xuICAgICAgICAobm9kZSBhcyBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pLmV4cG9ydEtpbmQgPVxuICAgICAgICAgIHBoYXNlID09PSBcInR5cGVcIiA/IFwidHlwZVwiIDogXCJ2YWx1ZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikuaW1wb3J0S2luZCA9XG4gICAgICAgICAgcGhhc2UgPT09IFwidHlwZVwiIHx8IHBoYXNlID09PSBcInR5cGVvZlwiID8gcGhhc2UgOiBcInZhbHVlXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VJbXBvcnQoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgKTogTi5BbnlJbXBvcnQge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICBub2RlLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUltcG9ydChub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbXBvcnROb2RlO1xuICAgICAgaWYgKFxuICAgICAgICB0b2tlbklzSWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpICYmXG4gICAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5pbXBvcnRLaW5kID0gXCJ2YWx1ZVwiO1xuICAgICAgICByZXR1cm4gdGhpcy50c1BhcnNlSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24oXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpKSB7XG4gICAgICAgIGNvbnN0IG1heWJlRGVmYXVsdElkZW50aWZpZXIgPSB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgICAvKiBpc0V4cG9ydCAqLyBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5Uc0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbXBvcnROb2RlID0gc3VwZXIucGFyc2VJbXBvcnRTcGVjaWZpZXJzQW5kQWZ0ZXIoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1wb3J0Tm9kZSA9IHN1cGVyLnBhcnNlSW1wb3J0KG5vZGUgYXMgVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+KTtcbiAgICAgIH1cblxuICAgICAgLy8gYGltcG9ydCB0eXBlYCBjYW4gb25seSBiZSB1c2VkIG9uIGltcG9ydHMgd2l0aCBuYW1lZCBpbXBvcnRzIG9yIHdpdGggYVxuICAgICAgLy8gZGVmYXVsdCBpbXBvcnQgLSBidXQgbm90IGJvdGhcbiAgICAgIGlmIChcbiAgICAgICAgaW1wb3J0Tm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVcIiAmJlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIGltcG9ydE5vZGUuc3BlY2lmaWVycy5sZW5ndGggPiAxICYmXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgaW1wb3J0Tm9kZS5zcGVjaWZpZXJzWzBdLnR5cGUgPT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5UeXBlSW1wb3J0Q2Fubm90U3BlY2lmeURlZmF1bHRBbmROYW1lZCwge1xuICAgICAgICAgIGF0OiBpbXBvcnROb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltcG9ydE5vZGU7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICAgIGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsLFxuICAgICk6IE4uQW55RXhwb3J0IHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9pbXBvcnQpKSB7XG4gICAgICAgIC8vIGBleHBvcnQgaW1wb3J0IEEgPSBCO2BcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCBgdHQuX2ltcG9ydGBcbiAgICAgICAgbGV0IG1heWJlRGVmYXVsdElkZW50aWZpZXI6IE4uSWRlbnRpZmllciB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpICYmXG4gICAgICAgICAgLy8gV2UgcGFzcyBmYWxzZSBoZXJlLCBiZWNhdXNlIHdlIGFyZSBwYXJzaW5nIGFuIGBpbXBvcnQgLi4uID1gXG4gICAgICAgICAgdGhpcy5pc1BvdGVudGlhbEltcG9ydFBoYXNlKC8qIGlzRXhwb3J0ICovIGZhbHNlKVxuICAgICAgICApIHtcbiAgICAgICAgICBtYXliZURlZmF1bHRJZGVudGlmaWVyID0gdGhpcy5wYXJzZU1heWJlSW1wb3J0UGhhc2UoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLlRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24+LFxuICAgICAgICAgICAgLyogaXNFeHBvcnQgKi8gZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICAgICAgICAvKiBpc0V4cG9ydCAqLyB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVhdCh0dC5lcSkpIHtcbiAgICAgICAgLy8gYGV4cG9ydCA9IHg7YFxuICAgICAgICBjb25zdCBhc3NpZ24gPSBub2RlIGFzIFVuZG9uZTxOLlRzRXhwb3J0QXNzaWdubWVudD47XG4gICAgICAgIGFzc2lnbi5leHByZXNzaW9uID0gc3VwZXIucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgICAgIHRoaXMuc2F3VW5hbWJpZ3VvdXNFU00gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGFzc2lnbiwgXCJUU0V4cG9ydEFzc2lnbm1lbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICAgIC8vIGBleHBvcnQgYXMgbmFtZXNwYWNlIEE7YFxuICAgICAgICBjb25zdCBkZWNsID0gbm9kZSBhcyBVbmRvbmU8Ti5Uc05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uPjtcbiAgICAgICAgLy8gU2VlIGBwYXJzZU5hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uYCBpbiBUeXBlU2NyaXB0J3Mgb3duIHBhcnNlclxuICAgICAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX25hbWVzcGFjZSk7XG4gICAgICAgIGRlY2wuaWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGRlY2wsIFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydChcbiAgICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24+LFxuICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNBYnN0cmFjdENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc0NvbnRleHR1YWwodHQuX2Fic3RyYWN0KSAmJiB0aGlzLmxvb2thaGVhZCgpLnR5cGUgPT09IHR0Ll9jbGFzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlZmF1bHRFeHByZXNzaW9uKCk6IE4uRXhwcmVzc2lvbiB8IE4uRGVjbGFyYXRpb24ge1xuICAgICAgaWYgKHRoaXMuaXNBYnN0cmFjdENsYXNzKCkpIHtcbiAgICAgICAgY29uc3QgY2xzID0gdGhpcy5zdGFydE5vZGU8Ti5DbGFzcz4oKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIFNraXAgXCJhYnN0cmFjdFwiXG4gICAgICAgIGNscy5hYnN0cmFjdCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoY2xzLCB0cnVlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIGFsbG93ZWQgaW46XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvcHVsbC8xNjA0MFxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2ludGVyZmFjZSkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy50c1BhcnNlSW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5Uc0ludGVyZmFjZURlY2xhcmF0aW9uPigpLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpO1xuICAgIH1cblxuICAgIHBhcnNlVmFyU3RhdGVtZW50KFxuICAgICAgbm9kZTogTi5WYXJpYWJsZURlY2xhcmF0aW9uLFxuICAgICAga2luZDogXCJ2YXJcIiB8IFwibGV0XCIgfCBcImNvbnN0XCIgfCBcInVzaW5nXCIsXG4gICAgICBhbGxvd01pc3NpbmdJbml0aWFsaXplcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgICkge1xuICAgICAgY29uc3QgeyBpc0FtYmllbnRDb250ZXh0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBzdXBlci5wYXJzZVZhclN0YXRlbWVudChcbiAgICAgICAgbm9kZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgYWxsb3dNaXNzaW5nSW5pdGlhbGl6ZXIgfHwgaXNBbWJpZW50Q29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBbWJpZW50Q29udGV4dCkgcmV0dXJuIGRlY2xhcmF0aW9uO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgaWQsIGluaXQgfSBvZiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgLy8gRW1wdHkgaW5pdGlhbGl6ZXIgaXMgdGhlIGVhc3kgY2FzZSB0aGF0IHdlIHdhbnQuXG4gICAgICAgIGlmICghaW5pdCkgY29udGludWU7XG5cbiAgICAgICAgLy8gdmFyIGFuZCBsZXQgYXJlbid0IGV2ZXIgYWxsb3dlZCBpbml0aWFsaXplcnMuXG4gICAgICAgIGlmIChraW5kICE9PSBcImNvbnN0XCIgfHwgISFpZC50eXBlQW5ub3RhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuSW5pdGlhbGl6ZXJOb3RBbGxvd2VkSW5BbWJpZW50Q29udGV4dCwge1xuICAgICAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgIWlzVmFsaWRBbWJpZW50Q29uc3RJbml0aWFsaXplcihpbml0LCB0aGlzLmhhc1BsdWdpbihcImVzdHJlZVwiKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShcbiAgICAgICAgICAgIFRTRXJyb3JzLkNvbnN0SW5pdGlhaWxpemVyTXVzdEJlU3RyaW5nT3JOdW1lcmljTGl0ZXJhbE9yTGl0ZXJhbEVudW1SZWZlcmVuY2UsXG4gICAgICAgICAgICB7IGF0OiBpbml0IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVjbGFyYXRpb247XG4gICAgfVxuXG4gICAgcGFyc2VTdGF0ZW1lbnRDb250ZW50KFxuICAgICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgICAgIGRlY29yYXRvcnM/OiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgICApOiBOLlN0YXRlbWVudCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fY29uc3QpICYmIHRoaXMuaXNMb29rYWhlYWRDb250ZXh0dWFsKFwiZW51bVwiKSkge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1EZWNsYXJhdGlvbj4oKTtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuX2NvbnN0KTsgLy8gZWF0ICdjb25zdCdcbiAgICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZUVudW1EZWNsYXJhdGlvbihub2RlLCB7IGNvbnN0OiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2VudW0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VFbnVtRGVjbGFyYXRpb24oXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5Uc0VudW1EZWNsYXJhdGlvbj4oKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbnRlcmZhY2UpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudHNQYXJzZUludGVyZmFjZURlY2xhcmF0aW9uKHRoaXMuc3RhcnROb2RlKCkpO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VTdGF0ZW1lbnRDb250ZW50KGZsYWdzLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBwYXJzZUFjY2Vzc01vZGlmaWVyKCk6IE4uQWNjZXNzaWJpbGl0eSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgcmV0dXJuIHRoaXMudHNQYXJzZU1vZGlmaWVyKFtcInB1YmxpY1wiLCBcInByb3RlY3RlZFwiLCBcInByaXZhdGVcIl0pO1xuICAgIH1cblxuICAgIHRzSGFzU29tZU1vZGlmaWVycyhtZW1iZXI6IGFueSwgbW9kaWZpZXJzOiByZWFkb25seSBUc01vZGlmaWVyW10pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBtb2RpZmllcnMuc29tZShtb2RpZmllciA9PiB7XG4gICAgICAgIGlmICh0c0lzQWNjZXNzTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlci5hY2Nlc3NpYmlsaXR5ID09PSBtb2RpZmllcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtZW1iZXJbbW9kaWZpZXJdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHNJc1N0YXJ0T2ZTdGF0aWNCbG9ja3MoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5fc3RhdGljKSAmJlxuICAgICAgICB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzTWVtYmVyKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1lbWJlcjogYW55LFxuICAgICAgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgbW9kaWZpZXJzID0gW1xuICAgICAgICBcImRlY2xhcmVcIixcbiAgICAgICAgXCJwcml2YXRlXCIsXG4gICAgICAgIFwicHVibGljXCIsXG4gICAgICAgIFwicHJvdGVjdGVkXCIsXG4gICAgICAgIFwib3ZlcnJpZGVcIixcbiAgICAgICAgXCJhYnN0cmFjdFwiLFxuICAgICAgICBcInJlYWRvbmx5XCIsXG4gICAgICAgIFwic3RhdGljXCIsXG4gICAgICBdIGFzIGNvbnN0O1xuICAgICAgdGhpcy50c1BhcnNlTW9kaWZpZXJzKFxuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZE1vZGlmaWVyczogbW9kaWZpZXJzLFxuICAgICAgICAgIGRpc2FsbG93ZWRNb2RpZmllcnM6IFtcImluXCIsIFwib3V0XCJdLFxuICAgICAgICAgIHN0b3BPblN0YXJ0T2ZDbGFzc1N0YXRpY0Jsb2NrOiB0cnVlLFxuICAgICAgICAgIGVycm9yVGVtcGxhdGU6IFRTRXJyb3JzLkludmFsaWRNb2RpZmllck9uVHlwZVBhcmFtZXRlclBvc2l0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgY2FsbFBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRzSXNTdGFydE9mU3RhdGljQmxvY2tzKCkpIHtcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IFwic3RhdGljXCJcbiAgICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IFwie1wiXG4gICAgICAgICAgaWYgKHRoaXMudHNIYXNTb21lTW9kaWZpZXJzKG1lbWJlciwgbW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TdGF0aWNCbG9ja0Nhbm5vdEhhdmVNb2RpZmllciwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5jdXJQb3NpdGlvbigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdGF0aWNCbG9jayhjbGFzc0JvZHksIG1lbWJlciBhcyBOLlN0YXRpY0Jsb2NrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMoXG4gICAgICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgICAgICBtZW1iZXIsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICEhbWVtYmVyLnN0YXRpYyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG1lbWJlci5kZWNsYXJlKSB7XG4gICAgICAgIHRoaXMudHNJbkFtYmllbnRDb250ZXh0KGNhbGxQYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxQYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc01lbWJlcldpdGhJc1N0YXRpYyhcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZW1iZXI6IFVuZG9uZTxOLkNsYXNzTWVtYmVyIHwgTi5Uc0luZGV4U2lnbmF0dXJlPixcbiAgICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICAgIGlzU3RhdGljOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy50c1RyeVBhcnNlSW5kZXhTaWduYXR1cmUoXG4gICAgICAgIG1lbWJlciBhcyBVbmRvbmU8Ti5Uc0luZGV4U2lnbmF0dXJlPixcbiAgICAgICk7XG4gICAgICBpZiAoaWR4KSB7XG4gICAgICAgIGNsYXNzQm9keS5ib2R5LnB1c2goaWR4KTtcblxuICAgICAgICBpZiAoKG1lbWJlciBhcyBhbnkpLmFic3RyYWN0KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0Fic3RyYWN0LCB7IGF0OiBtZW1iZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChtZW1iZXIgYXMgYW55KS5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0FjY2Vzc2liaWxpdHksIHtcbiAgICAgICAgICAgIGF0OiBtZW1iZXIsXG4gICAgICAgICAgICBtb2RpZmllcjogKG1lbWJlciBhcyBhbnkpLmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChtZW1iZXIgYXMgYW55KS5kZWNsYXJlKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc0RlY2xhcmUsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG1lbWJlciBhcyBhbnkpLm92ZXJyaWRlKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5JbmRleFNpZ25hdHVyZUhhc092ZXJyaWRlLCB7IGF0OiBtZW1iZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pbkFic3RyYWN0Q2xhc3MgJiYgKG1lbWJlciBhcyBhbnkpLmFic3RyYWN0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuTm9uQWJzdHJhY3RDbGFzc0hhc0Fic3RyYWN0TWV0aG9kLCB7XG4gICAgICAgICAgYXQ6IG1lbWJlcixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgobWVtYmVyIGFzIGFueSkub3ZlcnJpZGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5oYWRTdXBlckNsYXNzKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5PdmVycmlkZU5vdEluU3ViQ2xhc3MsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKjo6IGludmFyaWFudChtZW1iZXIudHlwZSAhPT0gXCJUU0luZGV4U2lnbmF0dXJlXCIpICovXG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NNZW1iZXJXaXRoSXNTdGF0aWMoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgbWVtYmVyIGFzIFVuZG9uZTxOLkNsYXNzTWVtYmVyPixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGlzU3RhdGljLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZVBvc3RNZW1iZXJOYW1lTW9kaWZpZXJzKFxuICAgICAgbWV0aG9kT3JQcm9wOiBOLkNsYXNzTWV0aG9kIHwgTi5DbGFzc1Byb3BlcnR5IHwgTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSxcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IG9wdGlvbmFsID0gdGhpcy5lYXQodHQucXVlc3Rpb24pO1xuICAgICAgaWYgKG9wdGlvbmFsKSBtZXRob2RPclByb3Aub3B0aW9uYWwgPSB0cnVlO1xuXG4gICAgICBpZiAoKG1ldGhvZE9yUHJvcCBhcyBhbnkpLnJlYWRvbmx5ICYmIHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkNsYXNzTWV0aG9kSGFzUmVhZG9ubHksIHsgYXQ6IG1ldGhvZE9yUHJvcCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKChtZXRob2RPclByb3AgYXMgYW55KS5kZWNsYXJlICYmIHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkNsYXNzTWV0aG9kSGFzRGVjbGFyZSwgeyBhdDogbWV0aG9kT3JQcm9wIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoZSByZWFzb24gd2UgZG8gdGhpcyBpbiBgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50YCBhbmQgbm90IGBwYXJzZVN0YXRlbWVudGBcbiAgICAvLyBpcyB0aGF0IGUuZy4gYHR5cGUoKWAgaXMgdmFsaWQgSlMsIHNvIHdlIG11c3QgdHJ5IHBhcnNpbmcgdGhhdCBmaXJzdC5cbiAgICAvLyBJZiBpdCdzIHJlYWxseSBhIHR5cGUsIHdlIHdpbGwgcGFyc2UgYHR5cGVgIGFzIHRoZSBzdGF0ZW1lbnQsIGFuZCBjYW4gY29ycmVjdCBpdCBoZXJlXG4gICAgLy8gYnkgcGFyc2luZyB0aGUgcmVzdC5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsdWdpbiBvdmVycmlkZXMgaW50ZXJmYWNlc1xuICAgIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgIG5vZGU6IFVuZG9uZTxOLkV4cHJlc3Npb25TdGF0ZW1lbnQ+LFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuICAgICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgKTogTi5TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZGVjbCA9XG4gICAgICAgIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgcmVmaW5lIHR5cGluZ3NcbiAgICAgICAgICAgIHRoaXMudHNQYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgZXhwciwgZGVjb3JhdG9ycylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBkZWNsIHx8IHN1cGVyLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChub2RlLCBleHByLCBkZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICAvLyBleHBvcnQgdHlwZVxuICAgIC8vIFNob3VsZCBiZSB0cnVlIGZvciBhbnl0aGluZyBwYXJzZWQgYnkgYHRzVHJ5UGFyc2VFeHBvcnREZWNsYXJhdGlvbmAuXG4gICAgc2hvdWxkUGFyc2VFeHBvcnREZWNsYXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzLnRzSXNEZWNsYXJhdGlvblN0YXJ0KCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBBbiBhcHBhcmVudCBjb25kaXRpb25hbCBleHByZXNzaW9uIGNvdWxkIGFjdHVhbGx5IGJlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBpbiBhbiBhcnJvdyBmdW5jdGlvbi5cbiAgICBwYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgZXhwcjogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIC8vIG9ubHkgZG8gdGhlIGV4cGVuc2l2ZSBjbG9uZSBpZiB0aGVyZSBpcyBhIHF1ZXN0aW9uIG1hcmtcbiAgICAgIC8vIGFuZCBpZiB3ZSBjb21lIGZyb20gaW5zaWRlIHBhcmVuc1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgfHwgIXRoaXMubWF0Y2godHQucXVlc3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5wYXJzZUNvbmRpdGlvbmFsKFxuICAgICAgICAgIGV4cHIsXG5cbiAgICAgICAgICBzdGFydExvYyxcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyeVBhcnNlKCgpID0+XG4gICAgICAgIHN1cGVyLnBhcnNlQ29uZGl0aW9uYWwoZXhwciwgc3RhcnRMb2MpLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQubm9kZSkge1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgLyo6OiBpbnZhcmlhbnQocmVmRXhwcmVzc2lvbkVycm9ycyAhPSBudWxsKSAqL1xuICAgICAgICAgIHN1cGVyLnNldE9wdGlvbmFsUGFyYW1ldGVyc0Vycm9yKHJlZkV4cHJlc3Npb25FcnJvcnMsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRoaXMuc3RhdGUgPSByZXN1bHQuZmFpbFN0YXRlO1xuICAgICAgcmV0dXJuIHJlc3VsdC5ub2RlO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoZXNlIFwidHlwZSBjYXN0c1wiIGFyZSAqbm90KiB2YWxpZCBUUyBleHByZXNzaW9ucy5cbiAgICAvLyBCdXQgd2UgcGFyc2UgdGhlbSBoZXJlIGFuZCBjaGFuZ2UgdGhlbSB3aGVuIGNvbXBsZXRpbmcgdGhlIGFycm93IGZ1bmN0aW9uLlxuICAgIHBhcnNlUGFyZW5JdGVtKFxuICAgICAgbm9kZTogTi5FeHByZXNzaW9uLFxuXG4gICAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIG5vZGUgPSBzdXBlci5wYXJzZVBhcmVuSXRlbShub2RlLCBzdGFydExvYyk7XG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAvLyBJbmNsdWRlIHF1ZXN0aW9ubWFyayBpbiBsb2NhdGlvbiBvZiBub2RlXG4gICAgICAgIC8vIERvbid0IHVzZSB0aGlzLmZpbmlzaE5vZGUoKSBhcyBvdGhlcndpc2Ugd2UgbWlnaHQgcHJvY2VzcyBjb21tZW50cyB0d2ljZSBhbmRcbiAgICAgICAgLy8gaW5jbHVkZSBhbHJlYWR5IGNvbnN1bWVkIHBhcmVuc1xuICAgICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24obm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICBjb25zdCB0eXBlQ2FzdE5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uVHNUeXBlQ2FzdEV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgICAgdHlwZUNhc3ROb2RlLmV4cHJlc3Npb24gPSBub2RlO1xuICAgICAgICB0eXBlQ2FzdE5vZGUudHlwZUFubm90YXRpb24gPSB0aGlzLnRzUGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUodHlwZUNhc3ROb2RlLCBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgICAgbm9kZTogTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICAgICk6IE4uRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50c0luQW1iaWVudENvbnRleHQoKCkgPT4gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgbG9jYXRpb25cbiAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcblxuICAgICAgY29uc3QgaXNEZWNsYXJlID0gdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKTtcblxuICAgICAgaWYgKFxuICAgICAgICBpc0RlY2xhcmUgJiZcbiAgICAgICAgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9kZWNsYXJlKSB8fCAhdGhpcy5zaG91bGRQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShUU0Vycm9ycy5FeHBlY3RlZEFtYmllbnRBZnRlckV4cG9ydERlY2xhcmUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzSWRlbnRpZmllciA9IHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSk7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbjogTi5EZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwgPVxuICAgICAgICAoaXNJZGVudGlmaWVyICYmIHRoaXMudHNUcnlQYXJzZUV4cG9ydERlY2xhcmF0aW9uKCkpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24obm9kZSk7XG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiIHx8XG4gICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiIHx8XG4gICAgICAgIGlzRGVjbGFyZVxuICAgICAgKSB7XG4gICAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidHlwZVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEZWNsYXJlKSB7XG4gICAgICAgIC8vIFJlc2V0IGxvY2F0aW9uIHRvIGluY2x1ZGUgYGRlY2xhcmVgIGluIHJhbmdlXG4gICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uKGRlY2xhcmF0aW9uLCBzdGFydExvYyk7XG5cbiAgICAgICAgZGVjbGFyYXRpb24uZGVjbGFyZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzSWQoXG4gICAgICBub2RlOiBOLkNsYXNzLFxuICAgICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgICBvcHRpb25hbElkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBiaW5kaW5nVHlwZT86IEJpbmRpbmdUeXBlcyxcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICgoIWlzU3RhdGVtZW50IHx8IG9wdGlvbmFsSWQpICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9pbXBsZW1lbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NJZChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaXNTdGF0ZW1lbnQsXG4gICAgICAgIG9wdGlvbmFsSWQsXG4gICAgICAgIChub2RlIGFzIGFueSkuZGVjbGFyZSA/IEJJTkRfVFNfQU1CSUVOVCA6IEJJTkRfQ0xBU1MsXG4gICAgICApO1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlSW5PdXRDb25zdE1vZGlmaWVycyxcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKFxuICAgICAgbm9kZTogTi5DbGFzc1Byb3BlcnR5IHwgTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB8IE4uQ2xhc3NBY2Nlc3NvclByb3BlcnR5LFxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKCFub2RlLm9wdGlvbmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5iYW5nKSkge1xuICAgICAgICAgIG5vZGUuZGVmaW5pdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWF0KHR0LnF1ZXN0aW9uKSkge1xuICAgICAgICAgIG5vZGUub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuICAgICAgaWYgKHR5cGUpIG5vZGUudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlOiBOLkNsYXNzUHJvcGVydHkpOiBOLkNsYXNzUHJvcGVydHkge1xuICAgICAgdGhpcy5wYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKG5vZGUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc3RhdGUuaXNBbWJpZW50Q29udGV4dCAmJlxuICAgICAgICAhKG5vZGUucmVhZG9ubHkgJiYgIW5vZGUudHlwZUFubm90YXRpb24pICYmXG4gICAgICAgIHRoaXMubWF0Y2godHQuZXEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5EZWNsYXJlQ2xhc3NGaWVsZEhhc0luaXRpYWxpemVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYWJzdHJhY3QgJiYgdGhpcy5tYXRjaCh0dC5lcSkpIHtcbiAgICAgICAgY29uc3QgeyBrZXkgfSA9IG5vZGU7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuQWJzdHJhY3RQcm9wZXJ0eUhhc0luaXRpYWxpemVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOlxuICAgICAgICAgICAga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmICFub2RlLmNvbXB1dGVkXG4gICAgICAgICAgICAgID8ga2V5Lm5hbWVcbiAgICAgICAgICAgICAgOiBgWyR7dGhpcy5pbnB1dC5zbGljZShrZXkuc3RhcnQsIGtleS5lbmQpfV1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlQ2xhc3NQcm9wZXJ0eShub2RlKTtcbiAgICB9XG5cbiAgICBwYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICAgICAgbm9kZTogTi5DbGFzc1ByaXZhdGVQcm9wZXJ0eSxcbiAgICApOiBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWJzdHJhY3QgbWF5IG5vdCBpbmRleCBub2RlXG4gICAgICBpZiAobm9kZS5hYnN0cmFjdCkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLlByaXZhdGVFbGVtZW50SGFzQWJzdHJhY3QsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWNjZXNzaWJpbGl0eSBtYXkgbm90IGluZGV4IG5vZGVcbiAgICAgIGlmIChub2RlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5Qcml2YXRlRWxlbWVudEhhc0FjY2Vzc2liaWxpdHksIHtcbiAgICAgICAgICBhdDogbm9kZSxcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgbW9kaWZpZXI6IG5vZGUuYWNjZXNzaWJpbGl0eSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFyc2VDbGFzc1Byb3BlcnR5QW5ub3RhdGlvbihub2RlKTtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KG5vZGUpO1xuICAgIH1cblxuICAgIHBhcnNlQ2xhc3NBY2Nlc3NvclByb3BlcnR5KFxuICAgICAgbm9kZTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHksXG4gICAgKTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICAgICAgdGhpcy5wYXJzZUNsYXNzUHJvcGVydHlBbm5vdGF0aW9uKG5vZGUpO1xuICAgICAgaWYgKG5vZGUub3B0aW9uYWwpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5BY2Nlc3NvckNhbm5vdEJlT3B0aW9uYWwsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VDbGFzc0FjY2Vzc29yUHJvcGVydHkobm9kZSk7XG4gICAgfVxuXG4gICAgcHVzaENsYXNzTWV0aG9kKFxuICAgICAgY2xhc3NCb2R5OiBOLkNsYXNzQm9keSxcbiAgICAgIG1ldGhvZDogTi5DbGFzc01ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgICBhbGxvd3NEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gdGhpcy50c1RyeVBhcnNlVHlwZVBhcmFtZXRlcnMoXG4gICAgICAgIHRoaXMudHNQYXJzZUNvbnN0TW9kaWZpZXIsXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzICYmIGlzQ29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5Db25zdHJ1Y3Rvckhhc1R5cGVQYXJhbWV0ZXJzLCB7XG4gICAgICAgICAgYXQ6IHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkZWNsYXJlIGRvZXMgbm90IGV4aXN0IGluIENsYXNzTWV0aG9kXG4gICAgICBjb25zdCB7IGRlY2xhcmUgPSBmYWxzZSwga2luZCB9ID0gbWV0aG9kO1xuXG4gICAgICBpZiAoZGVjbGFyZSAmJiAoa2luZCA9PT0gXCJnZXRcIiB8fCBraW5kID09PSBcInNldFwiKSkge1xuICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkRlY2xhcmVBY2Nlc3NvciwgeyBhdDogbWV0aG9kLCBraW5kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzKSBtZXRob2QudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICAgIHN1cGVyLnB1c2hDbGFzc01ldGhvZChcbiAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc0NvbnN0cnVjdG9yLFxuICAgICAgICBhbGxvd3NEaXJlY3RTdXBlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICAgIGNsYXNzQm9keTogTi5DbGFzc0JvZHksXG4gICAgICBtZXRob2Q6IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RNb2RpZmllcixcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG1ldGhvZC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuICAgICAgc3VwZXIucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIG1ldGhvZCwgaXNHZW5lcmF0b3IsIGlzQXN5bmMpO1xuICAgIH1cblxuICAgIGRlY2xhcmVDbGFzc1ByaXZhdGVNZXRob2RJblNjb3BlKFxuICAgICAgbm9kZTogTi5DbGFzc1ByaXZhdGVNZXRob2QgfCBOLkVzdHJlZU1ldGhvZERlZmluaXRpb24gfCBOLlRTRGVjbGFyZU1ldGhvZCxcbiAgICAgIGtpbmQ6IG51bWJlcixcbiAgICApIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiVFNEZWNsYXJlTWV0aG9kXCIpIHJldHVybjtcbiAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHVzaW5nIHRoZSBcImVzdHJlZVwiIHBsdWdpbi5cbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiICYmICFub2RlLnZhbHVlLmJvZHkpIHJldHVybjtcblxuICAgICAgc3VwZXIuZGVjbGFyZUNsYXNzUHJpdmF0ZU1ldGhvZEluU2NvcGUobm9kZSwga2luZCk7XG4gICAgfVxuXG4gICAgcGFyc2VDbGFzc1N1cGVyKG5vZGU6IE4uQ2xhc3MpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAgIC8vIGhhbmRsZSBgZXh0ZW5kcyBmPDxUPlxuICAgICAgaWYgKG5vZGUuc3VwZXJDbGFzcyAmJiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5iaXRTaGlmdEwpKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIG5vZGUuc3VwZXJUeXBlUGFyYW1ldGVycyA9IHRoaXMudHNQYXJzZVR5cGVBcmd1bWVudHNJbkV4cHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwodHQuX2ltcGxlbWVudHMpKSB7XG4gICAgICAgIG5vZGUuaW1wbGVtZW50cyA9IHRoaXMudHNQYXJzZUhlcml0YWdlQ2xhdXNlKFwiaW1wbGVtZW50c1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgc3RhcnRMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgICAgaXNBc3luYzogYm9vbGVhbixcbiAgICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgKSB7XG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRoaXMudHNUcnlQYXJzZVR5cGVQYXJhbWV0ZXJzKFxuICAgICAgICB0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyLFxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlUGFyYW1ldGVycykgcHJvcC50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgICAgIHByb3AsXG5cbiAgICAgICAgc3RhcnRMb2MsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIGlzQWNjZXNzb3IsXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZTogTi5GdW5jdGlvbiwgaXNDb25zdHJ1Y3RvcjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlUGFyYW1ldGVycyhcbiAgICAgICAgdGhpcy50c1BhcnNlQ29uc3RNb2RpZmllcixcbiAgICAgICk7XG4gICAgICBpZiAodHlwZVBhcmFtZXRlcnMpIG5vZGUudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICAgIHN1cGVyLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgaXNDb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgLy8gYGxldCB4OiBudW1iZXI7YFxuICAgIHBhcnNlVmFySWQoXG4gICAgICBkZWNsOiBOLlZhcmlhYmxlRGVjbGFyYXRvcixcbiAgICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiLFxuICAgICk6IHZvaWQge1xuICAgICAgc3VwZXIucGFyc2VWYXJJZChkZWNsLCBraW5kKTtcbiAgICAgIGlmIChcbiAgICAgICAgZGVjbC5pZC50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAhdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSAmJlxuICAgICAgICB0aGlzLmVhdCh0dC5iYW5nKVxuICAgICAgKSB7XG4gICAgICAgIGRlY2wuZGVmaW5pdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gdGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIGRlY2wuaWQudHlwZUFubm90YXRpb24gPSB0eXBlO1xuICAgICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oZGVjbC5pZCk7IC8vIHNldCBlbmQgcG9zaXRpb24gdG8gZW5kIG9mIHR5cGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZSB0aGUgcmV0dXJuIHR5cGUgb2YgYW4gYXN5bmMgYXJyb3cgZnVuY3Rpb24gLSBsZXQgZm9vID0gKGFzeW5jICgpOiBudW1iZXIgPT4ge30pO1xuICAgIHBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbihcbiAgICAgIG5vZGU6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICBjYWxsOiBOLkNhbGxFeHByZXNzaW9uLFxuICAgICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHRoaXMudHNQYXJzZVR5cGVBbm5vdGF0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKG5vZGUsIGNhbGwpO1xuICAgIH1cblxuICAgIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICAvLyBOb3RlOiBXaGVuIHRoZSBKU1ggcGx1Z2luIGlzIG9uLCB0eXBlIGFzc2VydGlvbnMgKGA8VD4geGApIGFyZW4ndCB2YWxpZCBzeW50YXguXG5cbiAgICAgIGxldCBzdGF0ZTogU3RhdGUgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgICAgbGV0IGpzeDtcbiAgICAgIGxldCB0eXBlQ2FzdDtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc1BsdWdpbihcImpzeFwiKSAmJlxuICAgICAgICAodGhpcy5tYXRjaCh0dC5qc3hUYWdTdGFydCkgfHwgdGhpcy5tYXRjaCh0dC5sdCkpXG4gICAgICApIHtcbiAgICAgICAgLy8gUHJlZmVyIHRvIHBhcnNlIEpTWCBpZiBwb3NzaWJsZS4gQnV0IG1heSBiZSBhbiBhcnJvdyBmbi5cbiAgICAgICAgc3RhdGUgPSB0aGlzLnN0YXRlLmNsb25lKCk7XG5cbiAgICAgICAganN4ID0gdGhpcy50cnlQYXJzZShcbiAgICAgICAgICAoKSA9PiBzdXBlci5wYXJzZU1heWJlQXNzaWduKHJlZkV4cHJlc3Npb25FcnJvcnMsIGFmdGVyTGVmdFBhcnNlKSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKjo6IGludmFyaWFudCghanN4LmFib3J0ZWQpICovXG4gICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5ub2RlICE9IG51bGwpICovXG4gICAgICAgIGlmICghanN4LmVycm9yKSByZXR1cm4ganN4Lm5vZGU7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGB0Yy5qX2V4cHJgIG9yIGB0Yy5qX29UYWdgIGZyb20gY29udGV4dCBhZGRlZFxuICAgICAgICAvLyBieSBwYXJzaW5nIGBqc3hUYWdTdGFydGAgdG8gc3RvcCB0aGUgSlNYIHBsdWdpbiBmcm9tXG4gICAgICAgIC8vIG1lc3Npbmcgd2l0aCB0aGUgdG9rZW5zXG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRleHQgPSBjb250ZXh0W2NvbnRleHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyZW50Q29udGV4dCA9PT0gdGMual9vVGFnIHx8IGN1cnJlbnRDb250ZXh0ID09PSB0Yy5qX2V4cHIpIHtcbiAgICAgICAgICBjb250ZXh0LnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghanN4Py5lcnJvciAmJiAhdGhpcy5tYXRjaCh0dC5sdCkpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24ocmVmRXhwcmVzc2lvbkVycm9ycywgYWZ0ZXJMZWZ0UGFyc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBFaXRoZXIgd2F5LCB3ZSdyZSBsb29raW5nIGF0IGEgJzwnOiB0dC5qc3hUYWdTdGFydCBvciByZWxhdGlvbmFsLlxuXG4gICAgICAvLyBJZiB0aGUgc3RhdGUgd2FzIGNsb25lZCBpbiB0aGUgSlNYIHBhcnNpbmcgYnJhbmNoIGFib3ZlIGJ1dCB0aGVyZVxuICAgICAgLy8gaGF2ZSBiZWVuIGFueSBlcnJvciBpbiB0aGUgdHJ5UGFyc2UgY2FsbCwgdGhpcy5zdGF0ZSBpcyBzZXQgdG8gc3RhdGVcbiAgICAgIC8vIHNvIHdlIHN0aWxsIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgICBpZiAoIXN0YXRlIHx8IHN0YXRlID09PSB0aGlzLnN0YXRlKSBzdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTtcblxuICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzOiBOLlRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICAgIGNvbnN0IGFycm93ID0gdGhpcy50cnlQYXJzZShhYm9ydCA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgc2ltaWxhciB0byBUeXBlU2NyaXB0J3MgYHRyeVBhcnNlUGFyZW50aGVzaXplZEFycm93RnVuY3Rpb25FeHByZXNzaW9uYC5cbiAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLnRzUGFyc2VUeXBlUGFyYW1ldGVycyh0aGlzLnRzUGFyc2VDb25zdE1vZGlmaWVyKTtcbiAgICAgICAgY29uc3QgZXhwciA9IHN1cGVyLnBhcnNlTWF5YmVBc3NpZ24oXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgICBhZnRlckxlZnRQYXJzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhwci50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfHxcbiAgICAgICAgICBleHByLmV4dHJhPy5wYXJlbnRoZXNpemVkXG4gICAgICAgICkge1xuICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3JyZWN0IFR5cGVTY3JpcHQgY29kZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIHR5cGUgcGFyYW1ldGVyLCBidXQgZG9uJ3QgY3Jhc2ggb24gYmFkIGNvZGUuXG4gICAgICAgIGlmICh0eXBlUGFyYW1ldGVycz8ucGFyYW1zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMucmVzZXRTdGFydExvY2F0aW9uRnJvbU5vZGUoZXhwciwgdHlwZVBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGV4cHIudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmXG4gICAgICAgICAgICBleHByLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICFleHByLnR5cGVQYXJhbWV0ZXJzLmV4dHJhPy50cmFpbGluZ0NvbW1hXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyByZXBvcnQgZXJyb3IgaWYgc2luZ2xlIHR5cGUgcGFyYW1ldGVyIHVzZWQgd2l0aG91dCB0cmFpbGluZyBjb21tYS5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IGV4cHIudHlwZVBhcmFtZXRlcnMucGFyYW1zWzBdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXIuY29uc3RyYWludCkge1xuICAgICAgICAgICAgICAvLyBBIHNpbmdsZSB0eXBlIHBhcmFtZXRlciBtdXN0IGVpdGhlciBoYXZlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgIC8vIG9yIGEgdHJhaWxpbmcgY29tbWEsIG90aGVyd2lzZSBpdCdzIGFtYmlndW91cyB3aXRoIEpTWC5cbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5TaW5nbGVUeXBlUGFyYW1ldGVyV2l0aG91dFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgICBhdDogY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KHBhcmFtZXRlci5sb2MuZW5kLCAxKSxcbiAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyTmFtZTogcGFyYW1ldGVyLm5hbWUubmFtZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9LCBzdGF0ZSk7XG5cbiAgICAgIC8qOjogaW52YXJpYW50KGFycm93Lm5vZGUgIT0gbnVsbCkgKi9cbiAgICAgIGlmICghYXJyb3cuZXJyb3IgJiYgIWFycm93LmFib3J0ZWQpIHtcbiAgICAgICAgLy8gVGhpcyBlcnJvciBpcyByZXBvcnRlZCBvdXRzaWRlIG9mIHRoZSB0aGlzLnRyeVBhcnNlIGNhbGwgc28gdGhhdFxuICAgICAgICAvLyBpbiBjYXNlIG9mIDxUPih4KSA9PiAyLCB3ZSBkb24ndCBjb25zaWRlciA8VD4oeCkgYXMgYSB0eXBlIGFzc2VydGlvblxuICAgICAgICAvLyBiZWNhdXNlIG9mIHRoaXMgZXJyb3IuXG4gICAgICAgIGlmICh0eXBlUGFyYW1ldGVycykgdGhpcy5yZXBvcnRSZXNlcnZlZEFycm93VHlwZVBhcmFtKHR5cGVQYXJhbWV0ZXJzKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICByZXR1cm4gYXJyb3cubm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFqc3gpIHtcbiAgICAgICAgLy8gVHJ5IHBhcnNpbmcgYSB0eXBlIGNhc3QgaW5zdGVhZCBvZiBhbiBhcnJvdyBmdW5jdGlvbi5cbiAgICAgICAgLy8gVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBvdXRzaWRlIG9mIEpTWC5cbiAgICAgICAgLy8gKEJlY2F1c2UgaW4gSlNYIHRoZSAnPCcgc2hvdWxkIGJlIGEganN4VGFnU3RhcnQgYW5kIG5vdCBhIHJlbGF0aW9uYWwuXG4gICAgICAgIGFzc2VydCghdGhpcy5oYXNQbHVnaW4oXCJqc3hcIikpO1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBzdGFydCB3aXRoIGEgdHlwZSBhc3NlcnRpb24gKHZpYSBwYXJzZU1heWJlVW5hcnkpLlxuICAgICAgICAvLyBCdXQgZG9uJ3QgZGlyZWN0bHkgY2FsbCBgdGhpcy50c1BhcnNlVHlwZUFzc2VydGlvbmAgYmVjYXVzZSB3ZSB3YW50IHRvIGhhbmRsZSBhbnkgYmluYXJ5IGFmdGVyIGl0LlxuICAgICAgICB0eXBlQ2FzdCA9IHRoaXMudHJ5UGFyc2UoXG4gICAgICAgICAgKCkgPT4gc3VwZXIucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIC8qOjogaW52YXJpYW50KCF0eXBlQ2FzdC5hYm9ydGVkKSAqL1xuICAgICAgICAvKjo6IGludmFyaWFudCh0eXBlQ2FzdC5ub2RlICE9IG51bGwpICovXG4gICAgICAgIGlmICghdHlwZUNhc3QuZXJyb3IpIHJldHVybiB0eXBlQ2FzdC5ub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoanN4Py5ub2RlKSB7XG4gICAgICAgIC8qOjogaW52YXJpYW50KGpzeC5mYWlsU3RhdGUpICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBqc3guZmFpbFN0YXRlO1xuICAgICAgICByZXR1cm4ganN4Lm5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnJvdy5ub2RlKSB7XG4gICAgICAgIC8qOjogaW52YXJpYW50KGFycm93LmZhaWxTdGF0ZSkgKi9cbiAgICAgICAgdGhpcy5zdGF0ZSA9IGFycm93LmZhaWxTdGF0ZTtcbiAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzKSB0aGlzLnJlcG9ydFJlc2VydmVkQXJyb3dUeXBlUGFyYW0odHlwZVBhcmFtZXRlcnMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSB0eXBpbmdzXG4gICAgICAgIHJldHVybiBhcnJvdy5ub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZUNhc3Q/Lm5vZGUpIHtcbiAgICAgICAgLyo6OiBpbnZhcmlhbnQodHlwZUNhc3QuZmFpbFN0YXRlKSAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gdHlwZUNhc3QuZmFpbFN0YXRlO1xuICAgICAgICByZXR1cm4gdHlwZUNhc3Qubm9kZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cganN4Py5lcnJvciB8fCBhcnJvdy5lcnJvciB8fCB0eXBlQ2FzdD8uZXJyb3I7XG4gICAgfVxuXG4gICAgcmVwb3J0UmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbShub2RlOiBhbnkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICFub2RlLnBhcmFtc1swXS5jb25zdHJhaW50ICYmXG4gICAgICAgICFub2RlLmV4dHJhPy50cmFpbGluZ0NvbW1hICYmXG4gICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwidHlwZXNjcmlwdFwiLCBcImRpc2FsbG93QW1iaWd1b3VzSlNYTGlrZVwiKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbSwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdHlwZSBhc3NlcnRpb25zXG4gICAgcGFyc2VNYXliZVVuYXJ5KFxuICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgICAgc2F3VW5hcnk/OiBib29sZWFuLFxuICAgICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKFwianN4XCIpICYmIHRoaXMubWF0Y2godHQubHQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VUeXBlQXNzZXJ0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZVVuYXJ5KHJlZkV4cHJlc3Npb25FcnJvcnMsIHNhd1VuYXJ5KTtcbiAgICB9XG5cbiAgICBwYXJzZUFycm93KFxuICAgICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgICk6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuY29sb24pKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gaG93IHRoZSBUUyBwYXJzZXIgZG9lcyBpdC5cbiAgICAgICAgLy8gVFMgdXNlcyBsb29rYWhlYWQuIFRoZSBCYWJlbCBQYXJzZXIgcGFyc2VzIGl0IGFzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGFuZCBjb252ZXJ0cy5cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyeVBhcnNlKGFib3J0ID0+IHtcbiAgICAgICAgICBjb25zdCByZXR1cm5UeXBlID0gdGhpcy50c1BhcnNlVHlwZU9yVHlwZVByZWRpY2F0ZUFubm90YXRpb24oXG4gICAgICAgICAgICB0dC5jb2xvbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLm1hdGNoKHR0LmFycm93KSkgYWJvcnQoKTtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCFyZXN1bHQudGhyb3duKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhpcy5zdGF0ZSA9IHJlc3VsdC5mYWlsU3RhdGU7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciByZWZpbmUgdHlwaW5nc1xuICAgICAgICAgIG5vZGUucmV0dXJuVHlwZSA9IHJlc3VsdC5ub2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUFycm93KG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHR5cGUgYW5ub3RhdGlvbnMgaW5zaWRlIG9mIGEgcGFyYW1ldGVyIGxpc3QuXG4gICAgcGFyc2VBc3NpZ25hYmxlTGlzdEl0ZW1UeXBlcyhcbiAgICAgIHBhcmFtOiBOLlBhdHRlcm4sXG4gICAgICBmbGFnczogUGFyc2VCaW5kaW5nTGlzdEZsYWdzLFxuICAgICkge1xuICAgICAgaWYgKCEoZmxhZ3MgJiBQYXJzZUJpbmRpbmdMaXN0RmxhZ3MuSVNfRlVOQ1RJT05fUEFSQU1TKSkgcmV0dXJuIHBhcmFtO1xuXG4gICAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICAgIChwYXJhbSBhcyBhbnkgYXMgTi5JZGVudGlmaWVyKS5vcHRpb25hbCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy50c1RyeVBhcnNlVHlwZUFubm90YXRpb24oKTtcbiAgICAgIGlmICh0eXBlKSBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHR5cGU7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24ocGFyYW0pO1xuXG4gICAgICByZXR1cm4gcGFyYW07XG4gICAgfVxuXG4gICAgaXNBc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNCaW5kaW5nPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbiwgaXNCaW5kaW5nKTtcbiAgICAgICAgY2FzZSBcIlRTUGFyYW1ldGVyUHJvcGVydHlcIjpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gc3VwZXIuaXNBc3NpZ25hYmxlKG5vZGUsIGlzQmluZGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9Bc3NpZ25hYmxlKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgdGhpcy50b0Fzc2lnbmFibGVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihub2RlLCBpc0xIUyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgICAgICBjYXNlIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU05vbk51bGxFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICAgICAgICBpZiAoaXNMSFMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFycm93UGFyYW1ldGVyQmluZGluZ0Vycm9yKFxuICAgICAgICAgICAgICBUU0Vycm9ycy5VbmV4cGVjdGVkVHlwZUNhc3RJblBhcmFtZXRlcixcbiAgICAgICAgICAgICAgeyBhdDogbm9kZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShUU0Vycm9ycy5VbmV4cGVjdGVkVHlwZUNhc3RJblBhcmFtZXRlciwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS5leHByZXNzaW9uLCBpc0xIUyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgIGlmICghaXNMSFMgJiYgbm9kZS5sZWZ0LnR5cGUgPT09IFwiVFNUeXBlQ2FzdEV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgbm9kZS5sZWZ0ID0gdGhpcy50eXBlQ2FzdFRvUGFyYW1ldGVyKG5vZGUubGVmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKG5vZGU6IE4uTm9kZSwgaXNMSFM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHN3aXRjaCAobm9kZS5leHByZXNzaW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzTEhTKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdXBlci50b0Fzc2lnbmFibGUobm9kZSwgaXNMSFMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlOiBOLk5vZGUsIGFsbG93UGF0dGVybjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICAgICAgY2FzZSBcIlRTVHlwZUFzc2VydGlvblwiOlxuICAgICAgICBjYXNlIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgIHRoaXMuY2hlY2tUb1Jlc3RDb252ZXJzaW9uKG5vZGUuZXhwcmVzc2lvbiwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN1cGVyLmNoZWNrVG9SZXN0Q29udmVyc2lvbihub2RlLCBhbGxvd1BhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGx1Z2luIG92ZXJyaWRlcyBpbnRlcmZhY2VzXG4gICAgaXNWYWxpZExWYWwoXG4gICAgICB0eXBlOlxuICAgICAgICB8IFwiVFNUeXBlQ2FzdEV4cHJlc3Npb25cIlxuICAgICAgICB8IFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiXG4gICAgICAgIHwgXCJUU05vbk51bGxFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIlRTQXNFeHByZXNzaW9uXCJcbiAgICAgICAgfCBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiXG4gICAgICAgIHwgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgIGlzVW5wYXJlbnRoZXNpemVkSW5Bc3NpZ246IGJvb2xlYW4sXG4gICAgICBiaW5kaW5nOiBCaW5kaW5nVHlwZXMsXG4gICAgKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBnZXRPd24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gQWxsb3cgXCJ0eXBlY2FzdHNcIiB0byBhcHBlYXIgb24gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBleHByZXNzaW9ucyxcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgbWF5IGJlIGluIGFuIGFycm93IGZ1bmN0aW9uLlxuICAgICAgICAgICAgLy8gZS5nLiBgY29uc3QgZiA9IChmb286IG51bWJlciA9IDApID0+IGZvbztgXG4gICAgICAgICAgICBUU1R5cGVDYXN0RXhwcmVzc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgIFRTUGFyYW1ldGVyUHJvcGVydHk6IFwicGFyYW1ldGVyXCIsXG4gICAgICAgICAgICBUU05vbk51bGxFeHByZXNzaW9uOiBcImV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFRTQXNFeHByZXNzaW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgICAgVFNTYXRpc2ZpZXNFeHByZXNzaW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgICAgVFNUeXBlQXNzZXJ0aW9uOiAoYmluZGluZyAhPT0gQklORF9OT05FIHx8XG4gICAgICAgICAgICAgICFpc1VucGFyZW50aGVzaXplZEluQXNzaWduKSAmJiBbXCJleHByZXNzaW9uXCIsIHRydWVdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgKSB8fCBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1VucGFyZW50aGVzaXplZEluQXNzaWduLCBiaW5kaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJzZUJpbmRpbmdBdG9tKCk6IE4uUGF0dGVybiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS50eXBlID09PSB0dC5fdGhpcykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUlkZW50aWZpZXIoLyogbGliZXJhbCAqLyB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUJpbmRpbmdBdG9tKCk7XG4gICAgfVxuXG4gICAgcGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByOiBOLkV4cHJlc3Npb24pOiBOLkV4cHJlc3Npb24ge1xuICAgICAgLy8gaGFuZGxlcyBgQGY8PFQ+YFxuICAgICAgaWYgKHRoaXMubWF0Y2godHQubHQpIHx8IHRoaXMubWF0Y2godHQuYml0U2hpZnRMKSkge1xuICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gdGhpcy50c1BhcnNlVHlwZUFyZ3VtZW50c0luRXhwcmVzc2lvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICBjb25zdCBjYWxsID0gc3VwZXIucGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByKTtcbiAgICAgICAgICBjYWxsLnR5cGVQYXJhbWV0ZXJzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgICByZXR1cm4gY2FsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5wYXJlbkwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyhleHByKTtcbiAgICB9XG5cbiAgICBjaGVja0NvbW1hQWZ0ZXJSZXN0KFxuICAgICAgY2xvc2U6ICh0eXBlb2YgY2hhckNvZGVzKVtrZXlvZiB0eXBlb2YgY2hhckNvZGVzXSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ICYmXG4gICAgICAgIHRoaXMubWF0Y2godHQuY29tbWEpICYmXG4gICAgICAgIHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2xvc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLmNoZWNrQ29tbWFBZnRlclJlc3QoY2xvc2UpO1xuICAgIH1cblxuICAgIC8vID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PVxuICAgIC8vIE5vdGU6IEFsbCBiZWxvdyBtZXRob2RzIGFyZSBkdXBsaWNhdGVzIG9mIHNvbWV0aGluZyBpbiBmbG93LmpzLlxuICAgIC8vIE5vdCBzdXJlIHdoYXQgdGhlIGJlc3Qgd2F5IHRvIGNvbWJpbmUgdGhlc2UgaXMuXG4gICAgLy8gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09ID09PSA9PT0gPT09XG5cbiAgICBpc0NsYXNzTWV0aG9kKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubWF0Y2godHQubHQpIHx8IHN1cGVyLmlzQ2xhc3NNZXRob2QoKTtcbiAgICB9XG5cbiAgICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm1hdGNoKHR0LmJhbmcpIHx8IHRoaXMubWF0Y2godHQuY29sb24pIHx8IHN1cGVyLmlzQ2xhc3NQcm9wZXJ0eSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlTWF5YmVEZWZhdWx0KFxuICAgICAgc3RhcnRMb2M/OiBQb3NpdGlvbiB8IG51bGwsXG4gICAgICBsZWZ0PzogUGF0dGVybiB8IG51bGwsXG4gICAgKTogTi5QYXR0ZXJuIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdXBlci5wYXJzZU1heWJlRGVmYXVsdChzdGFydExvYywgbGVmdCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIgJiZcbiAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbiAmJlxuICAgICAgICBub2RlLnJpZ2h0LnN0YXJ0IDwgbm9kZS50eXBlQW5ub3RhdGlvbi5zdGFydFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoVFNFcnJvcnMuVHlwZUFubm90YXRpb25BZnRlckFzc2lnbiwge1xuICAgICAgICAgIGF0OiBub2RlLnR5cGVBbm5vdGF0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gZW5zdXJlIHRoYXQgaW5zaWRlIHR5cGVzLCB3ZSBieXBhc3MgdGhlIGpzeCBwYXJzZXIgcGx1Z2luXG4gICAgZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluVHlwZSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gY2hhckNvZGVzLmdyZWF0ZXJUaGFuKSB7XG4gICAgICAgICAgdGhpcy5maW5pc2hPcCh0dC5ndCwgMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSBjaGFyQ29kZXMubGVzc1RoYW4pIHtcbiAgICAgICAgICB0aGlzLmZpbmlzaE9wKHR0Lmx0LCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY29kZSk7XG4gICAgfVxuXG4gICAgLy8gdXNlZCBhZnRlciB3ZSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgdHlwZXNcbiAgICByZVNjYW5fbHRfZ3QoKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodHlwZSA9PT0gdHQubHQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgLT0gMTtcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fbHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQuZ3QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5wb3MgLT0gMTtcbiAgICAgICAgdGhpcy5yZWFkVG9rZW5fZ3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZVNjYW5fbHQoKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAodHlwZSA9PT0gdHQuYml0U2hpZnRMKSB7XG4gICAgICAgIHRoaXMuc3RhdGUucG9zIC09IDI7XG4gICAgICAgIHRoaXMuZmluaXNoT3AodHQubHQsIDEpO1xuICAgICAgICByZXR1cm4gdHQubHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB0b0Fzc2lnbmFibGVMaXN0KFxuICAgICAgZXhwckxpc3Q6IEV4cHJlc3Npb25bXSxcbiAgICAgIHRyYWlsaW5nQ29tbWFMb2M6IFBvc2l0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICAgIGlzTEhTOiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBleHByID0gZXhwckxpc3RbaV07XG4gICAgICAgIGlmIChleHByPy50eXBlID09PSBcIlRTVHlwZUNhc3RFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBleHByTGlzdFtpXSA9IHRoaXMudHlwZUNhc3RUb1BhcmFtZXRlcihcbiAgICAgICAgICAgIGV4cHIgYXMgTi5Uc1R5cGVDYXN0RXhwcmVzc2lvbixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdXBlci50b0Fzc2lnbmFibGVMaXN0KGV4cHJMaXN0LCB0cmFpbGluZ0NvbW1hTG9jLCBpc0xIUyk7XG4gICAgfVxuXG4gICAgdHlwZUNhc3RUb1BhcmFtZXRlcihub2RlOiBOLlRzVHlwZUNhc3RFeHByZXNzaW9uKTogTi5Ob2RlIHtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbi50eXBlQW5ub3RhdGlvbiA9IG5vZGUudHlwZUFubm90YXRpb247XG5cbiAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihub2RlLmV4cHJlc3Npb24sIG5vZGUudHlwZUFubm90YXRpb24ubG9jLmVuZCk7XG5cbiAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgc2hvdWxkUGFyc2VBcnJvdyhwYXJhbXM6IEFycmF5PE4uTm9kZT4pIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbG9uKSkge1xuICAgICAgICByZXR1cm4gcGFyYW1zLmV2ZXJ5KGV4cHIgPT4gdGhpcy5pc0Fzc2lnbmFibGUoZXhwciwgdHJ1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZFBhcnNlQXJyb3cocGFyYW1zKTtcbiAgICB9XG5cbiAgICBzaG91bGRQYXJzZUFzeW5jQXJyb3coKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5jb2xvbikgfHwgc3VwZXIuc2hvdWxkUGFyc2VBc3luY0Fycm93KCk7XG4gICAgfVxuXG4gICAgY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKSB7XG4gICAgICAvLyBBdm9pZCB1bm5lY2Vzc2FyeSBsb29rYWhlYWQgaW4gY2hlY2tpbmcgZm9yIGFic3RyYWN0IGNsYXNzIHVubGVzcyBuZWVkZWQhXG4gICAgICByZXR1cm4gc3VwZXIuY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKSB8fCB0aGlzLmlzQWJzdHJhY3RDbGFzcygpO1xuICAgIH1cblxuICAgIGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gICAgICBub2RlOiBOLkpTWE9wZW5pbmdFbGVtZW50LFxuICAgICk6IE4uSlNYT3BlbmluZ0VsZW1lbnQge1xuICAgICAgLy8gaGFuZGxlcyBgPENvbXBvbmVudDw8VD5gXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5sdCkgfHwgdGhpcy5tYXRjaCh0dC5iaXRTaGlmdEwpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSB0aGlzLnRzVHJ5UGFyc2VBbmRDYXRjaCgoKSA9PlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHJlZmluZSB0eXBpbmdzXG4gICAgICAgICAgdGhpcy50c1BhcnNlVHlwZUFyZ3VtZW50c0luRXhwcmVzc2lvbigpLFxuICAgICAgICApO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiByZWZpbmUgdHlwaW5nc1xuICAgICAgICBpZiAodHlwZUFyZ3VtZW50cykgbm9kZS50eXBlUGFyYW1ldGVycyA9IHR5cGVBcmd1bWVudHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuanN4UGFyc2VPcGVuaW5nRWxlbWVudEFmdGVyTmFtZShub2RlKTtcbiAgICB9XG5cbiAgICBnZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQoXG4gICAgICBtZXRob2Q6IE4uT2JqZWN0TWV0aG9kIHwgTi5DbGFzc01ldGhvZCxcbiAgICApOiBudW1iZXIge1xuICAgICAgY29uc3QgYmFzZUNvdW50ID0gc3VwZXIuZ2V0R2V0dGVyU2V0dGVyRXhwZWN0ZWRQYXJhbUNvdW50KG1ldGhvZCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcbiAgICAgIGNvbnN0IGZpcnN0UGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICBjb25zdCBoYXNDb250ZXh0UGFyYW0gPSBmaXJzdFBhcmFtICYmIHRoaXMuaXNUaGlzUGFyYW0oZmlyc3RQYXJhbSk7XG5cbiAgICAgIHJldHVybiBoYXNDb250ZXh0UGFyYW0gPyBiYXNlQ291bnQgKyAxIDogYmFzZUNvdW50O1xuICAgIH1cblxuICAgIHBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSgpOiBOLlBhdHRlcm4ge1xuICAgICAgY29uc3QgcGFyYW0gPSBzdXBlci5wYXJzZUNhdGNoQ2xhdXNlUGFyYW0oKTtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRzVHJ5UGFyc2VUeXBlQW5ub3RhdGlvbigpO1xuXG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBwYXJhbS50eXBlQW5ub3RhdGlvbiA9IHR5cGU7XG4gICAgICAgIHRoaXMucmVzZXRFbmRMb2NhdGlvbihwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG5cbiAgICB0c0luQW1iaWVudENvbnRleHQ8VD4oY2I6ICgpID0+IFQpOiBUIHtcbiAgICAgIGNvbnN0IG9sZElzQW1iaWVudENvbnRleHQgPSB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQ7XG4gICAgICB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmlzQW1iaWVudENvbnRleHQgPSBvbGRJc0FtYmllbnRDb250ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlQ2xhc3M8VCBleHRlbmRzIE4uQ2xhc3M+KFxuICAgICAgbm9kZTogVW5kb25lPFQ+LFxuICAgICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgICBvcHRpb25hbElkPzogYm9vbGVhbixcbiAgICApOiBUIHtcbiAgICAgIGNvbnN0IG9sZEluQWJzdHJhY3RDbGFzcyA9IHRoaXMuc3RhdGUuaW5BYnN0cmFjdENsYXNzO1xuICAgICAgdGhpcy5zdGF0ZS5pbkFic3RyYWN0Q2xhc3MgPSAhIShub2RlIGFzIGFueSkuYWJzdHJhY3Q7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3VwZXIucGFyc2VDbGFzcyhub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLmluQWJzdHJhY3RDbGFzcyA9IG9sZEluQWJzdHJhY3RDbGFzcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0c1BhcnNlQWJzdHJhY3REZWNsYXJhdGlvbihcbiAgICAgIG5vZGU6IGFueSxcbiAgICAgIGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsLFxuICAgICk6IE4uQ2xhc3NEZWNsYXJhdGlvbiB8IE4uVHNJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgICBub2RlLmFic3RyYWN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF5YmVUYWtlRGVjb3JhdG9ycyhcbiAgICAgICAgICBkZWNvcmF0b3JzLFxuICAgICAgICAgIHRoaXMucGFyc2VDbGFzczxOLkNsYXNzRGVjbGFyYXRpb24+KFxuICAgICAgICAgICAgbm9kZSBhcyBOLkNsYXNzRGVjbGFyYXRpb24sXG4gICAgICAgICAgICAvKiBpc1N0YXRlbWVudCAqLyB0cnVlLFxuICAgICAgICAgICAgLyogb3B0aW9uYWxJZCAqLyBmYWxzZSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29udGV4dHVhbCh0dC5faW50ZXJmYWNlKSkge1xuICAgICAgICAvLyBmb3IgaW52YWxpZCBhYnN0cmFjdCBpbnRlcmZhY2VcblxuICAgICAgICAvLyBUbyBhdm9pZFxuICAgICAgICAvLyAgIGFic3RyYWN0IGludGVyZmFjZVxuICAgICAgICAvLyAgIEZvbyB7fVxuICAgICAgICBpZiAoIXRoaXMuaGFzRm9sbG93aW5nTGluZUJyZWFrKCkpIHtcbiAgICAgICAgICBub2RlLmFic3RyYWN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLk5vbkNsYXNzTWV0aG9kUHJvcGVydHlIYXNBYnN0cmFjdE1vZGlmZXIsIHtcbiAgICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRzUGFyc2VJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIG5vZGUgYXMgTi5Uc0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5fY2xhc3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlTWV0aG9kPFxuICAgICAgVCBleHRlbmRzIE4uT2JqZWN0TWV0aG9kIHwgTi5DbGFzc01ldGhvZCB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICAgID4oXG4gICAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgICBpc0NvbnN0cnVjdG9yOiBib29sZWFuLFxuICAgICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgICAgaW5DbGFzc1Njb3BlPzogYm9vbGVhbixcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHN1cGVyLnBhcnNlTWV0aG9kPFQ+KFxuICAgICAgICBub2RlLFxuICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgaXNBc3luYyxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dEaXJlY3RTdXBlcixcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaW5DbGFzc1Njb3BlLFxuICAgICAgKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgcHJvcGVydHkgbm90IGRlZmluZWQgZm9yIGFsbCB0eXBlcyBpbiB1bmlvblxuICAgICAgaWYgKG1ldGhvZC5hYnN0cmFjdCkge1xuICAgICAgICBjb25zdCBoYXNCb2R5ID0gdGhpcy5oYXNQbHVnaW4oXCJlc3RyZWVcIilcbiAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0cmVlIHR5cGluZ3NcbiAgICAgICAgICAgICEhbWV0aG9kLnZhbHVlLmJvZHlcbiAgICAgICAgICA6ICEhbWV0aG9kLmJvZHk7XG4gICAgICAgIGlmIChoYXNCb2R5KSB7XG4gICAgICAgICAgY29uc3QgeyBrZXkgfSA9IG1ldGhvZDtcbiAgICAgICAgICB0aGlzLnJhaXNlKFRTRXJyb3JzLkFic3RyYWN0TWV0aG9kSGFzSW1wbGVtZW50YXRpb24sIHtcbiAgICAgICAgICAgIGF0OiBtZXRob2QsXG4gICAgICAgICAgICBtZXRob2ROYW1lOlxuICAgICAgICAgICAgICBrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgIW1ldGhvZC5jb21wdXRlZFxuICAgICAgICAgICAgICAgID8ga2V5Lm5hbWVcbiAgICAgICAgICAgICAgICA6IGBbJHt0aGlzLmlucHV0LnNsaWNlKGtleS5zdGFydCwga2V5LmVuZCl9XWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuXG4gICAgdHNQYXJzZVR5cGVQYXJhbWV0ZXJOYW1lKCk6IE4uSWRlbnRpZmllciB8IHN0cmluZyB7XG4gICAgICBjb25zdCB0eXBlTmFtZTogTi5JZGVudGlmaWVyID0gdGhpcy5wYXJzZUlkZW50aWZpZXIoKTtcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gdHlwZU5hbWUgOiB0eXBlTmFtZS5uYW1lO1xuICAgIH1cblxuICAgIHNob3VsZFBhcnNlQXNBbWJpZW50Q29udGV4dCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwidHlwZXNjcmlwdFwiLCBcImR0c1wiKTtcbiAgICB9XG5cbiAgICBwYXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFBhcnNlQXNBbWJpZW50Q29udGV4dCgpKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuaXNBbWJpZW50Q29udGV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2UoKTtcbiAgICB9XG5cbiAgICBnZXRFeHByZXNzaW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkUGFyc2VBc0FtYmllbnRDb250ZXh0KCkpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5pc0FtYmllbnRDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5nZXRFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnRTcGVjaWZpZXIoXG4gICAgICBub2RlOiBVbmRvbmU8Ti5FeHBvcnRTcGVjaWZpZXI+LFxuICAgICAgaXNTdHJpbmc6IGJvb2xlYW4sXG4gICAgICBpc0luVHlwZUV4cG9ydDogYm9vbGVhbixcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICApIHtcbiAgICAgIGlmICghaXNTdHJpbmcgJiYgaXNNYXliZVR5cGVPbmx5KSB7XG4gICAgICAgIHRoaXMucGFyc2VUeXBlT25seUltcG9ydEV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIC8qIGlzSW1wb3J0ICovIGZhbHNlLFxuICAgICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlPE4uRXhwb3J0U3BlY2lmaWVyPihub2RlLCBcIkV4cG9ydFNwZWNpZmllclwiKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuZXhwb3J0S2luZCA9IFwidmFsdWVcIjtcbiAgICAgIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaXNTdHJpbmcsXG4gICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcnNlSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgc3BlY2lmaWVyOiBVbmRvbmU8Ti5JbXBvcnRTcGVjaWZpZXI+LFxuICAgICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICAgIGlzTWF5YmVUeXBlT25seTogYm9vbGVhbixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgfCB1bmRlZmluZWQsXG4gICAgKTogTi5JbXBvcnRTcGVjaWZpZXIge1xuICAgICAgaWYgKCFpbXBvcnRlZElzU3RyaW5nICYmIGlzTWF5YmVUeXBlT25seSkge1xuICAgICAgICB0aGlzLnBhcnNlVHlwZU9ubHlJbXBvcnRFeHBvcnRTcGVjaWZpZXIoXG4gICAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgICAgIC8qIGlzSW1wb3J0ICovIHRydWUsXG4gICAgICAgICAgaXNJblR5cGVPbmx5SW1wb3J0LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlPE4uSW1wb3J0U3BlY2lmaWVyPihzcGVjaWZpZXIsIFwiSW1wb3J0U3BlY2lmaWVyXCIpO1xuICAgICAgfVxuICAgICAgc3BlY2lmaWVyLmltcG9ydEtpbmQgPSBcInZhbHVlXCI7XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VJbXBvcnRTcGVjaWZpZXIoXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgaW1wb3J0ZWRJc1N0cmluZyxcbiAgICAgICAgaXNJblR5cGVPbmx5SW1wb3J0LFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICAgIGlzSW5UeXBlT25seUltcG9ydCA/IEJJTkRfVFNfVFlQRV9JTVBPUlQgOiBCSU5EX0ZMQUdTX1RTX0lNUE9SVCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VUeXBlT25seUltcG9ydEV4cG9ydFNwZWNpZmllcihcbiAgICAgIG5vZGU6IGFueSxcbiAgICAgIGlzSW1wb3J0OiBib29sZWFuLFxuICAgICAgaXNJblR5cGVPbmx5SW1wb3J0RXhwb3J0OiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgbGVmdE9mQXNLZXkgPSBpc0ltcG9ydCA/IFwiaW1wb3J0ZWRcIiA6IFwibG9jYWxcIjtcbiAgICAgIGNvbnN0IHJpZ2h0T2ZBc0tleSA9IGlzSW1wb3J0ID8gXCJsb2NhbFwiIDogXCJleHBvcnRlZFwiO1xuXG4gICAgICBsZXQgbGVmdE9mQXMgPSBub2RlW2xlZnRPZkFzS2V5XTtcbiAgICAgIGxldCByaWdodE9mQXM7XG5cbiAgICAgIGxldCBoYXNUeXBlU3BlY2lmaWVyID0gZmFsc2U7XG4gICAgICBsZXQgY2FuUGFyc2VBc0tleXdvcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBsb2MgPSBsZWZ0T2ZBcy5sb2Muc3RhcnQ7XG5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL2ZjNGY5ZDgzZDU5MzkwNDdhYTZiYjJhNDM5NjVjNmU5YmJmYmMzNWIvc3JjL2NvbXBpbGVyL3BhcnNlci50cyNMNzQxMS1MNzQ1NlxuICAgICAgLy8gaW1wb3J0IHsgdHlwZSB9IGZyb20gXCJtb2RcIjsgICAgICAgICAgLSBoYXNUeXBlU3BlY2lmaWVyOiBmYWxzZSwgbGVmdE9mQXM6IHR5cGVcbiAgICAgIC8vIGltcG9ydCB7IHR5cGUgYXMgfSBmcm9tIFwibW9kXCI7ICAgICAgIC0gaGFzVHlwZVNwZWNpZmllcjogdHJ1ZSwgIGxlZnRPZkFzOiBhc1xuICAgICAgLy8gaW1wb3J0IHsgdHlwZSBhcyBhcyB9IGZyb20gXCJtb2RcIjsgICAgLSBoYXNUeXBlU3BlY2lmaWVyOiBmYWxzZSwgbGVmdE9mQXM6IHR5cGUsIHJpZ2h0T2ZBczogYXNcbiAgICAgIC8vIGltcG9ydCB7IHR5cGUgYXMgYXMgYXMgfSBmcm9tIFwibW9kXCI7IC0gaGFzVHlwZVNwZWNpZmllcjogdHJ1ZSwgIGxlZnRPZkFzOiBhcywgICByaWdodE9mQXM6IGFzXG4gICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICAvLyB7IHR5cGUgYXMgLi4uPyB9XG4gICAgICAgIGNvbnN0IGZpcnN0QXMgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyBhcyAuLi4/IH1cbiAgICAgICAgICBjb25zdCBzZWNvbmRBcyA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICAgICAgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICAgIC8vIHsgdHlwZSBhcyBhcyBzb21ldGhpbmcgfVxuICAgICAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgICAgICBsZWZ0T2ZBcyA9IGZpcnN0QXM7XG4gICAgICAgICAgICByaWdodE9mQXMgPSBpc0ltcG9ydFxuICAgICAgICAgICAgICA/IHRoaXMucGFyc2VJZGVudGlmaWVyKClcbiAgICAgICAgICAgICAgOiB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgICAgICAgY2FuUGFyc2VBc0tleXdvcmQgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8geyB0eXBlIGFzIGFzIH1cbiAgICAgICAgICAgIHJpZ2h0T2ZBcyA9IHNlY29uZEFzO1xuICAgICAgICAgICAgY2FuUGFyc2VBc0tleXdvcmQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW5Jc0tleXdvcmRPcklkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyBzb21ldGhpbmcgfVxuICAgICAgICAgIGNhblBhcnNlQXNLZXl3b3JkID0gZmFsc2U7XG4gICAgICAgICAgcmlnaHRPZkFzID0gaXNJbXBvcnRcbiAgICAgICAgICAgID8gdGhpcy5wYXJzZUlkZW50aWZpZXIoKVxuICAgICAgICAgICAgOiB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHsgdHlwZSBhcyB9XG4gICAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgICAgbGVmdE9mQXMgPSBmaXJzdEFzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgLy8geyB0eXBlIHNvbWV0aGluZyAuLi4/IH1cbiAgICAgICAgaGFzVHlwZVNwZWNpZmllciA9IHRydWU7XG4gICAgICAgIGlmIChpc0ltcG9ydCkge1xuICAgICAgICAgIGxlZnRPZkFzID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgICAgICAgICAgICBsZWZ0T2ZBcy5uYW1lLFxuICAgICAgICAgICAgICBsZWZ0T2ZBcy5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWZ0T2ZBcyA9IHRoaXMucGFyc2VNb2R1bGVFeHBvcnROYW1lKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChoYXNUeXBlU3BlY2lmaWVyICYmIGlzSW5UeXBlT25seUltcG9ydEV4cG9ydCkge1xuICAgICAgICB0aGlzLnJhaXNlKFxuICAgICAgICAgIGlzSW1wb3J0XG4gICAgICAgICAgICA/IFRTRXJyb3JzLlR5cGVNb2RpZmllcklzVXNlZEluVHlwZUltcG9ydHNcbiAgICAgICAgICAgIDogVFNFcnJvcnMuVHlwZU1vZGlmaWVySXNVc2VkSW5UeXBlRXhwb3J0cyxcbiAgICAgICAgICB7IGF0OiBsb2MgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbm9kZVtsZWZ0T2ZBc0tleV0gPSBsZWZ0T2ZBcztcbiAgICAgIG5vZGVbcmlnaHRPZkFzS2V5XSA9IHJpZ2h0T2ZBcztcblxuICAgICAgY29uc3Qga2luZEtleSA9IGlzSW1wb3J0ID8gXCJpbXBvcnRLaW5kXCIgOiBcImV4cG9ydEtpbmRcIjtcbiAgICAgIG5vZGVba2luZEtleV0gPSBoYXNUeXBlU3BlY2lmaWVyID8gXCJ0eXBlXCIgOiBcInZhbHVlXCI7XG5cbiAgICAgIGlmIChjYW5QYXJzZUFzS2V5d29yZCAmJiB0aGlzLmVhdENvbnRleHR1YWwodHQuX2FzKSkge1xuICAgICAgICBub2RlW3JpZ2h0T2ZBc0tleV0gPSBpc0ltcG9ydFxuICAgICAgICAgID8gdGhpcy5wYXJzZUlkZW50aWZpZXIoKVxuICAgICAgICAgIDogdGhpcy5wYXJzZU1vZHVsZUV4cG9ydE5hbWUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghbm9kZVtyaWdodE9mQXNLZXldKSB7XG4gICAgICAgIG5vZGVbcmlnaHRPZkFzS2V5XSA9IGNsb25lSWRlbnRpZmllcihub2RlW2xlZnRPZkFzS2V5XSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNJbXBvcnQpIHtcbiAgICAgICAgdGhpcy5jaGVja0lkZW50aWZpZXIoXG4gICAgICAgICAgbm9kZVtyaWdodE9mQXNLZXldLFxuICAgICAgICAgIGhhc1R5cGVTcGVjaWZpZXIgPyBCSU5EX1RTX1RZUEVfSU1QT1JUIDogQklORF9GTEFHU19UU19JTVBPUlQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG5mdW5jdGlvbiBpc1Bvc3NpYmx5TGl0ZXJhbEVudW0oZXhwcmVzc2lvbjogTi5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgIT09IFwiTWVtYmVyRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgeyBjb21wdXRlZCwgcHJvcGVydHkgfSA9IGV4cHJlc3Npb247XG5cbiAgaWYgKFxuICAgIGNvbXB1dGVkICYmXG4gICAgcHJvcGVydHkudHlwZSAhPT0gXCJTdHJpbmdMaXRlcmFsXCIgJiZcbiAgICAocHJvcGVydHkudHlwZSAhPT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiB8fCBwcm9wZXJ0eS5leHByZXNzaW9ucy5sZW5ndGggPiAwKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNVbmNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbkNoYWluKGV4cHJlc3Npb24ub2JqZWN0KTtcbn1cblxuLy8gSWYgYSBjb25zdCBkZWNsYXJhdGlvbiBoYXMgbm8gdHlwZSBhbm5vdGF0aW9uIGFuZCBpcyBpbml0aWFsaXplZCB0b1xuLy8gYSBzdHJpbmcgbGl0ZXJhbCwgbnVtZXJpYyBsaXRlcmFsLCBvciBlbnVtIHJlZmVyZW5jZSwgdGhlbiBpdCBpc1xuLy8gYWxsb3dlZC4gSW4gYW4gaWRlYWwgd29ybGQsIHdlJ2QgY2hlY2sgd2hldGhlciBpbml0IHdhcyAqYWN0dWFsbHkqIGFuXG4vLyBlbnVtIHJlZmVyZW5jZSwgYnV0IHdlIGFsbG93IGFueXRoaW5nIHRoYXQgXCJjb3VsZCBiZVwiIGEgbGl0ZXJhbCBlbnVtXG4vLyBpbiBgaXNQb3NzaWJseUxpdGVyYWxFbnVtYCBzaW5jZSB3ZSBkb24ndCBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb25cbi8vIHRoYXQgdGhlIHR5cGVzY3JpcHQgY29tcGlsZXIgaGFzLlxuZnVuY3Rpb24gaXNWYWxpZEFtYmllbnRDb25zdEluaXRpYWxpemVyKFxuICBleHByZXNzaW9uOiBOLkV4cHJlc3Npb24sXG4gIGVzdHJlZTogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7IHR5cGUgfSA9IGV4cHJlc3Npb247XG4gIGlmIChleHByZXNzaW9uLmV4dHJhPy5wYXJlbnRoZXNpemVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChlc3RyZWUpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJMaXRlcmFsXCIpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGV4cHJlc3Npb247XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlID09PSBcIlN0cmluZ0xpdGVyYWxcIiB8fCB0eXBlID09PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOdW1iZXIoZXhwcmVzc2lvbiwgZXN0cmVlKSB8fCBpc05lZ2F0aXZlTnVtYmVyKGV4cHJlc3Npb24sIGVzdHJlZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJUZW1wbGF0ZUxpdGVyYWxcIiAmJiBleHByZXNzaW9uLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc1Bvc3NpYmx5TGl0ZXJhbEVudW0oZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbiwgZXN0cmVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGlmIChlc3RyZWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgICAgKHR5cGVvZiBleHByZXNzaW9uLnZhbHVlID09PSBcIm51bWJlclwiIHx8IFwiYmlnaW50XCIgaW4gZXhwcmVzc2lvbilcbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgZXhwcmVzc2lvbi50eXBlID09PSBcIk51bWVyaWNMaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi50eXBlID09PSBcIkJpZ0ludExpdGVyYWxcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlTnVtYmVyKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbiwgZXN0cmVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCB7IG9wZXJhdG9yLCBhcmd1bWVudCB9ID0gZXhwcmVzc2lvbiBhcyBOLlVuYXJ5RXhwcmVzc2lvbjtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiLVwiICYmIGlzTnVtYmVyKGFyZ3VtZW50LCBlc3RyZWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1VuY29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uQ2hhaW4oZXhwcmVzc2lvbjogTi5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gIGlmIChleHByZXNzaW9uLnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGV4cHJlc3Npb24udHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5jb21wdXRlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpc1VuY29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uQ2hhaW4oZXhwcmVzc2lvbi5vYmplY3QpO1xufVxuIiwgImltcG9ydCAqIGFzIGNoYXJDb2RlcyBmcm9tIFwiY2hhcmNvZGVzXCI7XG5cbmltcG9ydCB7IHRva2VuTGFiZWxOYW1lLCB0dCB9IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi4vcGFyc2VyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQYXJzZUVycm9yRW51bSB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBVbmRvbmUgfSBmcm9tIFwiLi4vcGFyc2VyL25vZGVcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi9wYXJzZXIvdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVHlwZXMgfSBmcm9tIFwiLi4vdXRpbC9zY29wZWZsYWdzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcblxudHlwZSBQb3NzaWJsZVBsYWNlaG9sZGVycyA9IHtcbiAgSWRlbnRpZmllcjogTi5JZGVudGlmaWVyO1xuICBTdHJpbmdMaXRlcmFsOiBOLlN0cmluZ0xpdGVyYWw7XG4gIEV4cHJlc3Npb246IE4uRXhwcmVzc2lvbjtcbiAgU3RhdGVtZW50OiBOLlN0YXRlbWVudDtcbiAgRGVjbGFyYXRpb246IE4uRGVjbGFyYXRpb247XG4gIEJsb2NrU3RhdGVtZW50OiBOLkJsb2NrU3RhdGVtZW50O1xuICBDbGFzc0JvZHk6IE4uQ2xhc3NCb2R5O1xuICBQYXR0ZXJuOiBOLlBhdHRlcm47XG59O1xuZXhwb3J0IHR5cGUgUGxhY2Vob2xkZXJUeXBlcyA9IGtleW9mIFBvc3NpYmxlUGxhY2Vob2xkZXJzO1xuXG50eXBlIE5vZGVPZjxUIGV4dGVuZHMga2V5b2YgUG9zc2libGVQbGFjZWhvbGRlcnM+ID0gUG9zc2libGVQbGFjZWhvbGRlcnNbVF07XG4vLyB0b2RvOiB3aGVuIHRoZXJlICBpcyBwcm9wZXIgdW5pb24gdHlwZSBmb3IgTm9kZVxuLy8gdHlwZSBOb2RlT2Y8VCBleHRlbmRzIFBsYWNlaG9sZGVyVHlwZXM+ID0gRXh0cmFjdDxOLk5vZGUsIHsgdHlwZTogVCB9PjtcblxuLy8gdG9kbzogUGxhY2Vob2xkZXI8VD4gYnJlYWtzIGV2ZXJ5dGhpbmcsIGJlY2F1c2UgaXRzIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGhcbi8vIHRoZSBzdWJzdGl0dXRlZCBub2Rlcy5cbnR5cGUgTWF5YmVQbGFjZWhvbGRlcjxUIGV4dGVuZHMgUGxhY2Vob2xkZXJUeXBlcz4gPSBOb2RlT2Y8VD47IC8vIHwgUGxhY2Vob2xkZXI8VD5cblxuLyogZXNsaW50IHNvcnQta2V5czogXCJlcnJvclwiICovXG5jb25zdCBQbGFjZWhvbGRlckVycm9ycyA9IFBhcnNlRXJyb3JFbnVtYHBsYWNlaG9sZGVyc2Aoe1xuICBDbGFzc05hbWVJc1JlcXVpcmVkOiBcIkEgY2xhc3MgbmFtZSBpcyByZXF1aXJlZC5cIixcbiAgVW5leHBlY3RlZFNwYWNlOiBcIlVuZXhwZWN0ZWQgc3BhY2UgaW4gcGxhY2Vob2xkZXIuXCIsXG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgc29ydC1rZXlzICovXG5cbmV4cG9ydCBkZWZhdWx0IChzdXBlckNsYXNzOiB0eXBlb2YgUGFyc2VyKSA9PlxuICBjbGFzcyBQbGFjZWhvbGRlcnNQYXJzZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIHBhcnNlUGxhY2Vob2xkZXI8VCBleHRlbmRzIFBsYWNlaG9sZGVyVHlwZXM+KFxuICAgICAgZXhwZWN0ZWROb2RlOiBULFxuICAgICk6IC8qP04uUGxhY2Vob2xkZXI8VD4qLyBNYXliZVBsYWNlaG9sZGVyPFQ+IHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5wbGFjZWhvbGRlcikpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLmFzc2VydE5vU3BhY2UoKTtcblxuICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhpcy5wYXJzZUlkZW50aWZpZXIgYmVjYXVzZVxuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IG5lc3RlZCBwbGFjZWhvbGRlcnMuXG4gICAgICAgIG5vZGUubmFtZSA9IHN1cGVyLnBhcnNlSWRlbnRpZmllcigvKiBsaWJlcmFsICovIHRydWUpO1xuXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm9TcGFjZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wbGFjZWhvbGRlcik7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGxhY2Vob2xkZXIgdHlwaW5nc1xuICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hQbGFjZWhvbGRlcihub2RlLCBleHBlY3RlZE5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbmlzaFBsYWNlaG9sZGVyPFQgZXh0ZW5kcyBQbGFjZWhvbGRlclR5cGVzPihcbiAgICAgIG5vZGU6IE4uTm9kZSxcbiAgICAgIGV4cGVjdGVkTm9kZTogVCxcbiAgICApOiAvKk4uUGxhY2Vob2xkZXI8VD4qLyBNYXliZVBsYWNlaG9sZGVyPFQ+IHtcbiAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSAhIShub2RlLmV4cGVjdGVkTm9kZSAmJiBub2RlLnR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIik7XG4gICAgICBub2RlLmV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZTtcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgcmV0dXJuIGlzRmluaXNoZWQgPyBub2RlIDogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUGxhY2Vob2xkZXJcIik7XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiB0b2tlbml6ZXIvaW5kZXguanMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgZ2V0VG9rZW5Gcm9tQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29kZSA9PT0gY2hhckNvZGVzLnBlcmNlbnRTaWduICYmXG4gICAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnN0YXRlLnBvcyArIDEpID09PSBjaGFyQ29kZXMucGVyY2VudFNpZ25cbiAgICAgICkge1xuICAgICAgICB0aGlzLmZpbmlzaE9wKHR0LnBsYWNlaG9sZGVyLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLmdldFRva2VuRnJvbUNvZGUoY29kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvZXhwcmVzc2lvbi5qcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgcGFyc2VFeHByQXRvbShcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiRXhwcmVzc2lvblwiPiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJFeHByZXNzaW9uXCIpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlRXhwckF0b20ocmVmRXhwcmVzc2lvbkVycm9ycylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VJZGVudGlmaWVyKGxpYmVyYWw/OiBib29sZWFuKTogTWF5YmVQbGFjZWhvbGRlcjxcIklkZW50aWZpZXJcIj4ge1xuICAgICAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGhhbmRsZXMgaWRlbnRpZmllcnMgb3V0c2lkZSBvZlxuICAgICAgLy8gZXhwcmVzc2lvbnMgYW5kIGJpbmRpbmcgcGF0dGVybnMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHlcbiAgICAgIC8vIGhhbmRsZWQgYnkgdGhlIHBhcnNlRXhwckF0b20gYW5kIHBhcnNlQmluZGluZ0F0b20gZnVuY3Rpb25zLlxuICAgICAgLy8gVGhpcyBpcyBuZWVkZWQsIGZvciBleGFtcGxlLCB0byBwYXJzZSBcImNsYXNzICUlTkFNRSUlIHt9XCIuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpIHx8IHN1cGVyLnBhcnNlSWRlbnRpZmllcihsaWJlcmFsKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjaGVja1Jlc2VydmVkV29yZChcbiAgICAgIHdvcmQ6IHN0cmluZyxcbiAgICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICAgIGNoZWNrS2V5d29yZHM6IGJvb2xlYW4sXG4gICAgICBpc0JpbmRpbmc6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICAvLyBTb21ldGltZXMgd2UgY2FsbCAjY2hlY2tSZXNlcnZlZFdvcmQobm9kZS5uYW1lKSwgZXhwZWN0aW5nXG4gICAgICAvLyB0aGF0IG5vZGUgaXMgYW4gSWRlbnRpZmllci4gSWYgaXQgaXMgYSBQbGFjZWhvbGRlciwgbmFtZVxuICAgICAgLy8gd2lsbCBiZSB1bmRlZmluZWQuXG4gICAgICBpZiAod29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cGVyLmNoZWNrUmVzZXJ2ZWRXb3JkKHdvcmQsIHN0YXJ0TG9jLCBjaGVja0tleXdvcmRzLCBpc0JpbmRpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqXG4gICAgICogcGFyc2VyL2x2YWwuanMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAgIHBhcnNlQmluZGluZ0F0b20oKTogTWF5YmVQbGFjZWhvbGRlcjxcIlBhdHRlcm5cIj4ge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIlBhdHRlcm5cIikgfHwgc3VwZXIucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIH1cblxuICAgIGlzVmFsaWRMVmFsKHR5cGU6IHN0cmluZywgaXNQYXJlbnRoZXNpemVkOiBib29sZWFuLCBiaW5kaW5nOiBCaW5kaW5nVHlwZXMpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIiB8fFxuICAgICAgICBzdXBlci5pc1ZhbGlkTFZhbCh0eXBlLCBpc1BhcmVudGhlc2l6ZWQsIGJpbmRpbmcpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRvQXNzaWduYWJsZShub2RlOiBOLk5vZGUsIGlzTEhTOiBib29sZWFuKTogdm9pZCB7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS50eXBlID09PSBcIlBsYWNlaG9sZGVyXCIgJiZcbiAgICAgICAgbm9kZS5leHBlY3RlZE5vZGUgPT09IFwiRXhwcmVzc2lvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5leHBlY3RlZE5vZGUgPSBcIlBhdHRlcm5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLnRvQXNzaWduYWJsZShub2RlLCBpc0xIUyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvc3RhdGVtZW50LmpzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihjaDogbnVtYmVyLCBwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgaWYgKHN1cGVyLmNoU3RhcnRzQmluZGluZ0lkZW50aWZpZXIoY2gsIHBvcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFjY2VwdCBcImxldCAlJVwiIGFzIHRoZSBzdGFydCBvZiBcImxldCAlJXBsYWNlaG9sZGVyJSVcIiwgYXMgdGhvdWdoIHRoZVxuICAgICAgLy8gcGxhY2Vob2xkZXIgd2VyZSBhbiBpZGVudGlmaWVyLlxuICAgICAgY29uc3QgbmV4dFRva2VuID0gdGhpcy5sb29rYWhlYWQoKTtcbiAgICAgIGlmIChuZXh0VG9rZW4udHlwZSA9PT0gdHQucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlCcmVha0NvbnRpbnVlKFxuICAgICAgbm9kZTogTi5CcmVha1N0YXRlbWVudCB8IE4uQ29udGludWVTdGF0ZW1lbnQsXG4gICAgICBpc0JyZWFrOiBib29sZWFuLFxuICAgICkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogbm9kZS5sYWJlbCBjb3VsZCBiZSBQbGFjZWhvbGRlclxuICAgICAgaWYgKG5vZGUubGFiZWwgJiYgbm9kZS5sYWJlbC50eXBlID09PSBcIlBsYWNlaG9sZGVyXCIpIHJldHVybjtcbiAgICAgIHN1cGVyLnZlcmlmeUJyZWFrQ29udGludWUobm9kZSwgaXNCcmVhayk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBQbHVnaW4gd2lsbCBvdmVycmlkZSBwYXJzZXIgaW50ZXJmYWNlXG4gICAgcGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgbm9kZTogTWF5YmVQbGFjZWhvbGRlcjxcIlN0YXRlbWVudFwiPixcbiAgICAgIGV4cHI6IE4uRXhwcmVzc2lvbixcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiU3RhdGVtZW50XCI+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXhwci50eXBlICE9PSBcIlBsYWNlaG9sZGVyXCIgfHxcbiAgICAgICAgKGV4cHIuZXh0cmEgJiYgZXhwci5leHRyYS5wYXJlbnRoZXNpemVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGxhY2Vob2xkZXIgdHlwaW5nc1xuICAgICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIGV4cHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5jb2xvbikpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwbGFjZWhvbGRlciB0eXBpbmdzXG4gICAgICAgIGNvbnN0IHN0bXQ6IE4uTGFiZWxlZFN0YXRlbWVudCA9IG5vZGU7XG4gICAgICAgIHN0bXQubGFiZWwgPSB0aGlzLmZpbmlzaFBsYWNlaG9sZGVyKGV4cHIsIFwiSWRlbnRpZmllclwiKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHN0bXQuYm9keSA9IHN1cGVyLnBhcnNlU3RhdGVtZW50T3JTbG9wcHlBbm5leEJGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoc3RtdCwgXCJMYWJlbGVkU3RhdGVtZW50XCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgICAgbm9kZS5uYW1lID0gZXhwci5uYW1lO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoUGxhY2Vob2xkZXIobm9kZSwgXCJTdGF0ZW1lbnRcIik7XG4gICAgfVxuXG4gICAgcGFyc2VCbG9jayhcbiAgICAgIGFsbG93RGlyZWN0aXZlcz86IGJvb2xlYW4sXG4gICAgICBjcmVhdGVOZXdMZXhpY2FsU2NvcGU/OiBib29sZWFuLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlPzogKGhhc1N0cmljdE1vZGVEaXJlY3RpdmU6IGJvb2xlYW4pID0+IHZvaWQsXG4gICAgKTogTWF5YmVQbGFjZWhvbGRlcjxcIkJsb2NrU3RhdGVtZW50XCI+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkJsb2NrU3RhdGVtZW50XCIpIHx8XG4gICAgICAgIHN1cGVyLnBhcnNlQmxvY2soXG4gICAgICAgICAgYWxsb3dEaXJlY3RpdmVzLFxuICAgICAgICAgIGNyZWF0ZU5ld0xleGljYWxTY29wZSxcbiAgICAgICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VGdW5jdGlvbklkKFxuICAgICAgcmVxdWlyZUlkPzogYm9vbGVhbixcbiAgICApOiBNYXliZVBsYWNlaG9sZGVyPFwiSWRlbnRpZmllclwiPiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKSB8fCBzdXBlci5wYXJzZUZ1bmN0aW9uSWQocmVxdWlyZUlkKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBQbHVnaW4gd2lsbCBvdmVycmlkZSBwYXJzZXIgaW50ZXJmYWNlXG4gICAgcGFyc2VDbGFzczxUIGV4dGVuZHMgTi5DbGFzcz4oXG4gICAgICBub2RlOiBULFxuICAgICAgaXNTdGF0ZW1lbnQ6IC8qIFQgPT09IENsYXNzRGVjbGFyYXRpb24gKi8gYm9vbGVhbixcbiAgICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICAgICk6IFQge1xuICAgICAgY29uc3QgdHlwZSA9IGlzU3RhdGVtZW50ID8gXCJDbGFzc0RlY2xhcmF0aW9uXCIgOiBcIkNsYXNzRXhwcmVzc2lvblwiO1xuXG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIklkZW50aWZpZXJcIik7XG4gICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWF0Y2godHQuX2V4dGVuZHMpIHx8XG4gICAgICAgICAgdGhpcy5tYXRjaCh0dC5wbGFjZWhvbGRlcikgfHxcbiAgICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNlTClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5pZCA9IHBsYWNlaG9sZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsSWQgfHwgIWlzU3RhdGVtZW50KSB7XG4gICAgICAgICAgbm9kZS5pZCA9IG51bGw7XG4gICAgICAgICAgbm9kZS5ib2R5ID0gdGhpcy5maW5pc2hQbGFjZWhvbGRlcihwbGFjZWhvbGRlciwgXCJDbGFzc0JvZHlcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKFBsYWNlaG9sZGVyRXJyb3JzLkNsYXNzTmFtZUlzUmVxdWlyZWQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhcnNlQ2xhc3NJZChub2RlLCBpc1N0YXRlbWVudCwgb3B0aW9uYWxJZCk7XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAgIG5vZGUuYm9keSA9XG4gICAgICAgIHRoaXMucGFyc2VQbGFjZWhvbGRlcihcIkNsYXNzQm9keVwiKSB8fFxuICAgICAgICBzdXBlci5wYXJzZUNsYXNzQm9keSghIW5vZGUuc3VwZXJDbGFzcywgb2xkU3RyaWN0KTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgcGFyc2VFeHBvcnQobm9kZTogTi5Ob2RlLCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCk6IE4uQW55RXhwb3J0IHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiSWRlbnRpZmllclwiKTtcbiAgICAgIGlmICghcGxhY2Vob2xkZXIpIHJldHVybiBzdXBlci5wYXJzZUV4cG9ydChub2RlLCBkZWNvcmF0b3JzKTtcblxuICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fZnJvbSkgJiYgIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICAgIC8vIGV4cG9ydCAlJURFQ0wlJTtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IHRoaXMuZmluaXNoUGxhY2Vob2xkZXIocGxhY2Vob2xkZXIsIFwiRGVjbGFyYXRpb25cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBleHBvcnQgJSVOQU1FJSUgZnJvbSBcImZvb1wiO1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBvcnREZWZhdWx0RnJvbVwiKTtcbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSBwbGFjZWhvbGRlcjtcbiAgICAgIG5vZGUuc3BlY2lmaWVycyA9IFt0aGlzLmZpbmlzaE5vZGUoc3BlY2lmaWVyLCBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIildO1xuXG4gICAgICByZXR1cm4gc3VwZXIucGFyc2VFeHBvcnQobm9kZSwgZGVjb3JhdG9ycyk7XG4gICAgfVxuXG4gICAgaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQuX2RlZmF1bHQpKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgICAgIGlmICh0aGlzLmlzVW5wYXJzZWRDb250ZXh0dWFsKG5leHQsIFwiZnJvbVwiKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuc3RhcnRzV2l0aChcbiAgICAgICAgICAgICAgdG9rZW5MYWJlbE5hbWUodHQucGxhY2Vob2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlblN0YXJ0U2luY2UobmV4dCArIDQpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCk7XG4gICAgfVxuXG4gICAgbWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICBub2RlOiBVbmRvbmU8XG4gICAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgICAgfCBOLkV4cG9ydEFsbERlY2xhcmF0aW9uXG4gICAgICAgIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uXG4gICAgICA+LFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgICApOiBub2RlIGlzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+IHtcbiAgICAgIGlmICgobm9kZSBhcyBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24pLnNwZWNpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBcImV4cG9ydCAlJU5BTUUlJVwiIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkIGJ5ICNwYXJzZUV4cG9ydC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIubWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNoZWNrRXhwb3J0KG5vZGU6IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbik6IHZvaWQge1xuICAgICAgY29uc3QgeyBzcGVjaWZpZXJzIH0gPSBub2RlO1xuICAgICAgaWYgKHNwZWNpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICBub2RlLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmZpbHRlcihcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBsYWNlaG9sZGVyIHR5cGluZ3NcbiAgICAgICAgICBub2RlID0+IG5vZGUuZXhwb3J0ZWQudHlwZSA9PT0gXCJQbGFjZWhvbGRlclwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3VwZXIuY2hlY2tFeHBvcnQobm9kZSk7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzO1xuICAgIH1cblxuICAgIHBhcnNlSW1wb3J0KFxuICAgICAgbm9kZTogVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgICk6IE4uSW1wb3J0RGVjbGFyYXRpb24gfCBOLlRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnBhcnNlUGxhY2Vob2xkZXIoXCJJZGVudGlmaWVyXCIpO1xuICAgICAgaWYgKCFwbGFjZWhvbGRlcikgcmV0dXJuIHN1cGVyLnBhcnNlSW1wb3J0KG5vZGUpO1xuXG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBbXTtcblxuICAgICAgaWYgKCF0aGlzLmlzQ29udGV4dHVhbCh0dC5fZnJvbSkgJiYgIXRoaXMubWF0Y2godHQuY29tbWEpKSB7XG4gICAgICAgIC8vIGltcG9ydCAlJVNUUklORyUlO1xuICAgICAgICBub2RlLnNvdXJjZSA9IHRoaXMuZmluaXNoUGxhY2Vob2xkZXIocGxhY2Vob2xkZXIsIFwiU3RyaW5nTGl0ZXJhbFwiKTtcbiAgICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydERlY2xhcmF0aW9uXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBpbXBvcnQgJSVERUZBVUxUJSUgLi4uXG4gICAgICBjb25zdCBzcGVjaWZpZXIgPVxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KHBsYWNlaG9sZGVyKTtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IHBsYWNlaG9sZGVyO1xuICAgICAgbm9kZS5zcGVjaWZpZXJzLnB1c2goXG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmVhdCh0dC5jb21tYSkpIHtcbiAgICAgICAgLy8gaW1wb3J0ICUlREVGQVVMVCUlLCAqIGFzIC4uLlxuICAgICAgICBjb25zdCBoYXNTdGFySW1wb3J0ID0gdGhpcy5tYXliZVBhcnNlU3RhckltcG9ydFNwZWNpZmllcihub2RlKTtcblxuICAgICAgICAvLyBpbXBvcnQgJSVERUZBVUxUJSUsIHsgLi4uXG4gICAgICAgIGlmICghaGFzU3RhckltcG9ydCkgdGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9mcm9tKTtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnREZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBwYXJzZUltcG9ydFNvdXJjZSgpOiBNYXliZVBsYWNlaG9sZGVyPFwiU3RyaW5nTGl0ZXJhbFwiPiB7XG4gICAgICAvLyBpbXBvcnQgLi4uIGZyb20gJSVTVFJJTkclJTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVBsYWNlaG9sZGVyKFwiU3RyaW5nTGl0ZXJhbFwiKSB8fCBzdXBlci5wYXJzZUltcG9ydFNvdXJjZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRocm93cyBpZiB0aGUgY3VycmVudCB0b2tlbiBhbmQgdGhlIHByZXYgb25lIGFyZSBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAgICBhc3NlcnROb1NwYWNlKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc3RhdGUuc3RhcnQgPiB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MuaW5kZXgpIHtcbiAgICAgICAgdGhpcy5yYWlzZShQbGFjZWhvbGRlckVycm9ycy5VbmV4cGVjdGVkU3BhY2UsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuLi9wYXJzZXJcIjtcbmltcG9ydCB7IHRva2VuSXNJZGVudGlmaWVyLCB0dCB9IGZyb20gXCIuLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuLi9wYXJzZXIvdXRpbFwiO1xuXG5leHBvcnQgZGVmYXVsdCAoc3VwZXJDbGFzczogdHlwZW9mIFBhcnNlcikgPT5cbiAgY2xhc3MgVjhJbnRyaW5zaWNNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBQYXJzZXIge1xuICAgIHBhcnNlVjhJbnRyaW5zaWMoKTogTi5FeHByZXNzaW9uIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Lm1vZHVsbykpIHtcbiAgICAgICAgY29uc3QgdjhJbnRyaW5zaWNTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIC8vIGxldCB0aGUgYGxvY2Agb2YgSWRlbnRpZmllciBzdGFydHMgZnJvbSBgJWBcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uSWRlbnRpZmllcj4oKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnJSdcbiAgICAgICAgaWYgKHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihub2RlLCBuYW1lKTtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBhdm9pZCBtdXRhdGluZyBBU1QgdHlwZXNcbiAgICAgICAgICBpZGVudGlmaWVyLnR5cGUgPSBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQodjhJbnRyaW5zaWNTdGFydExvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICpcbiAgICAgKiBwYXJzZXIvZXhwcmVzc2lvbi5qcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gICAgcGFyc2VFeHByQXRvbShyZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwpOiBOLkV4cHJlc3Npb24ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wYXJzZVY4SW50cmluc2ljKCkgfHwgc3VwZXIucGFyc2VFeHByQXRvbShyZWZFeHByZXNzaW9uRXJyb3JzKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHR5cGUgUGFyc2VyIGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZXJQbHVnaW5XaXRoT3B0aW9ucyxcbiAgUGx1Z2luQ29uZmlnLFxuICBQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi90eXBpbmdzXCI7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbiA9IFBsdWdpbkNvbmZpZztcblxuZXhwb3J0IHR5cGUgUGx1Z2luTGlzdCA9IFBsdWdpbkNvbmZpZ1tdO1xuXG5leHBvcnQgdHlwZSBNaXhpblBsdWdpbiA9IChzdXBlckNsYXNzOiB7IG5ldyAoLi4uYXJnczogYW55KTogUGFyc2VyIH0pID0+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnkpOiBQYXJzZXI7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uXHUyMDE5cyBzZWNvbmQgcGFyYW1ldGVyIGFjY2VwdHMgZWl0aGVyIGEgc3RyaW5nIChwbHVnaW4gbmFtZSkgb3IgYW5cbi8vIGFycmF5IHBhaXIgKHBsdWdpbiBuYW1lIGFuZCBvcHRpb25zIG9iamVjdCkuIElmIGFuIG9wdGlvbnMgb2JqZWN0IGlzIGdpdmVuLFxuLy8gdGhlbiBlYWNoIHZhbHVlIGlzIG5vbi1yZWN1cnNpdmVseSBjaGVja2VkIGZvciBpZGVudGl0eSB3aXRoIHRoZSBhY3R1YWxcbi8vIG9wdGlvbiB2YWx1ZSBvZiBlYWNoIHBsdWdpbiBpbiB0aGUgZmlyc3QgYXJndW1lbnQgKHdoaWNoIGlzIGFuIGFycmF5IG9mXG4vLyBwbHVnaW4gbmFtZXMgb3IgYXJyYXkgcGFpcnMpLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BsdWdpbihcbiAgcGx1Z2luczogUGx1Z2luTGlzdCxcbiAgZXhwZWN0ZWRDb25maWc6IFBsdWdpbkNvbmZpZyxcbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgZXhwZWN0ZWRPcHRpb25zIG9iamVjdCBpcyBieSBkZWZhdWx0IGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgZ2l2ZW5cbiAgLy8gZXhwZWN0ZWRDb25maWcgYXJndW1lbnQgZG9lcyBub3QgZ2l2ZSBhbiBvcHRpb25zIG9iamVjdCAoaS5lLiwgaWYgaXQgaXMgYVxuICAvLyBzdHJpbmcpLlxuICBjb25zdCBbZXhwZWN0ZWROYW1lLCBleHBlY3RlZE9wdGlvbnNdID1cbiAgICB0eXBlb2YgZXhwZWN0ZWRDb25maWcgPT09IFwic3RyaW5nXCIgPyBbZXhwZWN0ZWRDb25maWcsIHt9XSA6IGV4cGVjdGVkQ29uZmlnO1xuXG4gIGNvbnN0IGV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdGVkT3B0aW9ucyk7XG5cbiAgY29uc3QgZXhwZWN0ZWRPcHRpb25zSXNFbXB0eSA9IGV4cGVjdGVkS2V5cy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHBsdWdpbnMuc29tZShwID0+IHtcbiAgICBpZiAodHlwZW9mIHAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZE9wdGlvbnNJc0VtcHR5ICYmIHAgPT09IGV4cGVjdGVkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gcDtcbiAgICAgIGlmIChwbHVnaW5OYW1lICE9PSBleHBlY3RlZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXhwZWN0ZWRLZXlzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG1heSBub3QgZXhpc3QgaW4gcGx1Z2luIG9wdGlvbnNcbiAgICAgICAgaWYgKHBsdWdpbk9wdGlvbnNba2V5XSAhPT0gZXhwZWN0ZWRPcHRpb25zW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbHVnaW5PcHRpb248XG4gIFBsdWdpbk5hbWUgZXh0ZW5kcyBQYXJzZXJQbHVnaW5XaXRoT3B0aW9uc1swXSxcbiAgT3B0aW9uTmFtZSBleHRlbmRzIGtleW9mIFBsdWdpbk9wdGlvbnM8UGx1Z2luTmFtZT4sXG4+KHBsdWdpbnM6IFBsdWdpbkxpc3QsIG5hbWU6IFBsdWdpbk5hbWUsIG9wdGlvbjogT3B0aW9uTmFtZSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQocGx1Z2luID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW4pKSB7XG4gICAgICByZXR1cm4gcGx1Z2luWzBdID09PSBuYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGx1Z2luID09PSBuYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHBsdWdpbiAmJiBBcnJheS5pc0FycmF5KHBsdWdpbikgJiYgcGx1Z2luLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gKHBsdWdpblsxXSBhcyBQbHVnaW5PcHRpb25zPFBsdWdpbk5hbWU+KVtvcHRpb25dO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IFBJUEVMSU5FX1BST1BPU0FMUyA9IFtcIm1pbmltYWxcIiwgXCJmc2hhcnBcIiwgXCJoYWNrXCIsIFwic21hcnRcIl07XG5jb25zdCBUT1BJQ19UT0tFTlMgPSBbXCJeXlwiLCBcIkBAXCIsIFwiXlwiLCBcIiVcIiwgXCIjXCJdO1xuY29uc3QgUkVDT1JEX0FORF9UVVBMRV9TWU5UQVhfVFlQRVMgPSBbXCJoYXNoXCIsIFwiYmFyXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbkxpc3QpIHtcbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcImRlY29yYXRvcnNcIikpIHtcbiAgICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwiZGVjb3JhdG9ycy1sZWdhY3lcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXNlIHRoZSBkZWNvcmF0b3JzIGFuZCBkZWNvcmF0b3JzLWxlZ2FjeSBwbHVnaW4gdG9nZXRoZXJcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCA9IGdldFBsdWdpbk9wdGlvbihcbiAgICAgIHBsdWdpbnMsXG4gICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCAhPT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCInZGVjb3JhdG9yc0JlZm9yZUV4cG9ydCcgbXVzdCBiZSBhIGJvb2xlYW4sIGlmIHNwZWNpZmllZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dDYWxsUGFyZW50aGVzaXplZCA9IGdldFBsdWdpbk9wdGlvbihcbiAgICAgIHBsdWdpbnMsXG4gICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgIFwiYWxsb3dDYWxsUGFyZW50aGVzaXplZFwiLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgYWxsb3dDYWxsUGFyZW50aGVzaXplZCAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgYWxsb3dDYWxsUGFyZW50aGVzaXplZCAhPT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIidhbGxvd0NhbGxQYXJlbnRoZXNpemVkJyBtdXN0IGJlIGEgYm9vbGVhbi5cIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcImZsb3dcIikgJiYgaGFzUGx1Z2luKHBsdWdpbnMsIFwidHlwZXNjcmlwdFwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21iaW5lIGZsb3cgYW5kIHR5cGVzY3JpcHQgcGx1Z2lucy5cIik7XG4gIH1cblxuICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwicGxhY2Vob2xkZXJzXCIpICYmIGhhc1BsdWdpbihwbHVnaW5zLCBcInY4aW50cmluc2ljXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbWJpbmUgcGxhY2Vob2xkZXJzIGFuZCB2OGludHJpbnNpYyBwbHVnaW5zLlwiKTtcbiAgfVxuXG4gIGlmIChoYXNQbHVnaW4ocGx1Z2lucywgXCJwaXBlbGluZU9wZXJhdG9yXCIpKSB7XG4gICAgY29uc3QgcHJvcG9zYWwgPSBnZXRQbHVnaW5PcHRpb24ocGx1Z2lucywgXCJwaXBlbGluZU9wZXJhdG9yXCIsIFwicHJvcG9zYWxcIik7XG5cbiAgICBpZiAoIVBJUEVMSU5FX1BST1BPU0FMUy5pbmNsdWRlcyhwcm9wb3NhbCkpIHtcbiAgICAgIGNvbnN0IHByb3Bvc2FsTGlzdCA9IFBJUEVMSU5FX1BST1BPU0FMUy5tYXAocCA9PiBgXCIke3B9XCJgKS5qb2luKFwiLCBcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBcInBpcGVsaW5lT3BlcmF0b3JcIiByZXF1aXJlcyBcInByb3Bvc2FsXCIgb3B0aW9uIHdob3NlIHZhbHVlIG11c3QgYmUgb25lIG9mOiAke3Byb3Bvc2FsTGlzdH0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdHVwbGVTeW50YXhJc0hhc2ggPSBoYXNQbHVnaW4ocGx1Z2lucywgW1xuICAgICAgXCJyZWNvcmRBbmRUdXBsZVwiLFxuICAgICAgeyBzeW50YXhUeXBlOiBcImhhc2hcIiB9LFxuICAgIF0pO1xuXG4gICAgaWYgKHByb3Bvc2FsID09PSBcImhhY2tcIikge1xuICAgICAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcInBsYWNlaG9sZGVyc1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29tYmluZSBwbGFjZWhvbGRlcnMgcGx1Z2luIGFuZCBIYWNrLXN0eWxlIHBpcGVzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzUGx1Z2luKHBsdWdpbnMsIFwidjhpbnRyaW5zaWNcIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbWJpbmUgdjhpbnRyaW5zaWMgcGx1Z2luIGFuZCBIYWNrLXN0eWxlIHBpcGVzLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3BpY1Rva2VuID0gZ2V0UGx1Z2luT3B0aW9uKFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgXCJ0b3BpY1Rva2VuXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoIVRPUElDX1RPS0VOUy5pbmNsdWRlcyh0b3BpY1Rva2VuKSkge1xuICAgICAgICBjb25zdCB0b2tlbkxpc3QgPSBUT1BJQ19UT0tFTlMubWFwKHQgPT4gYFwiJHt0fVwiYCkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgXCJwaXBlbGluZU9wZXJhdG9yXCIgaW4gXCJwcm9wb3NhbFwiOiBcImhhY2tcIiBtb2RlIGFsc28gcmVxdWlyZXMgYSBcInRvcGljVG9rZW5cIiBvcHRpb24gd2hvc2UgdmFsdWUgbXVzdCBiZSBvbmUgb2Y6ICR7dG9rZW5MaXN0fS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9waWNUb2tlbiA9PT0gXCIjXCIgJiYgdHVwbGVTeW50YXhJc0hhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdQbHVnaW4gY29uZmxpY3QgYmV0d2VlbiBgW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcImhhY2tcIiwgdG9waWNUb2tlbjogXCIjXCIgfV1gIGFuZCBgW1wicmVjb3JkQW5kdHVwbGVcIiwgeyBzeW50YXhUeXBlOiBcImhhc2hcIn1dYC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcG9zYWwgPT09IFwic21hcnRcIiAmJiB0dXBsZVN5bnRheElzSGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGx1Z2luIGNvbmZsaWN0IGJldHdlZW4gYFtcInBpcGVsaW5lT3BlcmF0b3JcIiwgeyBwcm9wb3NhbDogXCJzbWFydFwiIH1dYCBhbmQgYFtcInJlY29yZEFuZHR1cGxlXCIsIHsgc3ludGF4VHlwZTogXCJoYXNoXCJ9XWAuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1BsdWdpbihwbHVnaW5zLCBcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBtb2R1bGVBdHRyaWJ1dGVzYCBoYXMgYmVlbiByZW1vdmVkIGluIEJhYmVsIDgsIHBsZWFzZSB1c2UgYGltcG9ydEF0dHJpYnV0ZXNgIHBhcnNlciBwbHVnaW4sIG9yIGBAYmFiZWwvcGx1Z2luLXN5bnRheC1pbXBvcnQtYXR0cmlidXRlc2AuXCIsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc1BsdWdpbihwbHVnaW5zLCBcImltcG9ydEFzc2VydGlvbnNcIikgfHxcbiAgICAgICAgaGFzUGx1Z2luKHBsdWdpbnMsIFwiaW1wb3J0QXR0cmlidXRlc1wiKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNhbm5vdCBjb21iaW5lIGltcG9ydEFzc2VydGlvbnMsIGltcG9ydEF0dHJpYnV0ZXMgYW5kIG1vZHVsZUF0dHJpYnV0ZXMgcGx1Z2lucy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vZHVsZUF0dHJpYnV0ZXNWZXJzaW9uUGx1Z2luT3B0aW9uID0gZ2V0UGx1Z2luT3B0aW9uKFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICBcIm1vZHVsZUF0dHJpYnV0ZXNcIixcbiAgICAgICAgXCJ2ZXJzaW9uXCIsXG4gICAgICApO1xuICAgICAgaWYgKG1vZHVsZUF0dHJpYnV0ZXNWZXJzaW9uUGx1Z2luT3B0aW9uICE9PSBcIm1heS0yMDIwXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiVGhlICdtb2R1bGVBdHRyaWJ1dGVzJyBwbHVnaW4gcmVxdWlyZXMgYSAndmVyc2lvbicgb3B0aW9uLFwiICtcbiAgICAgICAgICAgIFwiIHJlcHJlc2VudGluZyB0aGUgbGFzdCBwcm9wb3NhbCB1cGRhdGUuIEN1cnJlbnRseSwgdGhlXCIgK1xuICAgICAgICAgICAgXCIgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgJ21heS0yMDIwJy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIGhhc1BsdWdpbihwbHVnaW5zLCBcImltcG9ydEFzc2VydGlvbnNcIikgJiZcbiAgICBoYXNQbHVnaW4ocGx1Z2lucywgXCJpbXBvcnRBdHRyaWJ1dGVzXCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQ2Fubm90IGNvbWJpbmUgaW1wb3J0QXNzZXJ0aW9ucyBhbmQgaW1wb3J0QXR0cmlidXRlcyBwbHVnaW5zLlwiLFxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgaGFzUGx1Z2luKHBsdWdpbnMsIFwicmVjb3JkQW5kVHVwbGVcIikgJiZcbiAgICBnZXRQbHVnaW5PcHRpb24ocGx1Z2lucywgXCJyZWNvcmRBbmRUdXBsZVwiLCBcInN5bnRheFR5cGVcIikgIT0gbnVsbCAmJlxuICAgICFSRUNPUkRfQU5EX1RVUExFX1NZTlRBWF9UWVBFUy5pbmNsdWRlcyhcbiAgICAgIGdldFBsdWdpbk9wdGlvbihwbHVnaW5zLCBcInJlY29yZEFuZFR1cGxlXCIsIFwic3ludGF4VHlwZVwiKSxcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVGhlICdzeW50YXhUeXBlJyBvcHRpb24gb2YgdGhlICdyZWNvcmRBbmRUdXBsZScgcGx1Z2luIG11c3QgYmUgb25lIG9mOiBcIiArXG4gICAgICAgIFJFQ09SRF9BTkRfVFVQTEVfU1lOVEFYX1RZUEVTLm1hcChwID0+IGAnJHtwfSdgKS5qb2luKFwiLCBcIiksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBoYXNQbHVnaW4ocGx1Z2lucywgXCJhc3luY0RvRXhwcmVzc2lvbnNcIikgJiZcbiAgICAhaGFzUGx1Z2luKHBsdWdpbnMsIFwiZG9FeHByZXNzaW9uc1wiKVxuICApIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgIFwiJ2FzeW5jRG9FeHByZXNzaW9ucycgcmVxdWlyZXMgJ2RvRXhwcmVzc2lvbnMnLCBwbGVhc2UgYWRkICdkb0V4cHJlc3Npb25zJyB0byBwYXJzZXIgcGx1Z2lucy5cIixcbiAgICApO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc28gQGJhYmVsL2NvcmUgY2FuIHByb3ZpZGUgYmV0dGVyIGVycm9yIG1lc3NhZ2VcbiAgICBlcnJvci5taXNzaW5nUGx1Z2lucyA9IFwiZG9FeHByZXNzaW9uc1wiO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFRoZXNlIHBsdWdpbnMgYXJlIGRlZmluZWQgdXNpbmcgYSBtaXhpbiB3aGljaCBleHRlbmRzIHRoZSBwYXJzZXIgY2xhc3MuXG5cbmltcG9ydCBlc3RyZWUgZnJvbSBcIi4vcGx1Z2lucy9lc3RyZWVcIjtcbmltcG9ydCBmbG93IGZyb20gXCIuL3BsdWdpbnMvZmxvd1wiO1xuaW1wb3J0IGpzeCBmcm9tIFwiLi9wbHVnaW5zL2pzeFwiO1xuaW1wb3J0IHR5cGVzY3JpcHQgZnJvbSBcIi4vcGx1Z2lucy90eXBlc2NyaXB0XCI7XG5pbXBvcnQgcGxhY2Vob2xkZXJzIGZyb20gXCIuL3BsdWdpbnMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgdjhpbnRyaW5zaWMgZnJvbSBcIi4vcGx1Z2lucy92OGludHJpbnNpY1wiO1xuXG4vLyBOT1RFOiBvcmRlciBpcyBpbXBvcnRhbnQuIGVzdHJlZSBtdXN0IGNvbWUgZmlyc3Q7IHBsYWNlaG9sZGVycyBtdXN0IGNvbWUgbGFzdC5cbmV4cG9ydCBjb25zdCBtaXhpblBsdWdpbnMgPSB7XG4gIGVzdHJlZSxcbiAganN4LFxuICBmbG93LFxuICB0eXBlc2NyaXB0LFxuICB2OGludHJpbnNpYyxcbiAgcGxhY2Vob2xkZXJzLFxufTtcblxuZXhwb3J0IGNvbnN0IG1peGluUGx1Z2luTmFtZXMgPSBPYmplY3Qua2V5cyhtaXhpblBsdWdpbnMpIGFzIFJlYWRvbmx5QXJyYXk8XG4gIFwiZXN0cmVlXCIgfCBcImpzeFwiIHwgXCJmbG93XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwidjhpbnRyaW5zaWNcIiB8IFwicGxhY2Vob2xkZXJzXCJcbj47XG4iLCAiaW1wb3J0IHR5cGUgeyBQbHVnaW5MaXN0IH0gZnJvbSBcIi4vcGx1Z2luLXV0aWxzXCI7XG5cbi8vIEEgc2Vjb25kIG9wdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBmdXJ0aGVyIGNvbmZpZ3VyZVxuLy8gdGhlIHBhcnNlciBwcm9jZXNzLiBUaGVzZSBvcHRpb25zIGFyZSByZWNvZ25pemVkOlxuXG5leHBvcnQgdHlwZSBTb3VyY2VUeXBlID0gXCJzY3JpcHRcIiB8IFwibW9kdWxlXCIgfCBcInVuYW1iaWd1b3VzXCI7XG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIHNvdXJjZVR5cGU6IFNvdXJjZVR5cGU7XG4gIHNvdXJjZUZpbGVuYW1lPzogc3RyaW5nO1xuICBzdGFydENvbHVtbjogbnVtYmVyO1xuICBzdGFydExpbmU6IG51bWJlcjtcbiAgYWxsb3dBd2FpdE91dHNpZGVGdW5jdGlvbjogYm9vbGVhbjtcbiAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IGJvb2xlYW47XG4gIGFsbG93TmV3VGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOiBib29sZWFuO1xuICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IGJvb2xlYW47XG4gIGFsbG93U3VwZXJPdXRzaWRlTWV0aG9kOiBib29sZWFuO1xuICBhbGxvd1VuZGVjbGFyZWRFeHBvcnRzOiBib29sZWFuO1xuICBwbHVnaW5zOiBQbHVnaW5MaXN0O1xuICBzdHJpY3RNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgcmFuZ2VzOiBib29sZWFuO1xuICB0b2tlbnM6IGJvb2xlYW47XG4gIGNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uczogYm9vbGVhbjtcbiAgZXJyb3JSZWNvdmVyeTogYm9vbGVhbjtcbiAgYXR0YWNoQ29tbWVudDogYm9vbGVhbjtcbiAgYW5uZXhCOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAvLyBTb3VyY2UgdHlwZSAoXCJzY3JpcHRcIiBvciBcIm1vZHVsZVwiKSBmb3IgZGlmZmVyZW50IHNlbWFudGljc1xuICBzb3VyY2VUeXBlOiBcInNjcmlwdFwiLFxuICAvLyBTb3VyY2UgZmlsZW5hbWUuXG4gIHNvdXJjZUZpbGVuYW1lOiB1bmRlZmluZWQsXG4gIC8vIENvbHVtbiAoMC1iYXNlZCkgZnJvbSB3aGljaCB0byBzdGFydCBjb3VudGluZyBzb3VyY2UuIFVzZWZ1bCBmb3JcbiAgLy8gaW50ZWdyYXRpb24gd2l0aCBvdGhlciB0b29scy5cbiAgc3RhcnRDb2x1bW46IDAsXG4gIC8vIExpbmUgKDEtYmFzZWQpIGZyb20gd2hpY2ggdG8gc3RhcnQgY291bnRpbmcgc291cmNlLiBVc2VmdWwgZm9yXG4gIC8vIGludGVncmF0aW9uIHdpdGggb3RoZXIgdG9vbHMuXG4gIHN0YXJ0TGluZTogMSxcbiAgLy8gV2hlbiBlbmFibGVkLCBhd2FpdCBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gIC8vIGVycm9yLlxuICBhbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uOiBmYWxzZSxcbiAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gIC8vIGVycm9yLlxuICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgbmV3LnRhcmdldCBvdXRzaWRlIGEgZnVuY3Rpb24gb3IgY2xhc3MgaXMgbm90XG4gIC8vIGNvbnNpZGVyZWQgYW4gZXJyb3IuXG4gIGFsbG93TmV3VGFyZ2V0T3V0c2lkZUZ1bmN0aW9uOiBmYWxzZSxcbiAgLy8gV2hlbiBlbmFibGVkLCBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudHMgYXJlIG5vdCBjb25zdHJhaW5lZCB0b1xuICAvLyBhcHBlYXJpbmcgYXQgdGhlIHRvcCBvZiB0aGUgcHJvZ3JhbS5cbiAgYWxsb3dJbXBvcnRFeHBvcnRFdmVyeXdoZXJlOiBmYWxzZSxcbiAgLy8gVE9ET1xuICBhbGxvd1N1cGVyT3V0c2lkZU1ldGhvZDogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgZXhwb3J0IHN0YXRlbWVudHMgY2FuIHJlZmVyZW5jZSB1bmRlY2xhcmVkIHZhcmlhYmxlcy5cbiAgYWxsb3dVbmRlY2xhcmVkRXhwb3J0czogZmFsc2UsXG4gIC8vIEFuIGFycmF5IG9mIHBsdWdpbnMgdG8gZW5hYmxlXG4gIHBsdWdpbnM6IFtdLFxuICAvLyBUT0RPXG4gIHN0cmljdE1vZGU6IG51bGwsXG4gIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyAoZGlyZWN0bHkgb24gdGhlIG5vZGUsIHJhdGhlciB0aGFuXG4gIC8vIHRoZSBgbG9jYCBvYmplY3QsIHdoaWNoIGhvbGRzIGxpbmUvY29sdW1uIGRhdGEuIFRvIGFsc28gYWRkIGFcbiAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgLy8gZW5kXWAgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXJzLCBzZXQgdGhlIGByYW5nZXNgIG9wdGlvbiB0b1xuICAvLyBgdHJ1ZWAuXG4gIC8vXG4gIC8vIFtyYW5nZV06IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTY3OFxuICByYW5nZXM6IGZhbHNlLFxuICAvLyBBZGRzIGFsbCBwYXJzZWQgdG9rZW5zIHRvIGEgYHRva2Vuc2AgcHJvcGVydHkgb24gdGhlIGBGaWxlYCBub2RlXG4gIHRva2VuczogZmFsc2UsXG4gIC8vIFdoZXRoZXIgdG8gY3JlYXRlIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEFTVCBub2RlcyAoaWYgZmFsc2VcbiAgLy8gdGhlIHBhcnNlciBzZXRzIGV4dHJhLnBhcmVudGhlc2l6ZWQgb24gdGhlIGV4cHJlc3Npb24gbm9kZXMgaW5zdGVhZCkuXG4gIGNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uczogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgZXJyb3JzIGFyZSBhdHRhY2hlZCB0byB0aGUgQVNUIGluc3RlYWQgb2YgYmVpbmcgZGlyZWN0bHkgdGhyb3duLlxuICAvLyBTb21lIGVycm9ycyB3aWxsIHN0aWxsIHRocm93LCBiZWNhdXNlIEBiYWJlbC9wYXJzZXIgY2FuJ3QgYWx3YXlzIHJlY292ZXIuXG4gIGVycm9yUmVjb3Zlcnk6IGZhbHNlLFxuICAvLyBXaGVuIGVuYWJsZWQsIGNvbW1lbnRzIHdpbGwgYmUgYXR0YWNoZWQgdG8gYWRqYWNlbnQgQVNUIG5vZGVzIGFzIG9uZSBvZlxuICAvLyBgbGVhZGluZ0NvbW1lbnRzYCwgYHRyYWlsaW5nQ29tbWVudHNgIGFuZCBgaW5uZXJDb21tZW50c2AuIFRoZSBjb21tZW50IGF0dGFjaG1lbnRcbiAgLy8gaXMgdml0YWwgdG8gcHJlc2VydmUgY29tbWVudHMgYWZ0ZXIgdHJhbnNmb3JtLiBJZiB5b3UgZG9uJ3QgcHJpbnQgQVNUIGJhY2ssXG4gIC8vIGNvbnNpZGVyIHNldCB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIGZvciBwZXJmb3JtYW5jZVxuICBhdHRhY2hDb21tZW50OiB0cnVlLFxuICAvLyBXaGVuIGVuYWJsZWQsIHRoZSBwYXJzZXIgd2lsbCBzdXBwb3J0IEFubmV4IEIgc3ludGF4LlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFkZGl0aW9uYWwtZWNtYXNjcmlwdC1mZWF0dXJlcy1mb3Itd2ViLWJyb3dzZXJzXG4gIGFubmV4QjogdHJ1ZSxcbn07XG5cbi8vIEludGVycHJldCBhbmQgZGVmYXVsdCBhbiBvcHRpb25zIG9iamVjdFxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRzPzogT3B0aW9ucyB8IG51bGwpOiBPcHRpb25zIHtcbiAgaWYgKG9wdHMgJiYgb3B0cy5hbm5leEIgIT0gbnVsbCAmJiBvcHRzLmFubmV4QiAhPT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYGFubmV4QmAgb3B0aW9uIGNhbiBvbmx5IGJlIHNldCB0byBgZmFsc2VgLlwiKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhkZWZhdWx0T3B0aW9ucykpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtYXkgbm90IGV4aXN0IGluIG9wdHNcbiAgICBvcHRpb25zW2tleV0gPSBvcHRzICYmIG9wdHNba2V5XSAhPSBudWxsID8gb3B0c1trZXldIDogZGVmYXVsdE9wdGlvbnNba2V5XTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cbiIsICIvLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbFxuLy8gc3ludGFjdGljIGVsZW1lbnRzLCBhbmQgcmVjdXJzaXZlbHkgY2FsbGluZyB0aG9zZSwgZWFjaCBmdW5jdGlvblxuLy8gYWR2YW5jaW5nIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybmluZyBhbiBBU1Qgbm9kZS4gUHJlY2VkZW5jZVxuLy8gb2YgY29uc3RydWN0cyAoZm9yIGV4YW1wbGUsIHRoZSBmYWN0IHRoYXQgYCF4WzFdYCBtZWFucyBgISh4WzFdKWBcbi8vIGluc3RlYWQgb2YgYCgheClbMV1gIGlzIGhhbmRsZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2VyXG4vLyBmdW5jdGlvbiB0aGF0IHBhcnNlcyB1bmFyeSBwcmVmaXggb3BlcmF0b3JzIGlzIGNhbGxlZCBmaXJzdCwgYW5kXG4vLyBpbiB0dXJuIGNhbGxzIHRoZSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBgW11gIHN1YnNjcmlwdHMgXHUyMDE0IHRoYXRcbi8vIHdheSwgaXQnbGwgcmVjZWl2ZSB0aGUgbm9kZSBmb3IgYHhbMV1gIGFscmVhZHkgcGFyc2VkLCBhbmQgd3JhcHNcbi8vICp0aGF0KiBpbiB0aGUgdW5hcnkgb3BlcmF0b3Igbm9kZS5cbi8vXG4vLyBBY29ybiB1c2VzIGFuIFtvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNlcl1bb3BwXSB0byBoYW5kbGUgYmluYXJ5XG4vLyBvcGVyYXRvciBwcmVjZWRlbmNlLCBiZWNhdXNlIGl0IGlzIG11Y2ggbW9yZSBjb21wYWN0IHRoYW4gdXNpbmdcbi8vIHRoZSB0ZWNobmlxdWUgb3V0bGluZWQgYWJvdmUsIHdoaWNoIHVzZXMgZGlmZmVyZW50LCBuZXN0aW5nXG4vLyBmdW5jdGlvbnMgdG8gc3BlY2lmeSBwcmVjZWRlbmNlLCBmb3IgYWxsIG9mIHRoZSB0ZW4gYmluYXJ5XG4vLyBwcmVjZWRlbmNlIGxldmVscyB0aGF0IEphdmFTY3JpcHQgZGVmaW5lcy5cbi8vXG4vLyBbb3BwXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRvci1wcmVjZWRlbmNlX3BhcnNlclxuXG5pbXBvcnQge1xuICB0b2tlbkNhblN0YXJ0RXhwcmVzc2lvbixcbiAgdG9rZW5Jc0Fzc2lnbm1lbnQsXG4gIHRva2VuSXNJZGVudGlmaWVyLFxuICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcixcbiAgdG9rZW5Jc09wZXJhdG9yLFxuICB0b2tlbklzUG9zdGZpeCxcbiAgdG9rZW5Jc1ByZWZpeCxcbiAgdG9rZW5Jc1JpZ2h0QXNzb2NpYXRpdmUsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdG9rZW5LZXl3b3JkT3JJZGVudGlmaWVySXNLZXl3b3JkLFxuICB0b2tlbkxhYmVsTmFtZSxcbiAgdG9rZW5PcGVyYXRvclByZWNlZGVuY2UsXG4gIHR0LFxuICB0eXBlIFRva2VuVHlwZSxcbn0gZnJvbSBcIi4uL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBOIGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IExWYWxQYXJzZXIgZnJvbSBcIi4vbHZhbFwiO1xuaW1wb3J0IHtcbiAgaXNLZXl3b3JkLFxuICBpc1Jlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZFJlc2VydmVkV29yZCxcbiAgaXNJZGVudGlmaWVyU3RhcnQsXG4gIGNhbkJlUmVzZXJ2ZWRXb3JkLFxufSBmcm9tIFwiLi4vdXRpbC9pZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFBvc2l0aW9uLFxuICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQsXG59IGZyb20gXCIuLi91dGlsL2xvY2F0aW9uXCI7XG5pbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuaW1wb3J0IHtcbiAgQklORF9PVVRTSURFLFxuICBCSU5EX1ZBUixcbiAgU0NPUEVfQVJST1csXG4gIFNDT1BFX0NMQVNTLFxuICBTQ09QRV9ESVJFQ1RfU1VQRVIsXG4gIFNDT1BFX0ZVTkNUSU9OLFxuICBTQ09QRV9TVVBFUixcbn0gZnJvbSBcIi4uL3V0aWwvc2NvcGVmbGFnc1wiO1xuaW1wb3J0IHsgRXhwcmVzc2lvbkVycm9ycyB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7XG4gIFBBUkFNX0FXQUlULFxuICBQQVJBTV9JTixcbiAgUEFSQU1fUkVUVVJOLFxuICBmdW5jdGlvbkZsYWdzLFxufSBmcm9tIFwiLi4vdXRpbC9wcm9kdWN0aW9uLXBhcmFtZXRlclwiO1xuaW1wb3J0IHtcbiAgbmV3QXJyb3dIZWFkU2NvcGUsXG4gIG5ld0FzeW5jQXJyb3dTY29wZSxcbiAgbmV3RXhwcmVzc2lvblNjb3BlLFxufSBmcm9tIFwiLi4vdXRpbC9leHByZXNzaW9uLXNjb3BlXCI7XG5pbXBvcnQgeyBFcnJvcnMsIHR5cGUgUGFyc2VFcnJvciB9IGZyb20gXCIuLi9wYXJzZS1lcnJvclwiO1xuaW1wb3J0IHsgVW5wYXJlbnRoZXNpemVkUGlwZUJvZHlEZXNjcmlwdGlvbnMgfSBmcm9tIFwiLi4vcGFyc2UtZXJyb3IvcGlwZWxpbmUtb3BlcmF0b3ItZXJyb3JzXCI7XG5pbXBvcnQgeyBzZXRJbm5lckNvbW1lbnRzIH0gZnJvbSBcIi4vY29tbWVudHNcIjtcbmltcG9ydCB7IGNsb25lSWRlbnRpZmllciwgdHlwZSBVbmRvbmUgfSBmcm9tIFwiLi9ub2RlXCI7XG5pbXBvcnQgdHlwZSBQYXJzZXIgZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgeyBTb3VyY2VUeXBlIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvblBhcnNlciBleHRlbmRzIExWYWxQYXJzZXIge1xuICAvLyBGb3J3YXJkLWRlY2xhcmF0aW9uOiBkZWZpbmVkIGluIHN0YXRlbWVudC5qc1xuICBhYnN0cmFjdCBwYXJzZUJsb2NrKFxuICAgIGFsbG93RGlyZWN0aXZlcz86IGJvb2xlYW4sXG4gICAgY3JlYXRlTmV3TGV4aWNhbFNjb3BlPzogYm9vbGVhbixcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogTi5CbG9ja1N0YXRlbWVudDtcbiAgYWJzdHJhY3QgcGFyc2VDbGFzcyhcbiAgICBub2RlOiBOLkNsYXNzLFxuICAgIGlzU3RhdGVtZW50OiBib29sZWFuLFxuICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICApOiBOLkNsYXNzO1xuICBhYnN0cmFjdCBwYXJzZURlY29yYXRvcnMoYWxsb3dFeHBvcnQ/OiBib29sZWFuKTogdm9pZDtcbiAgYWJzdHJhY3QgcGFyc2VGdW5jdGlvbjxUIGV4dGVuZHMgTi5Ob3JtYWxGdW5jdGlvbj4oXG4gICAgbm9kZTogVCxcbiAgICBzdGF0ZW1lbnQ/OiBudW1iZXIsXG4gICAgYWxsb3dFeHByZXNzaW9uQm9keT86IGJvb2xlYW4sXG4gICAgaXNBc3luYz86IGJvb2xlYW4sXG4gICk6IFQ7XG4gIGFic3RyYWN0IHBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZTogTi5GdW5jdGlvbiwgaXNDb25zdHJ1Y3Rvcj86IGJvb2xlYW4pOiB2b2lkO1xuICBhYnN0cmFjdCBwYXJzZUJsb2NrT3JNb2R1bGVCbG9ja0JvZHkoXG4gICAgYm9keTogTi5TdGF0ZW1lbnRbXSxcbiAgICBkaXJlY3RpdmVzOiBOLkRpcmVjdGl2ZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogdm9pZDtcbiAgYWJzdHJhY3QgcGFyc2VQcm9ncmFtKFxuICAgIHByb2dyYW06IE4uUHJvZ3JhbSxcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBzb3VyY2VUeXBlPzogU291cmNlVHlwZSxcbiAgKTogTi5Qcm9ncmFtO1xuXG4gIC8vIEZvciBvYmplY3QgbGl0ZXJhbCwgY2hlY2sgaWYgcHJvcGVydHkgX19wcm90b19fIGhhcyBiZWVuIHVzZWQgbW9yZSB0aGFuIG9uY2UuXG4gIC8vIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50LCB0aGVuIF9fcHJvdG9fXyBtYXkgYXBwZWFyXG4gIC8vIG11bHRpcGxlIHRpbWVzLiBPdGhlcndpc2UsIF9fcHJvdG9fXyBpcyBhIGR1cGxpY2F0ZWQga2V5LlxuXG4gIC8vIEZvciByZWNvcmQgZXhwcmVzc2lvbiwgY2hlY2sgaWYgcHJvcGVydHkgX19wcm90b19fIGV4aXN0c1xuXG4gIGNoZWNrUHJvdG8oXG4gICAgcHJvcDogTi5PYmplY3RNZW1iZXIgfCBOLlNwcmVhZEVsZW1lbnQsXG4gICAgaXNSZWNvcmQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHByb3RvUmVmOiB7XG4gICAgICB1c2VkOiBib29sZWFuO1xuICAgIH0sXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBwcm9wLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8XG4gICAgICB0aGlzLmlzT2JqZWN0TWV0aG9kKHByb3ApIHx8XG4gICAgICBwcm9wLmNvbXB1dGVkIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHByb3AgbXVzdCBiZSBhbiBPYmplY3RQcm9wZXJ0eVxuICAgICAgcHJvcC5zaG9ydGhhbmRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBwcm9wLmtleTtcbiAgICAvLyBJdCBpcyBlaXRoZXIgYW4gSWRlbnRpZmllciBvciBhIFN0cmluZy9OdW1lcmljTGl0ZXJhbFxuICAgIGNvbnN0IG5hbWUgPSBrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgPyBrZXkubmFtZSA6IGtleS52YWx1ZTtcblxuICAgIGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiKSB7XG4gICAgICBpZiAoaXNSZWNvcmQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUmVjb3JkTm9Qcm90bywgeyBhdDoga2V5IH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvdG9SZWYudXNlZCkge1xuICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBmaXJzdCByZWRlZmluaXRpb24ncyBwb3NpdGlvbiwgb3RoZXJ3aXNlIGlnbm9yZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgYXJlIHBhcnNpbmcgYW1iaWd1b3VzIHBhdHRlcm5cbiAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9IGtleS5sb2Muc3RhcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZVByb3RvLCB7IGF0OiBrZXkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvdG9SZWYudXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2hvdWxkRXhpdERlc2NlbmRpbmcoZXhwcjogTi5FeHByZXNzaW9uLCBwb3RlbnRpYWxBcnJvd0F0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXhwci50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgJiYgZXhwci5zdGFydCA9PT0gcG90ZW50aWFsQXJyb3dBdFxuICAgICk7XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gcGFyc2UgYW4gRXhwcmVzc2lvbiBvbmx5XG4gIGdldEV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uICYgTi5QYXJzZXJPdXRwdXQge1xuICAgIHRoaXMuZW50ZXJJbml0aWFsU2NvcGVzKCk7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuZW9mKSkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuICAgIC8vIFVubGlrZSBwYXJzZVRvcExldmVsLCB3ZSBuZWVkIHRvIGRyYWluIHJlbWFpbmluZyBjb21tZW50U3RhY2tzXG4gICAgLy8gYmVjYXVzZSB0aGUgdG9wIGxldmVsIG5vZGUgaXMgX25vdF8gUHJvZ3JhbS5cbiAgICB0aGlzLmZpbmFsaXplUmVtYWluaW5nQ29tbWVudHMoKTtcbiAgICBleHByLmNvbW1lbnRzID0gdGhpcy5zdGF0ZS5jb21tZW50cztcbiAgICBleHByLmVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW5zKSB7XG4gICAgICBleHByLnRva2VucyA9IHRoaXMudG9rZW5zO1xuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeG1lOiByZWZpbmUgdHlwZXNcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8vICMjIyBFeHByZXNzaW9uIHBhcnNpbmdcblxuICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbiAgLy8gJ2F0b21pYycsIG5vbmRpdmlzaWJsZSBleHByZXNzaW9uIHR5cGVzIGF0IHRoZSBib3R0b20uIE1vc3Qgb2ZcbiAgLy8gdGhlIGZ1bmN0aW9ucyB3aWxsIHNpbXBseSBsZXQgdGhlIGZ1bmN0aW9uIChzKSBiZWxvdyB0aGVtIHBhcnNlLFxuICAvLyBhbmQsICppZiogdGhlIHN5bnRhY3RpYyBjb25zdHJ1Y3QgdGhleSBoYW5kbGUgaXMgcHJlc2VudCwgd3JhcFxuICAvLyB0aGUgQVNUIG5vZGUgdGhhdCB0aGUgaW5uZXIgcGFyc2VyIGdhdmUgdGhlbSBpbiBhbm90aGVyIG5vZGUuXG5cbiAgLy8gUGFyc2UgYSBmdWxsIGV4cHJlc3Npb24uXG4gIC8vIC0gYGRpc2FsbG93SW5gXG4gIC8vICAgaXMgdXNlZCB0byBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0aWFsaXphdGlvbiBleHByZXNzaW9ucylcbiAgLy8gICBXaGVuIGBkaXNhbGxvd0luYCBpcyB0cnVlLCB0aGUgcHJvZHVjdGlvbiBwYXJhbWV0ZXIgW0luXSBpcyBub3QgcHJlc2VudC5cblxuICAvLyAtIGByZWZFeHByZXNzaW9uRXJyb3JzIGBcbiAgLy8gICBwcm92aWRlcyByZWZlcmVuY2UgZm9yIHN0b3JpbmcgJz0nIG9wZXJhdG9yIGluc2lkZSBzaG9ydGhhbmRcbiAgLy8gICBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIGNvbnRleHRzIHdoZXJlIGJvdGggb2JqZWN0IGV4cHJlc3Npb25cbiAgLy8gICBhbmQgb2JqZWN0IHBhdHRlcm4gbWlnaHQgYXBwZWFyIChzbyBpdCdzIHBvc3NpYmxlIHRvIHJhaXNlXG4gIC8vICAgZGVsYXllZCBzeW50YXggZXJyb3IgYXQgY29ycmVjdCBwb3NpdGlvbikuXG5cbiAgcGFyc2VFeHByZXNzaW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBkaXNhbGxvd0luPzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAoZGlzYWxsb3dJbikge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWxsb3dJbkFuZCgoKSA9PlxuICAgICAgICB0aGlzLnBhcnNlRXhwcmVzc2lvbkJhc2UocmVmRXhwcmVzc2lvbkVycm9ycyksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxvd0luQW5kKCgpID0+IHRoaXMucGFyc2VFeHByZXNzaW9uQmFzZShyZWZFeHByZXNzaW9uRXJyb3JzKSk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1FeHByZXNzaW9uXG4gIHBhcnNlRXhwcmVzc2lvbkJhc2UoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgICAgbm9kZS5leHByZXNzaW9ucyA9IFtleHByXTtcbiAgICAgIHdoaWxlICh0aGlzLmVhdCh0dC5jb21tYSkpIHtcbiAgICAgICAgbm9kZS5leHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3Qobm9kZS5leHByZXNzaW9ucyk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU2VxdWVuY2VFeHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8vIFNldCBbfkluXSBwYXJhbWV0ZXIgZm9yIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICBwYXJzZU1heWJlQXNzaWduRGlzYWxsb3dJbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIGFmdGVyTGVmdFBhcnNlPzogRnVuY3Rpb24sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmRpc2FsbG93SW5BbmQoKCkgPT5cbiAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNldCBbK0luXSBwYXJhbWV0ZXIgZm9yIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICBwYXJzZU1heWJlQXNzaWduQWxsb3dJbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIGFmdGVyTGVmdFBhcnNlPzogRnVuY3Rpb24sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmFsbG93SW5BbmQoKCkgPT5cbiAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbihyZWZFeHByZXNzaW9uRXJyb3JzLCBhZnRlckxlZnRQYXJzZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBieVxuICAvLyB0aGUgdHlwZXNjcmlwdCBhbmQgZmxvdyBwbHVnaW5zLlxuICBzZXRPcHRpb25hbFBhcmFtZXRlcnNFcnJvcihcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICAgIHJlc3VsdEVycm9yPzogUGFyc2VFcnJvcjxhbnk+LFxuICApIHtcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzLm9wdGlvbmFsUGFyYW1ldGVyc0xvYyA9XG4gICAgICByZXN1bHRFcnJvcj8ubG9jID8/IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uIFRoaXMgaW5jbHVkZXMgYXBwbGljYXRpb25zIG9mXG4gIC8vIG9wZXJhdG9ycyBsaWtlIGArPWAuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUFzc2lnbm1lbnRFeHByZXNzaW9uXG4gIHBhcnNlTWF5YmVBc3NpZ24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICBhZnRlckxlZnRQYXJzZT86IEZ1bmN0aW9uLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX3lpZWxkKSkge1xuICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkKSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5wYXJzZVlpZWxkKCk7XG4gICAgICAgIGlmIChhZnRlckxlZnRQYXJzZSkge1xuICAgICAgICAgIGxlZnQgPSBhZnRlckxlZnRQYXJzZS5jYWxsKHRoaXMsIGxlZnQsIHN0YXJ0TG9jKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3duRXhwcmVzc2lvbkVycm9ycztcbiAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgb3duRXhwcmVzc2lvbkVycm9ycyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICAgIG93bkV4cHJlc3Npb25FcnJvcnMgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAodHlwZSA9PT0gdHQucGFyZW5MIHx8IHRva2VuSXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgIH1cblxuICAgIGxldCBsZWZ0ID0gdGhpcy5wYXJzZU1heWJlQ29uZGl0aW9uYWwocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgaWYgKGFmdGVyTGVmdFBhcnNlKSB7XG4gICAgICBsZWZ0ID0gYWZ0ZXJMZWZ0UGFyc2UuY2FsbCh0aGlzLCBsZWZ0LCBzdGFydExvYyk7XG4gICAgfVxuICAgIGlmICh0b2tlbklzQXNzaWdubWVudCh0aGlzLnN0YXRlLnR5cGUpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLkFzc2lnbm1lbnRFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBub2RlLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmVxKSkge1xuICAgICAgICB0aGlzLnRvQXNzaWduYWJsZShsZWZ0LCAvKiBpc0xIUyAqLyB0cnVlKTtcbiAgICAgICAgbm9kZS5sZWZ0ID0gbGVmdDtcblxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gc3RhcnRMb2MuaW5kZXg7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLmRvdWJsZVByb3RvTG9jICE9IG51bGwgJiZcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLmRvdWJsZVByb3RvTG9jLmluZGV4ID49IHN0YXJ0SW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5kb3VibGVQcm90b0xvYyA9IG51bGw7IC8vIHJlc2V0IGJlY2F1c2UgZG91YmxlIF9fcHJvdG9fXyBpcyB2YWxpZCBpbiBhc3NpZ25tZW50IGV4cHJlc3Npb25cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgIT0gbnVsbCAmJlxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMuc2hvcnRoYW5kQXNzaWduTG9jLmluZGV4ID49IHN0YXJ0SW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgPSBudWxsOyAvLyByZXNldCBiZWNhdXNlIHNob3J0aGFuZCBkZWZhdWx0IHdhcyB1c2VkIGNvcnJlY3RseVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLnByaXZhdGVLZXlMb2MgIT0gbnVsbCAmJlxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMucHJpdmF0ZUtleUxvYy5pbmRleCA+PSBzdGFydEluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2hlY2tEZXN0cnVjdHVyaW5nUHJpdmF0ZShyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLnByaXZhdGVLZXlMb2MgPSBudWxsOyAvLyByZXNldCBiZWNhdXNlIGAoeyAjeDogeCB9KWAgaXMgYW4gYXNzaWduYWJsZSBwYXR0ZXJuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUubGVmdCA9IGxlZnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgbm9kZS5yaWdodCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgdGhpcy5jaGVja0xWYWwobGVmdCwge1xuICAgICAgICBpbjogdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiksXG4gICAgICB9KTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgaW1wcm92ZSBub2RlIHR5cGVzXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKG93bkV4cHJlc3Npb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkV4cHJlc3Npb25FcnJvcnMsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgLy8gUGFyc2UgYSB0ZXJuYXJ5IGNvbmRpdGlvbmFsIChgPzpgKSBvcGVyYXRvci5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQ29uZGl0aW9uYWxFeHByZXNzaW9uXG5cbiAgcGFyc2VNYXliZUNvbmRpdGlvbmFsKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlRXhwck9wcyhyZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZEV4aXREZXNjZW5kaW5nKGV4cHIsIHBvdGVudGlhbEFycm93QXQpKSB7XG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKGV4cHIsIHN0YXJ0TG9jLCByZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgfVxuXG4gIHBhcnNlQ29uZGl0aW9uYWwoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGV4cHI6IE4uRXhwcmVzc2lvbixcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAodGhpcy5lYXQodHQucXVlc3Rpb24pKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICBub2RlLnRlc3QgPSBleHByO1xuICAgICAgbm9kZS5jb25zZXF1ZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuICAgICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIik7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcGFyc2VNYXliZVVuYXJ5T3JQcml2YXRlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyxcbiAgKTogTi5FeHByZXNzaW9uIHwgTi5Qcml2YXRlTmFtZSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpXG4gICAgICA/IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpXG4gICAgICA6IHRoaXMucGFyc2VNYXliZVVuYXJ5KHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICB9XG5cbiAgLy8gU3RhcnQgdGhlIHByZWNlZGVuY2UgcGFyc2VyLlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1TaG9ydENpcmN1aXRFeHByZXNzaW9uXG5cbiAgcGFyc2VFeHByT3BzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzOiBFeHByZXNzaW9uRXJyb3JzLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZShyZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZEV4aXREZXNjZW5kaW5nKGV4cHIsIHBvdGVudGlhbEFycm93QXQpKSB7XG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChleHByLCBzdGFydExvYywgLTEpO1xuICB9XG5cbiAgLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmdcbiAgLy8gYWxnb3JpdGhtLiBgbGVmdGAgaXMgdGhlIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBvcGVyYXRvci5cbiAgLy8gYG1pblByZWNgIHByb3ZpZGVzIGNvbnRleHQgdGhhdCBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIHN0b3AgYW5kXG4gIC8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW5cbiAgLy8gb3BlcmF0b3IgdGhhdCBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIHNldCBpdCBpcyBwYXJzaW5nLlxuXG4gIHBhcnNlRXhwck9wKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBsZWZ0OiBOLkV4cHJlc3Npb24gfCBOLlByaXZhdGVOYW1lLFxuICAgIGxlZnRTdGFydExvYzogUG9zaXRpb24sXG4gICAgbWluUHJlYzogbnVtYmVyLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmICh0aGlzLmlzUHJpdmF0ZU5hbWUobGVmdCkpIHtcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVJlbGF0aW9uYWxFeHByZXNzaW9uXG4gICAgICAvLyBSZWxhdGlvbmFsRXhwcmVzc2lvbiBbSW4sIFlpZWxkLCBBd2FpdF1cbiAgICAgIC8vICAgWytJbl0gUHJpdmF0ZUlkZW50aWZpZXIgaW4gU2hpZnRFeHByZXNzaW9uWz9ZaWVsZCwgP0F3YWl0XVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihsZWZ0KTtcblxuICAgICAgaWYgKFxuICAgICAgICBtaW5QcmVjID49IHRva2VuT3BlcmF0b3JQcmVjZWRlbmNlKHR0Ll9pbikgfHxcbiAgICAgICAgIXRoaXMucHJvZFBhcmFtLmhhc0luIHx8XG4gICAgICAgICF0aGlzLm1hdGNoKHR0Ll9pbilcbiAgICAgICkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Qcml2YXRlSW5FeHBlY3RlZEluLCB7XG4gICAgICAgICAgYXQ6IGxlZnQsXG4gICAgICAgICAgaWRlbnRpZmllck5hbWU6IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKHZhbHVlLCBsZWZ0LmxvYy5zdGFydCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3AgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgaWYgKHRva2VuSXNPcGVyYXRvcihvcCkgJiYgKHRoaXMucHJvZFBhcmFtLmhhc0luIHx8ICF0aGlzLm1hdGNoKHR0Ll9pbikpKSB7XG4gICAgICBsZXQgcHJlYyA9IHRva2VuT3BlcmF0b3JQcmVjZWRlbmNlKG9wKTtcbiAgICAgIGlmIChwcmVjID4gbWluUHJlYykge1xuICAgICAgICBpZiAob3AgPT09IHR0LnBpcGVsaW5lKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJwaXBlbGluZU9wZXJhdG9yXCIpO1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5KSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jaGVja1BpcGVsaW5lQXRJbmZpeE9wZXJhdG9yKGxlZnQsIGxlZnRTdGFydExvYyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5Mb2dpY2FsRXhwcmVzc2lvbiB8IE4uQmluYXJ5RXhwcmVzc2lvbj4oXG4gICAgICAgICAgbGVmdFN0YXJ0TG9jLFxuICAgICAgICApO1xuICAgICAgICBub2RlLmxlZnQgPSBsZWZ0O1xuICAgICAgICBub2RlLm9wZXJhdG9yID0gdGhpcy5zdGF0ZS52YWx1ZTtcblxuICAgICAgICBjb25zdCBsb2dpY2FsID0gb3AgPT09IHR0LmxvZ2ljYWxPUiB8fCBvcCA9PT0gdHQubG9naWNhbEFORDtcbiAgICAgICAgY29uc3QgY29hbGVzY2UgPSBvcCA9PT0gdHQubnVsbGlzaENvYWxlc2Npbmc7XG5cbiAgICAgICAgaWYgKGNvYWxlc2NlKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBwcmVjZWRlbmNlIG9mIGB0dC5jb2FsZXNjZWAgYXMgZXF1YWwgdG8gdGhlIHJhbmdlIG9mIGxvZ2ljYWwgZXhwcmVzc2lvbnMuXG4gICAgICAgICAgLy8gSW4gb3RoZXIgd29yZHMsIGBub2RlLnJpZ2h0YCBzaG91bGRuJ3QgY29udGFpbiBsb2dpY2FsIGV4cHJlc3Npb25zIGluIG9yZGVyIHRvIGNoZWNrIHRoZSBtaXhlZCBlcnJvci5cbiAgICAgICAgICBwcmVjID0gdG9rZW5PcGVyYXRvclByZWNlZGVuY2UodHQubG9naWNhbEFORCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHQoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3AgPT09IHR0LnBpcGVsaW5lICYmXG4gICAgICAgICAgdGhpcy5oYXNQbHVnaW4oW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcIm1pbmltYWxcIiB9XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudHlwZSA9PT0gdHQuX2F3YWl0ICYmIHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkQXdhaXRBZnRlclBpcGVsaW5lQm9keSwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUucmlnaHQgPSB0aGlzLnBhcnNlRXhwck9wUmlnaHRFeHByKG9wLCBwcmVjKTtcbiAgICAgICAgY29uc3QgZmluaXNoZWROb2RlID0gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbG9naWNhbCB8fCBjb2FsZXNjZSA/IFwiTG9naWNhbEV4cHJlc3Npb25cIiA6IFwiQmluYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgICApO1xuICAgICAgICAvKiB0aGlzIGNoZWNrIGlzIGZvciBhbGwgPz8gb3BlcmF0b3JzXG4gICAgICAgICAqIGEgPz8gYiAmJiBjIGZvciB0aGlzIGV4YW1wbGVcbiAgICAgICAgICogd2hlbiBvcCBpcyBjb2FsZXNjZSBhbmQgbmV4dE9wIGlzIGxvZ2ljYWwgKCYmKSwgdGhyb3cgYXQgdGhlIHBvcyBvZiBuZXh0T3AgdGhhdCBpdCBjYW4gbm90IGJlIG1peGVkLlxuICAgICAgICAgKiBTeW1tZXRyaWNhbGx5IGl0IGFsc28gdGhyb3dzIHdoZW4gb3AgaXMgbG9naWNhbCBhbmQgbmV4dE9wIGlzIGNvYWxlc2NlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBuZXh0T3AgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoY29hbGVzY2UgJiYgKG5leHRPcCA9PT0gdHQubG9naWNhbE9SIHx8IG5leHRPcCA9PT0gdHQubG9naWNhbEFORCkpIHx8XG4gICAgICAgICAgKGxvZ2ljYWwgJiYgbmV4dE9wID09PSB0dC5udWxsaXNoQ29hbGVzY2luZylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWl4aW5nQ29hbGVzY2VXaXRoTG9naWNhbCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcChmaW5pc2hlZE5vZGUsIGxlZnRTdGFydExvYywgbWluUHJlYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZWZ0O1xuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBgcGFyc2VFeHByT3BgLiBQYXJzZSB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIGJpbmFyeS1cbiAgLy8gb3BlcmF0b3IgZXhwcmVzc2lvbnMsIHRoZW4gYXBwbHkgYW55IG9wZXJhdG9yLXNwZWNpZmljIGZ1bmN0aW9ucy5cblxuICBwYXJzZUV4cHJPcFJpZ2h0RXhwcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgb3A6IFRva2VuVHlwZSxcbiAgICBwcmVjOiBudW1iZXIsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgdHQucGlwZWxpbmU6XG4gICAgICAgIHN3aXRjaCAodGhpcy5nZXRQbHVnaW5PcHRpb24oXCJwaXBlbGluZU9wZXJhdG9yXCIsIFwicHJvcG9zYWxcIikpIHtcbiAgICAgICAgICBjYXNlIFwiaGFja1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRvcGljQmluZGluZ0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUhhY2tQaXBlQm9keSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwic21hcnRcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndpdGhUb3BpY0JpbmRpbmdDb250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkICYmIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll95aWVsZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5QaXBlQm9keUlzVGlnaHRlciwge1xuICAgICAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTbWFydFBpcGVsaW5lQm9keUluU3R5bGUoXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUV4cHJPcEJhc2VSaWdodEV4cHIob3AsIHByZWMpLFxuICAgICAgICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwiZnNoYXJwXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53aXRoU29sb0F3YWl0UGVybWl0dGluZ0NvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZTaGFycFBpcGVsaW5lQm9keShwcmVjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIC8vIEZhbGxzIHRocm91Z2guXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJPcEJhc2VSaWdodEV4cHIob3AsIHByZWMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgYHBhcnNlRXhwck9wUmlnaHRFeHByYC4gUGFyc2UgdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZlxuICAvLyBiaW5hcnktb3BlcmF0b3IgZXhwcmVzc2lvbnMgd2l0aG91dCBhcHBseWluZyBhbnkgb3BlcmF0b3Itc3BlY2lmaWMgZnVuY3Rpb25zLlxuXG4gIHBhcnNlRXhwck9wQmFzZVJpZ2h0RXhwcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgb3A6IFRva2VuVHlwZSxcbiAgICBwcmVjOiBudW1iZXIsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VFeHByT3AoXG4gICAgICB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZSgpLFxuICAgICAgc3RhcnRMb2MsXG4gICAgICB0b2tlbklzUmlnaHRBc3NvY2lhdGl2ZShvcCkgPyBwcmVjIC0gMSA6IHByZWMsXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlSGFja1BpcGVCb2R5KHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgeyBzdGFydExvYyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgY29uc3QgcmVxdWlyZWRQYXJlbnRoZXNlcyA9IFVucGFyZW50aGVzaXplZFBpcGVCb2R5RGVzY3JpcHRpb25zLmhhcyhcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFMyMzQ1OiBBcmd1bWVudCBvZiB0eXBlICdzdHJpbmcnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHBhcmFtZXRlciBvZiB0eXBlICdcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgfCBcIllpZWxkRXhwcmVzc2lvblwiIHwgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiIHwgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIicuXG4gICAgICBib2R5LnR5cGUsXG4gICAgKTtcblxuICAgIC8vIFRPRE86IENoZWNrIGhvdyB0byBoYW5kbGUgdHlwZSBjYXN0cyBpbiBGbG93IGFuZCBUUyBvbmNlIHRoZXkgYXJlIHN1cHBvcnRlZFxuICAgIGlmIChyZXF1aXJlZFBhcmVudGhlc2VzICYmICFib2R5LmV4dHJhPy5wYXJlbnRoZXNpemVkKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5QaXBlVW5wYXJlbnRoZXNpemVkQm9keSwge1xuICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyOiBUeXBlICdzdHJpbmcnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ1wiQXNzaWdubWVudEV4cHJlc3Npb25cIiB8IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiB8IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIgfCBcIllpZWxkRXhwcmVzc2lvblwiJy5cbiAgICAgICAgdHlwZTogYm9keS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy50b3BpY1JlZmVyZW5jZVdhc1VzZWRJbkN1cnJlbnRDb250ZXh0KCkpIHtcbiAgICAgIC8vIEEgSGFjayBwaXBlIGJvZHkgbXVzdCB1c2UgdGhlIHRvcGljIHJlZmVyZW5jZSBhdCBsZWFzdCBvbmNlLlxuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZVRvcGljVW51c2VkLCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIGNoZWNrRXhwb25lbnRpYWxBZnRlclVuYXJ5KFxuICAgIG5vZGU6IE4uQXdhaXRFeHByZXNzaW9uIHwgVW5kb25lPE4uVW5hcnlFeHByZXNzaW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuZXhwb25lbnQpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkVG9rZW5VbmFyeUV4cG9uZW50aWF0aW9uLCB7XG4gICAgICAgIGF0OiBub2RlLmFyZ3VtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2UgdW5hcnkgb3BlcmF0b3JzLCBib3RoIHByZWZpeCBhbmQgcG9zdGZpeC5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtVW5hcnlFeHByZXNzaW9uXG4gIHBhcnNlTWF5YmVVbmFyeShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICAgIHNhd1VuYXJ5PzogYm9vbGVhbixcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgY29uc3QgaXNBd2FpdCA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hd2FpdCk7XG5cbiAgICBpZiAoaXNBd2FpdCAmJiB0aGlzLmlzQXdhaXRBbGxvd2VkKCkpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VBd2FpdChzdGFydExvYyk7XG4gICAgICBpZiAoIXNhd1VuYXJ5KSB0aGlzLmNoZWNrRXhwb25lbnRpYWxBZnRlclVuYXJ5KGV4cHIpO1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMubWF0Y2godHQuaW5jRGVjKTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5VbmFyeUV4cHJlc3Npb24gfCBOLlVwZGF0ZUV4cHJlc3Npb24+KCk7XG4gICAgaWYgKHRva2VuSXNQcmVmaXgodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgbm9kZS5vcGVyYXRvciA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICBub2RlLnByZWZpeCA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll90aHJvdykpIHtcbiAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJ0aHJvd0V4cHJlc3Npb25zXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNEZWxldGUgPSB0aGlzLm1hdGNoKHR0Ll9kZWxldGUpO1xuICAgICAgdGhpcy5uZXh0KCk7XG5cbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCB0cnVlKTtcblxuICAgICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRXhwcmVzc2lvbkVycm9ycywgdHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiBpc0RlbGV0ZSkge1xuICAgICAgICBjb25zdCBhcmcgPSBub2RlLmFyZ3VtZW50O1xuXG4gICAgICAgIGlmIChhcmcudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5TdHJpY3REZWxldGUsIHsgYXQ6IG5vZGUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQcm9wZXJ0eUFzUHJpdmF0ZU5hbWUoYXJnKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlbGV0ZVByaXZhdGVGaWVsZCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICBpZiAoIXNhd1VuYXJ5KSB7XG4gICAgICAgICAgdGhpcy5jaGVja0V4cG9uZW50aWFsQWZ0ZXJVbmFyeShub2RlIGFzIFVuZG9uZTxOLlVuYXJ5RXhwcmVzc2lvbj4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJVbmFyeUV4cHJlc3Npb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VVcGRhdGUoXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVzaW5nIFwiVW5kb25lXCIgbm9kZSBhcyBcImRvbmVcIlxuICAgICAgbm9kZSxcbiAgICAgIHVwZGF0ZSxcbiAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgKTtcblxuICAgIGlmIChpc0F3YWl0KSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBzdGFydHNFeHByID0gdGhpcy5oYXNQbHVnaW4oXCJ2OGludHJpbnNpY1wiKVxuICAgICAgICA/IHRva2VuQ2FuU3RhcnRFeHByZXNzaW9uKHR5cGUpXG4gICAgICAgIDogdG9rZW5DYW5TdGFydEV4cHJlc3Npb24odHlwZSkgJiYgIXRoaXMubWF0Y2godHQubW9kdWxvKTtcbiAgICAgIGlmIChzdGFydHNFeHByICYmICF0aGlzLmlzQW1iaWd1b3VzQXdhaXQoKSkge1xuICAgICAgICB0aGlzLnJhaXNlT3ZlcndyaXRlKEVycm9ycy5Bd2FpdE5vdEluQXN5bmNDb250ZXh0LCB7IGF0OiBzdGFydExvYyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBd2FpdChzdGFydExvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1VcGRhdGVFeHByZXNzaW9uXG4gIHBhcnNlVXBkYXRlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBOLkV4cHJlc3Npb24sXG4gICAgdXBkYXRlOiBib29sZWFuLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFR5cGUgJ05vZGUnIGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZyb20gdHlwZSAnVW5kb25lPFVwZGF0ZUV4cHJlc3Npb24+JzogcHJlZml4LCBvcGVyYXRvciwgYXJndW1lbnRcbiAgICAgIGNvbnN0IHVwZGF0ZUV4cHJlc3Npb25Ob2RlID0gbm9kZSBhcyBVbmRvbmU8Ti5VcGRhdGVFeHByZXNzaW9uPjtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKHVwZGF0ZUV4cHJlc3Npb25Ob2RlLmFyZ3VtZW50LCB7XG4gICAgICAgIGluOiB0aGlzLmZpbmlzaE5vZGUodXBkYXRlRXhwcmVzc2lvbk5vZGUsIFwiVXBkYXRlRXhwcmVzc2lvblwiKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGxldCBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCBmYWxzZSkpIHJldHVybiBleHByO1xuICAgIHdoaWxlICh0b2tlbklzUG9zdGZpeCh0aGlzLnN0YXRlLnR5cGUpICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlVwZGF0ZUV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICAgIG5vZGUub3BlcmF0b3IgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgbm9kZS5wcmVmaXggPSBmYWxzZTtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSBleHByO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB0aGlzLmNoZWNrTFZhbChleHByLCB7XG4gICAgICAgIGluOiAoZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlVwZGF0ZUV4cHJlc3Npb25cIikpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLy8gUGFyc2UgY2FsbCwgZG90LCBhbmQgYFtdYC1zdWJzY3JpcHQgZXhwcmVzc2lvbnMuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUxlZnRIYW5kU2lkZUV4cHJlc3Npb25cbiAgcGFyc2VFeHByU3Vic2NyaXB0cyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBwb3RlbnRpYWxBcnJvd0F0ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0O1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnBhcnNlRXhwckF0b20ocmVmRXhwcmVzc2lvbkVycm9ycyk7XG5cbiAgICBpZiAodGhpcy5zaG91bGRFeGl0RGVzY2VuZGluZyhleHByLCBwb3RlbnRpYWxBcnJvd0F0KSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKGV4cHIsIHN0YXJ0TG9jKTtcbiAgfVxuXG4gIHBhcnNlU3Vic2NyaXB0cyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBub0NhbGxzPzogYm9vbGVhbiB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBvcHRpb25hbENoYWluTWVtYmVyOiBmYWxzZSxcbiAgICAgIG1heWJlQXN5bmNBcnJvdzogdGhpcy5hdFBvc3NpYmxlQXN5bmNBcnJvdyhiYXNlKSxcbiAgICAgIHN0b3A6IGZhbHNlLFxuICAgIH07XG4gICAgZG8ge1xuICAgICAgYmFzZSA9IHRoaXMucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRMb2MsIG5vQ2FsbHMsIHN0YXRlKTtcblxuICAgICAgLy8gQWZ0ZXIgcGFyc2luZyBhIHN1YnNjcmlwdCwgdGhpcyBpc24ndCBcImFzeW5jXCIgZm9yIHN1cmUuXG4gICAgICBzdGF0ZS5tYXliZUFzeW5jQXJyb3cgPSBmYWxzZTtcbiAgICB9IHdoaWxlICghc3RhdGUuc3RvcCk7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHN0YXRlIFNldCAnc3RhdGUuc3RvcCA9IHRydWUnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHN0b3AgcGFyc2luZyBzdWJzY3JpcHRzLlxuICAgKiAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVtYmVyIGlzIGN1cnJlbnRseSBpbiBPcHRpb25hbENoYWluXG4gICAqL1xuICBwYXJzZVN1YnNjcmlwdChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBub0NhbGxzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoIW5vQ2FsbHMgJiYgdHlwZSA9PT0gdHQuZG91YmxlQ29sb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQmluZChiYXNlLCBzdGFydExvYywgbm9DYWxscywgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAodG9rZW5Jc1RlbXBsYXRlKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihiYXNlLCBzdGFydExvYywgc3RhdGUpO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25hbCA9IGZhbHNlO1xuXG4gICAgaWYgKHR5cGUgPT09IHR0LnF1ZXN0aW9uRG90KSB7XG4gICAgICBpZiAobm9DYWxscykge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5PcHRpb25hbENoYWluaW5nTm9OZXcsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5sZWZ0UGFyZW50aGVzaXMpIHtcbiAgICAgICAgICAvLyBzdG9wIGF0IGA/LmAgd2hlbiBwYXJzaW5nIGBuZXcgYT8uKClgXG4gICAgICAgICAgc3RhdGUuc3RvcCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIgPSBvcHRpb25hbCA9IHRydWU7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vQ2FsbHMgJiYgdGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNvdmVyQ2FsbEFuZEFzeW5jQXJyb3dIZWFkKFxuICAgICAgICBiYXNlLFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIG9wdGlvbmFsLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmVhdCh0dC5icmFja2V0TCk7XG4gICAgICBpZiAoY29tcHV0ZWQgfHwgb3B0aW9uYWwgfHwgdGhpcy5lYXQodHQuZG90KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU1lbWJlcihiYXNlLCBzdGFydExvYywgc3RhdGUsIGNvbXB1dGVkLCBvcHRpb25hbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5zdG9wID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmFzZVs/WWllbGQsID9Bd2FpdF0gWyBFeHByZXNzaW9uWytJbiwgP1lpZWxkLCA/QXdhaXRdIF1cbiAgLy8gYmFzZVs/WWllbGQsID9Bd2FpdF0gLiBJZGVudGlmaWVyTmFtZVxuICAvLyBiYXNlWz9ZaWVsZCwgP0F3YWl0XSAuIFByaXZhdGVJZGVudGlmaWVyXG4gIC8vICAgd2hlcmUgYGJhc2VgIGlzIG9uZSBvZiBDYWxsRXhwcmVzc2lvbiwgTWVtYmVyRXhwcmVzc2lvbiBhbmQgT3B0aW9uYWxDaGFpblxuICBwYXJzZU1lbWJlcihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYmFzZTogTi5FeHByZXNzaW9uLFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbixcbiAgICBzdGF0ZTogTi5QYXJzZVN1YnNjcmlwdFN0YXRlLFxuICAgIGNvbXB1dGVkOiBib29sZWFuLFxuICAgIG9wdGlvbmFsOiBib29sZWFuLFxuICApOiBOLk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB8IE4uTWVtYmVyRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8XG4gICAgICBOLk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB8IE4uTWVtYmVyRXhwcmVzc2lvblxuICAgID4oc3RhcnRMb2MpO1xuICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICBub2RlLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpKSB7XG4gICAgICBpZiAoYmFzZS50eXBlID09PSBcIlN1cGVyXCIpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3VwZXJQcml2YXRlRmllbGQsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKHRoaXMuc3RhdGUudmFsdWUsIHRoaXMuc3RhdGUuc3RhcnRMb2MpO1xuICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLm9wdGlvbmFsQ2hhaW5NZW1iZXIpIHtcbiAgICAgIChub2RlIGFzIE4uT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uKS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYmluZC1vcGVyYXRvciNzeW50YXhcbiAgcGFyc2VCaW5kKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIG5vQ2FsbHM6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRMb2MpO1xuICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICc6OidcbiAgICBub2RlLmNhbGxlZSA9IHRoaXMucGFyc2VOb0NhbGxFeHByKCk7XG4gICAgc3RhdGUuc3RvcCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKFxuICAgICAgdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmluZEV4cHJlc3Npb25cIiksXG4gICAgICBzdGFydExvYyxcbiAgICAgIG5vQ2FsbHMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUNvdmVyQ2FsbEV4cHJlc3Npb25BbmRBc3luY0Fycm93SGVhZFxuICAvLyBDb3ZlckNhbGxFeHByZXNzaW9uQW5kQXN5bmNBcnJvd0hlYWRcbiAgLy8gQ2FsbEV4cHJlc3Npb25bP1lpZWxkLCA/QXdhaXRdIEFyZ3VtZW50c1s/WWllbGQsID9Bd2FpdF1cbiAgLy8gT3B0aW9uYWxDaGFpbls/WWllbGQsID9Bd2FpdF0gQXJndW1lbnRzWz9ZaWVsZCwgP0F3YWl0XVxuICBwYXJzZUNvdmVyQ2FsbEFuZEFzeW5jQXJyb3dIZWFkKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICAgb3B0aW9uYWw6IGJvb2xlYW4sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICBsZXQgcmVmRXhwcmVzc2lvbkVycm9yczogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAoYFxuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5DYWxsRXhwcmVzc2lvbiB8IE4uT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4oXG4gICAgICBzdGFydExvYyxcbiAgICApO1xuICAgIG5vZGUuY2FsbGVlID0gYmFzZTtcbiAgICBjb25zdCB7IG1heWJlQXN5bmNBcnJvdywgb3B0aW9uYWxDaGFpbk1lbWJlciB9ID0gc3RhdGU7XG5cbiAgICBpZiAobWF5YmVBc3luY0Fycm93KSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5lbnRlcihuZXdBc3luY0Fycm93U2NvcGUoKSk7XG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uYWxDaGFpbk1lbWJlcikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB3aGVuIG9wdGlvbmFsQ2hhaW5NZW1iZXIgaXMgdHJ1ZSwgbm9kZSBtdXN0IGJlIGFuIG9wdGlvbmFsIGNhbGxcbiAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKHR0LnBhcmVuUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICB0dC5wYXJlblIsXG4gICAgICAgIGJhc2UudHlwZSA9PT0gXCJJbXBvcnRcIixcbiAgICAgICAgYmFzZS50eXBlICE9PSBcIlN1cGVyXCIsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cylcbiAgICAgICAgbm9kZSxcbiAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBmaW5pc2hlZE5vZGU6XG4gICAgICB8IE4uQ2FsbEV4cHJlc3Npb25cbiAgICAgIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uXG4gICAgICB8IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSB0aGlzLmZpbmlzaENhbGxFeHByZXNzaW9uKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbmFsQ2hhaW5NZW1iZXIsXG4gICAgKTtcblxuICAgIGlmIChtYXliZUFzeW5jQXJyb3cgJiYgdGhpcy5zaG91bGRQYXJzZUFzeW5jQXJyb3coKSAmJiAhb3B0aW9uYWwpIHtcbiAgICAgIC8qOjogaW52YXJpYW50KHJlZkV4cHJlc3Npb25FcnJvcnMgIT0gbnVsbCkgKi9cbiAgICAgIHN0YXRlLnN0b3AgPSB0cnVlO1xuICAgICAgdGhpcy5jaGVja0Rlc3RydWN0dXJpbmdQcml2YXRlKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuICAgICAgdGhpcy5leHByZXNzaW9uU2NvcGUudmFsaWRhdGVBc1BhdHRlcm4oKTtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmV4aXQoKTtcbiAgICAgIGZpbmlzaGVkTm9kZSA9IHRoaXMucGFyc2VBc3luY0Fycm93RnJvbUNhbGxFeHByZXNzaW9uKFxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKSxcbiAgICAgICAgZmluaXNoZWROb2RlIGFzIE4uQ2FsbEV4cHJlc3Npb24sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF5YmVBc3luY0Fycm93KSB7XG4gICAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkV4cHJlc3Npb25FcnJvcnMsIHRydWUpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5leGl0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZEFyZ3VtZW50cyhmaW5pc2hlZE5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycyA9IG9sZE1heWJlSW5BcnJvd1BhcmFtZXRlcnM7XG5cbiAgICByZXR1cm4gZmluaXNoZWROb2RlO1xuICB9XG5cbiAgdG9SZWZlcmVuY2VkQXJndW1lbnRzKFxuICAgIG5vZGU6IE4uQ2FsbEV4cHJlc3Npb24gfCBOLk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24sXG4gICAgaXNQYXJlbnRoZXNpemVkRXhwcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAobm9kZS5hcmd1bWVudHMsIGlzUGFyZW50aGVzaXplZEV4cHIpO1xuICB9XG5cbiAgLy8gTWVtYmVyRXhwcmVzc2lvbiBbP1lpZWxkLCA/QXdhaXRdIFRlbXBsYXRlTGl0ZXJhbFs/WWllbGQsID9Bd2FpdCwgK1RhZ2dlZF1cbiAgLy8gQ2FsbEV4cHJlc3Npb24gWz9ZaWVsZCwgP0F3YWl0XSBUZW1wbGF0ZUxpdGVyYWxbP1lpZWxkLCA/QXdhaXQsICtUYWdnZWRdXG4gIHBhcnNlVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBiYXNlOiBOLkV4cHJlc3Npb24sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHN0YXRlOiBOLlBhcnNlU3Vic2NyaXB0U3RhdGUsXG4gICk6IE4uVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgIG5vZGUudGFnID0gYmFzZTtcbiAgICBub2RlLnF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlKHRydWUpO1xuICAgIGlmIChzdGF0ZS5vcHRpb25hbENoYWluTWVtYmVyKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5PcHRpb25hbENoYWluaW5nTm9UZW1wbGF0ZSwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIik7XG4gIH1cblxuICBhdFBvc3NpYmxlQXN5bmNBcnJvdyhiYXNlOiBOLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgYmFzZS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAgIHRoaXMuc3RhdGUubGFzdFRva0VuZExvYy5pbmRleCA9PT0gYmFzZS5lbmQgJiZcbiAgICAgICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpICYmXG4gICAgICAvLyBjaGVjayB0aGVyZSBhcmUgbm8gZXNjYXBlIHNlcXVlbmNlcywgc3VjaCBhcyBcXHV7NjF9c3luY1xuICAgICAgYmFzZS5lbmQgLSBiYXNlLnN0YXJ0ID09PSA1ICYmXG4gICAgICBiYXNlLnN0YXJ0ID09PSB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXRcbiAgICApO1xuICB9XG5cbiAgZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpIHtcbiAgICBpZiAoIXRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJpbXBvcnRBdHRyaWJ1dGVzXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaENhbGxFeHByZXNzaW9uPFQgZXh0ZW5kcyBOLkNhbGxFeHByZXNzaW9uIHwgTi5PcHRpb25hbENhbGxFeHByZXNzaW9uPihcbiAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgb3B0aW9uYWw6IGJvb2xlYW4sXG4gICk6IFQge1xuICAgIGlmIChub2RlLmNhbGxlZS50eXBlID09PSBcIkltcG9ydFwiKSB7XG4gICAgICBpZiAobm9kZS5hcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RJbXBvcnRBdHRyaWJ1dGVzUGx1Z2luKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBub2RlLmFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxBcml0eSwge1xuICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgIG1heEFyZ3VtZW50Q291bnQ6XG4gICAgICAgICAgICB0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgfHxcbiAgICAgICAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSB8fFxuICAgICAgICAgICAgdGhpcy5oYXNQbHVnaW4oXCJtb2R1bGVBdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDEsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygbm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICBpZiAoYXJnLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRDYWxsU3ByZWFkQXJndW1lbnQsIHsgYXQ6IGFyZyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShcbiAgICAgIG5vZGUsXG4gICAgICBvcHRpb25hbCA/IFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiIDogXCJDYWxsRXhwcmVzc2lvblwiLFxuICAgICk7XG4gIH1cblxuICBwYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGR5bmFtaWNJbXBvcnQ/OiBib29sZWFuLFxuICAgIGFsbG93UGxhY2Vob2xkZXI/OiBib29sZWFuLFxuICAgIG5vZGVGb3JFeHRyYT86IE4uTm9kZSB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBBcnJheTxOLkV4cHJlc3Npb24gfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgY29uc3QgZWx0czogTi5FeHByZXNzaW9uW10gPSBbXTtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoIXRoaXMuZWF0KGNsb3NlKSkge1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5jb21tYSk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKGNsb3NlKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGR5bmFtaWNJbXBvcnQgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcImltcG9ydEFzc2VydGlvbnNcIikgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxBcmd1bWVudFRyYWlsaW5nQ29tbWEsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChub2RlRm9yRXh0cmEpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkVHJhaWxpbmdDb21tYUV4dHJhVG9Ob2RlKG5vZGVGb3JFeHRyYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVsdHMucHVzaChcbiAgICAgICAgdGhpcy5wYXJzZUV4cHJMaXN0SXRlbShmYWxzZSwgcmVmRXhwcmVzc2lvbkVycm9ycywgYWxsb3dQbGFjZWhvbGRlciksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcblxuICAgIHJldHVybiBlbHRzO1xuICB9XG5cbiAgc2hvdWxkUGFyc2VBc3luY0Fycm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKHR0LmFycm93KSAmJiAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKTtcbiAgfVxuXG4gIHBhcnNlQXN5bmNBcnJvd0Zyb21DYWxsRXhwcmVzc2lvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgIGNhbGw6IE4uQ2FsbEV4cHJlc3Npb24sXG4gICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGNhbGwpO1xuICAgIHRoaXMuZXhwZWN0KHR0LmFycm93KTtcbiAgICB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKFxuICAgICAgbm9kZSxcbiAgICAgIGNhbGwuYXJndW1lbnRzLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNhbGwuZXh0cmE/LnRyYWlsaW5nQ29tbWFMb2MsXG4gICAgKTtcbiAgICAvLyBtYXJrIGlubmVyIGNvbW1lbnRzIG9mIGBhc3luYygpYCBhcyBpbm5lciBjb21tZW50cyBvZiBgYXN5bmMgKCkgPT5gXG4gICAgaWYgKGNhbGwuaW5uZXJDb21tZW50cykge1xuICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjYWxsLmlubmVyQ29tbWVudHMpO1xuICAgIH1cbiAgICAvLyBtYXJrIHRyYWlsaW5nIGNvbW1lbnRzIG9mIGBhc3luY2AgdG8gYmUgaW5uZXIgY29tbWVudHNcbiAgICBpZiAoY2FsbC5jYWxsZWUudHJhaWxpbmdDb21tZW50cykge1xuICAgICAgc2V0SW5uZXJDb21tZW50cyhub2RlLCBjYWxsLmNhbGxlZS50cmFpbGluZ0NvbW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUgYXMgTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgbm8tY2FsbCBleHByZXNzaW9uIChsaWtlIGFyZ3VtZW50IG9mIGBuZXdgIG9yIGA6OmAgb3BlcmF0b3JzKS5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTWVtYmVyRXhwcmVzc2lvblxuICBwYXJzZU5vQ2FsbEV4cHIodGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMucGFyc2VFeHByQXRvbSgpLCBzdGFydExvYywgdHJ1ZSk7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBhdG9taWMgZXhwcmVzc2lvbiBcdTIwMTQgZWl0aGVyIGEgc2luZ2xlIHRva2VuIHRoYXQgaXMgYW5cbiAgLy8gZXhwcmVzc2lvbiwgYW4gZXhwcmVzc2lvbiBzdGFydGVkIGJ5IGEga2V5d29yZCBsaWtlIGBmdW5jdGlvbmAgb3JcbiAgLy8gYG5ld2AsIG9yIGFuIGV4cHJlc3Npb24gd3JhcHBlZCBpbiBwdW5jdHVhdGlvbiBsaWtlIGAoKWAsIGBbXWAsXG4gIC8vIG9yIGB7fWAuXG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtUHJpbWFyeUV4cHJlc3Npb25cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNBcnJvd0Z1bmN0aW9uXG4gIC8vIFByaW1hcnlFeHByZXNzaW9uXG4gIC8vIFN1cGVyXG4gIC8vIEltcG9ydFxuICAvLyBBc3luY0Fycm93RnVuY3Rpb25cblxuICBwYXJzZUV4cHJBdG9tKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGRlY29yYXRvcnM6IE4uRGVjb3JhdG9yW10gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgdHQuX3N1cGVyOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN1cGVyKCk7XG5cbiAgICAgIGNhc2UgdHQuX2ltcG9ydDpcbiAgICAgICAgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uTWV0YVByb3BlcnR5IHwgTi5JbXBvcnQ+KCk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LmRvdCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydE1ldGFQcm9wZXJ0eShub2RlIGFzIFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKHR0LnBhcmVuTCkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZEltcG9ydCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva1N0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnRcIik7XG4gICAgICBjYXNlIHR0Ll90aGlzOlxuICAgICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaGlzRXhwcmVzc2lvblwiKTtcblxuICAgICAgY2FzZSB0dC5fZG86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEbyh0aGlzLnN0YXJ0Tm9kZSgpLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuc2xhc2g6XG4gICAgICBjYXNlIHR0LnNsYXNoQXNzaWduOiB7XG4gICAgICAgIHRoaXMucmVhZFJlZ2V4cCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlZ0V4cExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQubnVtOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWVyaWNMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuXG4gICAgICBjYXNlIHR0LmJpZ2ludDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCaWdJbnRMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuXG4gICAgICBjYXNlIHR0LmRlY2ltYWw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjaW1hbExpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG5cbiAgICAgIGNhc2UgdHQuc3RyaW5nOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG5cbiAgICAgIGNhc2UgdHQuX251bGw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVsbExpdGVyYWwoKTtcblxuICAgICAgY2FzZSB0dC5fdHJ1ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuTGl0ZXJhbCh0cnVlKTtcbiAgICAgIGNhc2UgdHQuX2ZhbHNlOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW5MaXRlcmFsKGZhbHNlKTtcblxuICAgICAgY2FzZSB0dC5wYXJlbkw6IHtcbiAgICAgICAgY29uc3QgY2FuQmVBcnJvdyA9IHRoaXMuc3RhdGUucG90ZW50aWFsQXJyb3dBdCA9PT0gdGhpcy5zdGF0ZS5zdGFydDtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbihjYW5CZUFycm93KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSB0dC5icmFja2V0QmFyTDpcbiAgICAgIGNhc2UgdHQuYnJhY2tldEhhc2hMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXlMaWtlKFxuICAgICAgICAgIHRoaXMuc3RhdGUudHlwZSA9PT0gdHQuYnJhY2tldEJhckwgPyB0dC5icmFja2V0QmFyUiA6IHR0LmJyYWNrZXRSLFxuICAgICAgICAgIC8qIGNhbkJlUGF0dGVybiAqLyBmYWxzZSxcbiAgICAgICAgICAvKiBpc1R1cGxlICovIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIHR0LmJyYWNrZXRMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyYXlMaWtlKFxuICAgICAgICAgIHR0LmJyYWNrZXRSLFxuICAgICAgICAgIC8qIGNhbkJlUGF0dGVybiAqLyB0cnVlLFxuICAgICAgICAgIC8qIGlzVHVwbGUgKi8gZmFsc2UsXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdHQuYnJhY2VCYXJMOlxuICAgICAgY2FzZSB0dC5icmFjZUhhc2hMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqZWN0TGlrZShcbiAgICAgICAgICB0aGlzLnN0YXRlLnR5cGUgPT09IHR0LmJyYWNlQmFyTCA/IHR0LmJyYWNlQmFyUiA6IHR0LmJyYWNlUixcbiAgICAgICAgICAvKiBpc1BhdHRlcm4gKi8gZmFsc2UsXG4gICAgICAgICAgLyogaXNSZWNvcmQgKi8gdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdHQuYnJhY2VMOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlT2JqZWN0TGlrZShcbiAgICAgICAgICB0dC5icmFjZVIsXG4gICAgICAgICAgLyogaXNQYXR0ZXJuICovIGZhbHNlLFxuICAgICAgICAgIC8qIGlzUmVjb3JkICovIGZhbHNlLFxuICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIHR0Ll9mdW5jdGlvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbk9yRnVuY3Rpb25TZW50KCk7XG5cbiAgICAgIGNhc2UgdHQuYXQ6XG4gICAgICAgIGRlY29yYXRvcnMgPSB0aGlzLnBhcnNlRGVjb3JhdG9ycygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgICBjYXNlIHR0Ll9jbGFzczpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyhcbiAgICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgdGhpcy5zdGFydE5vZGUoKSksXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgdHQuX25ldzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOZXdPck5ld1RhcmdldCgpO1xuXG4gICAgICBjYXNlIHR0LnRlbXBsYXRlTm9uVGFpbDpcbiAgICAgIGNhc2UgdHQudGVtcGxhdGVUYWlsOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRlbXBsYXRlKGZhbHNlKTtcblxuICAgICAgLy8gQmluZEV4cHJlc3Npb25bWWllbGRdXG4gICAgICAvLyAgIDo6IE1lbWJlckV4cHJlc3Npb25bP1lpZWxkXVxuICAgICAgY2FzZSB0dC5kb3VibGVDb2xvbjoge1xuICAgICAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIG5vZGUub2JqZWN0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgY2FsbGVlID0gKG5vZGUuY2FsbGVlID0gdGhpcy5wYXJzZU5vQ2FsbEV4cHIoKSk7XG4gICAgICAgIGlmIChjYWxsZWUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQmluZEV4cHJlc3Npb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRCaW5kLCB7IGF0OiBjYWxsZWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FzZSB0dC5wcml2YXRlTmFtZToge1xuICAgICAgICAvLyBTdGFuZGFsb25lIHByaXZhdGUgbmFtZXMgYXJlIG9ubHkgYWxsb3dlZCBpbiBcIiN4IGluIG9ialwiXG4gICAgICAgIC8vIGV4cHJlc3Npb25zLCBhbmQgdGhleSBhcmUgZGlyZWN0bHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mXG4gICAgICAgIC8vIHBhcnNlRXhwck9wLiBJZiB3ZSByZWFjaCB0aGlzLCB0aGUgaW5wdXQgaXMgYWx3YXlzIGludmFsaWQuXG4gICAgICAgIC8vIFdlIGNhbiB0aHJvdyBhIGJldHRlciBlcnJvciBtZXNzYWdlIGFuZCByZWNvdmVyLCByYXRoZXIgdGhhblxuICAgICAgICAvLyBqdXN0IHRocm93aW5nIFwiVW5leHBlY3RlZCB0b2tlblwiICh3aGljaCBpcyB0aGUgZGVmYXVsdFxuICAgICAgICAvLyBiZWhhdmlvciBvZiB0aGlzIGJpZyBzd2l0Y2ggc3RhdGVtZW50KS5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUHJpdmF0ZUluRXhwZWN0ZWRJbiwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIGlkZW50aWZpZXJOYW1lOiB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIHR0Lm1vZHVsb0Fzc2lnbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRvcGljUmVmZXJlbmNlVGhlbkVxdWFsc1NpZ24odHQubW9kdWxvLCBcIiVcIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQueG9yQXNzaWduOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2VUaGVuRXF1YWxzU2lnbih0dC5iaXR3aXNlWE9SLCBcIl5cIik7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQuZG91YmxlQ2FyZXQ6XG4gICAgICBjYXNlIHR0LmRvdWJsZUF0OiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2UoXCJoYWNrXCIpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIHR0LmJpdHdpc2VYT1I6XG4gICAgICBjYXNlIHR0Lm1vZHVsbzpcbiAgICAgIGNhc2UgdHQuaGFzaDoge1xuICAgICAgICBjb25zdCBwaXBlUHJvcG9zYWwgPSB0aGlzLmdldFBsdWdpbk9wdGlvbihcbiAgICAgICAgICBcInBpcGVsaW5lT3BlcmF0b3JcIixcbiAgICAgICAgICBcInByb3Bvc2FsXCIsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBpcGVQcm9wb3NhbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9waWNSZWZlcmVuY2UocGlwZVByb3Bvc2FsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgdHQubHQ6IHtcbiAgICAgICAgY29uc3QgbG9va2FoZWFkQ2ggPSB0aGlzLmlucHV0LmNvZGVQb2ludEF0KHRoaXMubmV4dFRva2VuU3RhcnQoKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0lkZW50aWZpZXJTdGFydChsb29rYWhlYWRDaCkgfHwgLy8gRWxlbWVudC9UeXBlIFBhcmFtZXRlciA8Zm9vPlxuICAgICAgICAgIGxvb2thaGVhZENoID09PSBjaGFyQ29kZXMuZ3JlYXRlclRoYW4gLy8gRnJhZ21lbnQgPD5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RPbmVQbHVnaW4oW1wianN4XCIsIFwiZmxvd1wiLCBcInR5cGVzY3JpcHRcIl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodHlwZSkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzQ29udGV4dHVhbCh0dC5fbW9kdWxlKSAmJlxuICAgICAgICAgICAgdGhpcy5sb29rYWhlYWRJbkxpbmVDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVmdEN1cmx5QnJhY2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTW9kdWxlRXhwcmVzc2lvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjYW5CZUFycm93ID0gdGhpcy5zdGF0ZS5wb3RlbnRpYWxBcnJvd0F0ID09PSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5zRXNjID0gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY29udGFpbnNFc2MgJiZcbiAgICAgICAgICAgIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJlxuICAgICAgICAgICAgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSB0dC5fZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoaWQpO1xuICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShpZCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuSXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGJlZ2lucyB3aXRoIFwiPVwiLCBjb21taXQgdG8gcGFyc2luZyBhbiBhc3luY1xuICAgICAgICAgICAgICAvLyBhcnJvdyBmdW5jdGlvbi4gKFBlZWtpbmcgYWhlYWQgZm9yIFwiPVwiIGxldHMgdXMgYXZvaWQgYSBtb3JlXG4gICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBmdWxsLXRva2VuIGxvb2thaGVhZCBvbiB0aGlzIGNvbW1vbiBwYXRoLilcbiAgICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmVxdWFsc1RvKSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0aG91Z2ggYGlkYCBpcyBub3QgdXNlZCBpbiBhc3luYyBhcnJvdyB1bmFyeSBmdW5jdGlvbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHJlc2V0IGBhc3luY2AncyB0cmFpbGluZyBjb21tZW50cyBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgdXBjb21pbmcgYXN5bmMgYXJyb3cgYmluZGluZyBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBc3luY0Fycm93VW5hcnlGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnROb2RlQXROb2RlKGlkKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdHJlYXQgXCJhc3luY1wiIGFzIGFuIGlkZW50aWZpZXIgYW5kIGxldCBjYWxsaW5nIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggdGhlIGN1cnJlbnQgdHQubmFtZSB0b2tlbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdHQuX2RvKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGlkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEbyh0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShpZCksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNhbkJlQXJyb3cgJiZcbiAgICAgICAgICAgIHRoaXMubWF0Y2godHQuYXJyb3cpICYmXG4gICAgICAgICAgICAhdGhpcy5jYW5JbnNlcnRTZW1pY29sb24oKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgdGhpcy5zdGFydE5vZGVBdE5vZGUoaWQpLFxuICAgICAgICAgICAgICBbaWRdLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBoZWxwZXIgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZFxuICAvLyB3aGVuIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQgYSBwb3RlbnRpYWwgSGFjayBwaXBlIHRvcGljIHRva2VuXG4gIC8vIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gZXF1YWxzIHNpZ24uXG4gIC8vIFNlZSA8aHR0cHM6Ly9naXRodWIuY29tL2pzLWNob2kvcHJvcG9zYWwtaGFjay1waXBlcz4uXG4gIC8vIElmIHdlIGZpbmQgXj0gb3IgJT0gaW4gYW4gZXhwcmVzc2lvbiBwb3NpdGlvblxuICAvLyAoaS5lLiwgdGhlIHR0Lm1vZHVsb0Fzc2lnbiBvciB0dC54b3JBc3NpZ24gdG9rZW4gdHlwZXMpLCBhbmQgaWYgdGhlXG4gIC8vIEhhY2stcGlwZXMgcHJvcG9zYWwgaXMgYWN0aXZlIHdpdGggXiBvciAlIGFzIGl0cyB0b3BpY1Rva2VuLCB0aGVuIHRoZSBeIG9yXG4gIC8vICUgY291bGQgYmUgdGhlIHRvcGljIHRva2VuIChlLmcuLCBpbiB4IHw+IF49PXkgb3IgeCB8PiBePT09eSksIGFuZCBzbyB3ZVxuICAvLyByZXBhcnNlIHRoZSBjdXJyZW50IHRva2VuIGFzIF4gb3IgJS5cbiAgLy8gT3RoZXJ3aXNlLCB0aGlzIHRocm93cyBhbiB1bmV4cGVjdGVkLXRva2VuIGVycm9yLlxuICBwYXJzZVRvcGljUmVmZXJlbmNlVGhlbkVxdWFsc1NpZ24oXG4gICAgdG9waWNUb2tlblR5cGU6IFRva2VuVHlwZSxcbiAgICB0b3BpY1Rva2VuVmFsdWU6IHN0cmluZyxcbiAgKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBwaXBlUHJvcG9zYWwgPSB0aGlzLmdldFBsdWdpbk9wdGlvbihcInBpcGVsaW5lT3BlcmF0b3JcIiwgXCJwcm9wb3NhbFwiKTtcblxuICAgIGlmIChwaXBlUHJvcG9zYWwpIHtcbiAgICAgIC8vIFNldCB0aGUgbW9zdC1yZWNlbnQgdG9rZW4gdG8gYmUgYSB0b3BpYyB0b2tlblxuICAgICAgLy8gZ2l2ZW4gYnkgdGhlIHRva2VuVHlwZSBhbmQgdG9rZW5WYWx1ZS5cbiAgICAgIC8vIE5vdyB0aGUgbmV4dCByZWFkVG9rZW4oKSBjYWxsIChpbiBwYXJzZVRvcGljUmVmZXJlbmNlKVxuICAgICAgLy8gd2lsbCBjb25zdW1lIHRoYXQgXHUyMDFDdG9waWMgdG9rZW5cdTIwMUQuXG4gICAgICB0aGlzLnN0YXRlLnR5cGUgPSB0b3BpY1Rva2VuVHlwZTtcbiAgICAgIHRoaXMuc3RhdGUudmFsdWUgPSB0b3BpY1Rva2VuVmFsdWU7XG4gICAgICAvLyBSZXdpbmQgdGhlIHRva2VuaXplciB0byB0aGUgZW5kIG9mIHRoZSBcdTIwMUN0b3BpYyB0b2tlblx1MjAxRCwgc28gdGhhdCB0aGVcbiAgICAgIC8vIGZvbGxvd2luZyB0b2tlbiBzdGFydHMgYXQgdGhlIGVxdWFscyBzaWduIGFmdGVyIHRoYXQgdG9waWMgdG9rZW4uXG4gICAgICB0aGlzLnN0YXRlLnBvcy0tO1xuICAgICAgdGhpcy5zdGF0ZS5lbmQtLTtcbiAgICAgIC8vIFRoaXMgaXMgc2FmZSB0byBkbyBzaW5jZSB0aGUgcHJlY2VkaW5nIGNoYXJhY3RlciB3YXMgZWl0aGVyIF4gb3IgJSwgYW5kXG4gICAgICAvLyB0aHVzIG5vdCBhIG5ld2xpbmUuXG4gICAgICB0aGlzLnN0YXRlLmVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldCh0aGlzLnN0YXRlLmVuZExvYywgLTEpO1xuICAgICAgLy8gTm93IGFjdHVhbGx5IGNvbnN1bWUgdGhlIHRvcGljIHRva2VuLlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb3BpY1JlZmVyZW5jZShwaXBlUHJvcG9zYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkXG4gIC8vIHdoZW4gdGhlIHByb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yIHBsdWdpbiBpcyBhY3RpdmUsXG4gIC8vIGFuZCB3aGVuIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQgYSBwb3RlbnRpYWwgSGFjayBwaXBlIHRvcGljIHRva2VuLlxuICAvLyBBbHRob3VnaCBhIHBpcGUtb3BlcmF0b3IgcHJvcG9zYWwgaXMgYXNzdW1lZCB0byBiZSBhY3RpdmUsXG4gIC8vIGl0cyBjb25maWd1cmF0aW9uIG1pZ2h0IG5vdCBtYXRjaCB0aGUgY3VycmVudCB0b2tlblx1MjAxOXMgdHlwZS5cbiAgLy8gU2VlIDxodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzPi5cbiAgcGFyc2VUb3BpY1JlZmVyZW5jZShwaXBlUHJvcG9zYWw6IHN0cmluZyk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVG9waWNSZWZlcmVuY2U+KCk7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIGNvbnN0IHRva2VuVHlwZSA9IHRoaXMuc3RhdGUudHlwZTtcblxuICAgIC8vIENvbnN1bWUgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICAvLyBJZiB0aGUgcGlwZS1vcGVyYXRvciBwbHVnaW5cdTIwMTlzIGNvbmZpZ3VyYXRpb24gbWF0Y2hlcyB0aGUgY3VycmVudCB0b2tlblx1MjAxOXMgdHlwZSxcbiAgICAvLyB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYG5vZGVgLCB3aWxsIGhhdmUgYmVlbiBmaW5pc2hlZCBhcyBhIHRvcGljIHJlZmVyZW5jZS5cbiAgICAvLyBPdGhlcndpc2UsIHRoaXMgd2lsbCB0aHJvdyBhIGBQaXBlVG9waWNVbmNvbmZpZ3VyZWRUb2tlbmAgZXJyb3IuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9waWNSZWZlcmVuY2Uobm9kZSwgc3RhcnRMb2MsIHBpcGVQcm9wb3NhbCwgdG9rZW5UeXBlKTtcbiAgfVxuXG4gIC8vIFRoaXMgaGVscGVyIG1ldGhvZCBhdHRlbXB0cyB0byBmaW5pc2ggdGhlIGdpdmVuIGBub2RlYFxuICAvLyBpbnRvIGEgdG9waWMtcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBnaXZlbiBgcGlwZVByb3Bvc2FsYC5cbiAgLy8gU2VlIDxodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzPi5cbiAgLy9cbiAgLy8gVGhlIG1ldGhvZCBhc3N1bWVzIHRoYXQgYW55IHRvcGljIHRva2VuIHdhcyBjb25zdW1lZCBiZWZvcmUgaXQgd2FzIGNhbGxlZC5cbiAgLy9cbiAgLy8gSWYgdGhlIGBwaXBlbGluZU9wZXJhdG9yYCBwbHVnaW4gaXMgYWN0aXZlLFxuICAvLyBhbmQgaWYgdGhlIGdpdmVuIGB0b2tlblR5cGVgIG1hdGNoZXMgdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbixcbiAgLy8gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZmluaXNoZWQgYG5vZGVgLlxuICAvL1xuICAvLyBJZiB0aGUgYHBpcGVsaW5lT3BlcmF0b3JgIHBsdWdpbiBpcyBhY3RpdmUsXG4gIC8vIGJ1dCBpZiB0aGUgZ2l2ZW4gYHRva2VuVHlwZWAgZG9lcyBub3QgbWF0Y2ggdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbixcbiAgLy8gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGEgYFBpcGVUb3BpY1VuY29uZmlndXJlZFRva2VuYCBlcnJvci5cbiAgZmluaXNoVG9waWNSZWZlcmVuY2UoXG4gICAgbm9kZTogVW5kb25lPE4uTm9kZT4sXG4gICAgc3RhcnRMb2M6IFBvc2l0aW9uLFxuICAgIHBpcGVQcm9wb3NhbDogc3RyaW5nLFxuICAgIHRva2VuVHlwZTogVG9rZW5UeXBlLFxuICApOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmIChcbiAgICAgIHRoaXMudGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbihwaXBlUHJvcG9zYWwsIHN0YXJ0TG9jLCB0b2tlblR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBUaGUgdG9rZW4gbWF0Y2hlcyB0aGUgcGx1Z2luXHUyMDE5cyBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gVGhlIHRva2VuIGlzIHRoZXJlZm9yZSBhIHRvcGljIHJlZmVyZW5jZS5cblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub2RlIHR5cGUgZm9yIHRoZSB0b3BpYyByZWZlcmVuY2VcbiAgICAgIC8vIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBhY3RpdmUgcGlwZS1vcGVyYXRvciBwcm9wb3NhbC5cbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgcGlwZVByb3Bvc2FsID09PSBcInNtYXJ0XCJcbiAgICAgICAgICA/IFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIlxuICAgICAgICAgIDogLy8gVGhlIHByb3Bvc2FsIG11c3Qgb3RoZXJ3aXNlIGJlIFwiaGFja1wiLFxuICAgICAgICAgICAgLy8gYXMgZW5mb3JjZWQgYnkgdGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgIFwiVG9waWNSZWZlcmVuY2VcIjtcblxuICAgICAgaWYgKCF0aGlzLnRvcGljUmVmZXJlbmNlSXNBbGxvd2VkSW5DdXJyZW50Q29udGV4dCgpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgLy8gVGhlIHRvcGljIHJlZmVyZW5jZSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0OlxuICAgICAgICAgIC8vIGl0IGlzIG91dHNpZGUgb2YgYSBwaXBlIGJvZHkuXG4gICAgICAgICAgLy8gUmFpc2UgcmVjb3ZlcmFibGUgZXJyb3JzLlxuICAgICAgICAgIHBpcGVQcm9wb3NhbCA9PT0gXCJzbWFydFwiXG4gICAgICAgICAgICA/IEVycm9ycy5QcmltYXJ5VG9waWNOb3RBbGxvd2VkXG4gICAgICAgICAgICA6IC8vIEluIHRoaXMgY2FzZSwgYHBpcGVQcm9wb3NhbCA9PT0gXCJoYWNrXCJgIGlzIHRydWUuXG4gICAgICAgICAgICAgIEVycm9ycy5QaXBlVG9waWNVbmJvdW5kLFxuICAgICAgICAgIHsgYXQ6IHN0YXJ0TG9jIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSB0b3BpYyByZWZlcmVuY2Ugc28gdGhhdCBpdHMgcGlwZSBib2R5IGtub3dzXG4gICAgICAvLyB0aGF0IGl0cyB0b3BpYyB3YXMgdXNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgdGhpcy5yZWdpc3RlclRvcGljUmVmZXJlbmNlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgbm9kZVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgdG9rZW4gZG9lcyBub3QgbWF0Y2ggdGhlIHBsdWdpblx1MjAxOXMgY29uZmlndXJhdGlvbi5cbiAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlBpcGVUb3BpY1VuY29uZmlndXJlZFRva2VuLCB7XG4gICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAgdG9rZW46IHRva2VuTGFiZWxOYW1lKHRva2VuVHlwZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgdGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gdG9rZW4gdHlwZVxuICAvLyBtYXRjaGVzIHRoZSBwaXBlbGluZU9wZXJhdG9yIHBhcnNlciBwbHVnaW5cdTIwMTlzIGNvbmZpZ3VyYXRpb24uXG4gIC8vIElmIHRoZSBhY3RpdmUgcGlwZSBwcm9wb3NhbCBpcyBIYWNrIHN0eWxlLFxuICAvLyBhbmQgaWYgdGhlIGdpdmVuIHRva2VuIGlzIHRoZSBzYW1lIGFzIHRoZSBwbHVnaW4gY29uZmlndXJhdGlvblx1MjAxOXMgYHRvcGljVG9rZW5gLFxuICAvLyB0aGVuIHRoaXMgaXMgYSB2YWxpZCB0b3BpYyByZWZlcmVuY2UuXG4gIC8vIElmIHRoZSBhY3RpdmUgcGlwZSBwcm9wb3NhbCBpcyBzbWFydCBtaXgsXG4gIC8vIHRoZW4gdGhlIHRvcGljIHRva2VuIG11c3QgYWx3YXlzIGJlIGAjYC5cbiAgLy8gSWYgdGhlIGFjdGl2ZSBwaXBlIHByb3Bvc2FsIGlzIG5laXRoZXIgKGUuZy4sIFwibWluaW1hbFwiIG9yIFwiZnNoYXJwXCIpLFxuICAvLyB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cbiAgdGVzdFRvcGljUmVmZXJlbmNlQ29uZmlndXJhdGlvbihcbiAgICBwaXBlUHJvcG9zYWw6IHN0cmluZyxcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgdG9rZW5UeXBlOiBUb2tlblR5cGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocGlwZVByb3Bvc2FsKSB7XG4gICAgICBjYXNlIFwiaGFja1wiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BsdWdpbihbXG4gICAgICAgICAgXCJwaXBlbGluZU9wZXJhdG9yXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2tlbiBtdXN0IGhhdmUgYSBsYWJlbFxuICAgICAgICAgICAgdG9waWNUb2tlbjogdG9rZW5MYWJlbE5hbWUodG9rZW5UeXBlKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzbWFydFwiOlxuICAgICAgICByZXR1cm4gdG9rZW5UeXBlID09PSB0dC5oYXNoO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuUGlwZVRvcGljUmVxdWlyZXNIYWNrUGlwZXMsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBBc3luY0Fycm93QmluZGluZ0lkZW50aWZpZXJbP1lpZWxkXSBbbm8gTGluZVRlcm1pbmF0b3IgaGVyZV0gPT4gQXN5bmNDb25jaXNlQm9keVs/SW5dXG4gIHBhcnNlQXN5bmNBcnJvd1VuYXJ5RnVuY3Rpb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgKTogTi5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBwdXNoIGEgbmV3IFBhcmFtZXRlckRlY2xhcmF0aW9uU2NvcGUgaGVyZSBzaW5jZSB3ZSBhcmUgc3VyZVxuICAgIC8vIDEpIGl0IGlzIGFuIGFzeW5jIGFycm93LCAyKSBubyBiaWRpbmcgcGF0dGVybiBpcyBhbGxvd2VkIGluIHBhcmFtc1xuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZ1bmN0aW9uRmxhZ3ModHJ1ZSwgdGhpcy5wcm9kUGFyYW0uaGFzWWllbGQpKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbdGhpcy5wYXJzZUlkZW50aWZpZXIoKV07XG4gICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5MaW5lVGVybWluYXRvckJlZm9yZUFycm93LCB7XG4gICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5leHBlY3QodHQuYXJyb3cpO1xuICAgIC8vIGxldCBmb28gPSBhc3luYyBiYXIgPT4ge307XG4gICAgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24obm9kZSwgcGFyYW1zLCB0cnVlKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWRvLWV4cHJlc3Npb25zXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFzeW5jLWRvLWV4cHJlc3Npb25zXG4gIHBhcnNlRG8oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkRvRXhwcmVzc2lvbj4sXG4gICAgaXNBc3luYzogYm9vbGVhbixcbiAgKTogTi5Eb0V4cHJlc3Npb24ge1xuICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZG9FeHByZXNzaW9uc1wiKTtcbiAgICBpZiAoaXNBc3luYykge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJhc3luY0RvRXhwcmVzc2lvbnNcIik7XG4gICAgfVxuICAgIG5vZGUuYXN5bmMgPSBpc0FzeW5jO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGRvYFxuICAgIGNvbnN0IG9sZExhYmVscyA9IHRoaXMuc3RhdGUubGFiZWxzO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzID0gW107XG4gICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgIC8vIEFzeW5jRG9FeHByZXNzaW9uIDpcbiAgICAgIC8vIGFzeW5jIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBkbyBCbG9ja1t+WWllbGQsICtBd2FpdCwgflJldHVybl1cbiAgICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKFBBUkFNX0FXQUlUKTtcbiAgICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VCbG9jaygpO1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IG9sZExhYmVscztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRG9FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gUGFyc2UgdGhlIGBzdXBlcmAga2V5d29yZFxuICBwYXJzZVN1cGVyKCk6IE4uU3VwZXIge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLlN1cGVyPigpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHN1cGVyYFxuICAgIGlmIChcbiAgICAgIHRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgIXRoaXMuc2NvcGUuYWxsb3dEaXJlY3RTdXBlciAmJlxuICAgICAgIXRoaXMub3B0aW9ucy5hbGxvd1N1cGVyT3V0c2lkZU1ldGhvZFxuICAgICkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3VwZXJOb3RBbGxvd2VkLCB7IGF0OiBub2RlIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5zY29wZS5hbGxvd1N1cGVyICYmXG4gICAgICAhdGhpcy5vcHRpb25zLmFsbG93U3VwZXJPdXRzaWRlTWV0aG9kXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkU3VwZXIsIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIXRoaXMubWF0Y2godHQucGFyZW5MKSAmJlxuICAgICAgIXRoaXMubWF0Y2godHQuYnJhY2tldEwpICYmXG4gICAgICAhdGhpcy5tYXRjaCh0dC5kb3QpXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZFN1cGVyLCB7IGF0OiBub2RlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTdXBlclwiKTtcbiAgfVxuXG4gIHBhcnNlUHJpdmF0ZU5hbWUoKTogTi5Qcml2YXRlTmFtZSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uUHJpdmF0ZU5hbWU+KCk7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uSWRlbnRpZmllcj4oXG4gICAgICAvLyBUaGUgcG9zaXRpb24gaXMgaGFyZGNvZGVkIGJlY2F1c2Ugd2UgbWVyZ2UgYCNgIGFuZCBuYW1lIGludG8gYSBzaW5nbGVcbiAgICAgIC8vIHR0LnByaXZhdGVOYW1lIHRva2VuXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5zdGFydExvYywgMSksXG4gICAgKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICNuYW1lO1xuICAgIG5vZGUuaWQgPSB0aGlzLmNyZWF0ZUlkZW50aWZpZXIoaWQsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJQcml2YXRlTmFtZVwiKTtcbiAgfVxuXG4gIHBhcnNlRnVuY3Rpb25PckZ1bmN0aW9uU2VudChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICk6IE4uRnVuY3Rpb25FeHByZXNzaW9uIHwgTi5NZXRhUHJvcGVydHkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkZ1bmN0aW9uRXhwcmVzc2lvbiB8IE4uTWV0YVByb3BlcnR5PigpO1xuXG4gICAgLy8gV2UgZG8gbm90IGRvIHBhcnNlSWRlbnRpZmllciBoZXJlIGJlY2F1c2Ugd2hlbiBwYXJzZUZ1bmN0aW9uT3JGdW5jdGlvblNlbnRcbiAgICAvLyBpcyBjYWxsZWQgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBcIm5hbWVcIiB3aXRoIHRoZSB2YWx1ZSBcImZ1bmN0aW9uXCJcbiAgICAvLyBUaGlzIHdpbGwgaW1wcm92ZSBwZXJmIGEgdGlueSBsaXR0bGUgYml0IGFzIHdlIGRvIG5vdCBkbyB2YWxpZGF0aW9uIGJ1dCBtb3JlIGltcG9ydGFudGx5XG4gICAgLy8gaGVyZSBpcyB0aGF0IHBhcnNlSWRlbnRpZmllciB3aWxsIHJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGV4cHJlc3Npb24gc3RhY2tcbiAgICAvLyBpZiBcImZ1bmN0aW9uXCIgb3IgXCJjbGFzc1wiIGlzIHBhcnNlZCBhcyBpZGVudGlmaWVyIChpbiBvYmplY3RzIGUuZy4pLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbiBoZXJlLlxuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGZ1bmN0aW9uYFxuXG4gICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc1lpZWxkICYmIHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY3JlYXRlSWRlbnRpZmllcihcbiAgICAgICAgdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5JZGVudGlmaWVyPihub2RlKSxcbiAgICAgICAgXCJmdW5jdGlvblwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYC5gXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1mdW5jdGlvbi5zZW50I3N5bnRheC0xXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fc2VudCkpIHtcbiAgICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJmdW5jdGlvblNlbnRcIik7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmhhc1BsdWdpbihcImZ1bmN0aW9uU2VudFwiKSkge1xuICAgICAgICAvLyBUaGUgY29kZSB3YXNuJ3QgYGZ1bmN0aW9uLnNlbnRgIGJ1dCBqdXN0IGBmdW5jdGlvbi5gLCBzbyBhIHNpbXBsZSBlcnJvciBpcyBsZXNzIGNvbmZ1c2luZy5cbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZU1ldGFQcm9wZXJ0eShcbiAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5NZXRhUHJvcGVydHk+LFxuICAgICAgICBtZXRhLFxuICAgICAgICBcInNlbnRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSBhcyBVbmRvbmU8Ti5GdW5jdGlvbkV4cHJlc3Npb24+KTtcbiAgfVxuXG4gIHBhcnNlTWV0YVByb3BlcnR5KFxuICAgIG5vZGU6IFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4sXG4gICAgbWV0YTogTi5JZGVudGlmaWVyLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICApOiBOLk1ldGFQcm9wZXJ0eSB7XG4gICAgbm9kZS5tZXRhID0gbWV0YTtcblxuICAgIGNvbnN0IGNvbnRhaW5zRXNjID0gdGhpcy5zdGF0ZS5jb250YWluc0VzYztcblxuICAgIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcblxuICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IHByb3BlcnR5TmFtZSB8fCBjb250YWluc0VzYykge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5zdXBwb3J0ZWRNZXRhUHJvcGVydHksIHtcbiAgICAgICAgYXQ6IG5vZGUucHJvcGVydHksXG4gICAgICAgIHRhcmdldDogbWV0YS5uYW1lLFxuICAgICAgICBvbmx5VmFsaWRQcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJNZXRhUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1JbXBvcnRNZXRhXG4gIHBhcnNlSW1wb3J0TWV0YVByb3BlcnR5KG5vZGU6IFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4pOiBOLk1ldGFQcm9wZXJ0eSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNyZWF0ZUlkZW50aWZpZXIoXG4gICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLklkZW50aWZpZXI+KG5vZGUpLFxuICAgICAgXCJpbXBvcnRcIixcbiAgICApO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYC5gXG5cbiAgICBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX21ldGEpKSB7XG4gICAgICBpZiAoIXRoaXMuaW5Nb2R1bGUpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW1wb3J0TWV0YU91dHNpZGVNb2R1bGUsIHsgYXQ6IGlkIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VNZXRhUHJvcGVydHkobm9kZSwgaWQsIFwibWV0YVwiKTtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbEF0Tm9kZTxUIGV4dGVuZHMgTi5Ob2RlPihcbiAgICB2YWx1ZTogYW55LFxuICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICAgIG5vZGU6IGFueSxcbiAgKTogVCB7XG4gICAgdGhpcy5hZGRFeHRyYShub2RlLCBcInJhd1ZhbHVlXCIsIHZhbHVlKTtcbiAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwicmF3XCIsIHRoaXMuaW5wdXQuc2xpY2Uobm9kZS5zdGFydCwgdGhpcy5zdGF0ZS5lbmQpKTtcbiAgICBub2RlLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZTxUPihub2RlLCB0eXBlKTtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbDxUIGV4dGVuZHMgTi5Ob2RlPih2YWx1ZTogYW55LCB0eXBlOiBUW1widHlwZVwiXSk6IFQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbEF0Tm9kZSh2YWx1ZSwgdHlwZSwgbm9kZSk7XG4gIH1cblxuICBwYXJzZVN0cmluZ0xpdGVyYWwodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbDxOLlN0cmluZ0xpdGVyYWw+KHZhbHVlLCBcIlN0cmluZ0xpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZU51bWVyaWNMaXRlcmFsKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5OdW1lcmljTGl0ZXJhbD4odmFsdWUsIFwiTnVtZXJpY0xpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZUJpZ0ludExpdGVyYWwodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlTGl0ZXJhbDxOLkJpZ0ludExpdGVyYWw+KHZhbHVlLCBcIkJpZ0ludExpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZURlY2ltYWxMaXRlcmFsKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWw8Ti5EZWNpbWFsTGl0ZXJhbD4odmFsdWUsIFwiRGVjaW1hbExpdGVyYWxcIik7XG4gIH1cblxuICBwYXJzZVJlZ0V4cExpdGVyYWwodmFsdWU6IHtcbiAgICB2YWx1ZTogYW55O1xuICAgIHBhdHRlcm46IHN0cmluZztcbiAgICBmbGFnczogTi5SZWdFeHBMaXRlcmFsW1wiZmxhZ3NcIl07XG4gIH0pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUxpdGVyYWw8Ti5SZWdFeHBMaXRlcmFsPihcbiAgICAgIHZhbHVlLnZhbHVlLFxuICAgICAgXCJSZWdFeHBMaXRlcmFsXCIsXG4gICAgKTtcbiAgICBub2RlLnBhdHRlcm4gPSB2YWx1ZS5wYXR0ZXJuO1xuICAgIG5vZGUuZmxhZ3MgPSB2YWx1ZS5mbGFncztcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHBhcnNlQm9vbGVhbkxpdGVyYWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Cb29sZWFuTGl0ZXJhbD4oKTtcbiAgICBub2RlLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkJvb2xlYW5MaXRlcmFsXCIpO1xuICB9XG5cbiAgcGFyc2VOdWxsTGl0ZXJhbCgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5OdWxsTGl0ZXJhbD4oKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTnVsbExpdGVyYWxcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Db3ZlclBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQW5kQXJyb3dQYXJhbWV0ZXJMaXN0XG4gIHBhcnNlUGFyZW5BbmREaXN0aW5ndWlzaEV4cHJlc3Npb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNhbkJlQXJyb3c6IGJvb2xlYW4sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgbGV0IHZhbDtcbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGAoYFxuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmVudGVyKG5ld0Fycm93SGVhZFNjb3BlKCkpO1xuXG4gICAgY29uc3Qgb2xkTWF5YmVJbkFycm93UGFyYW1ldGVycyA9IHRoaXMuc3RhdGUubWF5YmVJbkFycm93UGFyYW1ldGVycztcbiAgICBjb25zdCBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG5cbiAgICBjb25zdCBpbm5lclN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICBjb25zdCBleHByTGlzdDogTi5FeHByZXNzaW9uW10gPSBbXTtcbiAgICBjb25zdCByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGxldCBzcHJlYWRTdGFydExvYztcbiAgICBsZXQgb3B0aW9uYWxDb21tYVN0YXJ0TG9jO1xuXG4gICAgd2hpbGUgKCF0aGlzLm1hdGNoKHR0LnBhcmVuUikpIHtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBlY3QoXG4gICAgICAgICAgdHQuY29tbWEsXG4gICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5vcHRpb25hbFBhcmFtZXRlcnNMb2MgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiByZWZFeHByZXNzaW9uRXJyb3JzLm9wdGlvbmFsUGFyYW1ldGVyc0xvYyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5SKSkge1xuICAgICAgICAgIG9wdGlvbmFsQ29tbWFTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICAgIGNvbnN0IHNwcmVhZE5vZGVTdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIHNwcmVhZFN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgZXhwckxpc3QucHVzaChcbiAgICAgICAgICB0aGlzLnBhcnNlUGFyZW5JdGVtKHRoaXMucGFyc2VSZXN0QmluZGluZygpLCBzcHJlYWROb2RlU3RhcnRMb2MpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghdGhpcy5jaGVja0NvbW1hQWZ0ZXJSZXN0KGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHByTGlzdC5wdXNoKFxuICAgICAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oXG4gICAgICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgICAgICAgdGhpcy5wYXJzZVBhcmVuSXRlbSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlubmVyRW5kTG9jID0gdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jO1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcblxuICAgIGxldCBhcnJvd05vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHN0YXJ0TG9jKTtcbiAgICBpZiAoXG4gICAgICBjYW5CZUFycm93ICYmXG4gICAgICB0aGlzLnNob3VsZFBhcnNlQXJyb3coZXhwckxpc3QpICYmXG4gICAgICAoYXJyb3dOb2RlID0gdGhpcy5wYXJzZUFycm93KGFycm93Tm9kZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmNoZWNrRGVzdHJ1Y3R1cmluZ1ByaXZhdGUocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB0aGlzLmV4cHJlc3Npb25TY29wZS52YWxpZGF0ZUFzUGF0dGVybigpO1xuICAgICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuICAgICAgdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbihhcnJvd05vZGUsIGV4cHJMaXN0LCBmYWxzZSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpIGltcHJvdmUgbm9kZSB0eXBlc1xuICAgICAgcmV0dXJuIGFycm93Tm9kZTtcbiAgICB9XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuXG4gICAgaWYgKCFleHByTGlzdC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25hbENvbW1hU3RhcnRMb2MpIHRoaXMudW5leHBlY3RlZChvcHRpb25hbENvbW1hU3RhcnRMb2MpO1xuICAgIGlmIChzcHJlYWRTdGFydExvYykgdGhpcy51bmV4cGVjdGVkKHNwcmVhZFN0YXJ0TG9jKTtcbiAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCB0cnVlKTtcblxuICAgIHRoaXMudG9SZWZlcmVuY2VkTGlzdERlZXAoZXhwckxpc3QsIC8qIGlzUGFyZW50aGVzaXplZEV4cHIgKi8gdHJ1ZSk7XG4gICAgaWYgKGV4cHJMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhbCA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5TZXF1ZW5jZUV4cHJlc3Npb24+KGlubmVyU3RhcnRMb2MpO1xuICAgICAgdmFsLmV4cHJlc3Npb25zID0gZXhwckxpc3Q7XG4gICAgICAvLyBmaW5pc2ggbm9kZSBhdCBjdXJyZW50IGxvY2F0aW9uIHNvIGl0IGNhbiBwaWNrIHVwIGNvbW1lbnRzIGFmdGVyIGApYFxuICAgICAgdGhpcy5maW5pc2hOb2RlKHZhbCwgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIik7XG4gICAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24odmFsLCBpbm5lckVuZExvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IGV4cHJMaXN0WzBdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndyYXBQYXJlbnRoZXNpcyhcbiAgICAgIHN0YXJ0TG9jLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgdmFsLFxuICAgICk7XG4gIH1cblxuICB3cmFwUGFyZW50aGVzaXMoc3RhcnRMb2M6IFBvc2l0aW9uLCBleHByZXNzaW9uOiBOLkV4cHJlc3Npb24pOiBOLkV4cHJlc3Npb24ge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmNyZWF0ZVBhcmVudGhlc2l6ZWRFeHByZXNzaW9ucykge1xuICAgICAgdGhpcy5hZGRFeHRyYShleHByZXNzaW9uLCBcInBhcmVudGhlc2l6ZWRcIiwgdHJ1ZSk7XG4gICAgICB0aGlzLmFkZEV4dHJhKGV4cHJlc3Npb24sIFwicGFyZW5TdGFydFwiLCBzdGFydExvYy5pbmRleCk7XG5cbiAgICAgIHRoaXMudGFrZVN1cnJvdW5kaW5nQ29tbWVudHMoXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIHN0YXJ0TG9jLmluZGV4LFxuICAgICAgICB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MuaW5kZXgsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbkV4cHJlc3Npb24gPVxuICAgICAgdGhpcy5zdGFydE5vZGVBdDxOLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPihzdGFydExvYyk7XG4gICAgcGFyZW5FeHByZXNzaW9uLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocGFyZW5FeHByZXNzaW9uLCBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBgcGFyYW1zYCBpcyB1c2VkIGluIHR5cGVzY3JpcHQgcGx1Z2luXG4gIHNob3VsZFBhcnNlQXJyb3cocGFyYW1zOiBBcnJheTxOLk5vZGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpO1xuICB9XG5cbiAgcGFyc2VBcnJvdyhcbiAgICBub2RlOiBVbmRvbmU8Ti5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbj4sXG4gICk6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZWF0KHR0LmFycm93KSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQYXJlbkl0ZW0oXG4gICAgbm9kZTogTi5FeHByZXNzaW9uLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICk6IE4uRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwYXJzZU5ld09yTmV3VGFyZ2V0KHRoaXM6IFBhcnNlcik6IE4uTmV3RXhwcmVzc2lvbiB8IE4uTWV0YVByb3BlcnR5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5OZXdFeHByZXNzaW9uIHwgTi5NZXRhUHJvcGVydHk+KCk7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuZG90KSkge1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTmV3VGFyZ2V0XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5jcmVhdGVJZGVudGlmaWVyKFxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLklkZW50aWZpZXI+KG5vZGUpLFxuICAgICAgICBcIm5ld1wiLFxuICAgICAgKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgY29uc3QgbWV0YVByb3AgPSB0aGlzLnBhcnNlTWV0YVByb3BlcnR5KFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLk1ldGFQcm9wZXJ0eT4sXG4gICAgICAgIG1ldGEsXG4gICAgICAgIFwidGFyZ2V0XCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNjb3BlLmluTm9uQXJyb3dGdW5jdGlvbiAmJlxuICAgICAgICAhdGhpcy5zY29wZS5pbkNsYXNzICYmXG4gICAgICAgICF0aGlzLm9wdGlvbnMuYWxsb3dOZXdUYXJnZXRPdXRzaWRlRnVuY3Rpb25cbiAgICAgICkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTmV3VGFyZ2V0LCB7IGF0OiBtZXRhUHJvcCB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1ldGFQcm9wO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlTmV3KG5vZGUgYXMgVW5kb25lPE4uTmV3RXhwcmVzc2lvbj4pO1xuICB9XG5cbiAgLy8gTmV3J3MgcHJlY2VkZW5jZSBpcyBzbGlnaHRseSB0cmlja3kuIEl0IG11c3QgYWxsb3cgaXRzIGFyZ3VtZW50IHRvXG4gIC8vIGJlIGEgYFtdYCBvciBkb3Qgc3Vic2NyaXB0IGV4cHJlc3Npb24sIGJ1dCBub3QgYSBjYWxsIFx1MjAxNCBhdCBsZWFzdCxcbiAgLy8gbm90IHdpdGhvdXQgd3JhcHBpbmcgaXQgaW4gcGFyZW50aGVzZXMuIFRodXMsIGl0IHVzZXMgdGhlIG5vQ2FsbHNcbiAgLy8gYXJndW1lbnQgdG8gcGFyc2VTdWJzY3JpcHRzIHRvIHByZXZlbnQgaXQgZnJvbSBjb25zdW1pbmcgdGhlXG4gIC8vIGFyZ3VtZW50IGxpc3QuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLU5ld0V4cHJlc3Npb25cbiAgcGFyc2VOZXcodGhpczogUGFyc2VyLCBub2RlOiBVbmRvbmU8Ti5OZXdFeHByZXNzaW9uPik6IE4uTmV3RXhwcmVzc2lvbiB7XG4gICAgdGhpcy5wYXJzZU5ld0NhbGxlZShub2RlKTtcblxuICAgIGlmICh0aGlzLmVhdCh0dC5wYXJlbkwpKSB7XG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR0LnBhcmVuUik7XG4gICAgICB0aGlzLnRvUmVmZXJlbmNlZExpc3QoYXJncyk7XG4gICAgICAvLyAocGFyc2VFeHByTGlzdCBzaG91bGQgYmUgYWxsIG5vbi1udWxsIGluIHRoaXMgY2FzZSlcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gYXJncztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5hcmd1bWVudHMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTmV3RXhwcmVzc2lvblwiKTtcbiAgfVxuXG4gIHBhcnNlTmV3Q2FsbGVlKHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uTmV3RXhwcmVzc2lvbj4pOiB2b2lkIHtcbiAgICBub2RlLmNhbGxlZSA9IHRoaXMucGFyc2VOb0NhbGxFeHByKCk7XG4gICAgaWYgKG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0XCIpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydENhbGxOb3ROZXdFeHByZXNzaW9uLCB7IGF0OiBub2RlLmNhbGxlZSB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZSB0ZW1wbGF0ZSBleHByZXNzaW9uLlxuXG4gIHBhcnNlVGVtcGxhdGVFbGVtZW50KGlzVGFnZ2VkOiBib29sZWFuKTogTi5UZW1wbGF0ZUVsZW1lbnQge1xuICAgIGNvbnN0IHsgc3RhcnQsIHN0YXJ0TG9jLCBlbmQsIHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGVsZW1TdGFydCA9IHN0YXJ0ICsgMTtcbiAgICBjb25zdCBlbGVtID0gdGhpcy5zdGFydE5vZGVBdDxOLlRlbXBsYXRlRWxlbWVudD4oXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoc3RhcnRMb2MsIDEpLFxuICAgICk7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICBpZiAoIWlzVGFnZ2VkKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRFc2NhcGVTZXF1ZW5jZVRlbXBsYXRlLCB7XG4gICAgICAgICAgLy8gRklYTUU6IEFkZGluZyAxIGlzIHByb2JhYmx5IHdyb25nLlxuICAgICAgICAgIGF0OiBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZpcnN0SW52YWxpZFRlbXBsYXRlRXNjYXBlUG9zLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1RhaWwgPSB0aGlzLm1hdGNoKHR0LnRlbXBsYXRlVGFpbCk7XG4gICAgY29uc3QgZW5kT2Zmc2V0ID0gaXNUYWlsID8gLTEgOiAtMjtcbiAgICBjb25zdCBlbGVtRW5kID0gZW5kICsgZW5kT2Zmc2V0O1xuICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICByYXc6IHRoaXMuaW5wdXQuc2xpY2UoZWxlbVN0YXJ0LCBlbGVtRW5kKS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLFxuICAgICAgY29va2VkOiB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB2YWx1ZS5zbGljZSgxLCBlbmRPZmZzZXQpLFxuICAgIH07XG4gICAgZWxlbS50YWlsID0gaXNUYWlsO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGNvbnN0IGZpbmlzaGVkTm9kZSA9IHRoaXMuZmluaXNoTm9kZShlbGVtLCBcIlRlbXBsYXRlRWxlbWVudFwiKTtcbiAgICB0aGlzLnJlc2V0RW5kTG9jYXRpb24oXG4gICAgICBmaW5pc2hlZE5vZGUsXG4gICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLCBlbmRPZmZzZXQpLFxuICAgICk7XG4gICAgcmV0dXJuIGZpbmlzaGVkTm9kZTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVRlbXBsYXRlTGl0ZXJhbFxuICBwYXJzZVRlbXBsYXRlKHRoaXM6IFBhcnNlciwgaXNUYWdnZWQ6IGJvb2xlYW4pOiBOLlRlbXBsYXRlTGl0ZXJhbCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uVGVtcGxhdGVMaXRlcmFsPigpO1xuICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbXTtcbiAgICBsZXQgY3VyRWx0ID0gdGhpcy5wYXJzZVRlbXBsYXRlRWxlbWVudChpc1RhZ2dlZCk7XG4gICAgbm9kZS5xdWFzaXMgPSBbY3VyRWx0XTtcbiAgICB3aGlsZSAoIWN1ckVsdC50YWlsKSB7XG4gICAgICBub2RlLmV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZVRlbXBsYXRlU3Vic3RpdHV0aW9uKCkpO1xuICAgICAgdGhpcy5yZWFkVGVtcGxhdGVDb250aW51YXRpb24oKTtcbiAgICAgIG5vZGUucXVhc2lzLnB1c2goKGN1ckVsdCA9IHRoaXMucGFyc2VUZW1wbGF0ZUVsZW1lbnQoaXNUYWdnZWQpKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIik7XG4gIH1cblxuICAvLyBUaGlzIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBUeXBlU2NyaXB0IHBsdWdpbiB0byBwYXJzZSB0ZW1wbGF0ZSB0eXBlc1xuICBwYXJzZVRlbXBsYXRlU3Vic3RpdHV0aW9uKHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gIH1cblxuICAvLyBQYXJzZSBhbiBvYmplY3QgbGl0ZXJhbCwgYmluZGluZyBwYXR0ZXJuLCBvciByZWNvcmQuXG5cbiAgcGFyc2VPYmplY3RMaWtlKFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgaXNQYXR0ZXJuOiB0cnVlLFxuICAgIGlzUmVjb3JkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLk9iamVjdFBhdHRlcm47XG4gIHBhcnNlT2JqZWN0TGlrZShcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogZmFsc2UsXG4gICAgaXNSZWNvcmQ/OiBmYWxzZSB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLk9iamVjdEV4cHJlc3Npb247XG4gIHBhcnNlT2JqZWN0TGlrZShcbiAgICBjbG9zZTogVG9rZW5UeXBlLFxuICAgIGlzUGF0dGVybjogZmFsc2UsXG4gICAgaXNSZWNvcmQ/OiB0cnVlLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5SZWNvcmRFeHByZXNzaW9uO1xuICBwYXJzZU9iamVjdExpa2U8VCBleHRlbmRzIE4uT2JqZWN0UGF0dGVybiB8IE4uT2JqZWN0RXhwcmVzc2lvbj4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsb3NlOiBUb2tlblR5cGUsXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzUmVjb3JkPzogYm9vbGVhbiB8IG51bGwsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBUIHtcbiAgICBpZiAoaXNSZWNvcmQpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwicmVjb3JkQW5kVHVwbGVcIik7XG4gICAgfVxuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gZmFsc2U7XG4gICAgY29uc3QgcHJvcEhhc2g6IGFueSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8XG4gICAgICBOLk9iamVjdEV4cHJlc3Npb24gfCBOLk9iamVjdFBhdHRlcm4gfCBOLlJlY29yZEV4cHJlc3Npb25cbiAgICA+KCk7XG5cbiAgICBub2RlLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIHdoaWxlICghdGhpcy5tYXRjaChjbG9zZSkpIHtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5tYXRjaChjbG9zZSkpIHtcbiAgICAgICAgICB0aGlzLmFkZFRyYWlsaW5nQ29tbWFFeHRyYVRvTm9kZShcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cykgaW1wcm92ZSBub2RlIHR5cGVzXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHByb3A7XG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AgPSB0aGlzLnBhcnNlQmluZGluZ1Byb3BlcnR5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wID0gdGhpcy5wYXJzZVByb3BlcnR5RGVmaW5pdGlvbihyZWZFeHByZXNzaW9uRXJyb3JzKTtcbiAgICAgICAgdGhpcy5jaGVja1Byb3RvKHByb3AsIGlzUmVjb3JkLCBwcm9wSGFzaCwgcmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNSZWNvcmQgJiZcbiAgICAgICAgIXRoaXMuaXNPYmplY3RQcm9wZXJ0eShwcm9wKSAmJlxuICAgICAgICBwcm9wLnR5cGUgIT09IFwiU3ByZWFkRWxlbWVudFwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW52YWxpZFJlY29yZFByb3BlcnR5LCB7IGF0OiBwcm9wIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNob3J0aGFuZCBtYXkgbm90IGluZGV4IHByb3BcbiAgICAgIGlmIChwcm9wLnNob3J0aGFuZCkge1xuICAgICAgICB0aGlzLmFkZEV4dHJhKHByb3AsIFwic2hvcnRoYW5kXCIsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiByZWZpbmUgdHlwaW5nc1xuICAgICAgbm9kZS5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgfVxuXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gb2xkSW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgbGV0IHR5cGUgPSBcIk9iamVjdEV4cHJlc3Npb25cIjtcbiAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICB0eXBlID0gXCJPYmplY3RQYXR0ZXJuXCI7XG4gICAgfSBlbHNlIGlmIChpc1JlY29yZCkge1xuICAgICAgdHlwZSA9IFwiUmVjb3JkRXhwcmVzc2lvblwiO1xuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgaXMgd2VsbCBkZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgfVxuXG4gIGFkZFRyYWlsaW5nQ29tbWFFeHRyYVRvTm9kZShub2RlOiBOLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwidHJhaWxpbmdDb21tYVwiLCB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydCk7XG4gICAgdGhpcy5hZGRFeHRyYShub2RlLCBcInRyYWlsaW5nQ29tbWFMb2NcIiwgdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsIGZhbHNlKTtcbiAgfVxuXG4gIC8vIENoZWNrIGdyYW1tYXIgcHJvZHVjdGlvbjpcbiAgLy8gICBJZGVudGlmaWVyTmFtZSAqX29wdCBQcm9wZXJ0eU5hbWVcbiAgLy8gSXQgaXMgdXNlZCBpbiBgcGFyc2VQcm9wZXJ0eURlZmluaXRpb25gIHRvIGRldGVjdCBBc3luY01ldGhvZCBhbmQgQWNjZXNzb3JzXG4gIG1heWJlQXN5bmNPckFjY2Vzc29yUHJvcChwcm9wOiBVbmRvbmU8Ti5PYmplY3RQcm9wZXJ0eT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXByb3AuY29tcHV0ZWQgJiZcbiAgICAgIHByb3Aua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAodGhpcy5pc0xpdGVyYWxQcm9wZXJ0eU5hbWUoKSB8fFxuICAgICAgICB0aGlzLm1hdGNoKHR0LmJyYWNrZXRMKSB8fFxuICAgICAgICB0aGlzLm1hdGNoKHR0LnN0YXIpKVxuICAgICk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Qcm9wZXJ0eURlZmluaXRpb25cbiAgcGFyc2VQcm9wZXJ0eURlZmluaXRpb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgKTogTi5PYmplY3RNZW1iZXIgfCBOLlNwcmVhZEVsZW1lbnQge1xuICAgIGxldCBkZWNvcmF0b3JzID0gW107XG4gICAgaWYgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuc3VwcG9ydGVkUHJvcGVydHlEZWNvcmF0b3IsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIG5lZWRuJ3QgY2hlY2sgaWYgZGVjb3JhdG9ycyAoc3RhZ2UgMCkgcGx1Z2luIGlzIGVuYWJsZWQgc2luY2UgaXQncyBjaGVja2VkIGJ5XG4gICAgICAvLyB0aGUgY2FsbCB0byB0aGlzLnBhcnNlRGVjb3JhdG9yXG4gICAgICB3aGlsZSAodGhpcy5tYXRjaCh0dC5hdCkpIHtcbiAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc3RhcnROb2RlPE4uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgbGV0IGlzQXN5bmMgPSBmYWxzZTtcbiAgICBsZXQgaXNBY2Nlc3NvciA9IGZhbHNlO1xuICAgIGxldCBzdGFydExvYztcblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LmVsbGlwc2lzKSkge1xuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlU3ByZWFkKCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICBwcm9wLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgICAgZGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cblxuICAgIHByb3AubWV0aG9kID0gZmFsc2U7XG5cbiAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycykge1xuICAgICAgc3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgIH1cblxuICAgIGxldCBpc0dlbmVyYXRvciA9IHRoaXMuZWF0KHR0LnN0YXIpO1xuICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihwcm9wKTtcbiAgICBjb25zdCBjb250YWluc0VzYyA9IHRoaXMuc3RhdGUuY29udGFpbnNFc2M7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wLCByZWZFeHByZXNzaW9uRXJyb3JzKTtcblxuICAgIGlmICghaXNHZW5lcmF0b3IgJiYgIWNvbnRhaW5zRXNjICYmIHRoaXMubWF5YmVBc3luY09yQWNjZXNzb3JQcm9wKHByb3ApKSB7XG4gICAgICBjb25zdCBrZXlOYW1lID0ga2V5Lm5hbWU7XG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Bc3luY01ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNHZW5lcmF0b3JNZXRob2RcbiAgICAgIGlmIChrZXlOYW1lID09PSBcImFzeW5jXCIgJiYgIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkpIHtcbiAgICAgICAgaXNBc3luYyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGtleSk7XG4gICAgICAgIGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHQuc3Rhcik7XG4gICAgICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgUHJvcGVydHlOYW1lWz9ZaWVsZCwgP0F3YWl0XSAoKSB7IEZ1bmN0aW9uQm9keVt+WWllbGQsIH5Bd2FpdF0gfVxuICAgICAgLy8gc2V0IFByb3BlcnR5TmFtZVs/WWllbGQsID9Bd2FpdF0gKCBQcm9wZXJ0eVNldFBhcmFtZXRlckxpc3QgKSB7IEZ1bmN0aW9uQm9keVt+WWllbGQsIH5Bd2FpdF0gfVxuICAgICAgaWYgKGtleU5hbWUgPT09IFwiZ2V0XCIgfHwga2V5TmFtZSA9PT0gXCJzZXRcIikge1xuICAgICAgICBpc0FjY2Vzc29yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICAgICAgcHJvcC5raW5kID0ga2V5TmFtZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuc3RhcikpIHtcbiAgICAgICAgICBpc0dlbmVyYXRvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQWNjZXNzb3JJc0dlbmVyYXRvciwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuY3VyUG9zaXRpb24oKSxcbiAgICAgICAgICAgIGtpbmQ6IGtleU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZU9ialByb3BWYWx1ZShcbiAgICAgIHByb3AsXG4gICAgICBzdGFydExvYyxcbiAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgaXNBc3luYyxcbiAgICAgIGZhbHNlIC8qIGlzUGF0dGVybiAqLyxcbiAgICAgIGlzQWNjZXNzb3IsXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICk7XG4gIH1cblxuICBnZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQoXG4gICAgbWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QsXG4gICk6IG51bWJlciB7XG4gICAgcmV0dXJuIG1ldGhvZC5raW5kID09PSBcImdldFwiID8gMCA6IDE7XG4gIH1cblxuICAvLyBUaGlzIGV4aXN0cyBzbyB3ZSBjYW4gb3ZlcnJpZGUgd2l0aGluIHRoZSBFU1RyZWUgcGx1Z2luXG4gIGdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpIHtcbiAgICByZXR1cm4gbWV0aG9kLnBhcmFtcztcbiAgfVxuXG4gIC8vIGdldCBtZXRob2RzIGFyZW4ndCBhbGxvd2VkIHRvIGhhdmUgYW55IHBhcmFtZXRlcnNcbiAgLy8gc2V0IG1ldGhvZHMgbXVzdCBoYXZlIGV4YWN0bHkgMSBwYXJhbWV0ZXIgd2hpY2ggaXMgbm90IGEgcmVzdCBwYXJhbWV0ZXJcbiAgY2hlY2tHZXR0ZXJTZXR0ZXJQYXJhbXMobWV0aG9kOiBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbUNvdW50ID0gdGhpcy5nZXRHZXR0ZXJTZXR0ZXJFeHBlY3RlZFBhcmFtQ291bnQobWV0aG9kKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldE9iamVjdE9yQ2xhc3NNZXRob2RQYXJhbXMobWV0aG9kKTtcblxuICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSBwYXJhbUNvdW50KSB7XG4gICAgICB0aGlzLnJhaXNlKFxuICAgICAgICBtZXRob2Qua2luZCA9PT0gXCJnZXRcIiA/IEVycm9ycy5CYWRHZXR0ZXJBcml0eSA6IEVycm9ycy5CYWRTZXR0ZXJBcml0eSxcbiAgICAgICAgeyBhdDogbWV0aG9kIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG1ldGhvZC5raW5kID09PSBcInNldFwiICYmXG4gICAgICBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdPy50eXBlID09PSBcIlJlc3RFbGVtZW50XCJcbiAgICApIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkJhZFNldHRlclJlc3RQYXJhbWV0ZXIsIHsgYXQ6IG1ldGhvZCB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1NZXRob2REZWZpbml0aW9uXG4gIHBhcnNlT2JqZWN0TWV0aG9kKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBwcm9wOiBVbmRvbmU8Ti5PYmplY3RNZXRob2Q+LFxuICAgIGlzR2VuZXJhdG9yOiBib29sZWFuLFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNQYXR0ZXJuOiBib29sZWFuLFxuICAgIGlzQWNjZXNzb3I6IGJvb2xlYW4sXG4gICk6IE4uT2JqZWN0TWV0aG9kIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgaWYgKGlzQWNjZXNzb3IpIHtcbiAgICAgIC8vIGlzQWNjZXNzb3IgaW1wbGllcyBpc0FzeW5jOiBmYWxzZSwgaXNQYXR0ZXJuOiBmYWxzZSwgaXNHZW5lcmF0b3I6IGZhbHNlXG4gICAgICBjb25zdCBmaW5pc2hlZFByb3AgPSB0aGlzLnBhcnNlTWV0aG9kKFxuICAgICAgICBwcm9wLFxuICAgICAgICAvLyBUaGlzIF9zaG91bGRfIGJlIGZhbHNlLCBidXQgd2l0aCBlcnJvciByZWNvdmVyeSwgd2UgYWxsb3cgaXQgdG8gYmVcbiAgICAgICAgLy8gc2V0IGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICAvKiBpc0FzeW5jICovIGZhbHNlLFxuICAgICAgICAvKiBpc0NvbnN0cnVjdG9yICovIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJPYmplY3RNZXRob2RcIixcbiAgICAgICk7XG4gICAgICB0aGlzLmNoZWNrR2V0dGVyU2V0dGVyUGFyYW1zKGZpbmlzaGVkUHJvcCk7XG4gICAgICByZXR1cm4gZmluaXNoZWRQcm9wO1xuICAgIH1cblxuICAgIGlmIChpc0FzeW5jIHx8IGlzR2VuZXJhdG9yIHx8IHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgaWYgKGlzUGF0dGVybikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICBwcm9wLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgcHJvcC5tZXRob2QgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VNZXRob2QoXG4gICAgICAgIHByb3AsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICAvKiBpc0NvbnN0cnVjdG9yICovIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJPYmplY3RNZXRob2RcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYGlzUGF0dGVybmAgaXMgdHJ1ZSwgcGFyc2UgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQmluZGluZ1Byb3BlcnR5XG4gIC8vIGVsc2UgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtUHJvcGVydHlEZWZpbml0aW9uXG4gIHBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdFByb3BlcnR5PixcbiAgICBzdGFydExvYzogUG9zaXRpb24gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIGlzUGF0dGVybjogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uT2JqZWN0UHJvcGVydHkgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBwcm9wLnNob3J0aGFuZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR0LmNvbG9uKSkge1xuICAgICAgcHJvcC52YWx1ZSA9IGlzUGF0dGVyblxuICAgICAgICA/IHRoaXMucGFyc2VNYXliZURlZmF1bHQodGhpcy5zdGF0ZS5zdGFydExvYylcbiAgICAgICAgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKHJlZkV4cHJlc3Npb25FcnJvcnMpO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiT2JqZWN0UHJvcGVydHlcIik7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmNvbXB1dGVkICYmIHByb3Aua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAvLyBQcm9wZXJ0eURlZmluaXRpb246XG4gICAgICAvLyAgIElkZW50aWZpZXJSZWZlcmVuY2VcbiAgICAgIC8vICAgQ292ZXJJbml0aWFsaXplZE5hbWVcbiAgICAgIC8vIE5vdGU6IGB7IGV2YWwgfSA9IHt9YCB3aWxsIGJlIGNoZWNrZWQgaW4gYGNoZWNrTFZhbGAgbGF0ZXIuXG4gICAgICB0aGlzLmNoZWNrUmVzZXJ2ZWRXb3JkKHByb3Aua2V5Lm5hbWUsIHByb3Aua2V5LmxvYy5zdGFydCwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KFxuICAgICAgICAgIHN0YXJ0TG9jLFxuICAgICAgICAgIGNsb25lSWRlbnRpZmllcihwcm9wLmtleSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuZXEpKSB7XG4gICAgICAgIGNvbnN0IHNob3J0aGFuZEFzc2lnbkxvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICAgIGlmIChyZWZFeHByZXNzaW9uRXJyb3JzICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5zaG9ydGhhbmRBc3NpZ25Mb2MgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMuc2hvcnRoYW5kQXNzaWduTG9jID0gc2hvcnRoYW5kQXNzaWduTG9jO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbnZhbGlkQ292ZXJJbml0aWFsaXplZE5hbWUsIHtcbiAgICAgICAgICAgIGF0OiBzaG9ydGhhbmRBc3NpZ25Mb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcC52YWx1ZSA9IHRoaXMucGFyc2VNYXliZURlZmF1bHQoXG4gICAgICAgICAgc3RhcnRMb2MsXG4gICAgICAgICAgY2xvbmVJZGVudGlmaWVyKHByb3Aua2V5KSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3AudmFsdWUgPSBjbG9uZUlkZW50aWZpZXIocHJvcC5rZXkpO1xuICAgICAgfVxuICAgICAgcHJvcC5zaG9ydGhhbmQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiT2JqZWN0UHJvcGVydHlcIik7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VPYmpQcm9wVmFsdWUoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE1ldGhvZCB8IE4uT2JqZWN0UHJvcGVydHk+LFxuICAgIHN0YXJ0TG9jOiBQb3NpdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgaXNHZW5lcmF0b3I6IGJvb2xlYW4sXG4gICAgaXNBc3luYzogYm9vbGVhbixcbiAgICBpc1BhdHRlcm46IGJvb2xlYW4sXG4gICAgaXNBY2Nlc3NvcjogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uT2JqZWN0TWV0aG9kIHwgTi5PYmplY3RQcm9wZXJ0eSB7XG4gICAgY29uc3Qgbm9kZSA9XG4gICAgICB0aGlzLnBhcnNlT2JqZWN0TWV0aG9kKFxuICAgICAgICBwcm9wIGFzIFVuZG9uZTxOLk9iamVjdE1ldGhvZD4sXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc1BhdHRlcm4sXG4gICAgICAgIGlzQWNjZXNzb3IsXG4gICAgICApIHx8XG4gICAgICB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIHByb3AgYXMgVW5kb25lPE4uT2JqZWN0UHJvcGVydHk+LFxuICAgICAgICBzdGFydExvYyxcbiAgICAgICAgaXNQYXR0ZXJuLFxuICAgICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgKTtcblxuICAgIGlmICghbm9kZSkgdGhpcy51bmV4cGVjdGVkKCk7XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVByb3BlcnR5TmFtZVxuICAvLyB3aGVuIHJlZkV4cHJlc3Npb25FcnJvcnMgcHJlc2VudHMsIGl0IHdpbGwgcGFyc2UgcHJpdmF0ZSBuYW1lXG4gIC8vIGFuZCByZWNvcmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwcml2YXRlIG5hbWVcbiAgcGFyc2VQcm9wZXJ0eU5hbWUoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb3A6XG4gICAgICB8IFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXIgfCBOLkNsYXNzTWVtYmVyPlxuICAgICAgfCBOLlRzTmFtZWRUeXBlRWxlbWVudEJhc2UsXG4gICAgcmVmRXhwcmVzc2lvbkVycm9ycz86IEV4cHJlc3Npb25FcnJvcnMgfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBOLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLmVhdCh0dC5icmFja2V0TCkpIHtcbiAgICAgIChwcm9wIGFzIFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXI+KS5jb21wdXRlZCA9IHRydWU7XG4gICAgICBwcm9wLmtleSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNrZXRSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgY2hlY2sgaWYgaXQncyB2YWxpZCBmb3IgaXQgdG8gYmUgYSBwcml2YXRlIG5hbWUgd2hlbiB3ZSBwdXNoIGl0LlxuICAgICAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGxldCBrZXk7XG4gICAgICAvLyBtb3N0IHVuLWNvbXB1dGVkIHByb3BlcnR5IG5hbWVzIGFyZSBpZGVudGlmaWVyc1xuICAgICAgaWYgKHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgIGtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSB0dC5udW06XG4gICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlTnVtZXJpY0xpdGVyYWwodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSB0dC5zdHJpbmc6XG4gICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHR0LmJpZ2ludDpcbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VCaWdJbnRMaXRlcmFsKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgdHQuZGVjaW1hbDpcbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VEZWNpbWFsTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHR0LnByaXZhdGVOYW1lOiB7XG4gICAgICAgICAgICAvLyB0aGUgY2xhc3MgcHJpdmF0ZSBrZXkgaGFzIGJlZW4gaGFuZGxlZCBpbiBwYXJzZUNsYXNzRWxlbWVudE5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByaXZhdGVLZXlMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICAgICAgaWYgKHJlZkV4cHJlc3Npb25FcnJvcnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAocmVmRXhwcmVzc2lvbkVycm9ycy5wcml2YXRlS2V5TG9jID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVmRXhwcmVzc2lvbkVycm9ycy5wcml2YXRlS2V5TG9jID0gcHJpdmF0ZUtleUxvYztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFByaXZhdGVGaWVsZCwge1xuICAgICAgICAgICAgICAgIGF0OiBwcml2YXRlS2V5TG9jLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VQcml2YXRlTmFtZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKHByb3AgYXMgYW55KS5rZXkgPSBrZXk7XG4gICAgICBpZiAodHlwZSAhPT0gdHQucHJpdmF0ZU5hbWUpIHtcbiAgICAgICAgLy8gQ2xhc3NQcml2YXRlUHJvcGVydHkgaXMgbmV2ZXIgY29tcHV0ZWQsIHNvIHdlIGRvbid0IGFzc2lnbiBpbiB0aGF0IGNhc2UuXG4gICAgICAgIHByb3AuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcC5rZXk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGVtcHR5IGZ1bmN0aW9uIG5vZGUuXG5cbiAgaW5pdEZ1bmN0aW9uKG5vZGU6IE4uQm9kaWxlc3NGdW5jdGlvbk9yTWV0aG9kQmFzZSwgaXNBc3luYzogYm9vbGVhbik6IHZvaWQge1xuICAgIG5vZGUuaWQgPSBudWxsO1xuICAgIG5vZGUuZ2VuZXJhdG9yID0gZmFsc2U7XG4gICAgbm9kZS5hc3luYyA9IGlzQXN5bmM7XG4gIH1cblxuICAvLyBQYXJzZSBvYmplY3Qgb3IgY2xhc3MgbWV0aG9kLlxuXG4gIHBhcnNlTWV0aG9kPFQgZXh0ZW5kcyBOLk9iamVjdE1ldGhvZCB8IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJpdmF0ZU1ldGhvZD4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgYWxsb3dEaXJlY3RTdXBlcjogYm9vbGVhbixcbiAgICB0eXBlOiBUW1widHlwZVwiXSxcbiAgICBpbkNsYXNzU2NvcGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogVCB7XG4gICAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSwgaXNBc3luYyk7XG4gICAgbm9kZS5nZW5lcmF0b3IgPSBpc0dlbmVyYXRvcjtcbiAgICB0aGlzLnNjb3BlLmVudGVyKFxuICAgICAgU0NPUEVfRlVOQ1RJT04gfFxuICAgICAgICBTQ09QRV9TVVBFUiB8XG4gICAgICAgIChpbkNsYXNzU2NvcGUgPyBTQ09QRV9DTEFTUyA6IDApIHxcbiAgICAgICAgKGFsbG93RGlyZWN0U3VwZXIgPyBTQ09QRV9ESVJFQ1RfU1VQRVIgOiAwKSxcbiAgICApO1xuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZ1bmN0aW9uRmxhZ3MoaXNBc3luYywgbm9kZS5nZW5lcmF0b3IpKTtcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgaXNDb25zdHJ1Y3Rvcik7XG4gICAgY29uc3QgZmluaXNoZWROb2RlID0gdGhpcy5wYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaChub2RlLCB0eXBlLCB0cnVlKTtcbiAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgdGhpcy5zY29wZS5leGl0KCk7XG5cbiAgICByZXR1cm4gZmluaXNoZWROb2RlO1xuICB9XG5cbiAgLy8gcGFyc2UgYW4gYXJyYXkgbGl0ZXJhbCBvciB0dXBsZSBsaXRlcmFsXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUFycmF5TGl0ZXJhbFxuICAvLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtcmVjb3JkLXR1cGxlLyNwcm9kLVR1cGxlTGl0ZXJhbFxuICBwYXJzZUFycmF5TGlrZShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICBjYW5CZVBhdHRlcm46IGJvb2xlYW4sXG4gICAgaXNUdXBsZTogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICk6IE4uQXJyYXlFeHByZXNzaW9uIHwgTi5UdXBsZUV4cHJlc3Npb24ge1xuICAgIGlmIChpc1R1cGxlKSB7XG4gICAgICB0aGlzLmV4cGVjdFBsdWdpbihcInJlY29yZEFuZFR1cGxlXCIpO1xuICAgIH1cbiAgICBjb25zdCBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG4gICAgdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keSA9IGZhbHNlO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLkFycmF5RXhwcmVzc2lvbiB8IE4uVHVwbGVFeHByZXNzaW9uPigpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwckxpc3QoXG4gICAgICBjbG9zZSxcbiAgICAgIC8qIGFsbG93RW1wdHkgKi8gIWlzVHVwbGUsXG4gICAgICByZWZFeHByZXNzaW9uRXJyb3JzLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgbm9kZSxcbiAgICApO1xuICAgIHRoaXMuc3RhdGUuaW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHkgPSBvbGRJbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzVHVwbGUgPyBcIlR1cGxlRXhwcmVzc2lvblwiIDogXCJBcnJheUV4cHJlc3Npb25cIixcbiAgICApO1xuICB9XG5cbiAgLy8gUGFyc2UgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbi5cbiAgLy8gSWYgdGhlIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGFuXG4gIC8vIGFzc2lnbmFibGUgbGlzdC5cbiAgcGFyc2VBcnJvd0V4cHJlc3Npb24oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPixcbiAgICBwYXJhbXM6IE4uRXhwcmVzc2lvbltdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIHRyYWlsaW5nQ29tbWFMb2M/OiBQb3NpdGlvbiB8IG51bGwsXG4gICk6IE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9BUlJPVyk7XG4gICAgbGV0IGZsYWdzID0gZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBmYWxzZSk7XG4gICAgLy8gQ29uY2lzZUJvZHlbSW5dIDpcbiAgICAvLyAgIFtsb29rYWhlYWQgXHUyMjYwIHtdIEV4cHJlc3Npb25Cb2R5Wz9JbiwgfkF3YWl0XVxuICAgIC8vICAgeyBGdW5jdGlvbkJvZHlbfllpZWxkLCB+QXdhaXRdIH1cbiAgICBpZiAoIXRoaXMubWF0Y2godHQuYnJhY2VMKSAmJiB0aGlzLnByb2RQYXJhbS5oYXNJbikge1xuICAgICAgZmxhZ3MgfD0gUEFSQU1fSU47XG4gICAgfVxuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKGZsYWdzKTtcbiAgICB0aGlzLmluaXRGdW5jdGlvbihub2RlLCBpc0FzeW5jKTtcbiAgICBjb25zdCBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMobm9kZSwgcGFyYW1zLCB0cmFpbGluZ0NvbW1hTG9jKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gZmFsc2U7XG4gICAgdGhpcy5wYXJzZUZ1bmN0aW9uQm9keShub2RlLCB0cnVlKTtcblxuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgc2V0QXJyb3dGdW5jdGlvblBhcmFtZXRlcnMoXG4gICAgbm9kZTogVW5kb25lPE4uQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+LFxuICAgIHBhcmFtczogTi5FeHByZXNzaW9uW10sXG4gICAgdHJhaWxpbmdDb21tYUxvYz86IFBvc2l0aW9uIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJhaWxpbmdDb21tYUxvYywgZmFsc2UpO1xuICAgIG5vZGUucGFyYW1zID0gcGFyYW1zIGFzIChOLlBhdHRlcm4gfCBOLlRTUGFyYW1ldGVyUHJvcGVydHkpW107XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uQm9keUFuZEZpbmlzaDxcbiAgICBUIGV4dGVuZHNcbiAgICAgIHwgTi5GdW5jdGlvblxuICAgICAgfCBOLlRTRGVjbGFyZU1ldGhvZFxuICAgICAgfCBOLlRTRGVjbGFyZUZ1bmN0aW9uXG4gICAgICB8IE4uQ2xhc3NQcml2YXRlTWV0aG9kLFxuICA+KG5vZGU6IFVuZG9uZTxUPiwgdHlwZTogVFtcInR5cGVcIl0sIGlzTWV0aG9kOiBib29sZWFuID0gZmFsc2UpOiBUIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIChub2RlIGlzIG5vdCBib2RpbGVzcyBpZiB3ZSBnZXQgaGVyZSlcbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGZhbHNlLCBpc01ldGhvZCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCB0eXBlKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGZ1bmN0aW9uIGJvZHkgYW5kIGNoZWNrIHBhcmFtZXRlcnMuXG4gIHBhcnNlRnVuY3Rpb25Cb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgYWxsb3dFeHByZXNzaW9uPzogYm9vbGVhbiB8IG51bGwsXG4gICAgaXNNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaXNFeHByZXNzaW9uID0gYWxsb3dFeHByZXNzaW9uICYmICF0aGlzLm1hdGNoKHR0LmJyYWNlTCk7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZW50ZXIobmV3RXhwcmVzc2lvblNjb3BlKCkpO1xuXG4gICAgaWYgKGlzRXhwcmVzc2lvbikge1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRXhwcmVzc2lvbkJvZHlcbiAgICAgIChub2RlIGFzIFVuZG9uZTxOLkFycm93RnVuY3Rpb25FeHByZXNzaW9uPikuYm9keSA9XG4gICAgICAgIHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgICAgdGhpcy5jaGVja1BhcmFtcyhub2RlLCBmYWxzZSwgYWxsb3dFeHByZXNzaW9uLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuICAgICAgLy8gU3RhcnQgYSBuZXcgc2NvcGUgd2l0aCByZWdhcmQgdG8gbGFiZWxzXG4gICAgICAvLyBmbGFnIChyZXN0b3JlIHRoZW0gdG8gdGhlaXIgb2xkIHZhbHVlIGFmdGVyd2FyZHMpLlxuICAgICAgY29uc3Qgb2xkTGFiZWxzID0gdGhpcy5zdGF0ZS5sYWJlbHM7XG4gICAgICB0aGlzLnN0YXRlLmxhYmVscyA9IFtdO1xuXG4gICAgICAvLyBGdW5jdGlvbkJvZHlbWWllbGQsIEF3YWl0XTpcbiAgICAgIC8vICAgU3RhdGVtZW50TGlzdFs/WWllbGQsID9Bd2FpdCwgK1JldHVybl0gb3B0XG4gICAgICB0aGlzLnByb2RQYXJhbS5lbnRlcih0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKSB8IFBBUkFNX1JFVFVSTik7XG4gICAgICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlQmxvY2soXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbiBjaGVja3MgYWZ0ZXIgd2UgcGFyc2UgdGhlIHN0YXRlbWVudHMgaW4gdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICAgIChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9uU2ltcGxlID0gIXRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpO1xuXG4gICAgICAgICAgaWYgKGhhc1N0cmljdE1vZGVEaXJlY3RpdmUgJiYgbm9uU2ltcGxlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGxvZ2ljIGlzIGhlcmUgdG8gYWxpZ24gdGhlIGVycm9yIGxvY2F0aW9uIHdpdGggdGhlIEVTVHJlZSBwbHVnaW4uXG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlLCB7XG4gICAgICAgICAgICAgIGF0OlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2luZCBtYXkgbm90IGluZGV4IG5vZGVcbiAgICAgICAgICAgICAgICAobm9kZS5raW5kID09PSBcIm1ldGhvZFwiIHx8IG5vZGUua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiKSAmJlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgICAgICAgICAgICEhbm9kZS5rZXlcbiAgICAgICAgICAgICAgICAgID8gLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlLmtleSBoYXMgYmVlbiBndWFyZGVkXG4gICAgICAgICAgICAgICAgICAgIG5vZGUua2V5LmxvYy5lbmRcbiAgICAgICAgICAgICAgICAgIDogbm9kZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0cmljdE1vZGVDaGFuZ2VkID0gIW9sZFN0cmljdCAmJiB0aGlzLnN0YXRlLnN0cmljdDtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGFyYW1zIHRvIHZhckRlY2xhcmVkTmFtZXMgdG8gZW5zdXJlIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duXG4gICAgICAgICAgLy8gaWYgYSBsZXQvY29uc3QgZGVjbGFyYXRpb24gaW4gdGhlIGZ1bmN0aW9uIGNsYXNoZXMgd2l0aCBvbmUgb2YgdGhlIHBhcmFtcy5cbiAgICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLnN0cmljdCAmJiAhYWxsb3dFeHByZXNzaW9uICYmICFpc01ldGhvZCAmJiAhbm9uU2ltcGxlLFxuICAgICAgICAgICAgYWxsb3dFeHByZXNzaW9uLFxuICAgICAgICAgICAgc3RyaWN0TW9kZUNoYW5nZWQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZnVuY3Rpb24gbmFtZSBpc24ndCBhIGZvcmJpZGRlbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlLCBlLmcuICdldmFsJ1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCAmJiBub2RlLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWRlbnRpZmllcihub2RlLmlkLCBCSU5EX09VVFNJREUsIHN0cmljdE1vZGVDaGFuZ2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBvbGRMYWJlbHM7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmV4aXQoKTtcbiAgfVxuXG4gIGlzU2ltcGxlUGFyYW1ldGVyKG5vZGU6IE4uUGF0dGVybiB8IE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiO1xuICB9XG5cbiAgaXNTaW1wbGVQYXJhbUxpc3QoXG4gICAgcGFyYW1zOiBSZWFkb25seUFycmF5PE4uUGF0dGVybiB8IE4uVFNQYXJhbWV0ZXJQcm9wZXJ0eT4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1NpbXBsZVBhcmFtZXRlcihwYXJhbXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2hlY2tQYXJhbXMoXG4gICAgbm9kZTogVW5kb25lPE4uRnVuY3Rpb24+LFxuICAgIGFsbG93RHVwbGljYXRlczogYm9vbGVhbixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgaXNBcnJvd0Z1bmN0aW9uPzogYm9vbGVhbiB8IG51bGwsXG4gICAgc3RyaWN0TW9kZUNoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja0NsYXNoZXMgPSAhYWxsb3dEdXBsaWNhdGVzICYmIG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIFdlIGNyZWF0ZSBhIGZha2Ugbm9kZSB3aXRoIHRoZSBcImVwaGVtZXJhbFwiIHR5cGUgYEZvcm1hbFBhcmFtZXRlcnNgWzFdXG4gICAgLy8gc2luY2Ugd2UganVzdCBzdG9yZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBQZXJoYXBzIHNvbWVkYXkgd2UgY2FuIGhhdmVcbiAgICAvLyBzb21ldGhpbmcgbGlrZSBjbGFzcyBGb3JtYWxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXkgeyAuLi4gfSwgd2hpY2ggd291bGRcbiAgICAvLyBhbHNvIGJlIGhlbHBmdWwgd2hlbiB0cmF2ZXJzaW5nIHRoaXMgbm9kZS5cbiAgICAvL1xuICAgIC8vIDEuIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUZvcm1hbFBhcmFtZXRlcnNcbiAgICBjb25zdCBmb3JtYWxQYXJhbWV0ZXJzID0geyB0eXBlOiBcIkZvcm1hbFBhcmFtZXRlcnNcIiB9IGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygbm9kZS5wYXJhbXMpIHtcbiAgICAgIHRoaXMuY2hlY2tMVmFsKHBhcmFtLCB7XG4gICAgICAgIGluOiBmb3JtYWxQYXJhbWV0ZXJzLFxuICAgICAgICBiaW5kaW5nOiBCSU5EX1ZBUixcbiAgICAgICAgY2hlY2tDbGFzaGVzLFxuICAgICAgICBzdHJpY3RNb2RlQ2hhbmdlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLCBhbmQgcmV0dXJucyB0aGVtIGFzXG4gIC8vIGFuIGFycmF5LiBgY2xvc2VgIGlzIHRoZSB0b2tlbiB0eXBlIHRoYXQgZW5kcyB0aGUgbGlzdCwgYW5kXG4gIC8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGhcbiAgLy8gbm90aGluZyBpbiBiZXR3ZWVuIHRoZW0gdG8gYmUgcGFyc2VkIGFzIGBudWxsYCAod2hpY2ggaXMgbmVlZGVkXG4gIC8vIGZvciBhcnJheSBsaXRlcmFscykuXG5cbiAgcGFyc2VFeHByTGlzdChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xvc2U6IFRva2VuVHlwZSxcbiAgICBhbGxvd0VtcHR5PzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgbm9kZUZvckV4dHJhPzogTi5Ob2RlIHwgbnVsbCxcbiAgKTogKE4uRXhwcmVzc2lvbiB8IG51bGwpW10ge1xuICAgIGNvbnN0IGVsdHM6IChOLkV4cHJlc3Npb24gfCBudWxsKVtdID0gW107XG4gICAgbGV0IGZpcnN0ID0gdHJ1ZTtcblxuICAgIHdoaWxlICghdGhpcy5lYXQoY2xvc2UpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goY2xvc2UpKSB7XG4gICAgICAgICAgaWYgKG5vZGVGb3JFeHRyYSkge1xuICAgICAgICAgICAgdGhpcy5hZGRUcmFpbGluZ0NvbW1hRXh0cmFUb05vZGUobm9kZUZvckV4dHJhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWx0cy5wdXNoKHRoaXMucGFyc2VFeHByTGlzdEl0ZW0oYWxsb3dFbXB0eSwgcmVmRXhwcmVzc2lvbkVycm9ycykpO1xuICAgIH1cbiAgICByZXR1cm4gZWx0cztcbiAgfVxuXG4gIHBhcnNlRXhwckxpc3RJdGVtKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBhbGxvd0VtcHR5PzogYm9vbGVhbixcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWxsb3dQbGFjZWhvbGRlcj86IGJvb2xlYW4gfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBudWxsO1xuICBwYXJzZUV4cHJMaXN0SXRlbShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYWxsb3dFbXB0eT86IGZhbHNlLFxuICAgIHJlZkV4cHJlc3Npb25FcnJvcnM/OiBFeHByZXNzaW9uRXJyb3JzIHwgbnVsbCxcbiAgICBhbGxvd1BsYWNlaG9sZGVyPzogYm9vbGVhbiB8IG51bGwsXG4gICk6IE4uRXhwcmVzc2lvbjtcbiAgcGFyc2VFeHByTGlzdEl0ZW0oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGFsbG93RW1wdHk/OiBib29sZWFuIHwgbnVsbCxcbiAgICByZWZFeHByZXNzaW9uRXJyb3JzPzogRXhwcmVzc2lvbkVycm9ycyB8IG51bGwsXG4gICAgYWxsb3dQbGFjZWhvbGRlcj86IGJvb2xlYW4gfCBudWxsLFxuICApOiBOLkV4cHJlc3Npb24gfCBudWxsIHtcbiAgICBsZXQgZWx0O1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmNvbW1hKSkge1xuICAgICAgaWYgKCFhbGxvd0VtcHR5KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRUb2tlbiwge1xuICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmN1clBvc2l0aW9uKCksXG4gICAgICAgICAgdW5leHBlY3RlZDogXCIsXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWx0ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2godHQuZWxsaXBzaXMpKSB7XG4gICAgICBjb25zdCBzcHJlYWROb2RlU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuXG4gICAgICBlbHQgPSB0aGlzLnBhcnNlUGFyZW5JdGVtKFxuICAgICAgICB0aGlzLnBhcnNlU3ByZWFkKHJlZkV4cHJlc3Npb25FcnJvcnMpLFxuICAgICAgICBzcHJlYWROb2RlU3RhcnRMb2MsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaCh0dC5xdWVzdGlvbikpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwicGFydGlhbEFwcGxpY2F0aW9uXCIpO1xuICAgICAgaWYgKCFhbGxvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRBcmd1bWVudFBsYWNlaG9sZGVyLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGVsdCA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oXG4gICAgICAgIHJlZkV4cHJlc3Npb25FcnJvcnMsXG4gICAgICAgIHRoaXMucGFyc2VQYXJlbkl0ZW0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZWx0O1xuICB9XG5cbiAgLy8gUGFyc2UgdGhlIG5leHQgdG9rZW4gYXMgYW4gaWRlbnRpZmllci4gSWYgYGxpYmVyYWxgIGlzIHRydWUgKHVzZWRcbiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvXG4gIC8vIGlkZW50aWZpZXJzLlxuICAvLyBUaGlzIHNob3VsZG4ndCBiZSB1c2VkIHRvIHBhcnNlIHRoZSBrZXl3b3JkcyBvZiBtZXRhIHByb3BlcnRpZXMsIHNpbmNlIHRoZXlcbiAgLy8gYXJlIG5vdCBpZGVudGlmaWVycyBhbmQgY2Fubm90IGNvbnRhaW4gZXNjYXBlIHNlcXVlbmNlcy5cblxuICBwYXJzZUlkZW50aWZpZXIobGliZXJhbD86IGJvb2xlYW4pOiBOLklkZW50aWZpZXIge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTxOLklkZW50aWZpZXI+KCk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZShsaWJlcmFsKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUlkZW50aWZpZXIobm9kZSwgbmFtZSk7XG4gIH1cblxuICBjcmVhdGVJZGVudGlmaWVyKFxuICAgIG5vZGU6IE9taXQ8Ti5JZGVudGlmaWVyLCBcInR5cGVcIj4sXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBOLklkZW50aWZpZXIge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gICAgbm9kZS5sb2MuaWRlbnRpZmllck5hbWUgPSBuYW1lO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklkZW50aWZpZXJcIik7XG4gIH1cblxuICBwYXJzZUlkZW50aWZpZXJOYW1lKGxpYmVyYWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gICAgY29uc3QgeyBzdGFydExvYywgdHlwZSB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmICh0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgbmFtZSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuSXNLZXl3b3JkID0gdG9rZW5LZXl3b3JkT3JJZGVudGlmaWVySXNLZXl3b3JkKHR5cGUpO1xuXG4gICAgaWYgKGxpYmVyYWwpIHtcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHRva2VuIGlzIG5vdCB1c2VkIGFzIGEga2V5d29yZCwgc2V0IGl0cyB0eXBlIHRvIFwidHQubmFtZVwiLlxuICAgICAgLy8gVGhpcyB3aWxsIHByZXZlbnQgdGhpcy5uZXh0KCkgZnJvbSB0aHJvd2luZyBhYm91dCB1bmV4cGVjdGVkIGVzY2FwZXMuXG4gICAgICBpZiAodG9rZW5Jc0tleXdvcmQpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlVG9rZW4odHQubmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQobmFtZSwgc3RhcnRMb2MsIHRva2VuSXNLZXl3b3JkLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIGNoZWNrUmVzZXJ2ZWRXb3JkKFxuICAgIHdvcmQ6IHN0cmluZyxcbiAgICBzdGFydExvYzogUG9zaXRpb24sXG4gICAgY2hlY2tLZXl3b3JkczogYm9vbGVhbixcbiAgICBpc0JpbmRpbmc6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIC8vIEV2ZXJ5IEphdmFTY3JpcHQgcmVzZXJ2ZWQgd29yZCBpcyAxMCBjaGFyYWN0ZXJzIG9yIGxlc3MuXG4gICAgaWYgKHdvcmQubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTW9zdCBpZGVudGlmaWVycyBhcmUgbm90IHJlc2VydmVkV29yZC1saWtlLCB0aGV5IGRvbid0IG5lZWQgc3BlY2lhbFxuICAgIC8vIHRyZWF0bWVudHMgYWZ0ZXJ3YXJkLCB3aGljaCB2ZXJ5IGxpa2VseSBlbmRzIHVwIHRocm93aW5nIGVycm9yc1xuICAgIGlmICghY2FuQmVSZXNlcnZlZFdvcmQod29yZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tLZXl3b3JkcyAmJiBpc0tleXdvcmQod29yZCkpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRLZXl3b3JkLCB7XG4gICAgICAgIGF0OiBzdGFydExvYyxcbiAgICAgICAga2V5d29yZDogd29yZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc2VydmVkVGVzdCA9ICF0aGlzLnN0YXRlLnN0cmljdFxuICAgICAgPyBpc1Jlc2VydmVkV29yZFxuICAgICAgOiBpc0JpbmRpbmdcbiAgICAgID8gaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkXG4gICAgICA6IGlzU3RyaWN0UmVzZXJ2ZWRXb3JkO1xuXG4gICAgaWYgKHJlc2VydmVkVGVzdCh3b3JkLCB0aGlzLmluTW9kdWxlKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFJlc2VydmVkV29yZCwge1xuICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIHJlc2VydmVkV29yZDogd29yZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAod29yZCA9PT0gXCJ5aWVsZFwiKSB7XG4gICAgICBpZiAodGhpcy5wcm9kUGFyYW0uaGFzWWllbGQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuWWllbGRCaW5kaW5nSWRlbnRpZmllciwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHdvcmQgPT09IFwiYXdhaXRcIikge1xuICAgICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkF3YWl0QmluZGluZ0lkZW50aWZpZXIsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNjb3BlLmluU3RhdGljQmxvY2spIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQXdhaXRCaW5kaW5nSWRlbnRpZmllckluU3RhdGljQmxvY2ssIHtcbiAgICAgICAgICBhdDogc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLnJlY29yZEFzeW5jQXJyb3dQYXJhbWV0ZXJzRXJyb3IoeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfSBlbHNlIGlmICh3b3JkID09PSBcImFyZ3VtZW50c1wiKSB7XG4gICAgICBpZiAodGhpcy5zY29wZS5pbkNsYXNzQW5kTm90SW5Ob25BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkFyZ3VtZW50c0luQ2xhc3MsIHsgYXQ6IHN0YXJ0TG9jIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNBd2FpdEFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucHJvZFBhcmFtLmhhc0F3YWl0KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb24gJiYgIXRoaXMuc2NvcGUuaW5GdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBhcnNlcyBhd2FpdCBleHByZXNzaW9uIGluc2lkZSBhc3luYyBmdW5jdGlvbi5cblxuICBwYXJzZUF3YWl0KHRoaXM6IFBhcnNlciwgc3RhcnRMb2M6IFBvc2l0aW9uKTogTi5Bd2FpdEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uQXdhaXRFeHByZXNzaW9uPihzdGFydExvYyk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5yZWNvcmRQYXJhbWV0ZXJJbml0aWFsaXplckVycm9yKFxuICAgICAgRXJyb3JzLkF3YWl0RXhwcmVzc2lvbkZvcm1hbFBhcmFtZXRlcixcbiAgICAgIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICBhdDogbm9kZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmVhdCh0dC5zdGFyKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuT2Jzb2xldGVBd2FpdFN0YXIsIHsgYXQ6IG5vZGUgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNjb3BlLmluRnVuY3Rpb24gJiYgIXRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5pc0FtYmlndW91c0F3YWl0KCkpIHtcbiAgICAgICAgdGhpcy5hbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnNvbG9Bd2FpdCkge1xuICAgICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBd2FpdEV4cHJlc3Npb25cIik7XG4gIH1cblxuICBpc0FtYmlndW91c0F3YWl0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIEFsbCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIGFyZSBhbWJpZ3VvdXM6XG4gICAgICAvLyAgIGF3YWl0ICsgMCwgYXdhaXQgLSAwLCBhd2FpdCAoIDAgKSwgYXdhaXQgWyAwIF0sIGF3YWl0IC8gMCAvdSwgYXdhaXQgYGAsIGF3YWl0IG9mIFtdXG4gICAgICB0eXBlID09PSB0dC5wbHVzTWluIHx8XG4gICAgICB0eXBlID09PSB0dC5wYXJlbkwgfHxcbiAgICAgIHR5cGUgPT09IHR0LmJyYWNrZXRMIHx8XG4gICAgICB0b2tlbklzVGVtcGxhdGUodHlwZSkgfHxcbiAgICAgICh0eXBlID09PSB0dC5fb2YgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHx8XG4gICAgICAvLyBTb21ldGltZXMgdGhlIHRva2VuaXplciBnZW5lcmF0ZXMgdHQuc2xhc2ggZm9yIHJlZ2V4cHMsIGFuZCB0aGlzIGlzXG4gICAgICAvLyBoYW5kbGVyIGJ5IHBhcnNlRXhwckF0b21cbiAgICAgIHR5cGUgPT09IHR0LnJlZ2V4cCB8fFxuICAgICAgdHlwZSA9PT0gdHQuc2xhc2ggfHxcbiAgICAgIC8vIFRoaXMgY29kZSBjb3VsZCBiZSBwYXJzZWQgYm90aCBhcyBhIG1vZHVsbyBvcGVyYXRvciBvciBhcyBhbiBpbnRyaW5zaWM6XG4gICAgICAvLyAgIGF3YWl0ICV4KDApXG4gICAgICAodGhpcy5oYXNQbHVnaW4oXCJ2OGludHJpbnNpY1wiKSAmJiB0eXBlID09PSB0dC5tb2R1bG8pXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBhcnNlcyB5aWVsZCBleHByZXNzaW9uIGluc2lkZSBnZW5lcmF0b3IuXG5cbiAgcGFyc2VZaWVsZCh0aGlzOiBQYXJzZXIpOiBOLllpZWxkRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uWWllbGRFeHByZXNzaW9uPigpO1xuXG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUucmVjb3JkUGFyYW1ldGVySW5pdGlhbGl6ZXJFcnJvcihcbiAgICAgIEVycm9ycy5ZaWVsZEluUGFyYW1ldGVyLFxuICAgICAge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIGF0OiBub2RlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbGV0IGRlbGVnYXRpbmcgPSBmYWxzZTtcbiAgICBsZXQgYXJndW1lbnQ6IE4uRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGlmICghdGhpcy5oYXNQcmVjZWRpbmdMaW5lQnJlYWsoKSkge1xuICAgICAgZGVsZWdhdGluZyA9IHRoaXMuZWF0KHR0LnN0YXIpO1xuICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSB0dC5zZW1pOlxuICAgICAgICBjYXNlIHR0LmVvZjpcbiAgICAgICAgY2FzZSB0dC5icmFjZVI6XG4gICAgICAgIGNhc2UgdHQucGFyZW5SOlxuICAgICAgICBjYXNlIHR0LmJyYWNrZXRSOlxuICAgICAgICBjYXNlIHR0LmJyYWNlQmFyUjpcbiAgICAgICAgY2FzZSB0dC5jb2xvbjpcbiAgICAgICAgY2FzZSB0dC5jb21tYTpcbiAgICAgICAgICAvLyBUaGUgYWJvdmUgaXMgdGhlIGNvbXBsZXRlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW5cbiAgICAgICAgICAvLyBmb2xsb3cgYW4gQXNzaWdubWVudEV4cHJlc3Npb24sIGFuZCBub25lIG9mIHRoZW1cbiAgICAgICAgICAvLyBjYW4gc3RhcnQgYW4gQXNzaWdubWVudEV4cHJlc3Npb25cbiAgICAgICAgICBpZiAoIWRlbGVnYXRpbmcpIGJyZWFrO1xuICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZGVsZWdhdGUgPSBkZWxlZ2F0aW5nO1xuICAgIG5vZGUuYXJndW1lbnQgPSBhcmd1bWVudDtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiWWllbGRFeHByZXNzaW9uXCIpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGVzIGEgcGlwZWxpbmUgKGZvciBhbnkgb2YgdGhlIHBpcGVsaW5lIEJhYnlsb24gcGx1Z2lucykgYXQgdGhlIHBvaW50XG4gIC8vIG9mIHRoZSBpbmZpeCBvcGVyYXRvciBgfD5gLlxuXG4gIGNoZWNrUGlwZWxpbmVBdEluZml4T3BlcmF0b3IobGVmdDogTi5FeHByZXNzaW9uLCBsZWZ0U3RhcnRMb2M6IFBvc2l0aW9uKSB7XG4gICAgaWYgKHRoaXMuaGFzUGx1Z2luKFtcInBpcGVsaW5lT3BlcmF0b3JcIiwgeyBwcm9wb3NhbDogXCJzbWFydFwiIH1dKSkge1xuICAgICAgaWYgKGxlZnQudHlwZSA9PT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGlwZWxpbmUgaGVhZCBpcyBub3QgYSBjb21tYS1kZWxpbWl0ZWRcbiAgICAgICAgLy8gc2VxdWVuY2UgZXhwcmVzc2lvbi5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZWxpbmVIZWFkU2VxdWVuY2VFeHByZXNzaW9uLCB7XG4gICAgICAgICAgYXQ6IGxlZnRTdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTbWFydFBpcGVsaW5lQm9keUluU3R5bGUoY2hpbGRFeHByOiBOLkV4cHJlc3Npb24sIHN0YXJ0TG9jOiBQb3NpdGlvbikge1xuICAgIGlmICh0aGlzLmlzU2ltcGxlUmVmZXJlbmNlKGNoaWxkRXhwcikpIHtcbiAgICAgIGNvbnN0IGJvZHlOb2RlID0gdGhpcy5zdGFydE5vZGVBdDxOLlBpcGVsaW5lQmFyZUZ1bmN0aW9uPihzdGFydExvYyk7XG4gICAgICBib2R5Tm9kZS5jYWxsZWUgPSBjaGlsZEV4cHI7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIlBpcGVsaW5lQmFyZUZ1bmN0aW9uXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib2R5Tm9kZSA9IHRoaXMuc3RhcnROb2RlQXQ8Ti5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4oc3RhcnRMb2MpO1xuICAgICAgdGhpcy5jaGVja1NtYXJ0UGlwZVRvcGljQm9keUVhcmx5RXJyb3JzKHN0YXJ0TG9jKTtcbiAgICAgIGJvZHlOb2RlLmV4cHJlc3Npb24gPSBjaGlsZEV4cHI7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGJvZHlOb2RlLCBcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2ltcGxlUmVmZXJlbmNlKGV4cHJlc3Npb246IE4uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoZXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFleHByZXNzaW9uLmNvbXB1dGVkICYmIHRoaXMuaXNTaW1wbGVSZWZlcmVuY2UoZXhwcmVzc2lvbi5vYmplY3QpXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGltbWVkaWF0ZWx5XG4gIC8vIGFmdGVyIGEgdG9waWMtc3R5bGUgc21hcnQtbWl4IHBpcGUgYm9keSBpcyBwYXJzZWQuXG4gIC8vIFRoZSBgc3RhcnRMb2NgIGlzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcGlwZSBib2R5LlxuXG4gIGNoZWNrU21hcnRQaXBlVG9waWNCb2R5RWFybHlFcnJvcnMoc3RhcnRMb2M6IFBvc2l0aW9uKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGZvbGxvd2luZyB0b2tlbiBpcyBpbnZhbGlkbHkgYD0+YCwgdGhlbiB0aHJvdyBhIGh1bWFuLWZyaWVuZGx5IGVycm9yXG4gICAgLy8gaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSAnVW5leHBlY3RlZCB0b2tlbiwgZXhwZWN0ZWQgXCI7XCInLlxuICAgIC8vIEZvciBleGFtcGxlLCBgeCA9PiB4IHw+IHkgPT4gI2AgKGFzc3VtaW5nIGAjYCBpcyB0aGUgdG9waWMgcmVmZXJlbmNlKVxuICAgIC8vIGdyb3VwcyBpbnRvIGB4ID0+ICh4IHw+IHkpID0+ICNgLFxuICAgIC8vIGFuZCBgKHggfD4geSkgPT4gI2AgaXMgYW4gaW52YWxpZCBhcnJvdyBmdW5jdGlvbi5cbiAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugc21hcnQtbWl4IGB8PmAgaGFzIHRpZ2h0ZXIgcHJlY2VkZW5jZSB0aGFuIGA9PmAuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuYXJyb3cpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5QaXBlbGluZUJvZHlOb0Fycm93LCB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0pO1xuICAgIH1cblxuICAgIC8vIEEgdG9waWMtc3R5bGUgc21hcnQtbWl4IHBpcGUgYm9keSBtdXN0IHVzZSB0aGUgdG9waWMgcmVmZXJlbmNlIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKCF0aGlzLnRvcGljUmVmZXJlbmNlV2FzVXNlZEluQ3VycmVudENvbnRleHQoKSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuUGlwZWxpbmVUb3BpY1VudXNlZCwgeyBhdDogc3RhcnRMb2MgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5hYmxlIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gSGFjay1zdHlsZSBwaXBlIGJvZGllcy5cbiAgLy8gVGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBwYXJzZXIncyB0b3BpYy1jb250ZXh0IHN0YXRlIHRvIGVuYWJsZSBvciBkaXNhYmxlXG4gIC8vIHRoZSB1c2Ugb2YgdG9waWMgcmVmZXJlbmNlcy5cbiAgLy8gVGhlIGZ1bmN0aW9uIHRoZW4gY2FsbHMgYSBjYWxsYmFjaywgdGhlbiByZXNldHMgdGhlIHBhcnNlclxuICAvLyB0byB0aGUgb2xkIHRvcGljLWNvbnRleHQgc3RhdGUgdGhhdCBpdCBoYWQgYmVmb3JlIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLlxuXG4gIHdpdGhUb3BpY0JpbmRpbmdDb250ZXh0PFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3Qgb3V0ZXJDb250ZXh0VG9waWNTdGF0ZSA9IHRoaXMuc3RhdGUudG9waWNDb250ZXh0O1xuICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0ge1xuICAgICAgLy8gRW5hYmxlIHRoZSB1c2Ugb2YgdGhlIHByaW1hcnkgdG9waWMgcmVmZXJlbmNlLlxuICAgICAgbWF4TnVtT2ZSZXNvbHZhYmxlVG9waWNzOiAxLFxuICAgICAgLy8gSGlkZSB0aGUgdXNlIG9mIGFueSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXIgY29udGV4dHMuXG4gICAgICBtYXhUb3BpY0luZGV4OiBudWxsLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0gb3V0ZXJDb250ZXh0VG9waWNTdGF0ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGhlbHBlciBtZXRob2QgaXMgdXNlZCBvbmx5IHdpdGggdGhlIGRlcHJlY2F0ZWQgc21hcnQtbWl4IHBpcGUgcHJvcG9zYWwuXG4gIC8vIERpc2FibGVzIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gc3ludGF4IGNvbnN0cnVjdHNcbiAgLy8gc3VjaCBhcyB0aGUgYm9kaWVzIG9mIGl0ZXJhdGlvbiBzdGF0ZW1lbnRzLlxuICAvLyBUaGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHBhcnNlcidzIHRvcGljLWNvbnRleHQgc3RhdGUgdG8gZW5hYmxlIG9yIGRpc2FibGVcbiAgLy8gdGhlIHVzZSBvZiB0b3BpYyByZWZlcmVuY2VzIHdpdGggdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbi4gVGhleSB0aGVuIHJ1biBhXG4gIC8vIGNhbGxiYWNrLCB0aGVuIHRoZXkgcmVzZXQgdGhlIHBhcnNlciB0byB0aGUgb2xkIHRvcGljLWNvbnRleHQgc3RhdGUgdGhhdCBpdFxuICAvLyBoYWQgYmVmb3JlIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLlxuXG4gIHdpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQ8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oW1wicGlwZWxpbmVPcGVyYXRvclwiLCB7IHByb3Bvc2FsOiBcInNtYXJ0XCIgfV0pKSB7XG4gICAgICAvLyBSZXNldCB0aGUgcGFyc2VyXHUyMDE5cyB0b3BpYyBjb250ZXh0IG9ubHkgaWYgdGhlIHNtYXJ0LW1peCBwaXBlIHByb3Bvc2FsIGlzIGFjdGl2ZS5cbiAgICAgIGNvbnN0IG91dGVyQ29udGV4dFRvcGljU3RhdGUgPSB0aGlzLnN0YXRlLnRvcGljQ29udGV4dDtcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0ID0ge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSB1c2Ugb2YgdGhlIHByaW1hcnkgdG9waWMgcmVmZXJlbmNlLlxuICAgICAgICBtYXhOdW1PZlJlc29sdmFibGVUb3BpY3M6IDAsXG4gICAgICAgIC8vIEhpZGUgdGhlIHVzZSBvZiBhbnkgdG9waWMgcmVmZXJlbmNlcyBmcm9tIG91dGVyIGNvbnRleHRzLlxuICAgICAgICBtYXhUb3BpY0luZGV4OiBudWxsLFxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YXRlLnRvcGljQ29udGV4dCA9IG91dGVyQ29udGV4dFRvcGljU3RhdGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBwaXBlIHByb3Bvc2FsIGlzIFwibWluaW1hbFwiLCBcImZzaGFycFwiLCBvciBcImhhY2tcIixcbiAgICAgIC8vIG9yIGlmIG5vIHBpcGUgcHJvcG9zYWwgaXMgYWN0aXZlLFxuICAgICAgLy8gdGhlbiB0aGUgY2FsbGJhY2sgcmVzdWx0IGlzIHJldHVybmVkXG4gICAgICAvLyB3aXRob3V0IHRvdWNoaW5nIGFueSBleHRyYSBwYXJzZXIgc3RhdGUuXG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICB3aXRoU29sb0F3YWl0UGVybWl0dGluZ0NvbnRleHQ8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBvdXRlckNvbnRleHRTb2xvQXdhaXRTdGF0ZSA9IHRoaXMuc3RhdGUuc29sb0F3YWl0O1xuICAgIHRoaXMuc3RhdGUuc29sb0F3YWl0ID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGF0ZS5zb2xvQXdhaXQgPSBvdXRlckNvbnRleHRTb2xvQXdhaXRTdGF0ZTtcbiAgICB9XG4gIH1cblxuICBhbGxvd0luQW5kPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKTtcbiAgICBjb25zdCBwcm9kUGFyYW1Ub1NldCA9IFBBUkFNX0lOICYgfmZsYWdzO1xuICAgIGlmIChwcm9kUGFyYW1Ub1NldCkge1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZmxhZ3MgfCBQQVJBTV9JTik7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICBkaXNhbGxvd0luQW5kPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3QgZmxhZ3MgPSB0aGlzLnByb2RQYXJhbS5jdXJyZW50RmxhZ3MoKTtcbiAgICBjb25zdCBwcm9kUGFyYW1Ub0NsZWFyID0gUEFSQU1fSU4gJiBmbGFncztcbiAgICBpZiAocHJvZFBhcmFtVG9DbGVhcikge1xuICAgICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZmxhZ3MgJiB+UEFSQU1fSU4pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnByb2RQYXJhbS5leGl0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHVzZSBvZiBhIHRvcGljIHJlZmVyZW5jZSB3aXRoaW4gdGhlIGN1cnJlbnRcbiAgLy8gdG9waWMtYmluZGluZyBjb250ZXh0LlxuICByZWdpc3RlclRvcGljUmVmZXJlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0Lm1heFRvcGljSW5kZXggPSAwO1xuICB9XG5cbiAgdG9waWNSZWZlcmVuY2VJc0FsbG93ZWRJbkN1cnJlbnRDb250ZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnRvcGljQ29udGV4dC5tYXhOdW1PZlJlc29sdmFibGVUb3BpY3MgPj0gMTtcbiAgfVxuXG4gIHRvcGljUmVmZXJlbmNlV2FzVXNlZEluQ3VycmVudENvbnRleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdGUudG9waWNDb250ZXh0Lm1heFRvcGljSW5kZXggIT0gbnVsbCAmJlxuICAgICAgdGhpcy5zdGF0ZS50b3BpY0NvbnRleHQubWF4VG9waWNJbmRleCA+PSAwXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlRlNoYXJwUGlwZWxpbmVCb2R5KHRoaXM6IFBhcnNlciwgcHJlYzogbnVtYmVyKTogTi5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICB0aGlzLnN0YXRlLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgIGNvbnN0IG9sZEluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdGhpcy5zdGF0ZS5pbkZTaGFycFBpcGVsaW5lRGlyZWN0Qm9keTtcbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJldCA9IHRoaXMucGFyc2VFeHByT3AoXG4gICAgICB0aGlzLnBhcnNlTWF5YmVVbmFyeU9yUHJpdmF0ZSgpLFxuICAgICAgc3RhcnRMb2MsXG4gICAgICBwcmVjLFxuICAgICk7XG5cbiAgICB0aGlzLnN0YXRlLmluRlNoYXJwUGlwZWxpbmVEaXJlY3RCb2R5ID0gb2xkSW5GU2hhcnBQaXBlbGluZURpcmVjdEJvZHk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtanMtbW9kdWxlLWJsb2Nrc1xuICBwYXJzZU1vZHVsZUV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5Nb2R1bGVFeHByZXNzaW9uIHtcbiAgICB0aGlzLmV4cGVjdFBsdWdpbihcIm1vZHVsZUJsb2Nrc1wiKTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5Nb2R1bGVFeHByZXNzaW9uPigpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgXCJtb2R1bGVcIlxuICAgIGlmICghdGhpcy5tYXRjaCh0dC5icmFjZUwpKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQobnVsbCwgdHQuYnJhY2VMKTtcbiAgICB9XG4gICAgLy8gc3RhcnQgcHJvZ3JhbSBub2RlIGltbWVkaWF0ZWx5IGFmdGVyIGB7YFxuICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnN0YXJ0Tm9kZUF0PE4uUHJvZ3JhbT4odGhpcy5zdGF0ZS5lbmRMb2MpO1xuICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHtgXG5cbiAgICBjb25zdCByZXZlcnRTY29wZXMgPSB0aGlzLmluaXRpYWxpemVTY29wZXMoLyoqIGluTW9kdWxlICovIHRydWUpO1xuICAgIHRoaXMuZW50ZXJJbml0aWFsU2NvcGVzKCk7XG5cbiAgICB0cnkge1xuICAgICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVByb2dyYW0ocHJvZ3JhbSwgdHQuYnJhY2VSLCBcIm1vZHVsZVwiKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmV2ZXJ0U2NvcGVzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGU8Ti5Nb2R1bGVFeHByZXNzaW9uPihub2RlLCBcIk1vZHVsZUV4cHJlc3Npb25cIik7XG4gIH1cblxuICAvLyBVc2VkIGluIEZsb3cgcGx1Z2luXG4gIHBhcnNlUHJvcGVydHlOYW1lUHJlZml4T3BlcmF0b3IoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3A6IFVuZG9uZTxOLk9iamVjdE9yQ2xhc3NNZW1iZXIgfCBOLkNsYXNzTWVtYmVyPixcbiAgKTogdm9pZCB7fVxufVxuIiwgImltcG9ydCB0eXBlICogYXMgTiBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIHRva2VuSXNJZGVudGlmaWVyLFxuICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcixcbiAgdG9rZW5Jc0xvb3AsXG4gIHRva2VuSXNUZW1wbGF0ZSxcbiAgdHQsXG4gIHR5cGUgVG9rZW5UeXBlLFxuICBnZXRFeHBvcnRlZFRva2VuLFxufSBmcm9tIFwiLi4vdG9rZW5pemVyL3R5cGVzXCI7XG5pbXBvcnQgRXhwcmVzc2lvblBhcnNlciBmcm9tIFwiLi9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBFcnJvcnMgfSBmcm9tIFwiLi4vcGFyc2UtZXJyb3JcIjtcbmltcG9ydCB7IGlzSWRlbnRpZmllckNoYXIsIGlzSWRlbnRpZmllclN0YXJ0IH0gZnJvbSBcIi4uL3V0aWwvaWRlbnRpZmllclwiO1xuaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcbmltcG9ydCB7XG4gIEJJTkRfQ0xBU1MsXG4gIEJJTkRfTEVYSUNBTCxcbiAgQklORF9WQVIsXG4gIEJJTkRfRlVOQ1RJT04sXG4gIFNDT1BFX0NMQVNTLFxuICBTQ09QRV9GVU5DVElPTixcbiAgU0NPUEVfT1RIRVIsXG4gIFNDT1BFX1NJTVBMRV9DQVRDSCxcbiAgU0NPUEVfU1RBVElDX0JMT0NLLFxuICBTQ09QRV9TVVBFUixcbiAgQ0xBU1NfRUxFTUVOVF9PVEhFUixcbiAgQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9HRVRURVIsXG4gIENMQVNTX0VMRU1FTlRfSU5TVEFOQ0VfU0VUVEVSLFxuICBDTEFTU19FTEVNRU5UX1NUQVRJQ19HRVRURVIsXG4gIENMQVNTX0VMRU1FTlRfU1RBVElDX1NFVFRFUixcbiAgdHlwZSBCaW5kaW5nVHlwZXMsXG4gIEJJTkRfQ0FUQ0hfUEFSQU0sXG59IGZyb20gXCIuLi91dGlsL3Njb3BlZmxhZ3NcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25FcnJvcnMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBQQVJBTSwgZnVuY3Rpb25GbGFncyB9IGZyb20gXCIuLi91dGlsL3Byb2R1Y3Rpb24tcGFyYW1ldGVyXCI7XG5pbXBvcnQge1xuICBuZXdFeHByZXNzaW9uU2NvcGUsXG4gIG5ld1BhcmFtZXRlckRlY2xhcmF0aW9uU2NvcGUsXG59IGZyb20gXCIuLi91dGlsL2V4cHJlc3Npb24tc2NvcGVcIjtcbmltcG9ydCB0eXBlIHsgU291cmNlVHlwZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCIuLi90b2tlbml6ZXJcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vdXRpbC9sb2NhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0IH0gZnJvbSBcIi4uL3V0aWwvbG9jYXRpb25cIjtcbmltcG9ydCB7IGNsb25lU3RyaW5nTGl0ZXJhbCwgY2xvbmVJZGVudGlmaWVyLCB0eXBlIFVuZG9uZSB9IGZyb20gXCIuL25vZGVcIjtcbmltcG9ydCB0eXBlIFBhcnNlciBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgUGFyc2VCaW5kaW5nTGlzdEZsYWdzIH0gZnJvbSBcIi4vbHZhbFwiO1xuXG5jb25zdCBsb29wTGFiZWwgPSB7IGtpbmQ6IFwibG9vcFwiIH0gYXMgY29uc3QsXG4gIHN3aXRjaExhYmVsID0geyBraW5kOiBcInN3aXRjaFwiIH0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlRnVuY3Rpb25GbGFnIHtcbiAgRXhwcmVzc2lvbiA9IDBiMDAwMCxcbiAgRGVjbGFyYXRpb24gPSAwYjAwMDEsXG4gIEhhbmdpbmdEZWNsYXJhdGlvbiA9IDBiMDAxMCxcbiAgTnVsbGFibGVJZCA9IDBiMDEwMCxcbiAgQXN5bmMgPSAwYjEwMDAsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBhcnNlU3RhdGVtZW50RmxhZyB7XG4gIFN0YXRlbWVudE9ubHkgPSAwYjAwMDAsXG4gIEFsbG93SW1wb3J0RXhwb3J0ID0gMGIwMDAxLFxuICBBbGxvd0RlY2xhcmF0aW9uID0gMGIwMDEwLFxuICBBbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb24gPSAwYjAxMDAsXG4gIEFsbG93TGFiZWxlZEZ1bmN0aW9uID0gMGIxMDAwLFxufVxuXG5jb25zdCBsb25lU3Vycm9nYXRlID0gL1tcXHVEODAwLVxcdURGRkZdL3U7XG5cbmNvbnN0IGtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3IgPSAvaW4oPzpzdGFuY2VvZik/L3k7XG5cbi8qKlxuICogQ29udmVydCB0b2tlbnMgZm9yIGJhY2t3YXJkIEJhYmVsIDcgY29tcGF0LlxuICogdHQucHJpdmF0ZU5hbWUgPT4gdHQuaGFzaCArIHR0Lm5hbWVcbiAqIHR0LnRlbXBsYXRlVGFpbCA9PiB0dC5iYWNrcXVvdGUvdHQuYnJhY2VSICsgdHQudGVtcGxhdGUgKyB0dC5iYWNrcXVvdGVcbiAqIHR0LnRlbXBsYXRlTm9uVGFpbCA9PiB0dC5iYWNrcXVvdGUvdHQuYnJhY2VSICsgdHQudGVtcGxhdGUgKyB0dC5kb2xsYXJCcmFjZUxcbiAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoaXMgcm91dGluZSBtdXRhdGVzIGB0b2tlbnNgLCBpdCBpcyBva2F5XG4gKiBoZXJlIHNpbmNlIHdlIGV4ZWN1dGUgYHBhcnNlVG9wTGV2ZWxgIG9uY2UgZm9yIGV2ZXJ5IGZpbGUuXG4gKi9cbmZ1bmN0aW9uIGJhYmVsN0NvbXBhdFRva2Vucyh0b2tlbnM6IChUb2tlbiB8IE4uQ29tbWVudClbXSwgaW5wdXQ6IHN0cmluZykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gdG9rZW47XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHR0LnByaXZhdGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgeyBsb2MsIHN0YXJ0LCB2YWx1ZSwgZW5kIH0gPSB0b2tlbjtcbiAgICAgICAgICBjb25zdCBoYXNoRW5kUG9zID0gc3RhcnQgKyAxO1xuICAgICAgICAgIGNvbnN0IGhhc2hFbmRMb2MgPSBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQobG9jLnN0YXJ0LCAxKTtcbiAgICAgICAgICB0b2tlbnMuc3BsaWNlKFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQuaGFzaCksXG4gICAgICAgICAgICAgIHZhbHVlOiBcIiNcIixcbiAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICBlbmQ6IGhhc2hFbmRQb3MsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBsb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZExvYzogaGFzaEVuZExvYyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFRva2VuKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGFja3kgd2F5IHRvIGNyZWF0ZSB0b2tlblxuICAgICAgICAgICAgICB0eXBlOiBnZXRFeHBvcnRlZFRva2VuKHR0Lm5hbWUpLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIHN0YXJ0OiBoYXNoRW5kUG9zLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IGhhc2hFbmRMb2MsXG4gICAgICAgICAgICAgIGVuZExvYzogbG9jLmVuZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuSXNUZW1wbGF0ZSh0eXBlKSkge1xuICAgICAgICAgIGNvbnN0IHsgbG9jLCBzdGFydCwgdmFsdWUsIGVuZCB9ID0gdG9rZW47XG4gICAgICAgICAgY29uc3QgYmFja3F1b3RlRW5kID0gc3RhcnQgKyAxO1xuICAgICAgICAgIGNvbnN0IGJhY2txdW90ZUVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChsb2Muc3RhcnQsIDEpO1xuICAgICAgICAgIGxldCBzdGFydFRva2VuO1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gY2hhckNvZGVzLmdyYXZlQWNjZW50KSB7XG4gICAgICAgICAgICBzdGFydFRva2VuID0gbmV3IFRva2VuKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogaGFja3kgd2F5IHRvIGNyZWF0ZSB0b2tlblxuICAgICAgICAgICAgICB0eXBlOiBnZXRFeHBvcnRlZFRva2VuKHR0LmJhY2tRdW90ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBcImBcIixcbiAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICBlbmQ6IGJhY2txdW90ZUVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IGxvYy5zdGFydCxcbiAgICAgICAgICAgICAgZW5kTG9jOiBiYWNrcXVvdGVFbmRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRUb2tlbiA9IG5ldyBUb2tlbih7XG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhhY2t5IHdheSB0byBjcmVhdGUgdG9rZW5cbiAgICAgICAgICAgICAgdHlwZTogZ2V0RXhwb3J0ZWRUb2tlbih0dC5icmFjZVIpLFxuICAgICAgICAgICAgICB2YWx1ZTogXCJ9XCIsXG4gICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgICAgZW5kOiBiYWNrcXVvdGVFbmQsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBsb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZExvYzogYmFja3F1b3RlRW5kTG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB0ZW1wbGF0ZVZhbHVlLFxuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kTG9jLFxuICAgICAgICAgICAgZW5kVG9rZW47XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHR0LnRlbXBsYXRlVGFpbCkge1xuICAgICAgICAgICAgLy8gZW5kcyB3aXRoICdgJ1xuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kID0gZW5kIC0gMTtcbiAgICAgICAgICAgIHRlbXBsYXRlRWxlbWVudEVuZExvYyA9IGNyZWF0ZVBvc2l0aW9uV2l0aENvbHVtbk9mZnNldChsb2MuZW5kLCAtMSk7XG4gICAgICAgICAgICB0ZW1wbGF0ZVZhbHVlID0gdmFsdWUgPT09IG51bGwgPyBudWxsIDogdmFsdWUuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgZW5kVG9rZW4gPSBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQuYmFja1F1b3RlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiYFwiLFxuICAgICAgICAgICAgICBzdGFydDogdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IHRlbXBsYXRlRWxlbWVudEVuZExvYyxcbiAgICAgICAgICAgICAgZW5kTG9jOiBsb2MuZW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuZHMgd2l0aCBgJHtgXG4gICAgICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRFbmQgPSBlbmQgLSAyO1xuICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50RW5kTG9jID0gY3JlYXRlUG9zaXRpb25XaXRoQ29sdW1uT2Zmc2V0KGxvYy5lbmQsIC0yKTtcbiAgICAgICAgICAgIHRlbXBsYXRlVmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiB2YWx1ZS5zbGljZSgxLCAtMik7XG4gICAgICAgICAgICBlbmRUb2tlbiA9IG5ldyBUb2tlbih7XG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhhY2t5IHdheSB0byBjcmVhdGUgdG9rZW5cbiAgICAgICAgICAgICAgdHlwZTogZ2V0RXhwb3J0ZWRUb2tlbih0dC5kb2xsYXJCcmFjZUwpLFxuICAgICAgICAgICAgICB2YWx1ZTogXCIke1wiLFxuICAgICAgICAgICAgICBzdGFydDogdGVtcGxhdGVFbGVtZW50RW5kLFxuICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgc3RhcnRMb2M6IHRlbXBsYXRlRWxlbWVudEVuZExvYyxcbiAgICAgICAgICAgICAgZW5kTG9jOiBsb2MuZW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRva2Vucy5zcGxpY2UoXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIHN0YXJ0VG9rZW4sXG4gICAgICAgICAgICBuZXcgVG9rZW4oe1xuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoYWNreSB3YXkgdG8gY3JlYXRlIHRva2VuXG4gICAgICAgICAgICAgIHR5cGU6IGdldEV4cG9ydGVkVG9rZW4odHQudGVtcGxhdGUpLFxuICAgICAgICAgICAgICB2YWx1ZTogdGVtcGxhdGVWYWx1ZSxcbiAgICAgICAgICAgICAgc3RhcnQ6IGJhY2txdW90ZUVuZCxcbiAgICAgICAgICAgICAgZW5kOiB0ZW1wbGF0ZUVsZW1lbnRFbmQsXG4gICAgICAgICAgICAgIHN0YXJ0TG9jOiBiYWNrcXVvdGVFbmRMb2MsXG4gICAgICAgICAgICAgIGVuZExvYzogdGVtcGxhdGVFbGVtZW50RW5kTG9jLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUb2tlbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2UgbWFuaXB1bGF0ZSBgdG9rZW5gIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gICAgICB0b2tlbi50eXBlID0gZ2V0RXhwb3J0ZWRUb2tlbih0eXBlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFBhcnNlciBleHRlbmRzIEV4cHJlc3Npb25QYXJzZXIge1xuICAvLyAjIyMgU3RhdGVtZW50IHBhcnNpbmdcblxuICAvLyBQYXJzZSBhIHByb2dyYW0uIEluaXRpYWxpemVzIHRoZSBwYXJzZXIsIHJlYWRzIGFueSBudW1iZXIgb2ZcbiAgLy8gc3RhdGVtZW50cywgYW5kIHdyYXBzIHRoZW0gaW4gYSBQcm9ncmFtIG5vZGUuICBPcHRpb25hbGx5IHRha2VzIGFcbiAgLy8gYHByb2dyYW1gIGFyZ3VtZW50LiAgSWYgcHJlc2VudCwgdGhlIHN0YXRlbWVudHMgd2lsbCBiZSBhcHBlbmRlZFxuICAvLyB0byBpdHMgYm9keSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG5vZGUuXG5cbiAgcGFyc2VUb3BMZXZlbCh0aGlzOiBQYXJzZXIsIGZpbGU6IE4uRmlsZSwgcHJvZ3JhbTogTi5Qcm9ncmFtKTogTi5GaWxlIHtcbiAgICBmaWxlLnByb2dyYW0gPSB0aGlzLnBhcnNlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICBmaWxlLmNvbW1lbnRzID0gdGhpcy5zdGF0ZS5jb21tZW50cztcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9rZW5zKSB7XG4gICAgICBmaWxlLnRva2VucyA9IGJhYmVsN0NvbXBhdFRva2Vucyh0aGlzLnRva2VucywgdGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShmaWxlLCBcIkZpbGVcIik7XG4gIH1cblxuICBwYXJzZVByb2dyYW0oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIHByb2dyYW06IFVuZG9uZTxOLlByb2dyYW0+LFxuICAgIGVuZDogVG9rZW5UeXBlID0gdHQuZW9mLFxuICAgIHNvdXJjZVR5cGU6IFNvdXJjZVR5cGUgPSB0aGlzLm9wdGlvbnMuc291cmNlVHlwZSxcbiAgKTogTi5Qcm9ncmFtIHtcbiAgICBwcm9ncmFtLnNvdXJjZVR5cGUgPSBzb3VyY2VUeXBlO1xuICAgIHByb2dyYW0uaW50ZXJwcmV0ZXIgPSB0aGlzLnBhcnNlSW50ZXJwcmV0ZXJEaXJlY3RpdmUoKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tCb2R5KHByb2dyYW0sIHRydWUsIHRydWUsIGVuZCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbk1vZHVsZSAmJlxuICAgICAgIXRoaXMub3B0aW9ucy5hbGxvd1VuZGVjbGFyZWRFeHBvcnRzICYmXG4gICAgICB0aGlzLnNjb3BlLnVuZGVmaW5lZEV4cG9ydHMuc2l6ZSA+IDBcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgW2xvY2FsTmFtZSwgYXRdIG9mIEFycmF5LmZyb20odGhpcy5zY29wZS51bmRlZmluZWRFeHBvcnRzKSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVFeHBvcnRVbmRlZmluZWQsIHsgYXQsIGxvY2FsTmFtZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGZpbmlzaGVkUHJvZ3JhbTogTi5Qcm9ncmFtO1xuICAgIGlmIChlbmQgPT09IHR0LmVvZikge1xuICAgICAgLy8gZmluaXNoIGF0IGVvZiBmb3IgdG9wIGxldmVsIHByb2dyYW1cbiAgICAgIGZpbmlzaGVkUHJvZ3JhbSA9IHRoaXMuZmluaXNoTm9kZShwcm9ncmFtLCBcIlByb2dyYW1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZpbmlzaCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGVuZCB0b2tlblxuICAgICAgZmluaXNoZWRQcm9ncmFtID0gdGhpcy5maW5pc2hOb2RlQXQoXG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIFwiUHJvZ3JhbVwiLFxuICAgICAgICBjcmVhdGVQb3NpdGlvbldpdGhDb2x1bW5PZmZzZXQodGhpcy5zdGF0ZS5zdGFydExvYywgLTEpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmlzaGVkUHJvZ3JhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYXN0IGEgU3RhdGVtZW50IHRvIGEgRGlyZWN0aXZlLiBUaGlzIG1ldGhvZCBtdXRhdGVzIGlucHV0IHN0YXRlbWVudC5cbiAgICovXG4gIHN0bXRUb0RpcmVjdGl2ZShzdG10OiBOLlN0YXRlbWVudCk6IE4uRGlyZWN0aXZlIHtcbiAgICBjb25zdCBkaXJlY3RpdmUgPSBzdG10IGFzIGFueTtcbiAgICBkaXJlY3RpdmUudHlwZSA9IFwiRGlyZWN0aXZlXCI7XG4gICAgZGlyZWN0aXZlLnZhbHVlID0gZGlyZWN0aXZlLmV4cHJlc3Npb247XG4gICAgZGVsZXRlIGRpcmVjdGl2ZS5leHByZXNzaW9uO1xuXG4gICAgY29uc3QgZGlyZWN0aXZlTGl0ZXJhbCA9IGRpcmVjdGl2ZS52YWx1ZTtcbiAgICBjb25zdCBleHByZXNzaW9uVmFsdWUgPSBkaXJlY3RpdmVMaXRlcmFsLnZhbHVlO1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuaW5wdXQuc2xpY2UoZGlyZWN0aXZlTGl0ZXJhbC5zdGFydCwgZGlyZWN0aXZlTGl0ZXJhbC5lbmQpO1xuICAgIGNvbnN0IHZhbCA9IChkaXJlY3RpdmVMaXRlcmFsLnZhbHVlID0gcmF3LnNsaWNlKDEsIC0xKSk7IC8vIHJlbW92ZSBxdW90ZXNcblxuICAgIHRoaXMuYWRkRXh0cmEoZGlyZWN0aXZlTGl0ZXJhbCwgXCJyYXdcIiwgcmF3KTtcbiAgICB0aGlzLmFkZEV4dHJhKGRpcmVjdGl2ZUxpdGVyYWwsIFwicmF3VmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLmFkZEV4dHJhKGRpcmVjdGl2ZUxpdGVyYWwsIFwiZXhwcmVzc2lvblZhbHVlXCIsIGV4cHJlc3Npb25WYWx1ZSk7XG5cbiAgICBkaXJlY3RpdmVMaXRlcmFsLnR5cGUgPSBcIkRpcmVjdGl2ZUxpdGVyYWxcIjtcblxuICAgIHJldHVybiBkaXJlY3RpdmU7XG4gIH1cblxuICBwYXJzZUludGVycHJldGVyRGlyZWN0aXZlKCk6IE4uSW50ZXJwcmV0ZXJEaXJlY3RpdmUgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubWF0Y2godHQuaW50ZXJwcmV0ZXJEaXJlY3RpdmUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5JbnRlcnByZXRlckRpcmVjdGl2ZT4oKTtcbiAgICBub2RlLnZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIik7XG4gIH1cblxuICBpc0xldCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKHR0Ll9sZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc0ZvbGxvd2luZ0JpbmRpbmdBdG9tKCk7XG4gIH1cblxuICBjaFN0YXJ0c0JpbmRpbmdJZGVudGlmaWVyKGNoOiBudW1iZXIsIHBvczogbnVtYmVyKSB7XG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KGNoKSkge1xuICAgICAga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvci5sYXN0SW5kZXggPSBwb3M7XG4gICAgICBpZiAoa2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvci50ZXN0KHRoaXMuaW5wdXQpKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VlbiBgaW5gIG9yIGBpbnN0YW5jZW9mYCBzbyBmYXIsIG5vdyBjaGVjayBpZiB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBlbmRzIGhlcmVcbiAgICAgICAgY29uc3QgZW5kQ2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKGtleXdvcmRSZWxhdGlvbmFsT3BlcmF0b3IubGFzdEluZGV4KTtcbiAgICAgICAgaWYgKCFpc0lkZW50aWZpZXJDaGFyKGVuZENoKSAmJiBlbmRDaCAhPT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gY2hhckNvZGVzLmJhY2tzbGFzaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjaFN0YXJ0c0JpbmRpbmdQYXR0ZXJuKGNoOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2ggPT09IGNoYXJDb2Rlcy5sZWZ0U3F1YXJlQnJhY2tldCB8fCBjaCA9PT0gY2hhckNvZGVzLmxlZnRDdXJseUJyYWNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3N1bWluZyB3ZSBoYXZlIHNlZW4gYSBjb250ZXh0dWFsIGBsZXRgIGFuZCBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkLCBjaGVjayBpZiBpdFxuICAgKiBzdGFydHMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzbyB0aGF0IGl0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIGtleXdvcmQuXG4gICAqL1xuICBoYXNGb2xsb3dpbmdCaW5kaW5nQXRvbSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5TdGFydCgpO1xuICAgIGNvbnN0IG5leHRDaCA9IHRoaXMuY29kZVBvaW50QXRQb3MobmV4dCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hTdGFydHNCaW5kaW5nUGF0dGVybihuZXh0Q2gpIHx8XG4gICAgICB0aGlzLmNoU3RhcnRzQmluZGluZ0lkZW50aWZpZXIobmV4dENoLCBuZXh0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXNzdW1pbmcgd2UgaGF2ZSBzZWVuIGEgY29udGV4dHVhbCBgdXNpbmdgIGFuZCBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkLCBjaGVjayBpZiBpdFxuICAgKiBzdGFydHMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpbiB0aGUgc2FtZSBsaW5lIHNvIHRoYXQgaXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gICAqIGEga2V5d29yZC5cbiAgICovXG4gIGhhc0luTGluZUZvbGxvd2luZ0JpbmRpbmdJZGVudGlmaWVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlbkluTGluZVN0YXJ0KCk7XG4gICAgY29uc3QgbmV4dENoID0gdGhpcy5jb2RlUG9pbnRBdFBvcyhuZXh0KTtcbiAgICByZXR1cm4gdGhpcy5jaFN0YXJ0c0JpbmRpbmdJZGVudGlmaWVyKG5leHRDaCwgbmV4dCk7XG4gIH1cblxuICBzdGFydHNVc2luZ0Zvck9mKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgdHlwZSwgY29udGFpbnNFc2MgfSA9IHRoaXMubG9va2FoZWFkKCk7XG4gICAgaWYgKHR5cGUgPT09IHR0Ll9vZiAmJiAhY29udGFpbnNFc2MpIHtcbiAgICAgIC8vIGB1c2luZyBvZmAgbXVzdCBzdGFydCBhIGZvci1saHMtb2Ygc3RhdGVtZW50XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0b2tlbklzSWRlbnRpZmllcih0eXBlKSAmJiAhdGhpcy5oYXNGb2xsb3dpbmdMaW5lQnJlYWsoKSkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBsaWNpdFJlc291cmNlTWFuYWdlbWVudFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0c0F3YWl0VXNpbmcoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHQgPSB0aGlzLm5leHRUb2tlbkluTGluZVN0YXJ0KCk7XG4gICAgaWYgKHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgXCJ1c2luZ1wiKSkge1xuICAgICAgbmV4dCA9IHRoaXMubmV4dFRva2VuSW5MaW5lU3RhcnRTaW5jZShuZXh0ICsgNSk7XG4gICAgICBjb25zdCBuZXh0Q2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHQpO1xuICAgICAgaWYgKHRoaXMuY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihuZXh0Q2gsIG5leHQpKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiZXhwbGljaXRSZXNvdXJjZU1hbmFnZW1lbnRcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Nb2R1bGVJdGVtXG4gIHBhcnNlTW9kdWxlSXRlbSh0aGlzOiBQYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoXG4gICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dJbXBvcnRFeHBvcnQgfFxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dEZWNsYXJhdGlvbiB8XG4gICAgICAgIFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb24gfFxuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGFsc28gdXNlZCB0byBwYXJzZSBTdGF0ZW1lbnRJdGVtcyxcbiAgICAgICAgLy8gd2hpY2ggd2l0aCBBbm5leCBCIGVuYWJsZWQgYWxsb3dzIGxhYmVsZWQgZnVuY3Rpb25zLlxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dMYWJlbGVkRnVuY3Rpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVN0YXRlbWVudExpc3RJdGVtXG4gIHBhcnNlU3RhdGVtZW50TGlzdEl0ZW0odGhpczogUGFyc2VyKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRMaWtlKFxuICAgICAgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93RGVjbGFyYXRpb24gfFxuICAgICAgICBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uIHxcbiAgICAgICAgKCF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8IHRoaXMuc3RhdGUuc3RyaWN0XG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dMYWJlbGVkRnVuY3Rpb24pLFxuICAgICk7XG4gIH1cblxuICBwYXJzZVN0YXRlbWVudE9yU2xvcHB5QW5uZXhCRnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgYWxsb3dMYWJlbGVkRnVuY3Rpb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgbGV0IGZsYWdzOiBQYXJzZVN0YXRlbWVudEZsYWcgPSBQYXJzZVN0YXRlbWVudEZsYWcuU3RhdGVtZW50T25seTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFubmV4QiAmJiAhdGhpcy5zdGF0ZS5zdHJpY3QpIHtcbiAgICAgIGZsYWdzIHw9IFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0Z1bmN0aW9uRGVjbGFyYXRpb247XG4gICAgICBpZiAoYWxsb3dMYWJlbGVkRnVuY3Rpb24pIHtcbiAgICAgICAgZmxhZ3MgfD0gUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93TGFiZWxlZEZ1bmN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoZmxhZ3MpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAvL1xuICAvLyBJZiBleHBlY3RpbmcgYSBzdGF0ZW1lbnQgYW5kIGZpbmRpbmcgYSBzbGFzaCBvcGVyYXRvciwgcGFyc2UgYVxuICAvLyByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbC4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgbGlrZVxuICAvLyBgaWYgKGZvbykgL2JsYWgvLmV4ZWMoZm9vKWAsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuXG4gIC8vIGRvZXMgbm90IGhlbHAuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLVN0YXRlbWVudFxuICBwYXJzZVN0YXRlbWVudCh0aGlzOiBQYXJzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudExpa2UoUGFyc2VTdGF0ZW1lbnRGbGFnLlN0YXRlbWVudE9ubHkpO1xuICB9XG5cbiAgLy8gSW1wb3J0RGVjbGFyYXRpb24gYW5kIEV4cG9ydERlY2xhcmF0aW9uIGFyZSBhbHNvIGhhbmRsZWQgaGVyZSBzbyB3ZSBjYW4gdGhyb3cgcmVjb3ZlcmFibGUgZXJyb3JzXG4gIC8vIHdoZW4gdGhleSBhcmUgbm90IGF0IHRoZSB0b3AgbGV2ZWxcbiAgcGFyc2VTdGF0ZW1lbnRMaWtlKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBmbGFnczogUGFyc2VTdGF0ZW1lbnRGbGFnLFxuICApOlxuICAgIHwgTi5TdGF0ZW1lbnRcbiAgICB8IE4uRGVjbGFyYXRpb25cbiAgICB8IE4uSW1wb3J0RGVjbGFyYXRpb25cbiAgICB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXG4gICAgfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cbiAgICB8IE4uRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICAgIGxldCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5hdCkpIHtcbiAgICAgIGRlY29yYXRvcnMgPSB0aGlzLnBhcnNlRGVjb3JhdG9ycyh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRDb250ZW50KGZsYWdzLCBkZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHBhcnNlU3RhdGVtZW50Q29udGVudChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgICBkZWNvcmF0b3JzPzogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICk6IE4uU3RhdGVtZW50IHtcbiAgICBjb25zdCBzdGFydHR5cGUgPSB0aGlzLnN0YXRlLnR5cGU7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgY29uc3QgYWxsb3dEZWNsYXJhdGlvbiA9ICEhKGZsYWdzICYgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93RGVjbGFyYXRpb24pO1xuICAgIGNvbnN0IGFsbG93RnVuY3Rpb25EZWNsYXJhdGlvbiA9ICEhKFxuICAgICAgZmxhZ3MgJiBQYXJzZVN0YXRlbWVudEZsYWcuQWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgKTtcbiAgICBjb25zdCB0b3BMZXZlbCA9IGZsYWdzICYgUGFyc2VTdGF0ZW1lbnRGbGFnLkFsbG93SW1wb3J0RXhwb3J0O1xuXG4gICAgLy8gTW9zdCB0eXBlcyBvZiBzdGF0ZW1lbnRzIGFyZSByZWNvZ25pemVkIGJ5IHRoZSBrZXl3b3JkIHRoZXlcbiAgICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2ZcbiAgICAvLyBjb21wbGV4aXR5LlxuXG4gICAgc3dpdGNoIChzdGFydHR5cGUpIHtcbiAgICAgIGNhc2UgdHQuX2JyZWFrOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgLyogaXNCcmVhayAqLyB0cnVlKTtcbiAgICAgIGNhc2UgdHQuX2NvbnRpbnVlOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgLyogaXNCcmVhayAqLyBmYWxzZSk7XG4gICAgICBjYXNlIHR0Ll9kZWJ1Z2dlcjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkRlYnVnZ2VyU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9kbzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEb1doaWxlU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uRG9XaGlsZVN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fZm9yOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZvclN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkZvclN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fZnVuY3Rpb246XG4gICAgICAgIGlmICh0aGlzLmxvb2thaGVhZENoYXJDb2RlKCkgPT09IGNoYXJDb2Rlcy5kb3QpIGJyZWFrO1xuICAgICAgICBpZiAoIWFsbG93RnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0cmljdFxuICAgICAgICAgICAgICA/IEVycm9ycy5TdHJpY3RGdW5jdGlvblxuICAgICAgICAgICAgICA6IHRoaXMub3B0aW9ucy5hbm5leEJcbiAgICAgICAgICAgICAgPyBFcnJvcnMuU2xvcHB5RnVuY3Rpb25Bbm5leEJcbiAgICAgICAgICAgICAgOiBFcnJvcnMuU2xvcHB5RnVuY3Rpb24sXG4gICAgICAgICAgICB7IGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uU3RhdGVtZW50KFxuICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgIWFsbG93RGVjbGFyYXRpb24gJiYgYWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICAgICAgICApO1xuICAgICAgY2FzZSB0dC5fY2xhc3M6XG4gICAgICAgIGlmICghYWxsb3dEZWNsYXJhdGlvbikgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoXG4gICAgICAgICAgdGhpcy5tYXliZVRha2VEZWNvcmF0b3JzKFxuICAgICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uQ2xhc3NEZWNsYXJhdGlvbj4sXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuXG4gICAgICBjYXNlIHR0Ll9pZjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJZlN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLklmU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9yZXR1cm46XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uUmV0dXJuU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9zd2l0Y2g6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3dpdGNoU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uU3dpdGNoU3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll90aHJvdzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUaHJvd1N0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLlRocm93U3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll90cnk6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uVHJ5U3RhdGVtZW50Pik7XG5cbiAgICAgIGNhc2UgdHQuX2F3YWl0OlxuICAgICAgICAvLyBbK0F3YWl0XSBhd2FpdCBbbm8gTGluZVRlcm1pbmF0b3IgaGVyZV0gdXNpbmcgW25vIExpbmVUZXJtaW5hdG9yIGhlcmVdIEJpbmRpbmdMaXN0WytVc2luZ11cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmNvbnRhaW5zRXNjICYmIHRoaXMuc3RhcnRzQXdhaXRVc2luZygpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQXdhaXRBbGxvd2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkF3YWl0VXNpbmdOb3RJbkFzeW5jQ29udGV4dCwgeyBhdDogbm9kZSB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTGV4aWNhbERlY2xhcmF0aW9uLCB7XG4gICAgICAgICAgICAgIGF0OiBub2RlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJ2F3YWl0J1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVmFyU3RhdGVtZW50KFxuICAgICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICAgIFwiYXdhaXQgdXNpbmdcIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0dC5fdXNpbmc6XG4gICAgICAgIC8vIHVzaW5nIFtubyBMaW5lVGVybWluYXRvciBoZXJlXSBCaW5kaW5nTGlzdFsrVXNpbmddXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmNvbnRhaW5zRXNjIHx8XG4gICAgICAgICAgIXRoaXMuaGFzSW5MaW5lRm9sbG93aW5nQmluZGluZ0lkZW50aWZpZXIoKVxuICAgICAgICApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGVjdFBsdWdpbihcImV4cGxpY2l0UmVzb3VyY2VNYW5hZ2VtZW50XCIpO1xuICAgICAgICBpZiAoIXRoaXMuc2NvcGUuaW5Nb2R1bGUgJiYgdGhpcy5zY29wZS5pblRvcExldmVsKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZFVzaW5nRGVjbGFyYXRpb24sIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZExleGljYWxEZWNsYXJhdGlvbiwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICBcInVzaW5nXCIsXG4gICAgICAgICk7XG4gICAgICBjYXNlIHR0Ll9sZXQ6IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBgbGV0IFtgIGlzIGFuIGV4cGxpY2l0IG5lZ2F0aXZlIGxvb2thaGVhZCBmb3JcbiAgICAgICAgLy8gRXhwcmVzc2lvblN0YXRlbWVudCwgc28gc3BlY2lhbC1jYXNlIGl0IGZpcnN0LlxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5TdGFydCgpO1xuICAgICAgICBjb25zdCBuZXh0Q2ggPSB0aGlzLmNvZGVQb2ludEF0UG9zKG5leHQpO1xuICAgICAgICBpZiAobmV4dENoICE9PSBjaGFyQ29kZXMubGVmdFNxdWFyZUJyYWNrZXQpIHtcbiAgICAgICAgICBpZiAoIWFsbG93RGVjbGFyYXRpb24gJiYgdGhpcy5oYXNGb2xsb3dpbmdMaW5lQnJlYWsoKSkgYnJlYWs7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY2hTdGFydHNCaW5kaW5nSWRlbnRpZmllcihuZXh0Q2gsIG5leHQpICYmXG4gICAgICAgICAgICBuZXh0Q2ggIT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX2NvbnN0OiB7XG4gICAgICAgIGlmICghYWxsb3dEZWNsYXJhdGlvbikge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLlVuZXhwZWN0ZWRMZXhpY2FsRGVjbGFyYXRpb24sIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX3Zhcjoge1xuICAgICAgICBjb25zdCBraW5kID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPixcbiAgICAgICAgICBraW5kLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSB0dC5fd2hpbGU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQobm9kZSBhcyBVbmRvbmU8Ti5XaGlsZVN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5fd2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KG5vZGUgYXMgVW5kb25lPE4uV2l0aFN0YXRlbWVudD4pO1xuICAgICAgY2FzZSB0dC5icmFjZUw6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICAgIGNhc2UgdHQuc2VtaTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFbXB0eVN0YXRlbWVudChub2RlIGFzIFVuZG9uZTxOLkVtcHR5U3RhdGVtZW50Pik7XG4gICAgICBjYXNlIHR0Ll9pbXBvcnQ6IHtcbiAgICAgICAgY29uc3QgbmV4dFRva2VuQ2hhckNvZGUgPSB0aGlzLmxvb2thaGVhZENoYXJDb2RlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0VG9rZW5DaGFyQ29kZSA9PT0gY2hhckNvZGVzLmxlZnRQYXJlbnRoZXNpcyB8fCAvLyBpbXBvcnQoKVxuICAgICAgICAgIG5leHRUb2tlbkNoYXJDb2RlID09PSBjaGFyQ29kZXMuZG90IC8vIGltcG9ydC5tZXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgdHQuX2V4cG9ydDoge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmUgJiYgIXRvcExldmVsKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuVW5leHBlY3RlZEltcG9ydEV4cG9ydCwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGBpbXBvcnRgL2BleHBvcnRgXG5cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgaWYgKHN0YXJ0dHlwZSA9PT0gdHQuX2ltcG9ydCkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VJbXBvcnQobm9kZSBhcyBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIiAmJlxuICAgICAgICAgICAgKCFyZXN1bHQuaW1wb3J0S2luZCB8fCByZXN1bHQuaW1wb3J0S2luZCA9PT0gXCJ2YWx1ZVwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VFeHBvcnQoXG4gICAgICAgICAgICBub2RlIGFzIFVuZG9uZTxcbiAgICAgICAgICAgICAgfCBOLkV4cG9ydEFsbERlY2xhcmF0aW9uXG4gICAgICAgICAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgfCBOLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblxuICAgICAgICAgICAgPixcbiAgICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChyZXN1bHQudHlwZSA9PT0gXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgKCFyZXN1bHQuZXhwb3J0S2luZCB8fCByZXN1bHQuZXhwb3J0S2luZCA9PT0gXCJ2YWx1ZVwiKSkgfHxcbiAgICAgICAgICAgIChyZXN1bHQudHlwZSA9PT0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiICYmXG4gICAgICAgICAgICAgICghcmVzdWx0LmV4cG9ydEtpbmQgfHwgcmVzdWx0LmV4cG9ydEtpbmQgPT09IFwidmFsdWVcIikpIHx8XG4gICAgICAgICAgICByZXN1bHQudHlwZSA9PT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zYXdVbmFtYmlndW91c0VTTSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hc3NlcnRNb2R1bGVOb2RlQWxsb3dlZChyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuaXNBc3luY0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICBpZiAoIWFsbG93RGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkFzeW5jRnVuY3Rpb25JblNpbmdsZVN0YXRlbWVudENvbnRleHQsIHtcbiAgICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnYXN5bmMnXG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChcbiAgICAgICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgIWFsbG93RGVjbGFyYXRpb24gJiYgYWxsb3dGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc3RhdGVtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGF0ZW1lbnQga2V5d29yZCBvciBhXG4gICAgLy8gYnJhY2UsIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudCBvciBMYWJlbGVkU3RhdGVtZW50LiBXZVxuICAgIC8vIHNpbXBseSBzdGFydCBwYXJzaW5nIGFuIGV4cHJlc3Npb24sIGFuZCBhZnRlcndhcmRzLCBpZiB0aGVcbiAgICAvLyBuZXh0IHRva2VuIGlzIGEgY29sb24gYW5kIHRoZSBleHByZXNzaW9uIHdhcyBhIHNpbXBsZVxuICAgIC8vIElkZW50aWZpZXIgbm9kZSwgd2Ugc3dpdGNoIHRvIGludGVycHJldGluZyBpdCBhcyBhIGxhYmVsLlxuICAgIGNvbnN0IG1heWJlTmFtZSA9IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoXG4gICAgICB0b2tlbklzSWRlbnRpZmllcihzdGFydHR5cGUpICYmXG4gICAgICBleHByLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICB0aGlzLmVhdCh0dC5jb2xvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlTGFiZWxlZFN0YXRlbWVudChcbiAgICAgICAgbm9kZSBhcyBVbmRvbmU8Ti5MYWJlbGVkU3RhdGVtZW50PixcbiAgICAgICAgbWF5YmVOYW1lLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1pZ3JhdGUgdG8gQmFiZWwgdHlwZXNcbiAgICAgICAgZXhwcixcbiAgICAgICAgZmxhZ3MsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXhwcmVzc2lvblN0YXRlbWVudD4sXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGRlY29yYXRvcnMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzc2VydE1vZHVsZU5vZGVBbGxvd2VkKG5vZGU6IE4uTm9kZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZSAmJiAhdGhpcy5pbk1vZHVsZSkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSW1wb3J0T3V0c2lkZU1vZHVsZSwgeyBhdDogbm9kZSB9KTtcbiAgICB9XG4gIH1cblxuICBkZWNvcmF0b3JzRW5hYmxlZEJlZm9yZUV4cG9ydCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzLWxlZ2FjeVwiKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaGFzUGx1Z2luKFwiZGVjb3JhdG9yc1wiKSAmJlxuICAgICAgdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJkZWNvcmF0b3JzXCIsIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiKSAhPT0gZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLy8gQXR0YWNoIHRoZSBkZWNvcmF0b3JzIHRvIHRoZSBnaXZlbiBjbGFzcy5cbiAgLy8gTk9URTogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgLnN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBjbGFzcywgYW5kIHRodXNcbiAgLy8gY2FuIGFmZmVjdCBjb21tZW50IGF0dGFjaG1lbnQuIENhbGxpbmcgaXQgYmVmb3JlIG9yIGFmdGVyIGZpbmFsaXppbmdcbiAgLy8gdGhlIGNsYXNzIG5vZGUgKGFuZCB0aHVzIGZpbmFsaXppbmcgaXRzIGNvbW1lbnRzKSBjaGFuZ2VzIGhvdyBjb21tZW50c1xuICAvLyBiZWZvcmUgdGhlIGBjbGFzc2Aga2V5d29yZCBvciBiZWZvcmUgdGhlIGZpbmFsIC5zdGFydCBsb2NhdGlvbiBvZiB0aGVcbiAgLy8gY2xhc3MgYXJlIGF0dGFjaGVkLlxuICBtYXliZVRha2VEZWNvcmF0b3JzPFQgZXh0ZW5kcyBVbmRvbmU8Ti5DbGFzcz4+KFxuICAgIG1heWJlRGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICAgY2xhc3NOb2RlOiBULFxuICAgIGV4cG9ydE5vZGU/OiBVbmRvbmU8Ti5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICApOiBUIHtcbiAgICBpZiAobWF5YmVEZWNvcmF0b3JzKSB7XG4gICAgICBpZiAoY2xhc3NOb2RlLmRlY29yYXRvcnMgJiYgY2xhc3NOb2RlLmRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBOb3RlOiBkZWNvcmF0b3JzIGF0dGFjaG1lbnQgaXMgb25seSBhdHRlbXByZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgLy8gd2hlbiB0aGUgY2xhc3MgaXMgcGFydCBvZiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdGhpcy5nZXRQbHVnaW5PcHRpb24oXG4gICAgICAgICAgICBcImRlY29yYXRvcnNcIixcbiAgICAgICAgICAgIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiLFxuICAgICAgICAgICkgIT09IFwiYm9vbGVhblwiXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGBkZWNvcmF0b3JzQmVmb3JlRXhwb3J0YCB3YXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgLCB3ZVxuICAgICAgICAgIC8vIGFscmVhZHkgdGhyZXcgYW4gZXJyb3IgYWJvdXQgZGVjb3JhdG9ycyBub3QgYmVpbmcgaW4gYSB2YWxpZFxuICAgICAgICAgIC8vIHBvc2l0aW9uLlxuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvcnNCZWZvcmVBZnRlckV4cG9ydCwge1xuICAgICAgICAgICAgYXQ6IGNsYXNzTm9kZS5kZWNvcmF0b3JzWzBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTm9kZS5kZWNvcmF0b3JzLnVuc2hpZnQoLi4ubWF5YmVEZWNvcmF0b3JzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTm9kZS5kZWNvcmF0b3JzID0gbWF5YmVEZWNvcmF0b3JzO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShjbGFzc05vZGUsIG1heWJlRGVjb3JhdG9yc1swXSk7XG4gICAgICBpZiAoZXhwb3J0Tm9kZSkgdGhpcy5yZXNldFN0YXJ0TG9jYXRpb25Gcm9tTm9kZShleHBvcnROb2RlLCBjbGFzc05vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOb2RlO1xuICB9XG5cbiAgY2FuSGF2ZUxlYWRpbmdEZWNvcmF0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQuX2NsYXNzKTtcbiAgfVxuXG4gIHBhcnNlRGVjb3JhdG9ycyh0aGlzOiBQYXJzZXIsIGFsbG93RXhwb3J0PzogYm9vbGVhbik6IE4uRGVjb3JhdG9yW10ge1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2godGhpcy5wYXJzZURlY29yYXRvcigpKTtcbiAgICB9IHdoaWxlICh0aGlzLm1hdGNoKHR0LmF0KSk7XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5fZXhwb3J0KSkge1xuICAgICAgaWYgKCFhbGxvd0V4cG9ydCkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRlY29yYXRvcnNFbmFibGVkQmVmb3JlRXhwb3J0KCkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yRXhwb3J0Q2xhc3MsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5jYW5IYXZlTGVhZGluZ0RlY29yYXRvcigpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbmV4cGVjdGVkTGVhZGluZ0RlY29yYXRvciwge1xuICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG5cbiAgcGFyc2VEZWNvcmF0b3IodGhpczogUGFyc2VyKTogTi5EZWNvcmF0b3Ige1xuICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImRlY29yYXRvcnNcIiwgXCJkZWNvcmF0b3JzLWxlZ2FjeVwiXSk7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5EZWNvcmF0b3I+KCk7XG4gICAgdGhpcy5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJkZWNvcmF0b3JzXCIpKSB7XG4gICAgICBjb25zdCBzdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG4gICAgICBsZXQgZXhwcjogTi5FeHByZXNzaW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5wYXJlbkwpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TG9jID0gdGhpcy5zdGF0ZS5zdGFydExvYztcbiAgICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnKCdcbiAgICAgICAgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG4gICAgICAgIGV4cHIgPSB0aGlzLndyYXBQYXJlbnRoZXNpcyhzdGFydExvYywgZXhwcik7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zU3RhcnRMb2MgPSB0aGlzLnN0YXRlLnN0YXJ0TG9jO1xuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHMoZXhwcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFBsdWdpbk9wdGlvbihcImRlY29yYXRvcnNcIiwgXCJhbGxvd0NhbGxQYXJlbnRoZXNpemVkXCIpID09PVxuICAgICAgICAgICAgZmFsc2UgJiZcbiAgICAgICAgICBub2RlLmV4cHJlc3Npb24gIT09IGV4cHJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQXJndW1lbnRzT3V0c2lkZVBhcmVudGhlc2VzLCB7XG4gICAgICAgICAgICBhdDogcGFyYW1zU3RhcnRMb2MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlSWRlbnRpZmllcihmYWxzZSk7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuZWF0KHR0LmRvdCkpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydExvYyk7XG4gICAgICAgICAgbm9kZS5vYmplY3QgPSBleHByO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKHR0LnByaXZhdGVOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc1Njb3BlLnVzZVByaXZhdGVOYW1lKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlUHJpdmF0ZU5hbWUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5wcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLmV4cHJlc3Npb24gPSB0aGlzLnBhcnNlTWF5YmVEZWNvcmF0b3JBcmd1bWVudHMoZXhwcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VFeHByU3Vic2NyaXB0cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVjb3JhdG9yXCIpO1xuICB9XG5cbiAgcGFyc2VNYXliZURlY29yYXRvckFyZ3VtZW50cyh0aGlzOiBQYXJzZXIsIGV4cHI6IE4uRXhwcmVzc2lvbik6IE4uRXhwcmVzc2lvbiB7XG4gICAgaWYgKHRoaXMuZWF0KHR0LnBhcmVuTCkpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZShleHByKTtcbiAgICAgIG5vZGUuY2FsbGVlID0gZXhwcjtcbiAgICAgIG5vZGUuYXJndW1lbnRzID0gdGhpcy5wYXJzZUNhbGxFeHByZXNzaW9uQXJndW1lbnRzKHR0LnBhcmVuUiwgZmFsc2UpO1xuICAgICAgdGhpcy50b1JlZmVyZW5jZWRMaXN0KG5vZGUuYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5Ob2RlPixcbiAgICBpc0JyZWFrOiB0cnVlLFxuICApOiBOLkJyZWFrU3RhdGVtZW50O1xuICBwYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQoXG4gICAgbm9kZTogVW5kb25lPE4uTm9kZT4sXG4gICAgaXNCcmVhazogZmFsc2UsXG4gICk6IE4uQ29udGludWVTdGF0ZW1lbnQ7XG4gIHBhcnNlQnJlYWtDb250aW51ZVN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5CcmVha1N0YXRlbWVudCB8IE4uQ29udGludWVTdGF0ZW1lbnQ+LFxuICAgIGlzQnJlYWs6IGJvb2xlYW4sXG4gICk6IE4uQnJlYWtTdGF0ZW1lbnQgfCBOLkNvbnRpbnVlU3RhdGVtZW50IHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgbm9kZS5sYWJlbCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUubGFiZWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLnZlcmlmeUJyZWFrQ29udGludWUobm9kZSwgaXNCcmVhayk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIsXG4gICAgKTtcbiAgfVxuXG4gIHZlcmlmeUJyZWFrQ29udGludWUoXG4gICAgbm9kZTogVW5kb25lPE4uQnJlYWtTdGF0ZW1lbnQgfCBOLkNvbnRpbnVlU3RhdGVtZW50PixcbiAgICBpc0JyZWFrOiBib29sZWFuLFxuICApIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGxhYiA9IHRoaXMuc3RhdGUubGFiZWxzW2ldO1xuICAgICAgaWYgKG5vZGUubGFiZWwgPT0gbnVsbCB8fCBsYWIubmFtZSA9PT0gbm9kZS5sYWJlbC5uYW1lKSB7XG4gICAgICAgIGlmIChsYWIua2luZCAhPSBudWxsICYmIChpc0JyZWFrIHx8IGxhYi5raW5kID09PSBcImxvb3BcIikpIGJyZWFrO1xuICAgICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IHRoaXMuc3RhdGUubGFiZWxzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdHlwZSA9IGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCI7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbGxlZ2FsQnJlYWtDb250aW51ZSwgeyBhdDogbm9kZSwgdHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBwYXJzZURlYnVnZ2VyU3RhdGVtZW50KFxuICAgIG5vZGU6IFVuZG9uZTxOLkRlYnVnZ2VyU3RhdGVtZW50PixcbiAgKTogTi5EZWJ1Z2dlclN0YXRlbWVudCB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIik7XG4gIH1cblxuICBwYXJzZUhlYWRlckV4cHJlc3Npb24odGhpczogUGFyc2VyKTogTi5FeHByZXNzaW9uIHtcbiAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRG9XaGlsZVN0YXRlbWVudFxuICBwYXJzZURvV2hpbGVTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkRvV2hpbGVTdGF0ZW1lbnQ+LFxuICApOiBOLkRvV2hpbGVTdGF0ZW1lbnQge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcblxuICAgIC8vIFBhcnNlIHRoZSBsb29wIGJvZHkncyBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgIC8vIGNvbnRleHRzIHdpdGhpbiB0aGUgbG9vcCBib2R5LiBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucyxcbiAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGxvb3AgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5J3MgYm9keS5cbiAgICAgICAgdGhpcy5wYXJzZVN0YXRlbWVudCgpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc3RhdGUubGFiZWxzLnBvcCgpO1xuXG4gICAgdGhpcy5leHBlY3QodHQuX3doaWxlKTtcbiAgICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlSGVhZGVyRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZWF0KHR0LnNlbWkpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJEb1doaWxlU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gRGlzYW1iaWd1YXRpbmcgYmV0d2VlbiBhIGBmb3JgIGFuZCBhIGBmb3JgL2BpbmAgb3IgYGZvcmAvYG9mYFxuICAvLyBsb29wIGlzIG5vbi10cml2aWFsLiBCYXNpY2FsbHksIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGluaXQgYHZhcmBcbiAgLy8gc3RhdGVtZW50IG9yIGV4cHJlc3Npb24sIGRpc2FsbG93aW5nIHRoZSBgaW5gIG9wZXJhdG9yIChzZWVcbiAgLy8gdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYHBhcnNlRXhwcmVzc2lvbmApLCBhbmQgdGhlbiBjaGVja1xuICAvLyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAgb3IgYG9mYC4gV2hlbiB0aGVyZSBpcyBubyBpbml0XG4gIC8vIHBhcnQgKHNlbWljb2xvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyksIGl0XG4gIC8vIGlzIGEgcmVndWxhciBgZm9yYCBsb29wLlxuXG4gIHBhcnNlRm9yU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQgfCBOLkZvckluT2Y+LFxuICApOiBOLkZvckxpa2Uge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcblxuICAgIGxldCBhd2FpdEF0ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLmlzQXdhaXRBbGxvd2VkKCkgJiYgdGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hd2FpdCkpIHtcbiAgICAgIGF3YWl0QXQgPSB0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYztcbiAgICB9XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5MKTtcblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LnNlbWkpKSB7XG4gICAgICBpZiAoYXdhaXRBdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvcihub2RlIGFzIFVuZG9uZTxOLkZvclN0YXRlbWVudD4sIG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0c1dpdGhMZXQgPSB0aGlzLmlzQ29udGV4dHVhbCh0dC5fbGV0KTtcbiAgICB7XG4gICAgICBjb25zdCBzdGFydHNXaXRoQXdhaXRVc2luZyA9XG4gICAgICAgIHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hd2FpdCkgJiYgdGhpcy5zdGFydHNBd2FpdFVzaW5nKCk7XG4gICAgICBjb25zdCBzdGFyc1dpdGhVc2luZ0RlY2xhcmF0aW9uID1cbiAgICAgICAgc3RhcnRzV2l0aEF3YWl0VXNpbmcgfHxcbiAgICAgICAgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll91c2luZykgJiYgdGhpcy5zdGFydHNVc2luZ0Zvck9mKCkpO1xuICAgICAgY29uc3QgaXNMZXRPclVzaW5nID1cbiAgICAgICAgKHN0YXJ0c1dpdGhMZXQgJiYgdGhpcy5oYXNGb2xsb3dpbmdCaW5kaW5nQXRvbSgpKSB8fFxuICAgICAgICBzdGFyc1dpdGhVc2luZ0RlY2xhcmF0aW9uO1xuXG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5fdmFyKSB8fCB0aGlzLm1hdGNoKHR0Ll9jb25zdCkgfHwgaXNMZXRPclVzaW5nKSB7XG4gICAgICAgIGNvbnN0IGluaXROb2RlID0gdGhpcy5zdGFydE5vZGU8Ti5WYXJpYWJsZURlY2xhcmF0aW9uPigpO1xuICAgICAgICBsZXQga2luZDtcbiAgICAgICAgaWYgKHN0YXJ0c1dpdGhBd2FpdFVzaW5nKSB7XG4gICAgICAgICAga2luZCA9IFwiYXdhaXQgdXNpbmdcIjtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBd2FpdEFsbG93ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQXdhaXRVc2luZ05vdEluQXN5bmNDb250ZXh0LCB7XG4gICAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgJ2F3YWl0J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtpbmQgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB0aGlzLnBhcnNlVmFyKGluaXROb2RlLCB0cnVlLCBraW5kKTtcbiAgICAgICAgY29uc3QgaW5pdCA9IHRoaXMuZmluaXNoTm9kZShpbml0Tm9kZSwgXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IGlzRm9ySW4gPSB0aGlzLm1hdGNoKHR0Ll9pbik7XG4gICAgICAgIGlmIChpc0ZvckluICYmIHN0YXJzV2l0aFVzaW5nRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Gb3JJblVzaW5nLCB7IGF0OiBpbml0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaXNGb3JJbiB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKSAmJlxuICAgICAgICAgIGluaXQuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUgYXMgVW5kb25lPE4uRm9ySW5PZj4sIGluaXQsIGF3YWl0QXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdEF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy51bmV4cGVjdGVkKGF3YWl0QXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUgYXMgVW5kb25lPE4uRm9yU3RhdGVtZW50PiwgaW5pdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZmlyc3QgdG9rZW4gaXMgcG9zc2libHkgYSBjb250ZXh0dWFsIGtleXdvcmQsIHNvIHRoYXRcbiAgICAvLyB3ZSBjYW4gZm9yYmlkIGBmb3IgKGFzeW5jIG9mYCBpZiB0aGlzIHR1cm5zIG91dCB0byBiZSBhIGZvci1vZiBsb29wLlxuICAgIGNvbnN0IHN0YXJ0c1dpdGhBc3luYyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hc3luYyk7XG5cbiAgICBjb25zdCByZWZFeHByZXNzaW9uRXJyb3JzID0gbmV3IEV4cHJlc3Npb25FcnJvcnMoKTtcbiAgICBjb25zdCBpbml0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24odHJ1ZSwgcmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgY29uc3QgaXNGb3JPZiA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9vZik7XG4gICAgaWYgKGlzRm9yT2YpIHtcbiAgICAgIC8vIENoZWNrIGZvciBsZWFkaW5nIHRva2VucyB0aGF0IGFyZSBmb3JiaWRkZW4gaW4gZm9yLW9mIGxvb3BzOlxuICAgICAgaWYgKHN0YXJ0c1dpdGhMZXQpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRm9yT2ZMZXQsIHsgYXQ6IGluaXQgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgLy8gYGZvciBhd2FpdCAoYXN5bmMgb2YgW10pO2AgaXMgYWxsb3dlZC5cbiAgICAgICAgYXdhaXRBdCA9PT0gbnVsbCAmJlxuICAgICAgICBzdGFydHNXaXRoQXN5bmMgJiZcbiAgICAgICAgaW5pdC50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB0aGUgY2FzZSB3aGVyZSB0aGUgYGFzeW5jYCBpbiBgZm9yIChhc3luYyBvZmAgd2FzXG4gICAgICAgIC8vIHBhcnNlZCBhcyBhbiBpZGVudGlmaWVyLiBJZiBpdCB3YXMgcGFyc2VkIGFzIHRoZSBzdGFydCBvZiBhbiBhc3luY1xuICAgICAgICAvLyBhcnJvdyBmdW5jdGlvbiAoZS5nLiBgZm9yIChhc3luYyBvZiA9PiB7fSBvZiBbXSk7YCksIHRoZSBMVmFsIGNoZWNrXG4gICAgICAgIC8vIGZ1cnRoZXIgZG93biB3aWxsIHJhaXNlIGEgbW9yZSBhcHByb3ByaWF0ZSBlcnJvci5cbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRm9yT2ZBc3luYywgeyBhdDogaW5pdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRm9yT2YgfHwgdGhpcy5tYXRjaCh0dC5faW4pKSB7XG4gICAgICB0aGlzLmNoZWNrRGVzdHJ1Y3R1cmluZ1ByaXZhdGUocmVmRXhwcmVzc2lvbkVycm9ycyk7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShpbml0LCAvKiBpc0xIUyAqLyB0cnVlKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBpc0Zvck9mID8gXCJGb3JPZlN0YXRlbWVudFwiIDogXCJGb3JJblN0YXRlbWVudFwiO1xuICAgICAgdGhpcy5jaGVja0xWYWwoaW5pdCwgeyBpbjogeyB0eXBlIH0gfSk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkZvckluU3RhdGVtZW50IHwgTi5Gb3JPZlN0YXRlbWVudD4sXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaW5pdCBoYXMgYmVlbiB0cmFuc2Zvcm1lZCB0byBhbiBhc3NpZ25hYmxlXG4gICAgICAgIGluaXQsXG4gICAgICAgIGF3YWl0QXQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZFeHByZXNzaW9uRXJyb3JzLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGF3YWl0QXQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSBhcyBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQ+LCBpbml0KTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUhvaXN0YWJsZURlY2xhcmF0aW9uXG4gIHBhcnNlRnVuY3Rpb25TdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+LFxuICAgIGlzQXN5bmM6IGJvb2xlYW4sXG4gICAgaXNIYW5naW5nRGVjbGFyYXRpb246IGJvb2xlYW4sXG4gICk6IE4uRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnZnVuY3Rpb24nXG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvbihcbiAgICAgIG5vZGUsXG4gICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5EZWNsYXJhdGlvbiB8XG4gICAgICAgIChpc0hhbmdpbmdEZWNsYXJhdGlvbiA/IFBhcnNlRnVuY3Rpb25GbGFnLkhhbmdpbmdEZWNsYXJhdGlvbiA6IDApIHxcbiAgICAgICAgKGlzQXN5bmMgPyBQYXJzZUZ1bmN0aW9uRmxhZy5Bc3luYyA6IDApLFxuICAgICk7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1JZlN0YXRlbWVudFxuICBwYXJzZUlmU3RhdGVtZW50KHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uSWZTdGF0ZW1lbnQ+KSB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKTtcbiAgICAvLyBBbm5leCBCLjMuM1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb25kZWNsYXJhdGlvbnMtaW4taWZzdGF0ZW1lbnQtc3RhdGVtZW50LWNsYXVzZXNcbiAgICBub2RlLmNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlU3RhdGVtZW50T3JTbG9wcHlBbm5leEJGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG4gICAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLmVhdCh0dC5fZWxzZSlcbiAgICAgID8gdGhpcy5wYXJzZVN0YXRlbWVudE9yU2xvcHB5QW5uZXhCRnVuY3Rpb25EZWNsYXJhdGlvbigpXG4gICAgICA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIklmU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgcGFyc2VSZXR1cm5TdGF0ZW1lbnQodGhpczogUGFyc2VyLCBub2RlOiBVbmRvbmU8Ti5SZXR1cm5TdGF0ZW1lbnQ+KSB7XG4gICAgaWYgKCF0aGlzLnByb2RQYXJhbS5oYXNSZXR1cm4gJiYgIXRoaXMub3B0aW9ucy5hbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbikge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuSWxsZWdhbFJldHVybiwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm5leHQoKTtcblxuICAgIC8vIEluIGByZXR1cm5gIChhbmQgYGJyZWFrYC9gY29udGludWVgKSwgdGhlIGtleXdvcmRzIHdpdGhcbiAgICAvLyBvcHRpb25hbCBhcmd1bWVudHMsIHdlIGVhZ2VybHkgbG9vayBmb3IgYSBzZW1pY29sb24gb3IgdGhlXG4gICAgLy8gcG9zc2liaWxpdHkgdG8gaW5zZXJ0IG9uZS5cblxuICAgIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgbm9kZS5hcmd1bWVudCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUmV0dXJuU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtU3dpdGNoU3RhdGVtZW50XG4gIHBhcnNlU3dpdGNoU3RhdGVtZW50KHRoaXM6IFBhcnNlciwgbm9kZTogVW5kb25lPE4uU3dpdGNoU3RhdGVtZW50Pikge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUuZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZUhlYWRlckV4cHJlc3Npb24oKTtcbiAgICBjb25zdCBjYXNlczogTi5Td2l0Y2hTdGF0ZW1lbnRbXCJjYXNlc1wiXSA9IChub2RlLmNhc2VzID0gW10pO1xuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucHVzaChzd2l0Y2hMYWJlbCk7XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG5cbiAgICAvLyBTdGF0ZW1lbnRzIHVuZGVyIG11c3QgYmUgZ3JvdXBlZCAoYnkgbGFiZWwpIGluIFN3aXRjaENhc2VcbiAgICAvLyBub2Rlcy4gYGN1cmAgaXMgdXNlZCB0byBrZWVwIHRoZSBub2RlIHRoYXQgd2UgYXJlIGN1cnJlbnRseVxuICAgIC8vIGFkZGluZyBzdGF0ZW1lbnRzIHRvLlxuXG4gICAgbGV0IGN1cjtcbiAgICBmb3IgKGxldCBzYXdEZWZhdWx0OyAhdGhpcy5tYXRjaCh0dC5icmFjZVIpOyApIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKHR0Ll9jYXNlKSB8fCB0aGlzLm1hdGNoKHR0Ll9kZWZhdWx0KSkge1xuICAgICAgICBjb25zdCBpc0Nhc2UgPSB0aGlzLm1hdGNoKHR0Ll9jYXNlKTtcbiAgICAgICAgaWYgKGN1cikgdGhpcy5maW5pc2hOb2RlKGN1ciwgXCJTd2l0Y2hDYXNlXCIpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lXG4gICAgICAgIGNhc2VzLnB1c2goKGN1ciA9IHRoaXMuc3RhcnROb2RlKCkpKTtcbiAgICAgICAgY3VyLmNvbnNlcXVlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGlmIChpc0Nhc2UpIHtcbiAgICAgICAgICBjdXIudGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNhd0RlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk11bHRpcGxlRGVmYXVsdHNJblN3aXRjaCwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rU3RhcnRMb2MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2F3RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgY3VyLnRlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbG9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXIpIHtcbiAgICAgICAgICBjdXIuY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICBpZiAoY3VyKSB0aGlzLmZpbmlzaE5vZGUoY3VyLCBcIlN3aXRjaENhc2VcIik7XG4gICAgdGhpcy5uZXh0KCk7IC8vIENsb3NpbmcgYnJhY2VcbiAgICB0aGlzLnN0YXRlLmxhYmVscy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3dpdGNoU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgcGFyc2VUaHJvd1N0YXRlbWVudCh0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLlRocm93U3RhdGVtZW50Pikge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLmhhc1ByZWNlZGluZ0xpbmVCcmVhaygpKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5OZXdsaW5lQWZ0ZXJUaHJvdywgeyBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jIH0pO1xuICAgIH1cbiAgICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaHJvd1N0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSh0aGlzOiBQYXJzZXIpOiBOLlBhdHRlcm4ge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7XG5cbiAgICB0aGlzLnNjb3BlLmVudGVyKFxuICAgICAgdGhpcy5vcHRpb25zLmFubmV4QiAmJiBwYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgICA/IFNDT1BFX1NJTVBMRV9DQVRDSFxuICAgICAgICA6IDAsXG4gICAgKTtcbiAgICB0aGlzLmNoZWNrTFZhbChwYXJhbSwge1xuICAgICAgaW46IHsgdHlwZTogXCJDYXRjaENsYXVzZVwiIH0sXG4gICAgICBiaW5kaW5nOiBCSU5EX0NBVENIX1BBUkFNLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtO1xuICB9XG5cbiAgcGFyc2VUcnlTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlRyeVN0YXRlbWVudD4sXG4gICk6IE4uVHJ5U3RhdGVtZW50IHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIG5vZGUuYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcbiAgICBub2RlLmhhbmRsZXIgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NhdGNoKSkge1xuICAgICAgY29uc3QgY2xhdXNlID0gdGhpcy5zdGFydE5vZGU8Ti5DYXRjaENsYXVzZT4oKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2godHQucGFyZW5MKSkge1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlbkwpO1xuICAgICAgICBjbGF1c2UucGFyYW0gPSB0aGlzLnBhcnNlQ2F0Y2hDbGF1c2VQYXJhbSgpO1xuICAgICAgICB0aGlzLmV4cGVjdCh0dC5wYXJlblIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhdXNlLnBhcmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9PVEhFUik7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjYXRjaCBjbGF1c2UncyBib2R5LlxuICAgICAgY2xhdXNlLmJvZHkgPVxuICAgICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgICAgLy8gY29udGV4dHMgd2l0aGluIHRoZSBjYXRjaCBjbGF1c2UncyBib2R5LlxuICAgICAgICB0aGlzLndpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCkgPT5cbiAgICAgICAgICAvLyBQYXJzZSB0aGUgY2F0Y2ggY2xhdXNlJ3MgYm9keS5cbiAgICAgICAgICB0aGlzLnBhcnNlQmxvY2soZmFsc2UsIGZhbHNlKSxcbiAgICAgICAgKTtcblxuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICAgIH1cblxuICAgIG5vZGUuZmluYWxpemVyID0gdGhpcy5lYXQodHQuX2ZpbmFsbHkpID8gdGhpcy5wYXJzZUJsb2NrKCkgOiBudWxsO1xuXG4gICAgaWYgKCFub2RlLmhhbmRsZXIgJiYgIW5vZGUuZmluYWxpemVyKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5Ob0NhdGNoT3JGaW5hbGx5LCB7IGF0OiBub2RlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUcnlTdGF0ZW1lbnRcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1WYXJpYWJsZVN0YXRlbWVudFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1MZXhpY2FsRGVjbGFyYXRpb25cbiAgcGFyc2VWYXJTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+LFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICAgIGFsbG93TWlzc2luZ0luaXRpYWxpemVyOiBib29sZWFuID0gZmFsc2UsXG4gICk6IE4uVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgdGhpcy5wYXJzZVZhcihub2RlLCBmYWxzZSwga2luZCwgYWxsb3dNaXNzaW5nSW5pdGlhbGl6ZXIpO1xuICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1XaGlsZVN0YXRlbWVudFxuICBwYXJzZVdoaWxlU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5XaGlsZVN0YXRlbWVudD4sXG4gICk6IE4uV2hpbGVTdGF0ZW1lbnQge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIG5vZGUudGVzdCA9IHRoaXMucGFyc2VIZWFkZXJFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuXG4gICAgLy8gUGFyc2UgdGhlIGxvb3AgYm9keS5cbiAgICBub2RlLmJvZHkgPVxuICAgICAgLy8gRm9yIHRoZSBzbWFydFBpcGVsaW5lcyBwbHVnaW46XG4gICAgICAvLyBEaXNhYmxlIHRvcGljIHJlZmVyZW5jZXMgZnJvbSBvdXRlciBjb250ZXh0cyB3aXRoaW4gdGhlIGxvb3AgYm9keS5cbiAgICAgIC8vIFRoZXkgYXJlIHBlcm1pdHRlZCBpbiB0ZXN0IGV4cHJlc3Npb25zLCBvdXRzaWRlIG9mIHRoZSBsb29wIGJvZHkuXG4gICAgICB0aGlzLndpdGhTbWFydE1peFRvcGljRm9yYmlkZGluZ0NvbnRleHQoKCkgPT5cbiAgICAgICAgLy8gUGFyc2UgbG9vcCBib2R5LlxuICAgICAgICB0aGlzLnBhcnNlU3RhdGVtZW50KCksXG4gICAgICApO1xuXG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2hpbGVTdGF0ZW1lbnRcIik7XG4gIH1cblxuICBwYXJzZVdpdGhTdGF0ZW1lbnQoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLldpdGhTdGF0ZW1lbnQ+LFxuICApOiBOLldpdGhTdGF0ZW1lbnQge1xuICAgIGlmICh0aGlzLnN0YXRlLnN0cmljdCkge1xuICAgICAgdGhpcy5yYWlzZShFcnJvcnMuU3RyaWN0V2l0aCwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5vYmplY3QgPSB0aGlzLnBhcnNlSGVhZGVyRXhwcmVzc2lvbigpO1xuXG4gICAgLy8gUGFyc2UgdGhlIHN0YXRlbWVudCBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjpcbiAgICAgIC8vIERpc2FibGUgdG9waWMgcmVmZXJlbmNlcyBmcm9tIG91dGVyIGNvbnRleHRzIHdpdGhpbiB0aGUgd2l0aCBzdGF0ZW1lbnQncyBib2R5LlxuICAgICAgLy8gVGhleSBhcmUgcGVybWl0dGVkIGluIGZ1bmN0aW9uIGRlZmF1bHQtcGFyYW1ldGVyIGV4cHJlc3Npb25zLCB3aGljaCBhcmVcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG91dGVyIGNvbnRleHQsIG91dHNpZGUgb2YgdGhlIHdpdGggc3RhdGVtZW50J3MgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgc3RhdGVtZW50IGJvZHkuXG4gICAgICAgIHRoaXMucGFyc2VTdGF0ZW1lbnQoKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2l0aFN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZTogVW5kb25lPE4uRW1wdHlTdGF0ZW1lbnQ+KTogTi5FbXB0eVN0YXRlbWVudCB7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVtcHR5U3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtTGFiZWxsZWRTdGF0ZW1lbnRcbiAgcGFyc2VMYWJlbGVkU3RhdGVtZW50KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5MYWJlbGVkU3RhdGVtZW50PixcbiAgICBtYXliZU5hbWU6IHN0cmluZyxcbiAgICBleHByOiBOLklkZW50aWZpZXIsXG4gICAgZmxhZ3M6IFBhcnNlU3RhdGVtZW50RmxhZyxcbiAgKTogTi5MYWJlbGVkU3RhdGVtZW50IHtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHRoaXMuc3RhdGUubGFiZWxzKSB7XG4gICAgICBpZiAobGFiZWwubmFtZSA9PT0gbWF5YmVOYW1lKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkxhYmVsUmVkZWNsYXJhdGlvbiwge1xuICAgICAgICAgIGF0OiBleHByLFxuICAgICAgICAgIGxhYmVsTmFtZTogbWF5YmVOYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBraW5kID0gdG9rZW5Jc0xvb3AodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgPyBcImxvb3BcIlxuICAgICAgOiB0aGlzLm1hdGNoKHR0Ll9zd2l0Y2gpXG4gICAgICA/IFwic3dpdGNoXCJcbiAgICAgIDogbnVsbDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZS5sYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zdGF0ZS5sYWJlbHNbaV07XG4gICAgICBpZiAobGFiZWwuc3RhdGVtZW50U3RhcnQgPT09IG5vZGUuc3RhcnQpIHtcbiAgICAgICAgbGFiZWwuc3RhdGVtZW50U3RhcnQgPSB0aGlzLnN0YXRlLnN0YXJ0O1xuICAgICAgICBsYWJlbC5raW5kID0ga2luZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUubGFiZWxzLnB1c2goe1xuICAgICAgbmFtZTogbWF5YmVOYW1lLFxuICAgICAga2luZDoga2luZCxcbiAgICAgIHN0YXRlbWVudFN0YXJ0OiB0aGlzLnN0YXRlLnN0YXJ0LFxuICAgIH0pO1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUxhYmVsbGVkSXRlbVxuICAgIG5vZGUuYm9keSA9XG4gICAgICBmbGFncyAmIFBhcnNlU3RhdGVtZW50RmxhZy5BbGxvd0xhYmVsZWRGdW5jdGlvblxuICAgICAgICA/IHRoaXMucGFyc2VTdGF0ZW1lbnRPclNsb3BweUFubmV4QkZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSlcbiAgICAgICAgOiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cbiAgICB0aGlzLnN0YXRlLmxhYmVscy5wb3AoKTtcbiAgICBub2RlLmxhYmVsID0gZXhwcjtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGFiZWxlZFN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICBub2RlOiBVbmRvbmU8Ti5FeHByZXNzaW9uU3RhdGVtZW50PixcbiAgICBleHByOiBOLkV4cHJlc3Npb24sXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSB1c2VkIGluIFR5cGVTY3JpcHQgcGFyc2VyICovXG4gICAgZGVjb3JhdG9yczogTi5EZWNvcmF0b3JbXSB8IG51bGwsXG4gICkge1xuICAgIG5vZGUuZXhwcmVzc2lvbiA9IGV4cHI7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgc2VtaWNvbG9uLWVuY2xvc2VkIGJsb2NrIG9mIHN0YXRlbWVudHMsIGhhbmRsaW5nIGBcInVzZVxuICAvLyBzdHJpY3RcImAgZGVjbGFyYXRpb25zIHdoZW4gYGFsbG93RGlyZWN0aXZlc2AgaXMgdHJ1ZSAodXNlZCBmb3JcbiAgLy8gZnVuY3Rpb24gYm9kaWVzKS5cblxuICBwYXJzZUJsb2NrKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBhbGxvd0RpcmVjdGl2ZXM6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBjcmVhdGVOZXdMZXhpY2FsU2NvcGU6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFmdGVyQmxvY2tQYXJzZT86IChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB2b2lkLFxuICApOiBOLkJsb2NrU3RhdGVtZW50IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5CbG9ja1N0YXRlbWVudD4oKTtcbiAgICBpZiAoYWxsb3dEaXJlY3RpdmVzKSB7XG4gICAgICB0aGlzLnN0YXRlLnN0cmljdEVycm9ycy5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuICAgIGlmIChjcmVhdGVOZXdMZXhpY2FsU2NvcGUpIHtcbiAgICAgIHRoaXMuc2NvcGUuZW50ZXIoU0NPUEVfT1RIRVIpO1xuICAgIH1cbiAgICB0aGlzLnBhcnNlQmxvY2tCb2R5KFxuICAgICAgbm9kZSxcbiAgICAgIGFsbG93RGlyZWN0aXZlcyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHQuYnJhY2VSLFxuICAgICAgYWZ0ZXJCbG9ja1BhcnNlLFxuICAgICk7XG4gICAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkge1xuICAgICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJCbG9ja1N0YXRlbWVudFwiKTtcbiAgfVxuXG4gIGlzVmFsaWREaXJlY3RpdmUoc3RtdDogTi5TdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3RtdC50eXBlID09PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiAmJlxuICAgICAgc3RtdC5leHByZXNzaW9uLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiICYmXG4gICAgICAhc3RtdC5leHByZXNzaW9uLmV4dHJhLnBhcmVudGhlc2l6ZWRcbiAgICApO1xuICB9XG5cbiAgcGFyc2VCbG9ja0JvZHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkJsb2NrU3RhdGVtZW50TGlrZT4sXG4gICAgYWxsb3dEaXJlY3RpdmVzOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICB0b3BMZXZlbDogYm9vbGVhbixcbiAgICBlbmQ6IFRva2VuVHlwZSxcbiAgICBhZnRlckJsb2NrUGFyc2U/OiAoaGFzU3RyaWN0TW9kZURpcmVjdGl2ZTogYm9vbGVhbikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYm9keTogTi5CbG9ja1N0YXRlbWVudExpa2VbXCJib2R5XCJdID0gKG5vZGUuYm9keSA9IFtdKTtcbiAgICBjb25zdCBkaXJlY3RpdmVzOiBOLkJsb2NrU3RhdGVtZW50TGlrZVtcImRpcmVjdGl2ZXNcIl0gPSAobm9kZS5kaXJlY3RpdmVzID1cbiAgICAgIFtdKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tPck1vZHVsZUJsb2NrQm9keShcbiAgICAgIGJvZHksXG4gICAgICBhbGxvd0RpcmVjdGl2ZXMgPyBkaXJlY3RpdmVzIDogdW5kZWZpbmVkLFxuICAgICAgdG9wTGV2ZWwsXG4gICAgICBlbmQsXG4gICAgICBhZnRlckJsb2NrUGFyc2UsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVuZGVmaW5lZCBkaXJlY3RpdmVzIG1lYW5zIHRoYXQgZGlyZWN0aXZlcyBhcmUgbm90IGFsbG93ZWQuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUJsb2NrXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLU1vZHVsZUJvZHlcbiAgcGFyc2VCbG9ja09yTW9kdWxlQmxvY2tCb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBib2R5OiBOLlN0YXRlbWVudFtdLFxuICAgIGRpcmVjdGl2ZXM6IE4uRGlyZWN0aXZlW10gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHRvcExldmVsOiBib29sZWFuLFxuICAgIGVuZDogVG9rZW5UeXBlLFxuICAgIGFmdGVyQmxvY2tQYXJzZT86IChoYXNTdHJpY3RNb2RlRGlyZWN0aXZlOiBib29sZWFuKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvbGRTdHJpY3QgPSB0aGlzLnN0YXRlLnN0cmljdDtcbiAgICBsZXQgaGFzU3RyaWN0TW9kZURpcmVjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBwYXJzZWROb25EaXJlY3RpdmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICghdGhpcy5tYXRjaChlbmQpKSB7XG4gICAgICBjb25zdCBzdG10ID0gdG9wTGV2ZWxcbiAgICAgICAgPyB0aGlzLnBhcnNlTW9kdWxlSXRlbSgpXG4gICAgICAgIDogdGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCk7XG5cbiAgICAgIGlmIChkaXJlY3RpdmVzICYmICFwYXJzZWROb25EaXJlY3RpdmUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZERpcmVjdGl2ZShzdG10KSkge1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IHRoaXMuc3RtdFRvRGlyZWN0aXZlKHN0bXQpO1xuICAgICAgICAgIGRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWhhc1N0cmljdE1vZGVEaXJlY3RpdmUgJiZcbiAgICAgICAgICAgIGRpcmVjdGl2ZS52YWx1ZS52YWx1ZSA9PT0gXCJ1c2Ugc3RyaWN0XCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGhhc1N0cmljdE1vZGVEaXJlY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTdHJpY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VkTm9uRGlyZWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgLy8gY2xlYXIgc3RyaWN0IGVycm9ycyBzaW5jZSB0aGUgc3RyaWN0IG1vZGUgd2lsbCBub3QgY2hhbmdlIHdpdGhpbiB0aGUgYmxvY2tcbiAgICAgICAgdGhpcy5zdGF0ZS5zdHJpY3RFcnJvcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGJvZHkucHVzaChzdG10KTtcbiAgICB9XG5cbiAgICBpZiAoYWZ0ZXJCbG9ja1BhcnNlKSB7XG4gICAgICBhZnRlckJsb2NrUGFyc2UuY2FsbCh0aGlzLCBoYXNTdHJpY3RNb2RlRGlyZWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0cmljdCkge1xuICAgICAgdGhpcy5zZXRTdHJpY3QoZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSByZWd1bGFyIGBmb3JgIGxvb3AuIFRoZSBkaXNhbWJpZ3VhdGlvbiBjb2RlIGluXG4gIC8vIGBwYXJzZVN0YXRlbWVudGAgd2lsbCBhbHJlYWR5IGhhdmUgcGFyc2VkIHRoZSBpbml0IHN0YXRlbWVudCBvclxuICAvLyBleHByZXNzaW9uLlxuXG4gIHBhcnNlRm9yKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5Gb3JTdGF0ZW1lbnQ+LFxuICAgIGluaXQ/OiBOLlZhcmlhYmxlRGVjbGFyYXRpb24gfCBOLkV4cHJlc3Npb24gfCBudWxsLFxuICApOiBOLkZvclN0YXRlbWVudCB7XG4gICAgbm9kZS5pbml0ID0gaW5pdDtcbiAgICB0aGlzLnNlbWljb2xvbigvKiBhbGxvd0FzaSAqLyBmYWxzZSk7XG4gICAgbm9kZS50ZXN0ID0gdGhpcy5tYXRjaCh0dC5zZW1pKSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuc2VtaWNvbG9uKC8qIGFsbG93QXNpICovIGZhbHNlKTtcbiAgICBub2RlLnVwZGF0ZSA9IHRoaXMubWF0Y2godHQucGFyZW5SKSA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuUik7XG5cbiAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5LlxuICAgIG5vZGUuYm9keSA9XG4gICAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAgIC8vIGNvbnRleHRzIHdpdGhpbiB0aGUgbG9vcCBib2R5LiBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucyxcbiAgICAgIC8vIG91dHNpZGUgb2YgdGhlIGxvb3AgYm9keS5cbiAgICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PlxuICAgICAgICAvLyBQYXJzZSB0aGUgbG9vcCBib2R5LlxuICAgICAgICB0aGlzLnBhcnNlU3RhdGVtZW50KCksXG4gICAgICApO1xuXG4gICAgdGhpcy5zY29wZS5leGl0KCk7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMucG9wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBgZm9yYC9gaW5gIGFuZCBgZm9yYC9gb2ZgIGxvb3AsIHdoaWNoIGFyZSBhbG1vc3RcbiAgLy8gc2FtZSBmcm9tIHBhcnNlcidzIHBlcnNwZWN0aXZlLlxuXG4gIHBhcnNlRm9ySW4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLkZvckluT2Y+LFxuICAgIGluaXQ6IE4uVmFyaWFibGVEZWNsYXJhdGlvbiB8IE4uQXNzaWdubWVudFBhdHRlcm4sXG4gICAgYXdhaXRBdD86IFBvc2l0aW9uIHwgbnVsbCxcbiAgKTogTi5Gb3JJbk9mIHtcbiAgICBjb25zdCBpc0ZvckluID0gdGhpcy5tYXRjaCh0dC5faW4pO1xuICAgIHRoaXMubmV4dCgpO1xuXG4gICAgaWYgKGlzRm9ySW4pIHtcbiAgICAgIGlmIChhd2FpdEF0ICE9PSBudWxsKSB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXdhaXQgPSBhd2FpdEF0ICE9PSBudWxsO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGluaXQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcbiAgICAgIGluaXQuZGVjbGFyYXRpb25zWzBdLmluaXQgIT0gbnVsbCAmJlxuICAgICAgKCFpc0ZvckluIHx8XG4gICAgICAgICF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8XG4gICAgICAgIHRoaXMuc3RhdGUuc3RyaWN0IHx8XG4gICAgICAgIGluaXQua2luZCAhPT0gXCJ2YXJcIiB8fFxuICAgICAgICBpbml0LmRlY2xhcmF0aW9uc1swXS5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIilcbiAgICApIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkZvckluT2ZMb29wSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgIHR5cGU6IGlzRm9ySW4gPyBcIkZvckluU3RhdGVtZW50XCIgOiBcIkZvck9mU3RhdGVtZW50XCIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW5pdC50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkludmFsaWRMaHMsIHtcbiAgICAgICAgYXQ6IGluaXQsXG4gICAgICAgIGFuY2VzdG9yOiB7IHR5cGU6IFwiRm9yU3RhdGVtZW50XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5vZGUubGVmdCA9IGluaXQ7XG4gICAgbm9kZS5yaWdodCA9IGlzRm9ySW5cbiAgICAgID8gdGhpcy5wYXJzZUV4cHJlc3Npb24oKVxuICAgICAgOiB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgdGhpcy5leHBlY3QodHQucGFyZW5SKTtcblxuICAgIC8vIFBhcnNlIHRoZSBsb29wIGJvZHkuXG4gICAgbm9kZS5ib2R5ID1cbiAgICAgIC8vIEZvciB0aGUgc21hcnRQaXBlbGluZXMgcGx1Z2luOlxuICAgICAgLy8gRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXIgY29udGV4dHMgd2l0aGluIHRoZSBsb29wIGJvZHkuXG4gICAgICAvLyBUaGV5IGFyZSBwZXJtaXR0ZWQgaW4gdGVzdCBleHByZXNzaW9ucywgb3V0c2lkZSBvZiB0aGUgbG9vcCBib2R5LlxuICAgICAgdGhpcy53aXRoU21hcnRNaXhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpID0+XG4gICAgICAgIC8vIFBhcnNlIGxvb3AgYm9keS5cbiAgICAgICAgdGhpcy5wYXJzZVN0YXRlbWVudCgpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuICAgIHRoaXMuc3RhdGUubGFiZWxzLnBvcCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc0ZvckluID8gXCJGb3JJblN0YXRlbWVudFwiIDogXCJGb3JPZlN0YXRlbWVudFwiKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgbGlzdCBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuXG5cbiAgcGFyc2VWYXIoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+LFxuICAgIGlzRm9yOiBib29sZWFuLFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICAgIGFsbG93TWlzc2luZ0luaXRpYWxpemVyOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFVuZG9uZTxOLlZhcmlhYmxlRGVjbGFyYXRpb24+IHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbnM6IE4uVmFyaWFibGVEZWNsYXJhdG9yW10gPSAobm9kZS5kZWNsYXJhdGlvbnMgPSBbXSk7XG4gICAgbm9kZS5raW5kID0ga2luZDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBkZWNsID0gdGhpcy5zdGFydE5vZGU8Ti5WYXJpYWJsZURlY2xhcmF0b3I+KCk7XG4gICAgICB0aGlzLnBhcnNlVmFySWQoZGVjbCwga2luZCk7XG4gICAgICBkZWNsLmluaXQgPSAhdGhpcy5lYXQodHQuZXEpXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGlzRm9yXG4gICAgICAgID8gdGhpcy5wYXJzZU1heWJlQXNzaWduRGlzYWxsb3dJbigpXG4gICAgICAgIDogdGhpcy5wYXJzZU1heWJlQXNzaWduQWxsb3dJbigpO1xuXG4gICAgICBpZiAoZGVjbC5pbml0ID09PSBudWxsICYmICFhbGxvd01pc3NpbmdJbml0aWFsaXplcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVjbC5pZC50eXBlICE9PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICEoaXNGb3IgJiYgKHRoaXMubWF0Y2godHQuX2luKSB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXIsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLmxhc3RUb2tFbmRMb2MsXG4gICAgICAgICAgICBraW5kOiBcImRlc3RydWN0dXJpbmdcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBraW5kID09PSBcImNvbnN0XCIgJiZcbiAgICAgICAgICAhKHRoaXMubWF0Y2godHQuX2luKSB8fCB0aGlzLmlzQ29udGV4dHVhbCh0dC5fb2YpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5EZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplciwge1xuICAgICAgICAgICAgYXQ6IHRoaXMuc3RhdGUubGFzdFRva0VuZExvYyxcbiAgICAgICAgICAgIGtpbmQ6IFwiY29uc3RcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVjbGFyYXRpb25zLnB1c2godGhpcy5maW5pc2hOb2RlKGRlY2wsIFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpKTtcbiAgICAgIGlmICghdGhpcy5lYXQodHQuY29tbWEpKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwYXJzZVZhcklkKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBkZWNsOiBVbmRvbmU8Ti5WYXJpYWJsZURlY2xhcmF0b3I+LFxuICAgIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgIHRoaXMuY2hlY2tMVmFsKGlkLCB7XG4gICAgICBpbjogeyB0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRvclwiIH0sXG4gICAgICBiaW5kaW5nOiBraW5kID09PSBcInZhclwiID8gQklORF9WQVIgOiBCSU5EX0xFWElDQUwsXG4gICAgfSk7XG4gICAgZGVjbC5pZCA9IGlkO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQXN5bmNGdW5jdGlvbkV4cHJlc3Npb25cbiAgcGFyc2VBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uRnVuY3Rpb25FeHByZXNzaW9uPixcbiAgKTogTi5GdW5jdGlvbkV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSwgUGFyc2VGdW5jdGlvbkZsYWcuQXN5bmMpO1xuICB9XG5cbiAgLy8gUGFyc2UgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvciBleHByZXNzaW9uIChkZXBlbmRpbmcgb24gdGhlXG4gIC8vIFBhcnNlRnVuY3Rpb25GbGFnLkRlY2xhcmF0aW9uIGZsYWcpLlxuXG4gIHBhcnNlRnVuY3Rpb248VCBleHRlbmRzIE4uTm9ybWFsRnVuY3Rpb24+KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8VD4sXG4gICAgZmxhZ3M6IFBhcnNlRnVuY3Rpb25GbGFnID0gUGFyc2VGdW5jdGlvbkZsYWcuRXhwcmVzc2lvbixcbiAgKTogVCB7XG4gICAgY29uc3QgaGFuZ2luZ0RlY2xhcmF0aW9uID0gZmxhZ3MgJiBQYXJzZUZ1bmN0aW9uRmxhZy5IYW5naW5nRGVjbGFyYXRpb247XG4gICAgY29uc3QgaXNEZWNsYXJhdGlvbiA9ICEhKGZsYWdzICYgUGFyc2VGdW5jdGlvbkZsYWcuRGVjbGFyYXRpb24pO1xuICAgIGNvbnN0IHJlcXVpcmVJZCA9IGlzRGVjbGFyYXRpb24gJiYgIShmbGFncyAmIFBhcnNlRnVuY3Rpb25GbGFnLk51bGxhYmxlSWQpO1xuICAgIGNvbnN0IGlzQXN5bmMgPSAhIShmbGFncyAmIFBhcnNlRnVuY3Rpb25GbGFnLkFzeW5jKTtcblxuICAgIHRoaXMuaW5pdEZ1bmN0aW9uKG5vZGUsIGlzQXN5bmMpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuc3RhcikpIHtcbiAgICAgIGlmIChoYW5naW5nRGVjbGFyYXRpb24pIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuR2VuZXJhdG9ySW5TaW5nbGVTdGF0ZW1lbnRDb250ZXh0LCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAqXG4gICAgICBub2RlLmdlbmVyYXRvciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRGVjbGFyYXRpb24pIHtcbiAgICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlRnVuY3Rpb25JZChyZXF1aXJlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZE1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnM7XG4gICAgdGhpcy5zdGF0ZS5tYXliZUluQXJyb3dQYXJhbWV0ZXJzID0gZmFsc2U7XG4gICAgdGhpcy5zY29wZS5lbnRlcihTQ09QRV9GVU5DVElPTik7XG4gICAgdGhpcy5wcm9kUGFyYW0uZW50ZXIoZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBub2RlLmdlbmVyYXRvcikpO1xuXG4gICAgaWYgKCFpc0RlY2xhcmF0aW9uKSB7XG4gICAgICBub2RlLmlkID0gdGhpcy5wYXJzZUZ1bmN0aW9uSWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBhcnNlRnVuY3Rpb25QYXJhbXMobm9kZSwgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSk7XG5cbiAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAvLyBjb250ZXh0cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGJvZHkuIFRoZXkgYXJlIHBlcm1pdHRlZCBpbiBmdW5jdGlvblxuICAgIC8vIGRlZmF1bHQtcGFyYW1ldGVyIGV4cHJlc3Npb25zLCBvdXRzaWRlIG9mIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgIHRoaXMud2l0aFNtYXJ0TWl4VG9waWNGb3JiaWRkaW5nQ29udGV4dCgoKSA9PiB7XG4gICAgICAvLyBQYXJzZSB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHRoaXMucGFyc2VGdW5jdGlvbkJvZHlBbmRGaW5pc2goXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGlzRGVjbGFyYXRpb24gPyBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiA6IFwiRnVuY3Rpb25FeHByZXNzaW9uXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9kUGFyYW0uZXhpdCgpO1xuICAgIHRoaXMuc2NvcGUuZXhpdCgpO1xuXG4gICAgaWYgKGlzRGVjbGFyYXRpb24gJiYgIWhhbmdpbmdEZWNsYXJhdGlvbikge1xuICAgICAgLy8gV2UgbmVlZCB0byByZWdpc3RlciB0aGlzIF9hZnRlcl8gcGFyc2luZyB0aGUgZnVuY3Rpb24gYm9keVxuICAgICAgLy8gYmVjYXVzZSBvZiBUeXBlU2NyaXB0IGJvZHktbGVzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsXG4gICAgICAvLyB3aGljaCBzaG91bGRuJ3QgYmUgYWRkZWQgdG8gdGhlIHNjb3BlLlxuICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uU3RhdGVtZW50SWQobm9kZSBhcyBUKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLm1heWJlSW5BcnJvd1BhcmFtZXRlcnMgPSBvbGRNYXliZUluQXJyb3dQYXJhbWV0ZXJzO1xuICAgIHJldHVybiBub2RlIGFzIFQ7XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uSWQocmVxdWlyZUlkPzogYm9vbGVhbik6IE4uSWRlbnRpZmllciB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiByZXF1aXJlSWQgfHwgdG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKVxuICAgICAgPyB0aGlzLnBhcnNlSWRlbnRpZmllcigpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwYXJzZUZ1bmN0aW9uUGFyYW1zKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5GdW5jdGlvbj4sXG4gICAgaXNDb25zdHJ1Y3Rvcj86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZXhwZWN0KHR0LnBhcmVuTCk7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZW50ZXIobmV3UGFyYW1ldGVyRGVjbGFyYXRpb25TY29wZSgpKTtcbiAgICBub2RlLnBhcmFtcyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChcbiAgICAgIHR0LnBhcmVuUixcbiAgICAgIGNoYXJDb2Rlcy5yaWdodFBhcmVudGhlc2lzLFxuICAgICAgUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0ZVTkNUSU9OX1BBUkFNUyB8XG4gICAgICAgIChpc0NvbnN0cnVjdG9yID8gUGFyc2VCaW5kaW5nTGlzdEZsYWdzLklTX0NPTlNUUlVDVE9SX1BBUkFNUyA6IDApLFxuICAgICk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25TY29wZS5leGl0KCk7XG4gIH1cblxuICByZWdpc3RlckZ1bmN0aW9uU3RhdGVtZW50SWQobm9kZTogTi5GdW5jdGlvbik6IHZvaWQge1xuICAgIGlmICghbm9kZS5pZCkgcmV0dXJuO1xuXG4gICAgLy8gSWYgaXQgaXMgYSByZWd1bGFyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIHNsb3BweSBtb2RlLCB0aGVuIGl0IGlzXG4gICAgLy8gc3ViamVjdCB0byBBbm5leCBCIHNlbWFudGljcyAoQklORF9GVU5DVElPTikuIE90aGVyd2lzZSwgdGhlIGJpbmRpbmdcbiAgICAvLyBtb2RlIGRlcGVuZHMgb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBzY29wZSAoc2VlXG4gICAgLy8gdHJlYXRGdW5jdGlvbnNBc1ZhcikuXG4gICAgdGhpcy5zY29wZS5kZWNsYXJlTmFtZShcbiAgICAgIG5vZGUuaWQubmFtZSxcbiAgICAgICF0aGlzLm9wdGlvbnMuYW5uZXhCIHx8IHRoaXMuc3RhdGUuc3RyaWN0IHx8IG5vZGUuZ2VuZXJhdG9yIHx8IG5vZGUuYXN5bmNcbiAgICAgICAgPyB0aGlzLnNjb3BlLnRyZWF0RnVuY3Rpb25zQXNWYXJcbiAgICAgICAgICA/IEJJTkRfVkFSXG4gICAgICAgICAgOiBCSU5EX0xFWElDQUxcbiAgICAgICAgOiBCSU5EX0ZVTkNUSU9OLFxuICAgICAgbm9kZS5pZC5sb2Muc3RhcnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgY2xhc3MgZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbiAgcGFyc2VDbGFzczxUIGV4dGVuZHMgTi5DbGFzcz4oXG4gICAgdGhpczogUGFyc2VyLFxuICAgIG5vZGU6IFVuZG9uZTxUPixcbiAgICBpc1N0YXRlbWVudDogLyogVCA9PT0gQ2xhc3NEZWNsYXJhdGlvbiAqLyBib29sZWFuLFxuICAgIG9wdGlvbmFsSWQ/OiBib29sZWFuLFxuICApOiBUIHtcbiAgICB0aGlzLm5leHQoKTsgLy8gJ2NsYXNzJ1xuXG4gICAgLy8gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFsd2F5cyBzdHJpY3QgbW9kZSBjb2RlLlxuICAgIGNvbnN0IG9sZFN0cmljdCA9IHRoaXMuc3RhdGUuc3RyaWN0O1xuICAgIHRoaXMuc3RhdGUuc3RyaWN0ID0gdHJ1ZTtcblxuICAgIHRoaXMucGFyc2VDbGFzc0lkKG5vZGUsIGlzU3RhdGVtZW50LCBvcHRpb25hbElkKTtcbiAgICB0aGlzLnBhcnNlQ2xhc3NTdXBlcihub2RlKTtcbiAgICAvLyB0aGlzLnN0YXRlLnN0cmljdCBpcyByZXN0b3JlZCBpbiBwYXJzZUNsYXNzQm9keVxuICAgIG5vZGUuYm9keSA9IHRoaXMucGFyc2VDbGFzc0JvZHkoISFub2RlLnN1cGVyQ2xhc3MsIG9sZFN0cmljdCk7XG5cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKFxuICAgICAgbm9kZSxcbiAgICAgIGlzU3RhdGVtZW50ID8gXCJDbGFzc0RlY2xhcmF0aW9uXCIgOiBcIkNsYXNzRXhwcmVzc2lvblwiLFxuICAgICk7XG4gIH1cblxuICBpc0NsYXNzUHJvcGVydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2godHQuZXEpIHx8IHRoaXMubWF0Y2godHQuc2VtaSkgfHwgdGhpcy5tYXRjaCh0dC5icmFjZVIpO1xuICB9XG5cbiAgaXNDbGFzc01ldGhvZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaCh0dC5wYXJlbkwpO1xuICB9XG5cbiAgaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihtZXRob2Q6IE4uQ2xhc3NNZXRob2QgfCBOLkNsYXNzUHJvcGVydHkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIW1ldGhvZC5jb21wdXRlZCAmJlxuICAgICAgIW1ldGhvZC5zdGF0aWMgJiZcbiAgICAgIChtZXRob2Qua2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCAvLyBJZGVudGlmaWVyXG4gICAgICAgIG1ldGhvZC5rZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikgLy8gU3RyaW5nIGxpdGVyYWxcbiAgICApO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtQ2xhc3NCb2R5XG4gIHBhcnNlQ2xhc3NCb2R5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBoYWRTdXBlckNsYXNzOiBib29sZWFuLFxuICAgIG9sZFN0cmljdDogYm9vbGVhbixcbiAgKTogTi5DbGFzc0JvZHkge1xuICAgIHRoaXMuY2xhc3NTY29wZS5lbnRlcigpO1xuXG4gICAgY29uc3Qgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlID0ge1xuICAgICAgaGFkQ29uc3RydWN0b3I6IGZhbHNlLFxuICAgICAgaGFkU3VwZXJDbGFzcyxcbiAgICB9O1xuICAgIGxldCBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdID0gW107XG4gICAgY29uc3QgY2xhc3NCb2R5ID0gdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0JvZHk+KCk7XG4gICAgY2xhc3NCb2R5LmJvZHkgPSBbXTtcblxuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG5cbiAgICAvLyBGb3IgdGhlIHNtYXJ0UGlwZWxpbmVzIHBsdWdpbjogRGlzYWJsZSB0b3BpYyByZWZlcmVuY2VzIGZyb20gb3V0ZXJcbiAgICAvLyBjb250ZXh0cyB3aXRoaW4gdGhlIGNsYXNzIGJvZHkuXG4gICAgdGhpcy53aXRoU21hcnRNaXhUb3BpY0ZvcmJpZGRpbmdDb250ZXh0KCgpID0+IHtcbiAgICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyB3aXRoaW4gdGhlIGJyYWNlcy5cbiAgICAgIHdoaWxlICghdGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICAgIGlmICh0aGlzLmVhdCh0dC5zZW1pKSkge1xuICAgICAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvclNlbWljb2xvbiwge1xuICAgICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5sYXN0VG9rRW5kTG9jLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF0Y2godHQuYXQpKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKHRoaXMucGFyc2VEZWNvcmF0b3IoKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLkNsYXNzTWVtYmVyPigpO1xuXG4gICAgICAgIC8vIHN0ZWFsIHRoZSBkZWNvcmF0b3JzIGlmIHRoZXJlIGFyZSBhbnlcbiAgICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICAgICAgICB0aGlzLnJlc2V0U3RhcnRMb2NhdGlvbkZyb21Ob2RlKG1lbWJlciwgZGVjb3JhdG9yc1swXSk7XG4gICAgICAgICAgZGVjb3JhdG9ycyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJzZUNsYXNzTWVtYmVyKGNsYXNzQm9keSwgbWVtYmVyLCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWVcbiAgICAgICAgICBtZW1iZXIua2luZCA9PT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzICYmXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZVxuICAgICAgICAgIG1lbWJlci5kZWNvcmF0b3JzLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQ29uc3RydWN0b3IsIHsgYXQ6IG1lbWJlciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZS5zdHJpY3QgPSBvbGRTdHJpY3Q7XG5cbiAgICB0aGlzLm5leHQoKTsgLy8gZWF0IGB9YFxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5UcmFpbGluZ0RlY29yYXRvciwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNsYXNzU2NvcGUuZXhpdCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShjbGFzc0JvZHksIFwiQ2xhc3NCb2R5XCIpO1xuICB9XG5cbiAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGlkZW50aWZpZXIgaXMgYSBtZXRob2QvZmllbGQgbmFtZSxcbiAgLy8gZmFsc2UgaWYgaXQgaXMgYSBtb2RpZmllclxuICBwYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8Ti5DbGFzc01lbWJlcj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpOyAvLyBlYXRzIHRoZSBtb2RpZmllclxuXG4gICAgaWYgKHRoaXMuaXNDbGFzc01ldGhvZCgpKSB7XG4gICAgICBjb25zdCBtZXRob2Q6IE4uQ2xhc3NNZXRob2QgPSBtZW1iZXIgYXMgYW55O1xuXG4gICAgICAvLyBhIG1ldGhvZCBuYW1lZCBsaWtlIHRoZSBtb2RpZmllclxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgbWV0aG9kLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICBtZXRob2Qua2V5ID0ga2V5O1xuICAgICAgbWV0aG9kLnN0YXRpYyA9IGZhbHNlO1xuICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NsYXNzUHJvcGVydHkoKSkge1xuICAgICAgY29uc3QgcHJvcDogTi5DbGFzc1Byb3BlcnR5ID0gbWVtYmVyIGFzIGFueTtcblxuICAgICAgLy8gYSBwcm9wZXJ0eSBuYW1lZCBsaWtlIHRoZSBtb2RpZmllclxuICAgICAgcHJvcC5jb21wdXRlZCA9IGZhbHNlO1xuICAgICAgcHJvcC5rZXkgPSBrZXk7XG4gICAgICBwcm9wLnN0YXRpYyA9IGZhbHNlO1xuICAgICAgY2xhc3NCb2R5LmJvZHkucHVzaCh0aGlzLnBhcnNlQ2xhc3NQcm9wZXJ0eShwcm9wKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwYXJzZUNsYXNzTWVtYmVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8Ti5DbGFzc01lbWJlcj4sXG4gICAgc3RhdGU6IE4uUGFyc2VDbGFzc01lbWJlclN0YXRlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpc1N0YXRpYyA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9zdGF0aWMpO1xuXG4gICAgaWYgKGlzU3RhdGljKSB7XG4gICAgICBpZiAodGhpcy5wYXJzZUNsYXNzTWVtYmVyRnJvbU1vZGlmaWVyKGNsYXNzQm9keSwgbWVtYmVyKSkge1xuICAgICAgICAvLyBhIGNsYXNzIGVsZW1lbnQgbmFtZWQgJ3N0YXRpYydcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZWF0KHR0LmJyYWNlTCkpIHtcbiAgICAgICAgdGhpcy5wYXJzZUNsYXNzU3RhdGljQmxvY2soY2xhc3NCb2R5LCBtZW1iZXIgYXMgYW55IGFzIE4uU3RhdGljQmxvY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYXJzZUNsYXNzTWVtYmVyV2l0aElzU3RhdGljKGNsYXNzQm9keSwgbWVtYmVyLCBzdGF0ZSwgaXNTdGF0aWMpO1xuICB9XG5cbiAgcGFyc2VDbGFzc01lbWJlcldpdGhJc1N0YXRpYyhcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xhc3NCb2R5OiBVbmRvbmU8Ti5DbGFzc0JvZHk+LFxuICAgIG1lbWJlcjogVW5kb25lPE4uQ2xhc3NNZW1iZXI+LFxuICAgIHN0YXRlOiBOLlBhcnNlQ2xhc3NNZW1iZXJTdGF0ZSxcbiAgICBpc1N0YXRpYzogYm9vbGVhbixcbiAgKSB7XG4gICAgY29uc3QgcHVibGljTWV0aG9kID0gbWVtYmVyIGFzIE4uQ2xhc3NNZXRob2Q7XG4gICAgY29uc3QgcHJpdmF0ZU1ldGhvZCA9IG1lbWJlciBhcyBOLkNsYXNzUHJpdmF0ZU1ldGhvZDtcbiAgICBjb25zdCBwdWJsaWNQcm9wID0gbWVtYmVyIGFzIE4uQ2xhc3NQcm9wZXJ0eTtcbiAgICBjb25zdCBwcml2YXRlUHJvcCA9IG1lbWJlciBhcyBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5O1xuICAgIGNvbnN0IGFjY2Vzc29yUHJvcCA9IG1lbWJlciBhcyBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eTtcblxuICAgIGNvbnN0IG1ldGhvZDogdHlwZW9mIHB1YmxpY01ldGhvZCB8IHR5cGVvZiBwcml2YXRlTWV0aG9kID0gcHVibGljTWV0aG9kO1xuICAgIGNvbnN0IHB1YmxpY01lbWJlcjogdHlwZW9mIHB1YmxpY01ldGhvZCB8IHR5cGVvZiBwdWJsaWNQcm9wID0gcHVibGljTWV0aG9kO1xuXG4gICAgbWVtYmVyLnN0YXRpYyA9IGlzU3RhdGljO1xuICAgIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWVQcmVmaXhPcGVyYXRvcihtZW1iZXIpO1xuXG4gICAgaWYgKHRoaXMuZWF0KHR0LnN0YXIpKSB7XG4gICAgICAvLyBhIGdlbmVyYXRvclxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgY29uc3QgaXNQcml2YXRlTmFtZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWV0aG9kKTtcblxuICAgICAgaWYgKGlzUHJpdmF0ZU5hbWUpIHtcbiAgICAgICAgLy8gUHJpdmF0ZSBnZW5lcmF0b3IgbWV0aG9kXG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIHByaXZhdGVNZXRob2QsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc05vbnN0YXRpY0NvbnN0cnVjdG9yKHB1YmxpY01ldGhvZCkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0dlbmVyYXRvciwge1xuICAgICAgICAgIGF0OiBwdWJsaWNNZXRob2Qua2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgcHVibGljTWV0aG9kLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNDb250ZXh0dWFsID1cbiAgICAgIHRva2VuSXNJZGVudGlmaWVyKHRoaXMuc3RhdGUudHlwZSkgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2M7XG4gICAgY29uc3QgaXNQcml2YXRlID0gdGhpcy5tYXRjaCh0dC5wcml2YXRlTmFtZSk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWVtYmVyKTtcbiAgICBjb25zdCBtYXliZVF1ZXN0aW9uVG9rZW5TdGFydExvYyA9IHRoaXMuc3RhdGUuc3RhcnRMb2M7XG5cbiAgICB0aGlzLnBhcnNlUG9zdE1lbWJlck5hbWVNb2RpZmllcnMocHVibGljTWVtYmVyKTtcblxuICAgIGlmICh0aGlzLmlzQ2xhc3NNZXRob2QoKSkge1xuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChjbGFzc0JvZHksIHByaXZhdGVNZXRob2QsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYSBub3JtYWwgbWV0aG9kXG4gICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdGhpcy5pc05vbnN0YXRpY0NvbnN0cnVjdG9yKHB1YmxpY01ldGhvZCk7XG4gICAgICBsZXQgYWxsb3dzRGlyZWN0U3VwZXIgPSBmYWxzZTtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKSB7XG4gICAgICAgIHB1YmxpY01ldGhvZC5raW5kID0gXCJjb25zdHJ1Y3RvclwiO1xuXG4gICAgICAgIC8vIFR5cGVTY3JpcHQgYWxsb3dzIG11bHRpcGxlIG92ZXJsb2FkZWQgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zLlxuICAgICAgICBpZiAoc3RhdGUuaGFkQ29uc3RydWN0b3IgJiYgIXRoaXMuaGFzUGx1Z2luKFwidHlwZXNjcmlwdFwiKSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkR1cGxpY2F0ZUNvbnN0cnVjdG9yLCB7IGF0OiBrZXkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgdGhpcy5oYXNQbHVnaW4oXCJ0eXBlc2NyaXB0XCIpICYmIG1lbWJlci5vdmVycmlkZSkge1xuICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk92ZXJyaWRlT25Db25zdHJ1Y3RvciwgeyBhdDoga2V5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmhhZENvbnN0cnVjdG9yID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIgPSBzdGF0ZS5oYWRTdXBlckNsYXNzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnB1c2hDbGFzc01ldGhvZChcbiAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICBwdWJsaWNNZXRob2QsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgaXNDb25zdHJ1Y3RvcixcbiAgICAgICAgYWxsb3dzRGlyZWN0U3VwZXIsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NsYXNzUHJvcGVydHkoKSkge1xuICAgICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgICB0aGlzLnB1c2hDbGFzc1ByaXZhdGVQcm9wZXJ0eShjbGFzc0JvZHksIHByaXZhdGVQcm9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJvcGVydHkoY2xhc3NCb2R5LCBwdWJsaWNQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaXNDb250ZXh0dWFsICYmXG4gICAgICBrZXkubmFtZSA9PT0gXCJhc3luY1wiICYmXG4gICAgICAhdGhpcy5pc0xpbmVUZXJtaW5hdG9yKClcbiAgICApIHtcbiAgICAgIC8vIGFuIGFzeW5jIG1ldGhvZFxuICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcbiAgICAgIGNvbnN0IGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHQuc3Rhcik7XG5cbiAgICAgIGlmIChwdWJsaWNNZW1iZXIub3B0aW9uYWwpIHtcbiAgICAgICAgdGhpcy51bmV4cGVjdGVkKG1heWJlUXVlc3Rpb25Ub2tlblN0YXJ0TG9jKTtcbiAgICAgIH1cblxuICAgICAgbWV0aG9kLmtpbmQgPSBcIm1ldGhvZFwiO1xuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJhc3luY1wiOiBnZXQgdGhlIHJlYWwgbmFtZS5cbiAgICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUobWV0aG9kKTtcbiAgICAgIHRoaXMucGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyhwdWJsaWNNZW1iZXIpO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIC8vIHByaXZhdGUgYXN5bmMgbWV0aG9kXG4gICAgICAgIHRoaXMucHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICAgICAgICBjbGFzc0JvZHksXG4gICAgICAgICAgcHJpdmF0ZU1ldGhvZCxcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihwdWJsaWNNZXRob2QpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0FzeW5jLCB7IGF0OiBwdWJsaWNNZXRob2Qua2V5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wdXNoQ2xhc3NNZXRob2QoXG4gICAgICAgICAgY2xhc3NCb2R5LFxuICAgICAgICAgIHB1YmxpY01ldGhvZCxcbiAgICAgICAgICBpc0dlbmVyYXRvcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGlzQ29udGV4dHVhbCAmJlxuICAgICAgKGtleS5uYW1lID09PSBcImdldFwiIHx8IGtleS5uYW1lID09PSBcInNldFwiKSAmJlxuICAgICAgISh0aGlzLm1hdGNoKHR0LnN0YXIpICYmIHRoaXMuaXNMaW5lVGVybWluYXRvcigpKVxuICAgICkge1xuICAgICAgLy8gYGdldFxcbipgIGlzIGFuIHVuaW5pdGlhbGl6ZWQgcHJvcGVydHkgbmFtZWQgJ2dldCcgZm9sbG93ZWQgYnkgYSBnZW5lcmF0b3IuXG4gICAgICAvLyBhIGdldHRlciBvciBzZXR0ZXJcbiAgICAgIHRoaXMucmVzZXRQcmV2aW91c05vZGVUcmFpbGluZ0NvbW1lbnRzKGtleSk7XG4gICAgICBtZXRob2Qua2luZCA9IGtleS5uYW1lO1xuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJnZXQvc2V0XCI6IGdldCB0aGUgcmVhbCBuYW1lLlxuICAgICAgY29uc3QgaXNQcml2YXRlID0gdGhpcy5tYXRjaCh0dC5wcml2YXRlTmFtZSk7XG4gICAgICB0aGlzLnBhcnNlQ2xhc3NFbGVtZW50TmFtZShwdWJsaWNNZXRob2QpO1xuXG4gICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgIC8vIHByaXZhdGUgZ2V0dGVyL3NldHRlclxuICAgICAgICB0aGlzLnB1c2hDbGFzc1ByaXZhdGVNZXRob2QoY2xhc3NCb2R5LCBwcml2YXRlTWV0aG9kLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOb25zdGF0aWNDb25zdHJ1Y3RvcihwdWJsaWNNZXRob2QpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuQ29uc3RydWN0b3JJc0FjY2Vzc29yLCB7IGF0OiBwdWJsaWNNZXRob2Qua2V5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaENsYXNzTWV0aG9kKFxuICAgICAgICAgIGNsYXNzQm9keSxcbiAgICAgICAgICBwdWJsaWNNZXRob2QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgLyogaXNDb25zdHJ1Y3RvciAqLyBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGVja0dldHRlclNldHRlclBhcmFtcyhwdWJsaWNNZXRob2QpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpc0NvbnRleHR1YWwgJiZcbiAgICAgIGtleS5uYW1lID09PSBcImFjY2Vzc29yXCIgJiZcbiAgICAgICF0aGlzLmlzTGluZVRlcm1pbmF0b3IoKVxuICAgICkge1xuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJkZWNvcmF0b3JBdXRvQWNjZXNzb3JzXCIpO1xuICAgICAgdGhpcy5yZXNldFByZXZpb3VzTm9kZVRyYWlsaW5nQ29tbWVudHMoa2V5KTtcblxuICAgICAgLy8gVGhlIHNvLWNhbGxlZCBwYXJzZWQgbmFtZSB3b3VsZCBoYXZlIGJlZW4gXCJhY2Nlc3NvclwiOiBnZXQgdGhlIHJlYWwgbmFtZS5cbiAgICAgIGNvbnN0IGlzUHJpdmF0ZSA9IHRoaXMubWF0Y2godHQucHJpdmF0ZU5hbWUpO1xuICAgICAgdGhpcy5wYXJzZUNsYXNzRWxlbWVudE5hbWUocHVibGljUHJvcCk7XG4gICAgICB0aGlzLnB1c2hDbGFzc0FjY2Vzc29yUHJvcGVydHkoY2xhc3NCb2R5LCBhY2Nlc3NvclByb3AsIGlzUHJpdmF0ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTGluZVRlcm1pbmF0b3IoKSkge1xuICAgICAgLy8gYW4gdW5pbml0aWFsaXplZCBjbGFzcyBwcm9wZXJ0eSAoZHVlIHRvIEFTSSwgc2luY2Ugd2UgZG9uJ3Qgb3RoZXJ3aXNlIHJlY29nbml6ZSB0aGUgbmV4dCB0b2tlbilcbiAgICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoQ2xhc3NQcml2YXRlUHJvcGVydHkoY2xhc3NCb2R5LCBwcml2YXRlUHJvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnB1c2hDbGFzc1Byb3BlcnR5KGNsYXNzQm9keSwgcHVibGljUHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUNsYXNzRWxlbWVudE5hbWVcbiAgcGFyc2VDbGFzc0VsZW1lbnROYW1lKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBtZW1iZXI6IFVuZG9uZTxOLkNsYXNzTWVtYmVyPixcbiAgKTogTi5FeHByZXNzaW9uIHwgTi5JZGVudGlmaWVyIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmIChcbiAgICAgICh0eXBlID09PSB0dC5uYW1lIHx8IHR5cGUgPT09IHR0LnN0cmluZykgJiZcbiAgICAgIG1lbWJlci5zdGF0aWMgJiZcbiAgICAgIHZhbHVlID09PSBcInByb3RvdHlwZVwiXG4gICAgKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5TdGF0aWNQcm90b3R5cGUsIHsgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IHR0LnByaXZhdGVOYW1lKSB7XG4gICAgICBpZiAodmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzUHJpdmF0ZUZpZWxkLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5wYXJzZVByaXZhdGVOYW1lKCk7XG4gICAgICBtZW1iZXIua2V5ID0ga2V5O1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZVByb3BlcnR5TmFtZShtZW1iZXIpO1xuICB9XG5cbiAgcGFyc2VDbGFzc1N0YXRpY0Jsb2NrKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgbWVtYmVyOiBVbmRvbmU8XG4gICAgICBOLlN0YXRpY0Jsb2NrICYge1xuICAgICAgICBkZWNvcmF0b3JzPzogQXJyYXk8Ti5EZWNvcmF0b3I+O1xuICAgICAgfVxuICAgID4sXG4gICkge1xuICAgIC8vIFN0YXJ0IGEgbmV3IGxleGljYWwgc2NvcGVcbiAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX0NMQVNTIHwgU0NPUEVfU1RBVElDX0JMT0NLIHwgU0NPUEVfU1VQRVIpO1xuICAgIC8vIFN0YXJ0IGEgbmV3IHNjb3BlIHdpdGggcmVnYXJkIHRvIGxvb3AgbGFiZWxzXG4gICAgY29uc3Qgb2xkTGFiZWxzID0gdGhpcy5zdGF0ZS5sYWJlbHM7XG4gICAgdGhpcy5zdGF0ZS5sYWJlbHMgPSBbXTtcbiAgICAvLyBDbGFzc1N0YXRpY0Jsb2NrU3RhdGVtZW50TGlzdDpcbiAgICAvLyAgIFN0YXRlbWVudExpc3RbfllpZWxkLCB+QXdhaXQsIH5SZXR1cm5dIG9wdFxuICAgIHRoaXMucHJvZFBhcmFtLmVudGVyKFBBUkFNKTtcbiAgICBjb25zdCBib2R5OiBOLk5vZGVbXSA9IChtZW1iZXIuYm9keSA9IFtdKTtcbiAgICB0aGlzLnBhcnNlQmxvY2tPck1vZHVsZUJsb2NrQm9keShib2R5LCB1bmRlZmluZWQsIGZhbHNlLCB0dC5icmFjZVIpO1xuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgICB0aGlzLnN0YXRlLmxhYmVscyA9IG9sZExhYmVscztcbiAgICBjbGFzc0JvZHkuYm9keS5wdXNoKHRoaXMuZmluaXNoTm9kZTxOLlN0YXRpY0Jsb2NrPihtZW1iZXIsIFwiU3RhdGljQmxvY2tcIikpO1xuICAgIGlmIChtZW1iZXIuZGVjb3JhdG9ycz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5EZWNvcmF0b3JTdGF0aWNCbG9jaywgeyBhdDogbWVtYmVyIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hDbGFzc1Byb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgcHJvcDogTi5DbGFzc1Byb3BlcnR5LFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhcHJvcC5jb21wdXRlZCAmJlxuICAgICAgKHByb3Aua2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCBwcm9wLmtleS52YWx1ZSA9PT0gXCJjb25zdHJ1Y3RvclwiKVxuICAgICkge1xuICAgICAgLy8gTm9uLWNvbXB1dGVkIGZpZWxkLCB3aGljaCBpcyBlaXRoZXIgYW4gaWRlbnRpZmllciBuYW1lZCBcImNvbnN0cnVjdG9yXCJcbiAgICAgIC8vIG9yIGEgc3RyaW5nIGxpdGVyYWwgbmFtZWQgXCJjb25zdHJ1Y3RvclwiXG4gICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzRmllbGQsIHsgYXQ6IHByb3Aua2V5IH0pO1xuICAgIH1cblxuICAgIGNsYXNzQm9keS5ib2R5LnB1c2godGhpcy5wYXJzZUNsYXNzUHJvcGVydHkocHJvcCkpO1xuICB9XG5cbiAgcHVzaENsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBjbGFzc0JvZHk6IFVuZG9uZTxOLkNsYXNzQm9keT4sXG4gICAgcHJvcDogVW5kb25lPE4uQ2xhc3NQcml2YXRlUHJvcGVydHk+LFxuICApIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUNsYXNzUHJpdmF0ZVByb3BlcnR5KHByb3ApO1xuICAgIGNsYXNzQm9keS5ib2R5LnB1c2gobm9kZSk7XG5cbiAgICB0aGlzLmNsYXNzU2NvcGUuZGVjbGFyZVByaXZhdGVOYW1lKFxuICAgICAgdGhpcy5nZXRQcml2YXRlTmFtZVNWKG5vZGUua2V5KSxcbiAgICAgIENMQVNTX0VMRU1FTlRfT1RIRVIsXG4gICAgICBub2RlLmtleS5sb2Muc3RhcnQsXG4gICAgKTtcbiAgfVxuXG4gIHB1c2hDbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsYXNzQm9keTogVW5kb25lPE4uQ2xhc3NCb2R5PixcbiAgICBwcm9wOiBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgICBpc1ByaXZhdGU6IGJvb2xlYW4sXG4gICkge1xuICAgIGlmICghaXNQcml2YXRlICYmICFwcm9wLmNvbXB1dGVkKSB7XG4gICAgICAvLyBOb3QgcHJpdmF0ZSwgc28gbm90IG5vZGUgaXMgbm90IGEgUHJpdmF0ZU5hbWUgYW5kIHdlIGNhbiBzYWZlbHkgY2FzdFxuICAgICAgY29uc3Qga2V5ID0gcHJvcC5rZXkgYXMgTi5FeHByZXNzaW9uO1xuXG4gICAgICBpZiAoa2V5Lm5hbWUgPT09IFwiY29uc3RydWN0b3JcIiB8fCBrZXkudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICAvLyBOb24tY29tcHV0ZWQgZmllbGQsIHdoaWNoIGlzIGVpdGhlciBhbiBpZGVudGlmaWVyIG5hbWVkIFwiY29uc3RydWN0b3JcIlxuICAgICAgICAvLyBvciBhIHN0cmluZyBsaXRlcmFsIG5hbWVkIFwiY29uc3RydWN0b3JcIlxuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Db25zdHJ1Y3RvckNsYXNzRmllbGQsIHsgYXQ6IGtleSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZUNsYXNzQWNjZXNzb3JQcm9wZXJ0eShwcm9wKTtcbiAgICBjbGFzc0JvZHkuYm9keS5wdXNoKG5vZGUpO1xuXG4gICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgdGhpcy5jbGFzc1Njb3BlLmRlY2xhcmVQcml2YXRlTmFtZShcbiAgICAgICAgdGhpcy5nZXRQcml2YXRlTmFtZVNWKG5vZGUua2V5KSxcbiAgICAgICAgQ0xBU1NfRUxFTUVOVF9PVEhFUixcbiAgICAgICAgbm9kZS5rZXkubG9jLnN0YXJ0LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdXNoQ2xhc3NNZXRob2QoXG4gICAgdGhpczogUGFyc2VyLFxuICAgIGNsYXNzQm9keTogVW5kb25lPE4uQ2xhc3NCb2R5PixcbiAgICBtZXRob2Q6IFVuZG9uZTxOLkNsYXNzTWV0aG9kPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICAgIGlzQ29uc3RydWN0b3I6IGJvb2xlYW4sXG4gICAgYWxsb3dzRGlyZWN0U3VwZXI6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNsYXNzQm9keS5ib2R5LnB1c2goXG4gICAgICB0aGlzLnBhcnNlTWV0aG9kKFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgICBpc0FzeW5jLFxuICAgICAgICBpc0NvbnN0cnVjdG9yLFxuICAgICAgICBhbGxvd3NEaXJlY3RTdXBlcixcbiAgICAgICAgXCJDbGFzc01ldGhvZFwiLFxuICAgICAgICB0cnVlLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVzaENsYXNzUHJpdmF0ZU1ldGhvZChcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgY2xhc3NCb2R5OiBVbmRvbmU8Ti5DbGFzc0JvZHk+LFxuICAgIG1ldGhvZDogVW5kb25lPE4uQ2xhc3NQcml2YXRlTWV0aG9kPixcbiAgICBpc0dlbmVyYXRvcjogYm9vbGVhbixcbiAgICBpc0FzeW5jOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5wYXJzZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGlzR2VuZXJhdG9yLFxuICAgICAgaXNBc3luYyxcbiAgICAgIC8qIGlzQ29uc3RydWN0b3IgKi8gZmFsc2UsXG4gICAgICBmYWxzZSxcbiAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgICB0cnVlLFxuICAgICk7XG4gICAgY2xhc3NCb2R5LmJvZHkucHVzaChub2RlKTtcblxuICAgIGNvbnN0IGtpbmQgPVxuICAgICAgbm9kZS5raW5kID09PSBcImdldFwiXG4gICAgICAgID8gbm9kZS5zdGF0aWNcbiAgICAgICAgICA/IENMQVNTX0VMRU1FTlRfU1RBVElDX0dFVFRFUlxuICAgICAgICAgIDogQ0xBU1NfRUxFTUVOVF9JTlNUQU5DRV9HRVRURVJcbiAgICAgICAgOiBub2RlLmtpbmQgPT09IFwic2V0XCJcbiAgICAgICAgPyBub2RlLnN0YXRpY1xuICAgICAgICAgID8gQ0xBU1NfRUxFTUVOVF9TVEFUSUNfU0VUVEVSXG4gICAgICAgICAgOiBDTEFTU19FTEVNRU5UX0lOU1RBTkNFX1NFVFRFUlxuICAgICAgICA6IENMQVNTX0VMRU1FTlRfT1RIRVI7XG4gICAgdGhpcy5kZWNsYXJlQ2xhc3NQcml2YXRlTWV0aG9kSW5TY29wZShub2RlLCBraW5kKTtcbiAgfVxuXG4gIGRlY2xhcmVDbGFzc1ByaXZhdGVNZXRob2RJblNjb3BlKFxuICAgIG5vZGU6IFVuZG9uZTxcbiAgICAgIE4uQ2xhc3NQcml2YXRlTWV0aG9kIHwgTi5Fc3RyZWVNZXRob2REZWZpbml0aW9uIHwgTi5UU0RlY2xhcmVNZXRob2RcbiAgICA+LFxuICAgIGtpbmQ6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy5jbGFzc1Njb3BlLmRlY2xhcmVQcml2YXRlTmFtZShcbiAgICAgIHRoaXMuZ2V0UHJpdmF0ZU5hbWVTVihub2RlLmtleSksXG4gICAgICBraW5kLFxuICAgICAgbm9kZS5rZXkubG9jLnN0YXJ0LFxuICAgICk7XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIGluIHR5cGVzY3JpcHQuanNcbiAgcGFyc2VQb3N0TWVtYmVyTmFtZU1vZGlmaWVycyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgbWV0aG9kT3JQcm9wOiBVbmRvbmU8Ti5DbGFzc01ldGhvZCB8IE4uQ2xhc3NQcm9wZXJ0eT4sXG4gICk6IHZvaWQge31cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1GaWVsZERlZmluaXRpb25cbiAgcGFyc2VDbGFzc1ByaXZhdGVQcm9wZXJ0eShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uQ2xhc3NQcml2YXRlUHJvcGVydHk+LFxuICApOiBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHtcbiAgICB0aGlzLnBhcnNlSW5pdGlhbGl6ZXIobm9kZSk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1GaWVsZERlZmluaXRpb25cbiAgcGFyc2VDbGFzc1Byb3BlcnR5KHRoaXM6IFBhcnNlciwgbm9kZTogTi5DbGFzc1Byb3BlcnR5KTogTi5DbGFzc1Byb3BlcnR5IHtcbiAgICB0aGlzLnBhcnNlSW5pdGlhbGl6ZXIobm9kZSk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQ2xhc3NQcm9wZXJ0eVwiKTtcbiAgfVxuXG4gIHBhcnNlQ2xhc3NBY2Nlc3NvclByb3BlcnR5KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBOLkNsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgKTogTi5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICAgIHRoaXMucGFyc2VJbml0aWFsaXplcihub2RlKTtcbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Jbml0aWFsaXplclxuICBwYXJzZUluaXRpYWxpemVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkNsYXNzUHJvcGVydHkgfCBOLkNsYXNzUHJpdmF0ZVByb3BlcnR5IHwgTi5DbGFzc0FjY2Vzc29yUHJvcGVydHlcbiAgICA+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlLmVudGVyKFNDT1BFX0NMQVNTIHwgU0NPUEVfU1VQRVIpO1xuICAgIHRoaXMuZXhwcmVzc2lvblNjb3BlLmVudGVyKG5ld0V4cHJlc3Npb25TY29wZSgpKTtcbiAgICB0aGlzLnByb2RQYXJhbS5lbnRlcihQQVJBTSk7XG4gICAgbm9kZS52YWx1ZSA9IHRoaXMuZWF0KHR0LmVxKSA/IHRoaXMucGFyc2VNYXliZUFzc2lnbkFsbG93SW4oKSA6IG51bGw7XG4gICAgdGhpcy5leHByZXNzaW9uU2NvcGUuZXhpdCgpO1xuICAgIHRoaXMucHJvZFBhcmFtLmV4aXQoKTtcbiAgICB0aGlzLnNjb3BlLmV4aXQoKTtcbiAgfVxuXG4gIHBhcnNlQ2xhc3NJZChcbiAgICBub2RlOiBVbmRvbmU8Ti5DbGFzcz4sXG4gICAgaXNTdGF0ZW1lbnQ6IGJvb2xlYW4sXG4gICAgb3B0aW9uYWxJZD86IGJvb2xlYW4gfCBudWxsLFxuICAgIGJpbmRpbmdUeXBlOiBCaW5kaW5nVHlwZXMgPSBCSU5EX0NMQVNTLFxuICApOiB2b2lkIHtcbiAgICBpZiAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSkge1xuICAgICAgbm9kZS5pZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyKCk7XG4gICAgICBpZiAoaXNTdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kZWNsYXJlTmFtZUZyb21JZGVudGlmaWVyKG5vZGUuaWQsIGJpbmRpbmdUeXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbmFsSWQgfHwgIWlzU3RhdGVtZW50KSB7XG4gICAgICAgIG5vZGUuaWQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yYWlzZShFcnJvcnMuTWlzc2luZ0NsYXNzTmFtZSwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1DbGFzc0hlcml0YWdlXG4gIHBhcnNlQ2xhc3NTdXBlcih0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLkNsYXNzPik6IHZvaWQge1xuICAgIG5vZGUuc3VwZXJDbGFzcyA9IHRoaXMuZWF0KHR0Ll9leHRlbmRzKSA/IHRoaXMucGFyc2VFeHByU3Vic2NyaXB0cygpIDogbnVsbDtcbiAgfVxuXG4gIC8vIFBhcnNlcyBtb2R1bGUgZXhwb3J0IGRlY2xhcmF0aW9uLlxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1FeHBvcnREZWNsYXJhdGlvblxuXG4gIHBhcnNlRXhwb3J0KFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXG4gICAgICB8IE4uRXhwb3J0QWxsRGVjbGFyYXRpb25cbiAgICAgIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uXG4gICAgPixcbiAgICBkZWNvcmF0b3JzOiBOLkRlY29yYXRvcltdIHwgbnVsbCxcbiAgKTogTi5BbnlFeHBvcnQge1xuICAgIGNvbnN0IG1heWJlRGVmYXVsdElkZW50aWZpZXIgPSB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICAgIG5vZGUsXG4gICAgICAvKiBpc0V4cG9ydCAqLyB0cnVlLFxuICAgICk7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IHRoaXMubWF5YmVQYXJzZUV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gICAgICBub2RlLFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlQWZ0ZXJEZWZhdWx0ID0gIWhhc0RlZmF1bHQgfHwgdGhpcy5lYXQodHQuY29tbWEpO1xuICAgIGNvbnN0IGhhc1N0YXIgPVxuICAgICAgcGFyc2VBZnRlckRlZmF1bHQgJiZcbiAgICAgIHRoaXMuZWF0RXhwb3J0U3RhcihcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgICBub2RlLFxuICAgICAgKTtcbiAgICBjb25zdCBoYXNOYW1lc3BhY2UgPVxuICAgICAgaGFzU3RhciAmJlxuICAgICAgdGhpcy5tYXliZVBhcnNlRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICAgIG5vZGUsXG4gICAgICApO1xuICAgIGNvbnN0IHBhcnNlQWZ0ZXJOYW1lc3BhY2UgPVxuICAgICAgcGFyc2VBZnRlckRlZmF1bHQgJiYgKCFoYXNOYW1lc3BhY2UgfHwgdGhpcy5lYXQodHQuY29tbWEpKTtcbiAgICBjb25zdCBpc0Zyb21SZXF1aXJlZCA9IGhhc0RlZmF1bHQgfHwgaGFzU3RhcjtcblxuICAgIGlmIChoYXNTdGFyICYmICFoYXNOYW1lc3BhY2UpIHtcbiAgICAgIGlmIChoYXNEZWZhdWx0KSB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICAgIGlmIChkZWNvcmF0b3JzKSB7XG4gICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLlVuc3VwcG9ydGVkRGVjb3JhdG9yRXhwb3J0LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJzZUV4cG9ydEZyb20obm9kZSBhcyBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uPiwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTcGVjaWZpZXJzID0gdGhpcy5tYXliZVBhcnNlRXhwb3J0TmFtZWRTcGVjaWZpZXJzKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKVxuICAgICAgbm9kZSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0RlZmF1bHQgJiYgcGFyc2VBZnRlckRlZmF1bHQgJiYgIWhhc1N0YXIgJiYgIWhhc1NwZWNpZmllcnMpIHtcbiAgICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5icmFjZUwpO1xuICAgIH1cblxuICAgIGlmIChoYXNOYW1lc3BhY2UgJiYgcGFyc2VBZnRlck5hbWVzcGFjZSkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKG51bGwsIHR0Ll9mcm9tKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzRGVjbGFyYXRpb247XG4gICAgaWYgKGlzRnJvbVJlcXVpcmVkIHx8IGhhc1NwZWNpZmllcnMpIHtcbiAgICAgIGhhc0RlY2xhcmF0aW9uID0gZmFsc2U7XG4gICAgICBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFyc2VFeHBvcnRGcm9tKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICAgICAgICBpc0Zyb21SZXF1aXJlZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0RlY2xhcmF0aW9uID0gdGhpcy5tYXliZVBhcnNlRXhwb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0Zyb21SZXF1aXJlZCB8fCBoYXNTcGVjaWZpZXJzIHx8IGhhc0RlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBub2RlMiA9IG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj47XG4gICAgICB0aGlzLmNoZWNrRXhwb3J0KG5vZGUyLCB0cnVlLCBmYWxzZSwgISFub2RlMi5zb3VyY2UpO1xuICAgICAgaWYgKG5vZGUyLmRlY2xhcmF0aW9uPy50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIikge1xuICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgbm9kZTIuZGVjbGFyYXRpb24sIG5vZGUyKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZTIsIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lYXQodHQuX2RlZmF1bHQpKSB7XG4gICAgICBjb25zdCBub2RlMiA9IG5vZGUgYXMgVW5kb25lPE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPjtcbiAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IC4uLlxuICAgICAgY29uc3QgZGVjbCA9IHRoaXMucGFyc2VFeHBvcnREZWZhdWx0RXhwcmVzc2lvbigpO1xuICAgICAgbm9kZTIuZGVjbGFyYXRpb24gPSBkZWNsO1xuXG4gICAgICBpZiAoZGVjbC50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIikge1xuICAgICAgICB0aGlzLm1heWJlVGFrZURlY29yYXRvcnMoZGVjb3JhdG9ycywgZGVjbCBhcyBOLkNsYXNzRGVjbGFyYXRpb24sIG5vZGUyKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVjb3JhdG9ycykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlY29yYXRvckV4cG9ydCwgeyBhdDogbm9kZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGVja0V4cG9ydChub2RlMiwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZTIsIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpO1xuICAgIH1cblxuICAgIHRoaXMudW5leHBlY3RlZChudWxsLCB0dC5icmFjZUwpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBlYXRFeHBvcnRTdGFyKG5vZGU6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVhdCh0dC5zdGFyKTtcbiAgfVxuXG4gIG1heWJlUGFyc2VFeHBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICAgIG5vZGU6IFVuZG9uZTxcbiAgICAgIHwgTi5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cbiAgICAgIHwgTi5FeHBvcnRBbGxEZWNsYXJhdGlvblxuICAgICAgfCBOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cbiAgICA+LFxuICAgIG1heWJlRGVmYXVsdElkZW50aWZpZXI6IE4uSWRlbnRpZmllciB8IG51bGwsXG4gICk6IG5vZGUgaXMgVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4ge1xuICAgIGlmIChtYXliZURlZmF1bHRJZGVudGlmaWVyIHx8IHRoaXMuaXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyKCkpIHtcbiAgICAgIC8vIGV4cG9ydCBkZWZhdWx0T2JqIC4uLlxuICAgICAgdGhpcy5leHBlY3RQbHVnaW4oXCJleHBvcnREZWZhdWx0RnJvbVwiLCBtYXliZURlZmF1bHRJZGVudGlmaWVyPy5sb2Muc3RhcnQpO1xuICAgICAgY29uc3QgaWQgPSBtYXliZURlZmF1bHRJZGVudGlmaWVyIHx8IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgY29uc3Qgc3BlY2lmaWVyID0gdGhpcy5zdGFydE5vZGVBdE5vZGU8Ti5FeHBvcnREZWZhdWx0U3BlY2lmaWVyPihpZCk7XG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSBpZDtcbiAgICAgIChub2RlIGFzIFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+KS5zcGVjaWZpZXJzID0gW1xuICAgICAgICB0aGlzLmZpbmlzaE5vZGUoc3BlY2lmaWVyLCBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIiksXG4gICAgICBdO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1heWJlUGFyc2VFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIobm9kZTogTi5Ob2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgIGlmICghbm9kZS5zcGVjaWZpZXJzKSBub2RlLnNwZWNpZmllcnMgPSBbXTtcblxuICAgICAgY29uc3Qgc3BlY2lmaWVyID0gdGhpcy5zdGFydE5vZGVBdCh0aGlzLnN0YXRlLmxhc3RUb2tTdGFydExvYyk7XG5cbiAgICAgIHRoaXMubmV4dCgpO1xuXG4gICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgbm9kZS5zcGVjaWZpZXJzLnB1c2goXG4gICAgICAgIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBtYXliZVBhcnNlRXhwb3J0TmFtZWRTcGVjaWZpZXJzKG5vZGU6IE4uTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LmJyYWNlTCkpIHtcbiAgICAgIGlmICghbm9kZS5zcGVjaWZpZXJzKSBub2RlLnNwZWNpZmllcnMgPSBbXTtcbiAgICAgIGNvbnN0IGlzVHlwZUV4cG9ydCA9IG5vZGUuZXhwb3J0S2luZCA9PT0gXCJ0eXBlXCI7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaCguLi50aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhpc1R5cGVFeHBvcnQpKTtcblxuICAgICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICAgICAgbm9kZS5kZWNsYXJhdGlvbiA9IG51bGw7XG4gICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJpbXBvcnRBc3NlcnRpb25zXCIpKSB7XG4gICAgICAgIG5vZGUuYXNzZXJ0aW9ucyA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbWF5YmVQYXJzZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2hvdWxkUGFyc2VFeHBvcnREZWNsYXJhdGlvbigpKSB7XG4gICAgICBub2RlLnNwZWNpZmllcnMgPSBbXTtcbiAgICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImltcG9ydEFzc2VydGlvbnNcIikpIHtcbiAgICAgICAgbm9kZS5hc3NlcnRpb25zID0gW107XG4gICAgICB9XG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKHR0Ll9hc3luYykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZXh0VG9rZW5JbkxpbmVTdGFydCgpO1xuICAgIHJldHVybiB0aGlzLmlzVW5wYXJzZWRDb250ZXh0dWFsKG5leHQsIFwiZnVuY3Rpb25cIik7XG4gIH1cblxuICBwYXJzZUV4cG9ydERlZmF1bHRFeHByZXNzaW9uKHRoaXM6IFBhcnNlcik6IE4uRXhwcmVzc2lvbiB8IE4uRGVjbGFyYXRpb24ge1xuICAgIGNvbnN0IGV4cHIgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2Z1bmN0aW9uKSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKFxuICAgICAgICBleHByIGFzIFVuZG9uZTxOLkZ1bmN0aW9uRGVjbGFyYXRpb24+LFxuICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5EZWNsYXJhdGlvbiB8IFBhcnNlRnVuY3Rpb25GbGFnLk51bGxhYmxlSWQsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgdGhpcy5uZXh0KCk7IC8vIGVhdCAnYXN5bmMnXG4gICAgICB0aGlzLm5leHQoKTsgLy8gZWF0ICdmdW5jdGlvbidcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24oXG4gICAgICAgIGV4cHIgYXMgVW5kb25lPE4uRnVuY3Rpb25EZWNsYXJhdGlvbj4sXG4gICAgICAgIFBhcnNlRnVuY3Rpb25GbGFnLkRlY2xhcmF0aW9uIHxcbiAgICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5OdWxsYWJsZUlkIHxcbiAgICAgICAgICBQYXJzZUZ1bmN0aW9uRmxhZy5Bc3luYyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDbGFzcyhleHByIGFzIFVuZG9uZTxOLkNsYXNzRXhwcmVzc2lvbj4sIHRydWUsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1hdGNoKHR0LmF0KSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc1BsdWdpbihcImRlY29yYXRvcnNcIikgJiZcbiAgICAgICAgdGhpcy5nZXRQbHVnaW5PcHRpb24oXCJkZWNvcmF0b3JzXCIsIFwiZGVjb3JhdG9yc0JlZm9yZUV4cG9ydFwiKSA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkRlY29yYXRvckJlZm9yZUV4cG9ydCwgeyBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3MoXG4gICAgICAgIHRoaXMubWF5YmVUYWtlRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhmYWxzZSksXG4gICAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0RlY2xhcmF0aW9uPigpLFxuICAgICAgICApLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXRjaCh0dC5fY29uc3QpIHx8IHRoaXMubWF0Y2godHQuX3ZhcikgfHwgdGhpcy5pc0xldCgpKSB7XG4gICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5VbnN1cHBvcnRlZERlZmF1bHRFeHBvcnQsIHtcbiAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ25BbGxvd0luKCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtRXhwb3J0RGVjbGFyYXRpb25cbiAgcGFyc2VFeHBvcnREZWNsYXJhdGlvbihcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG5vZGU6IFVuZG9uZTxOLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+LFxuICApOiBOLkRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2NsYXNzKSkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucGFyc2VDbGFzcyhcbiAgICAgICAgdGhpcy5zdGFydE5vZGU8Ti5DbGFzc0RlY2xhcmF0aW9uPigpLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpIGFzIE4uRGVjbGFyYXRpb247XG4gIH1cblxuICBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0b2tlbklzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgaWYgKCh0eXBlID09PSB0dC5fYXN5bmMgJiYgIXRoaXMuc3RhdGUuY29udGFpbnNFc2MpIHx8IHR5cGUgPT09IHR0Ll9sZXQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAodHlwZSA9PT0gdHQuX3R5cGUgfHwgdHlwZSA9PT0gdHQuX2ludGVyZmFjZSkgJiZcbiAgICAgICAgIXRoaXMuc3RhdGUuY29udGFpbnNFc2NcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IHR5cGU6IG5leHRUeXBlIH0gPSB0aGlzLmxvb2thaGVhZCgpO1xuICAgICAgICAvLyBJZiB3ZSBzZWUgYW55IHZhcmlhYmxlIG5hbWUgb3RoZXIgdGhhbiBgZnJvbWAgYWZ0ZXIgYHR5cGVgIGtleXdvcmQsXG4gICAgICAgIC8vIHdlIGNvbnNpZGVyIGl0IGFzIGZsb3cvdHlwZXNjcmlwdCB0eXBlIGV4cG9ydHNcbiAgICAgICAgLy8gbm90ZSB0aGF0IHRoaXMgYXBwcm9hY2ggbWF5IGZhaWwgb24gc29tZSBwZWRhbnRpYyBjYXNlc1xuICAgICAgICAvLyBleHBvcnQgdHlwZSBmcm9tID0gbnVtYmVyXG4gICAgICAgIGlmIChcbiAgICAgICAgICAodG9rZW5Jc0lkZW50aWZpZXIobmV4dFR5cGUpICYmIG5leHRUeXBlICE9PSB0dC5fZnJvbSkgfHxcbiAgICAgICAgICBuZXh0VHlwZSA9PT0gdHQuYnJhY2VMXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImZsb3dcIiwgXCJ0eXBlc2NyaXB0XCJdKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLm1hdGNoKHR0Ll9kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRUb2tlblN0YXJ0KCk7XG4gICAgY29uc3QgaGFzRnJvbSA9IHRoaXMuaXNVbnBhcnNlZENvbnRleHR1YWwobmV4dCwgXCJmcm9tXCIpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KSA9PT0gY2hhckNvZGVzLmNvbW1hIHx8XG4gICAgICAodG9rZW5Jc0lkZW50aWZpZXIodGhpcy5zdGF0ZS50eXBlKSAmJiBoYXNGcm9tKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGxvb2thaGVhZCBhZ2FpbiB3aGVuIGBleHBvcnQgZGVmYXVsdCBmcm9tYCBpcyBzZWVuXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX2RlZmF1bHQpICYmIGhhc0Zyb20pIHtcbiAgICAgIGNvbnN0IG5leHRBZnRlckZyb20gPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoXG4gICAgICAgIHRoaXMubmV4dFRva2VuU3RhcnRTaW5jZShuZXh0ICsgNCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbmV4dEFmdGVyRnJvbSA9PT0gY2hhckNvZGVzLnF1b3RhdGlvbk1hcmsgfHxcbiAgICAgICAgbmV4dEFmdGVyRnJvbSA9PT0gY2hhckNvZGVzLmFwb3N0cm9waGVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHBhcnNlRXhwb3J0RnJvbShcbiAgICB0aGlzOiBQYXJzZXIsXG4gICAgbm9kZTogVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbj4sXG4gICAgZXhwZWN0PzogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fZnJvbSkpIHtcbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgICAgdGhpcy5jaGVja0V4cG9ydChub2RlKTtcbiAgICAgIHRoaXMubWF5YmVQYXJzZUltcG9ydEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICB0aGlzLmNoZWNrSlNPTk1vZHVsZUltcG9ydChub2RlKTtcbiAgICB9IGVsc2UgaWYgKGV4cGVjdCkge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgfVxuXG4gIHNob3VsZFBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIGlmICh0eXBlID09PSB0dC5hdCkge1xuICAgICAgdGhpcy5leHBlY3RPbmVQbHVnaW4oW1wiZGVjb3JhdG9yc1wiLCBcImRlY29yYXRvcnMtbGVnYWN5XCJdKTtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImRlY29yYXRvcnNcIikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiZGVjb3JhdG9yc1wiLCBcImRlY29yYXRvcnNCZWZvcmVFeHBvcnRcIikgPT09IHRydWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRGVjb3JhdG9yQmVmb3JlRXhwb3J0LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlID09PSB0dC5fdmFyIHx8XG4gICAgICB0eXBlID09PSB0dC5fY29uc3QgfHxcbiAgICAgIHR5cGUgPT09IHR0Ll9mdW5jdGlvbiB8fFxuICAgICAgdHlwZSA9PT0gdHQuX2NsYXNzIHx8XG4gICAgICB0aGlzLmlzTGV0KCkgfHxcbiAgICAgIHRoaXMuaXNBc3luY0Z1bmN0aW9uKClcbiAgICApO1xuICB9XG5cbiAgY2hlY2tFeHBvcnQoXG4gICAgbm9kZTogVW5kb25lPE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvbiB8IE4uRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPixcbiAgICBjaGVja05hbWVzPzogYm9vbGVhbixcbiAgICBpc0RlZmF1bHQ/OiBib29sZWFuLFxuICAgIGlzRnJvbT86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGlmIChjaGVja05hbWVzKSB7XG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIGV4cG9ydHNcbiAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBleHBvcnRzXG4gICAgICAgIHRoaXMuY2hlY2tEdXBsaWNhdGVFeHBvcnRzKG5vZGUsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzUGx1Z2luKFwiZXhwb3J0RGVmYXVsdEZyb21cIikpIHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IChub2RlIGFzIGFueSBhcyBOLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbilcbiAgICAgICAgICAgIC5kZWNsYXJhdGlvbjtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICAgZGVjbGFyYXRpb24ubmFtZSA9PT0gXCJmcm9tXCIgJiZcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uLmVuZCAtIGRlY2xhcmF0aW9uLnN0YXJ0ID09PSA0ICYmIC8vIGRvZXMgbm90IGNvbnRhaW4gZXNjYXBlXG4gICAgICAgICAgICAhZGVjbGFyYXRpb24uZXh0cmE/LnBhcmVudGhlc2l6ZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkV4cG9ydERlZmF1bHRGcm9tQXNJZGVudGlmaWVyLCB7XG4gICAgICAgICAgICAgIGF0OiBkZWNsYXJhdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5vZGUuc3BlY2lmaWVycyBtYXkgbm90IGV4aXN0XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuc3BlY2lmaWVycyAmJiBub2RlLnNwZWNpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5hbWVkIGV4cG9ydHNcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlLnNwZWNpZmllcnMgbWF5IG5vdCBleGlzdFxuICAgICAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjb25zdCB7IGV4cG9ydGVkIH0gPSBzcGVjaWZpZXI7XG4gICAgICAgICAgY29uc3QgZXhwb3J0TmFtZSA9XG4gICAgICAgICAgICBleHBvcnRlZC50eXBlID09PSBcIklkZW50aWZpZXJcIiA/IGV4cG9ydGVkLm5hbWUgOiBleHBvcnRlZC52YWx1ZTtcbiAgICAgICAgICB0aGlzLmNoZWNrRHVwbGljYXRlRXhwb3J0cyhzcGVjaWZpZXIsIGV4cG9ydE5hbWUpO1xuICAgICAgICAgIGlmICghaXNGcm9tICYmIHNwZWNpZmllci5sb2NhbCkge1xuICAgICAgICAgICAgY29uc3QgeyBsb2NhbCB9ID0gc3BlY2lmaWVyO1xuICAgICAgICAgICAgaWYgKGxvY2FsLnR5cGUgIT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICAgICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkV4cG9ydEJpbmRpbmdJc1N0cmluZywge1xuICAgICAgICAgICAgICAgIGF0OiBzcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgbG9jYWxOYW1lOiBsb2NhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICBleHBvcnROYW1lLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBrZXl3b3JkcyB1c2VkIGFzIGxvY2FsIG5hbWVzXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQobG9jYWwubmFtZSwgbG9jYWwubG9jLnN0YXJ0LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGV4cG9ydCBpcyBkZWZpbmVkXG4gICAgICAgICAgICAgIHRoaXMuc2NvcGUuY2hlY2tMb2NhbEV4cG9ydChsb2NhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gRXhwb3J0ZWQgZGVjbGFyYXRpb25zXG4gICAgICAgIGlmIChcbiAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8XG4gICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbi50eXBlID09PSBcIkNsYXNzRGVjbGFyYXRpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpZCA9IG5vZGUuZGVjbGFyYXRpb24uaWQ7XG4gICAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKFwiQXNzZXJ0aW9uIGZhaWx1cmVcIik7XG5cbiAgICAgICAgICB0aGlzLmNoZWNrRHVwbGljYXRlRXhwb3J0cyhub2RlLCBpZC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja0RlY2xhcmF0aW9uKG5vZGU6IE4uUGF0dGVybiB8IE4uT2JqZWN0UHJvcGVydHkpOiB2b2lkIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgdGhpcy5jaGVja0R1cGxpY2F0ZUV4cG9ydHMobm9kZSwgbm9kZS5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gXCJPYmplY3RQYXR0ZXJuXCIpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBub2RlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKHByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkFycmF5UGF0dGVyblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tEZWNsYXJhdGlvbihlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlncmF0ZSB0byBCYWJlbCB0eXBlc1xuICAgICAgdGhpcy5jaGVja0RlY2xhcmF0aW9uKG5vZGUudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpIHtcbiAgICAgIHRoaXMuY2hlY2tEZWNsYXJhdGlvbihub2RlLmFyZ3VtZW50KTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICB0aGlzLmNoZWNrRGVjbGFyYXRpb24obm9kZS5sZWZ0KTtcbiAgICB9XG4gIH1cblxuICBjaGVja0R1cGxpY2F0ZUV4cG9ydHMoXG4gICAgbm9kZTogVW5kb25lPFxuICAgICAgfCBOLklkZW50aWZpZXJcbiAgICAgIHwgTi5TdHJpbmdMaXRlcmFsXG4gICAgICB8IE4uRXhwb3J0TmFtZWREZWNsYXJhdGlvblxuICAgICAgfCBOLkV4cG9ydFNwZWNpZmllclxuICAgICAgfCBOLkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICA+LFxuICAgIGV4cG9ydE5hbWU6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhwb3J0ZWRJZGVudGlmaWVycy5oYXMoZXhwb3J0TmFtZSkpIHtcbiAgICAgIGlmIChleHBvcnROYW1lID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5EdXBsaWNhdGVEZWZhdWx0RXhwb3J0LCB7IGF0OiBub2RlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuRHVwbGljYXRlRXhwb3J0LCB7IGF0OiBub2RlLCBleHBvcnROYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmV4cG9ydGVkSWRlbnRpZmllcnMuYWRkKGV4cG9ydE5hbWUpO1xuICB9XG5cbiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIGV4cG9ydHMuXG5cbiAgcGFyc2VFeHBvcnRTcGVjaWZpZXJzKGlzSW5UeXBlRXhwb3J0OiBib29sZWFuKTogQXJyYXk8Ti5FeHBvcnRTcGVjaWZpZXI+IHtcbiAgICBjb25zdCBub2RlcyA9IFtdO1xuICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAvLyBleHBvcnQgeyB4LCB5IGFzIHogfSBbZnJvbSAnLi4uJ11cbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuXG4gICAgd2hpbGUgKCF0aGlzLmVhdCh0dC5icmFjZVIpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0KHR0LmNvbW1hKTtcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmJyYWNlUikpIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNNYXliZVR5cGVPbmx5ID0gdGhpcy5pc0NvbnRleHR1YWwodHQuX3R5cGUpO1xuICAgICAgY29uc3QgaXNTdHJpbmcgPSB0aGlzLm1hdGNoKHR0LnN0cmluZyk7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgICAgbm9kZXMucHVzaChcbiAgICAgICAgdGhpcy5wYXJzZUV4cG9ydFNwZWNpZmllcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlzU3RyaW5nLFxuICAgICAgICAgIGlzSW5UeXBlRXhwb3J0LFxuICAgICAgICAgIGlzTWF5YmVUeXBlT25seSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcGFyc2VFeHBvcnRTcGVjaWZpZXIoXG4gICAgbm9kZTogYW55LFxuICAgIGlzU3RyaW5nOiBib29sZWFuLFxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSB1c2VkIGluIFR5cGVTY3JpcHQgcGFyc2VyICovXG4gICAgaXNJblR5cGVFeHBvcnQ6IGJvb2xlYW4sXG4gICAgaXNNYXliZVR5cGVPbmx5OiBib29sZWFuLFxuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICk6IE4uRXhwb3J0U3BlY2lmaWVyIHtcbiAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKHR0Ll9hcykpIHtcbiAgICAgIG5vZGUuZXhwb3J0ZWQgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIG5vZGUuZXhwb3J0ZWQgPSBjbG9uZVN0cmluZ0xpdGVyYWwobm9kZS5sb2NhbCk7XG4gICAgfSBlbHNlIGlmICghbm9kZS5leHBvcnRlZCkge1xuICAgICAgbm9kZS5leHBvcnRlZCA9IGNsb25lSWRlbnRpZmllcihub2RlLmxvY2FsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZTxOLkV4cG9ydFNwZWNpZmllcj4obm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIik7XG4gIH1cblxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jcHJvZC1Nb2R1bGVFeHBvcnROYW1lXG4gIHBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpOiBOLlN0cmluZ0xpdGVyYWwgfCBOLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0cmluZykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VTdHJpbmdMaXRlcmFsKHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgY29uc3Qgc3Vycm9nYXRlID0gcmVzdWx0LnZhbHVlLm1hdGNoKGxvbmVTdXJyb2dhdGUpO1xuICAgICAgaWYgKHN1cnJvZ2F0ZSkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVFeHBvcnROYW1lSGFzTG9uZVN1cnJvZ2F0ZSwge1xuICAgICAgICAgIGF0OiByZXN1bHQsXG4gICAgICAgICAgc3Vycm9nYXRlQ2hhckNvZGU6IHN1cnJvZ2F0ZVswXS5jaGFyQ29kZUF0KDApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcbiAgfVxuXG4gIGlzSlNPTk1vZHVsZUltcG9ydChcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5JbXBvcnREZWNsYXJhdGlvblxuICAgID4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChub2RlLmFzc2VydGlvbnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vZGUuYXNzZXJ0aW9ucy5zb21lKCh7IGtleSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlLnZhbHVlID09PSBcImpzb25cIiAmJlxuICAgICAgICAgIChrZXkudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICAgID8ga2V5Lm5hbWUgPT09IFwidHlwZVwiXG4gICAgICAgICAgICA6IGtleS52YWx1ZSA9PT0gXCJ0eXBlXCIpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hlY2tJbXBvcnRSZWZsZWN0aW9uKG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPikge1xuICAgIGlmIChub2RlLm1vZHVsZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlLnNwZWNpZmllcnMubGVuZ3RoICE9PSAxIHx8XG4gICAgICAgIG5vZGUuc3BlY2lmaWVyc1swXS50eXBlICE9PSBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIlxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLkltcG9ydFJlZmxlY3Rpb25Ob3RCaW5kaW5nLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXNzZXJ0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRSZWZsZWN0aW9uSGFzQXNzZXJ0aW9uLCB7XG4gICAgICAgICAgYXQ6IG5vZGUuc3BlY2lmaWVyc1swXS5sb2Muc3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrSlNPTk1vZHVsZUltcG9ydChcbiAgICBub2RlOiBVbmRvbmU8XG4gICAgICBOLkV4cG9ydEFsbERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHwgTi5JbXBvcnREZWNsYXJhdGlvblxuICAgID4sXG4gICkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IG5vZGUudHlwZSBtdXN0IGJlIHVuZGVmaW5lZCBiZWNhdXNlIHRoZXkgYXJlIHVuZG9uZVxuICAgIGlmICh0aGlzLmlzSlNPTk1vZHVsZUltcG9ydChub2RlKSAmJiBub2RlLnR5cGUgIT09IFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzcGVjaWZpZXJzIG1heSBub3QgaW5kZXggbm9kZVxuICAgICAgY29uc3QgeyBzcGVjaWZpZXJzIH0gPSBub2RlO1xuICAgICAgaWYgKHNwZWNpZmllcnMgIT0gbnVsbCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlZmluZSBzcGVjaWZpZXIgdHlwZXNcbiAgICAgICAgY29uc3Qgbm9uRGVmYXVsdE5hbWVkU3BlY2lmaWVyID0gc3BlY2lmaWVycy5maW5kKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgbGV0IGltcG9ydGVkO1xuICAgICAgICAgIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gXCJFeHBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgaW1wb3J0ZWQgPSBzcGVjaWZpZXIubG9jYWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgaW1wb3J0ZWQgPSBzcGVjaWZpZXIuaW1wb3J0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbXBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0ZWQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgPyBpbXBvcnRlZC5uYW1lICE9PSBcImRlZmF1bHRcIlxuICAgICAgICAgICAgICA6IGltcG9ydGVkLnZhbHVlICE9PSBcImRlZmF1bHRcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9uRGVmYXVsdE5hbWVkU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRKU09OQmluZGluZ05vdERlZmF1bHQsIHtcbiAgICAgICAgICAgIGF0OiBub25EZWZhdWx0TmFtZWRTcGVjaWZpZXIubG9jLnN0YXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNQb3RlbnRpYWxJbXBvcnRQaGFzZShpc0V4cG9ydDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNFeHBvcnQgJiYgdGhpcy5pc0NvbnRleHR1YWwodHQuX21vZHVsZSk7XG4gIH1cblxuICBhcHBseUltcG9ydFBoYXNlKFxuICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgICBpc0V4cG9ydDogYm9vbGVhbixcbiAgICBwaGFzZTogc3RyaW5nIHwgbnVsbCxcbiAgICBsb2M/OiBQb3NpdGlvbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGlzRXhwb3J0KSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LklTX1BVQkxJU0gpIHtcbiAgICAgICAgaWYgKHBoYXNlID09PSBcIm1vZHVsZVwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJBc3NlcnRpb24gZmFpbHVyZTogZXhwb3J0IGRlY2xhcmF0aW9ucyBkbyBub3Qgc3VwcG9ydCB0aGUgJ21vZHVsZScgcGhhc2UuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGhhc2UgPT09IFwibW9kdWxlXCIpIHtcbiAgICAgIHRoaXMuZXhwZWN0UGx1Z2luKFwiaW1wb3J0UmVmbGVjdGlvblwiLCBsb2MpO1xuICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikubW9kdWxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0UmVmbGVjdGlvblwiKSkge1xuICAgICAgKG5vZGUgYXMgTi5JbXBvcnREZWNsYXJhdGlvbikubW9kdWxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUGFyc2UgYG1vZHVsZWAgaW4gYGltcG9ydCBtb2R1bGUgeCBmcm8gXCJ4XCJgLCBkaXNhbWJpZ3VhdGluZ1xuICAgKiBgaW1wb3J0IG1vZHVsZSBmcm9tIFwieFwiYCBhbmQgYGltcG9ydCBtb2R1bGUgZnJvbSBmcm9tIFwieFwiYC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtaWdodCByZXR1cm4gYW4gaWRlbnRpZmllciByZXByZXNlbnRpbmcgdGhlIGBtb2R1bGVgXG4gICAqIGlmIGl0IGVhdHMgYG1vZHVsZWAgYW5kIHRoZW4gZGlzY292ZXJzIHRoYXQgaXQgd2FzIHRoZSBkZWZhdWx0IGltcG9ydFxuICAgKiBiaW5kaW5nIGFuZCBub3QgdGhlIGltcG9ydCByZWZsZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBwYXJzZSBgaW1wb3J0IHR5cGVgIGFuZCBgaW1wb3J0IHR5cGVvZmBcbiAgICogaW4gdGhlIFRTIGFuZCBGbG93IHBsdWdpbnMuXG4gICAqXG4gICAqIE5vdGU6IHRoZSBwcm9wb3NhbCBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSBgc291cmNlYCBpbnN0ZWFkIG9mIGBtb2R1bGVgLFxuICAgKiBidXQgaXQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldC5cbiAgICovXG4gIHBhcnNlTWF5YmVJbXBvcnRQaGFzZShcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbiB8IE4uVHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbj4sXG4gICAgaXNFeHBvcnQ6IGJvb2xlYW4sXG4gICk6IE4uSWRlbnRpZmllciB8IG51bGwge1xuICAgIGlmICghdGhpcy5pc1BvdGVudGlhbEltcG9ydFBoYXNlKGlzRXhwb3J0KSkge1xuICAgICAgdGhpcy5hcHBseUltcG9ydFBoYXNlKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgaXNFeHBvcnQsXG4gICAgICAgIG51bGwsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGhhc2VJZGVudGlmaWVyID0gdGhpcy5wYXJzZUlkZW50aWZpZXIodHJ1ZSk7XG5cbiAgICBjb25zdCB7IHR5cGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgaXNJbXBvcnRQaGFzZSA9IHRva2VuSXNLZXl3b3JkT3JJZGVudGlmaWVyKHR5cGUpXG4gICAgICA/IC8vIE9LOiBpbXBvcnQgPHBoYXNlPiB4IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IGZyb20gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSAnZm9vJztcbiAgICAgICAgLy8gV2l0aCB0aGUgbW9kdWxlIGRlY2xhcmF0aW9ucyBwcm9wb3NhbHMsIHdlIHdpbGwgbmVlZCBmdXJ0aGVyIGRpc2FtYmlndWF0aW9uXG4gICAgICAgIC8vIGZvciBgaW1wb3J0IG1vZHVsZSBmcm9tIGZyb207YC5cbiAgICAgICAgdHlwZSAhPT0gdHQuX2Zyb20gfHwgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubG93ZXJjYXNlRlxuICAgICAgOiAvLyBPSzogaW1wb3J0IDxwaGFzZT4geyB4IH0gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4geCBmcm9tIFwiZm9vXCI7XG4gICAgICAgIC8vIE9LOiBpbXBvcnQgPHBoYXNlPiAqIGFzIFQgZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBOTzogaW1wb3J0IDxwaGFzZT4gZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4gXCJmb29cIjtcbiAgICAgICAgLy8gVGhlIGxhc3Qgb25lIGlzIGludmFsaWQsIHdlIHdpbGwgY29udGludWUgcGFyc2luZyBhbmQgdGhyb3dcbiAgICAgICAgLy8gYW4gZXJyb3IgbGF0ZXJcbiAgICAgICAgdHlwZSAhPT0gdHQuY29tbWE7XG5cbiAgICBpZiAoaXNJbXBvcnRQaGFzZSkge1xuICAgICAgdGhpcy5yZXNldFByZXZpb3VzSWRlbnRpZmllckxlYWRpbmdDb21tZW50cyhwaGFzZUlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5hcHBseUltcG9ydFBoYXNlKFxuICAgICAgICBub2RlIGFzIFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPixcbiAgICAgICAgaXNFeHBvcnQsXG4gICAgICAgIHBoYXNlSWRlbnRpZmllci5uYW1lLFxuICAgICAgICBwaGFzZUlkZW50aWZpZXIubG9jLnN0YXJ0LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5SW1wb3J0UGhhc2UoXG4gICAgICAgIG5vZGUgYXMgVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgICAgICBpc0V4cG9ydCxcbiAgICAgICAgbnVsbCxcbiAgICAgICk7XG4gICAgICAvLyBgPHBoYXNlPmAgaXMgYSBkZWZhdWx0IGJpbmRpbmcsIHJldHVybiBpdCB0byB0aGUgbWFpbiBpbXBvcnQgZGVjbGFyYXRpb24gcGFyc2VyXG4gICAgICByZXR1cm4gcGhhc2VJZGVudGlmaWVyO1xuICAgIH1cbiAgfVxuXG4gIGlzUHJlY2VkaW5nSWRJbXBvcnRQaGFzZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiB0b2tlbklzSWRlbnRpZmllcih0eXBlKVxuICAgICAgPyAvLyBPSzogaW1wb3J0IDxwaGFzZT4geCBmcm9tIFwiZm9vXCI7XG4gICAgICAgIC8vIE9LOiBpbXBvcnQgPHBoYXNlPiBmcm9tIGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gJ2Zvbyc7XG4gICAgICAgIC8vIFdpdGggdGhlIG1vZHVsZSBkZWNsYXJhdGlvbnMgcHJvcG9zYWxzLCB3ZSB3aWxsIG5lZWQgZnVydGhlciBkaXNhbWJpZ3VhdGlvblxuICAgICAgICAvLyBmb3IgYGltcG9ydCBtb2R1bGUgZnJvbSBmcm9tO2AuXG4gICAgICAgIHR5cGUgIT09IHR0Ll9mcm9tIHx8IHRoaXMubG9va2FoZWFkQ2hhckNvZGUoKSA9PT0gY2hhckNvZGVzLmxvd2VyY2FzZUZcbiAgICAgIDogLy8gT0s6IGltcG9ydCA8cGhhc2U+IHsgeCB9IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IHggZnJvbSBcImZvb1wiO1xuICAgICAgICAvLyBPSzogaW1wb3J0IDxwaGFzZT4gKiBhcyBUIGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gTk86IGltcG9ydCA8cGhhc2U+IGZyb20gXCJmb29cIjtcbiAgICAgICAgLy8gT0s6IGltcG9ydCA8cGhhc2U+IFwiZm9vXCI7XG4gICAgICAgIC8vIFRoZSBsYXN0IG9uZSBpcyBpbnZhbGlkLCB3ZSB3aWxsIGNvbnRpbnVlIHBhcnNpbmcgYW5kIHRocm93XG4gICAgICAgIC8vIGFuIGVycm9yIGxhdGVyXG4gICAgICAgIHR5cGUgIT09IHR0LmNvbW1hO1xuICB9XG5cbiAgLy8gUGFyc2VzIGltcG9ydCBkZWNsYXJhdGlvbi5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3Byb2QtSW1wb3J0RGVjbGFyYXRpb25cblxuICBwYXJzZUltcG9ydCh0aGlzOiBQYXJzZXIsIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik6IE4uQW55SW1wb3J0IHtcbiAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAvLyBpbXBvcnQgJy4uLidcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSW1wb3J0U291cmNlQW5kQXR0cmlidXRlcyhub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUltcG9ydFNwZWNpZmllcnNBbmRBZnRlcihcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLnBhcnNlTWF5YmVJbXBvcnRQaGFzZShub2RlLCAvKiBpc0V4cG9ydCAqLyBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlSW1wb3J0U3BlY2lmaWVyc0FuZEFmdGVyKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgKTogTi5BbnlJbXBvcnQge1xuICAgIG5vZGUuc3BlY2lmaWVycyA9IFtdO1xuXG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIGRlZmF1bHQgaW1wb3J0IGxpa2VcbiAgICAvLyBpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IHRoaXMubWF5YmVQYXJzZURlZmF1bHRJbXBvcnRTcGVjaWZpZXIoXG4gICAgICBub2RlLFxuICAgICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcixcbiAgICApO1xuICAgIC8qIHdlIGFyZSBjaGVja2luZyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgaW1wb3J0LCB0aGVuIGl0IGlzIG9idmlvdXMgdGhhdCB3ZSBuZWVkIG5hbWVkIGltcG9ydHNcbiAgICAgKiBpbXBvcnQgeyBnZXQgfSBmcm9tIFwiYXhpb3NcIjtcbiAgICAgKiBidXQgaWYgd2UgZG8gaGF2ZSBhIGRlZmF1bHQgaW1wb3J0XG4gICAgICogd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGEgY29tbWEgYWZ0ZXIgdGhhdCBhbmRcbiAgICAgKiB0aGF0IGlzIHdoZXJlIHRoaXMgYHx8IHRoaXMuZWF0YCBjb25kaXRpb24gY29tZXMgaW50byBwbGF5XG4gICAgICovXG4gICAgY29uc3QgcGFyc2VOZXh0ID0gIWhhc0RlZmF1bHQgfHwgdGhpcy5lYXQodHQuY29tbWEpO1xuICAgIC8vIGlmIHdlIGRvIGhhdmUgdG8gcGFyc2UgdGhlIG5leHQgc2V0IG9mIHNwZWNpZmllcnMsIHdlIGZpcnN0IGNoZWNrIGZvciBzdGFyIGltcG9ydHNcbiAgICAvLyBpbXBvcnQgUmVhY3QsICogZnJvbSBcInJlYWN0XCI7XG4gICAgY29uc3QgaGFzU3RhciA9IHBhcnNlTmV4dCAmJiB0aGlzLm1heWJlUGFyc2VTdGFySW1wb3J0U3BlY2lmaWVyKG5vZGUpO1xuICAgIC8vIG5vdyB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBuZXh0IGltcG9ydHNcbiAgICAvLyBidXQgb25seSBpZiB0aGV5IGFyZSBub3QgaW1wb3J0aW5nICogKGV2ZXJ5dGhpbmcpXG4gICAgaWYgKHBhcnNlTmV4dCAmJiAhaGFzU3RhcikgdGhpcy5wYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlKTtcbiAgICB0aGlzLmV4cGVjdENvbnRleHR1YWwodHQuX2Zyb20pO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VJbXBvcnRTb3VyY2VBbmRBdHRyaWJ1dGVzKG5vZGUpO1xuICB9XG5cbiAgcGFyc2VJbXBvcnRTb3VyY2VBbmRBdHRyaWJ1dGVzKFxuICAgIHRoaXM6IFBhcnNlcixcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICk6IE4uQW55SW1wb3J0IHtcbiAgICBub2RlLnNwZWNpZmllcnMgPz89IFtdO1xuICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUltcG9ydFNvdXJjZSgpO1xuICAgIHRoaXMubWF5YmVQYXJzZUltcG9ydEF0dHJpYnV0ZXMobm9kZSk7XG4gICAgdGhpcy5jaGVja0ltcG9ydFJlZmxlY3Rpb24obm9kZSk7XG4gICAgdGhpcy5jaGVja0pTT05Nb2R1bGVJbXBvcnQobm9kZSk7XG5cbiAgICB0aGlzLnNlbWljb2xvbigpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJbXBvcnREZWNsYXJhdGlvblwiKTtcbiAgfVxuXG4gIHBhcnNlSW1wb3J0U291cmNlKHRoaXM6IFBhcnNlcik6IE4uU3RyaW5nTGl0ZXJhbCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoKHR0LnN0cmluZykpIHRoaXMudW5leHBlY3RlZCgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlRXhwckF0b20oKSBhcyBOLlN0cmluZ0xpdGVyYWw7XG4gIH1cblxuICBwYXJzZUltcG9ydFNwZWNpZmllckxvY2FsPFxuICAgIFQgZXh0ZW5kc1xuICAgICAgfCBOLkltcG9ydFNwZWNpZmllclxuICAgICAgfCBOLkltcG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gID4oXG4gICAgbm9kZTogVW5kb25lPE4uSW1wb3J0RGVjbGFyYXRpb24+LFxuICAgIHNwZWNpZmllcjogVW5kb25lPFQ+LFxuICAgIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICApOiB2b2lkIHtcbiAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIG5vZGUuc3BlY2lmaWVycy5wdXNoKHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKHNwZWNpZmllciwgdHlwZSkpO1xuICB9XG5cbiAgZmluaXNoSW1wb3J0U3BlY2lmaWVyPFxuICAgIFQgZXh0ZW5kc1xuICAgICAgfCBOLkltcG9ydFNwZWNpZmllclxuICAgICAgfCBOLkltcG9ydERlZmF1bHRTcGVjaWZpZXJcbiAgICAgIHwgTi5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIsXG4gID4oc3BlY2lmaWVyOiBVbmRvbmU8VD4sIHR5cGU6IFRbXCJ0eXBlXCJdLCBiaW5kaW5nVHlwZSA9IEJJTkRfTEVYSUNBTCkge1xuICAgIHRoaXMuY2hlY2tMVmFsKHNwZWNpZmllci5sb2NhbCwge1xuICAgICAgaW46IHsgdHlwZSB9LFxuICAgICAgYmluZGluZzogYmluZGluZ1R5cGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShzcGVjaWZpZXIsIHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHBhcnNlIGFzc2VydCBlbnRyaWVzXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbXBvcnQtYXR0cmlidXRlcy8jcHJvZC1XaXRoRW50cmllcyBXaXRoRW50cmllc31cbiAgICovXG4gIHBhcnNlSW1wb3J0QXR0cmlidXRlcygpOiBOLkltcG9ydEF0dHJpYnV0ZVtdIHtcbiAgICB0aGlzLmV4cGVjdCh0dC5icmFjZUwpO1xuXG4gICAgY29uc3QgYXR0cnMgPSBbXTtcbiAgICBjb25zdCBhdHRyTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5icmFjZVIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGFydE5vZGU8Ti5JbXBvcnRBdHRyaWJ1dGU+KCk7XG5cbiAgICAgIC8vIHBhcnNlIEFzc2VydGlvbktleSA6IElkZW50aWZpZXJOYW1lLCBTdHJpbmdMaXRlcmFsXG4gICAgICBjb25zdCBrZXlOYW1lID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgYW4gYXR0cmlidXRlXG4gICAgICAvLyBpZiBhIGR1cGxpY2F0ZSBlbnRyeSBpcyBmb3VuZCwgdGhyb3cgYW4gZXJyb3JcbiAgICAgIC8vIGZvciBub3cgdGhpcyBsb2dpYyB3aWxsIGNvbWUgaW50byBwbGF5IG9ubHkgd2hlbiBzb21lb25lIGRlY2xhcmVzIGB0eXBlYCB0d2ljZVxuICAgICAgaWYgKGF0dHJOYW1lcy5oYXMoa2V5TmFtZSkpIHtcbiAgICAgICAgdGhpcy5yYWlzZShFcnJvcnMuTW9kdWxlQXR0cmlidXRlc1dpdGhEdXBsaWNhdGVLZXlzLCB7XG4gICAgICAgICAgYXQ6IHRoaXMuc3RhdGUuc3RhcnRMb2MsXG4gICAgICAgICAga2V5OiBrZXlOYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGF0dHJOYW1lcy5hZGQoa2V5TmFtZSk7XG4gICAgICBpZiAodGhpcy5tYXRjaCh0dC5zdHJpbmcpKSB7XG4gICAgICAgIG5vZGUua2V5ID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoa2V5TmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmtleSA9IHRoaXMucGFyc2VJZGVudGlmaWVyKHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5leHBlY3QodHQuY29sb24pO1xuXG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVBdHRyaWJ1dGVJbnZhbGlkVmFsdWUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEF0dHJpYnV0ZVwiKSk7XG4gICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcblxuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlUik7XG5cbiAgICByZXR1cm4gYXR0cnM7XG4gIH1cblxuICAvKipcbiAgICogcGFyc2UgbW9kdWxlIGF0dHJpYnV0ZXNcbiAgICogQGRlcHJlY2F0ZWQgSXQgd2lsbCBiZSByZW1vdmVkIGluIEJhYmVsIDhcbiAgICovXG4gIHBhcnNlTW9kdWxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyczogTi5JbXBvcnRBdHRyaWJ1dGVbXSA9IFtdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgU2V0KCk7XG4gICAgZG8ge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0QXR0cmlidXRlPigpO1xuICAgICAgbm9kZS5rZXkgPSB0aGlzLnBhcnNlSWRlbnRpZmllcih0cnVlKTtcblxuICAgICAgaWYgKG5vZGUua2V5Lm5hbWUgIT09IFwidHlwZVwiKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1vZHVsZUF0dHJpYnV0ZURpZmZlcmVudEZyb21UeXBlLCB7XG4gICAgICAgICAgYXQ6IG5vZGUua2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzKG5vZGUua2V5Lm5hbWUpKSB7XG4gICAgICAgIHRoaXMucmFpc2UoRXJyb3JzLk1vZHVsZUF0dHJpYnV0ZXNXaXRoRHVwbGljYXRlS2V5cywge1xuICAgICAgICAgIGF0OiBub2RlLmtleSxcbiAgICAgICAgICBrZXk6IG5vZGUua2V5Lm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcy5hZGQobm9kZS5rZXkubmFtZSk7XG4gICAgICB0aGlzLmV4cGVjdCh0dC5jb2xvbik7XG4gICAgICBpZiAoIXRoaXMubWF0Y2godHQuc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5Nb2R1bGVBdHRyaWJ1dGVJbnZhbGlkVmFsdWUsIHtcbiAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBub2RlLnZhbHVlID0gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwodGhpcy5zdGF0ZS52YWx1ZSk7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkltcG9ydEF0dHJpYnV0ZVwiKSk7XG4gICAgfSB3aGlsZSAodGhpcy5lYXQodHQuY29tbWEpKTtcblxuICAgIHJldHVybiBhdHRycztcbiAgfVxuXG4gIG1heWJlUGFyc2VJbXBvcnRBdHRyaWJ1dGVzKFxuICAgIG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uIHwgTi5FeHBvcnROYW1lZERlY2xhcmF0aW9uPixcbiAgKSB7XG4gICAgbGV0IGF0dHJpYnV0ZXM6IE4uSW1wb3J0QXR0cmlidXRlW107XG4gICAgbGV0IHVzZVdpdGggPSBmYWxzZTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pbXBvcnQtYXR0cmlidXRlcy8jcHJvZC1XaXRoQ2xhdXNlXG4gICAgaWYgKHRoaXMubWF0Y2godHQuX3dpdGgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkgJiZcbiAgICAgICAgdGhpcy5sb29rYWhlYWRDaGFyQ29kZSgpID09PSBjaGFyQ29kZXMubGVmdFBhcmVudGhlc2lzXG4gICAgICApIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIHBhcnNlZCBhcyBhIHdpdGggc3RhdGVtZW50LCBhbmQgd2Ugd2lsbCB0aHJvdyBhXG4gICAgICAgIC8vIGJldHRlciBlcnJvciBhYm91dCBpdCBub3QgYmVpbmcgc3VwcG9ydGVkIGluIHN0cmljdCBtb2RlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYHdpdGhgXG5cbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORykge1xuICAgICAgICBpZiAodGhpcy5oYXNQbHVnaW4oXCJtb2R1bGVBdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VNb2R1bGVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5leHBlY3RJbXBvcnRBdHRyaWJ1dGVzUGx1Z2luKCk7XG4gICAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VJbXBvcnRBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW1wb3J0QXR0cmlidXRlc1BsdWdpbigpO1xuICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZUltcG9ydEF0dHJpYnV0ZXMoKTtcbiAgICAgIH1cbiAgICAgIHVzZVdpdGggPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRleHR1YWwodHQuX2Fzc2VydCkgJiYgIXRoaXMuaGFzUHJlY2VkaW5nTGluZUJyZWFrKCkpIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0UGx1Z2luT3B0aW9uKFwiaW1wb3J0QXR0cmlidXRlc1wiLCBcImRlcHJlY2F0ZWRBc3NlcnRTeW50YXhcIikgIT09XG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRBdHRyaWJ1dGVzVXNlQXNzZXJ0LCB7XG4gICAgICAgICAgICBhdDogdGhpcy5zdGF0ZS5zdGFydExvYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEV4dHJhKG5vZGUsIFwiZGVwcmVjYXRlZEFzc2VydFN5bnRheFwiLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwZWN0T25lUGx1Z2luKFtcImltcG9ydEF0dHJpYnV0ZXNcIiwgXCJpbXBvcnRBc3NlcnRpb25zXCJdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV4dCgpOyAvLyBlYXQgYGFzc2VydGBcbiAgICAgIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSW1wb3J0QXR0cmlidXRlcygpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmhhc1BsdWdpbihcImltcG9ydEF0dHJpYnV0ZXNcIikgfHxcbiAgICAgIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKVxuICAgICkge1xuICAgICAgYXR0cmlidXRlcyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcpIHtcbiAgICAgIGlmICh0aGlzLmhhc1BsdWdpbihcIm1vZHVsZUF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IFtdO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9IGVsc2UgcmV0dXJuO1xuXG4gICAgaWYgKCF1c2VXaXRoICYmIHRoaXMuaGFzUGx1Z2luKFwiaW1wb3J0QXNzZXJ0aW9uc1wiKSkge1xuICAgICAgbm9kZS5hc3NlcnRpb25zID0gYXR0cmlidXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICB9XG4gIH1cblxuICBtYXliZVBhcnNlRGVmYXVsdEltcG9ydFNwZWNpZmllcihcbiAgICBub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4sXG4gICAgbWF5YmVEZWZhdWx0SWRlbnRpZmllcjogTi5JZGVudGlmaWVyIHwgbnVsbCxcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gaW1wb3J0IGRlZmF1bHRPYmosIHsgeCwgeSBhcyB6IH0gZnJvbSAnLi4uJ1xuICAgIGlmIChtYXliZURlZmF1bHRJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSB0aGlzLnN0YXJ0Tm9kZUF0Tm9kZTxOLkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KFxuICAgICAgICBtYXliZURlZmF1bHRJZGVudGlmaWVyLFxuICAgICAgKTtcbiAgICAgIHNwZWNpZmllci5sb2NhbCA9IG1heWJlRGVmYXVsdElkZW50aWZpZXI7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaChcbiAgICAgICAgdGhpcy5maW5pc2hJbXBvcnRTcGVjaWZpZXIoc3BlY2lmaWVyLCBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIiksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIFdlIGFsbG93IGtleXdvcmRzLCBhbmQgcGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbCB3aWxsIHJlcG9ydCBhIHJlY292ZXJhYmxlIGVycm9yXG4gICAgICB0b2tlbklzS2V5d29yZE9ySWRlbnRpZmllcih0aGlzLnN0YXRlLnR5cGUpXG4gICAgKSB7XG4gICAgICB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyTG9jYWwoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0RGVmYXVsdFNwZWNpZmllcj4oKSxcbiAgICAgICAgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG1heWJlUGFyc2VTdGFySW1wb3J0U3BlY2lmaWVyKG5vZGU6IFVuZG9uZTxOLkltcG9ydERlY2xhcmF0aW9uPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hdGNoKHR0LnN0YXIpKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSB0aGlzLnN0YXJ0Tm9kZTxOLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcj4oKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKHR0Ll9hcyk7XG5cbiAgICAgIHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXJMb2NhbChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgICBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwYXJzZU5hbWVkSW1wb3J0U3BlY2lmaWVycyhub2RlOiBVbmRvbmU8Ti5JbXBvcnREZWNsYXJhdGlvbj4pIHtcbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhwZWN0KHR0LmJyYWNlTCk7XG4gICAgd2hpbGUgKCF0aGlzLmVhdCh0dC5icmFjZVIpKSB7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERldGVjdCBhbiBhdHRlbXB0IHRvIGRlZXAgZGVzdHJ1Y3R1cmVcbiAgICAgICAgaWYgKHRoaXMuZWF0KHR0LmNvbG9uKSkge1xuICAgICAgICAgIHRocm93IHRoaXMucmFpc2UoRXJyb3JzLkRlc3RydWN0dXJlTmFtZWRJbXBvcnQsIHtcbiAgICAgICAgICAgIGF0OiB0aGlzLnN0YXRlLnN0YXJ0TG9jLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3QodHQuY29tbWEpO1xuICAgICAgICBpZiAodGhpcy5lYXQodHQuYnJhY2VSKSkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IHRoaXMuc3RhcnROb2RlPE4uSW1wb3J0U3BlY2lmaWVyPigpO1xuICAgICAgY29uc3QgaW1wb3J0ZWRJc1N0cmluZyA9IHRoaXMubWF0Y2godHQuc3RyaW5nKTtcbiAgICAgIGNvbnN0IGlzTWF5YmVUeXBlT25seSA9IHRoaXMuaXNDb250ZXh0dWFsKHR0Ll90eXBlKTtcbiAgICAgIHNwZWNpZmllci5pbXBvcnRlZCA9IHRoaXMucGFyc2VNb2R1bGVFeHBvcnROYW1lKCk7XG4gICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXIgPSB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydGVkSXNTdHJpbmcsXG4gICAgICAgIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIgfHwgbm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVvZlwiLFxuICAgICAgICBpc01heWJlVHlwZU9ubHksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgICBub2RlLnNwZWNpZmllcnMucHVzaChpbXBvcnRTcGVjaWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNwcm9kLUltcG9ydFNwZWNpZmllclxuICBwYXJzZUltcG9ydFNwZWNpZmllcihcbiAgICBzcGVjaWZpZXI6IFVuZG9uZTxOLkltcG9ydFNwZWNpZmllcj4sXG4gICAgaW1wb3J0ZWRJc1N0cmluZzogYm9vbGVhbixcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gdXNlZCBpbiBUeXBlU2NyaXB0IGFuZCBGbG93IHBhcnNlciAqL1xuICAgIGlzSW5UeXBlT25seUltcG9ydDogYm9vbGVhbixcbiAgICBpc01heWJlVHlwZU9ubHk6IGJvb2xlYW4sXG4gICAgYmluZGluZ1R5cGU6IEJpbmRpbmdUeXBlcyB8IHVuZGVmaW5lZCxcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICApOiBOLkltcG9ydFNwZWNpZmllciB7XG4gICAgaWYgKHRoaXMuZWF0Q29udGV4dHVhbCh0dC5fYXMpKSB7XG4gICAgICBzcGVjaWZpZXIubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGltcG9ydGVkIH0gPSBzcGVjaWZpZXI7XG4gICAgICBpZiAoaW1wb3J0ZWRJc1N0cmluZykge1xuICAgICAgICB0aHJvdyB0aGlzLnJhaXNlKEVycm9ycy5JbXBvcnRCaW5kaW5nSXNTdHJpbmcsIHtcbiAgICAgICAgICBhdDogc3BlY2lmaWVyLFxuICAgICAgICAgIGltcG9ydE5hbWU6IChpbXBvcnRlZCBhcyBOLlN0cmluZ0xpdGVyYWwpLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tSZXNlcnZlZFdvcmQoXG4gICAgICAgIChpbXBvcnRlZCBhcyBOLklkZW50aWZpZXIpLm5hbWUsXG4gICAgICAgIHNwZWNpZmllci5sb2Muc3RhcnQsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgICAgaWYgKCFzcGVjaWZpZXIubG9jYWwpIHtcbiAgICAgICAgc3BlY2lmaWVyLmxvY2FsID0gY2xvbmVJZGVudGlmaWVyKGltcG9ydGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoSW1wb3J0U3BlY2lmaWVyKFxuICAgICAgc3BlY2lmaWVyLFxuICAgICAgXCJJbXBvcnRTcGVjaWZpZXJcIixcbiAgICAgIGJpbmRpbmdUeXBlLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHVzZWQgaW4gZmxvdyBhbmQgdHlwZXNjcmlwdCBwbHVnaW5cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJhbWV0ZXIgaXMgYSB0aGlzIHBhcmFtXG4gIGlzVGhpc1BhcmFtKFxuICAgIHBhcmFtOiBOLlBhdHRlcm4gfCBOLklkZW50aWZpZXIgfCBOLlRTUGFyYW1ldGVyUHJvcGVydHksXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwYXJhbS5uYW1lID09PSBcInRoaXNcIjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIE4gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkxpc3QgfSBmcm9tIFwiLi4vcGx1Z2luLXV0aWxzXCI7XG5pbXBvcnQgeyBnZXRPcHRpb25zIH0gZnJvbSBcIi4uL29wdGlvbnNcIjtcbmltcG9ydCBTdGF0ZW1lbnRQYXJzZXIgZnJvbSBcIi4vc3RhdGVtZW50XCI7XG5pbXBvcnQgU2NvcGVIYW5kbGVyIGZyb20gXCIuLi91dGlsL3Njb3BlXCI7XG5cbmV4cG9ydCB0eXBlIFBsdWdpbnNNYXAgPSBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIFt4OiBzdHJpbmddOiBhbnk7XG4gIH1cbj47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNlciBleHRlbmRzIFN0YXRlbWVudFBhcnNlciB7XG4gIC8vIEZvcndhcmQtZGVjbGFyYXRpb24gc28gdHlwZXNjcmlwdCBwbHVnaW4gY2FuIG92ZXJyaWRlIGpzeCBwbHVnaW5cbiAgLy8gdG9kbyhmbG93LT50cykgLSB0aGlzIHByb2JhYmx5IGNhbiBiZSByZW1vdmVkXG4gIC8vIGFic3RyYWN0IGpzeFBhcnNlT3BlbmluZ0VsZW1lbnRBZnRlck5hbWUoXG4gIC8vICAgbm9kZTogTi5KU1hPcGVuaW5nRWxlbWVudCxcbiAgLy8gKTogTi5KU1hPcGVuaW5nRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zIHwgdW5kZWZpbmVkIHwgbnVsbCwgaW5wdXQ6IHN0cmluZykge1xuICAgIG9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHN1cGVyKG9wdGlvbnMsIGlucHV0KTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5pbml0aWFsaXplU2NvcGVzKCk7XG4gICAgdGhpcy5wbHVnaW5zID0gcGx1Z2luc01hcCh0aGlzLm9wdGlvbnMucGx1Z2lucyk7XG4gICAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnMuc291cmNlRmlsZW5hbWU7XG4gIH1cblxuICAvLyBUaGlzIGNhbiBiZSBvdmVyd3JpdHRlbiwgZm9yIGV4YW1wbGUsIGJ5IHRoZSBUeXBlU2NyaXB0IHBsdWdpbi5cbiAgZ2V0U2NvcGVIYW5kbGVyKCk6IHtcbiAgICBuZXcgKC4uLmFyZ3M6IGFueSk6IFNjb3BlSGFuZGxlcjtcbiAgfSB7XG4gICAgcmV0dXJuIFNjb3BlSGFuZGxlcjtcbiAgfVxuXG4gIHBhcnNlKCk6IE4uRmlsZSB7XG4gICAgdGhpcy5lbnRlckluaXRpYWxTY29wZXMoKTtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5zdGFydE5vZGUoKSBhcyBOLkZpbGU7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMuc3RhcnROb2RlKCkgYXMgTi5Qcm9ncmFtO1xuICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgZmlsZS5lcnJvcnMgPSBudWxsO1xuICAgIHRoaXMucGFyc2VUb3BMZXZlbChmaWxlLCBwcm9ncmFtKTtcbiAgICBmaWxlLmVycm9ycyA9IHRoaXMuc3RhdGUuZXJyb3JzO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNNYXAocGx1Z2luczogUGx1Z2luTGlzdCk6IFBsdWdpbnNNYXAge1xuICBjb25zdCBwbHVnaW5NYXA6IFBsdWdpbnNNYXAgPSBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICBjb25zdCBbbmFtZSwgb3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW4gOiBbcGx1Z2luLCB7fV07XG4gICAgaWYgKCFwbHVnaW5NYXAuaGFzKG5hbWUpKSBwbHVnaW5NYXAuc2V0KG5hbWUsIG9wdGlvbnMgfHwge30pO1xuICB9XG4gIHJldHVybiBwbHVnaW5NYXA7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgaGFzUGx1Z2luLFxuICB2YWxpZGF0ZVBsdWdpbnMsXG4gIG1peGluUGx1Z2luTmFtZXMsXG4gIG1peGluUGx1Z2lucyxcbiAgdHlwZSBQbHVnaW5MaXN0LFxufSBmcm9tIFwiLi9wbHVnaW4tdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmlnIGFzIFBhcnNlclBsdWdpbixcbiAgRmxvd1BsdWdpbk9wdGlvbnMsXG4gIFJlY29yZEFuZFR1cGxlUGx1Z2luT3B0aW9ucyxcbiAgUGlwZWxpbmVPcGVyYXRvclBsdWdpbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGluZ3NcIjtcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vcGFyc2VyXCI7XG5cbmltcG9ydCB0eXBlIHsgRXhwb3J0ZWRUb2tlblR5cGUgfSBmcm9tIFwiLi90b2tlbml6ZXIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEV4cG9ydGVkVG9rZW4sXG4gIHR0IGFzIGludGVybmFsVG9rZW5UeXBlcyxcbiAgdHlwZSBJbnRlcm5hbFRva2VuVHlwZXMsXG59IGZyb20gXCIuL3Rva2VuaXplci90eXBlc1wiO1xuaW1wb3J0IFwiLi90b2tlbml6ZXIvY29udGV4dFwiO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24sIEZpbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IE9wdGlvbnMpOiBGaWxlIHtcbiAgaWYgKG9wdGlvbnM/LnNvdXJjZVR5cGUgPT09IFwidW5hbWJpZ3VvdXNcIikge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIG9wdGlvbnMuc291cmNlVHlwZSA9IFwibW9kdWxlXCI7XG4gICAgICBjb25zdCBwYXJzZXIgPSBnZXRQYXJzZXIob3B0aW9ucywgaW5wdXQpO1xuICAgICAgY29uc3QgYXN0ID0gcGFyc2VyLnBhcnNlKCk7XG5cbiAgICAgIGlmIChwYXJzZXIuc2F3VW5hbWJpZ3VvdXNFU00pIHtcbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlci5hbWJpZ3VvdXNTY3JpcHREaWZmZXJlbnRBc3QpIHtcbiAgICAgICAgLy8gVG9wIGxldmVsIGF3YWl0IGludHJvZHVjZXMgY29kZSB3aGljaCBjYW4gYmUgYm90aCBhIHZhbGlkIHNjcmlwdCBhbmRcbiAgICAgICAgLy8gYSB2YWxpZCBtb2R1bGUsIGJ1dCB3aGljaCBwcm9kdWNlcyBkaWZmZXJlbnQgQVNUczpcbiAgICAgICAgLy8gICAgYXdhaXRcbiAgICAgICAgLy8gICAgMFxuICAgICAgICAvLyBjYW4gYmUgcGFyc2VkIGVpdGhlciBhcyBhbiBBd2FpdEV4cHJlc3Npb24sIG9yIGFzIHR3byBFeHByZXNzaW9uU3RhdGVtZW50cy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcHRpb25zLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgICAgIHJldHVybiBnZXRQYXJzZXIob3B0aW9ucywgaW5wdXQpLnBhcnNlKCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYm90aCBhIHZhbGlkIG1vZHVsZSBhbmQgYSB2YWxpZCBzY3JpcHQsIGJ1dFxuICAgICAgICAvLyB3ZSBwYXJzZSBpdCBhcyBhIHNjcmlwdCBieSBkZWZhdWx0XG4gICAgICAgIGFzdC5wcm9ncmFtLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXN0O1xuICAgIH0gY2F0Y2ggKG1vZHVsZUVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zLnNvdXJjZVR5cGUgPSBcInNjcmlwdFwiO1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2VyKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpO1xuICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICB0aHJvdyBtb2R1bGVFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldFBhcnNlcihvcHRpb25zLCBpbnB1dCkucGFyc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBPcHRpb25zKTogRXhwcmVzc2lvbiB7XG4gIGNvbnN0IHBhcnNlciA9IGdldFBhcnNlcihvcHRpb25zLCBpbnB1dCk7XG4gIGlmIChwYXJzZXIub3B0aW9ucy5zdHJpY3RNb2RlKSB7XG4gICAgcGFyc2VyLnN0YXRlLnN0cmljdCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHBhcnNlci5nZXRFeHByZXNzaW9uKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXhwb3J0ZWRUb2tlblR5cGVzKFxuICBpbnRlcm5hbFRva2VuVHlwZXM6IEludGVybmFsVG9rZW5UeXBlcyxcbik6IFJlY29yZDxzdHJpbmcsIEV4cG9ydGVkVG9rZW5UeXBlPiB7XG4gIGNvbnN0IHRva2VuVHlwZXM6IFJlY29yZDxzdHJpbmcsIEV4cG9ydGVkVG9rZW5UeXBlPiA9IHt9O1xuICBmb3IgKGNvbnN0IHR5cGVOYW1lIG9mIE9iamVjdC5rZXlzKFxuICAgIGludGVybmFsVG9rZW5UeXBlcyxcbiAgKSBhcyAoa2V5b2YgSW50ZXJuYWxUb2tlblR5cGVzKVtdKSB7XG4gICAgdG9rZW5UeXBlc1t0eXBlTmFtZV0gPSBnZXRFeHBvcnRlZFRva2VuKGludGVybmFsVG9rZW5UeXBlc1t0eXBlTmFtZV0pO1xuICB9XG4gIHJldHVybiB0b2tlblR5cGVzO1xufVxuXG5leHBvcnQgY29uc3QgdG9rVHlwZXMgPSBnZW5lcmF0ZUV4cG9ydGVkVG9rZW5UeXBlcyhpbnRlcm5hbFRva2VuVHlwZXMpO1xuXG5mdW5jdGlvbiBnZXRQYXJzZXIob3B0aW9uczogT3B0aW9ucyB8IHVuZGVmaW5lZCB8IG51bGwsIGlucHV0OiBzdHJpbmcpOiBQYXJzZXIge1xuICBsZXQgY2xzID0gUGFyc2VyO1xuICBpZiAob3B0aW9ucz8ucGx1Z2lucykge1xuICAgIHZhbGlkYXRlUGx1Z2lucyhvcHRpb25zLnBsdWdpbnMpO1xuICAgIGNscyA9IGdldFBhcnNlckNsYXNzKG9wdGlvbnMucGx1Z2lucyk7XG4gIH1cblxuICByZXR1cm4gbmV3IGNscyhvcHRpb25zLCBpbnB1dCk7XG59XG5cbmNvbnN0IHBhcnNlckNsYXNzQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogeyBuZXcgKC4uLmFyZ3M6IGFueSk6IFBhcnNlciB9IH0gPSB7fTtcblxuLyoqIEdldCBhIFBhcnNlciBjbGFzcyB3aXRoIHBsdWdpbnMgYXBwbGllZC4gKi9cbmZ1bmN0aW9uIGdldFBhcnNlckNsYXNzKHBsdWdpbnNGcm9tT3B0aW9uczogUGx1Z2luTGlzdCk6IHtcbiAgbmV3ICguLi5hcmdzOiBhbnkpOiBQYXJzZXI7XG59IHtcbiAgY29uc3QgcGx1Z2luTGlzdCA9IG1peGluUGx1Z2luTmFtZXMuZmlsdGVyKG5hbWUgPT5cbiAgICBoYXNQbHVnaW4ocGx1Z2luc0Zyb21PcHRpb25zLCBuYW1lKSxcbiAgKTtcblxuICBjb25zdCBrZXkgPSBwbHVnaW5MaXN0LmpvaW4oXCIvXCIpO1xuICBsZXQgY2xzID0gcGFyc2VyQ2xhc3NDYWNoZVtrZXldO1xuICBpZiAoIWNscykge1xuICAgIGNscyA9IFBhcnNlcjtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5MaXN0KSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpXG4gICAgICBjbHMgPSBtaXhpblBsdWdpbnNbcGx1Z2luXShjbHMpO1xuICAgIH1cbiAgICBwYXJzZXJDbGFzc0NhY2hlW2tleV0gPSBjbHM7XG4gIH1cbiAgcmV0dXJuIGNscztcbn1cblxuZXhwb3J0IHR5cGUge1xuICBGbG93UGx1Z2luT3B0aW9ucyxcbiAgUGFyc2VyUGx1Z2luLFxuICBQaXBlbGluZU9wZXJhdG9yUGx1Z2luT3B0aW9ucyxcbiAgUmVjb3JkQW5kVHVwbGVQbHVnaW5PcHRpb25zLFxufTtcbmV4cG9ydCB0eXBlIFBhcnNlck9wdGlvbnMgPSBQYXJ0aWFsPE9wdGlvbnM+O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgYWN0dWFsOiBvYmplY3QsXG4gIGV4cGVjdGVkOiBULFxuKTogYWN0dWFsIGlzIFQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwZWN0ZWQpIGFzIChrZXlvZiBUKVtdO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG1heWJlIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIGtleSBleGlzdHMgZmlyc3RcbiAgICAgIGFjdHVhbFtrZXldICE9PSBleHBlY3RlZFtrZXldXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiY29uc3Qgd2FybmluZ3MgPSBuZXcgU2V0KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlcHJlY2F0aW9uV2FybmluZyhcbiAgb2xkTmFtZTogc3RyaW5nLFxuICBuZXdOYW1lOiBzdHJpbmcsXG4gIHByZWZpeDogc3RyaW5nID0gXCJcIixcbikge1xuICBpZiAod2FybmluZ3MuaGFzKG9sZE5hbWUpKSByZXR1cm47XG4gIHdhcm5pbmdzLmFkZChvbGROYW1lKTtcblxuICBjb25zdCB7IGludGVybmFsLCB0cmFjZSB9ID0gY2FwdHVyZVNob3J0U3RhY2tUcmFjZSgxLCAyKTtcbiAgaWYgKGludGVybmFsKSB7XG4gICAgLy8gSWYgdXNhZ2UgY29tZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlLCB0aGVyZSBpcyBubyBwb2ludCBpbiB3YXJuaW5nIGJlY2F1c2VcbiAgICAvLyAxLiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIHBhY2thZ2Ugd2lsbCBhbHJlYWR5IHVzZSB0aGUgbmV3IEFQSVxuICAgIC8vIDIuIFdoZW4gdGhlIGRlcHJlY2F0aW9uIHdpbGwgYmVjb21lIGFuIGVycm9yIChpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uKSwgdXNlcnNcbiAgICAvLyAgICB3aWxsIGhhdmUgdG8gdXBkYXRlIGV2ZXJ5IHBhY2thZ2UgYW55d2F5LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7cHJlZml4fVxcYCR7b2xkTmFtZX1cXGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGxlYXNlIG1pZ3JhdGUgdG8gXFxgJHtuZXdOYW1lfVxcYFxcbiR7dHJhY2V9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZVNob3J0U3RhY2tUcmFjZShza2lwOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gIGNvbnN0IHsgc3RhY2tUcmFjZUxpbWl0LCBwcmVwYXJlU3RhY2tUcmFjZSB9ID0gRXJyb3I7XG4gIGxldCBzdGFja1RyYWNlOiBOb2RlSlMuQ2FsbFNpdGVbXTtcbiAgLy8gV2UgYWRkIDEgdG8gYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGlzIGZ1bmN0aW9uLlxuICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSAxICsgc2tpcCArIGxlbmd0aDtcbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoZXJyLCBzdGFjaykge1xuICAgIHN0YWNrVHJhY2UgPSBzdGFjaztcbiAgfTtcbiAgbmV3IEVycm9yKCkuc3RhY2s7XG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmVwYXJlU3RhY2tUcmFjZTtcblxuICBpZiAoIXN0YWNrVHJhY2UpIHJldHVybiB7IGludGVybmFsOiBmYWxzZSwgdHJhY2U6IFwiXCIgfTtcblxuICBjb25zdCBzaG9ydFN0YWNrVHJhY2UgPSBzdGFja1RyYWNlLnNsaWNlKDEgKyBza2lwLCAxICsgc2tpcCArIGxlbmd0aCk7XG4gIHJldHVybiB7XG4gICAgaW50ZXJuYWw6IC9bXFxcXC9dQGJhYmVsW1xcXFwvXS8udGVzdChzaG9ydFN0YWNrVHJhY2VbMV0uZ2V0RmlsZU5hbWUoKSksXG4gICAgdHJhY2U6IHNob3J0U3RhY2tUcmFjZS5tYXAoZnJhbWUgPT4gYCAgICBhdCAke2ZyYW1lfWApLmpvaW4oXCJcXG5cIiksXG4gIH07XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xuXG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gXCIuLi8uLi91dGlscy9zaGFsbG93RXF1YWxcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcbmltcG9ydCBkZXByZWNhdGlvbldhcm5pbmcgZnJvbSBcIi4uLy4uL3V0aWxzL2RlcHJlY2F0aW9uV2FybmluZ1wiO1xuXG50eXBlIE9wdHM8T2JqZWN0PiA9IFBhcnRpYWw8e1xuICBbUHJvcCBpbiBrZXlvZiBPYmplY3RdOiBPYmplY3RbUHJvcF0gZXh0ZW5kcyB0Lk5vZGVcbiAgICA/IHQuTm9kZSB8IE9iamVjdFtQcm9wXVxuICAgIDogT2JqZWN0W1Byb3BdIGV4dGVuZHMgdC5Ob2RlW11cbiAgICA/IHQuTm9kZVtdIHwgT2JqZWN0W1Byb3BdXG4gICAgOiBPYmplY3RbUHJvcF07XG59PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycmF5RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXJyYXlFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFzc2lnbm1lbnRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQXNzaWdubWVudEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQmluYXJ5RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJpbmFyeUV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJwcmV0ZXJEaXJlY3RpdmUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW50ZXJwcmV0ZXJEaXJlY3RpdmU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbnRlcnByZXRlckRpcmVjdGl2ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlyZWN0aXZlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRpcmVjdGl2ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRpcmVjdGl2ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGlyZWN0aXZlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RpcmVjdGl2ZUxpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGlyZWN0aXZlTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRpcmVjdGl2ZUxpdGVyYWwge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRpcmVjdGl2ZUxpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmxvY2tTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQmxvY2tTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CbG9ja1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQmxvY2tTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJlYWtTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQnJlYWtTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CcmVha1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQnJlYWtTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2FsbEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DYWxsRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2F0Y2hDbGF1c2UoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2F0Y2hDbGF1c2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DYXRjaENsYXVzZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2F0Y2hDbGF1c2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVlU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNvbnRpbnVlU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ29udGludWVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlYnVnZ2VyU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlYnVnZ2VyU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVidWdnZXJTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlYnVnZ2VyU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RvV2hpbGVTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRG9XaGlsZVN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRvV2hpbGVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRvV2hpbGVTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW1wdHlTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbXB0eVN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW1wdHlTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHByZXNzaW9uU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwcmVzc2lvblN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGaWxlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZpbGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GaWxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGaWxlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZvckluU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZvckluU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRm9ySW5TdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZvckluU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZvclN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Gb3JTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZvclN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvbkRlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GdW5jdGlvbkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvbkV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LklkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JZGVudGlmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0lmU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LklmU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSWZTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIklmU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xhYmVsZWRTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTGFiZWxlZFN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkxhYmVsZWRTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkxhYmVsZWRTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RyaW5nTGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1lcmljTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bWVyaWNMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1lcmljTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdWxsTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bGxMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdWxsTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Cb29sZWFuTGl0ZXJhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHBMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlJlZ0V4cExpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5SZWdFeHBMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJSZWdFeHBMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2ljYWxFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkxvZ2ljYWxFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkxvZ2ljYWxFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01lbWJlckV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1lbWJlckV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1lbWJlckV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV3RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OZXdFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTmV3RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTmV3RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQcm9ncmFtKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByb2dyYW0+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Qcm9ncmFtIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQcm9ncmFtXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0TWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdE1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdE1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0TWV0aG9kXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuT2JqZWN0UHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RFbGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlJlc3RFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUmVzdEVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlJlc3RFbGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JldHVyblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZXR1cm5TdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5SZXR1cm5TdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlJldHVyblN0YXRlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZXF1ZW5jZUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU2VxdWVuY2VFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU2VxdWVuY2VFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTZXF1ZW5jZUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuUGFyZW50aGVzaXplZEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3dpdGNoQ2FzZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Td2l0Y2hDYXNlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3dpdGNoQ2FzZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3dpdGNoQ2FzZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTd2l0Y2hTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3dpdGNoU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3dpdGNoU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTd2l0Y2hTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhpc0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhpc0V4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UaGlzRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGhpc0V4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGhyb3dTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhyb3dTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UaHJvd1N0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGhyb3dTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ5U3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRyeVN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRyeVN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHJ5U3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuYXJ5RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5VbmFyeUV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5VbmFyeUV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlVwZGF0ZUV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5VcGRhdGVFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJVcGRhdGVFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhcmlhYmxlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVmFyaWFibGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFyaWFibGVEZWNsYXJhdG9yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlZhcmlhYmxlRGVjbGFyYXRvcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZhcmlhYmxlRGVjbGFyYXRvciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1doaWxlU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LldoaWxlU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuV2hpbGVTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIldoaWxlU3RhdGVtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1dpdGhTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuV2l0aFN0YXRlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LldpdGhTdGF0ZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIldpdGhTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXNzaWdubWVudFBhdHRlcm4oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQXNzaWdubWVudFBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXNzaWdubWVudFBhdHRlcm5cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycmF5UGF0dGVybj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5UGF0dGVybiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQXJyYXlQYXR0ZXJuXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFycm93RnVuY3Rpb25FeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NsYXNzQm9keShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc0JvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzc0JvZHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkNsYXNzQm9keVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0V4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHBvcnRBbGxEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4cG9ydEFsbERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwb3J0TmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeHBvcnROYW1lZERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0TmFtZWREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnRTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0U3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0U3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnRTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9yT2ZTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRm9yT2ZTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JPZlN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRm9yT2ZTdGF0ZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0RGVmYXVsdFNwZWNpZmllcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1wb3J0U3BlY2lmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkltcG9ydFNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkltcG9ydFNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW1wb3J0U3BlY2lmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01ldGFQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5NZXRhUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5NZXRhUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1ldGFQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc01ldGhvZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc01ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNsYXNzTWV0aG9kIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc01ldGhvZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RQYXR0ZXJuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RQYXR0ZXJuXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NwcmVhZEVsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3ByZWFkRWxlbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlNwcmVhZEVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlNwcmVhZEVsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3VwZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5TdXBlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiU3VwZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBsYXRlRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UZW1wbGF0ZUVsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UZW1wbGF0ZUVsZW1lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRlbXBsYXRlRWxlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wbGF0ZUxpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGVtcGxhdGVMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGVtcGxhdGVMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUZW1wbGF0ZUxpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzWWllbGRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LllpZWxkRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LllpZWxkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiWWllbGRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F3YWl0RXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Bd2FpdEV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bd2FpdEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkF3YWl0RXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW1wb3J0PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW1wb3J0IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50TGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CaWdJbnRMaXRlcmFsPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQmlnSW50TGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQmlnSW50TGl0ZXJhbFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGlvbmFsQ2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT3B0aW9uYWxDYWxsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5DbGFzc1Byb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcml2YXRlUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NQcml2YXRlUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzc1ByaXZhdGVQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcml2YXRlTWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkNsYXNzUHJpdmF0ZU1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkNsYXNzUHJpdmF0ZU1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVOYW1lKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByaXZhdGVOYW1lPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUHJpdmF0ZU5hbWUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlByaXZhdGVOYW1lXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpY0Jsb2NrKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlN0YXRpY0Jsb2NrPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhdGljQmxvY2sge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlN0YXRpY0Jsb2NrXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FueVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFueVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQW55VHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFueVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5VHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQXJyYXlUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkFycmF5VHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkFycmF5VHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc0ltcGxlbWVudHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3NJbXBsZW1lbnRzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ2xhc3NJbXBsZW1lbnRzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJDbGFzc0ltcGxlbWVudHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZUNsYXNzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVDbGFzcz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVDbGFzcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZUNsYXNzXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVGdW5jdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlRnVuY3Rpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVGdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlSW50ZXJmYWNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVJbnRlcmZhY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlSW50ZXJmYWNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlSW50ZXJmYWNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVNb2R1bGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZU1vZHVsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVNb2R1bGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZU1vZHVsZUV4cG9ydHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZU1vZHVsZUV4cG9ydHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZVR5cGVBbGlhcyhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlVHlwZUFsaWFzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjbGFyZVR5cGVBbGlhcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZVR5cGVBbGlhc1wiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlT3BhcXVlVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlT3BhcXVlVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVPcGFxdWVUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlT3BhcXVlVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlVmFyaWFibGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyZVZhcmlhYmxlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjbGFyZVZhcmlhYmxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlVmFyaWFibGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNsYXJlZFByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5EZWNsYXJlZFByZWRpY2F0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRlY2xhcmVkUHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNsYXJlZFByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeGlzdHNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FeGlzdHNUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4aXN0c1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uVHlwZVBhcmFtKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uVHlwZVBhcmFtPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRnVuY3Rpb25UeXBlUGFyYW0ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0dlbmVyaWNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5HZW5lcmljVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5HZW5lcmljVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbmZlcnJlZFByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbmZlcnJlZFByZWRpY2F0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkluZmVycmVkUHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbmZlcnJlZFByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcmZhY2VFeHRlbmRzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZUV4dGVuZHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbnRlcmZhY2VFeHRlbmRzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbnRlcmZhY2VFeHRlbmRzXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyZmFjZURlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyZmFjZVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyZmFjZVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc01peGVkVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTWl4ZWRUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1peGVkVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk1peGVkVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbXB0eVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW1wdHlUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW1wdHlUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsYWJsZVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk51bGxhYmxlVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5OdWxsYWJsZVR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk51bWJlclR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1iZXJUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RUeXBlSW50ZXJuYWxTbG90KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFR5cGVJbnRlcm5hbFNsb3Q+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFR5cGVDYWxsUHJvcGVydHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVDYWxsUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0VHlwZUluZGV4ZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuT2JqZWN0VHlwZUluZGV4ZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlSW5kZXhlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0VHlwZUluZGV4ZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0VHlwZVByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9iamVjdFR5cGVQcm9wZXJ0eT4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk9iamVjdFR5cGVQcm9wZXJ0eSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPcGFxdWVUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk9wYXF1ZVR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PcGFxdWVUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJPcGFxdWVUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1F1YWxpZmllZFR5cGVJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5TdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TdHJpbmdUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlN0cmluZ1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTeW1ib2xUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TeW1ib2xUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlN5bWJvbFR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUaGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVGhpc1R5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUaGlzVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHVwbGVUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UdXBsZVR5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlb2ZUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UeXBlb2ZUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVvZlR5cGVBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlQWxpYXMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZUFsaWFzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHlwZUFsaWFzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUeXBlQWxpYXNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZUFubm90YXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZUNhc3RFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVDYXN0RXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZUNhc3RFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbWV0ZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZVBhcmFtZXRlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlR5cGVQYXJhbWV0ZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaW9uVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVW5pb25UeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlVuaW9uVHlwZUFubm90YXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlVuaW9uVHlwZUFubm90YXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFyaWFuY2UoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVmFyaWFuY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5WYXJpYW5jZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVmFyaWFuY2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVm9pZFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlZvaWRUeXBlQW5ub3RhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlZvaWRUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1EZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbnVtRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkVudW1EZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtQm9vbGVhbkJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bUJvb2xlYW5Cb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bUJvb2xlYW5Cb2R5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFbnVtQm9vbGVhbkJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bU51bWJlckJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bU51bWJlckJvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtTnVtYmVyQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bU51bWJlckJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVN0cmluZ0JvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bVN0cmluZ0JvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3RyaW5nQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bVN0cmluZ0JvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVN5bWJvbEJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bVN5bWJvbEJvZHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3ltYm9sQm9keSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bVN5bWJvbEJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bUJvb2xlYW5NZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bUJvb2xlYW5NZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtQm9vbGVhbk1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bUJvb2xlYW5NZW1iZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bU51bWJlck1lbWJlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5FbnVtTnVtYmVyTWVtYmVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bU51bWJlck1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRW51bU51bWJlck1lbWJlclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbnVtU3RyaW5nTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkVudW1TdHJpbmdNZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FbnVtU3RyaW5nTWVtYmVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJFbnVtU3RyaW5nTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1EZWZhdWx0ZWRNZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bURlZmF1bHRlZE1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkVudW1EZWZhdWx0ZWRNZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSW5kZXhlZEFjY2Vzc1R5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbmRleGVkQWNjZXNzVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSW5kZXhlZEFjY2Vzc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hBdHRyaWJ1dGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYQXR0cmlidXRlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYQXR0cmlidXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hBdHRyaWJ1dGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYQ2xvc2luZ0VsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYQ2xvc2luZ0VsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hDbG9zaW5nRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYQ2xvc2luZ0VsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRWxlbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hFbXB0eUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYRW1wdHlFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRW1wdHlFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hFbXB0eUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hFeHByZXNzaW9uQ29udGFpbmVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuSlNYRXhwcmVzc2lvbkNvbnRhaW5lciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hTcHJlYWRDaGlsZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hTcHJlYWRDaGlsZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFNwcmVhZENoaWxkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hTcHJlYWRDaGlsZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU1hJZGVudGlmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWElkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hJZGVudGlmaWVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJKU1hJZGVudGlmaWVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWE1lbWJlckV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYTWVtYmVyRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYTmFtZXNwYWNlZE5hbWUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYTmFtZXNwYWNlZE5hbWU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hOYW1lc3BhY2VkTmFtZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYTmFtZXNwYWNlZE5hbWVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYT3BlbmluZ0VsZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYT3BlbmluZ0VsZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hPcGVuaW5nRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYT3BlbmluZ0VsZW1lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYU3ByZWFkQXR0cmlidXRlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWFNwcmVhZEF0dHJpYnV0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFNwcmVhZEF0dHJpYnV0ZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWFRleHQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYVGV4dD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWFRleHQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWFRleHRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYRnJhZ21lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuSlNYRnJhZ21lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hGcmFnbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYRnJhZ21lbnRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYT3BlbmluZ0ZyYWdtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWE9wZW5pbmdGcmFnbWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWE9wZW5pbmdGcmFnbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTWENsb3NpbmdGcmFnbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5KU1hDbG9zaW5nRnJhZ21lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkpTWENsb3NpbmdGcmFnbWVudFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb29wKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk5vb3A+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Ob29wIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOb29wXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlBsYWNlaG9sZGVyPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUGxhY2Vob2xkZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlBsYWNlaG9sZGVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Y4SW50cmluc2ljSWRlbnRpZmllcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5WOEludHJpbnNpY0lkZW50aWZpZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5WOEludHJpbnNpY0lkZW50aWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcmd1bWVudFBsYWNlaG9sZGVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFyZ3VtZW50UGxhY2Vob2xkZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmRFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkJpbmRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQmluZEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkJpbmRFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ltcG9ydEF0dHJpYnV0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbXBvcnRBdHRyaWJ1dGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnRBdHRyaWJ1dGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkltcG9ydEF0dHJpYnV0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEZWNvcmF0b3IoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjb3JhdG9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRGVjb3JhdG9yIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJEZWNvcmF0b3JcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRG9FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkRvRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkRvRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRG9FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkV4cG9ydERlZmF1bHRTcGVjaWZpZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZWNvcmRFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUmVjb3JkRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUmVjb3JkRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUdXBsZUV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHVwbGVFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVHVwbGVFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUdXBsZUV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjaW1hbExpdGVyYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjaW1hbExpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNpbWFsTGl0ZXJhbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiRGVjaW1hbExpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kdWxlRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Nb2R1bGVFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTW9kdWxlRXhwcmVzc2lvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiTW9kdWxlRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Ub3BpY1JlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRvcGljUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUb3BpY1JlZmVyZW5jZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZVRvcGljRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lVG9waWNFeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZVRvcGljRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZUJhcmVGdW5jdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZUJhcmVGdW5jdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBpcGVsaW5lUHJpbWFyeVRvcGljUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1BhcmFtZXRlclByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUGFyYW1ldGVyUHJvcGVydHk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1BhcmFtZXRlclByb3BlcnR5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1BhcmFtZXRlclByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRGVjbGFyZUZ1bmN0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRGVjbGFyZUZ1bmN0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRGVjbGFyZU1ldGhvZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0RlY2xhcmVNZXRob2Q+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0RlY2xhcmVNZXRob2Qge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTRGVjbGFyZU1ldGhvZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1F1YWxpZmllZE5hbWUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNRdWFsaWZpZWROYW1lPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNRdWFsaWZpZWROYW1lIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1F1YWxpZmllZE5hbWVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1Byb3BlcnR5U2lnbmF0dXJlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUHJvcGVydHlTaWduYXR1cmU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1Byb3BlcnR5U2lnbmF0dXJlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTWV0aG9kU2lnbmF0dXJlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTWV0aG9kU2lnbmF0dXJlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNNZXRob2RTaWduYXR1cmUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTWV0aG9kU2lnbmF0dXJlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW5kZXhTaWduYXR1cmUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbmRleFNpZ25hdHVyZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5kZXhTaWduYXR1cmUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW5kZXhTaWduYXR1cmVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNBbnlLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQW55S2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQW55S2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNBbnlLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQm9vbGVhbktleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNCb29sZWFuS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQm9vbGVhbktleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQm9vbGVhbktleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNCaWdJbnRLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQmlnSW50S2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQmlnSW50S2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNCaWdJbnRLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW50cmluc2ljS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludHJpbnNpY0tleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW50cmluc2ljS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU05ldmVyS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU05ldmVyS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmV2ZXJLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU05ldmVyS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU051bGxLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTnVsbEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU051bGxLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU051bGxLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTnVtYmVyS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU051bWJlcktleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU051bWJlcktleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTnVtYmVyS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU09iamVjdEtleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNPYmplY3RLZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNPYmplY3RLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU09iamVjdEtleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNTdHJpbmdLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTU3RyaW5nS2V5d29yZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTU3RyaW5nS2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNTdHJpbmdLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTU3ltYm9sS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1N5bWJvbEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1N5bWJvbEtleXdvcmQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTU3ltYm9sS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1VuZGVmaW5lZEtleXdvcmQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNVbmRlZmluZWRLZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmRlZmluZWRLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1VuZGVmaW5lZEtleXdvcmRcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNVbmtub3duS2V5d29yZChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1Vua25vd25LZXl3b3JkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmtub3duS2V5d29yZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNVbmtub3duS2V5d29yZFwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1ZvaWRLZXl3b3JkKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVm9pZEtleXdvcmQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1ZvaWRLZXl3b3JkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1ZvaWRLZXl3b3JkXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVGhpc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUaGlzVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVGhpc1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVGhpc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNGdW5jdGlvblR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNGdW5jdGlvblR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNGdW5jdGlvblR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNDb25zdHJ1Y3RvclR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNDb25zdHJ1Y3RvclR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0NvbnN0cnVjdG9yVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNDb25zdHJ1Y3RvclR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlUmVmZXJlbmNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVJlZmVyZW5jZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVHlwZVJlZmVyZW5jZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlUmVmZXJlbmNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVByZWRpY2F0ZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVQcmVkaWNhdGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQcmVkaWNhdGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVByZWRpY2F0ZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVRdWVyeShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVRdWVyeT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTVHlwZVF1ZXJ5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVRdWVyeVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZUxpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVMaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQXJyYXlUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQXJyYXlUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNBcnJheVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQXJyYXlUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHVwbGVUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHVwbGVUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUdXBsZVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHVwbGVUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTT3B0aW9uYWxUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTT3B0aW9uYWxUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNPcHRpb25hbFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTT3B0aW9uYWxUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTUmVzdFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNSZXN0VHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTUmVzdFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTUmVzdFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNOYW1lZFR1cGxlTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTmFtZWRUdXBsZU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmFtZWRUdXBsZU1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVW5pb25UeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVW5pb25UeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNVbmlvblR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVW5pb25UeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW50ZXJzZWN0aW9uVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludGVyc2VjdGlvblR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0ludGVyc2VjdGlvblR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0NvbmRpdGlvbmFsVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0NvbmRpdGlvbmFsVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0NvbmRpdGlvbmFsVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0luZmVyVHlwZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0luZmVyVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5mZXJUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0luZmVyVHlwZVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1BhcmVudGhlc2l6ZWRUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTUGFyZW50aGVzaXplZFR5cGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1BhcmVudGhlc2l6ZWRUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZU9wZXJhdG9yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZU9wZXJhdG9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlT3BlcmF0b3Ige1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZU9wZXJhdG9yXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbmRleGVkQWNjZXNzVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTSW5kZXhlZEFjY2Vzc1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNNYXBwZWRUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTTWFwcGVkVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTWFwcGVkVHlwZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNNYXBwZWRUeXBlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTGl0ZXJhbFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNMaXRlcmFsVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTGl0ZXJhbFR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTGl0ZXJhbFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ludGVyZmFjZURlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0ludGVyZmFjZUJvZHkoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbnRlcmZhY2VCb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbnRlcmZhY2VCb2R5IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0ludGVyZmFjZUJvZHlcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0luc3RhbnRpYXRpb25FeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQXNFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTQXNFeHByZXNzaW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNBc0V4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTQXNFeHByZXNzaW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTU2F0aXNmaWVzRXhwcmVzc2lvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1NhdGlzZmllc0V4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1NhdGlzZmllc0V4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVBc3NlcnRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUeXBlQXNzZXJ0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQXNzZXJ0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVBc3NlcnRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFbnVtRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNFbnVtRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0VudW1EZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFbnVtRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFbnVtTWVtYmVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRW51bU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTRW51bU1lbWJlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFbnVtTWVtYmVyXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTW9kdWxlRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNNb2R1bGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNNb2R1bGVCbG9jayhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU01vZHVsZUJsb2NrPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNNb2R1bGVCbG9jayB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNNb2R1bGVCbG9ja1wiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0ltcG9ydFR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNJbXBvcnRUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbXBvcnRUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0ltcG9ydFR5cGVcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTm9uTnVsbEV4cHJlc3Npb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNOb25OdWxsRXhwcmVzc2lvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTm9uTnVsbEV4cHJlc3Npb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNFeHBvcnRBc3NpZ25tZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTRXhwb3J0QXNzaWdubWVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTRXhwb3J0QXNzaWdubWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNFeHBvcnRBc3NpZ25tZW50XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlQW5ub3RhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiVFNUeXBlQW5ub3RhdGlvblwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTVHlwZVBhcmFtZXRlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVQYXJhbWV0ZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU1R5cGVQYXJhbWV0ZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS50eXBlICE9PSBcIlRTVHlwZVBhcmFtZXRlclwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdGFuZGFyZGl6ZWQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3RhbmRhcmRpemVkPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhbmRhcmRpemVkIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIjpcbiAgICBjYXNlIFwiRGlyZWN0aXZlXCI6XG4gICAgY2FzZSBcIkRpcmVjdGl2ZUxpdGVyYWxcIjpcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkRlYnVnZ2VyU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkRvV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRW1wdHlTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGaWxlXCI6XG4gICAgY2FzZSBcIkZvckluU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIklmU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJQcm9ncmFtXCI6XG4gICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgY2FzZSBcIk9iamVjdFByb3BlcnR5XCI6XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgY2FzZSBcIlJldHVyblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiU3dpdGNoQ2FzZVwiOlxuICAgIGNhc2UgXCJTd2l0Y2hTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVGhpc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVHJ5U3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJVcGRhdGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdG9yXCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldpdGhTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzQm9keVwiOlxuICAgIGNhc2UgXCJDbGFzc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnRTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiSW1wb3J0U3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiU3VwZXJcIjpcbiAgICBjYXNlIFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRlbXBsYXRlRWxlbWVudFwiOlxuICAgIGNhc2UgXCJUZW1wbGF0ZUxpdGVyYWxcIjpcbiAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJbXBvcnRcIjpcbiAgICBjYXNlIFwiQmlnSW50TGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCI6XG4gICAgY2FzZSBcIlByaXZhdGVOYW1lXCI6XG4gICAgY2FzZSBcIlN0YXRpY0Jsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIHN3aXRjaCAobm9kZS5leHBlY3RlZE5vZGUpIHtcbiAgICAgICAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICAgICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxcIjpcbiAgICAgICAgY2FzZSBcIkJsb2NrU3RhdGVtZW50XCI6XG4gICAgICAgIGNhc2UgXCJDbGFzc0JvZHlcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkV4cHJlc3Npb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FeHByZXNzaW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxcIjpcbiAgICBjYXNlIFwiTnVtZXJpY0xpdGVyYWxcIjpcbiAgICBjYXNlIFwiTnVsbExpdGVyYWxcIjpcbiAgICBjYXNlIFwiQm9vbGVhbkxpdGVyYWxcIjpcbiAgICBjYXNlIFwiUmVnRXhwTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJTZXF1ZW5jZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGhpc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlVwZGF0ZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJTdXBlclwiOlxuICAgIGNhc2UgXCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVGVtcGxhdGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIllpZWxkRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJBd2FpdEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0XCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkpTWEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiSlNYRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiQmluZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiRG9FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlJlY29yZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHVwbGVFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkRlY2ltYWxMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk1vZHVsZUV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVG9waWNSZWZlcmVuY2VcIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVCYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIjpcbiAgICBjYXNlIFwiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiRXhwcmVzc2lvblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CaW5hcnk+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5CaW5hcnkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTY29wYWJsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5TY29wYWJsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlNjb3BhYmxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JJblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiU3dpdGNoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCbG9ja1BhcmVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CbG9ja1BhcmVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJsb2NrUGFyZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ2F0Y2hDbGF1c2VcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JJblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGb3JTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiU3dpdGNoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCbG9jayhcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5CbG9jaz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkJsb2NrIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUHJvZ3JhbVwiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJCbG9ja1N0YXRlbWVudFwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdGF0ZW1lbnQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQmxvY2tTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ29udGludWVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRGVidWdnZXJTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJFbXB0eVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvckluU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIklmU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUmV0dXJuU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlN3aXRjaFN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUaHJvd1N0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUcnlTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJXaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJXaXRoU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNsYXNzRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUNsYXNzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVGdW5jdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlSW50ZXJmYWNlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVR5cGVBbGlhc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlVmFyaWFibGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJPcGFxdWVUeXBlXCI6XG4gICAgY2FzZSBcIlR5cGVBbGlhc1wiOlxuICAgIGNhc2UgXCJFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTRW51bURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0V4cG9ydEFzc2lnbm1lbnRcIjpcbiAgICBjYXNlIFwiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBsYWNlaG9sZGVyXCI6XG4gICAgICBzd2l0Y2ggKG5vZGUuZXhwZWN0ZWROb2RlKSB7XG4gICAgICAgIGNhc2UgXCJTdGF0ZW1lbnRcIjpcbiAgICAgICAgY2FzZSBcIkRlY2xhcmF0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJCbG9ja1N0YXRlbWVudFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlcm1pbmF0b3JsZXNzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlRlcm1pbmF0b3JsZXNzPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVGVybWluYXRvcmxlc3Mge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJCcmVha1N0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJDb250aW51ZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJSZXR1cm5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiVGhyb3dTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkF3YWl0RXhwcmVzc2lvblwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxldGlvblN0YXRlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Db21wbGV0aW9uU3RhdGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQ29tcGxldGlvblN0YXRlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkJyZWFrU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkNvbnRpbnVlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlJldHVyblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJUaHJvd1N0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ29uZGl0aW9uYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Db25kaXRpb25hbCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJJZlN0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9vcChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Mb29wPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuTG9vcCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkRvV2hpbGVTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNXaGlsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5XaGlsZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LldoaWxlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRG9XaGlsZVN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJXaGlsZVN0YXRlbWVudFwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbldyYXBwZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRXhwcmVzc2lvbldyYXBwZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5FeHByZXNzaW9uV3JhcHBlciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVHlwZUNhc3RFeHByZXNzaW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGb3IoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRm9yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRm9yIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIkZvck9mU3RhdGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGb3JYU3RhdGVtZW50KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZvclhTdGF0ZW1lbnQ+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Gb3JYU3RhdGVtZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRm9ySW5TdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiRm9yT2ZTdGF0ZW1lbnRcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZ1bmN0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRnVuY3Rpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NNZXRob2RcIjpcbiAgICBjYXNlIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvblBhcmVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GdW5jdGlvblBhcmVudD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkZ1bmN0aW9uUGFyZW50IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkNsYXNzTWV0aG9kXCI6XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJTdGF0aWNCbG9ja1wiOlxuICAgIGNhc2UgXCJUU01vZHVsZUJsb2NrXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQdXJlaXNoKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlB1cmVpc2g+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QdXJlaXNoIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvbkV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiRGVjaW1hbExpdGVyYWxcIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlN0cmluZ0xpdGVyYWxcIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVjbGFyYXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5EZWNsYXJhdGlvbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVmFyaWFibGVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkltcG9ydERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVDbGFzc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUludGVyZmFjZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVZhcmlhYmxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRW51bURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0VudW1EZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU01vZHVsZURlY2xhcmF0aW9uXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJEZWNsYXJhdGlvblwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuTGlrZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5QYXR0ZXJuTGlrZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlBhdHRlcm5MaWtlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgIGNhc2UgXCJSZXN0RWxlbWVudFwiOlxuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgIGNhc2UgXCJBcnJheVBhdHRlcm5cIjpcbiAgICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xWYWwoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuTFZhbD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkxWYWwge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiUmVzdEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJUU0FzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQXNzZXJ0aW9uXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgc3dpdGNoIChub2RlLmV4cGVjdGVkTm9kZSkge1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTRW50aXR5TmFtZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU0VudGl0eU5hbWU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5UU0VudGl0eU5hbWUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJJZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcIlRTUXVhbGlmaWVkTmFtZVwiOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBsYWNlaG9sZGVyXCI6XG4gICAgICBpZiAobm9kZS5leHBlY3RlZE5vZGUgPT09IFwiSWRlbnRpZmllclwiKSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNMaXRlcmFsKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkxpdGVyYWw+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5MaXRlcmFsIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiU3RyaW5nTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdW1lcmljTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJOdWxsTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJSZWdFeHBMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRlbXBsYXRlTGl0ZXJhbFwiOlxuICAgIGNhc2UgXCJCaWdJbnRMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkRlY2ltYWxMaXRlcmFsXCI6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUGxhY2Vob2xkZXJcIjpcbiAgICAgIGlmIChub2RlLmV4cGVjdGVkTm9kZSA9PT0gXCJTdHJpbmdMaXRlcmFsXCIpIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbXV0YWJsZShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5JbW11dGFibGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbW11dGFibGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk51bWVyaWNMaXRlcmFsXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5MaXRlcmFsXCI6XG4gICAgY2FzZSBcIkJpZ0ludExpdGVyYWxcIjpcbiAgICBjYXNlIFwiSlNYQXR0cmlidXRlXCI6XG4gICAgY2FzZSBcIkpTWENsb3NpbmdFbGVtZW50XCI6XG4gICAgY2FzZSBcIkpTWEVsZW1lbnRcIjpcbiAgICBjYXNlIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiOlxuICAgIGNhc2UgXCJKU1hTcHJlYWRDaGlsZFwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hUZXh0XCI6XG4gICAgY2FzZSBcIkpTWEZyYWdtZW50XCI6XG4gICAgY2FzZSBcIkpTWE9wZW5pbmdGcmFnbWVudFwiOlxuICAgIGNhc2UgXCJKU1hDbG9zaW5nRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiRGVjaW1hbExpdGVyYWxcIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlN0cmluZ0xpdGVyYWxcIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVXNlcldoaXRlc3BhY2FibGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVXNlcldoaXRlc3BhY2FibGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5Vc2VyV2hpdGVzcGFjYWJsZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgIGNhc2UgXCJPYmplY3RQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUluZGV4ZXJcIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZVByb3BlcnR5XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTWV0aG9kKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1ldGhvZD4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1ldGhvZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIk9iamVjdE1ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdE1lbWJlcihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5PYmplY3RNZW1iZXI+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5PYmplY3RNZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RNZXRob2RcIjpcbiAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlByb3BlcnR5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuUHJvcGVydHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1Byb3BlcnR5XCI6XG4gICAgY2FzZSBcIkNsYXNzQWNjZXNzb3JQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5hcnlMaWtlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlVuYXJ5TGlrZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlVuYXJ5TGlrZSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlBhdHRlcm4+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5QYXR0ZXJuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQXNzaWdubWVudFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgICAgaWYgKG5vZGUuZXhwZWN0ZWROb2RlID09PSBcIlBhdHRlcm5cIikgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3MoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuQ2xhc3M+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5DbGFzcyB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkNsYXNzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJDbGFzc0RlY2xhcmF0aW9uXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5JbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiSW1wb3J0RGVjbGFyYXRpb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkV4cG9ydERlY2xhcmF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRXhwb3J0RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kdWxlU3BlY2lmaWVyKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1vZHVsZVNwZWNpZmllcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0Lk1vZHVsZVNwZWNpZmllciB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkV4cG9ydFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnRTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FjY2Vzc29yKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkFjY2Vzc29yPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuQWNjZXNzb3Ige1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuUHJpdmF0ZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlByaXZhdGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICBjYXNlIFwiUHJpdmF0ZU5hbWVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3coXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRmxvdz4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkZsb3cge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJBbnlUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NJbXBsZW1lbnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVDbGFzc1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlRnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUludGVyZmFjZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVNb2R1bGVFeHBvcnRzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVUeXBlQWxpYXNcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiRGVjbGFyZVZhcmlhYmxlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJGdW5jdGlvblR5cGVQYXJhbVwiOlxuICAgIGNhc2UgXCJHZW5lcmljVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW5mZXJyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlRXh0ZW5kc1wiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcmZhY2VUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkVtcHR5VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVtYmVyVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVJbmRleGVyXCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVQcm9wZXJ0eVwiOlxuICAgIGNhc2UgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIjpcbiAgICBjYXNlIFwiT3BhcXVlVHlwZVwiOlxuICAgIGNhc2UgXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiOlxuICAgIGNhc2UgXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiU3RyaW5nVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiU3ltYm9sVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVGhpc1R5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlR1cGxlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHlwZW9mVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHlwZUFsaWFzXCI6XG4gICAgY2FzZSBcIlR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlR5cGVDYXN0RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUeXBlUGFyYW1ldGVyXCI6XG4gICAgY2FzZSBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiOlxuICAgIGNhc2UgXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlZhcmlhbmNlXCI6XG4gICAgY2FzZSBcIlZvaWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRW51bUJvb2xlYW5Cb2R5XCI6XG4gICAgY2FzZSBcIkVudW1OdW1iZXJCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1TdHJpbmdCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1TeW1ib2xCb2R5XCI6XG4gICAgY2FzZSBcIkVudW1Cb29sZWFuTWVtYmVyXCI6XG4gICAgY2FzZSBcIkVudW1OdW1iZXJNZW1iZXJcIjpcbiAgICBjYXNlIFwiRW51bVN0cmluZ01lbWJlclwiOlxuICAgIGNhc2UgXCJFbnVtRGVmYXVsdGVkTWVtYmVyXCI6XG4gICAgY2FzZSBcIkluZGV4ZWRBY2Nlc3NUeXBlXCI6XG4gICAgY2FzZSBcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dUeXBlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZsb3dUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRmxvd1R5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJBbnlUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJBcnJheVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRXhpc3RzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJHZW5lcmljVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUaGlzVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJVbmlvblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlZvaWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJJbmRleGVkQWNjZXNzVHlwZVwiOlxuICAgIGNhc2UgXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGbG93QmFzZUFubm90YXRpb24oXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRmxvd0Jhc2VBbm5vdGF0aW9uPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRmxvd0Jhc2VBbm5vdGF0aW9uIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiQW55VHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIjpcbiAgICBjYXNlIFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN0cmluZ1R5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCI6XG4gICAgY2FzZSBcIlRoaXNUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJWb2lkVHlwZUFubm90YXRpb25cIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5GbG93RGVjbGFyYXRpb24+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GbG93RGVjbGFyYXRpb24ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJEZWNsYXJlQ2xhc3NcIjpcbiAgICBjYXNlIFwiRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVJbnRlcmZhY2VcIjpcbiAgICBjYXNlIFwiRGVjbGFyZU1vZHVsZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlTW9kdWxlRXhwb3J0c1wiOlxuICAgIGNhc2UgXCJEZWNsYXJlVHlwZUFsaWFzXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVPcGFxdWVUeXBlXCI6XG4gICAgY2FzZSBcIkRlY2xhcmVWYXJpYWJsZVwiOlxuICAgIGNhc2UgXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIkludGVyZmFjZURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIk9wYXF1ZVR5cGVcIjpcbiAgICBjYXNlIFwiVHlwZUFsaWFzXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGbG93UHJlZGljYXRlKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkZsb3dQcmVkaWNhdGU+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5GbG93UHJlZGljYXRlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiRGVjbGFyZWRQcmVkaWNhdGVcIjpcbiAgICBjYXNlIFwiSW5mZXJyZWRQcmVkaWNhdGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1Cb2R5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkVudW1Cb2R5PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuRW51bUJvZHkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFbnVtQm9vbGVhbkJvZHlcIjpcbiAgICBjYXNlIFwiRW51bU51bWJlckJvZHlcIjpcbiAgICBjYXNlIFwiRW51bVN0cmluZ0JvZHlcIjpcbiAgICBjYXNlIFwiRW51bVN5bWJvbEJvZHlcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1NZW1iZXIoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuRW51bU1lbWJlcj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkVudW1NZW1iZXIge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJFbnVtQm9vbGVhbk1lbWJlclwiOlxuICAgIGNhc2UgXCJFbnVtTnVtYmVyTWVtYmVyXCI6XG4gICAgY2FzZSBcIkVudW1TdHJpbmdNZW1iZXJcIjpcbiAgICBjYXNlIFwiRW51bURlZmF1bHRlZE1lbWJlclwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNYKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LkpTWD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkpTWCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIkpTWEF0dHJpYnV0ZVwiOlxuICAgIGNhc2UgXCJKU1hDbG9zaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hFbGVtZW50XCI6XG4gICAgY2FzZSBcIkpTWEVtcHR5RXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCI6XG4gICAgY2FzZSBcIkpTWFNwcmVhZENoaWxkXCI6XG4gICAgY2FzZSBcIkpTWElkZW50aWZpZXJcIjpcbiAgICBjYXNlIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJKU1hOYW1lc3BhY2VkTmFtZVwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRWxlbWVudFwiOlxuICAgIGNhc2UgXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIjpcbiAgICBjYXNlIFwiSlNYVGV4dFwiOlxuICAgIGNhc2UgXCJKU1hGcmFnbWVudFwiOlxuICAgIGNhc2UgXCJKU1hPcGVuaW5nRnJhZ21lbnRcIjpcbiAgICBjYXNlIFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNNaXNjZWxsYW5lb3VzKFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0Lk1pc2NlbGxhbmVvdXM+IHwgbnVsbCxcbik6IG5vZGUgaXMgdC5NaXNjZWxsYW5lb3VzIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiTm9vcFwiOlxuICAgIGNhc2UgXCJQbGFjZWhvbGRlclwiOlxuICAgIGNhc2UgXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHQoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVHlwZVNjcmlwdD4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlR5cGVTY3JpcHQge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJUU1BhcmFtZXRlclByb3BlcnR5XCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZUZ1bmN0aW9uXCI6XG4gICAgY2FzZSBcIlRTRGVjbGFyZU1ldGhvZFwiOlxuICAgIGNhc2UgXCJUU1F1YWxpZmllZE5hbWVcIjpcbiAgICBjYXNlIFwiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCI6XG4gICAgY2FzZSBcIlRTTWV0aG9kU2lnbmF0dXJlXCI6XG4gICAgY2FzZSBcIlRTSW5kZXhTaWduYXR1cmVcIjpcbiAgICBjYXNlIFwiVFNBbnlLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTQm9vbGVhbktleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCaWdJbnRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTSW50cmluc2ljS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU05ldmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU051bGxLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVtYmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU09iamVjdEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTdHJpbmdLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTU3ltYm9sS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1VuZGVmaW5lZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNVbmtub3duS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1ZvaWRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVGhpc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNGdW5jdGlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTVHlwZVByZWRpY2F0ZVwiOlxuICAgIGNhc2UgXCJUU1R5cGVRdWVyeVwiOlxuICAgIGNhc2UgXCJUU1R5cGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRTQXJyYXlUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgY2FzZSBcIlRTT3B0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTUmVzdFR5cGVcIjpcbiAgICBjYXNlIFwiVFNOYW1lZFR1cGxlTWVtYmVyXCI6XG4gICAgY2FzZSBcIlRTVW5pb25UeXBlXCI6XG4gICAgY2FzZSBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiOlxuICAgIGNhc2UgXCJUU0NvbmRpdGlvbmFsVHlwZVwiOlxuICAgIGNhc2UgXCJUU0luZmVyVHlwZVwiOlxuICAgIGNhc2UgXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHlwZU9wZXJhdG9yXCI6XG4gICAgY2FzZSBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNNYXBwZWRUeXBlXCI6XG4gICAgY2FzZSBcIlRTTGl0ZXJhbFR5cGVcIjpcbiAgICBjYXNlIFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIjpcbiAgICBjYXNlIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0ludGVyZmFjZUJvZHlcIjpcbiAgICBjYXNlIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRTQXNFeHByZXNzaW9uXCI6XG4gICAgY2FzZSBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVBc3NlcnRpb25cIjpcbiAgICBjYXNlIFwiVFNFbnVtRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNFbnVtTWVtYmVyXCI6XG4gICAgY2FzZSBcIlRTTW9kdWxlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNNb2R1bGVCbG9ja1wiOlxuICAgIGNhc2UgXCJUU0ltcG9ydFR5cGVcIjpcbiAgICBjYXNlIFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiOlxuICAgIGNhc2UgXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIjpcbiAgICBjYXNlIFwiVFNFeHBvcnRBc3NpZ25tZW50XCI6XG4gICAgY2FzZSBcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNUeXBlQW5ub3RhdGlvblwiOlxuICAgIGNhc2UgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCI6XG4gICAgY2FzZSBcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTVHlwZVBhcmFtZXRlclwiOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVFNUeXBlRWxlbWVudChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5UU1R5cGVFbGVtZW50PiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlRWxlbWVudCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCI6XG4gICAgY2FzZSBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiOlxuICAgIGNhc2UgXCJUU01ldGhvZFNpZ25hdHVyZVwiOlxuICAgIGNhc2UgXCJUU0luZGV4U2lnbmF0dXJlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUU1R5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNUeXBlPiB8IG51bGwsXG4pOiBub2RlIGlzIHQuVFNUeXBlIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiVFNBbnlLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTQm9vbGVhbktleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCaWdJbnRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTSW50cmluc2ljS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU05ldmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU051bGxLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVtYmVyS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU09iamVjdEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTdHJpbmdLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTU3ltYm9sS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1VuZGVmaW5lZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNVbmtub3duS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1ZvaWRLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVGhpc1R5cGVcIjpcbiAgICBjYXNlIFwiVFNGdW5jdGlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNDb25zdHJ1Y3RvclR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlUmVmZXJlbmNlXCI6XG4gICAgY2FzZSBcIlRTVHlwZVByZWRpY2F0ZVwiOlxuICAgIGNhc2UgXCJUU1R5cGVRdWVyeVwiOlxuICAgIGNhc2UgXCJUU1R5cGVMaXRlcmFsXCI6XG4gICAgY2FzZSBcIlRTQXJyYXlUeXBlXCI6XG4gICAgY2FzZSBcIlRTVHVwbGVUeXBlXCI6XG4gICAgY2FzZSBcIlRTT3B0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTUmVzdFR5cGVcIjpcbiAgICBjYXNlIFwiVFNVbmlvblR5cGVcIjpcbiAgICBjYXNlIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCI6XG4gICAgY2FzZSBcIlRTQ29uZGl0aW9uYWxUeXBlXCI6XG4gICAgY2FzZSBcIlRTSW5mZXJUeXBlXCI6XG4gICAgY2FzZSBcIlRTUGFyZW50aGVzaXplZFR5cGVcIjpcbiAgICBjYXNlIFwiVFNUeXBlT3BlcmF0b3JcIjpcbiAgICBjYXNlIFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiOlxuICAgIGNhc2UgXCJUU01hcHBlZFR5cGVcIjpcbiAgICBjYXNlIFwiVFNMaXRlcmFsVHlwZVwiOlxuICAgIGNhc2UgXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJUU0ltcG9ydFR5cGVcIjpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RTQmFzZVR5cGUoXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBPcHRzPHQuVFNCYXNlVHlwZT4gfCBudWxsLFxuKTogbm9kZSBpcyB0LlRTQmFzZVR5cGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJUU0FueUtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNCb29sZWFuS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU0JpZ0ludEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNJbnRyaW5zaWNLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTmV2ZXJLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTTnVsbEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNOdW1iZXJLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTT2JqZWN0S2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1N0cmluZ0tleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNTeW1ib2xLZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVW5kZWZpbmVkS2V5d29yZFwiOlxuICAgIGNhc2UgXCJUU1Vua25vd25LZXl3b3JkXCI6XG4gICAgY2FzZSBcIlRTVm9pZEtleXdvcmRcIjpcbiAgICBjYXNlIFwiVFNUaGlzVHlwZVwiOlxuICAgIGNhc2UgXCJUU0xpdGVyYWxUeXBlXCI6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgaXNOdW1lcmljTGl0ZXJhbGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyTGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5OdW1iZXJMaXRlcmFsPiB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiaXNOdW1iZXJMaXRlcmFsXCIsIFwiaXNOdW1lcmljTGl0ZXJhbFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJOdW1iZXJMaXRlcmFsXCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBpc1JlZ0V4cExpdGVyYWxgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ2V4TGl0ZXJhbChcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZWdleExpdGVyYWw+IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc1JlZ2V4TGl0ZXJhbFwiLCBcImlzUmVnRXhwTGl0ZXJhbFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJSZWdleExpdGVyYWxcIikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBvcHRzID09IG51bGwgfHwgc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGlzUmVzdEVsZW1lbnRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RQcm9wZXJ0eShcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5SZXN0UHJvcGVydHk+IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc1Jlc3RQcm9wZXJ0eVwiLCBcImlzUmVzdEVsZW1lbnRcIik7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChub2RlLnR5cGUgIT09IFwiUmVzdFByb3BlcnR5XCIpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gb3B0cyA9PSBudWxsIHx8IHNoYWxsb3dFcXVhbChub2RlLCBvcHRzKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBpc1NwcmVhZEVsZW1lbnRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwcmVhZFByb3BlcnR5KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogT3B0czx0LlNwcmVhZFByb3BlcnR5PiB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiaXNTcHJlYWRQcm9wZXJ0eVwiLCBcImlzU3ByZWFkRWxlbWVudFwiKTtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gXCJTcHJlYWRQcm9wZXJ0eVwiKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIG9wdHMgPT0gbnVsbCB8fCBzaGFsbG93RXF1YWwobm9kZSwgb3B0cyk7XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2R1bGVEZWNsYXJhdGlvbihcbiAgbm9kZTogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IE9wdHM8dC5Nb2R1bGVEZWNsYXJhdGlvbj4gfCBudWxsLFxuKTogbm9kZSBpcyB0LkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24ge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJpc01vZHVsZURlY2xhcmF0aW9uXCIsIFwiaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCIpO1xuICByZXR1cm4gaXNJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uKG5vZGUsIG9wdHMpO1xufVxuIiwgImltcG9ydCB7XG4gIGlzSWRlbnRpZmllcixcbiAgaXNNZW1iZXJFeHByZXNzaW9uLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIGlzVGhpc0V4cHJlc3Npb24sXG59IGZyb20gXCIuL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGlucHV0IG5vZGUgYG1lbWJlcmAgbWF0Y2hlcyB0aGVcbiAqIGlucHV0IGBtYXRjaGAuXG4gKlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBtYXRjaCBgUmVhY3QuY3JlYXRlQ2xhc3NgIGl0IHdvdWxkIG1hdGNoIHRoZVxuICogcGFyc2VkIG5vZGVzIG9mIGBSZWFjdC5jcmVhdGVDbGFzc2AgYW5kIGBSZWFjdFtcImNyZWF0ZUNsYXNzXCJdYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oXG4gIG1lbWJlcjogdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbWF0Y2g6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBhbGxvd1BhcnRpYWw/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIC8vIG5vdCBhIG1lbWJlciBleHByZXNzaW9uXG4gIGlmICghaXNNZW1iZXJFeHByZXNzaW9uKG1lbWJlcikpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwYXJ0cyA9IEFycmF5LmlzQXJyYXkobWF0Y2gpID8gbWF0Y2ggOiBtYXRjaC5zcGxpdChcIi5cIik7XG4gIGNvbnN0IG5vZGVzID0gW107XG5cbiAgbGV0IG5vZGU7XG4gIGZvciAobm9kZSA9IG1lbWJlcjsgaXNNZW1iZXJFeHByZXNzaW9uKG5vZGUpOyBub2RlID0gbm9kZS5vYmplY3QpIHtcbiAgICBub2Rlcy5wdXNoKG5vZGUucHJvcGVydHkpO1xuICB9XG4gIG5vZGVzLnB1c2gobm9kZSk7XG5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IHBhcnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWFsbG93UGFydGlhbCAmJiBub2Rlcy5sZW5ndGggPiBwYXJ0cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKywgai0tKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2pdO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICB2YWx1ZSA9IG5vZGUubmFtZTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAoaXNUaGlzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgdmFsdWUgPSBcInRoaXNcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJ0c1tpXSAhPT0gdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCBtYXRjaGVzUGF0dGVybiBmcm9tIFwiLi9tYXRjaGVzUGF0dGVyblwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEJ1aWxkIGEgZnVuY3Rpb24gdGhhdCB3aGVuIGNhbGxlZCB3aWxsIHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGVcbiAqIGlucHV0IGBub2RlYCBgTWVtYmVyRXhwcmVzc2lvbmAgbWF0Y2hlcyB0aGUgaW5wdXQgYG1hdGNoYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIG1hdGNoIGBSZWFjdC5jcmVhdGVDbGFzc2AgaXQgd291bGQgbWF0Y2ggdGhlXG4gKiBwYXJzZWQgbm9kZXMgb2YgYFJlYWN0LmNyZWF0ZUNsYXNzYCBhbmQgYFJlYWN0W1wiY3JlYXRlQ2xhc3NcIl1gLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZE1hdGNoTWVtYmVyRXhwcmVzc2lvbihcbiAgbWF0Y2g6IHN0cmluZyxcbiAgYWxsb3dQYXJ0aWFsPzogYm9vbGVhbixcbikge1xuICBjb25zdCBwYXJ0cyA9IG1hdGNoLnNwbGl0KFwiLlwiKTtcblxuICByZXR1cm4gKG1lbWJlcjogdC5Ob2RlKSA9PiBtYXRjaGVzUGF0dGVybihtZW1iZXIsIHBhcnRzLCBhbGxvd1BhcnRpYWwpO1xufVxuIiwgImltcG9ydCBidWlsZE1hdGNoTWVtYmVyRXhwcmVzc2lvbiBmcm9tIFwiLi4vYnVpbGRNYXRjaE1lbWJlckV4cHJlc3Npb25cIjtcblxuY29uc3QgaXNSZWFjdENvbXBvbmVudCA9IGJ1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uKFwiUmVhY3QuQ29tcG9uZW50XCIpO1xuXG5leHBvcnQgZGVmYXVsdCBpc1JlYWN0Q29tcG9uZW50O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQ29tcGF0VGFnKHRhZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gTXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIEFTQ0lJIGxldHRlclxuICByZXR1cm4gISF0YWdOYW1lICYmIC9eW2Etel0vLnRlc3QodGFnTmFtZSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgZmFzdFByb3RvID0gbnVsbDtcblxuLy8gQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCBwZXJtYW5lbnRseSBmYXN0IHByb3BlcnRpZXMgaW4gVjguIFNlZSBUb29uIFZlcndhZXN0J3Ncbi8vIHBvc3QgaHR0cHM6Ly9tZWRpdW0uY29tL0B0dmVyd2Flcy9zZXR0aW5nLXVwLXByb3RvdHlwZXMtaW4tdjgtZWM5Yzk0OTFkZmUyIzVmNjJcbi8vIGZvciBtb3JlIGRldGFpbHMuIFVzZSAlSGFzRmFzdFByb3BlcnRpZXMob2JqZWN0KSBhbmQgdGhlIE5vZGUuanMgZmxhZ1xuLy8gLS1hbGxvdy1uYXRpdmVzLXN5bnRheCB0byBjaGVjayB3aGV0aGVyIGFuIG9iamVjdCBoYXMgZmFzdCBwcm9wZXJ0aWVzLlxuZnVuY3Rpb24gRmFzdE9iamVjdChvKSB7XG5cdC8vIEEgcHJvdG90eXBlIG9iamVjdCB3aWxsIGhhdmUgXCJmYXN0IHByb3BlcnRpZXNcIiBlbmFibGVkIG9uY2UgaXQgaXMgY2hlY2tlZFxuXHQvLyBhZ2FpbnN0IHRoZSBpbmxpbmUgcHJvcGVydHkgY2FjaGUgb2YgYSBmdW5jdGlvbiwgZS5nLiBmYXN0UHJvdG8ucHJvcGVydHk6XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92OC92OC9ibG9iLzYuMC4xMjIvdGVzdC9tanN1bml0L2Zhc3QtcHJvdG90eXBlLmpzI0w0OC1MNjNcblx0aWYgKGZhc3RQcm90byAhPT0gbnVsbCAmJiB0eXBlb2YgZmFzdFByb3RvLnByb3BlcnR5KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZmFzdFByb3RvO1xuXHRcdGZhc3RQcm90byA9IEZhc3RPYmplY3QucHJvdG90eXBlID0gbnVsbDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cdGZhc3RQcm90byA9IEZhc3RPYmplY3QucHJvdG90eXBlID0gbyA9PSBudWxsID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IG87XG5cdHJldHVybiBuZXcgRmFzdE9iamVjdDtcbn1cblxuLy8gSW5pdGlhbGl6ZSB0aGUgaW5saW5lIHByb3BlcnR5IGNhY2hlIG9mIEZhc3RPYmplY3RcbkZhc3RPYmplY3QoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b0Zhc3Rwcm9wZXJ0aWVzKG8pIHtcblx0cmV0dXJuIEZhc3RPYmplY3Qobyk7XG59O1xuIiwgImltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUywgQUxJQVNfS0VZUyB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1R5cGU8VCBleHRlbmRzIHQuTm9kZVtcInR5cGVcIl0+KFxuICBub2RlVHlwZTogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBULFxuKTogbm9kZVR5cGUgaXMgVDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUeXBlKFxuICBub2RlVHlwZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0VHlwZTogc3RyaW5nLFxuKTogYm9vbGVhbjtcblxuLyoqXG4gKiBUZXN0IGlmIGEgYG5vZGVUeXBlYCBpcyBhIGB0YXJnZXRUeXBlYCBvciBpZiBgdGFyZ2V0VHlwZWAgaXMgYW4gYWxpYXMgb2YgYG5vZGVUeXBlYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUeXBlKG5vZGVUeXBlOiBzdHJpbmcsIHRhcmdldFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAobm9kZVR5cGUgPT09IHRhcmdldFR5cGUpIHJldHVybiB0cnVlO1xuXG4gIC8vIFRoaXMgaXMgYSBmYXN0LXBhdGguIElmIHRoZSB0ZXN0IGFib3ZlIGZhaWxlZCwgYnV0IGFuIGFsaWFzIGtleSBpcyBmb3VuZCwgdGhlbiB0aGVcbiAgLy8gdGFyZ2V0VHlwZSB3YXMgYSBwcmltYXJ5IG5vZGUgdHlwZSwgc28gdGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIHRoZSBhbGlhc2VzLlxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRhcmdldFR5cGUgbWF5IG5vdCBpbmRleCBBTElBU19LRVlTXG4gIGlmIChBTElBU19LRVlTW3RhcmdldFR5cGVdKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgYWxpYXNlczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9IEZMSVBQRURfQUxJQVNfS0VZU1t0YXJnZXRUeXBlXTtcbiAgaWYgKGFsaWFzZXMpIHtcbiAgICBpZiAoYWxpYXNlc1swXSA9PT0gbm9kZVR5cGUpIHJldHVybiB0cnVlO1xuXG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICBpZiAobm9kZVR5cGUgPT09IGFsaWFzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iLCAiaW1wb3J0IHsgUExBQ0VIT0xERVJTX0FMSUFTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbi8qKlxuICogVGVzdCBpZiBhIGBwbGFjZWhvbGRlclR5cGVgIGlzIGEgYHRhcmdldFR5cGVgIG9yIGlmIGB0YXJnZXRUeXBlYCBpcyBhbiBhbGlhcyBvZiBgcGxhY2Vob2xkZXJUeXBlYC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFjZWhvbGRlclR5cGUoXG4gIHBsYWNlaG9sZGVyVHlwZTogc3RyaW5nLFxuICB0YXJnZXRUeXBlOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgaWYgKHBsYWNlaG9sZGVyVHlwZSA9PT0gdGFyZ2V0VHlwZSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgYWxpYXNlczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCA9XG4gICAgUExBQ0VIT0xERVJTX0FMSUFTW3BsYWNlaG9sZGVyVHlwZV07XG4gIGlmIChhbGlhc2VzKSB7XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gYWxpYXMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gXCIuLi91dGlscy9zaGFsbG93RXF1YWxcIjtcbmltcG9ydCBpc1R5cGUgZnJvbSBcIi4vaXNUeXBlXCI7XG5pbXBvcnQgaXNQbGFjZWhvbGRlclR5cGUgZnJvbSBcIi4vaXNQbGFjZWhvbGRlclR5cGVcIjtcbmltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUyB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpczxUIGV4dGVuZHMgdC5Ob2RlW1widHlwZVwiXT4oXG4gIHR5cGU6IFQsXG4gIG5vZGU6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiB1bmRlZmluZWQsXG4pOiBub2RlIGlzIEV4dHJhY3Q8dC5Ob2RlLCB7IHR5cGU6IFQgfT47XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzPFxuICBUIGV4dGVuZHMgdC5Ob2RlW1widHlwZVwiXSxcbiAgUCBleHRlbmRzIEV4dHJhY3Q8dC5Ob2RlLCB7IHR5cGU6IFQgfT4sXG4+KHR5cGU6IFQsIG46IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsIHJlcXVpcmVkOiBQYXJ0aWFsPFA+KTogbiBpcyBQO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpczxQIGV4dGVuZHMgdC5Ob2RlPihcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzOiBQYXJ0aWFsPFA+LFxuKTogbm9kZSBpcyBQO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpcyhcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogUGFydGlhbDx0Lk5vZGU+LFxuKTogbm9kZSBpcyB0Lk5vZGU7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBgbm9kZWAgaXMgb2YgZ2l2ZW4gYHR5cGVgLlxuICpcbiAqIEZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIHVzZSB0aGlzIGluc3RlYWQgb2YgYGlzW1R5cGVdYCB3aGVuIGB0eXBlYCBpcyB1bmtub3duLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpcyhcbiAgdHlwZTogc3RyaW5nLFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogUGFydGlhbDx0Lk5vZGU+LFxuKTogbm9kZSBpcyB0Lk5vZGUge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBtYXRjaGVzID0gaXNUeXBlKG5vZGUudHlwZSwgdHlwZSk7XG4gIGlmICghbWF0Y2hlcykge1xuICAgIGlmICghb3B0cyAmJiBub2RlLnR5cGUgPT09IFwiUGxhY2Vob2xkZXJcIiAmJiB0eXBlIGluIEZMSVBQRURfQUxJQVNfS0VZUykge1xuICAgICAgLy8gV2UgY2FuIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIHBsYWNlaG9sZGVyIGRvZXNuJ3QgcmVwbGFjZSBhIHJlYWwgbm9kZSxcbiAgICAgIC8vIGJ1dCBpdCByZXBsYWNlcyBhIGNhdGVnb3J5IG9mIG5vZGVzIChhbiBhbGlhcykuXG4gICAgICAvL1xuICAgICAgLy8gdC5pcyhcIklkZW50aWZpZXJcIiwgbm9kZSkgZ2l2ZXMgc29tZSBndWFyYW50ZWVzIGFib3V0IG5vZGUncyBzaGFwZSwgc28gd2VcbiAgICAgIC8vIGNhbid0IHNheSB0aGF0IFBsYWNlaG9sZGVyKGV4cGVjdGVkTm9kZTogXCJJZGVudGlmaWVyXCIpIGlzIGFuIGlkZW50aWZpZXJcbiAgICAgIC8vIGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIHRoZSBzYW1lIHByb3BlcnRpZXMuXG4gICAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgdC5pcyhcIkV4cHJlc3Npb25cIiwgbm9kZSkgZG9lc24ndCBzYXkgYW55dGhpbmcgYWJvdXRcbiAgICAgIC8vIHRoZSBzaGFwZSBvZiBub2RlIGJlY2F1c2UgRXhwcmVzc2lvbiBjYW4gYmUgbWFueSBkaWZmZXJlbnQgbm9kZXM6IHdlIGNhbixcbiAgICAgIC8vIGFuZCBzaG91bGQsIHNhZmVseSByZXBvcnQgZXhwcmVzc2lvbiBwbGFjZWhvbGRlcnMgYXMgRXhwcmVzc2lvbnMuXG4gICAgICByZXR1cm4gaXNQbGFjZWhvbGRlclR5cGUobm9kZS5leHBlY3RlZE5vZGUsIHR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2hhbGxvd0VxdWFsKG5vZGUsIG9wdHMpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgY2hhckNvZGVzIGZyb20gXCJjaGFyY29kZXNcIjtcblxuLy8gIyMgQ2hhcmFjdGVyIGNhdGVnb3JpZXNcblxuLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlXG4vLyB3aGl0ZXNwYWNlLCBpZGVudGlmaWVyLCBhbmQgaWRlbnRpZmllci1zdGFydCBjYXRlZ29yaWVzLiBUaGVzZVxuLy8gYXJlIG9ubHkgYXBwbGllZCB3aGVuIGEgY2hhcmFjdGVyIGlzIGZvdW5kIHRvIGFjdHVhbGx5IGhhdmUgYVxuLy8gY29kZSBwb2ludCBiZXR3ZWVuIDB4ODAgYW5kIDB4ZmZmZi5cbi8vIEdlbmVyYXRlZCBieSBgc2NyaXB0cy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cblxuLyogcHJldHRpZXItaWdub3JlICovXG5sZXQgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9IFwiXFx4YWFcXHhiNVxceGJhXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyYzFcXHUwMmM2LVxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVjXFx1MDJlZVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3YS1cXHUwMzdkXFx1MDM3ZlxcdTAzODZcXHUwMzg4LVxcdTAzOGFcXHUwMzhjXFx1MDM4ZS1cXHUwM2ExXFx1MDNhMy1cXHUwM2Y1XFx1MDNmNy1cXHUwNDgxXFx1MDQ4YS1cXHUwNTJmXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjAtXFx1MDU4OFxcdTA1ZDAtXFx1MDVlYVxcdTA1ZWYtXFx1MDVmMlxcdTA2MjAtXFx1MDY0YVxcdTA2NmVcXHUwNjZmXFx1MDY3MS1cXHUwNmQzXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA2ZmNcXHUwNmZmXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGQtXFx1MDdhNVxcdTA3YjFcXHUwN2NhLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmFcXHUwODAwLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NmFcXHUwODcwLVxcdTA4ODdcXHUwODg5LVxcdTA4OGVcXHUwOGEwLVxcdTA4YzlcXHUwOTA0LVxcdTA5MzlcXHUwOTNkXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Y1xcdTA5OGZcXHUwOTkwXFx1MDk5My1cXHUwOWE4XFx1MDlhYS1cXHUwOWIwXFx1MDliMlxcdTA5YjYtXFx1MDliOVxcdTA5YmRcXHUwOWNlXFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWYwXFx1MDlmMVxcdTA5ZmNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTcyLVxcdTBhNzRcXHUwYTg1LVxcdTBhOGRcXHUwYThmLVxcdTBhOTFcXHUwYTkzLVxcdTBhYThcXHUwYWFhLVxcdTBhYjBcXHUwYWIyXFx1MGFiM1xcdTBhYjUtXFx1MGFiOVxcdTBhYmRcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWY5XFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNzFcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiZDBcXHUwYzA1LVxcdTBjMGNcXHUwYzBlLVxcdTBjMTBcXHUwYzEyLVxcdTBjMjhcXHUwYzJhLVxcdTBjMzlcXHUwYzNkXFx1MGM1OC1cXHUwYzVhXFx1MGM1ZFxcdTBjNjBcXHUwYzYxXFx1MGM4MFxcdTBjODUtXFx1MGM4Y1xcdTBjOGUtXFx1MGM5MFxcdTBjOTItXFx1MGNhOFxcdTBjYWEtXFx1MGNiM1xcdTBjYjUtXFx1MGNiOVxcdTBjYmRcXHUwY2RkXFx1MGNkZVxcdTBjZTBcXHUwY2UxXFx1MGNmMVxcdTBjZjJcXHUwZDA0LVxcdTBkMGNcXHUwZDBlLVxcdTBkMTBcXHUwZDEyLVxcdTBkM2FcXHUwZDNkXFx1MGQ0ZVxcdTBkNTQtXFx1MGQ1NlxcdTBkNWYtXFx1MGQ2MVxcdTBkN2EtXFx1MGQ3ZlxcdTBkODUtXFx1MGQ5NlxcdTBkOWEtXFx1MGRiMVxcdTBkYjMtXFx1MGRiYlxcdTBkYmRcXHUwZGMwLVxcdTBkYzZcXHUwZTAxLVxcdTBlMzBcXHUwZTMyXFx1MGUzM1xcdTBlNDAtXFx1MGU0NlxcdTBlODFcXHUwZTgyXFx1MGU4NFxcdTBlODYtXFx1MGU4YVxcdTBlOGMtXFx1MGVhM1xcdTBlYTVcXHUwZWE3LVxcdTBlYjBcXHUwZWIyXFx1MGViM1xcdTBlYmRcXHUwZWMwLVxcdTBlYzRcXHUwZWM2XFx1MGVkYy1cXHUwZWRmXFx1MGYwMFxcdTBmNDAtXFx1MGY0N1xcdTBmNDktXFx1MGY2Y1xcdTBmODgtXFx1MGY4Y1xcdTEwMDAtXFx1MTAyYVxcdTEwM2ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVhLVxcdTEwNWRcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZlLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhlXFx1MTBhMC1cXHUxMGM1XFx1MTBjN1xcdTEwY2RcXHUxMGQwLVxcdTEwZmFcXHUxMGZjLVxcdTEyNDhcXHUxMjRhLVxcdTEyNGRcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1YS1cXHUxMjVkXFx1MTI2MC1cXHUxMjg4XFx1MTI4YS1cXHUxMjhkXFx1MTI5MC1cXHUxMmIwXFx1MTJiMi1cXHUxMmI1XFx1MTJiOC1cXHUxMmJlXFx1MTJjMFxcdTEyYzItXFx1MTJjNVxcdTEyYzgtXFx1MTJkNlxcdTEyZDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1YVxcdTEzODAtXFx1MTM4ZlxcdTEzYTAtXFx1MTNmNVxcdTEzZjgtXFx1MTNmZFxcdTE0MDEtXFx1MTY2Y1xcdTE2NmYtXFx1MTY3ZlxcdTE2ODEtXFx1MTY5YVxcdTE2YTAtXFx1MTZlYVxcdTE2ZWUtXFx1MTZmOFxcdTE3MDAtXFx1MTcxMVxcdTE3MWYtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Y1xcdTE3NmUtXFx1MTc3MFxcdTE3ODAtXFx1MTdiM1xcdTE3ZDdcXHUxN2RjXFx1MTgyMC1cXHUxODc4XFx1MTg4MC1cXHUxOGE4XFx1MThhYVxcdTE4YjAtXFx1MThmNVxcdTE5MDAtXFx1MTkxZVxcdTE5NTAtXFx1MTk2ZFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlhYlxcdTE5YjAtXFx1MTljOVxcdTFhMDAtXFx1MWExNlxcdTFhMjAtXFx1MWE1NFxcdTFhYTdcXHUxYjA1LVxcdTFiMzNcXHUxYjQ1LVxcdTFiNGNcXHUxYjgzLVxcdTFiYTBcXHUxYmFlXFx1MWJhZlxcdTFiYmEtXFx1MWJlNVxcdTFjMDAtXFx1MWMyM1xcdTFjNGQtXFx1MWM0ZlxcdTFjNWEtXFx1MWM3ZFxcdTFjODAtXFx1MWM4OFxcdTFjOTAtXFx1MWNiYVxcdTFjYmQtXFx1MWNiZlxcdTFjZTktXFx1MWNlY1xcdTFjZWUtXFx1MWNmM1xcdTFjZjVcXHUxY2Y2XFx1MWNmYVxcdTFkMDAtXFx1MWRiZlxcdTFlMDAtXFx1MWYxNVxcdTFmMTgtXFx1MWYxZFxcdTFmMjAtXFx1MWY0NVxcdTFmNDgtXFx1MWY0ZFxcdTFmNTAtXFx1MWY1N1xcdTFmNTlcXHUxZjViXFx1MWY1ZFxcdTFmNWYtXFx1MWY3ZFxcdTFmODAtXFx1MWZiNFxcdTFmYjYtXFx1MWZiY1xcdTFmYmVcXHUxZmMyLVxcdTFmYzRcXHUxZmM2LVxcdTFmY2NcXHUxZmQwLVxcdTFmZDNcXHUxZmQ2LVxcdTFmZGJcXHUxZmUwLVxcdTFmZWNcXHUxZmYyLVxcdTFmZjRcXHUxZmY2LVxcdTFmZmNcXHUyMDcxXFx1MjA3ZlxcdTIwOTAtXFx1MjA5Y1xcdTIxMDJcXHUyMTA3XFx1MjEwYS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExZFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMmEtXFx1MjEzOVxcdTIxM2MtXFx1MjEzZlxcdTIxNDUtXFx1MjE0OVxcdTIxNGVcXHUyMTYwLVxcdTIxODhcXHUyYzAwLVxcdTJjZTRcXHUyY2ViLVxcdTJjZWVcXHUyY2YyXFx1MmNmM1xcdTJkMDAtXFx1MmQyNVxcdTJkMjdcXHUyZDJkXFx1MmQzMC1cXHUyZDY3XFx1MmQ2ZlxcdTJkODAtXFx1MmQ5NlxcdTJkYTAtXFx1MmRhNlxcdTJkYTgtXFx1MmRhZVxcdTJkYjAtXFx1MmRiNlxcdTJkYjgtXFx1MmRiZVxcdTJkYzAtXFx1MmRjNlxcdTJkYzgtXFx1MmRjZVxcdTJkZDAtXFx1MmRkNlxcdTJkZDgtXFx1MmRkZVxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzY1xcdTMwNDEtXFx1MzA5NlxcdTMwOWItXFx1MzA5ZlxcdTMwYTEtXFx1MzBmYVxcdTMwZmMtXFx1MzBmZlxcdTMxMDUtXFx1MzEyZlxcdTMxMzEtXFx1MzE4ZVxcdTMxYTAtXFx1MzFiZlxcdTMxZjAtXFx1MzFmZlxcdTM0MDAtXFx1NGRiZlxcdTRlMDAtXFx1YTQ4Y1xcdWE0ZDAtXFx1YTRmZFxcdWE1MDAtXFx1YTYwY1xcdWE2MTAtXFx1YTYxZlxcdWE2MmFcXHVhNjJiXFx1YTY0MC1cXHVhNjZlXFx1YTY3Zi1cXHVhNjlkXFx1YTZhMC1cXHVhNmVmXFx1YTcxNy1cXHVhNzFmXFx1YTcyMi1cXHVhNzg4XFx1YTc4Yi1cXHVhN2NhXFx1YTdkMFxcdWE3ZDFcXHVhN2QzXFx1YTdkNS1cXHVhN2Q5XFx1YTdmMi1cXHVhODAxXFx1YTgwMy1cXHVhODA1XFx1YTgwNy1cXHVhODBhXFx1YTgwYy1cXHVhODIyXFx1YTg0MC1cXHVhODczXFx1YTg4Mi1cXHVhOGIzXFx1YThmMi1cXHVhOGY3XFx1YThmYlxcdWE4ZmRcXHVhOGZlXFx1YTkwYS1cXHVhOTI1XFx1YTkzMC1cXHVhOTQ2XFx1YTk2MC1cXHVhOTdjXFx1YTk4NC1cXHVhOWIyXFx1YTljZlxcdWE5ZTAtXFx1YTllNFxcdWE5ZTYtXFx1YTllZlxcdWE5ZmEtXFx1YTlmZVxcdWFhMDAtXFx1YWEyOFxcdWFhNDAtXFx1YWE0MlxcdWFhNDQtXFx1YWE0YlxcdWFhNjAtXFx1YWE3NlxcdWFhN2FcXHVhYTdlLVxcdWFhYWZcXHVhYWIxXFx1YWFiNVxcdWFhYjZcXHVhYWI5LVxcdWFhYmRcXHVhYWMwXFx1YWFjMlxcdWFhZGItXFx1YWFkZFxcdWFhZTAtXFx1YWFlYVxcdWFhZjItXFx1YWFmNFxcdWFiMDEtXFx1YWIwNlxcdWFiMDktXFx1YWIwZVxcdWFiMTEtXFx1YWIxNlxcdWFiMjAtXFx1YWIyNlxcdWFiMjgtXFx1YWIyZVxcdWFiMzAtXFx1YWI1YVxcdWFiNWMtXFx1YWI2OVxcdWFiNzAtXFx1YWJlMlxcdWFjMDAtXFx1ZDdhM1xcdWQ3YjAtXFx1ZDdjNlxcdWQ3Y2ItXFx1ZDdmYlxcdWY5MDAtXFx1ZmE2ZFxcdWZhNzAtXFx1ZmFkOVxcdWZiMDAtXFx1ZmIwNlxcdWZiMTMtXFx1ZmIxN1xcdWZiMWRcXHVmYjFmLVxcdWZiMjhcXHVmYjJhLVxcdWZiMzZcXHVmYjM4LVxcdWZiM2NcXHVmYjNlXFx1ZmI0MFxcdWZiNDFcXHVmYjQzXFx1ZmI0NFxcdWZiNDYtXFx1ZmJiMVxcdWZiZDMtXFx1ZmQzZFxcdWZkNTAtXFx1ZmQ4ZlxcdWZkOTItXFx1ZmRjN1xcdWZkZjAtXFx1ZmRmYlxcdWZlNzAtXFx1ZmU3NFxcdWZlNzYtXFx1ZmVmY1xcdWZmMjEtXFx1ZmYzYVxcdWZmNDEtXFx1ZmY1YVxcdWZmNjYtXFx1ZmZiZVxcdWZmYzItXFx1ZmZjN1xcdWZmY2EtXFx1ZmZjZlxcdWZmZDItXFx1ZmZkN1xcdWZmZGEtXFx1ZmZkY1wiO1xuLyogcHJldHRpZXItaWdub3JlICovXG5sZXQgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBcIlxcdTIwMGNcXHUyMDBkXFx4YjdcXHUwMzAwLVxcdTAzNmZcXHUwMzg3XFx1MDQ4My1cXHUwNDg3XFx1MDU5MS1cXHUwNWJkXFx1MDViZlxcdTA1YzFcXHUwNWMyXFx1MDVjNFxcdTA1YzVcXHUwNWM3XFx1MDYxMC1cXHUwNjFhXFx1MDY0Yi1cXHUwNjY5XFx1MDY3MFxcdTA2ZDYtXFx1MDZkY1xcdTA2ZGYtXFx1MDZlNFxcdTA2ZTdcXHUwNmU4XFx1MDZlYS1cXHUwNmVkXFx1MDZmMC1cXHUwNmY5XFx1MDcxMVxcdTA3MzAtXFx1MDc0YVxcdTA3YTYtXFx1MDdiMFxcdTA3YzAtXFx1MDdjOVxcdTA3ZWItXFx1MDdmM1xcdTA3ZmRcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwODU5LVxcdTA4NWJcXHUwODk4LVxcdTA4OWZcXHUwOGNhLVxcdTA4ZTFcXHUwOGUzLVxcdTA5MDNcXHUwOTNhLVxcdTA5M2NcXHUwOTNlLVxcdTA5NGZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5NjYtXFx1MDk2ZlxcdTA5ODEtXFx1MDk4M1xcdTA5YmNcXHUwOWJlLVxcdTA5YzRcXHUwOWM3XFx1MDljOFxcdTA5Y2ItXFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTA5ZTYtXFx1MDllZlxcdTA5ZmVcXHUwYTAxLVxcdTBhMDNcXHUwYTNjXFx1MGEzZS1cXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE2Ni1cXHUwYTcxXFx1MGE3NVxcdTBhODEtXFx1MGE4M1xcdTBhYmNcXHUwYWJlLVxcdTBhYzVcXHUwYWM3LVxcdTBhYzlcXHUwYWNiLVxcdTBhY2RcXHUwYWUyXFx1MGFlM1xcdTBhZTYtXFx1MGFlZlxcdTBhZmEtXFx1MGFmZlxcdTBiMDEtXFx1MGIwM1xcdTBiM2NcXHUwYjNlLVxcdTBiNDRcXHUwYjQ3XFx1MGI0OFxcdTBiNGItXFx1MGI0ZFxcdTBiNTUtXFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI2Ni1cXHUwYjZmXFx1MGI4MlxcdTBiYmUtXFx1MGJjMlxcdTBiYzYtXFx1MGJjOFxcdTBiY2EtXFx1MGJjZFxcdTBiZDdcXHUwYmU2LVxcdTBiZWZcXHUwYzAwLVxcdTBjMDRcXHUwYzNjXFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGNmM1xcdTBkMDAtXFx1MGQwM1xcdTBkM2JcXHUwZDNjXFx1MGQzZS1cXHUwZDQ0XFx1MGQ0Ni1cXHUwZDQ4XFx1MGQ0YS1cXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGQ2Ni1cXHUwZDZmXFx1MGQ4MS1cXHUwZDgzXFx1MGRjYVxcdTBkY2YtXFx1MGRkNFxcdTBkZDZcXHUwZGQ4LVxcdTBkZGZcXHUwZGU2LVxcdTBkZWZcXHUwZGYyXFx1MGRmM1xcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZTUwLVxcdTBlNTlcXHUwZWIxXFx1MGViNC1cXHUwZWJjXFx1MGVjOC1cXHUwZWNlXFx1MGVkMC1cXHUwZWQ5XFx1MGYxOFxcdTBmMTlcXHUwZjIwLVxcdTBmMjlcXHUwZjM1XFx1MGYzN1xcdTBmMzlcXHUwZjNlXFx1MGYzZlxcdTBmNzEtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY4ZC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmItXFx1MTAzZVxcdTEwNDAtXFx1MTA0OVxcdTEwNTYtXFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNjItXFx1MTA2NFxcdTEwNjctXFx1MTA2ZFxcdTEwNzEtXFx1MTA3NFxcdTEwODItXFx1MTA4ZFxcdTEwOGYtXFx1MTA5ZFxcdTEzNWQtXFx1MTM1ZlxcdTEzNjktXFx1MTM3MVxcdTE3MTItXFx1MTcxNVxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I0LVxcdTE3ZDNcXHUxN2RkXFx1MTdlMC1cXHUxN2U5XFx1MTgwYi1cXHUxODBkXFx1MTgwZi1cXHUxODE5XFx1MThhOVxcdTE5MjAtXFx1MTkyYlxcdTE5MzAtXFx1MTkzYlxcdTE5NDYtXFx1MTk0ZlxcdTE5ZDAtXFx1MTlkYVxcdTFhMTctXFx1MWExYlxcdTFhNTUtXFx1MWE1ZVxcdTFhNjAtXFx1MWE3Y1xcdTFhN2YtXFx1MWE4OVxcdTFhOTAtXFx1MWE5OVxcdTFhYjAtXFx1MWFiZFxcdTFhYmYtXFx1MWFjZVxcdTFiMDAtXFx1MWIwNFxcdTFiMzQtXFx1MWI0NFxcdTFiNTAtXFx1MWI1OVxcdTFiNmItXFx1MWI3M1xcdTFiODAtXFx1MWI4MlxcdTFiYTEtXFx1MWJhZFxcdTFiYjAtXFx1MWJiOVxcdTFiZTYtXFx1MWJmM1xcdTFjMjQtXFx1MWMzN1xcdTFjNDAtXFx1MWM0OVxcdTFjNTAtXFx1MWM1OVxcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlOFxcdTFjZWRcXHUxY2Y0XFx1MWNmNy1cXHUxY2Y5XFx1MWRjMC1cXHUxZGZmXFx1MjAzZlxcdTIwNDBcXHUyMDU0XFx1MjBkMC1cXHUyMGRjXFx1MjBlMVxcdTIwZTUtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkN2ZcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2MjAtXFx1YTYyOVxcdWE2NmZcXHVhNjc0LVxcdWE2N2RcXHVhNjllXFx1YTY5ZlxcdWE2ZjBcXHVhNmYxXFx1YTgwMlxcdWE4MDZcXHVhODBiXFx1YTgyMy1cXHVhODI3XFx1YTgyY1xcdWE4ODBcXHVhODgxXFx1YThiNC1cXHVhOGM1XFx1YThkMC1cXHVhOGQ5XFx1YThlMC1cXHVhOGYxXFx1YThmZi1cXHVhOTA5XFx1YTkyNi1cXHVhOTJkXFx1YTk0Ny1cXHVhOTUzXFx1YTk4MC1cXHVhOTgzXFx1YTliMy1cXHVhOWMwXFx1YTlkMC1cXHVhOWQ5XFx1YTllNVxcdWE5ZjAtXFx1YTlmOVxcdWFhMjktXFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWE0ZFxcdWFhNTAtXFx1YWE1OVxcdWFhN2ItXFx1YWE3ZFxcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFhZWItXFx1YWFlZlxcdWFhZjVcXHVhYWY2XFx1YWJlMy1cXHVhYmVhXFx1YWJlY1xcdWFiZWRcXHVhYmYwLVxcdWFiZjlcXHVmYjFlXFx1ZmUwMC1cXHVmZTBmXFx1ZmUyMC1cXHVmZTJmXFx1ZmUzM1xcdWZlMzRcXHVmZTRkLVxcdWZlNGZcXHVmZjEwLVxcdWZmMTlcXHVmZjNmXCI7XG5cbmNvbnN0IG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0ID0gbmV3IFJlZ0V4cChcbiAgXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgXCJdXCIsXG4pO1xuY29uc3Qgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cChcbiAgXCJbXCIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgKyBcIl1cIixcbik7XG5cbm5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgPSBub25BU0NJSWlkZW50aWZpZXJDaGFycyA9IG51bGw7XG5cbi8vIFRoZXNlIGFyZSBhIHJ1bi1sZW5ndGggYW5kIG9mZnNldC1lbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuLy8gPjB4ZmZmZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBhIHZhbGlkIHBhcnQgb2YgaWRlbnRpZmllcnMuIFRoZVxuLy8gb2Zmc2V0IHN0YXJ0cyBhdCAweDEwMDAwLCBhbmQgZWFjaCBwYWlyIG9mIG51bWJlcnMgcmVwcmVzZW50cyBhblxuLy8gb2Zmc2V0IHRvIHRoZSBuZXh0IHJhbmdlLCBhbmQgdGhlbiBhIHNpemUgb2YgdGhlIHJhbmdlLiBUaGV5IHdlcmVcbi8vIGdlbmVyYXRlZCBieSBgc2NyaXB0cy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3QgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMgPSBbMCwxMSwyLDI1LDIsMTgsMiwxLDIsMTQsMywxMywzNSwxMjIsNzAsNTIsMjY4LDI4LDQsNDgsNDgsMzEsMTQsMjksNiwzNywxMSwyOSwzLDM1LDUsNywyLDQsNDMsMTU3LDE5LDM1LDUsMzUsNSwzOSw5LDUxLDEzLDEwLDIsMTQsMiw2LDIsMSwyLDEwLDIsMTQsMiw2LDIsMSw2OCwzMTAsMTAsMjEsMTEsNywyNSw1LDIsNDEsMiw4LDcwLDUsMywwLDIsNDMsMiwxLDQsMCwzLDIyLDExLDIyLDEwLDMwLDY2LDE4LDIsMSwxMSwyMSwxMSwyNSw3MSw1NSw3LDEsNjUsMCwxNiwzLDIsMiwyLDI4LDQzLDI4LDQsMjgsMzYsNywyLDI3LDI4LDUzLDExLDIxLDExLDE4LDE0LDE3LDExMSw3Miw1Niw1MCwxNCw1MCwxNCwzNSwzNDksNDEsNywxLDc5LDI4LDExLDAsOSwyMSw0MywxNyw0NywyMCwyOCwyMiwxMyw1Miw1OCwxLDMsMCwxNCw0NCwzMywyNCwyNywzNSwzMCwwLDMsMCw5LDM0LDQsMCwxMyw0NywxNSwzLDIyLDAsMiwwLDM2LDE3LDIsMjQsMjAsMSw2NCw2LDIsMCwyLDMsMiwxNCwyLDksOCw0NiwzOSw3LDMsMSwzLDIxLDIsNiwyLDEsMiw0LDQsMCwxOSwwLDEzLDQsMTU5LDUyLDE5LDMsMjEsMiwzMSw0NywyMSwxLDIsMCwxODUsNDYsNDIsMywzNyw0NywyMSwwLDYwLDQyLDE0LDAsNzIsMjYsMzgsNiwxODYsNDMsMTE3LDYzLDMyLDcsMywwLDMsNywyLDEsMiwyMywxNiwwLDIsMCw5NSw3LDMsMzgsMTcsMCwyLDAsMjksMCwxMSwzOSw4LDAsMjIsMCwxMiw0NSwyMCwwLDE5LDcyLDI2NCw4LDIsMzYsMTgsMCw1MCwyOSwxMTMsNiwyLDEsMiwzNywyMiwwLDI2LDUsMiwxLDIsMzEsMTUsMCwzMjgsMTgsMTYsMCwyLDEyLDIsMzMsMTI1LDAsODAsOTIxLDEwMywxMTAsMTgsMTk1LDI2MzcsOTYsMTYsMTA3MSwxOCw1LDQwMjYsNTgyLDg2MzQsNTY4LDgsMzAsMTgsNzgsMTgsMjksMTksNDcsMTcsMywzMiwyMCw2LDE4LDY4OSw2MywxMjksNzQsNiwwLDY3LDEyLDY1LDEsMiwwLDI5LDYxMzUsOSwxMjM3LDQzLDgsODkzNiwzLDIsNiwyLDEsMiwyOTAsMTYsMCwzMCwyLDMsMCwxNSwzLDksMzk1LDIzMDksMTA2LDYsMTIsNCw4LDgsOSw1OTkxLDg0LDIsNzAsMiwxLDMsMCwzLDEsMywzLDIsMTEsMiwwLDIsNiwyLDY0LDIsMywzLDcsMiw2LDIsMjcsMiwzLDIsNCwyLDAsNCw2LDIsMzM5LDMsMjQsMiwyNCwyLDMwLDIsMjQsMiwzMCwyLDI0LDIsMzAsMiwyNCwyLDMwLDIsMjQsMiw3LDE4NDUsMzAsNyw1LDI2Miw2MSwxNDcsNDQsMTEsNiwxNywwLDMyMiwyOSwxOSw0Myw0ODUsMjcsNzU3LDYsMiwzLDIsMSwyLDE0LDIsMTk2LDYwLDY3LDgsMCwxMjA1LDMsMiwyNiwyLDEsMiwwLDMsMCwyLDksMiwzLDIsMCwyLDAsNywwLDUsMCwyLDAsMiwwLDIsMiwyLDEsMiwwLDMsMCwyLDAsMiwwLDIsMCwyLDAsMiwxLDIsMCwzLDMsMiw2LDIsMywyLDMsMiwwLDIsOSwyLDE2LDYsMiwyLDQsMiwxNiw0NDIxLDQyNzE5LDMzLDQxNTMsNywyMjEsMyw1NzYxLDE1LDc0NzIsMzEwNCw1NDEsMTUwNyw0OTM4LDYsNDE5MV07XG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmNvbnN0IGFzdHJhbElkZW50aWZpZXJDb2RlcyA9IFs1MDksMCwyMjcsMCwxNTAsNCwyOTQsOSwxMzY4LDIsMiwxLDYsMyw0MSwyLDUsMCwxNjYsMSw1NzQsMyw5LDksMzcwLDEsODEsMiw3MSwxMCw1MCwzLDEyMywyLDU0LDE0LDMyLDEwLDMsMSwxMSwzLDQ2LDEwLDgsMCw0Niw5LDcsMiwzNywxMywyLDksNiwxLDQ1LDAsMTMsMiw0OSwxMyw5LDMsMiwxMSw4MywxMSw3LDAsMywwLDE1OCwxMSw2LDksNywzLDU2LDEsMiw2LDMsMSwzLDIsMTAsMCwxMSwxLDMsNiw0LDQsMTkzLDE3LDEwLDksNSwwLDgyLDE5LDEzLDksMjE0LDYsMyw4LDI4LDEsODMsMTYsMTYsOSw4MiwxMiw5LDksODQsMTQsNSw5LDI0MywxNCwxNjYsOSw3MSw1LDIsMSwzLDMsMiwwLDIsMSwxMyw5LDEyMCw2LDMsNiw0LDAsMjksOSw0MSw2LDIsMyw5LDAsMTAsMTAsNDcsMTUsNDA2LDcsMiw3LDE3LDksNTcsMjEsMiwxMywxMjMsNSw0LDAsMiwxLDIsNiwyLDAsOSw5LDQ5LDQsMiwxLDIsNCw5LDksMzMwLDMsMTAsMSwyLDAsNDksNiw0LDQsMTQsOSw1MzUxLDAsNywxNCwxMzgzNSw5LDg3LDksMzksNCw2MCw2LDI2LDksMTAxNCwwLDIsNTQsOCwzLDgyLDAsMTIsMSwxOTYyOCwxLDQ3MDYsNDUsMywyMiw1NDMsNCw0LDUsOSw3LDMsNiwzMSwzLDE0OSwyLDE0MTgsNDksNTEzLDU0LDUsNDksOSwwLDE1LDAsMjMsNCwyLDE0LDEzNjEsNiwyLDE2LDMsNiwyLDEsMiw0LDEwMSwwLDE2MSw2LDEwLDksMzU3LDAsNjIsMTMsNDk5LDEzLDk4Myw2LDExMCw2LDYsOSw0NzU5LDksNzg3NzE5LDIzOV07XG5cbi8vIFRoaXMgaGFzIGEgY29tcGxleGl0eSBsaW5lYXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlLiBUaGVcbi8vIGFzc3VtcHRpb24gaXMgdGhhdCBsb29raW5nIHVwIGFzdHJhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgaXNcbi8vIHJhcmUuXG5mdW5jdGlvbiBpc0luQXN0cmFsU2V0KGNvZGU6IG51bWJlciwgc2V0OiByZWFkb25seSBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBsZXQgcG9zID0gMHgxMDAwMDtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHNldC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMikge1xuICAgIHBvcyArPSBzZXRbaV07XG4gICAgaWYgKHBvcyA+IGNvZGUpIHJldHVybiBmYWxzZTtcblxuICAgIHBvcyArPSBzZXRbaSArIDFdO1xuICAgIGlmIChwb3MgPj0gY29kZSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBzdGFydHMgYW4gaWRlbnRpZmllci5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoY29kZSA8IGNoYXJDb2Rlcy51cHBlcmNhc2VBKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ247XG4gIGlmIChjb2RlIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VaKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMubG93ZXJjYXNlQSkgcmV0dXJuIGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMubG93ZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikge1xuICAgIHJldHVybiAoXG4gICAgICBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpO1xufVxuXG4vLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyQ2hhcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMuZGlnaXQwKSByZXR1cm4gY29kZSA9PT0gY2hhckNvZGVzLmRvbGxhclNpZ247XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLmNvbG9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPCBjaGFyQ29kZXMudXBwZXJjYXNlQSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY29kZSA8PSBjaGFyQ29kZXMudXBwZXJjYXNlWikgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlIDwgY2hhckNvZGVzLmxvd2VyY2FzZUEpIHJldHVybiBjb2RlID09PSBjaGFyQ29kZXMudW5kZXJzY29yZTtcbiAgaWYgKGNvZGUgPD0gY2hhckNvZGVzLmxvd2VyY2FzZVopIHJldHVybiB0cnVlO1xuICBpZiAoY29kZSA8PSAweGZmZmYpIHtcbiAgICByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpO1xuICB9XG4gIHJldHVybiAoXG4gICAgaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcykgfHxcbiAgICBpc0luQXN0cmFsU2V0KGNvZGUsIGFzdHJhbElkZW50aWZpZXJDb2RlcylcbiAgKTtcbn1cblxuLy8gVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBuYW1lXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykge1xuICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvblxuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXI6djgvc3JjL2J1aWx0aW5zL2J1aWx0aW5zLXN0cmluZy1nZW4uY2M7bD0xNDU1O2RyYz0yMjFlMzMxYjQ5ZGZlZmFkYmM2ZmE0MGIwYzY4ZTZmOTc2MDZkMGIzO2Jwdj0wO2JwdD0xXG4gICAgLy8gV2UgcmVpbXBsZW1lbnQgYGNvZGVQb2ludEF0YCBiZWNhdXNlIGBjb2RlUG9pbnRBdGAgaXMgYSBWOCBidWlsdGluIHdoaWNoIGlzIG5vdCBpbmxpbmVkIGJ5IFR1cmJvRmFuIChhcyBvZiBNOTEpXG4gICAgLy8gc2luY2UgYG5hbWVgIGlzIG1vc3RseSBBU0NJSSwgYW4gaW5saW5lZCBgY2hhckNvZGVBdGAgd2lucyBoZXJlXG4gICAgbGV0IGNwID0gbmFtZS5jaGFyQ29kZUF0KGkpO1xuICAgIGlmICgoY3AgJiAweGZjMDApID09PSAweGQ4MDAgJiYgaSArIDEgPCBuYW1lLmxlbmd0aCkge1xuICAgICAgY29uc3QgdHJhaWwgPSBuYW1lLmNoYXJDb2RlQXQoKytpKTtcbiAgICAgIGlmICgodHJhaWwgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgY3AgPSAweDEwMDAwICsgKChjcCAmIDB4M2ZmKSA8PCAxMCkgKyAodHJhaWwgJiAweDNmZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgICBpZiAoIWlzSWRlbnRpZmllclN0YXJ0KGNwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNJZGVudGlmaWVyQ2hhcihjcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICFpc0ZpcnN0O1xufVxuIiwgImNvbnN0IHJlc2VydmVkV29yZHMgPSB7XG4gIGtleXdvcmQ6IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjYXRjaFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlYnVnZ2VyXCIsXG4gICAgXCJkZWZhdWx0XCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZmluYWxseVwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwiaWZcIixcbiAgICBcInJldHVyblwiLFxuICAgIFwic3dpdGNoXCIsXG4gICAgXCJ0aHJvd1wiLFxuICAgIFwidHJ5XCIsXG4gICAgXCJ2YXJcIixcbiAgICBcImNvbnN0XCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwid2l0aFwiLFxuICAgIFwibmV3XCIsXG4gICAgXCJ0aGlzXCIsXG4gICAgXCJzdXBlclwiLFxuICAgIFwiY2xhc3NcIixcbiAgICBcImV4dGVuZHNcIixcbiAgICBcImV4cG9ydFwiLFxuICAgIFwiaW1wb3J0XCIsXG4gICAgXCJudWxsXCIsXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiaW5cIixcbiAgICBcImluc3RhbmNlb2ZcIixcbiAgICBcInR5cGVvZlwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwiZGVsZXRlXCIsXG4gIF0sXG4gIHN0cmljdDogW1xuICAgIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW50ZXJmYWNlXCIsXG4gICAgXCJsZXRcIixcbiAgICBcInBhY2thZ2VcIixcbiAgICBcInByaXZhdGVcIixcbiAgICBcInByb3RlY3RlZFwiLFxuICAgIFwicHVibGljXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInlpZWxkXCIsXG4gIF0sXG4gIHN0cmljdEJpbmQ6IFtcImV2YWxcIiwgXCJhcmd1bWVudHNcIl0sXG59O1xuY29uc3Qga2V5d29yZHMgPSBuZXcgU2V0KHJlc2VydmVkV29yZHMua2V5d29yZCk7XG5jb25zdCByZXNlcnZlZFdvcmRzU3RyaWN0U2V0ID0gbmV3IFNldChyZXNlcnZlZFdvcmRzLnN0cmljdCk7XG5jb25zdCByZXNlcnZlZFdvcmRzU3RyaWN0QmluZFNldCA9IG5ldyBTZXQocmVzZXJ2ZWRXb3Jkcy5zdHJpY3RCaW5kKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gbm9uLXN0cmljdCBtb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcsIGluTW9kdWxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoaW5Nb2R1bGUgJiYgd29yZCA9PT0gXCJhd2FpdFwiKSB8fCB3b3JkID09PSBcImVudW1cIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gbm9uLWJpbmRpbmcgc3RyaWN0IG1vZGVcbiAqXG4gKiBJbmNsdWRlcyBub24tc3RyaWN0IHJlc2VydmVkIHdvcmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmljdFJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcsIGluTW9kdWxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Jlc2VydmVkV29yZCh3b3JkLCBpbk1vZHVsZSkgfHwgcmVzZXJ2ZWRXb3Jkc1N0cmljdFNldC5oYXMod29yZCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHdvcmQgaXMgYSByZXNlcnZlZCB3b3JkIGluIGJpbmRpbmcgc3RyaWN0IG1vZGUsIGJ1dCBpdCBpcyBhbGxvd2VkIGFzXG4gKiBhIG5vcm1hbCBpZGVudGlmaWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RCaW5kT25seVJlc2VydmVkV29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc2VydmVkV29yZHNTdHJpY3RCaW5kU2V0Lmhhcyh3b3JkKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgd29yZCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gYmluZGluZyBzdHJpY3QgbW9kZVxuICpcbiAqIEluY2x1ZGVzIG5vbi1zdHJpY3QgcmVzZXJ2ZWQgd29yZHMgYW5kIG5vbi1iaW5kaW5nIHN0cmljdCByZXNlcnZlZCB3b3Jkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpY3RCaW5kUmVzZXJ2ZWRXb3JkKFxuICB3b3JkOiBzdHJpbmcsXG4gIGluTW9kdWxlOiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNTdHJpY3RSZXNlcnZlZFdvcmQod29yZCwgaW5Nb2R1bGUpIHx8IGlzU3RyaWN0QmluZE9ubHlSZXNlcnZlZFdvcmQod29yZClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5d29yZCh3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGtleXdvcmRzLmhhcyh3b3JkKTtcbn1cbiIsICJleHBvcnQge1xuICBpc0lkZW50aWZpZXJOYW1lLFxuICBpc0lkZW50aWZpZXJDaGFyLFxuICBpc0lkZW50aWZpZXJTdGFydCxcbn0gZnJvbSBcIi4vaWRlbnRpZmllclwiO1xuZXhwb3J0IHtcbiAgaXNSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZE9ubHlSZXNlcnZlZFdvcmQsXG4gIGlzU3RyaWN0QmluZFJlc2VydmVkV29yZCxcbiAgaXNTdHJpY3RSZXNlcnZlZFdvcmQsXG4gIGlzS2V5d29yZCxcbn0gZnJvbSBcIi4va2V5d29yZFwiO1xuIiwgImltcG9ydCB7XG4gIGlzSWRlbnRpZmllck5hbWUsXG4gIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkLFxuICBpc0tleXdvcmQsXG59IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBuYW1lYCBpcyBhIHZhbGlkIGlkZW50aWZpZXIgbmFtZVxuICogYW5kIGlzbid0IGEgcmVzZXJ2ZWQgd29yZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZElkZW50aWZpZXIoXG4gIG5hbWU6IHN0cmluZyxcbiAgcmVzZXJ2ZWQ6IGJvb2xlYW4gPSB0cnVlLFxuKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChyZXNlcnZlZCkge1xuICAgIC8vIFwiYXdhaXRcIiBpcyBpbnZhbGlkIGluIG1vZHVsZSwgdmFsaWQgaW4gc2NyaXB0OyBiZXR0ZXIgYmUgc2FmZSAoc2VlICM0OTUyKVxuICAgIGlmIChpc0tleXdvcmQobmFtZSkgfHwgaXNTdHJpY3RSZXNlcnZlZFdvcmQobmFtZSwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNJZGVudGlmaWVyTmFtZShuYW1lKTtcbn1cbiIsICJpbXBvcnQgKiBhcyBjaGFyQ29kZXMgZnJvbSBcImNoYXJjb2Rlc1wiO1xuXG4vLyBUaGUgZm9sbG93aW5nIGNoYXJhY3RlciBjb2RlcyBhcmUgZm9yYmlkZGVuIGZyb20gYmVpbmdcbi8vIGFuIGltbWVkaWF0ZSBzaWJsaW5nIG9mIE51bWVyaWNMaXRlcmFsU2VwYXJhdG9yIF9cbmNvbnN0IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncyA9IHtcbiAgZGVjQmluT2N0OiBuZXcgU2V0PG51bWJlcj4oW1xuICAgIGNoYXJDb2Rlcy5kb3QsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZUIsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZUUsXG4gICAgY2hhckNvZGVzLnVwcGVyY2FzZU8sXG4gICAgY2hhckNvZGVzLnVuZGVyc2NvcmUsIC8vIG11bHRpcGxlIHNlcGFyYXRvcnMgYXJlIG5vdCBhbGxvd2VkXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZUIsXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZUUsXG4gICAgY2hhckNvZGVzLmxvd2VyY2FzZU8sXG4gIF0pLFxuICBoZXg6IG5ldyBTZXQ8bnVtYmVyPihbXG4gICAgY2hhckNvZGVzLmRvdCxcbiAgICBjaGFyQ29kZXMudXBwZXJjYXNlWCxcbiAgICBjaGFyQ29kZXMudW5kZXJzY29yZSwgLy8gbXVsdGlwbGUgc2VwYXJhdG9ycyBhcmUgbm90IGFsbG93ZWRcbiAgICBjaGFyQ29kZXMubG93ZXJjYXNlWCxcbiAgXSksXG59O1xuXG5jb25zdCBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZyA9IHtcbiAgLy8gMCAtIDFcbiAgYmluOiAoY2g6IG51bWJlcikgPT4gY2ggPT09IGNoYXJDb2Rlcy5kaWdpdDAgfHwgY2ggPT09IGNoYXJDb2Rlcy5kaWdpdDEsXG5cbiAgLy8gMCAtIDdcbiAgb2N0OiAoY2g6IG51bWJlcikgPT4gY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ3LFxuXG4gIC8vIDAgLSA5XG4gIGRlYzogKGNoOiBudW1iZXIpID0+IGNoID49IGNoYXJDb2Rlcy5kaWdpdDAgJiYgY2ggPD0gY2hhckNvZGVzLmRpZ2l0OSxcblxuICAvLyAwIC0gOSwgQSAtIEYsIGEgLSBmLFxuICBoZXg6IChjaDogbnVtYmVyKSA9PlxuICAgIChjaCA+PSBjaGFyQ29kZXMuZGlnaXQwICYmIGNoIDw9IGNoYXJDb2Rlcy5kaWdpdDkpIHx8XG4gICAgKGNoID49IGNoYXJDb2Rlcy51cHBlcmNhc2VBICYmIGNoIDw9IGNoYXJDb2Rlcy51cHBlcmNhc2VGKSB8fFxuICAgIChjaCA+PSBjaGFyQ29kZXMubG93ZXJjYXNlQSAmJiBjaCA8PSBjaGFyQ29kZXMubG93ZXJjYXNlRiksXG59O1xuXG5leHBvcnQgdHlwZSBTdHJpbmdDb250ZW50c0Vycm9ySGFuZGxlcnMgPSBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMgJiB7XG4gIHVudGVybWluYXRlZChcbiAgICBpbml0aWFsUG9zOiBudW1iZXIsXG4gICAgaW5pdGlhbExpbmVTdGFydDogbnVtYmVyLFxuICAgIGluaXRpYWxDdXJMaW5lOiBudW1iZXIsXG4gICk6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0cmluZ0NvbnRlbnRzKFxuICB0eXBlOiBcInNpbmdsZVwiIHwgXCJkb3VibGVcIiB8IFwidGVtcGxhdGVcIixcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGVycm9yczogU3RyaW5nQ29udGVudHNFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IGluaXRpYWxQb3MgPSBwb3M7XG4gIGNvbnN0IGluaXRpYWxMaW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gIGNvbnN0IGluaXRpYWxDdXJMaW5lID0gY3VyTGluZTtcblxuICBsZXQgb3V0ID0gXCJcIjtcbiAgbGV0IGZpcnN0SW52YWxpZExvYyA9IG51bGw7XG4gIGxldCBjaHVua1N0YXJ0ID0gcG9zO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gaW5wdXQ7XG4gIGZvciAoOzspIHtcbiAgICBpZiAocG9zID49IGxlbmd0aCkge1xuICAgICAgZXJyb3JzLnVudGVybWluYXRlZChpbml0aWFsUG9zLCBpbml0aWFsTGluZVN0YXJ0LCBpbml0aWFsQ3VyTGluZSk7XG4gICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBjaCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBpZiAoaXNTdHJpbmdFbmQodHlwZSwgY2gsIGlucHV0LCBwb3MpKSB7XG4gICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5iYWNrc2xhc2gpIHtcbiAgICAgIG91dCArPSBpbnB1dC5zbGljZShjaHVua1N0YXJ0LCBwb3MpO1xuICAgICAgY29uc3QgcmVzID0gcmVhZEVzY2FwZWRDaGFyKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIHR5cGUgPT09IFwidGVtcGxhdGVcIixcbiAgICAgICAgZXJyb3JzLFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMuY2ggPT09IG51bGwgJiYgIWZpcnN0SW52YWxpZExvYykge1xuICAgICAgICBmaXJzdEludmFsaWRMb2MgPSB7IHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gcmVzLmNoO1xuICAgICAgfVxuICAgICAgKHsgcG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUgfSA9IHJlcyk7XG4gICAgICBjaHVua1N0YXJ0ID0gcG9zO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaCA9PT0gY2hhckNvZGVzLmxpbmVTZXBhcmF0b3IgfHxcbiAgICAgIGNoID09PSBjaGFyQ29kZXMucGFyYWdyYXBoU2VwYXJhdG9yXG4gICAgKSB7XG4gICAgICArK3BvcztcbiAgICAgICsrY3VyTGluZTtcbiAgICAgIGxpbmVTdGFydCA9IHBvcztcbiAgICB9IGVsc2UgaWYgKGNoID09PSBjaGFyQ29kZXMubGluZUZlZWQgfHwgY2ggPT09IGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybikge1xuICAgICAgaWYgKHR5cGUgPT09IFwidGVtcGxhdGVcIikge1xuICAgICAgICBvdXQgKz0gaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgcG9zKSArIFwiXFxuXCI7XG4gICAgICAgICsrcG9zO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2ggPT09IGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybiAmJlxuICAgICAgICAgIGlucHV0LmNoYXJDb2RlQXQocG9zKSA9PT0gY2hhckNvZGVzLmxpbmVGZWVkXG4gICAgICAgICkge1xuICAgICAgICAgICsrcG9zO1xuICAgICAgICB9XG4gICAgICAgICsrY3VyTGluZTtcbiAgICAgICAgY2h1bmtTdGFydCA9IGxpbmVTdGFydCA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy51bnRlcm1pbmF0ZWQoaW5pdGlhbFBvcywgaW5pdGlhbExpbmVTdGFydCwgaW5pdGlhbEN1ckxpbmUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICArK3BvcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICA/IHsgcG9zLCBzdHI6IG91dCwgZmlyc3RJbnZhbGlkTG9jLCBsaW5lU3RhcnQsIGN1ckxpbmUgfVxuICAgIDoge1xuICAgICAgICBwb3MsXG4gICAgICAgIHN0cjogb3V0LFxuICAgICAgICBmaXJzdEludmFsaWRMb2MsXG4gICAgICAgIGxpbmVTdGFydCxcbiAgICAgICAgY3VyTGluZSxcbiAgICAgICAgY29udGFpbnNJbnZhbGlkOiAhIWZpcnN0SW52YWxpZExvYyxcbiAgICAgIH07XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nRW5kKFxuICB0eXBlOiBcInNpbmdsZVwiIHwgXCJkb3VibGVcIiB8IFwidGVtcGxhdGVcIixcbiAgY2g6IG51bWJlcixcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4pIHtcbiAgaWYgKHR5cGUgPT09IFwidGVtcGxhdGVcIikge1xuICAgIHJldHVybiAoXG4gICAgICBjaCA9PT0gY2hhckNvZGVzLmdyYXZlQWNjZW50IHx8XG4gICAgICAoY2ggPT09IGNoYXJDb2Rlcy5kb2xsYXJTaWduICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQocG9zICsgMSkgPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSlcbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgY2ggPT09ICh0eXBlID09PSBcImRvdWJsZVwiID8gY2hhckNvZGVzLnF1b3RhdGlvbk1hcmsgOiBjaGFyQ29kZXMuYXBvc3Ryb3BoZSlcbiAgKTtcbn1cblxudHlwZSBFc2NhcGVkQ2hhckVycm9ySGFuZGxlcnMgPSBIZXhDaGFyRXJyb3JIYW5kbGVycyAmXG4gIENvZGVQb2ludEVycm9ySGFuZGxlcnMgJiB7XG4gICAgc3RyaWN0TnVtZXJpY0VzY2FwZShwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG4gIH07XG5cbmZ1bmN0aW9uIHJlYWRFc2NhcGVkQ2hhcihcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGluVGVtcGxhdGU6IGJvb2xlYW4sXG4gIGVycm9yczogRXNjYXBlZENoYXJFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IHRocm93T25JbnZhbGlkID0gIWluVGVtcGxhdGU7XG4gIHBvcysrOyAvLyBza2lwICdcXCdcblxuICBjb25zdCByZXMgPSAoY2g6IHN0cmluZyB8IG51bGwpID0+ICh7IHBvcywgY2gsIGxpbmVTdGFydCwgY3VyTGluZSB9KTtcblxuICBjb25zdCBjaCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKyspO1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlTjpcbiAgICAgIHJldHVybiByZXMoXCJcXG5cIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlUjpcbiAgICAgIHJldHVybiByZXMoXCJcXHJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMubG93ZXJjYXNlWDoge1xuICAgICAgbGV0IGNvZGU7XG4gICAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRIZXhDaGFyKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIDIsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aHJvd09uSW52YWxpZCxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgKSk7XG4gICAgICByZXR1cm4gcmVzKGNvZGUgPT09IG51bGwgPyBudWxsIDogU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgfVxuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVU6IHtcbiAgICAgIGxldCBjb2RlO1xuICAgICAgKHsgY29kZSwgcG9zIH0gPSByZWFkQ29kZVBvaW50KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zLFxuICAgICAgICBsaW5lU3RhcnQsXG4gICAgICAgIGN1ckxpbmUsXG4gICAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgICBlcnJvcnMsXG4gICAgICApKTtcbiAgICAgIHJldHVybiByZXMoY29kZSA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgfVxuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVQ6XG4gICAgICByZXR1cm4gcmVzKFwiXFx0XCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZUI6XG4gICAgICByZXR1cm4gcmVzKFwiXFxiXCIpO1xuICAgIGNhc2UgY2hhckNvZGVzLmxvd2VyY2FzZVY6XG4gICAgICByZXR1cm4gcmVzKFwiXFx1MDAwYlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5sb3dlcmNhc2VGOlxuICAgICAgcmV0dXJuIHJlcyhcIlxcZlwiKTtcbiAgICBjYXNlIGNoYXJDb2Rlcy5jYXJyaWFnZVJldHVybjpcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBvcykgPT09IGNoYXJDb2Rlcy5saW5lRmVlZCkge1xuICAgICAgICArK3BvcztcbiAgICAgIH1cbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgICBjYXNlIGNoYXJDb2Rlcy5saW5lRmVlZDpcbiAgICAgIGxpbmVTdGFydCA9IHBvcztcbiAgICAgICsrY3VyTGluZTtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgICBjYXNlIGNoYXJDb2Rlcy5saW5lU2VwYXJhdG9yOlxuICAgIGNhc2UgY2hhckNvZGVzLnBhcmFncmFwaFNlcGFyYXRvcjpcbiAgICAgIHJldHVybiByZXMoXCJcIik7XG4gICAgY2FzZSBjaGFyQ29kZXMuZGlnaXQ4OlxuICAgIGNhc2UgY2hhckNvZGVzLmRpZ2l0OTpcbiAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybiByZXMobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMuc3RyaWN0TnVtZXJpY0VzY2FwZShwb3MgLSAxLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfVxuICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoY2ggPj0gY2hhckNvZGVzLmRpZ2l0MCAmJiBjaCA8PSBjaGFyQ29kZXMuZGlnaXQ3KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zIC0gMTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5zbGljZShzdGFydFBvcywgcG9zICsgMikubWF0Y2goL15bMC03XSsvKSE7XG5cbiAgICAgICAgbGV0IG9jdGFsU3RyID0gbWF0Y2hbMF07XG5cbiAgICAgICAgbGV0IG9jdGFsID0gcGFyc2VJbnQob2N0YWxTdHIsIDgpO1xuICAgICAgICBpZiAob2N0YWwgPiAyNTUpIHtcbiAgICAgICAgICBvY3RhbFN0ciA9IG9jdGFsU3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gb2N0YWxTdHIubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9jdGFsU3RyICE9PSBcIjBcIiB8fFxuICAgICAgICAgIG5leHQgPT09IGNoYXJDb2Rlcy5kaWdpdDggfHxcbiAgICAgICAgICBuZXh0ID09PSBjaGFyQ29kZXMuZGlnaXQ5XG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzKG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMuc3RyaWN0TnVtZXJpY0VzY2FwZShzdGFydFBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzKFN0cmluZy5mcm9tQ2hhckNvZGUob2N0YWwpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7XG4gIH1cbn1cblxudHlwZSBIZXhDaGFyRXJyb3JIYW5kbGVycyA9IEludEVycm9ySGFuZGxlcnMgJiB7XG4gIGludmFsaWRFc2NhcGVTZXF1ZW5jZShwb3M6IG51bWJlciwgbGluZVN0YXJ0OiBudW1iZXIsIGN1ckxpbmU6IG51bWJlcik6IHZvaWQ7XG59O1xuXG4vLyBVc2VkIHRvIHJlYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgKCdcXHgnLCAnXFx1JykuXG5mdW5jdGlvbiByZWFkSGV4Q2hhcihcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIGxlbjogbnVtYmVyLFxuICBmb3JjZUxlbjogYm9vbGVhbixcbiAgdGhyb3dPbkludmFsaWQ6IGJvb2xlYW4sXG4gIGVycm9yczogSGV4Q2hhckVycm9ySGFuZGxlcnMsXG4pIHtcbiAgY29uc3QgaW5pdGlhbFBvcyA9IHBvcztcbiAgbGV0IG47XG4gICh7IG4sIHBvcyB9ID0gcmVhZEludChcbiAgICBpbnB1dCxcbiAgICBwb3MsXG4gICAgbGluZVN0YXJ0LFxuICAgIGN1ckxpbmUsXG4gICAgMTYsXG4gICAgbGVuLFxuICAgIGZvcmNlTGVuLFxuICAgIGZhbHNlLFxuICAgIGVycm9ycyxcbiAgICAvKiBiYWlsT25FcnJvciAqLyAhdGhyb3dPbkludmFsaWQsXG4gICkpO1xuICBpZiAobiA9PT0gbnVsbCkge1xuICAgIGlmICh0aHJvd09uSW52YWxpZCkge1xuICAgICAgZXJyb3JzLmludmFsaWRFc2NhcGVTZXF1ZW5jZShpbml0aWFsUG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3MgPSBpbml0aWFsUG9zIC0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogbiwgcG9zIH07XG59XG5cbmV4cG9ydCB0eXBlIEludEVycm9ySGFuZGxlcnMgPSB7XG4gIG51bWVyaWNTZXBhcmF0b3JJbkVzY2FwZVNlcXVlbmNlKFxuICAgIHBvczogbnVtYmVyLFxuICAgIGxpbmVTdGFydDogbnVtYmVyLFxuICAgIGN1ckxpbmU6IG51bWJlcixcbiAgKTogdm9pZDtcbiAgdW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICApOiB2b2lkO1xuICAvLyBJdCBjYW4gcmV0dXJuIFwidHJ1ZVwiIHRvIGluZGljYXRlIHRoYXQgdGhlIGVycm9yIHdhcyBoYW5kbGVkXG4gIC8vIGFuZCB0aGUgaW50IHBhcnNpbmcgc2hvdWxkIGNvbnRpbnVlLlxuICBpbnZhbGlkRGlnaXQoXG4gICAgcG9zOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0OiBudW1iZXIsXG4gICAgY3VyTGluZTogbnVtYmVyLFxuICAgIHJhZGl4OiBudW1iZXIsXG4gICk6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEludChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgcG9zOiBudW1iZXIsXG4gIGxpbmVTdGFydDogbnVtYmVyLFxuICBjdXJMaW5lOiBudW1iZXIsXG4gIHJhZGl4OiBudW1iZXIsXG4gIGxlbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBmb3JjZUxlbjogYm9vbGVhbixcbiAgYWxsb3dOdW1TZXBhcmF0b3I6IGJvb2xlYW4gfCBcImJhaWxcIixcbiAgZXJyb3JzOiBJbnRFcnJvckhhbmRsZXJzLFxuICBiYWlsT25FcnJvcjogYm9vbGVhbixcbikge1xuICBjb25zdCBzdGFydCA9IHBvcztcbiAgY29uc3QgZm9yYmlkZGVuU2libGluZ3MgPVxuICAgIHJhZGl4ID09PSAxNlxuICAgICAgPyBmb3JiaWRkZW5OdW1lcmljU2VwYXJhdG9yU2libGluZ3MuaGV4XG4gICAgICA6IGZvcmJpZGRlbk51bWVyaWNTZXBhcmF0b3JTaWJsaW5ncy5kZWNCaW5PY3Q7XG4gIGNvbnN0IGlzQWxsb3dlZFNpYmxpbmcgPVxuICAgIHJhZGl4ID09PSAxNlxuICAgICAgPyBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5oZXhcbiAgICAgIDogcmFkaXggPT09IDEwXG4gICAgICA/IGlzQWxsb3dlZE51bWVyaWNTZXBhcmF0b3JTaWJsaW5nLmRlY1xuICAgICAgOiByYWRpeCA9PT0gOFxuICAgICAgPyBpc0FsbG93ZWROdW1lcmljU2VwYXJhdG9yU2libGluZy5vY3RcbiAgICAgIDogaXNBbGxvd2VkTnVtZXJpY1NlcGFyYXRvclNpYmxpbmcuYmluO1xuXG4gIGxldCBpbnZhbGlkID0gZmFsc2U7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpKSB7XG4gICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQocG9zKTtcbiAgICBsZXQgdmFsO1xuXG4gICAgaWYgKGNvZGUgPT09IGNoYXJDb2Rlcy51bmRlcnNjb3JlICYmIGFsbG93TnVtU2VwYXJhdG9yICE9PSBcImJhaWxcIikge1xuICAgICAgY29uc3QgcHJldiA9IGlucHV0LmNoYXJDb2RlQXQocG9zIC0gMSk7XG4gICAgICBjb25zdCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MgKyAxKTtcblxuICAgICAgaWYgKCFhbGxvd051bVNlcGFyYXRvcikge1xuICAgICAgICBpZiAoYmFpbE9uRXJyb3IpIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgICBlcnJvcnMubnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2UocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgTnVtYmVyLmlzTmFOKG5leHQpIHx8XG4gICAgICAgICFpc0FsbG93ZWRTaWJsaW5nKG5leHQpIHx8XG4gICAgICAgIGZvcmJpZGRlblNpYmxpbmdzLmhhcyhwcmV2KSB8fFxuICAgICAgICBmb3JiaWRkZW5TaWJsaW5ncy5oYXMobmV4dClcbiAgICAgICkge1xuICAgICAgICBpZiAoYmFpbE9uRXJyb3IpIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICAgICAgICBlcnJvcnMudW5leHBlY3RlZE51bWVyaWNTZXBhcmF0b3IocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgdGhpcyBfIGNoYXJhY3RlclxuICAgICAgKytwb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSBjaGFyQ29kZXMubG93ZXJjYXNlQSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy5sb3dlcmNhc2VBICsgY2hhckNvZGVzLmxpbmVGZWVkO1xuICAgIH0gZWxzZSBpZiAoY29kZSA+PSBjaGFyQ29kZXMudXBwZXJjYXNlQSkge1xuICAgICAgdmFsID0gY29kZSAtIGNoYXJDb2Rlcy51cHBlcmNhc2VBICsgY2hhckNvZGVzLmxpbmVGZWVkO1xuICAgIH0gZWxzZSBpZiAoY2hhckNvZGVzLmlzRGlnaXQoY29kZSkpIHtcbiAgICAgIHZhbCA9IGNvZGUgLSBjaGFyQ29kZXMuZGlnaXQwOyAvLyAwLTlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmICh2YWwgPj0gcmFkaXgpIHtcbiAgICAgIC8vIElmIHdlIGZvdW5kIGEgZGlnaXQgd2hpY2ggaXMgdG9vIGJpZywgZXJyb3JzLmludmFsaWREaWdpdCBjYW4gcmV0dXJuIHRydWUgdG8gYXZvaWRcbiAgICAgIC8vIGJyZWFraW5nIHRoZSBsb29wICh0aGlzIGlzIHVzZWQgZm9yIGVycm9yIHJlY292ZXJ5KS5cbiAgICAgIGlmICh2YWwgPD0gOSAmJiBiYWlsT25FcnJvcikge1xuICAgICAgICByZXR1cm4geyBuOiBudWxsLCBwb3MgfTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbCA8PSA5ICYmXG4gICAgICAgIGVycm9ycy5pbnZhbGlkRGlnaXQocG9zLCBsaW5lU3RhcnQsIGN1ckxpbmUsIHJhZGl4KVxuICAgICAgKSB7XG4gICAgICAgIHZhbCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGZvcmNlTGVuKSB7XG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGludmFsaWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgICsrcG9zO1xuICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDtcbiAgfVxuICBpZiAocG9zID09PSBzdGFydCB8fCAobGVuICE9IG51bGwgJiYgcG9zIC0gc3RhcnQgIT09IGxlbikgfHwgaW52YWxpZCkge1xuICAgIHJldHVybiB7IG46IG51bGwsIHBvcyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgbjogdG90YWwsIHBvcyB9O1xufVxuXG5leHBvcnQgdHlwZSBDb2RlUG9pbnRFcnJvckhhbmRsZXJzID0gSGV4Q2hhckVycm9ySGFuZGxlcnMgJiB7XG4gIGludmFsaWRDb2RlUG9pbnQocG9zOiBudW1iZXIsIGxpbmVTdGFydDogbnVtYmVyLCBjdXJMaW5lOiBudW1iZXIpOiB2b2lkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb2RlUG9pbnQoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHBvczogbnVtYmVyLFxuICBsaW5lU3RhcnQ6IG51bWJlcixcbiAgY3VyTGluZTogbnVtYmVyLFxuICB0aHJvd09uSW52YWxpZDogYm9vbGVhbixcbiAgZXJyb3JzOiBDb2RlUG9pbnRFcnJvckhhbmRsZXJzLFxuKSB7XG4gIGNvbnN0IGNoID0gaW5wdXQuY2hhckNvZGVBdChwb3MpO1xuICBsZXQgY29kZTtcblxuICBpZiAoY2ggPT09IGNoYXJDb2Rlcy5sZWZ0Q3VybHlCcmFjZSkge1xuICAgICsrcG9zO1xuICAgICh7IGNvZGUsIHBvcyB9ID0gcmVhZEhleENoYXIoXG4gICAgICBpbnB1dCxcbiAgICAgIHBvcyxcbiAgICAgIGxpbmVTdGFydCxcbiAgICAgIGN1ckxpbmUsXG4gICAgICBpbnB1dC5pbmRleE9mKFwifVwiLCBwb3MpIC0gcG9zLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRocm93T25JbnZhbGlkLFxuICAgICAgZXJyb3JzLFxuICAgICkpO1xuICAgICsrcG9zO1xuICAgIGlmIChjb2RlICE9PSBudWxsICYmIGNvZGUgPiAweDEwZmZmZikge1xuICAgICAgaWYgKHRocm93T25JbnZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5pbnZhbGlkQ29kZVBvaW50KHBvcywgbGluZVN0YXJ0LCBjdXJMaW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IG51bGwsIHBvcyB9O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAoeyBjb2RlLCBwb3MgfSA9IHJlYWRIZXhDaGFyKFxuICAgICAgaW5wdXQsXG4gICAgICBwb3MsXG4gICAgICBsaW5lU3RhcnQsXG4gICAgICBjdXJMaW5lLFxuICAgICAgNCxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhyb3dPbkludmFsaWQsXG4gICAgICBlcnJvcnMsXG4gICAgKSk7XG4gIH1cbiAgcmV0dXJuIHsgY29kZSwgcG9zIH07XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRFTUVOVF9PUl9CTE9DS19LRVlTID0gW1wiY29uc2VxdWVudFwiLCBcImJvZHlcIiwgXCJhbHRlcm5hdGVcIl07XG5leHBvcnQgY29uc3QgRkxBVFRFTkFCTEVfS0VZUyA9IFtcImJvZHlcIiwgXCJleHByZXNzaW9uc1wiXTtcbmV4cG9ydCBjb25zdCBGT1JfSU5JVF9LRVlTID0gW1wibGVmdFwiLCBcImluaXRcIl07XG5leHBvcnQgY29uc3QgQ09NTUVOVF9LRVlTID0gW1xuICBcImxlYWRpbmdDb21tZW50c1wiLFxuICBcInRyYWlsaW5nQ29tbWVudHNcIixcbiAgXCJpbm5lckNvbW1lbnRzXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTE9HSUNBTF9PUEVSQVRPUlMgPSBbXCJ8fFwiLCBcIiYmXCIsIFwiPz9cIl07XG5leHBvcnQgY29uc3QgVVBEQVRFX09QRVJBVE9SUyA9IFtcIisrXCIsIFwiLS1cIl07XG5cbmV4cG9ydCBjb25zdCBCT09MRUFOX05VTUJFUl9CSU5BUllfT1BFUkFUT1JTID0gW1wiPlwiLCBcIjxcIiwgXCI+PVwiLCBcIjw9XCJdO1xuZXhwb3J0IGNvbnN0IEVRVUFMSVRZX0JJTkFSWV9PUEVSQVRPUlMgPSBbXCI9PVwiLCBcIj09PVwiLCBcIiE9XCIsIFwiIT09XCJdO1xuZXhwb3J0IGNvbnN0IENPTVBBUklTT05fQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgLi4uRVFVQUxJVFlfQklOQVJZX09QRVJBVE9SUyxcbiAgXCJpblwiLFxuICBcImluc3RhbmNlb2ZcIixcbl07XG5leHBvcnQgY29uc3QgQk9PTEVBTl9CSU5BUllfT1BFUkFUT1JTID0gW1xuICAuLi5DT01QQVJJU09OX0JJTkFSWV9PUEVSQVRPUlMsXG4gIC4uLkJPT0xFQU5fTlVNQkVSX0JJTkFSWV9PUEVSQVRPUlMsXG5dO1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9CSU5BUllfT1BFUkFUT1JTID0gW1xuICBcIi1cIixcbiAgXCIvXCIsXG4gIFwiJVwiLFxuICBcIipcIixcbiAgXCIqKlwiLFxuICBcIiZcIixcbiAgXCJ8XCIsXG4gIFwiPj5cIixcbiAgXCI+Pj5cIixcbiAgXCI8PFwiLFxuICBcIl5cIixcbl07XG5leHBvcnQgY29uc3QgQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgXCIrXCIsXG4gIC4uLk5VTUJFUl9CSU5BUllfT1BFUkFUT1JTLFxuICAuLi5CT09MRUFOX0JJTkFSWV9PUEVSQVRPUlMsXG4gIFwifD5cIixcbl07XG5cbmV4cG9ydCBjb25zdCBBU1NJR05NRU5UX09QRVJBVE9SUyA9IFtcbiAgXCI9XCIsXG4gIFwiKz1cIixcbiAgLi4uTlVNQkVSX0JJTkFSWV9PUEVSQVRPUlMubWFwKG9wID0+IG9wICsgXCI9XCIpLFxuICAuLi5MT0dJQ0FMX09QRVJBVE9SUy5tYXAob3AgPT4gb3AgKyBcIj1cIiksXG5dO1xuXG5leHBvcnQgY29uc3QgQk9PTEVBTl9VTkFSWV9PUEVSQVRPUlMgPSBbXCJkZWxldGVcIiwgXCIhXCJdO1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9VTkFSWV9PUEVSQVRPUlMgPSBbXCIrXCIsIFwiLVwiLCBcIn5cIl07XG5leHBvcnQgY29uc3QgU1RSSU5HX1VOQVJZX09QRVJBVE9SUyA9IFtcInR5cGVvZlwiXTtcbmV4cG9ydCBjb25zdCBVTkFSWV9PUEVSQVRPUlMgPSBbXG4gIFwidm9pZFwiLFxuICBcInRocm93XCIsXG4gIC4uLkJPT0xFQU5fVU5BUllfT1BFUkFUT1JTLFxuICAuLi5OVU1CRVJfVU5BUllfT1BFUkFUT1JTLFxuICAuLi5TVFJJTkdfVU5BUllfT1BFUkFUT1JTLFxuXTtcblxuZXhwb3J0IGNvbnN0IElOSEVSSVRfS0VZUyA9IHtcbiAgb3B0aW9uYWw6IFtcInR5cGVBbm5vdGF0aW9uXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyZXR1cm5UeXBlXCJdLFxuICBmb3JjZTogW1wic3RhcnRcIiwgXCJsb2NcIiwgXCJlbmRcIl0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQkxPQ0tfU0NPUEVEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJ2YXIgdXNlZCB0byBiZSBibG9jayBzY29wZWRcIik7XG5leHBvcnQgY29uc3QgTk9UX0xPQ0FMX0JJTkRJTkcgPSBTeW1ib2wuZm9yKFxuICBcInNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhIGxvY2FsIGJpbmRpbmdcIixcbik7XG4iLCAiaW1wb3J0IGlzIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpZWxkLCB2YWxpZGF0ZUNoaWxkIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGNvbnN0IFZJU0lUT1JfS0VZUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5leHBvcnQgY29uc3QgQUxJQVNfS0VZUzogUGFydGlhbDxSZWNvcmQ8Tm9kZVR5cGVzV2l0aG91dENvbW1lbnQsIHN0cmluZ1tdPj4gPVxuICB7fTtcbmV4cG9ydCBjb25zdCBGTElQUEVEX0FMSUFTX0tFWVM6IFJlY29yZDxzdHJpbmcsIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50W10+ID0ge307XG5leHBvcnQgY29uc3QgTk9ERV9GSUVMRFM6IFJlY29yZDxzdHJpbmcsIEZpZWxkRGVmaW5pdGlvbnM+ID0ge307XG5leHBvcnQgY29uc3QgQlVJTERFUl9LRVlTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbmV4cG9ydCBjb25zdCBERVBSRUNBVEVEX0tFWVM6IFJlY29yZDxzdHJpbmcsIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50PiA9IHt9O1xuZXhwb3J0IGNvbnN0IE5PREVfUEFSRU5UX1ZBTElEQVRJT05TOiBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3I+ID0ge307XG5cbmZ1bmN0aW9uIGdldFR5cGUodmFsOiBhbnkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBcImFycmF5XCI7XG4gIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0eXBlb2YgdmFsO1xuICB9XG59XG5cbnR5cGUgTm9kZVR5cGVzV2l0aG91dENvbW1lbnQgPSB0Lk5vZGVbXCJ0eXBlXCJdIHwga2V5b2YgdC5BbGlhc2VzO1xuXG50eXBlIE5vZGVUeXBlcyA9IE5vZGVUeXBlc1dpdGhvdXRDb21tZW50IHwgdC5Db21tZW50W1widHlwZVwiXTtcblxudHlwZSBQcmltaXRpdmVUeXBlcyA9IFJldHVyblR5cGU8dHlwZW9mIGdldFR5cGU+O1xuXG50eXBlIEZpZWxkRGVmaW5pdGlvbnMgPSB7XG4gIFt4OiBzdHJpbmddOiBGaWVsZE9wdGlvbnM7XG59O1xuXG50eXBlIERlZmluZVR5cGVPcHRzID0ge1xuICBmaWVsZHM/OiBGaWVsZERlZmluaXRpb25zO1xuICB2aXNpdG9yPzogQXJyYXk8c3RyaW5nPjtcbiAgYWxpYXNlcz86IEFycmF5PHN0cmluZz47XG4gIGJ1aWxkZXI/OiBBcnJheTxzdHJpbmc+O1xuICBpbmhlcml0cz86IE5vZGVUeXBlcztcbiAgZGVwcmVjYXRlZEFsaWFzPzogc3RyaW5nO1xuICB2YWxpZGF0ZT86IFZhbGlkYXRvcjtcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvciA9IChcbiAgfCB7IHR5cGU6IFByaW1pdGl2ZVR5cGVzIH1cbiAgfCB7IGVhY2g6IFZhbGlkYXRvciB9XG4gIHwgeyBjaGFpbk9mOiBWYWxpZGF0b3JbXSB9XG4gIHwgeyBvbmVPZjogYW55W10gfVxuICB8IHsgb25lT2ZOb2RlVHlwZXM6IE5vZGVUeXBlc1tdIH1cbiAgfCB7IG9uZU9mTm9kZU9yVmFsdWVUeXBlczogKE5vZGVUeXBlcyB8IFByaW1pdGl2ZVR5cGVzKVtdIH1cbiAgfCB7IHNoYXBlT2Y6IHsgW3g6IHN0cmluZ106IEZpZWxkT3B0aW9ucyB9IH1cbiAgfCB7fVxuKSAmXG4gICgobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IHZvaWQpO1xuXG5leHBvcnQgdHlwZSBGaWVsZE9wdGlvbnMgPSB7XG4gIGRlZmF1bHQ/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgW107XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPzogVmFsaWRhdG9yO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbGlkYXRlOiBWYWxpZGF0b3IpOiBGaWVsZE9wdGlvbnMge1xuICByZXR1cm4geyB2YWxpZGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZUlzKHR5cGVOYW1lOiBOb2RlVHlwZXMgfCBOb2RlVHlwZXNbXSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGVOYW1lID09PSBcInN0cmluZ1wiXG4gICAgPyBhc3NlcnROb2RlVHlwZSh0eXBlTmFtZSlcbiAgICA6IGFzc2VydE5vZGVUeXBlKC4uLnR5cGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZSh0eXBlTmFtZTogTm9kZVR5cGVzIHwgTm9kZVR5cGVzW10pIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHR5cGVJcyh0eXBlTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25hbCh2YWxpZGF0ZTogVmFsaWRhdG9yKTogRmllbGRPcHRpb25zIHtcbiAgcmV0dXJuIHsgdmFsaWRhdGUsIG9wdGlvbmFsOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcbiAgdHlwZU5hbWU6IE5vZGVUeXBlcyB8IE5vZGVUeXBlc1tdLFxuKTogRmllbGRPcHRpb25zIHtcbiAgcmV0dXJuIHsgdmFsaWRhdGU6IHR5cGVJcyh0eXBlTmFtZSksIG9wdGlvbmFsOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheU9mKGVsZW1lbnRUeXBlOiBWYWxpZGF0b3IpOiBWYWxpZGF0b3Ige1xuICByZXR1cm4gY2hhaW4oYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksIGFzc2VydEVhY2goZWxlbWVudFR5cGUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5T2ZUeXBlKHR5cGVOYW1lOiBOb2RlVHlwZXMgfCBOb2RlVHlwZXNbXSkge1xuICByZXR1cm4gYXJyYXlPZih0eXBlSXModHlwZU5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXlPZlR5cGUodHlwZU5hbWU6IE5vZGVUeXBlcyB8IE5vZGVUeXBlc1tdKSB7XG4gIHJldHVybiB2YWxpZGF0ZShhcnJheU9mVHlwZSh0eXBlTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RWFjaChjYWxsYmFjazogVmFsaWRhdG9yKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdG9yKG5vZGU6IHQuTm9kZSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJrZXkgPSBgJHtrZXl9WyR7aX1dYDtcbiAgICAgIGNvbnN0IHYgPSB2YWxbaV07XG4gICAgICBjYWxsYmFjayhub2RlLCBzdWJrZXksIHYpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHZhbGlkYXRlQ2hpbGQobm9kZSwgc3Via2V5LCB2KTtcbiAgICB9XG4gIH1cbiAgdmFsaWRhdG9yLmVhY2ggPSBjYWxsYmFjaztcbiAgcmV0dXJuIHZhbGlkYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9uZU9mKC4uLnZhbHVlczogQXJyYXk8YW55Pik6IFZhbGlkYXRvciB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKG5vZGU6IGFueSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbCkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgUHJvcGVydHkgJHtrZXl9IGV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgKX0gYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUub25lT2YgPSB2YWx1ZXM7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9kZVR5cGUoLi4udHlwZXM6IE5vZGVUeXBlc1tdKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmIChpcyh0eXBlLCB2YWwpKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hpbGQobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBQcm9wZXJ0eSAke2tleX0gb2YgJHtcbiAgICAgICAgbm9kZS50eXBlXG4gICAgICB9IGV4cGVjdGVkIG5vZGUgdG8gYmUgb2YgYSB0eXBlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHR5cGVzLFxuICAgICAgKX0gYnV0IGluc3RlYWQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsPy50eXBlKX1gLFxuICAgICk7XG4gIH1cblxuICB2YWxpZGF0ZS5vbmVPZk5vZGVUeXBlcyA9IHR5cGVzO1xuXG4gIHJldHVybiB2YWxpZGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vZGVPclZhbHVlVHlwZShcbiAgLi4udHlwZXM6IChOb2RlVHlwZXMgfCBQcmltaXRpdmVUeXBlcylbXVxuKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmIChnZXRUeXBlKHZhbCkgPT09IHR5cGUgfHwgaXModHlwZSwgdmFsKSkge1xuICAgICAgICB2YWxpZGF0ZUNoaWxkKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgUHJvcGVydHkgJHtrZXl9IG9mICR7XG4gICAgICAgIG5vZGUudHlwZVxuICAgICAgfSBleHBlY3RlZCBub2RlIHRvIGJlIG9mIGEgdHlwZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0eXBlcyxcbiAgICAgICl9IGJ1dCBpbnN0ZWFkIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbD8udHlwZSl9YCxcbiAgICApO1xuICB9XG5cbiAgdmFsaWRhdGUub25lT2ZOb2RlT3JWYWx1ZVR5cGVzID0gdHlwZXM7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsdWVUeXBlKHR5cGU6IFByaW1pdGl2ZVR5cGVzKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBjb25zdCB2YWxpZCA9IGdldFR5cGUodmFsKSA9PT0gdHlwZTtcblxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBQcm9wZXJ0eSAke2tleX0gZXhwZWN0ZWQgdHlwZSBvZiAke3R5cGV9IGJ1dCBnb3QgJHtnZXRUeXBlKHZhbCl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUudHlwZSA9IHR5cGU7XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2hhcGUoc2hhcGU6IHsgW3g6IHN0cmluZ106IEZpZWxkT3B0aW9ucyB9KTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlLCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHNoYXBlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVGaWVsZChub2RlLCBwcm9wZXJ0eSwgdmFsW3Byb3BlcnR5XSwgc2hhcGVbcHJvcGVydHldKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFByb3BlcnR5ICR7a2V5fSBvZiAke1xuICAgICAgICAgIG5vZGUudHlwZVxuICAgICAgICB9IGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZzpcXG4ke2Vycm9ycy5qb2luKFwiXFxuXCIpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlLnNoYXBlT2YgPSBzaGFwZTtcblxuICByZXR1cm4gdmFsaWRhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPcHRpb25hbENoYWluU3RhcnQoKTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUobm9kZTogdC5Ob2RlKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IGN1cnJlbnQ7XG4gICAgICBpZiAodHlwZSA9PT0gXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQub3B0aW9uYWwpIHJldHVybjtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2FsbGVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQub3B0aW9uYWwpIHJldHVybjtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub2JqZWN0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBOb24tb3B0aW9uYWwgJHtub2RlLnR5cGV9IG11c3QgY2hhaW4gZnJvbSBhbiBvcHRpb25hbCBPcHRpb25hbE1lbWJlckV4cHJlc3Npb24gb3IgT3B0aW9uYWxDYWxsRXhwcmVzc2lvbi4gRm91bmQgY2hhaW4gZnJvbSAke2N1cnJlbnQ/LnR5cGV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhaW4oLi4uZm5zOiBBcnJheTxWYWxpZGF0b3I+KTogVmFsaWRhdG9yIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUoLi4uYXJnczogUGFyYW1ldGVyczxWYWxpZGF0b3I+KSB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZS5jaGFpbk9mID0gZm5zO1xuXG4gIGlmIChcbiAgICBmbnMubGVuZ3RoID49IDIgJiZcbiAgICBcInR5cGVcIiBpbiBmbnNbMF0gJiZcbiAgICBmbnNbMF0udHlwZSA9PT0gXCJhcnJheVwiICYmXG4gICAgIShcImVhY2hcIiBpbiBmbnNbMV0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBbiBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSB2YWxpZGF0b3IgY2FuIG9ubHkgYmUgZm9sbG93ZWQgYnkgYW4gYXNzZXJ0RWFjaCguLi4pIHZhbGlkYXRvci5gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGU7XG59XG5cbmNvbnN0IHZhbGlkVHlwZU9wdHMgPSBbXG4gIFwiYWxpYXNlc1wiLFxuICBcImJ1aWxkZXJcIixcbiAgXCJkZXByZWNhdGVkQWxpYXNcIixcbiAgXCJmaWVsZHNcIixcbiAgXCJpbmhlcml0c1wiLFxuICBcInZpc2l0b3JcIixcbiAgXCJ2YWxpZGF0ZVwiLFxuXTtcbmNvbnN0IHZhbGlkRmllbGRLZXlzID0gW1wiZGVmYXVsdFwiLCBcIm9wdGlvbmFsXCIsIFwiZGVwcmVjYXRlZFwiLCBcInZhbGlkYXRlXCJdO1xuXG5jb25zdCBzdG9yZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIERlZmluZVR5cGVPcHRzPjtcblxuLy8gV3JhcHMgZGVmaW5lVHlwZSB0byBlbnN1cmUgdGhlc2UgYWxpYXNlcyBhcmUgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQWxpYXNlZFR5cGUoLi4uYWxpYXNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuICh0eXBlOiBzdHJpbmcsIG9wdHM6IERlZmluZVR5cGVPcHRzID0ge30pID0+IHtcbiAgICBsZXQgZGVmaW5lZCA9IG9wdHMuYWxpYXNlcztcbiAgICBpZiAoIWRlZmluZWQpIHtcbiAgICAgIGlmIChvcHRzLmluaGVyaXRzKSBkZWZpbmVkID0gc3RvcmVbb3B0cy5pbmhlcml0c10uYWxpYXNlcz8uc2xpY2UoKTtcbiAgICAgIGRlZmluZWQgPz89IFtdO1xuICAgICAgb3B0cy5hbGlhc2VzID0gZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IGFsaWFzZXMuZmlsdGVyKGEgPT4gIWRlZmluZWQuaW5jbHVkZXMoYSkpO1xuICAgIGRlZmluZWQudW5zaGlmdCguLi5hZGRpdGlvbmFsKTtcbiAgICBkZWZpbmVUeXBlKHR5cGUsIG9wdHMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZpbmVUeXBlKHR5cGU6IHN0cmluZywgb3B0czogRGVmaW5lVHlwZU9wdHMgPSB7fSkge1xuICBjb25zdCBpbmhlcml0cyA9IChvcHRzLmluaGVyaXRzICYmIHN0b3JlW29wdHMuaW5oZXJpdHNdKSB8fCB7fTtcblxuICBsZXQgZmllbGRzID0gb3B0cy5maWVsZHM7XG4gIGlmICghZmllbGRzKSB7XG4gICAgZmllbGRzID0ge307XG4gICAgaWYgKGluaGVyaXRzLmZpZWxkcykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaGVyaXRzLmZpZWxkcyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gaW5oZXJpdHMuZmllbGRzW2tleV07XG4gICAgICAgIGNvbnN0IGRlZiA9IGZpZWxkLmRlZmF1bHQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlZikgPyBkZWYubGVuZ3RoID4gMCA6IGRlZiAmJiB0eXBlb2YgZGVmID09PSBcIm9iamVjdFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiZmllbGQgZGVmYXVsdHMgY2FuIG9ubHkgYmUgcHJpbWl0aXZlcyBvciBlbXB0eSBhcnJheXMgY3VycmVudGx5XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICBkZWZhdWx0OiBBcnJheS5pc0FycmF5KGRlZikgPyBbXSA6IGRlZixcbiAgICAgICAgICBvcHRpb25hbDogZmllbGQub3B0aW9uYWwsXG4gICAgICAgICAgZGVwcmVjYXRlZDogZmllbGQuZGVwcmVjYXRlZCxcbiAgICAgICAgICB2YWxpZGF0ZTogZmllbGQudmFsaWRhdGUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdmlzaXRvcjogQXJyYXk8c3RyaW5nPiA9IG9wdHMudmlzaXRvciB8fCBpbmhlcml0cy52aXNpdG9yIHx8IFtdO1xuICBjb25zdCBhbGlhc2VzOiBBcnJheTxzdHJpbmc+ID0gb3B0cy5hbGlhc2VzIHx8IGluaGVyaXRzLmFsaWFzZXMgfHwgW107XG4gIGNvbnN0IGJ1aWxkZXI6IEFycmF5PHN0cmluZz4gPVxuICAgIG9wdHMuYnVpbGRlciB8fCBpbmhlcml0cy5idWlsZGVyIHx8IG9wdHMudmlzaXRvciB8fCBbXTtcblxuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob3B0cykpIHtcbiAgICBpZiAodmFsaWRUeXBlT3B0cy5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb3B0aW9uIFwiJHtrfVwiIG9uICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kZXByZWNhdGVkQWxpYXMpIHtcbiAgICBERVBSRUNBVEVEX0tFWVNbb3B0cy5kZXByZWNhdGVkQWxpYXNdID0gdHlwZSBhcyBOb2RlVHlwZXNXaXRob3V0Q29tbWVudDtcbiAgfVxuXG4gIC8vIGVuc3VyZSBhbGwgZmllbGQga2V5cyBhcmUgcmVwcmVzZW50ZWQgaW4gYGZpZWxkc2BcbiAgZm9yIChjb25zdCBrZXkgb2YgdmlzaXRvci5jb25jYXQoYnVpbGRlcikpIHtcbiAgICBmaWVsZHNba2V5XSA9IGZpZWxkc1trZXldIHx8IHt9O1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2tleV07XG5cbiAgICBpZiAoZmllbGQuZGVmYXVsdCAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkZXIuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgZmllbGQub3B0aW9uYWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZC5kZWZhdWx0ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWxpZGF0ZSAmJiBmaWVsZC5kZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgIGZpZWxkLnZhbGlkYXRlID0gYXNzZXJ0VmFsdWVUeXBlKGdldFR5cGUoZmllbGQuZGVmYXVsdCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmICh2YWxpZEZpZWxkS2V5cy5pbmRleE9mKGspID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmllbGQga2V5IFwiJHtrfVwiIG9uICR7dHlwZX0uJHtrZXl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgVklTSVRPUl9LRVlTW3R5cGVdID0gb3B0cy52aXNpdG9yID0gdmlzaXRvcjtcbiAgQlVJTERFUl9LRVlTW3R5cGVdID0gb3B0cy5idWlsZGVyID0gYnVpbGRlcjtcbiAgTk9ERV9GSUVMRFNbdHlwZV0gPSBvcHRzLmZpZWxkcyA9IGZpZWxkcztcbiAgQUxJQVNfS0VZU1t0eXBlIGFzIE5vZGVUeXBlc1dpdGhvdXRDb21tZW50XSA9IG9wdHMuYWxpYXNlcyA9IGFsaWFzZXM7XG4gIGFsaWFzZXMuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgRkxJUFBFRF9BTElBU19LRVlTW2FsaWFzXSA9IEZMSVBQRURfQUxJQVNfS0VZU1thbGlhc10gfHwgW107XG4gICAgRkxJUFBFRF9BTElBU19LRVlTW2FsaWFzXS5wdXNoKHR5cGUgYXMgTm9kZVR5cGVzV2l0aG91dENvbW1lbnQpO1xuICB9KTtcblxuICBpZiAob3B0cy52YWxpZGF0ZSkge1xuICAgIE5PREVfUEFSRU5UX1ZBTElEQVRJT05TW3R5cGVdID0gb3B0cy52YWxpZGF0ZTtcbiAgfVxuXG4gIHN0b3JlW3R5cGVdID0gb3B0cztcbn1cbiIsICJpbXBvcnQgaXMgZnJvbSBcIi4uL3ZhbGlkYXRvcnMvaXNcIjtcbmltcG9ydCBpc1ZhbGlkSWRlbnRpZmllciBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1ZhbGlkSWRlbnRpZmllclwiO1xuaW1wb3J0IHsgaXNLZXl3b3JkLCBpc1Jlc2VydmVkV29yZCB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyByZWFkU3RyaW5nQ29udGVudHMgfSBmcm9tIFwiQGJhYmVsL2hlbHBlci1zdHJpbmctcGFyc2VyXCI7XG5cbmltcG9ydCB7XG4gIEJJTkFSWV9PUEVSQVRPUlMsXG4gIExPR0lDQUxfT1BFUkFUT1JTLFxuICBBU1NJR05NRU5UX09QRVJBVE9SUyxcbiAgVU5BUllfT1BFUkFUT1JTLFxuICBVUERBVEVfT1BFUkFUT1JTLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7XG4gIGRlZmluZUFsaWFzZWRUeXBlLFxuICBhc3NlcnRTaGFwZSxcbiAgYXNzZXJ0T3B0aW9uYWxDaGFpblN0YXJ0LFxuICBhc3NlcnRWYWx1ZVR5cGUsXG4gIGFzc2VydE5vZGVUeXBlLFxuICBhc3NlcnROb2RlT3JWYWx1ZVR5cGUsXG4gIGFzc2VydEVhY2gsXG4gIGNoYWluLFxuICBhc3NlcnRPbmVPZixcbiAgdmFsaWRhdGVPcHRpb25hbCxcbiAgdHlwZSBWYWxpZGF0b3IsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGRlZmluZVR5cGUgPSBkZWZpbmVBbGlhc2VkVHlwZShcIlN0YW5kYXJkaXplZFwiKTtcblxuZGVmaW5lVHlwZShcIkFycmF5RXhwcmVzc2lvblwiLCB7XG4gIGZpZWxkczoge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVPclZhbHVlVHlwZShcIm51bGxcIiwgXCJFeHByZXNzaW9uXCIsIFwiU3ByZWFkRWxlbWVudFwiKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORyA/IFtdIDogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImVsZW1lbnRzXCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiLCB7XG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSB7XG4gICAgICAgICAgcmV0dXJuIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBhc3NlcnRPbmVPZiguLi5BU1NJR05NRU5UX09QRVJBVE9SUyk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBhc3NlcnRPbmVPZihcIj1cIik7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlOiB0LkFzc2lnbm1lbnRFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGlzKFwiUGF0dGVyblwiLCBub2RlLmxlZnQpID8gcGF0dGVybiA6IGlkZW50aWZpZXI7XG4gICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIkxWYWxcIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgXCJNZW1iZXJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgICAgICksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxuICBidWlsZGVyOiBbXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiXSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCaW5hcnlFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoLi4uQklOQVJZX09QRVJBVE9SUyksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcbiAgICAgICAgY29uc3QgaW5PcCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiLCBcIlByaXZhdGVOYW1lXCIpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5CaW5hcnlFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5vcGVyYXRvciA9PT0gXCJpblwiID8gaW5PcCA6IGV4cHJlc3Npb247XG4gICAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgIH0gYXMgVmFsaWRhdG9yLFxuICAgICAgICAgIC8vIHRvZG8odHMpOiBjYW4gYmUgZGlzY3JpbWluYXRlZCB1bmlvbiBieSBgb3BlcmF0b3JgIHByb3BlcnR5XG4gICAgICAgICAgeyBvbmVPZk5vZGVUeXBlczogW1wiRXhwcmVzc2lvblwiLCBcIlByaXZhdGVOYW1lXCJdIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJCaW5hcnlcIiwgXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEaXJlY3RpdmVcIiwge1xuICB2aXNpdG9yOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkRpcmVjdGl2ZUxpdGVyYWxcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGlyZWN0aXZlTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJkaXJlY3RpdmVzXCJdLFxuICB2aXNpdG9yOiBbXCJkaXJlY3RpdmVzXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGlyZWN0aXZlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRpcmVjdGl2ZVwiKSksXG4gICAgICApLFxuICAgICAgZGVmYXVsdDogW10sXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJCbG9ja1BhcmVudFwiLCBcIkJsb2NrXCIsIFwiU3RhdGVtZW50XCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCcmVha1N0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImxhYmVsXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsYWJlbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIlRlcm1pbmF0b3JsZXNzXCIsIFwiQ29tcGxldGlvblN0YXRlbWVudFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2FsbEV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJjYWxsZWVcIiwgXCJhcmd1bWVudHNcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInR5cGVBcmd1bWVudHNcIl0sXG4gIGJ1aWxkZXI6IFtcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgY2FsbGVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiU3VwZXJcIiwgXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgICBhcmd1bWVudHM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFwiU3ByZWFkRWxlbWVudFwiLFxuICAgICAgICAgICAgXCJKU1hOYW1lc3BhY2VkTmFtZVwiLFxuICAgICAgICAgICAgXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgID8ge1xuICAgICAgICAgIG9wdGlvbmFsOiB7XG4gICAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YodHJ1ZSwgZmFsc2UpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgdHlwZUFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2F0Y2hDbGF1c2VcIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbVwiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiQXJyYXlQYXR0ZXJuXCIsIFwiT2JqZWN0UGF0dGVyblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJCbG9ja1BhcmVudFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBjb25zZXF1ZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgYWx0ZXJuYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJDb25kaXRpb25hbFwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ29udGludWVTdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJsYWJlbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgbGFiZWw6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJUZXJtaW5hdG9ybGVzc1wiLCBcIkNvbXBsZXRpb25TdGF0ZW1lbnRcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlYnVnZ2VyU3RhdGVtZW50XCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJEb1doaWxlU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJMb29wXCIsIFwiV2hpbGVcIiwgXCJTY29wYWJsZVwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW1wdHlTdGF0ZW1lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkV4cHJlc3Npb25XcmFwcGVyXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJGaWxlXCIsIHtcbiAgYnVpbGRlcjogW1wicHJvZ3JhbVwiLCBcImNvbW1lbnRzXCIsIFwidG9rZW5zXCJdLFxuICB2aXNpdG9yOiBbXCJwcm9ncmFtXCJdLFxuICBmaWVsZHM6IHtcbiAgICBwcm9ncmFtOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJQcm9ncmFtXCIpLFxuICAgIH0sXG4gICAgY29tbWVudHM6IHtcbiAgICAgIHZhbGlkYXRlOiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgICA/IE9iamVjdC5hc3NpZ24oKCkgPT4ge30sIHtcbiAgICAgICAgICAgIGVhY2g6IHsgb25lT2ZOb2RlVHlwZXM6IFtcIkNvbW1lbnRCbG9ja1wiLCBcIkNvbW1lbnRMaW5lXCJdIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiQ29tbWVudEJsb2NrXCIsIFwiQ29tbWVudExpbmVcIikpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB0b2tlbnM6IHtcbiAgICAgIC8vIHRvZG8odHMpOiBhZGQgVG9rZW4gdHlwZVxuICAgICAgdmFsaWRhdGU6IGFzc2VydEVhY2goT2JqZWN0LmFzc2lnbigoKSA9PiB7fSwgeyB0eXBlOiBcImFueVwiIH0pKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkZvckluU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCIsIFwiYm9keVwiXSxcbiAgYWxpYXNlczogW1xuICAgIFwiU2NvcGFibGVcIixcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRm9yXCIsXG4gICAgXCJCbG9ja1BhcmVudFwiLFxuICAgIFwiTG9vcFwiLFxuICAgIFwiRm9yWFN0YXRlbWVudFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlZhcmlhYmxlRGVjbGFyYXRpb25cIiwgXCJMVmFsXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgXCJNZW1iZXJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICBcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgICAgICksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGb3JTdGF0ZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJpbml0XCIsIFwidGVzdFwiLCBcInVwZGF0ZVwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiU3RhdGVtZW50XCIsIFwiRm9yXCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJMb29wXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpbml0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsIFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdGVzdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdXBkYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25Db21tb24gPSAoKSA9PiAoe1xuICBwYXJhbXM6IHtcbiAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiUGF0dGVyblwiLCBcIlJlc3RFbGVtZW50XCIpKSxcbiAgICApLFxuICB9LFxuICBnZW5lcmF0b3I6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgYXN5bmM6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vbiA9ICgpID0+ICh7XG4gIHJldHVyblR5cGU6IHtcbiAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlR5cGVBbm5vdGF0aW9uXCIsIFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgXCJUU1R5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgXCJOb29wXCIsXG4gICAgICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKVxuICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbiA9ICgpID0+ICh7XG4gIC4uLmZ1bmN0aW9uQ29tbW9uKCksXG4gIGRlY2xhcmU6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAgaWQ6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLCAvLyBNYXkgYmUgbnVsbCBmb3IgYGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uYFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiYXN5bmNcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcInJldHVyblR5cGVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICAgIHByZWRpY2F0ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRGVjbGFyZWRQcmVkaWNhdGVcIiwgXCJJbmZlcnJlZFByZWRpY2F0ZVwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlNjb3BhYmxlXCIsXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJTdGF0ZW1lbnRcIixcbiAgICBcIlB1cmVpc2hcIixcbiAgICBcIkRlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuICgpID0+IHt9O1xuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAocGFyZW50LCBrZXksIG5vZGUpIHtcbiAgICAgIGlmICghaXMoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiwgcGFyZW50KSkge1xuICAgICAgICBpZGVudGlmaWVyKG5vZGUsIFwiaWRcIiwgbm9kZS5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIsIHtcbiAgaW5oZXJpdHM6IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxuICBhbGlhc2VzOiBbXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiRnVuY3Rpb25cIixcbiAgICBcIkJsb2NrUGFyZW50XCIsXG4gICAgXCJGdW5jdGlvblBhcmVudFwiLFxuICAgIFwiRXhwcmVzc2lvblwiLFxuICAgIFwiUHVyZWlzaFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5mdW5jdGlvbkNvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgICBwcmVkaWNhdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIsIFwiSW5mZXJyZWRQcmVkaWNhdGVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBwYXR0ZXJuTGlrZUNvbW1vbiA9ICgpID0+ICh7XG4gIHR5cGVBbm5vdGF0aW9uOiB7XG4gICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgIFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICAgIFwiTm9vcFwiLFxuICAgICAgICApLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBvcHRpb25hbDoge1xuICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBkZWNvcmF0b3JzOiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICApLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJZGVudGlmaWVyXCIsIHtcbiAgYnVpbGRlcjogW1wibmFtZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIiwgXCJkZWNvcmF0b3JzXCIgLyogZm9yIGxlZ2FjeSBwYXJhbSBkZWNvcmF0b3JzICovXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5MaWtlXCIsIFwiTFZhbFwiLCBcIlRTRW50aXR5TmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZSwga2V5LCB2YWwpIHtcbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHZhbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFwiJHt2YWx9XCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllciBuYW1lYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICBjb25zdCBtYXRjaCA9IC9cXC4oXFx3KykkLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuXG4gICAgY29uc3QgWywgcGFyZW50S2V5XSA9IG1hdGNoO1xuICAgIGNvbnN0IG5vbkNvbXAgPSB7IGNvbXB1dGVkOiBmYWxzZSB9O1xuXG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaWYgYHBhcmVudC5wcm9wZXJ0eSA9PT0gbm9kZWAsIGJlY2F1c2Ugbm9kZXMgYXJlIHZhbGlkYXRlZFxuICAgIC8vIGJlZm9yZSByZXBsYWNpbmcgdGhlbSBpbiB0aGUgQVNULlxuICAgIGlmIChwYXJlbnRLZXkgPT09IFwicHJvcGVydHlcIikge1xuICAgICAgaWYgKGlzKFwiTWVtYmVyRXhwcmVzc2lvblwiLCBwYXJlbnQsIG5vbkNvbXApKSByZXR1cm47XG4gICAgICBpZiAoaXMoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiwgcGFyZW50LCBub25Db21wKSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcImtleVwiKSB7XG4gICAgICBpZiAoaXMoXCJQcm9wZXJ0eVwiLCBwYXJlbnQsIG5vbkNvbXApKSByZXR1cm47XG4gICAgICBpZiAoaXMoXCJNZXRob2RcIiwgcGFyZW50LCBub25Db21wKSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcImV4cG9ydGVkXCIpIHtcbiAgICAgIGlmIChpcyhcIkV4cG9ydFNwZWNpZmllclwiLCBwYXJlbnQpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChwYXJlbnRLZXkgPT09IFwiaW1wb3J0ZWRcIikge1xuICAgICAgaWYgKGlzKFwiSW1wb3J0U3BlY2lmaWVyXCIsIHBhcmVudCwgeyBpbXBvcnRlZDogbm9kZSB9KSkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocGFyZW50S2V5ID09PSBcIm1ldGFcIikge1xuICAgICAgaWYgKGlzKFwiTWV0YVByb3BlcnR5XCIsIHBhcmVudCwgeyBtZXRhOiBub2RlIH0pKSByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgY2FsbCBpc1N0cmljdFJlc2VydmVkV29yZCBpZiB0aGlzIG5vZGUgaXMgYSBkZXNjZW5kYW50XG4gICAgICAvLyBvZiBhIGJsb2NrIGluIHN0cmljdCBtb2RlLiBBbHNvLCB3ZSBzaG91bGQgcGFzcyB0aGUgaW5Nb2R1bGUgb3B0aW9uIHNvXG4gICAgICAvLyB3ZSBjYW4gZGlzYWJsZSBcImF3YWl0XCIgaW4gbW9kdWxlLlxuICAgICAgKGlzS2V5d29yZChub2RlLm5hbWUpIHx8IGlzUmVzZXJ2ZWRXb3JkKG5vZGUubmFtZSwgZmFsc2UpKSAmJlxuICAgICAgLy8gRXZlbiBpZiBcInRoaXNcIiBpcyBhIGtleXdvcmQsIHdlIGFyZSB1c2luZyB0aGUgSWRlbnRpZmllclxuICAgICAgLy8gbm9kZSB0byByZXByZXNlbnQgaXQuXG4gICAgICBub2RlLm5hbWUgIT09IFwidGhpc1wiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBcIiR7bm9kZS5uYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXJgKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIklmU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkNvbmRpdGlvbmFsXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0ZXN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgY29uc2VxdWVudDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gICAgYWx0ZXJuYXRlOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJMYWJlbGVkU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wibGFiZWxcIiwgXCJib2R5XCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN0cmluZ0xpdGVyYWxcIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1lcmljTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBkZXByZWNhdGVkQWxpYXM6IFwiTnVtYmVyTGl0ZXJhbFwiLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcIm51bWJlclwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiUHVyZWlzaFwiLCBcIkxpdGVyYWxcIiwgXCJJbW11dGFibGVcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIk51bGxMaXRlcmFsXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJSZWdFeHBMaXRlcmFsXCIsIHtcbiAgYnVpbGRlcjogW1wicGF0dGVyblwiLCBcImZsYWdzXCJdLFxuICBkZXByZWNhdGVkQWxpYXM6IFwiUmVnZXhMaXRlcmFsXCIsXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJQdXJlaXNoXCIsIFwiTGl0ZXJhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgcGF0dGVybjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICAgIGZsYWdzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZSwga2V5LCB2YWwpIHtcbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkID0gL1teZ2ltc3V5XS8uZXhlYyh2YWwpO1xuICAgICAgICAgICAgaWYgKGludmFsaWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgXCIke2ludmFsaWRbMF19XCIgaXMgbm90IGEgdmFsaWQgUmVnRXhwIGZsYWdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBcIlwiLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkxvZ2ljYWxFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiXSxcbiAgYWxpYXNlczogW1wiQmluYXJ5XCIsIFwiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5MT0dJQ0FMX09QRVJBVE9SUyksXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcbiAgICBcIm9iamVjdFwiLFxuICAgIFwicHJvcGVydHlcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgLi4uKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HID8gW1wib3B0aW9uYWxcIl0gOiBbXSksXG4gIF0sXG4gIHZpc2l0b3I6IFtcIm9iamVjdFwiLCBcInByb3BlcnR5XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiTFZhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiU3VwZXJcIiksXG4gICAgfSxcbiAgICBwcm9wZXJ0eToge1xuICAgICAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbCA9IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiLCBcIlByaXZhdGVOYW1lXCIpO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvciA9IGZ1bmN0aW9uIChcbiAgICAgICAgICBub2RlOiB0Lk1lbWJlckV4cHJlc3Npb24sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbCxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3IgPSBub2RlLmNvbXB1dGVkID8gY29tcHV0ZWQgOiBub3JtYWw7XG4gICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICB2YWxpZGF0b3Iub25lT2ZOb2RlVHlwZXMgPSBbXCJFeHByZXNzaW9uXCIsIFwiSWRlbnRpZmllclwiLCBcIlByaXZhdGVOYW1lXCJdO1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yO1xuICAgICAgfSkoKSxcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIC4uLighcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgPyB7XG4gICAgICAgICAgb3B0aW9uYWw6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZih0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTmV3RXhwcmVzc2lvblwiLCB7IGluaGVyaXRzOiBcIkNhbGxFeHByZXNzaW9uXCIgfSk7XG5cbmRlZmluZVR5cGUoXCJQcm9ncmFtXCIsIHtcbiAgLy8gTm90ZTogV2UgZXhwbGljaXRseSBsZWF2ZSAnaW50ZXJwcmV0ZXInIG91dCBoZXJlIGJlY2F1c2UgaXQgaXNcbiAgLy8gY29uY2VwdHVhbGx5IGNvbW1lbnQtbGlrZSwgYW5kIEJhYmVsIGRvZXMgbm90IHRyYXZlcnNlIGNvbW1lbnRzIGVpdGhlci5cbiAgdmlzaXRvcjogW1wiZGlyZWN0aXZlc1wiLCBcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJkaXJlY3RpdmVzXCIsIFwic291cmNlVHlwZVwiLCBcImludGVycHJldGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBzb3VyY2VGaWxlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gICAgc291cmNlVHlwZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwic2NyaXB0XCIsIFwibW9kdWxlXCIpLFxuICAgICAgZGVmYXVsdDogXCJzY3JpcHRcIixcbiAgICB9LFxuICAgIGludGVycHJldGVyOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRpcmVjdGl2ZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEaXJlY3RpdmVcIikpLFxuICAgICAgKSxcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQmxvY2tQYXJlbnRcIiwgXCJCbG9ja1wiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0RXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJPYmplY3RNZXRob2RcIiwgXCJPYmplY3RQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdE1ldGhvZFwiLCB7XG4gIGJ1aWxkZXI6IFtcImtpbmRcIiwgXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiY29tcHV0ZWRcIiwgXCJnZW5lcmF0b3JcIiwgXCJhc3luY1wiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uZnVuY3Rpb25Db21tb24oKSxcbiAgICAuLi5mdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpLFxuICAgICAgLi4uKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HID8geyBkZWZhdWx0OiBcIm1ldGhvZFwiIH0gOiB7fSksXG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBrZXk6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcjogVmFsaWRhdG9yID0gZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0TWV0aG9kLCBrZXksIHZhbCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5vZGUuY29tcHV0ZWQgPyBjb21wdXRlZCA6IG5vcm1hbDtcbiAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8odHMpOiBjYW4gYmUgZGlzY3JpbWluYXRlZCB1bmlvbiBieSBgY29tcHV0ZWRgIHByb3BlcnR5XG4gICAgICAgIHZhbGlkYXRvci5vbmVPZk5vZGVUeXBlcyA9IFtcbiAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgZGVjb3JhdG9yczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRlY29yYXRvclwiKSksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXG4gICAgXCJrZXlcIixcbiAgICBcInBhcmFtc1wiLFxuICAgIFwiYm9keVwiLFxuICAgIFwiZGVjb3JhdG9yc1wiLFxuICAgIFwicmV0dXJuVHlwZVwiLFxuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgXSxcbiAgYWxpYXNlczogW1xuICAgIFwiVXNlcldoaXRlc3BhY2FibGVcIixcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJNZXRob2RcIixcbiAgICBcIk9iamVjdE1lbWJlclwiLFxuICBdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RQcm9wZXJ0eVwiLCB7XG4gIGJ1aWxkZXI6IFtcbiAgICBcImtleVwiLFxuICAgIFwidmFsdWVcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzaG9ydGhhbmRcIixcbiAgICAuLi4oIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcgPyBbXCJkZWNvcmF0b3JzXCJdIDogW10pLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBjb21wdXRlZDoge1xuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBrZXk6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJEZWNpbWFsTGl0ZXJhbFwiLFxuICAgICAgICAgIFwiUHJpdmF0ZU5hbWVcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIik7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdG9yOiBWYWxpZGF0b3IgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIGZ1bmN0aW9uIChub2RlOiB0Lk9iamVjdFByb3BlcnR5LCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICAgICAgb25lT2ZOb2RlVHlwZXM6IFtcbiAgICAgICAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgICAgICBcIkJpZ0ludExpdGVyYWxcIixcbiAgICAgICAgICAgICAgXCJEZWNpbWFsTGl0ZXJhbFwiLFxuICAgICAgICAgICAgICBcIlByaXZhdGVOYW1lXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgdmFsdWU6IHtcbiAgICAgIC8vIFZhbHVlIG1heSBiZSBQYXR0ZXJuTGlrZSBpZiB0aGlzIGlzIGFuIEFzc2lnbm1lbnRQcm9wZXJ0eVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYnlsb24vaXNzdWVzLzQzNFxuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5MaWtlXCIpLFxuICAgIH0sXG4gICAgc2hvcnRoYW5kOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0UHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHZhbCAmJiBub2RlLmNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQcm9wZXJ0eSBzaG9ydGhhbmQgb2YgT2JqZWN0UHJvcGVydHkgY2Fubm90IGJlIHRydWUgaWYgY29tcHV0ZWQgaXMgdHJ1ZVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYXMgVmFsaWRhdG9yLFxuICAgICAgICAgIHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgKSxcbiAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT2JqZWN0UHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAodmFsICYmICFpcyhcIklkZW50aWZpZXJcIiwgbm9kZS5rZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBcIlByb3BlcnR5IHNob3J0aGFuZCBvZiBPYmplY3RQcm9wZXJ0eSBjYW5ub3QgYmUgdHJ1ZSBpZiBrZXkgaXMgbm90IGFuIElkZW50aWZpZXJcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImtleVwiLCBcInZhbHVlXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYWxpYXNlczogW1wiVXNlcldoaXRlc3BhY2FibGVcIiwgXCJQcm9wZXJ0eVwiLCBcIk9iamVjdE1lbWJlclwiXSxcbiAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICBcIlBhdHRlcm5cIixcbiAgICAgIFwiVFNBc0V4cHJlc3Npb25cIixcbiAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBleHByZXNzaW9uID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwYXJlbnQsIGtleSwgbm9kZSkge1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGlzKFwiT2JqZWN0UGF0dGVyblwiLCBwYXJlbnQpID8gcGF0dGVybiA6IGV4cHJlc3Npb247XG4gICAgICB2YWxpZGF0b3Iobm9kZSwgXCJ2YWx1ZVwiLCBub2RlLnZhbHVlKTtcbiAgICB9O1xuICB9KSgpLFxufSk7XG5cbmRlZmluZVR5cGUoXCJSZXN0RWxlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGJ1aWxkZXI6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJMVmFsXCIsIFwiUGF0dGVybkxpa2VcIl0sXG4gIGRlcHJlY2F0ZWRBbGlhczogXCJSZXN0UHJvcGVydHlcIixcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBhcmd1bWVudDoge1xuICAgICAgdmFsaWRhdGU6ICFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HXG4gICAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJMVmFsXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgICAgICBcIk9iamVjdFBhdHRlcm5cIixcbiAgICAgICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgICAgICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudDogdC5BcnJheVBhdHRlcm4gfCB0Lk9iamVjdFBhdHRlcm4sIGtleSkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFxcdyspXFxbKFxcZCspXFxdLy5leGVjKGtleSk7XG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgQmFiZWwgZXJyb3I6IG1hbGZvcm1lZCBrZXkuXCIpO1xuXG4gICAgY29uc3QgWywgbGlzdEtleSwgaW5kZXhdID0gbWF0Y2ggYXMgdW5rbm93biBhcyBbXG4gICAgICBzdHJpbmcsXG4gICAgICBrZXlvZiB0eXBlb2YgcGFyZW50LFxuICAgICAgc3RyaW5nLFxuICAgIF07XG4gICAgaWYgKChwYXJlbnRbbGlzdEtleV0gYXMgdC5Ob2RlW10pLmxlbmd0aCA+ICtpbmRleCArIDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJlc3RFbGVtZW50IG11c3QgYmUgbGFzdCBlbGVtZW50IG9mICR7bGlzdEtleX1gKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlJldHVyblN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJUZXJtaW5hdG9ybGVzc1wiLCBcIkNvbXBsZXRpb25TdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU2VxdWVuY2VFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvbnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb25zOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkV4cHJlc3Npb25XcmFwcGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN3aXRjaENhc2VcIiwge1xuICB2aXNpdG9yOiBbXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgdGVzdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgY29uc2VxdWVudDoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlN3aXRjaFN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImRpc2NyaW1pbmFudFwiLCBcImNhc2VzXCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIiwgXCJCbG9ja1BhcmVudFwiLCBcIlNjb3BhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBkaXNjcmltaW5hbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBjYXNlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlN3aXRjaENhc2VcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUaGlzRXhwcmVzc2lvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRocm93U3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIlRlcm1pbmF0b3JsZXNzXCIsIFwiQ29tcGxldGlvblN0YXRlbWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHJ5U3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYmxvY2tcIiwgXCJoYW5kbGVyXCIsIFwiZmluYWxpemVyXCJdLFxuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIGZpZWxkczoge1xuICAgIGJsb2NrOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuVHJ5U3RhdGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3IgaXNuJ3QgcHV0IGF0IHRoZSB0b3AgbGV2ZWwgYmVjYXVzZSB3ZSBjYW4gcnVuIGl0XG4gICAgICAgICAgICAvLyBldmVuIGlmIHRoaXMgbm9kZSBkb2Vzbid0IGhhdmUgYSBwYXJlbnQuXG5cbiAgICAgICAgICAgIGlmICghbm9kZS5oYW5kbGVyICYmICFub2RlLmZpbmFsaXplcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiVHJ5U3RhdGVtZW50IGV4cGVjdHMgZWl0aGVyIGEgaGFuZGxlciBvciBmaW5hbGl6ZXIsIG9yIGJvdGhcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbmVPZk5vZGVUeXBlczogW1wiQmxvY2tTdGF0ZW1lbnRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBoYW5kbGVyOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkNhdGNoQ2xhdXNlXCIpLFxuICAgIH0sXG4gICAgZmluYWxpemVyOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkJsb2NrU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlVuYXJ5RXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIl0sXG4gIGZpZWxkczoge1xuICAgIHByZWZpeDoge1xuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB9LFxuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5VTkFSWV9PUEVSQVRPUlMpLFxuICAgIH0sXG4gIH0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJVbmFyeUxpa2VcIiwgXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJVcGRhdGVFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wib3BlcmF0b3JcIiwgXCJhcmd1bWVudFwiLCBcInByZWZpeFwiXSxcbiAgZmllbGRzOiB7XG4gICAgcHJlZml4OiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJNZW1iZXJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZiguLi5VUERBVEVfT1BFUkFUT1JTKSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImtpbmRcIiwgXCJkZWNsYXJhdGlvbnNcIl0sXG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uc1wiXSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBraW5kOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXG4gICAgICAgIFwidmFyXCIsXG4gICAgICAgIFwibGV0XCIsXG4gICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXhwbGljaXQtcmVzb3VyY2UtbWFuYWdlbWVudFxuICAgICAgICBcInVzaW5nXCIsXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFzeW5jLWV4cGxpY2l0LXJlc291cmNlLW1hbmFnZW1lbnRcbiAgICAgICAgXCJhd2FpdCB1c2luZ1wiLFxuICAgICAgKSxcbiAgICB9LFxuICAgIGRlY2xhcmF0aW9uczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICBpZiAoIWlzKFwiRm9yWFN0YXRlbWVudFwiLCBwYXJlbnQsIHsgbGVmdDogbm9kZSB9KSkgcmV0dXJuO1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeGFjdGx5IG9uZSBWYXJpYWJsZURlY2xhcmF0b3IgaXMgcmVxdWlyZWQgaW4gdGhlIFZhcmlhYmxlRGVjbGFyYXRpb24gb2YgYSAke3BhcmVudC50eXBlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJpbml0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykge1xuICAgICAgICAgIHJldHVybiBhc3NlcnROb2RlVHlwZShcIkxWYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3JtYWwgPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICBcIkFycmF5UGF0dGVyblwiLFxuICAgICAgICAgIFwiT2JqZWN0UGF0dGVyblwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB3aXRob3V0ID0gYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogdC5WYXJpYWJsZURlY2xhcmF0b3IsIGtleSwgdmFsKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5pbml0ID8gbm9ybWFsIDogd2l0aG91dDtcbiAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgfSkoKSxcbiAgICB9LFxuICAgIGRlZmluaXRlOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIH0sXG4gICAgaW5pdDoge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIldoaWxlU3RhdGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1widGVzdFwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkJsb2NrUGFyZW50XCIsIFwiTG9vcFwiLCBcIldoaWxlXCIsIFwiU2NvcGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHRlc3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiV2l0aFN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcIm9iamVjdFwiLCBcImJvZHlcIl0sXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RhdGVtZW50XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLy8gLS0tIEVTMjAxNSAtLS1cbmRlZmluZVR5cGUoXCJBc3NpZ25tZW50UGF0dGVyblwiLCB7XG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImRlY29yYXRvcnNcIiAvKiBmb3IgbGVnYWN5IHBhcmFtIGRlY29yYXRvcnMgKi9dLFxuICBidWlsZGVyOiBbXCJsZWZ0XCIsIFwicmlnaHRcIl0sXG4gIGFsaWFzZXM6IFtcIlBhdHRlcm5cIiwgXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLnBhdHRlcm5MaWtlQ29tbW9uKCksXG4gICAgbGVmdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIlRTQXNFeHByZXNzaW9uXCIsXG4gICAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICAgIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gICAgICAgIFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgLy8gRm9yIFR5cGVTY3JpcHRcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJBcnJheVBhdHRlcm5cIiwge1xuICB2aXNpdG9yOiBbXCJlbGVtZW50c1wiLCBcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBidWlsZGVyOiBbXCJlbGVtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiUGF0dGVyblwiLCBcIlBhdHRlcm5MaWtlXCIsIFwiTFZhbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4ucGF0dGVybkxpa2VDb21tb24oKSxcbiAgICBlbGVtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlT3JWYWx1ZVR5cGUoXCJudWxsXCIsIFwiUGF0dGVybkxpa2VcIiwgXCJMVmFsXCIpKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiwge1xuICBidWlsZGVyOiBbXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiYXN5bmNcIl0sXG4gIHZpc2l0b3I6IFtcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJyZXR1cm5UeXBlXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlNjb3BhYmxlXCIsXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJFeHByZXNzaW9uXCIsXG4gICAgXCJQdXJlaXNoXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIC4uLmZ1bmN0aW9uQ29tbW9uKCksXG4gICAgLi4uZnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vbigpLFxuICAgIGV4cHJlc3Npb246IHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJ5bG9uL2lzc3Vlcy81MDVcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgIH0sXG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiwgXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gICAgcHJlZGljYXRlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJEZWNsYXJlZFByZWRpY2F0ZVwiLCBcIkluZmVycmVkUHJlZGljYXRlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NCb2R5XCIsIHtcbiAgdmlzaXRvcjogW1wiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgICAgICAgICBcIkNsYXNzUHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiQ2xhc3NBY2Nlc3NvclByb3BlcnR5XCIsXG4gICAgICAgICAgICBcIlRTRGVjbGFyZU1ldGhvZFwiLFxuICAgICAgICAgICAgXCJUU0luZGV4U2lnbmF0dXJlXCIsXG4gICAgICAgICAgICBcIlN0YXRpY0Jsb2NrXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiaWRcIiwgXCJzdXBlckNsYXNzXCIsIFwiYm9keVwiLCBcImRlY29yYXRvcnNcIl0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImlkXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJzdXBlckNsYXNzXCIsXG4gICAgXCJtaXhpbnNcIixcbiAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgXCJzdXBlclR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJkZWNvcmF0b3JzXCIsXG4gIF0sXG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQ2xhc3NcIiwgXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgIC8vIEluIGRlY2xhcmF0aW9ucywgdGhpcyBpcyBtaXNzaW5nIGlmIHRoaXMgaXMgdGhlXG4gICAgICAvLyBjaGlsZCBvZiBhbiBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24uXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICApXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJDbGFzc0JvZHlcIiksXG4gICAgfSxcbiAgICBzdXBlckNsYXNzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBzdXBlclR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBpbXBsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVUeXBlKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIiwgXCJDbGFzc0ltcGxlbWVudHNcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG1peGluczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkNsYXNzRGVjbGFyYXRpb25cIiwge1xuICBpbmhlcml0czogXCJDbGFzc0V4cHJlc3Npb25cIixcbiAgYWxpYXNlczogW1wiU2NvcGFibGVcIiwgXCJDbGFzc1wiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICAgICAgICApXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJDbGFzc0JvZHlcIiksXG4gICAgfSxcbiAgICBzdXBlckNsYXNzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgICBzdXBlclR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICAgXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBpbXBsZW1lbnRzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKFxuICAgICAgICAgIGFzc2VydE5vZGVUeXBlKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIiwgXCJDbGFzc0ltcGxlbWVudHNcIiksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG1peGluczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVjbGFyZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGFic3RyYWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHBhcmVudCwga2V5LCBub2RlKSB7XG4gICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgaWYgKCFpcyhcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLCBwYXJlbnQpKSB7XG4gICAgICAgIGlkZW50aWZpZXIobm9kZSwgXCJpZFwiLCBub2RlLmlkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpLFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcInNvdXJjZVwiXSxcbiAgdmlzaXRvcjogW1wic291cmNlXCIsIFwiYXR0cmlidXRlc1wiLCBcImFzc2VydGlvbnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRGVjbGFyYXRpb25cIixcbiAgICBcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIixcbiAgICBcIkV4cG9ydERlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIHNvdXJjZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICB9LFxuICAgIGV4cG9ydEtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIikpLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkltcG9ydEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgLy8gVE9ETyhCYWJlbCA4KTogRGVwcmVjYXRlZFxuICAgIGFzc2VydGlvbnM6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkltcG9ydEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uXCJdLFxuICBhbGlhc2VzOiBbXG4gICAgXCJTdGF0ZW1lbnRcIixcbiAgICBcIkRlY2xhcmF0aW9uXCIsXG4gICAgXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgXCJFeHBvcnREZWNsYXJhdGlvblwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBkZWNsYXJhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsXG4gICAgICAgIFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxuICAgICAgICBcIkNsYXNzRGVjbGFyYXRpb25cIixcbiAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgZXhwb3J0S2luZDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZihcInZhbHVlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiXSxcbiAgdmlzaXRvcjogW1wiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIsIFwiYXR0cmlidXRlc1wiLCBcImFzc2VydGlvbnNcIl0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRGVjbGFyYXRpb25cIixcbiAgICBcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIixcbiAgICBcIkV4cG9ydERlY2xhcmF0aW9uXCIsXG4gIF0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmF0aW9uOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJEZWNsYXJhdGlvblwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRoaXMgdmFsaWRhdG9yIGlzbid0IHB1dCBhdCB0aGUgdG9wIGxldmVsIGJlY2F1c2Ugd2UgY2FuIHJ1biBpdFxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGlzIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LlxuXG4gICAgICAgICAgICBpZiAodmFsICYmIG5vZGUuc3BlY2lmaWVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIk9ubHkgZGVjbGFyYXRpb24gb3Igc3BlY2lmaWVycyBpcyBhbGxvd2VkIG9uIEV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICB7IG9uZU9mTm9kZVR5cGVzOiBbXCJEZWNsYXJhdGlvblwiXSB9LFxuICAgICAgICApLFxuICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gVGhpcyB2YWxpZGF0b3IgaXNuJ3QgcHV0IGF0IHRoZSB0b3AgbGV2ZWwgYmVjYXVzZSB3ZSBjYW4gcnVuIGl0XG4gICAgICAgICAgLy8gZXZlbiBpZiB0aGlzIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LlxuXG4gICAgICAgICAgaWYgKHZhbCAmJiBub2RlLnNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBleHBvcnQgYSBkZWNsYXJhdGlvbiBmcm9tIGEgc291cmNlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIC8vIFRPRE8oQmFiZWwgOCk6IERlcHJlY2F0ZWRcbiAgICBhc3NlcnRpb25zOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHNwZWNpZmllcnM6IHtcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlZCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgICBcIkV4cG9ydFNwZWNpZmllclwiLFxuICAgICAgICAgICAgICBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIixcbiAgICAgICAgICAgICAgXCJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VsZXNzID0gYXNzZXJ0Tm9kZVR5cGUoXCJFeHBvcnRTcGVjaWZpZXJcIik7XG5cbiAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lORykgcmV0dXJuIHNvdXJjZWQ7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBub2RlLnNvdXJjZSA/IHNvdXJjZWQgOiBzb3VyY2VsZXNzO1xuICAgICAgICAgICAgICB2YWxpZGF0b3Iobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgICAgfSBhcyBWYWxpZGF0b3I7XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBzb3VyY2U6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGV4cG9ydEtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiLCBcImV4cG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGxvY2FsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgZXhwb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgZXhwb3J0S2luZDoge1xuICAgICAgLy8gQW5kIFR5cGVTY3JpcHQncyBcImV4cG9ydCB7IHR5cGUgZm9vIH0gZnJvbVwiXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXCJ0eXBlXCIsIFwidmFsdWVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJGb3JPZlN0YXRlbWVudFwiLCB7XG4gIHZpc2l0b3I6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIiwgXCJhd2FpdFwiXSxcbiAgYWxpYXNlczogW1xuICAgIFwiU2NvcGFibGVcIixcbiAgICBcIlN0YXRlbWVudFwiLFxuICAgIFwiRm9yXCIsXG4gICAgXCJCbG9ja1BhcmVudFwiLFxuICAgIFwiTG9vcFwiLFxuICAgIFwiRm9yWFN0YXRlbWVudFwiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HKSB7XG4gICAgICAgICAgcmV0dXJuIGFzc2VydE5vZGVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCBcIkxWYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKTtcbiAgICAgICAgY29uc3QgbHZhbCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICAgIFwiTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiQXJyYXlQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJPYmplY3RQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsXG4gICAgICAgICAgXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICAgICAgICBcIlRTTm9uTnVsbEV4cHJlc3Npb25cIixcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGtleSwgdmFsKSB7XG4gICAgICAgICAgaWYgKGlzKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCB2YWwpKSB7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGx2YWwobm9kZSwga2V5LCB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlN0YXRlbWVudFwiKSxcbiAgICB9LFxuICAgIGF3YWl0OiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnREZWNsYXJhdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIl0sXG4gIHZpc2l0b3I6IFtcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIiwgXCJhdHRyaWJ1dGVzXCIsIFwiYXNzZXJ0aW9uc1wiXSxcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIiwgXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIC8vIFRPRE8oQmFiZWwgOCk6IERlcHJlY2F0ZWRcbiAgICBhc3NlcnRpb25zOiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJJbXBvcnRBdHRyaWJ1dGVcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICAgIG1vZHVsZToge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICB9LFxuICAgIHNwZWNpZmllcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkltcG9ydFNwZWNpZmllclwiLFxuICAgICAgICAgICAgXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgICAgICAgICBcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0sXG4gICAgc291cmNlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgLy8gSGFuZGxlIFR5cGVTY3JpcHQvRmxvd3R5cGUncyBleHRlbnNpb24gXCJpbXBvcnQgdHlwZSBmb28gZnJvbVwiXG4gICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlb2ZcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcInR5cGVcIiwgXCJ0eXBlb2ZcIiwgXCJ2YWx1ZVwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiXSxcbiAgYWxpYXNlczogW1wiTW9kdWxlU3BlY2lmaWVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsb2NhbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiXSxcbiAgYWxpYXNlczogW1wiTW9kdWxlU3BlY2lmaWVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBsb2NhbDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbXBvcnRTcGVjaWZpZXJcIiwge1xuICB2aXNpdG9yOiBbXCJsb2NhbFwiLCBcImltcG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGxvY2FsOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIH0sXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgLy8gSGFuZGxlIEZsb3d0eXBlJ3MgZXh0ZW5zaW9uIFwiaW1wb3J0IHt0eXBlb2YgZm9vfSBmcm9tXCJcbiAgICAgIC8vIEFuZCBUeXBlU2NyaXB0J3MgXCJpbXBvcnQgeyB0eXBlIGZvbyB9IGZyb21cIlxuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwidHlwZVwiLCBcInR5cGVvZlwiLCBcInZhbHVlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTWV0YVByb3BlcnR5XCIsIHtcbiAgdmlzaXRvcjogW1wibWV0YVwiLCBcInByb3BlcnR5XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBtZXRhOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5NZXRhUHJvcGVydHksIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IHByb3BlcnR5O1xuICAgICAgICAgICAgc3dpdGNoICh2YWwubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IFwic2VudFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwibmV3XCI6XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBcInRhcmdldFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiaW1wb3J0XCI6XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBcIm1ldGFcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXMoXCJJZGVudGlmaWVyXCIsIG5vZGUucHJvcGVydHksIHsgbmFtZTogcHJvcGVydHkgfSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVucmVjb2duaXNlZCBNZXRhUHJvcGVydHlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyBvbmVPZk5vZGVUeXBlczogW1wiSWRlbnRpZmllclwiXSB9LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTWV0aG9kT3JQcm9wZXJ0eUNvbW1vbiA9ICgpID0+ICh7XG4gIGFic3RyYWN0OiB7XG4gICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIGFjY2Vzc2liaWxpdHk6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0T25lT2YoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIpLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9LFxuICBzdGF0aWM6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgb3ZlcnJpZGU6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgb3B0aW9uYWw6IHtcbiAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAga2V5OiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJTdHJpbmdMaXRlcmFsXCIsXG4gICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGU6IGFueSwga2V5OiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgIHZhbGlkYXRvcihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgIH07XG4gICAgICB9KSgpLFxuICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiSWRlbnRpZmllclwiLFxuICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICBcIkJpZ0ludExpdGVyYWxcIixcbiAgICAgICAgXCJFeHByZXNzaW9uXCIsXG4gICAgICApLFxuICAgICksXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uID0gKCkgPT4gKHtcbiAgLi4uZnVuY3Rpb25Db21tb24oKSxcbiAgLi4uY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uKCksXG4gIHBhcmFtczoge1xuICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJQYXR0ZXJuXCIsXG4gICAgICAgICAgXCJSZXN0RWxlbWVudFwiLFxuICAgICAgICAgIFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICB9LFxuICBraW5kOiB7XG4gICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIsIFwiY29uc3RydWN0b3JcIiksXG4gICAgZGVmYXVsdDogXCJtZXRob2RcIixcbiAgfSxcbiAgYWNjZXNzOiB7XG4gICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgICAgYXNzZXJ0T25lT2YoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIpLFxuICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG4gIGRlY29yYXRvcnM6IHtcbiAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICksXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkNsYXNzTWV0aG9kXCIsIHtcbiAgYWxpYXNlczogW1wiRnVuY3Rpb25cIiwgXCJTY29wYWJsZVwiLCBcIkJsb2NrUGFyZW50XCIsIFwiRnVuY3Rpb25QYXJlbnRcIiwgXCJNZXRob2RcIl0sXG4gIGJ1aWxkZXI6IFtcbiAgICBcImtpbmRcIixcbiAgICBcImtleVwiLFxuICAgIFwicGFyYW1zXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJjb21wdXRlZFwiLFxuICAgIFwic3RhdGljXCIsXG4gICAgXCJnZW5lcmF0b3JcIixcbiAgICBcImFzeW5jXCIsXG4gIF0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImtleVwiLFxuICAgIFwicGFyYW1zXCIsXG4gICAgXCJib2R5XCIsXG4gICAgXCJkZWNvcmF0b3JzXCIsXG4gICAgXCJyZXR1cm5UeXBlXCIsXG4gICAgXCJ0eXBlUGFyYW1ldGVyc1wiLFxuICBdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5jbGFzc01ldGhvZE9yRGVjbGFyZU1ldGhvZENvbW1vbigpLFxuICAgIC4uLmZ1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb24oKSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RQYXR0ZXJuXCIsIHtcbiAgdmlzaXRvcjogW1xuICAgIFwicHJvcGVydGllc1wiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIiAvKiBmb3IgbGVnYWN5IHBhcmFtIGRlY29yYXRvcnMgKi8sXG4gIF0sXG4gIGJ1aWxkZXI6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIlBhdHRlcm5cIiwgXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLnBhdHRlcm5MaWtlQ29tbW9uKCksXG4gICAgcHJvcGVydGllczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlJlc3RFbGVtZW50XCIsIFwiT2JqZWN0UHJvcGVydHlcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJTcHJlYWRFbGVtZW50XCIsIHtcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIlVuYXJ5TGlrZVwiXSxcbiAgZGVwcmVjYXRlZEFsaWFzOiBcIlNwcmVhZFByb3BlcnR5XCIsXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcbiAgXCJTdXBlclwiLFxuICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHtcbiAgICAgICAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgICAgIH0sXG4pO1xuXG5kZWZpbmVUeXBlKFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1widGFnXCIsIFwicXVhc2lcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgYnVpbGRlcjogW1widGFnXCIsIFwicXVhc2lcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHRhZzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIHF1YXNpOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUZW1wbGF0ZUxpdGVyYWxcIiksXG4gICAgfSxcbiAgICB0eXBlUGFyYW1ldGVyczoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICBcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsXG4gICAgICAgIFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRlbXBsYXRlRWxlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCIsIFwidGFpbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0U2hhcGUoe1xuICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvb2tlZDoge1xuICAgICAgICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBmdW5jdGlvbiB0ZW1wbGF0ZUVsZW1lbnRDb29rZWRWYWxpZGF0b3Iobm9kZTogdC5UZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByYXcgPSBub2RlLnZhbHVlLnJhdztcblxuICAgICAgICAgIGxldCB1bnRlcm1pbmF0ZWRDYWxsZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gdW5yZWFjaGFibGVcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVybmFsIEBiYWJlbC90eXBlcyBlcnJvci5cIik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB7IHN0ciwgZmlyc3RJbnZhbGlkTG9jIH0gPSByZWFkU3RyaW5nQ29udGVudHMoXG4gICAgICAgICAgICBcInRlbXBsYXRlXCIsXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVudGVybWluYXRlZCgpIHtcbiAgICAgICAgICAgICAgICB1bnRlcm1pbmF0ZWRDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzdHJpY3ROdW1lcmljRXNjYXBlOiBlcnJvcixcbiAgICAgICAgICAgICAgaW52YWxpZEVzY2FwZVNlcXVlbmNlOiBlcnJvcixcbiAgICAgICAgICAgICAgbnVtZXJpY1NlcGFyYXRvckluRXNjYXBlU2VxdWVuY2U6IGVycm9yLFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkTnVtZXJpY1NlcGFyYXRvcjogZXJyb3IsXG4gICAgICAgICAgICAgIGludmFsaWREaWdpdDogZXJyb3IsXG4gICAgICAgICAgICAgIGludmFsaWRDb2RlUG9pbnQ6IGVycm9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdW50ZXJtaW5hdGVkQ2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJhd1wiKTtcblxuICAgICAgICAgIG5vZGUudmFsdWUuY29va2VkID0gZmlyc3RJbnZhbGlkTG9jID8gbnVsbCA6IHN0cjtcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICB0YWlsOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUZW1wbGF0ZUxpdGVyYWxcIiwge1xuICB2aXNpdG9yOiBbXCJxdWFzaXNcIiwgXCJleHByZXNzaW9uc1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxpdGVyYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIHF1YXNpczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlRlbXBsYXRlRWxlbWVudFwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgZXhwcmVzc2lvbnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkV4cHJlc3Npb25cIixcbiAgICAgICAgICAgIC8vIEZvciBUeXBlU2NyaXB0IHRlbXBsYXRlIGxpdGVyYWwgdHlwZXNcbiAgICAgICAgICAgIFwiVFNUeXBlXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuVGVtcGxhdGVMaXRlcmFsLCBrZXksIHZhbCkge1xuICAgICAgICAgIGlmIChub2RlLnF1YXNpcy5sZW5ndGggIT09IHZhbC5sZW5ndGggKyAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgTnVtYmVyIG9mICR7XG4gICAgICAgICAgICAgICAgbm9kZS50eXBlXG4gICAgICAgICAgICAgIH0gcXVhc2lzIHNob3VsZCBiZSBleGFjdGx5IG9uZSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBleHByZXNzaW9ucy5cXG5FeHBlY3RlZCAke1xuICAgICAgICAgICAgICAgIHZhbC5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIH0gcXVhc2lzIGJ1dCBnb3QgJHtub2RlLnF1YXNpcy5sZW5ndGh9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiWWllbGRFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiYXJndW1lbnRcIiwgXCJkZWxlZ2F0ZVwiXSxcbiAgdmlzaXRvcjogW1wiYXJndW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJUZXJtaW5hdG9ybGVzc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVsZWdhdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBmdW5jdGlvbiAobm9kZTogdC5ZaWVsZEV4cHJlc3Npb24sIGtleSwgdmFsKSB7XG4gICAgICAgICAgICBpZiAoIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkcpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHZhbCAmJiAhbm9kZS5hcmd1bWVudCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiUHJvcGVydHkgZGVsZWdhdGUgb2YgWWllbGRFeHByZXNzaW9uIGNhbm5vdCBiZSB0cnVlIGlmIHRoZXJlIGlzIG5vIGFyZ3VtZW50XCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBhcyBWYWxpZGF0b3IsXG4gICAgICAgICAgeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbi8vIC0tLSBFUzIwMTcgLS0tXG5kZWZpbmVUeXBlKFwiQXdhaXRFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiYXJndW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiVGVybWluYXRvcmxlc3NcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLy8gLS0tIEVTMjAxOSAtLS1cbmRlZmluZVR5cGUoXCJJbXBvcnRcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIC0tLSBFUzIwMjAgLS0tXG5kZWZpbmVUeXBlKFwiQmlnSW50TGl0ZXJhbFwiLCB7XG4gIGJ1aWxkZXI6IFtcInZhbHVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiUHVyZWlzaFwiLCBcIkxpdGVyYWxcIiwgXCJJbW11dGFibGVcIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiLCB7XG4gIHZpc2l0b3I6IFtcImV4cG9ydGVkXCJdLFxuICBhbGlhc2VzOiBbXCJNb2R1bGVTcGVjaWZpZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cG9ydGVkOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiLCB7XG4gIGJ1aWxkZXI6IFtcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIiwgXCJvcHRpb25hbFwiXSxcbiAgdmlzaXRvcjogW1wib2JqZWN0XCIsIFwicHJvcGVydHlcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIpO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3I6IFZhbGlkYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgZnVuY3Rpb24gKG5vZGU6IHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLCBrZXksIHZhbCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gbm9kZS5jb21wdXRlZCA/IGNvbXB1dGVkIDogbm9ybWFsO1xuICAgICAgICAgICAgdmFsaWRhdG9yKG5vZGUsIGtleSwgdmFsKTtcbiAgICAgICAgICB9IGFzIFZhbGlkYXRvcixcbiAgICAgICAgICAvLyB0b2RvKHRzKTogY2FuIGJlIGRpc2NyaW1pbmF0ZWQgdW5pb24gYnkgYGNvbXB1dGVkYCBwcm9wZXJ0eVxuICAgICAgICAgIHsgb25lT2ZOb2RlVHlwZXM6IFtcIkV4cHJlc3Npb25cIiwgXCJJZGVudGlmaWVyXCJdIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgb3B0aW9uYWw6IHtcbiAgICAgIHZhbGlkYXRlOiAhcHJvY2Vzcy5lbnYuQkFCRUxfVFlQRVNfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIilcbiAgICAgICAgOiBjaGFpbihhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLCBhc3NlcnRPcHRpb25hbENoYWluU3RhcnQoKSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwidHlwZUFyZ3VtZW50c1wiXSxcbiAgYnVpbGRlcjogW1wiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIsIFwib3B0aW9uYWxcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGNhbGxlZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICAgIGFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChcbiAgICAgICAgICBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICAgICAgICBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIixcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9LFxuICAgIG9wdGlvbmFsOiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMX1RZUEVTXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpXG4gICAgICAgIDogY2hhaW4oYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSwgYXNzZXJ0T3B0aW9uYWxDaGFpblN0YXJ0KCkpLFxuICAgIH0sXG4gICAgdHlwZUFyZ3VtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vLyAtLS0gRVMyMDIyIC0tLVxuZGVmaW5lVHlwZShcIkNsYXNzUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYnVpbGRlcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgXSxcbiAgYWxpYXNlczogW1wiUHJvcGVydHlcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLmNsYXNzTWV0aG9kT3JQcm9wZXJ0eUNvbW1vbigpLFxuICAgIHZhbHVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWZpbml0ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHR5cGVBbm5vdGF0aW9uOiB7XG4gICAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgICA/IGFzc2VydE5vZGVUeXBlKFwiVHlwZUFubm90YXRpb25cIiwgXCJUU1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIDogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICBcIlRTVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICAgICAgXCJOb29wXCIsXG4gICAgICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVjb3JhdG9yczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkRlY29yYXRvclwiKSksXG4gICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICByZWFkb25seToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY2xhcmU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB2YXJpYW5jZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFuY2VcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiZGVjb3JhdG9yc1wiXSxcbiAgYnVpbGRlcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwidHlwZUFubm90YXRpb25cIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcImNvbXB1dGVkXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgXSxcbiAgYWxpYXNlczogW1wiUHJvcGVydHlcIiwgXCJBY2Nlc3NvclwiXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uKCksXG4gICAga2V5OiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsID0gYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIklkZW50aWZpZXJcIixcbiAgICAgICAgICAgIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgICBcIlByaXZhdGVOYW1lXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKTtcblxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZTogYW55LCBrZXk6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IG5vZGUuY29tcHV0ZWQgPyBjb21wdXRlZCA6IG5vcm1hbDtcbiAgICAgICAgICAgIHZhbGlkYXRvcihub2RlLCBrZXksIHZhbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgXCJTdHJpbmdMaXRlcmFsXCIsXG4gICAgICAgICAgXCJOdW1lcmljTGl0ZXJhbFwiLFxuICAgICAgICAgIFwiQmlnSW50TGl0ZXJhbFwiLFxuICAgICAgICAgIFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgIFwiUHJpdmF0ZU5hbWVcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVmaW5pdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB0eXBlQW5ub3RhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlR5cGVBbm5vdGF0aW9uXCIsIFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICA6IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgICAgXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICAgXCJUU1R5cGVBbm5vdGF0aW9uXCIsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgICAgIFwiTm9vcFwiLFxuICAgICAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgcmVhZG9ubHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNsYXJlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdmFyaWFuY2U6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIlZhcmlhbmNlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiwge1xuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcImRlY29yYXRvcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYnVpbGRlcjogW1wia2V5XCIsIFwidmFsdWVcIiwgXCJkZWNvcmF0b3JzXCIsIFwic3RhdGljXCJdLFxuICBhbGlhc2VzOiBbXCJQcm9wZXJ0eVwiLCBcIlByaXZhdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJpdmF0ZU5hbWVcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgdHlwZUFubm90YXRpb246IHtcbiAgICAgIHZhbGlkYXRlOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICAgID8gYXNzZXJ0Tm9kZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICAgIFwiVHlwZUFubm90YXRpb25cIixcbiAgICAgICAgICAgIFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZShCYWJlbCA3IHZzIEJhYmVsIDgpIEJhYmVsIDcgQVNUXG4gICAgICAgICAgICBcIk5vb3BcIixcbiAgICAgICAgICApLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWNvcmF0b3JzOiB7XG4gICAgICB2YWxpZGF0ZTogY2hhaW4oXG4gICAgICAgIGFzc2VydFZhbHVlVHlwZShcImFycmF5XCIpLFxuICAgICAgICBhc3NlcnRFYWNoKGFzc2VydE5vZGVUeXBlKFwiRGVjb3JhdG9yXCIpKSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHN0YXRpYzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICAgIHJlYWRvbmx5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgZGVmaW5pdGU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICB2YXJpYW5jZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVmFyaWFuY2VcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJDbGFzc1ByaXZhdGVNZXRob2RcIiwge1xuICBidWlsZGVyOiBbXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcInN0YXRpY1wiXSxcbiAgdmlzaXRvcjogW1xuICAgIFwia2V5XCIsXG4gICAgXCJwYXJhbXNcIixcbiAgICBcImJvZHlcIixcbiAgICBcImRlY29yYXRvcnNcIixcbiAgICBcInJldHVyblR5cGVcIixcbiAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gIF0sXG4gIGFsaWFzZXM6IFtcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJTY29wYWJsZVwiLFxuICAgIFwiQmxvY2tQYXJlbnRcIixcbiAgICBcIkZ1bmN0aW9uUGFyZW50XCIsXG4gICAgXCJNZXRob2RcIixcbiAgICBcIlByaXZhdGVcIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb24oKSxcbiAgICAuLi5mdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIpLFxuICAgICAgZGVmYXVsdDogXCJtZXRob2RcIixcbiAgICB9LFxuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJpdmF0ZU5hbWVcIiksXG4gICAgfSxcbiAgICBib2R5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJCbG9ja1N0YXRlbWVudFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJQcml2YXRlTmFtZVwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJQcml2YXRlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJTdGF0aWNCbG9ja1wiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGJvZHk6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJTdGF0ZW1lbnRcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJTY29wYWJsZVwiLCBcIkJsb2NrUGFyZW50XCIsIFwiRnVuY3Rpb25QYXJlbnRcIl0sXG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXJyYXlPZlR5cGUsXG4gIGFzc2VydE9uZU9mLFxuICBhc3NlcnRWYWx1ZVR5cGUsXG4gIHZhbGlkYXRlLFxuICB2YWxpZGF0ZUFycmF5T2ZUeXBlLFxuICB2YWxpZGF0ZU9wdGlvbmFsLFxuICB2YWxpZGF0ZU9wdGlvbmFsVHlwZSxcbiAgdmFsaWRhdGVUeXBlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBkZWZpbmVUeXBlID0gZGVmaW5lQWxpYXNlZFR5cGUoXCJGbG93XCIpO1xuXG5jb25zdCBkZWZpbmVJbnRlcmZhY2Vpc2hUeXBlID0gKFxuICBuYW1lOiBcIkRlY2xhcmVDbGFzc1wiIHwgXCJEZWNsYXJlSW50ZXJmYWNlXCIgfCBcIkludGVyZmFjZURlY2xhcmF0aW9uXCIsXG4pID0+IHtcbiAgY29uc3QgaXNEZWNsYXJlQ2xhc3MgPSBuYW1lID09PSBcIkRlY2xhcmVDbGFzc1wiO1xuXG4gIGRlZmluZVR5cGUobmFtZSwge1xuICAgIGJ1aWxkZXI6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJleHRlbmRzXCIsIFwiYm9keVwiXSxcbiAgICB2aXNpdG9yOiBbXG4gICAgICBcImlkXCIsXG4gICAgICBcInR5cGVQYXJhbWV0ZXJzXCIsXG4gICAgICBcImV4dGVuZHNcIixcbiAgICAgIC4uLihpc0RlY2xhcmVDbGFzcyA/IFtcIm1peGluc1wiLCBcImltcGxlbWVudHNcIl0gOiBbXSksXG4gICAgICBcImJvZHlcIixcbiAgICBdLFxuICAgIGFsaWFzZXM6IFtcIkZsb3dEZWNsYXJhdGlvblwiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICAgIGZpZWxkczoge1xuICAgICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksXG4gICAgICBleHRlbmRzOiB2YWxpZGF0ZU9wdGlvbmFsKGFycmF5T2ZUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKSksXG4gICAgICAuLi4oaXNEZWNsYXJlQ2xhc3NcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtaXhpbnM6IHZhbGlkYXRlT3B0aW9uYWwoYXJyYXlPZlR5cGUoXCJJbnRlcmZhY2VFeHRlbmRzXCIpKSxcbiAgICAgICAgICAgIGltcGxlbWVudHM6IHZhbGlkYXRlT3B0aW9uYWwoYXJyYXlPZlR5cGUoXCJDbGFzc0ltcGxlbWVudHNcIikpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBib2R5OiB2YWxpZGF0ZVR5cGUoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSxcbiAgICB9LFxuICB9KTtcbn07XG5cbmRlZmluZVR5cGUoXCJBbnlUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiZWxlbWVudFR5cGVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBlbGVtZW50VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiQ2xhc3NJbXBsZW1lbnRzXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lSW50ZXJmYWNlaXNoVHlwZShcIkRlY2xhcmVDbGFzc1wiKTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVGdW5jdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgcHJlZGljYXRlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZUludGVyZmFjZWlzaFR5cGUoXCJEZWNsYXJlSW50ZXJmYWNlXCIpO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZU1vZHVsZVwiLCB7XG4gIGJ1aWxkZXI6IFtcImlkXCIsIFwiYm9keVwiLCBcImtpbmRcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlN0cmluZ0xpdGVyYWxcIl0pLFxuICAgIGJvZHk6IHZhbGlkYXRlVHlwZShcIkJsb2NrU3RhdGVtZW50XCIpLFxuICAgIGtpbmQ6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YoXCJDb21tb25KU1wiLCBcIkVTXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUeXBlQW5ub3RhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjbGFyZVR5cGVBbGlhc1wiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICByaWdodDogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVPcGFxdWVUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICBzdXBlcnR5cGU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgaW1wbHR5cGU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVWYXJpYWJsZVwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd0RlY2xhcmF0aW9uXCIsIFwiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmF0aW9uOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkZsb3dcIiksXG4gICAgc3BlY2lmaWVyczogdmFsaWRhdGVPcHRpb25hbChcbiAgICAgIGFycmF5T2ZUeXBlKFtcIkV4cG9ydFNwZWNpZmllclwiLCBcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiXSksXG4gICAgKSxcbiAgICBzb3VyY2U6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICBkZWZhdWx0OiB2YWxpZGF0ZU9wdGlvbmFsKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJzb3VyY2VcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dEZWNsYXJhdGlvblwiLCBcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBzb3VyY2U6IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgZXhwb3J0S2luZDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZihcInR5cGVcIiwgXCJ2YWx1ZVwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRlY2xhcmVkUHJlZGljYXRlXCIsIHtcbiAgdmlzaXRvcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dQcmVkaWNhdGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB2YWxpZGF0ZVR5cGUoXCJGbG93XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1widHlwZVBhcmFtZXRlcnNcIiwgXCJwYXJhbXNcIiwgXCJyZXN0XCIsIFwicmV0dXJuVHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICBwYXJhbXM6IHZhbGlkYXRlKGFycmF5T2ZUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIikpLFxuICAgIHJlc3Q6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiksXG4gICAgdGhpczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJGdW5jdGlvblR5cGVQYXJhbVwiKSxcbiAgICByZXR1cm5UeXBlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiwge1xuICB2aXNpdG9yOiBbXCJuYW1lXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgb3B0aW9uYWw6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiXSksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkluZmVycmVkUHJlZGljYXRlXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1ByZWRpY2F0ZVwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSW50ZXJmYWNlRXh0ZW5kc1wiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCJdKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVJbnRlcmZhY2Vpc2hUeXBlKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIik7XG5cbmRlZmluZVR5cGUoXCJJbnRlcmZhY2VUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcImV4dGVuZHNcIiwgXCJib2R5XCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXh0ZW5kczogdmFsaWRhdGVPcHRpb25hbChhcnJheU9mVHlwZShcIkludGVyZmFjZUV4dGVuZHNcIikpLFxuICAgIGJvZHk6IHZhbGlkYXRlVHlwZShcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVzXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZXM6IHZhbGlkYXRlKGFycmF5T2ZUeXBlKFwiRmxvd1R5cGVcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJNaXhlZFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIiwgXCJGbG93QmFzZUFubm90YXRpb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVtcHR5VHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb25cIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJudW1iZXJcIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJOdW1iZXJUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIiwgXCJpbmRleGVyc1wiLCBcImNhbGxQcm9wZXJ0aWVzXCIsIFwiaW50ZXJuYWxTbG90c1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGJ1aWxkZXI6IFtcbiAgICBcInByb3BlcnRpZXNcIixcbiAgICBcImluZGV4ZXJzXCIsXG4gICAgXCJjYWxsUHJvcGVydGllc1wiLFxuICAgIFwiaW50ZXJuYWxTbG90c1wiLFxuICAgIFwiZXhhY3RcIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgcHJvcGVydGllczogdmFsaWRhdGUoXG4gICAgICBhcnJheU9mVHlwZShbXCJPYmplY3RUeXBlUHJvcGVydHlcIiwgXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIl0pLFxuICAgICksXG4gICAgaW5kZXhlcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBhcnJheU9mVHlwZShcIk9iamVjdFR5cGVJbmRleGVyXCIpLFxuICAgICAgb3B0aW9uYWw6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBmYWxzZSA6IHRydWUsXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICAgIGNhbGxQcm9wZXJ0aWVzOiB7XG4gICAgICB2YWxpZGF0ZTogYXJyYXlPZlR5cGUoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIpLFxuICAgICAgb3B0aW9uYWw6IHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBmYWxzZSA6IHRydWUsXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICAgIGludGVybmFsU2xvdHM6IHtcbiAgICAgIHZhbGlkYXRlOiBhcnJheU9mVHlwZShcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIiksXG4gICAgICBvcHRpb25hbDogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IFtdLFxuICAgIH0sXG4gICAgZXhhY3Q6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICAvLyBJZiB0aGUgaW5leGFjdCBmbGFnIGlzIHByZXNlbnQgdGhlbiB0aGlzIGlzIGFuIG9iamVjdCB0eXBlLCBhbmQgbm90IGFcbiAgICAvLyBkZWNsYXJlIGNsYXNzLCBkZWNsYXJlIGludGVyZmFjZSwgb3IgaW50ZXJmYWNlLiBJZiBpdCBpcyB0cnVlLCB0aGVcbiAgICAvLyBvYmplY3QgdXNlcyAuLi4gdG8gZXhwcmVzcyB0aGF0IGl0IGlzIGluZXhhY3QuXG4gICAgaW5leGFjdDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiLCB7XG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidmFsdWVcIiwgXCJvcHRpb25hbFwiLCBcInN0YXRpY1wiLCBcIm1ldGhvZFwiXSxcbiAgYWxpYXNlczogW1wiVXNlcldoaXRlc3BhY2FibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIHZhbHVlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgICBtZXRob2Q6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsIHtcbiAgdmlzaXRvcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiT2JqZWN0VHlwZUluZGV4ZXJcIiwge1xuICB2aXNpdG9yOiBbXCJpZFwiLCBcImtleVwiLCBcInZhbHVlXCIsIFwidmFyaWFuY2VcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIGtleTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgdmFsdWU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIHN0YXRpYzogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgdmFyaWFuY2U6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVmFyaWFuY2VcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdFR5cGVQcm9wZXJ0eVwiLCB7XG4gIHZpc2l0b3I6IFtcImtleVwiLCBcInZhbHVlXCIsIFwidmFyaWFuY2VcIl0sXG4gIGFsaWFzZXM6IFtcIlVzZXJXaGl0ZXNwYWNhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBrZXk6IHZhbGlkYXRlVHlwZShbXCJJZGVudGlmaWVyXCIsIFwiU3RyaW5nTGl0ZXJhbFwiXSksXG4gICAgdmFsdWU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIGtpbmQ6IHZhbGlkYXRlKGFzc2VydE9uZU9mKFwiaW5pdFwiLCBcImdldFwiLCBcInNldFwiKSksXG4gICAgc3RhdGljOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgICBwcm90bzogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgb3B0aW9uYWw6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIHZhcmlhbmNlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlZhcmlhbmNlXCIpLFxuICAgIG1ldGhvZDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiLCB7XG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJVc2VyV2hpdGVzcGFjYWJsZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJPcGFxdWVUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiLCBcImltcGx0eXBlXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLFxuICAgIHN1cGVydHlwZTogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBpbXBsdHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJxdWFsaWZpY2F0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBxdWFsaWZpY2F0aW9uOiB2YWxpZGF0ZVR5cGUoW1wiSWRlbnRpZmllclwiLCBcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCJdKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICB2YWx1ZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3RyaW5nVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiU3ltYm9sVHlwZUFubm90YXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiLCBcIkZsb3dCYXNlQW5ub3RhdGlvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIiwgXCJGbG93QmFzZUFubm90YXRpb25cIl0sXG59KTtcblxuZGVmaW5lVHlwZShcIlR1cGxlVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlc1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZShhcnJheU9mVHlwZShcIkZsb3dUeXBlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZW9mVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZUFsaWFzXCIsIHtcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInJpZ2h0XCJdLFxuICBhbGlhc2VzOiBbXCJGbG93RGVjbGFyYXRpb25cIiwgXCJTdGF0ZW1lbnRcIiwgXCJEZWNsYXJhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLFxuICAgIHJpZ2h0OiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUeXBlQ2FzdEV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25XcmFwcGVyXCIsIFwiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwcmVzc2lvbjogdmFsaWRhdGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVHlwZUFubm90YXRpb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlR5cGVQYXJhbWV0ZXJcIiwge1xuICB2aXNpdG9yOiBbXCJib3VuZFwiLCBcImRlZmF1bHRcIiwgXCJ2YXJpYW5jZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpKSxcbiAgICBib3VuZDogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUeXBlQW5ub3RhdGlvblwiKSxcbiAgICBkZWZhdWx0OiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIHZhcmlhbmNlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlZhcmlhbmNlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczogdmFsaWRhdGUoYXJyYXlPZlR5cGUoXCJUeXBlUGFyYW1ldGVyXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczogdmFsaWRhdGUoYXJyYXlPZlR5cGUoXCJGbG93VHlwZVwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlVuaW9uVHlwZUFubm90YXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJ0eXBlc1wiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZShhcnJheU9mVHlwZShcIkZsb3dUeXBlXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVmFyaWFuY2VcIiwge1xuICBidWlsZGVyOiBbXCJraW5kXCJdLFxuICBmaWVsZHM6IHtcbiAgICBraW5kOiB2YWxpZGF0ZShhc3NlcnRPbmVPZihcIm1pbnVzXCIsIFwicGx1c1wiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlZvaWRUeXBlQW5ub3RhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIkZsb3dUeXBlXCIsIFwiRmxvd0Jhc2VBbm5vdGF0aW9uXCJdLFxufSk7XG5cbi8vIEVudW1zXG5kZWZpbmVUeXBlKFwiRW51bURlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgYm9keTogdmFsaWRhdGVUeXBlKFtcbiAgICAgIFwiRW51bUJvb2xlYW5Cb2R5XCIsXG4gICAgICBcIkVudW1OdW1iZXJCb2R5XCIsXG4gICAgICBcIkVudW1TdHJpbmdCb2R5XCIsXG4gICAgICBcIkVudW1TeW1ib2xCb2R5XCIsXG4gICAgXSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1Cb29sZWFuQm9keVwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1Cb2R5XCJdLFxuICB2aXNpdG9yOiBbXCJtZW1iZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHBsaWNpdFR5cGU6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIG1lbWJlcnM6IHZhbGlkYXRlQXJyYXlPZlR5cGUoXCJFbnVtQm9vbGVhbk1lbWJlclwiKSxcbiAgICBoYXNVbmtub3duTWVtYmVyczogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1OdW1iZXJCb2R5XCIsIHtcbiAgYWxpYXNlczogW1wiRW51bUJvZHlcIl0sXG4gIHZpc2l0b3I6IFtcIm1lbWJlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cGxpY2l0VHlwZTogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIkVudW1OdW1iZXJNZW1iZXJcIiksXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFbnVtU3RyaW5nQm9keVwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1Cb2R5XCJdLFxuICB2aXNpdG9yOiBbXCJtZW1iZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHBsaWNpdFR5cGU6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICAgIG1lbWJlcnM6IHZhbGlkYXRlQXJyYXlPZlR5cGUoW1wiRW51bVN0cmluZ01lbWJlclwiLCBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIl0pLFxuICAgIGhhc1Vua25vd25NZW1iZXJzOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW51bVN5bWJvbEJvZHlcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtQm9keVwiXSxcbiAgdmlzaXRvcjogW1wibWVtYmVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIiksXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IHZhbGlkYXRlKGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIikpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFbnVtQm9vbGVhbk1lbWJlclwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1NZW1iZXJcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBpbml0OiB2YWxpZGF0ZVR5cGUoXCJCb29sZWFuTGl0ZXJhbFwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRW51bU51bWJlck1lbWJlclwiLCB7XG4gIGFsaWFzZXM6IFtcIkVudW1NZW1iZXJcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiaW5pdFwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgaW5pdDogdmFsaWRhdGVUeXBlKFwiTnVtZXJpY0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1TdHJpbmdNZW1iZXJcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtTWVtYmVyXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcImluaXRcIl0sXG4gIGZpZWxkczoge1xuICAgIGlkOiB2YWxpZGF0ZVR5cGUoXCJJZGVudGlmaWVyXCIpLFxuICAgIGluaXQ6IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIiwge1xuICBhbGlhc2VzOiBbXCJFbnVtTWVtYmVyXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiXSxcbiAgZmllbGRzOiB7XG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsIHtcbiAgdmlzaXRvcjogW1wib2JqZWN0VHlwZVwiLCBcImluZGV4VHlwZVwiXSxcbiAgYWxpYXNlczogW1wiRmxvd1R5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdFR5cGU6IHZhbGlkYXRlVHlwZShcIkZsb3dUeXBlXCIpLFxuICAgIGluZGV4VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIiwge1xuICB2aXNpdG9yOiBbXCJvYmplY3RUeXBlXCIsIFwiaW5kZXhUeXBlXCJdLFxuICBhbGlhc2VzOiBbXCJGbG93VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0VHlwZTogdmFsaWRhdGVUeXBlKFwiRmxvd1R5cGVcIiksXG4gICAgaW5kZXhUeXBlOiB2YWxpZGF0ZVR5cGUoXCJGbG93VHlwZVwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGUoYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSksXG4gIH0sXG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG4gIGFzc2VydEVhY2gsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGRlZmluZVR5cGUgPSBkZWZpbmVBbGlhc2VkVHlwZShcIkpTWFwiKTtcblxuZGVmaW5lVHlwZShcIkpTWEF0dHJpYnV0ZVwiLCB7XG4gIHZpc2l0b3I6IFtcIm5hbWVcIiwgXCJ2YWx1ZVwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIsIFwiSlNYTmFtZXNwYWNlZE5hbWVcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgIFwiSlNYRWxlbWVudFwiLFxuICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgICAgICBcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIixcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIiwge1xuICB2aXNpdG9yOiBbXCJuYW1lXCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgICAgIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEVsZW1lbnRcIiwge1xuICBidWlsZGVyOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgPyBbXCJvcGVuaW5nRWxlbWVudFwiLCBcImNsb3NpbmdFbGVtZW50XCIsIFwiY2hpbGRyZW5cIl1cbiAgICA6IFtcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiLCBcInNlbGZDbG9zaW5nXCJdLFxuICB2aXNpdG9yOiBbXCJvcGVuaW5nRWxlbWVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xvc2luZ0VsZW1lbnRcIl0sXG4gIGFsaWFzZXM6IFtcIkltbXV0YWJsZVwiLCBcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZW5pbmdFbGVtZW50OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hPcGVuaW5nRWxlbWVudFwiKSxcbiAgICB9LFxuICAgIGNsb3NpbmdFbGVtZW50OiB7XG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkpTWENsb3NpbmdFbGVtZW50XCIpLFxuICAgIH0sXG4gICAgY2hpbGRyZW46IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkpTWFRleHRcIixcbiAgICAgICAgICAgIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgXCJKU1hTcHJlYWRDaGlsZFwiLFxuICAgICAgICAgICAgXCJKU1hFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgc2VsZkNsb3Npbmc6IHtcbiAgICAgICAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJib29sZWFuXCIpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEVtcHR5RXhwcmVzc2lvblwiLCB7fSk7XG5cbmRlZmluZVR5cGUoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIsIFwiSlNYRW1wdHlFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWFNwcmVhZENoaWxkXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWElkZW50aWZpZXJcIiwge1xuICBidWlsZGVyOiBbXCJuYW1lXCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWE1lbWJlckV4cHJlc3Npb25cIiwge1xuICB2aXNpdG9yOiBbXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiXSxcbiAgZmllbGRzOiB7XG4gICAgb2JqZWN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIsIFwiSlNYSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIHByb3BlcnR5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWE5hbWVzcGFjZWROYW1lXCIsIHtcbiAgdmlzaXRvcjogW1wibmFtZXNwYWNlXCIsIFwibmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZXNwYWNlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJKU1hJZGVudGlmaWVyXCIpLFxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSlNYSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hPcGVuaW5nRWxlbWVudFwiLCB7XG4gIGJ1aWxkZXI6IFtcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCIsIFwic2VsZkNsb3NpbmdcIl0sXG4gIHZpc2l0b3I6IFtcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJKU1hJZGVudGlmaWVyXCIsXG4gICAgICAgIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgICAgICBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgc2VsZkNsb3Npbmc6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkpTWEF0dHJpYnV0ZVwiLCBcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gICAgdHlwZVBhcmFtZXRlcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLFxuICAgICAgICBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIiwge1xuICB2aXNpdG9yOiBbXCJhcmd1bWVudFwiXSxcbiAgZmllbGRzOiB7XG4gICAgYXJndW1lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYVGV4dFwiLCB7XG4gIGFsaWFzZXM6IFtcIkltbXV0YWJsZVwiXSxcbiAgYnVpbGRlcjogW1widmFsdWVcIl0sXG4gIGZpZWxkczoge1xuICAgIHZhbHVlOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwic3RyaW5nXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkpTWEZyYWdtZW50XCIsIHtcbiAgYnVpbGRlcjogW1wib3BlbmluZ0ZyYWdtZW50XCIsIFwiY2xvc2luZ0ZyYWdtZW50XCIsIFwiY2hpbGRyZW5cIl0sXG4gIHZpc2l0b3I6IFtcIm9wZW5pbmdGcmFnbWVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xvc2luZ0ZyYWdtZW50XCJdLFxuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIiwgXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBvcGVuaW5nRnJhZ21lbnQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkpTWE9wZW5pbmdGcmFnbWVudFwiKSxcbiAgICB9LFxuICAgIGNsb3NpbmdGcmFnbWVudDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIpLFxuICAgIH0sXG4gICAgY2hpbGRyZW46IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goXG4gICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXG4gICAgICAgICAgICBcIkpTWFRleHRcIixcbiAgICAgICAgICAgIFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgXCJKU1hTcHJlYWRDaGlsZFwiLFxuICAgICAgICAgICAgXCJKU1hFbGVtZW50XCIsXG4gICAgICAgICAgICBcIkpTWEZyYWdtZW50XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIsIHtcbiAgYWxpYXNlczogW1wiSW1tdXRhYmxlXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJJbW11dGFibGVcIl0sXG59KTtcbiIsICJpbXBvcnQgeyBBTElBU19LRVlTIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IFBMQUNFSE9MREVSUyA9IFtcbiAgXCJJZGVudGlmaWVyXCIsXG4gIFwiU3RyaW5nTGl0ZXJhbFwiLFxuICBcIkV4cHJlc3Npb25cIixcbiAgXCJTdGF0ZW1lbnRcIixcbiAgXCJEZWNsYXJhdGlvblwiLFxuICBcIkJsb2NrU3RhdGVtZW50XCIsXG4gIFwiQ2xhc3NCb2R5XCIsXG4gIFwiUGF0dGVyblwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFBMQUNFSE9MREVSU19BTElBUzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBEZWNsYXJhdGlvbjogW1wiU3RhdGVtZW50XCJdLFxuICBQYXR0ZXJuOiBbXCJQYXR0ZXJuTGlrZVwiLCBcIkxWYWxcIl0sXG59O1xuXG5mb3IgKGNvbnN0IHR5cGUgb2YgUExBQ0VIT0xERVJTKSB7XG4gIGNvbnN0IGFsaWFzID0gQUxJQVNfS0VZU1t0eXBlXTtcbiAgaWYgKGFsaWFzPy5sZW5ndGgpIFBMQUNFSE9MREVSU19BTElBU1t0eXBlXSA9IGFsaWFzO1xufVxuXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5PYmplY3Qua2V5cyhQTEFDRUhPTERFUlNfQUxJQVMpLmZvckVhY2godHlwZSA9PiB7XG4gIFBMQUNFSE9MREVSU19BTElBU1t0eXBlXS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTLCBhbGlhcykpIHtcbiAgICAgIFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTW2FsaWFzXSA9IFtdO1xuICAgIH1cbiAgICBQTEFDRUhPTERFUlNfRkxJUFBFRF9BTElBU1thbGlhc10ucHVzaCh0eXBlKTtcbiAgfSk7XG59KTtcbiIsICJpbXBvcnQge1xuICBkZWZpbmVBbGlhc2VkVHlwZSxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydE9uZU9mLFxuICBhc3NlcnRWYWx1ZVR5cGUsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQTEFDRUhPTERFUlMgfSBmcm9tIFwiLi9wbGFjZWhvbGRlcnNcIjtcblxuY29uc3QgZGVmaW5lVHlwZSA9IGRlZmluZUFsaWFzZWRUeXBlKFwiTWlzY2VsbGFuZW91c1wiKTtcblxuaWYgKCFwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HKSB7XG4gIGRlZmluZVR5cGUoXCJOb29wXCIsIHtcbiAgICB2aXNpdG9yOiBbXSxcbiAgfSk7XG59XG5cbmRlZmluZVR5cGUoXCJQbGFjZWhvbGRlclwiLCB7XG4gIHZpc2l0b3I6IFtdLFxuICBidWlsZGVyOiBbXCJleHBlY3RlZE5vZGVcIiwgXCJuYW1lXCJdLFxuICAvLyBhbGlhc2VzOiBbXSwgZGVmaW5lZCBpbiBwbGFjZWhvbGRlcnMuanNcbiAgZmllbGRzOiB7XG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB9LFxuICAgIGV4cGVjdGVkTm9kZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKC4uLlBMQUNFSE9MREVSUyksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVjhJbnRyaW5zaWNJZGVudGlmaWVyXCIsIHtcbiAgYnVpbGRlcjogW1wibmFtZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgbmFtZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcInN0cmluZ1wiKSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IGRlZmluZVR5cGUsIHtcbiAgYXNzZXJ0RWFjaCxcbiAgYXNzZXJ0Tm9kZVR5cGUsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmRlZmluZVR5cGUoXCJBcmd1bWVudFBsYWNlaG9sZGVyXCIsIHt9KTtcblxuZGVmaW5lVHlwZShcIkJpbmRFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wib2JqZWN0XCIsIFwiY2FsbGVlXCJdLFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxuICBmaWVsZHM6ICFwcm9jZXNzLmVudi5CQUJFTF9UWVBFU184X0JSRUFLSU5HXG4gICAgPyB7XG4gICAgICAgIG9iamVjdDoge1xuICAgICAgICAgIHZhbGlkYXRlOiBPYmplY3QuYXNzaWduKCgpID0+IHt9LCB7XG4gICAgICAgICAgICBvbmVPZk5vZGVUeXBlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGVlOiB7XG4gICAgICAgICAgdmFsaWRhdGU6IE9iamVjdC5hc3NpZ24oKCkgPT4ge30sIHtcbiAgICAgICAgICAgIG9uZU9mTm9kZVR5cGVzOiBbXCJFeHByZXNzaW9uXCJdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgICB9LFxuICAgICAgICBjYWxsZWU6IHtcbiAgICAgICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgICAgICB9LFxuICAgICAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiSW1wb3J0QXR0cmlidXRlXCIsIHtcbiAgdmlzaXRvcjogW1wia2V5XCIsIFwidmFsdWVcIl0sXG4gIGZpZWxkczoge1xuICAgIGtleToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiSWRlbnRpZmllclwiLCBcIlN0cmluZ0xpdGVyYWxcIiksXG4gICAgfSxcbiAgICB2YWx1ZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiU3RyaW5nTGl0ZXJhbFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJEZWNvcmF0b3JcIiwge1xuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIkRvRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGJ1aWxkZXI6IFtcImJvZHlcIiwgXCJhc3luY1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiQmxvY2tTdGF0ZW1lbnRcIiksXG4gICAgfSxcbiAgICBhc3luYzoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIsIHtcbiAgdmlzaXRvcjogW1wiZXhwb3J0ZWRcIl0sXG4gIGFsaWFzZXM6IFtcIk1vZHVsZVNwZWNpZmllclwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwb3J0ZWQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiUmVjb3JkRXhwcmVzc2lvblwiLCB7XG4gIHZpc2l0b3I6IFtcInByb3BlcnRpZXNcIl0sXG4gIGFsaWFzZXM6IFtcIkV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJPYmplY3RQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUdXBsZUV4cHJlc3Npb25cIiwge1xuICBmaWVsZHM6IHtcbiAgICBlbGVtZW50czoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiwgXCJTcHJlYWRFbGVtZW50XCIpKSxcbiAgICAgICksXG4gICAgICBkZWZhdWx0OiBbXSxcbiAgICB9LFxuICB9LFxuICB2aXNpdG9yOiBbXCJlbGVtZW50c1wiXSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiRGVjaW1hbExpdGVyYWxcIiwge1xuICBidWlsZGVyOiBbXCJ2YWx1ZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIlB1cmVpc2hcIiwgXCJMaXRlcmFsXCIsIFwiSW1tdXRhYmxlXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWpzLW1vZHVsZS1ibG9ja3NcbmRlZmluZVR5cGUoXCJNb2R1bGVFeHByZXNzaW9uXCIsIHtcbiAgdmlzaXRvcjogW1wiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgYm9keToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiUHJvZ3JhbVwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1oYWNrLXBpcGVzXG5kZWZpbmVUeXBlKFwiVG9waWNSZWZlcmVuY2VcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBpcGVsaW5lLW9wZXJhdG9yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanMtY2hvaS9wcm9wb3NhbC1zbWFydC1waXBlc1xuZGVmaW5lVHlwZShcIlBpcGVsaW5lVG9waWNFeHByZXNzaW9uXCIsIHtcbiAgYnVpbGRlcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZXhwcmVzc2lvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgICB9LFxuICB9LFxuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG5cbmRlZmluZVR5cGUoXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLCB7XG4gIGJ1aWxkZXI6IFtcImNhbGxlZVwiXSxcbiAgdmlzaXRvcjogW1wiY2FsbGVlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBjYWxsZWU6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnROb2RlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gICAgfSxcbiAgfSxcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiUGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2VcIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCJdLFxufSk7XG4iLCAiaW1wb3J0IHtcbiAgZGVmaW5lQWxpYXNlZFR5cGUsXG4gIGFycmF5T2ZUeXBlLFxuICBhc3NlcnRFYWNoLFxuICBhc3NlcnROb2RlVHlwZSxcbiAgYXNzZXJ0T25lT2YsXG4gIGFzc2VydFZhbHVlVHlwZSxcbiAgY2hhaW4sXG4gIHZhbGlkYXRlLFxuICB2YWxpZGF0ZUFycmF5T2ZUeXBlLFxuICB2YWxpZGF0ZU9wdGlvbmFsLFxuICB2YWxpZGF0ZU9wdGlvbmFsVHlwZSxcbiAgdmFsaWRhdGVUeXBlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZnVuY3Rpb25EZWNsYXJhdGlvbkNvbW1vbixcbiAgY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb24sXG59IGZyb20gXCIuL2NvcmVcIjtcbmltcG9ydCBpcyBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1wiO1xuXG5jb25zdCBkZWZpbmVUeXBlID0gZGVmaW5lQWxpYXNlZFR5cGUoXCJUeXBlU2NyaXB0XCIpO1xuXG5jb25zdCBib29sID0gYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKTtcblxuY29uc3QgdFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uID0gKCkgPT4gKHtcbiAgcmV0dXJuVHlwZToge1xuICAgIHZhbGlkYXRlOiBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HXG4gICAgICA/IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgOiAvLyBAdHMtaWdub3JlKEJhYmVsIDcgdnMgQmFiZWwgOCkgQmFiZWwgNyBBU1RcbiAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIsIFwiTm9vcFwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbiAgdHlwZVBhcmFtZXRlcnM6IHtcbiAgICB2YWxpZGF0ZTogcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lOR1xuICAgICAgPyBhc3NlcnROb2RlVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpXG4gICAgICA6IC8vIEB0cy1pZ25vcmUoQmFiZWwgNyB2cyBCYWJlbCA4KSBCYWJlbCA3IEFTVFxuICAgICAgICBhc3NlcnROb2RlVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIsIFwiTm9vcFwiKSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiLCB7XG4gIGFsaWFzZXM6IFtcIkxWYWxcIl0sIC8vIFRPRE86IFRoaXMgaXNuJ3QgdXNhYmxlIGluIGdlbmVyYWwgYXMgYW4gTFZhbC4gU2hvdWxkIGhhdmUgYSBcIlBhcmFtZXRlclwiIGFsaWFzLlxuICB2aXNpdG9yOiBbXCJwYXJhbWV0ZXJcIl0sXG4gIGZpZWxkczoge1xuICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIHJlYWRvbmx5OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgcGFyYW1ldGVyOiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJJZGVudGlmaWVyXCIsIFwiQXNzaWdubWVudFBhdHRlcm5cIiksXG4gICAgfSxcbiAgICBvdmVycmlkZToge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGRlY29yYXRvcnM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJEZWNvcmF0b3JcIikpLFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5mdW5jdGlvbkRlY2xhcmF0aW9uQ29tbW9uKCksXG4gICAgLi4udFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRGVjbGFyZU1ldGhvZFwiLCB7XG4gIHZpc2l0b3I6IFtcImRlY29yYXRvcnNcIiwgXCJrZXlcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIC4uLmNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uKCksXG4gICAgLi4udFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uKCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUXVhbGlmaWVkTmFtZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTRW50aXR5TmFtZVwiXSxcbiAgdmlzaXRvcjogW1wibGVmdFwiLCBcInJpZ2h0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBsZWZ0OiB2YWxpZGF0ZVR5cGUoXCJUU0VudGl0eU5hbWVcIiksXG4gICAgcmlnaHQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gIH0sXG59KTtcblxuY29uc3Qgc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24gPSAoKSA9PiAoe1xuICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgW3Byb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInBhcmFtc1wiIDogXCJwYXJhbWV0ZXJzXCJdOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFxuICAgIFtcIklkZW50aWZpZXJcIiwgXCJSZXN0RWxlbWVudFwiXSxcbiAgKSxcbiAgW3Byb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIl06XG4gICAgdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLFxufSk7XG5cbmNvbnN0IGNhbGxDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiA9IHtcbiAgYWxpYXNlczogW1wiVFNUeXBlRWxlbWVudFwiXSxcbiAgdmlzaXRvcjogW1xuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gXCJwYXJhbXNcIiA6IFwicGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIixcbiAgXSxcbiAgZmllbGRzOiBzaWduYXR1cmVEZWNsYXJhdGlvbkNvbW1vbigpLFxufTtcblxuZGVmaW5lVHlwZShcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsIGNhbGxDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbik7XG5kZWZpbmVUeXBlKFxuICBcIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgY2FsbENvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuKTtcblxuY29uc3QgbmFtZWRUeXBlRWxlbWVudENvbW1vbiA9ICgpID0+ICh7XG4gIGtleTogdmFsaWRhdGVUeXBlKFwiRXhwcmVzc2lvblwiKSxcbiAgY29tcHV0ZWQ6IHsgZGVmYXVsdDogZmFsc2UgfSxcbiAgb3B0aW9uYWw6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUHJvcGVydHlTaWduYXR1cmVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVFbGVtZW50XCJdLFxuICB2aXNpdG9yOiBbXCJrZXlcIiwgXCJ0eXBlQW5ub3RhdGlvblwiLCBcImluaXRpYWxpemVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICAuLi5uYW1lZFR5cGVFbGVtZW50Q29tbW9uKCksXG4gICAgcmVhZG9ubHk6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIGtpbmQ6IHtcbiAgICAgIHZhbGlkYXRlOiBhc3NlcnRPbmVPZihcImdldFwiLCBcInNldFwiKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU01ldGhvZFNpZ25hdHVyZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZUVsZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcbiAgICBcImtleVwiLFxuICAgIFwidHlwZVBhcmFtZXRlcnNcIixcbiAgICBwcm9jZXNzLmVudi5CQUJFTF84X0JSRUFLSU5HID8gXCJwYXJhbXNcIiA6IFwicGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInJldHVyblR5cGVcIiA6IFwidHlwZUFubm90YXRpb25cIixcbiAgXSxcbiAgZmllbGRzOiB7XG4gICAgLi4uc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24oKSxcbiAgICAuLi5uYW1lZFR5cGVFbGVtZW50Q29tbW9uKCksXG4gICAga2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5kZXhTaWduYXR1cmVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVFbGVtZW50XCJdLFxuICB2aXNpdG9yOiBbXCJwYXJhbWV0ZXJzXCIsIFwidHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHJlYWRvbmx5OiB2YWxpZGF0ZU9wdGlvbmFsKGJvb2wpLFxuICAgIHN0YXRpYzogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBwYXJhbWV0ZXJzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiSWRlbnRpZmllclwiKSwgLy8gTGVuZ3RoIG11c3QgYmUgMVxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZUFubm90YXRpb25cIiksXG4gIH0sXG59KTtcblxuY29uc3QgdHNLZXl3b3JkVHlwZXMgPSBbXG4gIFwiVFNBbnlLZXl3b3JkXCIsXG4gIFwiVFNCb29sZWFuS2V5d29yZFwiLFxuICBcIlRTQmlnSW50S2V5d29yZFwiLFxuICBcIlRTSW50cmluc2ljS2V5d29yZFwiLFxuICBcIlRTTmV2ZXJLZXl3b3JkXCIsXG4gIFwiVFNOdWxsS2V5d29yZFwiLFxuICBcIlRTTnVtYmVyS2V5d29yZFwiLFxuICBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICBcIlRTU3RyaW5nS2V5d29yZFwiLFxuICBcIlRTU3ltYm9sS2V5d29yZFwiLFxuICBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgXCJUU1ZvaWRLZXl3b3JkXCIsXG5dIGFzIGNvbnN0O1xuXG5mb3IgKGNvbnN0IHR5cGUgb2YgdHNLZXl3b3JkVHlwZXMpIHtcbiAgZGVmaW5lVHlwZSh0eXBlLCB7XG4gICAgYWxpYXNlczogW1wiVFNUeXBlXCIsIFwiVFNCYXNlVHlwZVwiXSxcbiAgICB2aXNpdG9yOiBbXSxcbiAgICBmaWVsZHM6IHt9LFxuICB9KTtcbn1cblxuZGVmaW5lVHlwZShcIlRTVGhpc1R5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIiwgXCJUU0Jhc2VUeXBlXCJdLFxuICB2aXNpdG9yOiBbXSxcbiAgZmllbGRzOiB7fSxcbn0pO1xuXG5jb25zdCBmbk9yQ3RyQmFzZSA9IHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXG4gICAgXCJ0eXBlUGFyYW1ldGVyc1wiLFxuICAgIHByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkcgPyBcInBhcmFtc1wiIDogXCJwYXJhbWV0ZXJzXCIsXG4gICAgcHJvY2Vzcy5lbnYuQkFCRUxfOF9CUkVBS0lORyA/IFwicmV0dXJuVHlwZVwiIDogXCJ0eXBlQW5ub3RhdGlvblwiLFxuICBdLFxufTtcblxuZGVmaW5lVHlwZShcIlRTRnVuY3Rpb25UeXBlXCIsIHtcbiAgLi4uZm5PckN0ckJhc2UsXG4gIGZpZWxkczogc2lnbmF0dXJlRGVjbGFyYXRpb25Db21tb24oKSxcbn0pO1xuZGVmaW5lVHlwZShcIlRTQ29uc3RydWN0b3JUeXBlXCIsIHtcbiAgLi4uZm5PckN0ckJhc2UsXG4gIGZpZWxkczoge1xuICAgIC4uLnNpZ25hdHVyZURlY2xhcmF0aW9uQ29tbW9uKCksXG4gICAgYWJzdHJhY3Q6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVJlZmVyZW5jZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZU5hbWVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZU5hbWU6IHZhbGlkYXRlVHlwZShcIlRTRW50aXR5TmFtZVwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVQcmVkaWNhdGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcInBhcmFtZXRlck5hbWVcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgYnVpbGRlcjogW1wicGFyYW1ldGVyTmFtZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiYXNzZXJ0c1wiXSxcbiAgZmllbGRzOiB7XG4gICAgcGFyYW1ldGVyTmFtZTogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJUU1RoaXNUeXBlXCJdKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLFxuICAgIGFzc2VydHM6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVF1ZXJ5XCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByTmFtZVwiLCBcInR5cGVQYXJhbWV0ZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByTmFtZTogdmFsaWRhdGVUeXBlKFtcIlRTRW50aXR5TmFtZVwiLCBcIlRTSW1wb3J0VHlwZVwiXSksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlTGl0ZXJhbFwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1wibWVtYmVyc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIlRTVHlwZUVsZW1lbnRcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTQXJyYXlUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJlbGVtZW50VHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZWxlbWVudFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUdXBsZVR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImVsZW1lbnRUeXBlc1wiXSxcbiAgZmllbGRzOiB7XG4gICAgZWxlbWVudFR5cGVzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFtcIlRTVHlwZVwiLCBcIlRTTmFtZWRUdXBsZU1lbWJlclwiXSksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTT3B0aW9uYWxUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNSZXN0VHlwZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTmFtZWRUdXBsZU1lbWJlclwiLCB7XG4gIHZpc2l0b3I6IFtcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIl0sXG4gIGJ1aWxkZXI6IFtcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIiwgXCJvcHRpb25hbFwiXSxcbiAgZmllbGRzOiB7XG4gICAgbGFiZWw6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgb3B0aW9uYWw6IHtcbiAgICAgIHZhbGlkYXRlOiBib29sLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgICBlbGVtZW50VHlwZTogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmNvbnN0IHVuaW9uT3JJbnRlcnNlY3Rpb24gPSB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHR5cGVzOiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufTtcblxuZGVmaW5lVHlwZShcIlRTVW5pb25UeXBlXCIsIHVuaW9uT3JJbnRlcnNlY3Rpb24pO1xuZGVmaW5lVHlwZShcIlRTSW50ZXJzZWN0aW9uVHlwZVwiLCB1bmlvbk9ySW50ZXJzZWN0aW9uKTtcblxuZGVmaW5lVHlwZShcIlRTQ29uZGl0aW9uYWxUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJjaGVja1R5cGVcIiwgXCJleHRlbmRzVHlwZVwiLCBcInRydWVUeXBlXCIsIFwiZmFsc2VUeXBlXCJdLFxuICBmaWVsZHM6IHtcbiAgICBjaGVja1R5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgICBleHRlbmRzVHlwZTogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIHRydWVUeXBlOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gICAgZmFsc2VUeXBlOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5mZXJUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlUGFyYW1ldGVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlUGFyYW1ldGVyOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTUGFyZW50aGVzaXplZFR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVPcGVyYXRvclwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIl0sXG4gIGZpZWxkczoge1xuICAgIG9wZXJhdG9yOiB2YWxpZGF0ZShhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIikpLFxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcIm9iamVjdFR5cGVcIiwgXCJpbmRleFR5cGVcIl0sXG4gIGZpZWxkczoge1xuICAgIG9iamVjdFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgICBpbmRleFR5cGU6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNNYXBwZWRUeXBlXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJ0eXBlUGFyYW1ldGVyXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJuYW1lVHlwZVwiXSxcbiAgZmllbGRzOiB7XG4gICAgcmVhZG9ubHk6IHZhbGlkYXRlT3B0aW9uYWwoYXNzZXJ0T25lT2YodHJ1ZSwgZmFsc2UsIFwiK1wiLCBcIi1cIikpLFxuICAgIHR5cGVQYXJhbWV0ZXI6IHZhbGlkYXRlVHlwZShcIlRTVHlwZVBhcmFtZXRlclwiKSxcbiAgICBvcHRpb25hbDogdmFsaWRhdGVPcHRpb25hbChhc3NlcnRPbmVPZih0cnVlLCBmYWxzZSwgXCIrXCIsIFwiLVwiKSksXG4gICAgdHlwZUFubm90YXRpb246IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlXCIpLFxuICAgIG5hbWVUeXBlOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZVwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNMaXRlcmFsVHlwZVwiLCB7XG4gIGFsaWFzZXM6IFtcIlRTVHlwZVwiLCBcIlRTQmFzZVR5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImxpdGVyYWxcIl0sXG4gIGZpZWxkczoge1xuICAgIGxpdGVyYWw6IHtcbiAgICAgIHZhbGlkYXRlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB1bmFyeUV4cHJlc3Npb24gPSBhc3NlcnROb2RlVHlwZShcbiAgICAgICAgICBcIk51bWVyaWNMaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHVuYXJ5T3BlcmF0b3IgPSBhc3NlcnRPbmVPZihcIi1cIik7XG5cbiAgICAgICAgY29uc3QgbGl0ZXJhbCA9IGFzc2VydE5vZGVUeXBlKFxuICAgICAgICAgIFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICAgICAgKTtcbiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdG9yKHBhcmVudDogYW55LCBrZXk6IHN0cmluZywgbm9kZTogYW55KSB7XG4gICAgICAgICAgLy8gdHlwZSBBID0gLTEgfCAxO1xuICAgICAgICAgIGlmIChpcyhcIlVuYXJ5RXhwcmVzc2lvblwiLCBub2RlKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3BlcmF0b3IgZmlyc3RcbiAgICAgICAgICAgIHVuYXJ5T3BlcmF0b3Iobm9kZSwgXCJvcGVyYXRvclwiLCBub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgICAgIHVuYXJ5RXhwcmVzc2lvbihub2RlLCBcImFyZ3VtZW50XCIsIG5vZGUuYXJndW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0eXBlIEEgPSAnZm9vJyB8ICdiYXInIHwgZmFsc2UgfCAxO1xuICAgICAgICAgICAgbGl0ZXJhbChwYXJlbnQsIGtleSwgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdG9yLm9uZU9mTm9kZVR5cGVzID0gW1xuICAgICAgICAgIFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICAgICAgICBcIlN0cmluZ0xpdGVyYWxcIixcbiAgICAgICAgICBcIkJvb2xlYW5MaXRlcmFsXCIsXG4gICAgICAgICAgXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgICAgICAgXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICAgICAgICBcIlVuYXJ5RXhwcmVzc2lvblwiLFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIsIHtcbiAgYWxpYXNlczogW1wiVFNUeXBlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIlRTRW50aXR5TmFtZVwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIsIHtcbiAgLy8gXCJTdGF0ZW1lbnRcIiBhbGlhcyBwcmV2ZW50cyBhIHNlbWljb2xvbiBmcm9tIGFwcGVhcmluZyBhZnRlciBpdCBpbiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwiZXh0ZW5kc1wiLCBcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksXG4gICAgZXh0ZW5kczogdmFsaWRhdGVPcHRpb25hbChhcnJheU9mVHlwZShcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpKSxcbiAgICBib2R5OiB2YWxpZGF0ZVR5cGUoXCJUU0ludGVyZmFjZUJvZHlcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTSW50ZXJmYWNlQm9keVwiLCB7XG4gIHZpc2l0b3I6IFtcImJvZHlcIl0sXG4gIGZpZWxkczoge1xuICAgIGJvZHk6IHZhbGlkYXRlQXJyYXlPZlR5cGUoXCJUU1R5cGVFbGVtZW50XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVjbGFyZTogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICB0eXBlUGFyYW1ldGVyczogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSxcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiLCBcInR5cGVQYXJhbWV0ZXJzXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiB2YWxpZGF0ZU9wdGlvbmFsVHlwZShcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksXG4gIH0sXG59KTtcblxuY29uc3QgVFNUeXBlRXhwcmVzc2lvbiA9IHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxWYWxcIiwgXCJQYXR0ZXJuTGlrZVwiXSxcbiAgdmlzaXRvcjogW1wiZXhwcmVzc2lvblwiLCBcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICAgIHR5cGVBbm5vdGF0aW9uOiB2YWxpZGF0ZVR5cGUoXCJUU1R5cGVcIiksXG4gIH0sXG59O1xuXG5kZWZpbmVUeXBlKFwiVFNBc0V4cHJlc3Npb25cIiwgVFNUeXBlRXhwcmVzc2lvbik7XG5kZWZpbmVUeXBlKFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCIsIFRTVHlwZUV4cHJlc3Npb24pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlQXNzZXJ0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiRXhwcmVzc2lvblwiLCBcIkxWYWxcIiwgXCJQYXR0ZXJuTGlrZVwiXSxcbiAgdmlzaXRvcjogW1widHlwZUFubm90YXRpb25cIiwgXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjogdmFsaWRhdGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTRW51bURlY2xhcmF0aW9uXCIsIHtcbiAgLy8gXCJTdGF0ZW1lbnRcIiBhbGlhcyBwcmV2ZW50cyBhIHNlbWljb2xvbiBmcm9tIGFwcGVhcmluZyBhZnRlciBpdCBpbiBhbiBleHBvcnQgZGVjbGFyYXRpb24uXG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiLCBcIkRlY2xhcmF0aW9uXCJdLFxuICB2aXNpdG9yOiBbXCJpZFwiLCBcIm1lbWJlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGRlY2xhcmU6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgY29uc3Q6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgbWVtYmVyczogdmFsaWRhdGVBcnJheU9mVHlwZShcIlRTRW51bU1lbWJlclwiKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0VudW1NZW1iZXJcIiwge1xuICB2aXNpdG9yOiBbXCJpZFwiLCBcImluaXRpYWxpemVyXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFtcIklkZW50aWZpZXJcIiwgXCJTdHJpbmdMaXRlcmFsXCJdKSxcbiAgICBpbml0aWFsaXplcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIsIHtcbiAgYWxpYXNlczogW1wiU3RhdGVtZW50XCIsIFwiRGVjbGFyYXRpb25cIl0sXG4gIHZpc2l0b3I6IFtcImlkXCIsIFwiYm9keVwiXSxcbiAgZmllbGRzOiB7XG4gICAgZGVjbGFyZTogdmFsaWRhdGVPcHRpb25hbChib29sKSxcbiAgICBnbG9iYWw6IHZhbGlkYXRlT3B0aW9uYWwoYm9vbCksXG4gICAgaWQ6IHZhbGlkYXRlVHlwZShbXCJJZGVudGlmaWVyXCIsIFwiU3RyaW5nTGl0ZXJhbFwiXSksXG4gICAgYm9keTogdmFsaWRhdGVUeXBlKFtcIlRTTW9kdWxlQmxvY2tcIiwgXCJUU01vZHVsZURlY2xhcmF0aW9uXCJdKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNNb2R1bGVCbG9ja1wiLCB7XG4gIGFsaWFzZXM6IFtcIlNjb3BhYmxlXCIsIFwiQmxvY2tcIiwgXCJCbG9ja1BhcmVudFwiLCBcIkZ1bmN0aW9uUGFyZW50XCJdLFxuICB2aXNpdG9yOiBbXCJib2R5XCJdLFxuICBmaWVsZHM6IHtcbiAgICBib2R5OiB2YWxpZGF0ZUFycmF5T2ZUeXBlKFwiU3RhdGVtZW50XCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0ltcG9ydFR5cGVcIiwge1xuICBhbGlhc2VzOiBbXCJUU1R5cGVcIl0sXG4gIHZpc2l0b3I6IFtcImFyZ3VtZW50XCIsIFwicXVhbGlmaWVyXCIsIFwidHlwZVBhcmFtZXRlcnNcIl0sXG4gIGZpZWxkczoge1xuICAgIGFyZ3VtZW50OiB2YWxpZGF0ZVR5cGUoXCJTdHJpbmdMaXRlcmFsXCIpLFxuICAgIHF1YWxpZmllcjogdmFsaWRhdGVPcHRpb25hbFR5cGUoXCJUU0VudGl0eU5hbWVcIiksXG4gICAgdHlwZVBhcmFtZXRlcnM6IHZhbGlkYXRlT3B0aW9uYWxUeXBlKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvblwiLCB7XG4gIGFsaWFzZXM6IFtcIlN0YXRlbWVudFwiXSxcbiAgdmlzaXRvcjogW1wiaWRcIiwgXCJtb2R1bGVSZWZlcmVuY2VcIl0sXG4gIGZpZWxkczoge1xuICAgIGlzRXhwb3J0OiB2YWxpZGF0ZShib29sKSxcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgICBtb2R1bGVSZWZlcmVuY2U6IHZhbGlkYXRlVHlwZShbXG4gICAgICBcIlRTRW50aXR5TmFtZVwiLFxuICAgICAgXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIsXG4gICAgXSksXG4gICAgaW1wb3J0S2luZDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE9uZU9mKFwidHlwZVwiLCBcInZhbHVlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiLCB7XG4gIHZpc2l0b3I6IFtcImV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIlN0cmluZ0xpdGVyYWxcIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTm9uTnVsbEV4cHJlc3Npb25cIiwge1xuICBhbGlhc2VzOiBbXCJFeHByZXNzaW9uXCIsIFwiTFZhbFwiLCBcIlBhdHRlcm5MaWtlXCJdLFxuICB2aXNpdG9yOiBbXCJleHByZXNzaW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICBleHByZXNzaW9uOiB2YWxpZGF0ZVR5cGUoXCJFeHByZXNzaW9uXCIpLFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU0V4cG9ydEFzc2lnbm1lbnRcIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImV4cHJlc3Npb25cIl0sXG4gIGZpZWxkczoge1xuICAgIGV4cHJlc3Npb246IHZhbGlkYXRlVHlwZShcIkV4cHJlc3Npb25cIiksXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIiwge1xuICBhbGlhc2VzOiBbXCJTdGF0ZW1lbnRcIl0sXG4gIHZpc2l0b3I6IFtcImlkXCJdLFxuICBmaWVsZHM6IHtcbiAgICBpZDogdmFsaWRhdGVUeXBlKFwiSWRlbnRpZmllclwiKSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVUeXBlKFwiVFNUeXBlQW5ub3RhdGlvblwiLCB7XG4gIHZpc2l0b3I6IFtcInR5cGVBbm5vdGF0aW9uXCJdLFxuICBmaWVsZHM6IHtcbiAgICB0eXBlQW5ub3RhdGlvbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiwge1xuICB2aXNpdG9yOiBbXCJwYXJhbXNcIl0sXG4gIGZpZWxkczoge1xuICAgIHBhcmFtczoge1xuICAgICAgdmFsaWRhdGU6IGNoYWluKFxuICAgICAgICBhc3NlcnRWYWx1ZVR5cGUoXCJhcnJheVwiKSxcbiAgICAgICAgYXNzZXJ0RWFjaChhc3NlcnROb2RlVHlwZShcIlRTVHlwZVwiKSksXG4gICAgICApLFxuICAgIH0sXG4gIH0sXG59KTtcblxuZGVmaW5lVHlwZShcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIsIHtcbiAgdmlzaXRvcjogW1wicGFyYW1zXCJdLFxuICBmaWVsZHM6IHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIHZhbGlkYXRlOiBjaGFpbihcbiAgICAgICAgYXNzZXJ0VmFsdWVUeXBlKFwiYXJyYXlcIiksXG4gICAgICAgIGFzc2VydEVhY2goYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIikpLFxuICAgICAgKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbmRlZmluZVR5cGUoXCJUU1R5cGVQYXJhbWV0ZXJcIiwge1xuICBidWlsZGVyOiBbXCJjb25zdHJhaW50XCIsIFwiZGVmYXVsdFwiLCBcIm5hbWVcIl0sXG4gIHZpc2l0b3I6IFtcImNvbnN0cmFpbnRcIiwgXCJkZWZhdWx0XCJdLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWxpZGF0ZTogIXByb2Nlc3MuZW52LkJBQkVMXzhfQlJFQUtJTkdcbiAgICAgICAgPyBhc3NlcnRWYWx1ZVR5cGUoXCJzdHJpbmdcIilcbiAgICAgICAgOiBhc3NlcnROb2RlVHlwZShcIklkZW50aWZpZXJcIiksXG4gICAgfSxcbiAgICBpbjoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIG91dDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydFZhbHVlVHlwZShcImJvb2xlYW5cIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICAgIGNvbnN0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0VmFsdWVUeXBlKFwiYm9vbGVhblwiKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgY29uc3RyYWludDoge1xuICAgICAgdmFsaWRhdGU6IGFzc2VydE5vZGVUeXBlKFwiVFNUeXBlXCIpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgICBkZWZhdWx0OiB7XG4gICAgICB2YWxpZGF0ZTogYXNzZXJ0Tm9kZVR5cGUoXCJUU1R5cGVcIiksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IERFUFJFQ0FURURfQUxJQVNFUyA9IHtcbiAgTW9kdWxlRGVjbGFyYXRpb246IFwiSW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvblwiLFxufTtcbiIsICJpbXBvcnQgdG9GYXN0UHJvcGVydGllcyBmcm9tIFwidG8tZmFzdC1wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgXCIuL2NvcmVcIjtcbmltcG9ydCBcIi4vZmxvd1wiO1xuaW1wb3J0IFwiLi9qc3hcIjtcbmltcG9ydCBcIi4vbWlzY1wiO1xuaW1wb3J0IFwiLi9leHBlcmltZW50YWxcIjtcbmltcG9ydCBcIi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHtcbiAgVklTSVRPUl9LRVlTLFxuICBBTElBU19LRVlTLFxuICBGTElQUEVEX0FMSUFTX0tFWVMsXG4gIE5PREVfRklFTERTLFxuICBCVUlMREVSX0tFWVMsXG4gIERFUFJFQ0FURURfS0VZUyxcbiAgTk9ERV9QQVJFTlRfVkFMSURBVElPTlMsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBQTEFDRUhPTERFUlMsXG4gIFBMQUNFSE9MREVSU19BTElBUyxcbiAgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVMsXG59IGZyb20gXCIuL3BsYWNlaG9sZGVyc1wiO1xuaW1wb3J0IHsgREVQUkVDQVRFRF9BTElBU0VTIH0gZnJvbSBcIi4vZGVwcmVjYXRlZC1hbGlhc2VzXCI7XG5cbihcbiAgT2JqZWN0LmtleXMoREVQUkVDQVRFRF9BTElBU0VTKSBhcyAoa2V5b2YgdHlwZW9mIERFUFJFQ0FURURfQUxJQVNFUylbXVxuKS5mb3JFYWNoKGRlcHJlY2F0ZWRBbGlhcyA9PiB7XG4gIEZMSVBQRURfQUxJQVNfS0VZU1tkZXByZWNhdGVkQWxpYXNdID1cbiAgICBGTElQUEVEX0FMSUFTX0tFWVNbREVQUkVDQVRFRF9BTElBU0VTW2RlcHJlY2F0ZWRBbGlhc11dO1xufSk7XG5cbi8vIFdlIGRvIHRoaXMgaGVyZSwgYmVjYXVzZSBhdCB0aGlzIHBvaW50IHRoZSB2aXNpdG9yIGtleXMgc2hvdWxkIGJlIHJlYWR5IGFuZCBzZXR1cFxudG9GYXN0UHJvcGVydGllcyhWSVNJVE9SX0tFWVMpO1xudG9GYXN0UHJvcGVydGllcyhBTElBU19LRVlTKTtcbnRvRmFzdFByb3BlcnRpZXMoRkxJUFBFRF9BTElBU19LRVlTKTtcbnRvRmFzdFByb3BlcnRpZXMoTk9ERV9GSUVMRFMpO1xudG9GYXN0UHJvcGVydGllcyhCVUlMREVSX0tFWVMpO1xudG9GYXN0UHJvcGVydGllcyhERVBSRUNBVEVEX0tFWVMpO1xuXG50b0Zhc3RQcm9wZXJ0aWVzKFBMQUNFSE9MREVSU19BTElBUyk7XG50b0Zhc3RQcm9wZXJ0aWVzKFBMQUNFSE9MREVSU19GTElQUEVEX0FMSUFTKTtcblxuY29uc3QgVFlQRVM6IEFycmF5PHN0cmluZz4gPSBbXS5jb25jYXQoXG4gIE9iamVjdC5rZXlzKFZJU0lUT1JfS0VZUyksXG4gIE9iamVjdC5rZXlzKEZMSVBQRURfQUxJQVNfS0VZUyksXG4gIE9iamVjdC5rZXlzKERFUFJFQ0FURURfS0VZUyksXG4pO1xuXG5leHBvcnQge1xuICBWSVNJVE9SX0tFWVMsXG4gIEFMSUFTX0tFWVMsXG4gIEZMSVBQRURfQUxJQVNfS0VZUyxcbiAgTk9ERV9GSUVMRFMsXG4gIEJVSUxERVJfS0VZUyxcbiAgREVQUkVDQVRFRF9BTElBU0VTLFxuICBERVBSRUNBVEVEX0tFWVMsXG4gIE5PREVfUEFSRU5UX1ZBTElEQVRJT05TLFxuICBQTEFDRUhPTERFUlMsXG4gIFBMQUNFSE9MREVSU19BTElBUyxcbiAgUExBQ0VIT0xERVJTX0ZMSVBQRURfQUxJQVMsXG4gIFRZUEVTLFxufTtcblxuZXhwb3J0IHR5cGUgeyBGaWVsZE9wdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuIiwgImltcG9ydCB7XG4gIE5PREVfRklFTERTLFxuICBOT0RFX1BBUkVOVF9WQUxJREFUSU9OUyxcbiAgdHlwZSBGaWVsZE9wdGlvbnMsXG59IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZShcbiAgbm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbDogYW55LFxuKTogdm9pZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpZWxkcyA9IE5PREVfRklFTERTW25vZGUudHlwZV07XG4gIGlmICghZmllbGRzKSByZXR1cm47XG5cbiAgY29uc3QgZmllbGQgPSBmaWVsZHNba2V5XTtcbiAgdmFsaWRhdGVGaWVsZChub2RlLCBrZXksIHZhbCwgZmllbGQpO1xuICB2YWxpZGF0ZUNoaWxkKG5vZGUsIGtleSwgdmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmllbGQoXG4gIG5vZGU6IHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIGtleTogc3RyaW5nLFxuICB2YWw6IGFueSxcbiAgZmllbGQ6IEZpZWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKCFmaWVsZD8udmFsaWRhdGUpIHJldHVybjtcbiAgaWYgKGZpZWxkLm9wdGlvbmFsICYmIHZhbCA9PSBudWxsKSByZXR1cm47XG5cbiAgZmllbGQudmFsaWRhdGUobm9kZSwga2V5LCB2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZChcbiAgbm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbD86IHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4pIHtcbiAgaWYgKHZhbCA9PSBudWxsKSByZXR1cm47XG4gIGNvbnN0IHZhbGlkYXRlID0gTk9ERV9QQVJFTlRfVkFMSURBVElPTlNbdmFsLnR5cGVdO1xuICBpZiAoIXZhbGlkYXRlKSByZXR1cm47XG4gIHZhbGlkYXRlKG5vZGUsIGtleSwgdmFsKTtcbn1cbiIsICJpbXBvcnQgdmFsaWRhdGUgZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IEJVSUxERVJfS0VZUyB9IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU5vZGU8TiBleHRlbmRzIHQuTm9kZT4obm9kZTogTikge1xuICAvLyB0b2RvOiBiZWNhdXNlIGtleXMgbm90IGluIEJVSUxERVJfS0VZUyBhcmUgbm90IHZhbGlkYXRlZCAtIHRoaXMgYWN0dWFsbHkgYWxsb3dzIGludmFsaWQgbm9kZXMgaW4gc29tZSBjYXNlc1xuICBjb25zdCBrZXlzID0gQlVJTERFUl9LRVlTW25vZGUudHlwZV0gYXMgKGtleW9mIE4gJiBzdHJpbmcpW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICB2YWxpZGF0ZShub2RlLCBrZXksIG5vZGVba2V5XSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuaW1wb3J0IHZhbGlkYXRlTm9kZSBmcm9tIFwiLi4vdmFsaWRhdGVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5pbXBvcnQgZGVwcmVjYXRpb25XYXJuaW5nIGZyb20gXCIuLi8uLi91dGlscy9kZXByZWNhdGlvbldhcm5pbmdcIjtcbmV4cG9ydCBmdW5jdGlvbiBhcnJheUV4cHJlc3Npb24oXG4gIGVsZW1lbnRzOiBBcnJheTxudWxsIHwgdC5FeHByZXNzaW9uIHwgdC5TcHJlYWRFbGVtZW50PiA9IFtdLFxuKTogdC5BcnJheUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyYXlFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJBcnJheUV4cHJlc3Npb25cIixcbiAgICBlbGVtZW50cyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzaWdubWVudEV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBzdHJpbmcsXG4gIGxlZnQ6IHQuTFZhbCxcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbik6IHQuQXNzaWdubWVudEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXNzaWdubWVudEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIsXG4gICAgb3BlcmF0b3IsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5RXhwcmVzc2lvbihcbiAgb3BlcmF0b3I6XG4gICAgfCBcIitcIlxuICAgIHwgXCItXCJcbiAgICB8IFwiL1wiXG4gICAgfCBcIiVcIlxuICAgIHwgXCIqXCJcbiAgICB8IFwiKipcIlxuICAgIHwgXCImXCJcbiAgICB8IFwifFwiXG4gICAgfCBcIj4+XCJcbiAgICB8IFwiPj4+XCJcbiAgICB8IFwiPDxcIlxuICAgIHwgXCJeXCJcbiAgICB8IFwiPT1cIlxuICAgIHwgXCI9PT1cIlxuICAgIHwgXCIhPVwiXG4gICAgfCBcIiE9PVwiXG4gICAgfCBcImluXCJcbiAgICB8IFwiaW5zdGFuY2VvZlwiXG4gICAgfCBcIj5cIlxuICAgIHwgXCI8XCJcbiAgICB8IFwiPj1cIlxuICAgIHwgXCI8PVwiXG4gICAgfCBcInw+XCIsXG4gIGxlZnQ6IHQuRXhwcmVzc2lvbiB8IHQuUHJpdmF0ZU5hbWUsXG4gIHJpZ2h0OiB0LkV4cHJlc3Npb24sXG4pOiB0LkJpbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQmluYXJ5RXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQmluYXJ5RXhwcmVzc2lvblwiLFxuICAgIG9wZXJhdG9yLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludGVycHJldGVyRGlyZWN0aXZlKHZhbHVlOiBzdHJpbmcpOiB0LkludGVycHJldGVyRGlyZWN0aXZlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkludGVycHJldGVyRGlyZWN0aXZlPih7XG4gICAgdHlwZTogXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUodmFsdWU6IHQuRGlyZWN0aXZlTGl0ZXJhbCk6IHQuRGlyZWN0aXZlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRpcmVjdGl2ZT4oe1xuICAgIHR5cGU6IFwiRGlyZWN0aXZlXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZUxpdGVyYWwodmFsdWU6IHN0cmluZyk6IHQuRGlyZWN0aXZlTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EaXJlY3RpdmVMaXRlcmFsPih7XG4gICAgdHlwZTogXCJEaXJlY3RpdmVMaXRlcmFsXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrU3RhdGVtZW50KFxuICBib2R5OiBBcnJheTx0LlN0YXRlbWVudD4sXG4gIGRpcmVjdGl2ZXM6IEFycmF5PHQuRGlyZWN0aXZlPiA9IFtdLFxuKTogdC5CbG9ja1N0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CbG9ja1N0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiQmxvY2tTdGF0ZW1lbnRcIixcbiAgICBib2R5LFxuICAgIGRpcmVjdGl2ZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJyZWFrU3RhdGVtZW50KFxuICBsYWJlbDogdC5JZGVudGlmaWVyIHwgbnVsbCA9IG51bGwsXG4pOiB0LkJyZWFrU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkJyZWFrU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJCcmVha1N0YXRlbWVudFwiLFxuICAgIGxhYmVsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxsRXhwcmVzc2lvbihcbiAgY2FsbGVlOiB0LkV4cHJlc3Npb24gfCB0LlN1cGVyIHwgdC5WOEludHJpbnNpY0lkZW50aWZpZXIsXG4gIF9hcmd1bWVudHM6IEFycmF5PFxuICAgIHQuRXhwcmVzc2lvbiB8IHQuU3ByZWFkRWxlbWVudCB8IHQuSlNYTmFtZXNwYWNlZE5hbWUgfCB0LkFyZ3VtZW50UGxhY2Vob2xkZXJcbiAgPixcbik6IHQuQ2FsbEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2FsbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkNhbGxFeHByZXNzaW9uXCIsXG4gICAgY2FsbGVlLFxuICAgIGFyZ3VtZW50czogX2FyZ3VtZW50cyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2F0Y2hDbGF1c2UoXG4gIHBhcmFtOlxuICAgIHwgdC5JZGVudGlmaWVyXG4gICAgfCB0LkFycmF5UGF0dGVyblxuICAgIHwgdC5PYmplY3RQYXR0ZXJuXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuKTogdC5DYXRjaENsYXVzZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DYXRjaENsYXVzZT4oe1xuICAgIHR5cGU6IFwiQ2F0Y2hDbGF1c2VcIixcbiAgICBwYXJhbSxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEV4cHJlc3Npb24oXG4gIHRlc3Q6IHQuRXhwcmVzc2lvbixcbiAgY29uc2VxdWVudDogdC5FeHByZXNzaW9uLFxuICBhbHRlcm5hdGU6IHQuRXhwcmVzc2lvbixcbik6IHQuQ29uZGl0aW9uYWxFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkNvbmRpdGlvbmFsRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIsXG4gICAgdGVzdCxcbiAgICBjb25zZXF1ZW50LFxuICAgIGFsdGVybmF0ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGludWVTdGF0ZW1lbnQoXG4gIGxhYmVsOiB0LklkZW50aWZpZXIgfCBudWxsID0gbnVsbCxcbik6IHQuQ29udGludWVTdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ29udGludWVTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIsXG4gICAgbGFiZWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnZ2VyU3RhdGVtZW50KCk6IHQuRGVidWdnZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRGVidWdnZXJTdGF0ZW1lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkb1doaWxlU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5Eb1doaWxlU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRvV2hpbGVTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkRvV2hpbGVTdGF0ZW1lbnRcIixcbiAgICB0ZXN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U3RhdGVtZW50KCk6IHQuRW1wdHlTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRW1wdHlTdGF0ZW1lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW9uU3RhdGVtZW50KFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4pOiB0LkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwcmVzc2lvblN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGUoXG4gIHByb2dyYW06IHQuUHJvZ3JhbSxcbiAgY29tbWVudHM6IEFycmF5PHQuQ29tbWVudEJsb2NrIHwgdC5Db21tZW50TGluZT4gfCBudWxsID0gbnVsbCxcbiAgdG9rZW5zOiBBcnJheTxhbnk+IHwgbnVsbCA9IG51bGwsXG4pOiB0LkZpbGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRmlsZT4oe1xuICAgIHR5cGU6IFwiRmlsZVwiLFxuICAgIHByb2dyYW0sXG4gICAgY29tbWVudHMsXG4gICAgdG9rZW5zLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JJblN0YXRlbWVudChcbiAgbGVmdDogdC5WYXJpYWJsZURlY2xhcmF0aW9uIHwgdC5MVmFsLFxuICByaWdodDogdC5FeHByZXNzaW9uLFxuICBib2R5OiB0LlN0YXRlbWVudCxcbik6IHQuRm9ySW5TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRm9ySW5TdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkZvckluU3RhdGVtZW50XCIsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JTdGF0ZW1lbnQoXG4gIGluaXQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB8IHQuRXhwcmVzc2lvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICB0ZXN0OiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgdXBkYXRlOiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5TdGF0ZW1lbnQsXG4pOiB0LkZvclN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Gb3JTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkZvclN0YXRlbWVudFwiLFxuICAgIGluaXQsXG4gICAgdGVzdCxcbiAgICB1cGRhdGUsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25EZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQ+LFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuICBnZW5lcmF0b3I6IGJvb2xlYW4gPSBmYWxzZSxcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvbkRlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgZ2VuZXJhdG9yLFxuICAgIGFzeW5jLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvbkV4cHJlc3Npb24oXG4gIGlkOiB0LklkZW50aWZpZXIgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1zOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50PixcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAgZ2VuZXJhdG9yOiBib29sZWFuID0gZmFsc2UsXG4gIGFzeW5jOiBib29sZWFuID0gZmFsc2UsXG4pOiB0LkZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvbkV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLFxuICAgIGlkLFxuICAgIHBhcmFtcyxcbiAgICBib2R5LFxuICAgIGdlbmVyYXRvcixcbiAgICBhc3luYyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LklkZW50aWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSWRlbnRpZmllcj4oe1xuICAgIHR5cGU6IFwiSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlmU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGNvbnNlcXVlbnQ6IHQuU3RhdGVtZW50LFxuICBhbHRlcm5hdGU6IHQuU3RhdGVtZW50IHwgbnVsbCA9IG51bGwsXG4pOiB0LklmU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LklmU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJJZlN0YXRlbWVudFwiLFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgICBhbHRlcm5hdGUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsZWRTdGF0ZW1lbnQoXG4gIGxhYmVsOiB0LklkZW50aWZpZXIsXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5MYWJlbGVkU3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkxhYmVsZWRTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkxhYmVsZWRTdGF0ZW1lbnRcIixcbiAgICBsYWJlbCxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdMaXRlcmFsKHZhbHVlOiBzdHJpbmcpOiB0LlN0cmluZ0xpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuU3RyaW5nTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiU3RyaW5nTGl0ZXJhbFwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljTGl0ZXJhbCh2YWx1ZTogbnVtYmVyKTogdC5OdW1lcmljTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5OdW1lcmljTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiTnVtZXJpY0xpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbExpdGVyYWwoKTogdC5OdWxsTGl0ZXJhbCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJOdWxsTGl0ZXJhbFwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW5MaXRlcmFsKHZhbHVlOiBib29sZWFuKTogdC5Cb29sZWFuTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Cb29sZWFuTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiQm9vbGVhbkxpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVnRXhwTGl0ZXJhbChcbiAgcGF0dGVybjogc3RyaW5nLFxuICBmbGFnczogc3RyaW5nID0gXCJcIixcbik6IHQuUmVnRXhwTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5SZWdFeHBMaXRlcmFsPih7XG4gICAgdHlwZTogXCJSZWdFeHBMaXRlcmFsXCIsXG4gICAgcGF0dGVybixcbiAgICBmbGFncyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9naWNhbEV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBcInx8XCIgfCBcIiYmXCIgfCBcIj8/XCIsXG4gIGxlZnQ6IHQuRXhwcmVzc2lvbixcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbik6IHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTG9naWNhbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkxvZ2ljYWxFeHByZXNzaW9uXCIsXG4gICAgb3BlcmF0b3IsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24gfCB0LlN1cGVyLFxuICBwcm9wZXJ0eTogdC5FeHByZXNzaW9uIHwgdC5JZGVudGlmaWVyIHwgdC5Qcml2YXRlTmFtZSxcbiAgY29tcHV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgb3B0aW9uYWw6IHRydWUgfCBmYWxzZSB8IG51bGwgPSBudWxsLFxuKTogdC5NZW1iZXJFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk1lbWJlckV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIk1lbWJlckV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgcHJvcGVydHksXG4gICAgY29tcHV0ZWQsXG4gICAgb3B0aW9uYWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5ld0V4cHJlc3Npb24oXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uIHwgdC5TdXBlciB8IHQuVjhJbnRyaW5zaWNJZGVudGlmaWVyLFxuICBfYXJndW1lbnRzOiBBcnJheTxcbiAgICB0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQgfCB0LkpTWE5hbWVzcGFjZWROYW1lIHwgdC5Bcmd1bWVudFBsYWNlaG9sZGVyXG4gID4sXG4pOiB0Lk5ld0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTmV3RXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiTmV3RXhwcmVzc2lvblwiLFxuICAgIGNhbGxlZSxcbiAgICBhcmd1bWVudHM6IF9hcmd1bWVudHMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW0oXG4gIGJvZHk6IEFycmF5PHQuU3RhdGVtZW50PixcbiAgZGlyZWN0aXZlczogQXJyYXk8dC5EaXJlY3RpdmU+ID0gW10sXG4gIHNvdXJjZVR5cGU6IFwic2NyaXB0XCIgfCBcIm1vZHVsZVwiID0gXCJzY3JpcHRcIixcbiAgaW50ZXJwcmV0ZXI6IHQuSW50ZXJwcmV0ZXJEaXJlY3RpdmUgfCBudWxsID0gbnVsbCxcbik6IHQuUHJvZ3JhbSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Qcm9ncmFtPih7XG4gICAgdHlwZTogXCJQcm9ncmFtXCIsXG4gICAgYm9keSxcbiAgICBkaXJlY3RpdmVzLFxuICAgIHNvdXJjZVR5cGUsXG4gICAgaW50ZXJwcmV0ZXIsXG4gICAgc291cmNlRmlsZTogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0RXhwcmVzc2lvbihcbiAgcHJvcGVydGllczogQXJyYXk8dC5PYmplY3RNZXRob2QgfCB0Lk9iamVjdFByb3BlcnR5IHwgdC5TcHJlYWRFbGVtZW50Pixcbik6IHQuT2JqZWN0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJPYmplY3RFeHByZXNzaW9uXCIsXG4gICAgcHJvcGVydGllcyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TWV0aG9kKFxuICBraW5kOiBcIm1ldGhvZFwiIHwgXCJnZXRcIiB8IFwic2V0XCIgfCB1bmRlZmluZWQgPSBcIm1ldGhvZFwiLFxuICBrZXk6XG4gICAgfCB0LkV4cHJlc3Npb25cbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWwsXG4gIHBhcmFtczogQXJyYXk8dC5JZGVudGlmaWVyIHwgdC5QYXR0ZXJuIHwgdC5SZXN0RWxlbWVudD4sXG4gIGJvZHk6IHQuQmxvY2tTdGF0ZW1lbnQsXG4gIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2UsXG4gIGdlbmVyYXRvcjogYm9vbGVhbiA9IGZhbHNlLFxuICBhc3luYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5PYmplY3RNZXRob2Qge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT2JqZWN0TWV0aG9kPih7XG4gICAgdHlwZTogXCJPYmplY3RNZXRob2RcIixcbiAgICBraW5kLFxuICAgIGtleSxcbiAgICBwYXJhbXMsXG4gICAgYm9keSxcbiAgICBjb21wdXRlZCxcbiAgICBnZW5lcmF0b3IsXG4gICAgYXN5bmMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFByb3BlcnR5KFxuICBrZXk6XG4gICAgfCB0LkV4cHJlc3Npb25cbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWxcbiAgICB8IHQuRGVjaW1hbExpdGVyYWxcbiAgICB8IHQuUHJpdmF0ZU5hbWUsXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCB0LlBhdHRlcm5MaWtlLFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuICBzaG9ydGhhbmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4pOiB0Lk9iamVjdFByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJPYmplY3RQcm9wZXJ0eVwiLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBjb21wdXRlZCxcbiAgICBzaG9ydGhhbmQsXG4gICAgZGVjb3JhdG9ycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzdEVsZW1lbnQoYXJndW1lbnQ6IHQuTFZhbCk6IHQuUmVzdEVsZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUmVzdEVsZW1lbnQ+KHtcbiAgICB0eXBlOiBcIlJlc3RFbGVtZW50XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJldHVyblN0YXRlbWVudChcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuKTogdC5SZXR1cm5TdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUmV0dXJuU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJSZXR1cm5TdGF0ZW1lbnRcIixcbiAgICBhcmd1bWVudCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VFeHByZXNzaW9uKFxuICBleHByZXNzaW9uczogQXJyYXk8dC5FeHByZXNzaW9uPixcbik6IHQuU2VxdWVuY2VFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlNlcXVlbmNlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiU2VxdWVuY2VFeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4pOiB0LlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaENhc2UoXG4gIHRlc3Q6IHQuRXhwcmVzc2lvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBjb25zZXF1ZW50OiBBcnJheTx0LlN0YXRlbWVudD4sXG4pOiB0LlN3aXRjaENhc2Uge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuU3dpdGNoQ2FzZT4oe1xuICAgIHR5cGU6IFwiU3dpdGNoQ2FzZVwiLFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3dpdGNoU3RhdGVtZW50KFxuICBkaXNjcmltaW5hbnQ6IHQuRXhwcmVzc2lvbixcbiAgY2FzZXM6IEFycmF5PHQuU3dpdGNoQ2FzZT4sXG4pOiB0LlN3aXRjaFN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Td2l0Y2hTdGF0ZW1lbnQ+KHtcbiAgICB0eXBlOiBcIlN3aXRjaFN0YXRlbWVudFwiLFxuICAgIGRpc2NyaW1pbmFudCxcbiAgICBjYXNlcyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhpc0V4cHJlc3Npb24oKTogdC5UaGlzRXhwcmVzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUaGlzRXhwcmVzc2lvblwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRocm93U3RhdGVtZW50KGFyZ3VtZW50OiB0LkV4cHJlc3Npb24pOiB0LlRocm93U3RhdGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRocm93U3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJUaHJvd1N0YXRlbWVudFwiLFxuICAgIGFyZ3VtZW50LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cnlTdGF0ZW1lbnQoXG4gIGJsb2NrOiB0LkJsb2NrU3RhdGVtZW50LFxuICBoYW5kbGVyOiB0LkNhdGNoQ2xhdXNlIHwgbnVsbCA9IG51bGwsXG4gIGZpbmFsaXplcjogdC5CbG9ja1N0YXRlbWVudCB8IG51bGwgPSBudWxsLFxuKTogdC5UcnlTdGF0ZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHJ5U3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJUcnlTdGF0ZW1lbnRcIixcbiAgICBibG9jayxcbiAgICBoYW5kbGVyLFxuICAgIGZpbmFsaXplcixcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5hcnlFeHByZXNzaW9uKFxuICBvcGVyYXRvcjogXCJ2b2lkXCIgfCBcInRocm93XCIgfCBcImRlbGV0ZVwiIHwgXCIhXCIgfCBcIitcIiB8IFwiLVwiIHwgXCJ+XCIgfCBcInR5cGVvZlwiLFxuICBhcmd1bWVudDogdC5FeHByZXNzaW9uLFxuICBwcmVmaXg6IGJvb2xlYW4gPSB0cnVlLFxuKTogdC5VbmFyeUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVW5hcnlFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJVbmFyeUV4cHJlc3Npb25cIixcbiAgICBvcGVyYXRvcixcbiAgICBhcmd1bWVudCxcbiAgICBwcmVmaXgsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUV4cHJlc3Npb24oXG4gIG9wZXJhdG9yOiBcIisrXCIgfCBcIi0tXCIsXG4gIGFyZ3VtZW50OiB0LkV4cHJlc3Npb24sXG4gIHByZWZpeDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5VcGRhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlVwZGF0ZUV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlVwZGF0ZUV4cHJlc3Npb25cIixcbiAgICBvcGVyYXRvcixcbiAgICBhcmd1bWVudCxcbiAgICBwcmVmaXgsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlRGVjbGFyYXRpb24oXG4gIGtpbmQ6IFwidmFyXCIgfCBcImxldFwiIHwgXCJjb25zdFwiIHwgXCJ1c2luZ1wiIHwgXCJhd2FpdCB1c2luZ1wiLFxuICBkZWNsYXJhdGlvbnM6IEFycmF5PHQuVmFyaWFibGVEZWNsYXJhdG9yPixcbik6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYWJsZURlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIsXG4gICAga2luZCxcbiAgICBkZWNsYXJhdGlvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhYmxlRGVjbGFyYXRvcihcbiAgaWQ6IHQuTFZhbCxcbiAgaW5pdDogdC5FeHByZXNzaW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlZhcmlhYmxlRGVjbGFyYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYWJsZURlY2xhcmF0b3I+KHtcbiAgICB0eXBlOiBcIlZhcmlhYmxlRGVjbGFyYXRvclwiLFxuICAgIGlkLFxuICAgIGluaXQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoaWxlU3RhdGVtZW50KFxuICB0ZXN0OiB0LkV4cHJlc3Npb24sXG4gIGJvZHk6IHQuU3RhdGVtZW50LFxuKTogdC5XaGlsZVN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5XaGlsZVN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiV2hpbGVTdGF0ZW1lbnRcIixcbiAgICB0ZXN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTdGF0ZW1lbnQoXG4gIG9iamVjdDogdC5FeHByZXNzaW9uLFxuICBib2R5OiB0LlN0YXRlbWVudCxcbik6IHQuV2l0aFN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5XaXRoU3RhdGVtZW50Pih7XG4gICAgdHlwZTogXCJXaXRoU3RhdGVtZW50XCIsXG4gICAgb2JqZWN0LFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbm1lbnRQYXR0ZXJuKFxuICBsZWZ0OlxuICAgIHwgdC5JZGVudGlmaWVyXG4gICAgfCB0Lk9iamVjdFBhdHRlcm5cbiAgICB8IHQuQXJyYXlQYXR0ZXJuXG4gICAgfCB0Lk1lbWJlckV4cHJlc3Npb25cbiAgICB8IHQuVFNBc0V4cHJlc3Npb25cbiAgICB8IHQuVFNTYXRpc2ZpZXNFeHByZXNzaW9uXG4gICAgfCB0LlRTVHlwZUFzc2VydGlvblxuICAgIHwgdC5UU05vbk51bGxFeHByZXNzaW9uLFxuICByaWdodDogdC5FeHByZXNzaW9uLFxuKTogdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Bc3NpZ25tZW50UGF0dGVybj4oe1xuICAgIHR5cGU6IFwiQXNzaWdubWVudFBhdHRlcm5cIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVBhdHRlcm4oXG4gIGVsZW1lbnRzOiBBcnJheTxudWxsIHwgdC5QYXR0ZXJuTGlrZSB8IHQuTFZhbD4sXG4pOiB0LkFycmF5UGF0dGVybiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5BcnJheVBhdHRlcm4+KHtcbiAgICB0eXBlOiBcIkFycmF5UGF0dGVyblwiLFxuICAgIGVsZW1lbnRzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihcbiAgcGFyYW1zOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50PixcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCB8IHQuRXhwcmVzc2lvbixcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIsXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgYXN5bmMsXG4gICAgZXhwcmVzc2lvbjogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2R5KFxuICBib2R5OiBBcnJheTxcbiAgICB8IHQuQ2xhc3NNZXRob2RcbiAgICB8IHQuQ2xhc3NQcml2YXRlTWV0aG9kXG4gICAgfCB0LkNsYXNzUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NQcml2YXRlUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5XG4gICAgfCB0LlRTRGVjbGFyZU1ldGhvZFxuICAgIHwgdC5UU0luZGV4U2lnbmF0dXJlXG4gICAgfCB0LlN0YXRpY0Jsb2NrXG4gID4sXG4pOiB0LkNsYXNzQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc0JvZHk+KHtcbiAgICB0eXBlOiBcIkNsYXNzQm9keVwiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzRXhwcmVzc2lvbihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBzdXBlckNsYXNzOiB0LkV4cHJlc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5DbGFzc0JvZHksXG4gIGRlY29yYXRvcnM6IEFycmF5PHQuRGVjb3JhdG9yPiB8IG51bGwgPSBudWxsLFxuKTogdC5DbGFzc0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJDbGFzc0V4cHJlc3Npb25cIixcbiAgICBpZCxcbiAgICBzdXBlckNsYXNzLFxuICAgIGJvZHksXG4gICAgZGVjb3JhdG9ycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgc3VwZXJDbGFzczogdC5FeHByZXNzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIGJvZHk6IHQuQ2xhc3NCb2R5LFxuICBkZWNvcmF0b3JzOiBBcnJheTx0LkRlY29yYXRvcj4gfCBudWxsID0gbnVsbCxcbik6IHQuQ2xhc3NEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc0RlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJDbGFzc0RlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gICAgc3VwZXJDbGFzcyxcbiAgICBib2R5LFxuICAgIGRlY29yYXRvcnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydEFsbERlY2xhcmF0aW9uKFxuICBzb3VyY2U6IHQuU3RyaW5nTGl0ZXJhbCxcbik6IHQuRXhwb3J0QWxsRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwb3J0QWxsRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIsXG4gICAgc291cmNlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnREZWZhdWx0RGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOlxuICAgIHwgdC5UU0RlY2xhcmVGdW5jdGlvblxuICAgIHwgdC5GdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgfCB0LkNsYXNzRGVjbGFyYXRpb25cbiAgICB8IHQuRXhwcmVzc2lvbixcbik6IHQuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIsXG4gICAgZGVjbGFyYXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5hbWVkRGVjbGFyYXRpb24oXG4gIGRlY2xhcmF0aW9uOiB0LkRlY2xhcmF0aW9uIHwgbnVsbCA9IG51bGwsXG4gIHNwZWNpZmllcnM6IEFycmF5PFxuICAgIHQuRXhwb3J0U3BlY2lmaWVyIHwgdC5FeHBvcnREZWZhdWx0U3BlY2lmaWVyIHwgdC5FeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJcbiAgPiA9IFtdLFxuICBzb3VyY2U6IHQuU3RyaW5nTGl0ZXJhbCB8IG51bGwgPSBudWxsLFxuKTogdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydE5hbWVkRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIixcbiAgICBkZWNsYXJhdGlvbixcbiAgICBzcGVjaWZpZXJzLFxuICAgIHNvdXJjZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuICBleHBvcnRlZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5FeHBvcnRTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRXhwb3J0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJFeHBvcnRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgICBleHBvcnRlZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9yT2ZTdGF0ZW1lbnQoXG4gIGxlZnQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbiB8IHQuTFZhbCxcbiAgcmlnaHQ6IHQuRXhwcmVzc2lvbixcbiAgYm9keTogdC5TdGF0ZW1lbnQsXG4gIF9hd2FpdDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5Gb3JPZlN0YXRlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Gb3JPZlN0YXRlbWVudD4oe1xuICAgIHR5cGU6IFwiRm9yT2ZTdGF0ZW1lbnRcIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICAgIGJvZHksXG4gICAgYXdhaXQ6IF9hd2FpdCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0RGVjbGFyYXRpb24oXG4gIHNwZWNpZmllcnM6IEFycmF5PFxuICAgIHQuSW1wb3J0U3BlY2lmaWVyIHwgdC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyIHwgdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcbiAgPixcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwsXG4pOiB0LkltcG9ydERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkltcG9ydERlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJJbXBvcnREZWNsYXJhdGlvblwiLFxuICAgIHNwZWNpZmllcnMsXG4gICAgc291cmNlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuKTogdC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkltcG9ydERlZmF1bHRTcGVjaWZpZXI+KHtcbiAgICB0eXBlOiBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuKTogdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0U3BlY2lmaWVyKFxuICBsb2NhbDogdC5JZGVudGlmaWVyLFxuICBpbXBvcnRlZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5JbXBvcnRTcGVjaWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJJbXBvcnRTcGVjaWZpZXJcIixcbiAgICBsb2NhbCxcbiAgICBpbXBvcnRlZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWV0YVByb3BlcnR5KFxuICBtZXRhOiB0LklkZW50aWZpZXIsXG4gIHByb3BlcnR5OiB0LklkZW50aWZpZXIsXG4pOiB0Lk1ldGFQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5NZXRhUHJvcGVydHk+KHtcbiAgICB0eXBlOiBcIk1ldGFQcm9wZXJ0eVwiLFxuICAgIG1ldGEsXG4gICAgcHJvcGVydHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzTWV0aG9kKFxuICBraW5kOiBcImdldFwiIHwgXCJzZXRcIiB8IFwibWV0aG9kXCIgfCBcImNvbnN0cnVjdG9yXCIgfCB1bmRlZmluZWQgPSBcIm1ldGhvZFwiLFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHBhcmFtczogQXJyYXk8XG4gICAgdC5JZGVudGlmaWVyIHwgdC5QYXR0ZXJuIHwgdC5SZXN0RWxlbWVudCB8IHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eVxuICA+LFxuICBib2R5OiB0LkJsb2NrU3RhdGVtZW50LFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuICBfc3RhdGljOiBib29sZWFuID0gZmFsc2UsXG4gIGdlbmVyYXRvcjogYm9vbGVhbiA9IGZhbHNlLFxuICBhc3luYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5DbGFzc01ldGhvZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc01ldGhvZD4oe1xuICAgIHR5cGU6IFwiQ2xhc3NNZXRob2RcIixcbiAgICBraW5kLFxuICAgIGtleSxcbiAgICBwYXJhbXMsXG4gICAgYm9keSxcbiAgICBjb21wdXRlZCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gICAgZ2VuZXJhdG9yLFxuICAgIGFzeW5jLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RQYXR0ZXJuKFxuICBwcm9wZXJ0aWVzOiBBcnJheTx0LlJlc3RFbGVtZW50IHwgdC5PYmplY3RQcm9wZXJ0eT4sXG4pOiB0Lk9iamVjdFBhdHRlcm4ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT2JqZWN0UGF0dGVybj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0UGF0dGVyblwiLFxuICAgIHByb3BlcnRpZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNwcmVhZEVsZW1lbnQoYXJndW1lbnQ6IHQuRXhwcmVzc2lvbik6IHQuU3ByZWFkRWxlbWVudCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5TcHJlYWRFbGVtZW50Pih7XG4gICAgdHlwZTogXCJTcHJlYWRFbGVtZW50XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZnVuY3Rpb24gX3N1cGVyKCk6IHQuU3VwZXIge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiU3VwZXJcIixcbiAgfTtcbn1cbmV4cG9ydCB7IF9zdXBlciBhcyBzdXBlciB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihcbiAgdGFnOiB0LkV4cHJlc3Npb24sXG4gIHF1YXNpOiB0LlRlbXBsYXRlTGl0ZXJhbCxcbik6IHQuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIsXG4gICAgdGFnLFxuICAgIHF1YXNpLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUVsZW1lbnQoXG4gIHZhbHVlOiB7IHJhdzogc3RyaW5nOyBjb29rZWQ/OiBzdHJpbmcgfSxcbiAgdGFpbDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5UZW1wbGF0ZUVsZW1lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVGVtcGxhdGVFbGVtZW50Pih7XG4gICAgdHlwZTogXCJUZW1wbGF0ZUVsZW1lbnRcIixcbiAgICB2YWx1ZSxcbiAgICB0YWlsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZUxpdGVyYWwoXG4gIHF1YXNpczogQXJyYXk8dC5UZW1wbGF0ZUVsZW1lbnQ+LFxuICBleHByZXNzaW9uczogQXJyYXk8dC5FeHByZXNzaW9uIHwgdC5UU1R5cGU+LFxuKTogdC5UZW1wbGF0ZUxpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVGVtcGxhdGVMaXRlcmFsPih7XG4gICAgdHlwZTogXCJUZW1wbGF0ZUxpdGVyYWxcIixcbiAgICBxdWFzaXMsXG4gICAgZXhwcmVzc2lvbnMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHlpZWxkRXhwcmVzc2lvbihcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuICBkZWxlZ2F0ZTogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5ZaWVsZEV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuWWllbGRFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJZaWVsZEV4cHJlc3Npb25cIixcbiAgICBhcmd1bWVudCxcbiAgICBkZWxlZ2F0ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50OiB0LkV4cHJlc3Npb24pOiB0LkF3YWl0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Bd2FpdEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIkF3YWl0RXhwcmVzc2lvblwiLFxuICAgIGFyZ3VtZW50LFxuICB9KTtcbn1cbmZ1bmN0aW9uIF9pbXBvcnQoKTogdC5JbXBvcnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSW1wb3J0XCIsXG4gIH07XG59XG5leHBvcnQgeyBfaW1wb3J0IGFzIGltcG9ydCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludExpdGVyYWwodmFsdWU6IHN0cmluZyk6IHQuQmlnSW50TGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CaWdJbnRMaXRlcmFsPih7XG4gICAgdHlwZTogXCJCaWdJbnRMaXRlcmFsXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcihcbiAgZXhwb3J0ZWQ6IHQuSWRlbnRpZmllcixcbik6IHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcj4oe1xuICAgIHR5cGU6IFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIsXG4gICAgZXhwb3J0ZWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24sXG4gIHByb3BlcnR5OiB0LkV4cHJlc3Npb24gfCB0LklkZW50aWZpZXIsXG4gIGNvbXB1dGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIG9wdGlvbmFsOiBib29sZWFuLFxuKTogdC5PcHRpb25hbE1lbWJlckV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgcHJvcGVydHksXG4gICAgY29tcHV0ZWQsXG4gICAgb3B0aW9uYWwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsQ2FsbEV4cHJlc3Npb24oXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uLFxuICBfYXJndW1lbnRzOiBBcnJheTxcbiAgICB0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQgfCB0LkpTWE5hbWVzcGFjZWROYW1lIHwgdC5Bcmd1bWVudFBsYWNlaG9sZGVyXG4gID4sXG4gIG9wdGlvbmFsOiBib29sZWFuLFxuKTogdC5PcHRpb25hbENhbGxFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIixcbiAgICBjYWxsZWUsXG4gICAgYXJndW1lbnRzOiBfYXJndW1lbnRzLFxuICAgIG9wdGlvbmFsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc1Byb3BlcnR5KFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCBudWxsID0gbnVsbCxcbiAgdHlwZUFubm90YXRpb246IHQuVHlwZUFubm90YXRpb24gfCB0LlRTVHlwZUFubm90YXRpb24gfCB0Lk5vb3AgfCBudWxsID0gbnVsbCxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4gIGNvbXB1dGVkOiBib29sZWFuID0gZmFsc2UsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5DbGFzc1Byb3BlcnR5Pih7XG4gICAgdHlwZTogXCJDbGFzc1Byb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGRlY29yYXRvcnMsXG4gICAgY29tcHV0ZWQsXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0FjY2Vzc29yUHJvcGVydHkoXG4gIGtleTpcbiAgICB8IHQuSWRlbnRpZmllclxuICAgIHwgdC5TdHJpbmdMaXRlcmFsXG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LkJpZ0ludExpdGVyYWxcbiAgICB8IHQuRXhwcmVzc2lvblxuICAgIHwgdC5Qcml2YXRlTmFtZSxcbiAgdmFsdWU6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UeXBlQW5ub3RhdGlvbiB8IHQuVFNUeXBlQW5ub3RhdGlvbiB8IHQuTm9vcCB8IG51bGwgPSBudWxsLFxuICBkZWNvcmF0b3JzOiBBcnJheTx0LkRlY29yYXRvcj4gfCBudWxsID0gbnVsbCxcbiAgY29tcHV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgX3N0YXRpYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIixcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgZGVjb3JhdG9ycyxcbiAgICBjb21wdXRlZCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzUHJpdmF0ZVByb3BlcnR5KFxuICBrZXk6IHQuUHJpdmF0ZU5hbWUsXG4gIHZhbHVlOiB0LkV4cHJlc3Npb24gfCBudWxsID0gbnVsbCxcbiAgZGVjb3JhdG9yczogQXJyYXk8dC5EZWNvcmF0b3I+IHwgbnVsbCA9IG51bGwsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcml2YXRlUHJvcGVydHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NQcml2YXRlUHJvcGVydHk+KHtcbiAgICB0eXBlOiBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvcnMsXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc1ByaXZhdGVNZXRob2QoXG4gIGtpbmQ6IFwiZ2V0XCIgfCBcInNldFwiIHwgXCJtZXRob2RcIiB8IHVuZGVmaW5lZCA9IFwibWV0aG9kXCIsXG4gIGtleTogdC5Qcml2YXRlTmFtZSxcbiAgcGFyYW1zOiBBcnJheTxcbiAgICB0LklkZW50aWZpZXIgfCB0LlBhdHRlcm4gfCB0LlJlc3RFbGVtZW50IHwgdC5UU1BhcmFtZXRlclByb3BlcnR5XG4gID4sXG4gIGJvZHk6IHQuQmxvY2tTdGF0ZW1lbnQsXG4gIF9zdGF0aWM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuQ2xhc3NQcml2YXRlTWV0aG9kIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkNsYXNzUHJpdmF0ZU1ldGhvZD4oe1xuICAgIHR5cGU6IFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAga2luZCxcbiAgICBrZXksXG4gICAgcGFyYW1zLFxuICAgIGJvZHksXG4gICAgc3RhdGljOiBfc3RhdGljLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlTmFtZShpZDogdC5JZGVudGlmaWVyKTogdC5Qcml2YXRlTmFtZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5Qcml2YXRlTmFtZT4oe1xuICAgIHR5cGU6IFwiUHJpdmF0ZU5hbWVcIixcbiAgICBpZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhdGljQmxvY2soYm9keTogQXJyYXk8dC5TdGF0ZW1lbnQ+KTogdC5TdGF0aWNCbG9jayB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5TdGF0aWNCbG9jaz4oe1xuICAgIHR5cGU6IFwiU3RhdGljQmxvY2tcIixcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhbnlUeXBlQW5ub3RhdGlvbigpOiB0LkFueVR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIkFueVR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUeXBlQW5ub3RhdGlvbihcbiAgZWxlbWVudFR5cGU6IHQuRmxvd1R5cGUsXG4pOiB0LkFycmF5VHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQXJyYXlUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiQXJyYXlUeXBlQW5ub3RhdGlvblwiLFxuICAgIGVsZW1lbnRUeXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuVHlwZUFubm90YXRpb24oKTogdC5Cb29sZWFuVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiQm9vbGVhblR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgdmFsdWU6IGJvb2xlYW4sXG4pOiB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKCk6IHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NJbXBsZW1lbnRzKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5DbGFzc0ltcGxlbWVudHMge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuQ2xhc3NJbXBsZW1lbnRzPih7XG4gICAgdHlwZTogXCJDbGFzc0ltcGxlbWVudHNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZUNsYXNzKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuRGVjbGFyZUNsYXNzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVDbGFzcz4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZUNsYXNzXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZUZ1bmN0aW9uKGlkOiB0LklkZW50aWZpZXIpOiB0LkRlY2xhcmVGdW5jdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlRnVuY3Rpb24+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVGdW5jdGlvblwiLFxuICAgIGlkLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNsYXJlSW50ZXJmYWNlKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuRGVjbGFyZUludGVyZmFjZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlSW50ZXJmYWNlPih7XG4gICAgdHlwZTogXCJEZWNsYXJlSW50ZXJmYWNlXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU1vZHVsZShcbiAgaWQ6IHQuSWRlbnRpZmllciB8IHQuU3RyaW5nTGl0ZXJhbCxcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAga2luZDogXCJDb21tb25KU1wiIHwgXCJFU1wiIHwgbnVsbCA9IG51bGwsXG4pOiB0LkRlY2xhcmVNb2R1bGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZU1vZHVsZT4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZU1vZHVsZVwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gICAga2luZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU1vZHVsZUV4cG9ydHMoXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlR5cGVBbm5vdGF0aW9uLFxuKTogdC5EZWNsYXJlTW9kdWxlRXhwb3J0cyB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlTW9kdWxlRXhwb3J0cz4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZVR5cGVBbGlhcyhcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHJpZ2h0OiB0LkZsb3dUeXBlLFxuKTogdC5EZWNsYXJlVHlwZUFsaWFzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVUeXBlQWxpYXM+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVUeXBlQWxpYXNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZU9wYXF1ZVR5cGUoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgPSBudWxsLFxuICBzdXBlcnR5cGU6IHQuRmxvd1R5cGUgfCBudWxsID0gbnVsbCxcbik6IHQuRGVjbGFyZU9wYXF1ZVR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZU9wYXF1ZVR5cGU+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVPcGFxdWVUeXBlXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgc3VwZXJ0eXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNsYXJlVmFyaWFibGUoaWQ6IHQuSWRlbnRpZmllcik6IHQuRGVjbGFyZVZhcmlhYmxlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVWYXJpYWJsZT4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZVZhcmlhYmxlXCIsXG4gICAgaWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbihcbiAgZGVjbGFyYXRpb246IHQuRmxvdyB8IG51bGwgPSBudWxsLFxuICBzcGVjaWZpZXJzOiBBcnJheTxcbiAgICB0LkV4cG9ydFNwZWNpZmllciB8IHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXG4gID4gfCBudWxsID0gbnVsbCxcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwgfCBudWxsID0gbnVsbCxcbik6IHQuRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgZGVjbGFyYXRpb24sXG4gICAgc3BlY2lmaWVycyxcbiAgICBzb3VyY2UsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgc291cmNlOiB0LlN0cmluZ0xpdGVyYWwsXG4pOiB0LkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiLFxuICAgIHNvdXJjZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjbGFyZWRQcmVkaWNhdGUodmFsdWU6IHQuRmxvdyk6IHQuRGVjbGFyZWRQcmVkaWNhdGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRGVjbGFyZWRQcmVkaWNhdGU+KHtcbiAgICB0eXBlOiBcIkRlY2xhcmVkUHJlZGljYXRlXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0c1R5cGVBbm5vdGF0aW9uKCk6IHQuRXhpc3RzVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiRXhpc3RzVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1zOiBBcnJheTx0LkZ1bmN0aW9uVHlwZVBhcmFtPixcbiAgcmVzdDogdC5GdW5jdGlvblR5cGVQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICByZXR1cm5UeXBlOiB0LkZsb3dUeXBlLFxuKTogdC5GdW5jdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkZ1bmN0aW9uVHlwZUFubm90YXRpb25cIixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbXMsXG4gICAgcmVzdCxcbiAgICByZXR1cm5UeXBlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVQYXJhbShcbiAgbmFtZTogdC5JZGVudGlmaWVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHR5cGVBbm5vdGF0aW9uOiB0LkZsb3dUeXBlLFxuKTogdC5GdW5jdGlvblR5cGVQYXJhbSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5GdW5jdGlvblR5cGVQYXJhbT4oe1xuICAgIHR5cGU6IFwiRnVuY3Rpb25UeXBlUGFyYW1cIixcbiAgICBuYW1lLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljVHlwZUFubm90YXRpb24oXG4gIGlkOiB0LklkZW50aWZpZXIgfCB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5HZW5lcmljVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJHZW5lcmljVHlwZUFubm90YXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5mZXJyZWRQcmVkaWNhdGUoKTogdC5JbmZlcnJlZFByZWRpY2F0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJJbmZlcnJlZFByZWRpY2F0ZVwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludGVyZmFjZUV4dGVuZHMoXG4gIGlkOiB0LklkZW50aWZpZXIgfCB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyLFxuICB0eXBlUGFyYW1ldGVyczogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5JbnRlcmZhY2VFeHRlbmRzIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkludGVyZmFjZUV4dGVuZHM+KHtcbiAgICB0eXBlOiBcIkludGVyZmFjZUV4dGVuZHNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBfZXh0ZW5kczogQXJyYXk8dC5JbnRlcmZhY2VFeHRlbmRzPiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBib2R5OiB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uLFxuKTogdC5JbnRlcmZhY2VEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5JbnRlcmZhY2VEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBleHRlbmRzOiBfZXh0ZW5kcyxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmZhY2VUeXBlQW5ub3RhdGlvbihcbiAgX2V4dGVuZHM6IEFycmF5PHQuSW50ZXJmYWNlRXh0ZW5kcz4gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgYm9keTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbixcbik6IHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW50ZXJmYWNlVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIsXG4gICAgZXh0ZW5kczogX2V4dGVuZHMsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1peGVkVHlwZUFubm90YXRpb24oKTogdC5NaXhlZFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIk1peGVkVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eVR5cGVBbm5vdGF0aW9uKCk6IHQuRW1wdHlUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVUeXBlQW5ub3RhdGlvbihcbiAgdHlwZUFubm90YXRpb246IHQuRmxvd1R5cGUsXG4pOiB0Lk51bGxhYmxlVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTnVsbGFibGVUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiTnVsbGFibGVUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIHZhbHVlOiBudW1iZXIsXG4pOiB0Lk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5OdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLFxuICAgIHZhbHVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUeXBlQW5ub3RhdGlvbigpOiB0Lk51bWJlclR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VHlwZUFubm90YXRpb24oXG4gIHByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0VHlwZVByb3BlcnR5IHwgdC5PYmplY3RUeXBlU3ByZWFkUHJvcGVydHk+LFxuICBpbmRleGVyczogQXJyYXk8dC5PYmplY3RUeXBlSW5kZXhlcj4gPSBbXSxcbiAgY2FsbFByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eT4gPSBbXSxcbiAgaW50ZXJuYWxTbG90czogQXJyYXk8dC5PYmplY3RUeXBlSW50ZXJuYWxTbG90PiA9IFtdLFxuICBleGFjdDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5PYmplY3RUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZUFubm90YXRpb25cIixcbiAgICBwcm9wZXJ0aWVzLFxuICAgIGluZGV4ZXJzLFxuICAgIGNhbGxQcm9wZXJ0aWVzLFxuICAgIGludGVybmFsU2xvdHMsXG4gICAgZXhhY3QsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFR5cGVJbnRlcm5hbFNsb3QoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHZhbHVlOiB0LkZsb3dUeXBlLFxuICBvcHRpb25hbDogYm9vbGVhbixcbiAgX3N0YXRpYzogYm9vbGVhbixcbiAgbWV0aG9kOiBib29sZWFuLFxuKTogdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVJbnRlcm5hbFNsb3Q+KHtcbiAgICB0eXBlOiBcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIixcbiAgICBpZCxcbiAgICB2YWx1ZSxcbiAgICBvcHRpb25hbCxcbiAgICBzdGF0aWM6IF9zdGF0aWMsXG4gICAgbWV0aG9kLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlQ2FsbFByb3BlcnR5KFxuICB2YWx1ZTogdC5GbG93VHlwZSxcbik6IHQuT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlQ2FsbFByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsXG4gICAgdmFsdWUsXG4gICAgc3RhdGljOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlSW5kZXhlcihcbiAgaWQ6IHQuSWRlbnRpZmllciB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBrZXk6IHQuRmxvd1R5cGUsXG4gIHZhbHVlOiB0LkZsb3dUeXBlLFxuICB2YXJpYW5jZTogdC5WYXJpYW5jZSB8IG51bGwgPSBudWxsLFxuKTogdC5PYmplY3RUeXBlSW5kZXhlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PYmplY3RUeXBlSW5kZXhlcj4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZUluZGV4ZXJcIixcbiAgICBpZCxcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgdmFyaWFuY2UsXG4gICAgc3RhdGljOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlUHJvcGVydHkoXG4gIGtleTogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICB2YWx1ZTogdC5GbG93VHlwZSxcbiAgdmFyaWFuY2U6IHQuVmFyaWFuY2UgfCBudWxsID0gbnVsbCxcbik6IHQuT2JqZWN0VHlwZVByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVQcm9wZXJ0eT4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZVByb3BlcnR5XCIsXG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIHZhcmlhbmNlLFxuICAgIGtpbmQ6IG51bGwsXG4gICAgbWV0aG9kOiBudWxsLFxuICAgIG9wdGlvbmFsOiBudWxsLFxuICAgIHByb3RvOiBudWxsLFxuICAgIHN0YXRpYzogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5KFxuICBhcmd1bWVudDogdC5GbG93VHlwZSxcbik6IHQuT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0Lk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eT4oe1xuICAgIHR5cGU6IFwiT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5XCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZVR5cGUoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBzdXBlcnR5cGU6IHQuRmxvd1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgaW1wbHR5cGU6IHQuRmxvd1R5cGUsXG4pOiB0Lk9wYXF1ZVR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuT3BhcXVlVHlwZT4oe1xuICAgIHR5cGU6IFwiT3BhcXVlVHlwZVwiLFxuICAgIGlkLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHN1cGVydHlwZSxcbiAgICBpbXBsdHlwZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIHF1YWxpZmljYXRpb246IHQuSWRlbnRpZmllciB8IHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIsXG4pOiB0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlF1YWxpZmllZFR5cGVJZGVudGlmaWVyPih7XG4gICAgdHlwZTogXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiLFxuICAgIGlkLFxuICAgIHF1YWxpZmljYXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbihcbiAgdmFsdWU6IHN0cmluZyxcbik6IHQuU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1R5cGVBbm5vdGF0aW9uKCk6IHQuU3RyaW5nVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiU3RyaW5nVHlwZUFubm90YXRpb25cIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzeW1ib2xUeXBlQW5ub3RhdGlvbigpOiB0LlN5bWJvbFR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlN5bWJvbFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdGhpc1R5cGVBbm5vdGF0aW9uKCk6IHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRoaXNUeXBlQW5ub3RhdGlvblwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR1cGxlVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UdXBsZVR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJUdXBsZVR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVvZlR5cGVBbm5vdGF0aW9uKFxuICBhcmd1bWVudDogdC5GbG93VHlwZSxcbik6IHQuVHlwZW9mVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZW9mVHlwZUFubm90YXRpb24+KHtcbiAgICB0eXBlOiBcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVBbGlhcyhcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHJpZ2h0OiB0LkZsb3dUeXBlLFxuKTogdC5UeXBlQWxpYXMge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZUFsaWFzPih7XG4gICAgdHlwZTogXCJUeXBlQWxpYXNcIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICByaWdodCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdHlwZUFubm90YXRpb24odHlwZUFubm90YXRpb246IHQuRmxvd1R5cGUpOiB0LlR5cGVBbm5vdGF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0eXBlQ2FzdEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbiAgdHlwZUFubm90YXRpb246IHQuVHlwZUFubm90YXRpb24sXG4pOiB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UeXBlQ2FzdEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlR5cGVDYXN0RXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXIoXG4gIGJvdW5kOiB0LlR5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4gIF9kZWZhdWx0OiB0LkZsb3dUeXBlIHwgbnVsbCA9IG51bGwsXG4gIHZhcmlhbmNlOiB0LlZhcmlhbmNlIHwgbnVsbCA9IG51bGwsXG4pOiB0LlR5cGVQYXJhbWV0ZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZVBhcmFtZXRlcj4oe1xuICAgIHR5cGU6IFwiVHlwZVBhcmFtZXRlclwiLFxuICAgIGJvdW5kLFxuICAgIGRlZmF1bHQ6IF9kZWZhdWx0LFxuICAgIHZhcmlhbmNlLFxuICAgIG5hbWU6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgcGFyYW1zOiBBcnJheTx0LlR5cGVQYXJhbWV0ZXI+LFxuKTogdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBwYXJhbXM6IEFycmF5PHQuRmxvd1R5cGU+LFxuKTogdC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbj4oe1xuICAgIHR5cGU6IFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVHlwZUFubm90YXRpb24oXG4gIHR5cGVzOiBBcnJheTx0LkZsb3dUeXBlPixcbik6IHQuVW5pb25UeXBlQW5ub3RhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5VbmlvblR5cGVBbm5vdGF0aW9uPih7XG4gICAgdHlwZTogXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhbmNlKGtpbmQ6IFwibWludXNcIiB8IFwicGx1c1wiKTogdC5WYXJpYW5jZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WYXJpYW5jZT4oe1xuICAgIHR5cGU6IFwiVmFyaWFuY2VcIixcbiAgICBraW5kLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2b2lkVHlwZUFubm90YXRpb24oKTogdC5Wb2lkVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIsXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bURlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICBib2R5OlxuICAgIHwgdC5FbnVtQm9vbGVhbkJvZHlcbiAgICB8IHQuRW51bU51bWJlckJvZHlcbiAgICB8IHQuRW51bVN0cmluZ0JvZHlcbiAgICB8IHQuRW51bVN5bWJvbEJvZHksXG4pOiB0LkVudW1EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIkVudW1EZWNsYXJhdGlvblwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1Cb29sZWFuQm9keShcbiAgbWVtYmVyczogQXJyYXk8dC5FbnVtQm9vbGVhbk1lbWJlcj4sXG4pOiB0LkVudW1Cb29sZWFuQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtQm9vbGVhbkJvZHk+KHtcbiAgICB0eXBlOiBcIkVudW1Cb29sZWFuQm9keVwiLFxuICAgIG1lbWJlcnMsXG4gICAgZXhwbGljaXRUeXBlOiBudWxsLFxuICAgIGhhc1Vua25vd25NZW1iZXJzOiBudWxsLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbnVtTnVtYmVyQm9keShcbiAgbWVtYmVyczogQXJyYXk8dC5FbnVtTnVtYmVyTWVtYmVyPixcbik6IHQuRW51bU51bWJlckJvZHkge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRW51bU51bWJlckJvZHk+KHtcbiAgICB0eXBlOiBcIkVudW1OdW1iZXJCb2R5XCIsXG4gICAgbWVtYmVycyxcbiAgICBleHBsaWNpdFR5cGU6IG51bGwsXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdCb2R5KFxuICBtZW1iZXJzOiBBcnJheTx0LkVudW1TdHJpbmdNZW1iZXIgfCB0LkVudW1EZWZhdWx0ZWRNZW1iZXI+LFxuKTogdC5FbnVtU3RyaW5nQm9keSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtU3RyaW5nQm9keT4oe1xuICAgIHR5cGU6IFwiRW51bVN0cmluZ0JvZHlcIixcbiAgICBtZW1iZXJzLFxuICAgIGV4cGxpY2l0VHlwZTogbnVsbCxcbiAgICBoYXNVbmtub3duTWVtYmVyczogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bVN5bWJvbEJvZHkoXG4gIG1lbWJlcnM6IEFycmF5PHQuRW51bURlZmF1bHRlZE1lbWJlcj4sXG4pOiB0LkVudW1TeW1ib2xCb2R5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1TeW1ib2xCb2R5Pih7XG4gICAgdHlwZTogXCJFbnVtU3ltYm9sQm9keVwiLFxuICAgIG1lbWJlcnMsXG4gICAgaGFzVW5rbm93bk1lbWJlcnM6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1Cb29sZWFuTWVtYmVyKGlkOiB0LklkZW50aWZpZXIpOiB0LkVudW1Cb29sZWFuTWVtYmVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1Cb29sZWFuTWVtYmVyPih7XG4gICAgdHlwZTogXCJFbnVtQm9vbGVhbk1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1OdW1iZXJNZW1iZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIGluaXQ6IHQuTnVtZXJpY0xpdGVyYWwsXG4pOiB0LkVudW1OdW1iZXJNZW1iZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuRW51bU51bWJlck1lbWJlcj4oe1xuICAgIHR5cGU6IFwiRW51bU51bWJlck1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdNZW1iZXIoXG4gIGlkOiB0LklkZW50aWZpZXIsXG4gIGluaXQ6IHQuU3RyaW5nTGl0ZXJhbCxcbik6IHQuRW51bVN0cmluZ01lbWJlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FbnVtU3RyaW5nTWVtYmVyPih7XG4gICAgdHlwZTogXCJFbnVtU3RyaW5nTWVtYmVyXCIsXG4gICAgaWQsXG4gICAgaW5pdCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW51bURlZmF1bHRlZE1lbWJlcihpZDogdC5JZGVudGlmaWVyKTogdC5FbnVtRGVmYXVsdGVkTWVtYmVyIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkVudW1EZWZhdWx0ZWRNZW1iZXI+KHtcbiAgICB0eXBlOiBcIkVudW1EZWZhdWx0ZWRNZW1iZXJcIixcbiAgICBpZCxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuRmxvd1R5cGUsXG4gIGluZGV4VHlwZTogdC5GbG93VHlwZSxcbik6IHQuSW5kZXhlZEFjY2Vzc1R5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW5kZXhlZEFjY2Vzc1R5cGU+KHtcbiAgICB0eXBlOiBcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgb2JqZWN0VHlwZSxcbiAgICBpbmRleFR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuRmxvd1R5cGUsXG4gIGluZGV4VHlwZTogdC5GbG93VHlwZSxcbik6IHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5PcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlPih7XG4gICAgdHlwZTogXCJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlXCIsXG4gICAgb2JqZWN0VHlwZSxcbiAgICBpbmRleFR5cGUsXG4gICAgb3B0aW9uYWw6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpzeEF0dHJpYnV0ZShcbiAgbmFtZTogdC5KU1hJZGVudGlmaWVyIHwgdC5KU1hOYW1lc3BhY2VkTmFtZSxcbiAgdmFsdWU6XG4gICAgfCB0LkpTWEVsZW1lbnRcbiAgICB8IHQuSlNYRnJhZ21lbnRcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5KU1hFeHByZXNzaW9uQ29udGFpbmVyXG4gICAgfCBudWxsID0gbnVsbCxcbik6IHQuSlNYQXR0cmlidXRlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWEF0dHJpYnV0ZT4oe1xuICAgIHR5cGU6IFwiSlNYQXR0cmlidXRlXCIsXG4gICAgbmFtZSxcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hBdHRyaWJ1dGUgYXMgalNYQXR0cmlidXRlIH07XG5leHBvcnQgZnVuY3Rpb24ganN4Q2xvc2luZ0VsZW1lbnQoXG4gIG5hbWU6IHQuSlNYSWRlbnRpZmllciB8IHQuSlNYTWVtYmVyRXhwcmVzc2lvbiB8IHQuSlNYTmFtZXNwYWNlZE5hbWUsXG4pOiB0LkpTWENsb3NpbmdFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWENsb3NpbmdFbGVtZW50Pih7XG4gICAgdHlwZTogXCJKU1hDbG9zaW5nRWxlbWVudFwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4Q2xvc2luZ0VsZW1lbnQgYXMgalNYQ2xvc2luZ0VsZW1lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hFbGVtZW50KFxuICBvcGVuaW5nRWxlbWVudDogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgY2xvc2luZ0VsZW1lbnQ6IHQuSlNYQ2xvc2luZ0VsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgY2hpbGRyZW46IEFycmF5PFxuICAgIHwgdC5KU1hUZXh0XG4gICAgfCB0LkpTWEV4cHJlc3Npb25Db250YWluZXJcbiAgICB8IHQuSlNYU3ByZWFkQ2hpbGRcbiAgICB8IHQuSlNYRWxlbWVudFxuICAgIHwgdC5KU1hGcmFnbWVudFxuICA+LFxuICBzZWxmQ2xvc2luZzogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuKTogdC5KU1hFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWEVsZW1lbnQ+KHtcbiAgICB0eXBlOiBcIkpTWEVsZW1lbnRcIixcbiAgICBvcGVuaW5nRWxlbWVudCxcbiAgICBjbG9zaW5nRWxlbWVudCxcbiAgICBjaGlsZHJlbixcbiAgICBzZWxmQ2xvc2luZyxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hFbGVtZW50IGFzIGpTWEVsZW1lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hFbXB0eUV4cHJlc3Npb24oKTogdC5KU1hFbXB0eUV4cHJlc3Npb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSlNYRW1wdHlFeHByZXNzaW9uXCIsXG4gIH07XG59XG5leHBvcnQgeyBqc3hFbXB0eUV4cHJlc3Npb24gYXMgalNYRW1wdHlFeHByZXNzaW9uIH07XG5leHBvcnQgZnVuY3Rpb24ganN4RXhwcmVzc2lvbkNvbnRhaW5lcihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uIHwgdC5KU1hFbXB0eUV4cHJlc3Npb24sXG4pOiB0LkpTWEV4cHJlc3Npb25Db250YWluZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcj4oe1xuICAgIHR5cGU6IFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IHsganN4RXhwcmVzc2lvbkNvbnRhaW5lciBhcyBqU1hFeHByZXNzaW9uQ29udGFpbmVyIH07XG5leHBvcnQgZnVuY3Rpb24ganN4U3ByZWFkQ2hpbGQoZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uKTogdC5KU1hTcHJlYWRDaGlsZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5KU1hTcHJlYWRDaGlsZD4oe1xuICAgIHR5cGU6IFwiSlNYU3ByZWFkQ2hpbGRcIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IGpzeFNwcmVhZENoaWxkIGFzIGpTWFNwcmVhZENoaWxkIH07XG5leHBvcnQgZnVuY3Rpb24ganN4SWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LkpTWElkZW50aWZpZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYSWRlbnRpZmllcj4oe1xuICAgIHR5cGU6IFwiSlNYSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4SWRlbnRpZmllciBhcyBqU1hJZGVudGlmaWVyIH07XG5leHBvcnQgZnVuY3Rpb24ganN4TWVtYmVyRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkpTWE1lbWJlckV4cHJlc3Npb24gfCB0LkpTWElkZW50aWZpZXIsXG4gIHByb3BlcnR5OiB0LkpTWElkZW50aWZpZXIsXG4pOiB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYTWVtYmVyRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiLFxuICAgIG9iamVjdCxcbiAgICBwcm9wZXJ0eSxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hNZW1iZXJFeHByZXNzaW9uIGFzIGpTWE1lbWJlckV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hOYW1lc3BhY2VkTmFtZShcbiAgbmFtZXNwYWNlOiB0LkpTWElkZW50aWZpZXIsXG4gIG5hbWU6IHQuSlNYSWRlbnRpZmllcixcbik6IHQuSlNYTmFtZXNwYWNlZE5hbWUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYTmFtZXNwYWNlZE5hbWU+KHtcbiAgICB0eXBlOiBcIkpTWE5hbWVzcGFjZWROYW1lXCIsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4TmFtZXNwYWNlZE5hbWUgYXMgalNYTmFtZXNwYWNlZE5hbWUgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hPcGVuaW5nRWxlbWVudChcbiAgbmFtZTogdC5KU1hJZGVudGlmaWVyIHwgdC5KU1hNZW1iZXJFeHByZXNzaW9uIHwgdC5KU1hOYW1lc3BhY2VkTmFtZSxcbiAgYXR0cmlidXRlczogQXJyYXk8dC5KU1hBdHRyaWJ1dGUgfCB0LkpTWFNwcmVhZEF0dHJpYnV0ZT4sXG4gIHNlbGZDbG9zaW5nOiBib29sZWFuID0gZmFsc2UsXG4pOiB0LkpTWE9wZW5pbmdFbGVtZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWE9wZW5pbmdFbGVtZW50Pih7XG4gICAgdHlwZTogXCJKU1hPcGVuaW5nRWxlbWVudFwiLFxuICAgIG5hbWUsXG4gICAgYXR0cmlidXRlcyxcbiAgICBzZWxmQ2xvc2luZyxcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hPcGVuaW5nRWxlbWVudCBhcyBqU1hPcGVuaW5nRWxlbWVudCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeFNwcmVhZEF0dHJpYnV0ZShcbiAgYXJndW1lbnQ6IHQuRXhwcmVzc2lvbixcbik6IHQuSlNYU3ByZWFkQXR0cmlidXRlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkpTWFNwcmVhZEF0dHJpYnV0ZT4oe1xuICAgIHR5cGU6IFwiSlNYU3ByZWFkQXR0cmlidXRlXCIsXG4gICAgYXJndW1lbnQsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4U3ByZWFkQXR0cmlidXRlIGFzIGpTWFNwcmVhZEF0dHJpYnV0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeFRleHQodmFsdWU6IHN0cmluZyk6IHQuSlNYVGV4dCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5KU1hUZXh0Pih7XG4gICAgdHlwZTogXCJKU1hUZXh0XCIsXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IHsganN4VGV4dCBhcyBqU1hUZXh0IH07XG5leHBvcnQgZnVuY3Rpb24ganN4RnJhZ21lbnQoXG4gIG9wZW5pbmdGcmFnbWVudDogdC5KU1hPcGVuaW5nRnJhZ21lbnQsXG4gIGNsb3NpbmdGcmFnbWVudDogdC5KU1hDbG9zaW5nRnJhZ21lbnQsXG4gIGNoaWxkcmVuOiBBcnJheTxcbiAgICB8IHQuSlNYVGV4dFxuICAgIHwgdC5KU1hFeHByZXNzaW9uQ29udGFpbmVyXG4gICAgfCB0LkpTWFNwcmVhZENoaWxkXG4gICAgfCB0LkpTWEVsZW1lbnRcbiAgICB8IHQuSlNYRnJhZ21lbnRcbiAgPixcbik6IHQuSlNYRnJhZ21lbnQge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSlNYRnJhZ21lbnQ+KHtcbiAgICB0eXBlOiBcIkpTWEZyYWdtZW50XCIsXG4gICAgb3BlbmluZ0ZyYWdtZW50LFxuICAgIGNsb3NpbmdGcmFnbWVudCxcbiAgICBjaGlsZHJlbixcbiAgfSk7XG59XG5leHBvcnQgeyBqc3hGcmFnbWVudCBhcyBqU1hGcmFnbWVudCB9O1xuZXhwb3J0IGZ1bmN0aW9uIGpzeE9wZW5pbmdGcmFnbWVudCgpOiB0LkpTWE9wZW5pbmdGcmFnbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJKU1hPcGVuaW5nRnJhZ21lbnRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IGpzeE9wZW5pbmdGcmFnbWVudCBhcyBqU1hPcGVuaW5nRnJhZ21lbnQgfTtcbmV4cG9ydCBmdW5jdGlvbiBqc3hDbG9zaW5nRnJhZ21lbnQoKTogdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIsXG4gIH07XG59XG5leHBvcnQgeyBqc3hDbG9zaW5nRnJhZ21lbnQgYXMgalNYQ2xvc2luZ0ZyYWdtZW50IH07XG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpOiB0Lk5vb3Age1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiTm9vcFwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBsYWNlaG9sZGVyKFxuICBleHBlY3RlZE5vZGU6XG4gICAgfCBcIklkZW50aWZpZXJcIlxuICAgIHwgXCJTdHJpbmdMaXRlcmFsXCJcbiAgICB8IFwiRXhwcmVzc2lvblwiXG4gICAgfCBcIlN0YXRlbWVudFwiXG4gICAgfCBcIkRlY2xhcmF0aW9uXCJcbiAgICB8IFwiQmxvY2tTdGF0ZW1lbnRcIlxuICAgIHwgXCJDbGFzc0JvZHlcIlxuICAgIHwgXCJQYXR0ZXJuXCIsXG4gIG5hbWU6IHQuSWRlbnRpZmllcixcbik6IHQuUGxhY2Vob2xkZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuUGxhY2Vob2xkZXI+KHtcbiAgICB0eXBlOiBcIlBsYWNlaG9sZGVyXCIsXG4gICAgZXhwZWN0ZWROb2RlLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHY4SW50cmluc2ljSWRlbnRpZmllcihuYW1lOiBzdHJpbmcpOiB0LlY4SW50cmluc2ljSWRlbnRpZmllciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5WOEludHJpbnNpY0lkZW50aWZpZXI+KHtcbiAgICB0eXBlOiBcIlY4SW50cmluc2ljSWRlbnRpZmllclwiLFxuICAgIG5hbWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFyZ3VtZW50UGxhY2Vob2xkZXIoKTogdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIkFyZ3VtZW50UGxhY2Vob2xkZXJcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRXhwcmVzc2lvbihcbiAgb2JqZWN0OiB0LkV4cHJlc3Npb24sXG4gIGNhbGxlZTogdC5FeHByZXNzaW9uLFxuKTogdC5CaW5kRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5CaW5kRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiQmluZEV4cHJlc3Npb25cIixcbiAgICBvYmplY3QsXG4gICAgY2FsbGVlLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRBdHRyaWJ1dGUoXG4gIGtleTogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICB2YWx1ZTogdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5JbXBvcnRBdHRyaWJ1dGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuSW1wb3J0QXR0cmlidXRlPih7XG4gICAgdHlwZTogXCJJbXBvcnRBdHRyaWJ1dGVcIixcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29yYXRvcihleHByZXNzaW9uOiB0LkV4cHJlc3Npb24pOiB0LkRlY29yYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNvcmF0b3I+KHtcbiAgICB0eXBlOiBcIkRlY29yYXRvclwiLFxuICAgIGV4cHJlc3Npb24sXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRvRXhwcmVzc2lvbihcbiAgYm9keTogdC5CbG9ja1N0YXRlbWVudCxcbiAgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IHQuRG9FeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LkRvRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiRG9FeHByZXNzaW9uXCIsXG4gICAgYm9keSxcbiAgICBhc3luYyxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0RGVmYXVsdFNwZWNpZmllcihcbiAgZXhwb3J0ZWQ6IHQuSWRlbnRpZmllcixcbik6IHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5FeHBvcnREZWZhdWx0U3BlY2lmaWVyPih7XG4gICAgdHlwZTogXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIsXG4gICAgZXhwb3J0ZWQsXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEV4cHJlc3Npb24oXG4gIHByb3BlcnRpZXM6IEFycmF5PHQuT2JqZWN0UHJvcGVydHkgfCB0LlNwcmVhZEVsZW1lbnQ+LFxuKTogdC5SZWNvcmRFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlJlY29yZEV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlJlY29yZEV4cHJlc3Npb25cIixcbiAgICBwcm9wZXJ0aWVzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0dXBsZUV4cHJlc3Npb24oXG4gIGVsZW1lbnRzOiBBcnJheTx0LkV4cHJlc3Npb24gfCB0LlNwcmVhZEVsZW1lbnQ+ID0gW10sXG4pOiB0LlR1cGxlRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UdXBsZUV4cHJlc3Npb24+KHtcbiAgICB0eXBlOiBcIlR1cGxlRXhwcmVzc2lvblwiLFxuICAgIGVsZW1lbnRzLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNpbWFsTGl0ZXJhbCh2YWx1ZTogc3RyaW5nKTogdC5EZWNpbWFsTGl0ZXJhbCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5EZWNpbWFsTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiRGVjaW1hbExpdGVyYWxcIixcbiAgICB2YWx1ZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlRXhwcmVzc2lvbihib2R5OiB0LlByb2dyYW0pOiB0Lk1vZHVsZUV4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuTW9kdWxlRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiTW9kdWxlRXhwcmVzc2lvblwiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvcGljUmVmZXJlbmNlKCk6IHQuVG9waWNSZWZlcmVuY2Uge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVG9waWNSZWZlcmVuY2VcIixcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZVRvcGljRXhwcmVzc2lvbihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuKTogdC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5QaXBlbGluZVRvcGljRXhwcmVzc2lvbj4oe1xuICAgIHR5cGU6IFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwaXBlbGluZUJhcmVGdW5jdGlvbihcbiAgY2FsbGVlOiB0LkV4cHJlc3Npb24sXG4pOiB0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlBpcGVsaW5lQmFyZUZ1bmN0aW9uPih7XG4gICAgdHlwZTogXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLFxuICAgIGNhbGxlZSxcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGlwZWxpbmVQcmltYXJ5VG9waWNSZWZlcmVuY2UoKTogdC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZVwiLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRzUGFyYW1ldGVyUHJvcGVydHkoXG4gIHBhcmFtZXRlcjogdC5JZGVudGlmaWVyIHwgdC5Bc3NpZ25tZW50UGF0dGVybixcbik6IHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1BhcmFtZXRlclByb3BlcnR5Pih7XG4gICAgdHlwZTogXCJUU1BhcmFtZXRlclByb3BlcnR5XCIsXG4gICAgcGFyYW1ldGVyLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUGFyYW1ldGVyUHJvcGVydHkgYXMgdFNQYXJhbWV0ZXJQcm9wZXJ0eSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRGVjbGFyZUZ1bmN0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHR5cGVQYXJhbWV0ZXJzOlxuICAgIHwgdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgIHwgdC5Ob29wXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQ+LFxuICByZXR1cm5UeXBlOiB0LlRTVHlwZUFubm90YXRpb24gfCB0Lk5vb3AgfCBudWxsID0gbnVsbCxcbik6IHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNEZWNsYXJlRnVuY3Rpb24+KHtcbiAgICB0eXBlOiBcIlRTRGVjbGFyZUZ1bmN0aW9uXCIsXG4gICAgaWQsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgcGFyYW1zLFxuICAgIHJldHVyblR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNEZWNsYXJlRnVuY3Rpb24gYXMgdFNEZWNsYXJlRnVuY3Rpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0RlY2xhcmVNZXRob2QoXG4gIGRlY29yYXRvcnM6IEFycmF5PHQuRGVjb3JhdG9yPiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBrZXk6XG4gICAgfCB0LklkZW50aWZpZXJcbiAgICB8IHQuU3RyaW5nTGl0ZXJhbFxuICAgIHwgdC5OdW1lcmljTGl0ZXJhbFxuICAgIHwgdC5CaWdJbnRMaXRlcmFsXG4gICAgfCB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOlxuICAgIHwgdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgIHwgdC5Ob29wXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbXM6IEFycmF5PFxuICAgIHQuSWRlbnRpZmllciB8IHQuUGF0dGVybiB8IHQuUmVzdEVsZW1lbnQgfCB0LlRTUGFyYW1ldGVyUHJvcGVydHlcbiAgPixcbiAgcmV0dXJuVHlwZTogdC5UU1R5cGVBbm5vdGF0aW9uIHwgdC5Ob29wIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTRGVjbGFyZU1ldGhvZCB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0RlY2xhcmVNZXRob2Q+KHtcbiAgICB0eXBlOiBcIlRTRGVjbGFyZU1ldGhvZFwiLFxuICAgIGRlY29yYXRvcnMsXG4gICAga2V5LFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtcyxcbiAgICByZXR1cm5UeXBlLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRGVjbGFyZU1ldGhvZCBhcyB0U0RlY2xhcmVNZXRob2QgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1F1YWxpZmllZE5hbWUoXG4gIGxlZnQ6IHQuVFNFbnRpdHlOYW1lLFxuICByaWdodDogdC5JZGVudGlmaWVyLFxuKTogdC5UU1F1YWxpZmllZE5hbWUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNRdWFsaWZpZWROYW1lPih7XG4gICAgdHlwZTogXCJUU1F1YWxpZmllZE5hbWVcIixcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUXVhbGlmaWVkTmFtZSBhcyB0U1F1YWxpZmllZE5hbWUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgcGFyYW1ldGVyczogQXJyYXk8dC5JZGVudGlmaWVyIHwgdC5SZXN0RWxlbWVudD4sXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgcGFyYW1ldGVycyxcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiBhcyB0U0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiBhcyB0U0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNQcm9wZXJ0eVNpZ25hdHVyZShcbiAga2V5OiB0LkV4cHJlc3Npb24sXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbiAgaW5pdGlhbGl6ZXI6IHQuRXhwcmVzc2lvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1Byb3BlcnR5U2lnbmF0dXJlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTUHJvcGVydHlTaWduYXR1cmU+KHtcbiAgICB0eXBlOiBcIlRTUHJvcGVydHlTaWduYXR1cmVcIixcbiAgICBrZXksXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgaW5pdGlhbGl6ZXIsXG4gICAga2luZDogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1Byb3BlcnR5U2lnbmF0dXJlIGFzIHRTUHJvcGVydHlTaWduYXR1cmUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01ldGhvZFNpZ25hdHVyZShcbiAga2V5OiB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTTWV0aG9kU2lnbmF0dXJlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTTWV0aG9kU2lnbmF0dXJlPih7XG4gICAgdHlwZTogXCJUU01ldGhvZFNpZ25hdHVyZVwiLFxuICAgIGtleSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGtpbmQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNZXRob2RTaWduYXR1cmUgYXMgdFNNZXRob2RTaWduYXR1cmUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luZGV4U2lnbmF0dXJlKFxuICBwYXJhbWV0ZXJzOiBBcnJheTx0LklkZW50aWZpZXI+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTSW5kZXhTaWduYXR1cmUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNJbmRleFNpZ25hdHVyZT4oe1xuICAgIHR5cGU6IFwiVFNJbmRleFNpZ25hdHVyZVwiLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNJbmRleFNpZ25hdHVyZSBhcyB0U0luZGV4U2lnbmF0dXJlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNBbnlLZXl3b3JkKCk6IHQuVFNBbnlLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTQW55S2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNBbnlLZXl3b3JkIGFzIHRTQW55S2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQm9vbGVhbktleXdvcmQoKTogdC5UU0Jvb2xlYW5LZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTQm9vbGVhbktleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzQm9vbGVhbktleXdvcmQgYXMgdFNCb29sZWFuS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzQmlnSW50S2V5d29yZCgpOiB0LlRTQmlnSW50S2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU0JpZ0ludEtleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzQmlnSW50S2V5d29yZCBhcyB0U0JpZ0ludEtleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ludHJpbnNpY0tleXdvcmQoKTogdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNJbnRyaW5zaWNLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c0ludHJpbnNpY0tleXdvcmQgYXMgdFNJbnRyaW5zaWNLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNOZXZlcktleXdvcmQoKTogdC5UU05ldmVyS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU05ldmVyS2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNOZXZlcktleXdvcmQgYXMgdFNOZXZlcktleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c051bGxLZXl3b3JkKCk6IHQuVFNOdWxsS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU051bGxLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c051bGxLZXl3b3JkIGFzIHRTTnVsbEtleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c051bWJlcktleXdvcmQoKTogdC5UU051bWJlcktleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNOdW1iZXJLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c051bWJlcktleXdvcmQgYXMgdFNOdW1iZXJLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNPYmplY3RLZXl3b3JkKCk6IHQuVFNPYmplY3RLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNPYmplY3RLZXl3b3JkIGFzIHRTT2JqZWN0S2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzU3RyaW5nS2V5d29yZCgpOiB0LlRTU3RyaW5nS2V5d29yZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUU1N0cmluZ0tleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzU3RyaW5nS2V5d29yZCBhcyB0U1N0cmluZ0tleXdvcmQgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1N5bWJvbEtleXdvcmQoKTogdC5UU1N5bWJvbEtleXdvcmQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiVFNTeW1ib2xLZXl3b3JkXCIsXG4gIH07XG59XG5leHBvcnQgeyB0c1N5bWJvbEtleXdvcmQgYXMgdFNTeW1ib2xLZXl3b3JkIH07XG5leHBvcnQgZnVuY3Rpb24gdHNVbmRlZmluZWRLZXl3b3JkKCk6IHQuVFNVbmRlZmluZWRLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICB9O1xufVxuZXhwb3J0IHsgdHNVbmRlZmluZWRLZXl3b3JkIGFzIHRTVW5kZWZpbmVkS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVW5rbm93bktleXdvcmQoKTogdC5UU1Vua25vd25LZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVW5rbm93bktleXdvcmQgYXMgdFNVbmtub3duS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVm9pZEtleXdvcmQoKTogdC5UU1ZvaWRLZXl3b3JkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVm9pZEtleXdvcmRcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVm9pZEtleXdvcmQgYXMgdFNWb2lkS2V5d29yZCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVGhpc1R5cGUoKTogdC5UU1RoaXNUeXBlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlRTVGhpc1R5cGVcIixcbiAgfTtcbn1cbmV4cG9ydCB7IHRzVGhpc1R5cGUgYXMgdFNUaGlzVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRnVuY3Rpb25UeXBlKFxuICB0eXBlUGFyYW1ldGVyczogdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBwYXJhbWV0ZXJzOiBBcnJheTx0LklkZW50aWZpZXIgfCB0LlJlc3RFbGVtZW50PixcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlQW5ub3RhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0Z1bmN0aW9uVHlwZT4oe1xuICAgIHR5cGU6IFwiVFNGdW5jdGlvblR5cGVcIixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRnVuY3Rpb25UeXBlIGFzIHRTRnVuY3Rpb25UeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNDb25zdHJ1Y3RvclR5cGUoXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIHBhcmFtZXRlcnM6IEFycmF5PHQuSWRlbnRpZmllciB8IHQuUmVzdEVsZW1lbnQ+LFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGVBbm5vdGF0aW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTQ29uc3RydWN0b3JUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQ29uc3RydWN0b3JUeXBlPih7XG4gICAgdHlwZTogXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHBhcmFtZXRlcnMsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25zdHJ1Y3RvclR5cGUgYXMgdFNDb25zdHJ1Y3RvclR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVSZWZlcmVuY2UoXG4gIHR5cGVOYW1lOiB0LlRTRW50aXR5TmFtZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVSZWZlcmVuY2Uge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlUmVmZXJlbmNlPih7XG4gICAgdHlwZTogXCJUU1R5cGVSZWZlcmVuY2VcIixcbiAgICB0eXBlTmFtZSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVSZWZlcmVuY2UgYXMgdFNUeXBlUmVmZXJlbmNlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlUHJlZGljYXRlKFxuICBwYXJhbWV0ZXJOYW1lOiB0LklkZW50aWZpZXIgfCB0LlRTVGhpc1R5cGUsXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZUFubm90YXRpb24gfCBudWxsID0gbnVsbCxcbiAgYXNzZXJ0czogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVQcmVkaWNhdGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlUHJlZGljYXRlPih7XG4gICAgdHlwZTogXCJUU1R5cGVQcmVkaWNhdGVcIixcbiAgICBwYXJhbWV0ZXJOYW1lLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICAgIGFzc2VydHMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUHJlZGljYXRlIGFzIHRTVHlwZVByZWRpY2F0ZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZVF1ZXJ5KFxuICBleHByTmFtZTogdC5UU0VudGl0eU5hbWUgfCB0LlRTSW1wb3J0VHlwZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU1R5cGVRdWVyeSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVRdWVyeT4oe1xuICAgIHR5cGU6IFwiVFNUeXBlUXVlcnlcIixcbiAgICBleHByTmFtZSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVRdWVyeSBhcyB0U1R5cGVRdWVyeSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZUxpdGVyYWwoXG4gIG1lbWJlcnM6IEFycmF5PHQuVFNUeXBlRWxlbWVudD4sXG4pOiB0LlRTVHlwZUxpdGVyYWwge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlTGl0ZXJhbD4oe1xuICAgIHR5cGU6IFwiVFNUeXBlTGl0ZXJhbFwiLFxuICAgIG1lbWJlcnMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlTGl0ZXJhbCBhcyB0U1R5cGVMaXRlcmFsIH07XG5leHBvcnQgZnVuY3Rpb24gdHNBcnJheVR5cGUoZWxlbWVudFR5cGU6IHQuVFNUeXBlKTogdC5UU0FycmF5VHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0FycmF5VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNBcnJheVR5cGVcIixcbiAgICBlbGVtZW50VHlwZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0FycmF5VHlwZSBhcyB0U0FycmF5VHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHVwbGVUeXBlKFxuICBlbGVtZW50VHlwZXM6IEFycmF5PHQuVFNUeXBlIHwgdC5UU05hbWVkVHVwbGVNZW1iZXI+LFxuKTogdC5UU1R1cGxlVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R1cGxlVHlwZT4oe1xuICAgIHR5cGU6IFwiVFNUdXBsZVR5cGVcIixcbiAgICBlbGVtZW50VHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUdXBsZVR5cGUgYXMgdFNUdXBsZVR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c09wdGlvbmFsVHlwZSh0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTT3B0aW9uYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTT3B0aW9uYWxUeXBlPih7XG4gICAgdHlwZTogXCJUU09wdGlvbmFsVHlwZVwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzT3B0aW9uYWxUeXBlIGFzIHRTT3B0aW9uYWxUeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNSZXN0VHlwZSh0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTUmVzdFR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNSZXN0VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNSZXN0VHlwZVwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzUmVzdFR5cGUgYXMgdFNSZXN0VHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTmFtZWRUdXBsZU1lbWJlcihcbiAgbGFiZWw6IHQuSWRlbnRpZmllcixcbiAgZWxlbWVudFR5cGU6IHQuVFNUeXBlLFxuICBvcHRpb25hbDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5UU05hbWVkVHVwbGVNZW1iZXIge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNOYW1lZFR1cGxlTWVtYmVyPih7XG4gICAgdHlwZTogXCJUU05hbWVkVHVwbGVNZW1iZXJcIixcbiAgICBsYWJlbCxcbiAgICBlbGVtZW50VHlwZSxcbiAgICBvcHRpb25hbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c05hbWVkVHVwbGVNZW1iZXIgYXMgdFNOYW1lZFR1cGxlTWVtYmVyIH07XG5leHBvcnQgZnVuY3Rpb24gdHNVbmlvblR5cGUodHlwZXM6IEFycmF5PHQuVFNUeXBlPik6IHQuVFNVbmlvblR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNVbmlvblR5cGU+KHtcbiAgICB0eXBlOiBcIlRTVW5pb25UeXBlXCIsXG4gICAgdHlwZXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNVbmlvblR5cGUgYXMgdFNVbmlvblR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ludGVyc2VjdGlvblR5cGUoXG4gIHR5cGVzOiBBcnJheTx0LlRTVHlwZT4sXG4pOiB0LlRTSW50ZXJzZWN0aW9uVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0ludGVyc2VjdGlvblR5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW50ZXJzZWN0aW9uVHlwZVwiLFxuICAgIHR5cGVzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW50ZXJzZWN0aW9uVHlwZSBhcyB0U0ludGVyc2VjdGlvblR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0NvbmRpdGlvbmFsVHlwZShcbiAgY2hlY2tUeXBlOiB0LlRTVHlwZSxcbiAgZXh0ZW5kc1R5cGU6IHQuVFNUeXBlLFxuICB0cnVlVHlwZTogdC5UU1R5cGUsXG4gIGZhbHNlVHlwZTogdC5UU1R5cGUsXG4pOiB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQ29uZGl0aW9uYWxUeXBlPih7XG4gICAgdHlwZTogXCJUU0NvbmRpdGlvbmFsVHlwZVwiLFxuICAgIGNoZWNrVHlwZSxcbiAgICBleHRlbmRzVHlwZSxcbiAgICB0cnVlVHlwZSxcbiAgICBmYWxzZVR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNDb25kaXRpb25hbFR5cGUgYXMgdFNDb25kaXRpb25hbFR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luZmVyVHlwZSh0eXBlUGFyYW1ldGVyOiB0LlRTVHlwZVBhcmFtZXRlcik6IHQuVFNJbmZlclR5cGUge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNJbmZlclR5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW5mZXJUeXBlXCIsXG4gICAgdHlwZVBhcmFtZXRlcixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luZmVyVHlwZSBhcyB0U0luZmVyVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzUGFyZW50aGVzaXplZFR5cGUoXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZSxcbik6IHQuVFNQYXJlbnRoZXNpemVkVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1BhcmVudGhlc2l6ZWRUeXBlPih7XG4gICAgdHlwZTogXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIsXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNQYXJlbnRoZXNpemVkVHlwZSBhcyB0U1BhcmVudGhlc2l6ZWRUeXBlIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlT3BlcmF0b3IodHlwZUFubm90YXRpb246IHQuVFNUeXBlKTogdC5UU1R5cGVPcGVyYXRvciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVPcGVyYXRvcj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlT3BlcmF0b3JcIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgICBvcGVyYXRvcjogbnVsbCxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVPcGVyYXRvciBhcyB0U1R5cGVPcGVyYXRvciB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG9iamVjdFR5cGU6IHQuVFNUeXBlLFxuICBpbmRleFR5cGU6IHQuVFNUeXBlLFxuKTogdC5UU0luZGV4ZWRBY2Nlc3NUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW5kZXhlZEFjY2Vzc1R5cGU+KHtcbiAgICB0eXBlOiBcIlRTSW5kZXhlZEFjY2Vzc1R5cGVcIixcbiAgICBvYmplY3RUeXBlLFxuICAgIGluZGV4VHlwZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luZGV4ZWRBY2Nlc3NUeXBlIGFzIHRTSW5kZXhlZEFjY2Vzc1R5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01hcHBlZFR5cGUoXG4gIHR5cGVQYXJhbWV0ZXI6IHQuVFNUeXBlUGFyYW1ldGVyLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUgfCBudWxsID0gbnVsbCxcbiAgbmFtZVR5cGU6IHQuVFNUeXBlIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTTWFwcGVkVHlwZSB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU01hcHBlZFR5cGU+KHtcbiAgICB0eXBlOiBcIlRTTWFwcGVkVHlwZVwiLFxuICAgIHR5cGVQYXJhbWV0ZXIsXG4gICAgdHlwZUFubm90YXRpb24sXG4gICAgbmFtZVR5cGUsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNYXBwZWRUeXBlIGFzIHRTTWFwcGVkVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTGl0ZXJhbFR5cGUoXG4gIGxpdGVyYWw6XG4gICAgfCB0Lk51bWVyaWNMaXRlcmFsXG4gICAgfCB0LlN0cmluZ0xpdGVyYWxcbiAgICB8IHQuQm9vbGVhbkxpdGVyYWxcbiAgICB8IHQuQmlnSW50TGl0ZXJhbFxuICAgIHwgdC5UZW1wbGF0ZUxpdGVyYWxcbiAgICB8IHQuVW5hcnlFeHByZXNzaW9uLFxuKTogdC5UU0xpdGVyYWxUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTTGl0ZXJhbFR5cGU+KHtcbiAgICB0eXBlOiBcIlRTTGl0ZXJhbFR5cGVcIixcbiAgICBsaXRlcmFsLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzTGl0ZXJhbFR5cGUgYXMgdFNMaXRlcmFsVHlwZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzKFxuICBleHByZXNzaW9uOiB0LlRTRW50aXR5TmFtZSxcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiB8IG51bGwgPSBudWxsLFxuKTogdC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cyB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4oe1xuICAgIHR5cGU6IFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIixcbiAgICBleHByZXNzaW9uLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGFzIHRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIH07XG5leHBvcnQgZnVuY3Rpb24gdHNJbnRlcmZhY2VEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgX2V4dGVuZHM6IEFycmF5PHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+IHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIGJvZHk6IHQuVFNJbnRlcmZhY2VCb2R5LFxuKTogdC5UU0ludGVyZmFjZURlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW50ZXJmYWNlRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTSW50ZXJmYWNlRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICBleHRlbmRzOiBfZXh0ZW5kcyxcbiAgICBib2R5LFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW50ZXJmYWNlRGVjbGFyYXRpb24gYXMgdFNJbnRlcmZhY2VEZWNsYXJhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzSW50ZXJmYWNlQm9keShcbiAgYm9keTogQXJyYXk8dC5UU1R5cGVFbGVtZW50Pixcbik6IHQuVFNJbnRlcmZhY2VCb2R5IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW50ZXJmYWNlQm9keT4oe1xuICAgIHR5cGU6IFwiVFNJbnRlcmZhY2VCb2R5XCIsXG4gICAgYm9keSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0ludGVyZmFjZUJvZHkgYXMgdFNJbnRlcmZhY2VCb2R5IH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgdHlwZVBhcmFtZXRlcnM6IHQuVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlLFxuKTogdC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTVHlwZUFsaWFzRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTVHlwZUFsaWFzRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVBbGlhc0RlY2xhcmF0aW9uIGFzIHRTVHlwZUFsaWFzRGVjbGFyYXRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBleHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0luc3RhbnRpYXRpb25FeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbixcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgfSk7XG59XG5leHBvcnQgeyB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uIGFzIHRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0FzRXhwcmVzc2lvbihcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuICB0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUsXG4pOiB0LlRTQXNFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTQXNFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU0FzRXhwcmVzc2lvblwiLFxuICAgIGV4cHJlc3Npb24sXG4gICAgdHlwZUFubm90YXRpb24sXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNBc0V4cHJlc3Npb24gYXMgdFNBc0V4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1NhdGlzZmllc0V4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbiAgdHlwZUFubm90YXRpb246IHQuVFNUeXBlLFxuKTogdC5UU1NhdGlzZmllc0V4cHJlc3Npb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNTYXRpc2ZpZXNFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU1NhdGlzZmllc0V4cHJlc3Npb25cIixcbiAgICBleHByZXNzaW9uLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzU2F0aXNmaWVzRXhwcmVzc2lvbiBhcyB0U1NhdGlzZmllc0V4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVBc3NlcnRpb24oXG4gIHR5cGVBbm5vdGF0aW9uOiB0LlRTVHlwZSxcbiAgZXhwcmVzc2lvbjogdC5FeHByZXNzaW9uLFxuKTogdC5UU1R5cGVBc3NlcnRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlQXNzZXJ0aW9uPih7XG4gICAgdHlwZTogXCJUU1R5cGVBc3NlcnRpb25cIixcbiAgICB0eXBlQW5ub3RhdGlvbixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzVHlwZUFzc2VydGlvbiBhcyB0U1R5cGVBc3NlcnRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0VudW1EZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbiAgbWVtYmVyczogQXJyYXk8dC5UU0VudW1NZW1iZXI+LFxuKTogdC5UU0VudW1EZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0VudW1EZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNFbnVtRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICBtZW1iZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRW51bURlY2xhcmF0aW9uIGFzIHRTRW51bURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNFbnVtTWVtYmVyKFxuICBpZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICBpbml0aWFsaXplcjogdC5FeHByZXNzaW9uIHwgbnVsbCA9IG51bGwsXG4pOiB0LlRTRW51bU1lbWJlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU0VudW1NZW1iZXI+KHtcbiAgICB0eXBlOiBcIlRTRW51bU1lbWJlclwiLFxuICAgIGlkLFxuICAgIGluaXRpYWxpemVyLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRW51bU1lbWJlciBhcyB0U0VudW1NZW1iZXIgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c01vZHVsZURlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyIHwgdC5TdHJpbmdMaXRlcmFsLFxuICBib2R5OiB0LlRTTW9kdWxlQmxvY2sgfCB0LlRTTW9kdWxlRGVjbGFyYXRpb24sXG4pOiB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNNb2R1bGVEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiLFxuICAgIGlkLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNb2R1bGVEZWNsYXJhdGlvbiBhcyB0U01vZHVsZURlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNNb2R1bGVCbG9jayhib2R5OiBBcnJheTx0LlN0YXRlbWVudD4pOiB0LlRTTW9kdWxlQmxvY2sge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNNb2R1bGVCbG9jaz4oe1xuICAgIHR5cGU6IFwiVFNNb2R1bGVCbG9ja1wiLFxuICAgIGJvZHksXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNNb2R1bGVCbG9jayBhcyB0U01vZHVsZUJsb2NrIH07XG5leHBvcnQgZnVuY3Rpb24gdHNJbXBvcnRUeXBlKFxuICBhcmd1bWVudDogdC5TdHJpbmdMaXRlcmFsLFxuICBxdWFsaWZpZXI6IHQuVFNFbnRpdHlOYW1lIHwgbnVsbCA9IG51bGwsXG4gIHR5cGVQYXJhbWV0ZXJzOiB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24gfCBudWxsID0gbnVsbCxcbik6IHQuVFNJbXBvcnRUeXBlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW1wb3J0VHlwZT4oe1xuICAgIHR5cGU6IFwiVFNJbXBvcnRUeXBlXCIsXG4gICAgYXJndW1lbnQsXG4gICAgcXVhbGlmaWVyLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzSW1wb3J0VHlwZSBhcyB0U0ltcG9ydFR5cGUgfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICBpZDogdC5JZGVudGlmaWVyLFxuICBtb2R1bGVSZWZlcmVuY2U6IHQuVFNFbnRpdHlOYW1lIHwgdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlLFxuKTogdC5UU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cIixcbiAgICBpZCxcbiAgICBtb2R1bGVSZWZlcmVuY2UsXG4gICAgaXNFeHBvcnQ6IG51bGwsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiBhcyB0U0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZShcbiAgZXhwcmVzc2lvbjogdC5TdHJpbmdMaXRlcmFsLFxuKTogdC5UU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2U+KHtcbiAgICB0eXBlOiBcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIixcbiAgICBleHByZXNzaW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UgYXMgdFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzTm9uTnVsbEV4cHJlc3Npb24oXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbik6IHQuVFNOb25OdWxsRXhwcmVzc2lvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU05vbk51bGxFeHByZXNzaW9uPih7XG4gICAgdHlwZTogXCJUU05vbk51bGxFeHByZXNzaW9uXCIsXG4gICAgZXhwcmVzc2lvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c05vbk51bGxFeHByZXNzaW9uIGFzIHRTTm9uTnVsbEV4cHJlc3Npb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c0V4cG9ydEFzc2lnbm1lbnQoXG4gIGV4cHJlc3Npb246IHQuRXhwcmVzc2lvbixcbik6IHQuVFNFeHBvcnRBc3NpZ25tZW50IHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTRXhwb3J0QXNzaWdubWVudD4oe1xuICAgIHR5cGU6IFwiVFNFeHBvcnRBc3NpZ25tZW50XCIsXG4gICAgZXhwcmVzc2lvbixcbiAgfSk7XG59XG5leHBvcnQgeyB0c0V4cG9ydEFzc2lnbm1lbnQgYXMgdFNFeHBvcnRBc3NpZ25tZW50IH07XG5leHBvcnQgZnVuY3Rpb24gdHNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbihcbiAgaWQ6IHQuSWRlbnRpZmllcixcbik6IHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uPih7XG4gICAgdHlwZTogXCJUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uXCIsXG4gICAgaWQsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiBhcyB0U05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlQW5ub3RhdGlvbih0eXBlQW5ub3RhdGlvbjogdC5UU1R5cGUpOiB0LlRTVHlwZUFubm90YXRpb24ge1xuICByZXR1cm4gdmFsaWRhdGVOb2RlPHQuVFNUeXBlQW5ub3RhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlQW5ub3RhdGlvblwiLFxuICAgIHR5cGVBbm5vdGF0aW9uLFxuICB9KTtcbn1cbmV4cG9ydCB7IHRzVHlwZUFubm90YXRpb24gYXMgdFNUeXBlQW5ub3RhdGlvbiB9O1xuZXhwb3J0IGZ1bmN0aW9uIHRzVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oXG4gIHBhcmFtczogQXJyYXk8dC5UU1R5cGU+LFxuKTogdC5UU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIHtcbiAgcmV0dXJuIHZhbGlkYXRlTm9kZTx0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24+KHtcbiAgICB0eXBlOiBcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiBhcyB0U1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIH07XG5leHBvcnQgZnVuY3Rpb24gdHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gIHBhcmFtczogQXJyYXk8dC5UU1R5cGVQYXJhbWV0ZXI+LFxuKTogdC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4oe1xuICAgIHR5cGU6IFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIixcbiAgICBwYXJhbXMsXG4gIH0pO1xufVxuZXhwb3J0IHsgdHNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXMgdFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gfTtcbmV4cG9ydCBmdW5jdGlvbiB0c1R5cGVQYXJhbWV0ZXIoXG4gIGNvbnN0cmFpbnQ6IHQuVFNUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXG4gIF9kZWZhdWx0OiB0LlRTVHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxuICBuYW1lOiBzdHJpbmcsXG4pOiB0LlRTVHlwZVBhcmFtZXRlciB7XG4gIHJldHVybiB2YWxpZGF0ZU5vZGU8dC5UU1R5cGVQYXJhbWV0ZXI+KHtcbiAgICB0eXBlOiBcIlRTVHlwZVBhcmFtZXRlclwiLFxuICAgIGNvbnN0cmFpbnQsXG4gICAgZGVmYXVsdDogX2RlZmF1bHQsXG4gICAgbmFtZSxcbiAgfSk7XG59XG5leHBvcnQgeyB0c1R5cGVQYXJhbWV0ZXIgYXMgdFNUeXBlUGFyYW1ldGVyIH07XG4vKiogQGRlcHJlY2F0ZWQgKi9cbmZ1bmN0aW9uIE51bWJlckxpdGVyYWwodmFsdWU6IG51bWJlcikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJOdW1iZXJMaXRlcmFsXCIsIFwiTnVtZXJpY0xpdGVyYWxcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIG51bWVyaWNMaXRlcmFsKHZhbHVlKTtcbn1cbmV4cG9ydCB7IE51bWJlckxpdGVyYWwgYXMgbnVtYmVyTGl0ZXJhbCB9O1xuLyoqIEBkZXByZWNhdGVkICovXG5mdW5jdGlvbiBSZWdleExpdGVyYWwocGF0dGVybjogc3RyaW5nLCBmbGFnczogc3RyaW5nID0gXCJcIikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJSZWdleExpdGVyYWxcIiwgXCJSZWdFeHBMaXRlcmFsXCIsIFwiVGhlIG5vZGUgdHlwZSBcIik7XG4gIHJldHVybiByZWdFeHBMaXRlcmFsKHBhdHRlcm4sIGZsYWdzKTtcbn1cbmV4cG9ydCB7IFJlZ2V4TGl0ZXJhbCBhcyByZWdleExpdGVyYWwgfTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZnVuY3Rpb24gUmVzdFByb3BlcnR5KGFyZ3VtZW50OiB0LkxWYWwpIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiUmVzdFByb3BlcnR5XCIsIFwiUmVzdEVsZW1lbnRcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIHJlc3RFbGVtZW50KGFyZ3VtZW50KTtcbn1cbmV4cG9ydCB7IFJlc3RQcm9wZXJ0eSBhcyByZXN0UHJvcGVydHkgfTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZnVuY3Rpb24gU3ByZWFkUHJvcGVydHkoYXJndW1lbnQ6IHQuRXhwcmVzc2lvbikge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJTcHJlYWRQcm9wZXJ0eVwiLCBcIlNwcmVhZEVsZW1lbnRcIiwgXCJUaGUgbm9kZSB0eXBlIFwiKTtcbiAgcmV0dXJuIHNwcmVhZEVsZW1lbnQoYXJndW1lbnQpO1xufVxuZXhwb3J0IHsgU3ByZWFkUHJvcGVydHkgYXMgc3ByZWFkUHJvcGVydHkgfTtcbiIsICJpbXBvcnQgeyBzdHJpbmdMaXRlcmFsIH0gZnJvbSBcIi4uLy4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IHsgaW5oZXJpdHMgfSBmcm9tIFwiLi4vLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkKFxuICBjaGlsZDogdC5KU1hUZXh0LFxuICBhcmdzOiBBcnJheTx0Lk5vZGU+LFxuKSB7XG4gIGNvbnN0IGxpbmVzID0gY2hpbGQudmFsdWUuc3BsaXQoL1xcclxcbnxcXG58XFxyLyk7XG5cbiAgbGV0IGxhc3ROb25FbXB0eUxpbmUgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGluZXNbaV0ubWF0Y2goL1teIFxcdF0vKSkge1xuICAgICAgbGFzdE5vbkVtcHR5TGluZSA9IGk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHN0ciA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcblxuICAgIGNvbnN0IGlzRmlyc3RMaW5lID0gaSA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RMaW5lID0gaSA9PT0gbGluZXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBpc0xhc3ROb25FbXB0eUxpbmUgPSBpID09PSBsYXN0Tm9uRW1wdHlMaW5lO1xuXG4gICAgLy8gcmVwbGFjZSByZW5kZXJlZCB3aGl0ZXNwYWNlIHRhYnMgd2l0aCBzcGFjZXNcbiAgICBsZXQgdHJpbW1lZExpbmUgPSBsaW5lLnJlcGxhY2UoL1xcdC9nLCBcIiBcIik7XG5cbiAgICAvLyB0cmltIHdoaXRlc3BhY2UgdG91Y2hpbmcgYSBuZXdsaW5lXG4gICAgaWYgKCFpc0ZpcnN0TGluZSkge1xuICAgICAgdHJpbW1lZExpbmUgPSB0cmltbWVkTGluZS5yZXBsYWNlKC9eWyBdKy8sIFwiXCIpO1xuICAgIH1cblxuICAgIC8vIHRyaW0gd2hpdGVzcGFjZSB0b3VjaGluZyBhbiBlbmRsaW5lXG4gICAgaWYgKCFpc0xhc3RMaW5lKSB7XG4gICAgICB0cmltbWVkTGluZSA9IHRyaW1tZWRMaW5lLnJlcGxhY2UoL1sgXSskLywgXCJcIik7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lKSB7XG4gICAgICBpZiAoIWlzTGFzdE5vbkVtcHR5TGluZSkge1xuICAgICAgICB0cmltbWVkTGluZSArPSBcIiBcIjtcbiAgICAgIH1cblxuICAgICAgc3RyICs9IHRyaW1tZWRMaW5lO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdHIpIGFyZ3MucHVzaChpbmhlcml0cyhzdHJpbmdMaXRlcmFsKHN0ciksIGNoaWxkKSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNKU1hUZXh0LFxuICBpc0pTWEV4cHJlc3Npb25Db250YWluZXIsXG4gIGlzSlNYRW1wdHlFeHByZXNzaW9uLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCBjbGVhbkpTWEVsZW1lbnRMaXRlcmFsQ2hpbGQgZnJvbSBcIi4uLy4uL3V0aWxzL3JlYWN0L2NsZWFuSlNYRWxlbWVudExpdGVyYWxDaGlsZFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuXG50eXBlIFJldHVybmVkQ2hpbGQgPVxuICB8IHQuSlNYU3ByZWFkQ2hpbGRcbiAgfCB0LkpTWEVsZW1lbnRcbiAgfCB0LkpTWEZyYWdtZW50XG4gIHwgdC5FeHByZXNzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZENoaWxkcmVuKFxuICBub2RlOiB0LkpTWEVsZW1lbnQgfCB0LkpTWEZyYWdtZW50LFxuKTogUmV0dXJuZWRDaGlsZFtdIHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQ6IGFueSA9IG5vZGUuY2hpbGRyZW5baV07XG5cbiAgICBpZiAoaXNKU1hUZXh0KGNoaWxkKSkge1xuICAgICAgY2xlYW5KU1hFbGVtZW50TGl0ZXJhbENoaWxkKGNoaWxkLCBlbGVtZW50cyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNKU1hFeHByZXNzaW9uQ29udGFpbmVyKGNoaWxkKSkgY2hpbGQgPSBjaGlsZC5leHByZXNzaW9uO1xuICAgIGlmIChpc0pTWEVtcHR5RXhwcmVzc2lvbihjaGlsZCkpIGNvbnRpbnVlO1xuXG4gICAgZWxlbWVudHMucHVzaChjaGlsZCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudHM7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTm9kZShub2RlOiBhbnkpOiBub2RlIGlzIHQuTm9kZSB7XG4gIHJldHVybiAhIShub2RlICYmIFZJU0lUT1JfS0VZU1tub2RlLnR5cGVdKTtcbn1cbiIsICJpbXBvcnQgaXNOb2RlIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzTm9kZVwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc3NlcnROb2RlKG5vZGU/OiBhbnkpOiBhc3NlcnRzIG5vZGUgaXMgdC5Ob2RlIHtcbiAgaWYgKCFpc05vZGUobm9kZSkpIHtcbiAgICBjb25zdCB0eXBlID0gbm9kZT8udHlwZSA/PyBKU09OLnN0cmluZ2lmeShub2RlKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBOb3QgYSB2YWxpZCBub2RlIG9mIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQhIERvIG5vdCBtb2RpZnkgaXQgZGlyZWN0bHkuXG4gKiBUbyByZS1nZW5lcmF0ZSBydW4gJ21ha2UgYnVpbGQnXG4gKi9cbmltcG9ydCBpcyBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9pc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IGRlcHJlY2F0aW9uV2FybmluZyBmcm9tIFwiLi4vLi4vdXRpbHMvZGVwcmVjYXRpb25XYXJuaW5nXCI7XG5cbmZ1bmN0aW9uIGFzc2VydCh0eXBlOiBzdHJpbmcsIG5vZGU6IGFueSwgb3B0cz86IGFueSk6IHZvaWQge1xuICBpZiAoIWlzKHR5cGUsIG5vZGUsIG9wdHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIHR5cGUgXCIke3R5cGV9XCIgd2l0aCBvcHRpb24gJHtKU09OLnN0cmluZ2lmeShvcHRzKX0sIGAgK1xuICAgICAgICBgYnV0IGluc3RlYWQgZ290IFwiJHtub2RlLnR5cGV9XCIuYCxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBcnJheUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyYXlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXJyYXlFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFzc2lnbm1lbnRFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkFzc2lnbm1lbnRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXNzaWdubWVudEV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmluYXJ5RXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaW5hcnlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQmluYXJ5RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnRlcnByZXRlckRpcmVjdGl2ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbnRlcnByZXRlckRpcmVjdGl2ZSB7XG4gIGFzc2VydChcIkludGVycHJldGVyRGlyZWN0aXZlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERpcmVjdGl2ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EaXJlY3RpdmUge1xuICBhc3NlcnQoXCJEaXJlY3RpdmVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGlyZWN0aXZlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EaXJlY3RpdmVMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiRGlyZWN0aXZlTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCbG9ja1N0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CbG9ja1N0YXRlbWVudCB7XG4gIGFzc2VydChcIkJsb2NrU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJyZWFrU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJyZWFrU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiQnJlYWtTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2FsbEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2FsbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDYWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDYXRjaENsYXVzZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DYXRjaENsYXVzZSB7XG4gIGFzc2VydChcIkNhdGNoQ2xhdXNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENvbmRpdGlvbmFsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db25kaXRpb25hbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29udGludWVTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ29udGludWVTdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJDb250aW51ZVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWJ1Z2dlclN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWJ1Z2dlclN0YXRlbWVudCB7XG4gIGFzc2VydChcIkRlYnVnZ2VyU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERvV2hpbGVTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRG9XaGlsZVN0YXRlbWVudCB7XG4gIGFzc2VydChcIkRvV2hpbGVTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW1wdHlTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW1wdHlTdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJFbXB0eVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHByZXNzaW9uU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkV4cHJlc3Npb25TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZpbGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmlsZSB7XG4gIGFzc2VydChcIkZpbGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rm9ySW5TdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRm9ySW5TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJGb3JJblN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGb3JTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRm9yU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRnVuY3Rpb25EZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb25FeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJZGVudGlmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LklkZW50aWZpZXIge1xuICBhc3NlcnQoXCJJZGVudGlmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydElmU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LklmU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiSWZTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TGFiZWxlZFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5MYWJlbGVkU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiTGFiZWxlZFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdHJpbmdMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN0cmluZ0xpdGVyYWwge1xuICBhc3NlcnQoXCJTdHJpbmdMaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bWVyaWNMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk51bWVyaWNMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiTnVtZXJpY0xpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TnVsbExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbExpdGVyYWwge1xuICBhc3NlcnQoXCJOdWxsTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCb29sZWFuTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Cb29sZWFuTGl0ZXJhbCB7XG4gIGFzc2VydChcIkJvb2xlYW5MaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJlZ0V4cExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUmVnRXhwTGl0ZXJhbCB7XG4gIGFzc2VydChcIlJlZ0V4cExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TG9naWNhbEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTG9naWNhbEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJMb2dpY2FsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJNZW1iZXJFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ld0V4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTmV3RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIk5ld0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHJvZ3JhbShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcm9ncmFtIHtcbiAgYXNzZXJ0KFwiUHJvZ3JhbVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdEV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJPYmplY3RFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdE1ldGhvZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RNZXRob2Qge1xuICBhc3NlcnQoXCJPYmplY3RNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0UHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT2JqZWN0UHJvcGVydHkge1xuICBhc3NlcnQoXCJPYmplY3RQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSZXN0RWxlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZXN0RWxlbWVudCB7XG4gIGFzc2VydChcIlJlc3RFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJldHVyblN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZXR1cm5TdGF0ZW1lbnQge1xuICBhc3NlcnQoXCJSZXR1cm5TdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2VxdWVuY2VFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlNlcXVlbmNlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN3aXRjaENhc2UoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3dpdGNoQ2FzZSB7XG4gIGFzc2VydChcIlN3aXRjaENhc2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3dpdGNoU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN3aXRjaFN0YXRlbWVudCB7XG4gIGFzc2VydChcIlN3aXRjaFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUaGlzRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UaGlzRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRoaXNFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRocm93U3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRocm93U3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiVGhyb3dTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHJ5U3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRyeVN0YXRlbWVudCB7XG4gIGFzc2VydChcIlRyeVN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVbmFyeUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVW5hcnlFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVW5hcnlFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVwZGF0ZUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVXBkYXRlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlVwZGF0ZUV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFyaWFibGVEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5WYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVmFyaWFibGVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYXJpYWJsZURlY2xhcmF0b3IoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVmFyaWFibGVEZWNsYXJhdG9yIHtcbiAgYXNzZXJ0KFwiVmFyaWFibGVEZWNsYXJhdG9yXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdoaWxlU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LldoaWxlU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiV2hpbGVTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V2l0aFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5XaXRoU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiV2l0aFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBc3NpZ25tZW50UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Bc3NpZ25tZW50UGF0dGVybiB7XG4gIGFzc2VydChcIkFzc2lnbm1lbnRQYXR0ZXJuXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFycmF5UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5BcnJheVBhdHRlcm4ge1xuICBhc3NlcnQoXCJBcnJheVBhdHRlcm5cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXJyb3dGdW5jdGlvbkV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc0JvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NCb2R5IHtcbiAgYXNzZXJ0KFwiQ2xhc3NCb2R5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0V4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJDbGFzc0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiQ2xhc3NEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnRBbGxEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnRBbGxEZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhwb3J0TmFtZWREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHBvcnROYW1lZERlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnRTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0U3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiRXhwb3J0U3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZvck9mU3RhdGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZvck9mU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yT2ZTdGF0ZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1wb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW1wb3J0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJJbXBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbXBvcnREZWZhdWx0U3BlY2lmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltcG9ydERlZmF1bHRTcGVjaWZpZXIge1xuICBhc3NlcnQoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIge1xuICBhc3NlcnQoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1wb3J0U3BlY2lmaWVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltcG9ydFNwZWNpZmllciB7XG4gIGFzc2VydChcIkltcG9ydFNwZWNpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNZXRhUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTWV0YVByb3BlcnR5IHtcbiAgYXNzZXJ0KFwiTWV0YVByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzTWV0aG9kKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzTWV0aG9kIHtcbiAgYXNzZXJ0KFwiQ2xhc3NNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RQYXR0ZXJuIHtcbiAgYXNzZXJ0KFwiT2JqZWN0UGF0dGVyblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTcHJlYWRFbGVtZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlNwcmVhZEVsZW1lbnQge1xuICBhc3NlcnQoXCJTcHJlYWRFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN1cGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN1cGVyIHtcbiAgYXNzZXJ0KFwiU3VwZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUZW1wbGF0ZUVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVGVtcGxhdGVFbGVtZW50IHtcbiAgYXNzZXJ0KFwiVGVtcGxhdGVFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRlbXBsYXRlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UZW1wbGF0ZUxpdGVyYWwge1xuICBhc3NlcnQoXCJUZW1wbGF0ZUxpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0WWllbGRFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LllpZWxkRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIllpZWxkRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBd2FpdEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXdhaXRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiQXdhaXRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnQge1xuICBhc3NlcnQoXCJJbXBvcnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmlnSW50TGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaWdJbnRMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiQmlnSW50TGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PcHRpb25hbE1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T3B0aW9uYWxDYWxsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PcHRpb25hbENhbGxFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc1Byb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc1Byb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsYXNzQWNjZXNzb3JQcm9wZXJ0eShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzc0FjY2Vzc29yUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc0FjY2Vzc29yUHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NQcml2YXRlUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NQcml2YXRlUHJvcGVydHkge1xuICBhc3NlcnQoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzc1ByaXZhdGVNZXRob2QoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQ2xhc3NQcml2YXRlTWV0aG9kIHtcbiAgYXNzZXJ0KFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFByaXZhdGVOYW1lKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlByaXZhdGVOYW1lIHtcbiAgYXNzZXJ0KFwiUHJpdmF0ZU5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3RhdGljQmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhdGljQmxvY2sge1xuICBhc3NlcnQoXCJTdGF0aWNCbG9ja1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRBbnlUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5BbnlUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkFueVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFycmF5VHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQXJyYXlUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkFycmF5VHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Qm9vbGVhblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJvb2xlYW5MaXRlcmFsVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bGxMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xhc3NJbXBsZW1lbnRzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkNsYXNzSW1wbGVtZW50cyB7XG4gIGFzc2VydChcIkNsYXNzSW1wbGVtZW50c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlQ2xhc3MoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRGVjbGFyZUNsYXNzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUNsYXNzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVGdW5jdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJEZWNsYXJlRnVuY3Rpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZUludGVyZmFjZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlSW50ZXJmYWNlIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUludGVyZmFjZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlTW9kdWxlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGUge1xuICBhc3NlcnQoXCJEZWNsYXJlTW9kdWxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVNb2R1bGVFeHBvcnRzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVNb2R1bGVFeHBvcnRzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZVR5cGVBbGlhcyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlVHlwZUFsaWFzIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZVR5cGVBbGlhc1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlT3BhcXVlVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlT3BhcXVlVHlwZSB7XG4gIGFzc2VydChcIkRlY2xhcmVPcGFxdWVUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVWYXJpYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJlVmFyaWFibGUge1xuICBhc3NlcnQoXCJEZWNsYXJlVmFyaWFibGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2xhcmVkUHJlZGljYXRlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2xhcmVkUHJlZGljYXRlIHtcbiAgYXNzZXJ0KFwiRGVjbGFyZWRQcmVkaWNhdGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhpc3RzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhpc3RzVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGdW5jdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uVHlwZVBhcmFtKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uVHlwZVBhcmFtIHtcbiAgYXNzZXJ0KFwiRnVuY3Rpb25UeXBlUGFyYW1cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0R2VuZXJpY1R5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkdlbmVyaWNUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbmZlcnJlZFByZWRpY2F0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbmZlcnJlZFByZWRpY2F0ZSB7XG4gIGFzc2VydChcIkluZmVycmVkUHJlZGljYXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEludGVyZmFjZUV4dGVuZHMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW50ZXJmYWNlRXh0ZW5kcyB7XG4gIGFzc2VydChcIkludGVyZmFjZUV4dGVuZHNcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW50ZXJmYWNlRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnRlcmZhY2VUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbnRlcmZhY2VUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWl4ZWRUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NaXhlZFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbXB0eVR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVtcHR5VHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bGxhYmxlVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTnVsbGFibGVUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROdW1iZXJUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5OdW1iZXJUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0VHlwZUludGVybmFsU2xvdChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5PYmplY3RUeXBlSW50ZXJuYWxTbG90IHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlQ2FsbFByb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVDYWxsUHJvcGVydHkge1xuICBhc3NlcnQoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGVJbmRleGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVJbmRleGVyIHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZUluZGV4ZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0VHlwZVByb3BlcnR5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdFR5cGVQcm9wZXJ0eSB7XG4gIGFzc2VydChcIk9iamVjdFR5cGVQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRPYmplY3RUeXBlU3ByZWFkUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IHtcbiAgYXNzZXJ0KFwiT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wYXF1ZVR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT3BhcXVlVHlwZSB7XG4gIGFzc2VydChcIk9wYXF1ZVR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UXVhbGlmaWVkVHlwZUlkZW50aWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUXVhbGlmaWVkVHlwZUlkZW50aWZpZXIge1xuICBhc3NlcnQoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN0cmluZ1R5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlN0cmluZ1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiU3RyaW5nVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3ltYm9sVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3ltYm9sVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJTeW1ib2xUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUaGlzVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVGhpc1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVGhpc1R5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR1cGxlVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHVwbGVUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIlR1cGxlVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZW9mVHlwZUFubm90YXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZW9mVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJUeXBlb2ZUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlQWxpYXMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZUFsaWFzIHtcbiAgYXNzZXJ0KFwiVHlwZUFsaWFzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVHlwZUFubm90YXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZUNhc3RFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVDYXN0RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlR5cGVDYXN0RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlUGFyYW1ldGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVQYXJhbWV0ZXIge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBhc3NlcnQoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVbmlvblR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlVuaW9uVHlwZUFubm90YXRpb24ge1xuICBhc3NlcnQoXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhcmlhbmNlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlZhcmlhbmNlIHtcbiAgYXNzZXJ0KFwiVmFyaWFuY2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Vm9pZFR5cGVBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlZvaWRUeXBlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIlZvaWRUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRW51bURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1Cb29sZWFuQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtQm9vbGVhbkJvZHkge1xuICBhc3NlcnQoXCJFbnVtQm9vbGVhbkJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bU51bWJlckJvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bU51bWJlckJvZHkge1xuICBhc3NlcnQoXCJFbnVtTnVtYmVyQm9keVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtU3RyaW5nQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtU3RyaW5nQm9keSB7XG4gIGFzc2VydChcIkVudW1TdHJpbmdCb2R5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1TeW1ib2xCb2R5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1TeW1ib2xCb2R5IHtcbiAgYXNzZXJ0KFwiRW51bVN5bWJvbEJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bUJvb2xlYW5NZW1iZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bUJvb2xlYW5NZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtQm9vbGVhbk1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtTnVtYmVyTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1OdW1iZXJNZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtTnVtYmVyTWVtYmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVudW1TdHJpbmdNZW1iZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bVN0cmluZ01lbWJlciB7XG4gIGFzc2VydChcIkVudW1TdHJpbmdNZW1iZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bURlZmF1bHRlZE1lbWJlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FbnVtRGVmYXVsdGVkTWVtYmVyIHtcbiAgYXNzZXJ0KFwiRW51bURlZmF1bHRlZE1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbmRleGVkQWNjZXNzVHlwZSB7XG4gIGFzc2VydChcIkluZGV4ZWRBY2Nlc3NUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSB7XG4gIGFzc2VydChcIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYQXR0cmlidXRlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEF0dHJpYnV0ZSB7XG4gIGFzc2VydChcIkpTWEF0dHJpYnV0ZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hDbG9zaW5nRWxlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hDbG9zaW5nRWxlbWVudCB7XG4gIGFzc2VydChcIkpTWENsb3NpbmdFbGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWEVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYRWxlbWVudCB7XG4gIGFzc2VydChcIkpTWEVsZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYRW1wdHlFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEVtcHR5RXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkpTWEVtcHR5RXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hFeHByZXNzaW9uQ29udGFpbmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWEV4cHJlc3Npb25Db250YWluZXIge1xuICBhc3NlcnQoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWFNwcmVhZENoaWxkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWFNwcmVhZENoaWxkIHtcbiAgYXNzZXJ0KFwiSlNYU3ByZWFkQ2hpbGRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYSWRlbnRpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hJZGVudGlmaWVyIHtcbiAgYXNzZXJ0KFwiSlNYSWRlbnRpZmllclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hNZW1iZXJFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWE1lbWJlckV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWE5hbWVzcGFjZWROYW1lKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkpTWE5hbWVzcGFjZWROYW1lIHtcbiAgYXNzZXJ0KFwiSlNYTmFtZXNwYWNlZE5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYT3BlbmluZ0VsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYT3BlbmluZ0VsZW1lbnQge1xuICBhc3NlcnQoXCJKU1hPcGVuaW5nRWxlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hTcHJlYWRBdHRyaWJ1dGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYU3ByZWFkQXR0cmlidXRlIHtcbiAgYXNzZXJ0KFwiSlNYU3ByZWFkQXR0cmlidXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWFRleHQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYVGV4dCB7XG4gIGFzc2VydChcIkpTWFRleHRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SlNYRnJhZ21lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYRnJhZ21lbnQge1xuICBhc3NlcnQoXCJKU1hGcmFnbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRKU1hPcGVuaW5nRnJhZ21lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSlNYT3BlbmluZ0ZyYWdtZW50IHtcbiAgYXNzZXJ0KFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWENsb3NpbmdGcmFnbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1hDbG9zaW5nRnJhZ21lbnQge1xuICBhc3NlcnQoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9vcChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Ob29wIHtcbiAgYXNzZXJ0KFwiTm9vcFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQbGFjZWhvbGRlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QbGFjZWhvbGRlciB7XG4gIGFzc2VydChcIlBsYWNlaG9sZGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFY4SW50cmluc2ljSWRlbnRpZmllcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5WOEludHJpbnNpY0lkZW50aWZpZXIge1xuICBhc3NlcnQoXCJWOEludHJpbnNpY0lkZW50aWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXJndW1lbnRQbGFjZWhvbGRlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Bcmd1bWVudFBsYWNlaG9sZGVyIHtcbiAgYXNzZXJ0KFwiQXJndW1lbnRQbGFjZWhvbGRlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCaW5kRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5CaW5kRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkJpbmRFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydEF0dHJpYnV0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5JbXBvcnRBdHRyaWJ1dGUge1xuICBhc3NlcnQoXCJJbXBvcnRBdHRyaWJ1dGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVjb3JhdG9yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY29yYXRvciB7XG4gIGFzc2VydChcIkRlY29yYXRvclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREb0V4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRG9FeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiRG9FeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cG9ydERlZmF1bHRTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0RGVmYXVsdFNwZWNpZmllciB7XG4gIGFzc2VydChcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVjb3JkRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5SZWNvcmRFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiUmVjb3JkRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUdXBsZUV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVHVwbGVFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVHVwbGVFeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlY2ltYWxMaXRlcmFsKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkRlY2ltYWxMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiRGVjaW1hbExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TW9kdWxlRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Nb2R1bGVFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiTW9kdWxlRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Ub3BpY1JlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRvcGljUmVmZXJlbmNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBpcGVsaW5lVG9waWNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlBpcGVsaW5lVG9waWNFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiUGlwZWxpbmVUb3BpY0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGlwZWxpbmVCYXJlRnVuY3Rpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuUGlwZWxpbmVCYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJQaXBlbGluZUJhcmVGdW5jdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSB7XG4gIGFzc2VydChcIlBpcGVsaW5lUHJpbWFyeVRvcGljUmVmZXJlbmNlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUGFyYW1ldGVyUHJvcGVydHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNQYXJhbWV0ZXJQcm9wZXJ0eSB7XG4gIGFzc2VydChcIlRTUGFyYW1ldGVyUHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNEZWNsYXJlRnVuY3Rpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNEZWNsYXJlRnVuY3Rpb24ge1xuICBhc3NlcnQoXCJUU0RlY2xhcmVGdW5jdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0RlY2xhcmVNZXRob2QoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNEZWNsYXJlTWV0aG9kIHtcbiAgYXNzZXJ0KFwiVFNEZWNsYXJlTWV0aG9kXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUXVhbGlmaWVkTmFtZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1F1YWxpZmllZE5hbWUge1xuICBhc3NlcnQoXCJUU1F1YWxpZmllZE5hbWVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTUHJvcGVydHlTaWduYXR1cmUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNQcm9wZXJ0eVNpZ25hdHVyZSB7XG4gIGFzc2VydChcIlRTUHJvcGVydHlTaWduYXR1cmVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNNZXRob2RTaWduYXR1cmUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNZXRob2RTaWduYXR1cmUge1xuICBhc3NlcnQoXCJUU01ldGhvZFNpZ25hdHVyZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0luZGV4U2lnbmF0dXJlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW5kZXhTaWduYXR1cmUge1xuICBhc3NlcnQoXCJUU0luZGV4U2lnbmF0dXJlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQW55S2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0FueUtleXdvcmQge1xuICBhc3NlcnQoXCJUU0FueUtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNCb29sZWFuS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0Jvb2xlYW5LZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNCb29sZWFuS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0JpZ0ludEtleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNCaWdJbnRLZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNCaWdJbnRLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTSW50cmluc2ljS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0ludHJpbnNpY0tleXdvcmQge1xuICBhc3NlcnQoXCJUU0ludHJpbnNpY0tleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNOZXZlcktleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNOZXZlcktleXdvcmQge1xuICBhc3NlcnQoXCJUU05ldmVyS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU051bGxLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTTnVsbEtleXdvcmQge1xuICBhc3NlcnQoXCJUU051bGxLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTnVtYmVyS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU051bWJlcktleXdvcmQge1xuICBhc3NlcnQoXCJUU051bWJlcktleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNPYmplY3RLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTT2JqZWN0S2V5d29yZCB7XG4gIGFzc2VydChcIlRTT2JqZWN0S2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1N0cmluZ0tleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNTdHJpbmdLZXl3b3JkIHtcbiAgYXNzZXJ0KFwiVFNTdHJpbmdLZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTU3ltYm9sS2V5d29yZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1N5bWJvbEtleXdvcmQge1xuICBhc3NlcnQoXCJUU1N5bWJvbEtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNVbmRlZmluZWRLZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVW5kZWZpbmVkS2V5d29yZCB7XG4gIGFzc2VydChcIlRTVW5kZWZpbmVkS2V5d29yZFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1Vua25vd25LZXl3b3JkKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVW5rbm93bktleXdvcmQge1xuICBhc3NlcnQoXCJUU1Vua25vd25LZXl3b3JkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVm9pZEtleXdvcmQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNWb2lkS2V5d29yZCB7XG4gIGFzc2VydChcIlRTVm9pZEtleXdvcmRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUaGlzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1RoaXNUeXBlIHtcbiAgYXNzZXJ0KFwiVFNUaGlzVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0Z1bmN0aW9uVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0Z1bmN0aW9uVHlwZSB7XG4gIGFzc2VydChcIlRTRnVuY3Rpb25UeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQ29uc3RydWN0b3JUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uc3RydWN0b3JUeXBlIHtcbiAgYXNzZXJ0KFwiVFNDb25zdHJ1Y3RvclR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlUmVmZXJlbmNlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVJlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRTVHlwZVJlZmVyZW5jZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVQcmVkaWNhdGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlUHJlZGljYXRlIHtcbiAgYXNzZXJ0KFwiVFNUeXBlUHJlZGljYXRlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZVF1ZXJ5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVF1ZXJ5IHtcbiAgYXNzZXJ0KFwiVFNUeXBlUXVlcnlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlTGl0ZXJhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVMaXRlcmFsIHtcbiAgYXNzZXJ0KFwiVFNUeXBlTGl0ZXJhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0FycmF5VHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0FycmF5VHlwZSB7XG4gIGFzc2VydChcIlRTQXJyYXlUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHVwbGVUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHVwbGVUeXBlIHtcbiAgYXNzZXJ0KFwiVFNUdXBsZVR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNPcHRpb25hbFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNPcHRpb25hbFR5cGUge1xuICBhc3NlcnQoXCJUU09wdGlvbmFsVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1Jlc3RUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTUmVzdFR5cGUge1xuICBhc3NlcnQoXCJUU1Jlc3RUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTmFtZWRUdXBsZU1lbWJlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU05hbWVkVHVwbGVNZW1iZXIge1xuICBhc3NlcnQoXCJUU05hbWVkVHVwbGVNZW1iZXJcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNVbmlvblR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNVbmlvblR5cGUge1xuICBhc3NlcnQoXCJUU1VuaW9uVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ludGVyc2VjdGlvblR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNJbnRlcnNlY3Rpb25UeXBlIHtcbiAgYXNzZXJ0KFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQ29uZGl0aW9uYWxUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQ29uZGl0aW9uYWxUeXBlIHtcbiAgYXNzZXJ0KFwiVFNDb25kaXRpb25hbFR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbmZlclR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNJbmZlclR5cGUge1xuICBhc3NlcnQoXCJUU0luZmVyVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1BhcmVudGhlc2l6ZWRUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTUGFyZW50aGVzaXplZFR5cGUge1xuICBhc3NlcnQoXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZU9wZXJhdG9yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZU9wZXJhdG9yIHtcbiAgYXNzZXJ0KFwiVFNUeXBlT3BlcmF0b3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbmRleGVkQWNjZXNzVHlwZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0luZGV4ZWRBY2Nlc3NUeXBlIHtcbiAgYXNzZXJ0KFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU01hcHBlZFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNYXBwZWRUeXBlIHtcbiAgYXNzZXJ0KFwiVFNNYXBwZWRUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTGl0ZXJhbFR5cGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNMaXRlcmFsVHlwZSB7XG4gIGFzc2VydChcIlRTTGl0ZXJhbFR5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMge1xuICBhc3NlcnQoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ludGVyZmFjZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW50ZXJmYWNlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTSW50ZXJmYWNlQm9keShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU0ludGVyZmFjZUJvZHkge1xuICBhc3NlcnQoXCJUU0ludGVyZmFjZUJvZHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlQWxpYXNEZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24ge1xuICBhc3NlcnQoXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTQXNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQXNFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVFNBc0V4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNTYXRpc2ZpZXNFeHByZXNzaW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTU2F0aXNmaWVzRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIlRTU2F0aXNmaWVzRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVBc3NlcnRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlQXNzZXJ0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQXNzZXJ0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTRW51bURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTRW51bURlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNFbnVtRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNFbnVtTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTRW51bU1lbWJlciB7XG4gIGFzc2VydChcIlRTRW51bU1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU01vZHVsZURlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTTW9kdWxlRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTW9kdWxlQmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNNb2R1bGVCbG9jayB7XG4gIGFzc2VydChcIlRTTW9kdWxlQmxvY2tcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNJbXBvcnRUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW1wb3J0VHlwZSB7XG4gIGFzc2VydChcIlRTSW1wb3J0VHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSB7XG4gIGFzc2VydChcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNOb25OdWxsRXhwcmVzc2lvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU05vbk51bGxFeHByZXNzaW9uIHtcbiAgYXNzZXJ0KFwiVFNOb25OdWxsRXhwcmVzc2lvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0V4cG9ydEFzc2lnbm1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFeHBvcnRBc3NpZ25tZW50IHtcbiAgYXNzZXJ0KFwiVFNFeHBvcnRBc3NpZ25tZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlQW5ub3RhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5UU1R5cGVBbm5vdGF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24ge1xuICBhc3NlcnQoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlUGFyYW1ldGVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZVBhcmFtZXRlciB7XG4gIGFzc2VydChcIlRTVHlwZVBhcmFtZXRlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdGFuZGFyZGl6ZWQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhbmRhcmRpemVkIHtcbiAgYXNzZXJ0KFwiU3RhbmRhcmRpemVkXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4cHJlc3Npb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwcmVzc2lvbiB7XG4gIGFzc2VydChcIkV4cHJlc3Npb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmluYXJ5KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJpbmFyeSB7XG4gIGFzc2VydChcIkJpbmFyeVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTY29wYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5TY29wYWJsZSB7XG4gIGFzc2VydChcIlNjb3BhYmxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJsb2NrUGFyZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkJsb2NrUGFyZW50IHtcbiAgYXNzZXJ0KFwiQmxvY2tQYXJlbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmxvY2soXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuQmxvY2sge1xuICBhc3NlcnQoXCJCbG9ja1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdGF0ZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiU3RhdGVtZW50XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRlcm1pbmF0b3JsZXNzKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRlcm1pbmF0b3JsZXNzIHtcbiAgYXNzZXJ0KFwiVGVybWluYXRvcmxlc3NcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29tcGxldGlvblN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db21wbGV0aW9uU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiQ29tcGxldGlvblN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDb25kaXRpb25hbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Db25kaXRpb25hbCB7XG4gIGFzc2VydChcIkNvbmRpdGlvbmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydExvb3AoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTG9vcCB7XG4gIGFzc2VydChcIkxvb3BcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0V2hpbGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuV2hpbGUge1xuICBhc3NlcnQoXCJXaGlsZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeHByZXNzaW9uV3JhcHBlcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5FeHByZXNzaW9uV3JhcHBlciB7XG4gIGFzc2VydChcIkV4cHJlc3Npb25XcmFwcGVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZvcihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Gb3Ige1xuICBhc3NlcnQoXCJGb3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rm9yWFN0YXRlbWVudChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Gb3JYU3RhdGVtZW50IHtcbiAgYXNzZXJ0KFwiRm9yWFN0YXRlbWVudFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGdW5jdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5GdW5jdGlvbiB7XG4gIGFzc2VydChcIkZ1bmN0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uUGFyZW50KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZ1bmN0aW9uUGFyZW50IHtcbiAgYXNzZXJ0KFwiRnVuY3Rpb25QYXJlbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHVyZWlzaChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QdXJlaXNoIHtcbiAgYXNzZXJ0KFwiUHVyZWlzaFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWNsYXJhdGlvbihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5EZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkRlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhdHRlcm5MaWtlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlBhdHRlcm5MaWtlIHtcbiAgYXNzZXJ0KFwiUGF0dGVybkxpa2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TFZhbChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5MVmFsIHtcbiAgYXNzZXJ0KFwiTFZhbFwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0VudGl0eU5hbWUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNFbnRpdHlOYW1lIHtcbiAgYXNzZXJ0KFwiVFNFbnRpdHlOYW1lXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydExpdGVyYWwoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTGl0ZXJhbCB7XG4gIGFzc2VydChcIkxpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW1tdXRhYmxlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkltbXV0YWJsZSB7XG4gIGFzc2VydChcIkltbXV0YWJsZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVc2VyV2hpdGVzcGFjYWJsZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Vc2VyV2hpdGVzcGFjYWJsZSB7XG4gIGFzc2VydChcIlVzZXJXaGl0ZXNwYWNhYmxlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE1ldGhvZChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NZXRob2Qge1xuICBhc3NlcnQoXCJNZXRob2RcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T2JqZWN0TWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0Lk9iamVjdE1lbWJlciB7XG4gIGFzc2VydChcIk9iamVjdE1lbWJlclwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcm9wZXJ0eSB7XG4gIGFzc2VydChcIlByb3BlcnR5XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVuYXJ5TGlrZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5VbmFyeUxpa2Uge1xuICBhc3NlcnQoXCJVbmFyeUxpa2VcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGF0dGVybihcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5QYXR0ZXJuIHtcbiAgYXNzZXJ0KFwiUGF0dGVyblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRDbGFzcyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5DbGFzcyB7XG4gIGFzc2VydChcIkNsYXNzXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuSW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvbiB7XG4gIGFzc2VydChcIkltcG9ydE9yRXhwb3J0RGVjbGFyYXRpb25cIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhwb3J0RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRXhwb3J0RGVjbGFyYXRpb24ge1xuICBhc3NlcnQoXCJFeHBvcnREZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNb2R1bGVTcGVjaWZpZXIoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuTW9kdWxlU3BlY2lmaWVyIHtcbiAgYXNzZXJ0KFwiTW9kdWxlU3BlY2lmaWVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFjY2Vzc29yKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkFjY2Vzc29yIHtcbiAgYXNzZXJ0KFwiQWNjZXNzb3JcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHJpdmF0ZShcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5Qcml2YXRlIHtcbiAgYXNzZXJ0KFwiUHJpdmF0ZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG93KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3cge1xuICBhc3NlcnQoXCJGbG93XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZsb3dUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3dUeXBlIHtcbiAgYXNzZXJ0KFwiRmxvd1R5cGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Rmxvd0Jhc2VBbm5vdGF0aW9uKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkZsb3dCYXNlQW5ub3RhdGlvbiB7XG4gIGFzc2VydChcIkZsb3dCYXNlQW5ub3RhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG93RGVjbGFyYXRpb24oXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmxvd0RlY2xhcmF0aW9uIHtcbiAgYXNzZXJ0KFwiRmxvd0RlY2xhcmF0aW9uXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEZsb3dQcmVkaWNhdGUoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRmxvd1ByZWRpY2F0ZSB7XG4gIGFzc2VydChcIkZsb3dQcmVkaWNhdGVcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW51bUJvZHkoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuRW51bUJvZHkge1xuICBhc3NlcnQoXCJFbnVtQm9keVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFbnVtTWVtYmVyKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LkVudW1NZW1iZXIge1xuICBhc3NlcnQoXCJFbnVtTWVtYmVyXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEpTWChcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5KU1gge1xuICBhc3NlcnQoXCJKU1hcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWlzY2VsbGFuZW91cyhcbiAgbm9kZTogb2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IG9iamVjdCB8IG51bGwsXG4pOiBhc3NlcnRzIG5vZGUgaXMgdC5NaXNjZWxsYW5lb3VzIHtcbiAgYXNzZXJ0KFwiTWlzY2VsbGFuZW91c1wiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlU2NyaXB0KFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlR5cGVTY3JpcHQge1xuICBhc3NlcnQoXCJUeXBlU2NyaXB0XCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFRTVHlwZUVsZW1lbnQoXG4gIG5vZGU6IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBvYmplY3QgfCBudWxsLFxuKTogYXNzZXJ0cyBub2RlIGlzIHQuVFNUeXBlRWxlbWVudCB7XG4gIGFzc2VydChcIlRTVHlwZUVsZW1lbnRcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VFNUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTVHlwZSB7XG4gIGFzc2VydChcIlRTVHlwZVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUU0Jhc2VUeXBlKFxuICBub2RlOiBvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRzPzogb2JqZWN0IHwgbnVsbCxcbik6IGFzc2VydHMgbm9kZSBpcyB0LlRTQmFzZVR5cGUge1xuICBhc3NlcnQoXCJUU0Jhc2VUeXBlXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE51bWJlckxpdGVyYWwobm9kZTogYW55LCBvcHRzOiBhbnkpOiB2b2lkIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiYXNzZXJ0TnVtYmVyTGl0ZXJhbFwiLCBcImFzc2VydE51bWVyaWNMaXRlcmFsXCIpO1xuICBhc3NlcnQoXCJOdW1iZXJMaXRlcmFsXCIsIG5vZGUsIG9wdHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFJlZ2V4TGl0ZXJhbChub2RlOiBhbnksIG9wdHM6IGFueSk6IHZvaWQge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXCJhc3NlcnRSZWdleExpdGVyYWxcIiwgXCJhc3NlcnRSZWdFeHBMaXRlcmFsXCIpO1xuICBhc3NlcnQoXCJSZWdleExpdGVyYWxcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UmVzdFByb3BlcnR5KG5vZGU6IGFueSwgb3B0czogYW55KTogdm9pZCB7XG4gIGRlcHJlY2F0aW9uV2FybmluZyhcImFzc2VydFJlc3RQcm9wZXJ0eVwiLCBcImFzc2VydFJlc3RFbGVtZW50XCIpO1xuICBhc3NlcnQoXCJSZXN0UHJvcGVydHlcIiwgbm9kZSwgb3B0cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3ByZWFkUHJvcGVydHkobm9kZTogYW55LCBvcHRzOiBhbnkpOiB2b2lkIHtcbiAgZGVwcmVjYXRpb25XYXJuaW5nKFwiYXNzZXJ0U3ByZWFkUHJvcGVydHlcIiwgXCJhc3NlcnRTcHJlYWRFbGVtZW50XCIpO1xuICBhc3NlcnQoXCJTcHJlYWRQcm9wZXJ0eVwiLCBub2RlLCBvcHRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNb2R1bGVEZWNsYXJhdGlvbihub2RlOiBhbnksIG9wdHM6IGFueSk6IHZvaWQge1xuICBkZXByZWNhdGlvbldhcm5pbmcoXG4gICAgXCJhc3NlcnRNb2R1bGVEZWNsYXJhdGlvblwiLFxuICAgIFwiYXNzZXJ0SW1wb3J0T3JFeHBvcnREZWNsYXJhdGlvblwiLFxuICApO1xuICBhc3NlcnQoXCJNb2R1bGVEZWNsYXJhdGlvblwiLCBub2RlLCBvcHRzKTtcbn1cbiIsICJpbXBvcnQge1xuICBhbnlUeXBlQW5ub3RhdGlvbixcbiAgc3RyaW5nVHlwZUFubm90YXRpb24sXG4gIG51bWJlclR5cGVBbm5vdGF0aW9uLFxuICB2b2lkVHlwZUFubm90YXRpb24sXG4gIGJvb2xlYW5UeXBlQW5ub3RhdGlvbixcbiAgZ2VuZXJpY1R5cGVBbm5vdGF0aW9uLFxuICBpZGVudGlmaWVyLFxufSBmcm9tIFwiLi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVR5cGVBbm5vdGF0aW9uQmFzZWRPblR5cGVvZiBhcyB7XG4gICh0eXBlOiBcInN0cmluZ1wiKTogdC5TdHJpbmdUeXBlQW5ub3RhdGlvbjtcbiAgKHR5cGU6IFwibnVtYmVyXCIpOiB0Lk51bWJlclR5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJ1bmRlZmluZWRcIik6IHQuVm9pZFR5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJib29sZWFuXCIpOiB0LkJvb2xlYW5UeXBlQW5ub3RhdGlvbjtcbiAgKHR5cGU6IFwiZnVuY3Rpb25cIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJvYmplY3RcIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJzeW1ib2xcIik6IHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uO1xuICAodHlwZTogXCJiaWdpbnRcIik6IHQuQW55VHlwZUFubm90YXRpb247XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHR5cGUgYW5ub3RhdGlvbiBiYXNlZCBvbiB0eXBlb2YgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mKHR5cGU6IHN0cmluZyk6IHQuRmxvd1R5cGUge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gc3RyaW5nVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gbnVtYmVyVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gdm9pZFR5cGVBbm5vdGF0aW9uKCk7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBib29sZWFuVHlwZUFubm90YXRpb24oKTtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIHJldHVybiBnZW5lcmljVHlwZUFubm90YXRpb24oaWRlbnRpZmllcihcIkZ1bmN0aW9uXCIpKTtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICByZXR1cm4gZ2VuZXJpY1R5cGVBbm5vdGF0aW9uKGlkZW50aWZpZXIoXCJPYmplY3RcIikpO1xuICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgIHJldHVybiBnZW5lcmljVHlwZUFubm90YXRpb24oaWRlbnRpZmllcihcIlN5bWJvbFwiKSk7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgLy8gdG9kbzogdXNlIEJpZ0ludCBhbm5vdGF0aW9uIHdoZW4gRmxvdyBzdXBwb3J0cyBCaWdJbnRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy82NjM5XG4gICAgICByZXR1cm4gYW55VHlwZUFubm90YXRpb24oKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHR5cGVvZiB2YWx1ZTogXCIgKyB0eXBlKTtcbn1cbiIsICJpbXBvcnQge1xuICBpc0FueVR5cGVBbm5vdGF0aW9uLFxuICBpc0dlbmVyaWNUeXBlQW5ub3RhdGlvbixcbiAgaXNVbmlvblR5cGVBbm5vdGF0aW9uLFxuICBpc0Zsb3dCYXNlQW5ub3RhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcblxuZnVuY3Rpb24gZ2V0UXVhbGlmaWVkTmFtZShub2RlOiB0LkdlbmVyaWNUeXBlQW5ub3RhdGlvbltcImlkXCJdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllcihub2RlKVxuICAgID8gbm9kZS5uYW1lXG4gICAgOiBgJHtub2RlLmlkLm5hbWV9LiR7Z2V0UXVhbGlmaWVkTmFtZShub2RlLnF1YWxpZmljYXRpb24pfWA7XG59XG5cbi8qKlxuICogRGVkdXBlIHR5cGUgYW5ub3RhdGlvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICBub2Rlc0luOiBSZWFkb25seUFycmF5PHQuRmxvd1R5cGUgfCBmYWxzZSB8IG51bGwgfCB1bmRlZmluZWQ+LFxuKTogdC5GbG93VHlwZVtdIHtcbiAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGVzSW4pO1xuXG4gIGNvbnN0IGdlbmVyaWNzID0gbmV3IE1hcDxzdHJpbmcsIHQuR2VuZXJpY1R5cGVBbm5vdGF0aW9uPigpO1xuICBjb25zdCBiYXNlcyA9IG5ldyBNYXA8dC5GbG93QmFzZUFubm90YXRpb25bXCJ0eXBlXCJdLCB0LkZsb3dCYXNlQW5ub3RhdGlvbj4oKTtcblxuICAvLyBzdG9yZSB1bmlvbiB0eXBlIGdyb3VwcyB0byBjaXJjdWxhciByZWZlcmVuY2VzXG4gIGNvbnN0IHR5cGVHcm91cHMgPSBuZXcgU2V0PHQuRmxvd1R5cGVbXT4oKTtcblxuICBjb25zdCB0eXBlczogdC5GbG93VHlwZVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAoIW5vZGUpIGNvbnRpbnVlO1xuXG4gICAgLy8gZGV0ZWN0IGR1cGxpY2F0ZXNcbiAgICBpZiAodHlwZXMuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHR5cGUgbWF0Y2hlcyBhbnl0aGluZ1xuICAgIGlmIChpc0FueVR5cGVBbm5vdGF0aW9uKG5vZGUpKSB7XG4gICAgICByZXR1cm4gW25vZGVdO1xuICAgIH1cblxuICAgIGlmIChpc0Zsb3dCYXNlQW5ub3RhdGlvbihub2RlKSkge1xuICAgICAgYmFzZXMuc2V0KG5vZGUudHlwZSwgbm9kZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmlvblR5cGVBbm5vdGF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAoIXR5cGVHcm91cHMuaGFzKG5vZGUudHlwZXMpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goLi4ubm9kZS50eXBlcyk7XG4gICAgICAgIHR5cGVHcm91cHMuYWRkKG5vZGUudHlwZXMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gZmluZCBhIG1hdGNoaW5nIGdlbmVyaWMgdHlwZSBhbmQgbWVyZ2UgYW5kIGRlZHVwbGljYXRlIHRoZSB0eXBlIHBhcmFtZXRlcnNcbiAgICBpZiAoaXNHZW5lcmljVHlwZUFubm90YXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKG5vZGUuaWQpO1xuXG4gICAgICBpZiAoZ2VuZXJpY3MuaGFzKG5hbWUpKSB7XG4gICAgICAgIGxldCBleGlzdGluZzogdC5GbG93ID0gZ2VuZXJpY3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycykge1xuICAgICAgICAgICAgZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMucGFyYW1zLnB1c2goLi4ubm9kZS50eXBlUGFyYW1ldGVycy5wYXJhbXMpO1xuICAgICAgICAgICAgZXhpc3RpbmcudHlwZVBhcmFtZXRlcnMucGFyYW1zID0gcmVtb3ZlVHlwZUR1cGxpY2F0ZXMoXG4gICAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4aXN0aW5nID0gbm9kZS50eXBlUGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2VuZXJpY3Muc2V0KG5hbWUsIG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0eXBlcy5wdXNoKG5vZGUpO1xuICB9XG5cbiAgLy8gYWRkIGJhY2sgaW4gYmFzZXNcbiAgZm9yIChjb25zdCBbLCBiYXNlVHlwZV0gb2YgYmFzZXMpIHtcbiAgICB0eXBlcy5wdXNoKGJhc2VUeXBlKTtcbiAgfVxuXG4gIC8vIGFkZCBiYWNrIGluIGdlbmVyaWNzXG4gIGZvciAoY29uc3QgWywgZ2VuZXJpY05hbWVdIG9mIGdlbmVyaWNzKSB7XG4gICAgdHlwZXMucHVzaChnZW5lcmljTmFtZSk7XG4gIH1cblxuICByZXR1cm4gdHlwZXM7XG59XG4iLCAiaW1wb3J0IHsgdW5pb25UeXBlQW5ub3RhdGlvbiB9IGZyb20gXCIuLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCByZW1vdmVUeXBlRHVwbGljYXRlcyBmcm9tIFwiLi4vLi4vbW9kaWZpY2F0aW9ucy9mbG93L3JlbW92ZVR5cGVEdXBsaWNhdGVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uLy4uXCI7XG5cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgYHR5cGVzYCBhbmQgZmxhdHRlbnMgdGhlbSwgcmVtb3ZpbmcgZHVwbGljYXRlcyBhbmRcbiAqIHJldHVybnMgYSBgVW5pb25UeXBlQW5ub3RhdGlvbmAgbm9kZSBjb250YWluaW5nIHRoZW0uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZsb3dVbmlvblR5cGU8VCBleHRlbmRzIHQuRmxvd1R5cGU+KFxuICB0eXBlczogW1RdIHwgQXJyYXk8VD4sXG4pOiBUIHwgdC5VbmlvblR5cGVBbm5vdGF0aW9uIHtcbiAgY29uc3QgZmxhdHRlbmVkID0gcmVtb3ZlVHlwZUR1cGxpY2F0ZXModHlwZXMpO1xuXG4gIGlmIChmbGF0dGVuZWQubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZFswXSBhcyBUO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmlvblR5cGVBbm5vdGF0aW9uKGZsYXR0ZW5lZCk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBpc0lkZW50aWZpZXIsXG4gIGlzVFNBbnlLZXl3b3JkLFxuICBpc1RTVHlwZVJlZmVyZW5jZSxcbiAgaXNUU1VuaW9uVHlwZSxcbiAgaXNUU0Jhc2VUeXBlLFxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi4vLi5cIjtcblxuZnVuY3Rpb24gZ2V0UXVhbGlmaWVkTmFtZShub2RlOiB0LlRTVHlwZVJlZmVyZW5jZVtcInR5cGVOYW1lXCJdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllcihub2RlKVxuICAgID8gbm9kZS5uYW1lXG4gICAgOiBgJHtub2RlLnJpZ2h0Lm5hbWV9LiR7Z2V0UXVhbGlmaWVkTmFtZShub2RlLmxlZnQpfWA7XG59XG5cbi8qKlxuICogRGVkdXBlIHR5cGUgYW5ub3RhdGlvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICBub2Rlc0luOiBSZWFkb25seUFycmF5PHQuVFNUeXBlPixcbik6IEFycmF5PHQuVFNUeXBlPiB7XG4gIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShub2Rlc0luKTtcblxuICBjb25zdCBnZW5lcmljcyA9IG5ldyBNYXA8c3RyaW5nLCB0LlRTVHlwZVJlZmVyZW5jZT4oKTtcbiAgY29uc3QgYmFzZXMgPSBuZXcgTWFwPHQuVFNCYXNlVHlwZVtcInR5cGVcIl0sIHQuVFNCYXNlVHlwZT4oKTtcblxuICAvLyBzdG9yZSB1bmlvbiB0eXBlIGdyb3VwcyB0byBjaXJjdWxhciByZWZlcmVuY2VzXG4gIGNvbnN0IHR5cGVHcm91cHMgPSBuZXcgU2V0PHQuVFNUeXBlW10+KCk7XG5cbiAgY29uc3QgdHlwZXM6IHQuVFNUeXBlW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmICghbm9kZSkgY29udGludWU7XG5cbiAgICAvLyBkZXRlY3QgZHVwbGljYXRlc1xuICAgIGlmICh0eXBlcy5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdHlwZSBtYXRjaGVzIGFueXRoaW5nXG4gICAgaWYgKGlzVFNBbnlLZXl3b3JkKG5vZGUpKSB7XG4gICAgICByZXR1cm4gW25vZGVdO1xuICAgIH1cblxuICAgIC8vIEFuYWxvZ3VlIG9mIEZsb3dCYXNlQW5ub3RhdGlvblxuICAgIGlmIChpc1RTQmFzZVR5cGUobm9kZSkpIHtcbiAgICAgIGJhc2VzLnNldChub2RlLnR5cGUsIG5vZGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzVFNVbmlvblR5cGUobm9kZSkpIHtcbiAgICAgIGlmICghdHlwZUdyb3Vwcy5oYXMobm9kZS50eXBlcykpIHtcbiAgICAgICAgbm9kZXMucHVzaCguLi5ub2RlLnR5cGVzKTtcbiAgICAgICAgdHlwZUdyb3Vwcy5hZGQobm9kZS50eXBlcyk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0b2RvOiBzdXBwb3J0IG1lcmdpbmcgdHVwbGVzOiBudW1iZXJbXVxuICAgIGlmIChpc1RTVHlwZVJlZmVyZW5jZShub2RlKSAmJiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UXVhbGlmaWVkTmFtZShub2RlLnR5cGVOYW1lKTtcblxuICAgICAgaWYgKGdlbmVyaWNzLmhhcyhuYW1lKSkge1xuICAgICAgICBsZXQgZXhpc3Rpbmc6IHQuVHlwZVNjcmlwdCA9IGdlbmVyaWNzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcy5wdXNoKC4uLm5vZGUudHlwZVBhcmFtZXRlcnMucGFyYW1zKTtcbiAgICAgICAgICAgIGV4aXN0aW5nLnR5cGVQYXJhbWV0ZXJzLnBhcmFtcyA9IHJlbW92ZVR5cGVEdXBsaWNhdGVzKFxuICAgICAgICAgICAgICBleGlzdGluZy50eXBlUGFyYW1ldGVycy5wYXJhbXMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleGlzdGluZyA9IG5vZGUudHlwZVBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlbmVyaWNzLnNldChuYW1lLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHlwZXMucHVzaChub2RlKTtcbiAgfVxuXG4gIC8vIGFkZCBiYWNrIGluIGJhc2VzXG4gIGZvciAoY29uc3QgWywgYmFzZVR5cGVdIG9mIGJhc2VzKSB7XG4gICAgdHlwZXMucHVzaChiYXNlVHlwZSk7XG4gIH1cblxuICAvLyBhZGQgYmFjayBpbiBnZW5lcmljc1xuICBmb3IgKGNvbnN0IFssIGdlbmVyaWNOYW1lXSBvZiBnZW5lcmljcykge1xuICAgIHR5cGVzLnB1c2goZ2VuZXJpY05hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVzO1xufVxuIiwgImltcG9ydCB7IHRzVW5pb25UeXBlIH0gZnJvbSBcIi4uL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHJlbW92ZVR5cGVEdXBsaWNhdGVzIGZyb20gXCIuLi8uLi9tb2RpZmljYXRpb25zL3R5cGVzY3JpcHQvcmVtb3ZlVHlwZUR1cGxpY2F0ZXNcIjtcbmltcG9ydCB7IGlzVFNUeXBlQW5ub3RhdGlvbiB9IGZyb20gXCIuLi8uLi92YWxpZGF0b3JzL2dlbmVyYXRlZC9pbmRleFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLi8uLlwiO1xuXG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGB0eXBlc2AgYW5kIGZsYXR0ZW5zIHRoZW0sIHJlbW92aW5nIGR1cGxpY2F0ZXMgYW5kXG4gKiByZXR1cm5zIGEgYFVuaW9uVHlwZUFubm90YXRpb25gIG5vZGUgY29udGFpbmluZyB0aGVtLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUU1VuaW9uVHlwZShcbiAgdHlwZUFubm90YXRpb25zOiBBcnJheTx0LlRTVHlwZUFubm90YXRpb24gfCB0LlRTVHlwZT4sXG4pOiB0LlRTVHlwZSB7XG4gIGNvbnN0IHR5cGVzID0gdHlwZUFubm90YXRpb25zLm1hcCh0eXBlID0+IHtcbiAgICByZXR1cm4gaXNUU1R5cGVBbm5vdGF0aW9uKHR5cGUpID8gdHlwZS50eXBlQW5ub3RhdGlvbiA6IHR5cGU7XG4gIH0pO1xuICBjb25zdCBmbGF0dGVuZWQgPSByZW1vdmVUeXBlRHVwbGljYXRlcyh0eXBlcyk7XG5cbiAgaWYgKGZsYXR0ZW5lZC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmxhdHRlbmVkWzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0c1VuaW9uVHlwZShmbGF0dGVuZWQpO1xuICB9XG59XG4iLCAiLypcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCEgRG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseS5cbiAqIFRvIHJlLWdlbmVyYXRlIHJ1biAnbWFrZSBidWlsZCdcbiAqL1xuXG4vKipcbiAqIFRoaXMgZmlsZSBpcyB3cml0dGVuIGluIEphdmFTY3JpcHQgYW5kIG5vdCBUeXBlU2NyaXB0IGJlY2F1c2UgdXBwZXJjYXNlIGJ1aWxkZXJzXG4gKiBjb25mbGljdCB3aXRoIEFTVCB0eXBlcy4gVHlwZVNjcmlwdCByZWFkcyB0aGUgdXBwZXJjYXNlLmQudHMgZmlsZSBpbnN0ZWFkLlxuICovXG5cbmV4cG9ydCB7XG4gIGFycmF5RXhwcmVzc2lvbiBhcyBBcnJheUV4cHJlc3Npb24sXG4gIGFzc2lnbm1lbnRFeHByZXNzaW9uIGFzIEFzc2lnbm1lbnRFeHByZXNzaW9uLFxuICBiaW5hcnlFeHByZXNzaW9uIGFzIEJpbmFyeUV4cHJlc3Npb24sXG4gIGludGVycHJldGVyRGlyZWN0aXZlIGFzIEludGVycHJldGVyRGlyZWN0aXZlLFxuICBkaXJlY3RpdmUgYXMgRGlyZWN0aXZlLFxuICBkaXJlY3RpdmVMaXRlcmFsIGFzIERpcmVjdGl2ZUxpdGVyYWwsXG4gIGJsb2NrU3RhdGVtZW50IGFzIEJsb2NrU3RhdGVtZW50LFxuICBicmVha1N0YXRlbWVudCBhcyBCcmVha1N0YXRlbWVudCxcbiAgY2FsbEV4cHJlc3Npb24gYXMgQ2FsbEV4cHJlc3Npb24sXG4gIGNhdGNoQ2xhdXNlIGFzIENhdGNoQ2xhdXNlLFxuICBjb25kaXRpb25hbEV4cHJlc3Npb24gYXMgQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuICBjb250aW51ZVN0YXRlbWVudCBhcyBDb250aW51ZVN0YXRlbWVudCxcbiAgZGVidWdnZXJTdGF0ZW1lbnQgYXMgRGVidWdnZXJTdGF0ZW1lbnQsXG4gIGRvV2hpbGVTdGF0ZW1lbnQgYXMgRG9XaGlsZVN0YXRlbWVudCxcbiAgZW1wdHlTdGF0ZW1lbnQgYXMgRW1wdHlTdGF0ZW1lbnQsXG4gIGV4cHJlc3Npb25TdGF0ZW1lbnQgYXMgRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgZmlsZSBhcyBGaWxlLFxuICBmb3JJblN0YXRlbWVudCBhcyBGb3JJblN0YXRlbWVudCxcbiAgZm9yU3RhdGVtZW50IGFzIEZvclN0YXRlbWVudCxcbiAgZnVuY3Rpb25EZWNsYXJhdGlvbiBhcyBGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBmdW5jdGlvbkV4cHJlc3Npb24gYXMgRnVuY3Rpb25FeHByZXNzaW9uLFxuICBpZGVudGlmaWVyIGFzIElkZW50aWZpZXIsXG4gIGlmU3RhdGVtZW50IGFzIElmU3RhdGVtZW50LFxuICBsYWJlbGVkU3RhdGVtZW50IGFzIExhYmVsZWRTdGF0ZW1lbnQsXG4gIHN0cmluZ0xpdGVyYWwgYXMgU3RyaW5nTGl0ZXJhbCxcbiAgbnVtZXJpY0xpdGVyYWwgYXMgTnVtZXJpY0xpdGVyYWwsXG4gIG51bGxMaXRlcmFsIGFzIE51bGxMaXRlcmFsLFxuICBib29sZWFuTGl0ZXJhbCBhcyBCb29sZWFuTGl0ZXJhbCxcbiAgcmVnRXhwTGl0ZXJhbCBhcyBSZWdFeHBMaXRlcmFsLFxuICBsb2dpY2FsRXhwcmVzc2lvbiBhcyBMb2dpY2FsRXhwcmVzc2lvbixcbiAgbWVtYmVyRXhwcmVzc2lvbiBhcyBNZW1iZXJFeHByZXNzaW9uLFxuICBuZXdFeHByZXNzaW9uIGFzIE5ld0V4cHJlc3Npb24sXG4gIHByb2dyYW0gYXMgUHJvZ3JhbSxcbiAgb2JqZWN0RXhwcmVzc2lvbiBhcyBPYmplY3RFeHByZXNzaW9uLFxuICBvYmplY3RNZXRob2QgYXMgT2JqZWN0TWV0aG9kLFxuICBvYmplY3RQcm9wZXJ0eSBhcyBPYmplY3RQcm9wZXJ0eSxcbiAgcmVzdEVsZW1lbnQgYXMgUmVzdEVsZW1lbnQsXG4gIHJldHVyblN0YXRlbWVudCBhcyBSZXR1cm5TdGF0ZW1lbnQsXG4gIHNlcXVlbmNlRXhwcmVzc2lvbiBhcyBTZXF1ZW5jZUV4cHJlc3Npb24sXG4gIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGFzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLFxuICBzd2l0Y2hDYXNlIGFzIFN3aXRjaENhc2UsXG4gIHN3aXRjaFN0YXRlbWVudCBhcyBTd2l0Y2hTdGF0ZW1lbnQsXG4gIHRoaXNFeHByZXNzaW9uIGFzIFRoaXNFeHByZXNzaW9uLFxuICB0aHJvd1N0YXRlbWVudCBhcyBUaHJvd1N0YXRlbWVudCxcbiAgdHJ5U3RhdGVtZW50IGFzIFRyeVN0YXRlbWVudCxcbiAgdW5hcnlFeHByZXNzaW9uIGFzIFVuYXJ5RXhwcmVzc2lvbixcbiAgdXBkYXRlRXhwcmVzc2lvbiBhcyBVcGRhdGVFeHByZXNzaW9uLFxuICB2YXJpYWJsZURlY2xhcmF0aW9uIGFzIFZhcmlhYmxlRGVjbGFyYXRpb24sXG4gIHZhcmlhYmxlRGVjbGFyYXRvciBhcyBWYXJpYWJsZURlY2xhcmF0b3IsXG4gIHdoaWxlU3RhdGVtZW50IGFzIFdoaWxlU3RhdGVtZW50LFxuICB3aXRoU3RhdGVtZW50IGFzIFdpdGhTdGF0ZW1lbnQsXG4gIGFzc2lnbm1lbnRQYXR0ZXJuIGFzIEFzc2lnbm1lbnRQYXR0ZXJuLFxuICBhcnJheVBhdHRlcm4gYXMgQXJyYXlQYXR0ZXJuLFxuICBhcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiBhcyBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbixcbiAgY2xhc3NCb2R5IGFzIENsYXNzQm9keSxcbiAgY2xhc3NFeHByZXNzaW9uIGFzIENsYXNzRXhwcmVzc2lvbixcbiAgY2xhc3NEZWNsYXJhdGlvbiBhcyBDbGFzc0RlY2xhcmF0aW9uLFxuICBleHBvcnRBbGxEZWNsYXJhdGlvbiBhcyBFeHBvcnRBbGxEZWNsYXJhdGlvbixcbiAgZXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uIGFzIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbixcbiAgZXhwb3J0TmFtZWREZWNsYXJhdGlvbiBhcyBFeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICBleHBvcnRTcGVjaWZpZXIgYXMgRXhwb3J0U3BlY2lmaWVyLFxuICBmb3JPZlN0YXRlbWVudCBhcyBGb3JPZlN0YXRlbWVudCxcbiAgaW1wb3J0RGVjbGFyYXRpb24gYXMgSW1wb3J0RGVjbGFyYXRpb24sXG4gIGltcG9ydERlZmF1bHRTcGVjaWZpZXIgYXMgSW1wb3J0RGVmYXVsdFNwZWNpZmllcixcbiAgaW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIGFzIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcixcbiAgaW1wb3J0U3BlY2lmaWVyIGFzIEltcG9ydFNwZWNpZmllcixcbiAgbWV0YVByb3BlcnR5IGFzIE1ldGFQcm9wZXJ0eSxcbiAgY2xhc3NNZXRob2QgYXMgQ2xhc3NNZXRob2QsXG4gIG9iamVjdFBhdHRlcm4gYXMgT2JqZWN0UGF0dGVybixcbiAgc3ByZWFkRWxlbWVudCBhcyBTcHJlYWRFbGVtZW50LFxuICBzdXBlciBhcyBTdXBlcixcbiAgdGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIGFzIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbixcbiAgdGVtcGxhdGVFbGVtZW50IGFzIFRlbXBsYXRlRWxlbWVudCxcbiAgdGVtcGxhdGVMaXRlcmFsIGFzIFRlbXBsYXRlTGl0ZXJhbCxcbiAgeWllbGRFeHByZXNzaW9uIGFzIFlpZWxkRXhwcmVzc2lvbixcbiAgYXdhaXRFeHByZXNzaW9uIGFzIEF3YWl0RXhwcmVzc2lvbixcbiAgaW1wb3J0IGFzIEltcG9ydCxcbiAgYmlnSW50TGl0ZXJhbCBhcyBCaWdJbnRMaXRlcmFsLFxuICBleHBvcnROYW1lc3BhY2VTcGVjaWZpZXIgYXMgRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyLFxuICBvcHRpb25hbE1lbWJlckV4cHJlc3Npb24gYXMgT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLFxuICBvcHRpb25hbENhbGxFeHByZXNzaW9uIGFzIE9wdGlvbmFsQ2FsbEV4cHJlc3Npb24sXG4gIGNsYXNzUHJvcGVydHkgYXMgQ2xhc3NQcm9wZXJ0eSxcbiAgY2xhc3NBY2Nlc3NvclByb3BlcnR5IGFzIENsYXNzQWNjZXNzb3JQcm9wZXJ0eSxcbiAgY2xhc3NQcml2YXRlUHJvcGVydHkgYXMgQ2xhc3NQcml2YXRlUHJvcGVydHksXG4gIGNsYXNzUHJpdmF0ZU1ldGhvZCBhcyBDbGFzc1ByaXZhdGVNZXRob2QsXG4gIHByaXZhdGVOYW1lIGFzIFByaXZhdGVOYW1lLFxuICBzdGF0aWNCbG9jayBhcyBTdGF0aWNCbG9jayxcbiAgYW55VHlwZUFubm90YXRpb24gYXMgQW55VHlwZUFubm90YXRpb24sXG4gIGFycmF5VHlwZUFubm90YXRpb24gYXMgQXJyYXlUeXBlQW5ub3RhdGlvbixcbiAgYm9vbGVhblR5cGVBbm5vdGF0aW9uIGFzIEJvb2xlYW5UeXBlQW5ub3RhdGlvbixcbiAgYm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbiBhcyBCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uLFxuICBudWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIGFzIE51bGxMaXRlcmFsVHlwZUFubm90YXRpb24sXG4gIGNsYXNzSW1wbGVtZW50cyBhcyBDbGFzc0ltcGxlbWVudHMsXG4gIGRlY2xhcmVDbGFzcyBhcyBEZWNsYXJlQ2xhc3MsXG4gIGRlY2xhcmVGdW5jdGlvbiBhcyBEZWNsYXJlRnVuY3Rpb24sXG4gIGRlY2xhcmVJbnRlcmZhY2UgYXMgRGVjbGFyZUludGVyZmFjZSxcbiAgZGVjbGFyZU1vZHVsZSBhcyBEZWNsYXJlTW9kdWxlLFxuICBkZWNsYXJlTW9kdWxlRXhwb3J0cyBhcyBEZWNsYXJlTW9kdWxlRXhwb3J0cyxcbiAgZGVjbGFyZVR5cGVBbGlhcyBhcyBEZWNsYXJlVHlwZUFsaWFzLFxuICBkZWNsYXJlT3BhcXVlVHlwZSBhcyBEZWNsYXJlT3BhcXVlVHlwZSxcbiAgZGVjbGFyZVZhcmlhYmxlIGFzIERlY2xhcmVWYXJpYWJsZSxcbiAgZGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIGFzIERlY2xhcmVFeHBvcnREZWNsYXJhdGlvbixcbiAgZGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uIGFzIERlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbixcbiAgZGVjbGFyZWRQcmVkaWNhdGUgYXMgRGVjbGFyZWRQcmVkaWNhdGUsXG4gIGV4aXN0c1R5cGVBbm5vdGF0aW9uIGFzIEV4aXN0c1R5cGVBbm5vdGF0aW9uLFxuICBmdW5jdGlvblR5cGVBbm5vdGF0aW9uIGFzIEZ1bmN0aW9uVHlwZUFubm90YXRpb24sXG4gIGZ1bmN0aW9uVHlwZVBhcmFtIGFzIEZ1bmN0aW9uVHlwZVBhcmFtLFxuICBnZW5lcmljVHlwZUFubm90YXRpb24gYXMgR2VuZXJpY1R5cGVBbm5vdGF0aW9uLFxuICBpbmZlcnJlZFByZWRpY2F0ZSBhcyBJbmZlcnJlZFByZWRpY2F0ZSxcbiAgaW50ZXJmYWNlRXh0ZW5kcyBhcyBJbnRlcmZhY2VFeHRlbmRzLFxuICBpbnRlcmZhY2VEZWNsYXJhdGlvbiBhcyBJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaW50ZXJmYWNlVHlwZUFubm90YXRpb24gYXMgSW50ZXJmYWNlVHlwZUFubm90YXRpb24sXG4gIGludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uIGFzIEludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uLFxuICBtaXhlZFR5cGVBbm5vdGF0aW9uIGFzIE1peGVkVHlwZUFubm90YXRpb24sXG4gIGVtcHR5VHlwZUFubm90YXRpb24gYXMgRW1wdHlUeXBlQW5ub3RhdGlvbixcbiAgbnVsbGFibGVUeXBlQW5ub3RhdGlvbiBhcyBOdWxsYWJsZVR5cGVBbm5vdGF0aW9uLFxuICBudW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb24gYXMgTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uLFxuICBudW1iZXJUeXBlQW5ub3RhdGlvbiBhcyBOdW1iZXJUeXBlQW5ub3RhdGlvbixcbiAgb2JqZWN0VHlwZUFubm90YXRpb24gYXMgT2JqZWN0VHlwZUFubm90YXRpb24sXG4gIG9iamVjdFR5cGVJbnRlcm5hbFNsb3QgYXMgT2JqZWN0VHlwZUludGVybmFsU2xvdCxcbiAgb2JqZWN0VHlwZUNhbGxQcm9wZXJ0eSBhcyBPYmplY3RUeXBlQ2FsbFByb3BlcnR5LFxuICBvYmplY3RUeXBlSW5kZXhlciBhcyBPYmplY3RUeXBlSW5kZXhlcixcbiAgb2JqZWN0VHlwZVByb3BlcnR5IGFzIE9iamVjdFR5cGVQcm9wZXJ0eSxcbiAgb2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5IGFzIE9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eSxcbiAgb3BhcXVlVHlwZSBhcyBPcGFxdWVUeXBlLFxuICBxdWFsaWZpZWRUeXBlSWRlbnRpZmllciBhcyBRdWFsaWZpZWRUeXBlSWRlbnRpZmllcixcbiAgc3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIGFzIFN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbixcbiAgc3RyaW5nVHlwZUFubm90YXRpb24gYXMgU3RyaW5nVHlwZUFubm90YXRpb24sXG4gIHN5bWJvbFR5cGVBbm5vdGF0aW9uIGFzIFN5bWJvbFR5cGVBbm5vdGF0aW9uLFxuICB0aGlzVHlwZUFubm90YXRpb24gYXMgVGhpc1R5cGVBbm5vdGF0aW9uLFxuICB0dXBsZVR5cGVBbm5vdGF0aW9uIGFzIFR1cGxlVHlwZUFubm90YXRpb24sXG4gIHR5cGVvZlR5cGVBbm5vdGF0aW9uIGFzIFR5cGVvZlR5cGVBbm5vdGF0aW9uLFxuICB0eXBlQWxpYXMgYXMgVHlwZUFsaWFzLFxuICB0eXBlQW5ub3RhdGlvbiBhcyBUeXBlQW5ub3RhdGlvbixcbiAgdHlwZUNhc3RFeHByZXNzaW9uIGFzIFR5cGVDYXN0RXhwcmVzc2lvbixcbiAgdHlwZVBhcmFtZXRlciBhcyBUeXBlUGFyYW1ldGVyLFxuICB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXMgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLFxuICB0eXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbiBhcyBUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvbixcbiAgdW5pb25UeXBlQW5ub3RhdGlvbiBhcyBVbmlvblR5cGVBbm5vdGF0aW9uLFxuICB2YXJpYW5jZSBhcyBWYXJpYW5jZSxcbiAgdm9pZFR5cGVBbm5vdGF0aW9uIGFzIFZvaWRUeXBlQW5ub3RhdGlvbixcbiAgZW51bURlY2xhcmF0aW9uIGFzIEVudW1EZWNsYXJhdGlvbixcbiAgZW51bUJvb2xlYW5Cb2R5IGFzIEVudW1Cb29sZWFuQm9keSxcbiAgZW51bU51bWJlckJvZHkgYXMgRW51bU51bWJlckJvZHksXG4gIGVudW1TdHJpbmdCb2R5IGFzIEVudW1TdHJpbmdCb2R5LFxuICBlbnVtU3ltYm9sQm9keSBhcyBFbnVtU3ltYm9sQm9keSxcbiAgZW51bUJvb2xlYW5NZW1iZXIgYXMgRW51bUJvb2xlYW5NZW1iZXIsXG4gIGVudW1OdW1iZXJNZW1iZXIgYXMgRW51bU51bWJlck1lbWJlcixcbiAgZW51bVN0cmluZ01lbWJlciBhcyBFbnVtU3RyaW5nTWVtYmVyLFxuICBlbnVtRGVmYXVsdGVkTWVtYmVyIGFzIEVudW1EZWZhdWx0ZWRNZW1iZXIsXG4gIGluZGV4ZWRBY2Nlc3NUeXBlIGFzIEluZGV4ZWRBY2Nlc3NUeXBlLFxuICBvcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlIGFzIE9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUsXG4gIGpzeEF0dHJpYnV0ZSBhcyBKU1hBdHRyaWJ1dGUsXG4gIGpzeENsb3NpbmdFbGVtZW50IGFzIEpTWENsb3NpbmdFbGVtZW50LFxuICBqc3hFbGVtZW50IGFzIEpTWEVsZW1lbnQsXG4gIGpzeEVtcHR5RXhwcmVzc2lvbiBhcyBKU1hFbXB0eUV4cHJlc3Npb24sXG4gIGpzeEV4cHJlc3Npb25Db250YWluZXIgYXMgSlNYRXhwcmVzc2lvbkNvbnRhaW5lcixcbiAganN4U3ByZWFkQ2hpbGQgYXMgSlNYU3ByZWFkQ2hpbGQsXG4gIGpzeElkZW50aWZpZXIgYXMgSlNYSWRlbnRpZmllcixcbiAganN4TWVtYmVyRXhwcmVzc2lvbiBhcyBKU1hNZW1iZXJFeHByZXNzaW9uLFxuICBqc3hOYW1lc3BhY2VkTmFtZSBhcyBKU1hOYW1lc3BhY2VkTmFtZSxcbiAganN4T3BlbmluZ0VsZW1lbnQgYXMgSlNYT3BlbmluZ0VsZW1lbnQsXG4gIGpzeFNwcmVhZEF0dHJpYnV0ZSBhcyBKU1hTcHJlYWRBdHRyaWJ1dGUsXG4gIGpzeFRleHQgYXMgSlNYVGV4dCxcbiAganN4RnJhZ21lbnQgYXMgSlNYRnJhZ21lbnQsXG4gIGpzeE9wZW5pbmdGcmFnbWVudCBhcyBKU1hPcGVuaW5nRnJhZ21lbnQsXG4gIGpzeENsb3NpbmdGcmFnbWVudCBhcyBKU1hDbG9zaW5nRnJhZ21lbnQsXG4gIG5vb3AgYXMgTm9vcCxcbiAgcGxhY2Vob2xkZXIgYXMgUGxhY2Vob2xkZXIsXG4gIHY4SW50cmluc2ljSWRlbnRpZmllciBhcyBWOEludHJpbnNpY0lkZW50aWZpZXIsXG4gIGFyZ3VtZW50UGxhY2Vob2xkZXIgYXMgQXJndW1lbnRQbGFjZWhvbGRlcixcbiAgYmluZEV4cHJlc3Npb24gYXMgQmluZEV4cHJlc3Npb24sXG4gIGltcG9ydEF0dHJpYnV0ZSBhcyBJbXBvcnRBdHRyaWJ1dGUsXG4gIGRlY29yYXRvciBhcyBEZWNvcmF0b3IsXG4gIGRvRXhwcmVzc2lvbiBhcyBEb0V4cHJlc3Npb24sXG4gIGV4cG9ydERlZmF1bHRTcGVjaWZpZXIgYXMgRXhwb3J0RGVmYXVsdFNwZWNpZmllcixcbiAgcmVjb3JkRXhwcmVzc2lvbiBhcyBSZWNvcmRFeHByZXNzaW9uLFxuICB0dXBsZUV4cHJlc3Npb24gYXMgVHVwbGVFeHByZXNzaW9uLFxuICBkZWNpbWFsTGl0ZXJhbCBhcyBEZWNpbWFsTGl0ZXJhbCxcbiAgbW9kdWxlRXhwcmVzc2lvbiBhcyBNb2R1bGVFeHByZXNzaW9uLFxuICB0b3BpY1JlZmVyZW5jZSBhcyBUb3BpY1JlZmVyZW5jZSxcbiAgcGlwZWxpbmVUb3BpY0V4cHJlc3Npb24gYXMgUGlwZWxpbmVUb3BpY0V4cHJlc3Npb24sXG4gIHBpcGVsaW5lQmFyZUZ1bmN0aW9uIGFzIFBpcGVsaW5lQmFyZUZ1bmN0aW9uLFxuICBwaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSBhcyBQaXBlbGluZVByaW1hcnlUb3BpY1JlZmVyZW5jZSxcbiAgdHNQYXJhbWV0ZXJQcm9wZXJ0eSBhcyBUU1BhcmFtZXRlclByb3BlcnR5LFxuICB0c0RlY2xhcmVGdW5jdGlvbiBhcyBUU0RlY2xhcmVGdW5jdGlvbixcbiAgdHNEZWNsYXJlTWV0aG9kIGFzIFRTRGVjbGFyZU1ldGhvZCxcbiAgdHNRdWFsaWZpZWROYW1lIGFzIFRTUXVhbGlmaWVkTmFtZSxcbiAgdHNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24gYXMgVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24sXG4gIHRzQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24gYXMgVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbixcbiAgdHNQcm9wZXJ0eVNpZ25hdHVyZSBhcyBUU1Byb3BlcnR5U2lnbmF0dXJlLFxuICB0c01ldGhvZFNpZ25hdHVyZSBhcyBUU01ldGhvZFNpZ25hdHVyZSxcbiAgdHNJbmRleFNpZ25hdHVyZSBhcyBUU0luZGV4U2lnbmF0dXJlLFxuICB0c0FueUtleXdvcmQgYXMgVFNBbnlLZXl3b3JkLFxuICB0c0Jvb2xlYW5LZXl3b3JkIGFzIFRTQm9vbGVhbktleXdvcmQsXG4gIHRzQmlnSW50S2V5d29yZCBhcyBUU0JpZ0ludEtleXdvcmQsXG4gIHRzSW50cmluc2ljS2V5d29yZCBhcyBUU0ludHJpbnNpY0tleXdvcmQsXG4gIHRzTmV2ZXJLZXl3b3JkIGFzIFRTTmV2ZXJLZXl3b3JkLFxuICB0c051bGxLZXl3b3JkIGFzIFRTTnVsbEtleXdvcmQsXG4gIHRzTnVtYmVyS2V5d29yZCBhcyBUU051bWJlcktleXdvcmQsXG4gIHRzT2JqZWN0S2V5d29yZCBhcyBUU09iamVjdEtleXdvcmQsXG4gIHRzU3RyaW5nS2V5d29yZCBhcyBUU1N0cmluZ0tleXdvcmQsXG4gIHRzU3ltYm9sS2V5d29yZCBhcyBUU1N5bWJvbEtleXdvcmQsXG4gIHRzVW5kZWZpbmVkS2V5d29yZCBhcyBUU1VuZGVmaW5lZEtleXdvcmQsXG4gIHRzVW5rbm93bktleXdvcmQgYXMgVFNVbmtub3duS2V5d29yZCxcbiAgdHNWb2lkS2V5d29yZCBhcyBUU1ZvaWRLZXl3b3JkLFxuICB0c1RoaXNUeXBlIGFzIFRTVGhpc1R5cGUsXG4gIHRzRnVuY3Rpb25UeXBlIGFzIFRTRnVuY3Rpb25UeXBlLFxuICB0c0NvbnN0cnVjdG9yVHlwZSBhcyBUU0NvbnN0cnVjdG9yVHlwZSxcbiAgdHNUeXBlUmVmZXJlbmNlIGFzIFRTVHlwZVJlZmVyZW5jZSxcbiAgdHNUeXBlUHJlZGljYXRlIGFzIFRTVHlwZVByZWRpY2F0ZSxcbiAgdHNUeXBlUXVlcnkgYXMgVFNUeXBlUXVlcnksXG4gIHRzVHlwZUxpdGVyYWwgYXMgVFNUeXBlTGl0ZXJhbCxcbiAgdHNBcnJheVR5cGUgYXMgVFNBcnJheVR5cGUsXG4gIHRzVHVwbGVUeXBlIGFzIFRTVHVwbGVUeXBlLFxuICB0c09wdGlvbmFsVHlwZSBhcyBUU09wdGlvbmFsVHlwZSxcbiAgdHNSZXN0VHlwZSBhcyBUU1Jlc3RUeXBlLFxuICB0c05hbWVkVHVwbGVNZW1iZXIgYXMgVFNOYW1lZFR1cGxlTWVtYmVyLFxuICB0c1VuaW9uVHlwZSBhcyBUU1VuaW9uVHlwZSxcbiAgdHNJbnRlcnNlY3Rpb25UeXBlIGFzIFRTSW50ZXJzZWN0aW9uVHlwZSxcbiAgdHNDb25kaXRpb25hbFR5cGUgYXMgVFNDb25kaXRpb25hbFR5cGUsXG4gIHRzSW5mZXJUeXBlIGFzIFRTSW5mZXJUeXBlLFxuICB0c1BhcmVudGhlc2l6ZWRUeXBlIGFzIFRTUGFyZW50aGVzaXplZFR5cGUsXG4gIHRzVHlwZU9wZXJhdG9yIGFzIFRTVHlwZU9wZXJhdG9yLFxuICB0c0luZGV4ZWRBY2Nlc3NUeXBlIGFzIFRTSW5kZXhlZEFjY2Vzc1R5cGUsXG4gIHRzTWFwcGVkVHlwZSBhcyBUU01hcHBlZFR5cGUsXG4gIHRzTGl0ZXJhbFR5cGUgYXMgVFNMaXRlcmFsVHlwZSxcbiAgdHNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMgYXMgVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMsXG4gIHRzSW50ZXJmYWNlRGVjbGFyYXRpb24gYXMgVFNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgdHNJbnRlcmZhY2VCb2R5IGFzIFRTSW50ZXJmYWNlQm9keSxcbiAgdHNUeXBlQWxpYXNEZWNsYXJhdGlvbiBhcyBUU1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICB0c0luc3RhbnRpYXRpb25FeHByZXNzaW9uIGFzIFRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24sXG4gIHRzQXNFeHByZXNzaW9uIGFzIFRTQXNFeHByZXNzaW9uLFxuICB0c1NhdGlzZmllc0V4cHJlc3Npb24gYXMgVFNTYXRpc2ZpZXNFeHByZXNzaW9uLFxuICB0c1R5cGVBc3NlcnRpb24gYXMgVFNUeXBlQXNzZXJ0aW9uLFxuICB0c0VudW1EZWNsYXJhdGlvbiBhcyBUU0VudW1EZWNsYXJhdGlvbixcbiAgdHNFbnVtTWVtYmVyIGFzIFRTRW51bU1lbWJlcixcbiAgdHNNb2R1bGVEZWNsYXJhdGlvbiBhcyBUU01vZHVsZURlY2xhcmF0aW9uLFxuICB0c01vZHVsZUJsb2NrIGFzIFRTTW9kdWxlQmxvY2ssXG4gIHRzSW1wb3J0VHlwZSBhcyBUU0ltcG9ydFR5cGUsXG4gIHRzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24gYXMgVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbixcbiAgdHNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSBhcyBUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlLFxuICB0c05vbk51bGxFeHByZXNzaW9uIGFzIFRTTm9uTnVsbEV4cHJlc3Npb24sXG4gIHRzRXhwb3J0QXNzaWdubWVudCBhcyBUU0V4cG9ydEFzc2lnbm1lbnQsXG4gIHRzTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24gYXMgVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbixcbiAgdHNUeXBlQW5ub3RhdGlvbiBhcyBUU1R5cGVBbm5vdGF0aW9uLFxuICB0c1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIGFzIFRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24sXG4gIHRzVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGFzIFRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLFxuICB0c1R5cGVQYXJhbWV0ZXIgYXMgVFNUeXBlUGFyYW1ldGVyLFxuICBudW1iZXJMaXRlcmFsIGFzIE51bWJlckxpdGVyYWwsXG4gIHJlZ2V4TGl0ZXJhbCBhcyBSZWdleExpdGVyYWwsXG4gIHJlc3RQcm9wZXJ0eSBhcyBSZXN0UHJvcGVydHksXG4gIHNwcmVhZFByb3BlcnR5IGFzIFNwcmVhZFByb3BlcnR5LFxufSBmcm9tIFwiLi9pbmRleFwiO1xuIiwgImltcG9ydCB7IE5PREVfRklFTERTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBpc0ZpbGUsIGlzSWRlbnRpZmllciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuXG5jb25zdCBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbnR5cGUgQ29tbWVudENhY2hlID0gTWFwPHQuQ29tbWVudCwgdC5Db21tZW50PjtcblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIGJlIGNhbGxlZCBmb3IgY29tbWVudHMsIG9ubHkgZm9yIHJlYWwgbm9kZXMuXG5mdW5jdGlvbiBjbG9uZUlmTm9kZShcbiAgb2JqOiB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsLFxuICBkZWVwOiBib29sZWFuLFxuICB3aXRob3V0TG9jOiBib29sZWFuLFxuICBjb21tZW50c0NhY2hlOiBDb21tZW50Q2FjaGUsXG4pIHtcbiAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY2xvbmVOb2RlSW50ZXJuYWwob2JqLCBkZWVwLCB3aXRob3V0TG9jLCBjb21tZW50c0NhY2hlKTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGNsb25lSWZOb2RlT3JBcnJheShcbiAgb2JqOiB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsIHwgKHQuTm9kZSB8IHVuZGVmaW5lZCB8IG51bGwpW10sXG4gIGRlZXA6IGJvb2xlYW4sXG4gIHdpdGhvdXRMb2M6IGJvb2xlYW4sXG4gIGNvbW1lbnRzQ2FjaGU6IENvbW1lbnRDYWNoZSxcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAobm9kZSA9PiBjbG9uZUlmTm9kZShub2RlLCBkZWVwLCB3aXRob3V0TG9jLCBjb21tZW50c0NhY2hlKSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lSWZOb2RlKG9iaiwgZGVlcCwgd2l0aG91dExvYywgY29tbWVudHNDYWNoZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2xvbmUgb2YgYSBgbm9kZWAgaW5jbHVkaW5nIG9ubHkgcHJvcGVydGllcyBiZWxvbmdpbmcgdG8gdGhlIG5vZGUuXG4gKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBgZmFsc2VgLCBjbG9uZU5vZGUgcGVyZm9ybXMgYSBzaGFsbG93IGNsb25lLlxuICogSWYgdGhlIHRoaXJkIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY2xvbmVkIG5vZGVzIGV4Y2x1ZGUgbG9jYXRpb24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xvbmVOb2RlPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBub2RlOiBULFxuICBkZWVwOiBib29sZWFuID0gdHJ1ZSxcbiAgd2l0aG91dExvYzogYm9vbGVhbiA9IGZhbHNlLFxuKTogVCB7XG4gIHJldHVybiBjbG9uZU5vZGVJbnRlcm5hbChub2RlLCBkZWVwLCB3aXRob3V0TG9jLCBuZXcgTWFwKCkpO1xufVxuXG5mdW5jdGlvbiBjbG9uZU5vZGVJbnRlcm5hbDxUIGV4dGVuZHMgdC5Ob2RlPihcbiAgbm9kZTogVCxcbiAgZGVlcDogYm9vbGVhbiA9IHRydWUsXG4gIHdpdGhvdXRMb2M6IGJvb2xlYW4gPSBmYWxzZSxcbiAgY29tbWVudHNDYWNoZTogQ29tbWVudENhY2hlLFxuKTogVCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgeyB0eXBlIH0gPSBub2RlO1xuICBjb25zdCBuZXdOb2RlOiBhbnkgPSB7IHR5cGU6IG5vZGUudHlwZSB9O1xuXG4gIC8vIFNwZWNpYWwtY2FzZSBpZGVudGlmaWVycyBzaW5jZSB0aGV5IGFyZSB0aGUgbW9zdCBjbG9uZWQgbm9kZXMuXG4gIGlmIChpc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICBuZXdOb2RlLm5hbWUgPSBub2RlLm5hbWU7XG5cbiAgICBpZiAoaGFzKG5vZGUsIFwib3B0aW9uYWxcIikgJiYgdHlwZW9mIG5vZGUub3B0aW9uYWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBuZXdOb2RlLm9wdGlvbmFsID0gbm9kZS5vcHRpb25hbDtcbiAgICB9XG5cbiAgICBpZiAoaGFzKG5vZGUsIFwidHlwZUFubm90YXRpb25cIikpIHtcbiAgICAgIG5ld05vZGUudHlwZUFubm90YXRpb24gPSBkZWVwXG4gICAgICAgID8gY2xvbmVJZk5vZGVPckFycmF5KFxuICAgICAgICAgICAgbm9kZS50eXBlQW5ub3RhdGlvbixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB3aXRob3V0TG9jLFxuICAgICAgICAgICAgY29tbWVudHNDYWNoZSxcbiAgICAgICAgICApXG4gICAgICAgIDogbm9kZS50eXBlQW5ub3RhdGlvbjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWhhcyhOT0RFX0ZJRUxEUywgdHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbm9kZSB0eXBlOiBcIiR7dHlwZX1cImApO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMoTk9ERV9GSUVMRFNbdHlwZV0pKSB7XG4gICAgICBpZiAoaGFzKG5vZGUsIGZpZWxkKSkge1xuICAgICAgICBpZiAoZGVlcCkge1xuICAgICAgICAgIG5ld05vZGVbZmllbGRdID1cbiAgICAgICAgICAgIGlzRmlsZShub2RlKSAmJiBmaWVsZCA9PT0gXCJjb21tZW50c1wiXG4gICAgICAgICAgICAgID8gbWF5YmVDbG9uZUNvbW1lbnRzKFxuICAgICAgICAgICAgICAgICAgbm9kZS5jb21tZW50cyxcbiAgICAgICAgICAgICAgICAgIGRlZXAsXG4gICAgICAgICAgICAgICAgICB3aXRob3V0TG9jLFxuICAgICAgICAgICAgICAgICAgY29tbWVudHNDYWNoZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY2xvbmVJZk5vZGVPckFycmF5KFxuICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub2RlW2ZpZWxkXSBoYXMgYmVlbiBndWFyZGVkIGJ5IGhhcyBjaGVja1xuICAgICAgICAgICAgICAgICAgbm9kZVtmaWVsZF0sXG4gICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgd2l0aG91dExvYyxcbiAgICAgICAgICAgICAgICAgIGNvbW1lbnRzQ2FjaGUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdOb2RlW2ZpZWxkXSA9XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5vZGVbZmllbGRdIGhhcyBiZWVuIGd1YXJkZWQgYnkgaGFzIGNoZWNrXG4gICAgICAgICAgICBub2RlW2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXMobm9kZSwgXCJsb2NcIikpIHtcbiAgICBpZiAod2l0aG91dExvYykge1xuICAgICAgbmV3Tm9kZS5sb2MgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdOb2RlLmxvYyA9IG5vZGUubG9jO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzKG5vZGUsIFwibGVhZGluZ0NvbW1lbnRzXCIpKSB7XG4gICAgbmV3Tm9kZS5sZWFkaW5nQ29tbWVudHMgPSBtYXliZUNsb25lQ29tbWVudHMoXG4gICAgICBub2RlLmxlYWRpbmdDb21tZW50cyxcbiAgICAgIGRlZXAsXG4gICAgICB3aXRob3V0TG9jLFxuICAgICAgY29tbWVudHNDYWNoZSxcbiAgICApO1xuICB9XG4gIGlmIChoYXMobm9kZSwgXCJpbm5lckNvbW1lbnRzXCIpKSB7XG4gICAgbmV3Tm9kZS5pbm5lckNvbW1lbnRzID0gbWF5YmVDbG9uZUNvbW1lbnRzKFxuICAgICAgbm9kZS5pbm5lckNvbW1lbnRzLFxuICAgICAgZGVlcCxcbiAgICAgIHdpdGhvdXRMb2MsXG4gICAgICBjb21tZW50c0NhY2hlLFxuICAgICk7XG4gIH1cbiAgaWYgKGhhcyhub2RlLCBcInRyYWlsaW5nQ29tbWVudHNcIikpIHtcbiAgICBuZXdOb2RlLnRyYWlsaW5nQ29tbWVudHMgPSBtYXliZUNsb25lQ29tbWVudHMoXG4gICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMsXG4gICAgICBkZWVwLFxuICAgICAgd2l0aG91dExvYyxcbiAgICAgIGNvbW1lbnRzQ2FjaGUsXG4gICAgKTtcbiAgfVxuICBpZiAoaGFzKG5vZGUsIFwiZXh0cmFcIikpIHtcbiAgICBuZXdOb2RlLmV4dHJhID0ge1xuICAgICAgLi4ubm9kZS5leHRyYSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2xvbmVDb21tZW50czxUIGV4dGVuZHMgdC5Db21tZW50PihcbiAgY29tbWVudHM6IFJlYWRvbmx5QXJyYXk8VD4gfCBudWxsLFxuICBkZWVwOiBib29sZWFuLFxuICB3aXRob3V0TG9jOiBib29sZWFuLFxuICBjb21tZW50c0NhY2hlOiBNYXA8VCwgVD4sXG4pOiBSZWFkb25seUFycmF5PFQ+IHwgbnVsbCB7XG4gIGlmICghY29tbWVudHMgfHwgIWRlZXApIHtcbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgcmV0dXJuIGNvbW1lbnRzLm1hcChjb21tZW50ID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IGNvbW1lbnRzQ2FjaGUuZ2V0KGNvbW1lbnQpO1xuICAgIGlmIChjYWNoZSkgcmV0dXJuIGNhY2hlO1xuXG4gICAgY29uc3QgeyB0eXBlLCB2YWx1ZSwgbG9jIH0gPSBjb21tZW50O1xuXG4gICAgY29uc3QgcmV0ID0geyB0eXBlLCB2YWx1ZSwgbG9jIH0gYXMgVDtcbiAgICBpZiAod2l0aG91dExvYykge1xuICAgICAgcmV0LmxvYyA9IG51bGw7XG4gICAgfVxuXG4gICAgY29tbWVudHNDYWNoZS5zZXQoY29tbWVudCwgcmV0KTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwgImltcG9ydCBjbG9uZU5vZGUgZnJvbSBcIi4vY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ3JlYXRlIGEgc2hhbGxvdyBjbG9uZSBvZiBhIGBub2RlYCwgaW5jbHVkaW5nIG9ubHlcbiAqIHByb3BlcnRpZXMgYmVsb25naW5nIHRvIHRoZSBub2RlLlxuICogQGRlcHJlY2F0ZWQgVXNlIHQuY2xvbmVOb2RlIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsb25lPFQgZXh0ZW5kcyB0Lk5vZGU+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGNsb25lTm9kZShub2RlLCAvKiBkZWVwICovIGZhbHNlKTtcbn1cbiIsICJpbXBvcnQgY2xvbmVOb2RlIGZyb20gXCIuL2Nsb25lTm9kZVwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIGRlZXAgY2xvbmUgb2YgYSBgbm9kZWAgYW5kIGFsbCBvZiBpdCdzIGNoaWxkIG5vZGVzXG4gKiBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byB0aGUgbm9kZS5cbiAqIEBkZXByZWNhdGVkIFVzZSB0LmNsb25lTm9kZSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZURlZXA8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICByZXR1cm4gY2xvbmVOb2RlKG5vZGUpO1xufVxuIiwgImltcG9ydCBjbG9uZU5vZGUgZnJvbSBcIi4vY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG4vKipcbiAqIENyZWF0ZSBhIGRlZXAgY2xvbmUgb2YgYSBgbm9kZWAgYW5kIGFsbCBvZiBpdCdzIGNoaWxkIG5vZGVzXG4gKiBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byB0aGUgbm9kZS5cbiAqIGV4Y2x1ZGluZyBgX3ByaXZhdGVgIGFuZCBsb2NhdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZURlZXBXaXRob3V0TG9jPFQgZXh0ZW5kcyB0Lk5vZGU+KG5vZGU6IFQpOiBUIHtcbiAgcmV0dXJuIGNsb25lTm9kZShub2RlLCAvKiBkZWVwICovIHRydWUsIC8qIHdpdGhvdXRMb2MgKi8gdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi9jbG9uZU5vZGVcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBzaGFsbG93IGNsb25lIG9mIGEgYG5vZGVgIGV4Y2x1ZGluZyBgX3ByaXZhdGVgIGFuZCBsb2NhdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG9uZVdpdGhvdXRMb2M8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICByZXR1cm4gY2xvbmVOb2RlKG5vZGUsIC8qIGRlZXAgKi8gZmFsc2UsIC8qIHdpdGhvdXRMb2MgKi8gdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEFkZCBjb21tZW50cyBvZiBjZXJ0YWluIHR5cGUgdG8gYSBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRDb21tZW50czxUIGV4dGVuZHMgdC5Ob2RlPihcbiAgbm9kZTogVCxcbiAgdHlwZTogdC5Db21tZW50VHlwZVNob3J0aGFuZCxcbiAgY29tbWVudHM6IEFycmF5PHQuQ29tbWVudD4sXG4pOiBUIHtcbiAgaWYgKCFjb21tZW50cyB8fCAhbm9kZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3Qga2V5ID0gYCR7dHlwZX1Db21tZW50c2AgYXMgY29uc3Q7XG5cbiAgaWYgKG5vZGVba2V5XSkge1xuICAgIGlmICh0eXBlID09PSBcImxlYWRpbmdcIikge1xuICAgICAgbm9kZVtrZXldID0gY29tbWVudHMuY29uY2F0KG5vZGVba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVba2V5XS5wdXNoKC4uLmNvbW1lbnRzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZVtrZXldID0gY29tbWVudHM7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbiIsICJpbXBvcnQgYWRkQ29tbWVudHMgZnJvbSBcIi4vYWRkQ29tbWVudHNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBBZGQgY29tbWVudCBvZiBjZXJ0YWluIHR5cGUgdG8gYSBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRDb21tZW50PFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBub2RlOiBULFxuICB0eXBlOiB0LkNvbW1lbnRUeXBlU2hvcnRoYW5kLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmU/OiBib29sZWFuLFxuKTogVCB7XG4gIHJldHVybiBhZGRDb21tZW50cyhub2RlLCB0eXBlLCBbXG4gICAge1xuICAgICAgdHlwZTogbGluZSA/IFwiQ29tbWVudExpbmVcIiA6IFwiQ29tbWVudEJsb2NrXCIsXG4gICAgICB2YWx1ZTogY29udGVudCxcbiAgICB9IGFzIHQuQ29tbWVudCxcbiAgXSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0PFxuICBDIGV4dGVuZHMgdC5Ob2RlIHwgdW5kZWZpbmVkLFxuICBQIGV4dGVuZHMgdC5Ob2RlIHwgdW5kZWZpbmVkLFxuPihrZXk6IGtleW9mIEMgJiBrZXlvZiBQLCBjaGlsZDogQywgcGFyZW50OiBQKTogdm9pZCB7XG4gIGlmIChjaGlsZCAmJiBwYXJlbnQpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvdWxkIGZ1cnRoZXIgcmVmaW5lIGtleSBkZWZpbml0aW9uc1xuICAgIGNoaWxkW2tleV0gPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbXS5jb25jYXQoY2hpbGRba2V5XSwgcGFyZW50W2tleV0pLmZpbHRlcihCb29sZWFuKSksXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCBpbmhlcml0IGZyb20gXCIuLi91dGlscy9pbmhlcml0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaGVyaXRJbm5lckNvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwiaW5uZXJDb21tZW50c1wiLCBjaGlsZCwgcGFyZW50KTtcbn1cbiIsICJpbXBvcnQgaW5oZXJpdCBmcm9tIFwiLi4vdXRpbHMvaW5oZXJpdFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0TGVhZGluZ0NvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwibGVhZGluZ0NvbW1lbnRzXCIsIGNoaWxkLCBwYXJlbnQpO1xufVxuIiwgImltcG9ydCBpbmhlcml0IGZyb20gXCIuLi91dGlscy9pbmhlcml0XCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaGVyaXRUcmFpbGluZ0NvbW1lbnRzKFxuICBjaGlsZDogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbik6IHZvaWQge1xuICBpbmhlcml0KFwidHJhaWxpbmdDb21tZW50c1wiLCBjaGlsZCwgcGFyZW50KTtcbn1cbiIsICJpbXBvcnQgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMgZnJvbSBcIi4vaW5oZXJpdFRyYWlsaW5nQ29tbWVudHNcIjtcbmltcG9ydCBpbmhlcml0TGVhZGluZ0NvbW1lbnRzIGZyb20gXCIuL2luaGVyaXRMZWFkaW5nQ29tbWVudHNcIjtcbmltcG9ydCBpbmhlcml0SW5uZXJDb21tZW50cyBmcm9tIFwiLi9pbmhlcml0SW5uZXJDb21tZW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEluaGVyaXQgYWxsIHVuaXF1ZSBjb21tZW50cyBmcm9tIGBwYXJlbnRgIG5vZGUgdG8gYGNoaWxkYCBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0c0NvbW1lbnRzPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICBjaGlsZDogVCxcbiAgcGFyZW50OiB0Lk5vZGUsXG4pOiBUIHtcbiAgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMoY2hpbGQsIHBhcmVudCk7XG4gIGluaGVyaXRMZWFkaW5nQ29tbWVudHMoY2hpbGQsIHBhcmVudCk7XG4gIGluaGVyaXRJbm5lckNvbW1lbnRzKGNoaWxkLCBwYXJlbnQpO1xuXG4gIHJldHVybiBjaGlsZDtcbn1cbiIsICJpbXBvcnQgeyBDT01NRU5UX0tFWVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogUmVtb3ZlIGNvbW1lbnQgcHJvcGVydGllcyBmcm9tIGEgbm9kZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVtb3ZlQ29tbWVudHM8VCBleHRlbmRzIHQuTm9kZT4obm9kZTogVCk6IFQge1xuICBDT01NRU5UX0tFWVMuZm9yRWFjaChrZXkgPT4ge1xuICAgIG5vZGVba2V5XSA9IG51bGw7XG4gIH0pO1xuXG4gIHJldHVybiBub2RlO1xufVxuIiwgIi8qXG4gKiBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQhIERvIG5vdCBtb2RpZnkgaXQgZGlyZWN0bHkuXG4gKiBUbyByZS1nZW5lcmF0ZSBydW4gJ21ha2UgYnVpbGQnXG4gKi9cbmltcG9ydCB7IEZMSVBQRURfQUxJQVNfS0VZUyB9IGZyb20gXCIuLi8uLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgU1RBTkRBUkRJWkVEX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiU3RhbmRhcmRpemVkXCJdO1xuZXhwb3J0IGNvbnN0IEVYUFJFU1NJT05fVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJFeHByZXNzaW9uXCJdO1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkJpbmFyeVwiXTtcbmV4cG9ydCBjb25zdCBTQ09QQUJMRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlNjb3BhYmxlXCJdO1xuZXhwb3J0IGNvbnN0IEJMT0NLUEFSRU5UX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiQmxvY2tQYXJlbnRcIl07XG5leHBvcnQgY29uc3QgQkxPQ0tfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJCbG9ja1wiXTtcbmV4cG9ydCBjb25zdCBTVEFURU1FTlRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJTdGF0ZW1lbnRcIl07XG5leHBvcnQgY29uc3QgVEVSTUlOQVRPUkxFU1NfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUZXJtaW5hdG9ybGVzc1wiXTtcbmV4cG9ydCBjb25zdCBDT01QTEVUSU9OU1RBVEVNRU5UX1RZUEVTID1cbiAgRkxJUFBFRF9BTElBU19LRVlTW1wiQ29tcGxldGlvblN0YXRlbWVudFwiXTtcbmV4cG9ydCBjb25zdCBDT05ESVRJT05BTF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkNvbmRpdGlvbmFsXCJdO1xuZXhwb3J0IGNvbnN0IExPT1BfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJMb29wXCJdO1xuZXhwb3J0IGNvbnN0IFdISUxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiV2hpbGVcIl07XG5leHBvcnQgY29uc3QgRVhQUkVTU0lPTldSQVBQRVJfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJFeHByZXNzaW9uV3JhcHBlclwiXTtcbmV4cG9ydCBjb25zdCBGT1JfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGb3JcIl07XG5leHBvcnQgY29uc3QgRk9SWFNUQVRFTUVOVF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZvclhTdGF0ZW1lbnRcIl07XG5leHBvcnQgY29uc3QgRlVOQ1RJT05fVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGdW5jdGlvblwiXTtcbmV4cG9ydCBjb25zdCBGVU5DVElPTlBBUkVOVF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZ1bmN0aW9uUGFyZW50XCJdO1xuZXhwb3J0IGNvbnN0IFBVUkVJU0hfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJQdXJlaXNoXCJdO1xuZXhwb3J0IGNvbnN0IERFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRGVjbGFyYXRpb25cIl07XG5leHBvcnQgY29uc3QgUEFUVEVSTkxJS0VfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJQYXR0ZXJuTGlrZVwiXTtcbmV4cG9ydCBjb25zdCBMVkFMX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTFZhbFwiXTtcbmV4cG9ydCBjb25zdCBUU0VOVElUWU5BTUVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUU0VudGl0eU5hbWVcIl07XG5leHBvcnQgY29uc3QgTElURVJBTF9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkxpdGVyYWxcIl07XG5leHBvcnQgY29uc3QgSU1NVVRBQkxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiSW1tdXRhYmxlXCJdO1xuZXhwb3J0IGNvbnN0IFVTRVJXSElURVNQQUNBQkxFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiVXNlcldoaXRlc3BhY2FibGVcIl07XG5leHBvcnQgY29uc3QgTUVUSE9EX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTWV0aG9kXCJdO1xuZXhwb3J0IGNvbnN0IE9CSkVDVE1FTUJFUl9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIk9iamVjdE1lbWJlclwiXTtcbmV4cG9ydCBjb25zdCBQUk9QRVJUWV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlByb3BlcnR5XCJdO1xuZXhwb3J0IGNvbnN0IFVOQVJZTElLRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlVuYXJ5TGlrZVwiXTtcbmV4cG9ydCBjb25zdCBQQVRURVJOX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiUGF0dGVyblwiXTtcbmV4cG9ydCBjb25zdCBDTEFTU19UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkNsYXNzXCJdO1xuZXhwb3J0IGNvbnN0IElNUE9SVE9SRVhQT1JUREVDTEFSQVRJT05fVFlQRVMgPVxuICBGTElQUEVEX0FMSUFTX0tFWVNbXCJJbXBvcnRPckV4cG9ydERlY2xhcmF0aW9uXCJdO1xuZXhwb3J0IGNvbnN0IEVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRXhwb3J0RGVjbGFyYXRpb25cIl07XG5leHBvcnQgY29uc3QgTU9EVUxFU1BFQ0lGSUVSX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiTW9kdWxlU3BlY2lmaWVyXCJdO1xuZXhwb3J0IGNvbnN0IEFDQ0VTU09SX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiQWNjZXNzb3JcIl07XG5leHBvcnQgY29uc3QgUFJJVkFURV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlByaXZhdGVcIl07XG5leHBvcnQgY29uc3QgRkxPV19UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkZsb3dcIl07XG5leHBvcnQgY29uc3QgRkxPV1RZUEVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93VHlwZVwiXTtcbmV4cG9ydCBjb25zdCBGTE9XQkFTRUFOTk9UQVRJT05fVFlQRVMgPVxuICBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93QmFzZUFubm90YXRpb25cIl07XG5leHBvcnQgY29uc3QgRkxPV0RFQ0xBUkFUSU9OX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRmxvd0RlY2xhcmF0aW9uXCJdO1xuZXhwb3J0IGNvbnN0IEZMT1dQUkVESUNBVEVfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJGbG93UHJlZGljYXRlXCJdO1xuZXhwb3J0IGNvbnN0IEVOVU1CT0RZX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiRW51bUJvZHlcIl07XG5leHBvcnQgY29uc3QgRU5VTU1FTUJFUl9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIkVudW1NZW1iZXJcIl07XG5leHBvcnQgY29uc3QgSlNYX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiSlNYXCJdO1xuZXhwb3J0IGNvbnN0IE1JU0NFTExBTkVPVVNfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJNaXNjZWxsYW5lb3VzXCJdO1xuZXhwb3J0IGNvbnN0IFRZUEVTQ1JJUFRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUeXBlU2NyaXB0XCJdO1xuZXhwb3J0IGNvbnN0IFRTVFlQRUVMRU1FTlRfVFlQRVMgPSBGTElQUEVEX0FMSUFTX0tFWVNbXCJUU1R5cGVFbGVtZW50XCJdO1xuZXhwb3J0IGNvbnN0IFRTVFlQRV9UWVBFUyA9IEZMSVBQRURfQUxJQVNfS0VZU1tcIlRTVHlwZVwiXTtcbmV4cG9ydCBjb25zdCBUU0JBU0VUWVBFX1RZUEVTID0gRkxJUFBFRF9BTElBU19LRVlTW1wiVFNCYXNlVHlwZVwiXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgbWlncmF0ZSB0byBJTVBPUlRPUkVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTLlxuICovXG5leHBvcnQgY29uc3QgTU9EVUxFREVDTEFSQVRJT05fVFlQRVMgPSBJTVBPUlRPUkVYUE9SVERFQ0xBUkFUSU9OX1RZUEVTO1xuIiwgImltcG9ydCB7XG4gIGlzQmxvY2tTdGF0ZW1lbnQsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRW1wdHlTdGF0ZW1lbnQsXG4gIGlzU3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIHJldHVyblN0YXRlbWVudCxcbiAgZXhwcmVzc2lvblN0YXRlbWVudCxcbiAgYmxvY2tTdGF0ZW1lbnQsXG59IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9CbG9jayhcbiAgbm9kZTogdC5TdGF0ZW1lbnQgfCB0LkV4cHJlc3Npb24sXG4gIHBhcmVudD86IHQuTm9kZSxcbik6IHQuQmxvY2tTdGF0ZW1lbnQge1xuICBpZiAoaXNCbG9ja1N0YXRlbWVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgbGV0IGJsb2NrTm9kZXM6IHQuU3RhdGVtZW50W10gPSBbXTtcblxuICBpZiAoaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgIGJsb2NrTm9kZXMgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWlzU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihwYXJlbnQpKSB7XG4gICAgICAgIG5vZGUgPSByZXR1cm5TdGF0ZW1lbnQobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0gZXhwcmVzc2lvblN0YXRlbWVudChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBibG9ja05vZGVzID0gW25vZGVdO1xuICB9XG5cbiAgcmV0dXJuIGJsb2NrU3RhdGVtZW50KGJsb2NrTm9kZXMpO1xufVxuIiwgImltcG9ydCB0b0Jsb2NrIGZyb20gXCIuL3RvQmxvY2tcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBFbnN1cmUgdGhlIGBrZXlgIChkZWZhdWx0cyB0byBcImJvZHlcIikgb2YgYSBgbm9kZWAgaXMgYSBibG9jay5cbiAqIENhc3RpbmcgaXQgdG8gYSBibG9jayBpZiBpdCBpcyBub3QuXG4gKlxuICogUmV0dXJucyB0aGUgQmxvY2tTdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW5zdXJlQmxvY2soXG4gIG5vZGU6IHQuTm9kZSxcbiAga2V5OiBzdHJpbmcgPSBcImJvZHlcIixcbik6IHQuQmxvY2tTdGF0ZW1lbnQge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBrZXkgbWF5IG5vdCBleGlzdCBpbiBub2RlLCBjb25zaWRlciByZW1vdmUga2V5ID0gXCJib2R5XCJcbiAgY29uc3QgcmVzdWx0ID0gdG9CbG9jayhub2RlW2tleV0sIG5vZGUpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBrZXkgbWF5IG5vdCBleGlzdCBpbiBub2RlLCBjb25zaWRlciByZW1vdmUga2V5ID0gXCJib2R5XCJcbiAgbm9kZVtrZXldID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCBpc1ZhbGlkSWRlbnRpZmllciBmcm9tIFwiLi4vdmFsaWRhdG9ycy9pc1ZhbGlkSWRlbnRpZmllclwiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyQ2hhciB9IGZyb20gXCJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvSWRlbnRpZmllcihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaW5wdXQgPSBpbnB1dCArIFwiXCI7XG5cbiAgLy8gcmVwbGFjZSBhbGwgbm9uLXZhbGlkIGlkZW50aWZpZXJzIHdpdGggZGFzaGVzXG4gIGxldCBuYW1lID0gXCJcIjtcbiAgZm9yIChjb25zdCBjIG9mIGlucHV0KSB7XG4gICAgbmFtZSArPSBpc0lkZW50aWZpZXJDaGFyKGMuY29kZVBvaW50QXQoMCkpID8gYyA6IFwiLVwiO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBkYXNoZXMgYW5kIG51bWJlcnMgZnJvbSBzdGFydCBvZiBuYW1lXG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL15bLTAtOV0rLywgXCJcIik7XG5cbiAgLy8gY2FtZWwgY2FzZVxuICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bLVxcc10rKC4pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIGMpIHtcbiAgICByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6IFwiXCI7XG4gIH0pO1xuXG4gIGlmICghaXNWYWxpZElkZW50aWZpZXIobmFtZSkpIHtcbiAgICBuYW1lID0gYF8ke25hbWV9YDtcbiAgfVxuXG4gIHJldHVybiBuYW1lIHx8IFwiX1wiO1xufVxuIiwgImltcG9ydCB0b0lkZW50aWZpZXIgZnJvbSBcIi4vdG9JZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvQmluZGluZ0lkZW50aWZpZXJOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIG5hbWUgPSB0b0lkZW50aWZpZXIobmFtZSk7XG4gIGlmIChuYW1lID09PSBcImV2YWxcIiB8fCBuYW1lID09PSBcImFyZ3VtZW50c1wiKSBuYW1lID0gXCJfXCIgKyBuYW1lO1xuXG4gIHJldHVybiBuYW1lO1xufVxuIiwgImltcG9ydCB7IGlzSWRlbnRpZmllciB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgc3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9Db21wdXRlZEtleShcbiAgbm9kZTpcbiAgICB8IHQuT2JqZWN0TWVtYmVyXG4gICAgfCB0Lk9iamVjdFByb3BlcnR5XG4gICAgfCB0LkNsYXNzTWV0aG9kXG4gICAgfCB0LkNsYXNzUHJvcGVydHlcbiAgICB8IHQuQ2xhc3NBY2Nlc3NvclByb3BlcnR5XG4gICAgfCB0Lk1lbWJlckV4cHJlc3Npb25cbiAgICB8IHQuT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpOiBtYXliZSBjaGVjayB0aGUgdHlwZSBvZiBub2RlIGJlZm9yZSBhY2Nlc3NpbmcgLmtleSBhbmQgLnByb3BlcnR5XG4gIGtleTogdC5FeHByZXNzaW9uIHwgdC5Qcml2YXRlTmFtZSA9IG5vZGUua2V5IHx8IG5vZGUucHJvcGVydHksXG4pIHtcbiAgaWYgKCFub2RlLmNvbXB1dGVkICYmIGlzSWRlbnRpZmllcihrZXkpKSBrZXkgPSBzdHJpbmdMaXRlcmFsKGtleS5uYW1lKTtcblxuICByZXR1cm4ga2V5O1xufVxuIiwgImltcG9ydCB7XG4gIGlzRXhwcmVzc2lvbixcbiAgaXNGdW5jdGlvbixcbiAgaXNDbGFzcyxcbiAgaXNFeHByZXNzaW9uU3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdG9FeHByZXNzaW9uIGFzIHtcbiAgKG5vZGU6IHQuRnVuY3Rpb24pOiB0LkZ1bmN0aW9uRXhwcmVzc2lvbjtcbiAgKG5vZGU6IHQuQ2xhc3MpOiB0LkNsYXNzRXhwcmVzc2lvbjtcbiAgKFxuICAgIG5vZGU6IHQuRXhwcmVzc2lvblN0YXRlbWVudCB8IHQuRXhwcmVzc2lvbiB8IHQuQ2xhc3MgfCB0LkZ1bmN0aW9uLFxuICApOiB0LkV4cHJlc3Npb247XG59O1xuXG5mdW5jdGlvbiB0b0V4cHJlc3Npb24oXG4gIG5vZGU6IHQuRXhwcmVzc2lvblN0YXRlbWVudCB8IHQuRXhwcmVzc2lvbiB8IHQuQ2xhc3MgfCB0LkZ1bmN0aW9uLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgaWYgKGlzRXhwcmVzc2lvblN0YXRlbWVudChub2RlKSkge1xuICAgIG5vZGUgPSBub2RlLmV4cHJlc3Npb247XG4gIH1cblxuICAvLyByZXR1cm4gdW5tb2RpZmllZCBub2RlXG4gIC8vIGltcG9ydGFudCBmb3IgdGhpbmdzIGxpa2UgQXJyb3dGdW5jdGlvbnMgd2hlcmVcbiAgLy8gdHlwZSBjaGFuZ2UgZnJvbSBBcnJvd0Z1bmN0aW9uIHRvIEZ1bmN0aW9uRXhwcmVzc2lvblxuICAvLyBwcm9kdWNlcyBidWdzIGxpa2UgLT4gYCgpPT5hYCB0byBgZnVuY3Rpb24gKCkgYWBcbiAgLy8gd2l0aG91dCBnZW5lcmF0aW5nIGEgQmxvY2tTdGF0ZW1lbnQgZm9yIGl0XG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmlsaS9pc3N1ZXMvMTMwXG4gIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgYWxsIGNsYXNzZXMgYW5kIGZ1bmN0aW9uc1xuICAvLyBDbGFzc0RlY2xhcmF0aW9uIC0+IENsYXNzRXhwcmVzc2lvblxuICAvLyBGdW5jdGlvbkRlY2xhcmF0aW9uLCBPYmplY3RNZXRob2QsIENsYXNzTWV0aG9kIC0+IEZ1bmN0aW9uRXhwcmVzc2lvblxuICBpZiAoaXNDbGFzcyhub2RlKSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IGF2b2lkIHR5cGUgdW5zYWZlIG11dGF0aW9uc1xuICAgIG5vZGUudHlwZSA9IFwiQ2xhc3NFeHByZXNzaW9uXCI7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihub2RlKSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IGF2b2lkIHR5cGUgdW5zYWZlIG11dGF0aW9uc1xuICAgIG5vZGUudHlwZSA9IFwiRnVuY3Rpb25FeHByZXNzaW9uXCI7XG4gIH1cblxuICAvLyBpZiBpdCdzIHN0aWxsIG5vdCBhbiBleHByZXNzaW9uXG4gIGlmICghaXNFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgdHVybiAke25vZGUudHlwZX0gdG8gYW4gZXhwcmVzc2lvbmApO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQSBwcmVmaXggQVNUIHRyYXZlcnNhbCBpbXBsZW1lbnRhdGlvbiBtZWFudCBmb3Igc2ltcGxlIHNlYXJjaGluZ1xuICogYW5kIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYXZlcnNlRmFzdDxPcHRpb25zID0ge30+KFxuICBub2RlOiB0Lk5vZGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBlbnRlcjogKG5vZGU6IHQuTm9kZSwgb3B0cz86IE9wdGlvbnMpID0+IHZvaWQsXG4gIG9wdHM/OiBPcHRpb25zLFxuKTogdm9pZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGtleXMgPSBWSVNJVE9SX0tFWVNbbm9kZS50eXBlXTtcbiAgaWYgKCFrZXlzKSByZXR1cm47XG5cbiAgb3B0cyA9IG9wdHMgfHwgKHt9IGFzIE9wdGlvbnMpO1xuICBlbnRlcihub2RlLCBvcHRzKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3Qgc3ViTm9kZTogdC5Ob2RlIHwgdW5kZWZpbmVkIHwgbnVsbCA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGtleSBtdXN0IHByZXNlbnQgaW4gbm9kZVxuICAgICAgbm9kZVtrZXldO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViTm9kZSkpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWJOb2RlKSB7XG4gICAgICAgIHRyYXZlcnNlRmFzdChub2RlLCBlbnRlciwgb3B0cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYXZlcnNlRmFzdChzdWJOb2RlLCBlbnRlciwgb3B0cyk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ09NTUVOVF9LRVlTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5jb25zdCBDTEVBUl9LRVlTID0gW1xuICBcInRva2Vuc1wiLCAvLyBvbmx5IGV4aXN0IGluIHQuRmlsZVxuICBcInN0YXJ0XCIsXG4gIFwiZW5kXCIsXG4gIFwibG9jXCIsXG4gIC8vIEZpeG1lOiBzaG91bGQgYmUgZXh0cmEucmF3IC8gZXh0cmEucmF3VmFsdWU/XG4gIFwicmF3XCIsXG4gIFwicmF3VmFsdWVcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IENMRUFSX0tFWVNfUExVU19DT01NRU5UUyA9IFtcbiAgLi4uQ09NTUVOVF9LRVlTLFxuICBcImNvbW1lbnRzXCIsXG4gIC4uLkNMRUFSX0tFWVMsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBPcHRpb25zID0geyBwcmVzZXJ2ZUNvbW1lbnRzPzogYm9vbGVhbiB9O1xuLyoqXG4gKiBSZW1vdmUgYWxsIG9mIHRoZSBfKiBwcm9wZXJ0aWVzIGZyb20gYSBub2RlIGFsb25nIHdpdGggdGhlIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAqIHByb3BlcnRpZXMgbGlrZSBsb2NhdGlvbiBkYXRhIGFuZCByYXcgdG9rZW4gZGF0YS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydGllcyhcbiAgbm9kZTogdC5Ob2RlLFxuICBvcHRzOiBPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3QgbWFwID0gb3B0cy5wcmVzZXJ2ZUNvbW1lbnRzID8gQ0xFQVJfS0VZUyA6IENMRUFSX0tFWVNfUExVU19DT01NRU5UUztcbiAgZm9yIChjb25zdCBrZXkgb2YgbWFwKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2tlbnMgb25seSBleGlzdCBpbiB0LkZpbGVcbiAgICBpZiAobm9kZVtrZXldICE9IG51bGwpIG5vZGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdHJpbmcgY2FuIG5vdCBpbmRleCBub2RlXG4gICAgaWYgKGtleVswXSA9PT0gXCJfXCIgJiYgbm9kZVtrZXldICE9IG51bGwpIG5vZGVba2V5XSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHM6IEFycmF5PHN5bWJvbD4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG5vZGUpO1xuICBmb3IgKGNvbnN0IHN5bSBvZiBzeW1ib2xzKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZTogZG9jdW1lbnQgc3ltYm9sIHByb3BlcnRpZXNcbiAgICBub2RlW3N5bV0gPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHRyYXZlcnNlRmFzdCBmcm9tIFwiLi4vdHJhdmVyc2UvdHJhdmVyc2VGYXN0XCI7XG5pbXBvcnQgcmVtb3ZlUHJvcGVydGllcyBmcm9tIFwiLi9yZW1vdmVQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXNEZWVwPFQgZXh0ZW5kcyB0Lk5vZGU+KFxuICB0cmVlOiBULFxuICBvcHRzPzogeyBwcmVzZXJ2ZUNvbW1lbnRzOiBib29sZWFuIH0gfCBudWxsLFxuKTogVCB7XG4gIHRyYXZlcnNlRmFzdCh0cmVlLCByZW1vdmVQcm9wZXJ0aWVzLCBvcHRzKTtcblxuICByZXR1cm4gdHJlZTtcbn1cbiIsICJpbXBvcnQgeyBpc0lkZW50aWZpZXIsIGlzU3RyaW5nTGl0ZXJhbCB9IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5pbXBvcnQgcmVtb3ZlUHJvcGVydGllc0RlZXAgZnJvbSBcIi4uL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXBcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9LZXlBbGlhcyhcbiAgbm9kZTogdC5NZXRob2QgfCB0LlByb3BlcnR5LFxuICBrZXk6IHQuTm9kZSA9IG5vZGUua2V5LFxuKTogc3RyaW5nIHtcbiAgbGV0IGFsaWFzO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IG1heWJlIGFkZCBub2RlIHR5cGUgY2hlY2sgYmVmb3JlIGNoZWNraW5nIGAua2luZGBcbiAgaWYgKG5vZGUua2luZCA9PT0gXCJtZXRob2RcIikge1xuICAgIHJldHVybiB0b0tleUFsaWFzLmluY3JlbWVudCgpICsgXCJcIjtcbiAgfSBlbHNlIGlmIChpc0lkZW50aWZpZXIoa2V5KSkge1xuICAgIGFsaWFzID0ga2V5Lm5hbWU7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdMaXRlcmFsKGtleSkpIHtcbiAgICBhbGlhcyA9IEpTT04uc3RyaW5naWZ5KGtleS52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgYWxpYXMgPSBKU09OLnN0cmluZ2lmeShyZW1vdmVQcm9wZXJ0aWVzRGVlcChjbG9uZU5vZGUoa2V5KSkpO1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogbWF5YmUgYWRkIG5vZGUgdHlwZSBjaGVjayBiZWZvcmUgY2hlY2tpbmcgYC5jb21wdXRlZGBcbiAgaWYgKG5vZGUuY29tcHV0ZWQpIHtcbiAgICBhbGlhcyA9IGBbJHthbGlhc31dYDtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdG9kbyhmbG93LT50cyk6IG1heWJlIGFkZCBub2RlIHR5cGUgY2hlY2sgYmVmb3JlIGNoZWNraW5nIGAuc3RhdGljYFxuICBpZiAobm9kZS5zdGF0aWMpIHtcbiAgICBhbGlhcyA9IGBzdGF0aWM6JHthbGlhc31gO1xuICB9XG5cbiAgcmV0dXJuIGFsaWFzO1xufVxuXG50b0tleUFsaWFzLnVpZCA9IDA7XG5cbnRvS2V5QWxpYXMuaW5jcmVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodG9LZXlBbGlhcy51aWQgPj0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICByZXR1cm4gKHRvS2V5QWxpYXMudWlkID0gMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvS2V5QWxpYXMudWlkKys7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtcbiAgaXNFeHBvcnREZWNsYXJhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxuICBpc0RlY2xhcmF0aW9uLFxuICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25FeHByZXNzaW9uLFxuICBpc0V4cG9ydEFsbERlY2xhcmF0aW9uLFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IHsgZ2V0QmluZGluZ0lkZW50aWZpZXJzIGFzIGRlZmF1bHQgfTtcblxuZnVuY3Rpb24gZ2V0QmluZGluZ0lkZW50aWZpZXJzKFxuICBub2RlOiB0Lk5vZGUsXG4gIGR1cGxpY2F0ZXM6IHRydWUsXG4gIG91dGVyT25seT86IGJvb2xlYW4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcblxuZnVuY3Rpb24gZ2V0QmluZGluZ0lkZW50aWZpZXJzKFxuICBub2RlOiB0Lk5vZGUsXG4gIGR1cGxpY2F0ZXM/OiBmYWxzZSxcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj47XG5cbmZ1bmN0aW9uIGdldEJpbmRpbmdJZGVudGlmaWVycyhcbiAgbm9kZTogdC5Ob2RlLFxuICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcblxuLyoqXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGJpbmRpbmcgaWRlbnRpZmllcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBgbm9kZWAuXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdJZGVudGlmaWVycyhcbiAgbm9kZTogdC5Ob2RlLFxuICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgb3V0ZXJPbmx5PzogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PiB7XG4gIGNvbnN0IHNlYXJjaDogdC5Ob2RlW10gPSBbXS5jb25jYXQobm9kZSk7XG4gIGNvbnN0IGlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgd2hpbGUgKHNlYXJjaC5sZW5ndGgpIHtcbiAgICBjb25zdCBpZCA9IHNlYXJjaC5zaGlmdCgpO1xuICAgIGlmICghaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5cyA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGdldEJpbmRpbmdJZGVudGlmaWVycy5rZXlzIGRvIG5vdCBjb3ZlciBhbGwgQVNUIHR5cGVzXG4gICAgICBnZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5c1tpZC50eXBlXTtcblxuICAgIGlmIChpc0lkZW50aWZpZXIoaWQpKSB7XG4gICAgICBpZiAoZHVwbGljYXRlcykge1xuICAgICAgICBjb25zdCBfaWRzID0gKGlkc1tpZC5uYW1lXSA9IGlkc1tpZC5uYW1lXSB8fCBbXSk7XG4gICAgICAgIF9pZHMucHVzaChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZHNbaWQubmFtZV0gPSBpZDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc0V4cG9ydERlY2xhcmF0aW9uKGlkKSAmJiAhaXNFeHBvcnRBbGxEZWNsYXJhdGlvbihpZCkpIHtcbiAgICAgIGlmIChpc0RlY2xhcmF0aW9uKGlkLmRlY2xhcmF0aW9uKSkge1xuICAgICAgICBzZWFyY2gucHVzaChpZC5kZWNsYXJhdGlvbik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3V0ZXJPbmx5KSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbkRlY2xhcmF0aW9uKGlkKSkge1xuICAgICAgICBzZWFyY2gucHVzaChpZC5pZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW5jdGlvbkV4cHJlc3Npb24oaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXlzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPVxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiBpZFxuICAgICAgICAgIGlkW2tleV0gYXMgdC5Ob2RlW10gfCB0Lk5vZGUgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgICAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgICBBcnJheS5pc0FycmF5KG5vZGVzKSA/IHNlYXJjaC5wdXNoKC4uLm5vZGVzKSA6IHNlYXJjaC5wdXNoKG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vICRGbG93SXNzdWUgT2JqZWN0LmNyZWF0ZSgpIHNlZW1zIGJyb2tlblxuICByZXR1cm4gaWRzO1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgdHlwZXMgdG8gdGhlaXIgaWRlbnRpZmllciBrZXlzLlxuICovXG5nZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5cyA9IHtcbiAgRGVjbGFyZUNsYXNzOiBbXCJpZFwiXSxcbiAgRGVjbGFyZUZ1bmN0aW9uOiBbXCJpZFwiXSxcbiAgRGVjbGFyZU1vZHVsZTogW1wiaWRcIl0sXG4gIERlY2xhcmVWYXJpYWJsZTogW1wiaWRcIl0sXG4gIERlY2xhcmVJbnRlcmZhY2U6IFtcImlkXCJdLFxuICBEZWNsYXJlVHlwZUFsaWFzOiBbXCJpZFwiXSxcbiAgRGVjbGFyZU9wYXF1ZVR5cGU6IFtcImlkXCJdLFxuICBJbnRlcmZhY2VEZWNsYXJhdGlvbjogW1wiaWRcIl0sXG4gIFR5cGVBbGlhczogW1wiaWRcIl0sXG4gIE9wYXF1ZVR5cGU6IFtcImlkXCJdLFxuXG4gIENhdGNoQ2xhdXNlOiBbXCJwYXJhbVwiXSxcbiAgTGFiZWxlZFN0YXRlbWVudDogW1wibGFiZWxcIl0sXG4gIFVuYXJ5RXhwcmVzc2lvbjogW1wiYXJndW1lbnRcIl0sXG4gIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBbXCJsZWZ0XCJdLFxuXG4gIEltcG9ydFNwZWNpZmllcjogW1wibG9jYWxcIl0sXG4gIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogW1wibG9jYWxcIl0sXG4gIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IFtcImxvY2FsXCJdLFxuICBJbXBvcnREZWNsYXJhdGlvbjogW1wic3BlY2lmaWVyc1wiXSxcblxuICBFeHBvcnRTcGVjaWZpZXI6IFtcImV4cG9ydGVkXCJdLFxuICBFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IFtcImV4cG9ydGVkXCJdLFxuICBFeHBvcnREZWZhdWx0U3BlY2lmaWVyOiBbXCJleHBvcnRlZFwiXSxcblxuICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBbXCJpZFwiLCBcInBhcmFtc1wiXSxcbiAgRnVuY3Rpb25FeHByZXNzaW9uOiBbXCJpZFwiLCBcInBhcmFtc1wiXSxcbiAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFtcInBhcmFtc1wiXSxcbiAgT2JqZWN0TWV0aG9kOiBbXCJwYXJhbXNcIl0sXG4gIENsYXNzTWV0aG9kOiBbXCJwYXJhbXNcIl0sXG4gIENsYXNzUHJpdmF0ZU1ldGhvZDogW1wicGFyYW1zXCJdLFxuXG4gIEZvckluU3RhdGVtZW50OiBbXCJsZWZ0XCJdLFxuICBGb3JPZlN0YXRlbWVudDogW1wibGVmdFwiXSxcblxuICBDbGFzc0RlY2xhcmF0aW9uOiBbXCJpZFwiXSxcbiAgQ2xhc3NFeHByZXNzaW9uOiBbXCJpZFwiXSxcblxuICBSZXN0RWxlbWVudDogW1wiYXJndW1lbnRcIl0sXG4gIFVwZGF0ZUV4cHJlc3Npb246IFtcImFyZ3VtZW50XCJdLFxuXG4gIE9iamVjdFByb3BlcnR5OiBbXCJ2YWx1ZVwiXSxcblxuICBBc3NpZ25tZW50UGF0dGVybjogW1wibGVmdFwiXSxcbiAgQXJyYXlQYXR0ZXJuOiBbXCJlbGVtZW50c1wiXSxcbiAgT2JqZWN0UGF0dGVybjogW1wicHJvcGVydGllc1wiXSxcblxuICBWYXJpYWJsZURlY2xhcmF0aW9uOiBbXCJkZWNsYXJhdGlvbnNcIl0sXG4gIFZhcmlhYmxlRGVjbGFyYXRvcjogW1wiaWRcIl0sXG59O1xuIiwgImltcG9ydCBnZXRCaW5kaW5nSWRlbnRpZmllcnMgZnJvbSBcIi4uL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzXCI7XG5pbXBvcnQge1xuICBpc0V4cHJlc3Npb24sXG4gIGlzRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgaXNWYXJpYWJsZURlY2xhcmF0aW9uLFxuICBpc0lmU3RhdGVtZW50LFxuICBpc0Jsb2NrU3RhdGVtZW50LFxuICBpc0VtcHR5U3RhdGVtZW50LFxufSBmcm9tIFwiLi4vdmFsaWRhdG9ycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIHNlcXVlbmNlRXhwcmVzc2lvbixcbiAgYXNzaWdubWVudEV4cHJlc3Npb24sXG4gIGNvbmRpdGlvbmFsRXhwcmVzc2lvbixcbn0gZnJvbSBcIi4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IGNsb25lTm9kZSBmcm9tIFwiLi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IFNjb3BlIH0gZnJvbSBcIkBiYWJlbC90cmF2ZXJzZVwiO1xuXG5leHBvcnQgdHlwZSBEZWNsYXJhdGlvbkluZm8gPSB7XG4gIGtpbmQ6IHQuVmFyaWFibGVEZWNsYXJhdGlvbltcImtpbmRcIl07XG4gIGlkOiB0LklkZW50aWZpZXI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKFxuICBub2RlczogUmVhZG9ubHlBcnJheTx0Lk5vZGU+LFxuICBzY29wZTogU2NvcGUsXG4gIGRlY2xhcnM6IEFycmF5PERlY2xhcmF0aW9uSW5mbz4sXG4pIHtcbiAgY29uc3QgZXhwcnM6IHQuRXhwcmVzc2lvbltdID0gW107XG4gIGxldCBlbnN1cmVMYXN0VW5kZWZpbmVkID0gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgZW1wdHlTdGF0ZW1lbnQgYmVmb3JlIGEgbm9uLWVtcHR5U3RhdGVtZW50XG4gICAgLy8gd2Ugd2FudCB0byBkaXNyZWdhcmQgdGhhdFxuICAgIGlmICghaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgICAgZW5zdXJlTGFzdFVuZGVmaW5lZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgIGV4cHJzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgIGV4cHJzLnB1c2gobm9kZS5leHByZXNzaW9uKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUua2luZCAhPT0gXCJ2YXJcIikgcmV0dXJuOyAvLyBiYWlsZWRcblxuICAgICAgZm9yIChjb25zdCBkZWNsYXIgb2Ygbm9kZS5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBnZXRCaW5kaW5nSWRlbnRpZmllcnMoZGVjbGFyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYmluZGluZ3MpKSB7XG4gICAgICAgICAgZGVjbGFycy5wdXNoKHtcbiAgICAgICAgICAgIGtpbmQ6IG5vZGUua2luZCxcbiAgICAgICAgICAgIGlkOiBjbG9uZU5vZGUoYmluZGluZ3Nba2V5XSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVjbGFyLmluaXQpIHtcbiAgICAgICAgICBleHBycy5wdXNoKGFzc2lnbm1lbnRFeHByZXNzaW9uKFwiPVwiLCBkZWNsYXIuaWQsIGRlY2xhci5pbml0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5zdXJlTGFzdFVuZGVmaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChpc0lmU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBjb25zZXF1ZW50ID0gbm9kZS5jb25zZXF1ZW50XG4gICAgICAgID8gZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucyhbbm9kZS5jb25zZXF1ZW50XSwgc2NvcGUsIGRlY2xhcnMpXG4gICAgICAgIDogc2NvcGUuYnVpbGRVbmRlZmluZWROb2RlKCk7XG4gICAgICBjb25zdCBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZVxuICAgICAgICA/IGdhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnMoW25vZGUuYWx0ZXJuYXRlXSwgc2NvcGUsIGRlY2xhcnMpXG4gICAgICAgIDogc2NvcGUuYnVpbGRVbmRlZmluZWROb2RlKCk7XG4gICAgICBpZiAoIWNvbnNlcXVlbnQgfHwgIWFsdGVybmF0ZSkgcmV0dXJuOyAvLyBiYWlsZWRcblxuICAgICAgZXhwcnMucHVzaChjb25kaXRpb25hbEV4cHJlc3Npb24obm9kZS50ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvY2tTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKG5vZGUuYm9keSwgc2NvcGUsIGRlY2xhcnMpO1xuICAgICAgaWYgKCFib2R5KSByZXR1cm47IC8vIGJhaWxlZFxuXG4gICAgICBleHBycy5wdXNoKGJvZHkpO1xuICAgIH0gZWxzZSBpZiAoaXNFbXB0eVN0YXRlbWVudChub2RlKSkge1xuICAgICAgLy8gZW1wdHkgc3RhdGVtZW50IHNvIGVuc3VyZSB0aGUgbGFzdCBpdGVtIGlzIHVuZGVmaW5lZCBpZiB3ZSdyZSBsYXN0XG4gICAgICAvLyBjaGVja3MgaWYgZW1wdHlTdGF0ZW1lbnQgaXMgZmlyc3RcbiAgICAgIGlmIChub2Rlcy5pbmRleE9mKG5vZGUpID09PSAwKSB7XG4gICAgICAgIGVuc3VyZUxhc3RVbmRlZmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBiYWlsZWQsIHdlIGNhbid0IHR1cm4gdGhpcyBzdGF0ZW1lbnQgaW50byBhbiBleHByZXNzaW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuc3VyZUxhc3RVbmRlZmluZWQpIHtcbiAgICBleHBycy5wdXNoKHNjb3BlLmJ1aWxkVW5kZWZpbmVkTm9kZSgpKTtcbiAgfVxuXG4gIGlmIChleHBycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZXhwcnNbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlRXhwcmVzc2lvbihleHBycyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgZ2F0aGVyU2VxdWVuY2VFeHByZXNzaW9ucyBmcm9tIFwiLi9nYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IERlY2xhcmF0aW9uSW5mbyB9IGZyb20gXCIuL2dhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnNcIjtcblxuLyoqXG4gKiBUdXJuIGFuIGFycmF5IG9mIHN0YXRlbWVudCBgbm9kZXNgIGludG8gYSBgU2VxdWVuY2VFeHByZXNzaW9uYC5cbiAqXG4gKiBWYXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIHR1cm5lZCBpbnRvIHNpbXBsZSBhc3NpZ25tZW50cyBhbmQgdGhlaXJcbiAqIGRlY2xhcmF0aW9ucyBob2lzdGVkIHRvIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgc2NvcGUuXG4gKlxuICogRXhwcmVzc2lvbiBzdGF0ZW1lbnRzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvU2VxdWVuY2VFeHByZXNzaW9uKFxuICBub2RlczogUmVhZG9ubHlBcnJheTx0Lk5vZGU+LFxuICBzY29wZTogYW55LFxuKTogdC5TZXF1ZW5jZUV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGVzPy5sZW5ndGgpIHJldHVybjtcblxuICBjb25zdCBkZWNsYXJzOiBEZWNsYXJhdGlvbkluZm9bXSA9IFtdO1xuICBjb25zdCByZXN1bHQgPSBnYXRoZXJTZXF1ZW5jZUV4cHJlc3Npb25zKG5vZGVzLCBzY29wZSwgZGVjbGFycyk7XG4gIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBkZWNsYXIgb2YgZGVjbGFycykge1xuICAgIHNjb3BlLnB1c2goZGVjbGFyKTtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4bWU6IGdhdGhlclNlcXVlbmNlRXhwcmVzc2lvbnMgd2lsbCByZXR1cm4gYW4gRXhwcmVzc2lvbiB3aGVuIHRoZXJlIGFyZSBvbmx5IG9uZSBlbGVtZW50XG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNTdGF0ZW1lbnQsXG4gIGlzRnVuY3Rpb24sXG4gIGlzQ2xhc3MsXG4gIGlzQXNzaWdubWVudEV4cHJlc3Npb24sXG59IGZyb20gXCIuLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZXhwcmVzc2lvblN0YXRlbWVudCB9IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdG9TdGF0ZW1lbnQgYXMge1xuICAobm9kZTogdC5Bc3NpZ25tZW50RXhwcmVzc2lvbiwgaWdub3JlPzogYm9vbGVhbik6IHQuRXhwcmVzc2lvblN0YXRlbWVudDtcblxuICA8VCBleHRlbmRzIHQuU3RhdGVtZW50Pihub2RlOiBULCBpZ25vcmU6IGZhbHNlKTogVDtcbiAgPFQgZXh0ZW5kcyB0LlN0YXRlbWVudD4obm9kZTogVCwgaWdub3JlPzogYm9vbGVhbik6IFQgfCBmYWxzZTtcblxuICAobm9kZTogdC5DbGFzcywgaWdub3JlOiBmYWxzZSk6IHQuQ2xhc3NEZWNsYXJhdGlvbjtcbiAgKG5vZGU6IHQuQ2xhc3MsIGlnbm9yZT86IGJvb2xlYW4pOiB0LkNsYXNzRGVjbGFyYXRpb24gfCBmYWxzZTtcblxuICAobm9kZTogdC5GdW5jdGlvbiwgaWdub3JlOiBmYWxzZSk6IHQuRnVuY3Rpb25EZWNsYXJhdGlvbjtcbiAgKG5vZGU6IHQuRnVuY3Rpb24sIGlnbm9yZT86IGJvb2xlYW4pOiB0LkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBmYWxzZTtcblxuICAobm9kZTogdC5Ob2RlLCBpZ25vcmU6IGZhbHNlKTogdC5TdGF0ZW1lbnQ7XG4gIChub2RlOiB0Lk5vZGUsIGlnbm9yZT86IGJvb2xlYW4pOiB0LlN0YXRlbWVudCB8IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gdG9TdGF0ZW1lbnQobm9kZTogdC5Ob2RlLCBpZ25vcmU/OiBib29sZWFuKTogdC5TdGF0ZW1lbnQgfCBmYWxzZSB7XG4gIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgbGV0IG11c3RIYXZlSWQgPSBmYWxzZTtcbiAgbGV0IG5ld1R5cGU7XG5cbiAgaWYgKGlzQ2xhc3Mobm9kZSkpIHtcbiAgICBtdXN0SGF2ZUlkID0gdHJ1ZTtcbiAgICBuZXdUeXBlID0gXCJDbGFzc0RlY2xhcmF0aW9uXCIgYXMgY29uc3Q7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihub2RlKSkge1xuICAgIG11c3RIYXZlSWQgPSB0cnVlO1xuICAgIG5ld1R5cGUgPSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiBhcyBjb25zdDtcbiAgfSBlbHNlIGlmIChpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvZG8oZmxvdy0+dHMpOiBub2RlLmlkIG1pZ2h0IGJlIG1pc3NpbmdcbiAgaWYgKG11c3RIYXZlSWQgJiYgIW5vZGUuaWQpIHtcbiAgICBuZXdUeXBlID0gZmFsc2UgYXMgZmFsc2U7XG4gIH1cblxuICBpZiAoIW5ld1R5cGUpIHtcbiAgICBpZiAoaWdub3JlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IHR1cm4gJHtub2RlLnR5cGV9IHRvIGEgc3RhdGVtZW50YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBtYW5pcHVsYXRpbmcgbm9kZS50eXBlXG4gIG5vZGUudHlwZSA9IG5ld1R5cGU7XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKSByZWZhY3RvciB0byBhdm9pZCB0eXBlIHVuc2FmZSBtdXRhdGlvbnMgbGlrZSByZWFzc2lnbmluZyBub2RlIHR5cGUgYWJvdmVcbiAgcmV0dXJuIG5vZGU7XG59XG4iLCAiaW1wb3J0IGlzVmFsaWRJZGVudGlmaWVyIGZyb20gXCIuLi92YWxpZGF0b3JzL2lzVmFsaWRJZGVudGlmaWVyXCI7XG5pbXBvcnQge1xuICBpZGVudGlmaWVyLFxuICBib29sZWFuTGl0ZXJhbCxcbiAgbnVsbExpdGVyYWwsXG4gIHN0cmluZ0xpdGVyYWwsXG4gIG51bWVyaWNMaXRlcmFsLFxuICByZWdFeHBMaXRlcmFsLFxuICBhcnJheUV4cHJlc3Npb24sXG4gIG9iamVjdFByb3BlcnR5LFxuICBvYmplY3RFeHByZXNzaW9uLFxuICB1bmFyeUV4cHJlc3Npb24sXG4gIGJpbmFyeUV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGRlZmF1bHQgdmFsdWVUb05vZGUgYXMge1xuICAodmFsdWU6IHVuZGVmaW5lZCk6IHQuSWRlbnRpZmllcjsgLy8gVE9ETzogVGhpcyBzaG91bGQgcmV0dXJuIFwidm9pZCAwXCJcbiAgKHZhbHVlOiBib29sZWFuKTogdC5Cb29sZWFuTGl0ZXJhbDtcbiAgKHZhbHVlOiBudWxsKTogdC5OdWxsTGl0ZXJhbDtcbiAgKHZhbHVlOiBzdHJpbmcpOiB0LlN0cmluZ0xpdGVyYWw7XG4gIC8vIEluZmluaXRpZXMgYW5kIE5hTiBuZWVkIHRvIHVzZSBhIEJpbmFyeUV4cHJlc3Npb247IG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHdyYXBwZWQgaW4gVW5hcnlFeHByZXNzaW9uXG4gICh2YWx1ZTogbnVtYmVyKTogdC5OdW1lcmljTGl0ZXJhbCB8IHQuQmluYXJ5RXhwcmVzc2lvbiB8IHQuVW5hcnlFeHByZXNzaW9uO1xuICAodmFsdWU6IFJlZ0V4cCk6IHQuUmVnRXhwTGl0ZXJhbDtcbiAgKHZhbHVlOiBSZWFkb25seUFycmF5PHVua25vd24+KTogdC5BcnJheUV4cHJlc3Npb247XG5cbiAgLy8gdGhpcyB0aHJvd3Mgd2l0aCBvYmplY3RzIHRoYXQgYXJlIG5vdCBwbGFpbiBvYmplY3RzLFxuICAvLyBvciBpZiB0aGVyZSBhcmUgbm9uLXZhbHVlVG9Ob2RlLWFibGUgdmFsdWVzXG4gICh2YWx1ZTogb2JqZWN0KTogdC5PYmplY3RFeHByZXNzaW9uO1xuXG4gICh2YWx1ZTogdW5rbm93bik6IHQuRXhwcmVzc2lvbjtcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3I6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgbXVzdCByZXR1cm4gYSBzdHJpbmdcbmNvbnN0IG9iamVjdFRvU3RyaW5nOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyA9IEZ1bmN0aW9uLmNhbGwuYmluZChcbiAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcbik7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVnRXhwIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHZhbHVlKSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgLy8gT2JqZWN0LnByb3RvdHlwZSdzIF9fcHJvdG9fXyBpcyBudWxsLiBFdmVyeSBvdGhlciBjbGFzcydzIF9fcHJvdG9fXy5fX3Byb3RvX18gaXNcbiAgLy8gbm90IG51bGwgYnkgZGVmYXVsdC4gV2UgY2Fubm90IGNoZWNrIGlmIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIGJlY2F1c2UgaXRcbiAgLy8gY291bGQgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0uXG4gIHJldHVybiBwcm90byA9PT0gbnVsbCB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVRvTm9kZSh2YWx1ZTogdW5rbm93bik6IHQuRXhwcmVzc2lvbiB7XG4gIC8vIHVuZGVmaW5lZFxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBpZGVudGlmaWVyKFwidW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgLy8gYm9vbGVhblxuICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJvb2xlYW5MaXRlcmFsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIG51bGxcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxMaXRlcmFsKCk7XG4gIH1cblxuICAvLyBzdHJpbmdzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBudW1iZXJzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSBudW1lcmljTGl0ZXJhbChNYXRoLmFicyh2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbnVtZXJhdG9yO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgLy8gTmFOXG4gICAgICAgIG51bWVyYXRvciA9IG51bWVyaWNMaXRlcmFsKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5maW5pdHkgLyAtSW5maW5pdHlcbiAgICAgICAgbnVtZXJhdG9yID0gbnVtZXJpY0xpdGVyYWwoMSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGJpbmFyeUV4cHJlc3Npb24oXCIvXCIsIG51bWVyYXRvciwgbnVtZXJpY0xpdGVyYWwoMCkpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA8IDAgfHwgT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICAgIHJlc3VsdCA9IHVuYXJ5RXhwcmVzc2lvbihcIi1cIiwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gcmVnZXhlc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IHZhbHVlLnNvdXJjZTtcbiAgICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL1xcLyhbYS16XSt8KSQvKVsxXTtcbiAgICByZXR1cm4gcmVnRXhwTGl0ZXJhbChwYXR0ZXJuLCBmbGFncyk7XG4gIH1cblxuICAvLyBhcnJheVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYXJyYXlFeHByZXNzaW9uKHZhbHVlLm1hcCh2YWx1ZVRvTm9kZSkpO1xuICB9XG5cbiAgLy8gb2JqZWN0XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGNvbnN0IHByb3BzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBsZXQgbm9kZUtleTtcbiAgICAgIGlmIChpc1ZhbGlkSWRlbnRpZmllcihrZXkpKSB7XG4gICAgICAgIG5vZGVLZXkgPSBpZGVudGlmaWVyKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlS2V5ID0gc3RyaW5nTGl0ZXJhbChrZXkpO1xuICAgICAgfVxuICAgICAgcHJvcHMucHVzaChcbiAgICAgICAgb2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgbm9kZUtleSxcbiAgICAgICAgICB2YWx1ZVRvTm9kZShcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiB2YWx1ZVxuICAgICAgICAgICAgdmFsdWVba2V5XSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdEV4cHJlc3Npb24ocHJvcHMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiZG9uJ3Qga25vdyBob3cgdG8gdHVybiB0aGlzIHZhbHVlIGludG8gYSBub2RlXCIpO1xufVxuIiwgImltcG9ydCB7IG1lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi4vYnVpbGRlcnMvZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQXBwZW5kIGEgbm9kZSB0byBhIG1lbWJlciBleHByZXNzaW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcHBlbmRUb01lbWJlckV4cHJlc3Npb24oXG4gIG1lbWJlcjogdC5NZW1iZXJFeHByZXNzaW9uLFxuICBhcHBlbmQ6IHQuTWVtYmVyRXhwcmVzc2lvbltcInByb3BlcnR5XCJdLFxuICBjb21wdXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdC5NZW1iZXJFeHByZXNzaW9uIHtcbiAgbWVtYmVyLm9iamVjdCA9IG1lbWJlckV4cHJlc3Npb24oXG4gICAgbWVtYmVyLm9iamVjdCxcbiAgICBtZW1iZXIucHJvcGVydHksXG4gICAgbWVtYmVyLmNvbXB1dGVkLFxuICApO1xuICBtZW1iZXIucHJvcGVydHkgPSBhcHBlbmQ7XG4gIG1lbWJlci5jb21wdXRlZCA9ICEhY29tcHV0ZWQ7XG5cbiAgcmV0dXJuIG1lbWJlcjtcbn1cbiIsICJpbXBvcnQgeyBJTkhFUklUX0tFWVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgaW5oZXJpdHNDb21tZW50cyBmcm9tIFwiLi4vY29tbWVudHMvaW5oZXJpdHNDb21tZW50c1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIEluaGVyaXQgYWxsIGNvbnRleHR1YWwgcHJvcGVydGllcyBmcm9tIGBwYXJlbnRgIG5vZGUgdG8gYGNoaWxkYCBub2RlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmhlcml0czxUIGV4dGVuZHMgdC5Ob2RlIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gIGNoaWxkOiBULFxuICBwYXJlbnQ6IHQuTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBUIHtcbiAgaWYgKCFjaGlsZCB8fCAhcGFyZW50KSByZXR1cm4gY2hpbGQ7XG5cbiAgLy8gb3B0aW9uYWxseSBpbmhlcml0IHNwZWNpZmljIHByb3BlcnRpZXMgaWYgbm90IG51bGxcbiAgZm9yIChjb25zdCBrZXkgb2YgSU5IRVJJVF9LRVlTLm9wdGlvbmFsKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXhtZTogcmVmaW5lIHBhcmVudCB0eXBlc1xuICAgIGlmIChjaGlsZFtrZXldID09IG51bGwpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICAgIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3JjZSBpbmhlcml0IFwicHJpdmF0ZVwiIHByb3BlcnRpZXNcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyZW50KSkge1xuICAgIGlmIChrZXlbMF0gPT09IFwiX1wiICYmIGtleSAhPT0gXCJfX2Nsb25lXCIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICAgIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBmb3JjZSBpbmhlcml0IHNlbGVjdCBwcm9wZXJ0aWVzXG4gIGZvciAoY29uc3Qga2V5IG9mIElOSEVSSVRfS0VZUy5mb3JjZSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4bWU6IHJlZmluZSBwYXJlbnQgdHlwZXNcbiAgICBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gIH1cblxuICBpbmhlcml0c0NvbW1lbnRzKGNoaWxkLCBwYXJlbnQpO1xuXG4gIHJldHVybiBjaGlsZDtcbn1cbiIsICJpbXBvcnQgeyBtZW1iZXJFeHByZXNzaW9uIH0gZnJvbSBcIi4uL2J1aWxkZXJzL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgaXNTdXBlciB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIFByZXBlbmQgYSBub2RlIHRvIGEgbWVtYmVyIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByZXBlbmRUb01lbWJlckV4cHJlc3Npb248XG4gIFQgZXh0ZW5kcyBQaWNrPHQuTWVtYmVyRXhwcmVzc2lvbiwgXCJvYmplY3RcIiB8IFwicHJvcGVydHlcIj4sXG4+KG1lbWJlcjogVCwgcHJlcGVuZDogdC5NZW1iZXJFeHByZXNzaW9uW1wib2JqZWN0XCJdKTogVCB7XG4gIGlmIChpc1N1cGVyKG1lbWJlci5vYmplY3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJDYW5ub3QgcHJlcGVuZCBub2RlIHRvIHN1cGVyIHByb3BlcnR5IGFjY2VzcyAoYHN1cGVyLmZvb2ApLlwiLFxuICAgICk7XG4gIH1cbiAgbWVtYmVyLm9iamVjdCA9IG1lbWJlckV4cHJlc3Npb24ocHJlcGVuZCwgbWVtYmVyLm9iamVjdCk7XG5cbiAgcmV0dXJuIG1lbWJlcjtcbn1cbiIsICJpbXBvcnQgZ2V0QmluZGluZ0lkZW50aWZpZXJzIGZyb20gXCIuL2dldEJpbmRpbmdJZGVudGlmaWVyc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgZGVmYXVsdCBnZXRPdXRlckJpbmRpbmdJZGVudGlmaWVycyBhcyB7XG4gIChub2RlOiB0Lk5vZGUsIGR1cGxpY2F0ZXM6IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PjtcbiAgKG5vZGU6IHQuTm9kZSwgZHVwbGljYXRlcz86IGZhbHNlKTogUmVjb3JkPHN0cmluZywgdC5JZGVudGlmaWVyPjtcbiAgKFxuICAgIG5vZGU6IHQuTm9kZSxcbiAgICBkdXBsaWNhdGVzPzogYm9vbGVhbixcbiAgKTogUmVjb3JkPHN0cmluZywgdC5JZGVudGlmaWVyPiB8IFJlY29yZDxzdHJpbmcsIEFycmF5PHQuSWRlbnRpZmllcj4+O1xufTtcblxuZnVuY3Rpb24gZ2V0T3V0ZXJCaW5kaW5nSWRlbnRpZmllcnMoXG4gIG5vZGU6IHQuTm9kZSxcbiAgZHVwbGljYXRlczogYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIHQuSWRlbnRpZmllcj4gfCBSZWNvcmQ8c3RyaW5nLCBBcnJheTx0LklkZW50aWZpZXI+PiB7XG4gIHJldHVybiBnZXRCaW5kaW5nSWRlbnRpZmllcnMobm9kZSwgZHVwbGljYXRlcywgdHJ1ZSk7XG59XG4iLCAiaW1wb3J0IHsgVklTSVRPUl9LRVlTIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCB0eXBlIFRyYXZlcnNhbEFuY2VzdG9ycyA9IEFycmF5PHtcbiAgbm9kZTogdC5Ob2RlO1xuICBrZXk6IHN0cmluZztcbiAgaW5kZXg/OiBudW1iZXI7XG59PjtcblxuZXhwb3J0IHR5cGUgVHJhdmVyc2FsSGFuZGxlcjxUPiA9IChcbiAgdGhpczogdW5kZWZpbmVkLFxuICBub2RlOiB0Lk5vZGUsXG4gIHBhcmVudDogVHJhdmVyc2FsQW5jZXN0b3JzLFxuICBzdGF0ZTogVCxcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVHJhdmVyc2FsSGFuZGxlcnM8VD4gPSB7XG4gIGVudGVyPzogVHJhdmVyc2FsSGFuZGxlcjxUPjtcbiAgZXhpdD86IFRyYXZlcnNhbEhhbmRsZXI8VD47XG59O1xuXG4vKipcbiAqIEEgZ2VuZXJhbCBBU1QgdHJhdmVyc2FsIHdpdGggYm90aCBwcmVmaXggYW5kIHBvc3RmaXggaGFuZGxlcnMsIGFuZCBhXG4gKiBzdGF0ZSBvYmplY3QuIEV4cG9zZXMgYW5jZXN0cnkgZGF0YSB0byBlYWNoIGhhbmRsZXIgc28gdGhhdCBtb3JlIGNvbXBsZXhcbiAqIEFTVCBkYXRhIGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYXZlcnNlPFQ+KFxuICBub2RlOiB0Lk5vZGUsXG4gIGhhbmRsZXJzOiBUcmF2ZXJzYWxIYW5kbGVyPFQ+IHwgVHJhdmVyc2FsSGFuZGxlcnM8VD4sXG4gIHN0YXRlPzogVCxcbik6IHZvaWQge1xuICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBoYW5kbGVycyA9IHsgZW50ZXI6IGhhbmRsZXJzIH07XG4gIH1cblxuICBjb25zdCB7IGVudGVyLCBleGl0IH0gPSBoYW5kbGVycztcblxuICB0cmF2ZXJzZVNpbXBsZUltcGwobm9kZSwgZW50ZXIsIGV4aXQsIHN0YXRlLCBbXSk7XG59XG5cbmZ1bmN0aW9uIHRyYXZlcnNlU2ltcGxlSW1wbDxUPihcbiAgbm9kZTogYW55LFxuICBlbnRlcjogRnVuY3Rpb24gfCB1bmRlZmluZWQsXG4gIGV4aXQ6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkLFxuICBzdGF0ZTogVCB8IHVuZGVmaW5lZCxcbiAgYW5jZXN0b3JzOiBUcmF2ZXJzYWxBbmNlc3RvcnMsXG4pIHtcbiAgY29uc3Qga2V5cyA9IFZJU0lUT1JfS0VZU1tub2RlLnR5cGVdO1xuICBpZiAoIWtleXMpIHJldHVybjtcblxuICBpZiAoZW50ZXIpIGVudGVyKG5vZGUsIGFuY2VzdG9ycywgc3RhdGUpO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBzdWJOb2RlID0gbm9kZVtrZXldO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViTm9kZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHN1Yk5vZGVbaV07XG4gICAgICAgIGlmICghY2hpbGQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhdmVyc2VTaW1wbGVJbXBsKGNoaWxkLCBlbnRlciwgZXhpdCwgc3RhdGUsIGFuY2VzdG9ycyk7XG5cbiAgICAgICAgYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3ViTm9kZSkge1xuICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICBub2RlLFxuICAgICAgICBrZXksXG4gICAgICB9KTtcblxuICAgICAgdHJhdmVyc2VTaW1wbGVJbXBsKHN1Yk5vZGUsIGVudGVyLCBleGl0LCBzdGF0ZSwgYW5jZXN0b3JzKTtcblxuICAgICAgYW5jZXN0b3JzLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0KSBleGl0KG5vZGUsIGFuY2VzdG9ycywgc3RhdGUpO1xufVxuIiwgImltcG9ydCBnZXRCaW5kaW5nSWRlbnRpZmllcnMgZnJvbSBcIi4uL3JldHJpZXZlcnMvZ2V0QmluZGluZ0lkZW50aWZpZXJzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYSBiaW5kaW5nIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQmluZGluZyhcbiAgbm9kZTogdC5Ob2RlLFxuICBwYXJlbnQ6IHQuTm9kZSxcbiAgZ3JhbmRwYXJlbnQ/OiB0Lk5vZGUsXG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgIGdyYW5kcGFyZW50ICYmXG4gICAgbm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgIHBhcmVudC50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIgJiZcbiAgICBncmFuZHBhcmVudC50eXBlID09PSBcIk9iamVjdEV4cHJlc3Npb25cIlxuICApIHtcbiAgICAvLyBXZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGlzLCBiZWNhdXNlIGdldEJpbmRpbmdJZGVudGlmaWVyc1xuICAgIC8vIGhhcyBhbiBPYmplY3RQcm9wZXJ0eS0+dmFsdWUgZW50cnkgZm9yIGRlc3RydWN0dXJpbmcgcGF0dGVybnMuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBnZXRCaW5kaW5nSWRlbnRpZmllcnMua2V5cyBkb2VzIG5vdCBjb3ZlciBhbGwgQVNUIHR5cGVzXG4gICAgZ2V0QmluZGluZ0lkZW50aWZpZXJzLmtleXNbcGFyZW50LnR5cGVdO1xuICBpZiAoa2V5cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHZhbCA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Iga2V5IG11c3QgcHJlc2VudCBpbiBwYXJlbnRcbiAgICAgICAgcGFyZW50W2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGlmICh2YWwuaW5kZXhPZihub2RlKSA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWwgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgeyBpc1ZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IEJMT0NLX1NDT1BFRF9TWU1CT0wgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBub2RlYCBpcyBhIGBsZXRgIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xldChub2RlOiB0Lk5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiZcbiAgICAobm9kZS5raW5kICE9PSBcInZhclwiIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeG1lOiBkb2N1bWVudCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICAgIG5vZGVbQkxPQ0tfU0NPUEVEX1NZTUJPTF0pXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgaXNDbGFzc0RlY2xhcmF0aW9uLCBpc0Z1bmN0aW9uRGVjbGFyYXRpb24gfSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCBpc0xldCBmcm9tIFwiLi9pc0xldFwiO1xuaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYmxvY2sgc2NvcGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Jsb2NrU2NvcGVkKG5vZGU6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSB8fCBpc0xldChub2RlKTtcbn1cbiIsICJpbXBvcnQgaXNUeXBlIGZyb20gXCIuL2lzVHlwZVwiO1xuaW1wb3J0IHsgaXNJZGVudGlmaWVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBub2RlYCBpcyBkZWZpbml0ZWx5IGltbXV0YWJsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJbW11dGFibGUobm9kZTogdC5Ob2RlKTogYm9vbGVhbiB7XG4gIGlmIChpc1R5cGUobm9kZS50eXBlLCBcIkltbXV0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGlzSWRlbnRpZmllcihub2RlKSkge1xuICAgIGlmIChub2RlLm5hbWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIGltbXV0YWJsZSFcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBpZGVhLi4uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IE5PREVfRklFTERTLCBWSVNJVE9SX0tFWVMgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gbm9kZXMgYXJlIGVxdWl2YWxlbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNOb2Rlc0VxdWl2YWxlbnQ8VCBleHRlbmRzIFBhcnRpYWw8dC5Ob2RlPj4oXG4gIGE6IFQsXG4gIGI6IGFueSxcbik6IGIgaXMgVCB7XG4gIGlmIChcbiAgICB0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHR5cGVvZiBiICE9PSBcIm9iamVjdFwiIHx8XG4gICAgYSA9PSBudWxsIHx8XG4gICAgYiA9PSBudWxsXG4gICkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG5cbiAgaWYgKGEudHlwZSAhPT0gYi50eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoTk9ERV9GSUVMRFNbYS50eXBlXSB8fCBhLnR5cGUpO1xuICBjb25zdCB2aXNpdG9yS2V5cyA9IFZJU0lUT1JfS0VZU1thLnR5cGVdO1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsX2EgPVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWVsZCBtdXN0IHByZXNlbnQgaW4gYVxuICAgICAgYVtmaWVsZF07XG4gICAgY29uc3QgdmFsX2IgPSBiW2ZpZWxkXTtcbiAgICBpZiAodHlwZW9mIHZhbF9hICE9PSB0eXBlb2YgdmFsX2IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbF9hID09IG51bGwgJiYgdmFsX2IgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh2YWxfYSA9PSBudWxsIHx8IHZhbF9iID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWxfYSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWxfYikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbF9hLmxlbmd0aCAhPT0gdmFsX2IubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxfYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzTm9kZXNFcXVpdmFsZW50KHZhbF9hW2ldLCB2YWxfYltpXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsX2EgPT09IFwib2JqZWN0XCIgJiYgIXZpc2l0b3JLZXlzPy5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbF9hKSkge1xuICAgICAgICBpZiAodmFsX2Fba2V5XSAhPT0gdmFsX2Jba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc05vZGVzRXF1aXZhbGVudCh2YWxfYSwgdmFsX2IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyB0IGZyb20gXCIuLlwiO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbm9kZWAgaXMgYSByZWZlcmVuY2UgdG8gYSBib3VuZCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNSZWZlcmVuY2VkKFxuICBub2RlOiB0Lk5vZGUsXG4gIHBhcmVudDogdC5Ob2RlLFxuICBncmFuZHBhcmVudD86IHQuTm9kZSxcbik6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgLy8geWVzOiBQQVJFTlRbTk9ERV1cbiAgICAvLyB5ZXM6IE5PREUuY2hpbGRcbiAgICAvLyBubzogcGFyZW50Lk5PREVcbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgIGNhc2UgXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgIGlmIChwYXJlbnQucHJvcGVydHkgPT09IG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEhcGFyZW50LmNvbXB1dGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG5cbiAgICBjYXNlIFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgLy8gbm86IGxldCBOT0RFID0gaW5pdDtcbiAgICAvLyB5ZXM6IGxldCBpZCA9IE5PREU7XG4gICAgY2FzZSBcIlZhcmlhYmxlRGVjbGFyYXRvclwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5pbml0ID09PSBub2RlO1xuXG4gICAgLy8geWVzOiAoKSA9PiBOT0RFXG4gICAgLy8gbm86IChOT0RFKSA9PiB7fVxuICAgIGNhc2UgXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiOlxuICAgICAgcmV0dXJuIHBhcmVudC5ib2R5ID09PSBub2RlO1xuXG4gICAgLy8gbm86IGNsYXNzIHsgI05PREU7IH1cbiAgICAvLyBubzogY2xhc3MgeyBnZXQgI05PREUoKSB7fSB9XG4gICAgLy8gbm86IGNsYXNzIHsgI05PREUoKSB7fSB9XG4gICAgLy8gbm86IGNsYXNzIHsgZm4oKSB7IHJldHVybiB0aGlzLiNOT0RFOyB9IH1cbiAgICBjYXNlIFwiUHJpdmF0ZU5hbWVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBjbGFzcyB7IE5PREUoKSB7fSB9XG4gICAgLy8geWVzOiBjbGFzcyB7IFtOT0RFXSgpIHt9IH1cbiAgICAvLyBubzogY2xhc3MgeyBmb28oTk9ERSkge30gfVxuICAgIGNhc2UgXCJDbGFzc01ldGhvZFwiOlxuICAgIGNhc2UgXCJDbGFzc1ByaXZhdGVNZXRob2RcIjpcbiAgICBjYXNlIFwiT2JqZWN0TWV0aG9kXCI6XG4gICAgICBpZiAocGFyZW50LmtleSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gISFwYXJlbnQuY29tcHV0ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyB5ZXM6IHsgW05PREVdOiBcIlwiIH1cbiAgICAvLyBubzogeyBOT0RFOiBcIlwiIH1cbiAgICAvLyBkZXBlbmRzOiB7IE5PREUgfVxuICAgIC8vIGRlcGVuZHM6IHsga2V5OiBOT0RFIH1cbiAgICBjYXNlIFwiT2JqZWN0UHJvcGVydHlcIjpcbiAgICAgIGlmIChwYXJlbnQua2V5ID09PSBub2RlKSB7XG4gICAgICAgIHJldHVybiAhIXBhcmVudC5jb21wdXRlZDtcbiAgICAgIH1cbiAgICAgIC8vIHBhcmVudC52YWx1ZSA9PT0gbm9kZVxuICAgICAgcmV0dXJuICFncmFuZHBhcmVudCB8fCBncmFuZHBhcmVudC50eXBlICE9PSBcIk9iamVjdFBhdHRlcm5cIjtcbiAgICAvLyBubzogY2xhc3MgeyBOT0RFID0gdmFsdWU7IH1cbiAgICAvLyB5ZXM6IGNsYXNzIHsgW05PREVdID0gdmFsdWU7IH1cbiAgICAvLyB5ZXM6IGNsYXNzIHsga2V5ID0gTk9ERTsgfVxuICAgIGNhc2UgXCJDbGFzc1Byb3BlcnR5XCI6XG4gICAgY2FzZSBcIkNsYXNzQWNjZXNzb3JQcm9wZXJ0eVwiOlxuICAgICAgaWYgKHBhcmVudC5rZXkgPT09IG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEhcGFyZW50LmNvbXB1dGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCI6XG4gICAgICByZXR1cm4gcGFyZW50LmtleSAhPT0gbm9kZTtcblxuICAgIC8vIG5vOiBjbGFzcyBOT0RFIHt9XG4gICAgLy8geWVzOiBjbGFzcyBGb28gZXh0ZW5kcyBOT0RFIHt9XG4gICAgY2FzZSBcIkNsYXNzRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiQ2xhc3NFeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnN1cGVyQ2xhc3MgPT09IG5vZGU7XG5cbiAgICAvLyB5ZXM6IGxlZnQgPSBOT0RFO1xuICAgIC8vIG5vOiBOT0RFID0gcmlnaHQ7XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnJpZ2h0ID09PSBub2RlO1xuXG4gICAgLy8gbm86IFtOT0RFID0gZm9vXSA9IFtdO1xuICAgIC8vIHllczogW2ZvbyA9IE5PREVdID0gW107XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgICByZXR1cm4gcGFyZW50LnJpZ2h0ID09PSBub2RlO1xuXG4gICAgLy8gbm86IE5PREU6IGZvciAoOzspIHt9XG4gICAgY2FzZSBcIkxhYmVsZWRTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiB0cnkge30gY2F0Y2ggKE5PREUpIHt9XG4gICAgY2FzZSBcIkNhdGNoQ2xhdXNlXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogZnVuY3Rpb24gZm9vKC4uLk5PREUpIHt9XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlIFwiQnJlYWtTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiQ29udGludWVTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBmdW5jdGlvbiBOT0RFKCkge31cbiAgICAvLyBubzogZnVuY3Rpb24gZm9vKE5PREUpIHt9XG4gICAgY2FzZSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIjpcbiAgICBjYXNlIFwiRnVuY3Rpb25FeHByZXNzaW9uXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogZXhwb3J0IE5PREUgZnJvbSBcImZvb1wiO1xuICAgIC8vIG5vOiBleHBvcnQgKiBhcyBOT0RFIGZyb20gXCJmb29cIjtcbiAgICBjYXNlIFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCI6XG4gICAgY2FzZSBcIkV4cG9ydERlZmF1bHRTcGVjaWZpZXJcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBleHBvcnQgeyBmb28gYXMgTk9ERSB9O1xuICAgIC8vIHllczogZXhwb3J0IHsgTk9ERSBhcyBmb28gfTtcbiAgICAvLyBubzogZXhwb3J0IHsgTk9ERSBhcyBmb28gfSBmcm9tIFwiZm9vXCI7XG4gICAgY2FzZSBcIkV4cG9ydFNwZWNpZmllclwiOlxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogUHJvcGVydHkgJ3NvdXJjZScgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQW55VHlwZUFubm90YXRpb24nLlxuICAgICAgaWYgKGdyYW5kcGFyZW50Py5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudC5sb2NhbCA9PT0gbm9kZTtcblxuICAgIC8vIG5vOiBpbXBvcnQgTk9ERSBmcm9tIFwiZm9vXCI7XG4gICAgLy8gbm86IGltcG9ydCAqIGFzIE5PREUgZnJvbSBcImZvb1wiO1xuICAgIC8vIG5vOiBpbXBvcnQgeyBOT0RFIGFzIGZvbyB9IGZyb20gXCJmb29cIjtcbiAgICAvLyBubzogaW1wb3J0IHsgZm9vIGFzIE5PREUgfSBmcm9tIFwiZm9vXCI7XG4gICAgLy8gbm86IGltcG9ydCBOT0RFIGZyb20gXCJiYXJcIjtcbiAgICBjYXNlIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiOlxuICAgIGNhc2UgXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIjpcbiAgICBjYXNlIFwiSW1wb3J0U3BlY2lmaWVyXCI6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBubzogaW1wb3J0IFwiZm9vXCIgYXNzZXJ0IHsgTk9ERTogXCJqc29uXCIgfVxuICAgIGNhc2UgXCJJbXBvcnRBdHRyaWJ1dGVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiA8ZGl2IE5PREU9XCJmb29cIiAvPlxuICAgIGNhc2UgXCJKU1hBdHRyaWJ1dGVcIjpcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIG5vOiBbTk9ERV0gPSBbXTtcbiAgICAvLyBubzogKHsgTk9ERSB9KSA9IFtdO1xuICAgIGNhc2UgXCJPYmplY3RQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gbm86IG5ldy5OT0RFXG4gICAgLy8gbm86IE5PREUudGFyZ2V0XG4gICAgY2FzZSBcIk1ldGFQcm9wZXJ0eVwiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8geWVzOiB0eXBlIFggPSB7IHNvbWVQcm9wZXJ0eTogTk9ERSB9XG4gICAgLy8gbm86IHR5cGUgWCA9IHsgTk9ERTogT3RoZXJUeXBlIH1cbiAgICBjYXNlIFwiT2JqZWN0VHlwZVByb3BlcnR5XCI6XG4gICAgICByZXR1cm4gcGFyZW50LmtleSAhPT0gbm9kZTtcblxuICAgIC8vIHllczogZW51bSBYIHsgRm9vID0gTk9ERSB9XG4gICAgLy8gbm86IGVudW0gWCB7IE5PREUgfVxuICAgIGNhc2UgXCJUU0VudW1NZW1iZXJcIjpcbiAgICAgIHJldHVybiBwYXJlbnQuaWQgIT09IG5vZGU7XG5cbiAgICAvLyB5ZXM6IHsgW05PREVdOiB2YWx1ZSB9XG4gICAgLy8gbm86IHsgTk9ERTogdmFsdWUgfVxuICAgIGNhc2UgXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCI6XG4gICAgICBpZiAocGFyZW50LmtleSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gISFwYXJlbnQuY29tcHV0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNDYXRjaENsYXVzZSxcbiAgaXNCbG9ja1N0YXRlbWVudCxcbiAgaXNTY29wYWJsZSxcbiAgaXNQYXR0ZXJuLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW5wdXQgYG5vZGVgIGlzIGEgc2NvcGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2NvcGUobm9kZTogdC5Ob2RlLCBwYXJlbnQ6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICAvLyBJZiBhIEJsb2NrU3RhdGVtZW50IGlzIGFuIGltbWVkaWF0ZSBkZXNjZW5kZW50IG9mIGEgRnVuY3Rpb24vQ2F0Y2hDbGF1c2UsIGl0IG11c3QgYmUgaW4gdGhlIGJvZHkuXG4gIC8vIEhlbmNlIHdlIHNraXBwZWQgdGhlIHBhcmVudEtleSA9PT0gXCJwYXJhbXNcIiBjaGVja1xuICBpZiAoaXNCbG9ja1N0YXRlbWVudChub2RlKSAmJiAoaXNGdW5jdGlvbihwYXJlbnQpIHx8IGlzQ2F0Y2hDbGF1c2UocGFyZW50KSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBhIFBhdHRlcm4gaXMgYW4gaW1tZWRpYXRlIGRlc2NlbmRlbnQgb2YgYSBGdW5jdGlvbi9DYXRjaENsYXVzZSwgaXQgbXVzdCBiZSBpbiB0aGUgcGFyYW1zLlxuICAvLyBIZW5jZSB3ZSBza2lwcGVkIHRoZSBwYXJlbnRLZXkgPT09IFwicGFyYW1zXCIgY2hlY2tcbiAgaWYgKGlzUGF0dGVybihub2RlKSAmJiAoaXNGdW5jdGlvbihwYXJlbnQpIHx8IGlzQ2F0Y2hDbGF1c2UocGFyZW50KSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBpc1Njb3BhYmxlKG5vZGUpO1xufVxuIiwgImltcG9ydCB7IGlzSWRlbnRpZmllciwgaXNJbXBvcnREZWZhdWx0U3BlY2lmaWVyIH0gZnJvbSBcIi4vZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSAqIGFzIHQgZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGlucHV0IGBzcGVjaWZpZXJgIGlzIGEgYGRlZmF1bHRgIGltcG9ydCBvciBleHBvcnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU3BlY2lmaWVyRGVmYXVsdChcbiAgc3BlY2lmaWVyOiB0Lk1vZHVsZVNwZWNpZmllcixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzSW1wb3J0RGVmYXVsdFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0b2RvKGZsb3ctPnRzKTogc3RyaWN0ZXIgdHlwZSBmb3Igc3BlY2lmaWVyXG4gICAgaXNJZGVudGlmaWVyKHNwZWNpZmllci5pbXBvcnRlZCB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgIH0pXG4gICk7XG59XG4iLCAiaW1wb3J0IGlzVmFsaWRJZGVudGlmaWVyIGZyb20gXCIuL2lzVmFsaWRJZGVudGlmaWVyXCI7XG5cbmNvbnN0IFJFU0VSVkVEX1dPUkRTX0VTM19PTkxZOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcImFic3RyYWN0XCIsXG4gIFwiYm9vbGVhblwiLFxuICBcImJ5dGVcIixcbiAgXCJjaGFyXCIsXG4gIFwiZG91YmxlXCIsXG4gIFwiZW51bVwiLFxuICBcImZpbmFsXCIsXG4gIFwiZmxvYXRcIixcbiAgXCJnb3RvXCIsXG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImludFwiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxvbmdcIixcbiAgXCJuYXRpdmVcIixcbiAgXCJwYWNrYWdlXCIsXG4gIFwicHJpdmF0ZVwiLFxuICBcInByb3RlY3RlZFwiLFxuICBcInB1YmxpY1wiLFxuICBcInNob3J0XCIsXG4gIFwic3RhdGljXCIsXG4gIFwic3luY2hyb25pemVkXCIsXG4gIFwidGhyb3dzXCIsXG4gIFwidHJhbnNpZW50XCIsXG4gIFwidm9sYXRpbGVcIixcbl0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbnB1dCBgbmFtZWAgaXMgYSB2YWxpZCBpZGVudGlmaWVyIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBFUzMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBBZGRpdGlvbmFsIEVTMyByZXNlcnZlZCB3b3JkcyBhcmVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNWYWxpZEVTM0lkZW50aWZpZXIobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkSWRlbnRpZmllcihuYW1lKSAmJiAhUkVTRVJWRURfV09SRFNfRVMzX09OTFkuaGFzKG5hbWUpO1xufVxuIiwgImltcG9ydCB7IGlzVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gXCIuL2dlbmVyYXRlZFwiO1xuaW1wb3J0IHsgQkxPQ0tfU0NPUEVEX1NZTUJPTCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlICogYXMgdCBmcm9tIFwiLi5cIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW5wdXQgYG5vZGVgIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFyKG5vZGU6IHQuTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCB7IGtpbmQ6IFwidmFyXCIgfSkgJiZcbiAgICAhKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkb2N1bWVudCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICAgIG5vZGVbQkxPQ0tfU0NPUEVEX1NZTUJPTF1cbiAgICApXG4gICk7XG59XG4iLCAiaW1wb3J0IGlzUmVhY3RDb21wb25lbnQgZnJvbSBcIi4vdmFsaWRhdG9ycy9yZWFjdC9pc1JlYWN0Q29tcG9uZW50XCI7XG5pbXBvcnQgaXNDb21wYXRUYWcgZnJvbSBcIi4vdmFsaWRhdG9ycy9yZWFjdC9pc0NvbXBhdFRhZ1wiO1xuaW1wb3J0IGJ1aWxkQ2hpbGRyZW4gZnJvbSBcIi4vYnVpbGRlcnMvcmVhY3QvYnVpbGRDaGlsZHJlblwiO1xuXG4vLyBhc3NlcnRzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGFzc2VydE5vZGUgfSBmcm9tIFwiLi9hc3NlcnRzL2Fzc2VydE5vZGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Fzc2VydHMvZ2VuZXJhdGVkXCI7XG5cbi8vIGJ1aWxkZXJzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZVR5cGVBbm5vdGF0aW9uQmFzZWRPblR5cGVvZiB9IGZyb20gXCIuL2J1aWxkZXJzL2Zsb3cvY3JlYXRlVHlwZUFubm90YXRpb25CYXNlZE9uVHlwZW9mXCI7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUZsb3dVbmlvblR5cGUgaW5zdGVhZCAqL1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjcmVhdGVVbmlvblR5cGVBbm5vdGF0aW9uIH0gZnJvbSBcIi4vYnVpbGRlcnMvZmxvdy9jcmVhdGVGbG93VW5pb25UeXBlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZUZsb3dVbmlvblR5cGUgfSBmcm9tIFwiLi9idWlsZGVycy9mbG93L2NyZWF0ZUZsb3dVbmlvblR5cGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlVFNVbmlvblR5cGUgfSBmcm9tIFwiLi9idWlsZGVycy90eXBlc2NyaXB0L2NyZWF0ZVRTVW5pb25UeXBlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9idWlsZGVycy9nZW5lcmF0ZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2J1aWxkZXJzL2dlbmVyYXRlZC91cHBlcmNhc2VcIjtcblxuLy8gY2xvbmVcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmVOb2RlIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVOb2RlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2xvbmVEZWVwIH0gZnJvbSBcIi4vY2xvbmUvY2xvbmVEZWVwXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lRGVlcFdpdGhvdXRMb2MgfSBmcm9tIFwiLi9jbG9uZS9jbG9uZURlZXBXaXRob3V0TG9jXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNsb25lV2l0aG91dExvYyB9IGZyb20gXCIuL2Nsb25lL2Nsb25lV2l0aG91dExvY1wiO1xuXG4vLyBjb21tZW50c1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRDb21tZW50IH0gZnJvbSBcIi4vY29tbWVudHMvYWRkQ29tbWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2FkZENvbW1lbnRzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGluaGVyaXRJbm5lckNvbW1lbnRzIH0gZnJvbSBcIi4vY29tbWVudHMvaW5oZXJpdElubmVyQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdExlYWRpbmdDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2luaGVyaXRMZWFkaW5nQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdHNDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL2luaGVyaXRzQ29tbWVudHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5oZXJpdFRyYWlsaW5nQ29tbWVudHMgfSBmcm9tIFwiLi9jb21tZW50cy9pbmhlcml0VHJhaWxpbmdDb21tZW50c1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmVDb21tZW50cyB9IGZyb20gXCIuL2NvbW1lbnRzL3JlbW92ZUNvbW1lbnRzXCI7XG5cbi8vIGNvbnN0YW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzL2dlbmVyYXRlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIGNvbnZlcnRlcnNcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZW5zdXJlQmxvY2sgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL2Vuc3VyZUJsb2NrXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvQmluZGluZ0lkZW50aWZpZXJOYW1lIH0gZnJvbSBcIi4vY29udmVydGVycy90b0JpbmRpbmdJZGVudGlmaWVyTmFtZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b0Jsb2NrIH0gZnJvbSBcIi4vY29udmVydGVycy90b0Jsb2NrXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvQ29tcHV0ZWRLZXkgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL3RvQ29tcHV0ZWRLZXlcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9FeHByZXNzaW9uIH0gZnJvbSBcIi4vY29udmVydGVycy90b0V4cHJlc3Npb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9JZGVudGlmaWVyIH0gZnJvbSBcIi4vY29udmVydGVycy90b0lkZW50aWZpZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9LZXlBbGlhcyB9IGZyb20gXCIuL2NvbnZlcnRlcnMvdG9LZXlBbGlhc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1NlcXVlbmNlRXhwcmVzc2lvbiB9IGZyb20gXCIuL2NvbnZlcnRlcnMvdG9TZXF1ZW5jZUV4cHJlc3Npb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9TdGF0ZW1lbnQgfSBmcm9tIFwiLi9jb252ZXJ0ZXJzL3RvU3RhdGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlVG9Ob2RlIH0gZnJvbSBcIi4vY29udmVydGVycy92YWx1ZVRvTm9kZVwiO1xuXG4vLyBkZWZpbml0aW9uc1xuZXhwb3J0ICogZnJvbSBcIi4vZGVmaW5pdGlvbnNcIjtcblxuLy8gbW9kaWZpY2F0aW9uc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBlbmRUb01lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi9tb2RpZmljYXRpb25zL2FwcGVuZFRvTWVtYmVyRXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmhlcml0cyB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvaW5oZXJpdHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvbiB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcHJlcGVuZFRvTWVtYmVyRXhwcmVzc2lvblwiO1xuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyByZW1vdmVQcm9wZXJ0aWVzLFxuICB0eXBlIE9wdGlvbnMgYXMgUmVtb3ZlUHJvcGVydGllc09wdGlvbnMsXG59IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZW1vdmVQcm9wZXJ0aWVzRGVlcCB9IGZyb20gXCIuL21vZGlmaWNhdGlvbnMvcmVtb3ZlUHJvcGVydGllc0RlZXBcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVtb3ZlVHlwZUR1cGxpY2F0ZXMgfSBmcm9tIFwiLi9tb2RpZmljYXRpb25zL2Zsb3cvcmVtb3ZlVHlwZUR1cGxpY2F0ZXNcIjtcblxuLy8gcmV0cmlldmVyc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRCaW5kaW5nSWRlbnRpZmllcnMgfSBmcm9tIFwiLi9yZXRyaWV2ZXJzL2dldEJpbmRpbmdJZGVudGlmaWVyc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRPdXRlckJpbmRpbmdJZGVudGlmaWVycyB9IGZyb20gXCIuL3JldHJpZXZlcnMvZ2V0T3V0ZXJCaW5kaW5nSWRlbnRpZmllcnNcIjtcblxuLy8gdHJhdmVyc2VcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2UgfSBmcm9tIFwiLi90cmF2ZXJzZS90cmF2ZXJzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhdmVyc2UvdHJhdmVyc2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdHJhdmVyc2VGYXN0IH0gZnJvbSBcIi4vdHJhdmVyc2UvdHJhdmVyc2VGYXN0XCI7XG5cbi8vIHV0aWxzXG5leHBvcnQgeyBkZWZhdWx0IGFzIHNoYWxsb3dFcXVhbCB9IGZyb20gXCIuL3V0aWxzL3NoYWxsb3dFcXVhbFwiO1xuXG4vLyB2YWxpZGF0b3JzXG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0JpbmRpbmcgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzQmluZGluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Jsb2NrU2NvcGVkIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc0Jsb2NrU2NvcGVkXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzSW1tdXRhYmxlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc0ltbXV0YWJsZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0xldCB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNMZXRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOb2RlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc05vZGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOb2Rlc0VxdWl2YWxlbnQgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzTm9kZXNFcXVpdmFsZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzUGxhY2Vob2xkZXJUeXBlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1BsYWNlaG9sZGVyVHlwZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1JlZmVyZW5jZWQgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzUmVmZXJlbmNlZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1Njb3BlIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1Njb3BlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzU3BlY2lmaWVyRGVmYXVsdCB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNTcGVjaWZpZXJEZWZhdWx0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVHlwZSB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNUeXBlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVmFsaWRFUzNJZGVudGlmaWVyIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9pc1ZhbGlkRVMzSWRlbnRpZmllclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1ZhbGlkSWRlbnRpZmllciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvaXNWYWxpZElkZW50aWZpZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNWYXIgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2lzVmFyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1hdGNoZXNQYXR0ZXJuIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9tYXRjaGVzUGF0dGVyblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWxpZGF0ZSB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvdmFsaWRhdGVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYnVpbGRNYXRjaE1lbWJlckV4cHJlc3Npb24gfSBmcm9tIFwiLi92YWxpZGF0b3JzL2J1aWxkTWF0Y2hNZW1iZXJFeHByZXNzaW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzL2dlbmVyYXRlZFwiO1xuXG4vLyByZWFjdFxuZXhwb3J0IGNvbnN0IHJlYWN0ID0ge1xuICBpc1JlYWN0Q29tcG9uZW50LFxuICBpc0NvbXBhdFRhZyxcbiAgYnVpbGRDaGlsZHJlbixcbn07XG5cbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vYXN0LXR5cGVzL2dlbmVyYXRlZFwiO1xuXG4vLyB0aGlzIGlzIHVzZWQgYnkgQGJhYmVsL3RyYXZlcnNlIHRvIHdhcm4gYWJvdXQgZGVwcmVjYXRlZCB2aXNpdG9yc1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBfX2ludGVybmFsX19kZXByZWNhdGlvbldhcm5pbmcgfSBmcm9tIFwiLi91dGlscy9kZXByZWNhdGlvbldhcm5pbmdcIjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBiaW5hcnlPcGVyYXRpb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQ7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICUgcmlnaHQ7XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICAgICAgY2FzZSAnKionOlxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAmIHJpZ2h0O1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IHwgcmlnaHQ7XG4gICAgICAgIGNhc2UgJz4+JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID4+IHJpZ2h0O1xuICAgICAgICBjYXNlICc+Pj4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj4+IHJpZ2h0O1xuICAgICAgICBjYXNlICc8PCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8PCByaWdodDtcbiAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCBeIHJpZ2h0O1xuICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA9PSByaWdodDtcbiAgICAgICAgY2FzZSAnPT09JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAhPT0gcmlnaHQ7XG4gICAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluIHJpZ2h0O1xuICAgICAgICBjYXNlICdpbnN0YW5jZW9mJzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA+PSByaWdodDtcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgfVxufVxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBiaW5hcnlPcGVyYXRpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHBhcnNlcl8xID0gcmVxdWlyZShcIkBiYWJlbC9wYXJzZXJcIik7XG52YXIgYiA9IHJlcXVpcmUoXCJAYmFiZWwvdHlwZXNcIik7XG52YXIgYmluYXJ5T3BlcmF0aW9uXzEgPSByZXF1aXJlKFwiLi9iaW5hcnlPcGVyYXRpb25cIik7XG5mdW5jdGlvbiBleHByZXNzaW9uVG9Db25zdGFudChleHByZXNzaW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgY29uc3RhbnQgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIHRvQ29uc3RhbnQoZXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoYi5pc0FycmF5RXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdF8xID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24uZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGV4cHJlc3Npb24uZWxlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGIuaXNTcHJlYWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcHJlYWQgPSB0b0NvbnN0YW50KGVsZW1lbnQuYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShpc1NwcmVhZGFibGUoc3ByZWFkKSAmJiBjb25zdGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMS5wdXNoLmFwcGx5KHJlc3VsdF8xLCBzcHJlYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNFeHByZXNzaW9uKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdF8xLnB1c2godG9Db25zdGFudChlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRfMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYi5pc0JpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gdG9Db25zdGFudChleHByZXNzaW9uLmxlZnQpO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdG9Db25zdGFudChleHByZXNzaW9uLnJpZ2h0KTtcbiAgICAgICAgICAgIHJldHVybiBjb25zdGFudCAmJiBiaW5hcnlPcGVyYXRpb25fMVtcImRlZmF1bHRcIl0oZXhwcmVzc2lvbi5vcGVyYXRvciwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzQm9vbGVhbkxpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZyA9IGV4cHJlc3Npb24uYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChiLmlzU3ByZWFkRWxlbWVudChhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcHJlYWQgPSB0b0NvbnN0YW50KGFyZy5hcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGlzU3ByZWFkYWJsZShzcHJlYWQpICYmIGNvbnN0YW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaC5hcHBseShhcmdzLCBzcHJlYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNFeHByZXNzaW9uKGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRvQ29uc3RhbnQoYXJnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29uc3RhbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGIuaXNNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24uY2FsbGVlKSkge1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24uY2FsbGVlLm9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QgfHwgIWNvbnN0YW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1lbWJlciA9IGV4cHJlc3Npb24uY2FsbGVlLmNvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgID8gdG9Db25zdGFudChleHByZXNzaW9uLmNhbGxlZS5wcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAgICAgOiBiLmlzSWRlbnRpZmllcihleHByZXNzaW9uLmNhbGxlZS5wcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZXhwcmVzc2lvbi5jYWxsZWUucHJvcGVydHkubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlciA9PT0gdW5kZWZpbmVkICYmICFleHByZXNzaW9uLmNhbGxlZS5jb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGNhbkNhbGxNZXRob2Qob2JqZWN0LCAnJyArIG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZW1iZXJdLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiLmlzRXhwcmVzc2lvbihleHByZXNzaW9uLmNhbGxlZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY2FsbGVlID0gdG9Db25zdGFudChleHByZXNzaW9uLmNhbGxlZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdGFudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsZWUuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNDb25kaXRpb25hbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gdG9Db25zdGFudChleHByZXNzaW9uLnRlc3QpO1xuICAgICAgICAgICAgcmV0dXJuIHRlc3RcbiAgICAgICAgICAgICAgICA/IHRvQ29uc3RhbnQoZXhwcmVzc2lvbi5jb25zZXF1ZW50KVxuICAgICAgICAgICAgICAgIDogdG9Db25zdGFudChleHByZXNzaW9uLmFsdGVybmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb25zdGFudHMgJiZcbiAgICAgICAgICAgICAgICB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMuY29uc3RhbnRzLCBleHByZXNzaW9uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29uc3RhbnRzW2V4cHJlc3Npb24ubmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNMb2dpY2FsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24ubGVmdCk7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0b0NvbnN0YW50KGV4cHJlc3Npb24ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKGNvbnN0YW50ICYmIGV4cHJlc3Npb24ub3BlcmF0b3IgPT09ICcmJicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAmJiByaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25zdGFudCAmJiBleHByZXNzaW9uLm9wZXJhdG9yID09PSAnfHwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNNZW1iZXJFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gdG9Db25zdGFudChleHByZXNzaW9uLm9iamVjdCk7XG4gICAgICAgICAgICBpZiAoIW9iamVjdCB8fCAhY29uc3RhbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtZW1iZXIgPSBleHByZXNzaW9uLmNvbXB1dGVkXG4gICAgICAgICAgICAgICAgPyB0b0NvbnN0YW50KGV4cHJlc3Npb24ucHJvcGVydHkpXG4gICAgICAgICAgICAgICAgOiBiLmlzSWRlbnRpZmllcihleHByZXNzaW9uLnByb3BlcnR5KVxuICAgICAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb24ucHJvcGVydHkubmFtZVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChtZW1iZXIgPT09IHVuZGVmaW5lZCAmJiAhZXhwcmVzc2lvbi5jb21wdXRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJycgKyBtZW1iZXIpICYmIG1lbWJlclswXSAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFttZW1iZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzTnVsbExpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzTnVtZXJpY0xpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzT2JqZWN0RXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdF8yID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgY29uc3RhbnQgJiYgaSA8IGV4cHJlc3Npb24ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGV4cHJlc3Npb24ucHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYi5pc09iamVjdFByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwcm9wZXJ0eS5jb21wdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0b0NvbnN0YW50KHByb3BlcnR5LmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYi5pc0lkZW50aWZpZXIocHJvcGVydHkua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcGVydHkua2V5Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5LmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eS5rZXkudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5IHx8IGtleVswXSA9PT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uc3RhbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChiLmlzRXhwcmVzc2lvbihwcm9wZXJ0eS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRvQ29uc3RhbnQocHJvcGVydHkudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zdGFudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMltrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNPYmplY3RNZXRob2QocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNTcHJlYWRQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3VtZW50ID0gdG9Db25zdGFudChwcm9wZXJ0eS5hcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnN0YW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdF8yLCBhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdF8yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0NvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNSZWdFeHBMaXRlcmFsKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChleHByZXNzaW9uLnBhdHRlcm4sIGV4cHJlc3Npb24uZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiLmlzU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoIC0gMSAmJiBjb25zdGFudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG9Db25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b0NvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbnNbZXhwcmVzc2lvbi5leHByZXNzaW9ucy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNTdHJpbmdMaXRlcmFsKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb25cbiAgICAgICAgaWYgKGIuaXNUZW1wbGF0ZUxpdGVyYWwoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRfMyA9ICcnO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLnF1YXNpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IGV4cHJlc3Npb24ucXVhc2lzW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdF8zICs9IHF1YXNpLnZhbHVlLmNvb2tlZDtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdF8zICs9ICcnICsgdG9Db25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb25zW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XzM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIuaXNVbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHZhciBhcmd1bWVudCA9IHRvQ29uc3RhbnQoZXhwcmVzc2lvbi5hcmd1bWVudCk7XG4gICAgICAgICAgICBpZiAoIWNvbnN0YW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiArYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhYXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnfic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB+YXJndW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FzZSAndHlwZW9mJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudDtcbiAgICAgICAgICAgICAgICBjYXNlICd2b2lkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYXJndW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RhbnQgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRvQ29uc3RhbnQoZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIGNvbnN0YW50ID8geyBjb25zdGFudDogdHJ1ZSwgcmVzdWx0OiByZXN1bHQgfSA6IHsgY29uc3RhbnQ6IGZhbHNlIH07XG59XG5leHBvcnRzLmV4cHJlc3Npb25Ub0NvbnN0YW50ID0gZXhwcmVzc2lvblRvQ29uc3RhbnQ7XG5mdW5jdGlvbiBpc1NwcmVhZGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICAgICAgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgU2V0KSB8fFxuICAgICAgICAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBNYXApKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoYVtrZXldICE9PSBiW2tleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNhbkNhbGxNZXRob2Qob2JqZWN0LCBtZW1iZXIpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBvYmplY3QpIHtcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvU3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgc3dpdGNoIChtZW1iZXIpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0b0V4cG9uZW50aWFsJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b0ZpeGVkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b1ByZWNpc2lvbic6XG4gICAgICAgICAgICAgICAgY2FzZSAndG9TdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoYXJBdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hhckNvZGVBdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29kZVBvaW50QXQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbmNhdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5kc1dpdGgnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGVzJzpcbiAgICAgICAgICAgICAgICBjYXNlICdpbmRleE9mJzpcbiAgICAgICAgICAgICAgICBjYXNlICdsYXN0SW5kZXhPZic6XG4gICAgICAgICAgICAgICAgY2FzZSAnbWF0Y2gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ25vcm1hbGl6ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAncGFkRW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdwYWRTdGFydCc6XG4gICAgICAgICAgICAgICAgY2FzZSAncmVwZWF0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NsaWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzcGxpdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnRzV2l0aCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc3Vic3RyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJzdHJpbmcnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RvTG93ZXJDYXNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0b1VwcGVyQ2FzZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAndHJpbSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lbWJlcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZXN0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhlYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIG1lbWJlcikgJiYgbWVtYmVyWzBdICE9PSAnXyc7XG4gICAgfVxufVxudmFyIEVNUFRZX09CSkVDVCA9IHt9O1xudmFyIGxhc3RTcmMgPSAnJztcbnZhciBsYXN0Q29uc3RhbnRzID0gRU1QVFlfT0JKRUNUO1xudmFyIGxhc3RPcHRpb25zID0gRU1QVFlfT0JKRUNUO1xudmFyIGxhc3RSZXN1bHQgPSBudWxsO1xudmFyIGxhc3RXYXNDb25zdGFudCA9IGZhbHNlO1xuZnVuY3Rpb24gaXNDb25zdGFudChzcmMsIGNvbnN0YW50cywgb3B0aW9ucykge1xuICAgIGlmIChjb25zdGFudHMgPT09IHZvaWQgMCkgeyBjb25zdGFudHMgPSBFTVBUWV9PQkpFQ1Q7IH1cbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSBFTVBUWV9PQkpFQ1Q7IH1cbiAgICBpZiAobGFzdFNyYyA9PT0gc3JjICYmXG4gICAgICAgIHNoYWxsb3dFcXVhbChsYXN0Q29uc3RhbnRzLCBjb25zdGFudHMpICYmXG4gICAgICAgIHNoYWxsb3dFcXVhbChsYXN0T3B0aW9ucywgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGxhc3RXYXNDb25zdGFudDtcbiAgICB9XG4gICAgbGFzdFNyYyA9IHNyYztcbiAgICBsYXN0Q29uc3RhbnRzID0gY29uc3RhbnRzO1xuICAgIHZhciBhc3Q7XG4gICAgdHJ5IHtcbiAgICAgICAgYXN0ID0gcGFyc2VyXzEucGFyc2VFeHByZXNzaW9uKHNyYywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNhdGNoIChleCkge1xuICAgICAgICByZXR1cm4gKGxhc3RXYXNDb25zdGFudCA9IGZhbHNlKTtcbiAgICB9XG4gICAgdmFyIF9hID0gZXhwcmVzc2lvblRvQ29uc3RhbnQoYXN0LCB7IGNvbnN0YW50czogY29uc3RhbnRzIH0pLCByZXN1bHQgPSBfYS5yZXN1bHQsIGNvbnN0YW50ID0gX2EuY29uc3RhbnQ7XG4gICAgbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgICByZXR1cm4gKGxhc3RXYXNDb25zdGFudCA9IGNvbnN0YW50KTtcbn1cbmV4cG9ydHMuaXNDb25zdGFudCA9IGlzQ29uc3RhbnQ7XG5mdW5jdGlvbiB0b0NvbnN0YW50KHNyYywgY29uc3RhbnRzLCBvcHRpb25zKSB7XG4gICAgaWYgKGNvbnN0YW50cyA9PT0gdm9pZCAwKSB7IGNvbnN0YW50cyA9IEVNUFRZX09CSkVDVDsgfVxuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IEVNUFRZX09CSkVDVDsgfVxuICAgIGlmICghaXNDb25zdGFudChzcmMsIGNvbnN0YW50cywgb3B0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHNyYykgKyAnIGlzIG5vdCBjb25zdGFudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG59XG5leHBvcnRzLnRvQ29uc3RhbnQgPSB0b0NvbnN0YW50O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBpc0NvbnN0YW50O1xubW9kdWxlLmV4cG9ydHMgPSBpc0NvbnN0YW50O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaXNDb25zdGFudDtcbm1vZHVsZS5leHBvcnRzLmV4cHJlc3Npb25Ub0NvbnN0YW50ID0gZXhwcmVzc2lvblRvQ29uc3RhbnQ7XG5tb2R1bGUuZXhwb3J0cy5pc0NvbnN0YW50ID0gaXNDb25zdGFudDtcbm1vZHVsZS5leHBvcnRzLnRvQ29uc3RhbnQgPSB0b0NvbnN0YW50O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGRpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykuZGlybmFtZTtcbnZhciBjb25zdGFudGlub3BsZSA9IHJlcXVpcmUoJ2NvbnN0YW50aW5vcGxlJyk7XG52YXIgd2FsayA9IHJlcXVpcmUoJ3B1Zy13YWxrJyk7XG52YXIgZXJyb3IgPSByZXF1aXJlKCdwdWctZXJyb3InKTtcbnZhciBydW5GaWx0ZXIgPSByZXF1aXJlKCcuL3J1bi1maWx0ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGVGaWx0ZXJzO1xuZnVuY3Rpb24gaGFuZGxlRmlsdGVycyhhc3QsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHdhbGsoXG4gICAgYXN0LFxuICAgIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBkaXIgPSBub2RlLmZpbGVuYW1lID8gZGlybmFtZShub2RlLmZpbGVuYW1lKSA6IG51bGw7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnRmlsdGVyJykge1xuICAgICAgICBoYW5kbGVOZXN0ZWRGaWx0ZXJzKG5vZGUsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpO1xuICAgICAgICB2YXIgdGV4dCA9IGdldEJvZHlBc1RleHQobm9kZSk7XG4gICAgICAgIHZhciBhdHRycyA9IGdldEF0dHJpYnV0ZXMobm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIGF0dHJzLmZpbGVuYW1lID0gbm9kZS5maWxlbmFtZTtcbiAgICAgICAgbm9kZS50eXBlID0gJ1RleHQnO1xuICAgICAgICBub2RlLnZhbCA9IGZpbHRlcldpdGhGYWxsYmFjayhub2RlLCB0ZXh0LCBhdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1Jhd0luY2x1ZGUnICYmIG5vZGUuZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZpcnN0RmlsdGVyID0gbm9kZS5maWx0ZXJzLnBvcCgpO1xuICAgICAgICB2YXIgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKGZpcnN0RmlsdGVyLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIGZpbGVuYW1lID0gKGF0dHJzLmZpbGVuYW1lID0gbm9kZS5maWxlLmZ1bGxQYXRoKTtcbiAgICAgICAgbm9kZS50eXBlID0gJ1RleHQnO1xuICAgICAgICBub2RlLnZhbCA9IGZpbHRlckZpbGVXaXRoRmFsbGJhY2soXG4gICAgICAgICAgZmlyc3RGaWx0ZXIsXG4gICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgbm9kZS5maWxlLFxuICAgICAgICAgIGF0dHJzXG4gICAgICAgICk7XG4gICAgICAgIG5vZGUuZmlsdGVyc1xuICAgICAgICAgIC5zbGljZSgpXG4gICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgICAgICAgdmFyIGF0dHJzID0gZ2V0QXR0cmlidXRlcyhmaWx0ZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYXR0cnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgIG5vZGUudmFsID0gZmlsdGVyV2l0aEZhbGxiYWNrKGZpbHRlciwgbm9kZS52YWwsIGF0dHJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgbm9kZS5maWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgICAgICBub2RlLmZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZpbHRlcldpdGhGYWxsYmFjayhmaWx0ZXIsIHRleHQsIGF0dHJzLCBmdW5jTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBmaWx0ZXJOYW1lID0gZ2V0RmlsdGVyTmFtZShmaWx0ZXIpO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnNbZmlsdGVyTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJzW2ZpbHRlck5hbWVdKHRleHQsIGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bkZpbHRlcihmaWx0ZXJOYW1lLCB0ZXh0LCBhdHRycywgZGlyLCBmdW5jTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGlmIChleC5jb2RlID09PSAnVU5LTk9XTl9GSUxURVInKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcihleC5jb2RlLCBleC5tZXNzYWdlLCBmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaWx0ZXJGaWxlV2l0aEZhbGxiYWNrKGZpbHRlciwgZmlsZW5hbWUsIGZpbGUsIGF0dHJzKSB7XG4gICAgICAgIHZhciBmaWx0ZXJOYW1lID0gZ2V0RmlsdGVyTmFtZShmaWx0ZXIpO1xuICAgICAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzW2ZpbHRlck5hbWVdKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcnNbZmlsdGVyTmFtZV0ucmVuZGVyQnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyc1tmaWx0ZXJOYW1lXS5yZW5kZXJCdWZmZXIoZmlsZS5yYXcsIGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcnNbZmlsdGVyTmFtZV0oZmlsZS5zdHIsIGF0dHJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlcldpdGhGYWxsYmFjayhmaWx0ZXIsIGZpbGVuYW1lLCBhdHRycywgJ3JlbmRlckZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAge2luY2x1ZGVEZXBlbmRlbmNpZXM6IHRydWV9XG4gICk7XG4gIGZ1bmN0aW9uIGdldEZpbHRlck5hbWUoZmlsdGVyKSB7XG4gICAgdmFyIGZpbHRlck5hbWUgPSBmaWx0ZXIubmFtZTtcbiAgICBpZiAoZmlsdGVyQWxpYXNlcyAmJiBmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdKSB7XG4gICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyQWxpYXNlc1tmaWx0ZXJOYW1lXTtcbiAgICAgIGlmIChmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdKSB7XG4gICAgICAgIHRocm93IGVycm9yKFxuICAgICAgICAgICdGSUxURVJfQUxJU0VfQ0hBSU4nLFxuICAgICAgICAgICdUaGUgZmlsdGVyIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXIubmFtZSArXG4gICAgICAgICAgICAnXCIgaXMgYW4gYWxpYXMgZm9yIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXJOYW1lICtcbiAgICAgICAgICAgICdcIiwgd2hpY2ggaXMgYW4gYWxpYXMgZm9yIFwiJyArXG4gICAgICAgICAgICBmaWx0ZXJBbGlhc2VzW2ZpbHRlck5hbWVdICtcbiAgICAgICAgICAgICdcIi4gIFB1ZyBkb2VzIG5vdCBzdXBwb3J0IGNoYWlucyBvZiBmaWx0ZXIgYWxpYXNlcy4nLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyTmFtZTtcbiAgfVxuICByZXR1cm4gYXN0O1xufVxuXG5mdW5jdGlvbiBoYW5kbGVOZXN0ZWRGaWx0ZXJzKG5vZGUsIGZpbHRlcnMsIG9wdGlvbnMsIGZpbHRlckFsaWFzZXMpIHtcbiAgaWYgKG5vZGUuYmxvY2subm9kZXNbMF0gJiYgbm9kZS5ibG9jay5ub2Rlc1swXS50eXBlID09PSAnRmlsdGVyJykge1xuICAgIG5vZGUuYmxvY2subm9kZXNbMF0gPSBoYW5kbGVGaWx0ZXJzKFxuICAgICAgbm9kZS5ibG9jayxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgZmlsdGVyQWxpYXNlc1xuICAgICkubm9kZXNbMF07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qm9keUFzVGV4dChub2RlKSB7XG4gIHJldHVybiBub2RlLmJsb2NrLm5vZGVzXG4gICAgLm1hcChmdW5jdGlvbihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWw7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMobm9kZSwgb3B0aW9ucykge1xuICB2YXIgYXR0cnMgPSB7fTtcbiAgbm9kZS5hdHRycy5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICB0cnkge1xuICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9XG4gICAgICAgIGF0dHIudmFsID09PSB0cnVlID8gdHJ1ZSA6IGNvbnN0YW50aW5vcGxlLnRvQ29uc3RhbnQoYXR0ci52YWwpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoL25vdCBjb25zdGFudC8udGVzdChleC5tZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBlcnJvcihcbiAgICAgICAgICAnRklMVEVSX09QVElPTl9OT1RfQ09OU1RBTlQnLFxuICAgICAgICAgIGV4Lm1lc3NhZ2UgK1xuICAgICAgICAgICAgJyBBbGwgZmlsdGVycyBhcmUgcmVuZGVyZWQgY29tcGlsZS10aW1lIHNvIGZpbHRlciBvcHRpb25zIG11c3QgYmUgY29uc3RhbnRzLicsXG4gICAgICAgICAgbm9kZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXg7XG4gICAgfVxuICB9KTtcbiAgdmFyIG9wdHMgPSBvcHRpb25zW25vZGUubmFtZV0gfHwge307XG4gIE9iamVjdC5rZXlzKG9wdHMpLmZvckVhY2goZnVuY3Rpb24ob3B0KSB7XG4gICAgaWYgKCFhdHRycy5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7XG4gICAgICBhdHRyc1tvcHRdID0gb3B0c1tvcHRdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMucnVuRmlsdGVyID0gcmVxdWlyZSgnLi9saWIvcnVuLWZpbHRlcicpO1xuZXhwb3J0cy5oYW5kbGVGaWx0ZXJzID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlLWZpbHRlcnMnKTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciB3YWxrID0gcmVxdWlyZSgncHVnLXdhbGsnKTtcblxuZnVuY3Rpb24gZXJyb3IoKSB7XG4gIHRocm93IHJlcXVpcmUoJ3B1Zy1lcnJvcicpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGluaztcbmZ1bmN0aW9uIGxpbmsoYXN0KSB7XG4gIGFzc2VydChcbiAgICBhc3QudHlwZSA9PT0gJ0Jsb2NrJyxcbiAgICAnVGhlIHRvcCBsZXZlbCBlbGVtZW50IHNob3VsZCBhbHdheXMgYmUgYSBibG9jaydcbiAgKTtcbiAgdmFyIGV4dGVuZHNOb2RlID0gbnVsbDtcbiAgaWYgKGFzdC5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgaGFzRXh0ZW5kcyA9IGFzdC5ub2Rlc1swXS50eXBlID09PSAnRXh0ZW5kcyc7XG4gICAgY2hlY2tFeHRlbmRQb3NpdGlvbihhc3QsIGhhc0V4dGVuZHMpO1xuICAgIGlmIChoYXNFeHRlbmRzKSB7XG4gICAgICBleHRlbmRzTm9kZSA9IGFzdC5ub2Rlcy5zaGlmdCgpO1xuICAgIH1cbiAgfVxuICBhc3QgPSBhcHBseUluY2x1ZGVzKGFzdCk7XG4gIGFzdC5kZWNsYXJlZEJsb2NrcyA9IGZpbmREZWNsYXJlZEJsb2Nrcyhhc3QpO1xuICBpZiAoZXh0ZW5kc05vZGUpIHtcbiAgICB2YXIgbWl4aW5zID0gW107XG4gICAgdmFyIGV4cGVjdGVkQmxvY2tzID0gW107XG4gICAgYXN0Lm5vZGVzLmZvckVhY2goZnVuY3Rpb24gYWRkTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnTmFtZWRCbG9jaycpIHtcbiAgICAgICAgZXhwZWN0ZWRCbG9ja3MucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnQmxvY2snKSB7XG4gICAgICAgIG5vZGUubm9kZXMuZm9yRWFjaChhZGROb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnTWl4aW4nICYmIG5vZGUuY2FsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWl4aW5zLnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICAnVU5FWFBFQ1RFRF9OT0RFU19JTl9FWFRFTkRJTkdfUk9PVCcsXG4gICAgICAgICAgJ09ubHkgbmFtZWQgYmxvY2tzIGFuZCBtaXhpbnMgY2FuIGFwcGVhciBhdCB0aGUgdG9wIGxldmVsIG9mIGFuIGV4dGVuZGluZyB0ZW1wbGF0ZScsXG4gICAgICAgICAgbm9kZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBwYXJlbnQgPSBsaW5rKGV4dGVuZHNOb2RlLmZpbGUuYXN0KTtcbiAgICBleHRlbmQocGFyZW50LmRlY2xhcmVkQmxvY2tzLCBhc3QpO1xuICAgIHZhciBmb3VuZEJsb2NrTmFtZXMgPSBbXTtcbiAgICB3YWxrKHBhcmVudCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snKSB7XG4gICAgICAgIGZvdW5kQmxvY2tOYW1lcy5wdXNoKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZXhwZWN0ZWRCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihleHBlY3RlZEJsb2NrKSB7XG4gICAgICBpZiAoZm91bmRCbG9ja05hbWVzLmluZGV4T2YoZXhwZWN0ZWRCbG9jay5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ1VORVhQRUNURURfQkxPQ0snLFxuICAgICAgICAgICdVbmV4cGVjdGVkIGJsb2NrICcgKyBleHBlY3RlZEJsb2NrLm5hbWUsXG4gICAgICAgICAgZXhwZWN0ZWRCbG9ja1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5rZXlzKGFzdC5kZWNsYXJlZEJsb2NrcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICBwYXJlbnQuZGVjbGFyZWRCbG9ja3NbbmFtZV0gPSBhc3QuZGVjbGFyZWRCbG9ja3NbbmFtZV07XG4gICAgfSk7XG4gICAgcGFyZW50Lm5vZGVzID0gbWl4aW5zLmNvbmNhdChwYXJlbnQubm9kZXMpO1xuICAgIHBhcmVudC5oYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG4gIHJldHVybiBhc3Q7XG59XG5cbmZ1bmN0aW9uIGZpbmREZWNsYXJlZEJsb2Nrcyhhc3QpIC8qOiB7W25hbWU6IHN0cmluZ106IEFycmF5PEJsb2NrTm9kZT59Ki8ge1xuICB2YXIgZGVmaW5pdGlvbnMgPSB7fTtcbiAgd2Fsayhhc3QsIGZ1bmN0aW9uIGJlZm9yZShub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snICYmIG5vZGUubW9kZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICBkZWZpbml0aW9uc1tub2RlLm5hbWVdID0gZGVmaW5pdGlvbnNbbm9kZS5uYW1lXSB8fCBbXTtcbiAgICAgIGRlZmluaXRpb25zW25vZGUubmFtZV0ucHVzaChub2RlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZGVmaW5pdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5QYXJlbnRCbG9ja3MocGFyZW50QmxvY2tzLCBhY2N1bXVsYXRvcikge1xuICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yIHx8IFtdO1xuICBwYXJlbnRCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihwYXJlbnRCbG9jaykge1xuICAgIGlmIChwYXJlbnRCbG9jay5wYXJlbnRzKSB7XG4gICAgICBmbGF0dGVuUGFyZW50QmxvY2tzKHBhcmVudEJsb2NrLnBhcmVudHMsIGFjY3VtdWxhdG9yKTtcbiAgICB9XG4gICAgYWNjdW11bGF0b3IucHVzaChwYXJlbnRCbG9jayk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChwYXJlbnRCbG9ja3MsIGFzdCkge1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgd2FsayhcbiAgICBhc3QsXG4gICAgZnVuY3Rpb24gYmVmb3JlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdOYW1lZEJsb2NrJykge1xuICAgICAgICBpZiAoc3RhY2tbbm9kZS5uYW1lXSA9PT0gbm9kZS5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIChub2RlLmlnbm9yZSA9IHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrW25vZGUubmFtZV0gPSBub2RlLm5hbWU7XG4gICAgICAgIHZhciBwYXJlbnRCbG9ja0xpc3QgPSBwYXJlbnRCbG9ja3Nbbm9kZS5uYW1lXVxuICAgICAgICAgID8gZmxhdHRlblBhcmVudEJsb2NrcyhwYXJlbnRCbG9ja3Nbbm9kZS5uYW1lXSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgICBpZiAocGFyZW50QmxvY2tMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUucGFyZW50cyA9IHBhcmVudEJsb2NrTGlzdDtcbiAgICAgICAgICBwYXJlbnRCbG9ja0xpc3QuZm9yRWFjaChmdW5jdGlvbihwYXJlbnRCbG9jaykge1xuICAgICAgICAgICAgc3dpdGNoIChub2RlLm1vZGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnYXBwZW5kJzpcbiAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5ub2RlcyA9IHBhcmVudEJsb2NrLm5vZGVzLmNvbmNhdChub2RlLm5vZGVzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAncHJlcGVuZCc6XG4gICAgICAgICAgICAgICAgcGFyZW50QmxvY2subm9kZXMgPSBub2RlLm5vZGVzLmNvbmNhdChwYXJlbnRCbG9jay5ub2Rlcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOlxuICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLm5vZGVzID0gbm9kZS5ub2RlcztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZnVuY3Rpb24gYWZ0ZXIobm9kZSkge1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ05hbWVkQmxvY2snICYmICFub2RlLmlnbm9yZSkge1xuICAgICAgICBkZWxldGUgc3RhY2tbbm9kZS5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5SW5jbHVkZXMoYXN0LCBjaGlsZCkge1xuICByZXR1cm4gd2FsayhcbiAgICBhc3QsXG4gICAgZnVuY3Rpb24gYmVmb3JlKG5vZGUsIHJlcGxhY2UpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICdSYXdJbmNsdWRlJykge1xuICAgICAgICByZXBsYWNlKHt0eXBlOiAnVGV4dCcsIHZhbDogbm9kZS5maWxlLnN0ci5yZXBsYWNlKC9cXHIvZywgJycpfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmdW5jdGlvbiBhZnRlcihub2RlLCByZXBsYWNlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnSW5jbHVkZScpIHtcbiAgICAgICAgdmFyIGNoaWxkQVNUID0gbGluayhub2RlLmZpbGUuYXN0KTtcbiAgICAgICAgaWYgKGNoaWxkQVNULmhhc0V4dGVuZHMpIHtcbiAgICAgICAgICBjaGlsZEFTVCA9IHJlbW92ZUJsb2NrcyhjaGlsZEFTVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZShhcHBseVlpZWxkKGNoaWxkQVNULCBub2RlLmJsb2NrKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuZnVuY3Rpb24gcmVtb3ZlQmxvY2tzKGFzdCkge1xuICByZXR1cm4gd2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUsIHJlcGxhY2UpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnTmFtZWRCbG9jaycpIHtcbiAgICAgIHJlcGxhY2Uoe1xuICAgICAgICB0eXBlOiAnQmxvY2snLFxuICAgICAgICBub2Rlczogbm9kZS5ub2RlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5WWllbGQoYXN0LCBibG9jaykge1xuICBpZiAoIWJsb2NrIHx8ICFibG9jay5ub2Rlcy5sZW5ndGgpIHJldHVybiBhc3Q7XG4gIHZhciByZXBsYWNlZCA9IGZhbHNlO1xuICBhc3QgPSB3YWxrKGFzdCwgbnVsbCwgZnVuY3Rpb24obm9kZSwgcmVwbGFjZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdZaWVsZEJsb2NrJykge1xuICAgICAgcmVwbGFjZWQgPSB0cnVlO1xuICAgICAgbm9kZS50eXBlID0gJ0Jsb2NrJztcbiAgICAgIG5vZGUubm9kZXMgPSBbYmxvY2tdO1xuICAgIH1cbiAgfSk7XG4gIGZ1bmN0aW9uIGRlZmF1bHRZaWVsZExvY2F0aW9uKG5vZGUpIHtcbiAgICB2YXIgcmVzID0gbm9kZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2RlLm5vZGVzW2ldLnRleHRPbmx5KSBjb250aW51ZTtcbiAgICAgIGlmIChub2RlLm5vZGVzW2ldLnR5cGUgPT09ICdCbG9jaycpIHtcbiAgICAgICAgcmVzID0gZGVmYXVsdFlpZWxkTG9jYXRpb24obm9kZS5ub2Rlc1tpXSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZXNbaV0uYmxvY2sgJiYgbm9kZS5ub2Rlc1tpXS5ibG9jay5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzID0gZGVmYXVsdFlpZWxkTG9jYXRpb24obm9kZS5ub2Rlc1tpXS5ibG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKCFyZXBsYWNlZCkge1xuICAgIC8vIHRvZG86IHByb2JhYmx5IHNob3VsZCBkZXByZWNhdGUgdGhpcyB3aXRoIGEgd2FybmluZ1xuICAgIGRlZmF1bHRZaWVsZExvY2F0aW9uKGFzdCkubm9kZXMucHVzaChibG9jayk7XG4gIH1cbiAgcmV0dXJuIGFzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tFeHRlbmRQb3NpdGlvbihhc3QsIGhhc0V4dGVuZHMpIHtcbiAgdmFyIGxlZ2l0RXh0ZW5kc1JlYWNoZWQgPSBmYWxzZTtcbiAgd2Fsayhhc3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnRXh0ZW5kcycpIHtcbiAgICAgIGlmIChoYXNFeHRlbmRzICYmICFsZWdpdEV4dGVuZHNSZWFjaGVkKSB7XG4gICAgICAgIGxlZ2l0RXh0ZW5kc1JlYWNoZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ0VYVEVORFNfTk9UX0ZJUlNUJyxcbiAgICAgICAgICAnRGVjbGFyYXRpb24gb2YgdGVtcGxhdGUgaW5oZXJpdGFuY2UgKFwiZXh0ZW5kc1wiKSBzaG91bGQgYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgZXh0ZW5kcyBzdGF0ZW1lbnQgcGVyIGZpbGUuJyxcbiAgICAgICAgICBub2RlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAnaHRtbCc6ICc8IURPQ1RZUEUgaHRtbD4nLFxuICAneG1sJzogJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz4nLFxuICAndHJhbnNpdGlvbmFsJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+JyxcbiAgJ3N0cmljdCc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPicsXG4gICdmcmFtZXNldCc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGRcIj4nLFxuICAnMS4xJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkXCI+JyxcbiAgJ2Jhc2ljJzogJzwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTEuZHRkXCI+JyxcbiAgJ21vYmlsZSc6ICc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjIvL0VOXCIgXCJodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9EVEQveGh0bWwtbW9iaWxlMTIuZHRkXCI+JyxcbiAgJ3BsaXN0JzogJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU5cIiBcImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGRcIj4nXG59O1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuICBcImhhc19vd25fcHJvcGVydHlcIjogW10sXG4gIFwibWVyZ2VcIjogW1xuICAgIFwic3R5bGVcIlxuICBdLFxuICBcImNsYXNzZXNfYXJyYXlcIjogW1xuICAgIFwiY2xhc3Nlc1wiLFxuICAgIFwiZXNjYXBlXCJcbiAgXSxcbiAgXCJjbGFzc2VzX29iamVjdFwiOiBbXG4gICAgXCJoYXNfb3duX3Byb3BlcnR5XCJcbiAgXSxcbiAgXCJjbGFzc2VzXCI6IFtcbiAgICBcImNsYXNzZXNfYXJyYXlcIixcbiAgICBcImNsYXNzZXNfb2JqZWN0XCJcbiAgXSxcbiAgXCJzdHlsZVwiOiBbXG4gICAgXCJoYXNfb3duX3Byb3BlcnR5XCJcbiAgXSxcbiAgXCJhdHRyXCI6IFtcbiAgICBcImVzY2FwZVwiXG4gIF0sXG4gIFwiYXR0cnNcIjogW1xuICAgIFwiYXR0clwiLFxuICAgIFwiY2xhc3Nlc1wiLFxuICAgIFwiaGFzX293bl9wcm9wZXJ0eVwiLFxuICAgIFwic3R5bGVcIlxuICBdLFxuICBcIm1hdGNoX2h0bWxcIjogW10sXG4gIFwiZXNjYXBlXCI6IFtcbiAgICBcIm1hdGNoX2h0bWxcIlxuICBdLFxuICBcInJldGhyb3dcIjogW11cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCJkZXBlbmRlbmNpZXNcIjogdHJ1ZSxcbiAgXCJpbnRlcm5hbHNcIjogdHJ1ZSxcbiAgXCJoYXNfb3duX3Byb3BlcnR5XCI6IHRydWUsXG4gIFwiY2xhc3Nlc19hcnJheVwiOiB0cnVlLFxuICBcImNsYXNzZXNfb2JqZWN0XCI6IHRydWUsXG4gIFwibWF0Y2hfaHRtbFwiOiB0cnVlXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwiaGFzX293bl9wcm9wZXJ0eVwiOiBcInZhciBwdWdfaGFzX293bl9wcm9wZXJ0eT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1wiLFxuICBcIm1lcmdlXCI6IFwiZnVuY3Rpb24gcHVnX21lcmdlKGUscil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1lWzBdLGc9MTtnPGUubGVuZ3RoO2crKyl0PXB1Z19tZXJnZSh0LGVbZ10pO3JldHVybiB0fWZvcih2YXIgbCBpbiByKWlmKFxcXCJjbGFzc1xcXCI9PT1sKXt2YXIgbj1lW2xdfHxbXTtlW2xdPShBcnJheS5pc0FycmF5KG4pP246W25dKS5jb25jYXQocltsXXx8W10pfWVsc2UgaWYoXFxcInN0eWxlXFxcIj09PWwpe3ZhciBuPXB1Z19zdHlsZShlW2xdKTtuPW4mJlxcXCI7XFxcIiE9PW5bbi5sZW5ndGgtMV0/bitcXFwiO1xcXCI6bjt2YXIgYT1wdWdfc3R5bGUocltsXSk7YT1hJiZcXFwiO1xcXCIhPT1hW2EubGVuZ3RoLTFdP2ErXFxcIjtcXFwiOmEsZVtsXT1uK2F9ZWxzZSBlW2xdPXJbbF07cmV0dXJuIGV9XCIsXG4gIFwiY2xhc3Nlc19hcnJheVwiOiBcImZ1bmN0aW9uIHB1Z19jbGFzc2VzX2FycmF5KHIsYSl7Zm9yKHZhciBzLGU9XFxcIlxcXCIsdT1cXFwiXFxcIixjPUFycmF5LmlzQXJyYXkoYSksZz0wO2c8ci5sZW5ndGg7ZysrKShzPXB1Z19jbGFzc2VzKHJbZ10pKSYmKGMmJmFbZ10mJihzPXB1Z19lc2NhcGUocykpLGU9ZSt1K3MsdT1cXFwiIFxcXCIpO3JldHVybiBlfVwiLFxuICBcImNsYXNzZXNfb2JqZWN0XCI6IFwiZnVuY3Rpb24gcHVnX2NsYXNzZXNfb2JqZWN0KHIpe3ZhciBhPVxcXCJcXFwiLG49XFxcIlxcXCI7Zm9yKHZhciBvIGluIHIpbyYmcltvXSYmcHVnX2hhc19vd25fcHJvcGVydHkuY2FsbChyLG8pJiYoYT1hK24rbyxuPVxcXCIgXFxcIik7cmV0dXJuIGF9XCIsXG4gIFwiY2xhc3Nlc1wiOiBcImZ1bmN0aW9uIHB1Z19jbGFzc2VzKHMscil7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/cHVnX2NsYXNzZXNfYXJyYXkocyxyKTpzJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIHM/cHVnX2NsYXNzZXNfb2JqZWN0KHMpOnN8fFxcXCJcXFwifVwiLFxuICBcInN0eWxlXCI6IFwiZnVuY3Rpb24gcHVnX3N0eWxlKHIpe2lmKCFyKXJldHVyblxcXCJcXFwiO2lmKFxcXCJvYmplY3RcXFwiPT10eXBlb2Ygcil7dmFyIHQ9XFxcIlxcXCI7Zm9yKHZhciBlIGluIHIpcHVnX2hhc19vd25fcHJvcGVydHkuY2FsbChyLGUpJiYodD10K2UrXFxcIjpcXFwiK3JbZV0rXFxcIjtcXFwiKTtyZXR1cm4gdH1yZXR1cm4gcitcXFwiXFxcIn1cIixcbiAgXCJhdHRyXCI6IFwiZnVuY3Rpb24gcHVnX2F0dHIodCxlLG4scil7aWYoITE9PT1lfHxudWxsPT1lfHwhZSYmKFxcXCJjbGFzc1xcXCI9PT10fHxcXFwic3R5bGVcXFwiPT09dCkpcmV0dXJuXFxcIlxcXCI7aWYoITA9PT1lKXJldHVyblxcXCIgXFxcIisocj90OnQrJz1cXFwiJyt0KydcXFwiJyk7dmFyIGY9dHlwZW9mIGU7cmV0dXJuXFxcIm9iamVjdFxcXCIhPT1mJiZcXFwiZnVuY3Rpb25cXFwiIT09Znx8XFxcImZ1bmN0aW9uXFxcIiE9dHlwZW9mIGUudG9KU09OfHwoZT1lLnRvSlNPTigpKSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGV8fChlPUpTT04uc3RyaW5naWZ5KGUpLG58fC0xPT09ZS5pbmRleE9mKCdcXFwiJykpPyhuJiYoZT1wdWdfZXNjYXBlKGUpKSxcXFwiIFxcXCIrdCsnPVxcXCInK2UrJ1xcXCInKTpcXFwiIFxcXCIrdCtcXFwiPSdcXFwiK2UucmVwbGFjZSgvJy9nLFxcXCImIzM5O1xcXCIpK1xcXCInXFxcIn1cIixcbiAgXCJhdHRyc1wiOiBcImZ1bmN0aW9uIHB1Z19hdHRycyh0LHIpe3ZhciBhPVxcXCJcXFwiO2Zvcih2YXIgcyBpbiB0KWlmKHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodCxzKSl7dmFyIHU9dFtzXTtpZihcXFwiY2xhc3NcXFwiPT09cyl7dT1wdWdfY2xhc3Nlcyh1KSxhPXB1Z19hdHRyKHMsdSwhMSxyKSthO2NvbnRpbnVlfVxcXCJzdHlsZVxcXCI9PT1zJiYodT1wdWdfc3R5bGUodSkpLGErPXB1Z19hdHRyKHMsdSwhMSxyKX1yZXR1cm4gYX1cIixcbiAgXCJtYXRjaF9odG1sXCI6IFwidmFyIHB1Z19tYXRjaF9odG1sPS9bXFxcIiY8Pl0vO1wiLFxuICBcImVzY2FwZVwiOiBcImZ1bmN0aW9uIHB1Z19lc2NhcGUoZSl7dmFyIGE9XFxcIlxcXCIrZSx0PXB1Z19tYXRjaF9odG1sLmV4ZWMoYSk7aWYoIXQpcmV0dXJuIGU7dmFyIHIsYyxuLHM9XFxcIlxcXCI7Zm9yKHI9dC5pbmRleCxjPTA7cjxhLmxlbmd0aDtyKyspe3N3aXRjaChhLmNoYXJDb2RlQXQocikpe2Nhc2UgMzQ6bj1cXFwiJnF1b3Q7XFxcIjticmVhaztjYXNlIDM4Om49XFxcIiZhbXA7XFxcIjticmVhaztjYXNlIDYwOm49XFxcIiZsdDtcXFwiO2JyZWFrO2Nhc2UgNjI6bj1cXFwiJmd0O1xcXCI7YnJlYWs7ZGVmYXVsdDpjb250aW51ZX1jIT09ciYmKHMrPWEuc3Vic3RyaW5nKGMscikpLGM9cisxLHMrPW59cmV0dXJuIGMhPT1yP3MrYS5zdWJzdHJpbmcoYyxyKTpzfVwiLFxuICBcInJldGhyb3dcIjogXCJmdW5jdGlvbiBwdWdfcmV0aHJvdyhlLG4scix0KXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpdGhyb3cgZTtpZighKFxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2Ygd2luZG93JiZufHx0KSl0aHJvdyBlLm1lc3NhZ2UrPVxcXCIgb24gbGluZSBcXFwiK3IsZTt2YXIgbyxhLGksczt0cnl7dD10fHxyZXF1aXJlKFxcXCJmc1xcXCIpLnJlYWRGaWxlU3luYyhuLHtlbmNvZGluZzpcXFwidXRmOFxcXCJ9KSxvPTMsYT10LnNwbGl0KFxcXCJcXFxcblxcXCIpLGk9TWF0aC5tYXgoci1vLDApLHM9TWF0aC5taW4oYS5sZW5ndGgscitvKX1jYXRjaCh0KXtyZXR1cm4gZS5tZXNzYWdlKz1cXFwiIC0gY291bGQgbm90IHJlYWQgZnJvbSBcXFwiK24rXFxcIiAoXFxcIit0Lm1lc3NhZ2UrXFxcIilcXFwiLHZvaWQgcHVnX3JldGhyb3coZSxudWxsLHIpfW89YS5zbGljZShpLHMpLm1hcChmdW5jdGlvbihlLG4pe3ZhciB0PW4raSsxO3JldHVybih0PT1yP1xcXCIgID4gXFxcIjpcXFwiICAgIFxcXCIpK3QrXFxcInwgXFxcIitlfSkuam9pbihcXFwiXFxcXG5cXFwiKSxlLnBhdGg9bjt0cnl7ZS5tZXNzYWdlPShufHxcXFwiUHVnXFxcIikrXFxcIjpcXFwiK3IrXFxcIlxcXFxuXFxcIitvK1xcXCJcXFxcblxcXFxuXFxcIitlLm1lc3NhZ2V9Y2F0Y2goZSl7fXRocm93IGV9XCJcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgZGVwZW5kZW5jaWVzID0gcmVxdWlyZSgnLi9saWIvZGVwZW5kZW5jaWVzLmpzJyk7XG52YXIgaW50ZXJuYWxzID0gcmVxdWlyZSgnLi9saWIvaW50ZXJuYWxzLmpzJyk7XG52YXIgc291cmNlcyA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZXMuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZDtcblxuZnVuY3Rpb24gYnVpbGQoZnVuY3Rpb25zKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZnVuY3Rpb25zID0gZnVuY3Rpb25zLmZpbHRlcihmdW5jdGlvbihmbikge1xuICAgIHJldHVybiAhaW50ZXJuYWxzW2ZuXTtcbiAgfSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZucy5pbmRleE9mKGZ1bmN0aW9uc1tpXSkgPT09IC0xKSB7XG4gICAgICBmbnMucHVzaChmdW5jdGlvbnNbaV0pO1xuICAgICAgZnVuY3Rpb25zLnB1c2guYXBwbHkoZnVuY3Rpb25zLCBkZXBlbmRlbmNpZXNbZnVuY3Rpb25zW2ldXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmbnNcbiAgICAuc29ydCgpXG4gICAgLm1hcChmdW5jdGlvbihuYW1lKSB7XG4gICAgICByZXR1cm4gc291cmNlc1tuYW1lXTtcbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBwdWdfaGFzX293bl9wcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogTWVyZ2UgdHdvIGF0dHJpYnV0ZSBvYmplY3RzIGdpdmluZyBwcmVjZWRlbmNlXG4gKiB0byB2YWx1ZXMgaW4gb2JqZWN0IGBiYC4gQ2xhc3NlcyBhcmUgc3BlY2lhbC1jYXNlZFxuICogYWxsb3dpbmcgZm9yIGFycmF5cyBhbmQgbWVyZ2luZy9qb2luaW5nIGFwcHJvcHJpYXRlbHlcbiAqIHJlc3VsdGluZyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYVxuICogQHBhcmFtIHtPYmplY3R9IGJcbiAqIEByZXR1cm4ge09iamVjdH0gYVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5tZXJnZSA9IHB1Z19tZXJnZTtcbmZ1bmN0aW9uIHB1Z19tZXJnZShhLCBiKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIGF0dHJzID0gYVswXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGF0dHJzID0gcHVnX21lcmdlKGF0dHJzLCBhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHJzO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIGIpIHtcbiAgICBpZiAoa2V5ID09PSAnY2xhc3MnKSB7XG4gICAgICB2YXIgdmFsQSA9IGFba2V5XSB8fCBbXTtcbiAgICAgIGFba2V5XSA9IChBcnJheS5pc0FycmF5KHZhbEEpID8gdmFsQSA6IFt2YWxBXSkuY29uY2F0KGJba2V5XSB8fCBbXSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgIHZhciB2YWxBID0gcHVnX3N0eWxlKGFba2V5XSk7XG4gICAgICB2YWxBID0gdmFsQSAmJiB2YWxBW3ZhbEEubGVuZ3RoIC0gMV0gIT09ICc7JyA/IHZhbEEgKyAnOycgOiB2YWxBO1xuICAgICAgdmFyIHZhbEIgPSBwdWdfc3R5bGUoYltrZXldKTtcbiAgICAgIHZhbEIgPSB2YWxCICYmIHZhbEJbdmFsQi5sZW5ndGggLSAxXSAhPT0gJzsnID8gdmFsQiArICc7JyA6IHZhbEI7XG4gICAgICBhW2tleV0gPSB2YWxBICsgdmFsQjtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gYltrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgYXJyYXksIG9iamVjdCwgb3Igc3RyaW5nIGFzIGEgc3RyaW5nIG9mIGNsYXNzZXMgZGVsaW1pdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogSWYgYHZhbGAgaXMgYW4gYXJyYXksIGFsbCBtZW1iZXJzIG9mIGl0IGFuZCBpdHMgc3ViYXJyYXlzIGFyZSBjb3VudGVkIGFzXG4gKiBjbGFzc2VzLiBJZiBgZXNjYXBpbmdgIGlzIGFuIGFycmF5LCB0aGVuIHdoZXRoZXIgb3Igbm90IHRoZSBpdGVtIGluIGB2YWxgIGlzXG4gKiBlc2NhcGVkIGRlcGVuZHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbSBpbiBgZXNjYXBpbmdgLiBJZiBgZXNjYXBpbmdgIGlzXG4gKiBub3QgYW4gYXJyYXksIG5vIGVzY2FwaW5nIGlzIGRvbmUuXG4gKlxuICogSWYgYHZhbGAgaXMgYW4gb2JqZWN0LCBhbGwgdGhlIGtleXMgd2hvc2UgdmFsdWUgaXMgdHJ1dGh5IGFyZSBjb3VudGVkIGFzXG4gKiBjbGFzc2VzLiBObyBlc2NhcGluZyBpcyBkb25lLlxuICpcbiAqIElmIGB2YWxgIGlzIGEgc3RyaW5nLCBpdCBpcyBjb3VudGVkIGFzIGEgY2xhc3MuIE5vIGVzY2FwaW5nIGlzIGRvbmUuXG4gKlxuICogQHBhcmFtIHsoQXJyYXkuPHN0cmluZz58T2JqZWN0LjxzdHJpbmcsIGJvb2xlYW4+fHN0cmluZyl9IHZhbFxuICogQHBhcmFtIHs/QXJyYXkuPHN0cmluZz59IGVzY2FwaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydHMuY2xhc3NlcyA9IHB1Z19jbGFzc2VzO1xuZnVuY3Rpb24gcHVnX2NsYXNzZXNfYXJyYXkodmFsLCBlc2NhcGluZykge1xuICB2YXIgY2xhc3NTdHJpbmcgPSAnJyxcbiAgICBjbGFzc05hbWUsXG4gICAgcGFkZGluZyA9ICcnLFxuICAgIGVzY2FwZUVuYWJsZWQgPSBBcnJheS5pc0FycmF5KGVzY2FwaW5nKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICBjbGFzc05hbWUgPSBwdWdfY2xhc3Nlcyh2YWxbaV0pO1xuICAgIGlmICghY2xhc3NOYW1lKSBjb250aW51ZTtcbiAgICBlc2NhcGVFbmFibGVkICYmIGVzY2FwaW5nW2ldICYmIChjbGFzc05hbWUgPSBwdWdfZXNjYXBlKGNsYXNzTmFtZSkpO1xuICAgIGNsYXNzU3RyaW5nID0gY2xhc3NTdHJpbmcgKyBwYWRkaW5nICsgY2xhc3NOYW1lO1xuICAgIHBhZGRpbmcgPSAnICc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzU3RyaW5nO1xufVxuZnVuY3Rpb24gcHVnX2NsYXNzZXNfb2JqZWN0KHZhbCkge1xuICB2YXIgY2xhc3NTdHJpbmcgPSAnJyxcbiAgICBwYWRkaW5nID0gJyc7XG4gIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICBpZiAoa2V5ICYmIHZhbFtrZXldICYmIHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodmFsLCBrZXkpKSB7XG4gICAgICBjbGFzc1N0cmluZyA9IGNsYXNzU3RyaW5nICsgcGFkZGluZyArIGtleTtcbiAgICAgIHBhZGRpbmcgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjbGFzc1N0cmluZztcbn1cbmZ1bmN0aW9uIHB1Z19jbGFzc2VzKHZhbCwgZXNjYXBpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBwdWdfY2xhc3Nlc19hcnJheSh2YWwsIGVzY2FwaW5nKTtcbiAgfSBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcHVnX2NsYXNzZXNfb2JqZWN0KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbCB8fCAnJztcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgb2JqZWN0IG9yIHN0cmluZyB0byBhIHN0cmluZyBvZiBDU1Mgc3R5bGVzIGRlbGltaXRlZCBieSBhIHNlbWljb2xvbi5cbiAqXG4gKiBAcGFyYW0geyhPYmplY3QuPHN0cmluZywgc3RyaW5nPnxzdHJpbmcpfSB2YWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5leHBvcnRzLnN0eWxlID0gcHVnX3N0eWxlO1xuZnVuY3Rpb24gcHVnX3N0eWxlKHZhbCkge1xuICBpZiAoIXZhbCkgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGUgaW4gdmFsKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHB1Z19oYXNfb3duX3Byb3BlcnR5LmNhbGwodmFsLCBzdHlsZSkpIHtcbiAgICAgICAgb3V0ID0gb3V0ICsgc3R5bGUgKyAnOicgKyB2YWxbc3R5bGVdICsgJzsnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWwgKyAnJztcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZ2l2ZW4gYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZXNjYXBlZFxuICogQHBhcmFtIHtCb29sZWFufSB0ZXJzZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnRzLmF0dHIgPSBwdWdfYXR0cjtcbmZ1bmN0aW9uIHB1Z19hdHRyKGtleSwgdmFsLCBlc2NhcGVkLCB0ZXJzZSkge1xuICBpZiAoXG4gICAgdmFsID09PSBmYWxzZSB8fFxuICAgIHZhbCA9PSBudWxsIHx8XG4gICAgKCF2YWwgJiYgKGtleSA9PT0gJ2NsYXNzJyB8fCBrZXkgPT09ICdzdHlsZScpKVxuICApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnICcgKyAodGVyc2UgPyBrZXkgOiBrZXkgKyAnPVwiJyArIGtleSArICdcIicpO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKFxuICAgICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSAmJlxuICAgIHR5cGVvZiB2YWwudG9KU09OID09PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHZhbCA9IHZhbC50b0pTT04oKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgIGlmICghZXNjYXBlZCAmJiB2YWwuaW5kZXhPZignXCInKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiAnICcgKyBrZXkgKyBcIj0nXCIgKyB2YWwucmVwbGFjZSgvJy9nLCAnJiMzOTsnKSArIFwiJ1wiO1xuICAgIH1cbiAgfVxuICBpZiAoZXNjYXBlZCkgdmFsID0gcHVnX2VzY2FwZSh2YWwpO1xuICByZXR1cm4gJyAnICsga2V5ICsgJz1cIicgKyB2YWwgKyAnXCInO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtPYmplY3R9IHRlcnNlIHdoZXRoZXIgdG8gdXNlIEhUTUw1IHRlcnNlIGJvb2xlYW4gYXR0cmlidXRlc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnRzLmF0dHJzID0gcHVnX2F0dHJzO1xuZnVuY3Rpb24gcHVnX2F0dHJzKG9iaiwgdGVyc2UpIHtcbiAgdmFyIGF0dHJzID0gJyc7XG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChwdWdfaGFzX293bl9wcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuXG4gICAgICBpZiAoJ2NsYXNzJyA9PT0ga2V5KSB7XG4gICAgICAgIHZhbCA9IHB1Z19jbGFzc2VzKHZhbCk7XG4gICAgICAgIGF0dHJzID0gcHVnX2F0dHIoa2V5LCB2YWwsIGZhbHNlLCB0ZXJzZSkgKyBhdHRycztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoJ3N0eWxlJyA9PT0ga2V5KSB7XG4gICAgICAgIHZhbCA9IHB1Z19zdHlsZSh2YWwpO1xuICAgICAgfVxuICAgICAgYXR0cnMgKz0gcHVnX2F0dHIoa2V5LCB2YWwsIGZhbHNlLCB0ZXJzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dHJzO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGBodG1sYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHB1Z19tYXRjaF9odG1sID0gL1tcIiY8Pl0vO1xuZXhwb3J0cy5lc2NhcGUgPSBwdWdfZXNjYXBlO1xuZnVuY3Rpb24gcHVnX2VzY2FwZShfaHRtbCkge1xuICB2YXIgaHRtbCA9ICcnICsgX2h0bWw7XG4gIHZhciByZWdleFJlc3VsdCA9IHB1Z19tYXRjaF9odG1sLmV4ZWMoaHRtbCk7XG4gIGlmICghcmVnZXhSZXN1bHQpIHJldHVybiBfaHRtbDtcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBpLCBsYXN0SW5kZXgsIGVzY2FwZTtcbiAgZm9yIChpID0gcmVnZXhSZXN1bHQuaW5kZXgsIGxhc3RJbmRleCA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChodG1sLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMzQ6XG4gICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MDpcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCAhPT0gaSkgcmVzdWx0ICs9IGh0bWwuc3Vic3RyaW5nKGxhc3RJbmRleCwgaSk7XG4gICAgbGFzdEluZGV4ID0gaSArIDE7XG4gICAgcmVzdWx0ICs9IGVzY2FwZTtcbiAgfVxuICBpZiAobGFzdEluZGV4ICE9PSBpKSByZXR1cm4gcmVzdWx0ICsgaHRtbC5zdWJzdHJpbmcobGFzdEluZGV4LCBpKTtcbiAgZWxzZSByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJlLXRocm93IHRoZSBnaXZlbiBgZXJyYCBpbiBjb250ZXh0IHRvIHRoZVxuICogdGhlIHB1ZyBpbiBgZmlsZW5hbWVgIGF0IHRoZSBnaXZlbiBgbGluZW5vYC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGxpbmVub1xuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBvcmlnaW5hbCBzb3VyY2VcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMucmV0aHJvdyA9IHB1Z19yZXRocm93O1xuZnVuY3Rpb24gcHVnX3JldGhyb3coZXJyLCBmaWxlbmFtZSwgbGluZW5vLCBzdHIpIHtcbiAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpKSB0aHJvdyBlcnI7XG4gIGlmICgodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyB8fCAhZmlsZW5hbWUpICYmICFzdHIpIHtcbiAgICBlcnIubWVzc2FnZSArPSAnIG9uIGxpbmUgJyArIGxpbmVubztcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgdmFyIGNvbnRleHQsIGxpbmVzLCBzdGFydCwgZW5kO1xuICB0cnkge1xuICAgIHN0ciA9IHN0ciB8fCByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwge2VuY29kaW5nOiAndXRmOCd9KTtcbiAgICBjb250ZXh0ID0gMztcbiAgICBsaW5lcyA9IHN0ci5zcGxpdCgnXFxuJyk7XG4gICAgc3RhcnQgPSBNYXRoLm1heChsaW5lbm8gLSBjb250ZXh0LCAwKTtcbiAgICBlbmQgPSBNYXRoLm1pbihsaW5lcy5sZW5ndGgsIGxpbmVubyArIGNvbnRleHQpO1xuICB9IGNhdGNoIChleCkge1xuICAgIGVyci5tZXNzYWdlICs9XG4gICAgICAnIC0gY291bGQgbm90IHJlYWQgZnJvbSAnICsgZmlsZW5hbWUgKyAnICgnICsgZXgubWVzc2FnZSArICcpJztcbiAgICBwdWdfcmV0aHJvdyhlcnIsIG51bGwsIGxpbmVubyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRXJyb3IgY29udGV4dFxuICBjb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICAubWFwKGZ1bmN0aW9uKGxpbmUsIGkpIHtcbiAgICAgIHZhciBjdXJyID0gaSArIHN0YXJ0ICsgMTtcbiAgICAgIHJldHVybiAoY3VyciA9PSBsaW5lbm8gPyAnICA+ICcgOiAnICAgICcpICsgY3VyciArICd8ICcgKyBsaW5lO1xuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIC8vIEFsdGVyIGV4Y2VwdGlvbiBtZXNzYWdlXG4gIGVyci5wYXRoID0gZmlsZW5hbWU7XG4gIHRyeSB7XG4gICAgZXJyLm1lc3NhZ2UgPVxuICAgICAgKGZpbGVuYW1lIHx8ICdQdWcnKSArXG4gICAgICAnOicgK1xuICAgICAgbGluZW5vICtcbiAgICAgICdcXG4nICtcbiAgICAgIGNvbnRleHQgK1xuICAgICAgJ1xcblxcbicgK1xuICAgICAgZXJyLm1lc3NhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHRocm93IGVycjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5O1xuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAnbmV3IERhdGUoJyArIHN0cmluZ2lmeShvYmoudG9JU09TdHJpbmcoKSkgKyAnKSc7XG4gIH1cbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTIwMjgvZywgJ1xcXFx1MjAyOCcpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTIwMjkvZywgJ1xcXFx1MjAyOScpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJ1xcXFx1MDAzQycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJ1xcXFx1MDAzRScpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXHUwMDJGJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgY29uc3RhbnRpbm9wbGUgPSByZXF1aXJlKCdjb25zdGFudGlub3BsZScpO1xudmFyIHJ1bnRpbWUgPSByZXF1aXJlKCdwdWctcnVudGltZScpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJ2pzLXN0cmluZ2lmeScpO1xuXG5mdW5jdGlvbiBpc0NvbnN0YW50KHNyYykge1xuICByZXR1cm4gY29uc3RhbnRpbm9wbGUoc3JjLCB7cHVnOiBydW50aW1lLCBwdWdfaW50ZXJwOiB1bmRlZmluZWR9KTtcbn1cbmZ1bmN0aW9uIHRvQ29uc3RhbnQoc3JjKSB7XG4gIHJldHVybiBjb25zdGFudGlub3BsZS50b0NvbnN0YW50KHNyYywge3B1ZzogcnVudGltZSwgcHVnX2ludGVycDogdW5kZWZpbmVkfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZUF0dHJzO1xuLyoqXG4gKiBvcHRpb25zOlxuICogIC0gdGVyc2VcbiAqICAtIHJ1bnRpbWVcbiAqICAtIGZvcm1hdCAoJ2h0bWwnIHx8ICdvYmplY3QnKVxuICovXG5mdW5jdGlvbiBjb21waWxlQXR0cnMoYXR0cnMsIG9wdGlvbnMpIHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoYXR0cnMpLCAnQXR0cnMgc2hvdWxkIGJlIGFuIGFycmF5Jyk7XG4gIGFzc2VydChcbiAgICBhdHRycy5ldmVyeShmdW5jdGlvbihhdHRyKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhdHRyICYmXG4gICAgICAgIHR5cGVvZiBhdHRyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgYXR0ci5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAodHlwZW9mIGF0dHIudmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXR0ci52YWwgPT09ICdib29sZWFuJykgJiZcbiAgICAgICAgdHlwZW9mIGF0dHIubXVzdEVzY2FwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgICApO1xuICAgIH0pLFxuICAgICdBbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgc3VwcGxpZWQgYXMgYW4gb2JqZWN0IG9mIHRoZSBmb3JtIHtuYW1lLCB2YWwsIG11c3RFc2NhcGV9J1xuICApO1xuICBhc3NlcnQob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcsICdPcHRpb25zIHNob3VsZCBiZSBhbiBvYmplY3QnKTtcbiAgYXNzZXJ0KFxuICAgIHR5cGVvZiBvcHRpb25zLnRlcnNlID09PSAnYm9vbGVhbicsXG4gICAgJ09wdGlvbnMudGVyc2Ugc2hvdWxkIGJlIGEgYm9vbGVhbidcbiAgKTtcbiAgYXNzZXJ0KFxuICAgIHR5cGVvZiBvcHRpb25zLnJ1bnRpbWUgPT09ICdmdW5jdGlvbicsXG4gICAgJ09wdGlvbnMucnVudGltZSBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgcnVudGltZSBmdW5jdGlvbiBuYW1lIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UgY29kZSB0aGF0IHdpbGwgZXZhbHVhdGUgdG8gdGhhdCBmdW5jdGlvbiBhdCBydW50aW1lJ1xuICApO1xuICBhc3NlcnQoXG4gICAgb3B0aW9ucy5mb3JtYXQgPT09ICdodG1sJyB8fCBvcHRpb25zLmZvcm1hdCA9PT0gJ29iamVjdCcsXG4gICAgJ09wdGlvbnMuZm9ybWF0IHNob3VsZCBiZSBcImh0bWxcIiBvciBcIm9iamVjdFwiJ1xuICApO1xuXG4gIHZhciBidWYgPSBbXTtcbiAgdmFyIGNsYXNzZXMgPSBbXTtcbiAgdmFyIGNsYXNzRXNjYXBpbmcgPSBbXTtcblxuICBmdW5jdGlvbiBhZGRBdHRyaWJ1dGUoa2V5LCB2YWwsIG11c3RFc2NhcGUsIGJ1Zikge1xuICAgIGlmIChpc0NvbnN0YW50KHZhbCkpIHtcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2h0bWwnKSB7XG4gICAgICAgIHZhciBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICAgICAgcnVudGltZS5hdHRyKGtleSwgdG9Db25zdGFudCh2YWwpLCBtdXN0RXNjYXBlLCBvcHRpb25zLnRlcnNlKVxuICAgICAgICApO1xuICAgICAgICB2YXIgbGFzdCA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3RbbGFzdC5sZW5ndGggLSAxXSA9PT0gc3RyWzBdKSB7XG4gICAgICAgICAgYnVmW2J1Zi5sZW5ndGggLSAxXSA9IGxhc3Quc3Vic3RyKDAsIGxhc3QubGVuZ3RoIC0gMSkgKyBzdHIuc3Vic3RyKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Zi5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IHRvQ29uc3RhbnQodmFsKTtcbiAgICAgICAgaWYgKG11c3RFc2NhcGUpIHtcbiAgICAgICAgICB2YWwgPSBydW50aW1lLmVzY2FwZSh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGJ1Zi5wdXNoKHN0cmluZ2lmeShrZXkpICsgJzogJyArIHN0cmluZ2lmeSh2YWwpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnaHRtbCcpIHtcbiAgICAgICAgYnVmLnB1c2goXG4gICAgICAgICAgb3B0aW9ucy5ydW50aW1lKCdhdHRyJykgK1xuICAgICAgICAgICAgJyhcIicgK1xuICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICdcIiwgJyArXG4gICAgICAgICAgICB2YWwgK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBzdHJpbmdpZnkobXVzdEVzY2FwZSkgK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBzdHJpbmdpZnkob3B0aW9ucy50ZXJzZSkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobXVzdEVzY2FwZSkge1xuICAgICAgICAgIHZhbCA9IG9wdGlvbnMucnVudGltZSgnZXNjYXBlJykgKyAnKCcgKyB2YWwgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgICAgYnVmLnB1c2goc3RyaW5naWZ5KGtleSkgKyAnOiAnICsgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHtcbiAgICB2YXIga2V5ID0gYXR0ci5uYW1lO1xuICAgIHZhciB2YWwgPSBhdHRyLnZhbDtcbiAgICB2YXIgbXVzdEVzY2FwZSA9IGF0dHIubXVzdEVzY2FwZTtcblxuICAgIGlmIChrZXkgPT09ICdjbGFzcycpIHtcbiAgICAgIGNsYXNzZXMucHVzaCh2YWwpO1xuICAgICAgY2xhc3NFc2NhcGluZy5wdXNoKG11c3RFc2NhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgIGlmIChpc0NvbnN0YW50KHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSBzdHJpbmdpZnkocnVudGltZS5zdHlsZSh0b0NvbnN0YW50KHZhbCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSBvcHRpb25zLnJ1bnRpbWUoJ3N0eWxlJykgKyAnKCcgKyB2YWwgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFkZEF0dHJpYnV0ZShrZXksIHZhbCwgbXVzdEVzY2FwZSwgYnVmKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgY2xhc3Nlc0J1ZiA9IFtdO1xuICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICBpZiAoY2xhc3Nlcy5ldmVyeShpc0NvbnN0YW50KSkge1xuICAgICAgYWRkQXR0cmlidXRlKFxuICAgICAgICAnY2xhc3MnLFxuICAgICAgICBzdHJpbmdpZnkocnVudGltZS5jbGFzc2VzKGNsYXNzZXMubWFwKHRvQ29uc3RhbnQpLCBjbGFzc0VzY2FwaW5nKSksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjbGFzc2VzQnVmXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc2VzID0gY2xhc3Nlcy5tYXAoZnVuY3Rpb24oY2xzLCBpKSB7XG4gICAgICAgIGlmIChpc0NvbnN0YW50KGNscykpIHtcbiAgICAgICAgICBjbHMgPSBzdHJpbmdpZnkoXG4gICAgICAgICAgICBjbGFzc0VzY2FwaW5nW2ldID8gcnVudGltZS5lc2NhcGUodG9Db25zdGFudChjbHMpKSA6IHRvQ29uc3RhbnQoY2xzKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY2xhc3NFc2NhcGluZ1tpXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbHM7XG4gICAgICB9KTtcbiAgICAgIGFkZEF0dHJpYnV0ZShcbiAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgb3B0aW9ucy5ydW50aW1lKCdjbGFzc2VzJykgK1xuICAgICAgICAgICcoWycgK1xuICAgICAgICAgIGNsYXNzZXMuam9pbignLCcpICtcbiAgICAgICAgICAnXSwgJyArXG4gICAgICAgICAgc3RyaW5naWZ5KGNsYXNzRXNjYXBpbmcpICtcbiAgICAgICAgICAnKScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjbGFzc2VzQnVmXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBidWYgPSBjbGFzc2VzQnVmLmNvbmNhdChidWYpO1xuICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdodG1sJykgcmV0dXJuIGJ1Zi5sZW5ndGggPyBidWYuam9pbignKycpIDogJ1wiXCInO1xuICBlbHNlIHJldHVybiAneycgKyBidWYuam9pbignLCcpICsgJ30nO1xufVxuIiwgIi8qKlxuICogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYHByZS1wdWJsaXNoLmpzYC5cbiAqIERvIG5vdCBtYW51YWxseSBlZGl0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcImFyZWFcIjogdHJ1ZSxcbiAgXCJiYXNlXCI6IHRydWUsXG4gIFwiYnJcIjogdHJ1ZSxcbiAgXCJjb2xcIjogdHJ1ZSxcbiAgXCJlbWJlZFwiOiB0cnVlLFxuICBcImhyXCI6IHRydWUsXG4gIFwiaW1nXCI6IHRydWUsXG4gIFwiaW5wdXRcIjogdHJ1ZSxcbiAgXCJsaW5rXCI6IHRydWUsXG4gIFwibWV0YVwiOiB0cnVlLFxuICBcInBhcmFtXCI6IHRydWUsXG4gIFwic291cmNlXCI6IHRydWUsXG4gIFwidHJhY2tcIjogdHJ1ZSxcbiAgXCJ3YnJcIjogdHJ1ZVxufTtcbiIsIG51bGwsIG51bGwsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBleGhhdXN0aXZlIGNoZWNrcyBvZiBkaXNjcmltaW5hdGVkIHVuaW9ucy5cbiAqIGh0dHBzOi8vYmFzYXJhdC5naXRib29rcy5pby90eXBlc2NyaXB0L2RvY3MvdHlwZXMvZGlzY3JpbWluYXRlZC11bmlvbnMuaHRtbFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdHlwZSBBID0ge3R5cGU6ICdhJ307XG4gKiAgICB0eXBlIEIgPSB7dHlwZTogJ2InfTtcbiAqICAgIHR5cGUgVW5pb24gPSBBIHwgQjtcbiAqXG4gKiAgICBmdW5jdGlvbiBkb1NvbWV0aGluZyhhcmc6IFVuaW9uKSB7XG4gKiAgICAgIGlmIChhcmcudHlwZSA9PT0gJ2EnKSB7XG4gKiAgICAgICAgcmV0dXJuIHNvbWV0aGluZztcbiAqICAgICAgfVxuICpcbiAqICAgICAgaWYgKGFyZy50eXBlID09PSAnYicpIHtcbiAqICAgICAgICByZXR1cm4gc29tZXRoaW5nRWxzZTtcbiAqICAgICAgfVxuICpcbiAqICAgICAgLy8gVFMgd2lsbCBlcnJvciBpZiB0aGVyZSBhcmUgb3RoZXIgdHlwZXMgaW4gdGhlIHVuaW9uXG4gKiAgICAgIC8vIFdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBjYWxsZWQgYXQgcnVudGltZS5cbiAqICAgICAgLy8gVXNlIGBhc3NlcnROZXZlcihhcmcsIHRydWUpYCBpbnN0ZWFkIHRvIGZhaWwgc2lsZW50bHkuXG4gKiAgICAgIHJldHVybiBhc3NlcnROZXZlcihhcmcpO1xuICogICAgfVxuICovXG5mdW5jdGlvbiBhc3NlcnROZXZlcih2YWx1ZSwgbm9UaHJvdykge1xuICAgIGlmIChub1Rocm93KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWVtYmVyOiBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG5leHBvcnRzLmFzc2VydE5ldmVyID0gYXNzZXJ0TmV2ZXI7XG5leHBvcnRzLmRlZmF1bHQgPSBhc3NlcnROZXZlcjtcbiIsIG51bGwsIG51bGwsIG51bGwsICIndXNlIHN0cmljdCc7XG5cbnZhciBkb2N0eXBlcyA9IHJlcXVpcmUoJ2RvY3R5cGVzJyk7XG52YXIgbWFrZUVycm9yID0gcmVxdWlyZSgncHVnLWVycm9yJyk7XG52YXIgYnVpbGRSdW50aW1lID0gcmVxdWlyZSgncHVnLXJ1bnRpbWUvYnVpbGQnKTtcbnZhciBydW50aW1lID0gcmVxdWlyZSgncHVnLXJ1bnRpbWUnKTtcbnZhciBjb21waWxlQXR0cnMgPSByZXF1aXJlKCdwdWctYXR0cnMnKTtcbnZhciBzZWxmQ2xvc2luZyA9IHJlcXVpcmUoJ3ZvaWQtZWxlbWVudHMnKTtcbnZhciBjb25zdGFudGlub3BsZSA9IHJlcXVpcmUoJ2NvbnN0YW50aW5vcGxlJyk7XG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnanMtc3RyaW5naWZ5Jyk7XG52YXIgYWRkV2l0aCA9IHJlcXVpcmUoJ3dpdGgnKTtcblxuLy8gVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgcHJldHR5IHByaW50aW5nIGluc2lkZSBjZXJ0YWluIHRhZ3NcbnZhciBXSElURV9TUEFDRV9TRU5TSVRJVkVfVEFHUyA9IHtcbiAgcHJlOiB0cnVlLFxuICB0ZXh0YXJlYTogdHJ1ZSxcbn07XG5cbnZhciBJTlRFUk5BTF9WQVJJQUJMRVMgPSBbXG4gICdwdWcnLFxuICAncHVnX21peGlucycsXG4gICdwdWdfaW50ZXJwJyxcbiAgJ3B1Z19kZWJ1Z19maWxlbmFtZScsXG4gICdwdWdfZGVidWdfbGluZScsXG4gICdwdWdfZGVidWdfc291cmNlcycsXG4gICdwdWdfaHRtbCcsXG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlbmVyYXRlQ29kZTtcbm1vZHVsZS5leHBvcnRzLkNvZGVHZW5lcmF0b3IgPSBDb21waWxlcjtcbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZShhc3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBDb21waWxlcihhc3QsIG9wdGlvbnMpLmNvbXBpbGUoKTtcbn1cblxuZnVuY3Rpb24gaXNDb25zdGFudChzcmMpIHtcbiAgcmV0dXJuIGNvbnN0YW50aW5vcGxlKHNyYywge3B1ZzogcnVudGltZSwgcHVnX2ludGVycDogdW5kZWZpbmVkfSk7XG59XG5mdW5jdGlvbiB0b0NvbnN0YW50KHNyYykge1xuICByZXR1cm4gY29uc3RhbnRpbm9wbGUudG9Db25zdGFudChzcmMsIHtwdWc6IHJ1bnRpbWUsIHB1Z19pbnRlcnA6IHVuZGVmaW5lZH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYENvbXBpbGVyYCB3aXRoIHRoZSBnaXZlbiBgbm9kZWAuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBDb21waWxlcihub2RlLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50ID0gMDtcbiAgdGhpcy5oYXNDb21waWxlZERvY3R5cGUgPSBmYWxzZTtcbiAgdGhpcy5oYXNDb21waWxlZFRhZyA9IGZhbHNlO1xuICB0aGlzLnBwID0gb3B0aW9ucy5wcmV0dHkgfHwgZmFsc2U7XG4gIGlmICh0aGlzLnBwICYmIHR5cGVvZiB0aGlzLnBwICE9PSAnc3RyaW5nJykge1xuICAgIHRoaXMucHAgPSAnICAnO1xuICB9XG4gIGlmICh0aGlzLnBwICYmICEvXlxccyskLy50ZXN0KHRoaXMucHApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1RoZSBwcmV0dHkgcGFyYW1ldGVyIHNob3VsZCBlaXRoZXIgYmUgYSBib29sZWFuIG9yIHdoaXRlc3BhY2Ugb25seSBzdHJpbmcnXG4gICAgKTtcbiAgfVxuICB0aGlzLmRlYnVnID0gZmFsc2UgIT09IG9wdGlvbnMuY29tcGlsZURlYnVnO1xuICB0aGlzLmluZGVudHMgPSAwO1xuICB0aGlzLnBhcmVudEluZGVudHMgPSAwO1xuICB0aGlzLnRlcnNlID0gZmFsc2U7XG4gIHRoaXMubWl4aW5zID0ge307XG4gIHRoaXMuZHluYW1pY01peGlucyA9IGZhbHNlO1xuICB0aGlzLmVhY2hDb3VudCA9IDA7XG4gIGlmIChvcHRpb25zLmRvY3R5cGUpIHRoaXMuc2V0RG9jdHlwZShvcHRpb25zLmRvY3R5cGUpO1xuICB0aGlzLnJ1bnRpbWVGdW5jdGlvbnNVc2VkID0gW107XG4gIHRoaXMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyA9IG9wdGlvbnMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyB8fCBmYWxzZTtcbiAgaWYgKHRoaXMuZGVidWcgJiYgdGhpcy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zKSB7XG4gICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5wdXNoKCdyZXRocm93Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21waWxlciBwcm90b3R5cGUuXG4gKi9cblxuQ29tcGlsZXIucHJvdG90eXBlID0ge1xuICBydW50aW1lOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKHRoaXMuaW5saW5lUnVudGltZUZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5wdXNoKG5hbWUpO1xuICAgICAgcmV0dXJuICdwdWdfJyArIG5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncHVnLicgKyBuYW1lO1xuICAgIH1cbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgY29kZSwgbm9kZSkge1xuICAgIHZhciBlcnIgPSBtYWtlRXJyb3IoY29kZSwgbWVzc2FnZSwge1xuICAgICAgbGluZTogbm9kZS5saW5lLFxuICAgICAgY29sdW1uOiBub2RlLmNvbHVtbixcbiAgICAgIGZpbGVuYW1lOiBub2RlLmZpbGVuYW1lLFxuICAgIH0pO1xuICAgIHRocm93IGVycjtcbiAgfSxcblxuICAvKipcbiAgICogQ29tcGlsZSBwYXJzZSB0cmVlIHRvIEphdmFTY3JpcHQuXG4gICAqXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGNvbXBpbGU6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYnVmID0gW107XG4gICAgaWYgKHRoaXMucHApIHRoaXMuYnVmLnB1c2goJ3ZhciBwdWdfaW5kZW50ID0gW107Jyk7XG4gICAgdGhpcy5sYXN0QnVmZmVyZWRJZHggPSAtMTtcbiAgICB0aGlzLnZpc2l0KHRoaXMubm9kZSk7XG4gICAgaWYgKCF0aGlzLmR5bmFtaWNNaXhpbnMpIHtcbiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBkeW5hbWljIG1peGlucyB3ZSBjYW4gcmVtb3ZlIGFueSB1bi11c2VkIG1peGluc1xuICAgICAgdmFyIG1peGluTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLm1peGlucyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1peGluTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1peGluID0gdGhpcy5taXhpbnNbbWl4aW5OYW1lc1tpXV07XG4gICAgICAgIGlmICghbWl4aW4udXNlZCkge1xuICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgbWl4aW4uaW5zdGFuY2VzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICB2YXIgeSA9IG1peGluLmluc3RhbmNlc1t4XS5zdGFydDtcbiAgICAgICAgICAgICAgeSA8IG1peGluLmluc3RhbmNlc1t4XS5lbmQ7XG4gICAgICAgICAgICAgIHkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuYnVmW3ldID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBqcyA9IHRoaXMuYnVmLmpvaW4oJ1xcbicpO1xuICAgIHZhciBnbG9iYWxzID0gdGhpcy5vcHRpb25zLmdsb2JhbHNcbiAgICAgID8gdGhpcy5vcHRpb25zLmdsb2JhbHMuY29uY2F0KElOVEVSTkFMX1ZBUklBQkxFUylcbiAgICAgIDogSU5URVJOQUxfVkFSSUFCTEVTO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZikge1xuICAgICAganMgPSAndmFyIHNlbGYgPSBsb2NhbHMgfHwge307JyArIGpzO1xuICAgIH0gZWxzZSB7XG4gICAgICBqcyA9IGFkZFdpdGgoXG4gICAgICAgICdsb2NhbHMgfHwge30nLFxuICAgICAgICBqcyxcbiAgICAgICAgZ2xvYmFscy5jb25jYXQoXG4gICAgICAgICAgdGhpcy5ydW50aW1lRnVuY3Rpb25zVXNlZC5tYXAoZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuICdwdWdfJyArIG5hbWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5jbHVkZVNvdXJjZXMpIHtcbiAgICAgICAganMgPVxuICAgICAgICAgICd2YXIgcHVnX2RlYnVnX3NvdXJjZXMgPSAnICtcbiAgICAgICAgICBzdHJpbmdpZnkodGhpcy5vcHRpb25zLmluY2x1ZGVTb3VyY2VzKSArXG4gICAgICAgICAgJztcXG4nICtcbiAgICAgICAgICBqcztcbiAgICAgIH1cbiAgICAgIGpzID1cbiAgICAgICAgJ3ZhciBwdWdfZGVidWdfZmlsZW5hbWUsIHB1Z19kZWJ1Z19saW5lOycgK1xuICAgICAgICAndHJ5IHsnICtcbiAgICAgICAganMgK1xuICAgICAgICAnfSBjYXRjaCAoZXJyKSB7JyArXG4gICAgICAgICh0aGlzLmlubGluZVJ1bnRpbWVGdW5jdGlvbnMgPyAncHVnX3JldGhyb3cnIDogJ3B1Zy5yZXRocm93JykgK1xuICAgICAgICAnKGVyciwgcHVnX2RlYnVnX2ZpbGVuYW1lLCBwdWdfZGVidWdfbGluZScgK1xuICAgICAgICAodGhpcy5vcHRpb25zLmluY2x1ZGVTb3VyY2VzXG4gICAgICAgICAgPyAnLCBwdWdfZGVidWdfc291cmNlc1twdWdfZGVidWdfZmlsZW5hbWVdJ1xuICAgICAgICAgIDogJycpICtcbiAgICAgICAgJyk7JyArXG4gICAgICAgICd9JztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGJ1aWxkUnVudGltZSh0aGlzLnJ1bnRpbWVGdW5jdGlvbnNVc2VkKSArXG4gICAgICAnZnVuY3Rpb24gJyArXG4gICAgICAodGhpcy5vcHRpb25zLnRlbXBsYXRlTmFtZSB8fCAndGVtcGxhdGUnKSArXG4gICAgICAnKGxvY2Fscykge3ZhciBwdWdfaHRtbCA9IFwiXCIsIHB1Z19taXhpbnMgPSB7fSwgcHVnX2ludGVycDsnICtcbiAgICAgIGpzICtcbiAgICAgICc7cmV0dXJuIHB1Z19odG1sO30nXG4gICAgKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBkb2N0eXBlIGBuYW1lYC4gU2V0cyB0ZXJzZSBtb2RlIHRvIGB0cnVlYCB3aGVuXG4gICAqIGh0bWwgNSBpcyB1c2VkLCBjYXVzaW5nIHNlbGYtY2xvc2luZyB0YWdzIHRvIGVuZCB3aXRoIFwiPlwiIHZzIFwiLz5cIixcbiAgICogYW5kIGJvb2xlYW4gYXR0cmlidXRlcyBhcmUgbm90IG1pcnJvcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBzZXREb2N0eXBlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdGhpcy5kb2N0eXBlID0gZG9jdHlwZXNbbmFtZS50b0xvd2VyQ2FzZSgpXSB8fCAnPCFET0NUWVBFICcgKyBuYW1lICsgJz4nO1xuICAgIHRoaXMudGVyc2UgPSB0aGlzLmRvY3R5cGUudG9Mb3dlckNhc2UoKSA9PSAnPCFkb2N0eXBlIGh0bWw+JztcbiAgICB0aGlzLnhtbCA9IDAgPT0gdGhpcy5kb2N0eXBlLmluZGV4T2YoJzw/eG1sJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGUgZ2l2ZW4gYHN0cmAgZXhhY3RseSBhcyBpcyBvciB3aXRoIGludGVycG9sYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGludGVycG9sYXRlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGJ1ZmZlcjogZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgc3RyID0gc3RyaW5naWZ5KHN0cik7XG4gICAgc3RyID0gc3RyLnN1YnN0cigxLCBzdHIubGVuZ3RoIC0gMik7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9PSB0aGlzLmJ1Zi5sZW5ndGggJiZcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPCAxMDBcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPT09ICdjb2RlJykge1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArPSAnICsgXCInO1xuICAgICAgICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50Kys7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAndGV4dCc7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZCArPSBzdHI7XG4gICAgICB0aGlzLmJ1Zlt0aGlzLmxhc3RCdWZmZXJlZElkeCAtIDFdID1cbiAgICAgICAgJ3B1Z19odG1sID0gcHVnX2h0bWwgKyAnICtcbiAgICAgICAgdGhpcy5idWZmZXJTdGFydENoYXIgK1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArXG4gICAgICAgICdcIjsnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkQ29uY2F0ZW5hdGlvbkNvdW50ID0gMDtcbiAgICAgIHRoaXMuYnVmLnB1c2goJ3B1Z19odG1sID0gcHVnX2h0bWwgKyBcIicgKyBzdHIgKyAnXCI7Jyk7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAndGV4dCc7XG4gICAgICB0aGlzLmJ1ZmZlclN0YXJ0Q2hhciA9ICdcIic7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZCA9IHN0cjtcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkSWR4ID0gdGhpcy5idWYubGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQnVmZmVyIHRoZSBnaXZlbiBgc3JjYCBzbyBpdCBpcyBldmFsdWF0ZWQgYXQgcnVuIHRpbWVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBidWZmZXJFeHByZXNzaW9uOiBmdW5jdGlvbihzcmMpIHtcbiAgICBpZiAoaXNDb25zdGFudChzcmMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXIodG9Db25zdGFudChzcmMpICsgJycpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9PSB0aGlzLmJ1Zi5sZW5ndGggJiZcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPCAxMDBcbiAgICApIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQrKztcbiAgICAgIGlmICh0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPT09ICd0ZXh0JykgdGhpcy5sYXN0QnVmZmVyZWQgKz0gJ1wiJztcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkVHlwZSA9ICdjb2RlJztcbiAgICAgIHRoaXMubGFzdEJ1ZmZlcmVkICs9ICcgKyAoJyArIHNyYyArICcpJztcbiAgICAgIHRoaXMuYnVmW3RoaXMubGFzdEJ1ZmZlcmVkSWR4IC0gMV0gPVxuICAgICAgICAncHVnX2h0bWwgPSBwdWdfaHRtbCArICgnICtcbiAgICAgICAgdGhpcy5idWZmZXJTdGFydENoYXIgK1xuICAgICAgICB0aGlzLmxhc3RCdWZmZXJlZCArXG4gICAgICAgICcpOyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRDb25jYXRlbmF0aW9uQ291bnQgPSAwO1xuICAgICAgdGhpcy5idWYucHVzaCgncHVnX2h0bWwgPSBwdWdfaHRtbCArICgnICsgc3JjICsgJyk7Jyk7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZFR5cGUgPSAnY29kZSc7XG4gICAgICB0aGlzLmJ1ZmZlclN0YXJ0Q2hhciA9ICcnO1xuICAgICAgdGhpcy5sYXN0QnVmZmVyZWQgPSAnKCcgKyBzcmMgKyAnKSc7XG4gICAgICB0aGlzLmxhc3RCdWZmZXJlZElkeCA9IHRoaXMuYnVmLmxlbmd0aDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBhbiBpbmRlbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgYGluZGVudGBcbiAgICogcHJvcGVydHkgYW5kIGFuIGFkZGl0aW9uYWwgYG9mZnNldGAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBuZXdsaW5lXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHByZXR0eUluZGVudDogZnVuY3Rpb24ob2Zmc2V0LCBuZXdsaW5lKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgbmV3bGluZSA9IG5ld2xpbmUgPyAnXFxuJyA6ICcnO1xuICAgIHRoaXMuYnVmZmVyKG5ld2xpbmUgKyBBcnJheSh0aGlzLmluZGVudHMgKyBvZmZzZXQpLmpvaW4odGhpcy5wcCkpO1xuICAgIGlmICh0aGlzLnBhcmVudEluZGVudHMpXG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdwdWdfaHRtbCA9IHB1Z19odG1sICsgcHVnX2luZGVudC5qb2luKFwiXCIpOycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgbm9kZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdDogZnVuY3Rpb24obm9kZSwgcGFyZW50KSB7XG4gICAgdmFyIGRlYnVnID0gdGhpcy5kZWJ1ZztcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgdmFyIG1zZztcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgbXNnID1cbiAgICAgICAgICAnQSBjaGlsZCBvZiAnICtcbiAgICAgICAgICBwYXJlbnQudHlwZSArXG4gICAgICAgICAgJyAoJyArXG4gICAgICAgICAgKHBhcmVudC5maWxlbmFtZSB8fCAnUHVnJykgK1xuICAgICAgICAgICc6JyArXG4gICAgICAgICAgcGFyZW50LmxpbmUgK1xuICAgICAgICAgICcpJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1zZyA9ICdBIHRvcC1sZXZlbCBub2RlJztcbiAgICAgIH1cbiAgICAgIG1zZyArPSAnIGlzICcgKyBub2RlICsgJywgZXhwZWN0ZWQgYSBQdWcgQVNUIE5vZGUuJztcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcgJiYgbm9kZS5kZWJ1ZyAhPT0gZmFsc2UgJiYgbm9kZS50eXBlICE9PSAnQmxvY2snKSB7XG4gICAgICBpZiAobm9kZS5saW5lKSB7XG4gICAgICAgIHZhciBqcyA9ICc7cHVnX2RlYnVnX2xpbmUgPSAnICsgbm9kZS5saW5lO1xuICAgICAgICBpZiAobm9kZS5maWxlbmFtZSlcbiAgICAgICAgICBqcyArPSAnO3B1Z19kZWJ1Z19maWxlbmFtZSA9ICcgKyBzdHJpbmdpZnkobm9kZS5maWxlbmFtZSk7XG4gICAgICAgIHRoaXMuYnVmLnB1c2goanMgKyAnOycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpc1sndmlzaXQnICsgbm9kZS50eXBlXSkge1xuICAgICAgdmFyIG1zZztcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgbXNnID0gJ0EgY2hpbGQgb2YgJyArIHBhcmVudC50eXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXNnID0gJ0EgdG9wLWxldmVsIG5vZGUnO1xuICAgICAgfVxuICAgICAgbXNnICs9XG4gICAgICAgICcgKCcgK1xuICAgICAgICAobm9kZS5maWxlbmFtZSB8fCAnUHVnJykgK1xuICAgICAgICAnOicgK1xuICAgICAgICBub2RlLmxpbmUgK1xuICAgICAgICAnKScgK1xuICAgICAgICAnIGlzIG9mIHR5cGUgJyArXG4gICAgICAgIG5vZGUudHlwZSArXG4gICAgICAgICcsJyArXG4gICAgICAgICcgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBwdWctY29kZS1nZW4uJztcbiAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0ZpbHRlcic6XG4gICAgICAgICAgbXNnICs9ICcgUGxlYXNlIHVzZSBwdWctZmlsdGVycyB0byBwcmVwcm9jZXNzIHRoaXMgQVNULic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0V4dGVuZHMnOlxuICAgICAgICBjYXNlICdJbmNsdWRlJzpcbiAgICAgICAgY2FzZSAnTmFtZWRCbG9jayc6XG4gICAgICAgIGNhc2UgJ0ZpbGVSZWZlcmVuY2UnOiAvLyB1bmxpa2VseSBidXQgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzc1xuICAgICAgICAgIG1zZyArPSAnIFBsZWFzZSB1c2UgcHVnLWxpbmtlciB0byBwcmVwcm9jZXNzIHRoaXMgQVNULic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy52aXNpdE5vZGUobm9kZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiB0aGlzWyd2aXNpdCcgKyBub2RlLnR5cGVdKG5vZGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBjYXNlIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Q2FzZTogZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMuYnVmLnB1c2goJ3N3aXRjaCAoJyArIG5vZGUuZXhwciArICcpeycpO1xuICAgIHRoaXMudmlzaXQobm9kZS5ibG9jaywgbm9kZSk7XG4gICAgdGhpcy5idWYucHVzaCgnfScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCB3aGVuIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0V2hlbjogZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICgnZGVmYXVsdCcgPT0gbm9kZS5leHByKSB7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdkZWZhdWx0OicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKCdjYXNlICcgKyBub2RlLmV4cHIgKyAnOicpO1xuICAgIH1cbiAgICBpZiAobm9kZS5ibG9jaykge1xuICAgICAgdGhpcy52aXNpdChub2RlLmJsb2NrLCBub2RlKTtcbiAgICAgIHRoaXMuYnVmLnB1c2goJyAgYnJlYWs7Jyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBsaXRlcmFsIGBub2RlYC5cbiAgICpcbiAgICogQHBhcmFtIHtMaXRlcmFsfSBub2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0TGl0ZXJhbDogZnVuY3Rpb24obm9kZSkge1xuICAgIHRoaXMuYnVmZmVyKG5vZGUuc3RyKTtcbiAgfSxcblxuICB2aXNpdE5hbWVkQmxvY2s6IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRCbG9jayhibG9jayk7XG4gIH0sXG4gIC8qKlxuICAgKiBWaXNpdCBhbGwgbm9kZXMgaW4gYGJsb2NrYC5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ja30gYmxvY2tcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRCbG9jazogZnVuY3Rpb24oYmxvY2spIHtcbiAgICB2YXIgZXNjYXBlUHJldHR5TW9kZSA9IHRoaXMuZXNjYXBlUHJldHR5TW9kZTtcbiAgICB2YXIgcHAgPSB0aGlzLnBwO1xuXG4gICAgLy8gUHJldHR5IHByaW50IG11bHRpLWxpbmUgdGV4dFxuICAgIGlmIChcbiAgICAgIHBwICYmXG4gICAgICBibG9jay5ub2Rlcy5sZW5ndGggPiAxICYmXG4gICAgICAhZXNjYXBlUHJldHR5TW9kZSAmJlxuICAgICAgYmxvY2subm9kZXNbMF0udHlwZSA9PT0gJ1RleHQnICYmXG4gICAgICBibG9jay5ub2Rlc1sxXS50eXBlID09PSAnVGV4dCdcbiAgICApIHtcbiAgICAgIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrLm5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBQcmV0dHkgcHJpbnQgdGV4dFxuICAgICAgaWYgKFxuICAgICAgICBwcCAmJlxuICAgICAgICBpID4gMCAmJlxuICAgICAgICAhZXNjYXBlUHJldHR5TW9kZSAmJlxuICAgICAgICBibG9jay5ub2Rlc1tpXS50eXBlID09PSAnVGV4dCcgJiZcbiAgICAgICAgYmxvY2subm9kZXNbaSAtIDFdLnR5cGUgPT09ICdUZXh0JyAmJlxuICAgICAgICAvXFxuJC8udGVzdChibG9jay5ub2Rlc1tpIC0gMV0udmFsKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucHJldHR5SW5kZW50KDEsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlzaXQoYmxvY2subm9kZXNbaV0sIGJsb2NrKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGEgbWl4aW4ncyBgYmxvY2tgIGtleXdvcmQuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4aW5CbG9ja30gYmxvY2tcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRNaXhpbkJsb2NrOiBmdW5jdGlvbihibG9jaykge1xuICAgIGlmICh0aGlzLnBwKVxuICAgICAgdGhpcy5idWYucHVzaChcbiAgICAgICAgJ3B1Z19pbmRlbnQucHVzaCgnICtcbiAgICAgICAgICBzdHJpbmdpZnkoQXJyYXkodGhpcy5pbmRlbnRzICsgMSkuam9pbih0aGlzLnBwKSkgK1xuICAgICAgICAgICcpOydcbiAgICAgICk7XG4gICAgdGhpcy5idWYucHVzaCgnYmxvY2sgJiYgYmxvY2soKTsnKTtcbiAgICBpZiAodGhpcy5wcCkgdGhpcy5idWYucHVzaCgncHVnX2luZGVudC5wb3AoKTsnKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYGRvY3R5cGVgLiBTZXRzIHRlcnNlIG1vZGUgdG8gYHRydWVgIHdoZW4gaHRtbCA1XG4gICAqIGlzIHVzZWQsIGNhdXNpbmcgc2VsZi1jbG9zaW5nIHRhZ3MgdG8gZW5kIHdpdGggXCI+XCIgdnMgXCIvPlwiLFxuICAgKiBhbmQgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgbWlycm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RG9jdHlwZX0gZG9jdHlwZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdERvY3R5cGU6IGZ1bmN0aW9uKGRvY3R5cGUpIHtcbiAgICBpZiAoZG9jdHlwZSAmJiAoZG9jdHlwZS52YWwgfHwgIXRoaXMuZG9jdHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0RG9jdHlwZShkb2N0eXBlLnZhbCB8fCAnaHRtbCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvY3R5cGUpIHRoaXMuYnVmZmVyKHRoaXMuZG9jdHlwZSk7XG4gICAgdGhpcy5oYXNDb21waWxlZERvY3R5cGUgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgbWl4aW5gLCBnZW5lcmF0aW5nIGEgZnVuY3Rpb24gdGhhdFxuICAgKiBtYXkgYmUgY2FsbGVkIHdpdGhpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4aW59IG1peGluXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0TWl4aW46IGZ1bmN0aW9uKG1peGluKSB7XG4gICAgdmFyIG5hbWUgPSAncHVnX21peGluc1snO1xuICAgIHZhciBhcmdzID0gbWl4aW4uYXJncyB8fCAnJztcbiAgICB2YXIgYmxvY2sgPSBtaXhpbi5ibG9jaztcbiAgICB2YXIgYXR0cnMgPSBtaXhpbi5hdHRycztcbiAgICB2YXIgYXR0cnNCbG9ja3MgPSB0aGlzLmF0dHJpYnV0ZUJsb2NrcyhtaXhpbi5hdHRyaWJ1dGVCbG9ja3MpO1xuICAgIHZhciBwcCA9IHRoaXMucHA7XG4gICAgdmFyIGR5bmFtaWMgPSBtaXhpbi5uYW1lWzBdID09PSAnIyc7XG4gICAgdmFyIGtleSA9IG1peGluLm5hbWU7XG4gICAgaWYgKGR5bmFtaWMpIHRoaXMuZHluYW1pY01peGlucyA9IHRydWU7XG4gICAgbmFtZSArPVxuICAgICAgKGR5bmFtaWNcbiAgICAgICAgPyBtaXhpbi5uYW1lLnN1YnN0cigyLCBtaXhpbi5uYW1lLmxlbmd0aCAtIDMpXG4gICAgICAgIDogJ1wiJyArIG1peGluLm5hbWUgKyAnXCInKSArICddJztcblxuICAgIHRoaXMubWl4aW5zW2tleV0gPSB0aGlzLm1peGluc1trZXldIHx8IHt1c2VkOiBmYWxzZSwgaW5zdGFuY2VzOiBbXX07XG4gICAgaWYgKG1peGluLmNhbGwpIHtcbiAgICAgIHRoaXMubWl4aW5zW2tleV0udXNlZCA9IHRydWU7XG4gICAgICBpZiAocHApXG4gICAgICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAgICAgJ3B1Z19pbmRlbnQucHVzaCgnICtcbiAgICAgICAgICAgIHN0cmluZ2lmeShBcnJheSh0aGlzLmluZGVudHMgKyAxKS5qb2luKHBwKSkgK1xuICAgICAgICAgICAgJyk7J1xuICAgICAgICApO1xuICAgICAgaWYgKGJsb2NrIHx8IGF0dHJzLmxlbmd0aCB8fCBhdHRyc0Jsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5idWYucHVzaChuYW1lICsgJy5jYWxsKHsnKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCdibG9jazogZnVuY3Rpb24oKXsnKTtcblxuICAgICAgICAgIC8vIFJlbmRlciBibG9jayB3aXRoIG5vIGluZGVudHMsIGR5bmFtaWNhbGx5IGFkZGVkIHdoZW4gcmVuZGVyZWRcbiAgICAgICAgICB0aGlzLnBhcmVudEluZGVudHMrKztcbiAgICAgICAgICB2YXIgX2luZGVudHMgPSB0aGlzLmluZGVudHM7XG4gICAgICAgICAgdGhpcy5pbmRlbnRzID0gMDtcbiAgICAgICAgICB0aGlzLnZpc2l0KG1peGluLmJsb2NrLCBtaXhpbik7XG4gICAgICAgICAgdGhpcy5pbmRlbnRzID0gX2luZGVudHM7XG4gICAgICAgICAgdGhpcy5wYXJlbnRJbmRlbnRzLS07XG5cbiAgICAgICAgICBpZiAoYXR0cnMubGVuZ3RoIHx8IGF0dHJzQmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnfSwnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnfScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRyc0Jsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5hdHRycyhhdHRycyk7XG4gICAgICAgICAgICBhdHRyc0Jsb2Nrcy51bnNoaWZ0KHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRyc0Jsb2Nrcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgICAgICAgICAnYXR0cmlidXRlczogJyArXG4gICAgICAgICAgICAgICAgdGhpcy5ydW50aW1lKCdtZXJnZScpICtcbiAgICAgICAgICAgICAgICAnKFsnICtcbiAgICAgICAgICAgICAgICBhdHRyc0Jsb2Nrcy5qb2luKCcsJykgK1xuICAgICAgICAgICAgICAgICddKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJ2F0dHJpYnV0ZXM6ICcgKyBhdHRyc0Jsb2Nrc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmF0dHJzKGF0dHJzKTtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCdhdHRyaWJ1dGVzOiAnICsgdmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgICAgdGhpcy5idWYucHVzaCgnfSwgJyArIGFyZ3MgKyAnKTsnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9KTsnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWYucHVzaChuYW1lICsgJygnICsgYXJncyArICcpOycpO1xuICAgICAgfVxuICAgICAgaWYgKHBwKSB0aGlzLmJ1Zi5wdXNoKCdwdWdfaW5kZW50LnBvcCgpOycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWl4aW5fc3RhcnQgPSB0aGlzLmJ1Zi5sZW5ndGg7XG4gICAgICBhcmdzID0gYXJncyA/IGFyZ3Muc3BsaXQoJywnKSA6IFtdO1xuICAgICAgdmFyIHJlc3Q7XG4gICAgICBpZiAoYXJncy5sZW5ndGggJiYgL15cXC5cXC5cXC4vLnRlc3QoYXJnc1thcmdzLmxlbmd0aCAtIDFdLnRyaW0oKSkpIHtcbiAgICAgICAgcmVzdCA9IGFyZ3NcbiAgICAgICAgICAucG9wKClcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnJlcGxhY2UoL15cXC5cXC5cXC4vLCAnJyk7XG4gICAgICB9XG4gICAgICAvLyB3ZSBuZWVkIHVzZSBwdWdfaW50ZXJwIGhlcmUgZm9yIHY4OiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDE2NVxuICAgICAgLy8gb25jZSBmaXhlZCwgdXNlIHRoaXM6IHRoaXMuYnVmLnB1c2gobmFtZSArICcgPSBmdW5jdGlvbignICsgYXJncy5qb2luKCcsJykgKyAnKXsnKTtcbiAgICAgIHRoaXMuYnVmLnB1c2gobmFtZSArICcgPSBwdWdfaW50ZXJwID0gZnVuY3Rpb24oJyArIGFyZ3Muam9pbignLCcpICsgJyl7Jyk7XG4gICAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgICAndmFyIGJsb2NrID0gKHRoaXMgJiYgdGhpcy5ibG9jayksIGF0dHJpYnV0ZXMgPSAodGhpcyAmJiB0aGlzLmF0dHJpYnV0ZXMpIHx8IHt9OydcbiAgICAgICk7XG4gICAgICBpZiAocmVzdCkge1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd2YXIgJyArIHJlc3QgKyAnID0gW107Jyk7XG4gICAgICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAgICAgJ2ZvciAocHVnX2ludGVycCA9ICcgK1xuICAgICAgICAgICAgYXJncy5sZW5ndGggK1xuICAgICAgICAgICAgJzsgcHVnX2ludGVycCA8IGFyZ3VtZW50cy5sZW5ndGg7IHB1Z19pbnRlcnArKykgeydcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnICAnICsgcmVzdCArICcucHVzaChhcmd1bWVudHNbcHVnX2ludGVycF0pOycpO1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudEluZGVudHMrKztcbiAgICAgIHRoaXMudmlzaXQoYmxvY2ssIG1peGluKTtcbiAgICAgIHRoaXMucGFyZW50SW5kZW50cy0tO1xuICAgICAgdGhpcy5idWYucHVzaCgnfTsnKTtcbiAgICAgIHZhciBtaXhpbl9lbmQgPSB0aGlzLmJ1Zi5sZW5ndGg7XG4gICAgICB0aGlzLm1peGluc1trZXldLmluc3RhbmNlcy5wdXNoKHtzdGFydDogbWl4aW5fc3RhcnQsIGVuZDogbWl4aW5fZW5kfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgdGFnYCBidWZmZXJpbmcgdGFnIG1hcmt1cCwgZ2VuZXJhdGluZ1xuICAgKiBhdHRyaWJ1dGVzLCB2aXNpdGluZyB0aGUgYHRhZ2AncyBjb2RlIGFuZCBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHtUYWd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGludGVycG9sYXRlZFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdFRhZzogZnVuY3Rpb24odGFnLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB0aGlzLmluZGVudHMrKztcbiAgICB2YXIgbmFtZSA9IHRhZy5uYW1lLFxuICAgICAgcHAgPSB0aGlzLnBwLFxuICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBidWZmZXJOYW1lKCkge1xuICAgICAgaWYgKGludGVycG9sYXRlZCkgc2VsZi5idWZmZXJFeHByZXNzaW9uKHRhZy5leHByKTtcbiAgICAgIGVsc2Ugc2VsZi5idWZmZXIobmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKFdISVRFX1NQQUNFX1NFTlNJVElWRV9UQUdTW3RhZy5uYW1lXSA9PT0gdHJ1ZSlcbiAgICAgIHRoaXMuZXNjYXBlUHJldHR5TW9kZSA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuaGFzQ29tcGlsZWRUYWcpIHtcbiAgICAgIGlmICghdGhpcy5oYXNDb21waWxlZERvY3R5cGUgJiYgJ2h0bWwnID09IG5hbWUpIHtcbiAgICAgICAgdGhpcy52aXNpdERvY3R5cGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFzQ29tcGlsZWRUYWcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHByZXR0eSBwcmludFxuICAgIGlmIChwcCAmJiAhdGFnLmlzSW5saW5lKSB0aGlzLnByZXR0eUluZGVudCgwLCB0cnVlKTtcbiAgICBpZiAodGFnLnNlbGZDbG9zaW5nIHx8ICghdGhpcy54bWwgJiYgc2VsZkNsb3NpbmdbdGFnLm5hbWVdKSkge1xuICAgICAgdGhpcy5idWZmZXIoJzwnKTtcbiAgICAgIGJ1ZmZlck5hbWUoKTtcbiAgICAgIHRoaXMudmlzaXRBdHRyaWJ1dGVzKFxuICAgICAgICB0YWcuYXR0cnMsXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQmxvY2tzKHRhZy5hdHRyaWJ1dGVCbG9ja3MpXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMudGVyc2UgJiYgIXRhZy5zZWxmQ2xvc2luZykge1xuICAgICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXIoJy8+Jyk7XG4gICAgICB9XG4gICAgICAvLyBpZiBpdCBpcyBub24tZW1wdHkgdGhyb3cgYW4gZXJyb3JcbiAgICAgIGlmIChcbiAgICAgICAgdGFnLmNvZGUgfHxcbiAgICAgICAgKHRhZy5ibG9jayAmJlxuICAgICAgICAgICEodGFnLmJsb2NrLnR5cGUgPT09ICdCbG9jaycgJiYgdGFnLmJsb2NrLm5vZGVzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICAgICB0YWcuYmxvY2subm9kZXMuc29tZShmdW5jdGlvbih0YWcpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcudHlwZSAhPT0gJ1RleHQnIHx8ICEvXlxccyokLy50ZXN0KHRhZy52YWwpO1xuICAgICAgICAgIH0pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgbmFtZSArXG4gICAgICAgICAgICAnIGlzIGEgc2VsZiBjbG9zaW5nIGVsZW1lbnQ6IDwnICtcbiAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgJy8+IGJ1dCBjb250YWlucyBuZXN0ZWQgY29udGVudC4nLFxuICAgICAgICAgICdTRUxGX0NMT1NJTkdfQ09OVEVOVCcsXG4gICAgICAgICAgdGFnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9wdGltaXplIGF0dHJpYnV0ZXMgYnVmZmVyaW5nXG4gICAgICB0aGlzLmJ1ZmZlcignPCcpO1xuICAgICAgYnVmZmVyTmFtZSgpO1xuICAgICAgdGhpcy52aXNpdEF0dHJpYnV0ZXMoXG4gICAgICAgIHRhZy5hdHRycyxcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVCbG9ja3ModGFnLmF0dHJpYnV0ZUJsb2NrcylcbiAgICAgICk7XG4gICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgICAgaWYgKHRhZy5jb2RlKSB0aGlzLnZpc2l0Q29kZSh0YWcuY29kZSk7XG4gICAgICB0aGlzLnZpc2l0KHRhZy5ibG9jaywgdGFnKTtcblxuICAgICAgLy8gcHJldHR5IHByaW50XG4gICAgICBpZiAoXG4gICAgICAgIHBwICYmXG4gICAgICAgICF0YWcuaXNJbmxpbmUgJiZcbiAgICAgICAgV0hJVEVfU1BBQ0VfU0VOU0lUSVZFX1RBR1NbdGFnLm5hbWVdICE9PSB0cnVlICYmXG4gICAgICAgICF0YWdDYW5JbmxpbmUodGFnKVxuICAgICAgKVxuICAgICAgICB0aGlzLnByZXR0eUluZGVudCgwLCB0cnVlKTtcblxuICAgICAgdGhpcy5idWZmZXIoJzwvJyk7XG4gICAgICBidWZmZXJOYW1lKCk7XG4gICAgICB0aGlzLmJ1ZmZlcignPicpO1xuICAgIH1cblxuICAgIGlmIChXSElURV9TUEFDRV9TRU5TSVRJVkVfVEFHU1t0YWcubmFtZV0gPT09IHRydWUpXG4gICAgICB0aGlzLmVzY2FwZVByZXR0eU1vZGUgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5kZW50cy0tO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBJbnRlcnBvbGF0ZWRUYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7SW50ZXJwb2xhdGVkVGFnfSB0YWdcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRJbnRlcnBvbGF0ZWRUYWc6IGZ1bmN0aW9uKHRhZykge1xuICAgIHJldHVybiB0aGlzLnZpc2l0VGFnKHRhZywgdHJ1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGB0ZXh0YCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RleHR9IHRleHRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRUZXh0OiBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdGhpcy5idWZmZXIodGV4dC52YWwpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBhIGBjb21tZW50YCwgb25seSBidWZmZXJpbmcgd2hlbiB0aGUgYnVmZmVyIGZsYWcgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1lbnR9IGNvbW1lbnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRDb21tZW50OiBmdW5jdGlvbihjb21tZW50KSB7XG4gICAgaWYgKCFjb21tZW50LmJ1ZmZlcikgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBwKSB0aGlzLnByZXR0eUluZGVudCgxLCB0cnVlKTtcbiAgICB0aGlzLmJ1ZmZlcignPCEtLScgKyBjb21tZW50LnZhbCArICctLT4nKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYSBgWWllbGRCbG9ja2AuXG4gICAqXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGFsbG93IGNvbXBpbGluZyBhIGZpbGUgd2l0aCBgeWllbGRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1lpZWxkQmxvY2t9IGJsb2NrXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0WWllbGRCbG9jazogZnVuY3Rpb24oYmxvY2spIHt9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBhIGBCbG9ja0NvbW1lbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1lbnR9IGNvbW1lbnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRCbG9ja0NvbW1lbnQ6IGZ1bmN0aW9uKGNvbW1lbnQpIHtcbiAgICBpZiAoIWNvbW1lbnQuYnVmZmVyKSByZXR1cm47XG4gICAgaWYgKHRoaXMucHApIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIHRoaXMuYnVmZmVyKCc8IS0tJyArIChjb21tZW50LnZhbCB8fCAnJykpO1xuICAgIHRoaXMudmlzaXQoY29tbWVudC5ibG9jaywgY29tbWVudCk7XG4gICAgaWYgKHRoaXMucHApIHRoaXMucHJldHR5SW5kZW50KDEsIHRydWUpO1xuICAgIHRoaXMuYnVmZmVyKCctLT4nKTtcbiAgfSxcblxuICAvKipcbiAgICogVmlzaXQgYGNvZGVgLCByZXNwZWN0aW5nIGJ1ZmZlciAvIGVzY2FwZSBmbGFncy5cbiAgICogSWYgdGhlIGNvZGUgaXMgZm9sbG93ZWQgYnkgYSBibG9jaywgd3JhcCBpdCBpblxuICAgKiBhIHNlbGYtY2FsbGluZyBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb2RlfSBjb2RlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0Q29kZTogZnVuY3Rpb24oY29kZSkge1xuICAgIC8vIFdyYXAgY29kZSBibG9ja3Mgd2l0aCB7fS5cbiAgICAvLyB3ZSBvbmx5IHdyYXAgdW5idWZmZXJlZCBjb2RlIGJsb2NrcyBBVE1cbiAgICAvLyBzaW5jZSB0aGV5IGFyZSB1c3VhbGx5IGZsb3cgY29udHJvbFxuXG4gICAgLy8gQnVmZmVyIGNvZGVcbiAgICBpZiAoY29kZS5idWZmZXIpIHtcbiAgICAgIHZhciB2YWwgPSBjb2RlLnZhbC50cmltKCk7XG4gICAgICB2YWwgPSAnbnVsbCA9PSAocHVnX2ludGVycCA9ICcgKyB2YWwgKyAnKSA/IFwiXCIgOiBwdWdfaW50ZXJwJztcbiAgICAgIGlmIChjb2RlLm11c3RFc2NhcGUgIT09IGZhbHNlKVxuICAgICAgICB2YWwgPSB0aGlzLnJ1bnRpbWUoJ2VzY2FwZScpICsgJygnICsgdmFsICsgJyknO1xuICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmLnB1c2goY29kZS52YWwpO1xuICAgIH1cblxuICAgIC8vIEJsb2NrIHN1cHBvcnRcbiAgICBpZiAoY29kZS5ibG9jaykge1xuICAgICAgaWYgKCFjb2RlLmJ1ZmZlcikgdGhpcy5idWYucHVzaCgneycpO1xuICAgICAgdGhpcy52aXNpdChjb2RlLmJsb2NrLCBjb2RlKTtcbiAgICAgIGlmICghY29kZS5idWZmZXIpIHRoaXMuYnVmLnB1c2goJ30nKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBDb25kaXRpb25hbGAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uYWx9IGNvbmRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmlzaXRDb25kaXRpb25hbDogZnVuY3Rpb24oY29uZCkge1xuICAgIHZhciB0ZXN0ID0gY29uZC50ZXN0O1xuICAgIHRoaXMuYnVmLnB1c2goJ2lmICgnICsgdGVzdCArICcpIHsnKTtcbiAgICB0aGlzLnZpc2l0KGNvbmQuY29uc2VxdWVudCwgY29uZCk7XG4gICAgdGhpcy5idWYucHVzaCgnfScpO1xuICAgIGlmIChjb25kLmFsdGVybmF0ZSkge1xuICAgICAgaWYgKGNvbmQuYWx0ZXJuYXRlLnR5cGUgPT09ICdDb25kaXRpb25hbCcpIHtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnZWxzZScpO1xuICAgICAgICB0aGlzLnZpc2l0Q29uZGl0aW9uYWwoY29uZC5hbHRlcm5hdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWYucHVzaCgnZWxzZSB7Jyk7XG4gICAgICAgIHRoaXMudmlzaXQoY29uZC5hbHRlcm5hdGUsIGNvbmQpO1xuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgV2hpbGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1doaWxlfSBsb29wXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0V2hpbGU6IGZ1bmN0aW9uKGxvb3ApIHtcbiAgICB2YXIgdGVzdCA9IGxvb3AudGVzdDtcbiAgICB0aGlzLmJ1Zi5wdXNoKCd3aGlsZSAoJyArIHRlc3QgKyAnKSB7Jyk7XG4gICAgdGhpcy52aXNpdChsb29wLmJsb2NrLCBsb29wKTtcbiAgICB0aGlzLmJ1Zi5wdXNoKCd9Jyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpc2l0IGBlYWNoYCBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHtFYWNofSBlYWNoXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZpc2l0RWFjaDogZnVuY3Rpb24oZWFjaCkge1xuICAgIHZhciBpbmRleFZhck5hbWUgPSBlYWNoLmtleSB8fCAncHVnX2luZGV4JyArIHRoaXMuZWFjaENvdW50O1xuICAgIHRoaXMuZWFjaENvdW50Kys7XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgJycgK1xuICAgICAgICAnLy8gaXRlcmF0ZSAnICtcbiAgICAgICAgZWFjaC5vYmogK1xuICAgICAgICAnXFxuJyArXG4gICAgICAgICc7KGZ1bmN0aW9uKCl7XFxuJyArXG4gICAgICAgICcgIHZhciAkJG9iaiA9ICcgK1xuICAgICAgICBlYWNoLm9iaiArXG4gICAgICAgICc7XFxuJyArXG4gICAgICAgIFwiICBpZiAoJ251bWJlcicgPT0gdHlwZW9mICQkb2JqLmxlbmd0aCkge1wiXG4gICAgKTtcblxuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIGlmICgkJG9iai5sZW5ndGgpIHsnKTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKFxuICAgICAgJycgK1xuICAgICAgICAnICAgICAgZm9yICh2YXIgJyArXG4gICAgICAgIGluZGV4VmFyTmFtZSArXG4gICAgICAgICcgPSAwLCAkJGwgPSAkJG9iai5sZW5ndGg7ICcgK1xuICAgICAgICBpbmRleFZhck5hbWUgK1xuICAgICAgICAnIDwgJCRsOyAnICtcbiAgICAgICAgaW5kZXhWYXJOYW1lICtcbiAgICAgICAgJysrKSB7XFxuJyArXG4gICAgICAgICcgICAgICAgIHZhciAnICtcbiAgICAgICAgZWFjaC52YWwgK1xuICAgICAgICAnID0gJCRvYmpbJyArXG4gICAgICAgIGluZGV4VmFyTmFtZSArXG4gICAgICAgICddOydcbiAgICApO1xuXG4gICAgdGhpcy52aXNpdChlYWNoLmJsb2NrLCBlYWNoKTtcblxuICAgIHRoaXMuYnVmLnB1c2goJyAgICAgIH0nKTtcblxuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIH0gZWxzZSB7Jyk7XG4gICAgICB0aGlzLnZpc2l0KGVhY2guYWx0ZXJuYXRlLCBlYWNoKTtcbiAgICAgIHRoaXMuYnVmLnB1c2goJyAgICB9Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5idWYucHVzaChcbiAgICAgICcnICtcbiAgICAgICAgJyAgfSBlbHNlIHtcXG4nICtcbiAgICAgICAgJyAgICB2YXIgJCRsID0gMDtcXG4nICtcbiAgICAgICAgJyAgICBmb3IgKHZhciAnICtcbiAgICAgICAgaW5kZXhWYXJOYW1lICtcbiAgICAgICAgJyBpbiAkJG9iaikge1xcbicgK1xuICAgICAgICAnICAgICAgJCRsKys7XFxuJyArXG4gICAgICAgICcgICAgICB2YXIgJyArXG4gICAgICAgIGVhY2gudmFsICtcbiAgICAgICAgJyA9ICQkb2JqWycgK1xuICAgICAgICBpbmRleFZhck5hbWUgK1xuICAgICAgICAnXTsnXG4gICAgKTtcblxuICAgIHRoaXMudmlzaXQoZWFjaC5ibG9jaywgZWFjaCk7XG5cbiAgICB0aGlzLmJ1Zi5wdXNoKCcgICAgfScpO1xuICAgIGlmIChlYWNoLmFsdGVybmF0ZSkge1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIGlmICgkJGwgPT09IDApIHsnKTtcbiAgICAgIHRoaXMudmlzaXQoZWFjaC5hbHRlcm5hdGUsIGVhY2gpO1xuICAgICAgdGhpcy5idWYucHVzaCgnICAgIH0nKTtcbiAgICB9XG4gICAgdGhpcy5idWYucHVzaCgnICB9XFxufSkuY2FsbCh0aGlzKTtcXG4nKTtcbiAgfSxcblxuICB2aXNpdEVhY2hPZjogZnVuY3Rpb24oZWFjaCkge1xuICAgIHRoaXMuYnVmLnB1c2goXG4gICAgICAnJyArXG4gICAgICAgICcvLyBpdGVyYXRlICcgK1xuICAgICAgICBlYWNoLm9iaiArXG4gICAgICAgICdcXG4nICtcbiAgICAgICAgJ2ZvciAoY29uc3QgJyArXG4gICAgICAgIGVhY2gudmFsICtcbiAgICAgICAgJyBvZiAnICtcbiAgICAgICAgZWFjaC5vYmogK1xuICAgICAgICAnKSB7XFxuJ1xuICAgICk7XG5cbiAgICB0aGlzLnZpc2l0KGVhY2guYmxvY2ssIGVhY2gpO1xuXG4gICAgdGhpcy5idWYucHVzaCgnfVxcbicpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBWaXNpdCBgYXR0cnNgLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhdHRyc1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB2aXNpdEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGF0dHJzLCBhdHRyaWJ1dGVCbG9ja3MpIHtcbiAgICBpZiAoYXR0cmlidXRlQmxvY2tzLmxlbmd0aCkge1xuICAgICAgaWYgKGF0dHJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5hdHRycyhhdHRycyk7XG4gICAgICAgIGF0dHJpYnV0ZUJsb2Nrcy51bnNoaWZ0KHZhbCk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlQmxvY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMucnVudGltZSgnYXR0cnMnKSArXG4gICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgdGhpcy5ydW50aW1lKCdtZXJnZScpICtcbiAgICAgICAgICAgICcoWycgK1xuICAgICAgICAgICAgYXR0cmlidXRlQmxvY2tzLmpvaW4oJywnKSArXG4gICAgICAgICAgICAnXSksICcgK1xuICAgICAgICAgICAgc3RyaW5naWZ5KHRoaXMudGVyc2UpICtcbiAgICAgICAgICAgICcpJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXJFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMucnVudGltZSgnYXR0cnMnKSArXG4gICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgYXR0cmlidXRlQmxvY2tzWzBdICtcbiAgICAgICAgICAgICcsICcgK1xuICAgICAgICAgICAgc3RyaW5naWZ5KHRoaXMudGVyc2UpICtcbiAgICAgICAgICAgICcpJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXR0cnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmF0dHJzKGF0dHJzLCB0cnVlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbXBpbGUgYXR0cmlidXRlcy5cbiAgICovXG5cbiAgYXR0cnM6IGZ1bmN0aW9uKGF0dHJzLCBidWZmZXIpIHtcbiAgICB2YXIgcmVzID0gY29tcGlsZUF0dHJzKGF0dHJzLCB7XG4gICAgICB0ZXJzZTogdGhpcy50ZXJzZSxcbiAgICAgIGZvcm1hdDogYnVmZmVyID8gJ2h0bWwnIDogJ29iamVjdCcsXG4gICAgICBydW50aW1lOiB0aGlzLnJ1bnRpbWUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICBpZiAoYnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlckV4cHJlc3Npb24ocmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcblxuICAvKipcbiAgICogQ29tcGlsZSBhdHRyaWJ1dGUgYmxvY2tzLlxuICAgKi9cblxuICBhdHRyaWJ1dGVCbG9ja3M6IGZ1bmN0aW9uKGF0dHJpYnV0ZUJsb2Nrcykge1xuICAgIHJldHVybiAoXG4gICAgICBhdHRyaWJ1dGVCbG9ja3MgJiZcbiAgICAgIGF0dHJpYnV0ZUJsb2Nrcy5zbGljZSgpLm1hcChmdW5jdGlvbihhdHRyQmxvY2spIHtcbiAgICAgICAgcmV0dXJuIGF0dHJCbG9jay52YWw7XG4gICAgICB9KVxuICAgICk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0YWdDYW5JbmxpbmUodGFnKSB7XG4gIGZ1bmN0aW9uIGlzSW5saW5lKG5vZGUpIHtcbiAgICAvLyBSZWN1cnNlIGlmIHRoZSBub2RlIGlzIGEgYmxvY2tcbiAgICBpZiAobm9kZS50eXBlID09PSAnQmxvY2snKSByZXR1cm4gbm9kZS5ub2Rlcy5ldmVyeShpc0lubGluZSk7XG4gICAgLy8gV2hlbiB0aGVyZSBpcyBhIFlpZWxkQmxvY2sgaGVyZSwgaXQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIGlzXG4gICAgLy8gZXhwZWN0ZWQgdG8gYmUgaW5jbHVkZWQgYnV0IGlzIG5vdC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlIGJsb2NrXG4gICAgLy8gbXVzdCBiZSBlbXB0eS5cbiAgICBpZiAobm9kZS50eXBlID09PSAnWWllbGRCbG9jaycpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAobm9kZS50eXBlID09PSAnVGV4dCcgJiYgIS9cXG4vLnRlc3Qobm9kZS52YWwpKSB8fCBub2RlLmlzSW5saW5lO1xuICB9XG5cbiAgcmV0dXJuIHRhZy5ibG9jay5ub2Rlcy5ldmVyeShpc0lubGluZSk7XG59XG4iLCAidmFyIHJ1bnRpbWUgPSByZXF1aXJlKCcuLycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5mdW5jdGlvbiB3cmFwKHRlbXBsYXRlLCB0ZW1wbGF0ZU5hbWUpIHtcbiAgdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lIHx8ICd0ZW1wbGF0ZSc7XG4gIHJldHVybiBGdW5jdGlvbihcbiAgICAncHVnJyxcbiAgICB0ZW1wbGF0ZSArICdcXG4nICsgJ3JldHVybiAnICsgdGVtcGxhdGVOYW1lICsgJzsnXG4gICkocnVudGltZSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiFcbiAqIFB1Z1xuICogQ29weXJpZ2h0KGMpIDIwMTAgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgbGV4ID0gcmVxdWlyZSgncHVnLWxleGVyJyk7XG52YXIgc3RyaXBDb21tZW50cyA9IHJlcXVpcmUoJ3B1Zy1zdHJpcC1jb21tZW50cycpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgncHVnLXBhcnNlcicpO1xudmFyIGxvYWQgPSByZXF1aXJlKCdwdWctbG9hZCcpO1xudmFyIGZpbHRlcnMgPSByZXF1aXJlKCdwdWctZmlsdGVycycpO1xudmFyIGxpbmsgPSByZXF1aXJlKCdwdWctbGlua2VyJyk7XG52YXIgZ2VuZXJhdGVDb2RlID0gcmVxdWlyZSgncHVnLWNvZGUtZ2VuJyk7XG52YXIgcnVudGltZSA9IHJlcXVpcmUoJ3B1Zy1ydW50aW1lJyk7XG52YXIgcnVudGltZVdyYXAgPSByZXF1aXJlKCdwdWctcnVudGltZS93cmFwJyk7XG5cbi8qKlxuICogTmFtZSBmb3IgZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0cy5uYW1lID0gJ1B1Zyc7XG5cbi8qKlxuICogUHVnIHJ1bnRpbWUgaGVscGVycy5cbiAqL1xuXG5leHBvcnRzLnJ1bnRpbWUgPSBydW50aW1lO1xuXG4vKipcbiAqIFRlbXBsYXRlIGZ1bmN0aW9uIGNhY2hlLlxuICovXG5cbmV4cG9ydHMuY2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gYXBwbHlQbHVnaW5zKHZhbHVlLCBvcHRpb25zLCBwbHVnaW5zLCBuYW1lKSB7XG4gIHJldHVybiBwbHVnaW5zLnJlZHVjZShmdW5jdGlvbih2YWx1ZSwgcGx1Z2luKSB7XG4gICAgcmV0dXJuIHBsdWdpbltuYW1lXSA/IHBsdWdpbltuYW1lXSh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbiAgfSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsIG5hbWUpIHtcbiAgdmFyIGVsaWdpYmxlUGx1Z2lucyA9IHBsdWdpbnMuZmlsdGVyKGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBwbHVnaW5bbmFtZV07XG4gIH0pO1xuXG4gIGlmIChlbGlnaWJsZVBsdWdpbnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHdvIG9yIG1vcmUgcGx1Z2lucyBhbGwgaW1wbGVtZW50ICcgKyBuYW1lICsgJyBtZXRob2QuJyk7XG4gIH0gZWxzZSBpZiAoZWxpZ2libGVQbHVnaW5zLmxlbmd0aCkge1xuICAgIHJldHVybiBlbGlnaWJsZVBsdWdpbnNbMF1bbmFtZV0uYmluZChlbGlnaWJsZVBsdWdpbnNbMF0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE9iamVjdCBmb3IgZ2xvYmFsIGN1c3RvbSBmaWx0ZXJzLiAgTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBqdXN0IHBhc3MgYSBgZmlsdGVyc2BcbiAqIG9wdGlvbiB0byBhbnkgb3RoZXIgbWV0aG9kLlxuICovXG5leHBvcnRzLmZpbHRlcnMgPSB7fTtcblxuLyoqXG4gKiBDb21waWxlIHRoZSBnaXZlbiBgc3RyYCBvZiBwdWcgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGJvZHkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVCb2R5KHN0ciwgb3B0aW9ucykge1xuICB2YXIgZGVidWdfc291cmNlcyA9IHt9O1xuICBkZWJ1Z19zb3VyY2VzW29wdGlvbnMuZmlsZW5hbWVdID0gc3RyO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gW107XG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zIHx8IFtdO1xuICB2YXIgYXN0ID0gbG9hZC5zdHJpbmcoc3RyLCB7XG4gICAgZmlsZW5hbWU6IG9wdGlvbnMuZmlsZW5hbWUsXG4gICAgYmFzZWRpcjogb3B0aW9ucy5iYXNlZGlyLFxuICAgIGxleDogZnVuY3Rpb24oc3RyLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGV4T3B0aW9ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgbGV4T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfSk7XG4gICAgICBsZXhPcHRpb25zLnBsdWdpbnMgPSBwbHVnaW5zXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICAgICAgcmV0dXJuICEhcGx1Z2luLmxleDtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihwbHVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLmxleDtcbiAgICAgICAgfSk7XG4gICAgICB2YXIgY29udGVudHMgPSBhcHBseVBsdWdpbnMoXG4gICAgICAgIHN0cixcbiAgICAgICAge2ZpbGVuYW1lOiBvcHRpb25zLmZpbGVuYW1lfSxcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgJ3ByZUxleCdcbiAgICAgICk7XG4gICAgICByZXR1cm4gYXBwbHlQbHVnaW5zKFxuICAgICAgICBsZXgoY29udGVudHMsIGxleE9wdGlvbnMpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBwbHVnaW5zLFxuICAgICAgICAncG9zdExleCdcbiAgICAgICk7XG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24odG9rZW5zLCBvcHRpb25zKSB7XG4gICAgICB0b2tlbnMgPSB0b2tlbnMubWFwKGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAncGF0aCcgJiYgcGF0aC5leHRuYW1lKHRva2VuLnZhbCkgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXRoJyxcbiAgICAgICAgICAgIGxvYzogdG9rZW4ubG9jLFxuICAgICAgICAgICAgdmFsOiB0b2tlbi52YWwgKyAnLnB1ZycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9KTtcbiAgICAgIHRva2VucyA9IHN0cmlwQ29tbWVudHModG9rZW5zLCBvcHRpb25zKTtcbiAgICAgIHRva2VucyA9IGFwcGx5UGx1Z2lucyh0b2tlbnMsIG9wdGlvbnMsIHBsdWdpbnMsICdwcmVQYXJzZScpO1xuICAgICAgdmFyIHBhcnNlT3B0aW9ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcGFyc2VPcHRpb25zW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICB9KTtcbiAgICAgIHBhcnNlT3B0aW9ucy5wbHVnaW5zID0gcGx1Z2luc1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHBsdWdpbikge1xuICAgICAgICAgIHJldHVybiAhIXBsdWdpbi5wYXJzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbihwbHVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLnBhcnNlO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFwcGx5UGx1Z2lucyhcbiAgICAgICAgYXBwbHlQbHVnaW5zKFxuICAgICAgICAgIHBhcnNlKHRva2VucywgcGFyc2VPcHRpb25zKSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHBsdWdpbnMsXG4gICAgICAgICAgJ3Bvc3RQYXJzZSdcbiAgICAgICAgKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgJ3ByZUxvYWQnXG4gICAgICApO1xuICAgIH0sXG4gICAgcmVzb2x2ZTogZnVuY3Rpb24oZmlsZW5hbWUsIHNvdXJjZSwgbG9hZE9wdGlvbnMpIHtcbiAgICAgIHZhciByZXBsYWNlbWVudEZ1bmMgPSBmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsICdyZXNvbHZlJyk7XG4gICAgICBpZiAocmVwbGFjZW1lbnRGdW5jKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudEZ1bmMoZmlsZW5hbWUsIHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkLnJlc29sdmUoZmlsZW5hbWUsIHNvdXJjZSwgbG9hZE9wdGlvbnMpO1xuICAgIH0sXG4gICAgcmVhZDogZnVuY3Rpb24oZmlsZW5hbWUsIGxvYWRPcHRpb25zKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChmaWxlbmFtZSk7XG5cbiAgICAgIHZhciBjb250ZW50cztcblxuICAgICAgdmFyIHJlcGxhY2VtZW50RnVuYyA9IGZpbmRSZXBsYWNlbWVudEZ1bmMocGx1Z2lucywgJ3JlYWQnKTtcbiAgICAgIGlmIChyZXBsYWNlbWVudEZ1bmMpIHtcbiAgICAgICAgY29udGVudHMgPSByZXBsYWNlbWVudEZ1bmMoZmlsZW5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudHMgPSBsb2FkLnJlYWQoZmlsZW5hbWUsIGxvYWRPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgZGVidWdfc291cmNlc1tmaWxlbmFtZV0gPSBCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpXG4gICAgICAgID8gY29udGVudHMudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IGNvbnRlbnRzO1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH0sXG4gIH0pO1xuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdExvYWQnKTtcbiAgYXN0ID0gYXBwbHlQbHVnaW5zKGFzdCwgb3B0aW9ucywgcGx1Z2lucywgJ3ByZUZpbHRlcnMnKTtcblxuICB2YXIgZmlsdGVyc1NldCA9IHt9O1xuICBPYmplY3Qua2V5cyhleHBvcnRzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgZmlsdGVyc1NldFtrZXldID0gZXhwb3J0cy5maWx0ZXJzW2tleV07XG4gIH0pO1xuICBpZiAob3B0aW9ucy5maWx0ZXJzKSB7XG4gICAgT2JqZWN0LmtleXMob3B0aW9ucy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgZmlsdGVyc1NldFtrZXldID0gb3B0aW9ucy5maWx0ZXJzW2tleV07XG4gICAgfSk7XG4gIH1cbiAgYXN0ID0gZmlsdGVycy5oYW5kbGVGaWx0ZXJzKFxuICAgIGFzdCxcbiAgICBmaWx0ZXJzU2V0LFxuICAgIG9wdGlvbnMuZmlsdGVyT3B0aW9ucyxcbiAgICBvcHRpb25zLmZpbHRlckFsaWFzZXNcbiAgKTtcblxuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdEZpbHRlcnMnKTtcbiAgYXN0ID0gYXBwbHlQbHVnaW5zKGFzdCwgb3B0aW9ucywgcGx1Z2lucywgJ3ByZUxpbmsnKTtcbiAgYXN0ID0gbGluayhhc3QpO1xuICBhc3QgPSBhcHBseVBsdWdpbnMoYXN0LCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdExpbmsnKTtcblxuICAvLyBDb21waWxlXG4gIGFzdCA9IGFwcGx5UGx1Z2lucyhhc3QsIG9wdGlvbnMsIHBsdWdpbnMsICdwcmVDb2RlR2VuJyk7XG4gIHZhciBqcyA9IChmaW5kUmVwbGFjZW1lbnRGdW5jKHBsdWdpbnMsICdnZW5lcmF0ZUNvZGUnKSB8fCBnZW5lcmF0ZUNvZGUpKGFzdCwge1xuICAgIHByZXR0eTogb3B0aW9ucy5wcmV0dHksXG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBkb2N0eXBlOiBvcHRpb25zLmRvY3R5cGUsXG4gICAgaW5saW5lUnVudGltZUZ1bmN0aW9uczogb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zLFxuICAgIGdsb2JhbHM6IG9wdGlvbnMuZ2xvYmFscyxcbiAgICBzZWxmOiBvcHRpb25zLnNlbGYsXG4gICAgaW5jbHVkZVNvdXJjZXM6IG9wdGlvbnMuaW5jbHVkZVNvdXJjZXMgPyBkZWJ1Z19zb3VyY2VzIDogZmFsc2UsXG4gICAgdGVtcGxhdGVOYW1lOiBvcHRpb25zLnRlbXBsYXRlTmFtZSxcbiAgfSk7XG4gIGpzID0gYXBwbHlQbHVnaW5zKGpzLCBvcHRpb25zLCBwbHVnaW5zLCAncG9zdENvZGVHZW4nKTtcblxuICAvLyBEZWJ1ZyBjb21waWxlclxuICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAnXFxuQ29tcGlsZWQgRnVuY3Rpb246XFxuXFxuXFx1MDAxYls5MG0lc1xcdTAwMWJbMG0nLFxuICAgICAganMucmVwbGFjZSgvXi9nbSwgJyAgJylcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtib2R5OiBqcywgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXN9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgdGVtcGxhdGUgZnJvbSBhIHN0cmluZyBvciBhIGZpbGUsIGVpdGhlciBjb21waWxlZCBvbi10aGUtZmx5IG9yXG4gKiByZWFkIGZyb20gY2FjaGUgKGlmIGVuYWJsZWQpLCBhbmQgY2FjaGUgdGhlIHRlbXBsYXRlIGlmIG5lZWRlZC5cbiAqXG4gKiBJZiBgc3RyYCBpcyBub3Qgc2V0LCB0aGUgZmlsZSBzcGVjaWZpZWQgaW4gYG9wdGlvbnMuZmlsZW5hbWVgIHdpbGwgYmUgcmVhZC5cbiAqXG4gKiBJZiBgb3B0aW9ucy5jYWNoZWAgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZmlsZSBmcm9tXG4gKiBgb3B0aW9ucy5maWxlbmFtZWAgc28gaXQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZz19IHN0clxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaGFuZGxlVGVtcGxhdGVDYWNoZShvcHRpb25zLCBzdHIpIHtcbiAgdmFyIGtleSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gIGlmIChvcHRpb25zLmNhY2hlICYmIGV4cG9ydHMuY2FjaGVba2V5XSkge1xuICAgIHJldHVybiBleHBvcnRzLmNhY2hlW2tleV07XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSBzdHIgPSBmcy5yZWFkRmlsZVN5bmMob3B0aW9ucy5maWxlbmFtZSwgJ3V0ZjgnKTtcbiAgICB2YXIgdGVtcGwgPSBleHBvcnRzLmNvbXBpbGUoc3RyLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5jYWNoZSkgZXhwb3J0cy5jYWNoZVtrZXldID0gdGVtcGw7XG4gICAgcmV0dXJuIHRlbXBsO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGBGdW5jdGlvbmAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHB1ZyBgc3RyYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgY29tcGlsZURlYnVnYCB3aGVuIGBmYWxzZWAgZGVidWdnaW5nIGNvZGUgaXMgc3RyaXBwZWQgZnJvbSB0aGUgY29tcGlsZWRcbiAgICAgICB0ZW1wbGF0ZSwgd2hlbiBpdCBpcyBleHBsaWNpdGx5IGB0cnVlYCwgdGhlIHNvdXJjZSBjb2RlIGlzIGluY2x1ZGVkIGluXG4gICAgICAgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZvciBiZXR0ZXIgYWNjdXJhY3kuXG4gKiAgIC0gYGZpbGVuYW1lYCB1c2VkIHRvIGltcHJvdmUgZXJyb3JzIHdoZW4gYGNvbXBpbGVEZWJ1Z2AgaXMgbm90IGBmYWxzZWAgYW5kIHRvIHJlc29sdmUgaW1wb3J0cy9leHRlbmRzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jb21waWxlID0gZnVuY3Rpb24oc3RyLCBvcHRpb25zKSB7XG4gIHZhciBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBzdHIgPSBTdHJpbmcoc3RyKTtcblxuICB2YXIgcGFyc2VkID0gY29tcGlsZUJvZHkoc3RyLCB7XG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyAhPT0gZmFsc2UsXG4gICAgZmlsZW5hbWU6IG9wdGlvbnMuZmlsZW5hbWUsXG4gICAgYmFzZWRpcjogb3B0aW9ucy5iYXNlZGlyLFxuICAgIHByZXR0eTogb3B0aW9ucy5wcmV0dHksXG4gICAgZG9jdHlwZTogb3B0aW9ucy5kb2N0eXBlLFxuICAgIGlubGluZVJ1bnRpbWVGdW5jdGlvbnM6IG9wdGlvbnMuaW5saW5lUnVudGltZUZ1bmN0aW9ucyxcbiAgICBnbG9iYWxzOiBvcHRpb25zLmdsb2JhbHMsXG4gICAgc2VsZjogb3B0aW9ucy5zZWxmLFxuICAgIGluY2x1ZGVTb3VyY2VzOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyA9PT0gdHJ1ZSxcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICB0ZW1wbGF0ZU5hbWU6ICd0ZW1wbGF0ZScsXG4gICAgZmlsdGVyczogb3B0aW9ucy5maWx0ZXJzLFxuICAgIGZpbHRlck9wdGlvbnM6IG9wdGlvbnMuZmlsdGVyT3B0aW9ucyxcbiAgICBmaWx0ZXJBbGlhc2VzOiBvcHRpb25zLmZpbHRlckFsaWFzZXMsXG4gICAgcGx1Z2luczogb3B0aW9ucy5wbHVnaW5zLFxuICB9KTtcblxuICB2YXIgcmVzID0gb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zXG4gICAgPyBuZXcgRnVuY3Rpb24oJycsIHBhcnNlZC5ib2R5ICsgJztyZXR1cm4gdGVtcGxhdGU7JykoKVxuICAgIDogcnVudGltZVdyYXAocGFyc2VkLmJvZHkpO1xuXG4gIHJlcy5kZXBlbmRlbmNpZXMgPSBwYXJzZWQuZGVwZW5kZW5jaWVzO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBKYXZhU2NyaXB0IHNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gcHVnIGBzdHJgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBjb21waWxlRGVidWdgIFdoZW4gaXQgaXMgYHRydWVgLCB0aGUgc291cmNlIGNvZGUgaXMgaW5jbHVkZWQgaW5cbiAqICAgICB0aGUgY29tcGlsZWQgdGVtcGxhdGUgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy5cbiAqICAgLSBgZmlsZW5hbWVgIHVzZWQgdG8gaW1wcm92ZSBlcnJvcnMgd2hlbiBgY29tcGlsZURlYnVnYCBpcyBub3QgYHRydWVgIGFuZCB0byByZXNvbHZlIGltcG9ydHMvZXh0ZW5kc1xuICogICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9uIChkZWZhdWx0cyB0byBcInRlbXBsYXRlXCIpXG4gKiAgIC0gYG1vZHVsZWAgd2hlbiBpdCBpcyBleHBsaWNpdGx5IGB0cnVlYCwgdGhlIHNvdXJjZSBjb2RlIGluY2x1ZGUgZXhwb3J0IG1vZHVsZSBzeW50YXhcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jb21waWxlQ2xpZW50V2l0aERlcGVuZGVuY2llc1RyYWNrZWQgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICB2YXIgcGFyc2VkID0gY29tcGlsZUJvZHkoc3RyLCB7XG4gICAgY29tcGlsZURlYnVnOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZSxcbiAgICBiYXNlZGlyOiBvcHRpb25zLmJhc2VkaXIsXG4gICAgcHJldHR5OiBvcHRpb25zLnByZXR0eSxcbiAgICBkb2N0eXBlOiBvcHRpb25zLmRvY3R5cGUsXG4gICAgaW5saW5lUnVudGltZUZ1bmN0aW9uczogb3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zICE9PSBmYWxzZSxcbiAgICBnbG9iYWxzOiBvcHRpb25zLmdsb2JhbHMsXG4gICAgc2VsZjogb3B0aW9ucy5zZWxmLFxuICAgIGluY2x1ZGVTb3VyY2VzOiBvcHRpb25zLmNvbXBpbGVEZWJ1ZyxcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICB0ZW1wbGF0ZU5hbWU6IG9wdGlvbnMubmFtZSB8fCAndGVtcGxhdGUnLFxuICAgIGZpbHRlcnM6IG9wdGlvbnMuZmlsdGVycyxcbiAgICBmaWx0ZXJPcHRpb25zOiBvcHRpb25zLmZpbHRlck9wdGlvbnMsXG4gICAgZmlsdGVyQWxpYXNlczogb3B0aW9ucy5maWx0ZXJBbGlhc2VzLFxuICAgIHBsdWdpbnM6IG9wdGlvbnMucGx1Z2lucyxcbiAgfSk7XG5cbiAgdmFyIGJvZHkgPSBwYXJzZWQuYm9keTtcblxuICBpZiAob3B0aW9ucy5tb2R1bGUpIHtcbiAgICBpZiAob3B0aW9ucy5pbmxpbmVSdW50aW1lRnVuY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgYm9keSA9ICd2YXIgcHVnID0gcmVxdWlyZShcInB1Zy1ydW50aW1lXCIpOycgKyBib2R5O1xuICAgIH1cbiAgICBib2R5ICs9ICcgbW9kdWxlLmV4cG9ydHMgPSAnICsgKG9wdGlvbnMubmFtZSB8fCAndGVtcGxhdGUnKSArICc7JztcbiAgfVxuXG4gIHJldHVybiB7Ym9keTogYm9keSwgZGVwZW5kZW5jaWVzOiBwYXJzZWQuZGVwZW5kZW5jaWVzfTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIEphdmFTY3JpcHQgc291cmNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBwdWcgYHN0cmAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNvbXBpbGVEZWJ1Z2AgV2hlbiBpdCBpcyBgdHJ1ZWAsIHRoZSBzb3VyY2UgY29kZSBpcyBpbmNsdWRlZCBpblxuICogICAgIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICogICAtIGBmaWxlbmFtZWAgdXNlZCB0byBpbXByb3ZlIGVycm9ycyB3aGVuIGBjb21waWxlRGVidWdgIGlzIG5vdCBgdHJ1ZWAgYW5kIHRvIHJlc29sdmUgaW1wb3J0cy9leHRlbmRzXG4gKiAgIC0gYG5hbWVgIHRoZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gKGRlZmF1bHRzIHRvIFwidGVtcGxhdGVcIilcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMuY29tcGlsZUNsaWVudCA9IGZ1bmN0aW9uKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gZXhwb3J0cy5jb21waWxlQ2xpZW50V2l0aERlcGVuZGVuY2llc1RyYWNrZWQoc3RyLCBvcHRpb25zKS5ib2R5O1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgYEZ1bmN0aW9uYCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gcHVnIGZpbGUuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNvbXBpbGVEZWJ1Z2Agd2hlbiBgZmFsc2VgIGRlYnVnZ2luZyBjb2RlIGlzIHN0cmlwcGVkIGZyb20gdGhlIGNvbXBpbGVkXG4gICAgICAgdGVtcGxhdGUsIHdoZW4gaXQgaXMgZXhwbGljaXRseSBgdHJ1ZWAsIHRoZSBzb3VyY2UgY29kZSBpcyBpbmNsdWRlZCBpblxuICAgICAgIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmb3IgYmV0dGVyIGFjY3VyYWN5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5jb21waWxlRmlsZSA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZmlsZW5hbWUgPSBwYXRoO1xuICByZXR1cm4gaGFuZGxlVGVtcGxhdGVDYWNoZShvcHRpb25zKTtcbn07XG5cbi8qKlxuICogUmVuZGVyIHRoZSBnaXZlbiBgc3RyYCBvZiBwdWcuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGNhY2hlYCBlbmFibGUgdGVtcGxhdGUgY2FjaGluZ1xuICogICAtIGBmaWxlbmFtZWAgZmlsZW5hbWUgcmVxdWlyZWQgZm9yIGBpbmNsdWRlYCAvIGBleHRlbmRzYCBhbmQgY2FjaGluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBvcHRpb25zIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHVuZGVmaW5lZH0gZm5cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucmVuZGVyID0gZnVuY3Rpb24oc3RyLCBvcHRpb25zLCBmbikge1xuICAvLyBzdXBwb3J0IGNhbGxiYWNrIEFQSVxuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgIChmbiA9IG9wdGlvbnMpLCAob3B0aW9ucyA9IHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGV4cG9ydHMucmVuZGVyKHN0ciwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBmbihleCk7XG4gICAgfVxuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gY2FjaGUgcmVxdWlyZXMgLmZpbGVuYW1lXG4gIGlmIChvcHRpb25zLmNhY2hlICYmICFvcHRpb25zLmZpbGVuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgXCJmaWxlbmFtZVwiIG9wdGlvbiBpcyByZXF1aXJlZCBmb3IgY2FjaGluZycpO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZVRlbXBsYXRlQ2FjaGUob3B0aW9ucywgc3RyKShvcHRpb25zKTtcbn07XG5cbi8qKlxuICogUmVuZGVyIGEgUHVnIGZpbGUgYXQgdGhlIGdpdmVuIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IG9wdGlvbnMgb3IgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb258dW5kZWZpbmVkfSBmblxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5yZW5kZXJGaWxlID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucywgZm4pIHtcbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBBUElcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIG9wdGlvbnMpIHtcbiAgICAoZm4gPSBvcHRpb25zKSwgKG9wdGlvbnMgPSB1bmRlZmluZWQpO1xuICB9XG4gIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBleHBvcnRzLnJlbmRlckZpbGUocGF0aCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHJldHVybiBmbihleCk7XG4gICAgfVxuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgb3B0aW9ucy5maWxlbmFtZSA9IHBhdGg7XG4gIHJldHVybiBoYW5kbGVUZW1wbGF0ZUNhY2hlKG9wdGlvbnMpKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgUHVnIGZpbGUgYXQgdGhlIGdpdmVuIGBwYXRoYCBmb3IgdXNlIG9uIHRoZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVGaWxlQ2xpZW50ID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykge1xuICB2YXIga2V5ID0gcGF0aCArICc6Y2xpZW50JztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgb3B0aW9ucy5maWxlbmFtZSA9IHBhdGg7XG5cbiAgaWYgKG9wdGlvbnMuY2FjaGUgJiYgZXhwb3J0cy5jYWNoZVtrZXldKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FjaGVba2V5XTtcbiAgfVxuXG4gIHZhciBzdHIgPSBmcy5yZWFkRmlsZVN5bmMob3B0aW9ucy5maWxlbmFtZSwgJ3V0ZjgnKTtcbiAgdmFyIG91dCA9IGV4cG9ydHMuY29tcGlsZUNsaWVudChzdHIsIG9wdGlvbnMpO1xuICBpZiAob3B0aW9ucy5jYWNoZSkgZXhwb3J0cy5jYWNoZVtrZXldID0gb3V0O1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBFeHByZXNzIHN1cHBvcnQuXG4gKi9cblxuZXhwb3J0cy5fX2V4cHJlc3MgPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zLCBmbikge1xuICBpZiAoXG4gICAgb3B0aW9ucy5jb21waWxlRGVidWcgPT0gdW5kZWZpbmVkICYmXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xuICApIHtcbiAgICBvcHRpb25zLmNvbXBpbGVEZWJ1ZyA9IGZhbHNlO1xuICB9XG4gIGV4cG9ydHMucmVuZGVyRmlsZShwYXRoLCBvcHRpb25zLCBmbik7XG59O1xuIiwgImV4cG9ydCB7IGNvbXBpbGUsIGNvbXBpbGVDbGllbnQgfSBmcm9tICdwdWcnO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiaTFCQUdBLGFBQTRCLENBQ3hCLEtBQU0sSUFBSSxPQUFNLG1DQUVwQixhQUErQixDQUMzQixLQUFNLElBQUksT0FBTSxxQ0FXcEIsWUFBb0IsRUFBSyxDQUNyQixHQUFJLEtBQXFCLFdBRXJCLE1BQU8sWUFBVyxFQUFLLEdBRzNCLEdBQ0ssTUFBcUIsSUFBb0IsQ0FBQyxLQUMzQyxXQUVBLFVBQW1CLFdBQ1osV0FBVyxFQUFLLEdBRTNCLEdBQUksQ0FFQSxNQUFPLElBQWlCLEVBQUssU0FDeEIsRUFBUCxDQUNFLEdBQUksQ0FFQSxNQUFPLElBQWlCLEtBQUssS0FBTSxFQUFLLFNBQ25DLEVBQVAsQ0FFRSxNQUFPLElBQWlCLEtBQUssS0FBTSxFQUFLLEtBSXBELFlBQXlCLEVBQVEsQ0FDN0IsR0FBSSxLQUF1QixhQUV2QixNQUFPLGNBQWEsR0FHeEIsR0FDSyxNQUF1QixJQUF1QixDQUFDLEtBQ2hELGFBRUEsVUFBcUIsYUFDZCxhQUFhLEdBRXhCLEdBQUksQ0FFQSxNQUFPLElBQW1CLFNBQ3JCLEVBQVAsQ0FDRSxHQUFJLENBRUEsTUFBTyxJQUFtQixLQUFLLEtBQU0sU0FDaEMsRUFBUCxDQUdFLE1BQU8sSUFBbUIsS0FBSyxLQUFNLEtBU2pELGFBQTJCLENBQ3ZCLEFBQUksQ0FBQyxJQUFZLENBQUMsSUFHbEIsSUFBVyxHQUNYLEFBQUksR0FBYSxPQUNiLEdBQVEsR0FBYSxPQUFPLElBRTVCLEdBQWEsR0FFYixHQUFNLFFBQ04sTUFJUixhQUFzQixDQUNsQixHQUFJLElBR0osSUFBSSxHQUFVLEdBQVcsSUFDekIsR0FB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QUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssTUFHcHlDLEVBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sS0FLanFCLFdBQXVCLEVBQU0sRUFBSyxDQUVoQyxPQURJLEdBQU0sTUFDRCxFQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsR0FBSyxFQUFHLENBRXRDLEdBREEsR0FBTyxFQUFJLEdBQ1AsRUFBTSxFQUFRLE1BQU8sR0FFekIsR0FEQSxHQUFPLEVBQUksRUFBSSxHQUNYLEdBQU8sRUFBUSxNQUFPLElBTTlCLFdBQTJCLEVBQU0sRUFBUSxDQUN2QyxNQUFJLEdBQU8sR0FBYSxJQUFTLEdBQzdCLEVBQU8sR0FBYSxHQUNwQixFQUFPLEdBQWEsSUFBUyxHQUM3QixFQUFPLElBQWMsR0FDckIsR0FBUSxNQUFpQixHQUFRLEtBQVEsRUFBd0IsS0FBSyxPQUFPLGFBQWEsSUFDMUYsSUFBVyxHQUFnQixHQUN4QixFQUFjLEVBQU0sR0FLN0IsV0FBMEIsRUFBTSxFQUFRLENBQ3RDLE1BQUksR0FBTyxHQUFhLElBQVMsR0FDN0IsRUFBTyxHQUFhLEdBQ3BCLEVBQU8sR0FBYSxHQUNwQixFQUFPLEdBQWEsR0FDcEIsRUFBTyxHQUFhLElBQVMsR0FDN0IsRUFBTyxJQUFjLEdBQ3JCLEdBQVEsTUFBaUIsR0FBUSxLQUFRLEVBQW1CLEtBQUssT0FBTyxhQUFhLElBQ3JGLElBQVcsR0FBZ0IsR0FDeEIsRUFBYyxFQUFNLElBQStCLEVBQWMsRUFBTSxHQTBCaEYsR0FBSSxHQUFZLFNBQW1CLEVBQU8sRUFBTSxDQUM5QyxBQUFLLElBQVMsUUFBUyxHQUFPLElBRTlCLEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxFQUFLLFFBQ3BCLEtBQUssV0FBYSxDQUFDLENBQUMsRUFBSyxXQUN6QixLQUFLLFdBQWEsQ0FBQyxDQUFDLEVBQUssV0FDekIsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUFLLE9BQ3JCLEtBQUssU0FBVyxDQUFDLENBQUMsRUFBSyxTQUN2QixLQUFLLE9BQVMsQ0FBQyxDQUFDLEVBQUssT0FDckIsS0FBSyxRQUFVLENBQUMsQ0FBQyxFQUFLLFFBQ3RCLEtBQUssTUFBUSxFQUFLLE9BQVMsS0FDM0IsS0FBSyxjQUFnQixNQUd2QixXQUFlLEVBQU0sRUFBTSxDQUN6QixNQUFPLElBQUksR0FBVSxFQUFNLENBQUMsV0FBWSxHQUFNLE1BQU8sSUFFdkQsR0FBSSxHQUFhLENBQUMsV0FBWSxJQUFPLEVBQWEsQ0FBQyxXQUFZLElBSTNELEdBQWEsR0FHakIsV0FBWSxFQUFNLEVBQVMsQ0FDekIsTUFBSyxLQUFZLFFBQVMsR0FBVSxJQUVwQyxFQUFRLFFBQVUsRUFDWCxHQUFXLEdBQVEsR0FBSSxHQUFVLEVBQU0sR0FHaEQsR0FBSSxHQUFRLENBQ1YsSUFBSyxHQUFJLEdBQVUsTUFBTyxHQUMxQixPQUFRLEdBQUksR0FBVSxTQUFVLEdBQ2hDLE9BQVEsR0FBSSxHQUFVLFNBQVUsR0FDaEMsS0FBTSxHQUFJLEdBQVUsT0FBUSxHQUM1QixJQUFLLEdBQUksR0FBVSxPQUduQixTQUFVLEdBQUksR0FBVSxJQUFLLENBQUMsV0FBWSxHQUFNLFdBQVksS0FDNUQsU0FBVSxHQUFJLEdBQVUsS0FDeEIsT0FBUSxHQUFJLEdBQVUsSUFBSyxDQUFDLFdBQVksR0FBTSxXQUFZLEtBQzFELE9BQVEsR0FBSSxHQUFVLEtBQ3RCLE9BQVEsR0FBSSxHQUFVLElBQUssQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQUMxRCxPQUFRLEdBQUksR0FBVSxLQUN0QixNQUFPLEdBQUksR0FBVSxJQUFLLEdBQzFCLEtBQU0sR0FBSSxHQUFVLElBQUssR0FDekIsTUFBTyxHQUFJLEdBQVUsSUFBSyxHQUMxQixJQUFLLEdBQUksR0FBVSxLQUNuQixTQUFVLEdBQUksR0FBVSxJQUFLLEdBQzdCLFlBQWEsR0FBSSxHQUFVLE1BQzNCLE1BQU8sR0FBSSxHQUFVLEtBQU0sR0FDM0IsU0FBVSxHQUFJLEdBQVUsWUFDeEIsZ0JBQWlCLEdBQUksR0FBVSxtQkFDL0IsU0FBVSxHQUFJLEdBQVUsTUFBTyxHQUMvQixVQUFXLEdBQUksR0FBVSxJQUFLLEdBQzlCLGFBQWMsR0FBSSxHQUFVLEtBQU0sQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQWdCakUsR0FBSSxHQUFJLEdBQVUsSUFBSyxDQUFDLFdBQVksR0FBTSxTQUFVLEtBQ3BELE9BQVEsR0FBSSxHQUFVLEtBQU0sQ0FBQyxXQUFZLEdBQU0sU0FBVSxLQUN6RCxPQUFRLEdBQUksR0FBVSxRQUFTLENBQUMsT0FBUSxHQUFNLFFBQVMsR0FBTSxXQUFZLEtBQ3pFLE9BQVEsR0FBSSxHQUFVLE1BQU8sQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDMUUsVUFBVyxFQUFNLEtBQU0sR0FDdkIsV0FBWSxFQUFNLEtBQU0sR0FDeEIsVUFBVyxFQUFNLElBQUssR0FDdEIsV0FBWSxFQUFNLElBQUssR0FDdkIsV0FBWSxFQUFNLElBQUssR0FDdkIsU0FBVSxFQUFNLGdCQUFpQixHQUNqQyxXQUFZLEVBQU0sWUFBYSxHQUMvQixTQUFVLEVBQU0sWUFBYSxHQUM3QixRQUFTLEdBQUksR0FBVSxNQUFPLENBQUMsV0FBWSxHQUFNLE1BQU8sRUFBRyxPQUFRLEdBQU0sV0FBWSxLQUNyRixPQUFRLEVBQU0sSUFBSyxJQUNuQixLQUFNLEVBQU0sSUFBSyxJQUNqQixNQUFPLEVBQU0sSUFBSyxJQUNsQixTQUFVLEdBQUksR0FBVSxLQUFNLENBQUMsV0FBWSxLQUMzQyxTQUFVLEVBQU0sS0FBTSxHQUd0QixPQUFRLEVBQUcsU0FDWCxNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsU0FDWCxVQUFXLEVBQUcsWUFDZCxVQUFXLEVBQUcsWUFDZCxTQUFVLEVBQUcsVUFBVyxHQUN4QixJQUFLLEVBQUcsS0FBTSxDQUFDLE9BQVEsR0FBTSxXQUFZLEtBQ3pDLE1BQU8sRUFBRyxPQUFRLEdBQ2xCLFNBQVUsRUFBRyxXQUNiLEtBQU0sRUFBRyxNQUFPLENBQUMsT0FBUSxLQUN6QixVQUFXLEVBQUcsV0FBWSxHQUMxQixJQUFLLEVBQUcsTUFDUixRQUFTLEVBQUcsU0FBVSxHQUN0QixRQUFTLEVBQUcsVUFDWixPQUFRLEVBQUcsUUFBUyxHQUNwQixLQUFNLEVBQUcsT0FDVCxLQUFNLEVBQUcsT0FDVCxPQUFRLEVBQUcsU0FDWCxPQUFRLEVBQUcsUUFBUyxDQUFDLE9BQVEsS0FDN0IsTUFBTyxFQUFHLFFBQ1YsS0FBTSxFQUFHLE1BQU8sQ0FBQyxXQUFZLEdBQU0sV0FBWSxLQUMvQyxNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsUUFBUyxHQUNwQixPQUFRLEVBQUcsUUFBUyxHQUNwQixTQUFVLEVBQUcsVUFBVyxHQUN4QixRQUFTLEVBQUcsVUFDWixRQUFTLEVBQUcsU0FBVSxHQUN0QixNQUFPLEVBQUcsT0FBUSxHQUNsQixNQUFPLEVBQUcsT0FBUSxHQUNsQixPQUFRLEVBQUcsUUFBUyxHQUNwQixJQUFLLEVBQUcsS0FBTSxDQUFDLFdBQVksR0FBTSxNQUFPLElBQ3hDLFlBQWEsRUFBRyxhQUFjLENBQUMsV0FBWSxHQUFNLE1BQU8sSUFDeEQsUUFBUyxFQUFHLFNBQVUsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDbkUsTUFBTyxFQUFHLE9BQVEsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksS0FDL0QsUUFBUyxFQUFHLFNBQVUsQ0FBQyxXQUFZLEdBQU0sT0FBUSxHQUFNLFdBQVksTUFNakUsR0FBWSx5QkFDWixHQUFhLEdBQUksUUFBTyxHQUFVLE9BQVEsS0FFOUMsWUFBbUIsRUFBTSxFQUFnQixDQUN2QyxNQUFPLEtBQVMsSUFBTSxJQUFTLElBQU8sQ0FBQyxHQUFtQixLQUFTLE1BQVUsSUFBUyxNQUd4RixHQUFJLElBQXFCLGdEQUVyQixHQUFpQixnQ0FFakIsR0FBTSxPQUFPLFVBQ2IsR0FBaUIsR0FBSSxlQUNyQixHQUFXLEdBQUksU0FJbkIsWUFBYSxFQUFLLEVBQVUsQ0FDMUIsTUFBTyxJQUFlLEtBQUssRUFBSyxHQUdsQyxHQUFJLElBQVUsTUFBTSxTQUFZLFNBQVUsRUFBSyxDQUFFLE1BQy9DLElBQVMsS0FBSyxLQUFTLGtCQUd6QixZQUFxQixFQUFPLENBQzFCLE1BQU8sSUFBSSxRQUFPLE9BQVMsRUFBTSxRQUFRLEtBQU0sS0FBTyxNQU14RCxHQUFJLElBQVcsU0FBa0IsRUFBTSxFQUFLLENBQzFDLEtBQUssS0FBTyxFQUNaLEtBQUssT0FBUyxHQUdoQixHQUFTLFVBQVUsT0FBUyxTQUFpQixFQUFHLENBQzlDLE1BQU8sSUFBSSxJQUFTLEtBQUssS0FBTSxLQUFLLE9BQVMsSUFHL0MsR0FBSSxJQUFpQixTQUF3QixFQUFHLEVBQU8sRUFBSyxDQUMxRCxLQUFLLE1BQVEsRUFDYixLQUFLLElBQU0sRUFDUCxFQUFFLGFBQWUsTUFBUSxNQUFLLE9BQVMsRUFBRSxhQVMvQyxZQUFxQixFQUFPLEVBQVEsQ0FDbEMsT0FBUyxHQUFPLEVBQUcsRUFBTSxJQUFLLENBQzVCLEdBQVcsVUFBWSxFQUN2QixHQUFJLEdBQVEsR0FBVyxLQUFLLEdBQzVCLEdBQUksR0FBUyxFQUFNLE1BQVEsRUFDekIsRUFBRSxFQUNGLEVBQU0sRUFBTSxNQUFRLEVBQU0sR0FBRyxXQUU3QixPQUFPLElBQUksSUFBUyxFQUFNLEVBQVMsSUFRekMsR0FBSSxJQUFpQixDQU1uQixZQUFhLEdBSWIsV0FBWSxTQU1aLG9CQUFxQixLQUdyQixnQkFBaUIsS0FLakIsY0FBZSxLQUdmLDJCQUE0QixHQUc1Qiw0QkFBNkIsR0FHN0IsMEJBQTJCLEdBRzNCLGNBQWUsR0FLZixVQUFXLEdBTVgsUUFBUyxLQVdULFVBQVcsS0FTWCxPQUFRLEdBTVIsUUFBUyxLQUdULFdBQVksS0FHWixpQkFBa0IsS0FHbEIsZUFBZ0IsSUFLbEIsWUFBb0IsRUFBTSxDQUN4QixHQUFJLEdBQVUsR0FFZCxPQUFTLEtBQU8sSUFDWixFQUFRLEdBQU8sR0FBUSxHQUFJLEVBQU0sR0FBTyxFQUFLLEdBQU8sR0FBZSxHQVF2RSxHQU5JLEVBQVEsYUFBZSxNQUN2QixHQUFRLGFBQWUsTUFFdkIsRUFBUSxlQUFpQixNQUN6QixHQUFRLGNBQWdCLEVBQVEsWUFBYyxHQUU5QyxHQUFRLEVBQVEsU0FBVSxDQUM1QixHQUFJLEdBQVMsRUFBUSxRQUNyQixFQUFRLFFBQVUsU0FBVSxFQUFPLENBQUUsTUFBTyxHQUFPLEtBQUssSUFFMUQsTUFBSSxJQUFRLEVBQVEsWUFDaEIsR0FBUSxVQUFZLEdBQVksRUFBUyxFQUFRLFlBRTlDLEVBR1QsWUFBcUIsRUFBUyxFQUFPLENBQ25DLE1BQU8sVUFBUyxFQUFPLEVBQU0sRUFBTyxFQUFLLEVBQVUsRUFBUSxDQUN6RCxHQUFJLEdBQVUsQ0FDWixLQUFNLEVBQVEsUUFBVSxPQUN4QixNQUFPLEVBQ1AsTUFBTyxFQUNQLElBQUssR0FFUCxBQUFJLEVBQVEsV0FDUixHQUFRLElBQU0sR0FBSSxJQUFlLEtBQU0sRUFBVSxJQUNqRCxFQUFRLFFBQ1IsR0FBUSxNQUFRLENBQUMsRUFBTyxJQUM1QixFQUFNLEtBQUssSUFLZixHQUNJLElBQVksRUFDWixHQUFpQixFQUNqQixHQUFZLEdBQVksR0FDeEIsR0FBYyxFQUNkLEdBQWtCLEVBQ2xCLEdBQWMsR0FDZCxHQUFxQixHQUNyQixHQUFjLEdBQ2QsR0FBcUIsSUFFekIsWUFBdUIsRUFBTyxFQUFXLENBQ3ZDLE1BQU8sSUFBa0IsR0FBUSxHQUFjLEdBQU0sR0FBWSxHQUFrQixHQUlyRixHQUNJLElBQVksRUFDWixHQUFXLEVBQ1gsR0FBZSxFQUNmLEdBQWdCLEVBQ2hCLEdBQW9CLEVBQ3BCLEdBQWUsRUFFZixHQUFTLFNBQWdCLEVBQVMsRUFBTyxFQUFVLENBQ3JELEtBQUssUUFBVSxFQUFVLEdBQVcsR0FDcEMsS0FBSyxXQUFhLEVBQVEsV0FDMUIsS0FBSyxTQUFXLEdBQVksRUFBUyxFQUFRLGFBQWUsRUFBSSxFQUFJLEVBQVEsYUFBZSxTQUFXLFVBQVksSUFDbEgsR0FBSSxHQUFXLEdBQ2YsR0FBSSxFQUFRLGdCQUFrQixHQUFNLENBQ2xDLE9BQVMsR0FBSSxFQUFRLFlBQ2IsSUFBVyxFQUFjLElBREUsSUFDL0IsQ0FDSixBQUFJLEVBQVEsYUFBZSxVQUFZLElBQVksVUFFckQsS0FBSyxjQUFnQixHQUFZLEdBQ2pDLEdBQUksR0FBa0IsR0FBVyxFQUFXLElBQU0sSUFBTSxFQUFjLE9BQ3RFLEtBQUssb0JBQXNCLEdBQVksR0FDdkMsS0FBSyx3QkFBMEIsR0FBWSxFQUFpQixJQUFNLEVBQWMsWUFDaEYsS0FBSyxNQUFRLE9BQU8sR0FLcEIsS0FBSyxZQUFjLEdBS25CLEFBQUksRUFDRixNQUFLLElBQU0sRUFDWCxLQUFLLFVBQVksS0FBSyxNQUFNLFlBQVk7QUFBQSxFQUFNLEVBQVcsR0FBSyxFQUM5RCxLQUFLLFFBQVUsS0FBSyxNQUFNLE1BQU0sRUFBRyxLQUFLLFdBQVcsTUFBTSxJQUFXLFFBRXBFLE1BQUssSUFBTSxLQUFLLFVBQVksRUFDNUIsS0FBSyxRQUFVLEdBS2pCLEtBQUssS0FBTyxFQUFNLElBRWxCLEtBQUssTUFBUSxLQUViLEtBQUssTUFBUSxLQUFLLElBQU0sS0FBSyxJQUc3QixLQUFLLFNBQVcsS0FBSyxPQUFTLEtBQUssY0FHbkMsS0FBSyxjQUFnQixLQUFLLGdCQUFrQixLQUM1QyxLQUFLLGFBQWUsS0FBSyxXQUFhLEtBQUssSUFLM0MsS0FBSyxRQUFVLEtBQUssaUJBQ3BCLEtBQUssWUFBYyxHQUduQixLQUFLLFNBQVcsRUFBUSxhQUFlLFNBQ3ZDLEtBQUssT0FBUyxLQUFLLFVBQVksS0FBSyxnQkFBZ0IsS0FBSyxLQUd6RCxLQUFLLGlCQUFtQixHQUd4QixLQUFLLFNBQVcsS0FBSyxTQUFXLEtBQUssY0FBZ0IsRUFFckQsS0FBSyxPQUFTLEdBRWQsS0FBSyxpQkFBbUIsR0FHcEIsS0FBSyxNQUFRLEdBQUssRUFBUSxlQUFpQixLQUFLLE1BQU0sTUFBTSxFQUFHLEtBQU8sTUFDdEUsS0FBSyxnQkFBZ0IsR0FHekIsS0FBSyxXQUFhLEdBQ2xCLEtBQUssV0FBVyxJQUdoQixLQUFLLFlBQWMsTUFHakIsR0FBcUIsQ0FBRSxXQUFZLENBQUUsYUFBYyxJQUFPLFlBQWEsQ0FBRSxhQUFjLElBQU8sUUFBUyxDQUFFLGFBQWMsSUFBTyxXQUFZLENBQUUsYUFBYyxJQUFPLGlCQUFrQixDQUFFLGFBQWMsSUFBTyxvQkFBcUIsQ0FBRSxhQUFjLEtBRW5QLEdBQU8sVUFBVSxNQUFRLFVBQWtCLENBQ3pDLEdBQUksR0FBTyxLQUFLLFFBQVEsU0FBVyxLQUFLLFlBQ3hDLFlBQUssWUFDRSxLQUFLLGNBQWMsSUFHNUIsR0FBbUIsV0FBVyxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBa0IsR0FDM0csR0FBbUIsWUFBWSxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBbUIsR0FDN0csR0FBbUIsUUFBUSxJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssa0JBQWtCLE1BQVEsSUFBZSxHQUNyRyxHQUFtQixXQUFXLElBQU0sVUFBWSxDQUFFLE1BQVEsTUFBSyxtQkFBbUIsTUFBUSxJQUFlLEdBQ3pHLEdBQW1CLGlCQUFpQixJQUFNLFVBQVksQ0FBRSxNQUFRLE1BQUssbUJBQW1CLE1BQVEsSUFBc0IsR0FDdEgsR0FBbUIsb0JBQW9CLElBQU0sVUFBWSxDQUFFLE1BQU8sTUFBSywyQkFBMkIsS0FBSyxpQkFHdkcsR0FBTyxVQUFVLG1CQUFxQixVQUErQixDQUFFLE1BQVEsTUFBSyxtQkFBbUIsTUFBUSxJQUFrQixHQUVqSSxHQUFPLE9BQVMsVUFBbUIsQ0FFL0IsT0FESSxHQUFVLEdBQUksRUFBTSxVQUFVLE9BQzFCLEtBQVEsRUFBUyxHQUFRLFVBQVcsR0FHOUMsT0FESSxHQUFNLEtBQ0QsRUFBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQU8sRUFBTSxFQUFRLEdBQUcsR0FDNUQsTUFBTyxJQUdULEdBQU8sTUFBUSxTQUFnQixFQUFPLEVBQVMsQ0FDN0MsTUFBTyxJQUFJLE1BQUssRUFBUyxHQUFPLFNBR2xDLEdBQU8sa0JBQW9CLFNBQTRCLEVBQU8sRUFBSyxFQUFTLENBQzFFLEdBQUksR0FBUyxHQUFJLE1BQUssRUFBUyxFQUFPLEdBQ3RDLFNBQU8sWUFDQSxFQUFPLG1CQUdoQixHQUFPLFVBQVksU0FBb0IsRUFBTyxFQUFTLENBQ3JELE1BQU8sSUFBSSxNQUFLLEVBQVMsSUFHM0IsT0FBTyxpQkFBa0IsR0FBTyxVQUFXLElBRTNDLEdBQUksSUFBSyxHQUFPLFVBSVosR0FBVSxpREFDZCxHQUFHLGdCQUFrQixTQUFTLEVBQU8sQ0FDbkMsT0FBUyxDQUVQLEdBQWUsVUFBWSxFQUMzQixHQUFTLEdBQWUsS0FBSyxLQUFLLE9BQU8sR0FBRyxPQUM1QyxHQUFJLEdBQVEsR0FBUSxLQUFLLEtBQUssTUFBTSxNQUFNLElBQzFDLEdBQUksQ0FBQyxFQUFTLE1BQU8sR0FDckIsR0FBSyxHQUFNLElBQU0sRUFBTSxNQUFRLGFBQWMsQ0FDM0MsR0FBZSxVQUFZLEVBQVEsRUFBTSxHQUFHLE9BQzVDLEdBQUksR0FBYSxHQUFlLEtBQUssS0FBSyxPQUFRLEVBQU0sRUFBVyxNQUFRLEVBQVcsR0FBRyxPQUNyRixFQUFPLEtBQUssTUFBTSxPQUFPLEdBQzdCLE1BQU8sS0FBUyxLQUFPLElBQVMsS0FDN0IsR0FBVSxLQUFLLEVBQVcsS0FDMUIsQ0FBRSx1QkFBc0IsS0FBSyxJQUFTLElBQVMsS0FBTyxLQUFLLE1BQU0sT0FBTyxFQUFNLEtBQU8sS0FFMUYsR0FBUyxFQUFNLEdBQUcsT0FHbEIsR0FBZSxVQUFZLEVBQzNCLEdBQVMsR0FBZSxLQUFLLEtBQUssT0FBTyxHQUFHLE9BQ3hDLEtBQUssTUFBTSxLQUFXLEtBQ3RCLE1BT1IsR0FBRyxJQUFNLFNBQVMsRUFBTSxDQUN0QixNQUFJLE1BQUssT0FBUyxFQUNoQixNQUFLLE9BQ0UsSUFFQSxJQU1YLEdBQUcsYUFBZSxTQUFTLEVBQU0sQ0FDL0IsTUFBTyxNQUFLLE9BQVMsRUFBTSxNQUFRLEtBQUssUUFBVSxHQUFRLENBQUMsS0FBSyxhQUtsRSxHQUFHLGNBQWdCLFNBQVMsRUFBTSxDQUNoQyxNQUFLLE1BQUssYUFBYSxHQUN2QixNQUFLLE9BQ0UsSUFGZ0MsSUFPekMsR0FBRyxpQkFBbUIsU0FBUyxFQUFNLENBQ25DLEFBQUssS0FBSyxjQUFjLElBQVMsS0FBSyxjQUt4QyxHQUFHLG1CQUFxQixVQUFXLENBQ2pDLE1BQU8sTUFBSyxPQUFTLEVBQU0sS0FDekIsS0FBSyxPQUFTLEVBQU0sUUFDcEIsR0FBVSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssV0FBWSxLQUFLLFNBRzFELEdBQUcsZ0JBQWtCLFVBQVcsQ0FDOUIsR0FBSSxLQUFLLHFCQUNQLE1BQUksTUFBSyxRQUFRLHFCQUNiLEtBQUssUUFBUSxvQkFBb0IsS0FBSyxXQUFZLEtBQUssZUFDcEQsSUFPWCxHQUFHLFVBQVksVUFBVyxDQUN4QixBQUFJLENBQUMsS0FBSyxJQUFJLEVBQU0sT0FBUyxDQUFDLEtBQUssbUJBQXFCLEtBQUssY0FHL0QsR0FBRyxtQkFBcUIsU0FBUyxFQUFTLEVBQVMsQ0FDakQsR0FBSSxLQUFLLE9BQVMsRUFDaEIsTUFBSSxNQUFLLFFBQVEsaUJBQ2IsS0FBSyxRQUFRLGdCQUFnQixLQUFLLGFBQWMsS0FBSyxpQkFDcEQsR0FDRCxLQUFLLE9BQ0YsSUFPWCxHQUFHLE9BQVMsU0FBUyxFQUFNLENBQ3pCLEtBQUssSUFBSSxJQUFTLEtBQUssY0FLekIsR0FBRyxXQUFhLFNBQVMsRUFBSyxDQUM1QixLQUFLLE1BQU0sR0FBb0IsS0FBSyxNQUFPLHFCQUc3QyxhQUErQixDQUM3QixLQUFLLGdCQUNMLEtBQUssY0FDTCxLQUFLLG9CQUNMLEtBQUssa0JBQ0wsS0FBSyxZQUNILEdBR0osR0FBRyxtQkFBcUIsU0FBUyxFQUF3QixFQUFVLENBQ2pFLEdBQUksRUFBQyxFQUNMLENBQUksRUFBdUIsY0FBZ0IsSUFDdkMsS0FBSyxpQkFBaUIsRUFBdUIsY0FBZSxpREFDaEUsR0FBSSxHQUFTLEVBQVcsRUFBdUIsb0JBQXNCLEVBQXVCLGtCQUM1RixBQUFJLEVBQVMsSUFBTSxLQUFLLGlCQUFpQixFQUFRLDJCQUduRCxHQUFHLHNCQUF3QixTQUFTLEVBQXdCLEVBQVUsQ0FDcEUsR0FBSSxDQUFDLEVBQTBCLE1BQU8sR0FDdEMsR0FBSSxHQUFrQixFQUF1QixnQkFDekMsRUFBYyxFQUF1QixZQUN6QyxHQUFJLENBQUMsRUFBWSxNQUFPLElBQW1CLEdBQUssR0FBZSxFQUMvRCxBQUFJLEdBQW1CLEdBQ25CLEtBQUssTUFBTSxFQUFpQiwyRUFDNUIsR0FBZSxHQUNmLEtBQUssaUJBQWlCLEVBQWEsdUNBR3pDLEdBQUcsK0JBQWlDLFVBQVcsQ0FDN0MsQUFBSSxLQUFLLFVBQWEsRUFBQyxLQUFLLFVBQVksS0FBSyxTQUFXLEtBQUssV0FDekQsS0FBSyxNQUFNLEtBQUssU0FBVSw4Q0FDMUIsS0FBSyxVQUNMLEtBQUssTUFBTSxLQUFLLFNBQVUsK0NBR2hDLEdBQUcscUJBQXVCLFNBQVMsRUFBTSxDQUN2QyxNQUFJLEdBQUssT0FBUywwQkFDUCxLQUFLLHFCQUFxQixFQUFLLFlBQ25DLEVBQUssT0FBUyxjQUFnQixFQUFLLE9BQVMsb0JBR3JELEdBQUksSUFBTyxHQUFPLFVBU2xCLEdBQUssY0FBZ0IsU0FBUyxFQUFNLENBQ2xDLEdBQUksR0FBVSxHQUVkLElBREssRUFBSyxNQUFRLEdBQUssS0FBTyxJQUN2QixLQUFLLE9BQVMsRUFBTSxLQUFLLENBQzlCLEdBQUksR0FBTyxLQUFLLGVBQWUsS0FBTSxHQUFNLEdBQzNDLEVBQUssS0FBSyxLQUFLLEdBRWpCLEdBQUksS0FBSyxTQUNMLE9BQVMsR0FBSSxFQUFHLEVBQU8sT0FBTyxLQUFLLEtBQUssa0JBQW1CLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDakYsQ0FDRSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLGlCQUFpQixLQUFLLGlCQUFpQixHQUFNLE1BQVEsV0FBYSxFQUFPLG9CQUVwRixZQUFLLHVCQUF1QixFQUFLLE1BQ2pDLEtBQUssT0FDTCxFQUFLLFdBQWEsS0FBSyxRQUFRLFdBQ3hCLEtBQUssV0FBVyxFQUFNLFlBRy9CLEdBQUksSUFBWSxDQUFDLEtBQU0sUUFBUyxHQUFjLENBQUMsS0FBTSxVQUVyRCxHQUFLLE1BQVEsU0FBUyxFQUFTLENBQzdCLEdBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxDQUFDLEtBQUssYUFBYSxPQUFVLE1BQU8sR0FDeEUsR0FBZSxVQUFZLEtBQUssSUFDaEMsR0FBSSxHQUFPLEdBQWUsS0FBSyxLQUFLLE9BQ2hDLEVBQU8sS0FBSyxJQUFNLEVBQUssR0FBRyxPQUFRLEVBQVMsS0FBSyxNQUFNLFdBQVcsR0FLckUsR0FBSSxJQUFXLEdBQU0sTUFBTyxHQUM1QixHQUFJLEVBQVcsTUFBTyxHQUV0QixHQUFJLElBQVcsSUFBTyxNQUFPLEdBQzdCLEdBQUksRUFBa0IsRUFBUSxJQUFPLENBRW5DLE9BREksR0FBTSxFQUFPLEVBQ1YsRUFBaUIsS0FBSyxNQUFNLFdBQVcsR0FBTSxLQUFTLEVBQUUsRUFDL0QsR0FBSSxHQUFRLEtBQUssTUFBTSxNQUFNLEVBQU0sR0FDbkMsR0FBSSxDQUFDLEVBQTBCLEtBQUssR0FBVSxNQUFPLEdBRXZELE1BQU8sSUFNVCxHQUFLLGdCQUFrQixVQUFXLENBQ2hDLEdBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxDQUFDLEtBQUssYUFBYSxTQUNuRCxNQUFPLEdBRVgsR0FBZSxVQUFZLEtBQUssSUFDaEMsR0FBSSxHQUFPLEdBQWUsS0FBSyxLQUFLLE9BQ2hDLEVBQU8sS0FBSyxJQUFNLEVBQUssR0FBRyxPQUM5QixNQUFPLENBQUMsR0FBVSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssSUFBSyxLQUNoRCxLQUFLLE1BQU0sTUFBTSxFQUFNLEVBQU8sS0FBTyxZQUNwQyxHQUFPLElBQU0sS0FBSyxNQUFNLFFBQVUsQ0FBQyxFQUFpQixLQUFLLE1BQU0sT0FBTyxFQUFPLE1BVWxGLEdBQUssZUFBaUIsU0FBUyxFQUFTLEVBQVUsRUFBUyxDQUN6RCxHQUFJLEdBQVksS0FBSyxLQUFNLEVBQU8sS0FBSyxZQUFhLEVBV3BELE9BVEksS0FBSyxNQUFNLElBQ2IsR0FBWSxFQUFNLEtBQ2xCLEVBQU8sT0FPRCxPQUNILEdBQU0sV0FBYSxHQUFNLFVBQVcsTUFBTyxNQUFLLDRCQUE0QixFQUFNLEVBQVUsYUFDNUYsR0FBTSxVQUFXLE1BQU8sTUFBSyx1QkFBdUIsT0FDcEQsR0FBTSxJQUFLLE1BQU8sTUFBSyxpQkFBaUIsT0FDeEMsR0FBTSxLQUFNLE1BQU8sTUFBSyxrQkFBa0IsT0FDMUMsR0FBTSxVQUlULE1BQUssSUFBWSxNQUFLLFFBQVUsSUFBWSxNQUFRLElBQVksVUFBYSxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssYUFDNUcsS0FBSyx1QkFBdUIsRUFBTSxHQUFPLENBQUMsT0FDOUMsR0FBTSxPQUNULE1BQUksSUFBVyxLQUFLLGFBQ2IsS0FBSyxXQUFXLEVBQU0sUUFDMUIsR0FBTSxJQUFLLE1BQU8sTUFBSyxpQkFBaUIsT0FDeEMsR0FBTSxRQUFTLE1BQU8sTUFBSyxxQkFBcUIsT0FDaEQsR0FBTSxRQUFTLE1BQU8sTUFBSyxxQkFBcUIsT0FDaEQsR0FBTSxPQUFRLE1BQU8sTUFBSyxvQkFBb0IsT0FDOUMsR0FBTSxLQUFNLE1BQU8sTUFBSyxrQkFBa0IsT0FDMUMsR0FBTSxXQUFhLEdBQU0sS0FDNUIsU0FBTyxHQUFRLEtBQUssTUFDaEIsR0FBVyxJQUFTLE9BQVMsS0FBSyxhQUMvQixLQUFLLGtCQUFrQixFQUFNLE9BQ2pDLEdBQU0sT0FBUSxNQUFPLE1BQUssb0JBQW9CLE9BQzlDLEdBQU0sTUFBTyxNQUFPLE1BQUssbUJBQW1CLE9BQzVDLEdBQU0sT0FBUSxNQUFPLE1BQUssV0FBVyxHQUFNLE9BQzNDLEdBQU0sS0FBTSxNQUFPLE1BQUssb0JBQW9CLE9BQzVDLEdBQU0sWUFDTixHQUFNLFFBQ1QsR0FBSSxLQUFLLFFBQVEsWUFBYyxJQUFNLElBQWMsRUFBTSxRQUFTLENBQ2hFLEdBQWUsVUFBWSxLQUFLLElBQ2hDLEdBQUksR0FBTyxHQUFlLEtBQUssS0FBSyxPQUNoQyxFQUFPLEtBQUssSUFBTSxFQUFLLEdBQUcsT0FBUSxFQUFTLEtBQUssTUFBTSxXQUFXLEdBQ3JFLEdBQUksSUFBVyxJQUFNLElBQVcsR0FDNUIsTUFBTyxNQUFLLHlCQUF5QixFQUFNLEtBQUssbUJBR3RELE1BQUssTUFBSyxRQUFRLDZCQUNYLElBQ0QsS0FBSyxNQUFNLEtBQUssTUFBTywwREFDdEIsS0FBSyxVQUNOLEtBQUssTUFBTSxLQUFLLE1BQU8sb0VBRXRCLElBQWMsRUFBTSxRQUFVLEtBQUssWUFBWSxHQUFRLEtBQUssWUFBWSxFQUFNLFdBUXJGLEdBQUksS0FBSyxrQkFDUCxNQUFJLElBQVcsS0FBSyxhQUNwQixLQUFLLE9BQ0UsS0FBSyx1QkFBdUIsRUFBTSxHQUFNLENBQUMsR0FHbEQsR0FBSSxJQUFZLEtBQUssTUFBTyxHQUFPLEtBQUssa0JBQ3hDLE1BQUksS0FBYyxFQUFNLE1BQVEsR0FBSyxPQUFTLGNBQWdCLEtBQUssSUFBSSxFQUFNLE9BQ2xFLEtBQUssc0JBQXNCLEVBQU0sR0FBVyxHQUFNLEdBQy9DLEtBQUsseUJBQXlCLEVBQU0sTUFJdEQsR0FBSyw0QkFBOEIsU0FBUyxFQUFNLEVBQVMsQ0FDekQsR0FBSSxHQUFVLElBQVksUUFDMUIsS0FBSyxPQUNMLEFBQUksS0FBSyxJQUFJLEVBQU0sT0FBUyxLQUFLLGtCQUFxQixFQUFLLE1BQVEsS0FDOUQsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssYUFFeEMsR0FBSyxNQUFRLEtBQUssYUFDbEIsS0FBSyxhQU1QLE9BREksR0FBSSxFQUNELEVBQUksS0FBSyxPQUFPLE9BQVEsRUFBRSxFQUFHLENBQ2xDLEdBQUksR0FBTSxLQUFLLE9BQU8sR0FDdEIsR0FBSSxHQUFLLE9BQVMsTUFBUSxFQUFJLE9BQVMsRUFBSyxNQUFNLE9BQzVDLEdBQUksTUFBUSxNQUFTLElBQVcsRUFBSSxPQUFTLFNBQzdDLEVBQUssT0FBUyxHQUFXLE1BR2pDLE1BQUksS0FBTSxLQUFLLE9BQU8sUUFBVSxLQUFLLE1BQU0sRUFBSyxNQUFPLGVBQWlCLEdBQ2pFLEtBQUssV0FBVyxFQUFNLEVBQVUsaUJBQW1CLHNCQUc1RCxHQUFLLHVCQUF5QixTQUFTLEVBQU0sQ0FDM0MsWUFBSyxPQUNMLEtBQUssWUFDRSxLQUFLLFdBQVcsRUFBTSxzQkFHL0IsR0FBSyxpQkFBbUIsU0FBUyxFQUFNLENBQ3JDLFlBQUssT0FDTCxLQUFLLE9BQU8sS0FBSyxJQUNqQixFQUFLLEtBQU8sS0FBSyxlQUFlLE1BQ2hDLEtBQUssT0FBTyxNQUNaLEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssS0FBTyxLQUFLLHVCQUNqQixBQUFJLEtBQUssUUFBUSxhQUFlLEVBQzVCLEtBQUssSUFBSSxFQUFNLE1BRWYsS0FBSyxZQUNGLEtBQUssV0FBVyxFQUFNLHFCQVcvQixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FDdEMsS0FBSyxPQUNMLEdBQUksR0FBVyxLQUFLLFFBQVEsYUFBZSxHQUFNLE1BQUssU0FBWSxDQUFDLEtBQUssWUFBYyxLQUFLLFFBQVEsNEJBQStCLEtBQUssY0FBYyxTQUFZLEtBQUssYUFBZSxHQUlyTCxHQUhBLEtBQUssT0FBTyxLQUFLLElBQ2pCLEtBQUssV0FBVyxHQUNoQixLQUFLLE9BQU8sRUFBTSxRQUNkLEtBQUssT0FBUyxFQUFNLEtBQ3RCLE1BQUksR0FBVSxJQUFNLEtBQUssV0FBVyxHQUM3QixLQUFLLFNBQVMsRUFBTSxNQUU3QixHQUFJLEdBQVEsS0FBSyxRQUNqQixHQUFJLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxPQUFTLEVBQU0sUUFBVSxFQUFPLENBQ25FLEdBQUksR0FBUyxLQUFLLFlBQWEsRUFBTyxFQUFRLE1BQVEsS0FBSyxNQUkzRCxNQUhBLE1BQUssT0FDTCxLQUFLLFNBQVMsRUFBUSxHQUFNLEdBQzVCLEtBQUssV0FBVyxFQUFRLHVCQUNuQixNQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxhQUFhLFFBQVcsRUFBTyxhQUFhLFNBQVcsRUFDeEgsTUFBSyxRQUFRLGFBQWUsR0FDOUIsQ0FBSSxLQUFLLE9BQVMsRUFBTSxJQUNsQixFQUFVLElBQU0sS0FBSyxXQUFXLEdBQzdCLEVBQUssTUFBUSxFQUFVLElBRTNCLEtBQUssV0FBVyxFQUFNLElBRTNCLEdBQVUsSUFBTSxLQUFLLFdBQVcsR0FDN0IsS0FBSyxTQUFTLEVBQU0sSUFFN0IsR0FBSSxHQUF5QixHQUFJLElBQzdCLEVBQU8sS0FBSyxnQkFBZ0IsR0FBTSxHQUN0QyxNQUFJLE1BQUssT0FBUyxFQUFNLEtBQVEsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLGFBQWEsTUFDN0UsTUFBSyxRQUFRLGFBQWUsR0FDOUIsQ0FBSSxLQUFLLE9BQVMsRUFBTSxJQUNsQixFQUFVLElBQU0sS0FBSyxXQUFXLEdBQzdCLEVBQUssTUFBUSxFQUFVLElBRWxDLEtBQUssYUFBYSxFQUFNLEdBQU8sR0FDL0IsS0FBSyxVQUFVLEdBQ1IsS0FBSyxXQUFXLEVBQU0sSUFFN0IsTUFBSyxzQkFBc0IsRUFBd0IsSUFFakQsRUFBVSxJQUFNLEtBQUssV0FBVyxHQUM3QixLQUFLLFNBQVMsRUFBTSxLQUc3QixHQUFLLHVCQUF5QixTQUFTLEVBQU0sRUFBUyxFQUFxQixDQUN6RSxZQUFLLE9BQ0UsS0FBSyxjQUFjLEVBQU0sR0FBa0IsR0FBc0IsRUFBSSxJQUF5QixHQUFPLElBRzlHLEdBQUssaUJBQW1CLFNBQVMsRUFBTSxDQUNyQyxZQUFLLE9BQ0wsRUFBSyxLQUFPLEtBQUssdUJBRWpCLEVBQUssV0FBYSxLQUFLLGVBQWUsTUFDdEMsRUFBSyxVQUFZLEtBQUssSUFBSSxFQUFNLE9BQVMsS0FBSyxlQUFlLE1BQVEsS0FDOUQsS0FBSyxXQUFXLEVBQU0sZ0JBRy9CLEdBQUsscUJBQXVCLFNBQVMsRUFBTSxDQUN6QyxNQUFJLENBQUMsS0FBSyxZQUFjLENBQUMsS0FBSyxRQUFRLDRCQUNsQyxLQUFLLE1BQU0sS0FBSyxNQUFPLGdDQUMzQixLQUFLLE9BTUwsQUFBSSxLQUFLLElBQUksRUFBTSxPQUFTLEtBQUssa0JBQXFCLEVBQUssU0FBVyxLQUMvRCxHQUFLLFNBQVcsS0FBSyxrQkFBbUIsS0FBSyxhQUM3QyxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSyxxQkFBdUIsU0FBUyxFQUFNLENBQ3pDLEtBQUssT0FDTCxFQUFLLGFBQWUsS0FBSyx1QkFDekIsRUFBSyxNQUFRLEdBQ2IsS0FBSyxPQUFPLEVBQU0sUUFDbEIsS0FBSyxPQUFPLEtBQUssSUFDakIsS0FBSyxXQUFXLEdBT2hCLE9BREksR0FDSyxFQUFhLEdBQU8sS0FBSyxPQUFTLEVBQU0sUUFDL0MsR0FBSSxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssT0FBUyxFQUFNLFNBQVUsQ0FDN0QsR0FBSSxHQUFTLEtBQUssT0FBUyxFQUFNLE1BQ2pDLEFBQUksR0FBTyxLQUFLLFdBQVcsRUFBSyxjQUNoQyxFQUFLLE1BQU0sS0FBSyxFQUFNLEtBQUssYUFDM0IsRUFBSSxXQUFhLEdBQ2pCLEtBQUssT0FDTCxBQUFJLEVBQ0YsRUFBSSxLQUFPLEtBQUssa0JBRVosSUFBYyxLQUFLLGlCQUFpQixLQUFLLGFBQWMsNEJBQzNELEVBQWEsR0FDYixFQUFJLEtBQU8sTUFFYixLQUFLLE9BQU8sRUFBTSxXQUVsQixBQUFLLElBQU8sS0FBSyxhQUNqQixFQUFJLFdBQVcsS0FBSyxLQUFLLGVBQWUsT0FHNUMsWUFBSyxZQUNELEdBQU8sS0FBSyxXQUFXLEVBQUssY0FDaEMsS0FBSyxPQUNMLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLG9CQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNELEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxTQUN0RCxLQUFLLE1BQU0sS0FBSyxXQUFZLCtCQUNoQyxFQUFLLFNBQVcsS0FBSyxrQkFDckIsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLG1CQUsvQixHQUFJLElBQVEsR0FFWixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FJdEMsR0FIQSxLQUFLLE9BQ0wsRUFBSyxNQUFRLEtBQUssYUFDbEIsRUFBSyxRQUFVLEtBQ1gsS0FBSyxPQUFTLEVBQU0sT0FBUSxDQUM5QixHQUFJLEdBQVMsS0FBSyxZQUVsQixHQURBLEtBQUssT0FDRCxLQUFLLElBQUksRUFBTSxRQUFTLENBQzFCLEVBQU8sTUFBUSxLQUFLLG1CQUNwQixHQUFJLEdBQVMsRUFBTyxNQUFNLE9BQVMsYUFDbkMsS0FBSyxXQUFXLEVBQVMsR0FBcUIsR0FDOUMsS0FBSyxVQUFVLEVBQU8sTUFBTyxFQUFTLEdBQW9CLElBQzFELEtBQUssT0FBTyxFQUFNLFlBRWxCLEFBQUksTUFBSyxRQUFRLFlBQWMsSUFBTSxLQUFLLGFBQzFDLEVBQU8sTUFBUSxLQUNmLEtBQUssV0FBVyxHQUVsQixFQUFPLEtBQU8sS0FBSyxXQUFXLElBQzlCLEtBQUssWUFDTCxFQUFLLFFBQVUsS0FBSyxXQUFXLEVBQVEsZUFFekMsU0FBSyxVQUFZLEtBQUssSUFBSSxFQUFNLFVBQVksS0FBSyxhQUFlLEtBQzVELENBQUMsRUFBSyxTQUFXLENBQUMsRUFBSyxXQUN2QixLQUFLLE1BQU0sRUFBSyxNQUFPLG1DQUNwQixLQUFLLFdBQVcsRUFBTSxpQkFHL0IsR0FBSyxrQkFBb0IsU0FBUyxFQUFNLEVBQU0sQ0FDNUMsWUFBSyxPQUNMLEtBQUssU0FBUyxFQUFNLEdBQU8sR0FDM0IsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLHdCQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNMLEVBQUssS0FBTyxLQUFLLHVCQUNqQixLQUFLLE9BQU8sS0FBSyxJQUNqQixFQUFLLEtBQU8sS0FBSyxlQUFlLFNBQ2hDLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLG1CQUcvQixHQUFLLG1CQUFxQixTQUFTLEVBQU0sQ0FDdkMsTUFBSSxNQUFLLFFBQVUsS0FBSyxNQUFNLEtBQUssTUFBTyx5QkFDMUMsS0FBSyxPQUNMLEVBQUssT0FBUyxLQUFLLHVCQUNuQixFQUFLLEtBQU8sS0FBSyxlQUFlLFFBQ3pCLEtBQUssV0FBVyxFQUFNLGtCQUcvQixHQUFLLG9CQUFzQixTQUFTLEVBQU0sQ0FDeEMsWUFBSyxPQUNFLEtBQUssV0FBVyxFQUFNLG1CQUcvQixHQUFLLHNCQUF3QixTQUFTLEVBQU0sRUFBVyxFQUFNLEVBQVMsQ0FDcEUsT0FBUyxHQUFNLEVBQUcsRUFBTyxLQUFLLE9BQVEsRUFBTSxFQUFLLE9BQVEsR0FBTyxFQUM5RCxDQUNBLEdBQUksR0FBUSxFQUFLLEdBRWpCLEFBQUksRUFBTSxPQUFTLEdBQ2YsS0FBSyxNQUFNLEVBQUssTUFBTyxVQUFZLEVBQVkseUJBR3JELE9BREksR0FBTyxLQUFLLEtBQUssT0FBUyxPQUFTLEtBQUssT0FBUyxFQUFNLFFBQVUsU0FBVyxLQUN2RSxFQUFJLEtBQUssT0FBTyxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDaEQsR0FBSSxJQUFVLEtBQUssT0FBTyxHQUMxQixHQUFJLEdBQVEsaUJBQW1CLEVBQUssTUFFbEMsR0FBUSxlQUFpQixLQUFLLE1BQzlCLEdBQVEsS0FBTyxNQUNSLE9BRVgsWUFBSyxPQUFPLEtBQUssQ0FBQyxLQUFNLEVBQVcsS0FBTSxFQUFNLGVBQWdCLEtBQUssUUFDcEUsRUFBSyxLQUFPLEtBQUssZUFBZSxFQUFVLEVBQVEsUUFBUSxXQUFhLEdBQUssRUFBVSxRQUFVLEVBQVUsU0FDMUcsS0FBSyxPQUFPLE1BQ1osRUFBSyxNQUFRLEVBQ04sS0FBSyxXQUFXLEVBQU0scUJBRy9CLEdBQUsseUJBQTJCLFNBQVMsRUFBTSxFQUFNLENBQ25ELFNBQUssV0FBYSxFQUNsQixLQUFLLFlBQ0UsS0FBSyxXQUFXLEVBQU0sd0JBTy9CLEdBQUssV0FBYSxTQUFTLEVBQXVCLEVBQU0sRUFBWSxDQU9sRSxJQU5LLElBQTBCLFFBQVMsR0FBd0IsSUFDM0QsSUFBUyxRQUFTLEdBQU8sS0FBSyxhQUVuQyxFQUFLLEtBQU8sR0FDWixLQUFLLE9BQU8sRUFBTSxRQUNkLEdBQXlCLEtBQUssV0FBVyxHQUN0QyxLQUFLLE9BQVMsRUFBTSxRQUFRLENBQ2pDLEdBQUksR0FBTyxLQUFLLGVBQWUsTUFDL0IsRUFBSyxLQUFLLEtBQUssR0FFakIsTUFBSSxJQUFjLE1BQUssT0FBUyxJQUNoQyxLQUFLLE9BQ0QsR0FBeUIsS0FBSyxZQUMzQixLQUFLLFdBQVcsRUFBTSxtQkFPL0IsR0FBSyxTQUFXLFNBQVMsRUFBTSxFQUFNLENBQ25DLFNBQUssS0FBTyxFQUNaLEtBQUssT0FBTyxFQUFNLE1BQ2xCLEVBQUssS0FBTyxLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQU8sS0FBSyxrQkFDbkQsS0FBSyxPQUFPLEVBQU0sTUFDbEIsRUFBSyxPQUFTLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBTyxLQUFLLGtCQUN2RCxLQUFLLE9BQU8sRUFBTSxRQUNsQixFQUFLLEtBQU8sS0FBSyxlQUFlLE9BQ2hDLEtBQUssWUFDTCxLQUFLLE9BQU8sTUFDTCxLQUFLLFdBQVcsRUFBTSxpQkFNL0IsR0FBSyxXQUFhLFNBQVMsRUFBTSxFQUFNLENBQ3JDLEdBQUksR0FBVSxLQUFLLE9BQVMsRUFBTSxJQUNsQyxZQUFLLE9BRUwsQUFDRSxFQUFLLE9BQVMsdUJBQ2QsRUFBSyxhQUFhLEdBQUcsTUFBUSxNQUUzQixFQUFDLEdBQ0QsS0FBSyxRQUFRLFlBQWMsR0FDM0IsS0FBSyxRQUNMLEVBQUssT0FBUyxPQUNkLEVBQUssYUFBYSxHQUFHLEdBQUcsT0FBUyxjQUduQyxLQUFLLE1BQ0gsRUFBSyxNQUNILEdBQVUsU0FBVyxVQUFZLDBEQUU1QixFQUFLLE9BQVMscUJBQ3ZCLEtBQUssTUFBTSxFQUFLLE1BQU8sc0NBRXpCLEVBQUssS0FBTyxFQUNaLEVBQUssTUFBUSxFQUFVLEtBQUssa0JBQW9CLEtBQUssbUJBQ3JELEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssS0FBTyxLQUFLLGVBQWUsT0FDaEMsS0FBSyxZQUNMLEtBQUssT0FBTyxNQUNMLEtBQUssV0FBVyxFQUFNLEVBQVUsaUJBQW1CLG1CQUs1RCxHQUFLLFNBQVcsU0FBUyxFQUFNLEVBQU8sRUFBTSxDQUcxQyxJQUZBLEVBQUssYUFBZSxHQUNwQixFQUFLLEtBQU8sSUFDSCxDQUNQLEdBQUksR0FBTyxLQUFLLFlBWWhCLEdBWEEsS0FBSyxXQUFXLEVBQU0sR0FDdEIsQUFBSSxLQUFLLElBQUksRUFBTSxJQUNqQixFQUFLLEtBQU8sS0FBSyxpQkFBaUIsR0FDN0IsQUFBSSxJQUFTLFNBQVcsQ0FBRSxNQUFLLE9BQVMsRUFBTSxLQUFRLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxhQUFhLE9BQzlHLEtBQUssYUFDQSxBQUFJLEVBQUssR0FBRyxPQUFTLGNBQWdCLENBQUUsSUFBVSxNQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssYUFBYSxRQUNuRyxLQUFLLE1BQU0sS0FBSyxXQUFZLDREQUU1QixFQUFLLEtBQU8sS0FFZCxFQUFLLGFBQWEsS0FBSyxLQUFLLFdBQVcsRUFBTSx1QkFDekMsQ0FBQyxLQUFLLElBQUksRUFBTSxPQUFVLE1BRWhDLE1BQU8sSUFHVCxHQUFLLFdBQWEsU0FBUyxFQUFNLEVBQU0sQ0FDckMsRUFBSyxHQUFLLEtBQUssbUJBQ2YsS0FBSyxVQUFVLEVBQUssR0FBSSxJQUFTLE1BQVEsR0FBVyxHQUFjLEtBR3BFLEdBQUksSUFBaUIsRUFBRyxHQUF5QixFQUFHLEdBQW1CLEVBTXZFLEdBQUssY0FBZ0IsU0FBUyxFQUFNLEVBQVcsRUFBcUIsRUFBUyxDQUMzRSxLQUFLLGFBQWEsR0FDZCxNQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxJQUNqRSxNQUFLLE9BQVMsRUFBTSxNQUFTLEVBQVksSUFDekMsS0FBSyxhQUNULEVBQUssVUFBWSxLQUFLLElBQUksRUFBTSxPQUU5QixLQUFLLFFBQVEsYUFBZSxHQUM1QixHQUFLLE1BQVEsQ0FBQyxDQUFDLEdBRWYsRUFBWSxJQUNkLEdBQUssR0FBTSxFQUFZLElBQXFCLEtBQUssT0FBUyxFQUFNLEtBQU8sS0FBTyxLQUFLLGFBQy9FLEVBQUssSUFBTSxDQUFFLEdBQVksS0FLekIsS0FBSyxVQUFVLEVBQUssR0FBSyxLQUFLLFFBQVUsRUFBSyxXQUFhLEVBQUssTUFBUyxLQUFLLG9CQUFzQixHQUFXLEdBQWUsS0FHbkksR0FBSSxHQUFjLEtBQUssU0FBVSxFQUFjLEtBQUssU0FBVSxFQUFtQixLQUFLLGNBQ3RGLFlBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUNyQixLQUFLLFdBQVcsR0FBYyxFQUFLLE1BQU8sRUFBSyxZQUV6QyxFQUFZLElBQ2QsR0FBSyxHQUFLLEtBQUssT0FBUyxFQUFNLEtBQU8sS0FBSyxhQUFlLE1BRTdELEtBQUssb0JBQW9CLEdBQ3pCLEtBQUssa0JBQWtCLEVBQU0sRUFBcUIsSUFFbEQsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ2QsS0FBSyxXQUFXLEVBQU8sRUFBWSxHQUFrQixzQkFBd0IsdUJBR3RGLEdBQUssb0JBQXNCLFNBQVMsRUFBTSxDQUN4QyxLQUFLLE9BQU8sRUFBTSxRQUNsQixFQUFLLE9BQVMsS0FBSyxpQkFBaUIsRUFBTSxPQUFRLEdBQU8sS0FBSyxRQUFRLGFBQWUsR0FDckYsS0FBSyxrQ0FNUCxHQUFLLFdBQWEsU0FBUyxFQUFNLEVBQWEsQ0FDNUMsS0FBSyxPQUlMLEdBQUksR0FBWSxLQUFLLE9BQ3JCLEtBQUssT0FBUyxHQUVkLEtBQUssYUFBYSxFQUFNLEdBQ3hCLEtBQUssZ0JBQWdCLEdBQ3JCLEdBQUksR0FBWSxLQUFLLFlBQ2pCLEVBQWlCLEdBR3JCLElBRkEsRUFBVSxLQUFPLEdBQ2pCLEtBQUssT0FBTyxFQUFNLFFBQ1gsS0FBSyxPQUFTLEVBQU0sUUFBUSxDQUNqQyxHQUFJLEdBQVUsS0FBSyxrQkFBa0IsRUFBSyxhQUFlLE1BQ3pELEFBQUksR0FDRixHQUFVLEtBQUssS0FBSyxHQUNoQixFQUFRLE9BQVMsb0JBQXNCLEVBQVEsT0FBUyxlQUN0RCxJQUFrQixLQUFLLE1BQU0sRUFBUSxNQUFPLDJDQUNoRCxFQUFpQixLQUl2QixZQUFLLE9BQVMsRUFDZCxLQUFLLE9BQ0wsRUFBSyxLQUFPLEtBQUssV0FBVyxFQUFXLGFBQ2hDLEtBQUssV0FBVyxFQUFNLEVBQWMsbUJBQXFCLG9CQUdsRSxHQUFLLGtCQUFvQixTQUFTLEVBQXdCLENBQ3hELEdBQUksR0FBUyxLQUViLEdBQUksS0FBSyxJQUFJLEVBQU0sTUFBUyxNQUFPLE1BRW5DLEdBQUksR0FBUyxLQUFLLFlBQ2QsRUFBZ0IsU0FBVSxFQUFHLEdBQWEsQ0FDNUMsQUFBSyxLQUFnQixRQUFTLElBQWMsSUFFNUMsR0FBSSxJQUFRLEVBQU8sTUFBTyxHQUFXLEVBQU8sU0FDNUMsTUFBSyxHQUFPLGNBQWMsR0FDdEIsRUFBTyxPQUFTLEVBQU0sUUFBVyxFQUFDLElBQWUsQ0FBQyxFQUFPLHNCQUFnQyxHQUN6RixHQUFPLEtBQU8sRUFBTyxhQUN6QixFQUFPLFNBQVcsR0FDbEIsRUFBTyxJQUFNLEVBQU8sWUFBWSxHQUFPLElBQ3ZDLEVBQU8sSUFBSSxLQUFPLEVBQ2xCLEVBQU8sV0FBVyxFQUFPLElBQUssY0FDdkIsSUFQZ0MsSUFVekMsRUFBTyxLQUFPLFNBQ2QsRUFBTyxPQUFTLEVBQWMsVUFDOUIsR0FBSSxHQUFjLEtBQUssSUFBSSxFQUFNLE1BQzdCLEVBQVUsR0FDZCxBQUFLLEdBQ0gsQ0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQWMsUUFBUyxJQUMxRCxHQUFVLEdBQ1YsRUFBYyxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssSUFBSSxFQUFNLE9BQ3pELEFBQUksRUFBYyxPQUN2QixFQUFPLEtBQU8sTUFDTCxFQUFjLFFBQ3ZCLEdBQU8sS0FBTyxRQUdiLEVBQU8sS0FBTyxLQUFLLGtCQUFrQixHQUMxQyxHQUFJLEdBQU0sRUFBTyxJQUNiLEVBQW9CLEdBQ3hCLE1BQUksQ0FBQyxFQUFPLFVBQVksQ0FBQyxFQUFPLFFBQVcsR0FBSSxPQUFTLGNBQWdCLEVBQUksT0FBUyxlQUNqRixFQUFJLE9BQVMsV0FBYSxFQUFJLFFBQVUsZUFDdEMsR0FBTyxPQUFTLFVBQVksS0FBSyxNQUFNLEVBQUksTUFBTywyQ0FDbEQsR0FBZSxLQUFLLE1BQU0sRUFBSSxNQUFPLG9DQUNyQyxHQUFXLEtBQUssTUFBTSxFQUFJLE1BQU8sd0NBQ3JDLEVBQU8sS0FBTyxjQUNkLEVBQW9CLEdBQ1gsRUFBTyxRQUFVLEVBQUksT0FBUyxjQUFnQixFQUFJLE9BQVMsYUFDcEUsS0FBSyxNQUFNLEVBQUksTUFBTywwREFFeEIsS0FBSyxpQkFBaUIsRUFBUSxFQUFhLEVBQVMsR0FDaEQsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sU0FBVyxHQUN4RCxLQUFLLGlCQUFpQixFQUFPLE1BQU0sTUFBTyxnQ0FDMUMsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sU0FBVyxHQUN4RCxLQUFLLGlCQUFpQixFQUFPLE1BQU0sTUFBTyx3Q0FDMUMsRUFBTyxPQUFTLE9BQVMsRUFBTyxNQUFNLE9BQU8sR0FBRyxPQUFTLGVBQ3pELEtBQUssaUJBQWlCLEVBQU8sTUFBTSxPQUFPLEdBQUcsTUFBTyxpQ0FDakQsR0FHVCxHQUFLLGlCQUFtQixTQUFTLEVBQVEsRUFBYSxFQUFTLEVBQW1CLENBQ2hGLFNBQU8sTUFBUSxLQUFLLFlBQVksRUFBYSxFQUFTLEdBQy9DLEtBQUssV0FBVyxFQUFRLHFCQUdqQyxHQUFLLGFBQWUsU0FBUyxFQUFNLEVBQWEsQ0FDOUMsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUN0QixHQUFLLEdBQUssS0FBSyxhQUNYLEdBQ0EsS0FBSyxVQUFVLEVBQUssR0FBSSxHQUFjLEtBRXRDLEtBQWdCLElBQ2hCLEtBQUssYUFDVCxFQUFLLEdBQUssT0FJZCxHQUFLLGdCQUFrQixTQUFTLEVBQU0sQ0FDcEMsRUFBSyxXQUFhLEtBQUssSUFBSSxFQUFNLFVBQVksS0FBSyxzQkFBd0IsTUFLNUUsR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFTLENBR3pDLEdBRkEsS0FBSyxPQUVELEtBQUssSUFBSSxFQUFNLE1BQ2pCLE1BQUksTUFBSyxRQUFRLGFBQWUsSUFDOUIsQ0FBSSxLQUFLLGNBQWMsTUFDckIsR0FBSyxTQUFXLEtBQUssV0FBVyxJQUNoQyxLQUFLLFlBQVksRUFBUyxFQUFLLFNBQVMsS0FBTSxLQUFLLGVBRW5ELEVBQUssU0FBVyxNQUdwQixLQUFLLGlCQUFpQixRQUNsQixLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssYUFDdkMsRUFBSyxPQUFTLEtBQUssZ0JBQ25CLEtBQUssWUFDRSxLQUFLLFdBQVcsRUFBTSx3QkFFL0IsR0FBSSxLQUFLLElBQUksRUFBTSxVQUFXLENBQzVCLEtBQUssWUFBWSxFQUFTLFVBQVcsS0FBSyxjQUMxQyxHQUFJLEdBQ0osR0FBSSxLQUFLLE9BQVMsRUFBTSxXQUFjLEdBQVUsS0FBSyxtQkFBb0IsQ0FDdkUsR0FBSSxHQUFRLEtBQUssWUFDakIsS0FBSyxPQUNELEdBQVcsS0FBSyxPQUNwQixFQUFLLFlBQWMsS0FBSyxjQUFjLEVBQU8sR0FBaUIsR0FBa0IsR0FBTyxXQUM5RSxLQUFLLE9BQVMsRUFBTSxPQUFRLENBQ3JDLEdBQUksR0FBUSxLQUFLLFlBQ2pCLEVBQUssWUFBYyxLQUFLLFdBQVcsRUFBTyxrQkFFMUMsR0FBSyxZQUFjLEtBQUssbUJBQ3hCLEtBQUssWUFFUCxNQUFPLE1BQUssV0FBVyxFQUFNLDRCQUcvQixHQUFJLEtBQUssNkJBQ1AsRUFBSyxZQUFjLEtBQUssZUFBZSxNQUN2QyxBQUFJLEVBQUssWUFBWSxPQUFTLHNCQUMxQixLQUFLLG9CQUFvQixFQUFTLEVBQUssWUFBWSxjQUVuRCxLQUFLLFlBQVksRUFBUyxFQUFLLFlBQVksR0FBRyxLQUFNLEVBQUssWUFBWSxHQUFHLE9BQzVFLEVBQUssV0FBYSxHQUNsQixFQUFLLE9BQVMsU0FDVCxDQUdMLEdBRkEsRUFBSyxZQUFjLEtBQ25CLEVBQUssV0FBYSxLQUFLLHNCQUFzQixHQUN6QyxLQUFLLGNBQWMsUUFDckIsQUFBSSxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssYUFDdkMsRUFBSyxPQUFTLEtBQUssb0JBQ2QsQ0FDTCxPQUFTLEdBQUksRUFBRyxFQUFPLEVBQUssV0FBWSxFQUFJLEVBQUssT0FBUSxHQUFLLEVBQUcsQ0FFL0QsR0FBSSxHQUFPLEVBQUssR0FFaEIsS0FBSyxnQkFBZ0IsRUFBSyxPQUUxQixLQUFLLGlCQUFpQixFQUFLLE9BRzdCLEVBQUssT0FBUyxLQUVoQixLQUFLLFlBRVAsTUFBTyxNQUFLLFdBQVcsRUFBTSwyQkFHL0IsR0FBSyxZQUFjLFNBQVMsRUFBUyxFQUFNLEVBQUssQ0FDOUMsQUFBSSxDQUFDLEdBQ0QsSUFBSSxFQUFTLElBQ2IsS0FBSyxpQkFBaUIsRUFBSyxxQkFBdUIsRUFBTyxLQUM3RCxFQUFRLEdBQVEsS0FHbEIsR0FBSyxtQkFBcUIsU0FBUyxFQUFTLEVBQUssQ0FDL0MsR0FBSSxHQUFPLEVBQUksS0FDZixHQUFJLElBQVMsYUFDVCxLQUFLLFlBQVksRUFBUyxFQUFJLEtBQU0sRUFBSSxlQUNuQyxJQUFTLGdCQUNkLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBSSxXQUFZLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDN0QsQ0FDRSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLG1CQUFtQixFQUFTLFdBRTlCLElBQVMsZUFDZCxPQUFTLEdBQU0sRUFBRyxFQUFTLEVBQUksU0FBVSxFQUFNLEVBQU8sT0FBUSxHQUFPLEVBQUcsQ0FDeEUsR0FBSSxHQUFNLEVBQU8sR0FFZixBQUFJLEdBQU8sS0FBSyxtQkFBbUIsRUFBUyxPQUU3QyxBQUFJLEtBQVMsV0FDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksT0FDcEMsQUFBSSxJQUFTLG9CQUNkLEtBQUssbUJBQW1CLEVBQVMsRUFBSSxNQUNwQyxBQUFJLElBQVMsY0FDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksVUFDaEMsSUFBUywyQkFDZCxLQUFLLG1CQUFtQixFQUFTLEVBQUksYUFHM0MsR0FBSyxvQkFBc0IsU0FBUyxFQUFTLEVBQU8sQ0FDbEQsR0FBSSxFQUFDLEVBQ0wsT0FBUyxHQUFJLEVBQUcsRUFBTyxFQUFPLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDbEQsQ0FDQSxHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLG1CQUFtQixFQUFTLEVBQUssTUFJMUMsR0FBSywyQkFBNkIsVUFBVyxDQUMzQyxNQUFPLE1BQUssS0FBSyxVQUFZLE9BQzNCLEtBQUssS0FBSyxVQUFZLFNBQ3RCLEtBQUssS0FBSyxVQUFZLFNBQ3RCLEtBQUssS0FBSyxVQUFZLFlBQ3RCLEtBQUssU0FDTCxLQUFLLG1CQUtULEdBQUssc0JBQXdCLFNBQVMsRUFBUyxDQUM3QyxHQUFJLEdBQVEsR0FBSSxFQUFRLEdBR3hCLElBREEsS0FBSyxPQUFPLEVBQU0sUUFDWCxDQUFDLEtBQUssSUFBSSxFQUFNLFNBQVMsQ0FDOUIsR0FBSyxFQUdJLEVBQVEsV0FGZixLQUFLLE9BQU8sRUFBTSxPQUNkLEtBQUssbUJBQW1CLEVBQU0sUUFBVyxNQUcvQyxHQUFJLEdBQU8sS0FBSyxZQUNoQixFQUFLLE1BQVEsS0FBSyxXQUFXLElBQzdCLEVBQUssU0FBVyxLQUFLLGNBQWMsTUFBUSxLQUFLLFdBQVcsSUFBUSxFQUFLLE1BQ3hFLEtBQUssWUFBWSxFQUFTLEVBQUssU0FBUyxLQUFNLEVBQUssU0FBUyxPQUM1RCxFQUFNLEtBQUssS0FBSyxXQUFXLEVBQU0sb0JBRW5DLE1BQU8sSUFLVCxHQUFLLFlBQWMsU0FBUyxFQUFNLENBQ2hDLFlBQUssT0FFTCxBQUFJLEtBQUssT0FBUyxFQUFNLE9BQ3RCLEdBQUssV0FBYSxHQUNsQixFQUFLLE9BQVMsS0FBSyxpQkFFbkIsR0FBSyxXQUFhLEtBQUssd0JBQ3ZCLEtBQUssaUJBQWlCLFFBQ3RCLEVBQUssT0FBUyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssZ0JBQWtCLEtBQUssY0FFekUsS0FBSyxZQUNFLEtBQUssV0FBVyxFQUFNLHNCQUsvQixHQUFLLHNCQUF3QixVQUFXLENBQ3RDLEdBQUksR0FBUSxHQUFJLEVBQVEsR0FDeEIsR0FBSSxLQUFLLE9BQVMsRUFBTSxLQUFNLENBRTVCLEdBQUksR0FBTyxLQUFLLFlBSWhCLEdBSEEsRUFBSyxNQUFRLEtBQUssYUFDbEIsS0FBSyxVQUFVLEVBQUssTUFBTyxJQUMzQixFQUFNLEtBQUssS0FBSyxXQUFXLEVBQU0sMkJBQzdCLENBQUMsS0FBSyxJQUFJLEVBQU0sT0FBVSxNQUFPLEdBRXZDLEdBQUksS0FBSyxPQUFTLEVBQU0sS0FBTSxDQUM1QixHQUFJLEdBQVMsS0FBSyxZQUNsQixZQUFLLE9BQ0wsS0FBSyxpQkFBaUIsTUFDdEIsRUFBTyxNQUFRLEtBQUssYUFDcEIsS0FBSyxVQUFVLEVBQU8sTUFBTyxJQUM3QixFQUFNLEtBQUssS0FBSyxXQUFXLEVBQVEsNkJBQzVCLEVBR1QsSUFEQSxLQUFLLE9BQU8sRUFBTSxRQUNYLENBQUMsS0FBSyxJQUFJLEVBQU0sU0FBUyxDQUM5QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsS0FBSyxtQkFBbUIsRUFBTSxRQUFXLE1BRy9DLEdBQUksR0FBUyxLQUFLLFlBQ2xCLEVBQU8sU0FBVyxLQUFLLFdBQVcsSUFDbEMsQUFBSSxLQUFLLGNBQWMsTUFDckIsRUFBTyxNQUFRLEtBQUssYUFFcEIsTUFBSyxnQkFBZ0IsRUFBTyxVQUM1QixFQUFPLE1BQVEsRUFBTyxVQUV4QixLQUFLLFVBQVUsRUFBTyxNQUFPLElBQzdCLEVBQU0sS0FBSyxLQUFLLFdBQVcsRUFBUSxvQkFFckMsTUFBTyxJQUlULEdBQUssdUJBQXlCLFNBQVMsRUFBWSxDQUNqRCxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVcsUUFBVSxLQUFLLHFCQUFxQixFQUFXLElBQUssRUFBRSxFQUNuRixFQUFXLEdBQUcsVUFBWSxFQUFXLEdBQUcsV0FBVyxJQUFJLE1BQU0sRUFBRyxLQUdwRSxHQUFLLHFCQUF1QixTQUFTLEVBQVcsQ0FDOUMsTUFDRSxHQUFVLE9BQVMsdUJBQ25CLEVBQVUsV0FBVyxPQUFTLFdBQzlCLE1BQU8sR0FBVSxXQUFXLE9BQVUsVUFFckMsTUFBSyxNQUFNLEVBQVUsU0FBVyxLQUFRLEtBQUssTUFBTSxFQUFVLFNBQVcsTUFJN0UsR0FBSSxJQUFPLEdBQU8sVUFLbEIsR0FBSyxhQUFlLFNBQVMsRUFBTSxFQUFXLEVBQXdCLENBQ3BFLEdBQUksS0FBSyxRQUFRLGFBQWUsR0FBSyxFQUNuQyxPQUFRLEVBQUssVUFDUixhQUNILEFBQUksS0FBSyxTQUFXLEVBQUssT0FBUyxTQUM5QixLQUFLLE1BQU0sRUFBSyxNQUFPLDZEQUMzQixVQUVHLG9CQUNBLG1CQUNBLGNBQ0gsVUFFRyxtQkFDSCxFQUFLLEtBQU8sZ0JBQ1IsR0FBMEIsS0FBSyxtQkFBbUIsRUFBd0IsSUFDOUUsT0FBUyxHQUFJLEVBQUcsRUFBTyxFQUFLLFdBQVksRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUFHLENBQy9ELEdBQUksR0FBTyxFQUFLLEdBRWxCLEtBQUssYUFBYSxFQUFNLEdBT3BCLEVBQUssT0FBUyxlQUNiLEdBQUssU0FBUyxPQUFTLGdCQUFrQixFQUFLLFNBQVMsT0FBUyxrQkFFakUsS0FBSyxNQUFNLEVBQUssU0FBUyxNQUFPLG9CQUdwQyxVQUVHLFdBRUgsQUFBSSxFQUFLLE9BQVMsUUFBVSxLQUFLLE1BQU0sRUFBSyxJQUFJLE1BQU8saURBQ3ZELEtBQUssYUFBYSxFQUFLLE1BQU8sR0FDOUIsVUFFRyxrQkFDSCxFQUFLLEtBQU8sZUFDUixHQUEwQixLQUFLLG1CQUFtQixFQUF3QixJQUM5RSxLQUFLLGlCQUFpQixFQUFLLFNBQVUsR0FDckMsVUFFRyxnQkFDSCxFQUFLLEtBQU8sY0FDWixLQUFLLGFBQWEsRUFBSyxTQUFVLEdBQzdCLEVBQUssU0FBUyxPQUFTLHFCQUN2QixLQUFLLE1BQU0sRUFBSyxTQUFTLE1BQU8sNkNBQ3BDLFVBRUcsdUJBQ0gsQUFBSSxFQUFLLFdBQWEsS0FBTyxLQUFLLE1BQU0sRUFBSyxLQUFLLElBQUssK0RBQ3ZELEVBQUssS0FBTyxvQkFDWixNQUFPLEdBQUssU0FDWixLQUFLLGFBQWEsRUFBSyxLQUFNLE9BRzFCLG9CQUNILFVBRUcsMEJBQ0gsS0FBSyxhQUFhLEVBQUssV0FBWSxFQUFXLEdBQzlDLFVBRUcsa0JBQ0gsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLHFEQUNsQyxVQUVHLG1CQUNILEdBQUksQ0FBQyxFQUFhLGNBR2xCLEtBQUssTUFBTSxFQUFLLE1BQU8sMkJBRXBCLEFBQUksSUFBMEIsS0FBSyxtQkFBbUIsRUFBd0IsSUFDckYsTUFBTyxJQUtULEdBQUssaUJBQW1CLFNBQVMsRUFBVSxFQUFXLENBRXBELE9BREksR0FBTSxFQUFTLE9BQ1YsRUFBSSxFQUFHLEVBQUksRUFBSyxJQUFLLENBQzVCLEdBQUksR0FBTSxFQUFTLEdBQ25CLEFBQUksR0FBTyxLQUFLLGFBQWEsRUFBSyxHQUVwQyxHQUFJLEVBQUssQ0FDUCxHQUFJLEdBQU8sRUFBUyxFQUFNLEdBQzFCLEFBQUksS0FBSyxRQUFRLGNBQWdCLEdBQUssR0FBYSxHQUFRLEVBQUssT0FBUyxlQUFpQixFQUFLLFNBQVMsT0FBUyxjQUM3RyxLQUFLLFdBQVcsRUFBSyxTQUFTLE9BRXBDLE1BQU8sSUFLVCxHQUFLLFlBQWMsU0FBUyxFQUF3QixDQUNsRCxHQUFJLEdBQU8sS0FBSyxZQUNoQixZQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEdBQU8sR0FDdEMsS0FBSyxXQUFXLEVBQU0sa0JBRy9CLEdBQUssaUJBQW1CLFVBQVcsQ0FDakMsR0FBSSxHQUFPLEtBQUssWUFDaEIsWUFBSyxPQUdELEtBQUssUUFBUSxjQUFnQixHQUFLLEtBQUssT0FBUyxFQUFNLE1BQ3RELEtBQUssYUFFVCxFQUFLLFNBQVcsS0FBSyxtQkFFZCxLQUFLLFdBQVcsRUFBTSxnQkFLL0IsR0FBSyxpQkFBbUIsVUFBVyxDQUNqQyxHQUFJLEtBQUssUUFBUSxhQUFlLEVBQzlCLE9BQVEsS0FBSyxVQUNSLEdBQU0sU0FDVCxHQUFJLEdBQU8sS0FBSyxZQUNoQixZQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEVBQU0sU0FBVSxHQUFNLElBQ3JELEtBQUssV0FBVyxFQUFNLG9CQUUxQixHQUFNLE9BQ1QsTUFBTyxNQUFLLFNBQVMsSUFHekIsTUFBTyxNQUFLLGNBR2QsR0FBSyxpQkFBbUIsU0FBUyxFQUFPLEVBQVksRUFBb0IsQ0FFdEUsT0FESSxHQUFPLEdBQUksRUFBUSxHQUNoQixDQUFDLEtBQUssSUFBSSxJQUdmLEdBRkEsQUFBSSxFQUFTLEVBQVEsR0FDZCxLQUFLLE9BQU8sRUFBTSxPQUNyQixHQUFjLEtBQUssT0FBUyxFQUFNLE1BQ3BDLEVBQUssS0FBSyxVQUNMLElBQUksR0FBc0IsS0FBSyxtQkFBbUIsR0FDdkQsTUFDSyxHQUFJLEtBQUssT0FBUyxFQUFNLFNBQVUsQ0FDdkMsR0FBSSxHQUFPLEtBQUssbUJBQ2hCLEtBQUsscUJBQXFCLEdBQzFCLEVBQUssS0FBSyxHQUNOLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBSyxNQUFNLEtBQUssTUFBTyxpREFDeEQsS0FBSyxPQUFPLEdBQ1osVUFDSyxDQUNMLEdBQUksR0FBTyxLQUFLLGtCQUFrQixLQUFLLE1BQU8sS0FBSyxVQUNuRCxLQUFLLHFCQUFxQixHQUMxQixFQUFLLEtBQUssSUFHZCxNQUFPLElBR1QsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLENBQzFDLE1BQU8sSUFLVCxHQUFLLGtCQUFvQixTQUFTLEVBQVUsRUFBVSxFQUFNLENBRTFELEdBREEsRUFBTyxHQUFRLEtBQUssbUJBQ2hCLEtBQUssUUFBUSxZQUFjLEdBQUssQ0FBQyxLQUFLLElBQUksRUFBTSxJQUFPLE1BQU8sR0FDbEUsR0FBSSxHQUFPLEtBQUssWUFBWSxFQUFVLEdBQ3RDLFNBQUssS0FBTyxFQUNaLEVBQUssTUFBUSxLQUFLLG1CQUNYLEtBQUssV0FBVyxFQUFNLHNCQVUvQixHQUFLLFVBQVksU0FBUyxFQUFNLEVBQWEsRUFBYyxDQUd6RCxPQUZLLElBQWdCLFFBQVMsR0FBYyxJQUVwQyxFQUFLLFVBQ1IsYUFDSCxBQUFJLElBQWdCLElBQWdCLEVBQUssT0FBUyxPQUM5QyxLQUFLLGlCQUFpQixFQUFLLE1BQU8sK0NBQ2xDLEtBQUssUUFBVSxLQUFLLHdCQUF3QixLQUFLLEVBQUssT0FDdEQsS0FBSyxpQkFBaUIsRUFBSyxNQUFRLEdBQWMsV0FBYSxpQkFBbUIsRUFBSyxLQUFPLG1CQUM3RixHQUNFLElBQUksRUFBYyxFQUFLLE9BQ3ZCLEtBQUssaUJBQWlCLEVBQUssTUFBTyx1QkFDdEMsRUFBYSxFQUFLLE1BQVEsSUFFeEIsSUFBZ0IsSUFBYSxJQUFnQixJQUFnQixLQUFLLFlBQVksRUFBSyxLQUFNLEVBQWEsRUFBSyxPQUMvRyxVQUVHLGtCQUNILEtBQUssaUJBQWlCLEVBQUssTUFBTyxxREFDbEMsVUFFRyxtQkFDSCxBQUFJLEdBQWUsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLDZCQUNyRCxVQUVHLGdCQUNILE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBSyxXQUFZLEVBQUksRUFBSyxPQUFRLEdBQUssRUFDNUQsQ0FDRixHQUFJLEdBQU8sRUFBSyxHQUVoQixLQUFLLFVBQVUsRUFBTSxFQUFhLEdBRWxDLFVBRUcsV0FFSCxLQUFLLFVBQVUsRUFBSyxNQUFPLEVBQWEsR0FDeEMsVUFFRyxlQUNILE9BQVMsR0FBTSxFQUFHLEVBQVMsRUFBSyxTQUFVLEVBQU0sRUFBTyxPQUFRLEdBQU8sRUFBRyxDQUN2RSxHQUFJLEdBQU8sRUFBTyxHQUVwQixBQUFJLEdBQVEsS0FBSyxVQUFVLEVBQU0sRUFBYSxHQUU5QyxVQUVHLG9CQUNILEtBQUssVUFBVSxFQUFLLEtBQU0sRUFBYSxHQUN2QyxVQUVHLGNBQ0gsS0FBSyxVQUFVLEVBQUssU0FBVSxFQUFhLEdBQzNDLFVBRUcsMEJBQ0gsS0FBSyxVQUFVLEVBQUssV0FBWSxFQUFhLEdBQzdDLGNBR0EsS0FBSyxNQUFNLEVBQUssTUFBUSxHQUFjLFVBQVksZ0JBQWtCLGFBTXhFLEdBQUksSUFBTyxHQUFPLFVBT2xCLEdBQUssZUFBaUIsU0FBUyxFQUFNLEVBQVUsRUFBd0IsQ0FDckUsR0FBSSxPQUFLLFFBQVEsYUFBZSxHQUFLLEVBQUssT0FBUyxrQkFFL0MsT0FBSyxRQUFRLGFBQWUsR0FBTSxHQUFLLFVBQVksRUFBSyxRQUFVLEVBQUssWUFFM0UsSUFBSSxHQUFNLEVBQUssSUFDWCxFQUNKLE9BQVEsRUFBSSxVQUNQLGFBQWMsRUFBTyxFQUFJLEtBQU0sVUFDL0IsVUFBVyxFQUFPLE9BQU8sRUFBSSxPQUFRLGNBQ2pDLE9BRVQsR0FBSSxHQUFPLEVBQUssS0FDaEIsR0FBSSxLQUFLLFFBQVEsYUFBZSxFQUFHLENBQ2pDLEFBQUksSUFBUyxhQUFlLElBQVMsUUFDL0IsR0FBUyxPQUNYLENBQUksRUFDRSxFQUF1QixZQUFjLEdBQ3JDLEdBQXVCLFlBQWMsRUFBSSxPQUV0QyxLQUFLLGlCQUFpQixFQUFJLE1BQU8sdUNBRTVDLEVBQVMsTUFBUSxJQUVuQixPQUVGLEVBQU8sSUFBTSxFQUNiLEdBQUksR0FBUSxFQUFTLEdBQ3JCLEdBQUksRUFBTyxDQUNULEdBQUksR0FDSixBQUFJLElBQVMsT0FDWCxFQUFlLEtBQUssUUFBVSxFQUFNLE1BQVEsRUFBTSxLQUFPLEVBQU0sSUFFL0QsRUFBZSxFQUFNLE1BQVEsRUFBTSxHQUVqQyxHQUNBLEtBQUssaUJBQWlCLEVBQUksTUFBTyxnQ0FFckMsR0FBUSxFQUFTLEdBQVEsQ0FDdkIsS0FBTSxHQUNOLElBQUssR0FDTCxJQUFLLElBR1QsRUFBTSxHQUFRLEtBa0JoQixHQUFLLGdCQUFrQixTQUFTLEVBQU0sRUFBd0IsQ0FDNUQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGlCQUFpQixFQUFNLEdBQ3ZDLEdBQUksS0FBSyxPQUFTLEVBQU0sTUFBTyxDQUM3QixHQUFJLEdBQU8sS0FBSyxZQUFZLEVBQVUsR0FFdEMsSUFEQSxFQUFLLFlBQWMsQ0FBQyxHQUNiLEtBQUssSUFBSSxFQUFNLFFBQVUsRUFBSyxZQUFZLEtBQUssS0FBSyxpQkFBaUIsRUFBTSxJQUNsRixNQUFPLE1BQUssV0FBVyxFQUFNLHNCQUUvQixNQUFPLElBTVQsR0FBSyxpQkFBbUIsU0FBUyxFQUFNLEVBQXdCLEVBQWdCLENBQzdFLEdBQUksS0FBSyxhQUFhLFNBQVUsQ0FDOUIsR0FBSSxLQUFLLFlBQWUsTUFBTyxNQUFLLFdBQVcsR0FHeEMsS0FBSyxZQUFjLEdBRzVCLEdBQUksR0FBeUIsR0FBTyxFQUFpQixHQUFJLEVBQW1CLEdBQzVFLEFBQUksRUFDRixHQUFpQixFQUF1QixvQkFDeEMsRUFBbUIsRUFBdUIsY0FDMUMsRUFBdUIsb0JBQXNCLEVBQXVCLGNBQWdCLElBRXBGLEdBQXlCLEdBQUksSUFDN0IsRUFBeUIsSUFHM0IsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDM0MsQUFBSSxNQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLE9BQ2xELE1BQUssaUJBQW1CLEtBQUssT0FDakMsR0FBSSxHQUFPLEtBQUssc0JBQXNCLEVBQU0sR0FFNUMsR0FESSxHQUFrQixHQUFPLEVBQWUsS0FBSyxLQUFNLEVBQU0sRUFBVSxJQUNuRSxLQUFLLEtBQUssU0FBVSxDQUN0QixHQUFJLElBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsVUFBSyxTQUFXLEtBQUssTUFDckIsR0FBSyxLQUFPLEtBQUssT0FBUyxFQUFNLEdBQUssS0FBSyxhQUFhLEVBQU0sR0FBTyxHQUEwQixFQUN6RixHQUNILEdBQXVCLG9CQUFzQixFQUF1QixjQUFnQixFQUF1QixZQUFjLElBRXZILEVBQXVCLGlCQUFtQixHQUFLLEtBQUssT0FDcEQsR0FBdUIsZ0JBQWtCLElBQzdDLEtBQUssVUFBVSxHQUNmLEtBQUssT0FDTCxHQUFLLE1BQVEsS0FBSyxpQkFBaUIsR0FDNUIsS0FBSyxXQUFXLEdBQU0sNEJBRTdCLEFBQUksSUFBMEIsS0FBSyxzQkFBc0IsRUFBd0IsSUFFbkYsTUFBSSxHQUFpQixJQUFNLEdBQXVCLG9CQUFzQixHQUNwRSxFQUFtQixJQUFNLEdBQXVCLGNBQWdCLEdBQzdELEdBS1QsR0FBSyxzQkFBd0IsU0FBUyxFQUFNLEVBQXdCLENBQ2xFLEdBQUksR0FBVyxLQUFLLE1BQU8sRUFBVyxLQUFLLFNBQ3ZDLEVBQU8sS0FBSyxhQUFhLEVBQU0sR0FDbkMsR0FBSSxLQUFLLHNCQUFzQixHQUEyQixNQUFPLEdBQ2pFLEdBQUksS0FBSyxJQUFJLEVBQU0sVUFBVyxDQUM1QixHQUFJLEdBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsU0FBSyxLQUFPLEVBQ1osRUFBSyxXQUFhLEtBQUssbUJBQ3ZCLEtBQUssT0FBTyxFQUFNLE9BQ2xCLEVBQUssVUFBWSxLQUFLLGlCQUFpQixHQUNoQyxLQUFLLFdBQVcsRUFBTSx5QkFFL0IsTUFBTyxJQUtULEdBQUssYUFBZSxTQUFTLEVBQU0sRUFBd0IsQ0FDekQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGdCQUFnQixFQUF3QixJQUN4RCxNQUFJLE1BQUssc0JBQXNCLElBQ3hCLEVBQUssUUFBVSxHQUFZLEVBQUssT0FBUywwQkFEaUIsRUFDa0IsS0FBSyxZQUFZLEVBQU0sRUFBVSxFQUFVLEdBQUksSUFTcEksR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFjLEVBQWMsRUFBUyxFQUFNLENBQzNFLEdBQUksR0FBTyxLQUFLLEtBQUssTUFDckIsR0FBSSxHQUFRLE1BQVMsRUFBQyxHQUFRLEtBQUssT0FBUyxFQUFNLE1BQzVDLEVBQU8sRUFBUyxDQUNsQixHQUFJLEdBQVUsS0FBSyxPQUFTLEVBQU0sV0FBYSxLQUFLLE9BQVMsRUFBTSxXQUMvRCxFQUFXLEtBQUssT0FBUyxFQUFNLFNBQ25DLEFBQUksR0FHRixHQUFPLEVBQU0sV0FBVyxPQUUxQixHQUFJLEdBQUssS0FBSyxNQUNkLEtBQUssT0FDTCxHQUFJLElBQVcsS0FBSyxNQUFPLEdBQVcsS0FBSyxTQUN2QyxHQUFRLEtBQUssWUFBWSxLQUFLLGdCQUFnQixLQUFNLElBQVEsR0FBVSxHQUFVLEVBQU0sR0FDdEYsR0FBTyxLQUFLLFlBQVksRUFBYyxFQUFjLEVBQU0sR0FBTyxFQUFJLEdBQVcsR0FDcEYsTUFBSyxJQUFXLEtBQUssT0FBUyxFQUFNLFVBQWMsR0FBYSxNQUFLLE9BQVMsRUFBTSxXQUFhLEtBQUssT0FBUyxFQUFNLGNBQ2xILEtBQUssaUJBQWlCLEtBQUssTUFBTyw0RkFFN0IsS0FBSyxZQUFZLEdBQU0sRUFBYyxFQUFjLEVBQVMsR0FHdkUsTUFBTyxJQUdULEdBQUssWUFBYyxTQUFTLEVBQVUsRUFBVSxFQUFNLEVBQU8sRUFBSSxFQUFTLENBQ3hFLEdBQUksR0FBTyxLQUFLLFlBQVksRUFBVSxHQUN0QyxTQUFLLEtBQU8sRUFDWixFQUFLLFNBQVcsRUFDaEIsRUFBSyxNQUFRLEVBQ04sS0FBSyxXQUFXLEVBQU0sRUFBVSxvQkFBc0IscUJBSy9ELEdBQUssZ0JBQWtCLFNBQVMsRUFBd0IsRUFBVSxDQUNoRSxHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQ3JELEdBQUksS0FBSyxhQUFhLFVBQWEsTUFBSyxTQUFZLENBQUMsS0FBSyxZQUFjLEtBQUssUUFBUSwyQkFDbkYsRUFBTyxLQUFLLGFBQ1osRUFBVyxXQUNGLEtBQUssS0FBSyxPQUFRLENBQzNCLEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBUyxLQUFLLE9BQVMsRUFBTSxPQUMxRCxFQUFLLFNBQVcsS0FBSyxNQUNyQixFQUFLLE9BQVMsR0FDZCxLQUFLLE9BQ0wsRUFBSyxTQUFXLEtBQUssZ0JBQWdCLEtBQU0sSUFDM0MsS0FBSyxzQkFBc0IsRUFBd0IsSUFDbkQsQUFBSSxFQUFVLEtBQUssVUFBVSxFQUFLLFVBQzdCLEFBQUksS0FBSyxRQUFVLEVBQUssV0FBYSxVQUNqQyxFQUFLLFNBQVMsT0FBUyxhQUM1QixLQUFLLGlCQUFpQixFQUFLLE1BQU8sMENBQy9CLEVBQVcsR0FDbEIsRUFBTyxLQUFLLFdBQVcsRUFBTSxFQUFTLG1CQUFxQix1QkFDdEQsQ0FFTCxHQURBLEVBQU8sS0FBSyxvQkFBb0IsR0FDNUIsS0FBSyxzQkFBc0IsR0FBMkIsTUFBTyxHQUNqRSxLQUFPLEtBQUssS0FBSyxTQUFXLENBQUMsS0FBSyxzQkFBc0IsQ0FDdEQsR0FBSSxHQUFTLEtBQUssWUFBWSxFQUFVLEdBQ3hDLEVBQU8sU0FBVyxLQUFLLE1BQ3ZCLEVBQU8sT0FBUyxHQUNoQixFQUFPLFNBQVcsRUFDbEIsS0FBSyxVQUFVLEdBQ2YsS0FBSyxPQUNMLEVBQU8sS0FBSyxXQUFXLEVBQVEscUJBSW5DLE1BQUksQ0FBQyxHQUFZLEtBQUssSUFBSSxFQUFNLFVBQ3JCLEtBQUssWUFBWSxFQUFVLEVBQVUsRUFBTSxLQUFLLGdCQUFnQixLQUFNLElBQVEsS0FBTSxJQUVwRixHQUtiLEdBQUssb0JBQXNCLFNBQVMsRUFBd0IsQ0FDMUQsR0FBSSxHQUFXLEtBQUssTUFBTyxFQUFXLEtBQUssU0FDdkMsRUFBTyxLQUFLLGNBQWMsR0FDOUIsR0FBSSxFQUFLLE9BQVMsMkJBQTZCLEtBQUssTUFBTSxNQUFNLEtBQUssYUFBYyxLQUFLLGNBQWdCLElBQ3BHLE1BQU8sR0FDWCxHQUFJLEdBQVMsS0FBSyxnQkFBZ0IsRUFBTSxFQUFVLEdBQ2xELE1BQUksSUFBMEIsRUFBTyxPQUFTLG9CQUN4QyxHQUF1QixxQkFBdUIsRUFBTyxPQUFTLEdBQXVCLG9CQUFzQixJQUMzRyxFQUF1QixtQkFBcUIsRUFBTyxPQUFTLEdBQXVCLGtCQUFvQixLQUV0RyxHQUdULEdBQUssZ0JBQWtCLFNBQVMsRUFBTSxFQUFVLEVBQVUsRUFBUyxDQU1qRSxPQUxJLEdBQWtCLEtBQUssUUFBUSxhQUFlLEdBQUssRUFBSyxPQUFTLGNBQWdCLEVBQUssT0FBUyxTQUMvRixLQUFLLGFBQWUsRUFBSyxLQUFPLENBQUMsS0FBSyxzQkFBd0IsRUFBSyxJQUFNLEVBQUssT0FBVSxHQUN4RixLQUFLLG1CQUFxQixFQUFLLE1BQy9CLEVBQWtCLEtBRVQsQ0FDWCxHQUFJLEdBQVUsS0FBSyxlQUFlLEVBQU0sRUFBVSxFQUFVLEVBQVMsRUFBaUIsR0FHdEYsR0FESSxFQUFRLFVBQVksR0FBa0IsSUFDdEMsSUFBWSxHQUFRLEVBQVEsT0FBUywwQkFBMkIsQ0FDbEUsR0FBSSxFQUFpQixDQUNuQixHQUFJLEdBQVksS0FBSyxZQUFZLEVBQVUsR0FDM0MsRUFBVSxXQUFhLEVBQ3ZCLEVBQVUsS0FBSyxXQUFXLEVBQVcsbUJBRXZDLE1BQU8sR0FHVCxFQUFPLElBSVgsR0FBSyxlQUFpQixTQUFTLEVBQU0sRUFBVSxFQUFVLEVBQVMsRUFBaUIsRUFBaUIsQ0FDbEcsR0FBSSxHQUFvQixLQUFLLFFBQVEsYUFBZSxHQUNoRCxFQUFXLEdBQXFCLEtBQUssSUFBSSxFQUFNLGFBQ25ELEFBQUksR0FBVyxHQUFZLEtBQUssTUFBTSxLQUFLLGFBQWMsb0VBRXpELEdBQUksR0FBVyxLQUFLLElBQUksRUFBTSxVQUM5QixHQUFJLEdBQWEsR0FBWSxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLFdBQWMsS0FBSyxJQUFJLEVBQU0sS0FBTSxDQUNoSCxHQUFJLElBQU8sS0FBSyxZQUFZLEVBQVUsR0FDdEMsR0FBSyxPQUFTLEVBQ2QsR0FBSyxTQUFXLEVBQVcsS0FBSyxrQkFBb0IsS0FBSyxXQUFXLEtBQUssUUFBUSxnQkFBa0IsU0FDbkcsR0FBSyxTQUFXLENBQUMsQ0FBQyxFQUNkLEdBQVksS0FBSyxPQUFPLEVBQU0sVUFDOUIsR0FDRixJQUFLLFNBQVcsR0FFbEIsRUFBTyxLQUFLLFdBQVcsR0FBTSw0QkFDcEIsQ0FBQyxHQUFXLEtBQUssSUFBSSxFQUFNLFFBQVMsQ0FDN0MsR0FBSSxJQUF5QixHQUFJLElBQXFCLEdBQWMsS0FBSyxTQUFVLEdBQWMsS0FBSyxTQUFVLEdBQW1CLEtBQUssY0FDeEksS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ3JCLEdBQUksSUFBVyxLQUFLLGNBQWMsRUFBTSxPQUFRLEtBQUssUUFBUSxhQUFlLEVBQUcsR0FBTyxJQUN0RixHQUFJLEdBQW1CLENBQUMsR0FBWSxDQUFDLEtBQUssc0JBQXdCLEtBQUssSUFBSSxFQUFNLE9BQy9FLFlBQUssbUJBQW1CLEdBQXdCLElBQ2hELEtBQUssaUNBQ0QsS0FBSyxjQUFnQixHQUNyQixLQUFLLE1BQU0sS0FBSyxjQUFlLDZEQUNuQyxLQUFLLFNBQVcsR0FDaEIsS0FBSyxTQUFXLEdBQ2hCLEtBQUssY0FBZ0IsR0FDZCxLQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLEdBQVUsSUFFbkYsS0FBSyxzQkFBc0IsR0FBd0IsSUFDbkQsS0FBSyxTQUFXLElBQWUsS0FBSyxTQUNwQyxLQUFLLFNBQVcsSUFBZSxLQUFLLFNBQ3BDLEtBQUssY0FBZ0IsSUFBb0IsS0FBSyxjQUM5QyxHQUFJLElBQVMsS0FBSyxZQUFZLEVBQVUsR0FDeEMsR0FBTyxPQUFTLEVBQ2hCLEdBQU8sVUFBWSxHQUNmLEdBQ0YsSUFBTyxTQUFXLEdBRXBCLEVBQU8sS0FBSyxXQUFXLEdBQVEsMEJBQ3RCLEtBQUssT0FBUyxFQUFNLFVBQVcsQ0FDeEMsQUFBSSxJQUFZLElBQ2QsS0FBSyxNQUFNLEtBQUssTUFBTyw2RUFFekIsR0FBSSxJQUFTLEtBQUssWUFBWSxFQUFVLEdBQ3hDLEdBQU8sSUFBTSxFQUNiLEdBQU8sTUFBUSxLQUFLLGNBQWMsQ0FBQyxTQUFVLEtBQzdDLEVBQU8sS0FBSyxXQUFXLEdBQVEsNEJBRWpDLE1BQU8sSUFRVCxHQUFLLGNBQWdCLFNBQVMsRUFBd0IsQ0FHcEQsQUFBSSxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssYUFFdEMsR0FBSSxHQUFNLEVBQWEsS0FBSyxtQkFBcUIsS0FBSyxNQUN0RCxPQUFRLEtBQUssVUFDUixHQUFNLE9BQ1QsTUFBSyxNQUFLLFlBQ04sS0FBSyxNQUFNLEtBQUssTUFBTyxvQ0FDM0IsRUFBTyxLQUFLLFlBQ1osS0FBSyxPQUNELEtBQUssT0FBUyxFQUFNLFFBQVUsQ0FBQyxLQUFLLGtCQUNwQyxLQUFLLE1BQU0sRUFBSyxNQUFPLGtEQU92QixLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssT0FBUyxFQUFNLFVBQVksS0FBSyxPQUFTLEVBQU0sUUFDL0UsS0FBSyxhQUNGLEtBQUssV0FBVyxFQUFNLGFBRTFCLEdBQU0sTUFDVCxTQUFPLEtBQUssWUFDWixLQUFLLE9BQ0UsS0FBSyxXQUFXLEVBQU0sc0JBRTFCLEdBQU0sS0FDVCxHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQWMsS0FBSyxZQUNwRSxFQUFLLEtBQUssV0FBVyxJQUN6QixHQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxHQUFlLEVBQUcsT0FBUyxTQUFXLENBQUMsS0FBSyxzQkFBd0IsS0FBSyxJQUFJLEVBQU0sV0FDckgsTUFBTyxNQUFLLGNBQWMsS0FBSyxZQUFZLEVBQVUsR0FBVyxFQUFHLEdBQU8sSUFDOUUsR0FBSSxHQUFjLENBQUMsS0FBSyxxQkFBc0IsQ0FDNUMsR0FBSSxLQUFLLElBQUksRUFBTSxPQUNmLE1BQU8sTUFBSyxxQkFBcUIsS0FBSyxZQUFZLEVBQVUsR0FBVyxDQUFDLEdBQUssSUFDakYsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQUcsT0FBUyxTQUFXLEtBQUssT0FBUyxFQUFNLE1BQVEsQ0FBQyxFQUN2RixTQUFLLEtBQUssV0FBVyxJQUNqQixNQUFLLHNCQUF3QixDQUFDLEtBQUssSUFBSSxFQUFNLFNBQzdDLEtBQUssYUFDRixLQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLENBQUMsR0FBSyxJQUdqRixNQUFPLE9BRUosR0FBTSxPQUNULEdBQUksR0FBUSxLQUFLLE1BQ2pCLFNBQU8sS0FBSyxhQUFhLEVBQU0sT0FDL0IsRUFBSyxNQUFRLENBQUMsUUFBUyxFQUFNLFFBQVMsTUFBTyxFQUFNLE9BQzVDLE1BRUosR0FBTSxRQUFVLEdBQU0sT0FDekIsTUFBTyxNQUFLLGFBQWEsS0FBSyxXQUUzQixHQUFNLFVBQVksR0FBTSxVQUFZLEdBQU0sT0FDN0MsU0FBTyxLQUFLLFlBQ1osRUFBSyxNQUFRLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBTyxLQUFLLE9BQVMsRUFBTSxNQUNwRSxFQUFLLElBQU0sS0FBSyxLQUFLLFFBQ3JCLEtBQUssT0FDRSxLQUFLLFdBQVcsRUFBTSxlQUUxQixHQUFNLE9BQ1QsR0FBSSxHQUFRLEtBQUssTUFBTyxHQUFPLEtBQUssbUNBQW1DLEdBQ3ZFLE1BQUksSUFDRSxHQUF1QixvQkFBc0IsR0FBSyxDQUFDLEtBQUsscUJBQXFCLEtBQzdFLEdBQXVCLG9CQUFzQixHQUM3QyxFQUF1QixrQkFBb0IsR0FDM0MsR0FBdUIsa0JBQW9CLElBRTFDLE9BRUosR0FBTSxTQUNULFNBQU8sS0FBSyxZQUNaLEtBQUssT0FDTCxFQUFLLFNBQVcsS0FBSyxjQUFjLEVBQU0sU0FBVSxHQUFNLEdBQU0sR0FDeEQsS0FBSyxXQUFXLEVBQU0sdUJBRTFCLEdBQU0sT0FDVCxNQUFPLE1BQUssU0FBUyxHQUFPLE9BRXpCLEdBQU0sVUFDVCxTQUFPLEtBQUssWUFDWixLQUFLLE9BQ0UsS0FBSyxjQUFjLEVBQU0sT0FFN0IsR0FBTSxPQUNULE1BQU8sTUFBSyxXQUFXLEtBQUssWUFBYSxRQUV0QyxHQUFNLEtBQ1QsTUFBTyxNQUFLLGVBRVQsR0FBTSxVQUNULE1BQU8sTUFBSyxvQkFFVCxHQUFNLFFBQ1QsTUFBSSxNQUFLLFFBQVEsYUFBZSxHQUN2QixLQUFLLGtCQUVMLEtBQUsscUJBSWQsS0FBSyxlQUlULEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssWUFJaEIsQUFBSSxLQUFLLGFBQWUsS0FBSyxpQkFBaUIsS0FBSyxNQUFPLHFDQUMxRCxHQUFJLEdBQU8sS0FBSyxXQUFXLElBRTNCLE9BQVEsS0FBSyxVQUNSLEdBQU0sT0FDVCxNQUFPLE1BQUssbUJBQW1CLE9BQzVCLEdBQU0sSUFDVCxTQUFLLEtBQU8sRUFDTCxLQUFLLGdCQUFnQixXQUU1QixLQUFLLGVBSVQsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBT3ZDLEdBTkEsS0FBSyxPQUdMLEVBQUssT0FBUyxLQUFLLG1CQUdmLENBQUMsS0FBSyxJQUFJLEVBQU0sUUFBUyxDQUMzQixHQUFJLEdBQVcsS0FBSyxNQUNwQixBQUFJLEtBQUssSUFBSSxFQUFNLFFBQVUsS0FBSyxJQUFJLEVBQU0sUUFDMUMsS0FBSyxpQkFBaUIsRUFBVSw2Q0FFaEMsS0FBSyxXQUFXLEdBSXBCLE1BQU8sTUFBSyxXQUFXLEVBQU0scUJBRy9CLEdBQUssZ0JBQWtCLFNBQVMsRUFBTSxDQUNwQyxLQUFLLE9BRUwsR0FBSSxHQUFjLEtBQUssWUFDdkIsU0FBSyxTQUFXLEtBQUssV0FBVyxJQUU1QixFQUFLLFNBQVMsT0FBUyxRQUN2QixLQUFLLGlCQUFpQixFQUFLLFNBQVMsTUFBTyw0REFDM0MsR0FDQSxLQUFLLGlCQUFpQixFQUFLLE1BQU8scURBQ2xDLEtBQUssUUFBUSxhQUFlLFVBQzVCLEtBQUssaUJBQWlCLEVBQUssTUFBTyw2Q0FFL0IsS0FBSyxXQUFXLEVBQU0saUJBRy9CLEdBQUssYUFBZSxTQUFTLEVBQU8sQ0FDbEMsR0FBSSxHQUFPLEtBQUssWUFDaEIsU0FBSyxNQUFRLEVBQ2IsRUFBSyxJQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLEtBQ3pDLEVBQUssSUFBSSxXQUFXLEVBQUssSUFBSSxPQUFTLEtBQU8sS0FBTyxHQUFLLE9BQVMsRUFBSyxJQUFJLE1BQU0sRUFBRyxJQUFJLFFBQVEsS0FBTSxLQUMxRyxLQUFLLE9BQ0UsS0FBSyxXQUFXLEVBQU0sWUFHL0IsR0FBSyxxQkFBdUIsVUFBVyxDQUNyQyxLQUFLLE9BQU8sRUFBTSxRQUNsQixHQUFJLEdBQU0sS0FBSyxrQkFDZixZQUFLLE9BQU8sRUFBTSxRQUNYLEdBR1QsR0FBSyxtQ0FBcUMsU0FBUyxFQUFZLENBQzdELEdBQUksR0FBVyxLQUFLLE1BQU8sRUFBVyxLQUFLLFNBQVUsRUFBSyxFQUFxQixLQUFLLFFBQVEsYUFBZSxFQUMzRyxHQUFJLEtBQUssUUFBUSxhQUFlLEVBQUcsQ0FDakMsS0FBSyxPQUVMLEdBQUksR0FBZ0IsS0FBSyxNQUFPLEVBQWdCLEtBQUssU0FDakQsRUFBVyxHQUFJLEVBQVEsR0FBTSxHQUFjLEdBQzNDLEdBQXlCLEdBQUksSUFBcUIsR0FBYyxLQUFLLFNBQVUsR0FBYyxLQUFLLFNBQVUsR0FJaEgsSUFIQSxLQUFLLFNBQVcsRUFDaEIsS0FBSyxTQUFXLEVBRVQsS0FBSyxPQUFTLEVBQU0sUUFFekIsR0FEQSxFQUFRLEVBQVEsR0FBUSxLQUFLLE9BQU8sRUFBTSxPQUN0QyxHQUFzQixLQUFLLG1CQUFtQixFQUFNLE9BQVEsSUFBTyxDQUNyRSxHQUFjLEdBQ2QsY0FDUyxLQUFLLE9BQVMsRUFBTSxTQUFVLENBQ3ZDLEdBQWMsS0FBSyxNQUNuQixFQUFTLEtBQUssS0FBSyxlQUFlLEtBQUsscUJBQ25DLEtBQUssT0FBUyxFQUFNLE9BQVMsS0FBSyxNQUFNLEtBQUssTUFBTyxpREFDeEQsVUFFQSxHQUFTLEtBQUssS0FBSyxpQkFBaUIsR0FBTyxHQUF3QixLQUFLLGlCQUc1RSxHQUFJLElBQWMsS0FBSyxNQUFPLEdBQWMsS0FBSyxTQUdqRCxHQUZBLEtBQUssT0FBTyxFQUFNLFFBRWQsR0FBYyxDQUFDLEtBQUssc0JBQXdCLEtBQUssSUFBSSxFQUFNLE9BQzdELFlBQUssbUJBQW1CLEdBQXdCLElBQ2hELEtBQUssaUNBQ0wsS0FBSyxTQUFXLEdBQ2hCLEtBQUssU0FBVyxHQUNULEtBQUssb0JBQW9CLEVBQVUsRUFBVSxHQUd0RCxBQUFJLEVBQUMsRUFBUyxRQUFVLEtBQWUsS0FBSyxXQUFXLEtBQUssY0FDeEQsSUFBZSxLQUFLLFdBQVcsSUFDbkMsS0FBSyxzQkFBc0IsR0FBd0IsSUFDbkQsS0FBSyxTQUFXLElBQWUsS0FBSyxTQUNwQyxLQUFLLFNBQVcsSUFBZSxLQUFLLFNBRXBDLEFBQUksRUFBUyxPQUFTLEVBQ3BCLEdBQU0sS0FBSyxZQUFZLEVBQWUsR0FDdEMsRUFBSSxZQUFjLEVBQ2xCLEtBQUssYUFBYSxFQUFLLHFCQUFzQixHQUFhLEtBRTFELEVBQU0sRUFBUyxPQUdqQixHQUFNLEtBQUssdUJBR2IsR0FBSSxLQUFLLFFBQVEsZUFBZ0IsQ0FDL0IsR0FBSSxJQUFNLEtBQUssWUFBWSxFQUFVLEdBQ3JDLFVBQUksV0FBYSxFQUNWLEtBQUssV0FBVyxHQUFLLCtCQUU1QixPQUFPLElBSVgsR0FBSyxlQUFpQixTQUFTLEVBQU0sQ0FDbkMsTUFBTyxJQUdULEdBQUssb0JBQXNCLFNBQVMsRUFBVSxFQUFVLEVBQVUsQ0FDaEUsTUFBTyxNQUFLLHFCQUFxQixLQUFLLFlBQVksRUFBVSxHQUFXLElBU3pFLEdBQUksSUFBVSxHQUVkLEdBQUssU0FBVyxVQUFXLENBQ3pCLEFBQUksS0FBSyxhQUFlLEtBQUssaUJBQWlCLEtBQUssTUFBTyxrQ0FDMUQsR0FBSSxHQUFPLEtBQUssWUFDWixFQUFPLEtBQUssV0FBVyxJQUMzQixHQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssS0FBSyxJQUFJLEVBQU0sS0FBTSxDQUN4RCxFQUFLLEtBQU8sRUFDWixHQUFJLEdBQWMsS0FBSyxZQUN2QixTQUFLLFNBQVcsS0FBSyxXQUFXLElBQzVCLEVBQUssU0FBUyxPQUFTLFVBQ3ZCLEtBQUssaUJBQWlCLEVBQUssU0FBUyxNQUFPLHdEQUMzQyxHQUNBLEtBQUssaUJBQWlCLEVBQUssTUFBTyxvREFDakMsS0FBSyxzQkFDTixLQUFLLGlCQUFpQixFQUFLLE1BQU8sOENBQy9CLEtBQUssV0FBVyxFQUFNLGdCQUUvQixHQUFJLEdBQVcsS0FBSyxNQUFPLEVBQVcsS0FBSyxTQUFVLEVBQVcsS0FBSyxPQUFTLEVBQU0sUUFDcEYsU0FBSyxPQUFTLEtBQUssZ0JBQWdCLEtBQUssZ0JBQWlCLEVBQVUsRUFBVSxJQUN6RSxHQUFZLEVBQUssT0FBTyxPQUFTLG9CQUNuQyxLQUFLLE1BQU0sRUFBVSxnQ0FFdkIsQUFBSSxLQUFLLElBQUksRUFBTSxRQUFXLEVBQUssVUFBWSxLQUFLLGNBQWMsRUFBTSxPQUFRLEtBQUssUUFBUSxhQUFlLEVBQUcsSUFDeEcsRUFBSyxVQUFZLEdBQ2pCLEtBQUssV0FBVyxFQUFNLGtCQUsvQixHQUFLLHFCQUF1QixTQUFTLEVBQUssQ0FDeEMsR0FBSSxHQUFXLEVBQUksU0FFZixFQUFPLEtBQUssWUFDaEIsTUFBSSxNQUFLLE9BQVMsRUFBTSxnQkFDakIsSUFDSCxLQUFLLGlCQUFpQixLQUFLLE1BQU8sb0RBRXBDLEVBQUssTUFBUSxDQUNYLElBQUssS0FBSyxNQUNWLE9BQVEsT0FHVixFQUFLLE1BQVEsQ0FDWCxJQUFLLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLEtBQUssUUFBUSxTQUFVO0FBQUEsR0FDOUQsT0FBUSxLQUFLLE9BR2pCLEtBQUssT0FDTCxFQUFLLEtBQU8sS0FBSyxPQUFTLEVBQU0sVUFDekIsS0FBSyxXQUFXLEVBQU0sb0JBRy9CLEdBQUssY0FBZ0IsU0FBUyxFQUFLLENBQ2pDLEFBQUssSUFBUSxRQUFTLEdBQU0sSUFDNUIsR0FBSSxHQUFXLEVBQUksU0FBVSxBQUFLLElBQWEsUUFBUyxHQUFXLElBRW5FLEdBQUksR0FBTyxLQUFLLFlBQ2hCLEtBQUssT0FDTCxFQUFLLFlBQWMsR0FDbkIsR0FBSSxHQUFTLEtBQUsscUJBQXFCLENBQUMsU0FBVSxJQUVsRCxJQURBLEVBQUssT0FBUyxDQUFDLEdBQ1IsQ0FBQyxFQUFPLE1BQ2IsQUFBSSxLQUFLLE9BQVMsRUFBTSxLQUFPLEtBQUssTUFBTSxLQUFLLElBQUssaUNBQ3BELEtBQUssT0FBTyxFQUFNLGNBQ2xCLEVBQUssWUFBWSxLQUFLLEtBQUssbUJBQzNCLEtBQUssT0FBTyxFQUFNLFFBQ2xCLEVBQUssT0FBTyxLQUFLLEVBQVMsS0FBSyxxQkFBcUIsQ0FBQyxTQUFVLEtBRWpFLFlBQUssT0FDRSxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSyxZQUFjLFNBQVMsRUFBTSxDQUNoQyxNQUFPLENBQUMsRUFBSyxVQUFZLEVBQUssSUFBSSxPQUFTLGNBQWdCLEVBQUssSUFBSSxPQUFTLFNBQzFFLE1BQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxPQUFTLEVBQU0sS0FBTyxLQUFLLE9BQVMsRUFBTSxRQUFVLEtBQUssT0FBUyxFQUFNLFVBQVksS0FBSyxLQUFLLFNBQVksS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLE9BQVMsRUFBTSxPQUNqTSxDQUFDLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxTQUszRCxHQUFLLFNBQVcsU0FBUyxFQUFXLEVBQXdCLENBQzFELEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBUSxHQUFNLEVBQVcsR0FHdEQsSUFGQSxFQUFLLFdBQWEsR0FDbEIsS0FBSyxPQUNFLENBQUMsS0FBSyxJQUFJLEVBQU0sU0FBUyxDQUM5QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLG1CQUFtQixFQUFNLFFBQVcsTUFHaEYsR0FBSSxHQUFPLEtBQUssY0FBYyxFQUFXLEdBQ3pDLEFBQUssR0FBYSxLQUFLLGVBQWUsRUFBTSxFQUFVLEdBQ3RELEVBQUssV0FBVyxLQUFLLEdBRXZCLE1BQU8sTUFBSyxXQUFXLEVBQU0sRUFBWSxnQkFBa0IscUJBRzdELEdBQUssY0FBZ0IsU0FBUyxFQUFXLEVBQXdCLENBQy9ELEdBQUksR0FBTyxLQUFLLFlBQWEsRUFBYSxFQUFTLEVBQVUsRUFDN0QsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssSUFBSSxFQUFNLFVBQ2xELE1BQUksR0FDRixHQUFLLFNBQVcsS0FBSyxXQUFXLElBQzVCLEtBQUssT0FBUyxFQUFNLE9BQ3RCLEtBQUssTUFBTSxLQUFLLE1BQU8saURBRWxCLEtBQUssV0FBVyxFQUFNLGdCQUczQixNQUFLLE9BQVMsRUFBTSxRQUFVLEdBQzVCLEdBQXVCLG9CQUFzQixHQUMvQyxHQUF1QixvQkFBc0IsS0FBSyxPQUVoRCxFQUF1QixrQkFBb0IsR0FDN0MsR0FBdUIsa0JBQW9CLEtBQUssUUFJcEQsRUFBSyxTQUFXLEtBQUssaUJBQWlCLEdBQU8sR0FFekMsS0FBSyxPQUFTLEVBQU0sT0FBUyxHQUEwQixFQUF1QixjQUFnQixHQUNoRyxHQUF1QixjQUFnQixLQUFLLE9BR3ZDLEtBQUssV0FBVyxFQUFNLGtCQUUvQixBQUFJLEtBQUssUUFBUSxhQUFlLEdBQzlCLEdBQUssT0FBUyxHQUNkLEVBQUssVUFBWSxHQUNiLElBQWEsSUFDZixHQUFXLEtBQUssTUFDaEIsRUFBVyxLQUFLLFVBRWIsR0FDRCxHQUFjLEtBQUssSUFBSSxFQUFNLFFBRW5DLEdBQUksR0FBYyxLQUFLLFlBQ3ZCLFlBQUssa0JBQWtCLEdBQ3ZCLEFBQUksQ0FBQyxHQUFhLENBQUMsR0FBZSxLQUFLLFFBQVEsYUFBZSxHQUFLLENBQUMsR0FBZSxLQUFLLFlBQVksR0FDbEcsR0FBVSxHQUNWLEVBQWMsS0FBSyxRQUFRLGFBQWUsR0FBSyxLQUFLLElBQUksRUFBTSxNQUM5RCxLQUFLLGtCQUFrQixFQUFNLElBRTdCLEVBQVUsR0FFWixLQUFLLG1CQUFtQixFQUFNLEVBQVcsRUFBYSxFQUFTLEVBQVUsRUFBVSxFQUF3QixHQUNwRyxLQUFLLFdBQVcsRUFBTSxhQUcvQixHQUFLLG1CQUFxQixTQUFTLEVBQU0sRUFBVyxFQUFhLEVBQVMsRUFBVSxFQUFVLEVBQXdCLEVBQWEsQ0FJakksR0FISyxJQUFlLElBQVksS0FBSyxPQUFTLEVBQU0sT0FDaEQsS0FBSyxhQUVMLEtBQUssSUFBSSxFQUFNLE9BQ2pCLEVBQUssTUFBUSxFQUFZLEtBQUssa0JBQWtCLEtBQUssTUFBTyxLQUFLLFVBQVksS0FBSyxpQkFBaUIsR0FBTyxHQUMxRyxFQUFLLEtBQU8sZUFDSCxLQUFLLFFBQVEsYUFBZSxHQUFLLEtBQUssT0FBUyxFQUFNLE9BQzlELEFBQUksR0FBYSxLQUFLLGFBQ3RCLEVBQUssS0FBTyxPQUNaLEVBQUssT0FBUyxHQUNkLEVBQUssTUFBUSxLQUFLLFlBQVksRUFBYSxXQUNsQyxDQUFDLEdBQWEsQ0FBQyxHQUNmLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxFQUFLLFVBQVksRUFBSyxJQUFJLE9BQVMsY0FDcEUsR0FBSyxJQUFJLE9BQVMsT0FBUyxFQUFLLElBQUksT0FBUyxRQUM3QyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssT0FBUyxFQUFNLFFBQVUsS0FBSyxPQUFTLEVBQU0sR0FBSyxDQUM5RixBQUFJLElBQWUsSUFBVyxLQUFLLGFBQ25DLEVBQUssS0FBTyxFQUFLLElBQUksS0FDckIsS0FBSyxrQkFBa0IsR0FDdkIsRUFBSyxNQUFRLEtBQUssWUFBWSxJQUM5QixHQUFJLEdBQWEsRUFBSyxPQUFTLE1BQVEsRUFBSSxFQUMzQyxHQUFJLEVBQUssTUFBTSxPQUFPLFNBQVcsRUFBWSxDQUMzQyxHQUFJLElBQVEsRUFBSyxNQUFNLE1BQ3ZCLEFBQUksRUFBSyxPQUFTLE1BQ2QsS0FBSyxpQkFBaUIsR0FBTyxnQ0FFN0IsS0FBSyxpQkFBaUIsR0FBTyw0Q0FFakMsQUFBSSxHQUFLLE9BQVMsT0FBUyxFQUFLLE1BQU0sT0FBTyxHQUFHLE9BQVMsZUFDckQsS0FBSyxpQkFBaUIsRUFBSyxNQUFNLE9BQU8sR0FBRyxNQUFPLHFDQUVuRCxBQUFJLE1BQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxFQUFLLFVBQVksRUFBSyxJQUFJLE9BQVMsYUFDMUUsS0FBZSxJQUFXLEtBQUssYUFDbkMsS0FBSyxnQkFBZ0IsRUFBSyxLQUN0QixFQUFLLElBQUksT0FBUyxTQUFXLENBQUMsS0FBSyxlQUNuQyxNQUFLLGNBQWdCLEdBQ3pCLEVBQUssS0FBTyxPQUNaLEFBQUksRUFDRixFQUFLLE1BQVEsS0FBSyxrQkFBa0IsRUFBVSxFQUFVLEVBQUssS0FDeEQsQUFBSSxLQUFLLE9BQVMsRUFBTSxJQUFNLEVBQy9CLEdBQXVCLGdCQUFrQixHQUN6QyxHQUF1QixnQkFBa0IsS0FBSyxPQUNsRCxFQUFLLE1BQVEsS0FBSyxrQkFBa0IsRUFBVSxFQUFVLEVBQUssTUFFN0QsRUFBSyxNQUFRLEVBQUssSUFFcEIsRUFBSyxVQUFZLElBQ1YsS0FBSyxjQUdoQixHQUFLLGtCQUFvQixTQUFTLEVBQU0sQ0FDdEMsR0FBSSxLQUFLLFFBQVEsYUFBZSxFQUFHLENBQ2pDLEdBQUksS0FBSyxJQUFJLEVBQU0sVUFDakIsU0FBSyxTQUFXLEdBQ2hCLEVBQUssSUFBTSxLQUFLLG1CQUNoQixLQUFLLE9BQU8sRUFBTSxVQUNYLEVBQUssSUFFWixFQUFLLFNBQVcsR0FHcEIsTUFBTyxHQUFLLElBQU0sS0FBSyxPQUFTLEVBQU0sS0FBTyxLQUFLLE9BQVMsRUFBTSxPQUFTLEtBQUssZ0JBQWtCLEtBQUssV0FBVyxLQUFLLFFBQVEsZ0JBQWtCLFVBS2xKLEdBQUssYUFBZSxTQUFTLEVBQU0sQ0FDakMsRUFBSyxHQUFLLEtBQ04sS0FBSyxRQUFRLGFBQWUsR0FBSyxHQUFLLFVBQVksRUFBSyxXQUFhLElBQ3BFLEtBQUssUUFBUSxhQUFlLEdBQUssR0FBSyxNQUFRLEtBS3BELEdBQUssWUFBYyxTQUFTLEVBQWEsRUFBUyxFQUFrQixDQUNsRSxHQUFJLEdBQU8sS0FBSyxZQUFhLEVBQWMsS0FBSyxTQUFVLEVBQWMsS0FBSyxTQUFVLEVBQW1CLEtBQUssY0FFL0csWUFBSyxhQUFhLEdBQ2QsS0FBSyxRQUFRLGFBQWUsR0FDNUIsR0FBSyxVQUFZLEdBQ2pCLEtBQUssUUFBUSxhQUFlLEdBQzVCLEdBQUssTUFBUSxDQUFDLENBQUMsR0FFbkIsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ3JCLEtBQUssV0FBVyxHQUFjLEVBQVMsRUFBSyxXQUFhLEdBQWUsR0FBbUIsR0FBcUIsSUFFaEgsS0FBSyxPQUFPLEVBQU0sUUFDbEIsRUFBSyxPQUFTLEtBQUssaUJBQWlCLEVBQU0sT0FBUSxHQUFPLEtBQUssUUFBUSxhQUFlLEdBQ3JGLEtBQUssaUNBQ0wsS0FBSyxrQkFBa0IsRUFBTSxHQUFPLElBRXBDLEtBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUNkLEtBQUssV0FBVyxFQUFNLHVCQUsvQixHQUFLLHFCQUF1QixTQUFTLEVBQU0sRUFBUSxFQUFTLENBQzFELEdBQUksR0FBYyxLQUFLLFNBQVUsRUFBYyxLQUFLLFNBQVUsRUFBbUIsS0FBSyxjQUV0RixZQUFLLFdBQVcsR0FBYyxFQUFTLElBQVMsSUFDaEQsS0FBSyxhQUFhLEdBQ2QsS0FBSyxRQUFRLGFBQWUsR0FBSyxHQUFLLE1BQVEsQ0FBQyxDQUFDLEdBRXBELEtBQUssU0FBVyxFQUNoQixLQUFLLFNBQVcsRUFDaEIsS0FBSyxjQUFnQixFQUVyQixFQUFLLE9BQVMsS0FBSyxpQkFBaUIsRUFBUSxJQUM1QyxLQUFLLGtCQUFrQixFQUFNLEdBQU0sSUFFbkMsS0FBSyxTQUFXLEVBQ2hCLEtBQUssU0FBVyxFQUNoQixLQUFLLGNBQWdCLEVBQ2QsS0FBSyxXQUFXLEVBQU0sNEJBSy9CLEdBQUssa0JBQW9CLFNBQVMsRUFBTSxFQUFpQixFQUFVLENBQ2pFLEdBQUksR0FBZSxHQUFtQixLQUFLLE9BQVMsRUFBTSxPQUN0RCxFQUFZLEtBQUssT0FBUSxFQUFZLEdBRXpDLEdBQUksRUFDRixFQUFLLEtBQU8sS0FBSyxtQkFDakIsRUFBSyxXQUFhLEdBQ2xCLEtBQUssWUFBWSxFQUFNLFFBQ2xCLENBQ0wsR0FBSSxHQUFZLEtBQUssUUFBUSxhQUFlLEdBQUssQ0FBQyxLQUFLLGtCQUFrQixFQUFLLFFBQzlFLEFBQUksRUFBQyxHQUFhLElBQ2hCLEdBQVksS0FBSyxnQkFBZ0IsS0FBSyxLQUlsQyxHQUFhLEdBQ2IsS0FBSyxpQkFBaUIsRUFBSyxNQUFPLDhFQUl4QyxHQUFJLEdBQVksS0FBSyxPQUNyQixLQUFLLE9BQVMsR0FDVixHQUFhLE1BQUssT0FBUyxJQUkvQixLQUFLLFlBQVksRUFBTSxDQUFDLEdBQWEsQ0FBQyxHQUFhLENBQUMsR0FBbUIsQ0FBQyxHQUFZLEtBQUssa0JBQWtCLEVBQUssU0FFNUcsS0FBSyxRQUFVLEVBQUssSUFBTSxLQUFLLFVBQVUsRUFBSyxHQUFJLElBQ3RELEVBQUssS0FBTyxLQUFLLFdBQVcsR0FBTyxPQUFXLEdBQWEsQ0FBQyxHQUM1RCxFQUFLLFdBQWEsR0FDbEIsS0FBSyx1QkFBdUIsRUFBSyxLQUFLLE1BQ3RDLEtBQUssT0FBUyxFQUVoQixLQUFLLGFBR1AsR0FBSyxrQkFBb0IsU0FBUyxFQUFRLENBQ3hDLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBUSxFQUFJLEVBQUssT0FBUSxHQUFLLEVBQ25ELENBQ0EsR0FBSSxHQUFRLEVBQUssR0FFakIsR0FBSSxFQUFNLE9BQVMsYUFBZ0IsTUFBTyxHQUU1QyxNQUFPLElBTVQsR0FBSyxZQUFjLFNBQVMsRUFBTSxFQUFpQixDQUVqRCxPQURJLEdBQVcsR0FDTixFQUFJLEVBQUcsRUFBTyxFQUFLLE9BQVEsRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUN4RCxDQUNBLEdBQUksR0FBUSxFQUFLLEdBRWpCLEtBQUssVUFBVSxFQUFPLEdBQVUsRUFBa0IsS0FBTyxLQVU3RCxHQUFLLGNBQWdCLFNBQVMsRUFBTyxFQUFvQixFQUFZLEVBQXdCLENBRTNGLE9BREksR0FBTyxHQUFJLEVBQVEsR0FDaEIsQ0FBQyxLQUFLLElBQUksSUFBUSxDQUN2QixHQUFLLEVBR0ksRUFBUSxXQUZmLEtBQUssT0FBTyxFQUFNLE9BQ2QsR0FBc0IsS0FBSyxtQkFBbUIsR0FBVSxNQUc5RCxHQUFJLEdBQU8sT0FDWCxBQUFJLEdBQWMsS0FBSyxPQUFTLEVBQU0sTUFDbEMsRUFBTSxLQUNMLEFBQUksS0FBSyxPQUFTLEVBQU0sU0FDM0IsR0FBTSxLQUFLLFlBQVksR0FDbkIsR0FBMEIsS0FBSyxPQUFTLEVBQU0sT0FBUyxFQUF1QixjQUFnQixHQUM5RixHQUF1QixjQUFnQixLQUFLLFFBRWhELEVBQU0sS0FBSyxpQkFBaUIsR0FBTyxHQUVyQyxFQUFLLEtBQUssR0FFWixNQUFPLElBR1QsR0FBSyxnQkFBa0IsU0FBUyxFQUFLLENBQ25DLEdBQUksR0FBUSxFQUFJLE1BQ1osRUFBTSxFQUFJLElBQ1YsRUFBTyxFQUFJLEtBUWYsR0FOSSxLQUFLLGFBQWUsSUFBUyxTQUM3QixLQUFLLGlCQUFpQixFQUFPLHVEQUM3QixLQUFLLFNBQVcsSUFBUyxTQUN6QixLQUFLLGlCQUFpQixFQUFPLDZEQUM3QixLQUFLLFNBQVMsS0FBSyxJQUNuQixLQUFLLE1BQU0sRUFBUSx1QkFBeUIsRUFBTyxLQUNuRCxPQUFLLFFBQVEsWUFBYyxHQUM3QixLQUFLLE1BQU0sTUFBTSxFQUFPLEdBQUssUUFBUSxRQUFVLElBQ2pELElBQUksR0FBSyxLQUFLLE9BQVMsS0FBSyxvQkFBc0IsS0FBSyxjQUN2RCxBQUFJLEVBQUcsS0FBSyxJQUNOLEVBQUMsS0FBSyxTQUFXLElBQVMsU0FDMUIsS0FBSyxpQkFBaUIsRUFBTyx3REFDakMsS0FBSyxpQkFBaUIsRUFBUSxnQkFBa0IsRUFBTyxvQkFRM0QsR0FBSyxXQUFhLFNBQVMsRUFBUyxFQUFXLENBQzdDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLE1BQUksTUFBSyxPQUFTLEVBQU0sS0FDdEIsRUFBSyxLQUFPLEtBQUssTUFDWixBQUFJLEtBQUssS0FBSyxRQUNuQixHQUFLLEtBQU8sS0FBSyxLQUFLLFFBTWpCLEdBQUssT0FBUyxTQUFXLEVBQUssT0FBUyxhQUN2QyxNQUFLLGFBQWUsS0FBSyxhQUFlLEdBQUssS0FBSyxNQUFNLFdBQVcsS0FBSyxnQkFBa0IsS0FDN0YsS0FBSyxRQUFRLE9BR2YsS0FBSyxhQUVQLEtBQUssS0FBSyxDQUFDLENBQUMsR0FDWixLQUFLLFdBQVcsRUFBTSxjQUNqQixHQUNILE1BQUssZ0JBQWdCLEdBQ2pCLEVBQUssT0FBUyxTQUFXLENBQUMsS0FBSyxlQUMvQixNQUFLLGNBQWdCLEVBQUssUUFFekIsR0FLVCxHQUFLLFdBQWEsU0FBUyxFQUFNLENBQy9CLEFBQUssS0FBSyxVQUFZLE1BQUssU0FBVyxLQUFLLE9BRTNDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLFlBQUssT0FDTCxBQUFJLEtBQUssT0FBUyxFQUFNLE1BQVEsS0FBSyxzQkFBeUIsS0FBSyxPQUFTLEVBQU0sTUFBUSxDQUFDLEtBQUssS0FBSyxXQUNuRyxHQUFLLFNBQVcsR0FDaEIsRUFBSyxTQUFXLE1BRWhCLEdBQUssU0FBVyxLQUFLLElBQUksRUFBTSxNQUMvQixFQUFLLFNBQVcsS0FBSyxpQkFBaUIsSUFFakMsS0FBSyxXQUFXLEVBQU0sb0JBRy9CLEdBQUssV0FBYSxVQUFXLENBQzNCLEFBQUssS0FBSyxVQUFZLE1BQUssU0FBVyxLQUFLLE9BRTNDLEdBQUksR0FBTyxLQUFLLFlBQ2hCLFlBQUssT0FDTCxFQUFLLFNBQVcsS0FBSyxnQkFBZ0IsS0FBTSxJQUNwQyxLQUFLLFdBQVcsRUFBTSxvQkFHL0IsR0FBSSxJQUFPLEdBQU8sVUFRbEIsR0FBSyxNQUFRLFNBQVMsRUFBSyxFQUFTLENBQ2xDLEdBQUksR0FBTSxHQUFZLEtBQUssTUFBTyxHQUNsQyxHQUFXLEtBQU8sRUFBSSxLQUFPLElBQU0sRUFBSSxPQUFTLElBQ2hELEdBQUksR0FBTSxHQUFJLGFBQVksR0FDMUIsUUFBSSxJQUFNLEVBQUssRUFBSSxJQUFNLEVBQUssRUFBSSxTQUFXLEtBQUssSUFDNUMsR0FHUixHQUFLLGlCQUFtQixHQUFLLE1BRTdCLEdBQUssWUFBYyxVQUFXLENBQzVCLEdBQUksS0FBSyxRQUFRLFVBQ2YsTUFBTyxJQUFJLElBQVMsS0FBSyxRQUFTLEtBQUssSUFBTSxLQUFLLFlBSXRELEdBQUksSUFBTyxHQUFPLFVBRWQsR0FBUSxTQUFlLEVBQU8sQ0FDaEMsS0FBSyxNQUFRLEVBRWIsS0FBSyxJQUFNLEdBRVgsS0FBSyxRQUFVLEdBRWYsS0FBSyxVQUFZLElBS25CLEdBQUssV0FBYSxTQUFTLEVBQU8sQ0FDaEMsS0FBSyxXQUFXLEtBQUssR0FBSSxJQUFNLEtBR2pDLEdBQUssVUFBWSxVQUFXLENBQzFCLEtBQUssV0FBVyxPQU1sQixHQUFLLDJCQUE2QixTQUFTLEVBQU8sQ0FDaEQsTUFBUSxHQUFNLE1BQVEsSUFBbUIsQ0FBQyxLQUFLLFVBQWEsRUFBTSxNQUFRLElBRzVFLEdBQUssWUFBYyxTQUFTLEVBQU0sRUFBYSxFQUFLLENBQ2xELEdBQUksR0FBYSxHQUNqQixHQUFJLElBQWdCLEdBQWMsQ0FDaEMsR0FBSSxHQUFRLEtBQUssZUFDakIsRUFBYSxFQUFNLFFBQVEsUUFBUSxHQUFRLElBQU0sRUFBTSxVQUFVLFFBQVEsR0FBUSxJQUFNLEVBQU0sSUFBSSxRQUFRLEdBQVEsR0FDakgsRUFBTSxRQUFRLEtBQUssR0FDZixLQUFLLFVBQWEsRUFBTSxNQUFRLElBQ2hDLE1BQU8sTUFBSyxpQkFBaUIsV0FDeEIsSUFBZ0IsR0FBbUIsQ0FDNUMsR0FBSSxHQUFVLEtBQUssZUFDbkIsRUFBUSxRQUFRLEtBQUssV0FDWixJQUFnQixHQUFlLENBQ3hDLEdBQUksR0FBVSxLQUFLLGVBQ25CLEFBQUksS0FBSyxvQkFDTCxFQUFhLEVBQVEsUUFBUSxRQUFRLEdBQVEsR0FFN0MsRUFBYSxFQUFRLFFBQVEsUUFBUSxHQUFRLElBQU0sRUFBUSxJQUFJLFFBQVEsR0FBUSxHQUNuRixFQUFRLFVBQVUsS0FBSyxPQUV2QixRQUFTLEdBQUksS0FBSyxXQUFXLE9BQVMsRUFBRyxHQUFLLEVBQUcsRUFBRSxFQUFHLENBQ3BELEdBQUksR0FBVSxLQUFLLFdBQVcsR0FDOUIsR0FBSSxFQUFRLFFBQVEsUUFBUSxHQUFRLElBQU0sQ0FBRyxHQUFRLE1BQVEsSUFBdUIsRUFBUSxRQUFRLEtBQU8sSUFDdkcsQ0FBQyxLQUFLLDJCQUEyQixJQUFZLEVBQVEsVUFBVSxRQUFRLEdBQVEsR0FBSSxDQUNyRixFQUFhLEdBQ2IsTUFLRixHQUhBLEVBQVEsSUFBSSxLQUFLLEdBQ2IsS0FBSyxVQUFhLEVBQVEsTUFBUSxJQUNsQyxNQUFPLE1BQUssaUJBQWlCLEdBQzdCLEVBQVEsTUFBUSxHQUFhLE1BR3JDLEFBQUksR0FBYyxLQUFLLGlCQUFpQixFQUFNLGVBQWlCLEVBQU8sZ0NBR3hFLEdBQUssaUJBQW1CLFNBQVMsRUFBSSxDQUVuQyxBQUFJLEtBQUssV0FBVyxHQUFHLFFBQVEsUUFBUSxFQUFHLFFBQVUsSUFDaEQsS0FBSyxXQUFXLEdBQUcsSUFBSSxRQUFRLEVBQUcsUUFBVSxJQUM5QyxNQUFLLGlCQUFpQixFQUFHLE1BQVEsSUFJckMsR0FBSyxhQUFlLFVBQVcsQ0FDN0IsTUFBTyxNQUFLLFdBQVcsS0FBSyxXQUFXLE9BQVMsSUFHbEQsR0FBSyxnQkFBa0IsVUFBVyxDQUNoQyxPQUFTLEdBQUksS0FBSyxXQUFXLE9BQVMsR0FBSSxJQUFLLENBQzdDLEdBQUksR0FBUSxLQUFLLFdBQVcsR0FDNUIsR0FBSSxFQUFNLE1BQVEsR0FBYSxNQUFPLEtBSzFDLEdBQUssaUJBQW1CLFVBQVcsQ0FDakMsT0FBUyxHQUFJLEtBQUssV0FBVyxPQUFTLEdBQUksSUFBSyxDQUM3QyxHQUFJLEdBQVEsS0FBSyxXQUFXLEdBQzVCLEdBQUksRUFBTSxNQUFRLElBQWEsQ0FBRSxHQUFNLE1BQVEsSUFBZ0IsTUFBTyxLQUkxRSxHQUFJLElBQU8sU0FBYyxFQUFRLEVBQUssRUFBSyxDQUN6QyxLQUFLLEtBQU8sR0FDWixLQUFLLE1BQVEsRUFDYixLQUFLLElBQU0sRUFDUCxFQUFPLFFBQVEsV0FDZixNQUFLLElBQU0sR0FBSSxJQUFlLEVBQVEsSUFDdEMsRUFBTyxRQUFRLGtCQUNmLE1BQUssV0FBYSxFQUFPLFFBQVEsa0JBQ2pDLEVBQU8sUUFBUSxRQUNmLE1BQUssTUFBUSxDQUFDLEVBQUssS0FLckIsR0FBTyxHQUFPLFVBRWxCLEdBQUssVUFBWSxVQUFXLENBQzFCLE1BQU8sSUFBSSxJQUFLLEtBQU0sS0FBSyxNQUFPLEtBQUssV0FHekMsR0FBSyxZQUFjLFNBQVMsRUFBSyxFQUFLLENBQ3BDLE1BQU8sSUFBSSxJQUFLLEtBQU0sRUFBSyxJQUs3QixZQUFzQixFQUFNLEVBQU0sRUFBSyxFQUFLLENBQzFDLFNBQUssS0FBTyxFQUNaLEVBQUssSUFBTSxFQUNQLEtBQUssUUFBUSxXQUNiLEdBQUssSUFBSSxJQUFNLEdBQ2YsS0FBSyxRQUFRLFFBQ2IsR0FBSyxNQUFNLEdBQUssR0FDYixFQUdULEdBQUssV0FBYSxTQUFTLEVBQU0sRUFBTSxDQUNyQyxNQUFPLElBQWEsS0FBSyxLQUFNLEVBQU0sRUFBTSxLQUFLLFdBQVksS0FBSyxnQkFLbkUsR0FBSyxhQUFlLFNBQVMsRUFBTSxFQUFNLEVBQUssRUFBSyxDQUNqRCxNQUFPLElBQWEsS0FBSyxLQUFNLEVBQU0sRUFBTSxFQUFLLElBS2xELEdBQUksSUFBYSxTQUFvQixFQUFPLEVBQVEsRUFBZSxFQUFVLEVBQVcsQ0FDdEYsS0FBSyxNQUFRLEVBQ2IsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUNoQixLQUFLLGNBQWdCLENBQUMsQ0FBQyxFQUN2QixLQUFLLFNBQVcsRUFDaEIsS0FBSyxVQUFZLENBQUMsQ0FBQyxHQUdqQixHQUFVLENBQ1osT0FBUSxHQUFJLElBQVcsSUFBSyxJQUM1QixPQUFRLEdBQUksSUFBVyxJQUFLLElBQzVCLE9BQVEsR0FBSSxJQUFXLEtBQU0sSUFDN0IsT0FBUSxHQUFJLElBQVcsSUFBSyxJQUM1QixPQUFRLEdBQUksSUFBVyxJQUFLLElBQzVCLE9BQVEsR0FBSSxJQUFXLElBQUssR0FBTSxHQUFNLFNBQVUsRUFBRyxDQUFFLE1BQU8sR0FBRSx5QkFDaEUsT0FBUSxHQUFJLElBQVcsV0FBWSxJQUNuQyxPQUFRLEdBQUksSUFBVyxXQUFZLElBQ25DLFdBQVksR0FBSSxJQUFXLFdBQVksR0FBTSxHQUFPLEtBQU0sSUFDMUQsTUFBTyxHQUFJLElBQVcsV0FBWSxHQUFPLEdBQU8sS0FBTSxLQUdwRCxHQUFPLEdBQU8sVUFFbEIsR0FBSyxlQUFpQixVQUFXLENBQy9CLE1BQU8sQ0FBQyxHQUFRLFNBR2xCLEdBQUssYUFBZSxTQUFTLEVBQVUsQ0FDckMsR0FBSSxHQUFTLEtBQUssYUFDbEIsTUFBSSxLQUFXLEdBQVEsUUFBVSxJQUFXLEdBQVEsT0FDekMsR0FDUCxJQUFhLEVBQU0sT0FBVSxLQUFXLEdBQVEsUUFBVSxJQUFXLEdBQVEsUUFDdEUsQ0FBQyxFQUFPLE9BS2YsSUFBYSxFQUFNLFNBQVcsSUFBYSxFQUFNLE1BQVEsS0FBSyxZQUN2RCxHQUFVLEtBQUssS0FBSyxNQUFNLE1BQU0sS0FBSyxXQUFZLEtBQUssUUFDN0QsSUFBYSxFQUFNLE9BQVMsSUFBYSxFQUFNLE1BQVEsSUFBYSxFQUFNLEtBQU8sSUFBYSxFQUFNLFFBQVUsSUFBYSxFQUFNLE1BQzFILEdBQ1AsSUFBYSxFQUFNLE9BQ1osSUFBVyxHQUFRLE9BQzFCLElBQWEsRUFBTSxNQUFRLElBQWEsRUFBTSxRQUFVLElBQWEsRUFBTSxLQUNwRSxHQUNKLENBQUMsS0FBSyxhQUdmLEdBQUssbUJBQXFCLFVBQVcsQ0FDbkMsT0FBUyxHQUFJLEtBQUssUUFBUSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDakQsR0FBSSxHQUFVLEtBQUssUUFBUSxHQUMzQixHQUFJLEVBQVEsUUFBVSxXQUNsQixNQUFPLEdBQVEsVUFFckIsTUFBTyxJQUdULEdBQUssY0FBZ0IsU0FBUyxFQUFVLENBQ3RDLEdBQUksR0FBUSxFQUFPLEtBQUssS0FDeEIsQUFBSSxFQUFLLFNBQVcsSUFBYSxFQUFNLElBQ25DLEtBQUssWUFBYyxHQUNsQixBQUFJLEdBQVMsRUFBSyxlQUNuQixFQUFPLEtBQUssS0FBTSxHQUVsQixLQUFLLFlBQWMsRUFBSyxZQUs5QixFQUFNLE9BQU8sY0FBZ0IsRUFBTSxPQUFPLGNBQWdCLFVBQVcsQ0FDbkUsR0FBSSxLQUFLLFFBQVEsU0FBVyxFQUFHLENBQzdCLEtBQUssWUFBYyxHQUNuQixPQUVGLEdBQUksR0FBTSxLQUFLLFFBQVEsTUFDdkIsQUFBSSxJQUFRLEdBQVEsUUFBVSxLQUFLLGFBQWEsUUFBVSxZQUN4RCxHQUFNLEtBQUssUUFBUSxPQUVyQixLQUFLLFlBQWMsQ0FBQyxFQUFJLFFBRzFCLEVBQU0sT0FBTyxjQUFnQixTQUFTLEVBQVUsQ0FDOUMsS0FBSyxRQUFRLEtBQUssS0FBSyxhQUFhLEdBQVksR0FBUSxPQUFTLEdBQVEsUUFDekUsS0FBSyxZQUFjLElBR3JCLEVBQU0sYUFBYSxjQUFnQixVQUFXLENBQzVDLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDMUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sT0FBTyxjQUFnQixTQUFTLEVBQVUsQ0FDOUMsR0FBSSxHQUFrQixJQUFhLEVBQU0sS0FBTyxJQUFhLEVBQU0sTUFBUSxJQUFhLEVBQU0sT0FBUyxJQUFhLEVBQU0sT0FDMUgsS0FBSyxRQUFRLEtBQUssRUFBa0IsR0FBUSxPQUFTLEdBQVEsUUFDN0QsS0FBSyxZQUFjLElBR3JCLEVBQU0sT0FBTyxjQUFnQixVQUFXLEdBSXhDLEVBQU0sVUFBVSxjQUFnQixFQUFNLE9BQU8sY0FBZ0IsU0FBUyxFQUFVLENBQzlFLEFBQUksRUFBUyxZQUFjLElBQWEsRUFBTSxNQUFRLElBQWEsRUFBTSxPQUNyRSxDQUFFLEtBQWEsRUFBTSxTQUFXLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxVQUN0RixDQUFHLE1BQWEsRUFBTSxPQUFTLElBQWEsRUFBTSxTQUFXLEtBQUssZUFBaUIsR0FBUSxRQUMzRixLQUFLLFFBQVEsS0FBSyxHQUFRLFFBRTFCLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDOUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sVUFBVSxjQUFnQixVQUFXLENBQ3pDLEFBQUksS0FBSyxlQUFpQixHQUFRLE9BQzlCLEtBQUssUUFBUSxNQUViLEtBQUssUUFBUSxLQUFLLEdBQVEsUUFDOUIsS0FBSyxZQUFjLElBR3JCLEVBQU0sS0FBSyxjQUFnQixTQUFTLEVBQVUsQ0FDNUMsR0FBSSxJQUFhLEVBQU0sVUFBVyxDQUNoQyxHQUFJLEdBQVEsS0FBSyxRQUFRLE9BQVMsRUFDbEMsQUFBSSxLQUFLLFFBQVEsS0FBVyxHQUFRLE9BQ2hDLEtBQUssUUFBUSxHQUFTLEdBQVEsV0FFOUIsS0FBSyxRQUFRLEdBQVMsR0FBUSxNQUVwQyxLQUFLLFlBQWMsSUFHckIsRUFBTSxLQUFLLGNBQWdCLFNBQVMsRUFBVSxDQUM1QyxHQUFJLEdBQVUsR0FDZCxBQUFJLEtBQUssUUFBUSxhQUFlLEdBQUssSUFBYSxFQUFNLEtBQ2xELE1BQUssUUFBVSxNQUFRLENBQUMsS0FBSyxhQUM3QixLQUFLLFFBQVUsU0FBVyxLQUFLLHVCQUMvQixHQUFVLElBRWhCLEtBQUssWUFBYyxHQVFyQixHQUFJLElBQXdCLDg5QkFDeEIsR0FBeUIsR0FBd0IseUJBQ2pELEdBQXlCLEdBQ3pCLEdBQTBCLENBQzVCLEVBQUcsR0FDSCxHQUFJLEdBQ0osR0FBSSxJQUlGLEdBQStCLHFwQkFHL0IsR0FBb0IsMitEQUNwQixHQUFxQixHQUFvQixrSEFDekMsR0FBcUIsR0FBcUIseUVBQzFDLEdBQXNCLENBQ3hCLEVBQUcsR0FDSCxHQUFJLEdBQ0osR0FBSSxJQUdGLEdBQU8sR0FDWCxZQUEwQixFQUFhLENBQ3JDLEdBQUksR0FBSSxHQUFLLEdBQWUsQ0FDMUIsT0FBUSxHQUFZLEdBQXdCLEdBQWUsSUFBTSxJQUNqRSxVQUFXLENBQ1QsaUJBQWtCLEdBQVksSUFDOUIsT0FBUSxHQUFZLEdBQW9CLE1BRzVDLEVBQUUsVUFBVSxrQkFBb0IsRUFBRSxVQUFVLE9BRTVDLEVBQUUsVUFBVSxHQUFLLEVBQUUsVUFBVSxpQkFDN0IsRUFBRSxVQUFVLEdBQUssRUFBRSxVQUFVLE9BQzdCLEVBQUUsVUFBVSxJQUFNLEVBQUUsVUFBVSxrQkFFaEMsR0FBaUIsR0FDakIsR0FBaUIsSUFDakIsR0FBaUIsSUFFakIsR0FBSSxJQUFPLEdBQU8sVUFFZCxHQUF3QixTQUErQixFQUFRLENBQ2pFLEtBQUssT0FBUyxFQUNkLEtBQUssV0FBYSxNQUFTLEdBQU8sUUFBUSxhQUFlLEVBQUksS0FBTyxJQUFPLEdBQU8sUUFBUSxhQUFlLEVBQUksSUFBTSxJQUNuSCxLQUFLLGtCQUFvQixHQUFLLEVBQU8sUUFBUSxhQUFlLEdBQUssR0FBSyxFQUFPLFFBQVEsYUFDckYsS0FBSyxPQUFTLEdBQ2QsS0FBSyxNQUFRLEdBQ2IsS0FBSyxNQUFRLEVBQ2IsS0FBSyxRQUFVLEdBQ2YsS0FBSyxRQUFVLEdBQ2YsS0FBSyxJQUFNLEVBQ1gsS0FBSyxhQUFlLEVBQ3BCLEtBQUssZ0JBQWtCLEdBQ3ZCLEtBQUssNEJBQThCLEdBQ25DLEtBQUssbUJBQXFCLEVBQzFCLEtBQUssaUJBQW1CLEVBQ3hCLEtBQUssV0FBYSxHQUNsQixLQUFLLG1CQUFxQixJQUc1QixHQUFzQixVQUFVLE1BQVEsU0FBZ0IsRUFBTyxFQUFTLEVBQU8sQ0FDN0UsR0FBSSxHQUFVLEVBQU0sUUFBUSxPQUFTLEdBQ3JDLEtBQUssTUFBUSxFQUFRLEVBQ3JCLEtBQUssT0FBUyxFQUFVLEdBQ3hCLEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxHQUFXLEtBQUssT0FBTyxRQUFRLGFBQWUsRUFDN0QsS0FBSyxRQUFVLEdBQVcsS0FBSyxPQUFPLFFBQVEsYUFBZSxHQUcvRCxHQUFzQixVQUFVLE1BQVEsU0FBZ0IsRUFBUyxDQUMvRCxLQUFLLE9BQU8saUJBQWlCLEtBQUssTUFBUSxnQ0FBbUMsS0FBSyxPQUFVLE1BQVEsSUFLdEcsR0FBc0IsVUFBVSxHQUFLLFNBQWEsRUFBRyxFQUFRLENBQ3pELEFBQUssSUFBVyxRQUFTLEdBQVMsSUFFcEMsR0FBSSxHQUFJLEtBQUssT0FDVCxFQUFJLEVBQUUsT0FDVixHQUFJLEdBQUssRUFDUCxNQUFPLEdBRVQsR0FBSSxHQUFJLEVBQUUsV0FBVyxHQUNyQixHQUFJLENBQUUsSUFBVSxLQUFLLFVBQVksR0FBSyxPQUFVLEdBQUssT0FBVSxFQUFJLEdBQUssRUFDdEUsTUFBTyxHQUVULEdBQUksR0FBTyxFQUFFLFdBQVcsRUFBSSxHQUM1QixNQUFPLElBQVEsT0FBVSxHQUFRLE1BQVUsSUFBSyxJQUFNLEVBQU8sU0FBWSxHQUczRSxHQUFzQixVQUFVLFVBQVksU0FBb0IsRUFBRyxFQUFRLENBQ3ZFLEFBQUssSUFBVyxRQUFTLEdBQVMsSUFFcEMsR0FBSSxHQUFJLEtBQUssT0FDVCxFQUFJLEVBQUUsT0FDVixHQUFJLEdBQUssRUFDUCxNQUFPLEdBRVQsR0FBSSxHQUFJLEVBQUUsV0FBVyxHQUFJLEVBQ3pCLE1BQUksQ0FBRSxJQUFVLEtBQUssVUFBWSxHQUFLLE9BQVUsR0FBSyxPQUFVLEVBQUksR0FBSyxHQUNuRSxHQUFPLEVBQUUsV0FBVyxFQUFJLElBQU0sT0FBVSxFQUFPLE1BQzNDLEVBQUksRUFFTixFQUFJLEdBR2IsR0FBc0IsVUFBVSxRQUFVLFNBQWtCLEVBQVEsQ0FDaEUsTUFBSyxLQUFXLFFBQVMsR0FBUyxJQUU3QixLQUFLLEdBQUcsS0FBSyxJQUFLLElBRzNCLEdBQXNCLFVBQVUsVUFBWSxTQUFvQixFQUFRLENBQ3BFLE1BQUssS0FBVyxRQUFTLEdBQVMsSUFFN0IsS0FBSyxHQUFHLEtBQUssVUFBVSxLQUFLLElBQUssR0FBUyxJQUduRCxHQUFzQixVQUFVLFFBQVUsU0FBa0IsRUFBUSxDQUNoRSxBQUFLLElBQVcsUUFBUyxHQUFTLElBRXBDLEtBQUssSUFBTSxLQUFLLFVBQVUsS0FBSyxJQUFLLElBR3RDLEdBQXNCLFVBQVUsSUFBTSxTQUFjLEVBQUksRUFBUSxDQUc5RCxNQUZPLEtBQVcsUUFBUyxHQUFTLElBRWhDLEtBQUssUUFBUSxLQUFZLEVBQzNCLE1BQUssUUFBUSxHQUNOLElBRUYsSUFHVCxZQUEyQixFQUFJLENBQzdCLE1BQUksSUFBTSxNQUFpQixPQUFPLGFBQWEsR0FDL0MsSUFBTSxNQUNDLE9BQU8sYUFBYyxJQUFNLElBQU0sTUFBUyxHQUFLLE1BQVUsUUFTbEUsR0FBSyxvQkFBc0IsU0FBUyxFQUFPLENBSXpDLE9BSEksR0FBYSxFQUFNLFdBQ25CLEVBQVEsRUFBTSxNQUVULEVBQUksRUFBRyxFQUFJLEVBQU0sT0FBUSxJQUFLLENBQ3JDLEdBQUksR0FBTyxFQUFNLE9BQU8sR0FDeEIsQUFBSSxFQUFXLFFBQVEsS0FBVSxJQUMvQixLQUFLLE1BQU0sRUFBTSxNQUFPLG1DQUV0QixFQUFNLFFBQVEsRUFBTSxFQUFJLEdBQUssSUFDL0IsS0FBSyxNQUFNLEVBQU0sTUFBTyx1Q0FXOUIsR0FBSyxzQkFBd0IsU0FBUyxFQUFPLENBQzNDLEtBQUssZUFBZSxHQU9oQixDQUFDLEVBQU0sU0FBVyxLQUFLLFFBQVEsYUFBZSxHQUFLLEVBQU0sV0FBVyxPQUFTLEdBQy9FLEdBQU0sUUFBVSxHQUNoQixLQUFLLGVBQWUsS0FLeEIsR0FBSyxlQUFpQixTQUFTLEVBQU8sQ0FDcEMsRUFBTSxJQUFNLEVBQ1osRUFBTSxhQUFlLEVBQ3JCLEVBQU0sZ0JBQWtCLEdBQ3hCLEVBQU0sNEJBQThCLEdBQ3BDLEVBQU0sbUJBQXFCLEVBQzNCLEVBQU0saUJBQW1CLEVBQ3pCLEVBQU0sV0FBVyxPQUFTLEVBQzFCLEVBQU0sbUJBQW1CLE9BQVMsRUFFbEMsS0FBSyxtQkFBbUIsR0FFcEIsRUFBTSxNQUFRLEVBQU0sT0FBTyxRQUV6QixHQUFNLElBQUksS0FDWixFQUFNLE1BQU0saUJBRVYsR0FBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxPQUN2QyxFQUFNLE1BQU0sNkJBR1osRUFBTSxpQkFBbUIsRUFBTSxvQkFDakMsRUFBTSxNQUFNLGtCQUVkLE9BQVMsR0FBSSxFQUFHLEVBQU8sRUFBTSxtQkFBb0IsRUFBSSxFQUFLLE9BQVEsR0FBSyxFQUFHLENBQ3hFLEdBQUksR0FBTyxFQUFLLEdBRWhCLEFBQUksRUFBTSxXQUFXLFFBQVEsS0FBVSxJQUNyQyxFQUFNLE1BQU0sc0NBTWxCLEdBQUssbUJBQXFCLFNBQVMsRUFBTyxDQUV4QyxJQURBLEtBQUssbUJBQW1CLEdBQ2pCLEVBQU0sSUFBSSxNQUNmLEtBQUssbUJBQW1CLEdBSTFCLEFBQUksS0FBSyxxQkFBcUIsRUFBTyxLQUNuQyxFQUFNLE1BQU0scUJBRVYsRUFBTSxJQUFJLE1BQ1osRUFBTSxNQUFNLDZCQUtoQixHQUFLLG1CQUFxQixTQUFTLEVBQU8sQ0FDeEMsS0FBTyxFQUFNLElBQU0sRUFBTSxPQUFPLFFBQVUsS0FBSyxlQUFlLElBQzVELEdBSUosR0FBSyxlQUFpQixTQUFTLEVBQU8sQ0FDcEMsTUFBSSxNQUFLLG9CQUFvQixHQUl2QixHQUFNLDZCQUErQixLQUFLLHFCQUFxQixJQUU3RCxFQUFNLFNBQ1IsRUFBTSxNQUFNLHNCQUdULElBR0wsR0FBTSxRQUFVLEtBQUssZUFBZSxHQUFTLEtBQUssdUJBQXVCLElBQzNFLE1BQUsscUJBQXFCLEdBQ25CLElBR0YsSUFJVCxHQUFLLG9CQUFzQixTQUFTLEVBQU8sQ0FDekMsR0FBSSxHQUFRLEVBQU0sSUFJbEIsR0FIQSxFQUFNLDRCQUE4QixHQUdoQyxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLElBQ3ZDLE1BQU8sR0FJVCxHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksRUFBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxJQUN2QyxNQUFPLEdBRVQsRUFBTSxJQUFNLEVBSWQsR0FBSSxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLElBQWUsQ0FDdEQsR0FBSSxHQUFhLEdBSWpCLEdBSEksS0FBSyxRQUFRLGFBQWUsR0FDOUIsR0FBYSxFQUFNLElBQUksS0FFckIsRUFBTSxJQUFJLEtBQWlCLEVBQU0sSUFBSSxJQUN2QyxZQUFLLG1CQUFtQixHQUNuQixFQUFNLElBQUksS0FDYixFQUFNLE1BQU0sc0JBRWQsRUFBTSw0QkFBOEIsQ0FBQyxFQUM5QixHQUlYLFNBQU0sSUFBTSxFQUNMLElBSVQsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLEVBQVMsQ0FHbkQsTUFGSyxLQUFZLFFBQVMsR0FBVSxJQUVoQyxLQUFLLDJCQUEyQixFQUFPLEdBQ3pDLEdBQU0sSUFBSSxJQUNILElBRUYsSUFJVCxHQUFLLDJCQUE2QixTQUFTLEVBQU8sRUFBUyxDQUN6RCxNQUNFLEdBQU0sSUFBSSxLQUNWLEVBQU0sSUFBSSxLQUNWLEVBQU0sSUFBSSxLQUNWLEtBQUssMkJBQTJCLEVBQU8sSUFHM0MsR0FBSywyQkFBNkIsU0FBUyxFQUFPLEVBQVMsQ0FDekQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEdBQU0sRUFBRyxFQUFNLEdBQ25CLEdBQUksS0FBSyx3QkFBd0IsSUFDL0IsR0FBTSxFQUFNLGFBQ1IsRUFBTSxJQUFJLEtBQWlCLEtBQUssd0JBQXdCLElBQzFELEdBQU0sRUFBTSxjQUVWLEVBQU0sSUFBSSxNQUVaLE1BQUksS0FBUSxJQUFNLEVBQU0sR0FBTyxDQUFDLEdBQzlCLEVBQU0sTUFBTSx5Q0FFUCxHQUdYLEFBQUksRUFBTSxTQUFXLENBQUMsR0FDcEIsRUFBTSxNQUFNLHlCQUVkLEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFJVCxHQUFLLGVBQWlCLFNBQVMsRUFBTyxDQUNwQyxNQUNFLE1BQUssNEJBQTRCLElBQ2pDLEVBQU0sSUFBSSxLQUNWLEtBQUssbUNBQW1DLElBQ3hDLEtBQUsseUJBQXlCLElBQzlCLEtBQUssMkJBQTJCLElBQ2hDLEtBQUsseUJBQXlCLElBR2xDLEdBQUssbUNBQXFDLFNBQVMsRUFBTyxDQUN4RCxHQUFJLEdBQVEsRUFBTSxJQUNsQixHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksS0FBSyxxQkFBcUIsR0FDNUIsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLDJCQUE2QixTQUFTLEVBQU8sQ0FDaEQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksSUFBZSxDQUMzQixHQUFJLEVBQU0sSUFBSSxLQUFpQixFQUFNLElBQUksSUFBZSxDQUV0RCxHQURBLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLE1BQU8sR0FFVCxFQUFNLE1BQU0sc0JBRWQsRUFBTSxJQUFNLEVBRWQsTUFBTyxJQUVULEdBQUsseUJBQTJCLFNBQVMsRUFBTyxDQUM5QyxHQUFJLEVBQU0sSUFBSSxJQUFlLENBTzNCLEdBTkEsQUFBSSxLQUFLLFFBQVEsYUFBZSxFQUM5QixLQUFLLHNCQUFzQixHQUNsQixFQUFNLFlBQWMsSUFDN0IsRUFBTSxNQUFNLGlCQUVkLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLFNBQU0sb0JBQXNCLEVBQ3JCLEdBRVQsRUFBTSxNQUFNLHNCQUVkLE1BQU8sSUFJVCxHQUFLLHVCQUF5QixTQUFTLEVBQU8sQ0FDNUMsTUFDRSxHQUFNLElBQUksS0FDVixLQUFLLG1DQUFtQyxJQUN4QyxLQUFLLHlCQUF5QixJQUM5QixLQUFLLDJCQUEyQixJQUNoQyxLQUFLLHlCQUF5QixJQUM5QixLQUFLLGtDQUFrQyxJQUN2QyxLQUFLLG1DQUFtQyxJQUs1QyxHQUFLLGtDQUFvQyxTQUFTLEVBQU8sQ0FDdkQsTUFBSSxNQUFLLDJCQUEyQixFQUFPLEtBQ3pDLEVBQU0sTUFBTSxxQkFFUCxJQUlULEdBQUssMEJBQTRCLFNBQVMsRUFBTyxDQUMvQyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBa0IsR0FDcEIsR0FBTSxhQUFlLEVBQ3JCLEVBQU0sVUFDQyxJQUVGLElBRVQsWUFBMkIsRUFBSSxDQUM3QixNQUNFLEtBQU8sSUFDUCxHQUFNLElBQWdCLEdBQU0sSUFDNUIsSUFBTyxJQUNQLElBQU8sSUFDUCxHQUFNLElBQWdCLEdBQU0sSUFDNUIsR0FBTSxLQUFnQixHQUFNLElBTWhDLEdBQUssNEJBQThCLFNBQVMsRUFBTyxDQUdqRCxPQUZJLEdBQVEsRUFBTSxJQUNkLEVBQUssRUFDRCxHQUFLLEVBQU0sYUFBZSxJQUFNLENBQUMsR0FBa0IsSUFDekQsRUFBTSxVQUVSLE1BQU8sR0FBTSxNQUFRLEdBSXZCLEdBQUssbUNBQXFDLFNBQVMsRUFBTyxDQUN4RCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQ0UsS0FBTyxJQUNQLElBQU8sSUFDUCxDQUFFLElBQU0sSUFBZ0IsR0FBTSxLQUM5QixJQUFPLElBQ1AsSUFBTyxJQUNQLElBQU8sSUFDUCxJQUFPLElBQ1AsSUFBTyxJQUVQLEdBQU0sVUFDQyxJQUVGLElBTVQsR0FBSyxzQkFBd0IsU0FBUyxFQUFPLENBQzNDLEdBQUksRUFBTSxJQUFJLElBQWUsQ0FDM0IsR0FBSSxLQUFLLG9CQUFvQixHQUFRLENBQ25DLEFBQUksRUFBTSxXQUFXLFFBQVEsRUFBTSxtQkFBcUIsSUFDdEQsRUFBTSxNQUFNLGdDQUVkLEVBQU0sV0FBVyxLQUFLLEVBQU0saUJBQzVCLE9BRUYsRUFBTSxNQUFNLG1CQU9oQixHQUFLLG9CQUFzQixTQUFTLEVBQU8sQ0FFekMsR0FEQSxFQUFNLGdCQUFrQixHQUNwQixFQUFNLElBQUksSUFBZSxDQUMzQixHQUFJLEtBQUssK0JBQStCLElBQVUsRUFBTSxJQUFJLElBQzFELE1BQU8sR0FFVCxFQUFNLE1BQU0sOEJBRWQsTUFBTyxJQU9ULEdBQUssK0JBQWlDLFNBQVMsRUFBTyxDQUVwRCxHQURBLEVBQU0sZ0JBQWtCLEdBQ3BCLEtBQUssZ0NBQWdDLEdBQVEsQ0FFL0MsSUFEQSxFQUFNLGlCQUFtQixHQUFrQixFQUFNLGNBQzFDLEtBQUssK0JBQStCLElBQ3pDLEVBQU0saUJBQW1CLEdBQWtCLEVBQU0sY0FFbkQsTUFBTyxHQUVULE1BQU8sSUFRVCxHQUFLLGdDQUFrQyxTQUFTLEVBQU8sQ0FDckQsR0FBSSxHQUFRLEVBQU0sSUFDZCxFQUFTLEtBQUssUUFBUSxhQUFlLEdBQ3JDLEVBQUssRUFBTSxRQUFRLEdBTXZCLE1BTEEsR0FBTSxRQUFRLEdBRVYsSUFBTyxJQUFnQixLQUFLLHNDQUFzQyxFQUFPLElBQzNFLEdBQUssRUFBTSxjQUVULEdBQXdCLEdBQzFCLEdBQU0sYUFBZSxFQUNkLElBR1QsR0FBTSxJQUFNLEVBQ0wsS0FFVCxZQUFpQyxFQUFJLENBQ25DLE1BQU8sR0FBa0IsRUFBSSxLQUFTLElBQU8sSUFBZ0IsSUFBTyxHQVV0RSxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFRLEVBQU0sSUFDZCxFQUFTLEtBQUssUUFBUSxhQUFlLEdBQ3JDLEVBQUssRUFBTSxRQUFRLEdBTXZCLE1BTEEsR0FBTSxRQUFRLEdBRVYsSUFBTyxJQUFnQixLQUFLLHNDQUFzQyxFQUFPLElBQzNFLEdBQUssRUFBTSxjQUVULEdBQXVCLEdBQ3pCLEdBQU0sYUFBZSxFQUNkLElBR1QsR0FBTSxJQUFNLEVBQ0wsS0FFVCxZQUFnQyxFQUFJLENBQ2xDLE1BQU8sR0FBaUIsRUFBSSxLQUFTLElBQU8sSUFBZ0IsSUFBTyxJQUFnQixJQUFPLE1BQXVCLElBQU8sS0FJMUgsR0FBSyxxQkFBdUIsU0FBUyxFQUFPLENBQzFDLE1BQ0UsTUFBSyx3QkFBd0IsSUFDN0IsS0FBSywrQkFBK0IsSUFDcEMsS0FBSywwQkFBMEIsSUFDOUIsRUFBTSxTQUFXLEtBQUsscUJBQXFCLEdBRXJDLEdBRUwsR0FBTSxTQUVKLEdBQU0sWUFBYyxJQUN0QixFQUFNLE1BQU0sMEJBRWQsRUFBTSxNQUFNLG1CQUVQLEtBRVQsR0FBSyx3QkFBMEIsU0FBUyxFQUFPLENBQzdDLEdBQUksR0FBUSxFQUFNLElBQ2xCLEdBQUksS0FBSyx3QkFBd0IsR0FBUSxDQUN2QyxHQUFJLEdBQUksRUFBTSxhQUNkLEdBQUksRUFBTSxRQUVSLE1BQUksR0FBSSxFQUFNLGtCQUNaLEdBQU0saUJBQW1CLEdBRXBCLEdBRVQsR0FBSSxHQUFLLEVBQU0sbUJBQ2IsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLHFCQUF1QixTQUFTLEVBQU8sQ0FDMUMsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUssb0JBQW9CLEdBQzNCLFNBQU0sbUJBQW1CLEtBQUssRUFBTSxpQkFDN0IsR0FFVCxFQUFNLE1BQU0sMkJBRWQsTUFBTyxJQUlULEdBQUssMEJBQTRCLFNBQVMsRUFBTyxDQUMvQyxNQUNFLE1BQUssd0JBQXdCLElBQzdCLEtBQUsseUJBQXlCLElBQzlCLEtBQUssZUFBZSxJQUNwQixLQUFLLDRCQUE0QixJQUNqQyxLQUFLLHNDQUFzQyxFQUFPLEtBQ2pELENBQUMsRUFBTSxTQUFXLEtBQUssb0NBQW9DLElBQzVELEtBQUsseUJBQXlCLElBR2xDLEdBQUsseUJBQTJCLFNBQVMsRUFBTyxDQUM5QyxHQUFJLEdBQVEsRUFBTSxJQUNsQixHQUFJLEVBQU0sSUFBSSxJQUFlLENBQzNCLEdBQUksS0FBSyx3QkFBd0IsR0FDL0IsTUFBTyxHQUVULEVBQU0sSUFBTSxFQUVkLE1BQU8sSUFFVCxHQUFLLGVBQWlCLFNBQVMsRUFBTyxDQUNwQyxNQUFJLEdBQU0sWUFBYyxJQUFnQixDQUFDLEdBQWUsRUFBTSxhQUM1RCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBRUYsSUFJVCxHQUFLLHdCQUEwQixTQUFTLEVBQU8sQ0FDN0MsR0FBSSxHQUFLLEVBQU0sVUFDZixNQUFJLEtBQU8sSUFDVCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBRUwsSUFBTyxJQUNULEdBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsSUFFTCxJQUFPLElBQ1QsR0FBTSxhQUFlLEdBQ3JCLEVBQU0sVUFDQyxJQUVMLElBQU8sSUFDVCxHQUFNLGFBQWUsR0FDckIsRUFBTSxVQUNDLElBRUwsSUFBTyxJQUNULEdBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsSUFFRixJQUlULEdBQUssd0JBQTBCLFNBQVMsRUFBTyxDQUM3QyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBZ0IsR0FDbEIsR0FBTSxhQUFlLEVBQUssR0FDMUIsRUFBTSxVQUNDLElBRUYsSUFFVCxZQUF5QixFQUFJLENBQzNCLE1BQ0csSUFBTSxJQUFnQixHQUFNLElBQzVCLEdBQU0sSUFBZ0IsR0FBTSxJQUtqQyxHQUFLLHNDQUF3QyxTQUFTLEVBQU8sRUFBUSxDQUNuRSxBQUFLLElBQVcsUUFBUyxHQUFTLElBRWxDLEdBQUksR0FBUSxFQUFNLElBQ2QsRUFBVSxHQUFVLEVBQU0sUUFFOUIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUsseUJBQXlCLEVBQU8sR0FBSSxDQUMzQyxHQUFJLEdBQU8sRUFBTSxhQUNqQixHQUFJLEdBQVcsR0FBUSxPQUFVLEdBQVEsTUFBUSxDQUMvQyxHQUFJLEdBQW1CLEVBQU0sSUFDN0IsR0FBSSxFQUFNLElBQUksS0FBaUIsRUFBTSxJQUFJLE1BQWlCLEtBQUsseUJBQXlCLEVBQU8sR0FBSSxDQUNqRyxHQUFJLEdBQVEsRUFBTSxhQUNsQixHQUFJLEdBQVMsT0FBVSxHQUFTLE1BQzlCLFNBQU0sYUFBZ0IsR0FBTyxPQUFVLEtBQVMsR0FBUSxPQUFVLE1BQzNELEdBR1gsRUFBTSxJQUFNLEVBQ1osRUFBTSxhQUFlLEVBRXZCLE1BQU8sR0FFVCxHQUNFLEdBQ0EsRUFBTSxJQUFJLE1BQ1YsS0FBSyxvQkFBb0IsSUFDekIsRUFBTSxJQUFJLE1BQ1YsR0FBZSxFQUFNLGNBRXJCLE1BQU8sR0FFVCxBQUFJLEdBQ0YsRUFBTSxNQUFNLDBCQUVkLEVBQU0sSUFBTSxFQUdkLE1BQU8sSUFFVCxZQUF3QixFQUFJLENBQzFCLE1BQU8sSUFBTSxHQUFLLEdBQU0sUUFJMUIsR0FBSyx5QkFBMkIsU0FBUyxFQUFPLENBQzlDLEdBQUksRUFBTSxRQUNSLE1BQUksTUFBSywwQkFBMEIsR0FDMUIsR0FFTCxFQUFNLElBQUksSUFDWixHQUFNLGFBQWUsR0FDZCxJQUVGLEdBR1QsR0FBSSxHQUFLLEVBQU0sVUFDZixNQUFJLEtBQU8sSUFBaUIsRUFBQyxFQUFNLFNBQVcsSUFBTyxLQUNuRCxHQUFNLGFBQWUsRUFDckIsRUFBTSxVQUNDLElBR0YsSUFJVCxHQUFLLHdCQUEwQixTQUFTLEVBQU8sQ0FDN0MsRUFBTSxhQUFlLEVBQ3JCLEdBQUksR0FBSyxFQUFNLFVBQ2YsR0FBSSxHQUFNLElBQWdCLEdBQU0sR0FBYyxDQUM1QyxFQUNFLEdBQU0sYUFBZSxHQUFLLEVBQU0sYUFBZ0IsR0FBSyxJQUNyRCxFQUFNLGdCQUNFLEdBQUssRUFBTSxZQUFjLElBQWdCLEdBQU0sSUFDekQsTUFBTyxHQUVULE1BQU8sSUFJVCxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFLLEVBQU0sVUFFZixHQUFJLEdBQXVCLEdBQ3pCLFNBQU0sYUFBZSxHQUNyQixFQUFNLFVBQ0MsR0FHVCxHQUNFLEVBQU0sU0FDTixLQUFLLFFBQVEsYUFBZSxHQUMzQixLQUFPLElBQWdCLElBQU8sS0FDL0IsQ0FHQSxHQUZBLEVBQU0sYUFBZSxHQUNyQixFQUFNLFVBRUosRUFBTSxJQUFJLE1BQ1YsS0FBSyx5Q0FBeUMsSUFDOUMsRUFBTSxJQUFJLEtBRVYsTUFBTyxHQUVULEVBQU0sTUFBTSx5QkFHZCxNQUFPLElBRVQsWUFBZ0MsRUFBSSxDQUNsQyxNQUNFLEtBQU8sS0FDUCxJQUFPLElBQ1AsSUFBTyxLQUNQLElBQU8sSUFDUCxJQUFPLEtBQ1AsSUFBTyxHQU9YLEdBQUsseUNBQTJDLFNBQVMsRUFBTyxDQUM5RCxHQUFJLEdBQVEsRUFBTSxJQUdsQixHQUFJLEtBQUssOEJBQThCLElBQVUsRUFBTSxJQUFJLElBQWUsQ0FDeEUsR0FBSSxHQUFPLEVBQU0sZ0JBQ2pCLEdBQUksS0FBSywrQkFBK0IsR0FBUSxDQUM5QyxHQUFJLEdBQVEsRUFBTSxnQkFDbEIsWUFBSywyQ0FBMkMsRUFBTyxFQUFNLEdBQ3RELElBTVgsR0FIQSxFQUFNLElBQU0sRUFHUixLQUFLLHlDQUF5QyxHQUFRLENBQ3hELEdBQUksR0FBYyxFQUFNLGdCQUN4QixZQUFLLDBDQUEwQyxFQUFPLEdBQy9DLEdBRVQsTUFBTyxJQUVULEdBQUssMkNBQTZDLFNBQVMsRUFBTyxFQUFNLEVBQU8sQ0FDN0UsQUFBSyxHQUFJLEVBQU0sa0JBQWtCLFVBQVcsSUFDeEMsRUFBTSxNQUFNLHlCQUNYLEVBQU0sa0JBQWtCLFVBQVUsR0FBTSxLQUFLLElBQzlDLEVBQU0sTUFBTSwyQkFFbEIsR0FBSywwQ0FBNEMsU0FBUyxFQUFPLEVBQWEsQ0FDNUUsQUFBSyxFQUFNLGtCQUFrQixPQUFPLEtBQUssSUFDckMsRUFBTSxNQUFNLDBCQUtsQixHQUFLLDhCQUFnQyxTQUFTLEVBQU8sQ0FDbkQsR0FBSSxHQUFLLEVBRVQsSUFEQSxFQUFNLGdCQUFrQixHQUNqQixHQUErQixFQUFLLEVBQU0sWUFDL0MsRUFBTSxpQkFBbUIsR0FBa0IsR0FDM0MsRUFBTSxVQUVSLE1BQU8sR0FBTSxrQkFBb0IsSUFFbkMsWUFBd0MsRUFBSSxDQUMxQyxNQUFPLElBQWdCLElBQU8sSUFBTyxHQUt2QyxHQUFLLCtCQUFpQyxTQUFTLEVBQU8sQ0FDcEQsR0FBSSxHQUFLLEVBRVQsSUFEQSxFQUFNLGdCQUFrQixHQUNqQixHQUFnQyxFQUFLLEVBQU0sWUFDaEQsRUFBTSxpQkFBbUIsR0FBa0IsR0FDM0MsRUFBTSxVQUVSLE1BQU8sR0FBTSxrQkFBb0IsSUFFbkMsWUFBeUMsRUFBSSxDQUMzQyxNQUFPLElBQStCLElBQU8sR0FBZSxHQUs5RCxHQUFLLHlDQUEyQyxTQUFTLEVBQU8sQ0FDOUQsTUFBTyxNQUFLLCtCQUErQixJQUk3QyxHQUFLLHlCQUEyQixTQUFTLEVBQU8sQ0FDOUMsR0FBSSxFQUFNLElBQUksSUFBZSxDQUczQixHQUZBLEVBQU0sSUFBSSxJQUNWLEtBQUssbUJBQW1CLEdBQ3BCLEVBQU0sSUFBSSxJQUNaLE1BQU8sR0FHVCxFQUFNLE1BQU0sZ0NBRWQsTUFBTyxJQU1ULEdBQUssbUJBQXFCLFNBQVMsRUFBTyxDQUN4QyxLQUFPLEtBQUssb0JBQW9CLElBQVEsQ0FDdEMsR0FBSSxHQUFPLEVBQU0sYUFDakIsR0FBSSxFQUFNLElBQUksS0FBaUIsS0FBSyxvQkFBb0IsR0FBUSxDQUM5RCxHQUFJLEdBQVEsRUFBTSxhQUNsQixBQUFJLEVBQU0sU0FBWSxLQUFTLElBQU0sSUFBVSxLQUM3QyxFQUFNLE1BQU0sMkJBRVYsSUFBUyxJQUFNLElBQVUsSUFBTSxFQUFPLEdBQ3hDLEVBQU0sTUFBTSw0Q0FRcEIsR0FBSyxvQkFBc0IsU0FBUyxFQUFPLENBQ3pDLEdBQUksR0FBUSxFQUFNLElBRWxCLEdBQUksRUFBTSxJQUFJLElBQWUsQ0FDM0IsR0FBSSxLQUFLLHNCQUFzQixHQUM3QixNQUFPLEdBRVQsR0FBSSxFQUFNLFFBQVMsQ0FFakIsR0FBSSxHQUFPLEVBQU0sVUFDakIsQUFBSSxLQUFTLElBQWdCLEdBQWEsS0FDeEMsRUFBTSxNQUFNLHdCQUVkLEVBQU0sTUFBTSxrQkFFZCxFQUFNLElBQU0sRUFHZCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksS0FBTyxHQUNULEdBQU0sYUFBZSxFQUNyQixFQUFNLFVBQ0MsSUFHRixJQUlULEdBQUssc0JBQXdCLFNBQVMsRUFBTyxDQUMzQyxHQUFJLEdBQVEsRUFBTSxJQUVsQixHQUFJLEVBQU0sSUFBSSxJQUNaLFNBQU0sYUFBZSxFQUNkLEdBR1QsR0FBSSxFQUFNLFNBQVcsRUFBTSxJQUFJLElBQzdCLFNBQU0sYUFBZSxHQUNkLEdBR1QsR0FBSSxDQUFDLEVBQU0sU0FBVyxFQUFNLElBQUksSUFBZSxDQUM3QyxHQUFJLEtBQUssNkJBQTZCLEdBQ3BDLE1BQU8sR0FFVCxFQUFNLElBQU0sRUFHZCxNQUNFLE1BQUssK0JBQStCLElBQ3BDLEtBQUssMEJBQTBCLElBS25DLEdBQUssNkJBQStCLFNBQVMsRUFBTyxDQUNsRCxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBZSxJQUFPLElBQU8sR0FDL0IsR0FBTSxhQUFlLEVBQUssR0FDMUIsRUFBTSxVQUNDLElBRUYsSUFJVCxHQUFLLDRCQUE4QixTQUFTLEVBQU8sQ0FDakQsR0FBSSxHQUFRLEVBQU0sSUFDbEIsR0FBSSxFQUFNLElBQUksS0FBZSxDQUMzQixHQUFJLEtBQUsseUJBQXlCLEVBQU8sR0FDdkMsTUFBTyxHQUVULEFBQUksRUFBTSxTQUNSLEVBQU0sTUFBTSxrQkFFZCxFQUFNLElBQU0sRUFFZCxNQUFPLElBSVQsR0FBSyx3QkFBMEIsU0FBUyxFQUFPLENBQzdDLEdBQUksR0FBUSxFQUFNLElBQ2QsRUFBSyxFQUVULElBREEsRUFBTSxhQUFlLEVBQ2QsR0FBZSxFQUFLLEVBQU0sWUFDL0IsRUFBTSxhQUFlLEdBQUssRUFBTSxhQUFnQixHQUFLLElBQ3JELEVBQU0sVUFFUixNQUFPLEdBQU0sTUFBUSxHQUV2QixZQUF3QixFQUFJLENBQzFCLE1BQU8sSUFBTSxJQUFnQixHQUFNLEdBSXJDLEdBQUssb0JBQXNCLFNBQVMsRUFBTyxDQUN6QyxHQUFJLEdBQVEsRUFBTSxJQUNkLEVBQUssRUFFVCxJQURBLEVBQU0sYUFBZSxFQUNkLEdBQVcsRUFBSyxFQUFNLFlBQzNCLEVBQU0sYUFBZSxHQUFLLEVBQU0sYUFBZSxHQUFTLEdBQ3hELEVBQU0sVUFFUixNQUFPLEdBQU0sTUFBUSxHQUV2QixZQUFvQixFQUFJLENBQ3RCLE1BQ0csSUFBTSxJQUFnQixHQUFNLElBQzVCLEdBQU0sSUFBZ0IsR0FBTSxJQUM1QixHQUFNLElBQWdCLEdBQU0sSUFHakMsWUFBa0IsRUFBSSxDQUNwQixNQUFJLElBQU0sSUFBZ0IsR0FBTSxHQUN2QixHQUFNLEdBQUssSUFFaEIsR0FBTSxJQUFnQixHQUFNLElBQ3ZCLEdBQU0sR0FBSyxJQUViLEVBQUssR0FLZCxHQUFLLG9DQUFzQyxTQUFTLEVBQU8sQ0FDekQsR0FBSSxLQUFLLHFCQUFxQixHQUFRLENBQ3BDLEdBQUksR0FBSyxFQUFNLGFBQ2YsR0FBSSxLQUFLLHFCQUFxQixHQUFRLENBQ3BDLEdBQUksR0FBSyxFQUFNLGFBQ2YsQUFBSSxHQUFNLEdBQUssS0FBSyxxQkFBcUIsR0FDdkMsRUFBTSxhQUFlLEVBQUssR0FBSyxFQUFLLEVBQUksRUFBTSxhQUU5QyxFQUFNLGFBQWUsRUFBSyxFQUFJLE1BR2hDLEdBQU0sYUFBZSxFQUV2QixNQUFPLEdBRVQsTUFBTyxJQUlULEdBQUsscUJBQXVCLFNBQVMsRUFBTyxDQUMxQyxHQUFJLEdBQUssRUFBTSxVQUNmLE1BQUksSUFBYSxHQUNmLEdBQU0sYUFBZSxFQUFLLEdBQzFCLEVBQU0sVUFDQyxJQUVULEdBQU0sYUFBZSxFQUNkLEtBRVQsWUFBc0IsRUFBSSxDQUN4QixNQUFPLElBQU0sSUFBZ0IsR0FBTSxHQU1yQyxHQUFLLHlCQUEyQixTQUFTLEVBQU8sRUFBUSxDQUN0RCxHQUFJLEdBQVEsRUFBTSxJQUNsQixFQUFNLGFBQWUsRUFDckIsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFRLEVBQUUsRUFBRyxDQUMvQixHQUFJLEdBQUssRUFBTSxVQUNmLEdBQUksQ0FBQyxHQUFXLEdBQ2QsU0FBTSxJQUFNLEVBQ0wsR0FFVCxFQUFNLGFBQWUsR0FBSyxFQUFNLGFBQWUsR0FBUyxHQUN4RCxFQUFNLFVBRVIsTUFBTyxJQU9ULEdBQUksSUFBUSxTQUFlLEVBQUcsQ0FDNUIsS0FBSyxLQUFPLEVBQUUsS0FDZCxLQUFLLE1BQVEsRUFBRSxNQUNmLEtBQUssTUFBUSxFQUFFLE1BQ2YsS0FBSyxJQUFNLEVBQUUsSUFDVCxFQUFFLFFBQVEsV0FDVixNQUFLLElBQU0sR0FBSSxJQUFlLEVBQUcsRUFBRSxTQUFVLEVBQUUsU0FDL0MsRUFBRSxRQUFRLFFBQ1YsTUFBSyxNQUFRLENBQUMsRUFBRSxNQUFPLEVBQUUsT0FLM0IsR0FBTyxHQUFPLFVBSWxCLEdBQUssS0FBTyxTQUFTLEVBQStCLENBQ2xELEFBQUksQ0FBQyxHQUFpQyxLQUFLLEtBQUssU0FBVyxLQUFLLGFBQzVELEtBQUssaUJBQWlCLEtBQUssTUFBTyw4QkFBZ0MsS0FBSyxLQUFLLFNBQzVFLEtBQUssUUFBUSxTQUNiLEtBQUssUUFBUSxRQUFRLEdBQUksSUFBTSxPQUVuQyxLQUFLLFdBQWEsS0FBSyxJQUN2QixLQUFLLGFBQWUsS0FBSyxNQUN6QixLQUFLLGNBQWdCLEtBQUssT0FDMUIsS0FBSyxnQkFBa0IsS0FBSyxTQUM1QixLQUFLLGFBR1AsR0FBSyxTQUFXLFVBQVcsQ0FDekIsWUFBSyxPQUNFLEdBQUksSUFBTSxPQUlmLE1BQU8sU0FBVyxhQUNsQixJQUFLLE9BQU8sVUFBWSxVQUFXLENBQ25DLEdBQUksR0FBUyxLQUViLE1BQU8sQ0FDTCxLQUFNLFVBQVksQ0FDaEIsR0FBSSxHQUFRLEVBQU8sV0FDbkIsTUFBTyxDQUNMLEtBQU0sRUFBTSxPQUFTLEVBQU0sSUFDM0IsTUFBTyxPQVNqQixHQUFLLFdBQWEsVUFBVyxDQUMzQixNQUFPLE1BQUssUUFBUSxLQUFLLFFBQVEsT0FBUyxJQU01QyxHQUFLLFVBQVksVUFBVyxDQUMxQixHQUFJLEdBQWEsS0FBSyxhQUt0QixHQUpJLEVBQUMsR0FBYyxDQUFDLEVBQVcsZ0JBQWlCLEtBQUssWUFFckQsS0FBSyxNQUFRLEtBQUssSUFDZCxLQUFLLFFBQVEsV0FBYSxNQUFLLFNBQVcsS0FBSyxlQUMvQyxLQUFLLEtBQU8sS0FBSyxNQUFNLE9BQVUsTUFBTyxNQUFLLFlBQVksRUFBTSxLQUVuRSxHQUFJLEVBQVcsU0FBWSxNQUFPLEdBQVcsU0FBUyxNQUMvQyxLQUFLLFVBQVUsS0FBSyxzQkFHN0IsR0FBSyxVQUFZLFNBQVMsRUFBTSxDQUc5QixNQUFJLEdBQWtCLEVBQU0sS0FBSyxRQUFRLGFBQWUsSUFBTSxJQUFTLEdBQzVELEtBQUssV0FFVCxLQUFLLGlCQUFpQixJQUcvQixHQUFLLGtCQUFvQixVQUFXLENBQ2xDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3RDLEdBQUksR0FBUSxPQUFVLEdBQVEsTUFBVSxNQUFPLEdBQy9DLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBUSxJQUFRLElBQU0sRUFBTyxVQUcvQixHQUFLLGlCQUFtQixVQUFXLENBQ2pDLEdBQUksR0FBVyxLQUFLLFFBQVEsV0FBYSxLQUFLLGNBQzFDLEVBQVEsS0FBSyxJQUFLLEVBQU0sS0FBSyxNQUFNLFFBQVEsS0FBTSxLQUFLLEtBQU8sR0FHakUsR0FGSSxJQUFRLElBQU0sS0FBSyxNQUFNLEtBQUssSUFBTSxFQUFHLHdCQUMzQyxLQUFLLElBQU0sRUFBTSxFQUNiLEtBQUssUUFBUSxVQUFXLENBQzFCLEdBQVcsVUFBWSxFQUV2QixPQURJLEdBQ0ksR0FBUSxHQUFXLEtBQUssS0FBSyxTQUFXLEVBQU0sTUFBUSxLQUFLLEtBQ2pFLEVBQUUsS0FBSyxRQUNQLEtBQUssVUFBWSxFQUFNLE1BQVEsRUFBTSxHQUFHLE9BRzVDLEFBQUksS0FBSyxRQUFRLFdBQ2IsS0FBSyxRQUFRLFVBQVUsR0FBTSxLQUFLLE1BQU0sTUFBTSxFQUFRLEVBQUcsR0FBTSxFQUFPLEtBQUssSUFDdEQsRUFBVSxLQUFLLGdCQUcxQyxHQUFLLGdCQUFrQixTQUFTLEVBQVcsQ0FJekMsT0FISSxHQUFRLEtBQUssSUFDYixFQUFXLEtBQUssUUFBUSxXQUFhLEtBQUssY0FDMUMsRUFBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQU8sR0FDcEMsS0FBSyxJQUFNLEtBQUssTUFBTSxRQUFVLENBQUMsR0FBVSxJQUNoRCxFQUFLLEtBQUssTUFBTSxXQUFXLEVBQUUsS0FBSyxLQUVwQyxBQUFJLEtBQUssUUFBUSxXQUNiLEtBQUssUUFBUSxVQUFVLEdBQU8sS0FBSyxNQUFNLE1BQU0sRUFBUSxFQUFXLEtBQUssS0FBTSxFQUFPLEtBQUssSUFDcEUsRUFBVSxLQUFLLGdCQU0xQyxHQUFLLFVBQVksVUFBVyxDQUMxQixFQUFNLEtBQU8sS0FBSyxJQUFNLEtBQUssTUFBTSxRQUFRLENBQ3pDLEdBQUksR0FBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3BDLE9BQVEsT0FDSCxRQUFTLEtBQ1osRUFBRSxLQUFLLElBQ1AsVUFDRyxJQUNILEFBQUksS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEtBQU8sSUFDMUMsRUFBRSxLQUFLLFFBRU4sUUFBUyxVQUFXLE1BQ3ZCLEVBQUUsS0FBSyxJQUNILEtBQUssUUFBUSxXQUNmLEdBQUUsS0FBSyxRQUNQLEtBQUssVUFBWSxLQUFLLEtBRXhCLFVBQ0csSUFDSCxPQUFRLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxRQUNwQyxJQUNILEtBQUssbUJBQ0wsVUFDRyxJQUNILEtBQUssZ0JBQWdCLEdBQ3JCLGNBRUEsUUFFRixjQUVBLEdBQUksRUFBSyxHQUFLLEVBQUssSUFBTSxHQUFNLE1BQVEsR0FBbUIsS0FBSyxPQUFPLGFBQWEsSUFDakYsRUFBRSxLQUFLLFFBRVAsWUFXUixHQUFLLFlBQWMsU0FBUyxFQUFNLEVBQUssQ0FDckMsS0FBSyxJQUFNLEtBQUssSUFDWixLQUFLLFFBQVEsV0FBYSxNQUFLLE9BQVMsS0FBSyxlQUNqRCxHQUFJLEdBQVcsS0FBSyxLQUNwQixLQUFLLEtBQU8sRUFDWixLQUFLLE1BQVEsRUFFYixLQUFLLGNBQWMsSUFZckIsR0FBSyxjQUFnQixVQUFXLENBQzlCLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxHQUFRLElBQU0sR0FBUSxHQUFNLE1BQU8sTUFBSyxXQUFXLElBQ3ZELEdBQUksR0FBUSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDN0MsTUFBSSxNQUFLLFFBQVEsYUFBZSxHQUFLLElBQVMsSUFBTSxJQUFVLEdBQzVELE1BQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLFdBRTlCLEdBQUUsS0FBSyxJQUNBLEtBQUssWUFBWSxFQUFNLE9BSWxDLEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUM1QyxNQUFJLE1BQUssWUFBZSxHQUFFLEtBQUssSUFBWSxLQUFLLGNBQzVDLElBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEdBQy9DLEtBQUssU0FBUyxFQUFNLE1BQU8sSUFHcEMsR0FBSywwQkFBNEIsU0FBUyxFQUFNLENBQzlDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDeEMsRUFBTyxFQUNQLEVBQVksSUFBUyxHQUFLLEVBQU0sS0FBTyxFQUFNLE9BU2pELE1BTkksTUFBSyxRQUFRLGFBQWUsR0FBSyxJQUFTLElBQU0sSUFBUyxJQUMzRCxHQUFFLEVBQ0YsRUFBWSxFQUFNLFNBQ2xCLEVBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLElBR3RDLElBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEVBQU8sR0FDdEQsS0FBSyxTQUFTLEVBQVcsSUFHbEMsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBQ3ZDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxJQUFTLEVBQU0sQ0FDakIsR0FBSSxLQUFLLFFBQVEsYUFBZSxHQUFJLENBQ2xDLEdBQUksR0FBUSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDN0MsR0FBSSxJQUFVLEdBQU0sTUFBTyxNQUFLLFNBQVMsRUFBTSxPQUFRLEdBRXpELE1BQU8sTUFBSyxTQUFTLElBQVMsSUFBTSxFQUFNLFVBQVksRUFBTSxXQUFZLEdBRTFFLE1BQUksS0FBUyxHQUFhLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FDL0MsS0FBSyxTQUFTLElBQVMsSUFBTSxFQUFNLFVBQVksRUFBTSxXQUFZLElBRzFFLEdBQUssZ0JBQWtCLFVBQVcsQ0FDaEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUM1QyxNQUFJLEtBQVMsR0FBYSxLQUFLLFNBQVMsRUFBTSxPQUFRLEdBQy9DLEtBQUssU0FBUyxFQUFNLFdBQVksSUFHekMsR0FBSyxtQkFBcUIsU0FBUyxFQUFNLENBQ3ZDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBSSxLQUFTLEVBQ1AsSUFBUyxJQUFNLENBQUMsS0FBSyxVQUFZLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxLQUFPLElBQ3hFLE1BQUssYUFBZSxHQUFLLEdBQVUsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVksS0FBSyxPQUVsRixNQUFLLGdCQUFnQixHQUNyQixLQUFLLFlBQ0UsS0FBSyxhQUVQLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FFakMsSUFBUyxHQUFhLEtBQUssU0FBUyxFQUFNLE9BQVEsR0FDL0MsS0FBSyxTQUFTLEVBQU0sUUFBUyxJQUd0QyxHQUFLLGdCQUFrQixTQUFTLEVBQU0sQ0FDcEMsR0FBSSxHQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxHQUN4QyxFQUFPLEVBQ1gsTUFBSSxLQUFTLEVBQ1gsR0FBTyxJQUFTLElBQU0sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEtBQU8sR0FBSyxFQUFJLEVBQ25FLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBTSxLQUFVLEdBQWEsS0FBSyxTQUFTLEVBQU0sT0FBUSxFQUFPLEdBQ3hGLEtBQUssU0FBUyxFQUFNLFNBQVUsSUFFbkMsSUFBUyxJQUFNLElBQVMsSUFBTSxDQUFDLEtBQUssVUFBWSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxJQUN4RixLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxHQUUxQyxNQUFLLGdCQUFnQixHQUNyQixLQUFLLFlBQ0UsS0FBSyxhQUVWLEtBQVMsSUFBTSxHQUFPLEdBQ25CLEtBQUssU0FBUyxFQUFNLFdBQVksS0FHekMsR0FBSyxrQkFBb0IsU0FBUyxFQUFNLENBQ3RDLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsTUFBSSxLQUFTLEdBQWEsS0FBSyxTQUFTLEVBQU0sU0FBVSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxHQUFLLEVBQUksR0FDckcsSUFBUyxJQUFNLElBQVMsSUFBTSxLQUFLLFFBQVEsYUFBZSxFQUM1RCxNQUFLLEtBQU8sRUFDTCxLQUFLLFlBQVksRUFBTSxRQUV6QixLQUFLLFNBQVMsSUFBUyxHQUFLLEVBQU0sR0FBSyxFQUFNLE9BQVEsSUFHOUQsR0FBSyxtQkFBcUIsVUFBVyxDQUNuQyxHQUFJLEdBQWMsS0FBSyxRQUFRLFlBQy9CLEdBQUksR0FBZSxHQUFJLENBQ3JCLEdBQUksR0FBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sR0FDNUMsR0FBSSxJQUFTLEdBQUksQ0FDZixHQUFJLEdBQVEsS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQzdDLEdBQUksRUFBUSxJQUFNLEVBQVEsR0FBTSxNQUFPLE1BQUssU0FBUyxFQUFNLFlBQWEsR0FFMUUsR0FBSSxJQUFTLEdBQUksQ0FDZixHQUFJLEdBQWUsR0FBSSxDQUNyQixHQUFJLEdBQVUsS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQy9DLEdBQUksSUFBWSxHQUFNLE1BQU8sTUFBSyxTQUFTLEVBQU0sT0FBUSxHQUUzRCxNQUFPLE1BQUssU0FBUyxFQUFNLFNBQVUsSUFHekMsTUFBTyxNQUFLLFNBQVMsRUFBTSxTQUFVLElBR3ZDLEdBQUssaUJBQW1CLFNBQVMsRUFBTSxDQUNyQyxPQUFRLE9BR0gsSUFDSCxNQUFPLE1BQUssb0JBR1QsSUFBSSxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxZQUM5QyxJQUFJLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLFlBQzlDLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sVUFDOUMsSUFBSSxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxXQUM5QyxJQUFJLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLGNBQzlDLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sY0FDOUMsS0FBSyxRQUFFLEtBQUssSUFBWSxLQUFLLFlBQVksRUFBTSxZQUMvQyxLQUFLLFFBQUUsS0FBSyxJQUFZLEtBQUssWUFBWSxFQUFNLFlBQy9DLElBQUksUUFBRSxLQUFLLElBQVksS0FBSyxZQUFZLEVBQU0sV0FFOUMsSUFDSCxHQUFJLEtBQUssUUFBUSxZQUFjLEVBQUssTUFDcEMsUUFBRSxLQUFLLElBQ0EsS0FBSyxZQUFZLEVBQU0sZUFFM0IsSUFDSCxHQUFJLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxJQUFNLEdBQzVDLEdBQUksSUFBUyxLQUFPLElBQVMsR0FBTSxNQUFPLE1BQUssZ0JBQWdCLElBQy9ELEdBQUksS0FBSyxRQUFRLGFBQWUsRUFBRyxDQUNqQyxHQUFJLElBQVMsS0FBTyxJQUFTLEdBQU0sTUFBTyxNQUFLLGdCQUFnQixHQUMvRCxHQUFJLElBQVMsSUFBTSxJQUFTLEdBQU0sTUFBTyxNQUFLLGdCQUFnQixPQUs3RCxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsSUFDM0UsTUFBTyxNQUFLLFdBQVcsUUFHcEIsUUFBUyxJQUNaLE1BQU8sTUFBSyxXQUFXLE9BT3BCLElBQ0gsTUFBTyxNQUFLLHNCQUVULFFBQVMsSUFDWixNQUFPLE1BQUssMEJBQTBCLE9BRW5DLFNBQVUsSUFDYixNQUFPLE1BQUssbUJBQW1CLE9BRTVCLElBQ0gsTUFBTyxNQUFLLHNCQUVULFFBQVMsSUFDWixNQUFPLE1BQUssbUJBQW1CLE9BRTVCLFFBQVMsSUFDWixNQUFPLE1BQUssZ0JBQWdCLE9BRXpCLFFBQVMsSUFDWixNQUFPLE1BQUssa0JBQWtCLE9BRTNCLElBQ0gsTUFBTyxNQUFLLHlCQUVULEtBQ0gsTUFBTyxNQUFLLFNBQVMsRUFBTSxPQUFRLEdBR3JDLEtBQUssTUFBTSxLQUFLLElBQUsseUJBQTJCLEdBQW9CLEdBQVEsTUFHOUUsR0FBSyxTQUFXLFNBQVMsRUFBTSxFQUFNLENBQ25DLEdBQUksR0FBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLElBQUssS0FBSyxJQUFNLEdBQ2hELFlBQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLElBR2hDLEdBQUssV0FBYSxVQUFXLENBRTNCLE9BREksR0FBUyxFQUFTLEVBQVEsS0FBSyxNQUMxQixDQUNQLEFBQUksS0FBSyxLQUFPLEtBQUssTUFBTSxRQUFVLEtBQUssTUFBTSxFQUFPLG1DQUN2RCxHQUFJLEdBQUssS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUVoQyxHQURJLEdBQVUsS0FBSyxJQUFPLEtBQUssTUFBTSxFQUFPLG1DQUN2QyxFQUtJLEVBQVUsT0FMTCxDQUNaLEdBQUksSUFBTyxJQUFPLEVBQVUsV0FDbkIsSUFBTyxLQUFPLEVBQVcsRUFBVSxXQUNuQyxJQUFPLEtBQU8sQ0FBQyxFQUFXLE1BQ25DLEVBQVUsSUFBTyxLQUVuQixFQUFFLEtBQUssSUFFVCxHQUFJLEdBQVUsS0FBSyxNQUFNLE1BQU0sRUFBTyxLQUFLLEtBQzNDLEVBQUUsS0FBSyxJQUNQLEdBQUksR0FBYSxLQUFLLElBQ2xCLEVBQVEsS0FBSyxZQUNqQixBQUFJLEtBQUssYUFBZSxLQUFLLFdBQVcsR0FHeEMsR0FBSSxHQUFRLEtBQUssYUFBZ0IsTUFBSyxZQUFjLEdBQUksSUFBc0IsT0FDOUUsRUFBTSxNQUFNLEVBQU8sRUFBUyxHQUM1QixLQUFLLG9CQUFvQixHQUN6QixLQUFLLHNCQUFzQixHQUczQixHQUFJLEdBQVEsS0FDWixHQUFJLENBQ0YsRUFBUSxHQUFJLFFBQU8sRUFBUyxTQUNyQixHQUFQLEVBS0YsTUFBTyxNQUFLLFlBQVksRUFBTSxPQUFRLENBQUMsUUFBUyxFQUFTLE1BQU8sRUFBTyxNQUFPLEtBT2hGLEdBQUssUUFBVSxTQUFTLEVBQU8sRUFBSyxFQUFnQyxDQVVsRSxPQVJJLEdBQWtCLEtBQUssUUFBUSxhQUFlLElBQU0sSUFBUSxPQUs1RCxFQUE4QixHQUFrQyxLQUFLLE1BQU0sV0FBVyxLQUFLLE9BQVMsR0FFcEcsRUFBUSxLQUFLLElBQUssRUFBUSxFQUFHLEVBQVcsRUFDbkMsRUFBSSxFQUFHLEdBQUksR0FBYyxJQUFnQixFQUFJLEdBQUcsRUFBRSxFQUFHLEVBQUUsS0FBSyxJQUFLLENBQ3hFLEdBQUksSUFBTyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQU0sR0FBTyxPQUVuRCxHQUFJLEdBQW1CLEtBQVMsR0FBSSxDQUNsQyxBQUFJLEdBQStCLEtBQUssaUJBQWlCLEtBQUssSUFBSyxxRUFDL0QsSUFBYSxJQUFNLEtBQUssaUJBQWlCLEtBQUssSUFBSyxvREFDbkQsSUFBTSxHQUFLLEtBQUssaUJBQWlCLEtBQUssSUFBSywyREFDL0MsRUFBVyxHQUNYLFNBT0YsR0FKQSxBQUFJLElBQVEsR0FBTSxHQUFNLEdBQU8sR0FBSyxHQUMvQixBQUFJLElBQVEsR0FBTSxHQUFNLEdBQU8sR0FBSyxHQUNwQyxBQUFJLElBQVEsSUFBTSxJQUFRLEdBQU0sR0FBTSxHQUFPLEdBQzNDLEdBQU0sSUFDVCxJQUFPLEVBQVMsTUFDcEIsRUFBVyxHQUNYLEVBQVEsRUFBUSxFQUFRLEdBSTFCLE1BREksSUFBbUIsSUFBYSxJQUFNLEtBQUssaUJBQWlCLEtBQUssSUFBTSxFQUFHLDBEQUMxRSxLQUFLLE1BQVEsR0FBUyxHQUFPLE1BQVEsS0FBSyxJQUFNLElBQVUsRUFBYyxLQUVyRSxHQUdULFlBQXdCLEVBQUssRUFBNkIsQ0FDeEQsTUFBSSxHQUNLLFNBQVMsRUFBSyxHQUloQixXQUFXLEVBQUksUUFBUSxLQUFNLEtBR3RDLFlBQXdCLEVBQUssQ0FDM0IsTUFBSSxPQUFPLFNBQVcsV0FDYixLQUlGLE9BQU8sRUFBSSxRQUFRLEtBQU0sS0FHbEMsR0FBSyxnQkFBa0IsU0FBUyxFQUFPLENBQ3JDLEdBQUksR0FBUSxLQUFLLElBQ2pCLEtBQUssS0FBTyxFQUNaLEdBQUksR0FBTSxLQUFLLFFBQVEsR0FDdkIsTUFBSSxJQUFPLE1BQVEsS0FBSyxNQUFNLEtBQUssTUFBUSxFQUFHLDRCQUE4QixHQUM1RSxBQUFJLEtBQUssUUFBUSxhQUFlLElBQU0sS0FBSyxNQUFNLFdBQVcsS0FBSyxPQUFTLElBQ3hFLEdBQU0sR0FBZSxLQUFLLE1BQU0sTUFBTSxFQUFPLEtBQUssTUFDbEQsRUFBRSxLQUFLLEtBQ0UsRUFBa0IsS0FBSyxzQkFBd0IsS0FBSyxNQUFNLEtBQUssSUFBSyxvQ0FDeEUsS0FBSyxZQUFZLEVBQU0sSUFBSyxJQUtyQyxHQUFLLFdBQWEsU0FBUyxFQUFlLENBQ3hDLEdBQUksR0FBUSxLQUFLLElBQ2pCLEFBQUksQ0FBQyxHQUFpQixLQUFLLFFBQVEsR0FBSSxPQUFXLE1BQVUsTUFBUSxLQUFLLE1BQU0sRUFBTyxrQkFDdEYsR0FBSSxHQUFRLEtBQUssSUFBTSxHQUFTLEdBQUssS0FBSyxNQUFNLFdBQVcsS0FBVyxHQUN0RSxBQUFJLEdBQVMsS0FBSyxRQUFVLEtBQUssTUFBTSxFQUFPLGtCQUM5QyxHQUFJLEdBQU8sS0FBSyxNQUFNLFdBQVcsS0FBSyxLQUN0QyxHQUFJLENBQUMsR0FBUyxDQUFDLEdBQWlCLEtBQUssUUFBUSxhQUFlLElBQU0sSUFBUyxJQUFLLENBQzlFLEdBQUksR0FBUSxHQUFlLEtBQUssTUFBTSxNQUFNLEVBQU8sS0FBSyxNQUN4RCxRQUFFLEtBQUssSUFDSCxFQUFrQixLQUFLLHNCQUF3QixLQUFLLE1BQU0sS0FBSyxJQUFLLG9DQUNqRSxLQUFLLFlBQVksRUFBTSxJQUFLLEdBRXJDLEFBQUksR0FBUyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sRUFBTyxLQUFLLE9BQVMsR0FBUSxJQUNuRSxJQUFTLElBQU0sQ0FBQyxHQUNsQixHQUFFLEtBQUssSUFDUCxLQUFLLFFBQVEsSUFDYixFQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssTUFFL0IsS0FBUyxJQUFNLElBQVMsTUFBUSxDQUFDLEdBQ3BDLEdBQU8sS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLEtBQ2hDLEtBQVMsSUFBTSxJQUFTLEtBQU0sRUFBRSxLQUFLLElBQ3JDLEtBQUssUUFBUSxNQUFRLE1BQVEsS0FBSyxNQUFNLEVBQU8sbUJBRWpELEVBQWtCLEtBQUssc0JBQXdCLEtBQUssTUFBTSxLQUFLLElBQUssb0NBRXhFLEdBQUksR0FBTSxHQUFlLEtBQUssTUFBTSxNQUFNLEVBQU8sS0FBSyxLQUFNLEdBQzVELE1BQU8sTUFBSyxZQUFZLEVBQU0sSUFBSyxJQUtyQyxHQUFLLGNBQWdCLFVBQVcsQ0FDOUIsR0FBSSxHQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssS0FBTSxFQUUxQyxHQUFJLElBQU8sSUFBSyxDQUNkLEFBQUksS0FBSyxRQUFRLFlBQWMsR0FBSyxLQUFLLGFBQ3pDLEdBQUksR0FBVSxFQUFFLEtBQUssSUFDckIsRUFBTyxLQUFLLFlBQVksS0FBSyxNQUFNLFFBQVEsSUFBSyxLQUFLLEtBQU8sS0FBSyxLQUNqRSxFQUFFLEtBQUssSUFDSCxFQUFPLFNBQVksS0FBSyxtQkFBbUIsRUFBUyxnQ0FFeEQsR0FBTyxLQUFLLFlBQVksR0FFMUIsTUFBTyxJQUdULFlBQTZCLEVBQU0sQ0FFakMsTUFBSSxJQUFRLE1BQWlCLE9BQU8sYUFBYSxHQUNqRCxJQUFRLE1BQ0QsT0FBTyxhQUFjLElBQVEsSUFBTSxNQUFTLEdBQU8sTUFBUSxRQUdwRSxHQUFLLFdBQWEsU0FBUyxFQUFPLENBRWhDLE9BREksR0FBTSxHQUFJLEVBQWEsRUFBRSxLQUFLLE1BQ3pCLENBQ1AsQUFBSSxLQUFLLEtBQU8sS0FBSyxNQUFNLFFBQVUsS0FBSyxNQUFNLEtBQUssTUFBTyxnQ0FDNUQsR0FBSSxHQUFLLEtBQUssTUFBTSxXQUFXLEtBQUssS0FDcEMsR0FBSSxJQUFPLEVBQVMsTUFDcEIsQUFBSSxJQUFPLEdBQ1QsSUFBTyxLQUFLLE1BQU0sTUFBTSxFQUFZLEtBQUssS0FDekMsR0FBTyxLQUFLLGdCQUFnQixJQUM1QixFQUFhLEtBQUssS0FFZCxJQUFVLEVBQUksS0FBSyxRQUFRLGFBQWUsS0FBTyxLQUFLLE1BQU0sS0FBSyxNQUFPLGdDQUM1RSxFQUFFLEtBQUssS0FHWCxVQUFPLEtBQUssTUFBTSxNQUFNLEVBQVksS0FBSyxPQUNsQyxLQUFLLFlBQVksRUFBTSxPQUFRLElBS3hDLEdBQUksSUFBZ0MsR0FFcEMsR0FBSyxxQkFBdUIsVUFBVyxDQUNyQyxLQUFLLGtCQUFvQixHQUN6QixHQUFJLENBQ0YsS0FBSyxzQkFDRSxFQUFQLENBQ0EsR0FBSSxJQUFRLEdBQ1YsS0FBSywrQkFFTCxNQUFNLEdBSVYsS0FBSyxrQkFBb0IsSUFHM0IsR0FBSyxtQkFBcUIsU0FBUyxFQUFVLEVBQVMsQ0FDcEQsR0FBSSxLQUFLLG1CQUFxQixLQUFLLFFBQVEsYUFBZSxFQUN4RCxLQUFNLElBRU4sS0FBSyxNQUFNLEVBQVUsSUFJekIsR0FBSyxjQUFnQixVQUFXLENBRTlCLE9BREksR0FBTSxHQUFJLEVBQWEsS0FBSyxNQUN2QixDQUNQLEFBQUksS0FBSyxLQUFPLEtBQUssTUFBTSxRQUFVLEtBQUssTUFBTSxLQUFLLE1BQU8seUJBQzVELEdBQUksR0FBSyxLQUFLLE1BQU0sV0FBVyxLQUFLLEtBQ3BDLEdBQUksSUFBTyxJQUFNLElBQU8sSUFBTSxLQUFLLE1BQU0sV0FBVyxLQUFLLElBQU0sS0FBTyxJQUNwRSxNQUFJLE1BQUssTUFBUSxLQUFLLE9BQVUsTUFBSyxPQUFTLEVBQU0sVUFBWSxLQUFLLE9BQVMsRUFBTSxpQkFDOUUsSUFBTyxHQUNULE1BQUssS0FBTyxFQUNMLEtBQUssWUFBWSxFQUFNLGVBRTlCLEdBQUUsS0FBSyxJQUNBLEtBQUssWUFBWSxFQUFNLFlBR2xDLElBQU8sS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLEtBQ2xDLEtBQUssWUFBWSxFQUFNLFNBQVUsSUFFMUMsR0FBSSxJQUFPLEdBQ1QsR0FBTyxLQUFLLE1BQU0sTUFBTSxFQUFZLEtBQUssS0FDekMsR0FBTyxLQUFLLGdCQUFnQixJQUM1QixFQUFhLEtBQUssWUFDVCxHQUFVLEdBQUssQ0FHeEIsT0FGQSxHQUFPLEtBQUssTUFBTSxNQUFNLEVBQVksS0FBSyxLQUN6QyxFQUFFLEtBQUssSUFDQyxPQUNILElBQ0gsQUFBSSxLQUFLLE1BQU0sV0FBVyxLQUFLLE9BQVMsSUFBTSxFQUFFLEtBQUssUUFDbEQsSUFDSCxHQUFPO0FBQUEsRUFDUCxjQUVBLEdBQU8sT0FBTyxhQUFhLEdBQzNCLE1BRUYsQUFBSSxLQUFLLFFBQVEsV0FDZixHQUFFLEtBQUssUUFDUCxLQUFLLFVBQVksS0FBSyxLQUV4QixFQUFhLEtBQUssUUFFbEIsRUFBRSxLQUFLLE1BTWIsR0FBSyx5QkFBMkIsVUFBVyxDQUN6QyxLQUFPLEtBQUssSUFBTSxLQUFLLE1BQU0sT0FBUSxLQUFLLE1BQ3hDLE9BQVEsS0FBSyxNQUFNLEtBQUssVUFDbkIsS0FDSCxFQUFFLEtBQUssSUFDUCxVQUVHLElBQ0gsR0FBSSxLQUFLLE1BQU0sS0FBSyxJQUFNLEtBQU8sSUFDL0IsVUFJQyxJQUNILE1BQU8sTUFBSyxZQUFZLEVBQU0sZ0JBQWlCLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTyxLQUFLLE1BS3JGLEtBQUssTUFBTSxLQUFLLE1BQU8sMEJBS3pCLEdBQUssZ0JBQWtCLFNBQVMsRUFBWSxDQUMxQyxHQUFJLEdBQUssS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLEtBRXRDLE9BREEsRUFBRSxLQUFLLElBQ0MsT0FDSCxLQUFLLE1BQU87QUFBQSxNQUNaLEtBQUssTUFBTyxTQUNaLEtBQUssTUFBTyxRQUFPLGFBQWEsS0FBSyxZQUFZLFFBQ2pELEtBQUssTUFBTyxJQUFvQixLQUFLLHFCQUNyQyxLQUFLLE1BQU8sUUFDWixJQUFJLE1BQU8sU0FDWCxLQUFLLE1BQU8sU0FDWixLQUFLLE1BQU8sU0FDWixJQUFJLEFBQUksS0FBSyxNQUFNLFdBQVcsS0FBSyxPQUFTLElBQU0sRUFBRSxLQUFLLFFBQ3pELElBQ0gsTUFBSSxNQUFLLFFBQVEsV0FBYSxNQUFLLFVBQVksS0FBSyxJQUFLLEVBQUUsS0FBSyxTQUN6RCxPQUNKLFFBQ0EsSUFDSCxHQUFJLEVBQVksQ0FDZCxHQUFJLEdBQVUsS0FBSyxJQUFNLEVBRXpCLFlBQUssbUJBQ0gsRUFDQSw4Q0FHSyxhQUdULEdBQUksR0FBTSxJQUFNLEdBQU0sR0FBSSxDQUN4QixHQUFJLEdBQVcsS0FBSyxNQUFNLE9BQU8sS0FBSyxJQUFNLEVBQUcsR0FBRyxNQUFNLFdBQVcsR0FDL0QsRUFBUSxTQUFTLEVBQVUsR0FDL0IsTUFBSSxHQUFRLEtBQ1YsR0FBVyxFQUFTLE1BQU0sRUFBRyxJQUM3QixFQUFRLFNBQVMsRUFBVSxJQUU3QixLQUFLLEtBQU8sRUFBUyxPQUFTLEVBQzlCLEVBQUssS0FBSyxNQUFNLFdBQVcsS0FBSyxLQUMzQixLQUFhLEtBQU8sSUFBTyxJQUFNLElBQU8sS0FBUSxNQUFLLFFBQVUsSUFDbEUsS0FBSyxtQkFDSCxLQUFLLElBQU0sRUFBSSxFQUFTLE9BQ3hCLEVBQ0ksbUNBQ0EsZ0NBR0QsT0FBTyxhQUFhLEdBRTdCLE1BQUksSUFBVSxHQUdMLEdBRUYsT0FBTyxhQUFhLEtBTS9CLEdBQUssWUFBYyxTQUFTLEVBQUssQ0FDL0IsR0FBSSxHQUFVLEtBQUssSUFDZixFQUFJLEtBQUssUUFBUSxHQUFJLEdBQ3pCLE1BQUksS0FBTSxNQUFRLEtBQUssbUJBQW1CLEVBQVMsaUNBQzVDLEdBU1QsR0FBSyxVQUFZLFVBQVcsQ0FDMUIsS0FBSyxZQUFjLEdBR25CLE9BRkksR0FBTyxHQUFJLEVBQVEsR0FBTSxFQUFhLEtBQUssSUFDM0MsRUFBUyxLQUFLLFFBQVEsYUFBZSxFQUNsQyxLQUFLLElBQU0sS0FBSyxNQUFNLFFBQVEsQ0FDbkMsR0FBSSxHQUFLLEtBQUssb0JBQ2QsR0FBSSxFQUFpQixFQUFJLEdBQ3ZCLEtBQUssS0FBTyxHQUFNLE1BQVMsRUFBSSxVQUN0QixJQUFPLEdBQUksQ0FDcEIsS0FBSyxZQUFjLEdBQ25CLEdBQVEsS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLEtBQzFDLEdBQUksR0FBVyxLQUFLLElBQ3BCLEFBQUksS0FBSyxNQUFNLFdBQVcsRUFBRSxLQUFLLE9BQVMsS0FDdEMsS0FBSyxtQkFBbUIsS0FBSyxJQUFLLDZDQUN0QyxFQUFFLEtBQUssSUFDUCxHQUFJLEdBQU0sS0FBSyxnQkFDZixBQUFNLEdBQVEsRUFBb0IsR0FBa0IsRUFBSyxJQUNyRCxLQUFLLG1CQUFtQixFQUFVLDBCQUN0QyxHQUFRLEdBQW9CLEdBQzVCLEVBQWEsS0FBSyxRQUVsQixPQUVGLEVBQVEsR0FFVixNQUFPLEdBQU8sS0FBSyxNQUFNLE1BQU0sRUFBWSxLQUFLLE1BTWxELEdBQUssU0FBVyxVQUFXLENBQ3pCLEdBQUksR0FBTyxLQUFLLFlBQ1osRUFBTyxFQUFNLEtBQ2pCLE1BQUksTUFBSyxTQUFTLEtBQUssSUFDckIsR0FBTyxHQUFXLElBRWIsS0FBSyxZQUFZLEVBQU0sSUFLaEMsR0FBSSxJQUFVLFFBRWQsR0FBTyxNQUFRLENBQ2IsT0FBUSxHQUNSLFFBQVMsR0FDVCxlQUFnQixHQUNoQixTQUFVLEdBQ1YsZUFBZ0IsR0FDaEIsWUFBYSxHQUNiLEtBQU0sR0FDTixVQUFXLEVBQ1gsU0FBVSxFQUNWLGFBQWMsR0FDZCxXQUFZLEdBQ1osWUFBYSxHQUNiLGlCQUFrQixFQUNsQixrQkFBbUIsRUFDbkIsTUFBTyxHQUNQLFVBQVcsR0FDWCxVQUFXLEdBQ1gsV0FBWSxHQUNaLG1CQUFvQixJQVV0QixZQUFlLEVBQU8sRUFBUyxDQUM3QixNQUFPLElBQU8sTUFBTSxFQUFPLEdBTzdCLFlBQTJCLEVBQU8sRUFBSyxFQUFTLENBQzlDLE1BQU8sSUFBTyxrQkFBa0IsRUFBTyxFQUFLLEdBTTlDLFlBQW1CLEVBQU8sRUFBUyxDQUNqQyxNQUFPLElBQU8sVUFBVSxFQUFPLEdBR2pDLEVBQVEsS0FBTyxHQUNmLEVBQVEsT0FBUyxHQUNqQixFQUFRLFNBQVcsR0FDbkIsRUFBUSxlQUFpQixHQUN6QixFQUFRLFdBQWEsR0FDckIsRUFBUSxNQUFRLEdBQ2hCLEVBQVEsVUFBWSxFQUNwQixFQUFRLGVBQWlCLEdBQ3pCLEVBQVEsWUFBYyxHQUN0QixFQUFRLGlCQUFtQixFQUMzQixFQUFRLGtCQUFvQixFQUM1QixFQUFRLFVBQVksR0FDcEIsRUFBUSxhQUFlLEdBQ3ZCLEVBQVEsVUFBWSxHQUNwQixFQUFRLFdBQWEsR0FDckIsRUFBUSxtQkFBcUIsR0FDN0IsRUFBUSxNQUFRLEdBQ2hCLEVBQVEsa0JBQW9CLEdBQzVCLEVBQVEsWUFBYyxHQUN0QixFQUFRLFNBQVcsRUFDbkIsRUFBUSxVQUFZLEdBQ3BCLEVBQVEsUUFBVSxHQUVsQixPQUFPLGVBQWUsRUFBUyxhQUFjLENBQUUsTUFBTyxTQy9qS3hELDJCQU1BLGFBRUEsR0FBSSxJQUF3QixPQUFPLHNCQUMvQixHQUFpQixPQUFPLFVBQVUsZUFDbEMsR0FBbUIsT0FBTyxVQUFVLHFCQUV4QyxZQUFrQixFQUFLLENBQ3RCLEdBQUksR0FBUSxLQUNYLEtBQU0sSUFBSSxXQUFVLHlEQUdyQixNQUFPLFFBQU8sR0FHZixhQUEyQixDQUMxQixHQUFJLENBQ0gsR0FBSSxDQUFDLE9BQU8sT0FDWCxNQUFPLEdBTVIsR0FBSSxHQUFRLEdBQUksUUFBTyxPQUV2QixHQURBLEVBQU0sR0FBSyxLQUNQLE9BQU8sb0JBQW9CLEdBQU8sS0FBTyxJQUM1QyxNQUFPLEdBS1IsT0FESSxHQUFRLEdBQ0gsRUFBSSxFQUFHLEVBQUksR0FBSSxJQUN2QixFQUFNLElBQU0sT0FBTyxhQUFhLElBQU0sRUFFdkMsR0FBSSxHQUFTLE9BQU8sb0JBQW9CLEdBQU8sSUFBSSxTQUFVLEVBQUcsQ0FDL0QsTUFBTyxHQUFNLEtBRWQsR0FBSSxFQUFPLEtBQUssTUFBUSxhQUN2QixNQUFPLEdBSVIsR0FBSSxHQUFRLEdBSVosTUFIQSx1QkFBdUIsTUFBTSxJQUFJLFFBQVEsU0FBVSxFQUFRLENBQzFELEVBQU0sR0FBVSxJQUViLE9BQU8sS0FBSyxPQUFPLE9BQU8sR0FBSSxJQUFRLEtBQUssTUFDN0MsNkJBS00sRUFBUCxDQUVELE1BQU8sSUFJVCxHQUFPLFFBQVUsS0FBb0IsT0FBTyxPQUFTLFNBQVUsRUFBUSxFQUFRLENBSzlFLE9BSkksR0FDQSxFQUFLLEdBQVMsR0FDZCxFQUVLLEVBQUksRUFBRyxFQUFJLFVBQVUsT0FBUSxJQUFLLENBQzFDLEVBQU8sT0FBTyxVQUFVLElBRXhCLE9BQVMsS0FBTyxHQUNmLEFBQUksR0FBZSxLQUFLLEVBQU0sSUFDN0IsR0FBRyxHQUFPLEVBQUssSUFJakIsR0FBSSxHQUF1QixDQUMxQixFQUFVLEdBQXNCLEdBQ2hDLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQ25DLEFBQUksR0FBaUIsS0FBSyxFQUFNLEVBQVEsS0FDdkMsR0FBRyxFQUFRLElBQU0sRUFBSyxFQUFRLE1BTWxDLE1BQU8sTUN4RlIsd0NBRUEsR0FBSSxJQUFRLEtBQ1IsR0FBZSxLQUVuQixHQUFPLFFBQVUsR0FFakIsR0FBSSxJQUFrQixDQUNwQixNQUFPLEdBQ1AsT0FBUSxHQUNSLFlBQWEsSUFHZixZQUFzQixFQUFLLEVBQVMsQ0FDbEMsRUFBVSxHQUFhLEdBQUksR0FBaUIsR0FFNUMsR0FBSSxDQUNGLEdBQUksR0FBUyxHQUFJLElBQU0sT0FBTyxFQUFTLEVBQUssR0FFNUMsQUFBSSxFQUFRLFFBQ1YsR0FBTyxPQUFTLElBR2IsRUFBUSxhQUNYLEdBQU8sZ0JBQWtCLFNBQVUsRUFBVyxDQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFLLGdEQUl6QixFQUFPLFlBQ1AsRUFBTyxrQkFFSCxFQUFPLE9BQVMsR0FBTSxTQUFTLEtBQ2pDLEVBQU8sbUJBRUYsRUFBUCxDQUNBLEdBQUksQ0FBQyxFQUFRLE1BQ1gsTUFBTyxHQUdULEtBQU0sR0FHUixNQUFPLE1DM0NULHdDQUdBLEdBQU8sUUFBVSxVQUFzQixDQUN0QyxHQUFJLE1BQU8sU0FBVyxZQUFjLE1BQU8sUUFBTyx1QkFBMEIsV0FBYyxNQUFPLEdBQ2pHLEdBQUksTUFBTyxRQUFPLFVBQWEsU0FBWSxNQUFPLEdBRWxELEdBQUksR0FBTSxHQUNOLEVBQU0sT0FBTyxRQUNiLEVBQVMsT0FBTyxHQUlwQixHQUhJLE1BQU8sSUFBUSxVQUVmLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBUyxtQkFDeEMsT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFZLGtCQUFxQixNQUFPLEdBVTNFLEdBQUksR0FBUyxHQUNiLEVBQUksR0FBTyxFQUNYLElBQUssSUFBTyxHQUFPLE1BQU8sR0FHMUIsR0FGSSxNQUFPLFFBQU8sTUFBUyxZQUFjLE9BQU8sS0FBSyxHQUFLLFNBQVcsR0FFakUsTUFBTyxRQUFPLHFCQUF3QixZQUFjLE9BQU8sb0JBQW9CLEdBQUssU0FBVyxFQUFLLE1BQU8sR0FFL0csR0FBSSxHQUFPLE9BQU8sc0JBQXNCLEdBR3hDLEdBRkksRUFBSyxTQUFXLEdBQUssRUFBSyxLQUFPLEdBRWpDLENBQUMsT0FBTyxVQUFVLHFCQUFxQixLQUFLLEVBQUssR0FBUSxNQUFPLEdBRXBFLEdBQUksTUFBTyxRQUFPLDBCQUE2QixXQUFZLENBQzFELEdBQUksR0FBYSxPQUFPLHlCQUF5QixFQUFLLEdBQ3RELEdBQUksRUFBVyxRQUFVLEdBQVUsRUFBVyxhQUFlLEdBQVEsTUFBTyxHQUc3RSxNQUFPLE1DeENSLHdDQUVBLEdBQUksSUFBYSxNQUFPLFNBQVcsYUFBZSxPQUM5QyxHQUFnQixLQUVwQixHQUFPLFFBQVUsVUFBNEIsQ0FJNUMsTUFISSxPQUFPLEtBQWUsWUFDdEIsTUFBTyxTQUFXLFlBQ2xCLE1BQU8sSUFBVyxRQUFXLFVBQzdCLE1BQU8sUUFBTyxRQUFXLFNBQW1CLEdBRXpDLFFDWFIsd0NBRUEsR0FBSSxJQUFPLENBQ1YsSUFBSyxJQUdGLEdBQVUsT0FFZCxHQUFPLFFBQVUsVUFBb0IsQ0FDcEMsTUFBTyxDQUFFLFVBQVcsSUFBTyxNQUFRLEdBQUssS0FBTyxDQUFFLEVBQUUsVUFBVyxlQUFrQixRQ1RqRix3Q0FJQSxHQUFJLElBQWdCLGtEQUNoQixHQUFRLE1BQU0sVUFBVSxNQUN4QixHQUFRLE9BQU8sVUFBVSxTQUN6QixHQUFXLG9CQUVmLEdBQU8sUUFBVSxTQUFjLEVBQU0sQ0FDakMsR0FBSSxHQUFTLEtBQ2IsR0FBSSxNQUFPLElBQVcsWUFBYyxHQUFNLEtBQUssS0FBWSxHQUN2RCxLQUFNLElBQUksV0FBVSxHQUFnQixHQXlCeEMsT0F2QkksR0FBTyxHQUFNLEtBQUssVUFBVyxHQUU3QixFQUNBLEVBQVMsVUFBWSxDQUNyQixHQUFJLGVBQWdCLEdBQU8sQ0FDdkIsR0FBSSxHQUFTLEVBQU8sTUFDaEIsS0FDQSxFQUFLLE9BQU8sR0FBTSxLQUFLLGFBRTNCLE1BQUksUUFBTyxLQUFZLEVBQ1osRUFFSixTQUVQLE9BQU8sR0FBTyxNQUNWLEVBQ0EsRUFBSyxPQUFPLEdBQU0sS0FBSyxjQUsvQixFQUFjLEtBQUssSUFBSSxFQUFHLEVBQU8sT0FBUyxFQUFLLFFBQy9DLEVBQVksR0FDUCxFQUFJLEVBQUcsRUFBSSxFQUFhLElBQzdCLEVBQVUsS0FBSyxJQUFNLEdBS3pCLEdBRkEsRUFBUSxTQUFTLFNBQVUsb0JBQXNCLEVBQVUsS0FBSyxLQUFPLDZDQUE2QyxHQUVoSCxFQUFPLFVBQVcsQ0FDbEIsR0FBSSxHQUFRLFVBQWlCLEdBQzdCLEVBQU0sVUFBWSxFQUFPLFVBQ3pCLEVBQU0sVUFBWSxHQUFJLEdBQ3RCLEVBQU0sVUFBWSxLQUd0QixNQUFPLE1DbERYLHdDQUVBLEdBQUksSUFBaUIsS0FFckIsR0FBTyxRQUFVLFNBQVMsVUFBVSxNQUFRLEtDSjVDLHdDQUVBLEdBQUksSUFBTyxLQUVYLEdBQU8sUUFBVSxHQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxrQkNKM0Qsd0NBRUEsR0FBSSxJQUVBLEdBQWUsWUFDZixHQUFZLFNBQ1osR0FBYSxVQUdiLEdBQXdCLFNBQVUsRUFBa0IsQ0FDdkQsR0FBSSxDQUNILE1BQU8sSUFBVSx5QkFBMkIsRUFBbUIsMEJBQ3ZELEVBQVAsSUFHQyxHQUFRLE9BQU8seUJBQ25CLEdBQUksR0FDSCxHQUFJLENBQ0gsR0FBTSxHQUFJLFVBQ0YsRUFBUCxDQUNELEdBQVEsS0FJVixHQUFJLElBQWlCLFVBQVksQ0FDaEMsS0FBTSxJQUFJLEtBRVAsR0FBaUIsR0FDakIsVUFBWSxDQUNkLEdBQUksQ0FFSCxpQkFBVSxPQUNILFNBQ0MsRUFBUCxDQUNELEdBQUksQ0FFSCxNQUFPLElBQU0sVUFBVyxVQUFVLFVBQzFCLEVBQVAsQ0FDRCxNQUFPLFNBSVIsR0FFQyxHQUFhLE9BQ2IsR0FBVyxPQUVYLEdBQVcsT0FBTyxnQkFDckIsSUFDRyxTQUFVLEVBQUcsQ0FBRSxNQUFPLEdBQUUsV0FDeEIsTUFHQSxHQUFZLEdBRVosR0FBYSxNQUFPLGFBQWUsYUFBZSxDQUFDLEdBQVcsR0FBWSxHQUFTLFlBRW5GLEdBQWEsQ0FDaEIsbUJBQW9CLE1BQU8saUJBQW1CLFlBQWMsR0FBWSxlQUN4RSxVQUFXLE1BQ1gsZ0JBQWlCLE1BQU8sY0FBZ0IsWUFBYyxHQUFZLFlBQ2xFLDJCQUE0QixJQUFjLEdBQVcsR0FBUyxHQUFHLE9BQU8sYUFBZSxHQUN2RixtQ0FBb0MsR0FDcEMsa0JBQW1CLEdBQ25CLG1CQUFvQixHQUNwQiwyQkFBNEIsR0FDNUIsMkJBQTRCLEdBQzVCLFlBQWEsTUFBTyxVQUFZLFlBQWMsR0FBWSxRQUMxRCxXQUFZLE1BQU8sU0FBVyxZQUFjLEdBQVksT0FDeEQsa0JBQW1CLE1BQU8sZ0JBQWtCLFlBQWMsR0FBWSxjQUN0RSxtQkFBb0IsTUFBTyxpQkFBbUIsWUFBYyxHQUFZLGVBQ3hFLFlBQWEsUUFDYixhQUFjLE1BQU8sV0FBYSxZQUFjLEdBQVksU0FDNUQsU0FBVSxLQUNWLGNBQWUsVUFDZix1QkFBd0IsbUJBQ3hCLGNBQWUsVUFDZix1QkFBd0IsbUJBQ3hCLFVBQVcsTUFDWCxTQUFVLEtBQ1YsY0FBZSxVQUNmLGlCQUFrQixNQUFPLGVBQWlCLFlBQWMsR0FBWSxhQUNwRSxpQkFBa0IsTUFBTyxlQUFpQixZQUFjLEdBQVksYUFDcEUseUJBQTBCLE1BQU8sdUJBQXlCLFlBQWMsR0FBWSxxQkFDcEYsYUFBYyxHQUNkLHNCQUF1QixHQUN2QixjQUFlLE1BQU8sWUFBYyxZQUFjLEdBQVksVUFDOUQsZUFBZ0IsTUFBTyxhQUFlLFlBQWMsR0FBWSxXQUNoRSxlQUFnQixNQUFPLGFBQWUsWUFBYyxHQUFZLFdBQ2hFLGFBQWMsU0FDZCxVQUFXLE1BQ1gsc0JBQXVCLElBQWMsR0FBVyxHQUFTLEdBQVMsR0FBRyxPQUFPLGNBQWdCLEdBQzVGLFNBQVUsTUFBTyxPQUFTLFNBQVcsS0FBTyxHQUM1QyxRQUFTLE1BQU8sTUFBUSxZQUFjLEdBQVksSUFDbEQseUJBQTBCLE1BQU8sTUFBUSxhQUFlLENBQUMsSUFBYyxDQUFDLEdBQVcsR0FBWSxHQUFTLEdBQUksT0FBTSxPQUFPLGFBQ3pILFNBQVUsS0FDVixXQUFZLE9BQ1osV0FBWSxPQUNaLGVBQWdCLFdBQ2hCLGFBQWMsU0FDZCxZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsVUFBVyxNQUFPLFFBQVUsWUFBYyxHQUFZLE1BQ3RELGVBQWdCLFdBQ2hCLG1CQUFvQixlQUNwQixZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsV0FBWSxPQUNaLFFBQVMsTUFBTyxNQUFRLFlBQWMsR0FBWSxJQUNsRCx5QkFBMEIsTUFBTyxNQUFRLGFBQWUsQ0FBQyxJQUFjLENBQUMsR0FBVyxHQUFZLEdBQVMsR0FBSSxPQUFNLE9BQU8sYUFDekgsc0JBQXVCLE1BQU8sb0JBQXNCLFlBQWMsR0FBWSxrQkFDOUUsV0FBWSxPQUNaLDRCQUE2QixJQUFjLEdBQVcsR0FBUyxHQUFHLE9BQU8sYUFBZSxHQUN4RixXQUFZLEdBQWEsT0FBUyxHQUNsQyxnQkFBaUIsR0FDakIsbUJBQW9CLEdBQ3BCLGVBQWdCLEdBQ2hCLGNBQWUsR0FDZixlQUFnQixNQUFPLGFBQWUsWUFBYyxHQUFZLFdBQ2hFLHNCQUF1QixNQUFPLG9CQUFzQixZQUFjLEdBQVksa0JBQzlFLGdCQUFpQixNQUFPLGNBQWdCLFlBQWMsR0FBWSxZQUNsRSxnQkFBaUIsTUFBTyxjQUFnQixZQUFjLEdBQVksWUFDbEUsYUFBYyxTQUNkLFlBQWEsTUFBTyxVQUFZLFlBQWMsR0FBWSxRQUMxRCxZQUFhLE1BQU8sVUFBWSxZQUFjLEdBQVksUUFDMUQsWUFBYSxNQUFPLFVBQVksWUFBYyxHQUFZLFNBRzNELEdBQUksR0FDSCxHQUFJLENBQ0gsS0FBSyxZQUNHLEVBQVAsQ0FFRyxHQUFhLEdBQVMsR0FBUyxJQUNuQyxHQUFXLHFCQUF1QixHQUQ5QixPQUtGLEdBQVMsV0FBZ0IsRUFBTSxDQUNsQyxHQUFJLEdBQ0osR0FBSSxJQUFTLGtCQUNaLEVBQVEsR0FBc0IsZ0NBQ3BCLElBQVMsc0JBQ25CLEVBQVEsR0FBc0IsMkJBQ3BCLElBQVMsMkJBQ25CLEVBQVEsR0FBc0IsaUNBQ3BCLElBQVMsbUJBQW9CLENBQ3ZDLEdBQUksR0FBSyxFQUFPLDRCQUNoQixBQUFJLEdBQ0gsR0FBUSxFQUFHLG1CQUVGLElBQVMsMkJBQTRCLENBQy9DLEdBQUksR0FBTSxFQUFPLG9CQUNqQixBQUFJLEdBQU8sSUFDVixHQUFRLEdBQVMsRUFBSSxZQUl2QixVQUFXLEdBQVEsRUFFWixHQUdKLEdBQWlCLENBQ3BCLHlCQUEwQixDQUFDLGNBQWUsYUFDMUMsbUJBQW9CLENBQUMsUUFBUyxhQUM5Qix1QkFBd0IsQ0FBQyxRQUFTLFlBQWEsV0FDL0MsdUJBQXdCLENBQUMsUUFBUyxZQUFhLFdBQy9DLG9CQUFxQixDQUFDLFFBQVMsWUFBYSxRQUM1QyxzQkFBdUIsQ0FBQyxRQUFTLFlBQWEsVUFDOUMsMkJBQTRCLENBQUMsZ0JBQWlCLGFBQzlDLG1CQUFvQixDQUFDLHlCQUEwQixhQUMvQyw0QkFBNkIsQ0FBQyx5QkFBMEIsWUFBYSxhQUNyRSxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHNCQUF1QixDQUFDLFdBQVksYUFDcEMsa0JBQW1CLENBQUMsT0FBUSxhQUM1QixtQkFBb0IsQ0FBQyxRQUFTLGFBQzlCLHVCQUF3QixDQUFDLFlBQWEsYUFDdEMsMEJBQTJCLENBQUMsZUFBZ0IsYUFDNUMsMEJBQTJCLENBQUMsZUFBZ0IsYUFDNUMsc0JBQXVCLENBQUMsV0FBWSxhQUNwQyxjQUFlLENBQUMsb0JBQXFCLGFBQ3JDLHVCQUF3QixDQUFDLG9CQUFxQixZQUFhLGFBQzNELHVCQUF3QixDQUFDLFlBQWEsYUFDdEMsd0JBQXlCLENBQUMsYUFBYyxhQUN4Qyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLGNBQWUsQ0FBQyxPQUFRLFNBQ3hCLGtCQUFtQixDQUFDLE9BQVEsYUFDNUIsaUJBQWtCLENBQUMsTUFBTyxhQUMxQixvQkFBcUIsQ0FBQyxTQUFVLGFBQ2hDLG9CQUFxQixDQUFDLFNBQVUsYUFDaEMsc0JBQXVCLENBQUMsU0FBVSxZQUFhLFlBQy9DLHFCQUFzQixDQUFDLFNBQVUsWUFBYSxXQUM5QyxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHNCQUF1QixDQUFDLFVBQVcsWUFBYSxRQUNoRCxnQkFBaUIsQ0FBQyxVQUFXLE9BQzdCLG1CQUFvQixDQUFDLFVBQVcsVUFDaEMsb0JBQXFCLENBQUMsVUFBVyxXQUNqQyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLDRCQUE2QixDQUFDLGlCQUFrQixhQUNoRCxvQkFBcUIsQ0FBQyxTQUFVLGFBQ2hDLGlCQUFrQixDQUFDLE1BQU8sYUFDMUIsK0JBQWdDLENBQUMsb0JBQXFCLGFBQ3RELG9CQUFxQixDQUFDLFNBQVUsYUFDaEMsb0JBQXFCLENBQUMsU0FBVSxhQUNoQyx5QkFBMEIsQ0FBQyxjQUFlLGFBQzFDLHdCQUF5QixDQUFDLGFBQWMsYUFDeEMsdUJBQXdCLENBQUMsWUFBYSxhQUN0Qyx3QkFBeUIsQ0FBQyxhQUFjLGFBQ3hDLCtCQUFnQyxDQUFDLG9CQUFxQixhQUN0RCx5QkFBMEIsQ0FBQyxjQUFlLGFBQzFDLHlCQUEwQixDQUFDLGNBQWUsYUFDMUMsc0JBQXVCLENBQUMsV0FBWSxhQUNwQyxxQkFBc0IsQ0FBQyxVQUFXLGFBQ2xDLHFCQUFzQixDQUFDLFVBQVcsY0FHL0IsR0FBTyxLQUNQLEdBQVMsS0FDVCxHQUFVLEdBQUssS0FBSyxTQUFTLEtBQU0sTUFBTSxVQUFVLFFBQ25ELEdBQWUsR0FBSyxLQUFLLFNBQVMsTUFBTyxNQUFNLFVBQVUsUUFDekQsR0FBVyxHQUFLLEtBQUssU0FBUyxLQUFNLE9BQU8sVUFBVSxTQUNyRCxHQUFZLEdBQUssS0FBSyxTQUFTLEtBQU0sT0FBTyxVQUFVLE9BQ3RELEdBQVEsR0FBSyxLQUFLLFNBQVMsS0FBTSxPQUFPLFVBQVUsTUFHbEQsR0FBYSxxR0FDYixHQUFlLFdBQ2YsR0FBZSxTQUFzQixFQUFRLENBQ2hELEdBQUksR0FBUSxHQUFVLEVBQVEsRUFBRyxHQUM3QixFQUFPLEdBQVUsRUFBUSxJQUM3QixHQUFJLElBQVUsS0FBTyxJQUFTLElBQzdCLEtBQU0sSUFBSSxJQUFhLGtEQUNqQixHQUFJLElBQVMsS0FBTyxJQUFVLElBQ3BDLEtBQU0sSUFBSSxJQUFhLGtEQUV4QixHQUFJLEdBQVMsR0FDYixVQUFTLEVBQVEsR0FBWSxTQUFVLEVBQU8sRUFBUSxFQUFPLEVBQVcsQ0FDdkUsRUFBTyxFQUFPLFFBQVUsRUFBUSxHQUFTLEVBQVcsR0FBYyxNQUFRLEdBQVUsSUFFOUUsR0FJSixHQUFtQixTQUEwQixFQUFNLEVBQWMsQ0FDcEUsR0FBSSxHQUFnQixFQUNoQixFQU1KLEdBTEksR0FBTyxHQUFnQixJQUMxQixHQUFRLEdBQWUsR0FDdkIsRUFBZ0IsSUFBTSxFQUFNLEdBQUssS0FHOUIsR0FBTyxHQUFZLEdBQWdCLENBQ3RDLEdBQUksR0FBUSxHQUFXLEdBSXZCLEdBSEksSUFBVSxJQUNiLEdBQVEsR0FBTyxJQUVaLE1BQU8sSUFBVSxhQUFlLENBQUMsRUFDcEMsS0FBTSxJQUFJLElBQVcsYUFBZSxFQUFPLHdEQUc1QyxNQUFPLENBQ04sTUFBTyxFQUNQLEtBQU0sRUFDTixNQUFPLEdBSVQsS0FBTSxJQUFJLElBQWEsYUFBZSxFQUFPLHFCQUc5QyxHQUFPLFFBQVUsU0FBc0IsRUFBTSxFQUFjLENBQzFELEdBQUksTUFBTyxJQUFTLFVBQVksRUFBSyxTQUFXLEVBQy9DLEtBQU0sSUFBSSxJQUFXLDZDQUV0QixHQUFJLFVBQVUsT0FBUyxHQUFLLE1BQU8sSUFBaUIsVUFDbkQsS0FBTSxJQUFJLElBQVcsNkNBR3RCLEdBQUksR0FBTSxjQUFlLEtBQVUsS0FDbEMsS0FBTSxJQUFJLElBQWEsc0ZBRXhCLEdBQUksR0FBUSxHQUFhLEdBQ3JCLEVBQW9CLEVBQU0sT0FBUyxFQUFJLEVBQU0sR0FBSyxHQUVsRCxFQUFZLEdBQWlCLElBQU0sRUFBb0IsSUFBSyxHQUM1RCxFQUFvQixFQUFVLEtBQzlCLEVBQVEsRUFBVSxNQUNsQixFQUFxQixHQUVyQixFQUFRLEVBQVUsTUFDdEIsQUFBSSxHQUNILEdBQW9CLEVBQU0sR0FDMUIsR0FBYSxFQUFPLEdBQVEsQ0FBQyxFQUFHLEdBQUksS0FHckMsT0FBUyxHQUFJLEVBQUcsRUFBUSxHQUFNLEVBQUksRUFBTSxPQUFRLEdBQUssRUFBRyxDQUN2RCxHQUFJLEdBQU8sRUFBTSxHQUNiLEVBQVEsR0FBVSxFQUFNLEVBQUcsR0FDM0IsRUFBTyxHQUFVLEVBQU0sSUFDM0IsR0FFRyxLQUFVLEtBQU8sSUFBVSxLQUFPLElBQVUsS0FDekMsSUFBUyxLQUFPLElBQVMsS0FBTyxJQUFTLE1BRTNDLElBQVUsRUFFYixLQUFNLElBQUksSUFBYSx3REFTeEIsR0FQSSxLQUFTLGVBQWlCLENBQUMsSUFDOUIsR0FBcUIsSUFHdEIsR0FBcUIsSUFBTSxFQUMzQixFQUFvQixJQUFNLEVBQW9CLElBRTFDLEdBQU8sR0FBWSxHQUN0QixFQUFRLEdBQVcsV0FDVCxHQUFTLEtBQU0sQ0FDekIsR0FBSSxDQUFFLEtBQVEsSUFBUSxDQUNyQixHQUFJLENBQUMsRUFDSixLQUFNLElBQUksSUFBVyxzQkFBd0IsRUFBTywrQ0FFckQsT0FFRCxHQUFJLElBQVUsRUFBSSxHQUFNLEVBQU0sT0FBUSxDQUNyQyxHQUFJLEdBQU8sR0FBTSxFQUFPLEdBQ3hCLEVBQVEsQ0FBQyxDQUFDLEVBU1YsQUFBSSxHQUFTLE9BQVMsSUFBUSxDQUFFLGtCQUFtQixHQUFLLEtBQ3ZELEVBQVEsRUFBSyxJQUViLEVBQVEsRUFBTSxPQUdmLEdBQVEsR0FBTyxFQUFPLEdBQ3RCLEVBQVEsRUFBTSxHQUdmLEFBQUksR0FBUyxDQUFDLEdBQ2IsSUFBVyxHQUFxQixJQUluQyxNQUFPLE1DN1ZSLHdDQUVBLEdBQUksSUFBTyxLQUNQLEdBQWUsS0FFZixHQUFTLEdBQWEsOEJBQ3RCLEdBQVEsR0FBYSw2QkFDckIsR0FBZ0IsR0FBYSxrQkFBbUIsS0FBUyxHQUFLLEtBQUssR0FBTyxJQUUxRSxHQUFRLEdBQWEsb0NBQXFDLElBQzFELEdBQWtCLEdBQWEsMEJBQTJCLElBQzFELEdBQU8sR0FBYSxjQUV4QixHQUFJLEdBQ0gsR0FBSSxDQUNILEdBQWdCLEdBQUksSUFBSyxDQUFFLE1BQU8sVUFDMUIsRUFBUCxDQUVELEdBQWtCLEtBSXBCLEdBQU8sUUFBVSxTQUFrQixFQUFrQixDQUNwRCxHQUFJLEdBQU8sR0FBYyxHQUFNLEdBQU8sV0FDdEMsR0FBSSxJQUFTLEdBQWlCLENBQzdCLEdBQUksR0FBTyxHQUFNLEVBQU0sVUFDdkIsQUFBSSxFQUFLLGNBRVIsR0FDQyxFQUNBLFNBQ0EsQ0FBRSxNQUFPLEVBQUksR0FBSyxFQUFHLEVBQWlCLE9BQVUsV0FBVSxPQUFTLE1BSXRFLE1BQU8sSUFHUixHQUFJLElBQVksVUFBcUIsQ0FDcEMsTUFBTyxJQUFjLEdBQU0sR0FBUSxZQUdwQyxBQUFJLEdBQ0gsR0FBZ0IsR0FBTyxRQUFTLFFBQVMsQ0FBRSxNQUFPLEtBRWxELEdBQU8sUUFBUSxNQUFRLEtDN0N4Qix3Q0FFQSxHQUFJLElBQWUsS0FFZixHQUFXLEtBRVgsR0FBVyxHQUFTLEdBQWEsNkJBRXJDLEdBQU8sUUFBVSxTQUE0QixFQUFNLEVBQWMsQ0FDaEUsR0FBSSxHQUFZLEdBQWEsRUFBTSxDQUFDLENBQUMsR0FDckMsTUFBSSxPQUFPLElBQWMsWUFBYyxHQUFTLEVBQU0sZUFBaUIsR0FDL0QsR0FBUyxHQUVWLEtDYlIsd0NBRUEsR0FBSSxJQUFhLEtBRWpCLEdBQU8sUUFBVSxVQUErQixDQUMvQyxNQUFPLE9BQWdCLENBQUMsQ0FBQyxPQUFPLGVDTGpDLHdDQUVBLEdBQUksSUFBWSxLQUNaLEdBQWlCLE9BQ2pCLEdBQ0EsR0FDQSxHQUNBLEdBRUosQUFBSSxJQUNILElBQU0sR0FBVSxtQ0FDaEIsR0FBUSxHQUFVLHlCQUNsQixHQUFnQixHQUVaLEdBQW1CLFVBQVksQ0FDbEMsS0FBTSxLQUVQLEdBQWlCLENBQ2hCLFNBQVUsR0FDVixRQUFTLElBR04sTUFBTyxRQUFPLGFBQWdCLFVBQ2pDLElBQWUsT0FBTyxhQUFlLEtBVGxDLE9BYUQsR0FBWSxHQUFVLDZCQUN0QixHQUFPLE9BQU8seUJBQ2QsR0FBYSxrQkFFakIsR0FBTyxRQUFVLEdBRWQsU0FBaUIsRUFBTyxDQUN6QixHQUFJLENBQUMsR0FBUyxNQUFPLElBQVUsU0FDOUIsTUFBTyxHQUdSLEdBQUksR0FBYSxHQUFLLEVBQU8sYUFDekIsRUFBMkIsR0FBYyxHQUFJLEVBQVksU0FDN0QsR0FBSSxDQUFDLEVBQ0osTUFBTyxHQUdSLEdBQUksQ0FDSCxHQUFNLEVBQU8sVUFDTCxFQUFQLENBQ0QsTUFBTyxLQUFNLEtBR2IsU0FBaUIsRUFBTyxDQUV6QixNQUFJLENBQUMsR0FBVSxNQUFPLElBQVUsVUFBWSxNQUFPLElBQVUsV0FDckQsR0FHRCxHQUFVLEtBQVcsTUN4RDlCLHdDQUVBLEdBQUksSUFBYSxLQUVqQixHQUFXLEdBQU8sUUFBVSxHQUU1QixHQUFJLElBQWMsR0FBUSxZQUFjLENBQ3RDLGFBQWMsS0FDZCxjQUFlLE9BQ2YsYUFBYyxJQUNkLGFBQWMsSUFDZCxlQUFnQixJQUNoQixPQUFRLE9BR04sR0FBVyxHQUFRLFNBQVcsQ0FDaEMsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBRUgsR0FBb0IsQ0FDdEIsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBR1AsR0FBUSxNQUFRLEdBQ2hCLFlBQWUsRUFBSyxFQUFPLEVBQVMsQ0FDbEMsRUFBVSxHQUFXLEdBQ3JCLEVBQVEsR0FBUyxHQUFRLGVBSXpCLE9BSEksR0FBUSxFQUFRLE9BQVMsRUFDekIsRUFBTSxFQUFRLEtBQU8sRUFBSSxPQUN6QixFQUFRLEVBQ0wsRUFBUSxHQUFLLENBQ2xCLEdBQUksQ0FDRixHQUFVLEVBQUksR0FBUSxTQUNmLEVBQVAsQ0FDQSxRQUFHLE1BQVEsRUFDTCxFQUVSLElBRUYsTUFBTyxHQUdULEdBQVEsV0FBYSxHQUNyQixZQUFvQixFQUFLLEVBQVcsRUFBUyxDQUMzQyxFQUFVLEdBQVcsR0FJckIsT0FISSxHQUFRLEVBQVEsT0FBUyxFQUN6QixFQUFRLEVBQ1IsRUFBUSxHQUFRLGVBQ2IsRUFBUSxFQUFJLFFBQVEsQ0FDekIsR0FBSyxHQUFRLGVBQWlCLENBQUMsRUFBTSxVQUFVLEtBQWEsR0FBUSxFQUFLLEVBQVcsR0FBUSxDQUMxRixHQUFJLEdBQU0sRUFDVixNQUFPLENBQ0wsTUFBTyxFQUNQLElBQUssRUFDTCxJQUFLLEVBQUksVUFBVSxFQUFPLElBRzlCLEdBQUksQ0FDRixHQUFVLEVBQUksR0FBUSxTQUNmLEVBQVAsQ0FDQSxRQUFHLE1BQVEsRUFDTCxFQUVSLElBRUYsR0FBSSxHQUFNLEdBQUksT0FBTSxvRUFDcEIsUUFBSSxLQUFPLHlDQUNYLEVBQUksTUFBUSxFQUNOLEVBR1IsR0FBUSxVQUFZLEdBQ3BCLFlBQW1CLEVBQVcsRUFBTyxDQUNuQyxHQUFJLEVBQVUsU0FBVyxFQUFHLENBQzFCLEdBQUksR0FBTSxHQUFJLE9BQU0sMENBQ3BCLFFBQUksS0FBTyx1QkFDWCxFQUFJLEtBQU8sdUNBQ0wsRUFFUixFQUFRLEdBQVMsR0FBUSxlQUN6QixFQUFNLEtBQU8sRUFDYixHQUFJLEdBQWEsRUFBTSxZQUNuQixFQUFXLEVBQU0sUUFBVSxFQUFNLFFBQVEsR0FBSyxHQVNsRCxPQU5JLEVBQU0sYUFDSixNQUFjLEtBQU8sR0FBYSxNQUNwQyxFQUFNLE1BQU0sTUFFZCxFQUFNLFlBQWMsSUFFZCxFQUFNLGVBQ1AsSUFBWSxhQUNmLEFBQUksSUFBYztBQUFBLEdBQ2hCLEVBQU0sTUFBTSxNQUVkLFVBQ0csSUFBWSxjQUNmLEFBQUksRUFBTSxXQUFhLEtBQU8sSUFBYyxLQUMxQyxFQUFNLE1BQU0sTUFFZCxVQUNHLElBQVksYUFDZixBQUFJLElBQWMsS0FBUSxDQUFDLEVBQU0sUUFDL0IsRUFBTSxNQUFNLE1BQ1AsQUFBSSxJQUFjLE1BQVEsQ0FBQyxFQUFNLFFBQ3RDLEVBQU0sUUFBVSxHQUVoQixFQUFNLFFBQVUsR0FFbEIsVUFDRyxJQUFZLGFBQ2YsQUFBSSxJQUFjLEtBQU8sQ0FBQyxFQUFNLFFBQzlCLEVBQU0sTUFBTSxNQUNQLEFBQUksSUFBYyxNQUFRLENBQUMsRUFBTSxRQUN0QyxFQUFNLFFBQVUsR0FFaEIsRUFBTSxRQUFVLEdBRWxCLFVBQ0csSUFBWSxlQUNmLEFBQUksSUFBYyxLQUFPLENBQUMsRUFBTSxRQUM5QixHQUFNLE1BQU0sTUFDWixFQUFNLFVBQVksSUFDYixBQUFJLElBQWMsTUFBUSxDQUFDLEVBQU0sUUFDdEMsR0FBTSxRQUFVLEdBQ2hCLEVBQU0sVUFBWSxJQUNiLEFBQUksSUFBYyxLQUFPLENBQUMsRUFBTSxRQUNyQyxFQUFNLFVBQVksR0FDYixBQUFJLElBQWMsS0FBTyxFQUFNLFVBQ3BDLEVBQU0sTUFBTSxLQUFLLEdBQVMsSUFFMUIsR0FBTSxRQUFVLEdBQ2hCLEVBQU0sVUFBWSxJQUVwQixVQUNHLElBQVksT0FDZixBQUFJLElBQWMsS0FBTyxDQUFDLEVBQU0sUUFDOUIsRUFBTSxNQUFNLE1BQ1AsQUFBSSxJQUFjLE1BQVEsQ0FBQyxFQUFNLFFBQ3RDLEVBQU0sUUFBVSxHQUVoQixFQUFNLFFBQVUsR0FFbEIsY0FFQSxHQUFJLElBQWEsSUFDZixFQUFNLE1BQU0sS0FBSyxHQUFTLFlBQ2pCLElBQWEsSUFBbUIsQ0FDekMsR0FBSSxFQUFNLFlBQWMsRUFBVyxDQUNqQyxHQUFJLEdBQU0sR0FBSSxhQUFZLHVCQUF5QixHQUNuRCxRQUFJLEtBQU8sc0NBQ0wsRUFFUixFQUFNLE1BQU0sVUFDUCxBQUFJLEtBQWEsS0FBTyxJQUFjLElBRTNDLEdBQU0sUUFBVSxFQUFNLFFBQVEsT0FBTyxHQUNyQyxFQUFNLE1BQU0sS0FBSyxHQUFZLGVBQ3hCLEFBQUksSUFBYSxLQUFPLElBQWMsSUFFM0MsR0FBTSxRQUFVLEVBQU0sUUFBUSxPQUFPLEdBQ3JDLEVBQU0sTUFBTSxLQUFLLEdBQVksZ0JBQ3hCLEFBQUksSUFBYyxLQUFPLEdBQVMsRUFBTSxTQUM3QyxHQUFNLE1BQU0sS0FBSyxHQUFZLFFBRzdCLEVBQU0sWUFBYyxJQUNmLEFBQUksSUFBYyxJQUN2QixFQUFNLE1BQU0sS0FBSyxHQUFZLGNBQ3hCLEFBQUksSUFBYyxJQUN2QixFQUFNLE1BQU0sS0FBSyxHQUFZLGNBQ3BCLElBQWMsS0FDdkIsRUFBTSxNQUFNLEtBQUssR0FBWSxnQkFFL0IsTUFFSixNQUFJLENBQUMsRUFBTSxhQUFlLENBQUMsR0FDekIsR0FBTSxRQUFVLEVBQVksRUFBTSxTQUVwQyxFQUFNLFNBQVcsRUFDVixFQUdULEdBQVEsYUFBZSxVQUFZLENBQUUsTUFBTyxJQUFJLEtBQ2hELGFBQWlCLENBQ2YsS0FBSyxNQUFRLEdBRWIsS0FBSyxZQUFjLEdBQ25CLEtBQUssUUFBVSxHQUNmLEtBQUssVUFBWSxHQUVqQixLQUFLLElBQU0sR0FDWCxLQUFLLFFBQVUsR0FDZixLQUFLLFNBQVcsR0FFbEIsR0FBTSxVQUFVLFFBQVUsVUFBWSxDQUNwQyxNQUFPLE1BQUssTUFBTSxLQUFLLE1BQU0sT0FBUyxJQUV4QyxHQUFNLFVBQVUsU0FBVyxVQUFZLENBQ3JDLE1BQ0UsTUFBSyxZQUFjLEdBQVksY0FDL0IsS0FBSyxZQUFjLEdBQVksY0FDL0IsS0FBSyxZQUFjLEdBQVksZ0JBR25DLEdBQU0sVUFBVSxVQUFZLFVBQVksQ0FDdEMsTUFBTyxNQUFLLFlBQWMsR0FBWSxjQUFnQixLQUFLLFlBQWMsR0FBWSxlQUV2RixHQUFNLFVBQVUsVUFBWSxTQUFVLEVBQU0sQ0FDMUMsTUFDRSxJQUFRLEVBQUssbUJBQ2IsS0FBSyxNQUFNLFNBQVcsR0FBSyxLQUFLLE1BQU0sS0FBTyxHQUFZLGFBSWxELEdBRUYsQ0FBQyxDQUFDLEtBQUssTUFBTSxRQUd0QixZQUFpQixFQUFLLEVBQVMsRUFBRyxDQUNoQyxNQUFJLElBQVcsR0FDTixFQUFRLEtBQUssRUFBSSxPQUFPLEdBQUssSUFFN0IsRUFBSSxPQUFPLEdBQUssRUFBRyxFQUFRLFVBQVksRUFJbEQsR0FBUSxhQUFlLEdBQ3ZCLFlBQXNCLEVBQUcsQ0FDdkIsR0FBSSxDQUFDLEVBQUcsTUFBTyxHQUNmLEdBQUksR0FBTyxFQUFFLFdBQVcsR0FFeEIsT0FBUSxPQUNELFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxTQUNBLFNBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxTQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFFBQ0EsUUFDQSxRQUNBLFNBQ0EsUUFDQSxJQUNILE1BQU8sV0FFUCxNQUFPLElBSWIsR0FBUSxVQUFZLEdBQ3BCLFlBQW1CLEVBQUksQ0FDckIsTUFBUSxLQUFPLE1BQVUsSUFBTyxNQUFVLElBQU8sTUFBVSxJQUFPLE9BQVcsSUFBTyxPQUFXLElBQU8sT0FDOUYsSUFBTyxPQUFXLElBQU8sT0FBVyxJQUFPLFFBQVksSUFBTyxRQUFZLElBQU8sUUFDakYsSUFBTyxRQUFZLElBQU8sUUFBWSxJQUFPLFFBQVksSUFBTyxTQUFhLElBQU8sU0FBYSxJQUFPLFNBQ3hHLElBQU8sU0FBYSxJQUFPLFNBQWEsSUFBTyxTQUFhLElBQU8sU0FBYSxJQUFPLFNBQ3ZGLElBQU8sVUFBYyxJQUFPLFVBQWMsSUFBTyxVQUFjLElBQU8sVUFBYyxJQUFPLFVBQzNGLElBQU8sVUFBYyxJQUFPLFdBQWUsSUFBTyxXQUFlLElBQU8sV0FBZSxJQUFPLFlBQzlGLElBQU8sWUFBZ0IsSUFBTyxZQUFnQixJQUFPLFdBQWUsSUFBTyxXQUFlLElBQU8sYUFDakcsSUFBTyxjQUFrQixJQUFPLGNBQWtCLElBQU8sYUFBaUIsSUFBTyxVQUFjLElBQU8sU0FHaEgsWUFBa0IsRUFBUyxDQU16QixNQUhBLEdBQVUsRUFBUSxRQUFRLE9BQVEsSUFHOUIsRUFBUSxLQUFPLElBQVksR0FFM0IsS0FBUSxLQUFPLEtBRWYsR0FBYSxFQUFRLEtBRXJCLFNBQVMsS0FBSyxJQUFZLEdBQVUsU0FBUyxLQUFLLEdBQVMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLFNDcFM3Rix3Q0FFQSxHQUFPLFFBQVUsR0FDakIsWUFBbUIsRUFBTSxFQUFTLEVBQVMsQ0FDekMsR0FBSSxHQUFPLEVBQVEsS0FDZixFQUFTLEVBQVEsT0FDakIsRUFBVyxFQUFRLFNBQ25CLEVBQU0sRUFBUSxJQUNkLEVBQ0EsRUFBVyxFQUFRLEdBQVMsSUFBTSxFQUFTLElBQy9DLEdBQUksR0FBTyxHQUFRLEdBQUssR0FBUSxFQUFJLE1BQU07QUFBQSxHQUFNLE9BQVEsQ0FDdEQsR0FBSSxHQUFRLEVBQUksTUFBTTtBQUFBLEdBQ2xCLEVBQVEsS0FBSyxJQUFJLEVBQU8sRUFBRyxHQUMzQixFQUFNLEtBQUssSUFBSSxFQUFNLE9BQVEsRUFBTyxHQUVwQyxFQUFVLEVBQ1gsTUFBTSxFQUFPLEdBQ2IsSUFBSSxTQUFTLEVBQU0sRUFBRyxDQUNyQixHQUFJLEdBQU8sRUFBSSxFQUFRLEVBQ25CLEVBQVksSUFBUSxFQUFPLE9BQVMsUUFBVSxFQUFPLEtBQ3JELEdBQU0sRUFBVyxFQUNyQixNQUFJLEtBQVMsR0FBUSxFQUFTLEdBQzVCLEtBQU87QUFBQSxFQUNQLElBQU8sTUFBTSxFQUFTLE9BQVMsR0FBUSxLQUFLLEtBQU8sS0FFOUMsS0FFUixLQUFLO0FBQUEsR0FDUixFQUNHLElBQVksT0FBUyxJQUFNLEVBQVc7QUFBQSxFQUFPLEVBQVU7QUFBQTtBQUFBLEVBQVMsTUFFbkUsR0FBZSxJQUFZLE9BQVMsSUFBTSxFQUFXO0FBQUE7QUFBQSxFQUFTLEVBRWhFLEdBQUksR0FBTSxHQUFJLE9BQU0sR0FDcEIsU0FBSSxLQUFPLE9BQVMsRUFDcEIsRUFBSSxJQUFNLEVBQ1YsRUFBSSxLQUFPLEVBQ1gsRUFBSSxPQUFTLEVBQ2IsRUFBSSxTQUFXLEVBQ2YsRUFBSSxJQUFNLEVBQ1YsRUFBSSxPQUFTLFVBQVcsQ0FDdEIsTUFBTyxDQUNMLEtBQU0sS0FBSyxLQUNYLElBQUssS0FBSyxJQUNWLEtBQU0sS0FBSyxLQUNYLE9BQVEsS0FBSyxPQUNiLFNBQVUsS0FBSyxXQUdaLEtDakRULHdDQUVBLEdBQUksSUFBUyxLQUNULEdBQWUsS0FDZixHQUFrQixLQUNsQixHQUFRLEtBRVosR0FBTyxRQUFVLEdBQ2pCLEdBQU8sUUFBUSxNQUFRLEdBQ3ZCLFlBQWEsRUFBSyxFQUFTLENBQ3pCLEdBQUksR0FBUSxHQUFJLElBQU0sRUFBSyxHQUMzQixNQUFPLE1BQUssTUFBTSxLQUFLLFVBQVUsRUFBTSxjQVd6QyxZQUFlLEVBQUssRUFBUyxDQUUzQixHQURBLEVBQVUsR0FBVyxHQUNqQixNQUFPLElBQVEsU0FDakIsS0FBTSxJQUFJLE9BQ1IsZ0RBQWtELE1BQU8sR0FBTSxLQUduRSxHQUFJLE1BQU8sSUFBWSxTQUNyQixLQUFNLElBQUksT0FDUiwrQ0FBaUQsTUFBTyxHQUFVLEtBSXRFLEVBQU0sRUFBSSxRQUFRLFVBQVcsSUFDN0IsS0FBSyxNQUFRLEVBQUksUUFBUSxXQUFZO0FBQUEsR0FDckMsS0FBSyxjQUFnQixLQUFLLE1BQzFCLEtBQUssU0FBVyxFQUFRLFNBQ3hCLEtBQUssYUFBZSxFQUFRLGNBQWdCLEdBQzVDLEtBQUssT0FBUyxFQUFRLGNBQWdCLEVBQ3RDLEtBQUssTUFBUSxFQUFRLGdCQUFrQixFQUN2QyxLQUFLLFFBQVUsRUFBUSxTQUFXLEdBQ2xDLEtBQUssWUFBYyxDQUFDLEdBQ3BCLEtBQUssU0FBVyxLQUVoQixLQUFLLHFCQUF1QixHQUM1QixLQUFLLGFBQWUsVUFFcEIsS0FBSyxPQUFTLEdBQ2QsS0FBSyxNQUFRLEdBT2YsR0FBTSxVQUFZLENBQ2hCLFlBQWEsR0FFYixNQUFPLFNBQVMsRUFBTSxFQUFTLENBQzdCLEdBQUksR0FBTSxHQUFNLEVBQU0sRUFBUyxDQUM3QixLQUFNLEtBQUssT0FDWCxPQUFRLEtBQUssTUFDYixTQUFVLEtBQUssU0FDZixJQUFLLEtBQUssZ0JBRVosS0FBTSxJQUdSLE9BQVEsU0FBUyxFQUFPLEVBQVMsQ0FDL0IsQUFBSyxHQUFPLEtBQUssTUFBTSxnQkFBaUIsSUFHMUMsYUFBYyxTQUFTLEVBQUssQ0FDMUIsTUFBTyxJQUFhLEVBQUssQ0FDdkIsTUFBTyxNQUlYLGlCQUFrQixTQUFTLEVBQUssRUFBUyxDQUV2QyxHQUFJLENBQ0YsWUFBSyxrQkFBa0IsZUFBZ0IsR0FDaEMsU0FDQSxFQUFQLENBQ0EsR0FBSSxFQUFTLE1BQU8sR0FHcEIsR0FBSSxDQUFDLEVBQUcsSUFBSyxLQUFNLEdBRW5CLEtBQUssY0FBYyxFQUFHLElBQUksS0FBTyxHQUNqQyxLQUFLLGdCQUFnQixFQUFHLElBQUksUUFDNUIsR0FBSSxHQUNGLGlCQUFtQixFQUFHLFFBQVEsUUFBUSxzQkFBdUIsSUFDL0QsS0FBSyxNQUFNLGVBQWdCLEtBSS9CLHFCQUFzQixTQUFTLEVBQUssQ0FHbEMsR0FBSSxHQUFNLEdBQWdCLEdBQzFCLEFBQUksRUFBSSxhQUNOLEtBQUssTUFDSCxvQkFDQSxxQ0FBdUMsRUFBTSxNQWNuRCxJQUFLLFNBQVMsRUFBTSxFQUFLLENBQ3ZCLEdBQUksR0FBTSxDQUNSLEtBQU0sRUFDTixJQUFLLENBQ0gsTUFBTyxDQUNMLEtBQU0sS0FBSyxPQUNYLE9BQVEsS0FBSyxPQUVmLFNBQVUsS0FBSyxXQUluQixNQUFJLEtBQVEsUUFBVyxHQUFJLElBQU0sR0FFMUIsR0FXVCxPQUFRLFNBQVMsRUFBSyxDQUNwQixTQUFJLElBQUksSUFBTSxDQUNaLEtBQU0sS0FBSyxPQUNYLE9BQVEsS0FBSyxPQUVSLEdBVVQsY0FBZSxTQUFTLEVBQVcsQ0FDakMsS0FBSyxRQUFVLEVBQ1gsR0FBVyxNQUFLLE1BQVEsSUFVOUIsZ0JBQWlCLFNBQVMsRUFBVyxDQUNuQyxLQUFLLE9BQVMsR0FVaEIsUUFBUyxTQUFTLEVBQUssQ0FDckIsS0FBSyxNQUFRLEtBQUssTUFBTSxPQUFPLElBWWpDLEtBQU0sU0FBUyxFQUFRLEVBQU0sQ0FDM0IsR0FBSSxHQUNKLEdBQUssRUFBVyxFQUFPLEtBQUssS0FBSyxPQUFTLENBQ3hDLEdBQUksR0FBTSxFQUFTLEdBQUcsT0FDbEIsRUFBTSxFQUFTLEdBQ2YsRUFBTyxFQUFPLEdBQU0sRUFBSSxPQUFTLEdBQ2pDLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FDekIsWUFBSyxRQUFRLEdBQ2IsS0FBSyxnQkFBZ0IsR0FDZCxJQUdYLGNBQWUsU0FBUyxFQUFRLEVBQU0sQ0FDcEMsR0FBSSxHQUNKLEdBQUssRUFBVyxFQUFPLEtBQUssS0FBSyxPQUFTLENBQ3hDLEdBQUksR0FBbUIsRUFDbkIsRUFDQSxFQUNKLEFBQUssR0FBYSxpQkFBaUIsS0FBSyxFQUFTLE1BQy9DLEdBQW1CLEVBQVcsR0FBRyxPQUNqQyxLQUFLLGdCQUFnQixJQUV2QixHQUFJLEdBQVcsS0FBSyxNQUFNLE9BQU8sRUFBUyxHQUFHLFFBQzdDLEdBQUksRUFBUyxLQUFPLElBQ2xCLFlBQUssTUFBUSxFQUNiLEVBQU0sS0FBSyxJQUFJLEVBQU0sRUFBUyxJQUM5QixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxHQUNuQyxFQUVULEdBQUksZ0JBQWdCLEtBQUssR0FDdkIsWUFBSyxNQUFRLEVBQVMsT0FBTyxVQUFVLEtBQUssR0FBVSxHQUFHLFFBQ3pELEVBQU0sS0FBSyxJQUFJLEVBQU0sRUFBUyxJQUM5QixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxHQUNuQyxJQWViLGtCQUFtQixTQUFTLEVBQU0sQ0FDaEMsRUFBTyxHQUFRLEVBQ2YsR0FBSSxHQUFRLEtBQUssTUFBTSxHQUN2QixHQUNFLElBQVUsS0FBTyxJQUFVLEtBQU8sSUFBVSxJQUM1QyxpREFFRixHQUFJLEdBQU0sR0FBZ0IsU0FBUyxHQUMvQixFQUNKLEdBQUksQ0FDRixFQUFRLEdBQWdCLFdBQVcsS0FBSyxNQUFPLEVBQUssQ0FBQyxNQUFPLEVBQU8sVUFDNUQsRUFBUCxDQUNBLEdBQUksRUFBRyxRQUFVLE9BQVcsQ0FPMUIsT0FOSSxHQUFNLEVBQUcsTUFFVCxFQUFNLEtBQUssTUFBTSxPQUFPLEdBQU0sUUFBUTtBQUFBLEdBRXRDLEVBQWMsRUFBTSxFQUNwQixFQUFNLEVBQ0gsRUFBTSxHQUFlLElBQVEsSUFDbEMsS0FBSyxjQUFjLEdBQ25CLEdBQU8sRUFBYyxFQUNyQixHQUFPLEVBQWMsRUFDckIsRUFBTSxFQUFjLEtBQUssTUFBTSxPQUFPLEdBQUssUUFBUTtBQUFBLEdBR3JELEtBQUssZ0JBQWdCLEdBRXZCLEtBQUksR0FBRyxPQUFTLHlDQUNkLEtBQUssTUFDSCxpQkFDQSx5REFDRSxFQUNBLFdBRUssRUFBRyxPQUFTLHVDQUNyQixLQUFLLE1BQU0sbUJBQW9CLEVBQUcsU0FFOUIsRUFFUixNQUFPLElBR1QsZ0JBQWlCLFVBQVcsQ0FDMUIsR0FBSSxHQUFVLEVBR2QsTUFBSSxNQUFLLFNBQ1AsRUFBVyxLQUFLLFNBQVMsS0FBSyxLQUFLLE9BSW5DLEdBQUssYUFDTCxFQUFXLEVBQUcsS0FBSyxLQUFLLE9BR3BCLEdBQVksQ0FBQyxFQUFTLEdBQUcsUUFDM0IsR0FBSyxVQUNMLEVBQVcsRUFBRyxLQUFLLEtBQUssUUFJdEIsR0FBWSxFQUFTLEdBQUcsUUFBUSxNQUFLLFNBQVcsSUFHL0MsR0FPVCxJQUFLLFVBQVcsQ0FDZCxHQUFJLE1BQUssTUFBTSxPQUNmLENBQUksS0FBSyxjQUNQLEtBQUssTUFDSCxpQkFDQSxzRUFHSixPQUFTLEdBQUksRUFBRyxLQUFLLFlBQVksR0FBSSxJQUNuQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLGFBRXhDLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLElBQUksU0FDdEMsS0FBSyxNQUFRLEdBQ04sS0FPVCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUNKLEdBQUssRUFBVyxjQUFjLEtBQUssS0FBSyxPQUN0QyxZQUFLLFFBQVEsRUFBUyxHQUFHLE9BQVMsR0FDbEMsS0FBSyxjQUFjLEdBQ1osSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUNKLEdBQUssRUFBVyxvQkFBb0IsS0FBSyxLQUFLLE9BQVMsQ0FDckQsS0FBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLFVBQVcsRUFBUyxJQUN2QyxTQUFJLE9BQVMsQUFBTyxFQUFTLElBQWhCLElBQ2IsS0FBSyxxQkFBdUIsRUFBSSxPQUNoQyxLQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEdBQ1osS0FBSyxrQkFBa0IsZ0JBQ2hCLEtBUVgsY0FBZSxVQUFXLENBQ3hCLEdBQUksT0FBTyxLQUFLLEtBQUssT0FBUSxDQUMzQixHQUFJLEdBQVEsS0FBSyxrQkFBa0IsR0FDbkMsS0FBSyxRQUFRLEVBQU0sSUFBTSxHQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLGdCQUFpQixFQUFNLEtBQzFDLEtBQUssT0FBTyxLQUFLLEdBQ2pCLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssaUJBQWlCLEVBQU0sS0FFNUIsR0FBSSxHQUFXLEVBQU0sSUFBSSxNQUFNO0FBQUEsR0FDM0IsRUFBUSxFQUFTLE9BQVMsRUFDOUIsWUFBSyxjQUFjLEdBQ25CLEtBQUssZ0JBQWdCLEVBQVMsR0FBTyxPQUFTLEdBQzlDLEtBQUssT0FBTyxHQUNMLEtBUVgsSUFBSyxVQUFXLENBQ2QsR0FBSSxHQUVKLEdBQUssRUFBVyxzQkFBc0IsS0FBSyxLQUFLLE9BQVMsQ0FDdkQsR0FBSSxHQUNGLEVBQU8sRUFBUyxHQUNoQixFQUFNLEVBQVMsR0FBRyxPQUNwQixZQUFLLFFBQVEsR0FDYixFQUFNLEtBQUssSUFBSSxNQUFPLEdBQ3RCLEtBQUssT0FBTyxLQUFLLEdBQ2pCLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxHQUNMLEtBUVgsT0FBUSxTQUFTLEVBQU0sQ0FDckIsR0FBSSxHQUFNLEtBQUssS0FBSyxjQUFlLFVBQy9CLEVBQVksR0FBUSxFQUFLLFVBQzdCLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEdBQ1osS0FBSyxrQkFBa0IsU0FDbEIsR0FDSCxNQUFLLHFCQUF1QixHQUM1QixLQUFLLGtCQUFrQixpQkFFbEIsSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFPLEtBQUssY0FBYyxxQkFBc0IsV0FDcEQsR0FBSSxFQUNGLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixJQVFYLEdBQUksVUFBVyxDQUNiLEdBQUksR0FBTSxLQUFLLEtBQUssYUFBYyxNQUNsQyxHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssR0FDakIsS0FBSyxnQkFBZ0IsRUFBSSxJQUFJLFFBQzdCLEtBQUssT0FBTyxHQUNMLEdBRVQsQUFBSSxLQUFLLEtBQUssS0FBSyxRQUNqQixLQUFLLE1BQ0gsYUFDQSxJQUNFLG1CQUFtQixLQUFLLEtBQUssTUFBTSxPQUFPLElBQUksR0FDOUMseUJBU1IsVUFBVyxVQUFXLENBQ3BCLEdBQUksR0FBTSxLQUFLLEtBQUssdUNBQXdDLFNBQzVELEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxHQUNqQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEdBQ0wsR0FFVCxBQUFJLG1CQUFtQixLQUFLLEtBQUssUUFDL0IsS0FBSyxNQUNILHFCQUNBLCtEQUdBLE1BQU0sS0FBSyxLQUFLLFFBQ2xCLEtBQUssTUFDSCxxQkFDQSxJQUNFLG1CQUFtQixLQUFLLEtBQUssTUFBTSxPQUFPLElBQUksR0FDOUMsbUlBUVIsaUJBQWtCLFVBQVcsQ0FDM0IsR0FBSSxLQUFLLGNBQWdCLEtBQUssTUFBTSxLQUFPLElBQ3pDLFlBQUssTUFBUSxLQUFLLE1BQU0sT0FBTyxHQUMvQixLQUFLLE1BQVEsR0FDTixJQUdYLFFBQVMsU0FBUyxFQUFNLEVBQU8sRUFBUSxFQUFTLENBQzlDLEdBQUksR0FDSixHQUFJLEVBQVEsSUFBVyxHQUN2QixHQUFTLEdBQVUsR0FDbkIsRUFBVSxHQUFXLEVBQ3JCLEdBQUksR0FBYSxLQUFLLGFBQWUsRUFBTSxRQUFRLEtBQU8sR0FDdEQsRUFBZSxLQUFLLHFCQUF1QixFQUFNLFFBQVEsTUFBUSxHQUNqRSxFQUFpQixLQUFLLHFCQUF1QixFQUFNLFFBQVEsUUFBVSxHQUNyRSxFQUFzQiwyQkFBMkIsS0FBSyxHQUN0RCxFQUNGLEtBQUssc0JBQXdCLEVBQ3pCLEVBQW9CLE1BQ3BCLElBTU4sR0FKSSxJQUFlLElBQUksR0FBYSxLQUNoQyxJQUFpQixJQUFJLEdBQWUsS0FDcEMsSUFBbUIsSUFBSSxHQUFpQixLQUcxQyxJQUFtQixLQUNuQixFQUFpQixHQUNqQixFQUFpQixHQUNqQixFQUFpQixFQUVqQixTQUFTLEVBQVMsRUFBTSxVQUFVLEVBQUcsR0FBa0IsS0FDaEQsS0FBSyxRQUNWLEVBQ0EsRUFBTSxVQUFVLEVBQWlCLEdBQ2pDLEVBQ0EsRUFBVSxHQUdkLEdBQ0UsSUFBaUIsS0FDakIsRUFBZSxHQUNmLEVBQWUsR0FDZixFQUFlLEVBQ2YsQ0FDQSxFQUFNLEtBQUssSUFBSSxFQUFNLEVBQVMsRUFBTSxVQUFVLEVBQUcsSUFDakQsS0FBSyxnQkFBZ0IsRUFBTyxPQUFTLEVBQWUsR0FDcEQsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEVBQU0sS0FBSyxJQUFJLDJCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixHQUFJLEdBQVEsR0FBSSxNQUFLLFlBQVksRUFBTSxPQUFPLEVBQWUsR0FBSSxDQUMvRCxTQUFVLEtBQUssU0FDZixhQUFjLEdBQ2QsYUFBYyxLQUFLLE9BQ25CLGVBQWdCLEtBQUssTUFDckIsUUFBUyxLQUFLLFVBRVosRUFDSixHQUFJLENBQ0YsRUFBZSxFQUFNLGtCQUNkLEVBQVAsQ0FDQSxLQUFJLEdBQUcsTUFBUSxRQUFRLEtBQUssRUFBRyxPQUM3QixNQUFLLE1BQVEsRUFBRyxPQUNoQixLQUFLLE1BQU0sRUFBRyxLQUFLLE9BQU8sR0FBSSxFQUFHLE1BRTdCLEVBRVIsS0FBSyxNQUFRLEVBQU0sTUFDbkIsS0FBSyxPQUFTLEtBQUssT0FBTyxPQUFPLEdBQ2pDLEVBQU0sS0FBSyxJQUFJLHlCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBTSxFQUFNLE9BQ3pCLE9BRUYsR0FDRSxJQUFlLEtBQ2YsRUFBYSxHQUNiLEVBQWEsR0FDYixFQUFhLEVBQ2IsQ0FDQSxBQUFJLEVBQVMsRUFBTSxVQUFVLEVBQUcsSUFDOUIsS0FBSyxRQUFRLEVBQU0sRUFBTSxVQUFVLEVBQUcsR0FBYSxHQUVyRCxLQUFLLE1BQVEsR0FDYixLQUFLLE1BQVEsRUFBTSxPQUFPLEVBQU0sUUFBUSxLQUFPLEdBQUssS0FBSyxNQUN6RCxPQUVGLEdBQUksSUFBd0IsSUFBVSxDQUNwQyxHQUFJLEVBQW9CLEdBQ3RCLFNBQ0UsRUFDQSxFQUFNLFVBQVUsRUFBRyxHQUNuQixFQUFvQixHQUNwQixJQUNLLEtBQUssUUFDVixFQUNBLEVBQU0sVUFBVSxFQUFzQixHQUN0QyxFQUNBLEVBQVUsR0FHZCxHQUFJLEdBQVMsRUFBTSxPQUFPLEVBQUcsR0FDN0IsQUFBSSxJQUFVLElBQ1osR0FBUyxFQUFTLEVBQ2xCLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FDckIsS0FBSyxnQkFBZ0IsRUFBTyxPQUFTLEdBQ3JDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUcvQixHQUFJLEdBQU8sRUFBb0IsR0FDM0IsRUFDSixFQUFNLEtBQUssSUFBSSxxQkFDZixLQUFLLGdCQUFnQixHQUNyQixHQUFJLENBQ0YsRUFBUSxHQUFnQixXQUFXLEVBQU0sV0FDbEMsRUFBUCxDQUlBLEdBSEksRUFBRyxRQUFVLFFBQ2YsS0FBSyxnQkFBZ0IsRUFBRyxPQUV0QixFQUFHLE9BQVMseUNBQ2QsS0FBSyxNQUNILGlCQUNBLDhFQUVPLEVBQUcsT0FBUyxzQ0FDckIsS0FBSyxNQUFNLG1CQUFvQixFQUFHLGFBRWxDLE1BQU0sR0FHVixFQUFJLFdBQWEsRUFBb0IsS0FBTyxJQUM1QyxFQUFJLE9BQVMsR0FDYixFQUFJLElBQU0sRUFBTSxJQUNoQixLQUFLLGlCQUFpQixFQUFNLEtBRTVCLEFBQUksRUFBTSxJQUFNLEVBQUksRUFBSyxPQUN2QixHQUFPLEVBQUssT0FBTyxFQUFNLElBQU0sR0FDL0IsS0FBSyxnQkFBZ0IsRUFBTSxJQUFNLEdBQ2pDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBTSxJQUVuQixNQUFLLGdCQUFnQixFQUFLLFFBQzFCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUUvQixPQUdGLEVBQVEsRUFBUyxFQUNqQixFQUFNLEtBQUssSUFBSSxFQUFNLEdBQ3JCLEtBQUssZ0JBQWdCLEVBQU0sT0FBUyxHQUNwQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFHL0IsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUNGLEtBQUssS0FBSyxzQkFBdUIsU0FDakMsS0FBSyxLQUFLLE9BQVEsU0FDbEIsS0FBSyxLQUFLLFVBQVcsUUFDdkIsR0FBSSxFQUNGLFlBQUssUUFBUSxPQUFRLEVBQUksS0FDbEIsSUFJWCxTQUFVLFVBQVcsQ0FDbkIsR0FBSSxHQUFNLEtBQUssS0FBSyxhQUFjLGFBQ2xDLEdBQUksRUFDRixZQUFLLFFBQVEsWUFBYSxFQUFJLEtBQ3ZCLElBUVgsSUFBSyxVQUFXLENBQ2QsR0FBSSxHQUNKLEdBQUssRUFBTSxLQUFLLGNBQWMsTUFBTyxPQUNuQyxZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxrQkFBa0IsZ0JBQ2hCLElBUVgsUUFBUyxVQUFXLENBQ2xCLEdBQUksR0FBTSxLQUFLLEtBQUssc0JBQXVCLFdBQzNDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDeEIsS0FBSyxrQkFBa0IsU0FDMUIsS0FBSyxNQUFNLGtCQUFtQiw0QkFFekIsR0FFVCxBQUFJLEtBQUssS0FBSyxnQkFDWixLQUFLLE1BQU0sb0JBQXFCLHNCQVFwQyxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUNKLEdBQUssRUFBVyxpQ0FBaUMsS0FBSyxLQUFLLE9BQVMsQ0FDbEUsR0FBSSxHQUFPLEVBQVMsR0FBRyxPQUNuQixFQUFVLEdBVWQsR0FUSSxFQUFLLFFBQVEsUUFBVSxJQUN6QixHQUNFLEtBQ0EsRUFDRyxNQUFNLE1BQ04sTUFBTSxHQUNOLEtBQUssTUFDVixFQUFPLEVBQUssTUFBTSxNQUFNLEdBQUcsUUFFekIsQ0FBQyxFQUFNLE9BR1gsT0FGSSxHQUFNLEtBQUssSUFBSSxRQUFTLEdBQ3hCLEVBQU0sRUFBUyxHQUFHLE9BQVMsRUFBUSxPQUNoQyxLQUFLLGFBQWEsS0FBSyxLQUFLLE1BQU0sT0FBTyxFQUFNLEtBQUssSUFDM0QsWUFBSyxnQkFBZ0IsR0FDckIsRUFBSSxLQUFPLFVBQ1gsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEtBQUssUUFBUSxFQUFTLEdBQUcsT0FBUyxFQUFRLFFBQzFDLEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQVEsT0FBUyxHQUNwRCxLQVFYLE9BQVEsVUFBVyxDQUNqQixHQUFJLEdBQ0osR0FBSyxFQUFXLGdDQUFnQyxLQUFLLEtBQUssT0FBUyxDQUNqRSxHQUFJLEdBQU8sRUFBUyxHQUFHLE9BQ25CLEVBQVUsR0FVZCxHQVRJLEVBQUssUUFBUSxRQUFVLElBQ3pCLEdBQ0UsS0FDQSxFQUNHLE1BQU0sTUFDTixNQUFNLEdBQ04sS0FBSyxNQUNWLEVBQU8sRUFBSyxNQUFNLE1BQU0sR0FBRyxRQUV6QixDQUFDLEVBQU0sT0FHWCxPQUZJLEdBQU0sS0FBSyxJQUFJLFFBQVMsR0FDeEIsRUFBTSxFQUFTLEdBQUcsT0FBUyxFQUFRLE9BQ2hDLEtBQUssYUFBYSxLQUFLLEtBQUssTUFBTSxPQUFPLEVBQU0sS0FBSyxJQUMzRCxZQUFLLGdCQUFnQixHQUNyQixFQUFJLEtBQU8sU0FDWCxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxRQUFRLEVBQVMsR0FBRyxPQUFTLEVBQVEsUUFDMUMsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLE9BQVMsRUFBUSxPQUFTLEdBQ3BELEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FDSixHQUFLLEVBQVcsbUJBQW1CLEtBQUssS0FBSyxPQUFTLENBQ3BELEdBQUksR0FBTyxFQUFTLEdBQUcsT0FDbkIsRUFBVSxHQVVkLEdBVEksRUFBSyxRQUFRLFFBQVUsSUFDekIsR0FDRSxLQUNBLEVBQ0csTUFBTSxNQUNOLE1BQU0sR0FDTixLQUFLLE1BQ1YsRUFBTyxFQUFLLE1BQU0sTUFBTSxHQUFHLFFBRXpCLENBQUMsRUFBTSxPQUdYLE9BRkksR0FBTSxLQUFLLElBQUksUUFBUyxHQUN4QixFQUFNLEVBQVMsR0FBRyxPQUFTLEVBQVEsT0FDaEMsS0FBSyxhQUFhLEtBQUssS0FBSyxNQUFNLE9BQU8sRUFBTSxLQUFLLElBQzNELFlBQUssZ0JBQWdCLEdBQ3JCLEVBQUksS0FBTyxVQUNYLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLFFBQVEsRUFBUyxHQUFHLE9BQVMsRUFBUSxRQUMxQyxLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFRLE9BQVMsR0FDcEQsS0FRWCxXQUFZLFVBQVcsQ0FDckIsR0FBSSxHQUNKLEdBQUssRUFBTSxLQUFLLGNBQWMsU0FBVSxlQUN0QyxZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsSUFRWCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUFNLEtBQUssY0FBYyxTQUFVLFNBQ3ZDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsSUFRWCxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFNLEtBQUssS0FBSyx1QkFBd0IsV0FDNUMsR0FBSSxFQUFLLENBRVAsSUFEQSxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsS0FBSyxrQkFBa0IsU0FBVSxDQUFDLFVBQVcsTUFBTyxDQUMzRCxNQUFLLE1BQUssa0JBQWtCLFNBQzFCLENBQUksV0FBVyxLQUFLLEtBQUssT0FFdkIsS0FBSyxPQUdMLEtBQUssTUFBTSxrQkFBbUIsNkJBRzNCLEdBRVQsQUFBSSxLQUFLLEtBQUssZUFDWixLQUFLLE1BQU0sb0JBQXFCLHNCQVFwQyxLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQU0sS0FBSyxjQUFjLGFBQWMsUUFDM0MsR0FBSSxHQUFRLEdBQUksSUFBTSxFQUFJLElBQUksUUFDNUIsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBUVgsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUFNLEtBQUssY0FBYyxrQkFBbUIsUUFDaEQsR0FBSSxFQUNGLFlBQUssZ0JBQWdCLENBQUMsRUFBSSxJQUFJLFFBQzlCLEtBQUssaUJBQWlCLEVBQUksS0FDMUIsS0FBSyxnQkFBZ0IsRUFBSSxJQUFJLFFBQzdCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixHQUVULEFBQUksS0FBSyxLQUFLLFlBQ1osS0FBSyxNQUFNLHFCQUFzQixnQ0FRckMsS0FBTSxVQUFXLENBQ2YsR0FBSSxHQUFNLEtBQUssY0FBYyxtQkFBb0IsUUFDakQsR0FBSSxFQUFLLENBRVAsT0FESSxHQUFTLEdBQWdCLEVBQUksS0FDMUIsRUFBTyxhQUFlLEVBQU8sWUFBWSxDQUM5QyxHQUFJLEdBQU8sYUFBYSxLQUFLLEtBQUssT0FDbEMsR0FBSSxDQUFDLEVBQU0sTUFFWCxFQUFJLEtBQU8sRUFBSyxHQUNoQixLQUFLLFFBQVEsRUFBSyxHQUFHLFFBQ3JCLEtBQUssZ0JBQWdCLEVBQUssR0FBRyxRQUM3QixFQUFTLEdBQWdCLEVBQUksS0FHL0IsWUFBSyxnQkFBZ0IsQ0FBQyxFQUFJLElBQUksUUFDOUIsS0FBSyxpQkFBaUIsRUFBSSxLQUMxQixLQUFLLGdCQUFnQixFQUFJLElBQUksUUFDN0IsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEdBRVQsQUFBSSxLQUFLLEtBQUssWUFDWixLQUFLLE1BQU0scUJBQXNCLGdDQVFyQyxRQUFTLFVBQVcsQ0FDbEIsR0FBSSxHQUFNLEtBQUssY0FBYyxXQUFZLFdBQ3pDLEdBQUksRUFDRixZQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsR0FFVCxBQUFJLEtBQUssS0FBSyxlQUNaLEtBQUssTUFDSCwwQkFDQSwwQ0FTTixLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQUssRUFBVSxFQUNuQixHQUFLLEVBQVcsMkJBQTJCLEtBQUssS0FBSyxPQUFTLENBRTVELEdBQUksRUFBUyxHQUVYLEVBQVksRUFBUyxHQUFHLE9BQ3hCLEtBQUssUUFBUSxHQUNiLEVBQU0sS0FBSyxJQUFJLE9BQVEsRUFBUyxRQUMzQixDQUVMLEdBQUksR0FBUSxLQUFLLGtCQUFrQixFQUFJLEVBQVMsR0FBRyxRQUNuRCxFQUFZLEVBQU0sSUFBTSxFQUN4QixLQUFLLFFBQVEsR0FDYixLQUFLLGlCQUFpQixFQUFNLEtBQzVCLEVBQU0sS0FBSyxJQUFJLE9BQVEsS0FBTyxFQUFNLElBQU0sS0FPNUMsR0FKQSxLQUFLLGdCQUFnQixHQUVyQixFQUFJLEtBQU8sS0FFTixFQUFXLFFBQVEsS0FBSyxLQUFLLE9BQVMsQ0FDekMsR0FBSSxHQUFRLEtBQUssa0JBQWtCLEVBQVMsR0FBRyxPQUFTLEdBQ3hELEdBQUksQ0FBQyxnQkFBZ0IsS0FBSyxFQUFNLEtBQU0sQ0FFcEMsS0FBSyxnQkFBZ0IsR0FDckIsS0FBSyxRQUFRLEVBQU0sSUFBTSxHQUN6QixFQUFJLEtBQU8sRUFBTSxJQUNqQixLQUFLLGlCQUFpQixJQUFNLEVBQUksS0FBTyxLQUN2QyxPQUFTLEdBQUksRUFBRyxHQUFLLEVBQUksS0FBSyxPQUFRLElBQ3BDLEFBQUksRUFBSSxLQUFLLEtBQU87QUFBQSxFQUNsQixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsSUFLN0IsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FDSixHQUFLLEVBQVcsb0NBQW9DLEtBQUssS0FBSyxPQUFTLENBQ3JFLEtBQUssUUFBUSxFQUFTLEdBQUcsUUFDekIsR0FBSSxHQUFNLEtBQUssSUFBSSxRQUFTLEVBQVMsSUFDckMsU0FBSSxLQUFPLEVBQVMsSUFBTSxLQUMxQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsWUFBYSxVQUFXLENBQ3RCLEdBQUksR0FDSixHQUFLLEVBQVcsc0NBQXNDLEtBQUssS0FBSyxPQUFTLENBQ3ZFLEtBQUssUUFBUSxFQUFTLEdBQUcsUUFDekIsR0FBSSxHQUFPLEVBQVMsR0FBRyxRQUFRLEtBQU0sS0FDakMsRUFBSyxFQUFTLElBQU0sRUFBUyxHQUFHLE9BRWhDLEVBQU0sS0FBSyxJQUFJLEVBQU0sR0FHekIsT0FGQSxLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFHLFFBRXJDLE9BQ0QsU0FDQSxVQUNILEtBQUssaUJBQWlCLEdBQ3RCLFVBQ0csU0FDSCxLQUFLLGlCQUFpQixHQUN0QixFQUFJLElBQU0sS0FBTyxFQUFLLElBQ3RCLEVBQUksS0FBTyxLQUNYLFVBQ0csT0FDSCxBQUFJLEdBQ0YsS0FBSyxNQUNILGlCQUNBLCtEQUdKLE1BRUosWUFBSyxnQkFBZ0IsRUFBRyxRQUN4QixLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEIsS0FRWCxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUFVLEVBQ2QsR0FBSyxFQUFXLG1CQUFtQixLQUFLLEtBQUssT0FDM0MsWUFBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixLQUFLLGlCQUFpQixFQUFTLElBQy9CLEVBQU0sS0FBSyxJQUFJLFFBQVMsRUFBUyxJQUNqQyxLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEdBRVQsQUFBSSxLQUFLLEtBQUssYUFDWixLQUFLLE1BQU0sc0JBQXVCLGlDQVF0QyxLQUFNLFVBQVcsQ0FDZixHQUFJLEdBQ0osR0FDRyxFQUFXLCtFQUErRSxLQUN6RixLQUFLLE9BRVAsQ0FDQSxLQUFLLFFBQVEsRUFBUyxHQUFHLFFBQ3pCLEdBQUksR0FBTSxLQUFLLElBQUksT0FBUSxFQUFTLElBQ3BDLFNBQUksSUFBTSxFQUFTLElBQU0sS0FDekIsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLE9BQVMsRUFBUyxHQUFHLFFBQ3RELEtBQUssaUJBQWlCLEVBQVMsSUFDL0IsRUFBSSxLQUFPLEVBQVMsR0FDcEIsS0FBSyxnQkFBZ0IsRUFBUyxHQUFHLFFBQ2pDLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixHQUVULEdBQU0sR0FBTyxVQUFVLEtBQUssS0FBSyxPQUFTLE9BQVMsTUFDbkQsQUFBSSxLQUFLLEtBQUssb0JBQ1osS0FBSyxNQUNILGlCQUNBLFNBQ0UsRUFDQSwwQkFDQSxFQUNBLHdDQUNBLEVBQ0Esb0NBSUgsR0FBVyxpRkFBaUYsS0FDM0YsS0FBSyxTQUdQLEtBQUssTUFDSCxpQkFDQSx1SEFTTixPQUFRLFVBQVcsQ0FDakIsR0FBSSxHQUNKLEdBQUssRUFBVyxtQ0FBbUMsS0FBSyxLQUFLLE9BQVMsQ0FDcEUsS0FBSyxRQUFRLEVBQVMsR0FBRyxRQUN6QixHQUFJLEdBQU0sS0FBSyxJQUFJLFNBQVUsRUFBUyxJQUN0QyxTQUFJLE1BQVEsRUFBUyxHQUNyQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsT0FBUyxFQUFTLEdBQUcsUUFDdEQsS0FBSyxpQkFBaUIsRUFBUyxJQUMvQixFQUFJLEtBQU8sRUFBUyxHQUNwQixLQUFLLGdCQUFnQixFQUFTLEdBQUcsUUFDakMsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBSXpCLHFCQUFxQixLQUFLLEVBQUksTUFBTSxTQUNwQyxtREFBbUQsS0FDakQsRUFBSSxNQUFNLFNBSWQsS0FBSyxNQUNILHlCQUNBLGtKQUlHLEdBRVQsQUFDRyxHQUFXLGlGQUFpRixLQUMzRixLQUFLLFNBR1AsS0FBSyxNQUNILGlCQUNBLGlIQVNOLEtBQU0sVUFBVyxDQUNmLEdBQUksR0FDSixHQUFLLEVBQVcseUJBQXlCLEtBQUssS0FBSyxPQUFTLENBQzFELEdBQUksR0FBUSxFQUFTLEdBQ2pCLEVBQU8sRUFBUyxHQUNoQixFQUFZLEVBQ2hCLEdBQUksS0FBSyxhQUFjLENBQ3JCLEdBQUksR0FDSixHQUFJLENBQ0YsRUFBUyxHQUFnQixXQUFXLEVBQU0sV0FDbkMsRUFBUCxDQUlBLEdBSEksRUFBSSxRQUFVLFFBQ2hCLEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQUssT0FBUyxFQUFJLE9BRTFELEVBQUksT0FBUyx5Q0FDZixLQUFLLE1BQ0gsaUJBQ0EsOEVBRU8sRUFBSSxPQUFTLHNDQUN0QixLQUFLLE1BQU0sbUJBQW9CLEVBQUksYUFFbkMsTUFBTSxHQUdWLEVBQVksRUFBSyxPQUFTLEVBQU8sSUFDakMsRUFBTyxFQUFPLElBRWhCLEdBQUksR0FBVyxFQUFTLEdBQUcsT0FBUyxFQUNwQyxLQUFLLFFBQVEsR0FDYixHQUFJLEdBQU0sS0FBSyxJQUFJLE9BQVEsR0FDM0IsU0FBSSxXQUFhLEVBQU0sT0FBTyxLQUFPLElBQ3JDLEVBQUksT0FBUyxFQUFNLE9BQU8sS0FBTyxLQUFPLEVBQU0sT0FBTyxLQUFPLElBZTVELEtBQUssZ0JBQWdCLEVBQVMsR0FBRyxPQUFTLEVBQVMsR0FBRyxRQUNsRCxFQUFJLFFBQVEsS0FBSyxpQkFBaUIsR0FDdEMsS0FBSyxPQUFPLEtBQUssR0FhakIsS0FBSyxnQkFBZ0IsRUFBSyxRQUMxQixLQUFLLE9BQU8sR0FDTCxLQU9YLFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQ0osR0FBSyxFQUFNLEtBQUssY0FBYyxLQUFNLGFBQ2xDLFlBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUM3QixLQUFLLHFCQUF1QixHQUM1QixLQUFLLGtCQUFrQixnQkFDaEIsSUFPWCxVQUFXLFNBQVMsRUFBSyxDQUN2QixHQUFJLEdBQVEsR0FDUixFQUFVLE9BQ1YsRUFBTSxHQUNOLEVBR0osSUFBSyxFQUFJLEVBQUcsRUFBSSxFQUFJLFFBQ2IsS0FBSyxhQUFhLEtBQUssRUFBSSxJQUROLElBRTFCLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsR0FBSSxJQUFNLEVBQUksT0FDWixNQUFPLEdBR1QsR0FBSSxHQUFNLEtBQUssSUFBSSxhQVVuQixJQVBJLEVBQVEsS0FBSyxFQUFJLEtBQ25CLEdBQVEsRUFBSSxHQUNaLEtBQUssZ0JBQWdCLEdBQ3JCLEtBSUssRUFBSSxFQUFJLE9BQVEsSUFBSyxDQUMxQixHQUFJLEdBQ0YsR0FBSSxFQUFJLEtBQU8sRUFBTyxDQUNwQixLQUFLLGdCQUFnQixHQUNyQixJQUNBLGVBSUEsS0FBSyxhQUFhLEtBQUssRUFBSSxLQUMzQixFQUFJLEtBQU8sS0FDWCxFQUFJLEtBQU8sS0FDWCxFQUFJLEtBQU8sSUFFWCxNQUlKLEdBQU8sRUFBSSxHQUVYLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsRUFBSSxLQUFPLEVBRVgsR0FBSSxHQUFnQixLQUFLLGVBQWUsRUFBSSxPQUFPLElBZW5ELElBYkEsQUFBSSxFQUFjLElBQ2hCLEdBQUksSUFBTSxFQUFjLElBQ3hCLEVBQUksV0FBYSxFQUFjLFlBRy9CLEdBQUksSUFBTSxHQUNWLEVBQUksV0FBYSxJQUduQixFQUFNLEVBQWMsZ0JBRXBCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUV4QixFQUFJLEVBQUcsRUFBSSxFQUFJLFFBQ2IsS0FBSyxhQUFhLEtBQUssRUFBSSxJQUROLElBSTFCLEFBQUksRUFBSSxLQUFPO0FBQUEsRUFDYixLQUFLLGNBQWMsR0FFbkIsS0FBSyxnQkFBZ0IsR0FJekIsTUFBSSxHQUFJLEtBQU8sS0FDYixNQUFLLGdCQUFnQixHQUNyQixLQUdLLEVBQUksT0FBTyxJQU1wQixlQUFnQixTQUFTLEVBQUssQ0FDNUIsR0FBSSxHQUFVLE9BQ1YsRUFBTSxHQUNOLEVBQU0sRUFBRyxFQUNULEVBQWEsR0FDYixFQUFRLEdBQWdCLGVBQ3hCLEVBQU0sS0FBSyxNQUNYLEVBQU8sS0FBSyxPQUdoQixJQUFLLEVBQUksRUFBRyxFQUFJLEVBQUksUUFDYixLQUFLLGFBQWEsS0FBSyxFQUFJLElBRE4sSUFFMUIsQUFBSSxFQUFJLEtBQU87QUFBQSxFQUNiLEtBQ0EsRUFBTSxHQUVOLElBSUosR0FBSSxJQUFNLEVBQUksT0FDWixNQUFPLENBQUMsZ0JBQWlCLEdBYzNCLEdBWEksRUFBSSxLQUFPLEtBQ2IsR0FBYSxHQUNiLElBQ0EsSUFDSSxFQUFJLEtBQU8sS0FDYixLQUFLLE1BQ0gsd0JBQ0Esd0JBQTBCLEVBQUksR0FBSyxrQkFJckMsRUFBSSxLQUFPLElBRWIsR0FBSSxJQUFNLEdBQUssR0FBTyxDQUFDLEtBQUssYUFBYSxLQUFLLEVBQUksS0FBTyxFQUFJLEtBQU8sSUFDbEUsS0FBSyxNQUNILHdCQUNBLHdCQUEwQixFQUFJLEdBQUsscUJBR3JDLE9BQU8sQ0FBQyxnQkFBaUIsR0FTN0IsSUFMQSxLQUFLLE9BQVMsRUFDZCxLQUFLLE1BQVEsRUFBTSxFQUNuQixJQUdPLEVBQUksRUFBSSxRQUNSLEtBQUssYUFBYSxLQUFLLEVBQUksSUFEWCxJQUVyQixBQUFJLEVBQUksS0FBTztBQUFBLEVBQ2IsS0FBSyxjQUFjLEdBRW5CLEtBQUssZ0JBQWdCLEdBUXpCLElBSkEsRUFBTyxLQUFLLE9BQ1osRUFBTSxLQUFLLE1BR0osRUFBSSxFQUFJLE9BQVEsSUFBSyxDQUUxQixHQUFJLENBQUUsR0FBTSxhQUFlLEVBQU0sWUFBYSxDQUM1QyxHQUFJLEtBQUssYUFBYSxLQUFLLEVBQUksSUFBSyxDQUlsQyxJQUhBLEVBQU8sR0FHRixFQUFJLEVBQUcsRUFBSSxFQUFJLE9BQVEsSUFDMUIsR0FBSSxDQUFDLEtBQUssYUFBYSxLQUFLLEVBQUksSUFBSyxDQUduQyxHQUFNLEdBQWtCLENBQUMsR0FBZ0IsYUFBYSxFQUFJLElBQ3BELEVBQVUsRUFBUSxLQUFLLEVBQUksSUFDM0IsRUFBVSxFQUFJLEtBQU8sSUFDckIsRUFDSixFQUFJLEdBQUssRUFBSSxFQUFJLEdBQUssRUFBSSxFQUFJLEtBQU8sTUFDdkMsQUFDRyxJQUFtQixHQUFXLEdBQVcsSUFDMUMsS0FBSyxpQkFBaUIsRUFBSyxLQUUzQixHQUFPLElBRVQsTUFNSixHQUFJLEdBQVEsSUFBTSxFQUFJLE9BQ3BCLE1BTUosR0FBSSxFQUFJLEtBQU8sS0FBTyxLQUFLLGlCQUFpQixFQUFLLElBQy9DLE1BSUosRUFBUSxHQUFnQixVQUFVLEVBQUksR0FBSSxHQUMxQyxHQUFPLEVBQUksR0FFWCxBQUFJLEVBQUksS0FBTztBQUFBLEVBQ2IsS0FDQSxFQUFNLEdBRU4sSUFJSixZQUFLLGlCQUFpQixHQUV0QixLQUFLLE9BQVMsRUFDZCxLQUFLLE1BQVEsRUFFTixDQUFDLElBQUssRUFBSyxXQUFZLEVBQVksZ0JBQWlCLEVBQUksT0FBTyxLQU94RSxNQUFPLFVBQVcsQ0FDaEIsR0FBSSxHQUVKLEdBQUksQUFBTyxLQUFLLE1BQU0sT0FBTyxJQUF6QixJQUE2QixDQUMvQixFQUFNLEtBQUssSUFBSSxvQkFDZixHQUFJLEdBQVEsS0FBSyxvQkFBb0IsSUFDakMsRUFBTSxLQUFLLE1BQU0sT0FBTyxFQUFHLEVBQVEsR0FPdkMsSUFMQSxLQUFLLGdCQUFnQixHQUNyQixLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDN0IsS0FBSyxxQkFBcUIsR0FDMUIsS0FBSyxRQUFRLEVBQVEsR0FFZCxHQUNMLEVBQU0sS0FBSyxVQUFVLEdBR3ZCLFNBQU0sS0FBSyxJQUFJLGtCQUNmLEtBQUssZ0JBQWdCLEdBQ3JCLEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxJQUN0QixLQU9YLGdCQUFpQixVQUFXLENBQzFCLEdBQUksaUJBQWlCLEtBQUssS0FBSyxPQUFRLENBQ3JDLEdBQUksR0FBVyxHQUNmLEtBQUssUUFBUSxHQUNiLEdBQUksR0FBTSxLQUFLLElBQUksZUFDbkIsS0FBSyxnQkFBZ0IsR0FDckIsR0FBSSxHQUFPLEtBQUssb0JBQ2hCLFNBQVcsRUFBSyxJQUFNLEVBQ3RCLEtBQUssUUFBUSxHQUNiLEVBQUksSUFBTSxFQUFLLElBQ2YsS0FBSyxnQkFBZ0IsR0FDckIsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLEtBUVgsT0FBUSxVQUFXLENBQ2pCLEdBQUksR0FBVyxLQUFLLGtCQUNoQixFQUVKLEdBQUksRUFBVSxDQUNaLEdBQUksR0FBVSxFQUFTLEdBQUcsT0FhMUIsR0FYQSxLQUFLLGNBQWMsR0FDbkIsS0FBSyxRQUFRLEVBQVUsR0FFbkIsQ0FBTyxLQUFLLE1BQU0sSUFBbEIsS0FBd0IsQUFBUSxLQUFLLE1BQU0sSUFBbkIsTUFDMUIsS0FBSyxNQUNILHNCQUNBLGdFQUtBLEFBQVEsS0FBSyxNQUFNLElBQW5CO0FBQUEsRUFDRixZQUFLLHFCQUF1QixHQUNyQixLQUFLLE9BQU8sS0FBSyxJQUFJLFlBSTlCLEdBQUksRUFBVSxLQUFLLFlBQVksR0FBSSxDQUVqQyxPQURJLEdBQWdCLEVBQ2IsS0FBSyxZQUFZLEdBQUssR0FDM0IsQUFBSSxLQUFLLFlBQVksR0FBSyxHQUN4QixLQUFLLE1BQ0gsMkJBQ0EsOENBQ0UsS0FBSyxZQUFZLEdBQ2pCLE9BQ0EsS0FBSyxZQUFZLEdBQ2pCLGlCQUdOLElBQ0EsS0FBSyxZQUFZLFFBRW5CLEtBQU8sS0FDTCxLQUFLLE1BQVEsRUFDYixFQUFNLEtBQUssSUFBSSxXQUNmLEtBQUssTUFBUSxLQUFLLFlBQVksR0FBSyxFQUNuQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sUUFHMUIsQUFBSSxJQUFXLEdBQVcsS0FBSyxZQUFZLEdBQ2hELEdBQU0sS0FBSyxJQUFJLFNBQVUsR0FDekIsS0FBSyxNQUFRLEVBQUksRUFDakIsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQzdCLEtBQUssWUFBWSxRQUFRLElBR3pCLEdBQU0sS0FBSyxJQUFJLFdBQ2YsS0FBSyxNQUFRLEVBQUksS0FBSyxJQUFJLEtBQUssWUFBWSxJQUFNLEVBQUcsR0FDcEQsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLEtBRy9CLFlBQUsscUJBQXVCLEdBQ3JCLEtBSVgsYUFBYyxXQUFzQixFQUFTLENBQzNDLEtBQU8sS0FBSyxrQkFBa0IsVUFBUyxDQUV2QyxHQUFJLEdBQVcsS0FBSyxrQkFHcEIsR0FEQSxFQUFVLEdBQVksR0FBWSxFQUFTLEdBQUcsT0FDMUMsRUFBVSxLQUFLLFlBQVksR0FBSSxDQUNqQyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLHlCQUN0QyxHQUFJLEdBQVMsR0FDVCxFQUFlLEdBQ2YsRUFHQSxFQUFZLEVBQ2hCLEVBQUcsQ0FFRCxHQUFJLEdBQUksS0FBSyxNQUFNLE9BQU8sRUFBWSxHQUFHLFFBQVE7QUFBQSxHQUNqRCxBQUFJLEFBQU0sR0FBTixJQUFTLEdBQUksS0FBSyxNQUFNLE9BQVMsRUFBWSxHQUNqRCxHQUFJLEdBQU0sS0FBSyxNQUFNLE9BQU8sRUFBWSxFQUFHLEdBQ3ZDLEVBQWUsS0FBSyxTQUFTLEtBQUs7QUFBQSxFQUFPLEdBQ3pDLEVBQWMsR0FBZ0IsRUFBYSxHQUFHLE9BSWxELEdBSEEsRUFBVSxHQUFlLEVBQ3pCLEVBQWEsS0FBSyxHQUNsQixFQUFVLEdBQVcsQ0FBQyxFQUFJLE9BQ3RCLEVBRUYsR0FBYSxFQUFJLE9BQVMsRUFDMUIsRUFBTyxLQUFLLEVBQUksT0FBTyxZQUNkLEVBQWMsS0FBSyxZQUFZLEdBR3hDLFlBQUssT0FBTyxNQUNMLEVBQWEsS0FBSyxLQUFNLEVBQWEsR0FBRyxjQUUxQyxLQUFLLE1BQU0sT0FBUyxHQUFhLEdBRTFDLElBREEsS0FBSyxRQUFRLEdBQ04sS0FBSyxNQUFNLFNBQVcsR0FBSyxFQUFPLEVBQU8sT0FBUyxLQUFPLElBQzlELEVBQU8sTUFDVCxTQUFPLFFBQ0wsU0FBUyxFQUFPLEVBQUcsQ0FDakIsR0FBSSxHQUNKLEtBQUssY0FBYyxHQUNmLElBQU0sR0FBRyxHQUFNLEtBQUssSUFBSSxZQUN4QixFQUFhLElBQUksS0FBSyxnQkFBZ0IsR0FDdEMsR0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sSUFDdEMsS0FBSyxRQUFRLE9BQVEsSUFDckIsS0FBSyxPQUVULEtBQUssT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLElBQUksdUJBQy9CLEtBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FBTSxLQUFLLEtBQUssTUFBTyxTQUMzQixHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBUVgsTUFBTyxVQUFXLENBQ2hCLEdBQUksR0FBTSxLQUFLLEtBQUssT0FBUSxLQUM1QixHQUFJLEVBQ0YsWUFBSyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQ3RCLElBSVgsS0FBTSxVQUFXLENBQ2YsS0FBSyxNQUNILGtCQUNBLG9CQUFzQixLQUFLLE1BQU0sT0FBTyxFQUFHLEdBQUssTUFJcEQsa0JBQW1CLFNBQVMsRUFBTSxDQUVoQyxPQURJLEdBQU8sR0FDRixFQUFJLEVBQUcsRUFBSSxVQUFVLE9BQVEsSUFDcEMsRUFBSyxLQUFLLFVBQVUsSUFHdEIsT0FESSxHQUFhLENBQUMsTUFBTSxPQUFPLEdBQ3RCLEVBQUksRUFBRyxFQUFJLEtBQUssUUFBUSxPQUFRLElBQUssQ0FDNUMsR0FBSSxHQUFTLEtBQUssUUFBUSxHQUMxQixHQUFJLEVBQU8sSUFBUyxFQUFPLEdBQU0sTUFBTSxFQUFRLEdBQzdDLE1BQU8sR0FHWCxNQUFPLE1BQUssR0FBTSxNQUFNLEtBQU0sSUFTaEMsUUFBUyxVQUFXLENBQ2xCLE1BQ0UsTUFBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IscUJBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssa0JBQWtCLFlBQ3ZCLEtBQUssa0JBQWtCLGtCQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixXQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixVQUN2QixLQUFLLGtCQUFrQixlQUN2QixLQUFLLGtCQUFrQixZQUN2QixLQUFLLGtCQUFrQixVQUN2QixLQUFLLGtCQUFrQixTQUN2QixLQUFLLGtCQUFrQixnQkFDdkIsS0FBSyxrQkFBa0IsV0FDdkIsS0FBSyxrQkFBa0IsU0FDdkIsS0FBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IsV0FDdkIsS0FBSyxrQkFBa0IsY0FDdkIsS0FBSyxrQkFBa0IsU0FDdkIsS0FBSyxrQkFBa0IsT0FDdkIsS0FBSyxrQkFBa0IsUUFDdkIsS0FBSyxrQkFBa0IsY0FDdkIsS0FBSyxrQkFBa0IsVUFDdkIsS0FBSyxrQkFBa0Isb0JBQ3ZCLEtBQUssa0JBQWtCLFdBQ3ZCLEtBQUssa0JBQWtCLFNBQ3ZCLEtBQUssa0JBQWtCLGFBQ3ZCLEtBQUssa0JBQWtCLFlBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssa0JBQWtCLFVBQ3ZCLEtBQUssUUFVVCxVQUFXLFVBQVcsQ0FDcEIsS0FBTyxDQUFDLEtBQUssT0FDWCxLQUFLLGtCQUFrQixXQUV6QixNQUFPLE1BQUssV0MzcURoQix3Q0FFQSxHQUFJLElBQVEsS0FFWixHQUFPLFFBQVUsR0FFakIsWUFBeUIsRUFBTSxFQUFVLEVBQVUsRUFBTSxDQUN2RCxHQUFJLEdBQU0sSUFBTSxFQUFPLHNCQUF3QixFQUMvQyxLQUFNLElBQU0sbUJBQW9CLEVBQUssQ0FBQyxTQUFVLEVBQVUsS0FBTSxJQUdsRSxZQUF1QixFQUFPLEVBQVMsQ0FDckMsRUFBVSxHQUFXLEdBR3JCLEdBQUksR0FBa0IsRUFBUSxrQkFBb0IsR0FDOUMsRUFBZ0IsRUFBUSxnQkFBa0IsR0FDMUMsRUFBVyxFQUFRLFNBRW5CLEVBQU0sR0FHTixFQUFZLEdBR1osRUFBaUIsR0FFckIsTUFBTyxHQUFNLE9BQU8sU0FBUyxFQUFLLENBQ2hDLE9BQVEsRUFBSSxVQUNMLFVBQ0gsR0FBSSxFQUNGLEdBQ0UsVUFDQSx1QkFDQSxFQUNBLEVBQUksVUFHTixVQUFZLEVBQUksT0FBUyxFQUFnQixFQUNsQyxDQUFDLE1BRVAsc0JBQ0gsTUFBSyxHQUNELElBQ0YsR0FDRSxzQkFDQSxnQ0FDQSxFQUNBLEVBQUksTUFHUixFQUFpQixHQUNWLElBVmdCLE9BV3BCLG9CQUNILE1BQUssR0FDQSxJQUNILEdBQ0Usb0JBQ0EsNEJBQ0EsRUFDQSxFQUFJLE1BR1IsRUFBaUIsR0FDakIsRUFBWSxHQUNMLElBWGdCLE9BY3BCLE9BQ0gsTUFBTyxDQUFDLFVBRVIsTUFBSSxHQUF1QixHQUMzQixHQUFZLEdBQ0wsVUN6RWYsd0NBRUEsR0FBTyxRQUFVLEdBQ2pCLFlBQXFCLEVBQVEsQ0FDM0IsR0FBSSxDQUFDLE1BQU0sUUFBUSxHQUNqQixLQUFNLElBQUksV0FBVSxxREFFdEIsS0FBSyxRQUFVLEVBRWpCLEdBQVksVUFBVSxVQUFZLFNBQVUsRUFBTyxDQUNqRCxHQUFJLEtBQUssUUFBUSxRQUFVLEVBQ3pCLEtBQU0sSUFBSSxPQUFNLHdDQUVsQixNQUFPLE1BQUssUUFBUSxJQUV0QixHQUFZLFVBQVUsS0FBTyxVQUFZLENBQ3ZDLEdBQUksS0FBSyxRQUFRLFNBQVcsRUFDMUIsS0FBTSxJQUFJLE9BQU0sd0NBRWxCLE1BQU8sTUFBSyxRQUFRLElBRXRCLEdBQVksVUFBVSxRQUFVLFVBQVksQ0FDMUMsR0FBSSxLQUFLLFFBQVEsU0FBVyxFQUMxQixLQUFNLElBQUksT0FBTSx3Q0FFbEIsTUFBTyxNQUFLLFFBQVEsU0FFdEIsR0FBWSxVQUFVLE1BQVEsU0FBVSxFQUFPLENBQzdDLEtBQUssUUFBUSxRQUFRLE1DNUJ2Qix3Q0FFQSxHQUFPLFFBQVUsQ0FDZixJQUNBLE9BQ0EsVUFDQSxJQUNBLEtBQ0EsT0FDQSxLQUNBLE9BQ0EsSUFDQSxNQUNBLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsUUFDQSxPQUNBLFNBQ0EsTUFDQSxTQ3JCRix3Q0FFQSxHQUFJLElBQVMsS0FDVCxHQUFjLEtBQ2QsR0FBUSxLQUNSLEdBQWEsS0FFakIsR0FBTyxRQUFVLEdBQ2pCLEdBQU8sUUFBUSxPQUFTLEdBQ3hCLFlBQWUsRUFBUSxFQUFTLENBQzlCLEdBQUksR0FBUyxHQUFJLElBQU8sRUFBUSxHQUM1QixFQUFNLEVBQU8sUUFDakIsTUFBTyxNQUFLLE1BQU0sS0FBSyxVQUFVLElBWW5DLFlBQWdCLEVBQVEsRUFBUyxDQUUvQixHQURBLEVBQVUsR0FBVyxHQUNqQixDQUFDLE1BQU0sUUFBUSxHQUNqQixLQUFNLElBQUksT0FDUiwyQ0FBNkMsTUFBTyxHQUFTLEtBR2pFLEdBQUksTUFBTyxJQUFZLFNBQ3JCLEtBQU0sSUFBSSxPQUNSLCtDQUFpRCxNQUFPLEdBQVUsS0FHdEUsS0FBSyxPQUFTLEdBQUksSUFBWSxHQUM5QixLQUFLLFNBQVcsRUFBUSxTQUN4QixLQUFLLElBQU0sRUFBUSxJQUNuQixLQUFLLFFBQVUsRUFDZixLQUFLLFFBQVUsRUFBUSxTQUFXLEdBT3BDLEdBQU8sVUFBWSxDQUtqQixZQUFhLEdBRWIsTUFBTyxTQUFTLEVBQU0sRUFBUyxFQUFPLENBQ3BDLEdBQUksR0FBTSxHQUFNLEVBQU0sRUFBUyxDQUM3QixLQUFNLEVBQU0sSUFBSSxNQUFNLEtBQ3RCLE9BQVEsRUFBTSxJQUFJLE1BQU0sT0FDeEIsU0FBVSxLQUFLLFNBQ2YsSUFBSyxLQUFLLE1BRVosS0FBTSxJQVVSLFFBQVMsVUFBVyxDQUNsQixNQUFPLE1BQUssT0FBTyxXQVVyQixLQUFNLFVBQVcsQ0FDZixNQUFPLE1BQUssT0FBTyxRQVdyQixVQUFXLFNBQVMsRUFBRyxDQUNyQixNQUFPLE1BQUssT0FBTyxVQUFVLElBVS9CLE1BQU8sVUFBVyxDQUdoQixPQUZJLEdBQVEsS0FBSyxXQUFXLEdBRXJCLEFBQVMsS0FBSyxPQUFPLE1BQXJCLE9BQ0wsR0FBSSxBQUFhLEtBQUssT0FBTyxNQUF6QixVQUNGLEtBQUssa0JBQ0ksQUFBZSxLQUFLLE9BQU8sTUFBM0IsWUFDVCxFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sS0FBSyxxQkFDakMsQ0FDTCxHQUFJLEdBQU8sS0FBSyxZQUNoQixBQUFJLEdBQ0YsQ0FBSSxFQUFLLE9BQVMsUUFDaEIsRUFBTSxNQUFRLEVBQU0sTUFBTSxPQUFPLEVBQUssT0FFdEMsRUFBTSxNQUFNLEtBQUssSUFNekIsTUFBTyxJQVVULE9BQVEsU0FBUyxFQUFNLENBQ3JCLEdBQUksS0FBSyxPQUFPLE9BQVMsRUFDdkIsTUFBTyxNQUFLLFVBRVosS0FBSyxNQUNILGdCQUNBLGFBQWUsRUFBTyxlQUFpQixLQUFLLE9BQU8sS0FBTyxJQUMxRCxLQUFLLFNBWVgsT0FBUSxTQUFTLEVBQU0sQ0FDckIsR0FBSSxLQUFLLE9BQU8sT0FBUyxFQUN2QixNQUFPLE1BQUssV0FJaEIsVUFBVyxTQUFTLEVBQU0sRUFBTyxDQUUvQixHQUFLLEdBQU8sS0FBTyxFQUFNLEtBQU0sSUFBSSxPQUFNLDRCQUV6QyxHQUFJLENBQUMsTUFBTSxRQUFRLEdBQVEsS0FBTSxJQUFJLE9BQU0sMkJBQzNDLE1BQU8sQ0FDTCxLQUFNLFFBQ04sTUFBTyxFQUNQLEtBQU0sRUFDTixTQUFVLEtBQUssV0FJbkIsV0FBWSxTQUFTLEVBQU0sQ0FDekIsTUFBTyxNQUFLLFVBQVUsRUFBTSxLQUc5QixVQUFXLFNBQVMsRUFBUyxFQUFLLENBRWhDLE9BREksR0FBTyxDQUFDLE1BQ0gsRUFBSSxFQUFHLEVBQUksVUFBVSxPQUFRLElBQ3BDLEVBQUssS0FBSyxVQUFVLElBR3RCLE9BREksR0FDSyxFQUFJLEVBQUcsRUFBSSxLQUFLLFFBQVEsT0FBUSxJQUFLLENBQzVDLEdBQUksR0FBUyxLQUFLLFFBQVEsR0FDMUIsR0FBSSxFQUFPLElBQVksRUFBTyxHQUFTLEVBQUksTUFBTyxDQUNoRCxHQUFJLEVBQ0YsS0FBTSxJQUFJLE9BQ1IsOENBQ0UsS0FBSyxVQUFVLEdBQ2YsZ0JBQ0EsS0FBSyxVQUFVLEVBQUksT0FFekIsRUFBZ0IsRUFBTyxJQUczQixHQUFJLEVBQ0YsTUFBTyxHQUFjLEVBQUksTUFBTSxNQUFNLEVBQWUsSUFxQnhELFVBQVcsVUFBVyxDQUNwQixPQUFRLEtBQUssT0FBTyxVQUNiLE1BQ0gsTUFBTyxNQUFLLGVBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsY0FDSCxNQUFPLE1BQUssc0JBQ1QsT0FDSCxNQUFPLE1BQUssZ0JBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsU0FDSCxNQUFPLE1BQUssa0JBQ1QsVUFDSCxNQUFPLE1BQUssbUJBQ1QsV0FDQSx3QkFDQSwwQkFDSCxNQUFPLE1BQUssVUFBVSxDQUFDLE1BQU8sU0FDM0IsWUFDSCxNQUFPLE1BQUssVUFBVSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQU0sS0FBSyxxQkFDcEQsTUFDSCxNQUFPLE1BQUssZUFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxTQUNILE1BQU8sTUFBSyxrQkFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxZQUNILE1BQU8sTUFBSyxxQkFDVCxLQUNILE1BQU8sTUFBSyx1QkFDVCxRQUNILE1BQU8sTUFBSyxpQkFDVCxPQUNILE1BQU8sTUFBSyxnQkFDVCxnQkFDSCxNQUFPLE1BQUsseUJBQ1QsUUFDSCxNQUFPLE1BQUssaUJBQ1QsU0FDQSxRQUNILEdBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxNQUFPLFNBQzVCLFlBQUssT0FBTyxNQUFNLENBQ2hCLEtBQU0sTUFDTixJQUFLLE1BQ0wsSUFBSyxLQUFLLE9BQU8sSUFDakIsU0FBVSxLQUFLLFdBRVYsS0FBSyxvQkFFWixHQUFJLEdBQWUsS0FBSyxVQUFVLG1CQUFvQixLQUFLLFFBQzNELEdBQUksRUFBYyxNQUFPLEdBQ3pCLEtBQUssTUFDSCxnQkFDQSxxQkFBdUIsS0FBSyxPQUFPLEtBQU8sSUFDMUMsS0FBSyxVQUtiLFNBQVUsVUFBVyxDQUNuQixZQUFLLFVBQ0UsS0FBSyxrQkFPZCxVQUFXLFNBQVMsRUFBUyxDQUMzQixHQUFJLEdBQU8sR0FDUCxFQUFTLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FDL0IsRUFBVSxLQUFLLE9BQ25CLEVBQU0sT0FBYSxDQUNqQixPQUFRLEVBQVEsVUFDVCxPQUNILEdBQUksR0FBTSxLQUFLLFVBQ2YsRUFBSyxLQUFLLENBQ1IsS0FBTSxPQUNOLElBQUssRUFBSSxJQUNULEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FFakIsVUFDRyxvQkFDSCxHQUFJLEdBQU0sS0FBSyxVQUNmLEVBQUssS0FBSyxDQUNSLEtBQU0sT0FDTixJQUFLLEVBQUksSUFDVCxPQUFRLEVBQUksT0FDWixXQUFZLEVBQUksYUFBZSxHQUMvQixTQUFVLEdBQ1YsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLFVBQ0gsR0FBSSxDQUFDLEdBQVcsQ0FBQyxFQUFRLE1BQU8sUUFDaEMsR0FBSSxHQUFNLEtBQUssVUFDWCxFQUFXLEtBQUssT0FBTyxLQUMzQixBQUFJLEtBQWEsUUFBVSxJQUFhLHNCQUN0QyxFQUFLLEtBQUssQ0FDUixLQUFNLE9BQ04sSUFBSztBQUFBLEVBQ0wsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUduQixVQUNHLDBCQUNILEtBQUssVUFDTCxFQUFLLEtBQUssS0FBSyxhQUNmLEtBQUssT0FBTyx5QkFDWixjQUVBLEdBQUksR0FBZSxLQUFLLFVBQVUsYUFBYyxFQUFTLEdBQ3pELEdBQUksRUFBYyxNQUNsQixRQUVKLEVBQVUsS0FBSyxPQUVqQixNQUFJLEdBQUssU0FBVyxFQUFVLEVBQUssR0FDdkIsS0FBSyxVQUFVLEVBQVEsSUFHckMsY0FBZSxVQUFXLENBQ3hCLEdBQUksR0FBUSxHQUNSLEVBQWMsS0FDbEIsRUFBTSxPQUNKLE9BQVEsS0FBSyxPQUFPLFVBQ2IsWUFDSCxHQUFJLEdBQU8sS0FBSyxVQUNoQixBQUFLLEVBV0gsRUFBWSxLQUFPO0FBQUEsRUFBTyxFQUFLLElBVi9CLEdBQWMsQ0FDWixLQUFNLE9BQ04sSUFBSyxFQUFLLElBQ1YsU0FBVSxLQUFLLFNBQ2YsS0FBTSxFQUFLLElBQUksTUFBTSxLQUNyQixPQUFRLEVBQUssSUFBSSxNQUFNLE9BQ3ZCLE9BQVEsSUFFVixFQUFNLEtBQUssSUFJYixVQUNHLFNBQ0gsR0FBSSxHQUFRLEtBQUssUUFDakIsRUFBTSxNQUFNLFFBQVEsU0FBUyxFQUFNLENBQ2pDLEFBQUksRUFBSyxPQUNQLEFBQUssRUFJSCxFQUFZLEtBQU87QUFBQSxFQUFPLEVBQUssSUFIL0IsR0FBYyxFQUNkLEVBQU0sS0FBSyxJQUtiLEdBQWMsS0FDZCxFQUFNLEtBQUssTUFHZixVQUNHLE9BQ0gsRUFBYyxLQUNkLEVBQU0sS0FBSyxLQUFLLFVBQVUsS0FDMUIsVUFDRyxVQUNILEtBQUssVUFDTCxjQUVBLFFBR04sTUFBTyxJQVFULG9CQUFxQixVQUFXLENBQzlCLEdBQUksR0FBTSxLQUFLLE9BQU8sS0FDdEIsR0FBSSxFQUFLLENBQ1AsR0FBSSxHQUFPLEtBQUssWUFDaEIsTUFBTyxHQUFLLE9BQVMsUUFDakIsRUFDQSxLQUFLLFVBQVUsRUFBSSxJQUFJLE1BQU0sS0FBTSxDQUFDLFFBRXhDLE9BQU8sTUFBSyxTQVFoQixVQUFXLFVBQVcsQ0FDcEIsR0FBSSxHQUFNLEtBQUssT0FBTyxRQUNsQixFQUFPLENBQ1QsS0FBTSxPQUNOLEtBQU0sRUFBSSxJQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFHYixFQUFRLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxLQUFPLEdBRWpELElBREEsS0FBSyxPQUFPLFVBQ0wsQUFBYSxLQUFLLE9BQU8sTUFBekIsV0FDTCxPQUFRLEtBQUssT0FBTyxVQUNiLGNBQ0EsVUFDSCxLQUFLLFVBQ0wsVUFDRyxPQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssYUFDdEIsVUFDRyxVQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssZ0JBQ3RCLGNBRUEsR0FBSSxHQUFlLEtBQUssVUFBVSxhQUFjLEtBQUssT0FBUSxHQUM3RCxHQUFJLEVBQWMsTUFDbEIsS0FBSyxNQUNILGdCQUNBLHFCQUNFLEtBQUssT0FBTyxLQUNaLDZDQUNGLEtBQUssUUFJYixZQUFLLE9BQU8sV0FFWixFQUFLLE1BQVEsRUFFTixHQU9ULFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQU0sS0FBSyxPQUFPLFFBQ3RCLE1BQUksTUFBSyxPQUFPLE9BQVMsVUFDaEIsQ0FDTCxLQUFNLE9BQ04sS0FBTSxFQUFJLElBQ1YsTUFBTyxLQUFLLHNCQUNaLE1BQU8sR0FDUCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR1YsQ0FDTCxLQUFNLE9BQ04sS0FBTSxFQUFJLElBQ1YsTUFBTyxHQUNQLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FTckIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDdEIsTUFBTyxDQUNMLEtBQU0sT0FDTixLQUFNLFVBQ04sTUFBTyxLQUFLLHNCQUNaLE1BQU8sR0FDUCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBUW5CLFVBQVcsU0FBUyxFQUFTLENBQzNCLEdBQUksR0FBTSxLQUFLLE9BQU8sUUFDdEIsR0FDRSxNQUFPLEdBQUksWUFBZSxVQUMxQixxREFFRixHQUFJLEdBQU8sQ0FDVCxLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsT0FBUSxFQUFJLE9BQ1osV0FBWSxFQUFJLGFBQWUsR0FDL0IsU0FBVSxDQUFDLENBQUMsRUFDWixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBS2pCLEdBRkksRUFBSyxJQUFJLE1BQU0sWUFBWSxHQUFLLE1BQVEsSUFFeEMsRUFBUyxNQUFPLEdBRXBCLEdBQUksR0FHSixTQUFRLEFBQVksS0FBSyxPQUFPLE1BQXhCLFNBQ0osR0FDRSxHQUFJLFFBQ04sS0FBSyxNQUNILHlCQUNBLG1EQUNBLEtBQUssUUFHVCxFQUFLLE1BQVEsS0FBSyxTQUdiLEdBRVQsaUJBQWtCLFVBQVcsQ0FDM0IsR0FBSSxHQUFNLEtBQUssT0FBTyxNQUNsQixFQUFPLENBQ1QsS0FBTSxjQUNOLEtBQU0sRUFBSSxJQUNWLFdBQVksS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQzFDLFVBQVcsS0FDWCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBSWpCLEFBQUksQUFBWSxLQUFLLE9BQU8sTUFBeEIsVUFDRixHQUFLLFdBQWEsS0FBSyxTQUl6QixPQURJLEdBQWMsSUFFaEIsR0FBSSxLQUFLLE9BQU8sT0FBUyxVQUN2QixLQUFLLE9BQU8sbUJBQ0gsS0FBSyxPQUFPLE9BQVMsVUFDOUIsRUFBTSxLQUFLLE9BQU8sV0FDbEIsRUFBYyxFQUFZLFVBQVksQ0FDcEMsS0FBTSxjQUNOLEtBQU0sRUFBSSxJQUNWLFdBQVksS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQzFDLFVBQVcsS0FDWCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWIsQUFBWSxLQUFLLE9BQU8sTUFBeEIsVUFDRixHQUFZLFdBQWEsS0FBSyxpQkFFdkIsS0FBSyxPQUFPLE9BQVMsT0FBUSxDQUN0QyxLQUFLLE9BQU8sUUFDUixLQUFLLE9BQU8sT0FBUyxVQUN2QixHQUFZLFVBQVksS0FBSyxTQUUvQixVQUVBLE9BSUosTUFBTyxJQUVULFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ2xCLEVBQU8sQ0FDVCxLQUFNLFFBQ04sS0FBTSxFQUFJLElBQ1YsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxVQUlqQixNQUFJLEFBQVksTUFBSyxPQUFPLE1BQXhCLFNBQ0YsRUFBSyxNQUFRLEtBQUssUUFFbEIsRUFBSyxNQUFRLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUd0QyxHQU9ULGVBQWdCLFVBQVcsQ0FDekIsR0FBSSxHQUFNLEtBQUssT0FBTyxhQUNsQixFQUFPLEVBQUksSUFBSSxNQUFNLEtBQ3JCLEVBQVMsRUFBSSxJQUFJLE1BQU0sT0FDdkIsRUFBTyxLQUFLLE9BQ1osRUFBTyxHQUNYLEdBQUksRUFBSyxPQUFTLHNCQUF1QixDQUV2QyxJQURBLEtBQUssVUFDRSxLQUFLLE9BQU8sT0FBUyxxQkFFMUIsT0FEQSxFQUFNLEtBQUssVUFDSCxFQUFJLFVBQ0wsT0FDSCxHQUFRLEVBQUksSUFDWixVQUNHLFVBQ0gsR0FBUTtBQUFBLEVBQ1IsY0FFQSxHQUFJLEdBQWUsS0FBSyxVQUFVLGtCQUFtQixFQUFLLEdBQzFELEdBQUksRUFBYyxDQUNoQixHQUFRLEVBQ1IsTUFFRixLQUFLLE1BQ0gsZ0JBQ0EsMEJBQTRCLEVBQUksS0FDaEMsR0FJUixLQUFLLFVBRVAsTUFBTyxDQUNMLEtBQU0sT0FDTixJQUFLLEVBQ0wsT0FBUSxHQUNSLFdBQVksR0FDWixTQUFVLEdBQ1YsS0FBTSxFQUNOLE9BQVEsRUFDUixTQUFVLEtBQUssV0FPbkIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDbEIsRUFDSixNQUFLLEdBQVEsS0FBSyxrQkFDVCxDQUNMLEtBQU0sZUFDTixJQUFLLEVBQUksSUFDVCxNQUFPLEVBQ1AsT0FBUSxFQUFJLE9BQ1osS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxVQUdWLENBQ0wsS0FBTSxVQUNOLElBQUssRUFBSSxJQUNULE9BQVEsRUFBSSxPQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FTckIsYUFBYyxVQUFXLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE9BQU8sV0FDdEIsTUFBTyxDQUNMLEtBQU0sVUFDTixJQUFLLEVBQUksSUFDVCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBSW5CLG1CQUFvQixVQUFXLENBQzdCLEdBQUksR0FBTSxLQUFLLE9BQU8sVUFDbEIsRUFBUSxHQUVaLE1BQUksTUFBSyxPQUFPLE9BQVMsb0JBQ3ZCLEdBQVEsS0FBSyxTQUdSLENBQ0wsS0FBTSxnQkFDTixLQUFNLEVBQUksSUFDVixNQUFPLEVBQ1AsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixZQUFhLFVBQVcsQ0FDdEIsR0FBSSxHQUFNLEtBQUssT0FBTyxVQUNsQixFQUNGLEVBQVEsR0FNVixHQUpJLEtBQUssT0FBTyxPQUFTLG9CQUN2QixHQUFRLEtBQUssU0FHWCxLQUFLLE9BQU8sT0FBUyxPQUFRLENBQy9CLEdBQUksR0FBWSxLQUFLLFVBQ3JCLEVBQVEsS0FBSyxVQUFVLEVBQVUsSUFBSSxNQUFNLEtBQU0sQ0FDL0MsQ0FDRSxLQUFNLE9BQ04sSUFBSyxFQUFVLElBQ2YsS0FBTSxFQUFVLElBQUksTUFBTSxLQUMxQixPQUFRLEVBQVUsSUFBSSxNQUFNLE9BQzVCLFNBQVUsS0FBSyxnQkFHZCxBQUFJLE1BQUssT0FBTyxPQUFTLFNBQzlCLEVBQVEsS0FBSyxVQUFVLEVBQUksSUFBSSxNQUFNLEtBQU0sQ0FBQyxLQUFLLGdCQUVqRCxFQUFRLEtBQUssa0JBQW9CLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUdqRSxNQUFPLENBQ0wsS0FBTSxTQUNOLEtBQU0sRUFBSSxJQUNWLE1BQU8sRUFDUCxNQUFPLEVBQ1AsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixVQUFXLFVBQVcsQ0FDcEIsR0FBSSxHQUFNLEtBQUssT0FBTyxRQUNsQixFQUFPLENBQ1QsS0FBTSxPQUNOLElBQUssRUFBSSxLQUNULElBQUssRUFBSSxJQUNULElBQUssRUFBSSxJQUNULE1BQU8sS0FBSyxRQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFFakIsTUFBSSxNQUFLLE9BQU8sTUFBUSxRQUN0QixNQUFLLFVBQ0wsRUFBSyxVQUFZLEtBQUssU0FFakIsR0FHVCxZQUFhLFVBQVcsQ0FDdEIsR0FBSSxHQUFNLEtBQUssT0FBTyxVQUNsQixFQUFPLENBQ1QsS0FBTSxTQUNOLElBQUssRUFBSSxLQUNULElBQUssRUFBSSxJQUNULE1BQU8sS0FBSyxRQUNaLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFFakIsTUFBTyxJQU1ULGFBQWMsVUFBVyxDQUN2QixHQUFJLEdBQU0sS0FBSyxPQUFPLFdBQ2xCLEVBQU8sS0FBSyxPQUFPLFFBQ3ZCLE1BQU8sQ0FDTCxLQUFNLFVBQ04sS0FBTSxDQUNKLEtBQU0sZ0JBQ04sS0FBTSxFQUFLLElBQUksT0FDZixLQUFNLEVBQUssSUFBSSxNQUFNLEtBQ3JCLE9BQVEsRUFBSyxJQUFJLE1BQU0sT0FDdkIsU0FBVSxLQUFLLFVBRWpCLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FRbkIsV0FBWSxVQUFXLENBQ3JCLEdBQUksR0FBTSxLQUFLLE9BQU8sU0FFbEIsRUFDRixBQUFZLEtBQUssT0FBTyxNQUF4QixTQUNJLEtBQUssUUFDTCxLQUFLLFdBQVcsRUFBSSxJQUFJLE1BQU0sTUFDcEMsU0FBSyxLQUFPLGFBQ1osRUFBSyxLQUFPLEVBQUksSUFBSSxPQUNwQixFQUFLLEtBQU8sRUFBSSxLQUNoQixFQUFLLEtBQU8sRUFBSSxJQUFJLE1BQU0sS0FDMUIsRUFBSyxPQUFTLEVBQUksSUFBSSxNQUFNLE9BRXJCLEdBR1QsZ0JBQWlCLFVBQVcsQ0FDMUIsR0FBSSxHQUFNLEtBQUssT0FBTyxlQUN0QixNQUFLLE1BQUssU0FDUixLQUFLLE1BQ0gsc0JBQ0Esb0VBQ0EsR0FHRyxDQUNMLEtBQU0sYUFDTixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFdBSW5CLFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ3RCLE1BQU8sQ0FDTCxLQUFNLGFBQ04sS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQVFuQixhQUFjLFVBQVcsQ0FhdkIsT0FaSSxHQUFNLEtBQUssT0FBTyxXQUNsQixFQUFPLENBQ1QsS0FBTSxVQUNOLEtBQU0sQ0FDSixLQUFNLGdCQUNOLFNBQVUsS0FBSyxVQUVqQixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWIsRUFBVSxHQUNQLEtBQUssT0FBTyxPQUFTLFVBQzFCLEVBQVEsS0FBSyxLQUFLLHNCQUVwQixHQUFJLEdBQU8sS0FBSyxPQUFPLFFBRXZCLFNBQUssS0FBSyxLQUFPLEVBQUssSUFBSSxPQUMxQixFQUFLLEtBQUssS0FBTyxFQUFLLElBQUksTUFBTSxLQUNoQyxFQUFLLEtBQUssT0FBUyxFQUFLLElBQUksTUFBTSxPQUVsQyxBQUNHLFdBQVUsS0FBSyxFQUFLLEtBQUssT0FBUyxTQUFTLEtBQUssRUFBSyxLQUFLLFFBQzNELENBQUMsRUFBUSxPQUVULEdBQUssTUFDSCxBQUFZLEtBQUssT0FBTyxNQUF4QixTQUNJLEtBQUssUUFDTCxLQUFLLFdBQVcsRUFBSSxJQUFJLE1BQU0sTUFDaEMsVUFBVSxLQUFLLEVBQUssS0FBSyxPQUMzQixRQUFRLEtBQ04sS0FBSyxTQUNILFVBQ0EsRUFBSSxJQUFJLE1BQU0sS0FDZDtBQUFBLG1EQUNBLEVBQUssS0FBSyxLQUNWLE9BSU4sR0FBSyxLQUFPLGFBQ1osRUFBSyxRQUFVLEVBQ1gsS0FBSyxPQUFPLE9BQVMsVUFDdkIsS0FBSyxNQUNILG9CQUNBLHVDQUNBLEtBQUssU0FJSixHQU9ULFVBQVcsVUFBVyxDQUNwQixHQUFJLEdBQU0sS0FBSyxPQUFPLFFBQ2xCLEVBQU8sRUFBSSxJQUNYLEVBQU8sRUFBSSxLQUNYLEVBQVEsQ0FDVixLQUFNLFFBQ04sS0FBTSxFQUNOLEtBQU0sRUFDTixNQUFPLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUNyQyxLQUFNLEdBQ04sTUFBTyxHQUNQLGdCQUFpQixHQUNqQixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR2pCLFlBQUssSUFBSSxHQUNMLEVBQU0sTUFDUixHQUFNLE1BQU0sTUFBTSxLQUFLLEVBQU0sTUFDN0IsTUFBTyxHQUFNLE1BRVgsRUFBTSxNQUFNLE1BQU0sU0FBVyxHQUFHLEdBQU0sTUFBUSxNQUMzQyxHQU9ULFdBQVksVUFBVyxDQUNyQixHQUFJLEdBQU0sS0FBSyxPQUFPLFNBQ2xCLEVBQU8sRUFBSSxJQUNYLEVBQU8sRUFBSSxLQUVmLEdBQUksQUFBWSxLQUFLLE9BQU8sTUFBeEIsU0FBOEIsQ0FDaEMsS0FBSyxVQUNMLEdBQUksR0FBUSxDQUNWLEtBQU0sUUFDTixLQUFNLEVBQ04sS0FBTSxFQUNOLE1BQU8sS0FBSyxRQUNaLEtBQU0sR0FDTixLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBRWpCLFlBQUssVUFDRSxNQUVQLE1BQUssTUFDSCxxQkFDQSxTQUFXLEVBQU8seUJBQ2xCLElBU04sZUFBZ0IsVUFBVyxDQUN6QixHQUFJLEdBQU0sS0FBSyxPQUFPLHVCQUN0QixHQUFJLEVBQUMsRUFFTCxRQURJLEdBQVEsS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ25DLEtBQUssT0FBTyxPQUFTLHFCQUFxQixDQUMvQyxHQUFJLEdBQU0sS0FBSyxVQUNmLE9BQVEsRUFBSSxVQUNMLE9BQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLFVBQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSztBQUFBLEVBQ0wsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixVQUNHLDBCQUNILEVBQU0sTUFBTSxLQUFLLEtBQUssYUFDdEIsS0FBSyxPQUFPLHlCQUNaLFVBQ0csb0JBQ0gsRUFBTSxNQUFNLEtBQUssQ0FDZixLQUFNLE9BQ04sSUFBSyxFQUFJLElBQ1QsT0FBUSxFQUFJLE9BQ1osV0FBWSxFQUFJLGFBQWUsR0FDL0IsU0FBVSxHQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssV0FFakIsY0FFQSxHQUFJLEdBQWUsS0FBSyxVQUFVLGtCQUFtQixFQUFLLEVBQU8sR0FDakUsR0FBSSxFQUFjLE1BQ2xCLEtBQUssTUFDSCxnQkFDQSwwQkFBNEIsRUFBSSxLQUNoQyxJQUlSLFlBQUssVUFDRSxJQU9ULE1BQU8sVUFBVyxDQUdoQixPQUZJLEdBQU0sS0FBSyxPQUFPLFVBQ2xCLEVBQVEsS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ25DLEFBQWEsS0FBSyxPQUFPLE1BQXpCLFdBQ0wsR0FBSSxBQUFhLEtBQUssT0FBTyxNQUF6QixVQUNGLEtBQUssa0JBQ0ksQUFBZSxLQUFLLE9BQU8sTUFBM0IsWUFDVCxFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sS0FBSyxxQkFDakMsQ0FDTCxHQUFJLEdBQU8sS0FBSyxZQUNoQixBQUFJLEVBQUssT0FBUyxRQUNoQixFQUFNLE1BQVEsRUFBTSxNQUFNLE9BQU8sRUFBSyxPQUV0QyxFQUFNLE1BQU0sS0FBSyxHQUl2QixZQUFLLE9BQU8sV0FDTCxHQU9ULG1CQUFvQixVQUFXLENBQzdCLEdBQUksR0FBTSxLQUFLLFVBQ1gsRUFBTSxDQUNSLEtBQU0sa0JBQ04sS0FBTSxFQUFJLElBQ1YsWUFBYSxHQUNiLE1BQU8sS0FBSyxXQUFXLEVBQUksSUFBSSxNQUFNLE1BQ3JDLE1BQU8sR0FDUCxnQkFBaUIsR0FDakIsU0FBVSxHQUNWLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssVUFHakIsTUFBTyxNQUFLLElBQUksRUFBSyxDQUFDLG1CQUFvQixNQU81QyxTQUFVLFVBQVcsQ0FDbkIsR0FBSSxHQUFNLEtBQUssVUFDWCxFQUFNLENBQ1IsS0FBTSxNQUNOLEtBQU0sRUFBSSxJQUNWLFlBQWEsR0FDYixNQUFPLEtBQUssV0FBVyxFQUFJLElBQUksTUFBTSxNQUNyQyxNQUFPLEdBQ1AsZ0JBQWlCLEdBQ2pCLFNBQVUsR0FBVyxRQUFRLEVBQUksT0FBUyxHQUMxQyxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFVBR2pCLE1BQU8sTUFBSyxJQUFJLEVBQUssQ0FBQyxtQkFBb0IsTUFPNUMsSUFBSyxTQUFTLEVBQUssRUFBUyxDQUMxQixHQUFJLEdBQVksR0FDWixFQUFpQixHQUNqQixFQUFxQixHQUFXLEVBQVEsbUJBRTVDLEVBQUssT0FDSCxPQUFRLEtBQUssT0FBTyxVQUNiLFNBQ0EsUUFDSCxHQUFJLEdBQU0sS0FBSyxVQUNmLEFBQUksRUFBSSxPQUFTLE1BQ1gsR0FBZSxRQUFRLFFBQVUsSUFDbkMsS0FBSyxNQUNILGVBQ0EsMkNBQ0EsR0FHSixFQUFlLEtBQUssT0FFdEIsRUFBSSxNQUFNLEtBQUssQ0FDYixLQUFNLEVBQUksS0FDVixJQUFLLElBQU0sRUFBSSxJQUFNLElBQ3JCLEtBQU0sRUFBSSxJQUFJLE1BQU0sS0FDcEIsT0FBUSxFQUFJLElBQUksTUFBTSxPQUN0QixTQUFVLEtBQUssU0FDZixXQUFZLEtBRWQsYUFDRyxtQkFDSCxBQUFJLEdBQ0YsUUFBUSxLQUNOLEtBQUssU0FDSCxVQUNBLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FDdEI7QUFBQSx5REFHTixFQUFZLEdBQ1osRUFBSSxNQUFRLEVBQUksTUFBTSxPQUFPLEtBQUssTUFBTSxJQUN4QyxhQUNHLGNBQ0gsR0FBSSxHQUFNLEtBQUssVUFDZixFQUFJLGdCQUFnQixLQUFLLENBQ3ZCLEtBQU0saUJBQ04sSUFBSyxFQUFJLElBQ1QsS0FBTSxFQUFJLElBQUksTUFBTSxLQUNwQixPQUFRLEVBQUksSUFBSSxNQUFNLE9BQ3RCLFNBQVUsS0FBSyxXQUVqQixjQUVBLEdBQUksR0FBZSxLQUFLLFVBQ3RCLHFCQUNBLEtBQUssT0FDTCxFQUNBLEdBRUYsR0FBSSxFQUFjLE1BQ2xCLFFBV04sT0FOSSxBQUFTLEtBQUssT0FBTyxNQUFyQixPQUNGLEdBQUksU0FBVyxHQUNmLEtBQUssV0FJQyxLQUFLLE9BQU8sVUFDYixXQUNBLG9CQUNILEdBQUksR0FBTyxLQUFLLFlBQ2hCLEFBQUksRUFBSyxPQUFTLFFBQ2hCLEVBQUksTUFBTSxNQUFNLEtBQUssTUFBTSxFQUFJLE1BQU0sTUFBTyxFQUFLLE9BRWpELEVBQUksTUFBTSxNQUFNLEtBQUssR0FFdkIsVUFDRyxPQUNILEVBQUksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLEtBQ3BDLFVBQ0csSUFDSCxLQUFLLFVBQ0wsR0FBSSxHQUFPLEtBQUssWUFDaEIsRUFBSSxNQUNGLEVBQUssT0FBUyxRQUFVLEVBQU8sS0FBSyxVQUFVLEVBQUksS0FBTSxDQUFDLElBQzNELFVBQ0csY0FDQSxhQUNBLGNBQ0EsVUFDQSwwQkFDQSx3QkFDSCxVQUNHLFFBQ0gsR0FBSSxFQUFvQixDQUN0QixLQUFLLFVBQ0wsRUFBSSxZQUFjLEdBQ2xCLGNBR0YsR0FBSSxHQUFlLEtBQUssVUFDdEIsWUFDQSxLQUFLLE9BQ0wsRUFDQSxHQUVGLEdBQUksRUFBYyxNQUNsQixLQUFLLE1BQ0gsZ0JBQ0EscUJBQ0UsS0FBSyxPQUFPLEtBQ1osc0RBQ0MsR0FBcUIsWUFBYyxJQUNwQyx1QkFDRixLQUFLLFFBS1gsS0FBTyxBQUFhLEtBQUssT0FBTyxNQUF6QixXQUErQixLQUFLLFVBRzNDLEdBQUksRUFBSSxTQUNOLEVBQUksTUFBUSxLQUFLLGtCQUFvQixLQUFLLFdBQVcsRUFBSSxjQUNoRCxBQUFZLEtBQUssT0FBTyxNQUF4QixTQUVULE9BREksR0FBUSxLQUFLLFFBQ1IsRUFBSSxFQUFHLEVBQU0sRUFBTSxNQUFNLE9BQVEsRUFBSSxFQUFLLEVBQUUsRUFDbkQsRUFBSSxNQUFNLE1BQU0sS0FBSyxFQUFNLE1BQU0sSUFJckMsTUFBTyxJQUdULE1BQU8sU0FBUyxFQUFnQixDQUM5QixLQUFLLE9BQU8sb0JBSVosT0FGSSxHQUFRLEdBQ1IsRUFBTSxLQUFLLFVBQ1IsRUFBSSxPQUFTLGFBQ2xCLEFBQUksRUFBSSxPQUFTLFNBQVcsR0FDdEIsR0FBZSxRQUFRLEVBQUksUUFBVSxJQUN2QyxLQUFLLE1BQ0gsc0JBQ0Esd0JBQTBCLEVBQUksS0FBTyxvQkFDckMsR0FHSixFQUFlLEtBQUssRUFBSSxPQUUxQixFQUFNLEtBQUssQ0FDVCxLQUFNLEVBQUksS0FDVixJQUFLLEVBQUksSUFDVCxLQUFNLEVBQUksSUFBSSxNQUFNLEtBQ3BCLE9BQVEsRUFBSSxJQUFJLE1BQU0sT0FDdEIsU0FBVSxLQUFLLFNBQ2YsV0FBWSxFQUFJLGFBQWUsS0FFakMsRUFBTSxLQUFLLFVBRWIsWUFBSyxPQUFPLE1BQU0sR0FDbEIsS0FBSyxPQUFPLGtCQUNMLE1DanhDWCx3Q0FFQSxHQUFPLFFBQVUsR0FDakIsWUFBaUIsRUFBSyxFQUFRLEVBQU8sRUFBUyxDQUM1QyxBQUFJLEdBQVMsTUFBTyxJQUFVLFVBQVksTUFBTyxJQUFZLGFBQzNELEdBQVUsRUFDVixFQUFRLE1BRVYsRUFBVSxHQUFXLENBQUMsb0JBQXFCLElBQzNDLEdBQUksR0FBVyxFQUFRLFFBQVUsRUFBUSxTQUFXLEdBRWhELEVBQVUsV0FBaUIsRUFBYSxDQUMxQyxHQUFJLE1BQU0sUUFBUSxJQUFnQixDQUFDLEVBQVEsYUFDekMsS0FBTSxJQUFJLE9BQ1IsMEZBR0osRUFBTSxHQU9SLEdBTEEsRUFBUSxhQUNOLEVBQVEsSUFDUCxtQkFBa0IsS0FBSyxFQUFRLEdBQUcsT0FDaEMsRUFBUSxHQUFHLE9BQVMsY0FBZ0IsRUFBSSxPQUFTLGlCQUVsRCxFQUFRLENBQ1YsR0FBSSxHQUFTLEVBQU8sRUFBSyxHQUN6QixHQUFJLElBQVcsR0FDYixNQUFPLEdBQ0YsR0FBSSxNQUFNLFFBQVEsR0FFdkIsTUFBTyxHQUFrQixHQU03QixPQUZBLEVBQVEsUUFBUSxHQUVSLEVBQUksVUFDTCxpQkFDQSxRQUNILEVBQUksTUFBUSxFQUFrQixFQUFJLE9BQ2xDLFVBQ0csV0FDQSxhQUNBLFlBQ0EsVUFDQSxzQkFDQSxXQUNBLFdBQ0EsUUFDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRWhELFVBQ0csT0FDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRTVDLEVBQUksV0FDTixHQUFJLFVBQVksR0FBUSxFQUFJLFVBQVcsRUFBUSxFQUFPLElBRXhELFVBQ0csU0FDSCxBQUFJLEVBQUksT0FDTixHQUFJLE1BQVEsR0FBUSxFQUFJLE1BQU8sRUFBUSxFQUFPLElBRWhELFVBQ0csY0FDSCxBQUFJLEVBQUksWUFDTixHQUFJLFdBQWEsR0FBUSxFQUFJLFdBQVksRUFBUSxFQUFPLElBRXRELEVBQUksV0FDTixHQUFJLFVBQVksR0FBUSxFQUFJLFVBQVcsRUFBUSxFQUFPLElBRXhELFVBQ0csVUFDSCxHQUFRLEVBQUksTUFBTyxFQUFRLEVBQU8sR0FDbEMsR0FBUSxFQUFJLEtBQU0sRUFBUSxFQUFPLEdBQ2pDLFVBQ0csVUFDSCxHQUFRLEVBQUksS0FBTSxFQUFRLEVBQU8sR0FDakMsVUFDRyxhQUNILEVBQUksUUFBVSxFQUFrQixFQUFJLFNBQ3BDLEdBQVEsRUFBSSxLQUFNLEVBQVEsRUFBTyxHQUNqQyxVQUNHLFlBQ0EsbUJBQ0EsY0FDQSxjQUNBLG9CQUNBLGlCQUNBLGlCQUNBLE9BQ0gsVUFDRyxnQkFDSCxBQUFJLEVBQVEscUJBQXVCLEVBQUksS0FDckMsR0FBUSxFQUFJLElBQUssRUFBUSxFQUFPLEdBRWxDLGNBRUEsS0FBTSxJQUFJLE9BQU0sd0JBQTBCLEVBQUksTUFJbEQsU0FBUSxRQUVSLEdBQVMsRUFBTSxFQUFLLEdBQ2IsRUFFUCxXQUEyQixFQUFPLENBQ2hDLE1BQU8sR0FBTSxPQUFPLFNBQVMsRUFBTyxFQUFNLENBQ3hDLEdBQUksR0FBUyxHQUFRLEVBQU0sRUFBUSxFQUFPLEdBQzFDLE1BQUksT0FBTSxRQUFRLEdBQ1QsRUFBTSxPQUFPLEdBRWIsRUFBTSxPQUFPLENBQUMsS0FFdEIsUUNySFAsd0NBRUEsR0FBSSxJQUFLLEtBQ0wsR0FBTyxLQUNQLEdBQU8sS0FDUCxHQUFTLEtBRWIsR0FBTyxRQUFVLEdBQ2pCLFlBQWMsRUFBSyxFQUFTLENBQzFCLFNBQVUsR0FBVyxHQUVyQixFQUFNLEtBQUssTUFBTSxLQUFLLFVBQVUsSUFDekIsR0FBSyxFQUFLLFNBQVMsRUFBTSxDQUM5QixHQUFJLEVBQUssTUFBUSxRQUViLEdBQUssT0FBUyxXQUNkLEVBQUssT0FBUyxjQUNkLEVBQUssT0FBUyxXQUNkLENBQ0EsR0FBSSxHQUFPLEVBQUssS0FDaEIsR0FBSSxFQUFLLE9BQVMsZ0JBQ2hCLEtBQU0sSUFBSSxPQUFNLDRDQUVsQixHQUFJLEdBQU0sRUFBSyxFQUNmLEdBQUksQ0FDRixFQUFPLEVBQVEsUUFBUSxFQUFLLEtBQU0sRUFBSyxTQUFVLEdBQ2pELEVBQUssU0FBVyxFQUNoQixFQUFNLEVBQVEsS0FBSyxFQUFNLEdBQ3pCLEVBQU0sRUFBSSxTQUFTLGNBQ1osRUFBUCxDQUNBLFFBQUcsU0FBVztBQUFBLFNBQWMsRUFBSyxTQUFXLFNBQVcsRUFBSyxLQUN0RCxFQUVSLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNQLEdBQUssT0FBUyxXQUFhLEVBQUssT0FBUyxZQUMzQyxHQUFLLElBQU0sR0FBSyxPQUNkLEVBQ0EsR0FBTyxHQUFJLEVBQVMsQ0FDbEIsU0FBVSxTQVN4QixHQUFLLE9BQVMsU0FBb0IsRUFBSyxFQUFTLENBQzlDLEVBQVUsR0FBTyxHQUFXLEdBQVUsQ0FDcEMsSUFBSyxJQUVQLEdBQUksR0FBUyxFQUFRLElBQUksRUFBSyxHQUMxQixFQUFNLEVBQVEsTUFBTSxFQUFRLEdBQ2hDLE1BQU8sSUFBSyxFQUFLLElBRW5CLEdBQUssS0FBTyxTQUFrQixFQUFVLEVBQVMsQ0FDL0MsRUFBVSxHQUFPLEdBQVcsR0FBVSxDQUNwQyxTQUFVLElBRVosR0FBSSxHQUFNLEVBQVEsS0FBSyxHQUFVLFNBQVMsUUFDMUMsTUFBTyxJQUFLLE9BQU8sRUFBSyxJQUcxQixHQUFLLFFBQVUsU0FBaUIsRUFBVSxFQUFRLEVBQVMsQ0FFekQsR0FEQSxFQUFXLEVBQVMsT0FDaEIsRUFBUyxLQUFPLEtBQU8sQ0FBQyxFQUMxQixLQUFNLElBQUksT0FDUix1RkFHSixHQUFJLEVBQVMsS0FBTyxLQUFPLENBQUMsRUFBUSxRQUNsQyxLQUFNLElBQUksT0FDUixzRkFHSixTQUFXLEdBQUssS0FDZCxFQUFTLEtBQU8sSUFBTSxFQUFRLFFBQVUsR0FBSyxRQUFRLEVBQU8sUUFDNUQsR0FHSyxHQUVULEdBQUssS0FBTyxTQUFjLEVBQVUsRUFBUyxDQUMzQyxNQUFPLElBQUcsYUFBYSxJQUd6QixHQUFLLGdCQUFrQixTQUF5QixFQUFTLENBRXZELEdBQUksTUFBTyxJQUFZLFNBQ3JCLEtBQU0sSUFBSSxXQUFVLDZCQUd0QixHQUFJLE1BQU8sR0FBUSxLQUFRLFdBQ3pCLEtBQU0sSUFBSSxXQUFVLGtDQUd0QixHQUFJLE1BQU8sR0FBUSxPQUFVLFdBQzNCLEtBQU0sSUFBSSxXQUFVLG9DQUd0QixHQUFJLEVBQVEsU0FBVyxNQUFPLEdBQVEsU0FBWSxXQUNoRCxLQUFNLElBQUksV0FBVSxzQ0FHdEIsR0FBSSxFQUFRLE1BQVEsTUFBTyxHQUFRLE1BQVMsV0FDMUMsS0FBTSxJQUFJLFdBQVUsb0NBSXhCLFlBQW9CLEVBQVMsQ0FDM0IsVUFBSyxnQkFBZ0IsR0FDZCxHQUNMLENBQ0UsUUFBUyxHQUFLLFFBQ2QsS0FBTSxHQUFLLE1BRWIsTUNySEosd0NBWUEsR0FBTyxRQUFVLEdBQ2pCLFlBQWlCLEVBQU0sQ0FDbkIsQUFBSyxHQUFNLFFBQ1AsTUFDQSxHQUFXLElBR2YsR0FBTSxHQUFNLFFBQVUsRUFHMUIsR0FBSSxJQUFRLEdBR1IsR0FBVyxHQUlYLEdBSUEsR0FBUSxFQUlSLEdBQVcsS0FRZixhQUFpQixDQUNiLEtBQU8sR0FBUSxHQUFNLFFBQVEsQ0FDekIsR0FBSSxHQUFlLEdBVW5CLEdBUEEsR0FBUSxHQUFRLEVBQ2hCLEdBQU0sR0FBYyxPQU1oQixHQUFRLEdBQVUsQ0FHbEIsT0FBUyxHQUFPLEVBQUcsRUFBWSxHQUFNLE9BQVMsR0FBTyxFQUFPLEVBQVcsSUFDbkUsR0FBTSxHQUFRLEdBQU0sRUFBTyxJQUUvQixHQUFNLFFBQVUsR0FDaEIsR0FBUSxHQUdoQixHQUFNLE9BQVMsRUFDZixHQUFRLEVBQ1IsR0FBVyxHQWFmLEdBQUksSUFBUSxNQUFPLFNBQVcsWUFBYyxPQUFTLEtBQ2pELEdBQTBCLEdBQU0sa0JBQW9CLEdBQU0sdUJBYTlELEFBQUksTUFBTyxLQUE0QixXQUNuQyxHQUFlLEdBQW9DLElBOEJuRCxHQUFlLEdBQXlCLElBUTVDLEdBQVEsYUFBZSxHQUl2QixZQUE2QyxFQUFVLENBQ25ELEdBQUksR0FBUyxFQUNULEVBQVcsR0FBSSxJQUF3QixHQUN2QyxFQUFPLFNBQVMsZUFBZSxJQUNuQyxTQUFTLFFBQVEsRUFBTSxDQUFDLGNBQWUsS0FDaEMsVUFBdUIsQ0FDMUIsRUFBUyxDQUFDLEVBQ1YsRUFBSyxLQUFPLEdBNENwQixZQUFrQyxFQUFVLENBQ3hDLE1BQU8sV0FBdUIsQ0FLMUIsR0FBSSxHQUFnQixXQUFXLEVBQWEsR0FJeEMsRUFBaUIsWUFBWSxFQUFhLElBRTlDLFlBQXVCLENBR25CLGFBQWEsR0FDYixjQUFjLEdBQ2QsTUFRWixHQUFRLHlCQUEyQixLQ3ZObkMsd0NBRUEsR0FBSSxJQUFPLEtBRVgsYUFBZ0IsRUFtQmhCLEdBQUksSUFBYSxLQUNiLEdBQVcsR0FDZixZQUFpQixFQUFLLENBQ3BCLEdBQUksQ0FDRixNQUFPLEdBQUksV0FDSixFQUFQLENBQ0EsVUFBYSxFQUNOLElBSVgsWUFBb0IsRUFBSSxFQUFHLENBQ3pCLEdBQUksQ0FDRixNQUFPLEdBQUcsU0FDSCxFQUFQLENBQ0EsVUFBYSxFQUNOLElBR1gsWUFBb0IsRUFBSSxFQUFHLEVBQUcsQ0FDNUIsR0FBSSxDQUNGLEVBQUcsRUFBRyxTQUNDLEVBQVAsQ0FDQSxVQUFhLEVBQ04sSUFJWCxHQUFPLFFBQVUsR0FFakIsWUFBaUIsRUFBSSxDQUNuQixHQUFJLE1BQU8sT0FBUyxTQUNsQixLQUFNLElBQUksV0FBVSx3Q0FFdEIsR0FBSSxNQUFPLElBQU8sV0FDaEIsS0FBTSxJQUFJLFdBQVUsb0RBTXRCLEFBSkEsS0FBSyxJQUFNLEVBQ1gsS0FBSyxJQUFNLEVBQ1gsS0FBSyxJQUFNLEtBQ1gsS0FBSyxJQUFNLEtBQ1AsSUFBTyxJQUNYLEdBQVUsRUFBSSxNQUVoQixHQUFRLElBQU0sS0FDZCxHQUFRLElBQU0sS0FDZCxHQUFRLElBQU0sR0FFZCxHQUFRLFVBQVUsS0FBTyxTQUFTLEVBQWEsRUFBWSxDQUN6RCxHQUFJLEtBQUssY0FBZ0IsR0FDdkIsTUFBTyxJQUFTLEtBQU0sRUFBYSxHQUVyQyxHQUFJLEdBQU0sR0FBSSxJQUFRLElBQ3RCLFVBQU8sS0FBTSxHQUFJLElBQVEsRUFBYSxFQUFZLElBQzNDLEdBR1QsWUFBa0IsRUFBTSxFQUFhLEVBQVksQ0FDL0MsTUFBTyxJQUFJLEdBQUssWUFBWSxTQUFVLEVBQVMsRUFBUSxDQUNyRCxHQUFJLEdBQU0sR0FBSSxJQUFRLElBQ3RCLEVBQUksS0FBSyxFQUFTLEdBQ2xCLEdBQU8sRUFBTSxHQUFJLElBQVEsRUFBYSxFQUFZLE1BR3RELFlBQWdCLEVBQU0sRUFBVSxDQUM5QixLQUFPLEVBQUssTUFBUSxHQUNsQixFQUFPLEVBQUssSUFLZCxHQUhJLEdBQVEsS0FDVixHQUFRLElBQUksR0FFVixFQUFLLE1BQVEsRUFBRyxDQUNsQixHQUFJLEVBQUssTUFBUSxFQUFHLENBQ2xCLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNYLE9BRUYsR0FBSSxFQUFLLE1BQVEsRUFBRyxDQUNsQixFQUFLLElBQU0sRUFDWCxFQUFLLElBQU0sQ0FBQyxFQUFLLElBQUssR0FDdEIsT0FFRixFQUFLLElBQUksS0FBSyxHQUNkLE9BRUYsR0FBZSxFQUFNLEdBR3ZCLFlBQXdCLEVBQU0sRUFBVSxDQUN0QyxHQUFLLFVBQVcsQ0FDZCxHQUFJLEdBQUssRUFBSyxNQUFRLEVBQUksRUFBUyxZQUFjLEVBQVMsV0FDMUQsR0FBSSxJQUFPLEtBQU0sQ0FDZixBQUFJLEVBQUssTUFBUSxFQUNmLEdBQVEsRUFBUyxRQUFTLEVBQUssS0FFL0IsR0FBTyxFQUFTLFFBQVMsRUFBSyxLQUVoQyxPQUVGLEdBQUksR0FBTSxHQUFXLEVBQUksRUFBSyxLQUM5QixBQUFJLElBQVEsR0FDVixHQUFPLEVBQVMsUUFBUyxJQUV6QixHQUFRLEVBQVMsUUFBUyxLQUloQyxZQUFpQixFQUFNLEVBQVUsQ0FFL0IsR0FBSSxJQUFhLEVBQ2YsTUFBTyxJQUNMLEVBQ0EsR0FBSSxXQUFVLDhDQUdsQixHQUNFLEdBQ0MsT0FBTyxJQUFhLFVBQVksTUFBTyxJQUFhLFlBQ3JELENBQ0EsR0FBSSxHQUFPLEdBQVEsR0FDbkIsR0FBSSxJQUFTLEdBQ1gsTUFBTyxJQUFPLEVBQU0sSUFFdEIsR0FDRSxJQUFTLEVBQUssTUFDZCxZQUFvQixJQUNwQixDQUNBLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNYLEdBQU8sR0FDUCxlQUNTLE1BQU8sSUFBUyxXQUFZLENBQ3JDLEdBQVUsRUFBSyxLQUFLLEdBQVcsR0FDL0IsUUFHSixFQUFLLElBQU0sRUFDWCxFQUFLLElBQU0sRUFDWCxHQUFPLEdBR1QsWUFBZ0IsRUFBTSxFQUFVLENBQzlCLEVBQUssSUFBTSxFQUNYLEVBQUssSUFBTSxFQUNQLEdBQVEsS0FDVixHQUFRLElBQUksRUFBTSxHQUVwQixHQUFPLEdBRVQsWUFBZ0IsRUFBTSxDQUtwQixHQUpJLEVBQUssTUFBUSxHQUNmLElBQU8sRUFBTSxFQUFLLEtBQ2xCLEVBQUssSUFBTSxNQUVULEVBQUssTUFBUSxFQUFHLENBQ2xCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBSyxJQUFJLE9BQVEsSUFDbkMsR0FBTyxFQUFNLEVBQUssSUFBSSxJQUV4QixFQUFLLElBQU0sTUFJZixZQUFpQixFQUFhLEVBQVksRUFBUSxDQUNoRCxLQUFLLFlBQWMsTUFBTyxJQUFnQixXQUFhLEVBQWMsS0FDckUsS0FBSyxXQUFhLE1BQU8sSUFBZSxXQUFhLEVBQWEsS0FDbEUsS0FBSyxRQUFVLEVBU2pCLFlBQW1CLEVBQUksRUFBUyxDQUM5QixHQUFJLEdBQU8sR0FDUCxFQUFNLEdBQVcsRUFBSSxTQUFVLEVBQU8sQ0FDeEMsQUFBSSxHQUNKLEdBQU8sR0FDUCxHQUFRLEVBQVMsS0FDaEIsU0FBVSxFQUFRLENBQ25CLEFBQUksR0FDSixHQUFPLEdBQ1AsR0FBTyxFQUFTLE1BRWxCLEFBQUksQ0FBQyxHQUFRLElBQVEsSUFDbkIsR0FBTyxHQUNQLEdBQU8sRUFBUyxRQ2xOcEIsd0NBRUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBQ2pCLEdBQVEsVUFBVSxLQUFPLFNBQVUsRUFBYSxFQUFZLENBQzFELEdBQUksR0FBTyxVQUFVLE9BQVMsS0FBSyxLQUFLLE1BQU0sS0FBTSxXQUFhLEtBQ2pFLEVBQUssS0FBSyxLQUFNLFNBQVUsRUFBSyxDQUM3QixXQUFXLFVBQVksQ0FDckIsS0FBTSxJQUNMLFFDVlAsd0NBRUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBQ2pCLEdBQVEsVUFBVSxRQUFhLFNBQVUsRUFBRyxDQUMxQyxNQUFPLE1BQUssS0FBSyxTQUFVLEVBQU8sQ0FDaEMsTUFBTyxJQUFRLFFBQVEsS0FBSyxLQUFLLFVBQVksQ0FDM0MsTUFBTyxNQUVSLFNBQVUsRUFBSyxDQUNoQixNQUFPLElBQVEsUUFBUSxLQUFLLEtBQUssVUFBWSxDQUMzQyxLQUFNLFVDWlosd0NBSUEsR0FBSSxJQUFVLEtBRWQsR0FBTyxRQUFVLEdBSWpCLEdBQUksSUFBTyxHQUFhLElBQ3BCLEdBQVEsR0FBYSxJQUNyQixHQUFPLEdBQWEsTUFDcEIsR0FBWSxHQUFhLFFBQ3pCLEdBQU8sR0FBYSxHQUNwQixHQUFjLEdBQWEsSUFFL0IsWUFBc0IsRUFBTyxDQUMzQixHQUFJLEdBQUksR0FBSSxJQUFRLEdBQVEsS0FDNUIsU0FBRSxJQUFNLEVBQ1IsRUFBRSxJQUFNLEVBQ0QsRUFFVCxHQUFRLFFBQVUsU0FBVSxFQUFPLENBQ2pDLEdBQUksWUFBaUIsSUFBUyxNQUFPLEdBRXJDLEdBQUksSUFBVSxLQUFNLE1BQU8sSUFDM0IsR0FBSSxJQUFVLE9BQVcsTUFBTyxJQUNoQyxHQUFJLElBQVUsR0FBTSxNQUFPLElBQzNCLEdBQUksSUFBVSxHQUFPLE1BQU8sSUFDNUIsR0FBSSxJQUFVLEVBQUcsTUFBTyxJQUN4QixHQUFJLElBQVUsR0FBSSxNQUFPLElBRXpCLEdBQUksTUFBTyxJQUFVLFVBQVksTUFBTyxJQUFVLFdBQ2hELEdBQUksQ0FDRixHQUFJLEdBQU8sRUFBTSxLQUNqQixHQUFJLE1BQU8sSUFBUyxXQUNsQixNQUFPLElBQUksSUFBUSxFQUFLLEtBQUssVUFFeEIsRUFBUCxDQUNBLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sS0FJYixNQUFPLElBQWEsSUFHdEIsR0FBUSxJQUFNLFNBQVUsRUFBSyxDQUMzQixHQUFJLEdBQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxHQUV0QyxNQUFPLElBQUksSUFBUSxTQUFVLEVBQVMsRUFBUSxDQUM1QyxHQUFJLEVBQUssU0FBVyxFQUFHLE1BQU8sR0FBUSxJQUN0QyxHQUFJLEdBQVksRUFBSyxPQUNyQixXQUFhLEVBQUcsRUFBSyxDQUNuQixHQUFJLEdBQVEsT0FBTyxJQUFRLFVBQVksTUFBTyxJQUFRLFlBQ3BELEdBQUksWUFBZSxLQUFXLEVBQUksT0FBUyxHQUFRLFVBQVUsS0FBTSxDQUNqRSxLQUFPLEVBQUksTUFBUSxHQUNqQixFQUFNLEVBQUksSUFFWixHQUFJLEVBQUksTUFBUSxFQUFHLE1BQU8sR0FBSSxFQUFHLEVBQUksS0FDckMsQUFBSSxFQUFJLE1BQVEsR0FBRyxFQUFPLEVBQUksS0FDOUIsRUFBSSxLQUFLLFNBQVUsRUFBSyxDQUN0QixFQUFJLEVBQUcsSUFDTixHQUNILFdBQ0ssQ0FDTCxHQUFJLEdBQU8sRUFBSSxLQUNmLEdBQUksTUFBTyxJQUFTLFdBQVksQ0FDOUIsR0FBSSxHQUFJLEdBQUksSUFBUSxFQUFLLEtBQUssSUFDOUIsRUFBRSxLQUFLLFNBQVUsRUFBSyxDQUNwQixFQUFJLEVBQUcsSUFDTixHQUNILFFBSU4sRUFBSyxHQUFLLEVBQ04sRUFBRSxHQUFjLEdBQ2xCLEVBQVEsR0FHWixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQUssT0FBUSxJQUMvQixFQUFJLEVBQUcsRUFBSyxPQUtsQixHQUFRLE9BQVMsU0FBVSxFQUFPLENBQ2hDLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sTUFJWCxHQUFRLEtBQU8sU0FBVSxFQUFRLENBQy9CLE1BQU8sSUFBSSxJQUFRLFNBQVUsRUFBUyxFQUFRLENBQzVDLEVBQU8sUUFBUSxTQUFTLEVBQU0sQ0FDNUIsR0FBUSxRQUFRLEdBQU8sS0FBSyxFQUFTLFFBTzNDLEdBQVEsVUFBVSxNQUFXLFNBQVUsRUFBWSxDQUNqRCxNQUFPLE1BQUssS0FBSyxLQUFNLE1Dekd6Qix3Q0FHQSxHQUFJLElBQVUsS0FFVixHQUFZLEdBR1osR0FBZ0IsR0FDaEIsR0FBb0IsR0FBUSx5QkFBeUIsSUFFekQsYUFBMkIsQ0FDdkIsR0FBSSxHQUFjLE9BQ2QsS0FBTSxJQUFjLFFBWTVCLEdBQU8sUUFBVSxHQUNqQixZQUFjLEVBQU0sQ0FDaEIsR0FBSSxHQUNKLEFBQUksR0FBVSxPQUNWLEVBQVUsR0FBVSxNQUVwQixFQUFVLEdBQUksSUFFbEIsRUFBUSxLQUFPLEVBQ2YsR0FBUSxHQUtaLGFBQW1CLENBQ2YsS0FBSyxLQUFPLEtBS2hCLEdBQVEsVUFBVSxLQUFPLFVBQVksQ0FDakMsR0FBSSxDQUNBLEtBQUssS0FBSyxhQUNMLEVBQVAsQ0FDRSxBQUFJLEdBQUssUUFJTCxHQUFLLFFBQVEsR0FLYixJQUFjLEtBQUssR0FDbkIsYUFFTixDQUNFLEtBQUssS0FBTyxLQUNaLEdBQVUsR0FBVSxRQUFVLFNDL0R0Qyx3Q0FLQSxHQUFJLElBQVUsS0FDVixHQUFPLEtBRVgsR0FBTyxRQUFVLEdBSWpCLEdBQVEsVUFBWSxTQUFVLEVBQUksRUFBZSxDQUMvQyxNQUNFLE9BQU8sSUFBa0IsVUFBWSxJQUFrQixJQUVoRCxHQUFtQixFQUFJLEdBRXZCLEdBQXNCLElBSWpDLEdBQUksSUFDRixnRUFJRixZQUE0QixFQUFJLEVBQWUsQ0FFN0MsT0FESSxHQUFPLEdBQ0YsRUFBSSxFQUFHLEVBQUksRUFBZSxJQUNqQyxFQUFLLEtBQUssSUFBTSxHQUVsQixHQUFJLEdBQU8sQ0FDVCxvQkFBc0IsRUFBSyxLQUFLLEtBQU8sTUFDdkMsbUJBQ0EseUNBQ0EscUJBQ0EsQ0FBQyxRQUFRLE9BQU8sR0FBTSxPQUFPLENBQUMsS0FBYSxLQUFLLEtBQ2hELEtBQ0EsYUFDQSw0REFDQSxpQ0FDQSxlQUNBLE1BQ0EsTUFDQSxLQUFLLElBQ1AsTUFBTyxVQUFTLENBQUMsVUFBVyxNQUFPLEdBQU0sR0FBUyxHQUVwRCxZQUErQixFQUFJLENBR2pDLE9BRkksR0FBVyxLQUFLLElBQUksRUFBRyxPQUFTLEVBQUcsR0FDbkMsRUFBTyxHQUNGLEVBQUksRUFBRyxFQUFJLEVBQVUsSUFDNUIsRUFBSyxLQUFLLElBQU0sR0FFbEIsR0FBSSxHQUFPLENBQ1Qsb0JBQXNCLEVBQUssS0FBSyxLQUFPLE1BQ3ZDLG1CQUNBLFlBQ0Esb0NBQ0EsMEJBQTRCLEVBQVcsTUFDdkMsMENBQ0EsK0NBQ0EsMEJBQ0EsSUFDQSxJQUNBLHlDQUNBLFlBQWMsR0FBYSxJQUMzQixXQUNBLHVCQUNBLEVBQUssT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFVLEVBQUcsRUFBTyxDQUM3QyxNQUNFLFFBQVcsRUFBUyxrQkFDRCxDQUFDLFFBQVEsT0FBTyxFQUFLLE1BQU0sRUFBRyxJQUFRLE9BQU8sTUFBTSxLQUFLLEtBQU8sYUFHbkYsS0FBSyxJQUNSLFdBQ0Esd0JBQ0EsOEJBQ0EsSUFFQSxhQUNBLDREQUNBLGlDQUNBLGVBQ0EsTUFDQSxNQUNBLEtBQUssSUFFUCxNQUFPLFVBQ0wsQ0FBQyxVQUFXLE1BQ1osR0FDQSxHQUFTLEdBR2IsR0FBUSxRQUFVLFNBQVUsRUFBSSxDQUM5QixNQUFPLFdBQVksQ0FDakIsR0FBSSxHQUFPLE1BQU0sVUFBVSxNQUFNLEtBQUssV0FDbEMsRUFDRixNQUFPLEdBQUssRUFBSyxPQUFTLElBQU8sV0FBYSxFQUFLLE1BQVEsS0FDekQsRUFBTSxLQUNWLEdBQUksQ0FDRixNQUFPLEdBQUcsTUFBTSxLQUFNLFdBQVcsUUFBUSxFQUFVLFNBQzVDLEVBQVAsQ0FDQSxHQUFJLElBQWEsTUFBUSxNQUFPLElBQVksWUFDMUMsTUFBTyxJQUFJLElBQVEsU0FBVSxFQUFTLEVBQVEsQ0FDNUMsRUFBTyxLQUdULEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLFFBTzdCLEdBQVEsVUFBVSxRQUFVLFNBQVUsRUFBVSxFQUFLLENBQ25ELEdBQUksTUFBTyxJQUFZLFdBQVksTUFBTyxNQUUxQyxLQUFLLEtBQUssU0FBVSxFQUFPLENBQ3pCLEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLEtBQU0sTUFFMUIsU0FBVSxFQUFLLENBQ2hCLEdBQUssVUFBWSxDQUNmLEVBQVMsS0FBSyxFQUFLLFVDOUh6Qix3Q0FFQSxHQUFJLElBQVUsS0FFZCxHQUFPLFFBQVUsR0FDakIsR0FBUSxrQkFBb0IsVUFBWSxDQUN0QyxHQUFRLFVBQVUsVUFBWSxVQUFXLENBQ3ZDLE1BQU8sTUFBSyxZQUFjLEdBRzVCLEdBQVEsVUFBVSxZQUFjLFVBQVcsQ0FDekMsTUFBTyxNQUFLLFlBQWMsR0FHNUIsR0FBUSxVQUFVLFdBQWEsVUFBVyxDQUN4QyxNQUFPLE1BQUssWUFBYyxHQUc1QixHQUFRLFVBQVUsU0FBVyxVQUFZLENBQ3ZDLEdBQUksS0FBSyxNQUFRLEVBQ2YsTUFBTyxNQUFLLElBQUksV0FHbEIsR0FBSSxDQUFDLEtBQUssY0FDUixLQUFNLElBQUksT0FBTSxpREFHbEIsTUFBTyxNQUFLLEtBR2QsR0FBUSxVQUFVLFVBQVksVUFBWSxDQUN4QyxHQUFJLEtBQUssTUFBUSxFQUNmLE1BQU8sTUFBSyxJQUFJLFlBR2xCLEdBQUksQ0FBQyxLQUFLLGFBQ1IsS0FBTSxJQUFJLE9BQU0sNERBR2xCLE1BQU8sTUFBSyxLQUdkLEdBQVEsVUFBVSxTQUFXLFVBQVksQ0FDdkMsTUFBSSxNQUFLLE1BQVEsRUFDUixLQUFLLElBQUksV0FFZCxLQUFLLE1BQVEsSUFBTSxLQUFLLE1BQVEsR0FDM0IsRUFHRixLQUFLLE1BSWhCLEdBQVEsbUJBQXFCLFVBQVcsQ0FDdEMsR0FBUSxVQUFVLFVBQVksT0FDOUIsR0FBUSxVQUFVLFlBQWMsT0FDaEMsR0FBUSxVQUFVLFdBQWEsT0FDL0IsR0FBUSxVQUFVLFNBQVcsT0FDN0IsR0FBUSxVQUFVLFVBQVksT0FDOUIsR0FBUSxVQUFVLFNBQVcsVUM1RC9CLHdDQUVBLEdBQU8sUUFBVSxLQUNqQixLQUNBLEtBQ0EsS0FDQSxLQUNBLE9DUEEsd0NBRUEsR0FBTyxRQUFVLE9DRmpCLDhCQUFPLFFBQVUsR0FDakIsR0FBTyxRQUFRLFFBQVUsR0FFekIsWUFBbUIsRUFBSyxDQUN0QixNQUFPLENBQUMsQ0FBQyxHQUFRLE9BQU8sSUFBUSxVQUFZLE1BQU8sSUFBUSxhQUFlLE1BQU8sR0FBSSxNQUFTLGNDSmhHLHdDQUVBLEdBQUksSUFBSyxLQUNMLEdBQVMsS0FDVCxHQUFVLEtBQ1YsR0FBWSxLQUVaLEdBQU0sR0FBTyxRQUFVLFNBQVUsRUFBYSxDQUNoRCxNQUFPLElBQUksSUFBWSxJQUV6QixHQUFHLFlBQWMsR0FDakIsR0FBRyxZQUFjLEdBQ2pCLEdBQUcsaUJBQW1CLEdBQ3RCLEdBQUcsVUFBWSxHQUNmLEdBQUcsZUFBaUIsR0FDcEIsQUFBSSxHQUFHLFNBQ0wsSUFBRyxTQUFXLEdBQVEsVUFBVSxHQUFHLFVBQ25DLEdBQUcsYUFBZSxHQUFHLGNBRXJCLElBQUcsU0FBVyxVQUFZLENBQUUsS0FBTSxJQUFJLE9BQU0sNEJBQzVDLEdBQUcsYUFBZSxVQUFZLENBQUUsS0FBTSxJQUFJLE9BQU0saUNBR2xELFlBQXFCLEVBQVEsQ0FDM0IsR0FBSSxNQUFPLElBQVcsV0FDcEIsTUFBTyxDQUFDLEdBQUksRUFBUSxhQUFjLElBQzdCLEdBQUksR0FBVSxNQUFPLElBQVcsVUFBWSxNQUFPLEdBQU8sSUFBTyxXQUFZLENBQ2xGLEdBQUksZ0JBQWtCLElBQ3BCLEdBQUksQ0FBQyxNQUFNLFFBQVEsRUFBTyxjQUN4QixLQUFNLElBQUksT0FBTSxtRUFHbEIsR0FBTyxhQUFlLEdBRXhCLE1BQU8sT0FFUCxNQUFNLElBQUksT0FBTSx5Q0FHcEIsWUFBMEIsRUFBUSxFQUFJLENBQ3BDLE1BQU8sSUFBUSxRQUFRLEdBQVEsS0FBSyxTQUFVLEVBQVEsQ0FDcEQsTUFBSSxJQUFVLEdBQVUsRUFBTyxJQUN0QixFQUFPLEdBQUcsS0FBSyxTQUFVLEVBQUksQ0FDbEMsU0FBTyxHQUFLLEVBQ0wsSUFHSixJQUNOLEtBQUssR0FBRyxhQUFhLFFBQVEsR0FFbEMsWUFBbUIsRUFBUSxDQUN6QixHQUFJLE1BQU8sSUFBVyxTQUNwQixNQUFPLENBQUMsS0FBTSxFQUFRLGFBQWMsSUFDL0IsR0FBSSxHQUFVLE1BQU8sSUFBVyxVQUFZLE1BQU8sR0FBTyxNQUFTLFNBQVUsQ0FDbEYsR0FBSSxnQkFBa0IsSUFDcEIsR0FBSSxDQUFDLE1BQU0sUUFBUSxFQUFPLGNBQ3hCLEtBQU0sSUFBSSxPQUFNLG1FQUdsQixHQUFPLGFBQWUsR0FFeEIsTUFBTyxPQUVQLE1BQU0sSUFBSSxPQUFNLHlDQUdwQixZQUF3QixFQUFRLEVBQUksQ0FDbEMsTUFBTyxJQUFRLFFBQVEsR0FBUSxLQUFLLFNBQVUsRUFBUSxDQUNwRCxNQUFJLElBQVUsR0FBVSxFQUFPLE1BQ3RCLEVBQU8sS0FBSyxLQUFLLFNBQVUsRUFBTSxDQUN0QyxTQUFPLEtBQU8sRUFDUCxJQUdKLElBQ04sS0FBSyxHQUFHLFdBQVcsUUFBUSxHQUdoQyxZQUFxQixFQUFJLENBQ3ZCLEdBQU8sRUFBSSxpQ0FDWCxHQUFPLE1BQU8sR0FBRyxNQUFTLFNBQVUsZ0NBQ3BDLEdBQU8sTUFBTyxHQUFHLGNBQWlCLFNBQVUsMENBQzVDLEdBQU8sQ0FDTCxVQUNBLGVBQ0EsY0FDQSxtQkFDQSxnQkFDQSxxQkFDQSxvQkFDQSx5QkFDQSxTQUNBLGNBQ0EsYUFDQSxtQkFDQSxLQUFLLFNBQVUsRUFBUSxDQUN2QixNQUFPLE9BQU8sR0FBRyxJQUFZLGFBQzNCLHFFQUNKLEtBQUssSUFBTSxFQUNYLEtBQUssS0FBTyxLQUFLLElBQUksS0FDckIsS0FBSyxhQUFlLEtBQUssSUFBSSxhQUM3QixLQUFLLGFBQWUsS0FBSyxJQUFJLGNBQWdCLENBQUMsS0FBSyxNQUdyRCxHQUFJLElBQVksQ0FDZCxRQUFTLENBQUMsVUFBVyxVQUNyQixhQUFjLENBQUMsZUFBZ0IsVUFBVyxVQUMxQyxZQUFhLENBQUMsY0FBZSxVQUFXLGFBQWMsVUFDdEQsaUJBQWtCLENBQ2hCLG1CQUFvQixjQUFlLGVBQWdCLFVBQ25ELGFBQWMsVUFFaEIsY0FBZSxDQUFDLGlCQUNoQixtQkFBb0IsQ0FBQyxxQkFBc0IsaUJBQzNDLGtCQUFtQixDQUFDLG9CQUFxQixpQkFDekMsdUJBQXdCLENBQ3RCLHlCQUEwQixvQkFBcUIscUJBQXNCLGlCQUV2RSxPQUFRLENBQUMsU0FBVSxXQUNuQixZQUFhLENBQUMsY0FBZSxTQUFVLGVBQWdCLFdBQ3ZELFdBQVksQ0FBQyxhQUFjLFNBQVUsY0FBZSxXQUNwRCxnQkFBaUIsQ0FDZixrQkFBbUIsYUFBYyxjQUFlLFNBQ2hELG1CQUFvQixjQUFlLGVBQWdCLFlBSXZELEdBQVksVUFBVSxXQUFhLFNBQVUsRUFBUSxDQUNuRCxNQUFPLE9BQU8sTUFBSyxJQUFJLElBQVksWUFFckMsR0FBWSxVQUFVLElBQU0sU0FBVSxFQUFRLENBQzVDLE1BQU8sSUFBVSxHQUFRLEtBQUssU0FBVSxFQUFRLENBQzlDLE1BQU8sTUFBSyxXQUFXLElBQ3ZCLEtBQUssUUFLVCxHQUFZLFVBQVUsUUFBVSxTQUFVLEVBQUssRUFBUyxDQUN0RCxHQUFJLENBQUMsS0FBSyxXQUFXLFdBQVksQ0FDL0IsR0FBSSxLQUFLLElBQUksVUFBVyxDQUN0QixHQUFJLEdBQVEsS0FDWixNQUFPLENBQ0wsR0FBSSxTQUFVLEVBQVEsQ0FDcEIsTUFBTyxJQUFHLFVBQVUsRUFBTSxJQUFJLE9BQU8sRUFBSyxFQUFTLElBQVMsTUFFOUQsYUFBYyxJQUdsQixLQUFJLE1BQUssSUFBSSxnQkFDTCxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyw4Q0FDdkMsS0FBSyxJQUFJLG9CQUNaLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhDQUUxQyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyxrQ0FHcEQsTUFBTyxJQUFHLFlBQVksS0FBSyxJQUFJLFFBQVEsRUFBSyxLQUU5QyxHQUFZLFVBQVUsYUFBZSxTQUFVLEVBQUssRUFBUyxFQUFJLENBQy9ELE1BQUssTUFBSyxJQUFJLGdCQUdWLEtBQUssV0FBVyxnQkFDWCxHQUFHLGlCQUFpQixLQUFLLElBQUksYUFBYSxFQUFLLEdBQVUsR0FFekQsR0FBRyxpQkFBaUIsS0FBSyxRQUFRLEVBQUssR0FBVSxHQUxoRCxHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBQStDLFFBQVEsSUFRM0gsR0FBWSxVQUFVLFlBQWMsU0FBVSxFQUFVLEVBQVMsQ0FDL0QsR0FBSSxDQUFDLEtBQUssSUFBSSxlQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sOENBRWxELE1BQUksTUFBSyxXQUFXLGVBQ1gsR0FBRyxZQUFZLEtBQUssSUFBSSxZQUFZLEVBQVUsSUFDNUMsS0FBSyxXQUFXLGNBQ2xCLEdBQUcsWUFBWSxTQUFVLEVBQVEsQ0FDdEMsTUFBTyxJQUFHLFVBQVUsS0FBSyxJQUFJLFdBQVcsRUFBVSxFQUFTLElBQVMsTUFDcEUsS0FBSyxPQUVGLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsS0FBSyxRQUFRLEdBQUcsYUFBYSxFQUFVLFFBQVMsS0FHM0QsR0FBWSxVQUFVLGlCQUFtQixTQUFVLEVBQVUsRUFBUyxFQUFJLENBQ3hFLE1BQUssTUFBSyxJQUFJLG9CQUdWLEtBQUssV0FBVyxvQkFDWCxHQUFHLGlCQUFpQixLQUFLLElBQUksaUJBQWlCLEVBQVUsR0FBVSxHQUNoRSxLQUFLLFdBQVcsZ0JBQWtCLEtBQUssV0FBVyxjQUNwRCxHQUFHLGlCQUFpQixLQUFLLFlBQVksRUFBVSxHQUFVLEdBRTNELElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxpQkFBaUIsR0FBRyxTQUFTLEVBQVUsUUFBUSxLQUFLLFNBQVUsRUFBSyxDQUMzRSxNQUFJLE1BQUssV0FBVyxnQkFDWCxLQUFLLElBQUksYUFBYSxFQUFLLEdBRTNCLEtBQUssUUFBUSxFQUFLLElBRTNCLEtBQUssT0FBUSxJQWZSLEdBQVEsT0FBTyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTyxvQ0FzQnBFLEdBQVksVUFBVSxjQUFnQixTQUFVLEVBQUssRUFBUyxDQUM1RCxHQUFJLENBQUMsS0FBSyxJQUFJLGlCQUNaLEtBQUksTUFBSyxJQUFJLHNCQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhEQUN2QyxLQUFLLElBQUksMEJBQ1osR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sOERBRTFDLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLCtDQUdwRCxNQUFPLElBQUcsVUFBVSxLQUFLLElBQUksY0FBYyxFQUFLLEtBRWxELEdBQVksVUFBVSxtQkFBcUIsU0FBVSxFQUFLLEVBQVMsRUFBSSxDQUNyRSxNQUFLLE1BQUssSUFBSSxzQkFPVixLQUFLLFdBQVcsc0JBQ1gsR0FBRyxlQUFlLEtBQUssSUFBSSxtQkFBbUIsRUFBSyxHQUFVLEdBRTdELEdBQUcsZUFBZSxLQUFLLElBQUksY0FBYyxFQUFLLEdBQVUsR0FUM0QsS0FBSyxJQUFJLDBCQUNKLEdBQVEsT0FBTyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrREFBK0QsUUFBUSxHQUVoSSxHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sZ0RBQWdELFFBQVEsSUFTOUgsR0FBWSxVQUFVLGtCQUFvQixTQUFVLEVBQVUsRUFBUyxDQUNyRSxHQUFJLENBQUMsS0FBSyxJQUFJLHFCQUNaLEtBQUksTUFBSyxJQUFJLDBCQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLDhEQUUxQyxHQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrQ0FHcEQsTUFBSSxNQUFLLFdBQVcscUJBQ1gsR0FBRyxVQUFVLEtBQUssSUFBSSxrQkFBa0IsRUFBVSxJQUVwRCxJQUFTLEdBQVUsSUFDcEIsRUFBUSxXQUFhLFFBQVcsR0FBUSxTQUFXLEdBQ2hELEdBQUcsVUFBVSxLQUFLLElBQUksY0FBYyxHQUFHLGFBQWEsRUFBVSxRQUFTLE1BR2xGLEdBQVksVUFBVSx1QkFBeUIsU0FBVSxFQUFVLEVBQVMsRUFBSSxDQUM5RSxNQUFLLE1BQUssSUFBSSwwQkFHVixLQUFLLFdBQVcsMEJBQ1gsR0FBRyxlQUFlLEtBQUssSUFBSSx1QkFBdUIsRUFBVSxHQUFVLEdBQ3BFLEtBQUssV0FBVyxxQkFDbEIsR0FBRyxlQUFlLEtBQUssSUFBSSxrQkFBa0IsRUFBVSxHQUFVLEdBRW5FLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxlQUFlLEdBQUcsU0FBUyxFQUFVLFFBQVEsS0FBSyxTQUFVLEVBQUssQ0FDekUsTUFBSSxNQUFLLFdBQVcsc0JBQ1gsS0FBSyxJQUFJLG1CQUFtQixFQUFLLEdBRWpDLEtBQUssSUFBSSxjQUFjLEVBQUssSUFFckMsS0FBSyxPQUFRLElBZlIsR0FBUSxPQUFPLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGdEQUFnRCxRQUFRLElBcUI1SCxHQUFZLFVBQVUsT0FBUyxTQUFVLEVBQUssRUFBUyxFQUFRLENBQzdELEdBQUksQ0FBQyxLQUFLLElBQUksVUFDWixLQUFJLE1BQUssSUFBSSxlQUNMLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLCtDQUN2QyxLQUFLLElBQUksbUJBQ1osR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBRTFDLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGdDQUdwRCxHQUFJLEtBQUssV0FBVyxVQUNsQixNQUFPLElBQUcsVUFBVSxLQUFLLElBQUksT0FBTyxFQUFLLEVBQVMsSUFFbEQsR0FBSSxHQUFXLEdBQUcsWUFBWSxLQUFLLElBQUksUUFBUSxFQUFLLElBQ2hELEVBQU8sRUFBUyxHQUFHLEdBQVUsR0FDakMsR0FBSSxNQUFPLElBQVMsU0FDbEIsS0FBTSxJQUFJLE9BQU0sa0JBQW9CLEtBQUssS0FBTywrQ0FFbEQsTUFBTyxJQUFHLFVBQVUsQ0FBQyxLQUFNLEVBQU0sYUFBYyxFQUFTLGdCQUc1RCxHQUFZLFVBQVUsWUFBYyxTQUFVLEVBQUssRUFBUyxFQUFRLEVBQUksQ0FLdEUsTUFKSSxPQUFPLElBQVcsWUFDcEIsR0FBSyxFQUNMLEVBQVMsR0FFUCxBQUFDLEtBQUssSUFBSSxlQU9WLEtBQUssV0FBVyxlQUNYLEdBQUcsZUFBZSxLQUFLLElBQUksWUFBWSxFQUFLLEVBQVMsR0FBUyxHQUM1RCxLQUFLLFdBQVcsVUFDbEIsR0FBRyxlQUFlLEtBQUssSUFBSSxPQUFPLEVBQUssRUFBUyxHQUFTLEdBRXpELEdBQUcsZUFBZSxLQUFLLGFBQWEsRUFBSyxHQUFTLEtBQUssU0FBVSxFQUFVLENBQ2hGLE1BQU8sQ0FBQyxLQUFNLEVBQVMsR0FBRyxHQUFVLEdBQVUsYUFBYyxFQUFTLGdCQUNuRSxHQWJBLEtBQUssSUFBSSxtQkFDSixHQUFRLE9BQU8sR0FBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sZ0RBQWdELFFBQVEsR0FFakgsR0FBUSxPQUFPLEdBQUksT0FBTSxrQkFBb0IsS0FBSyxLQUFPLGlDQUFpQyxRQUFRLElBYS9HLEdBQVksVUFBVSxXQUFhLFNBQVUsRUFBVSxFQUFTLEVBQVEsQ0FDdEUsR0FBSSxDQUFDLEtBQUssSUFBSSxjQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8sK0NBR2xELEdBQUksS0FBSyxXQUFXLGNBQ2xCLE1BQU8sSUFBRyxVQUFVLEtBQUssSUFBSSxXQUFXLEVBQVUsRUFBUyxJQUN0RCxHQUFJLEtBQUssV0FBVyxVQUN6QixNQUFLLElBQVMsR0FBVSxJQUNwQixFQUFRLFdBQWEsUUFBVyxHQUFRLFNBQVcsR0FDaEQsR0FBRyxVQUFVLEtBQUssSUFBSSxPQUFPLEdBQUcsYUFBYSxFQUFVLFFBQVMsRUFBUyxJQUVoRixHQUFJLEdBQVcsS0FBSyxZQUFZLEVBQVUsR0FDMUMsTUFBTyxJQUFHLFVBQVUsQ0FBQyxLQUFNLEVBQVMsR0FBRyxHQUFVLEdBQVUsYUFBYyxFQUFTLGdCQUd0RixHQUFZLFVBQVUsZ0JBQWtCLFNBQVUsRUFBVSxFQUFTLEVBQVEsRUFBSSxDQUMvRSxHQUFJLENBQUMsS0FBSyxJQUFJLG1CQUNaLEtBQU0sSUFBSSxPQUFNLGtCQUFvQixLQUFLLEtBQU8saUNBT2xELE1BSkksT0FBTyxJQUFXLFlBQ3BCLEdBQUssRUFDTCxFQUFTLEdBRVAsS0FBSyxXQUFXLG1CQUNYLEdBQUcsZUFBZSxLQUFLLElBQUksZ0JBQWdCLEVBQVUsRUFBUyxHQUFTLEdBQ3JFLEtBQUssV0FBVyxjQUNsQixHQUFHLGVBQWUsS0FBSyxJQUFJLFdBQVcsRUFBVSxFQUFTLEdBQVMsR0FDaEUsS0FBSyxXQUFXLFlBQWMsS0FBSyxXQUFXLGlCQUMzQyxLQUFLLFdBQVcsZ0JBQWtCLEtBQUssV0FBVyxvQkFDdkQsR0FBRyxlQUFlLEtBQUssaUJBQWlCLEVBQVUsR0FBUyxLQUFLLFNBQVUsRUFBVSxDQUN6RixNQUFPLENBQUMsS0FBTSxFQUFTLEdBQUcsR0FBVSxHQUFVLGFBQWMsRUFBUyxnQkFDbkUsR0FFQyxJQUFTLEdBQVUsSUFDcEIsRUFBUSxXQUFhLFFBQVcsR0FBUSxTQUFXLEdBQ2hELEdBQUcsZUFBZSxHQUFHLFNBQVMsRUFBVSxRQUFRLEtBQUssU0FBVSxFQUFLLENBQ3pFLE1BQU8sTUFBSyxZQUFZLEVBQUssRUFBUyxJQUN0QyxLQUFLLE9BQVEsT0NwV25CLCtSQXlCTyxhQUFzQixDQUMzQixHQUFJLE1BQU8sS0FBZ0IsWUFBYSxDQUN0QyxHQUFJLEdBQUksR0FBSSxhQUFZLEdBQ3BCLEVBQUksR0FBSSxZQUFXLEdBQ25CLEVBQUksR0FBSSxhQUFZLEdBR3hCLEdBRkEsRUFBRSxHQUFLLEVBQ1AsRUFBRSxHQUFLLEVBQ0gsRUFBRSxLQUFPLElBQ1gsR0FBYyxhQUNMLEVBQUUsS0FBTyxJQUNsQixHQUFjLFNBRWQsTUFBTSxJQUFJLE9BQU0sa0NBR3BCLE1BQU8sSUFHRixhQUFvQixDQUN6QixNQUFJLE9BQU8sUUFBTyxVQUFhLFlBQ3RCLE9BQU8sU0FBUyxTQUNYLEdBR1QsYUFBbUIsQ0FDeEIsTUFBTyxHQUdGLGFBQWtCLENBQ3ZCLE1BQU8sR0FHRixhQUFtQixDQUN4QixNQUFPLFFBQU8sVUFHVCxhQUFvQixDQUN6QixNQUFPLFFBQU8sVUFHVCxhQUFnQixDQUNyQixNQUFPLEdBR0YsYUFBZ0IsQ0FDckIsTUFBTyxVQUdGLGFBQW9CLENBQ3pCLE1BQUksT0FBTyxRQUFPLFdBQWMsWUFDdkIsT0FBTyxVQUFVLFdBRW5CLEdBR0YsYUFBNEIsRUFDNUIsYUFBK0IsRUFFL0IsYUFBZ0IsQ0FDckIsTUFBTyxhQUdGLGFBQW9CLENBQ3pCLE1BQU8sVUFHRixhQUFrQixDQUN2QixNQUFPLE9BNUZULEdBd0JJLElBc0VPLEdBRUEsR0FDSixHQWpHUCxtQkE4Rk8sQUFBSSxHQUFTLEdBRVQsR0FBTTtBQUFBLEVBQ1YsR0FBUSxDQUNiLElBQUssR0FDTCxPQUFRLEdBQ1IsT0FBUSxHQUNSLGtCQUFrQixHQUNsQixxQkFBc0IsR0FDdEIsUUFBUyxHQUNULEtBQU0sR0FDTixLQUFNLEdBQ04sU0FBVSxHQUNWLFFBQVMsR0FDVCxPQUFRLEdBQ1IsUUFBUyxHQUNULFNBQVUsR0FDVixXQUFZLE1DL0dkLDJCQUNBLEdBQU0sSUFBVyxVQUVqQixHQUFJLElBQVksR0FBUyxRQUFTLENBQzlCLEdBQU8sUUFBVSxHQUFTLFFBQzFCLE9BQVMsS0FBSyxJQUNWLEdBQU8sUUFBUSxHQUFLLEdBQVMsT0FFOUIsQUFBSSxLQUNQLElBQU8sUUFBVSxNQ1RyQix3Q0FFQSxHQUFJLElBQUssS0FJVCxHQUFPLFFBQVUsR0FBRyxTQUFXLFVBQW1CLENBQzlDLEdBQUksR0FBTyxFQUFRLElBQUksS0FDbkIsRUFBTyxFQUFRLElBQUksU0FBVyxFQUFRLElBQUksTUFBUSxFQUFRLElBQUksT0FBUyxFQUFRLElBQUksU0FFdkYsTUFBSSxHQUFRLFdBQWEsUUFDZCxFQUFRLElBQUksYUFBZSxFQUFRLElBQUksVUFBWSxFQUFRLElBQUksVUFBWSxHQUFRLEtBRzFGLEVBQVEsV0FBYSxTQUNkLEdBQVMsR0FBTyxVQUFZLEVBQU8sTUFHMUMsRUFBUSxXQUFhLFFBQ2QsR0FBUyxHQUFRLFdBQWEsRUFBSSxRQUFXLEVBQU8sU0FBVyxFQUFPLE1BRzFFLEdBQVEsUUN0Qm5CLDhCQUFPLFFBQVUsVUFBWSxDQUV6QixHQUFJLEdBQXdCLE1BQU0sa0JBQ2xDLE1BQU0sa0JBQW9CLFNBQVUsRUFBRyxFQUFPLENBQUUsTUFBTyxJQUN2RCxHQUFJLEdBQVMsR0FBSSxTQUFTLE1BQzFCLGFBQU0sa0JBQW9CLEVBQ25CLEVBQU0sR0FBRyxpQkNOcEIsd0NBRUEsR0FBSSxJQUFZLEVBQVEsV0FBYSxRQUdqQyxHQUNBLDZIQUVBLEdBQVEsR0FFWixZQUF3QixFQUFVLENBQ2hDLE1BQU8sSUFBZSxLQUFLLEdBQVUsTUFBTSxHQUc3QyxHQUFNLE1BQVEsU0FBUyxFQUFZLENBQ2pDLEdBQUksTUFBTyxJQUFlLFNBQ3hCLEtBQU0sSUFBSSxXQUNOLGdEQUFrRCxNQUFPLElBRy9ELEdBQUksR0FBVyxHQUFlLEdBQzlCLEdBQUksQ0FBQyxHQUFZLEVBQVMsU0FBVyxFQUNuQyxLQUFNLElBQUksV0FBVSxpQkFBbUIsRUFBYSxLQUV0RCxNQUFPLENBQ0wsS0FBTSxFQUFTLEdBQ2YsSUFBSyxFQUFTLEtBQU8sRUFBUyxHQUFLLEVBQVMsR0FBSyxFQUFTLEdBQUcsTUFBTSxFQUFHLElBQ3RFLEtBQU0sRUFBUyxHQUNmLElBQUssRUFBUyxHQUNkLEtBQU0sRUFBUyxLQVFuQixHQUFJLElBQ0EsOERBQ0EsR0FBUSxHQUdaLFlBQXdCLEVBQVUsQ0FDaEMsTUFBTyxJQUFZLEtBQUssR0FBVSxNQUFNLEdBSTFDLEdBQU0sTUFBUSxTQUFTLEVBQVksQ0FDakMsR0FBSSxNQUFPLElBQWUsU0FDeEIsS0FBTSxJQUFJLFdBQ04sZ0RBQWtELE1BQU8sSUFHL0QsR0FBSSxHQUFXLEdBQWUsR0FDOUIsR0FBSSxDQUFDLEdBQVksRUFBUyxTQUFXLEVBQ25DLEtBQU0sSUFBSSxXQUFVLGlCQUFtQixFQUFhLEtBR3RELE1BQU8sQ0FDTCxLQUFNLEVBQVMsR0FDZixJQUFLLEVBQVMsR0FBRyxNQUFNLEVBQUcsSUFDMUIsS0FBTSxFQUFTLEdBQ2YsSUFBSyxFQUFTLEdBQ2QsS0FBTSxFQUFTLEtBS25CLEFBQUksR0FDRixHQUFPLFFBQVUsR0FBTSxNQUV2QixHQUFPLFFBQVUsR0FBTSxNQUV6QixHQUFPLFFBQVEsTUFBUSxHQUFNLE1BQzdCLEdBQU8sUUFBUSxNQUFRLEdBQU0sUUMxRTdCLDhCQUFJLElBQU8sS0FDUCxHQUFRLEdBQUssT0FBUyxLQUV0QixHQUFxQixTQUE0QixFQUFlLEVBQVMsQ0FDekUsR0FBSSxHQUFTLElBQ2IsQUFBSyxlQUFnQixLQUFLLEdBQ3RCLEVBQVMsR0FDRCxRQUFTLEtBQUssSUFDdEIsR0FBUyxRQUtiLE9BRkksR0FBUSxDQUFDLEdBQ1QsRUFBUyxHQUFNLEdBQ1osRUFBTyxNQUFRLEVBQU0sRUFBTSxPQUFTLElBQ3ZDLEVBQU0sS0FBSyxFQUFPLEtBQ2xCLEVBQVMsR0FBTSxFQUFPLEtBRzFCLE1BQU8sR0FBTSxPQUFPLFNBQVUsRUFBTSxFQUFPLENBQ3ZDLE1BQU8sR0FBSyxPQUFPLEVBQVEsSUFBSSxTQUFVLEVBQVcsQ0FDaEQsTUFBTyxJQUFLLFFBQVEsRUFBUSxFQUFPLE9BRXhDLEtBR1AsR0FBTyxRQUFVLFNBQTBCLEVBQU8sRUFBTSxFQUFTLENBQzdELEdBQUksR0FBVSxHQUFRLEVBQUssZ0JBQ3JCLEdBQUcsT0FBTyxFQUFLLGlCQUNmLENBQUMsZ0JBRVAsR0FBSSxHQUFRLE1BQU8sR0FBSyxPQUFVLFdBQzlCLE1BQU8sR0FBSyxNQUNSLEVBQ0EsRUFDQSxVQUFZLENBQUUsTUFBTyxJQUFtQixFQUFPLElBQy9DLEdBSVIsR0FBSSxHQUFPLEdBQW1CLEVBQU8sR0FDckMsTUFBTyxJQUFRLEVBQUssTUFBUSxFQUFLLE9BQU8sRUFBSyxPQUFTLEtDeEMxRCw4QkFBTyxRQUFVLFNBQVUsRUFBRyxFQUFNLENBUWhDLE1BQU8sSUFBUSxvNkpDUm5CLHdDQUVBLEdBQUksSUFBTSxLQUVWLFlBQTJCLEVBQVMsRUFBVyxDQU05QyxPQUxJLEdBQVksRUFBUSxNQUFNLEtBQzFCLEVBQVEsRUFBVSxNQUFNLEtBQ3hCLEVBQUssRUFBTSxPQUFTLEVBQUksRUFBTSxHQUFLLElBQ25DLEVBQWdCLEdBQU0sT0FBUyxFQUFJLEVBQU0sR0FBSyxFQUFNLElBQUksTUFBTSxLQUV6RCxFQUFJLEVBQUcsRUFBSSxFQUFHLEVBQUUsRUFBRyxDQUMzQixHQUFJLEdBQU0sU0FBUyxFQUFVLElBQU0sRUFBRyxJQUNsQyxFQUFNLFNBQVMsRUFBYSxJQUFNLEVBQUcsSUFDekMsR0FBSSxJQUFRLEVBR1osTUFBSSxLQUFPLElBQ0gsRUFBTSxFQUVWLElBQU8sS0FDSCxHQUFPLEVBRVIsR0FFUixNQUFPLEtBQU8sS0FHZixZQUFzQixFQUFTLEVBQU8sQ0FDckMsR0FBSSxHQUFhLEVBQU0sTUFBTSxVQUM3QixHQUFJLEVBQVcsU0FBVyxFQUN6QixNQUFPLEdBRVIsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFXLE9BQVEsRUFBRSxFQUN4QyxHQUFJLENBQUMsR0FBa0IsRUFBUyxFQUFXLElBQzFDLE1BQU8sR0FHVCxNQUFPLEdBR1IsWUFBeUIsRUFBYSxFQUFnQixDQUNyRCxHQUFJLE1BQU8sSUFBbUIsVUFDN0IsTUFBTyxHQUdSLEdBQUksR0FBVSxNQUFPLElBQWdCLFlBQ2xDLEVBQVEsVUFBWSxFQUFRLFNBQVMsS0FDckMsRUFFSCxHQUFJLE1BQU8sSUFBWSxTQUN0QixNQUFPLEdBR1IsR0FBSSxHQUFrQixNQUFPLElBQW1CLFNBQVUsQ0FDekQsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFlLE9BQVEsRUFBRSxFQUM1QyxHQUFJLEdBQWEsRUFBUyxFQUFlLElBQ3hDLE1BQU8sR0FHVCxNQUFPLEdBRVIsTUFBTyxJQUFhLEVBQVMsR0FHOUIsR0FBSSxJQUFPLEtBRVgsR0FBTyxRQUFVLFNBQWdCLEVBQUcsRUFBYSxDQUNoRCxNQUFPLElBQUksR0FBTSxJQUFNLEdBQWdCLEVBQWEsR0FBSyxPQ25FMUQsOEJBQUksSUFBSyxLQUNMLEdBQWEsS0FDYixHQUFPLEtBQ1AsR0FBUyxLQUNULEdBQW1CLEtBQ25CLEdBQW1CLEtBQ25CLEdBQVMsS0FFVCxHQUFhLEVBQVEsV0FBYSxTQUFXLEdBQUcsVUFBWSxNQUFPLElBQUcsU0FBUyxRQUFXLFdBQWEsR0FBRyxTQUFTLE9BQVMsR0FBRyxTQUUvSCxHQUFVLEtBQ1YsR0FBZSxVQUFZLENBQzNCLE1BQU8sQ0FDSCxHQUFLLEtBQUssR0FBUyxpQkFDbkIsR0FBSyxLQUFLLEdBQVMscUJBSXZCLEdBQWdCLFNBQWdCLEVBQU0sRUFBSSxDQUMxQyxHQUFHLEtBQUssRUFBTSxTQUFVLEVBQUssRUFBTSxDQUMvQixNQUFLLEdBR0QsRUFBSSxPQUFTLFVBQVksRUFBSSxPQUFTLFVBQWtCLEVBQUcsS0FBTSxJQUM5RCxFQUFHLEdBSEMsRUFBRyxLQUFNLEVBQUssVUFBWSxFQUFLLGFBTzlDLEdBQWUsU0FBcUIsRUFBSyxFQUFJLENBQzdDLEdBQUcsS0FBSyxFQUFLLFNBQVUsRUFBSyxFQUFNLENBQzlCLE1BQUssR0FHRCxFQUFJLE9BQVMsVUFBWSxFQUFJLE9BQVMsVUFBa0IsRUFBRyxLQUFNLElBQzlELEVBQUcsR0FIQyxFQUFHLEtBQU0sRUFBSyxrQkFPN0IsR0FBa0IsU0FBa0IsRUFBRyxFQUFJLENBQzNDLEdBQVcsRUFBRyxTQUFVLEVBQWEsRUFBVSxDQUMzQyxBQUFJLEdBQWUsRUFBWSxPQUFTLFNBQVUsRUFBRyxHQUNoRCxFQUFHLEtBQU0sRUFBYyxFQUFJLE1BSXBDLEdBQWdCLFNBQXVCLEVBQVUsRUFBRyxFQUFNLEVBQUksQ0FDOUQsQUFBSSxHQUFRLEVBQUssbUJBQXFCLEdBQ2xDLEVBQVMsRUFBRyxHQUVaLEVBQUcsS0FBTSxJQUliLEdBQXFCLFNBQTRCLEVBQVUsRUFBUyxFQUFJLENBQ3hFLEVBQVMsRUFBUyxTQUFVLEVBQWEsRUFBTSxDQUMzQyxHQUFJLEVBQWEsRUFBRyxPQUVoQixJQUFJLENBQ0EsR0FBSSxHQUFNLEtBQUssTUFBTSxHQUNyQixFQUFHLEtBQU0sU0FDSixFQUFQLENBQ0UsRUFBRyxVQU1mLEdBQXVCLFNBQThCLEVBQUcsRUFBTyxFQUFNLENBRXJFLE9BREksR0FBTyxHQUFpQixFQUFPLEVBQU0sR0FDaEMsRUFBSSxFQUFHLEVBQUksRUFBSyxPQUFRLElBQzdCLEVBQUssR0FBSyxHQUFLLEtBQUssRUFBSyxHQUFJLEdBRWpDLE1BQU8sSUFHWCxHQUFPLFFBQVUsU0FBaUIsRUFBRyxFQUFTLEVBQVUsQ0FDcEQsR0FBSSxHQUFLLEVBQ0wsRUFBTyxFQUtYLEdBSkksTUFBTyxJQUFZLFlBQ25CLEdBQUssRUFDTCxFQUFPLElBRVAsTUFBTyxJQUFNLFNBQVUsQ0FDdkIsR0FBSSxHQUFNLEdBQUksV0FBVSwwQkFDeEIsTUFBTyxHQUFRLFNBQVMsVUFBWSxDQUNoQyxFQUFHLEtBSVgsRUFBTyxHQUFpQixFQUFHLEdBRTNCLEdBQUksR0FBUyxFQUFLLFFBQVUsR0FDeEIsRUFBYyxFQUFLLGFBQWUsR0FDbEMsRUFBVyxFQUFLLFVBQVksR0FBRyxTQUMvQixFQUFXLEVBQUssVUFBWSxHQUM1QixFQUFjLEVBQUssYUFBZSxHQUN0QyxHQUFJLEVBQUssVUFBWSxFQUFLLFlBQWEsQ0FDbkMsR0FBSSxHQUFjLEdBQUksV0FBVSx3REFDaEMsTUFBTyxHQUFRLFNBQVMsVUFBWSxDQUNoQyxFQUFHLEtBR1gsR0FBSSxHQUFrQixFQUFLLGdCQUV2QixFQUFhLEVBQUssWUFBYyxDQUFDLE9BQ2pDLEVBQXFCLEVBQUsscUJBQXVCLEdBQ2pELEVBQVUsRUFBSyxTQUFXLEdBQUssUUFBUSxNQUN2QyxFQUFTLEVBQUssVUFBWSxFQUU5QixFQUFLLE1BQVEsRUFBSyxPQUFTLEtBRzNCLEdBQUksSUFBZ0IsR0FBSyxRQUFRLEdBRWpDLEdBQ0ksRUFDQSxHQUNBLEVBQ0EsU0FBVSxHQUFLLEdBQVcsQ0FDdEIsQUFBSSxHQUFLLEVBQUcsSUFDUCxFQUFLLE1BSWxCLEdBQUksR0FDSixXQUFjLEdBQVMsQ0FDbkIsR0FBSywwQ0FBMkMsS0FBSyxHQUNqRCxFQUFNLEdBQUssUUFBUSxHQUFTLEdBQ3hCLEtBQU0sS0FBTyxJQUFNLE1BQVEsRUFBRSxNQUFNLE1BQVEsTUFBSyxJQUFPLEtBQzNELEFBQUssTUFBTyxLQUFLLElBQU0sSUFBUSxHQUMzQixHQUFnQixFQUFLLEVBQUssUUFBUyxJQUNoQyxHQUFXLEVBQUssRUFBSyxRQUFTLFFBQ2xDLElBQUksR0FBc0IsR0FBTyxHQUNwQyxNQUFPLEdBQUcsS0FBTSxHQUNiLEdBQWdCLEVBQUcsR0FBUyxTQUFVLEdBQUssR0FBRyxHQUFLLENBQ3RELEdBQUksR0FBSyxFQUFHLFFBQ1AsSUFBSSxHQUNMLE1BQU8sSUFBYyxFQUFVLEdBQUcsRUFBTSxTQUFVLEdBQUssR0FBTyxDQUMxRCxBQUFJLEdBQ0EsRUFBRyxJQUVILEVBQUcsS0FBTSxHQUFPLE1BSXhCLEdBQUksSUFBYyxHQUFJLE9BQU0sdUJBQXlCLEVBQUksV0FBYSxFQUFTLEtBQy9FLEdBQVksS0FBTyxtQkFDbkIsRUFBRyxRQUtmLFlBQWdCLEdBQUssR0FBRyxHQUFLLENBQ3pCLEFBQUksR0FBSyxFQUFHLElBQ1AsQUFBSSxHQUFHLEVBQUcsS0FBTSxHQUFHLElBQ25CLEdBQWdCLEVBQUssU0FBVSxHQUFLLEdBQUcsR0FBSyxDQUM3QyxHQUFJLEdBQUssRUFBRyxZQUNILEdBQ0wsR0FBYyxFQUFVLEdBQUcsRUFBTSxTQUFVLEdBQUssR0FBTyxDQUNuRCxBQUFJLEdBQ0EsRUFBRyxJQUVILEVBQUcsS0FBTSxHQUFPLFVBR3JCLENBQ0gsR0FBSSxJQUFjLEdBQUksT0FBTSx1QkFBeUIsRUFBSSxXQUFhLEVBQVMsS0FDL0UsR0FBWSxLQUFPLG1CQUNuQixFQUFHLE9BS2YsWUFBb0IsR0FBRyxHQUFZLEdBQVUsQ0FDekMsR0FBSSxJQUFvQixHQUNwQixHQUFLLEdBQ1QsQUFBSSxNQUFPLEtBQXNCLFlBQzdCLElBQUssR0FDTCxHQUFvQixRQUd4QixHQUFJLElBQU8sQ0FBQyxJQUFJLE9BQU8sR0FDdkIsR0FBSyxHQUFNLEdBQUcsSUFFZCxZQUFjLEdBQU0sR0FBRyxHQUFhLENBQ2hDLEdBQUksR0FBSyxTQUFXLEVBQUcsTUFBTyxJQUFHLEtBQU0sT0FBVyxJQUNsRCxHQUFJLElBQU8sR0FBSSxHQUFLLEdBRWhCLEdBQU0sR0FDVixBQUFJLEdBQUssR0FBTSxLQUFNLElBQ2hCLEdBQVEsR0FBSyxRQUFRLElBQU8sSUFFakMsWUFBZSxHQUFLLEdBQU0sR0FBSyxDQUUzQixHQURBLEdBQU0sR0FDRixHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLElBQU8sSUFBTyxFQUFLLFdBQVksQ0FDL0IsR0FBSSxJQUFRLEdBQUssU0FBUyxHQUFLLElBQzNCLEdBQU0sR0FBTSxNQUFNLEVBQUcsR0FBTSxPQUFTLEdBQUssR0FBRyxRQUM1QyxHQUFJLEVBQUssV0FBVyxHQUFLLEdBQUcsSUFDaEMsR0FBSSxHQUFHLE1BQU8sSUFDVixDQUFDLElBQUksT0FBTyxFQUFXLFNBQ3ZCLEdBQUssUUFBUSxHQUFLLElBQ2xCLElBR1IsRUFBTyxHQUFNLElBRWpCLFlBQWMsR0FBSyxHQUFJLENBQ25CLEdBQUksR0FBSyxNQUFPLElBQUcsSUFDbkIsR0FBSSxHQUFJLE1BQU8sSUFBRyxLQUFNLEdBQU0sSUFDOUIsR0FBSyxHQUFLLE1BQU0sR0FBSSxHQUFHLE1BS25DLFlBQWlCLEdBQUssR0FBSSxDQUt0QixHQUpJLEtBQVEsSUFBTSxLQUFRLEtBQ3RCLEVBQVEsV0FBYSxTQUFZLGNBQWUsS0FBSyxLQUdwRCwyQkFBNEIsS0FBSyxJQUFNLE1BQU8sSUFBRyxNQUV0RCxHQUFjLEVBQVUsR0FBSyxFQUFNLFNBQVUsR0FBVyxHQUFRLENBQzVELEdBQUksR0FBVyxNQUFPLElBQVEsR0FBSyxRQUFRLElBQU0sSUFDakQsR0FBSSxJQUFVLEdBQUssS0FBSyxHQUFRLGdCQUNoQyxFQUFPLEdBQVMsU0FBVSxHQUFLLEdBQUksQ0FFL0IsR0FBSSxDQUFDLEdBQUksTUFBTyxJQUFRLEdBQUssUUFBUSxJQUFNLElBRTNDLEVBQVksRUFBVSxHQUFTLFNBQVUsR0FBSyxHQUFVLENBQ3BELEFBQUksSUFBSyxHQUFHLElBRVosR0FBSSxJQUFNLEdBRVYsQUFBSSxJQUFPLEVBQUssZUFDWixJQUFNLEVBQUssY0FBYyxHQUFLLEtBRWxDLEdBQUcsS0FBTSxHQUFLLFVBTTlCLFlBQXlCLEdBQUcsR0FBd0IsR0FBVSxDQUMxRCxHQUFJLElBQUssR0FDTCxHQUFPLEdBQ1gsQUFBSSxNQUFPLEtBQVMsWUFDaEIsSUFBSyxHQUNMLEdBQU8sRUFBSyxTQUdoQixHQUFjLEVBQVUsR0FBRyxFQUFNLFNBQVUsR0FBVyxHQUFRLENBQzFELEdBQUksR0FBVyxNQUFPLElBQUcsSUFDekIsR0FBSSxJQUFVLEdBQUssS0FBSyxHQUFRLGdCQUNoQyxFQUFPLEdBQVMsU0FBVSxHQUFLLEdBQUksQ0FDL0IsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLENBQUMsR0FBSSxNQUFPLElBQVcsR0FBSyxLQUFLLEdBQUcsU0FBVSxHQUFNLElBRXhELEVBQVksRUFBVSxHQUFTLFNBQVUsR0FBSyxHQUFVLENBQ3BELEdBQUksR0FBSyxNQUFPLElBQUcsSUFFbkIsR0FBSSxJQUFNLEdBTVYsR0FKSSxJQUFPLEVBQUssZUFDWixJQUFNLEVBQUssY0FBYyxHQUFLLEtBRzlCLElBQU8sR0FBSSxLQUFNLENBQ2pCLEdBQUksTUFBTyxJQUFJLE1BQVMsU0FBVSxDQUM5QixHQUFJLElBQVksR0FBSSxXQUFVLGlCQUFjLEdBQUksS0FBTyxrQ0FDdkQsVUFBVSxLQUFPLHVCQUNWLEdBQUcsSUFFZCxBQUFJLElBQUksT0FBUyxLQUFPLEdBQUksT0FBUyxPQUNqQyxJQUFJLEtBQU8sU0FFZixHQUFXLEdBQUssUUFBUSxHQUFHLEdBQUksTUFBTyxHQUFLLFNBQVUsR0FBSyxHQUFHLEdBQUssQ0FDOUQsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLEdBQUcsTUFBTyxJQUFHLEtBQU0sR0FBRyxJQUMxQixHQUFJLENBQUMsR0FBSyxNQUFPLElBQVcsR0FBSyxLQUFLLEdBQUcsU0FBVSxHQUFLLElBRXhELEdBQUksSUFBTSxHQUFLLFFBQVEsR0FBRyxHQUFJLE1BQzlCLEdBQWdCLEdBQUssR0FBSyxTQUFVLEdBQUssR0FBRyxHQUFLLENBQzdDLEdBQUksR0FBSyxNQUFPLElBQUcsSUFDbkIsR0FBSSxHQUFHLE1BQU8sSUFBRyxLQUFNLEdBQUcsSUFDMUIsR0FBVyxHQUFLLEtBQUssR0FBRyxTQUFVLEdBQUssUUFHL0MsT0FHSixHQUFXLEdBQUssS0FBSyxHQUFHLFVBQVcsR0FBSyxVQU14RCxZQUFxQixHQUFJLEdBQU0sQ0FDM0IsR0FBSSxHQUFLLFNBQVcsRUFBRyxNQUFPLElBQUcsS0FBTSxRQUN2QyxHQUFJLElBQU0sR0FBSyxHQUVmLEVBQVksR0FBSyxRQUFRLElBQU0sSUFFL0IsWUFBZSxHQUFLLEdBQU8sQ0FDdkIsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLENBQUMsR0FBTyxNQUFPLElBQVksR0FBSSxHQUFLLE1BQU0sSUFDOUMsR0FBVyxHQUFLLEVBQUssUUFBUyxJQUdsQyxZQUFnQixHQUFLLEdBQUcsR0FBSyxDQUN6QixHQUFJLEdBQUssTUFBTyxJQUFHLElBQ25CLEdBQUksR0FBRyxNQUFPLElBQUcsS0FBTSxHQUFHLElBQzFCLEdBQWdCLEdBQUssRUFBSyxRQUFTLElBR3ZDLFlBQWUsR0FBSyxHQUFHLEdBQUssQ0FDeEIsR0FBSSxHQUFLLE1BQU8sSUFBRyxJQUNuQixHQUFJLEdBQUcsTUFBTyxJQUFHLEtBQU0sR0FBRyxJQUMxQixHQUFZLEdBQUksR0FBSyxNQUFNLEtBR25DLFlBQXlCLEdBQUcsR0FBTyxHQUFJLENBQ25DLEdBQUksSUFBUSxVQUFZLENBQUUsTUFBTyxJQUFxQixHQUFHLEdBQU8sSUFDaEUsR0FDSSxHQUNBLEVBQWtCLEVBQWdCLEdBQUcsR0FBTyxHQUFPLEdBQVEsMnpKQ3JVdkUsd0NBRUEsR0FBSSxJQUFlLEtBQ2YsR0FBTyxLQUVQLEdBQU8sR0FDWCxPQUFTLE1BQU8sSUFDWixBQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssR0FBTSxLQUMzQyxJQUFLLElBQU8sR0FBYSxLQUdqQyxHQUFPLFFBQVUsS0NYakIsOEJBQUksSUFBZSxLQUVuQixHQUFPLFFBQVUsU0FBZ0IsRUFBRyxDQUNoQyxNQUFPLElBQWEsTUNIeEIsOEJBQUksSUFBUyxLQUNULEdBQUssS0FDTCxHQUFPLEtBQ1AsR0FBYSxLQUNiLEdBQVMsS0FDVCxHQUFtQixLQUNuQixHQUFtQixLQUVuQixHQUFhLEVBQVEsV0FBYSxTQUFXLEdBQUcsY0FBZ0IsTUFBTyxJQUFHLGFBQWEsUUFBVyxXQUFhLEdBQUcsYUFBYSxPQUFTLEdBQUcsYUFFM0ksR0FBVSxLQUNWLEdBQWUsVUFBWSxDQUMzQixNQUFPLENBQ0gsR0FBSyxLQUFLLEdBQVMsaUJBQ25CLEdBQUssS0FBSyxHQUFTLHFCQUl2QixHQUFnQixTQUFnQixFQUFNLENBQ3RDLEdBQUksQ0FDQSxHQUFJLEdBQU8sR0FBRyxTQUFTLEVBQU0sQ0FBRSxlQUFnQixXQUMxQyxFQUFQLENBQ0UsR0FBSSxHQUFNLEdBQUUsT0FBUyxVQUFZLEVBQUUsT0FBUyxXQUFZLE1BQU8sR0FDL0QsS0FBTSxHQUVWLE1BQU8sQ0FBQyxDQUFDLEdBQVMsR0FBSyxVQUFZLEVBQUssV0FHeEMsR0FBZSxTQUFxQixFQUFLLENBQ3pDLEdBQUksQ0FDQSxHQUFJLEdBQU8sR0FBRyxTQUFTLEVBQUssQ0FBRSxlQUFnQixXQUN6QyxFQUFQLENBQ0UsR0FBSSxHQUFNLEdBQUUsT0FBUyxVQUFZLEVBQUUsT0FBUyxXQUFZLE1BQU8sR0FDL0QsS0FBTSxHQUVWLE1BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBSyxlQUd0QixHQUFzQixTQUFzQixFQUFHLENBQy9DLEdBQUksQ0FDQSxNQUFPLElBQVcsU0FDYixFQUFQLENBQ0UsR0FBSSxFQUFZLE9BQVMsU0FDckIsS0FBTSxHQUdkLE1BQU8sSUFHUCxHQUFvQixTQUEyQixFQUFjLEVBQUcsRUFBTSxDQUN0RSxNQUFJLElBQVEsRUFBSyxtQkFBcUIsR0FDM0IsRUFBYSxHQUVqQixHQUdQLEdBQXlCLFNBQWdDLEVBQWMsRUFBUyxDQUNoRixHQUFJLEdBQU8sRUFBYSxHQUN4QixHQUFJLENBQ0EsR0FBSSxHQUFNLEtBQUssTUFBTSxHQUNyQixNQUFPLFNBQ0YsRUFBUCxJQUdGLEdBQXVCLFNBQThCLEVBQUcsRUFBTyxFQUFNLENBRXJFLE9BREksR0FBTyxHQUFpQixFQUFPLEVBQU0sR0FDaEMsRUFBSSxFQUFHLEVBQUksRUFBSyxPQUFRLElBQzdCLEVBQUssR0FBSyxHQUFLLEtBQUssRUFBSyxHQUFJLEdBRWpDLE1BQU8sSUFHWCxHQUFPLFFBQVUsU0FBcUIsRUFBRyxFQUFTLENBQzlDLEdBQUksTUFBTyxJQUFNLFNBQ2IsS0FBTSxJQUFJLFdBQVUsMEJBRXhCLEdBQUksR0FBTyxHQUFpQixFQUFHLEdBRTNCLEVBQVMsRUFBSyxRQUFVLEdBQ3hCLEVBQWUsRUFBSyxjQUFnQixHQUFHLGFBQ3ZDLEVBQWMsRUFBSyxhQUFlLEdBQ2xDLEVBQWUsRUFBSyxjQUFnQixHQUNwQyxFQUFrQixFQUFLLGlCQUFtQixHQUM5QyxHQUFJLEVBQUssY0FBZ0IsRUFBSyxnQkFDMUIsS0FBTSxJQUFJLFdBQVUsZ0VBRXhCLEdBQUksR0FBa0IsRUFBSyxnQkFFdkIsRUFBYSxFQUFLLFlBQWMsQ0FBQyxPQUNqQyxFQUFxQixFQUFLLHFCQUF1QixHQUNqRCxFQUFVLEVBQUssU0FBVyxHQUFLLFFBQVEsTUFDdkMsRUFBUyxFQUFLLFVBQVksRUFFOUIsRUFBSyxNQUFRLEVBQUssT0FBUyxLQUczQixHQUFJLEdBQWdCLEdBQWtCLEVBQWMsR0FBSyxRQUFRLEdBQVUsR0FFM0UsR0FBSywwQ0FBMkMsS0FBSyxHQUFJLENBQ3JELEdBQUksR0FBTSxHQUFLLFFBQVEsRUFBZSxHQUN0QyxBQUFJLEtBQU0sS0FBTyxJQUFNLE1BQVEsRUFBRSxNQUFNLE1BQVEsTUFBSyxJQUFPLEtBQzNELEdBQUksR0FBSSxFQUFlLElBQVEsR0FBb0IsR0FDbkQsR0FBSSxFQUFHLE1BQU8sSUFBa0IsRUFBYyxFQUFHLE9BQzlDLElBQUksR0FBc0IsR0FBTyxHQUNwQyxNQUFPLEdBRVAsR0FBSSxHQUFJLEdBQW9CLEVBQUcsR0FDL0IsR0FBSSxFQUFHLE1BQU8sSUFBa0IsRUFBYyxFQUFHLEdBR3JELEdBQUksSUFBTSxHQUFJLE9BQU0sdUJBQXlCLEVBQUksV0FBYSxFQUFTLEtBQ3ZFLFNBQUksS0FBTyxtQkFDTCxHQUVOLFdBQXdCLEdBQUcsQ0FDdkIsR0FBSSxJQUFNLEVBQVEsR0FBSyxRQUFRLEtBRS9CLEdBQUksSUFBTyxHQUFJLEtBQU8sR0FBSSxLQUFPLEVBQUssV0FBWSxDQUM5QyxHQUFJLElBQVEsR0FBSyxTQUFTLEdBQUksSUFBSyxJQUMvQixHQUFJLEVBQUssV0FBVyxHQUFJLElBQUssR0FBRyxJQUNwQyxBQUFJLElBQ0EsSUFBSSxHQUFLLFFBQVEsR0FBSSxJQUFLLEtBSWxDLEdBQUksRUFBTyxJQUNQLE1BQU8sSUFHWCxPQUFTLElBQUksRUFBRyxHQUFJLEVBQVcsT0FBUSxLQUFLLENBQ3hDLEdBQUksSUFBTyxHQUFJLEVBQVcsSUFDMUIsR0FBSSxFQUFPLElBQ1AsTUFBTyxLQUtuQixXQUFpQixHQUFLLENBQ2xCLEdBQUksT0FBUSxJQUFNLEtBQVEsTUFDdEIsSUFBUSxXQUFhLFNBQVksY0FBZSxLQUFLLE1BR3BELDRCQUE0QixLQUFLLElBRXRDLElBQUksSUFBVSxHQUFLLEtBQUssR0FBa0IsRUFBYyxHQUFLLEdBQU8sZ0JBRXBFLEdBQUksQ0FBQyxFQUFPLElBQ1IsTUFBTyxHQUFRLEdBQUssUUFBUSxLQUdoQyxHQUFJLElBQU0sRUFBZ0IsRUFBYyxJQUV4QyxNQUFJLEtBQU8sRUFBSyxlQUVaLElBQU0sRUFBSyxjQUFjLEdBQWtCLEtBR3hDLENBQUUsSUFBSyxHQUFLLElBQUssS0FHNUIsWUFBNkIsR0FBRyxDQUM1QixHQUFJLElBQVUsR0FBSyxLQUFLLEdBQWtCLEVBQWMsR0FBRyxHQUFPLGlCQUNsRSxHQUFJLEVBQU8sSUFBVSxDQUNqQixHQUFJLENBQ0EsR0FBSSxJQUFNLEVBQWdCLEVBQWMsVUFDbkMsR0FBUCxFQU9GLEdBTEksSUFBTyxFQUFLLGVBRVosSUFBTSxFQUFLLGNBQWMsR0FBa0IsS0FHM0MsSUFBTyxHQUFJLEtBQU0sQ0FDakIsR0FBSSxNQUFPLElBQUksTUFBUyxTQUFVLENBQzlCLEdBQUksSUFBWSxHQUFJLFdBQVUsaUJBQWMsR0FBSSxLQUFPLGtDQUN2RCxTQUFVLEtBQU8sdUJBQ1gsR0FFVixBQUFJLElBQUksT0FBUyxLQUFPLEdBQUksT0FBUyxPQUNqQyxJQUFJLEtBQU8sU0FFZixHQUFJLENBQ0EsR0FBSSxJQUFJLEVBQWUsR0FBSyxRQUFRLEdBQUcsR0FBSSxPQUMzQyxHQUFJLEdBQUcsTUFBTyxJQUNkLEdBQUksSUFBSSxHQUFvQixHQUFLLFFBQVEsR0FBRyxHQUFJLE9BQ2hELEdBQUksR0FBRyxNQUFPLFVBQ1QsR0FBUCxJQUlWLE1BQU8sR0FBZSxHQUFLLEtBQUssR0FBRyxXQUd2QyxZQUE2QixHQUFHLEdBQU8sQ0FJbkMsT0FISSxJQUFRLFVBQVksQ0FBRSxNQUFPLElBQXFCLEdBQUcsR0FBTyxJQUM1RCxHQUFPLEVBQWtCLEVBQWdCLEdBQUcsR0FBTyxHQUFPLEdBQVEsS0FFN0QsR0FBSSxFQUFHLEdBQUksR0FBSyxPQUFRLEtBQUssQ0FDbEMsR0FBSSxJQUFNLEdBQUssSUFDZixHQUFJLEVBQVksR0FBSyxRQUFRLEtBQU8sQ0FDaEMsR0FBSSxJQUFJLEVBQWUsSUFDdkIsR0FBSSxHQUFHLE1BQU8sSUFDZCxHQUFJLElBQUksR0FBb0IsSUFDNUIsR0FBSSxHQUFHLE1BQU8sVUMzTTlCLDhCQUFJLElBQVEsS0FDWixHQUFNLEtBQU8sS0FDYixHQUFNLE9BQVMsS0FDZixHQUFNLEtBQU8sS0FFYixHQUFPLFFBQVUsS0NMakIsd0NBRUEsR0FBSSxJQUFnQixLQUNoQixHQUFVLEtBRWQsR0FBTyxRQUFVLEdBRWpCLFlBQWtDLEVBQWMsQ0FDOUMsT0FBUSxPQUNELEtBQ0gsTUFBTyxnQkFDSixNQUNILE1BQU8sYUFJYixZQUFnQixFQUFNLEVBQUssRUFBUyxFQUFrQixFQUFVLENBQzlELEVBQVcsR0FBWSxTQUN2QixHQUFJLEdBQ0osR0FBSSxDQUNGLEdBQUksQ0FDRixFQUFTLEdBQVEsS0FBSyxpQkFBbUIsRUFBTSxDQUM3QyxRQUFTLEdBQW9CLEVBQVEsY0FFaEMsRUFBUCxDQUNBLEVBQVMsR0FBUSxRQUFRLGlCQUFtQixVQUV2QyxFQUFQLENBQ0EsR0FBSSxHQUFNLEdBQUksT0FBTSxvQkFBc0IsRUFBTyxLQUNqRCxRQUFJLEtBQU8saUJBQ0wsRUFFUixHQUFJLEdBQUssR0FBYyxHQUFRLElBRTNCLEVBQVMsRUFBRyxHQUFVLEVBQUssRUFBUyxHQUFTLEtBQ2pELEdBQUksR0FBVyxFQUFRLE9BQVEsQ0FDN0IsR0FBSSxHQUFtQixHQUF5QixFQUFHLGNBQ25ELEdBQUksRUFDRixHQUFJLENBQ0YsRUFBUyxHQUFPLEVBQWtCLEVBQVEsS0FBTSxTQUN6QyxFQUFQLEdBS04sTUFBTyxxT0N0Q0YsWUFBZSxDQUtwQixZQUFZLEVBQWMsRUFBYSxFQUFlLENBQUEsS0FKdEQsS0FBSSxPQUFBLEtBQ0osT0FBTSxPQUFBLEtBQ04sTUFBSyxPQUdILEtBQUssS0FBTyxFQUNaLEtBQUssT0FBUyxFQUNkLEtBQUssTUFBUSxJQUlWLFFBQXFCLENBTTFCLFlBQVksRUFBaUIsRUFBZ0IsQ0FBQSxLQUw3QyxNQUFLLE9BQUEsS0FDTCxJQUFHLE9BQUEsS0FDSCxTQUFRLE9BQUEsS0FDUixlQUFjLE9BR1osS0FBSyxNQUFRLEVBRWIsS0FBSyxJQUFNLElBVVIsWUFDTCxFQUNBLEVBQ0EsQ0FDQSxHQUFNLENBQUUsT0FBTSxTQUFRLFNBQVUsRUFDaEMsTUFBTyxJQUFJLElBQVMsRUFBTSxFQUFTLEVBQWMsRUFBUSxHQzNDM0QsR0FBa0IsSUFBYyxDQUFBLFlBQUEsNEJBQUEsc0JBQUEsMkNBcUIxQixHQUFVLENBQUMsRUFBZ0IsRUFBTyxFQUFLLE9BQVMsSUFBTyxFQUMzRCxLQUE0QixDQUMxQixNQUFPLEdBQUssT0FDVixDQUFDLEVBQVEsSUFFUCxFQUFPLEdBQ1QsT0FHSixJQUFtQixFQUFnQixDQUNqQyxFQUFLLE9BRUgsQ0FBQyxFQUFNLEVBQUssSUFBTyxJQUFNLEVBQVEsRUFBSyxHQUFPLEVBQVMsRUFBSyxHQUMzRCxTQUtBLEdBQWMsQ0FDbEIsRUFDQSxFQUNBLElBRUEsT0FBTyxLQUFLLEdBQ1QsSUFBSSxHQUFPLENBQUMsRUFBSyxFQUFZLEtBQzdCLE9BQU8sQ0FBQyxDQUFBLENBQUcsS0FBZ0IsQ0FBQyxDQUFDLEdBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUssS0FBZ0IsQ0FDMUIsRUFDQSxNQUFPLElBQWUsV0FDbEIsQ0FBRSxNQUFPLEVBQVksV0FBWSxJQUNqQyxNQUFPLEdBQVcsU0FBWSxTQUFRLE9BQUEsT0FBQSxHQUNqQyxFQUFlLEdBQVEsRUFBVyxRQUFRLE1BQU0sT0FDckQsSUFFTCxPQUNDLENBQUMsRUFBVSxDQUFDLEVBQUssS0FDZixPQUFPLGVBQWUsRUFBVSxFQUFHLE9BQUEsT0FBQSxDQUNqQyxhQUFjLElBQ1gsSUFFUCxPQUFPLE9BQU8sR0FBSSxHQUFlLElDM0R4QixHQUFBLENBQ2Isd0JBQXlCLENBQ3ZCLFFBQWtFLDBEQUNsRSxLQUFNLEdBQWUsdUJBRXZCLG9CQUFxQixDQUNuQixRQUE0RSxvRUFDNUUsS0FBTSxHQUFlLHdCQ1RuQixHQUFtQixDQUN2QixhQUFjLDhCQUNkLHFCQUFzQix3QkFDdEIsa0JBQW1CLHdCQUNuQix3QkFBeUIsNEJBQ3pCLHNCQUF1Qix5QkFDdkIsWUFBYSxlQUNiLGVBQWdCLG1CQUNoQixlQUFnQixtQkFDaEIsYUFBYyxXQUNkLGlCQUFrQiwwQkFDbEIsV0FBWSxhQUNaLGdCQUFpQixtQkFDakIsdUJBQXdCLDJCQUN4Qix5QkFBMEIsNkJBQzFCLGNBQWUsK0JBQ2Ysd0JBQXlCLDJCQUN6QixZQUFhLGVBQ2IsaUJBQWtCLENBQ2hCLEtBQU0sbUJBQ04sTUFBTyxxQkFFVCxtQkFBb0IsdUJBQ3BCLGdCQUFpQixvQkFtQmIsR0FBb0IsQ0FBQyxDQUFFLE9BQU0sWUFDakMsSUFBUyxtQkFDTCxHQUFpQixpQkFBaUIsT0FBTyxJQUN6QyxHQUFpQixHQ3ZCUixHQUFBLENBQ2Isb0JBQXFCLENBQUMsQ0FBRSxVQUNqQixLQUFBLDhCQUNQLGlCQUNFLDhEQUNGLHNDQUNFLDJFQUNGLHVCQUNFLDhEQUNGLG9DQUNFLDJEQUNGLCtCQUNFLHVEQUNGLDRCQUNFLHlGQUNGLHVCQUNFLG1GQUNGLHdCQUF5QixrREFDekIsZUFBZ0Isd0RBQ2hCLGVBQWdCLDJEQUNoQix1QkFDRSxtRUFDRixzQkFBdUIsb0RBQ3ZCLDZCQUNFLDZEQUNGLHNCQUF1Qiw0Q0FDdkIsbUJBQW9CLDBDQUNwQix1QkFBd0Isb0NBQ3hCLDhCQUErQixDQUFDLENBQzlCLFVBRzhCLDBCQUFBLGlCQUNoQyxxQ0FDRSxrSEFDRixzQkFDRSw0SkFDRiw0QkFDRSxzSEFDRixxQkFDRSxrRkFDRixxQkFDRSw0SkFDRixtQkFBb0Isa0RBQ3BCLHFCQUFzQixnREFDdEIsbUJBQW9CLDJDQUNwQix1QkFDRSxxR0FDRixxQkFBc0IsMkNBQ3RCLHVCQUF3Qiw4Q0FDeEIsZ0JBQWlCLENBQUMsQ0FBRSxnQkFDYixLQUFBLHNFQUNQLGVBQWdCLHNDQUNoQixxQkFBc0IscUNBQ3RCLGlCQUFrQixxQ0FDbEIsMkJBQTRCLDBCQUM1QixzQkFBdUIsQ0FBQyxDQUN0QixZQUNBLGdCQUtDOzZCQUF1RyxVQUFrQiw2QkFDNUgsOEJBQ0UsaUVBRUYsdUJBQXdCLENBQUMsQ0FDdkIsVUFHRCxJQUVHLElBQVMsaUJBQW1CLFNBQVcsbUVBRTNDLFdBQVksc0RBRVosV0FBWSwwREFDWixTQUFVLGdFQUNWLGtDQUNFLHNFQUVGLHFCQUFzQixDQUFDLENBQ3JCLFVBR0QsZUFBb0IsSUFBUyxpQkFBbUIsUUFBVSxjQUUzRCw2QkFDRSw2RUFDRixjQUFlLGdDQUNmLDBCQUNFLDJOQUNGLHNCQUF1QixDQUFDLENBQUUsZ0JBQytEOzZCQUFBLGlCQUN6RixnQ0FDRSw2REFDRixnQkFBaUIsQ0FBQyxDQUFFLHNCQUErQyxpQ0FFL0QsSUFBcUIsRUFBSSxlQUFpQiwwQkFFOUMsMkJBQTRCLG1DQUM1Qix5QkFBMEIsc0NBQzFCLDRCQUNFLHFEQUNGLDZCQUE4Qiw0Q0FDOUIsMkJBQ0UsbURBQ0YsMEJBQ0UsK0VBQ0YscUJBQXNCLHlCQUN0QixpQkFBa0IsNEJBQ2xCLDRCQUE2QiwwQ0FDN0IsZUFBZ0IsbUJBQ2hCLGFBQWMsQ0FBQyxDQUFFLFdBQ2EsNEJBQUEsS0FDOUIsc0JBQXVCLGlDQUN2Qiw4QkFBK0IsdUNBQy9CLDJCQUE0QixDQUFDLENBQUUsa0JBQ0MsOEJBQUEsS0FDaEMsa0JBQW1CLENBQUMsQ0FBRSxvQkFDRSxzQkFBQSxLQUN4QixXQUFZLENBQUMsQ0FBRSxjQUNnQiw2QkFBQSxHQUFrQixNQUNqRCxrQkFBbUIsQ0FBQyxDQUFFLGNBQ2lCLHFDQUFBLEdBQWtCLE1BQ3pELGNBQWUsa0JBQ2YseUJBQ0UsaUVBQ0YseUJBQTBCLENBQUMsQ0FBRSxnQkFDRix5QkFBQSxNQUMzQiwrQkFBZ0MsNENBQ2hDLDhCQUErQixDQUFDLENBQzlCLG9CQUdxQixpQkFBQSxvQkFDdkIsOEJBQStCLDZCQUMvQixzQkFDRSx5RUFDRiw2QkFBOEIsb0NBQzlCLG1CQUFvQixDQUFDLENBQUUsZUFDWCxVQUFBLDBCQUNaLG9CQUNFLDhFQUNGLDBCQUEyQix3Q0FDM0IscUJBQXNCLG1DQUN0QixpQkFBa0IsNEJBQ2xCLHNCQUNFLDhEQUNGLGlCQUFrQixxQkFDbEIsY0FBZSxDQUFDLENBQUUsbUJBQTRDLGlFQUNLLEVBQzlELElBQUksR0FBUSxLQUFLLFVBQVUsSUFDM0IsS0FBSyxTQUdWLG9CQUFxQixDQUFDLENBQUUsbUJBQTRDLHFGQUNtQixFQUNsRixJQUFJLEdBQVEsS0FBSyxVQUFVLElBQzNCLEtBQUssU0FDVixxQkFBc0IsNkNBQ3RCLDBCQUNFLHNGQUNGLGlDQUNFLGdEQUNGLDRCQUNFLCtEQUNGLGtDQUFtQyxDQUFDLENBQUUsU0FDbEIsa0JBQUEsMENBQ3BCLGlDQUFrQyxDQUFDLENBQ2pDLHVCQUdELDZEQUM4RCxFQUFrQixTQUM3RSxRQUVKLHNCQUF1QixDQUFDLENBQUUsZUFDYixXQUFBLHFCQUNiLHlCQUEwQiw0QkFDMUIsa0JBQW1CLCtCQUNuQixpQkFBa0IsbUNBQ2xCLGlCQUFrQixvQ0FDbEIsaUNBQ0UsOEZBQ0Ysa0JBQ0UsMEZBQ0Ysc0JBQ0UsMkRBQ0YsMkJBQ0UsNkRBQ0Ysc0JBQ0Usa0VBQ0YsVUFBVyx1QkFDWCxtQkFBb0IsaURBQ3BCLGlCQUFrQix3Q0FDbEIsb0JBQXFCLENBQUMsQ0FBRSxvQkFDckIsK0RBQThELHFDQUFrRCxlQUNuSCx5QkFBMEIsQ0FBQyxDQUFFLG9CQUNBLDJCQUFBLEtBQzdCLDBDQUNFLG9JQUNGLDRDQUNFLHNJQUNGLDZDQUNFLHVJQUNGLGNBQWUsb0RBQ2Ysa0JBQW1CLGdEQUNuQixlQUNFLDBGQUNGLHFCQUNFLDJIQUNGLGdCQUFpQix3REFDakIsZ0JBQ0Usb0pBQ0Ysa0JBQW1CLDZDQUNuQixrQkFBbUIsa0RBQ25CLHlDQUNFLG1JQUNGLDJDQUNFLHFJQUNGLDRDQUNFLHNJQUNGLDhCQUErQixtQ0FDL0IsaUNBQ0UsMkZBQ0YseUJBQTBCLHFDQUMxQix1QkFDRSwwREFDRixrQkFBbUIsQ0FBQyxDQUFFLGFBQ0csdUJBQUEsTUFDekIsMkJBQ0UsOERBQ0YsNkJBQ0UsbUVBQ0Ysb0JBQ0Usa0VBQ0YsMkJBQ0UsMERBQ0YsdUJBQXdCLDJCQUN4Qix1QkFBd0IsQ0FBQyxDQUFFLGtCQUNJLDZCQUFBLE1BQy9CLGdCQUFpQix5REFDakIsZ0JBQWlCLENBQUMsQ0FDaEIsV0FDQSxnQkFLbUIsbUJBQUEsRUFBYyxLQUFJLE1BQWlCLEtBQ3BELEVBQVksZUFBYyxLQUFjLEtBRTVDLG1DQUNFLG1GQUNGLDJCQUNFLGlGQUNGLGdCQUFpQixrREFDakIsMkJBQ0Usc0RBQ0YseUJBQ0UsOEVBQ0Ysa0JBQ0UsNERBQ0Ysd0JBQXlCLENBQUMsQ0FDeEIsU0FDQSwyQkFLb0Msb0NBQUEsUUFBYSxLQUFVLEtBQzdELDhCQUNFLG9EQUNGLDZCQUNFLG1FQUNGLGlCQUNFLHdIQUNGLG9CQUFxQix3QkFDckIsbUJBQW9CLG1DQUNwQixtQkFBb0IsZ0NBQ3BCLHFCQUFzQix5QkFDdEIsa0NBQ0Usd0RBQ0YsaUJBQWtCLENBQUMsQ0FBRSxvQkFDSixlQUFBLGdDQUNqQix1QkFDRSx3REFDRixpQkFBa0Isd0RBQ2xCLDBCQUNFLHNEQ3pUVyxHQUFBLENBQ2IsYUFBYywwQ0FPZCxvQkFBcUIsQ0FBQyxDQUFFLG1CQUNMLGlCQUFBLHFCQU9uQiwyQkFBNEIsQ0FBQyxDQUFFLGlCQUNqQixZQUFBLHFCQUVkLGVBQ0Usc0ZBRUYsb0JBQXFCLHlEQUVyQixtQkFBb0Isd0RBRXBCLFdBQVksMEJDeEJELEdBQXNDLEdBQUksS0FBSSxDQUN6RCwwQkFDQSx1QkFDQSx3QkFDQSxvQkFXYSxHQUFBLENBRWIsa0JBQ0Usd0pBQ0YsMkJBQ0Usa0hBQ0YsaUJBQ0UsNkRBQ0YsMkJBQTRCLENBQUMsQ0FBRSxXQUNOLHVCQUFBLHNCQUEwQixvSEFBd0gsUUFDM0ssZ0JBQ0UsMEdBQ0Ysd0JBQXlCLENBQUMsQ0FBRSxVQUMyQixxREFBQSxHQUFrQixDQUNyRSwyQ0FPSixvQkFDRSxvR0FDRiwrQkFDRSxrRUFDRiwrQkFDRSxxRUFDRixvQkFDRSwrREFDRix1QkFDRSx1RUFDRixrQ0FDRSxtSkNBSixZQUFnQyxFQUc2QyxDQUFBLEdBSGYsQ0FDNUQsYUFFb0MsRUFEakMsRUFBVSxHQUFBLEVBQUEsSUFPYixNQUFPLFlBQXFCLENBQUUsTUFBSyxXQUFnQyxDQUNqRSxNQUFPLElBQ0wsWUFBVyxPQUFBLE9BQUEsR0FDTixFQUFVLENBQUUsUUFDakIsQ0FDRSxNQUNFLEVBR0ksR0FDSixDQUNBLEdBQU0sR0FBTyxFQUFVLEtBQU8sR0FDOUIsTUFBTyxHQUFZLENBQ2pCLElBQUssR0FBSSxJQUNQLFFBQVUsR0FBTSxFQUFJLEtBQU8sS0FBSyxJQUFJLEtBQ3BDLFVBQVksR0FBTSxFQUFJLE9BQVMsS0FBSyxJQUFJLE9BQ3hDLFNBQVcsR0FBTSxFQUFJLE1BQVEsS0FBSyxJQUFJLE9BRXhDLFFBQU8sT0FBQSxPQUFBLEdBQU8sS0FBSyxRQUFZLEVBQVUsWUFHN0MsUUFBUyxDQUFFLE1BQU8sRUFBUyxXQUFZLElBQ3ZDLFFBQVMsQ0FDUCxLQUF1QyxDQUNyQyxNQUFBLEdBQVUsRUFBVSxLQUFLLGFBQWEsS0FBSyxJQUFJLFFBQzdDLEtBQUssSUFBSSxXQUdiLElBQUksRUFBZSxDQUNqQixPQUFPLGVBQWUsS0FBTSxVQUFXLENBQUUsWUFHN0MsSUFBSyxDQUFFLFFBQVMsWUFBYSxXQUFZLElBQ3pDLGNBQWUsaUJBQW1CLElBQVcsQ0FDM0MsUUFBUyx3QkFDVCxXQUFZLE9Bc0VmLFlBQ0wsRUFDQSxFQUNBLENBSUEsR0FBSSxNQUFNLFFBQVEsR0FDaEIsTUFBUSxJQUNOLEdBQWUsRUFBcUIsRUFBUyxJQUdqRCxHQUFNLEdBQXlCLEdBSy9CLE9BQVcsS0FBYyxRQUFPLEtBQUssR0FBVyxDQUM5QyxHQUFNLEdBQVksRUFBaUMsR0FDbkQsRUFDRSxNQUFPLElBQWEsU0FDaEIsQ0FBRSxRQUFTLElBQU0sR0FDakIsTUFBTyxJQUFhLFdBQ3BCLENBQUUsUUFBUyxHQUNYLEVBTEEsQ0FBRSxXQUFrQixFQUFOLEVBQUksR0FBQSxFQUFBLElBTWxCLEVBQVksTUFBTyxJQUFZLFNBQVcsSUFBTSxFQUFVLEVBRWhFLEVBQXVCLEdBQWMsR0FBdUIsT0FBQSxPQUFBLENBQzFELEtBQU0sR0FBZSxZQUNyQixhQUNBLGFBQ0ksRUFBZSxDQUFFLGdCQUFpQixHQUNuQyxJQUlQLE1BQU8sR0FZRixHQUFNLEdBQU0sT0FBQSxPQUFBLEdBQ2QsR0FBZSxJQUNmLEdBQWUsSUFDZixHQUFlLElBQ2YscUJBQWlDLEtDN01oQyxDQUFFLG1CQUFtQixPQUNyQixHQUFpQixDQUFDLEVBQWEsSUFDbkMsR0FBZSxFQUFRLEVBQUssQ0FBRSxXQUFZLEdBQU8sTUFBTyxFQUFPLEtBRWpFLFlBQTBCLEVBQVcsQ0FDbkMsU0FBSyxJQUFJLE9BQVMsR0FBZSxFQUFLLElBQUksTUFBTyxTQUNqRCxFQUFLLElBQUksS0FBTyxHQUFlLEVBQUssSUFBSSxJQUFLLFNBRXRDLEVBR1QsR0FBQSxJQUFnQixHQUNkLGFBQWdDLEVBQTZCLENBQzNELE9BQWMsQ0FDWixHQUFNLEdBQU8sR0FBaUIsTUFBTSxTQUVwQyxNQUFJLE1BQUssUUFBUSxRQUNmLEdBQUssT0FBUyxFQUFLLE9BQU8sSUFBSSxLQUd6QixFQUlULG1CQUFtQixDQUFFLFVBQVMsU0FBZ0MsQ0FDNUQsR0FBSSxHQUF1QixLQUMzQixHQUFJLENBQ0YsRUFBUSxHQUFJLFFBQU8sRUFBUyxTQUNyQixFQUFQLEVBSUYsR0FBTSxHQUFPLEtBQUssbUJBQTBDLEdBQzVELFNBQUssTUFBUSxDQUFFLFVBQVMsU0FFakIsRUFJVCxtQkFBbUIsRUFBb0IsQ0FFckMsR0FBSSxHQUNKLEdBQUksQ0FDRixFQUFTLE9BQU8sU0FDaEIsRUFBQSxDQUNBLEVBQVMsS0FFWCxHQUFNLEdBQU8sS0FBSyxtQkFBMEMsR0FDNUQsU0FBSyxPQUFTLE9BQU8sRUFBSyxPQUFTLEdBRTVCLEVBSVQsb0JBQW9CLEVBQW9CLENBR3RDLEdBQU0sR0FBZ0IsS0FDaEIsRUFBTyxLQUFLLG1CQUFtQixHQUNyQyxTQUFLLFFBQVUsT0FBTyxFQUFLLE9BQVMsR0FFN0IsRUFHVCxtQkFBcUMsRUFBWSxDQUUvQyxNQUFPLE1BQUssYUFBZ0IsRUFBTyxXQUlyQyxtQkFBbUIsRUFBb0IsQ0FDckMsTUFBTyxNQUFLLG1CQUFtQixHQUdqQyxvQkFBb0IsRUFBaUIsQ0FDbkMsTUFBTyxNQUFLLG1CQUFtQixHQUlqQyxrQkFBMkIsQ0FDekIsTUFBTyxNQUFLLG1CQUFtQixNQUdqQyxvQkFBb0IsRUFBa0MsQ0FDcEQsTUFBTyxNQUFLLG1CQUFtQixHQUlqQyxnQkFBZ0IsRUFBK0MsQ0FDN0QsR0FBTSxHQUFhLEVBQVUsTUFDN0IsTUFBTyxHQUFVLE1BRWpCLEVBQVcsS0FBTyxVQUVsQixFQUFXLElBQU0sRUFBVyxNQUFNLElBQ2xDLEVBQVcsTUFBUSxFQUFXLE1BQU0sZ0JBRXBDLEdBQU0sR0FBTyxFQUNiLFNBQUssS0FBTyxzQkFDWixFQUFLLFdBQWEsRUFFbEIsRUFBSyxVQUFZLEVBQVcsTUFBTSxTQUVsQyxNQUFPLEdBQVcsTUFFWCxFQU9ULGFBQWEsRUFBc0MsRUFBd0IsQ0FDekUsTUFBTSxhQUFhLEVBQU0sR0FDekIsRUFBSyxXQUFhLEdBR3BCLGlCQUFpQixFQUEwQyxDQUN6RCxBQUFJLEdBQVEsTUFBUSxLQUFLLGlCQUFpQixHQUV4QyxLQUFLLGlCQUFrQixFQUFxQyxPQUU1RCxNQUFNLGlCQUFpQixHQUkzQiw2QkFBNkIsRUFBd0MsQ0FDbkUsTUFBUSxHQUNMLE1BQU0sT0FHWCxpQkFBaUIsRUFBNEIsQ0FBQSxHQUFBLEdBQzNDLE1BQ0UsR0FBSyxPQUFTLHVCQUNkLEVBQUssV0FBVyxPQUFTLFdBQ3pCLE1BQU8sR0FBSyxXQUFXLE9BQVUsVUFDakMsQ0FBQSxJQUFDLEVBQUssV0FBVyxRQUFoQixNQUFBLEVBQXVCLGVBSTVCLGVBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sTUFBTSxlQUNKLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixHQUFNLEdBQXNCLEVBQUssV0FBVyxJQUFJLEdBQzlDLEtBQUssZ0JBQWdCLElBR3ZCLEVBQUssS0FBTyxFQUFvQixPQUFPLEVBQUssTUFDNUMsTUFBTyxHQUFLLFdBR2QsZ0JBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixLQUFLLFlBQ0gsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLGNBQ0EsSUFFRSxFQUFPLGdCQUVULEdBQU8sTUFBTSxlQUFpQixFQUFPLGVBQ3JDLE1BQU8sR0FBTyxnQkFFaEIsRUFBVSxLQUFLLEtBQUssR0FHdEIsa0JBQXdCLENBQ3RCLEdBQU0sR0FBTyxNQUFNLG1CQUVqQixNQUFLLE1BQUssZ0JBQWdCLFNBQVUsaUJBSS9CLEtBQUssc0NBQXNDLEdBSHZDLEVBTWIsc0NBQ0UsRUFDMkIsQ0FDM0IsR0FBTSxHQUFPLE1BQU0saUJBQWlCLEdBQ3BDLFNBQU8sRUFDUCxNQUFPLEdBQUssR0FFWixFQUFLLEtBQU8sRUFFWixFQUFLLEtBQU8sb0JBQ0wsRUFHVCxjQUFjLEVBQXVCLENBRWpDLE1BQUssTUFBSyxnQkFBZ0IsU0FBVSxpQkFJL0IsRUFBSyxPQUFTLG9CQUhWLE1BQU0sY0FBYyxHQU1qQyxpQkFBaUIsRUFBc0IsQ0FFbkMsTUFBSyxNQUFLLGdCQUFnQixTQUFVLGlCQUkvQixFQUFLLEtBSEQsTUFBTSxpQkFBaUIsR0FPcEMsYUFBa0MsRUFBWSxFQUFvQixDQUNoRSxHQUFNLEdBQU8sTUFBTSxhQUFnQixFQUFPLEdBRTFDLFNBQUssSUFBTSxFQUFLLE1BQU0sSUFDdEIsTUFBTyxHQUFLLE1BRUwsRUFHVCxrQkFDRSxFQUNBLEVBQ0EsRUFBb0IsR0FDZCxDQUNOLE1BQU0sa0JBQWtCLEVBQU0sRUFBaUIsR0FDL0MsRUFBSyxXQUFhLEVBQUssS0FBSyxPQUFTLGlCQUl2QyxZQUdFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQXdCLEdBQ0UsQ0FDMUIsR0FBSSxHQUFXLEtBQUssWUFDcEIsU0FBUyxLQUFPLEVBQUssS0FDckIsRUFBVyxNQUFNLFlBRWYsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixFQUFTLEtBQU8scUJBQ2hCLE1BQU8sR0FBUyxLQUVoQixFQUFLLE1BQVEsRUFDVCxJQUFTLHNCQUNYLEdBQUssU0FBVyxJQUVYLEtBQUssV0FFVixFQUNBLG9CQUlKLHNCQUFzQixFQUE4QixDQUNsRCxHQUFNLEdBQWUsTUFBTSxtQkFBbUIsR0FBRyxHQUUvQyxNQUFLLE1BQUssZ0JBQWdCLFNBQVUsa0JBSXRDLEdBQWEsS0FBTyxzQkFDYixFQUdULDZCQUE2QixFQUFxQyxDQUNoRSxHQUFNLEdBQWUsTUFBTSwwQkFBMEIsR0FBRyxHQUV0RCxNQUFLLE1BQUssZ0JBQWdCLFNBQVUsa0JBSXRDLEdBQWEsS0FBTyxxQkFDcEIsRUFBYSxTQUFXLElBQ2pCLEVBR1Qsa0JBQ0UsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNtQyxDQUNuQyxHQUFNLEdBQXlCLE1BQU0sa0JBQ25DLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsR0FHRixNQUFJLElBQ0YsR0FBSyxLQUFPLFdBQ1AsRUFBOEIsT0FBUyxVQUMxQyxHQUFLLEtBQU8sUUFFZCxFQUFLLFVBQVksSUFHWixFQUdULG9CQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ3FDLENBQ3JDLEdBQU0sR0FBeUIsTUFBTSxvQkFDbkMsRUFDQSxFQUNBLEVBQ0EsR0FHRixNQUFJLElBQ0YsR0FBSyxLQUFPLE9BQ1osRUFBSyxLQUFPLFlBR1AsRUFHVCxZQUNFLEVBQ0EsRUFDQSxFQUNBLENBQ0EsTUFBTyxLQUFTLFdBQ1osUUFDQSxNQUFNLFlBQVksRUFBTSxFQUEyQixHQUd6RCxhQUFhLEVBQWMsRUFBOEIsQ0FDdkQsTUFBSSxJQUFRLE1BQVEsS0FBSyxpQkFBaUIsR0FDakMsS0FBSyxhQUFhLEVBQUssTUFBTyxHQUVoQyxNQUFNLGFBQWEsRUFBTSxHQUdsQyxhQUFhLEVBQWMsRUFBaUIsR0FBYSxDQUN2RCxHQUFJLEdBQVEsTUFBUSxLQUFLLGlCQUFpQixHQUFPLENBQy9DLEdBQU0sQ0FBRSxNQUFLLFNBQVUsRUFDdkIsQUFBSSxLQUFLLGNBQWMsSUFDckIsS0FBSyxXQUFXLGVBQ2QsS0FBSyxpQkFBaUIsR0FDdEIsRUFBSSxJQUFJLE9BR1osS0FBSyxhQUFhLEVBQU8sT0FFekIsT0FBTSxhQUFhLEVBQU0sR0FJN0IsaUNBQ0UsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxBQUFJLEVBQUssT0FBUyxPQUFTLEVBQUssT0FBUyxNQUN2QyxLQUFLLE1BQU0sRUFBTyxtQkFBb0IsQ0FBRSxHQUFJLEVBQUssTUFDNUMsQUFBSSxFQUFLLE9BQ2QsS0FBSyxNQUFNLEVBQU8saUJBQWtCLENBQUUsR0FBSSxFQUFLLE1BRS9DLE1BQU0saUNBQWlDLEVBQU0sRUFBUSxHQUl6RCxxQkFDRSxFQUNBLEVBQ0csQ0FDSCxHQUFNLEdBQU8sTUFBTSxxQkFBcUIsRUFBWSxHQUVwRCxHQUFJLEVBQUssT0FBTyxPQUFTLFNBQVUsQ0FHakMsR0FGQyxFQUE0QyxLQUFPLG1CQUNuRCxFQUE0QyxPQUFTLEVBQUssVUFBVSxHQUVuRSxLQUFLLFVBQVUscUJBQ2YsS0FBSyxVQUFVLG9CQUNmLENBQUEsR0FBQSxHQUNDLEVBQTRDLFdBQVUsR0FDckQsRUFBSyxVQUFVLEtBQUUsS0FBQSxFQUFJLEtBR3pCLE1BQU8sR0FBSyxVQUVaLE1BQU8sR0FBSyxPQUdkLE1BQU8sR0FHVCxzQkFDRSxFQUtBLENBRUEsQUFBSSxFQUFLLE9BQVMsb0JBSWxCLE1BQU0sc0JBQXNCLEdBRzlCLFlBQ0UsRUFDQSxFQUNBLENBQ0EsR0FBTSxHQUFpQixLQUFLLE1BQU0sZ0JBQzVCLEVBQU8sTUFBTSxZQUFZLEVBQVksR0FFM0MsT0FBUSxFQUFLLFVBQ04sdUJBRUgsRUFBSyxTQUFXLEtBQ2hCLFVBRUcseUJBQ0gsQUFDRSxFQUFLLFdBQVcsU0FBVyxHQUUzQixFQUFLLFdBQVcsR0FBRyxPQUFTLDRCQUc1QixHQUFLLEtBQU8sdUJBRVosRUFBSyxTQUFXLEVBQUssV0FBVyxHQUFHLFNBQ25DLE1BQU8sR0FBSyxnQkFJWCwyQkFDSCxDQUFBLEdBQUEsR0FDRSxHQUFNLENBQUUsZUFBZ0IsRUFDeEIsQUFDRSxJQUFBLEtBQUEsT0FBQSxFQUFhLFFBQVMsb0JBQ3RCLElBQUEsRUFBWSxhQUFVLEtBQUEsT0FBdEIsRUFBd0IsUUFBUyxHQUVqQyxFQUFZLFFBQVUsRUFBSyxPQUUzQixLQUFLLG1CQUNILEVBS0EsR0FLTixNQUdKLE1BQU8sR0FHVCxlQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsQ0FDQSxHQUFNLEdBQU8sTUFBTSxlQUFlLEVBQU0sRUFBVSxFQUFTLEdBRTNELEdBQUksRUFBTSxxQkFRUixHQUxFLEdBQUssT0FBUyw0QkFDZCxFQUFLLE9BQVMsMkJBRWQsR0FBSyxLQUFPLEVBQUssS0FBSyxVQUFVLElBRTlCLEVBQU0sS0FBTSxDQUNkLEdBQU0sR0FBUSxLQUFLLGdCQUFnQixHQUNuQyxTQUFNLFdBQWEsRUFDWixLQUFLLFdBQVcsRUFBTyx3QkFFM0IsQUFDTCxHQUFLLE9BQVMsb0JBQ2QsRUFBSyxPQUFTLG1CQUVkLEdBQUssU0FBVyxJQUdsQixNQUFPLEdBR1QseUJBQXlCLEVBQXVCLENBQzlDLE1BQUksR0FBSyxPQUFTLG1CQUNoQixHQUFPLEVBQUssWUFFUCxNQUFNLHlCQUF5QixHQUl4QyxpQkFBaUIsRUFBdUIsQ0FDdEMsTUFBTyxHQUFLLE9BQVMsWUFBYyxFQUFLLE9BQVMsUUFBVSxDQUFDLEVBQUssT0FHbkUsZUFBZSxFQUF1QixDQUNwQyxNQUFPLEdBQUssUUFBVSxFQUFLLE9BQVMsT0FBUyxFQUFLLE9BQVMsTUFHN0QsYUFDRSxFQUNBLEVBQ0EsRUFDRyxDQUNILE1BQU8sSUFBaUIsTUFBTSxhQUFhLEVBQU0sRUFBTSxJQUd6RCxtQkFBbUIsRUFBYyxFQUFvQixDQUNuRCxNQUFNLG1CQUFtQixFQUFNLEdBQy9CLEdBQWlCLEdBR25CLGlCQUNFLEVBQ0EsRUFBbUIsS0FBSyxNQUFNLGNBQ3hCLENBQ04sTUFBTSxpQkFBaUIsRUFBTSxHQUM3QixHQUFpQixLQ3hqQmhCLFFBQWlCLENBQ3RCLFlBQVksRUFBZSxFQUF5QixDQUFBLEtBS3BELE1BQUssT0FBQSxLQUNMLGNBQWEsT0FMWCxLQUFLLE1BQVEsRUFDYixLQUFLLGNBQWdCLENBQUMsQ0FBQyxJQU9yQixHQUVGLENBQ0YsTUFBTyxHQUFJLElBQVcsS0FDdEIsT0FBUSxHQUFJLElBQVcsUUFDdkIsT0FBUSxHQUFJLElBQVcsU0FDdkIsT0FBUSxHQUFJLElBQVcsaUJBQWtCLEtBSXpDLEdBQU0sU0FBVyxHQUFJLElBQVcsSUFBSyxJQ0F2QyxHQUFNLElBQWEsR0FDYixFQUFhLEdBQ2IsR0FBUyxHQUNULEdBQVcsR0FDWCxHQUFTLEdBQ1QsR0FBVSxHQW9CVCxRQUF3QixDQWlCN0IsWUFBWSxFQUFlLEVBQXFCLEdBQUksQ0FBQSxLQWhCcEQsTUFBSyxPQUFBLEtBQ0wsUUFBTyxPQUFBLEtBQ1AsV0FBVSxPQUFBLEtBQ1YsV0FBVSxPQUFBLEtBQ1YsaUJBQWdCLE9BQUEsS0FDaEIsT0FBTSxPQUFBLEtBQ04sU0FBUSxPQUFBLEtBQ1IsT0FBTSxPQUFBLEtBQ04sUUFBTyxPQUFBLEtBQ1AsTUFBSyxPQVFILEtBQUssTUFBUSxFQUNiLEtBQUssUUFBVSxFQUFLLFFBQ3BCLEtBQUssV0FBYSxDQUFDLENBQUMsRUFBSyxXQUN6QixLQUFLLFdBQWEsQ0FBQyxDQUFDLEVBQUssV0FDekIsS0FBSyxpQkFBbUIsQ0FBQyxDQUFDLEVBQUssaUJBQy9CLEtBQUssT0FBUyxDQUFDLENBQUMsRUFBSyxPQUNyQixLQUFLLFNBQVcsQ0FBQyxDQUFDLEVBQUssU0FDdkIsS0FBSyxPQUFTLENBQUMsQ0FBQyxFQUFLLE9BQ3JCLEtBQUssUUFBVSxDQUFDLENBQUMsRUFBSyxRQUN0QixLQUFLLE1BQVEsRUFBSyxPQUFTLEtBQU8sRUFBSyxNQUFRLEtBRTdDLEtBQUssY0FBZ0IsT0FNZCxHQUFXLEdBQUksS0FFNUIsWUFBdUIsRUFBYyxFQUF3QixHQUFlLENBQzFFLEVBQVEsUUFBVSxFQUNsQixHQUFNLEdBQVEsRUFBWSxFQUFNLEdBQ2hDLFVBQVMsSUFBSSxFQUFNLEdBQ1osRUFHVCxZQUFxQixFQUFjLEVBQWUsQ0FDaEQsTUFBTyxHQUFZLEVBQU0sQ0FBRSxjQUFZLFVBR3pDLEdBQUksSUFBbUIsR0FDVixHQUFrQyxHQUN6QyxHQUF3QixHQUN4QixHQUF3QixHQUN4QixHQUE4QixHQUM5QixHQUE4QixHQUM5QixHQUEyQixHQUVqQyxXQUFxQixFQUFjLEVBQXdCLEdBQWUsQ0FBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQ3hFLFFBQUUsR0FDRixHQUFZLEtBQUssR0FDakIsR0FBWSxLQUFJLEdBQUMsRUFBUSxRQUFLLEtBQUEsRUFBSSxJQUNsQyxHQUFpQixLQUFJLEdBQUMsRUFBUSxhQUFVLEtBQUEsRUFBSSxJQUM1QyxHQUFpQixLQUFJLEdBQUMsRUFBUSxhQUFVLEtBQUEsRUFBSSxJQUM1QyxHQUFjLEtBQUksR0FBQyxFQUFRLFNBQU0sS0FBQSxFQUFJLElBQ3JDLEdBQVcsS0FBSyxHQUFJLElBQWtCLEVBQU0sSUFFckMsR0FHVCxZQUNFLEVBQ0EsRUFBd0IsR0FDYixDQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFDWCxRQUFFLEdBQ0YsR0FBUyxJQUFJLEVBQU0sSUFDbkIsR0FBWSxLQUFLLEdBQ2pCLEdBQVksS0FBSSxHQUFDLEVBQVEsUUFBSyxLQUFBLEVBQUksSUFDbEMsR0FBaUIsS0FBSSxHQUFDLEVBQVEsYUFBVSxLQUFBLEVBQUksSUFDNUMsR0FBaUIsS0FBSSxHQUFDLEVBQVEsYUFBVSxLQUFBLEVBQUksSUFDNUMsR0FBYyxLQUFJLEdBQUMsRUFBUSxTQUFNLEtBQUEsRUFBSSxJQUVyQyxHQUFXLEtBQUssR0FBSSxJQUFrQixPQUFRLElBRXZDLEdBUUYsR0FBTSxJQUFLLENBRWhCLFNBQVUsRUFBWSxJQUFLLENBQUUsY0FBWSxlQUN6QyxhQUFjLEVBQVksS0FBTSxDQUFFLGNBQVksZUFDOUMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxjQUFZLGVBQzdDLFNBQVUsRUFBWSxLQUN0QixZQUFhLEVBQVksTUFDekIsT0FBUSxFQUFZLElBQUssQ0FBRSxjQUFZLGVBQ3ZDLFVBQVcsRUFBWSxLQUFNLENBQUUsY0FBWSxlQUMzQyxXQUFZLEVBQVksS0FBTSxDQUFFLGNBQVksZUFDNUMsT0FBUSxFQUFZLEtBQ3BCLFVBQVcsRUFBWSxNQUN2QixPQUFRLEVBQVksSUFBSyxDQUFFLGNBQVksZUFDdkMsT0FBUSxFQUFZLEtBQ3BCLE1BQU8sRUFBWSxJQUFLLENBQUUsZ0JBQzFCLEtBQU0sRUFBWSxJQUFLLENBQUUsZ0JBQ3pCLE1BQU8sRUFBWSxJQUFLLENBQUUsZ0JBQzFCLFlBQWEsRUFBWSxLQUFNLENBQUUsZ0JBQ2pDLElBQUssRUFBWSxLQUNqQixTQUFVLEVBQVksSUFBSyxDQUFFLGdCQUM3QixZQUFhLEVBQVksTUFDekIsTUFBTyxFQUFZLEtBQU0sQ0FBRSxnQkFDM0IsU0FBVSxFQUFZLFlBQ3RCLFNBQVUsRUFBWSxNQUFPLENBQUUsZ0JBQy9CLFVBQVcsRUFBWSxJQUFLLENBQUUsZUFDOUIsYUFBYyxFQUFZLEtBQU0sQ0FBRSxjQUFZLGVBRTlDLGFBQWMsRUFBWSxPQUFRLENBQUUsZUFDcEMsZ0JBQWlCLEVBQVksUUFBUyxDQUFFLGNBQVksZUFFcEQsR0FBSSxFQUFZLEtBQ2hCLEtBQU0sRUFBWSxJQUFLLENBQUUsZUFHekIscUJBQXNCLEVBQVksU0FpQmxDLEdBQUksRUFBWSxJQUFLLENBQUUsY0FBWSxjQUNuQyxPQUFRLEVBQVksS0FBTSxDQUFFLGNBQVksY0FDeEMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxjQUFZLGNBSTdDLFVBQVcsRUFBWSxLQUFNLENBQUUsY0FBWSxjQUMzQyxhQUFjLEVBQVksS0FBTSxDQUFFLGNBQVksY0FHOUMsT0FBUSxFQUFZLFFBQVMsQ0FBRSxVQUFRLFdBQVMsZUFDaEQsS0FBTSxFQUFZLElBQUssQ0FBRSxjQUFZLFVBQVEsZUFDN0MsTUFBTyxFQUFZLElBQUssQ0FBRSxjQUFZLFVBQVEsZUFJOUMsWUFBYSxFQUFZLEtBQU0sQ0FBRSxlQUNqQyxTQUFVLEVBQVksS0FBTSxDQUFFLGVBRzlCLFNBQVUsR0FBWSxLQUFNLEdBQzVCLGtCQUFtQixHQUFZLEtBQU0sR0FDckMsVUFBVyxHQUFZLEtBQU0sR0FDN0IsV0FBWSxHQUFZLEtBQU0sR0FDOUIsVUFBVyxHQUFZLElBQUssR0FDNUIsV0FBWSxHQUFZLElBQUssR0FDN0IsV0FBWSxHQUFZLElBQUssR0FDN0IsU0FBVSxHQUFZLGdCQUFpQixHQUN2QyxHQUFJLEdBQVksWUFBYSxHQUM3QixHQUFJLEdBQVksWUFBYSxHQUM3QixXQUFZLEdBQVksWUFBYSxHQUNyQyxTQUFVLEdBQVksWUFBYSxHQUNuQyxVQUFXLEdBQVksWUFBYSxHQUNwQyxVQUFXLEdBQVksWUFBYSxHQUNwQyxRQUFTLEVBQVksTUFBTyxDQUFFLGNBQVksTUFBTyxFQUFHLFVBQVEsZUFFNUQsT0FBUSxFQUFZLElBQUssQ0FBRSxNQUFPLEdBQUksZUFFdEMsS0FBTSxFQUFZLElBQUssQ0FBRSxNQUFPLEtBQ2hDLE1BQU8sR0FBWSxJQUFLLElBQ3hCLFNBQVUsRUFBWSxLQUFNLENBQzFCLGNBQ0EsTUFBTyxHQUNQLGlCQUFrQixLQVFwQixJQUFLLEdBQWMsS0FBTSxDQUFFLGNBQVksTUFBTyxJQUM5QyxZQUFhLEdBQWMsYUFBYyxDQUFFLGNBQVksTUFBTyxJQUU5RCxPQUFRLEdBQWMsU0FDdEIsTUFBTyxHQUFjLE9BQVEsQ0FBRSxnQkFDL0IsT0FBUSxHQUFjLFNBQ3RCLFVBQVcsR0FBYyxZQUN6QixVQUFXLEdBQWMsWUFDekIsU0FBVSxHQUFjLFVBQVcsQ0FBRSxnQkFDckMsTUFBTyxHQUFjLE9BQVEsQ0FBRSxnQkFDL0IsU0FBVSxHQUFjLFdBQ3hCLFVBQVcsR0FBYyxXQUFZLENBQUUsZUFDdkMsSUFBSyxHQUFjLE1BQ25CLFFBQVMsR0FBYyxTQUFVLENBQUUsZ0JBQ25DLFFBQVMsR0FBYyxVQUN2QixPQUFRLEdBQWMsUUFBUyxDQUFFLGNBQVksVUFBUSxlQUNyRCxLQUFNLEdBQWMsT0FDcEIsS0FBTSxHQUFjLE9BQ3BCLE9BQVEsR0FBYyxTQUN0QixNQUFPLEdBQWMsUUFDckIsS0FBTSxHQUFjLE1BQU8sQ0FBRSxjQUFZLGVBQ3pDLE1BQU8sR0FBYyxPQUFRLENBQUUsZUFDL0IsT0FBUSxHQUFjLFFBQVMsQ0FBRSxlQUNqQyxPQUFRLEdBQWMsUUFBUyxDQUFFLGVBQ2pDLFNBQVUsR0FBYyxVQUFXLENBQUUsZ0JBQ3JDLFFBQVMsR0FBYyxVQUN2QixRQUFTLEdBQWMsU0FBVSxDQUFFLGVBQ25DLE1BQU8sR0FBYyxPQUFRLENBQUUsZUFDL0IsTUFBTyxHQUFjLE9BQVEsQ0FBRSxlQUMvQixPQUFRLEdBQWMsUUFBUyxDQUFFLGVBQ2pDLFFBQVMsR0FBYyxTQUFVLENBQUUsY0FBWSxVQUFRLGVBQ3ZELE1BQU8sR0FBYyxPQUFRLENBQUUsY0FBWSxVQUFRLGVBQ25ELFFBQVMsR0FBYyxTQUFVLENBQUUsY0FBWSxVQUFRLGVBRXZELElBQUssR0FBYyxLQUFNLENBQUUsVUFBUSxnQkFDbkMsS0FBTSxHQUFjLE1BQU8sQ0FBRSxZQUM3QixPQUFRLEdBQWMsUUFBUyxDQUFFLFlBTWpDLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLEtBQU0sR0FBa0IsTUFBTyxDQUFFLGVBQ2pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBR3JDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFlBQWEsR0FBa0IsYUFBYyxDQUFFLGVBQy9DLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBQzdDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLElBQUssR0FBa0IsS0FBTSxDQUFFLGVBQy9CLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBRTdDLE9BQVEsR0FBa0IsUUFBUyxDQUFFLGVBQ3JDLFVBQVcsR0FBa0IsV0FBWSxDQUFFLGVBQzNDLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBR3ZDLFVBQVcsR0FBa0IsV0FBWSxDQUFFLGVBQzNDLFNBQVUsR0FBa0IsVUFBVyxDQUFFLGVBQ3pDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBQ25DLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBQ3ZDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBRTdDLFdBQVksR0FBa0IsWUFBYSxDQUFFLGVBQzdDLE1BQU8sR0FBa0IsT0FBUSxDQUFFLGVBRW5DLFFBQVMsR0FBa0IsU0FBVSxDQUFFLGVBRXZDLEtBQU0sRUFBWSxPQUFRLENBQUUsZUFHNUIsT0FBUSxFQUFZLFNBQVUsQ0FBRSxlQUNoQyxJQUFLLEVBQVksTUFBTyxDQUFFLGVBQzFCLE9BQVEsRUFBWSxTQUFVLENBQUUsZUFDaEMsUUFBUyxFQUFZLFVBQVcsQ0FBRSxlQUVsQyxPQUFRLEVBQVksU0FBVSxDQUFFLGVBQ2hDLFlBQWEsRUFBWSxRQUFTLENBQUUsZUFDcEMsSUFBSyxFQUFZLE9BR2pCLFFBQVMsRUFBWSxXQUNyQixRQUFTLEVBQVksVUFBVyxDQUFFLFdBQVksS0FDOUMsWUFBYSxFQUFZLGNBQWUsQ0FBRSxXQUFZLEtBQ3RELFVBQVcsRUFBWSxhQUd2QixZQUFhLEVBQVksS0FBTSxDQUFFLFdBQVksTUFHeEMsWUFBMkIsRUFBMkIsQ0FDM0QsTUFBTyxJQUFLLElBQWMsR0FBZ0IsSUFHckMsWUFBMkMsRUFBMkIsQ0FHM0UsTUFBTyxJQUFrQixHQUdwQixZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQUssSUFBYyxHQUFnQixJQUdyQyxZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQUssSUFBYyxHQUFtQixJQUd4QyxZQUFvQyxFQUEyQixDQUNwRSxNQUFPLElBQWlCLEdBR25CLFlBQWlDLEVBQTJCLENBQ2pFLE1BQU8sSUFBaUIsR0FHbkIsWUFBMkIsRUFBMkIsQ0FDM0QsTUFBTyxJQUFLLElBQWEsR0FBd0IsR0FHNUMsWUFBNEMsRUFBMkIsQ0FDNUUsTUFBTyxJQUFLLEtBQXFCLEdBQW1CLElBRy9DLFlBQXFCLEVBQTJCLENBQ3JELE1BQU8sSUFBSyxJQUFjLEdBQWtCLEdBR3ZDLFlBQXdCLEVBQTJCLENBQ3hELE1BQU8sSUFBSyxJQUFjLEdBQWtCLEdBR3ZDLFlBQXlCLEVBQTJCLENBQ3pELE1BQU8sSUFBSyxJQUFtQixHQUF1QixHQUdqRCxZQUF3QixFQUEyQixDQUN4RCxNQUFPLEtBQW1CLEdBR3JCLFlBQXVCLEVBQTJCLENBQ3ZELE1BQU8sSUFBYyxHQUdoQixZQUErQixFQUEyQixDQUMvRCxNQUFPLElBQUssS0FBaUIsR0FBbUIsSUFHM0MsWUFBbUMsRUFBMkIsQ0FDbkUsTUFBTyxJQUFLLEtBQW9CLEdBQWlCLElBRzVDLFlBQXdCLEVBQTBCLENBQ3ZELE1BQU8sSUFBWSxHQUdkLFlBQWlDLEVBQTBCLENBQ2hFLE1BQU8sSUFBWSxHQU9kLFlBQWlDLEVBQTJCLENBQ2pFLE1BQU8sS0FBcUIsR0FHdkIsWUFBeUIsRUFBMkIsQ0FDekQsTUFBTyxJQUFLLElBQXVCLEdBQTJCLEdBR3pELFlBQTBCLEVBQXFDLENBQ3BFLE1BQU8sSUFBVyxHQVFsQixHQUFxQixHQUFDLGNBQWdCLEdBQVcsQ0FDL0MsRUFBUSxPQUdWLEdBQXFCLEdBQUMsY0FDcEIsR0FBeUIsR0FBQyxjQUMxQixHQUEyQixJQUFDLGNBQzFCLEdBQVcsQ0FDVCxFQUFRLEtBQUssR0FBRyxRQUd0QixHQUF3QixJQUFDLGNBQWdCLEdBQVcsQ0FDbEQsQUFBSSxFQUFRLEVBQVEsT0FBUyxLQUFPLEdBQUcsU0FDckMsRUFBUSxNQUVSLEVBQVEsS0FBSyxHQUFHLFdBSXBCLEdBQTBCLEtBQUMsY0FBZ0IsR0FBVyxDQUNwRCxFQUFRLEtBQUssR0FBRyxPQUFRLEdBQUcsU0NqYy9CLEdBQUksSUFBK0IsK3FJQUUvQixHQUEwQixva0ZBRXhCLEdBQTBCLEdBQUksUUFDbEMsSUFBTSxHQUErQixLQUVqQyxHQUFxQixHQUFJLFFBQzdCLElBQU0sR0FBK0IsR0FBMEIsS0FHakUsR0FBK0IsR0FBMEIsS0FRekQsR0FBTSxJQUE2QixDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxFQUFFLE1BRXQ5QyxHQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUs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Q04sT0FBUSxPQUNSLE1BQU8sT0FDUCxNQUFPLE9BQ1AsT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsT0FBUSxPQUNSLEtBQU0sT0FDTixNQUFPLE9BQ1AsTUFBTyxPQUNQLE9BQVEsT0FDUixPQUFRLE9BQ1IsT0FBUSxPQUNSLE1BQU8sT0FDUCxLQUFNLE9BQ04sT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsS0FBTSxPQUNOLElBQUssT0FDTCxPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixNQUFPLE9BQ1AsT0FBUSxPQUNSLEtBQU0sT0FDTixPQUFRLE9BQ1IsT0FBUSxPQUNSLE9BQVEsT0FDUixPQUFRLE9BQ1IsTUFBTyxPQUNQLEtBQU0sT0FDTixPQUFRLE9BQ1IsTUFBTyxPQUNQLEtBQU0sT0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE9BQVEsU0FDUixPQUFRLFNBQ1IsS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxRQUFTLFNBQ1QsS0FBTSxTQUNOLElBQUssU0FDTCxNQUFPLFNBQ1AsS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsR0FBSSxTQUNKLEdBQUksU0FDSixHQUFJLFNBQ0osUUFBUyxTQUNULEdBQUksU0FDSixJQUFLLFNBQ0wsTUFBTyxTQUNQLElBQUssU0FDTCxRQUFTLFNBQ1QsSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLE1BQU8sU0FDUCxRQUFTLFNBQ1QsS0FBTSxTQUNOLElBQUssU0FDTCxNQUFPLFNBQ1AsS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsR0FBSSxTQUNKLEdBQUksU0FDSixHQUFJLFNBQ0osUUFBUyxTQUNULEdBQUksU0FDSixJQUFLLFNBQ0wsT0FBUSxTQUNSLE1BQU8sU0FDUCxJQUFLLFNBQ0wsUUFBUyxTQUNULElBQUssU0FDTCxJQUFLLFNBQ0wsSUFBSyxTQUNMLE1BQU8sU0FDUCxTQUFVLFNBQ1YsTUFBTyxTQUNQLElBQUssU0FDTCxLQUFNLFNBQ04sS0FBTSxTQUNOLE9BQVEsU0FDUixLQUFNLFNBQ04sSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsTUFBTyxTQUNQLE1BQU8sU0FDUCxNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxPQUFRLFNBQ1IsT0FBUSxTQUNSLEtBQU0sU0FDTixPQUFRLFNBQ1IsT0FBUSxTQUNSLE1BQU8sU0FDUCxNQUFPLFNBQ1AsT0FBUSxTQUNSLE9BQVEsU0FDUixNQUFPLFNBQ1AsTUFBTyxTQUNQLEtBQU0sU0FDTixNQUFPLFNBQ1AsT0FBUSxTQUNSLEtBQU0sU0FDTixNQUFPLFNBQ1AsUUFBUyxTQUNULEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sTUFBTyxTQUNQLEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLEtBQU0sU0FDTixLQUFNLFNBQ04sT0FBUSxTQUNSLEtBQU0sU0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE1BQU8sU0FDUCxLQUFNLFNBQ04sTUFBTyxTQUNQLEdBQUksU0FDSixLQUFNLFNBQ04sSUFBSyxTQUNMLE1BQU8sU0FDUCxPQUFRLFNBQ1IsTUFBTyxTQUNQLEtBQU0sU0FDTixNQUFPLFNBQ1AsSUFBSyxTQUNMLElBQUssU0FDTCxHQUFJLFNBQ0osSUFBSyxTQUNMLElBQUssU0FDTCxJQUFLLFNBQ0wsT0FBUSxTQUNSLElBQUssU0FDTCxLQUFNLFNBQ04sTUFBTyxTQUNQLEdBQUksU0FDSixNQUFPLFNBQ1AsR0FBSSxTQUNKLEdBQUksU0FDSixJQUFLLFNBQ0wsSUFBSyxTQUNMLEtBQU0sU0FDTixLQUFNLFNBQ04sS0FBTSxTQUNOLE1BQU8sU0FDUCxPQUFRLFNBQ1IsS0FBTSxTQUNOLEtBQU0sU0FDTixNQUFPLFNBQ1AsTUFBTyxTQUNQLE9BQVEsU0FDUixPQUFRLFNB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R0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssRUFBRSxNQUV0OUMsR0FBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLElB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QUFBLEtBRUEsR0FBQSxLQUNBLEdBQUEsS0FBQSxPQUFBLEtBQUEsSUFBQSxRQUFBLFNBQUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUNBLEdBQUEsSUFBQSxLQUFBLE9BQUEsS0FBQSxJQUFBLFFBQUEsU0FBQSxFQUFBLENBQUEsQUFBQSxJQUFBLFdBQUEsSUFBQSxjQUFBLE9BQUEsVUFBQSxlQUFBLEtBQUEsR0FBQSxJQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsR0FBQSxJQUFBLE9BQUEsZUFBQSxFQUFBLEVBQUEsQ0FBQSxXQUFBLEdBQUEsSUFBQSxVQUFBLENBQUEsTUFBQSxJQUFBLFFBR0EsR0FBQSxJQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUdBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FHQSxHQUFBLEtBQUEsT0FBQSxLQUFBLElBQUEsUUFBQSxTQUFBLEVBQUEsQ0FBQSxBQUFBLElBQUEsV0FBQSxJQUFBLGNBQUEsT0FBQSxVQUFBLGVBQUEsS0FBQSxHQUFBLElBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxHQUFBLElBQUEsT0FBQSxlQUFBLEVBQUEsRUFBQSxDQUFBLFdBQUEsR0FBQSxJQUFBLFVBQUEsQ0FBQSxNQUFBLElBQUEsUUFDQSxHQUFBLElBQUEsS0FBQSxPQUFBLEtBQUEsSUFBQSxRQUFBLFNBQUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUdBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUdBLEdBQUEsS0FBQSxPQUFBLEtBQUEsSUFBQSxRQUFBLFNBQUEsRUFBQSxDQUFBLEFBQUEsSUFBQSxXQUFBLElBQUEsY0FBQSxPQUFBLFVBQUEsZUFBQSxLQUFBLEdBQUEsSUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEdBQUEsSUFBQSxPQUFBLGVBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxHQUFBLElBQUEsVUFBQSxDQUFBLE1BQUEsSUFBQSxRQUdBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUlBLEdBQUEsS0FDQSxHQUFBLEtBR0EsR0FBQSxLQUNBLEdBQUEsS0FHQSxHQUFBLEtBQ0EsT0FBQSxLQUFBLElBQUEsUUFBQSxTQUFBLEVBQUEsQ0FBQSxBQUFBLElBQUEsV0FBQSxJQUFBLGNBQUEsT0FBQSxVQUFBLGVBQUEsS0FBQSxHQUFBLElBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxHQUFBLElBQUEsT0FBQSxlQUFBLEVBQUEsRUFBQSxDQUFBLFdBQUEsR0FBQSxJQUFBLFVBQUEsQ0FBQSxNQUFBLElBQUEsUUFDQSxHQUFBLElBQUEsS0FHQSxHQUFBLEtBR0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUFBLE9BQUEsS0FBQSxJQUFBLFFBQUEsU0FBQSxFQUFBLENBQUEsQUFBQSxJQUFBLFdBQUEsSUFBQSxjQUFBLE9BQUEsVUFBQSxlQUFBLEtBQUEsR0FBQSxJQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsR0FBQSxJQUFBLE9BQUEsZUFBQSxFQUFBLEVBQUEsQ0FBQSxXQUFBLEdBQUEsSUFBQSxVQUFBLENBQUEsTUFBQSxJQUFBLFFBWUEsR0FBQSxJQUFBLEtBVGEsR0FBUSxDQUNuQixpQkFBQSxHQUFBLFFBQ0EsWUFBQSxHQUFBLFFBQ0EsY0FBQSxHQUFBLFNBQ0EsRUFBQSxNQUFBLEtDckdGLG1DQUNBLEdBQVEsV0FBYSxHQUNyQixZQUF5QixFQUFVLEVBQU0sRUFBTyxDQUM1QyxPQUFRLE9BQ0MsSUFDRCxNQUFPLEdBQU8sTUFDYixJQUNELE1BQU8sR0FBTyxNQUNiLElBQ0QsTUFBTyxHQUFPLE1BQ2IsSUFDRCxNQUFPLEdBQU8sTUFDYixJQUNELE1BQU8sR0FBTyxNQUNiLEtBQ0QsTUFBTyxNQUFLLElBQUksRUFBTSxPQUNyQixJQUNELE1BQU8sR0FBTyxNQUNiLElBQ0QsTUFBTyxHQUFPLE1BQ2IsS0FDRCxNQUFPLElBQVEsTUFDZCxNQUNELE1BQU8sS0FBUyxNQUNmLEtBQ0QsTUFBTyxJQUFRLE1BQ2QsSUFDRCxNQUFPLEdBQU8sTUFDYixLQUNELE1BQU8sSUFBUSxNQUNkLE1BQ0QsTUFBTyxLQUFTLE1BQ2YsS0FDRCxNQUFPLElBQVEsTUFDZCxNQUNELE1BQU8sS0FBUyxNQUNmLEtBQ0QsTUFBTyxLQUFRLE9BQ2QsYUFDRCxNQUFPLGFBQWdCLE9BQ3RCLElBQ0QsTUFBTyxHQUFPLE1BQ2IsSUFDRCxNQUFPLEdBQU8sTUFDYixLQUNELE1BQU8sSUFBUSxNQUNkLEtBQ0QsTUFBTyxJQUFRLEdBRzNCLEdBQVEsUUFBYSxLQ2xEckIsd0NBQ0EsR0FBUSxXQUFhLEdBQ3JCLEdBQUksSUFBVyxLQUNYLEdBQUksS0FDSixHQUFvQixLQUN4QixZQUE4QixFQUFZLEVBQVMsQ0FDL0MsQUFBSSxJQUFZLFFBQVUsR0FBVSxJQUNwQyxHQUFJLEdBQVcsR0FDZixXQUFvQixFQUFZLENBQzVCLEdBQUksRUFBQyxFQUVMLElBQUksR0FBRSxrQkFBa0IsR0FBYSxDQUVqQyxPQURJLEdBQVcsR0FDTixFQUFJLEVBQUcsR0FBWSxFQUFJLEVBQVcsU0FBUyxPQUFRLElBQUssQ0FDN0QsR0FBSSxHQUFVLEVBQVcsU0FBUyxHQUNsQyxHQUFJLEdBQUUsZ0JBQWdCLEdBQVUsQ0FDNUIsR0FBSSxHQUFTLEVBQVcsRUFBUSxVQUNoQyxBQUFNLEdBQWEsSUFBVyxFQUkxQixFQUFTLEtBQUssTUFBTSxFQUFVLEdBSDlCLEVBQVcsT0FNZCxBQUFJLElBQUUsYUFBYSxHQUNwQixFQUFTLEtBQUssRUFBVyxJQUd6QixFQUFXLEdBR25CLE1BQU8sR0FFWCxHQUFJLEdBQUUsbUJBQW1CLEdBQWEsQ0FDbEMsR0FBSSxHQUFPLEVBQVcsRUFBVyxNQUM3QixFQUFRLEVBQVcsRUFBVyxPQUNsQyxNQUFPLElBQVksR0FBa0IsUUFBVyxFQUFXLFNBQVUsRUFBTSxHQUUvRSxHQUFJLEdBQUUsaUJBQWlCLEdBQ25CLE1BQU8sR0FBVyxNQUV0QixHQUFJLEdBQUUsaUJBQWlCLEdBQWEsQ0FFaEMsT0FESSxHQUFPLEdBQ0YsRUFBSSxFQUFHLEdBQVksRUFBSSxFQUFXLFVBQVUsT0FBUSxJQUFLLENBQzlELEdBQUksR0FBTSxFQUFXLFVBQVUsR0FDL0IsR0FBSSxHQUFFLGdCQUFnQixHQUFNLENBQ3hCLEdBQUksR0FBUyxFQUFXLEVBQUksVUFDNUIsQUFBTSxHQUFhLElBQVcsRUFJMUIsRUFBSyxLQUFLLE1BQU0sRUFBTSxHQUh0QixFQUFXLE9BTWQsQUFBSSxJQUFFLGFBQWEsR0FDcEIsRUFBSyxLQUFLLEVBQVcsSUFHckIsRUFBVyxHQUduQixHQUFJLENBQUMsRUFDRCxPQUNKLEdBQUksR0FBRSxtQkFBbUIsRUFBVyxRQUFTLENBQ3pDLEdBQUksR0FBUyxFQUFXLEVBQVcsT0FBTyxRQUMxQyxHQUFJLENBQUMsR0FBVSxDQUFDLEVBQVUsQ0FDdEIsRUFBVyxHQUNYLE9BRUosR0FBSSxHQUFTLEVBQVcsT0FBTyxTQUN6QixFQUFXLEVBQVcsT0FBTyxVQUM3QixHQUFFLGFBQWEsRUFBVyxPQUFPLFVBQzdCLEVBQVcsT0FBTyxTQUFTLEtBQzNCLE9BSVYsR0FISSxJQUFXLFFBQWEsQ0FBQyxFQUFXLE9BQU8sVUFDM0MsR0FBVyxJQUVYLENBQUMsRUFDRCxPQUNKLEdBQUksR0FBYyxFQUFRLEdBQUssR0FDM0IsTUFBTyxHQUFPLEdBQVEsTUFBTSxFQUFRLE9BR3ZDLENBQ0QsR0FBSSxDQUFDLEdBQUUsYUFBYSxFQUFXLFFBQVMsQ0FDcEMsRUFBVyxHQUNYLE9BRUosR0FBSSxHQUFTLEVBQVcsRUFBVyxRQUNuQyxNQUFLLEdBRUUsRUFBTyxNQUFNLEtBQU0sR0FEdEIsUUFJWixHQUFJLEdBQUUsd0JBQXdCLEdBQWEsQ0FDdkMsR0FBSSxHQUFPLEVBQVcsRUFBVyxNQUNqQyxNQUFPLEFBQ0QsR0FEQyxFQUNVLEVBQVcsV0FDWCxFQUFXLFdBRWhDLEdBQUksR0FBRSxhQUFhLElBQ1gsRUFBUSxXQUNSLEdBQUcsZUFBZSxLQUFLLEVBQVEsVUFBVyxFQUFXLE1BQ3JELE1BQU8sR0FBUSxVQUFVLEVBQVcsTUFHNUMsR0FBSSxHQUFFLG9CQUFvQixHQUFhLENBQ25DLEdBQUksR0FBTyxFQUFXLEVBQVcsTUFDN0IsRUFBUSxFQUFXLEVBQVcsT0FDbEMsR0FBSSxHQUFZLEVBQVcsV0FBYSxLQUNwQyxNQUFPLElBQVEsRUFFbkIsR0FBSSxHQUFZLEVBQVcsV0FBYSxLQUNwQyxNQUFPLElBQVEsRUFHdkIsR0FBSSxHQUFFLG1CQUFtQixHQUFhLENBQ2xDLEdBQUksR0FBUyxFQUFXLEVBQVcsUUFDbkMsR0FBSSxDQUFDLEdBQVUsQ0FBQyxFQUFVLENBQ3RCLEVBQVcsR0FDWCxPQUVKLEdBQUksR0FBUyxFQUFXLFNBQ2xCLEVBQVcsRUFBVyxVQUN0QixHQUFFLGFBQWEsRUFBVyxVQUN0QixFQUFXLFNBQVMsS0FDcEIsT0FJVixHQUhJLElBQVcsUUFBYSxDQUFDLEVBQVcsVUFDcEMsR0FBVyxJQUVYLENBQUMsRUFDRCxPQUNKLEdBQUksR0FBRyxlQUFlLEtBQUssRUFBUSxHQUFLLElBQVcsRUFBTyxLQUFPLElBQzdELE1BQU8sR0FBTyxHQUd0QixHQUFJLEdBQUUsY0FBYyxHQUNoQixNQUFPLE1BRVgsR0FBSSxHQUFFLGlCQUFpQixHQUNuQixNQUFPLEdBQVcsTUFFdEIsR0FBSSxHQUFFLG1CQUFtQixHQUFhLENBRWxDLE9BREksSUFBVyxHQUNOLEVBQUksRUFBRyxHQUFZLEVBQUksRUFBVyxXQUFXLE9BQVEsSUFBSyxDQUMvRCxHQUFJLEdBQVcsRUFBVyxXQUFXLEdBQ3JDLEdBQUksR0FBRSxpQkFBaUIsR0FBVyxDQUM5QixHQUFJLEVBQVMsVUFBVyxDQUNwQixFQUFXLEdBQ1gsT0FFSixHQUFJLEdBQU0sRUFBUyxTQUNiLEVBQVcsRUFBUyxLQUNwQixHQUFFLGFBQWEsRUFBUyxLQUNwQixFQUFTLElBQUksS0FDYixHQUFFLGdCQUFnQixFQUFTLEtBQ3ZCLEVBQVMsSUFBSSxNQUNiLE9BSWQsR0FISSxFQUFDLEdBQU8sRUFBSSxLQUFPLE1BQ25CLEdBQVcsSUFFWCxDQUFDLEVBQ0QsT0FDSixHQUFJLEdBQUUsYUFBYSxFQUFTLE9BQVEsQ0FDaEMsR0FBSSxJQUFRLEVBQVcsRUFBUyxPQUNoQyxHQUFJLENBQUMsRUFDRCxPQUNKLEdBQVMsR0FBTyxPQUdoQixHQUFXLFdBR1YsR0FBRSxlQUFlLEdBQ3RCLEVBQVcsV0FFTixHQUFFLGlCQUFpQixHQUFXLENBQ25DLEdBQUksSUFBVyxFQUFXLEVBQVMsVUFHbkMsR0FGSyxJQUNELEdBQVcsSUFDWCxDQUFDLEVBQ0QsT0FDSixPQUFPLE9BQU8sR0FBVSxLQUdoQyxNQUFPLElBRVgsR0FBSSxHQUFFLDBCQUEwQixHQUM1QixNQUFPLEdBQVcsRUFBVyxZQUVqQyxHQUFJLEdBQUUsZ0JBQWdCLEdBQ2xCLE1BQU8sSUFBSSxRQUFPLEVBQVcsUUFBUyxFQUFXLE9BRXJELEdBQUksR0FBRSxxQkFBcUIsR0FBYSxDQUNwQyxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVcsWUFBWSxPQUFTLEdBQUssRUFBVSxJQUMvRCxFQUFXLEVBQVcsWUFBWSxJQUV0QyxNQUFPLEdBQVcsRUFBVyxZQUFZLEVBQVcsWUFBWSxPQUFTLElBRTdFLEdBQUksR0FBRSxnQkFBZ0IsR0FDbEIsTUFBTyxHQUFXLE1BR3RCLEdBQUksR0FBRSxrQkFBa0IsR0FBYSxDQUVqQyxPQURJLElBQVcsR0FDTixFQUFJLEVBQUcsRUFBSSxFQUFXLE9BQU8sT0FBUSxJQUFLLENBQy9DLEdBQUksSUFBUSxFQUFXLE9BQU8sR0FDOUIsSUFBWSxHQUFNLE1BQU0sT0FDcEIsRUFBSSxFQUFXLFlBQVksUUFDM0IsS0FBWSxHQUFLLEVBQVcsRUFBVyxZQUFZLEtBRzNELE1BQU8sSUFFWCxHQUFJLEdBQUUsa0JBQWtCLEdBQWEsQ0FDakMsR0FBSSxJQUFXLEVBQVcsRUFBVyxVQUNyQyxHQUFJLENBQUMsRUFDRCxPQUVKLE9BQVEsRUFBVyxjQUNWLElBQ0QsTUFBTyxDQUFDLE9BQ1AsSUFDRCxNQUFPLENBQUMsT0FDUCxJQUNELE1BQU8sQ0FBQyxPQUNQLElBQ0QsTUFBTyxDQUFDLE9BQ1AsU0FDRCxNQUFPLE9BQU8sUUFDYixPQUNELFFBR1osRUFBVyxJQUVmLEdBQUksR0FBUyxFQUFXLEdBQ3hCLE1BQU8sR0FBVyxDQUFFLFNBQVUsR0FBTSxPQUFRLEdBQVcsQ0FBRSxTQUFVLElBRXZFLEdBQVEscUJBQXVCLEdBQy9CLFlBQXNCLEVBQU8sQ0FDekIsTUFBUSxPQUFPLElBQVUsVUFDckIsTUFBTSxRQUFRLElBQ2IsTUFBTyxNQUFRLGFBQWUsWUFBaUIsTUFDL0MsTUFBTyxNQUFRLGFBQWUsWUFBaUIsS0FFeEQsWUFBc0IsRUFBRyxFQUFHLENBQ3hCLEdBQUksSUFBTSxFQUNOLE1BQU8sR0FDWCxHQUFJLEdBQUssR0FBSyxNQUFPLElBQU0sVUFBWSxNQUFPLElBQU0sU0FBVSxDQUMxRCxPQUFTLEtBQU8sR0FDWixHQUFJLEVBQUUsS0FBUyxFQUFFLEdBQ2IsTUFBTyxHQUdmLE9BQVMsS0FBTyxHQUNaLEdBQUksRUFBRSxLQUFTLEVBQUUsR0FDYixNQUFPLEdBR2YsTUFBTyxHQUVYLE1BQU8sR0FFWCxZQUF1QixFQUFRLEVBQVEsQ0FDbkMsT0FBUSxNQUFPLFFBQ04sVUFDRCxPQUFRLE9BQ0MsV0FDRCxNQUFPLFdBRVAsTUFBTyxPQUVkLFNBQ0QsT0FBUSxPQUNDLG9CQUNBLGNBQ0Esa0JBQ0EsV0FDRCxNQUFPLFdBRVAsTUFBTyxPQUVkLFNBQ0QsT0FBUSxPQUNDLGFBQ0EsaUJBQ0Esa0JBQ0EsYUFDQSxlQUNBLGVBQ0EsY0FDQSxrQkFDQSxZQUNBLGdCQUNBLGFBQ0EsZUFDQSxhQUNBLGNBQ0EsYUFDQSxZQUNBLFlBQ0EsaUJBQ0EsYUFDQSxnQkFDQSxrQkFDQSxrQkFDQSxPQUNELE1BQU8sV0FFUCxNQUFPLFdBR2YsR0FBSSxZQUFrQixRQUNsQixPQUFRLE9BQ0MsV0FDQSxPQUNELE1BQU8sV0FFUCxNQUFPLEdBR25CLE1BQU8sR0FBRyxlQUFlLEtBQUssRUFBUSxJQUFXLEVBQU8sS0FBTyxLQUczRSxHQUFJLElBQWUsR0FDZixHQUFVLEdBQ1YsR0FBZ0IsR0FDaEIsR0FBYyxHQUNkLEdBQWEsS0FDYixHQUFrQixHQUN0QixZQUFvQixFQUFLLEVBQVcsRUFBUyxDQUd6QyxHQUZJLElBQWMsUUFBVSxHQUFZLElBQ3BDLElBQVksUUFBVSxHQUFVLElBQ2hDLEtBQVksR0FDWixHQUFhLEdBQWUsSUFDNUIsR0FBYSxHQUFhLEdBQzFCLE1BQU8sSUFFWCxHQUFVLEVBQ1YsR0FBZ0IsRUFDaEIsR0FBSSxHQUNKLEdBQUksQ0FDQSxFQUFNLEdBQVMsZ0JBQWdCLEVBQUssU0FFakMsRUFBUCxDQUNJLE1BQVEsSUFBa0IsR0FFOUIsR0FBSSxHQUFLLEdBQXFCLEVBQUssQ0FBRSxVQUFXLElBQWMsRUFBUyxFQUFHLE9BQVEsRUFBVyxFQUFHLFNBQ2hHLFVBQWEsRUFDTCxHQUFrQixFQUU5QixHQUFRLFdBQWEsR0FDckIsWUFBb0IsRUFBSyxFQUFXLEVBQVMsQ0FHekMsR0FGSSxJQUFjLFFBQVUsR0FBWSxJQUNwQyxJQUFZLFFBQVUsR0FBVSxJQUNoQyxDQUFDLEdBQVcsRUFBSyxFQUFXLEdBQzVCLEtBQU0sSUFBSSxPQUFNLEtBQUssVUFBVSxHQUFPLHFCQUUxQyxNQUFPLElBRVgsR0FBUSxXQUFhLEdBQ3JCLEdBQVEsUUFBYSxHQUNyQixHQUFPLFFBQVUsR0FDakIsR0FBTyxRQUFRLFFBQWEsR0FDNUIsR0FBTyxRQUFRLHFCQUF1QixHQUN0QyxHQUFPLFFBQVEsV0FBYSxHQUM1QixHQUFPLFFBQVEsV0FBYSxLQy9XNUIsd0NBRUEsR0FBSSxJQUFVLEtBQWdCLFFBQzFCLEdBQWlCLEtBQ2pCLEdBQU8sS0FDUCxHQUFRLEtBQ1IsR0FBWSxLQUVoQixHQUFPLFFBQVUsR0FDakIsWUFBdUIsRUFBSyxFQUFTLEVBQVMsRUFBZSxDQUMzRCxFQUFVLEdBQVcsR0FDckIsR0FDRSxFQUNBLFNBQVMsRUFBTSxDQUNiLEdBQUksR0FBTSxFQUFLLFNBQVcsR0FBUSxFQUFLLFVBQVksS0FDbkQsR0FBSSxFQUFLLE9BQVMsU0FBVSxDQUMxQixHQUFvQixFQUFNLEVBQVMsRUFBUyxHQUM1QyxHQUFJLEdBQU8sR0FBYyxHQUNyQixFQUFRLEdBQWMsRUFBTSxHQUNoQyxFQUFNLFNBQVcsRUFBSyxTQUN0QixFQUFLLEtBQU8sT0FDWixFQUFLLElBQU0sRUFBbUIsRUFBTSxFQUFNLFdBQ2pDLEVBQUssT0FBUyxjQUFnQixFQUFLLFFBQVEsT0FBUSxDQUM1RCxHQUFJLEdBQWMsRUFBSyxRQUFRLE1BQzNCLEVBQVEsR0FBYyxFQUFhLEdBQ25DLEVBQVksRUFBTSxTQUFXLEVBQUssS0FBSyxTQUMzQyxFQUFLLEtBQU8sT0FDWixFQUFLLElBQU0sRUFDVCxFQUNBLEVBQ0EsRUFBSyxLQUNMLEdBRUYsRUFBSyxRQUNGLFFBQ0EsVUFDQSxRQUFRLFNBQVMsRUFBUSxDQUN4QixHQUFJLEdBQVEsR0FBYyxFQUFRLEdBQ2xDLEVBQU0sU0FBVyxFQUNqQixFQUFLLElBQU0sRUFBbUIsRUFBUSxFQUFLLElBQUssS0FFcEQsRUFBSyxRQUFVLE9BQ2YsRUFBSyxLQUFPLE9BR2QsV0FBNEIsRUFBUSxFQUFNLEVBQU8sRUFBVSxDQUN6RCxHQUFJLENBQ0YsR0FBSSxHQUFhLEVBQWMsR0FDL0IsTUFBSSxJQUFXLEVBQVEsR0FDZCxFQUFRLEdBQVksRUFBTSxHQUUxQixHQUFVLEVBQVksRUFBTSxFQUFPLEVBQUssU0FFMUMsR0FBUCxDQUNBLEtBQUksSUFBRyxPQUFTLGlCQUNSLEdBQU0sR0FBRyxLQUFNLEdBQUcsUUFBUyxHQUU3QixJQUlWLFdBQWdDLEVBQVEsRUFBVSxFQUFNLEVBQU8sQ0FDN0QsR0FBSSxHQUFhLEVBQWMsR0FDL0IsTUFBSSxJQUFXLEVBQVEsR0FDakIsRUFBUSxHQUFZLGFBQ2YsRUFBUSxHQUFZLGFBQWEsRUFBSyxJQUFLLEdBRTNDLEVBQVEsR0FBWSxFQUFLLElBQUssR0FHaEMsRUFBbUIsRUFBUSxFQUFVLEVBQU8sZ0JBSXpELENBQUMsb0JBQXFCLEtBRXhCLFdBQXVCLEVBQVEsQ0FDN0IsR0FBSSxHQUFhLEVBQU8sS0FDeEIsR0FBSSxHQUFpQixFQUFjLElBQ2pDLEdBQWEsRUFBYyxHQUN2QixFQUFjLElBQ2hCLEtBQU0sSUFDSixxQkFDQSxlQUNFLEVBQU8sS0FDUCxzQkFDQSxFQUNBLDZCQUNBLEVBQWMsR0FDZCxxREFDRixHQUlOLE1BQU8sR0FFVCxNQUFPLEdBR1QsWUFBNkIsRUFBTSxFQUFTLEVBQVMsRUFBZSxDQUNsRSxBQUFJLEVBQUssTUFBTSxNQUFNLElBQU0sRUFBSyxNQUFNLE1BQU0sR0FBRyxPQUFTLFVBQ3RELEdBQUssTUFBTSxNQUFNLEdBQUssR0FDcEIsRUFBSyxNQUNMLEVBQ0EsRUFDQSxHQUNBLE1BQU0sSUFJWixZQUF1QixFQUFNLENBQzNCLE1BQU8sR0FBSyxNQUFNLE1BQ2YsSUFBSSxTQUFTLEVBQU0sQ0FDbEIsTUFBTyxHQUFLLE1BRWIsS0FBSyxJQUdWLFlBQXVCLEVBQU0sRUFBUyxDQUNwQyxHQUFJLEdBQVEsR0FDWixFQUFLLE1BQU0sUUFBUSxTQUFTLEVBQU0sQ0FDaEMsR0FBSSxDQUNGLEVBQU0sRUFBSyxNQUNULEVBQUssTUFBUSxHQUFPLEdBQU8sR0FBZSxXQUFXLEVBQUssV0FDckQsRUFBUCxDQUNBLEtBQUksZUFBZSxLQUFLLEVBQUcsU0FDbkIsR0FDSiw2QkFDQSxFQUFHLFFBQ0QsOEVBQ0YsR0FHRSxLQUdWLEdBQUksR0FBTyxFQUFRLEVBQUssT0FBUyxHQUNqQyxjQUFPLEtBQUssR0FBTSxRQUFRLFNBQVMsRUFBSyxDQUN0QyxBQUFLLEVBQU0sZUFBZSxJQUN4QixHQUFNLEdBQU8sRUFBSyxNQUdmLEtDOUlULG1DQUVBLEdBQVEsVUFBWSxLQUNwQixHQUFRLGNBQWdCLE9DSHhCLHdDQUVBLEdBQUksSUFBUyxLQUNULEdBQU8sS0FFWCxhQUFpQixDQUNmLEtBQU0sTUFBcUIsTUFBTSxLQUFNLFdBR3pDLEdBQU8sUUFBVSxHQUNqQixZQUFjLEVBQUssQ0FDakIsR0FDRSxFQUFJLE9BQVMsUUFDYixrREFFRixHQUFJLEdBQWMsS0FDbEIsR0FBSSxFQUFJLE1BQU0sT0FBUSxDQUNwQixHQUFJLEdBQWEsRUFBSSxNQUFNLEdBQUcsT0FBUyxVQUN2QyxHQUFvQixFQUFLLEdBQ3JCLEdBQ0YsR0FBYyxFQUFJLE1BQU0sU0FLNUIsR0FGQSxFQUFNLEdBQWMsR0FDcEIsRUFBSSxlQUFpQixHQUFtQixHQUNwQyxFQUFhLENBQ2YsR0FBSSxHQUFTLEdBQ1QsRUFBaUIsR0FDckIsRUFBSSxNQUFNLFFBQVEsV0FBaUIsRUFBTSxDQUN2QyxBQUFJLEVBQUssT0FBUyxhQUNoQixFQUFlLEtBQUssR0FDZixBQUFJLEVBQUssT0FBUyxRQUN2QixFQUFLLE1BQU0sUUFBUSxHQUNkLEFBQUksRUFBSyxPQUFTLFNBQVcsRUFBSyxPQUFTLEdBQ2hELEVBQU8sS0FBSyxHQUVaLEdBQ0UscUNBQ0Esb0ZBQ0EsS0FJTixHQUFJLEdBQVMsR0FBSyxFQUFZLEtBQUssS0FDbkMsR0FBTyxFQUFPLGVBQWdCLEdBQzlCLEdBQUksR0FBa0IsR0FDdEIsVUFBSyxFQUFRLFNBQVMsRUFBTSxDQUMxQixBQUFJLEVBQUssT0FBUyxjQUNoQixFQUFnQixLQUFLLEVBQUssUUFHOUIsRUFBZSxRQUFRLFNBQVMsRUFBZSxDQUM3QyxBQUFJLEVBQWdCLFFBQVEsRUFBYyxRQUFVLElBQ2xELEdBQ0UsbUJBQ0Esb0JBQXNCLEVBQWMsS0FDcEMsS0FJTixPQUFPLEtBQUssRUFBSSxnQkFBZ0IsUUFBUSxTQUFTLEVBQU0sQ0FDckQsRUFBTyxlQUFlLEdBQVEsRUFBSSxlQUFlLEtBRW5ELEVBQU8sTUFBUSxFQUFPLE9BQU8sRUFBTyxPQUNwQyxFQUFPLFdBQWEsR0FDYixFQUVULE1BQU8sR0FHVCxZQUE0QixFQUE4QyxDQUN4RSxHQUFJLEdBQWMsR0FDbEIsVUFBSyxFQUFLLFNBQWdCLEVBQU0sQ0FDOUIsQUFBSSxFQUFLLE9BQVMsY0FBZ0IsRUFBSyxPQUFTLFdBQzlDLEdBQVksRUFBSyxNQUFRLEVBQVksRUFBSyxPQUFTLEdBQ25ELEVBQVksRUFBSyxNQUFNLEtBQUssTUFHekIsRUFHVCxZQUE2QixFQUFjLEVBQWEsQ0FDdEQsU0FBYyxHQUFlLEdBQzdCLEVBQWEsUUFBUSxTQUFTLEVBQWEsQ0FDekMsQUFBSSxFQUFZLFNBQ2QsR0FBb0IsRUFBWSxRQUFTLEdBRTNDLEVBQVksS0FBSyxLQUVaLEVBR1QsWUFBZ0IsRUFBYyxFQUFLLENBQ2pDLEdBQUksR0FBUSxHQUNaLEdBQ0UsRUFDQSxTQUFnQixFQUFNLENBQ3BCLEdBQUksRUFBSyxPQUFTLGFBQWMsQ0FDOUIsR0FBSSxFQUFNLEVBQUssUUFBVSxFQUFLLEtBQzVCLE1BQVEsR0FBSyxPQUFTLEdBRXhCLEVBQU0sRUFBSyxNQUFRLEVBQUssS0FDeEIsR0FBSSxHQUFrQixFQUFhLEVBQUssTUFDcEMsR0FBb0IsRUFBYSxFQUFLLE9BQ3RDLEdBQ0osQUFBSSxFQUFnQixRQUNsQixHQUFLLFFBQVUsRUFDZixFQUFnQixRQUFRLFNBQVMsRUFBYSxDQUM1QyxPQUFRLEVBQUssVUFDTixTQUNILEVBQVksTUFBUSxFQUFZLE1BQU0sT0FBTyxFQUFLLE9BQ2xELFVBQ0csVUFDSCxFQUFZLE1BQVEsRUFBSyxNQUFNLE9BQU8sRUFBWSxPQUNsRCxVQUNHLFVBQ0gsRUFBWSxNQUFRLEVBQUssTUFDekIsWUFNWixTQUFlLEVBQU0sQ0FDbkIsQUFBSSxFQUFLLE9BQVMsY0FBZ0IsQ0FBQyxFQUFLLFFBQ3RDLE1BQU8sR0FBTSxFQUFLLFFBTTFCLFlBQXVCLEVBQUssRUFBTyxDQUNqQyxNQUFPLElBQ0wsRUFDQSxTQUFnQixFQUFNLEVBQVMsQ0FDN0IsQUFBSSxFQUFLLE9BQVMsY0FDaEIsRUFBUSxDQUFDLEtBQU0sT0FBUSxJQUFLLEVBQUssS0FBSyxJQUFJLFFBQVEsTUFBTyxPQUc3RCxTQUFlLEVBQU0sRUFBUyxDQUM1QixHQUFJLEVBQUssT0FBUyxVQUFXLENBQzNCLEdBQUksR0FBVyxHQUFLLEVBQUssS0FBSyxLQUM5QixBQUFJLEVBQVMsWUFDWCxHQUFXLEdBQWEsSUFFMUIsRUFBUSxHQUFXLEVBQVUsRUFBSyxXQUsxQyxZQUFzQixFQUFLLENBQ3pCLE1BQU8sSUFBSyxFQUFLLFNBQVMsRUFBTSxFQUFTLENBQ3ZDLEFBQUksRUFBSyxPQUFTLGNBQ2hCLEVBQVEsQ0FDTixLQUFNLFFBQ04sTUFBTyxFQUFLLFVBTXBCLFlBQW9CLEVBQUssRUFBTyxDQUM5QixHQUFJLENBQUMsR0FBUyxDQUFDLEVBQU0sTUFBTSxPQUFRLE1BQU8sR0FDMUMsR0FBSSxHQUFXLEdBQ2YsRUFBTSxHQUFLLEVBQUssS0FBTSxTQUFTLEVBQU0sRUFBUyxDQUM1QyxBQUFJLEVBQUssT0FBUyxjQUNoQixHQUFXLEdBQ1gsRUFBSyxLQUFPLFFBQ1osRUFBSyxNQUFRLENBQUMsTUFHbEIsV0FBOEIsRUFBTSxDQUVsQyxPQURJLEdBQU0sRUFDRCxFQUFJLEVBQUcsRUFBSSxFQUFLLE1BQU0sT0FBUSxJQUNyQyxBQUFJLEVBQUssTUFBTSxHQUFHLFVBQ2xCLENBQUksRUFBSyxNQUFNLEdBQUcsT0FBUyxRQUN6QixFQUFNLEVBQXFCLEVBQUssTUFBTSxJQUM3QixFQUFLLE1BQU0sR0FBRyxPQUFTLEVBQUssTUFBTSxHQUFHLE1BQU0sTUFBTSxRQUMxRCxHQUFNLEVBQXFCLEVBQUssTUFBTSxHQUFHLFNBRzdDLE1BQU8sR0FFVCxNQUFLLElBRUgsRUFBcUIsR0FBSyxNQUFNLEtBQUssR0FFaEMsRUFHVCxZQUE2QixFQUFLLEVBQVksQ0FDNUMsR0FBSSxHQUFzQixHQUMxQixHQUFLLEVBQUssU0FBUyxFQUFNLENBQ3ZCLEFBQUksRUFBSyxPQUFTLFdBQ2hCLENBQUksR0FBYyxDQUFDLEVBQ2pCLEVBQXNCLEdBRXRCLEdBQ0Usb0JBQ0EsMklBQ0EsU0N4TVYsd0NBRUEsR0FBTyxRQUFVLENBQ2YsS0FBUSxrQkFDUixJQUFPLDBDQUNQLGFBQWdCLDRIQUNoQixPQUFVLGdIQUNWLFNBQVksb0hBQ1osTUFBTyxvR0FDUCxNQUFTLGdIQUNULE9BQVUsaUlBQ1YsTUFBUyw0R0NYWCw4QkFBTyxRQUFVLENBQ2YsaUJBQW9CLEdBQ3BCLE1BQVMsQ0FDUCxTQUVGLGNBQWlCLENBQ2YsVUFDQSxVQUVGLGVBQWtCLENBQ2hCLG9CQUVGLFFBQVcsQ0FDVCxnQkFDQSxrQkFFRixNQUFTLENBQ1Asb0JBRUYsS0FBUSxDQUNOLFVBRUYsTUFBUyxDQUNQLE9BQ0EsVUFDQSxtQkFDQSxTQUVGLFdBQWMsR0FDZCxPQUFVLENBQ1IsY0FFRixRQUFXLE1DaENiLDhCQUFPLFFBQVUsQ0FDZixhQUFnQixHQUNoQixVQUFhLEdBQ2IsaUJBQW9CLEdBQ3BCLGNBQWlCLEdBQ2pCLGVBQWtCLEdBQ2xCLFdBQWMsTUNOaEIsOEJBQU8sUUFBVSxDQUNmLGlCQUFvQiw0REFDcEIsTUFBUyxvWEFDVCxjQUFpQix3S0FDakIsZUFBa0IsaUlBQ2xCLFFBQVcsOEhBQ1gsTUFBUyxpS0FDVCxLQUFRLGdYQUNSLE1BQVMsK05BQ1QsV0FBYywrQkFDZCxPQUFVLGdWQUNWLFFBQVcsMmlCQ1hiLHdDQUVBLEdBQUksSUFBSyxLQUNMLEdBQWUsS0FDZixHQUFZLEtBQ1osR0FBVSxLQUVkLEdBQU8sUUFBVSxHQUVqQixZQUFlLEVBQVcsQ0FDeEIsR0FBSSxHQUFNLEdBQ1YsRUFBWSxFQUFVLE9BQU8sU0FBUyxFQUFJLENBQ3hDLE1BQU8sQ0FBQyxHQUFVLEtBRXBCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBVSxPQUFRLElBQ3BDLEFBQUksRUFBSSxRQUFRLEVBQVUsTUFBUSxJQUNoQyxHQUFJLEtBQUssRUFBVSxJQUNuQixFQUFVLEtBQUssTUFBTSxFQUFXLEdBQWEsRUFBVSxNQUczRCxNQUFPLEdBQ0osT0FDQSxJQUFJLFNBQVMsRUFBTSxDQUNsQixNQUFPLElBQVEsS0FFaEIsS0FBSztNQ3pCVixtQ0FFQSxHQUFJLElBQXVCLE9BQU8sVUFBVSxlQWM1QyxHQUFRLE1BQVEsR0FDaEIsWUFBbUIsRUFBRyxFQUFHLENBQ3ZCLEdBQUksVUFBVSxTQUFXLEVBQUcsQ0FFMUIsT0FESSxHQUFRLEVBQUUsR0FDTCxFQUFJLEVBQUcsRUFBSSxFQUFFLE9BQVEsSUFDNUIsRUFBUSxHQUFVLEVBQU8sRUFBRSxJQUU3QixNQUFPLEdBR1QsT0FBUyxLQUFPLEdBQ2QsR0FBSSxJQUFRLFFBQVMsQ0FDbkIsR0FBSSxHQUFPLEVBQUUsSUFBUSxHQUNyQixFQUFFLEdBQVEsT0FBTSxRQUFRLEdBQVEsRUFBTyxDQUFDLElBQU8sT0FBTyxFQUFFLElBQVEsWUFDdkQsSUFBUSxRQUFTLENBQzFCLEdBQUksR0FBTyxHQUFVLEVBQUUsSUFDdkIsRUFBTyxHQUFRLEVBQUssRUFBSyxPQUFTLEtBQU8sSUFBTSxFQUFPLElBQU0sRUFDNUQsR0FBSSxHQUFPLEdBQVUsRUFBRSxJQUN2QixFQUFPLEdBQVEsRUFBSyxFQUFLLE9BQVMsS0FBTyxJQUFNLEVBQU8sSUFBTSxFQUM1RCxFQUFFLEdBQU8sRUFBTyxNQUVoQixHQUFFLEdBQU8sRUFBRSxHQUlmLE1BQU8sR0FvQlQsR0FBUSxRQUFVLEdBQ2xCLFlBQTJCLEVBQUssRUFBVSxDQUt4QyxPQUpJLEdBQWMsR0FDaEIsRUFDQSxFQUFVLEdBQ1YsRUFBZ0IsTUFBTSxRQUFRLEdBQ3ZCLEVBQUksRUFBRyxFQUFJLEVBQUksT0FBUSxJQUU5QixBQURBLEVBQVksR0FBWSxFQUFJLElBQ3hCLEVBQUMsR0FDTCxJQUFpQixFQUFTLElBQU8sR0FBWSxHQUFXLElBQ3hELEVBQWMsRUFBYyxFQUFVLEVBQ3RDLEVBQVUsS0FFWixNQUFPLEdBRVQsWUFBNEIsRUFBSyxDQUMvQixHQUFJLEdBQWMsR0FDaEIsRUFBVSxHQUNaLE9BQVMsS0FBTyxHQUNkLEFBQUksR0FBTyxFQUFJLElBQVEsR0FBcUIsS0FBSyxFQUFLLElBQ3BELEdBQWMsRUFBYyxFQUFVLEVBQ3RDLEVBQVUsS0FHZCxNQUFPLEdBRVQsWUFBcUIsRUFBSyxFQUFVLENBQ2xDLE1BQUksT0FBTSxRQUFRLEdBQ1QsR0FBa0IsRUFBSyxHQUNyQixHQUFPLE1BQU8sSUFBUSxTQUN4QixHQUFtQixHQUVuQixHQUFPLEdBV2xCLEdBQVEsTUFBUSxHQUNoQixZQUFtQixFQUFLLENBQ3RCLEdBQUksQ0FBQyxFQUFLLE1BQU8sR0FDakIsR0FBSSxNQUFPLElBQVEsU0FBVSxDQUMzQixHQUFJLEdBQU0sR0FDVixPQUFTLEtBQVMsR0FFaEIsQUFBSSxHQUFxQixLQUFLLEVBQUssSUFDakMsR0FBTSxFQUFNLEVBQVEsSUFBTSxFQUFJLEdBQVMsS0FHM0MsTUFBTyxPQUVQLE9BQU8sR0FBTSxHQWFqQixHQUFRLEtBQU8sR0FDZixZQUFrQixFQUFLLEVBQUssRUFBUyxFQUFPLENBQzFDLEdBQ0UsSUFBUSxJQUNSLEdBQU8sTUFDTixDQUFDLEdBQVEsS0FBUSxTQUFXLElBQVEsU0FFckMsTUFBTyxHQUVULEdBQUksSUFBUSxHQUNWLE1BQU8sSUFBTyxHQUFRLEVBQU0sRUFBTSxLQUFPLEVBQU0sS0FFakQsR0FBSSxHQUFPLE1BQU8sR0FPbEIsTUFMRyxLQUFTLFVBQVksSUFBUyxhQUMvQixNQUFPLEdBQUksUUFBVyxZQUV0QixHQUFNLEVBQUksVUFFUixNQUFPLElBQVEsVUFDakIsR0FBTSxLQUFLLFVBQVUsR0FDakIsQ0FBQyxHQUFXLEVBQUksUUFBUSxPQUFTLElBQzVCLElBQU0sRUFBTSxLQUFPLEVBQUksUUFBUSxLQUFNLFNBQVcsSUFHdkQsSUFBUyxHQUFNLEdBQVcsSUFDdkIsSUFBTSxFQUFNLEtBQU8sRUFBTSxLQVVsQyxHQUFRLE1BQVEsR0FDaEIsWUFBbUIsRUFBSyxFQUFPLENBQzdCLEdBQUksR0FBUSxHQUVaLE9BQVMsS0FBTyxHQUNkLEdBQUksR0FBcUIsS0FBSyxFQUFLLEdBQU0sQ0FDdkMsR0FBSSxHQUFNLEVBQUksR0FFZCxHQUFJLEFBQVksSUFBWixRQUFpQixDQUNuQixFQUFNLEdBQVksR0FDbEIsRUFBUSxHQUFTLEVBQUssRUFBSyxHQUFPLEdBQVMsRUFDM0MsU0FFRixBQUFJLEFBQVksSUFBWixTQUNGLEdBQU0sR0FBVSxJQUVsQixHQUFTLEdBQVMsRUFBSyxFQUFLLEdBQU8sR0FJdkMsTUFBTyxHQVdULEdBQUksSUFBaUIsU0FDckIsR0FBUSxPQUFTLEdBQ2pCLFlBQW9CLEVBQU8sQ0FDekIsR0FBSSxHQUFPLEdBQUssRUFDWixFQUFjLEdBQWUsS0FBSyxHQUN0QyxHQUFJLENBQUMsRUFBYSxNQUFPLEdBRXpCLEdBQUksR0FBUyxHQUNULEVBQUcsRUFBVyxFQUNsQixJQUFLLEVBQUksRUFBWSxNQUFPLEVBQVksRUFBRyxFQUFJLEVBQUssT0FBUSxJQUFLLENBQy9ELE9BQVEsRUFBSyxXQUFXLFFBQ2pCLElBQ0gsRUFBUyxTQUNULFVBQ0csSUFDSCxFQUFTLFFBQ1QsVUFDRyxJQUNILEVBQVMsT0FDVCxVQUNHLElBQ0gsRUFBUyxPQUNULGNBRUEsU0FFSixBQUFJLElBQWMsR0FBRyxJQUFVLEVBQUssVUFBVSxFQUFXLElBQ3pELEVBQVksRUFBSSxFQUNoQixHQUFVLEVBRVosTUFBSSxLQUFjLEVBQVUsRUFBUyxFQUFLLFVBQVUsRUFBVyxHQUNuRCxFQWNkLEdBQVEsUUFBVSxHQUNsQixZQUFxQixFQUFLLEVBQVUsRUFBUSxFQUFLLENBQy9DLEdBQUksQ0FBRSxhQUFlLFFBQVEsS0FBTSxHQUNuQyxHQUFLLE9BQU8sU0FBVSxhQUFlLENBQUMsSUFBYSxDQUFDLEVBQ2xELFFBQUksU0FBVyxZQUFjLEVBQ3ZCLEVBRVIsR0FBSSxHQUFTLEVBQU8sRUFBTyxFQUMzQixHQUFJLENBQ0YsRUFBTSxHQUFPLEtBQWMsYUFBYSxFQUFVLENBQUMsU0FBVSxTQUM3RCxFQUFVLEVBQ1YsRUFBUSxFQUFJLE1BQU07QUFBQSxHQUNsQixFQUFRLEtBQUssSUFBSSxFQUFTLEVBQVMsR0FDbkMsRUFBTSxLQUFLLElBQUksRUFBTSxPQUFRLEVBQVMsU0FDL0IsRUFBUCxDQUNBLEVBQUksU0FDRiwwQkFBNEIsRUFBVyxLQUFPLEVBQUcsUUFBVSxJQUM3RCxHQUFZLEVBQUssS0FBTSxHQUN2QixPQUlGLEVBQVUsRUFDUCxNQUFNLEVBQU8sR0FDYixJQUFJLFNBQVMsRUFBTSxFQUFHLENBQ3JCLEdBQUksR0FBTyxFQUFJLEVBQVEsRUFDdkIsTUFBUSxJQUFRLEVBQVMsT0FBUyxRQUFVLEVBQU8sS0FBTyxJQUUzRCxLQUFLO0FBQUEsR0FHUixFQUFJLEtBQU8sRUFDWCxHQUFJLENBQ0YsRUFBSSxRQUNELElBQVksT0FDYixJQUNBLEVBQ0E7QUFBQSxFQUNBLEVBQ0E7QUFBQTtBQUFBLEVBQ0EsRUFBSSxjQUNDLEVBQVAsRUFDRixLQUFNLE1DNVJSLHdDQUVBLEdBQU8sUUFBVSxHQUNqQixZQUFtQixFQUFLLENBQ3RCLE1BQUksYUFBZSxNQUNWLFlBQWMsR0FBVSxFQUFJLGVBQWlCLElBRWxELElBQVEsT0FDSCxZQUVGLEtBQUssVUFBVSxHQUNWLFFBQVEsVUFBVyxXQUNuQixRQUFRLFVBQVcsV0FDbkIsUUFBUSxLQUFNLFdBQ2QsUUFBUSxLQUFNLFdBQ2QsUUFBUSxNQUFPLGNDZjdCLHdDQUVBLEdBQUksSUFBUyxLQUNULEdBQWlCLEtBQ2pCLEdBQVUsS0FDVixHQUFZLEtBRWhCLFlBQW9CLEVBQUssQ0FDdkIsTUFBTyxJQUFlLEVBQUssQ0FBQyxJQUFLLEdBQVMsV0FBWSxTQUV4RCxZQUFvQixFQUFLLENBQ3ZCLE1BQU8sSUFBZSxXQUFXLEVBQUssQ0FBQyxJQUFLLEdBQVMsV0FBWSxTQUduRSxHQUFPLFFBQVUsR0FPakIsWUFBc0IsRUFBTyxFQUFTLENBQ3BDLEdBQU8sTUFBTSxRQUFRLEdBQVEsNEJBQzdCLEdBQ0UsRUFBTSxNQUFNLFNBQVMsRUFBTSxDQUN6QixNQUNFLElBQ0EsTUFBTyxJQUFTLFVBQ2hCLE1BQU8sR0FBSyxNQUFTLFVBQ3BCLE9BQU8sR0FBSyxLQUFRLFVBQVksTUFBTyxHQUFLLEtBQVEsWUFDckQsTUFBTyxHQUFLLFlBQWUsWUFHL0Isc0ZBRUYsR0FBTyxHQUFXLE1BQU8sSUFBWSxTQUFVLCtCQUMvQyxHQUNFLE1BQU8sR0FBUSxPQUFVLFVBQ3pCLHFDQUVGLEdBQ0UsTUFBTyxHQUFRLFNBQVksV0FDM0Isc0pBRUYsR0FDRSxFQUFRLFNBQVcsUUFBVSxFQUFRLFNBQVcsU0FDaEQsK0NBR0YsR0FBSSxHQUFNLEdBQ04sRUFBVSxHQUNWLEVBQWdCLEdBRXBCLFdBQXNCLEVBQUssRUFBSyxFQUFZLEVBQUssQ0FDL0MsR0FBSSxHQUFXLEdBQ2IsR0FBSSxFQUFRLFNBQVcsT0FBUSxDQUM3QixHQUFJLEdBQU0sR0FDUixHQUFRLEtBQUssRUFBSyxHQUFXLEdBQU0sRUFBWSxFQUFRLFFBRXJELEVBQU8sRUFBSSxFQUFJLE9BQVMsR0FDNUIsQUFBSSxHQUFRLEVBQUssRUFBSyxPQUFTLEtBQU8sRUFBSSxHQUN4QyxFQUFJLEVBQUksT0FBUyxHQUFLLEVBQUssT0FBTyxFQUFHLEVBQUssT0FBUyxHQUFLLEVBQUksT0FBTyxHQUVuRSxFQUFJLEtBQUssT0FHWCxHQUFNLEdBQVcsR0FDYixHQUNGLEdBQU0sR0FBUSxPQUFPLElBRXZCLEVBQUksS0FBSyxHQUFVLEdBQU8sS0FBTyxHQUFVLFFBRzdDLEFBQUksR0FBUSxTQUFXLE9BQ3JCLEVBQUksS0FDRixFQUFRLFFBQVEsUUFDZCxLQUNBLEVBQ0EsTUFDQSxFQUNBLEtBQ0EsR0FBVSxHQUNWLEtBQ0EsR0FBVSxFQUFRLE9BQ2xCLEtBR0EsSUFDRixHQUFNLEVBQVEsUUFBUSxVQUFZLElBQU0sRUFBTSxLQUVoRCxFQUFJLEtBQUssR0FBVSxHQUFPLEtBQU8sSUFLdkMsRUFBTSxRQUFRLFNBQVMsRUFBTSxDQUMzQixHQUFJLEdBQU0sRUFBSyxLQUNYLEVBQU0sRUFBSyxJQUNYLEVBQWEsRUFBSyxXQUV0QixBQUFJLElBQVEsUUFDVixHQUFRLEtBQUssR0FDYixFQUFjLEtBQUssSUFFZixLQUFRLFNBQ1YsQ0FBSSxHQUFXLEdBQ2IsRUFBTSxHQUFVLEdBQVEsTUFBTSxHQUFXLEtBRXpDLEVBQU0sRUFBUSxRQUFRLFNBQVcsSUFBTSxFQUFNLEtBR2pELEVBQWEsRUFBSyxFQUFLLEVBQVksTUFHdkMsR0FBSSxHQUFhLEdBaUNqQixNQWhDSSxHQUFRLFFBQ1YsQ0FBSSxFQUFRLE1BQU0sSUFDaEIsRUFDRSxRQUNBLEdBQVUsR0FBUSxRQUFRLEVBQVEsSUFBSSxJQUFhLElBQ25ELEdBQ0EsR0FHRixHQUFVLEVBQVEsSUFBSSxTQUFTLEVBQUssRUFBRyxDQUNyQyxNQUFJLElBQVcsSUFDYixHQUFNLEdBQ0osRUFBYyxHQUFLLEdBQVEsT0FBTyxHQUFXLElBQVEsR0FBVyxJQUVsRSxFQUFjLEdBQUssSUFFZCxJQUVULEVBQ0UsUUFDQSxFQUFRLFFBQVEsV0FDZCxLQUNBLEVBQVEsS0FBSyxLQUNiLE1BQ0EsR0FBVSxHQUNWLElBQ0YsR0FDQSxLQUlOLEVBQU0sRUFBVyxPQUFPLEdBQ3BCLEVBQVEsU0FBVyxPQUFlLEVBQUksT0FBUyxFQUFJLEtBQUssS0FBTyxLQUN2RCxJQUFNLEVBQUksS0FBSyxLQUFPLE9DcEpwQywyQkFLQSxHQUFPLFFBQVUsQ0FDZixLQUFRLEdBQ1IsS0FBUSxHQUNSLEdBQU0sR0FDTixJQUFPLEdBQ1AsTUFBUyxHQUNULEdBQU0sR0FDTixJQUFPLEdBQ1AsTUFBUyxHQUNULEtBQVEsR0FDUixLQUFRLEdBQ1IsTUFBUyxHQUNULE9BQVUsR0FDVixNQUFTLEdBQ1QsSUFBTyx3bEJDbkJULEdBQUEsSUFBQSxHQUFBLE1BRUEsR0FDRSxDQUNFLE9BQU0sUUFBUyxHQUFVLFFBQ3hCLEdBQVUsTUFBTSxNQUFNLEFBQUMsR0FBVyxNQUFPLElBQU0sV0FHbEQsS0FBTSxJQUFJLE9BQU0sd0RBR2xCLEdBQU0sSUFBaUQsR0FDcEQsbUJBQ0csR0FBUSxHQUFJLEtBQWEsR0FBVSxPQUV6QyxHQUNFLENBQ0UsS0FFQSxNQUFPLEtBQXVCLFVBQzlCLE9BQU8sS0FBSyxJQUFvQixNQUM5QixBQUFDLEdBQ0MsTUFBTSxRQUFRLEdBQW1CLEtBRWpDLEdBQW1CLEdBQUssTUFBTSxBQUFDLEdBQU0sTUFBTyxJQUFNLFlBSXhELEtBQU0sSUFBSSxPQUNSLHFFQVdKLFlBQWdDLEVBQVUsQ0FDeEMsR0FBTSxHQUFlLEdBQ3JCLE9BQVcsS0FBTyxHQUFPLENBQ3ZCLEdBQU0sR0FBVSxHQUFtQixHQUNuQyxHQUFJLEVBQ0YsT0FBVyxLQUFlLEdBQ3hCLEFBQUksSUFBZSxHQUNqQixBQUFJLE1BQU8sR0FBTSxJQUFTLFdBQ3hCLEVBQVEsR0FBYSxNQUFNLEtBQUssRUFBTSxJQUVsQyxHQUFNLEdBQUssT0FDYixFQUFRLEdBQWEsTUFBTSxLQUFLLEVBQU0sR0FBSyxPQUN6QyxFQUFNLEdBQUssTUFDYixFQUFRLEdBQWEsS0FBSyxLQUFLLEVBQU0sR0FBSyxPQUc5QyxBQUFJLE1BQU8sR0FBTSxJQUFTLFdBQ3hCLEVBQVEsR0FBZSxDQUNyQixNQUFPLENBQUMsRUFBTSxJQUNkLEtBQU0sSUFHUixFQUFRLEdBQWUsQ0FDckIsTUFBTyxFQUFNLEdBQUssTUFBUSxDQUFDLEVBQU0sR0FBSyxPQUFTLEdBQy9DLEtBQU0sRUFBTSxHQUFLLEtBQU8sQ0FBQyxFQUFNLEdBQUssTUFBUSxRQUsvQyxBQUFJLElBQU0sSUFBSSxJQUNuQixDQUFJLElBQU8sR0FDVCxBQUFJLE1BQU8sR0FBTSxJQUFTLFdBQ3hCLEVBQVEsR0FBSyxNQUFNLEtBQUssRUFBTSxJQUUxQixHQUFNLEdBQUssT0FBTyxFQUFRLEdBQUssTUFBTSxLQUFLLEVBQU0sR0FBSyxPQUNyRCxFQUFNLEdBQUssTUFBTSxFQUFRLEdBQUssS0FBSyxLQUFLLEVBQU0sR0FBSyxPQUd6RCxBQUFJLE1BQU8sR0FBTSxJQUFTLFdBQ3hCLEVBQVEsR0FBTyxDQUNiLE1BQU8sQ0FBQyxFQUFNLElBQ2QsS0FBTSxJQUdSLEVBQVEsR0FBTyxDQUNiLE1BQU8sRUFBTSxHQUFLLE1BQVEsQ0FBQyxFQUFNLEdBQUssT0FBUyxHQUMvQyxLQUFNLEVBQU0sR0FBSyxLQUFPLENBQUMsRUFBTSxHQUFLLE1BQVEsS0FNdEQsTUFBTyxHQXBEVCxHQUFBLFFBQUEsOHNCQ3hDQSxHQUFBLElBQUEsR0FBQSxNQUNBLEdBQUEsR0FBQSxNQUVNLEdBQTJDLEdBQVUsYUFDM0QsR0FDRSxDQUNFLEtBRUEsTUFBTyxLQUFpQixVQUN4QixPQUFPLEtBQUssSUFBYyxNQUN4QixBQUFDLEdBQ0MsTUFBTSxRQUFRLEdBQWEsS0FFM0IsR0FBYSxHQUFLLE1BQU0sQUFBQyxHQUFNLE1BQU8sSUFBTSxZQUlsRCxLQUFNLElBQUksT0FDUiwrREFzQkosWUFBc0MsRUFBZ0MsQ0FDcEUsR0FBTSxHQUFNLEdBQUEsUUFBUSxHQUNwQixNQUFPLENBQUMsRUFBYyxJQUFpQixDQUNyQyxBQUFDLFlBQWlCLEVBQUksQ0FDcEIsR0FBSSxDQUFDLEVBQU0sT0FFWCxHQUFNLEdBQVUsRUFBSSxFQUFLLE1BRXpCLEdBQUksR0FBTyxLQUFBLE9BQVAsRUFBUyxNQUNYLE9BQVcsS0FBSyxHQUFRLE1BQ3RCLEVBQUUsRUFBTSxHQUlaLE9BQVcsS0FBTyxJQUFhLEVBQUssT0FBUyxHQUFJLENBQy9DLEdBQU0sR0FBVyxFQUFhLEdBQzlCLEdBQUksTUFBTSxRQUFRLEdBQ2hCLE9BQVcsS0FBYyxHQUN2QixFQUFRLE9BR1YsR0FBUSxHQUlaLEdBQUksR0FBTyxLQUFBLE9BQVAsRUFBUyxLQUNYLE9BQVcsS0FBSyxHQUFRLEtBQ3RCLEVBQUUsRUFBTSxLQUdYLElBOUJQLEdBQUEsT0FBQSxHQWlEQSxZQUF3QyxFQUFpQyxDQUN2RSxHQUFNLEdBQU0sR0FBQSxRQUFRLEdBQ3BCLE1BQU8sQ0FBQyxFQUFjLElBQWlCLENBQ3JDLEdBQU0sR0FBc0IsR0FFNUIsQUFBQyxZQUFpQixFQUFJLENBQ3BCLEdBQUksQ0FBQyxFQUFNLE9BRVgsR0FBTSxHQUFVLEVBQUksRUFBSyxNQUVuQixFQUFRLElBQVMsRUFBVSxFQUFVLE9BQVMsR0FHcEQsR0FGSSxHQUFPLEVBQVUsS0FBSyxHQUV0QixHQUFPLEtBQUEsT0FBUCxFQUFTLE1BQ1gsT0FBVyxLQUFLLEdBQVEsTUFDdEIsRUFBRSxFQUFNLEVBQU8sR0FJbkIsT0FBVyxLQUFPLElBQWEsRUFBSyxPQUFTLEdBQUksQ0FDL0MsR0FBTSxHQUFXLEVBQWEsR0FDOUIsR0FBSSxNQUFNLFFBQVEsR0FDaEIsT0FBVyxLQUFjLEdBQ3ZCLEVBQVEsT0FHVixHQUFRLEdBSVosR0FBSSxHQUFPLEtBQUEsT0FBUCxFQUFTLEtBQ1gsT0FBVyxLQUFLLEdBQVEsS0FDdEIsRUFBRSxFQUFNLEVBQU8sR0FJbkIsQUFBSSxHQUFPLEVBQVUsUUFDcEIsSUFyQ1AsR0FBQSxTQUFBLEdBaURBLFlBQXlDLEVBQW1DLENBQzFFLEdBQU0sR0FBTSxHQUFBLFFBQVEsR0FDcEIsTUFBTyxDQUFDLEVBQWMsSUFBaUIsQ0FDckMsQUFBQyxZQUFpQixFQUFZLENBQzVCLEdBQUksQ0FBQyxFQUFNLE9BRVgsR0FBTSxHQUFVLEVBQUksRUFBSyxNQUN6QixHQUFJLEdBQU8sS0FBQSxPQUFQLEVBQVMsTUFDWCxPQUFXLEtBQUssR0FBUSxNQUN0QixFQUFFLEVBQU0sRUFBTyxPQUdqQixRQUFXLEtBQU8sSUFBYSxFQUFLLE9BQVMsR0FBSSxDQUMvQyxHQUFNLEdBQVcsRUFBYSxHQUM5QixHQUFJLE1BQU0sUUFBUSxHQUNoQixPQUFXLEtBQWMsR0FDdkIsRUFBUSxPQUdWLEdBQVEsTUFJYixJQXZCUCxHQUFBLFVBQUEsS0MxSUEsbUNBQ0EsT0FBTyxlQUFlLEdBQVMsYUFBYyxDQUFFLE1BQU8sS0EwQnRELFlBQXFCLEVBQU8sRUFBUyxDQUNqQyxHQUFJLEVBQ0EsTUFBTyxHQUVYLEtBQU0sSUFBSSxPQUFNLHlDQUEyQyxLQUFLLFVBQVUsSUFFOUUsR0FBUSxZQUFjLEdBQ3RCLEdBQVEsUUFBVSx1bEJDbENsQixHQUFBLElBQUEsR0FBQSxNQUVBLFlBQXFDLEVBQWMsRUFBYyxDQUMvRCxPQUFRLEVBQU8sVUFJUixpQkFDSCxNQUFPLEdBQU8sUUFBVSxHQUFRLEVBQU8sYUFJcEMscUJBQ0Esb0JBQ0gsTUFBTyxPQUlKLHVCQUNILE1BQU8sR0FHWCxNQUFPLElBQUUsYUFBYSxFQUFNLEdBcEI5QixHQUFBLFFBQUEsb3FCQ0ZBLEdBQUEsSUFBQSxHQUFBLE1BQ0EsR0FBQSxLQUNBLEdBQUEsR0FBQSxNQUNBLEdBQUEsR0FBQSxNQUVNLEdBQVUsQUFBQyxHQUFpQixHQUFFLGlCQUFpQixJQUFTLEdBQUUsVUFBVSxHQUNwRSxHQUFlLEFBQUMsR0FDcEIsR0FBRSxpQkFBaUIsSUFBUyxHQUFRLEdBRWhDLEdBQW9CLEFBQUMsR0FDekIsR0FBRSxXQUFXLElBQVMsQ0FBQyxHQUFFLDBCQUEwQixHQUUvQyxHQUFlLEdBRWYsR0FBZ0IsT0FBTyxVQUV2QixHQUFZLEFBQUMsR0FDaEIsRUFBYSxJQUNWLEdBQWdCLEFBQUMsR0FDbkIsRUFBYSxJQUFrQixFQUFhLEtBQWtCLEdBQUksS0FFaEUsR0FBVyxDQUFDLEVBQWMsSUFBaUIsR0FBYyxHQUFNLElBQUksR0FJekUsWUFBeUIsRUFBZ0IsQ0FDdkMsT0FBVyxLQUFTLEdBQUssT0FDdkIsR0FBZSxFQUFPLEdBRXhCLEdBQU0sR0FBTSxFQUErQixHQUMzQyxBQUFJLEdBQ0YsR0FBUyxFQUFNLEVBQUcsTUFJdEIsWUFBd0IsRUFBYyxFQUFjLENBQ2xELE9BQVEsRUFBSyxVQUNOLGFBQ0gsR0FBUyxFQUFRLEVBQUssTUFDdEIsVUFDRyxnQkFDSCxPQUFXLEtBQVEsR0FBSyxXQUN0QixPQUFRLEVBQUssVUFDTixjQUNILEdBQWUsRUFBSyxTQUFVLEdBQzlCLFVBQ0csaUJBQ0gsR0FBZSxFQUFLLE1BQWlCLEdBQ3JDLGNBRUEsR0FBQSxRQUFZLEdBQ1osTUFHTixVQUNHLGVBQ0gsT0FBVyxLQUFXLEdBQUssU0FDekIsQUFBSSxHQUFTLEdBQWUsRUFBUyxHQUV2QyxVQUNHLGNBQ0gsR0FBZSxFQUFLLFNBQVUsR0FDOUIsVUFDRyxvQkFDSCxHQUFlLEVBQUssS0FBTSxHQUMxQixjQUdBLEtBQU0sSUFBSSxPQUFNLDhCQUFnQyxFQUFLLE9BSTNELFlBQ0UsRUFJQSxFQUNBLEVBQWlCLENBRWpCLE9BQVMsR0FBSSxFQUFRLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFDdkMsR0FBSSxHQUFRLEVBQVEsSUFBSyxDQUN2QixHQUFTLEVBQVEsR0FBSSxFQUFLLE1BQU0sTUFDaEMsUUFLTixHQUFNLElBQVksR0FBQSxTQUFLLENBQ3JCLG9CQUFvQixFQUFNLEVBQVEsRUFBTyxDQUN2QyxPQUFTLEdBQUksRUFBUSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQ3ZDLEdBQ0UsRUFBSyxPQUFTLE1BQ1YsR0FBRSxpQkFBaUIsRUFBUSxJQUMzQixHQUFhLEVBQVEsSUFDekIsQ0FDQSxPQUFXLEtBQWUsR0FBSyxhQUM3QixHQUFlLEVBQVksR0FBSSxFQUFRLElBRXpDLFNBSU4sb0JBQW9CLEVBQU0sRUFBUSxFQUFPLENBQ3ZDLEdBQUksRUFBSyxJQUNQLE9BQVMsR0FBSSxFQUFRLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFDdkMsR0FBSSxHQUFRLEVBQVEsSUFBSyxDQUN2QixHQUFTLEVBQVEsR0FBSSxFQUFLLEdBQUcsTUFDN0IsVUFLUixTQUFVLEdBQ1YsaUJBQWlCLEVBQU0sRUFBUSxFQUFPLENBQ3BDLE9BQVMsR0FBSSxFQUFRLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFDdkMsR0FBSSxHQUFRLEVBQVEsSUFBSyxDQUN2QixHQUFTLEVBQVEsR0FBSSxFQUFLLEdBQUcsTUFDN0IsU0FJTixhQUFhLEVBQUksQ0FDZixBQUFJLEVBQUssVUFBWSxNQUNqQixFQUFLLFFBQVEsUUFBVSxNQUMzQixHQUFlLEVBQUssUUFBUSxNQUFPLEVBQUssVUFFMUMsdUJBQXdCLEdBQ3hCLGdCQUFpQixHQUNqQix5QkFBMEIsS0FLdEIsR0FBYSxHQUFBLFNBRWhCLENBQ0QsV0FBVyxFQUFNLEVBQU8sRUFBTyxPQUM3QixHQUFNLEdBQU8sRUFBSyxLQUNsQixHQUFJLElBQVMsWUFBYSxPQUUxQixHQUFNLEdBQWEsRUFBUSxFQUFRLE9BQVMsR0FDNUMsR0FBSSxFQUFZLENBQ2QsR0FBSSxDQUFDLEdBQUEsUUFBYSxFQUFNLEdBQWEsT0FFckMsT0FBVyxLQUFVLEdBSW5CLEdBSEksSUFBUyxhQUFlLEdBQWtCLElBRzlDLElBQUksR0FBVSxNQUFPLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxJQUFJLElBQ3pCLE9BS04sRUFBTSxRQUFRLEtBQUssSUFHckIsZUFBZSxFQUFNLEVBQU8sRUFBTyxDQUNqQyxPQUFXLEtBQVUsR0FDbkIsR0FBSSxHQUFhLEdBQ2YsT0FJSixFQUFNLFFBQVEsS0FBSyxNQUl2QixZQUFvQyxFQUFXLENBQzdDLEdBQU0sR0FBK0MsR0FHckQsR0FBSSxDQUFDLEdBQUUsT0FBTyxHQUNaLEtBQU0sSUFBSSxXQUFVLGdDQUd0QixHQUFVLEVBQUssUUFDZixHQUFXLEVBQUssQ0FBQyxZQUVqQixHQUFNLEdBQWlCLEdBQUksS0FDM0IsT0FBVyxLQUFRLEdBQVMsQ0FDMUIsR0FBTSxHQUFlLEVBQUssT0FBUyxpQkFBbUIsT0FBUyxFQUFLLEtBQzlELEVBQVcsRUFBZSxJQUFJLEdBQ3BDLEFBQUksRUFDRixFQUFTLEtBQUssR0FFZCxFQUFlLElBQUksRUFBTSxDQUFDLElBSTlCLE1BQU8sQ0FBQyxHQUFHLEdBQ1IsSUFBSSxDQUFDLENBQUMsRUFBTSxLQUFZLEVBQUMsT0FBTSxXQUMvQixLQUFLLENBQUMsRUFBRyxJQUFPLEVBQUUsS0FBTyxFQUFFLEtBQU8sR0FBSyxHQXhCNUMsR0FBQSxRQUFBLHlxQkN6S0EsR0FBQSxJQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsR0FBQSxNQUNBLEdBQUEsR0FBQSxNQUVNLEdBQWUsQ0FDbkIsMkJBQTRCLEdBQzVCLDRCQUE2QixJQVUvQixZQUNFLEVBQ0EsRUFDQSxFQUFvQixHQUFFLENBR3RCLEVBQU0sRUFBTSxHQUVaLEVBQU0sRUFBTSxHQUVaLEdBQUksR0FDSixHQUFJLENBQ0YsRUFBTSxHQUFBLE1BQU0sRUFBSyxVQUNWLEVBQVAsQ0FDQSxLQUFNLFFBQU8sT0FDWCxHQUFJLE9BQU0sNkNBQ1YsQ0FDRSxVQUFXLE1BQ1gsYUFBYyxJQUlwQixHQUFJLEdBQ0osR0FBSSxDQUNGLEVBQVMsR0FBQSxNQUFNLEVBQUssVUFDYixFQUFQLENBQ0EsS0FBTSxRQUFPLE9BQ1gsR0FBSSxPQUFNLG9EQUNWLENBQ0UsVUFBVyxNQUNYLGFBQWMsSUFJcEIsR0FBTSxHQUFhLEdBQUksS0FBSSxDQUN6QixZQUNBLE9BQ0EsR0FBRyxFQUNILEdBQUcsR0FBQSxRQUFPLEdBQVEsSUFBSSxBQUFDLEdBQU0sRUFBRSxRQUczQixFQUFPLEdBQUksS0FDZixHQUFBLFFBQU8sR0FDSixJQUFJLEFBQUMsR0FBVyxFQUFPLE1BQ3ZCLE9BQU8sQUFBQyxHQUFNLENBQUMsRUFBVyxJQUFJLEtBR25DLEdBQUksRUFBSyxPQUFTLEVBQUcsTUFBTyxHQUU1QixHQUFJLEdBQWUsR0FDZixFQUFRLGtCQUNSLEVBQVMsaUJBQ2IsR0FBSSxHQUFFLGtCQUFrQixHQUN0QixFQUFRLE1BQ0gsQ0FDTCxLQUFPLEVBQUssSUFBSSxJQUFVLEVBQVcsSUFBSSxJQUN2QyxHQUFTLElBRVgsRUFBZSxPQUFPLFFBQVksTUFFcEMsS0FBTyxFQUFLLElBQUksSUFBVyxFQUFXLElBQUksSUFDeEMsR0FBVSxJQUdaLEdBQU0sR0FBTyxDQUNYLE9BQ0EsR0FBRyxNQUFNLEtBQUssR0FBTSxJQUNsQixBQUFDLEdBQ0MsR0FBRyxLQUFLLFVBQVUsU0FBUztVQUN6QixLQUFTO2lCQUNGLHVCQUF1QixrQkFJaEMsRUFBWSxHQUFjLEVBQUssRUFBSyxHQUUxQyxNQUFPO01BQ0g7TUFDQSxFQUFVO2lCQUNDLE1BQU0sS0FBSyxHQUFNLEtBQUs7UUFDL0IsRUFBVTthQUNMLEVBQUssS0FBSztNQUNqQixFQUFVLFNBbEZoQixHQUFBLFFBQUEsR0EwRkEsR0FBTSxJQUF3QixHQUFBLFVBQXlCLENBQ3JELFNBQVMsRUFBTyxFQUFRLEVBQUUsR0FJMUIsZ0JBQWdCLEVBQU0sRUFBSyxDQUN6QixFQUFNLFVBQVksR0FDbEIsR0FBSSxHQUFRLEdBQ1osQUFBSSxFQUFLLFVBQ1AsR0FBUSxXQUFXLEVBQU0sT0FBTyxFQUFLLGNBRXZDLEVBQU0sUUFBUSxFQUFNLFdBQVcsVUFXbkMsWUFBdUIsRUFBYSxFQUFhLEVBQWMsQ0FDN0QsR0FBTSxHQUFZLEVBQUksTUFBTSxJQUV0QixFQUE0QixDQUNoQyxVQUFXLEdBQ1gsT0FBTyxFQUFJLENBQ1QsTUFBTyxHQUFJLE1BQU0sRUFBSyxNQUFRLEVBQUssTUFFckMsUUFBUSxFQUFNLEVBQUcsQ0FDZixFQUFVLEtBQUssR0FBSSxFQUFLLE1BQVEsRUFBSyxLQUNyQyxFQUFVLEVBQUssT0FBVSxJQUk3QixVQUFzQixFQUFLLEdBRXBCLENBQ0wsT0FBUSxFQUFNLFVBQVksT0FBTyxPQUFjLEdBQy9DLEtBQU0sRUFBVSxLQUFLLElBQ3JCLE1BQU8sRUFBTSxVQUFZLFFBQVEsYUFBa0IsVUFBaUIsSUFJeEUsR0FBTyxRQUFVLEdBQ2pCLEdBQU8sUUFBUSxRQUFVLEtDekp6Qix3Q0FFQSxHQUFJLElBQVcsS0FDWCxHQUFZLEtBQ1osR0FBZSxLQUNmLEdBQVUsS0FDVixHQUFlLEtBQ2YsR0FBYyxLQUNkLEdBQWlCLEtBQ2pCLEdBQVksS0FDWixHQUFVLEtBR1YsR0FBNkIsQ0FDL0IsSUFBSyxHQUNMLFNBQVUsSUFHUixHQUFxQixDQUN2QixNQUNBLGFBQ0EsYUFDQSxxQkFDQSxpQkFDQSxvQkFDQSxZQUdGLEdBQU8sUUFBVSxHQUNqQixHQUFPLFFBQVEsY0FBZ0IsR0FDL0IsWUFBc0IsRUFBSyxFQUFTLENBQ2xDLE1BQU8sSUFBSSxJQUFTLEVBQUssR0FBUyxVQUdwQyxZQUFvQixFQUFLLENBQ3ZCLE1BQU8sSUFBZSxFQUFLLENBQUMsSUFBSyxHQUFTLFdBQVksU0FFeEQsWUFBb0IsRUFBSyxDQUN2QixNQUFPLElBQWUsV0FBVyxFQUFLLENBQUMsSUFBSyxHQUFTLFdBQVksU0FXbkUsWUFBa0IsRUFBTSxFQUFTLENBVS9CLEdBVEEsS0FBSyxRQUFVLEVBQVUsR0FBVyxHQUNwQyxLQUFLLEtBQU8sRUFDWixLQUFLLDJCQUE2QixFQUNsQyxLQUFLLG1CQUFxQixHQUMxQixLQUFLLGVBQWlCLEdBQ3RCLEtBQUssR0FBSyxFQUFRLFFBQVUsR0FDeEIsS0FBSyxJQUFNLE1BQU8sTUFBSyxJQUFPLFVBQ2hDLE1BQUssR0FBSyxNQUVSLEtBQUssSUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQ2hDLEtBQU0sSUFBSSxPQUNSLDZFQUdKLEtBQUssTUFBUSxBQUFVLEVBQVEsZUFBbEIsR0FDYixLQUFLLFFBQVUsRUFDZixLQUFLLGNBQWdCLEVBQ3JCLEtBQUssTUFBUSxHQUNiLEtBQUssT0FBUyxHQUNkLEtBQUssY0FBZ0IsR0FDckIsS0FBSyxVQUFZLEVBQ2IsRUFBUSxTQUFTLEtBQUssV0FBVyxFQUFRLFNBQzdDLEtBQUsscUJBQXVCLEdBQzVCLEtBQUssdUJBQXlCLEVBQVEsd0JBQTBCLEdBQzVELEtBQUssT0FBUyxLQUFLLHdCQUNyQixLQUFLLHFCQUFxQixLQUFLLFdBUW5DLEdBQVMsVUFBWSxDQUNuQixRQUFTLFNBQVMsRUFBTSxDQUN0QixNQUFJLE1BQUssdUJBQ1AsTUFBSyxxQkFBcUIsS0FBSyxHQUN4QixPQUFTLEdBRVQsT0FBUyxHQUlwQixNQUFPLFNBQVMsRUFBUyxFQUFNLEVBQU0sQ0FDbkMsR0FBSSxHQUFNLEdBQVUsRUFBTSxFQUFTLENBQ2pDLEtBQU0sRUFBSyxLQUNYLE9BQVEsRUFBSyxPQUNiLFNBQVUsRUFBSyxXQUVqQixLQUFNLElBU1IsUUFBUyxVQUFXLENBS2xCLEdBSkEsS0FBSyxJQUFNLEdBQ1AsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLHdCQUMzQixLQUFLLGdCQUFrQixHQUN2QixLQUFLLE1BQU0sS0FBSyxNQUNaLENBQUMsS0FBSyxjQUdSLE9BREksR0FBYSxPQUFPLEtBQUssS0FBSyxRQUN6QixFQUFJLEVBQUcsRUFBSSxFQUFXLE9BQVEsSUFBSyxDQUMxQyxHQUFJLEdBQVEsS0FBSyxPQUFPLEVBQVcsSUFDbkMsR0FBSSxDQUFDLEVBQU0sS0FDVCxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQU0sVUFBVSxPQUFRLElBQzFDLE9BQ00sR0FBSSxFQUFNLFVBQVUsR0FBRyxNQUMzQixFQUFJLEVBQU0sVUFBVSxHQUFHLElBQ3ZCLElBRUEsS0FBSyxJQUFJLEdBQUssR0FNeEIsR0FBSSxHQUFLLEtBQUssSUFBSSxLQUFLO0FBQUEsR0FDbkIsRUFBVSxLQUFLLFFBQVEsUUFDdkIsS0FBSyxRQUFRLFFBQVEsT0FBTyxJQUM1QixHQUNKLE1BQUksTUFBSyxRQUFRLEtBQ2YsRUFBSywyQkFBNkIsRUFFbEMsRUFBSyxHQUNILGVBQ0EsRUFDQSxFQUFRLE9BQ04sS0FBSyxxQkFBcUIsSUFBSSxTQUFTLEVBQU0sQ0FDM0MsTUFBTyxPQUFTLE1BS3BCLEtBQUssT0FDSCxNQUFLLFFBQVEsZ0JBQ2YsR0FDRSwyQkFDQSxHQUFVLEtBQUssUUFBUSxnQkFDdkI7QUFBQSxFQUNBLEdBRUosRUFDRSwrQ0FFQSxFQUNBLGtCQUNDLE1BQUssdUJBQXlCLGNBQWdCLGVBQy9DLDJDQUNDLE1BQUssUUFBUSxlQUNWLDBDQUNBLElBQ0osT0FJRixHQUFhLEtBQUssc0JBQ2xCLFlBQ0MsTUFBSyxRQUFRLGNBQWdCLFlBQzlCLDREQUNBLEVBQ0Esc0JBYUosV0FBWSxTQUFTLEVBQU0sQ0FDekIsS0FBSyxRQUFVLEdBQVMsRUFBSyxnQkFBa0IsYUFBZSxFQUFPLElBQ3JFLEtBQUssTUFBUSxLQUFLLFFBQVEsZUFBaUIsa0JBQzNDLEtBQUssSUFBTSxBQUFLLEtBQUssUUFBUSxRQUFRLFVBQTFCLEdBV2IsT0FBUSxTQUFTLEVBQUssQ0FDcEIsR0FBSSxHQUFPLEtBRVgsRUFBTSxHQUFVLEdBQ2hCLEVBQU0sRUFBSSxPQUFPLEVBQUcsRUFBSSxPQUFTLEdBRWpDLEFBQ0UsS0FBSyxpQkFBbUIsS0FBSyxJQUFJLFFBQ2pDLEtBQUssMkJBQTZCLElBRTlCLE1BQUssbUJBQXFCLFFBQzVCLE1BQUssY0FBZ0IsT0FDckIsS0FBSyw4QkFFUCxLQUFLLGlCQUFtQixPQUN4QixLQUFLLGNBQWdCLEVBQ3JCLEtBQUssSUFBSSxLQUFLLGdCQUFrQixHQUM5Qix5QkFDQSxLQUFLLGdCQUNMLEtBQUssYUFDTCxNQUVGLE1BQUssMkJBQTZCLEVBQ2xDLEtBQUssSUFBSSxLQUFLLDBCQUE0QixFQUFNLE1BQ2hELEtBQUssaUJBQW1CLE9BQ3hCLEtBQUssZ0JBQWtCLElBQ3ZCLEtBQUssYUFBZSxFQUNwQixLQUFLLGdCQUFrQixLQUFLLElBQUksU0FXcEMsaUJBQWtCLFNBQVMsRUFBSyxDQUM5QixHQUFJLEdBQVcsR0FDYixNQUFPLE1BQUssT0FBTyxHQUFXLEdBQU8sSUFFdkMsQUFDRSxLQUFLLGlCQUFtQixLQUFLLElBQUksUUFDakMsS0FBSywyQkFBNkIsSUFFbEMsTUFBSyw2QkFDRCxLQUFLLG1CQUFxQixRQUFRLE1BQUssY0FBZ0IsS0FDM0QsS0FBSyxpQkFBbUIsT0FDeEIsS0FBSyxjQUFnQixPQUFTLEVBQU0sSUFDcEMsS0FBSyxJQUFJLEtBQUssZ0JBQWtCLEdBQzlCLDBCQUNBLEtBQUssZ0JBQ0wsS0FBSyxhQUNMLE1BRUYsTUFBSywyQkFBNkIsRUFDbEMsS0FBSyxJQUFJLEtBQUssMEJBQTRCLEVBQU0sTUFDaEQsS0FBSyxpQkFBbUIsT0FDeEIsS0FBSyxnQkFBa0IsR0FDdkIsS0FBSyxhQUFlLElBQU0sRUFBTSxJQUNoQyxLQUFLLGdCQUFrQixLQUFLLElBQUksU0FhcEMsYUFBYyxTQUFTLEVBQVEsRUFBUyxDQUN0QyxFQUFTLEdBQVUsRUFDbkIsRUFBVSxFQUFVO0FBQUEsRUFBTyxHQUMzQixLQUFLLE9BQU8sRUFBVSxNQUFNLEtBQUssUUFBVSxHQUFRLEtBQUssS0FBSyxLQUN6RCxLQUFLLGVBQ1AsS0FBSyxJQUFJLEtBQUssK0NBVWxCLE1BQU8sU0FBUyxFQUFNLEVBQVEsQ0FDNUIsR0FBSSxHQUFRLEtBQUssTUFFakIsR0FBSSxDQUFDLEVBQU0sQ0FDVCxHQUFJLEdBQ0osS0FBSSxHQUNGLEVBQ0UsY0FDQSxFQUFPLEtBQ1AsS0FDQyxHQUFPLFVBQVksT0FDcEIsSUFDQSxFQUFPLEtBQ1AsSUFFRixFQUFNLG1CQUVSLEdBQU8sT0FBUyxFQUFPLDZCQUNqQixHQUFJLFdBQVUsR0FHdEIsR0FBSSxHQUFTLEVBQUssUUFBVSxJQUFTLEVBQUssT0FBUyxTQUM3QyxFQUFLLEtBQU0sQ0FDYixHQUFJLEdBQUsscUJBQXVCLEVBQUssS0FDckMsQUFBSSxFQUFLLFVBQ1AsSUFBTSx5QkFBMkIsR0FBVSxFQUFLLFdBQ2xELEtBQUssSUFBSSxLQUFLLEVBQUssS0FJdkIsR0FBSSxDQUFDLEtBQUssUUFBVSxFQUFLLE1BQU8sQ0FDOUIsR0FBSSxHQWdCSixPQWZBLEFBQUksRUFDRixFQUFNLGNBQWdCLEVBQU8sS0FFN0IsRUFBTSxtQkFFUixHQUNFLEtBQ0MsR0FBSyxVQUFZLE9BQ2xCLElBQ0EsRUFBSyxLQUNMLGdCQUVBLEVBQUssS0FDTCw0Q0FFTSxFQUFLLFVBQ04sU0FDSCxHQUFPLGtEQUNQLFVBQ0csY0FDQSxjQUNBLGlCQUNBLGdCQUNILEdBQU8saURBQ1AsTUFFSixLQUFNLElBQUksV0FBVSxHQUd0QixLQUFLLFVBQVUsSUFVakIsVUFBVyxTQUFTLEVBQU0sQ0FDeEIsTUFBTyxNQUFLLFFBQVUsRUFBSyxNQUFNLElBVW5DLFVBQVcsU0FBUyxFQUFNLENBQ3hCLEtBQUssSUFBSSxLQUFLLFdBQWEsRUFBSyxLQUFPLE1BQ3ZDLEtBQUssTUFBTSxFQUFLLE1BQU8sR0FDdkIsS0FBSyxJQUFJLEtBQUssTUFVaEIsVUFBVyxTQUFTLEVBQU0sQ0FDeEIsQUFBSSxBQUFhLEVBQUssTUFBbEIsVUFDRixLQUFLLElBQUksS0FBSyxZQUVkLEtBQUssSUFBSSxLQUFLLFFBQVUsRUFBSyxLQUFPLEtBRWxDLEVBQUssT0FDUCxNQUFLLE1BQU0sRUFBSyxNQUFPLEdBQ3ZCLEtBQUssSUFBSSxLQUFLLGNBV2xCLGFBQWMsU0FBUyxFQUFNLENBQzNCLEtBQUssT0FBTyxFQUFLLE1BR25CLGdCQUFpQixTQUFTLEVBQU8sQ0FDL0IsTUFBTyxNQUFLLFdBQVcsSUFTekIsV0FBWSxTQUFTLEVBQU8sQ0FDMUIsR0FBSSxHQUFtQixLQUFLLGlCQUN4QixFQUFLLEtBQUssR0FHZCxBQUNFLEdBQ0EsRUFBTSxNQUFNLE9BQVMsR0FDckIsQ0FBQyxHQUNELEVBQU0sTUFBTSxHQUFHLE9BQVMsUUFDeEIsRUFBTSxNQUFNLEdBQUcsT0FBUyxRQUV4QixLQUFLLGFBQWEsRUFBRyxJQUV2QixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQU0sTUFBTSxPQUFRLEVBQUUsRUFFeEMsQUFDRSxHQUNBLEVBQUksR0FDSixDQUFDLEdBQ0QsRUFBTSxNQUFNLEdBQUcsT0FBUyxRQUN4QixFQUFNLE1BQU0sRUFBSSxHQUFHLE9BQVMsUUFDNUIsTUFBTSxLQUFLLEVBQU0sTUFBTSxFQUFJLEdBQUcsTUFFOUIsS0FBSyxhQUFhLEVBQUcsSUFFdkIsS0FBSyxNQUFNLEVBQU0sTUFBTSxHQUFJLElBVy9CLGdCQUFpQixTQUFTLEVBQU8sQ0FDL0IsQUFBSSxLQUFLLElBQ1AsS0FBSyxJQUFJLEtBQ1AsbUJBQ0UsR0FBVSxNQUFNLEtBQUssUUFBVSxHQUFHLEtBQUssS0FBSyxLQUM1QyxNQUVOLEtBQUssSUFBSSxLQUFLLHFCQUNWLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxzQkFZN0IsYUFBYyxTQUFTLEVBQVMsQ0FDOUIsQUFBSSxHQUFZLEdBQVEsS0FBTyxDQUFDLEtBQUssVUFDbkMsS0FBSyxXQUFXLEVBQVEsS0FBTyxRQUc3QixLQUFLLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FDbkMsS0FBSyxtQkFBcUIsSUFXNUIsV0FBWSxTQUFTLEVBQU8sQ0FDMUIsR0FBSSxHQUFPLGNBQ1AsRUFBTyxFQUFNLE1BQVEsR0FDckIsRUFBUSxFQUFNLE1BQ2QsRUFBUSxFQUFNLE1BQ2QsRUFBYyxLQUFLLGdCQUFnQixFQUFNLGlCQUN6QyxFQUFLLEtBQUssR0FDVixFQUFVLEVBQU0sS0FBSyxLQUFPLElBQzVCLEVBQU0sRUFBTSxLQVFoQixHQVBJLEdBQVMsTUFBSyxjQUFnQixJQUNsQyxHQUNHLEdBQ0csRUFBTSxLQUFLLE9BQU8sRUFBRyxFQUFNLEtBQUssT0FBUyxHQUN6QyxJQUFNLEVBQU0sS0FBTyxLQUFPLElBRWhDLEtBQUssT0FBTyxHQUFPLEtBQUssT0FBTyxJQUFRLENBQUMsS0FBTSxHQUFPLFVBQVcsSUFDNUQsRUFBTSxLQUFNLENBUWQsR0FQQSxLQUFLLE9BQU8sR0FBSyxLQUFPLEdBQ3BCLEdBQ0YsS0FBSyxJQUFJLEtBQ1AsbUJBQ0UsR0FBVSxNQUFNLEtBQUssUUFBVSxHQUFHLEtBQUssSUFDdkMsTUFFRixHQUFTLEVBQU0sUUFBVSxFQUFZLE9BQVEsQ0FHL0MsR0FGQSxLQUFLLElBQUksS0FBSyxFQUFPLFdBRWpCLEVBQU8sQ0FDVCxLQUFLLElBQUksS0FBSyxzQkFHZCxLQUFLLGdCQUNMLEdBQUksR0FBVyxLQUFLLFFBQ3BCLEtBQUssUUFBVSxFQUNmLEtBQUssTUFBTSxFQUFNLE1BQU8sR0FDeEIsS0FBSyxRQUFVLEVBQ2YsS0FBSyxnQkFFTCxBQUFJLEVBQU0sUUFBVSxFQUFZLE9BQzlCLEtBQUssSUFBSSxLQUFLLE1BRWQsS0FBSyxJQUFJLEtBQUssS0FJbEIsR0FBSSxFQUFZLE9BQVEsQ0FDdEIsR0FBSSxFQUFNLE9BQVEsQ0FDaEIsR0FBSSxHQUFNLEtBQUssTUFBTSxHQUNyQixFQUFZLFFBQVEsR0FFdEIsQUFBSSxFQUFZLE9BQVMsRUFDdkIsS0FBSyxJQUFJLEtBQ1AsZUFDRSxLQUFLLFFBQVEsU0FDYixLQUNBLEVBQVksS0FBSyxLQUNqQixNQUdKLEtBQUssSUFBSSxLQUFLLGVBQWlCLEVBQVksWUFFcEMsRUFBTSxPQUFRLENBQ3ZCLEdBQUksR0FBTSxLQUFLLE1BQU0sR0FDckIsS0FBSyxJQUFJLEtBQUssZUFBaUIsR0FHakMsQUFBSSxFQUNGLEtBQUssSUFBSSxLQUFLLE1BQVEsRUFBTyxNQUU3QixLQUFLLElBQUksS0FBSyxXQUdoQixNQUFLLElBQUksS0FBSyxFQUFPLElBQU0sRUFBTyxNQUVwQyxBQUFJLEdBQUksS0FBSyxJQUFJLEtBQUsseUJBQ2pCLENBQ0wsR0FBSSxHQUFjLEtBQUssSUFBSSxPQUMzQixFQUFPLEVBQU8sRUFBSyxNQUFNLEtBQU8sR0FDaEMsR0FBSSxHQUNKLEFBQUksRUFBSyxRQUFVLFVBQVUsS0FBSyxFQUFLLEVBQUssT0FBUyxHQUFHLFNBQ3RELEdBQU8sRUFDSixNQUNBLE9BQ0EsUUFBUSxVQUFXLEtBSXhCLEtBQUssSUFBSSxLQUFLLEVBQU8sNEJBQThCLEVBQUssS0FBSyxLQUFPLE1BQ3BFLEtBQUssSUFBSSxLQUNQLG1GQUVFLEdBQ0YsTUFBSyxJQUFJLEtBQUssT0FBUyxFQUFPLFVBQzlCLEtBQUssSUFBSSxLQUNQLHFCQUNFLEVBQUssT0FDTCxvREFFSixLQUFLLElBQUksS0FBSyxLQUFPLEVBQU8saUNBQzVCLEtBQUssSUFBSSxLQUFLLE1BRWhCLEtBQUssZ0JBQ0wsS0FBSyxNQUFNLEVBQU8sR0FDbEIsS0FBSyxnQkFDTCxLQUFLLElBQUksS0FBSyxNQUNkLEdBQUksR0FBWSxLQUFLLElBQUksT0FDekIsS0FBSyxPQUFPLEdBQUssVUFBVSxLQUFLLENBQUMsTUFBTyxFQUFhLElBQUssTUFhOUQsU0FBVSxTQUFTLEVBQUssRUFBYyxDQUNwQyxLQUFLLFVBQ0wsR0FBSSxHQUFPLEVBQUksS0FDYixFQUFLLEtBQUssR0FDVixFQUFPLEtBRVQsWUFBc0IsQ0FDcEIsQUFBSSxFQUFjLEVBQUssaUJBQWlCLEVBQUksTUFDdkMsRUFBSyxPQUFPLEdBR25CLEFBQUksR0FBMkIsRUFBSSxRQUFVLElBQzNDLE1BQUssaUJBQW1CLElBRXJCLEtBQUssZ0JBQ0osRUFBQyxLQUFLLG9CQUFzQixBQUFVLEdBQVYsUUFDOUIsS0FBSyxlQUVQLEtBQUssZUFBaUIsSUFJcEIsR0FBTSxDQUFDLEVBQUksVUFBVSxLQUFLLGFBQWEsRUFBRyxJQUM5QyxBQUFJLEVBQUksYUFBZ0IsQ0FBQyxLQUFLLEtBQU8sR0FBWSxFQUFJLE1BQ25ELE1BQUssT0FBTyxLQUNaLElBQ0EsS0FBSyxnQkFDSCxFQUFJLE1BQ0osS0FBSyxnQkFBZ0IsRUFBSSxrQkFFM0IsQUFBSSxLQUFLLE9BQVMsQ0FBQyxFQUFJLFlBQ3JCLEtBQUssT0FBTyxLQUVaLEtBQUssT0FBTyxNQUlaLEdBQUksTUFDSCxFQUFJLE9BQ0gsQ0FBRSxHQUFJLE1BQU0sT0FBUyxTQUFXLEVBQUksTUFBTSxNQUFNLFNBQVcsSUFDM0QsRUFBSSxNQUFNLE1BQU0sS0FBSyxTQUFTLEVBQUssQ0FDakMsTUFBTyxHQUFJLE9BQVMsUUFBVSxDQUFDLFFBQVEsS0FBSyxFQUFJLFNBR3BELEtBQUssTUFDSCxFQUNFLGdDQUNBLEVBQ0Esa0NBQ0YsdUJBQ0EsSUFLSixNQUFLLE9BQU8sS0FDWixJQUNBLEtBQUssZ0JBQ0gsRUFBSSxNQUNKLEtBQUssZ0JBQWdCLEVBQUksa0JBRTNCLEtBQUssT0FBTyxLQUNSLEVBQUksTUFBTSxLQUFLLFVBQVUsRUFBSSxNQUNqQyxLQUFLLE1BQU0sRUFBSSxNQUFPLEdBSXBCLEdBQ0EsQ0FBQyxFQUFJLFVBQ0wsR0FBMkIsRUFBSSxRQUFVLElBQ3pDLENBQUMsR0FBYSxJQUVkLEtBQUssYUFBYSxFQUFHLElBRXZCLEtBQUssT0FBTyxNQUNaLElBQ0EsS0FBSyxPQUFPLE1BR1YsR0FBMkIsRUFBSSxRQUFVLElBQzNDLE1BQUssaUJBQW1CLElBRTFCLEtBQUssV0FVUCxxQkFBc0IsU0FBUyxFQUFLLENBQ2xDLE1BQU8sTUFBSyxTQUFTLEVBQUssS0FVNUIsVUFBVyxTQUFTLEVBQU0sQ0FDeEIsS0FBSyxPQUFPLEVBQUssTUFVbkIsYUFBYyxTQUFTLEVBQVMsQ0FDOUIsQUFBSSxDQUFDLEVBQVEsUUFDVCxNQUFLLElBQUksS0FBSyxhQUFhLEVBQUcsSUFDbEMsS0FBSyxPQUFPLE9BQVMsRUFBUSxJQUFNLFNBWXJDLGdCQUFpQixTQUFTLEVBQU8sR0FTakMsa0JBQW1CLFNBQVMsRUFBUyxDQUNuQyxBQUFJLENBQUMsRUFBUSxRQUNULE1BQUssSUFBSSxLQUFLLGFBQWEsRUFBRyxJQUNsQyxLQUFLLE9BQU8sT0FBVSxHQUFRLEtBQU8sS0FDckMsS0FBSyxNQUFNLEVBQVEsTUFBTyxHQUN0QixLQUFLLElBQUksS0FBSyxhQUFhLEVBQUcsSUFDbEMsS0FBSyxPQUFPLFNBWWQsVUFBVyxTQUFTLEVBQU0sQ0FNeEIsR0FBSSxFQUFLLE9BQVEsQ0FDZixHQUFJLEdBQU0sRUFBSyxJQUFJLE9BQ25CLEVBQU0seUJBQTJCLEVBQU0sc0JBQ25DLEVBQUssYUFBZSxJQUN0QixHQUFNLEtBQUssUUFBUSxVQUFZLElBQU0sRUFBTSxLQUM3QyxLQUFLLGlCQUFpQixPQUV0QixNQUFLLElBQUksS0FBSyxFQUFLLEtBSXJCLEFBQUksRUFBSyxPQUNGLEdBQUssUUFBUSxLQUFLLElBQUksS0FBSyxLQUNoQyxLQUFLLE1BQU0sRUFBSyxNQUFPLEdBQ2xCLEVBQUssUUFBUSxLQUFLLElBQUksS0FBSyxPQVdwQyxpQkFBa0IsU0FBUyxFQUFNLENBQy9CLEdBQUksR0FBTyxFQUFLLEtBQ2hCLEtBQUssSUFBSSxLQUFLLE9BQVMsRUFBTyxPQUM5QixLQUFLLE1BQU0sRUFBSyxXQUFZLEdBQzVCLEtBQUssSUFBSSxLQUFLLEtBQ1YsRUFBSyxXQUNQLENBQUksRUFBSyxVQUFVLE9BQVMsY0FDMUIsTUFBSyxJQUFJLEtBQUssUUFDZCxLQUFLLGlCQUFpQixFQUFLLFlBRTNCLE1BQUssSUFBSSxLQUFLLFVBQ2QsS0FBSyxNQUFNLEVBQUssVUFBVyxHQUMzQixLQUFLLElBQUksS0FBSyxRQVlwQixXQUFZLFNBQVMsRUFBTSxDQUN6QixHQUFJLEdBQU8sRUFBSyxLQUNoQixLQUFLLElBQUksS0FBSyxVQUFZLEVBQU8sT0FDakMsS0FBSyxNQUFNLEVBQUssTUFBTyxHQUN2QixLQUFLLElBQUksS0FBSyxNQVVoQixVQUFXLFNBQVMsRUFBTSxDQUN4QixHQUFJLEdBQWUsRUFBSyxLQUFPLFlBQWMsS0FBSyxVQUNsRCxLQUFLLFlBRUwsS0FBSyxJQUFJLEtBQ1AsY0FFRSxFQUFLLElBQ0w7QUFBQTtBQUFBLGdCQUdBLEVBQUssSUFDTDtBQUFBLDJDQUlBLEVBQUssV0FDUCxLQUFLLElBQUksS0FBSywyQkFHaEIsS0FBSyxJQUFJLEtBQ1Asa0JBRUUsRUFDQSw2QkFDQSxFQUNBLFdBQ0EsRUFDQTtBQUFBLGNBRUEsRUFBSyxJQUNMLFlBQ0EsRUFDQSxNQUdKLEtBQUssTUFBTSxFQUFLLE1BQU8sR0FFdkIsS0FBSyxJQUFJLEtBQUssV0FFVixFQUFLLFdBQ1AsTUFBSyxJQUFJLEtBQUssZ0JBQ2QsS0FBSyxNQUFNLEVBQUssVUFBVyxHQUMzQixLQUFLLElBQUksS0FBSyxVQUdoQixLQUFLLElBQUksS0FDUDtBQUFBO0FBQUEsZUFJRSxFQUNBO0FBQUE7QUFBQSxZQUdBLEVBQUssSUFDTCxZQUNBLEVBQ0EsTUFHSixLQUFLLE1BQU0sRUFBSyxNQUFPLEdBRXZCLEtBQUssSUFBSSxLQUFLLFNBQ1YsRUFBSyxXQUNQLE1BQUssSUFBSSxLQUFLLHdCQUNkLEtBQUssTUFBTSxFQUFLLFVBQVcsR0FDM0IsS0FBSyxJQUFJLEtBQUssVUFFaEIsS0FBSyxJQUFJLEtBQUs7QUFBQTtBQUFBLElBR2hCLFlBQWEsU0FBUyxFQUFNLENBQzFCLEtBQUssSUFBSSxLQUNQLGNBRUUsRUFBSyxJQUNMO0FBQUEsYUFFQSxFQUFLLElBQ0wsT0FDQSxFQUFLLElBQ0w7QUFBQSxHQUdKLEtBQUssTUFBTSxFQUFLLE1BQU8sR0FFdkIsS0FBSyxJQUFJLEtBQUs7QUFBQSxJQVVoQixnQkFBaUIsU0FBUyxFQUFPLEVBQWlCLENBQ2hELEdBQUksRUFBZ0IsT0FBUSxDQUMxQixHQUFJLEVBQU0sT0FBUSxDQUNoQixHQUFJLEdBQU0sS0FBSyxNQUFNLEdBQ3JCLEVBQWdCLFFBQVEsR0FFMUIsQUFBSSxFQUFnQixPQUFTLEVBQzNCLEtBQUssaUJBQ0gsS0FBSyxRQUFRLFNBQ1gsSUFDQSxLQUFLLFFBQVEsU0FDYixLQUNBLEVBQWdCLEtBQUssS0FDckIsT0FDQSxHQUFVLEtBQUssT0FDZixLQUdKLEtBQUssaUJBQ0gsS0FBSyxRQUFRLFNBQ1gsSUFDQSxFQUFnQixHQUNoQixLQUNBLEdBQVUsS0FBSyxPQUNmLFNBR0QsQUFBSSxHQUFNLFFBQ2YsS0FBSyxNQUFNLEVBQU8sS0FRdEIsTUFBTyxTQUFTLEVBQU8sRUFBUSxDQUM3QixHQUFJLEdBQU0sR0FBYSxFQUFPLENBQzVCLE1BQU8sS0FBSyxNQUNaLE9BQVEsRUFBUyxPQUFTLFNBQzFCLFFBQVMsS0FBSyxRQUFRLEtBQUssUUFFN0IsTUFBSSxJQUNGLEtBQUssaUJBQWlCLEdBRWpCLEdBT1QsZ0JBQWlCLFNBQVMsRUFBaUIsQ0FDekMsTUFDRSxJQUNBLEVBQWdCLFFBQVEsSUFBSSxTQUFTLEVBQVcsQ0FDOUMsTUFBTyxHQUFVLFFBTXpCLFlBQXNCLEVBQUssQ0FDekIsV0FBa0IsRUFBTSxDQUV0QixNQUFJLEdBQUssT0FBUyxRQUFnQixFQUFLLE1BQU0sTUFBTSxHQUkvQyxFQUFLLE9BQVMsYUFBcUIsR0FDL0IsRUFBSyxPQUFTLFFBQVUsQ0FBQyxLQUFLLEtBQUssRUFBSyxNQUFTLEVBQUssU0FHaEUsTUFBTyxHQUFJLE1BQU0sTUFBTSxNQUFNLE1DLytCL0IsOEJBQUksSUFBVSxLQUVkLEdBQU8sUUFBVSxHQUNqQixZQUFjLEVBQVUsRUFBYyxDQUNwQyxTQUFlLEdBQWdCLFdBQ3hCLFNBQ0wsTUFDQSxFQUFXO0FBQUEsU0FBbUIsRUFBZSxLQUM3QyxPQ1JKLG1DQUVBLEFBVUEsR0FBSSxJQUFLLEtBQ0wsR0FBTyxLQUNQLEdBQU0sS0FDTixHQUFnQixLQUNoQixHQUFRLEtBQ1IsR0FBTyxLQUNQLEdBQVUsS0FDVixHQUFPLEtBQ1AsR0FBZSxLQUNmLEdBQVUsS0FDVixHQUFjLEtBTWxCLEdBQVEsS0FBTyxNQU1mLEdBQVEsUUFBVSxHQU1sQixHQUFRLE1BQVEsR0FFaEIsWUFBc0IsRUFBTyxFQUFTLEVBQVMsRUFBTSxDQUNuRCxNQUFPLEdBQVEsT0FBTyxTQUFTLEVBQU8sRUFBUSxDQUM1QyxNQUFPLEdBQU8sR0FBUSxFQUFPLEdBQU0sRUFBTyxHQUFXLEdBQ3BELEdBR0wsWUFBNkIsRUFBUyxFQUFNLENBQzFDLEdBQUksR0FBa0IsRUFBUSxPQUFPLFNBQVMsRUFBUSxDQUNwRCxNQUFPLEdBQU8sS0FHaEIsR0FBSSxFQUFnQixPQUFTLEVBQzNCLEtBQU0sSUFBSSxPQUFNLHFDQUF1QyxFQUFPLFlBQ3pELE1BQUksR0FBZ0IsT0FDbEIsRUFBZ0IsR0FBRyxHQUFNLEtBQUssRUFBZ0IsSUFFaEQsS0FPVCxHQUFRLFFBQVUsR0FXbEIsWUFBcUIsRUFBSyxFQUFTLENBQ2pDLEdBQUksR0FBZ0IsR0FDcEIsRUFBYyxFQUFRLFVBQVksRUFDbEMsR0FBSSxHQUFlLEdBQ2YsRUFBVSxFQUFRLFNBQVcsR0FDN0IsRUFBTSxHQUFLLE9BQU8sRUFBSyxDQUN6QixTQUFVLEVBQVEsU0FDbEIsUUFBUyxFQUFRLFFBQ2pCLElBQUssU0FBUyxFQUFLLEVBQVMsQ0FDMUIsR0FBSSxHQUFhLEdBQ2pCLE9BQU8sS0FBSyxHQUFTLFFBQVEsU0FBUyxFQUFLLENBQ3pDLEVBQVcsR0FBTyxFQUFRLEtBRTVCLEVBQVcsUUFBVSxFQUNsQixPQUFPLFNBQVMsRUFBUSxDQUN2QixNQUFPLENBQUMsQ0FBQyxFQUFPLE1BRWpCLElBQUksU0FBUyxFQUFRLENBQ3BCLE1BQU8sR0FBTyxNQUVsQixHQUFJLEdBQVcsR0FDYixFQUNBLENBQUMsU0FBVSxFQUFRLFVBQ25CLEVBQ0EsVUFFRixNQUFPLElBQ0wsR0FBSSxFQUFVLEdBQ2QsRUFDQSxFQUNBLFlBR0osTUFBTyxTQUFTLEVBQVEsRUFBUyxDQUMvQixFQUFTLEVBQU8sSUFBSSxTQUFTLEVBQU8sQ0FDbEMsTUFBSSxHQUFNLE9BQVMsUUFBVSxHQUFLLFFBQVEsRUFBTSxPQUFTLEdBQ2hELENBQ0wsS0FBTSxPQUNOLElBQUssRUFBTSxJQUNYLElBQUssRUFBTSxJQUFNLFFBR2QsSUFFVCxFQUFTLEdBQWMsRUFBUSxHQUMvQixFQUFTLEdBQWEsRUFBUSxFQUFTLEVBQVMsWUFDaEQsR0FBSSxHQUFlLEdBQ25CLGNBQU8sS0FBSyxHQUFTLFFBQVEsU0FBUyxFQUFLLENBQ3pDLEVBQWEsR0FBTyxFQUFRLEtBRTlCLEVBQWEsUUFBVSxFQUNwQixPQUFPLFNBQVMsRUFBUSxDQUN2QixNQUFPLENBQUMsQ0FBQyxFQUFPLFFBRWpCLElBQUksU0FBUyxFQUFRLENBQ3BCLE1BQU8sR0FBTyxRQUdYLEdBQ0wsR0FDRSxHQUFNLEVBQVEsR0FDZCxFQUNBLEVBQ0EsYUFFRixFQUNBLEVBQ0EsWUFHSixRQUFTLFNBQVMsRUFBVSxFQUFRLEVBQWEsQ0FDL0MsR0FBSSxHQUFrQixHQUFvQixFQUFTLFdBQ25ELE1BQUksR0FDSyxFQUFnQixFQUFVLEVBQVEsR0FHcEMsR0FBSyxRQUFRLEVBQVUsRUFBUSxJQUV4QyxLQUFNLFNBQVMsRUFBVSxFQUFhLENBQ3BDLEVBQWEsS0FBSyxHQUVsQixHQUFJLEdBRUEsRUFBa0IsR0FBb0IsRUFBUyxRQUNuRCxNQUFJLEdBQ0YsRUFBVyxFQUFnQixFQUFVLEdBRXJDLEVBQVcsR0FBSyxLQUFLLEVBQVUsR0FHakMsRUFBYyxHQUFZLEVBQU8sU0FBUyxHQUN0QyxFQUFTLFNBQVMsUUFDbEIsRUFDRyxLQUdYLEVBQU0sR0FBYSxFQUFLLEVBQVMsRUFBUyxZQUMxQyxFQUFNLEdBQWEsRUFBSyxFQUFTLEVBQVMsY0FFMUMsR0FBSSxHQUFhLEdBQ2pCLE9BQU8sS0FBSyxHQUFRLFNBQVMsUUFBUSxTQUFTLEVBQUssQ0FDakQsRUFBVyxHQUFPLEdBQVEsUUFBUSxLQUVoQyxFQUFRLFNBQ1YsT0FBTyxLQUFLLEVBQVEsU0FBUyxRQUFRLFNBQVMsRUFBSyxDQUNqRCxFQUFXLEdBQU8sRUFBUSxRQUFRLEtBR3RDLEVBQU0sR0FBUSxjQUNaLEVBQ0EsRUFDQSxFQUFRLGNBQ1IsRUFBUSxlQUdWLEVBQU0sR0FBYSxFQUFLLEVBQVMsRUFBUyxlQUMxQyxFQUFNLEdBQWEsRUFBSyxFQUFTLEVBQVMsV0FDMUMsRUFBTSxHQUFLLEdBQ1gsRUFBTSxHQUFhLEVBQUssRUFBUyxFQUFTLFlBRzFDLEVBQU0sR0FBYSxFQUFLLEVBQVMsRUFBUyxjQUMxQyxHQUFJLEdBQU0sSUFBb0IsRUFBUyxpQkFBbUIsSUFBYyxFQUFLLENBQzNFLE9BQVEsRUFBUSxPQUNoQixhQUFjLEVBQVEsYUFDdEIsUUFBUyxFQUFRLFFBQ2pCLHVCQUF3QixFQUFRLHVCQUNoQyxRQUFTLEVBQVEsUUFDakIsS0FBTSxFQUFRLEtBQ2QsZUFBZ0IsRUFBUSxlQUFpQixFQUFnQixHQUN6RCxhQUFjLEVBQVEsZUFFeEIsU0FBSyxHQUFhLEVBQUksRUFBUyxFQUFTLGVBR3BDLEVBQVEsT0FDVixRQUFRLE1BQ047QUFBQTtBQUFBO0FBQUEsYUFDQSxFQUFHLFFBQVEsTUFBTyxPQUlmLENBQUMsS0FBTSxFQUFJLGFBQWMsR0FpQmxDLFlBQTZCLEVBQVMsRUFBSyxDQUN6QyxHQUFJLEdBQU0sRUFBUSxTQUNsQixHQUFJLEVBQVEsT0FBUyxHQUFRLE1BQU0sR0FDakMsTUFBTyxJQUFRLE1BQU0sR0FFckIsQUFBSSxJQUFRLFFBQVcsR0FBTSxHQUFHLGFBQWEsRUFBUSxTQUFVLFNBQy9ELEdBQUksR0FBUSxHQUFRLFFBQVEsRUFBSyxHQUNqQyxNQUFJLEdBQVEsT0FBTyxJQUFRLE1BQU0sR0FBTyxHQUNqQyxFQW9CWCxHQUFRLFFBQVUsU0FBUyxFQUFLLEVBQVMsQ0FDdkMsR0FBSSxHQUFVLEdBQVcsR0FFekIsRUFBTSxPQUFPLEdBRWIsR0FBSSxHQUFTLEdBQVksRUFBSyxDQUM1QixhQUFjLEVBQVEsZUFBaUIsR0FDdkMsU0FBVSxFQUFRLFNBQ2xCLFFBQVMsRUFBUSxRQUNqQixPQUFRLEVBQVEsT0FDaEIsUUFBUyxFQUFRLFFBQ2pCLHVCQUF3QixFQUFRLHVCQUNoQyxRQUFTLEVBQVEsUUFDakIsS0FBTSxFQUFRLEtBQ2QsZUFBZ0IsRUFBUSxlQUFpQixHQUN6QyxNQUFPLEVBQVEsTUFDZixhQUFjLFdBQ2QsUUFBUyxFQUFRLFFBQ2pCLGNBQWUsRUFBUSxjQUN2QixjQUFlLEVBQVEsY0FDdkIsUUFBUyxFQUFRLFVBR2YsRUFBTSxFQUFRLHVCQUNkLEdBQUksVUFBUyxHQUFJLEVBQU8sS0FBTyx1QkFDL0IsR0FBWSxFQUFPLE1BRXZCLFNBQUksYUFBZSxFQUFPLGFBRW5CLEdBb0JULEdBQVEscUNBQXVDLFNBQVMsRUFBSyxFQUFTLENBQ3BFLEdBQUksR0FBVSxHQUFXLEdBRXpCLEVBQU0sT0FBTyxHQUNiLEdBQUksR0FBUyxHQUFZLEVBQUssQ0FDNUIsYUFBYyxFQUFRLGFBQ3RCLFNBQVUsRUFBUSxTQUNsQixRQUFTLEVBQVEsUUFDakIsT0FBUSxFQUFRLE9BQ2hCLFFBQVMsRUFBUSxRQUNqQix1QkFBd0IsRUFBUSx5QkFBMkIsR0FDM0QsUUFBUyxFQUFRLFFBQ2pCLEtBQU0sRUFBUSxLQUNkLGVBQWdCLEVBQVEsYUFDeEIsTUFBTyxFQUFRLE1BQ2YsYUFBYyxFQUFRLE1BQVEsV0FDOUIsUUFBUyxFQUFRLFFBQ2pCLGNBQWUsRUFBUSxjQUN2QixjQUFlLEVBQVEsY0FDdkIsUUFBUyxFQUFRLFVBR2YsRUFBTyxFQUFPLEtBRWxCLE1BQUksR0FBUSxRQUNOLEdBQVEseUJBQTJCLElBQ3JDLEdBQU8sb0NBQXNDLEdBRS9DLEdBQVEscUJBQXdCLEdBQVEsTUFBUSxZQUFjLEtBR3pELENBQUMsS0FBTSxFQUFNLGFBQWMsRUFBTyxlQWtCM0MsR0FBUSxjQUFnQixTQUFTLEVBQUssRUFBUyxDQUM3QyxNQUFPLElBQVEscUNBQXFDLEVBQUssR0FBUyxNQWlCcEUsR0FBUSxZQUFjLFNBQVMsRUFBTSxFQUFTLENBQzVDLFNBQVUsR0FBVyxHQUNyQixFQUFRLFNBQVcsRUFDWixHQUFvQixJQWtCN0IsR0FBUSxPQUFTLFNBQVMsRUFBSyxFQUFTLEVBQUksQ0FLMUMsR0FISSxBQUFjLE1BQU8sSUFBckIsWUFDRCxHQUFLLEVBQVcsRUFBVSxRQUV6QixNQUFPLElBQU8sV0FBWSxDQUM1QixHQUFJLEdBQ0osR0FBSSxDQUNGLEVBQU0sR0FBUSxPQUFPLEVBQUssU0FDbkIsRUFBUCxDQUNBLE1BQU8sR0FBRyxHQUVaLE1BQU8sR0FBRyxLQUFNLEdBTWxCLEdBSEEsRUFBVSxHQUFXLEdBR2pCLEVBQVEsT0FBUyxDQUFDLEVBQVEsU0FDNUIsS0FBTSxJQUFJLE9BQU0saURBR2xCLE1BQU8sSUFBb0IsRUFBUyxHQUFLLElBYTNDLEdBQVEsV0FBYSxTQUFTLEVBQU0sRUFBUyxFQUFJLENBSy9DLEdBSEksQUFBYyxNQUFPLElBQXJCLFlBQ0QsR0FBSyxFQUFXLEVBQVUsUUFFekIsTUFBTyxJQUFPLFdBQVksQ0FDNUIsR0FBSSxHQUNKLEdBQUksQ0FDRixFQUFNLEdBQVEsV0FBVyxFQUFNLFNBQ3hCLEVBQVAsQ0FDQSxNQUFPLEdBQUcsR0FFWixNQUFPLEdBQUcsS0FBTSxHQUdsQixTQUFVLEdBQVcsR0FFckIsRUFBUSxTQUFXLEVBQ1osR0FBb0IsR0FBUyxJQVl0QyxHQUFRLGtCQUFvQixTQUFTLEVBQU0sRUFBUyxDQUNsRCxHQUFJLEdBQU0sRUFBTyxVQUtqQixHQUpBLEVBQVUsR0FBVyxHQUVyQixFQUFRLFNBQVcsRUFFZixFQUFRLE9BQVMsR0FBUSxNQUFNLEdBQ2pDLE1BQU8sSUFBUSxNQUFNLEdBR3ZCLEdBQUksR0FBTSxHQUFHLGFBQWEsRUFBUSxTQUFVLFFBQ3hDLEVBQU0sR0FBUSxjQUFjLEVBQUssR0FDckMsTUFBSSxHQUFRLE9BQU8sSUFBUSxNQUFNLEdBQU8sR0FDakMsR0FPVCxHQUFRLFVBQVksU0FBUyxFQUFNLEVBQVMsRUFBSSxDQUM5QyxBQUNFLEVBQVEsY0FBZ0IsTUFHeEIsR0FBUSxhQUFlLElBRXpCLEdBQVEsV0FBVyxFQUFNLEVBQVMsTUM1ZXBDLDRGQUF1QyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/package-lock.json b/package-lock.json index 1592f3b..a8b57db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@live-codes/browser-compilers", - "version": "0.7.5", + "version": "0.7.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@live-codes/browser-compilers", - "version": "0.7.5", + "version": "0.7.6", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 603115a..e3ecf13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@live-codes/browser-compilers", - "version": "0.7.6", + "version": "0.8.0", "description": "Compilers that run in the browser, for use in livecodes.io", "author": "Hatem Hosny", "license": "MIT", diff --git a/scripts/vendors.js b/scripts/vendors.js index fdded1a..bf61edb 100644 --- a/scripts/vendors.js +++ b/scripts/vendors.js @@ -308,7 +308,7 @@ fs.copyFileSync( .then(() => { if (mod !== 'jest-dom.js') return; patch('dist/@testing-library/jest-dom.js', { - 'expect.extend': 'window.jestLite?.core.expect.extend', + 'expect.extend': 'window.browserJest?.expect.extend', }); }); },