@willbooster/wb 7.8.2 → 7.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -30,5 +30,5 @@ let U;!function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARR
|
|
|
30
30
|
* Copyright (c) 2016, Contributors
|
|
31
31
|
* SPDX-License-Identifier: ISC
|
|
32
32
|
*/
|
|
33
|
-
var Y,q,G;const K=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,Q=null!==(q=null===(Y=null===process||void 0===process?void 0:process.versions)||void 0===Y?void 0:Y.node)&&void 0!==q?q:null===(G=null===process||void 0===process?void 0:process.version)||void 0===G?void 0:G.slice(1);if(Q){if(Number(Q.match(/^([^.]+)/)[1])<K)throw Error(`yargs parser supports a minimum Node.js version of ${K}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const X=process?process.env:{},Z=new class{constructor(e){U=e}parse(e,t){const n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),s=function(e){if(Array.isArray(e))return e.map((e=>"string"!=typeof e?e+"":e));e=e.trim();let t=0,n=null,s=null,i=null;const r=[];for(let o=0;o<e.length;o++)n=s,s=e.charAt(o)," "!==s||i?(s===i?i=null:"'"!==s&&'"'!==s||i||(i=s),r[t]||(r[t]=""),r[t]+=s):" "!==n&&t++;return r}(e),i="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let s=!0;Object.keys(e).forEach((function(n){t.push([].concat(e[n],n))}));for(;s;){s=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter((function(e){return-1!==t[n].indexOf(e)})).length){t[e]=t[e].concat(t[n]),t.splice(n,1),s=!0;break}}}return t.forEach((function(e){const t=(e=e.filter((function(e,t,n){return n.indexOf(e)===t}))).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)})),n}(Object.assign(Object.create(null),n.alias)),o=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,h=o["populate--"],d=h?"--":"_",u=Object.create(null),f=Object.create(null),p=n.__||U.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+o["negation-prefix"]+"(.+)");[].concat(n.array||[]).filter(Boolean).forEach((function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map((function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]})).filter(Boolean).pop();n&&(g[n][t]=!0),g.arrays[t]=!0,g.keys.push(t)})),[].concat(n.boolean||[]).filter(Boolean).forEach((function(e){g.bools[e]=!0,g.keys.push(e)})),[].concat(n.string||[]).filter(Boolean).forEach((function(e){g.strings[e]=!0,g.keys.push(e)})),[].concat(n.number||[]).filter(Boolean).forEach((function(e){g.numbers[e]=!0,g.keys.push(e)})),[].concat(n.count||[]).filter(Boolean).forEach((function(e){g.counts[e]=!0,g.keys.push(e)})),[].concat(n.normalize||[]).filter(Boolean).forEach((function(e){g.normalize[e]=!0,g.keys.push(e)})),"object"==typeof n.narg&&Object.entries(n.narg).forEach((([e,t])=>{"number"==typeof t&&(g.nargs[e]=t,g.keys.push(e))})),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach((([e,t])=>{"function"==typeof t&&(g.coercions[e]=t,g.keys.push(e))})),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach((function(e){g.configs[e]=!0})):"object"==typeof n.config&&Object.entries(n.config).forEach((([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(g.configs[e]=t)}))),function(...e){e.forEach((function(e){Object.keys(e||{}).forEach((function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach((function(t){if(/-/.test(t)&&o["camel-case-expansion"]){const n=F(t);n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].concat(e).forEach((function(t){if(t.length>1&&/[A-Z]/.test(t)&&o["camel-case-expansion"]){const n=B(t,"-");n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].forEach((function(t){g.aliases[t]=[e].concat(g.aliases[e].filter((function(e){return t!==e})))})))}))}))}(n.key,r,n.default,g.arrays),Object.keys(a).forEach((function(e){(g.aliases[e]||[]).forEach((function(t){a[t]=a[e]}))}));let b=null;Object.keys(g.counts).find((e=>D(e,g.arrays)?(b=Error(p("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!D(e,g.nargs)&&(b=Error(p("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0)));let v=[];const w=Object.assign(Object.create(null),{_:[]}),O={};for(let e=0;e<s.length;e++){const t=s[e],n=t.replace(/^-{3,}/,"---");let i,r,a,c,l,h;if("--"!==t&&/^-/.test(t)&&R(t))E(t);else{if(n.match(/^---+(=|$)/)){E(t);continue}if(t.match(/^--.+=/)||!o["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(D(c[1],g.arrays)?e=A(e,c[1],s,c[2]):!1!==D(c[1],g.nargs)?e=k(e,c[1],s,c[2]):j(c[1],c[2],!0));else if(t.match(y)&&o["boolean-negation"])c=t.match(y),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],j(r,!!D(r,g.arrays)&&[!1]));else if(t.match(/^--.+/)||!o["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||l.match(/^-/)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&j(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(m))l=s[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||D(r,g.bools)||D(r,g.counts)?j(r,W(r)):(j(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(m)){a=t.slice(1,-1).split(""),i=!1;for(let n=0;n<a.length;n++){if(l=t.slice(n+2),a[n+1]&&"="===a[n+1]){h=t.slice(n+3),r=a[n],D(r,g.arrays)?e=A(e,r,s,h):!1!==D(r,g.nargs)?e=k(e,r,s,h):j(r,h),i=!0;break}if("-"!==l){if(/[A-Za-z]/.test(a[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===D(l,g.bools)){j(a[n],l),i=!0;break}if(a[n+1]&&a[n+1].match(/\W/)){j(a[n],l),i=!0;break}j(a[n],W(a[n]))}else j(a[n],l)}r=t.slice(-1)[0],i||"-"===r||(D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(m)&&D(t.slice(1),g.bools))r=t.slice(1),j(r,W(r));else{if("--"===t){v=s.slice(e+1);break}if(o["halt-at-non-option"]){v=s.slice(e);break}E(t)}}}function E(e){const t=_("_",e);"string"!=typeof t&&"number"!=typeof t||w._.push(t)}function k(e,t,n,s){let i,r=D(t,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return z(s)||(b=Error(p("Argument unexpected for: %s",t))),j(t,W(t)),e;let a=z(s)?0:1;if(o["nargs-eats-options"])n.length-(e+1)+a<r&&(b=Error(p("Not enough arguments following: %s",t))),a=r;else{for(i=e+1;i<n.length&&(!n[i].match(/^-[^0-9]/)||n[i].match(m)||R(n[i]));i++)a++;a<r&&(b=Error(p("Not enough arguments following: %s",t)))}let c=Math.min(a,r);for(!z(s)&&c>0&&(j(t,s),c--),i=e+1;i<c+e+1;i++)j(t,n[i]);return e+c}function A(e,t,n,s){let r=[],c=s||n[e+1];const l=D(t,g.nargs);if(D(t,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(z(c)||z(s)&&/^-/.test(c)&&!m.test(c)&&!R(c)){if(void 0!==a[t]){const e=a[t];r=Array.isArray(e)?e:[e]}}else{z(s)||r.push(x(t,s,!0));for(let s=e+1;s<n.length&&!(!o["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[s],!/^-/.test(c)||m.test(c)||R(c));s++)e=s,r.push(x(t,c,i))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(p("Not enough arguments following: %s",t))),j(t,r),e}function j(e,t,n=i){if(/-/.test(e)&&o["camel-case-expansion"]){const t=e.split(".").map((function(e){return F(e)})).join(".");$(e,t)}const s=x(e,t,n),r=e.split(".");if(M(w,r,s),g.aliases[e]&&g.aliases[e].forEach((function(e){const t=e.split(".");M(w,t,s)})),r.length>1&&o["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(t){let n=t.split(".");const i=[].concat(r);i.shift(),n=n.concat(i),(g.aliases[e]||[]).includes(n.join("."))||M(w,n,s)})),D(e,g.normalize)&&!D(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach((function(e){Object.defineProperty(O,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?U.normalize(e):e}})}))}}function $(e,t){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[t],u[t]=!0),g.aliases[t]&&g.aliases[t].length||$(t,e)}function x(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(D(e,g.bools)||D(e,g.counts))&&"string"==typeof t&&(t="true"===t);let s=Array.isArray(t)?t.map((function(t){return _(e,t)})):_(e,t);return D(e,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=H()),D(e,g.normalize)&&D(e,g.arrays)&&(s=Array.isArray(t)?t.map((e=>U.normalize(e))):U.normalize(t)),s}function _(e,t){if(!o["parse-positional-numbers"]&&"_"===e)return t;if(!D(e,g.strings)&&!D(e,g.bools)&&!Array.isArray(t)){(L(t)&&o["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!z(t)&&D(e,g.numbers))&&(t=Number(t))}return t}function C(e,t){Object.keys(e).forEach((function(n){const s=e[n],i=t?t+"."+n:n;"object"==typeof s&&null!==s&&!Array.isArray(s)&&o["dot-notation"]?C(s,i):(!N(w,i.split("."))||D(i,g.arrays)&&o["combine-arrays"])&&j(i,s)}))}function S(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",s=U.env();Object.keys(s).forEach((function(i){if(""===n||0===i.lastIndexOf(n,0)){const r=i.split("__").map((function(e,t){return 0===t&&(e=e.substring(n.length)),F(e)}));(t&&g.configs[r.join(".")]||!t)&&!N(e,r)&&j(r.join("."),s[i])}}))}function P(e,t,n,s=!1){Object.keys(n).forEach((function(i){N(e,i.split("."))||(M(e,i.split("."),n[i]),s&&(f[i]=!0),(t[i]||[]).forEach((function(t){N(e,t.split("."))||M(e,t.split("."),n[i])})))}))}function N(e,t){let n=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){n=n[e]||{}}));const s=t[t.length-1];return"object"==typeof n&&s in n}function M(e,t,n){let s=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){e=J(e),"object"==typeof s&&void 0===s[e]&&(s[e]={}),"object"!=typeof s[e]||Array.isArray(s[e])?(Array.isArray(s[e])?s[e].push({}):s[e]=[s[e],{}],s=s[e][s[e].length-1]):s=s[e]}));const i=J(t[t.length-1]),r=D(t.join("."),g.arrays),a=Array.isArray(n);let c=o["duplicate-arguments-array"];!c&&D(i,g.nargs)&&(c=!0,(!z(s[i])&&1===g.nargs[i]||Array.isArray(s[i])&&s[i].length===g.nargs[i])&&(s[i]=void 0)),n===H()?s[i]=H(s[i]):Array.isArray(s[i])?c&&r&&a?s[i]=o["flatten-duplicate-arrays"]?s[i].concat(n):(Array.isArray(s[i][0])?s[i]:[s[i]]).concat([n]):c||Boolean(r)!==Boolean(a)?s[i]=s[i].concat([n]):s[i]=n:void 0===s[i]&&r?s[i]=a?n:[n]:!c||void 0===s[i]||D(i,g.counts)||D(i,g.bools)?s[i]=n:s[i]=[s[i],n]}function D(e,t){const n=[].concat(g.aliases[e]||[],e),s=Object.keys(t),i=n.find((e=>s.includes(e)));return!!i&&t[i]}function I(e){const t=Object.keys(g);return[].concat(t.map((e=>g[e]))).some((function(t){return Array.isArray(t)?t.includes(e):t[e]}))}function R(e){return o["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(m))return!1;if(function(e){if(e.match(m)||!e.match(/^-[^-]+/))return!1;let t,n=!0;const s=e.slice(1).split("");for(let i=0;i<s.length;i++){if(t=e.slice(i+2),!I(s[i])){n=!1;break}if(s[i+1]&&"="===s[i+1]||"-"===t||/[A-Za-z]/.test(s[i])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||s[i+1]&&s[i+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some((function(t){const n=e.match(t);return n&&I(n[1])}))}(e,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function W(e){return D(e,g.bools)||D(e,g.counts)||!(`${e}`in a)?(t=function(e){let t=V.BOOLEAN;return D(e,g.strings)?t=V.STRING:D(e,g.numbers)?t=V.NUMBER:D(e,g.bools)?t=V.BOOLEAN:D(e,g.arrays)&&(t=V.ARRAY),t}(e),{[V.BOOLEAN]:!0,[V.STRING]:"",[V.NUMBER]:void 0,[V.ARRAY]:[]}[t]):a[e];var t}function z(e){return void 0===e}return S(w,!0),S(w,!1),function(e){const t=Object.create(null);P(t,g.aliases,a),Object.keys(g.configs).forEach((function(n){const s=e[n]||t[n];if(s)try{let e=null;const t=U.resolve(U.cwd(),s),i=g.configs[n];if("function"==typeof i){try{e=i(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=U.require(t);C(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(p("Invalid JSON config file: %s",s)))}}))}(w),void 0!==c&&c.forEach((function(e){C(e)})),P(w,g.aliases,a,!0),function(e){let t;const n=new Set;Object.keys(e).forEach((function(s){if(!n.has(s)&&(t=D(s,g.coercions),"function"==typeof t))try{const i=_(s,t(e[s]));[].concat(g.aliases[s]||[],s).forEach((t=>{n.add(t),e[t]=i}))}catch(e){b=e}}))}(w),o["set-placeholder-key"]&&function(e){g.keys.forEach((t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)}))}(w),Object.keys(g.counts).forEach((function(e){N(w,e.split("."))||j(e,0)})),h&&v.length&&(w[d]=[]),v.forEach((function(e){w[d].push(e)})),o["camel-case-expansion"]&&o["strip-dashed"]&&Object.keys(w).filter((e=>"--"!==e&&e.includes("-"))).forEach((e=>{delete w[e]})),o["strip-aliased"]&&[].concat(...Object.keys(r).map((e=>r[e]))).forEach((e=>{o["camel-case-expansion"]&&e.includes("-")&&delete w[e.split(".").map((e=>F(e))).join(".")],delete w[e]})),{aliases:Object.assign({},g.aliases),argv:Object.assign(O,w),configuration:o,defaulted:Object.assign({},f),error:b,newAliases:Object.assign({},u)}}}({cwd:process.cwd,env:()=>X,format:p,normalize:s,resolve:t,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(u(e,"utf8"));throw Error("only .json config files are supported in ESM")}}),ee=function(e,t){return Z.parse(e.slice(),t).argv};function te(){return process.versions.electron&&!process.defaultApp?0:1}ee.detailed=function(e,t){return Z.parse(e.slice(),t)},ee.camelCase=F,ee.decamelize=B,ee.looksLikeNumber=L;class ne extends Error{constructor(e){super(e||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,ne)}}var se={fs:{readFileSync:u,writeFile:f},format:p,resolve:t,exists:e=>{try{return h(e).isFile()}catch(e){return!1}}};let ie;class re{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),ie.format.apply(ie.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift();let i=function(){};"function"==typeof e[e.length-1]&&(i=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===s?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===s?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:i})):i();const o=[r];return~r.indexOf("%d")&&o.push(s),ie.format.apply(ie.format,o.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach((function(e,s){const i=t[s+1];n+=e,void 0!==i&&(n+="%s")})),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,s=t.locale,i=t.cb,r=this._resolveLocaleFile(n,s),o=JSON.stringify(this.cache[s],null,2);ie.fs.writeFile(r,o,"utf-8",(function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),i(t)}))}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{ie.fs.readFileSync&&(e=JSON.parse(ie.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=ie.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const s=ie.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(e){return ie.exists(e)}}const oe="loading a directory of commands is not supported yet for ESM";let ae;try{ae=m(import.meta.url)}catch(e){ae=process.cwd()}var ce,le={assert:{notStrictEqual:a,strictEqual:c},cliui:function(e){return function(e,t){return R=t,new D({width:(null==e?void 0:e.width)||("object"==typeof process&&process.stdout&&process.stdout.columns?process.stdout.columns:80),wrap:null==e?void 0:e.wrap})}(e,{stringWidth:e=>[...e].length,stripAnsi:z,wrap:T})},findUp:function(e,s){let i,r=t(".",e);for(h(r).isDirectory()||(r=n(r));;){if(i=s(r,d(r)),i)return t(r,i);if(r=n(i=r),i===r)break}},getEnv:e=>process.env[e],inspect:g,getCallerFile:()=>{throw new ne(oe)},getProcessArgvBin:function(){return process.argv[te()]},mainFilename:ae.substring(0,ae.lastIndexOf("node_modules"))||process.cwd(),Parser:ee,path:{basename:i,dirname:n,extname:r,relative:o,resolve:t},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:process.exit,nextTick:process.nextTick,stdColumns:void 0!==process.stdout.columns?process.stdout.columns:null},readFileSync:u,require:()=>{throw new ne("require is not supported by ESM")},requireDirectory:()=>{throw new ne(oe)},stringWidth:e=>[...e].length,y18n:(ce={directory:t(ae,"../../../locales"),updateFiles:!1},function(e,t){ie=t;const n=new re(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}(ce,se))};function he(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function de(e,t){t.assert.strictEqual(typeof e,"string")}function ue(e){return Object.keys(e)}function fe(e){return!!e&&!!e.then&&"function"==typeof e.then}function pe(e){const t=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),n=/\.*[\][<>]/g,s=t.shift();if(!s)throw new Error(`No command found in: ${e}`);const i={cmd:s.replace(n,""),demanded:[],optional:[]};return t.forEach(((e,s)=>{let r=!1;e=e.replace(/\s/g,""),/\.+[\]>]/.test(e)&&s===t.length-1&&(r=!0),/^\[/.test(e)?i.optional.push({cmd:e.replace(n,"").split("|"),variadic:r}):i.demanded.push({cmd:e.replace(n,"").split("|"),variadic:r})})),i}const ge=["first","second","third","fourth","fifth","sixth"];function me(e,t,n){try{let s=0;const[i,r,o]="object"==typeof e?[{demanded:[],optional:[]},e,t]:[pe(`cmd ${e}`),t,n],a=[].slice.call(r);for(;a.length&&void 0===a[a.length-1];)a.pop();const c=o||a.length;if(c<i.demanded.length)throw new ne(`Not enough arguments provided. Expected ${i.demanded.length} but received ${a.length}.`);const l=i.demanded.length+i.optional.length;if(c>l)throw new ne(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((e=>{const t=ye(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&be(t,e.cmd,s),s+=1})),i.optional.forEach((e=>{if(0===a.length)return;const t=ye(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&be(t,e.cmd,s),s+=1}))}catch(e){console.warn(e.stack)}}function ye(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function be(e,t,n){throw new ne(`Invalid ${ge[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class ve{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(me("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if("function"!=typeof e[s])throw Error("middleware must be a function");const i=e[s];i.applyBeforeValidation=t,i.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if("function"==typeof e){const i=e;i.applyBeforeValidation=t,i.global=n,i.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){const n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((e=>{const s=[...n[t]||[],t];return!e.option||!s.includes(e.option)})),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){const e=this.frozens.pop();void 0!==e&&(this.globalMiddleware=e)}reset(){this.globalMiddleware=this.globalMiddleware.filter((e=>e.global))}}function we(e,t,n,s){return n.reduce(((e,n)=>{if(n.applyBeforeValidation!==s)return e;if(n.mutates){if(n.applied)return e;n.applied=!0}if(fe(e))return e.then((e=>Promise.all([e,n(e,t)]))).then((([e,t])=>Object.assign(e,t)));{const s=n(e,t);return fe(s)?s.then((t=>Object.assign(e,t))):Object.assign(e,s)}}),e)}function Oe(e,t,n=e=>{throw e}){try{const n="function"==typeof e?e():e;return fe(n)?n.then((e=>t(e))):t(n)}catch(e){return n(e)}}const Ee=/(^\*)|(^\$0)/;class ke{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){"boolean"!=typeof(s=s||{}).recurse&&(s.recurse=!1),Array.isArray(s.extensions)||(s.extensions=["js"]);const i="function"==typeof s.visit?s.visit:e=>e;s.visit=(e,t,n)=>{const s=i(e,t,n);if(s){if(this.requireCache.has(t))return s;this.requireCache.add(t),this.addHandler(s)}return s},this.shim.requireDirectory({require:t,filename:n},e,s)}addHandler(e,t,n,s,i,r){let o=[];const a=function(e){return e?e.map((e=>(e.applyBeforeValidation=!1,e))):[]}(i);if(s=s||(()=>{}),Array.isArray(e))if(function(e){return e.every((e=>"string"==typeof e))}(e))[e,...o]=e;else for(const t of e)this.addHandler(t);else{if(function(e){return"object"==typeof e&&!Array.isArray(e)}(e)){let t=Array.isArray(e.command)||"string"==typeof e.command?e.command:this.moduleName(e);return e.aliases&&(t=[].concat(t).concat(e.aliases)),void this.addHandler(t,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated)}if(Ae(n))return void this.addHandler([e].concat(o),t,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof e){const i=pe(e);o=o.map((e=>pe(e).cmd));let c=!1;const l=[i.cmd].concat(o).filter((e=>!Ee.test(e)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),e=e.replace(Ee,i.cmd)),o.forEach((e=>{this.aliasMap[e]=i.cmd})),!1!==t&&this.usage.command(e,t,c,o,r),this.handlers[i.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:a,deprecated:r,demanded:i.demanded,optional:i.optional},c&&(this.defaultCommand=this.handlers[i.cmd])}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,i,r){const o=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;e&&(a.commands.push(e),a.fullCommands.push(o.original));const h=this.applyBuilderUpdateUsageAndParse(l,o,t,n.aliases,c,s,i,r);return fe(h)?h.then((e=>this.applyMiddlewareAndGetResult(l,o,e.innerArgv,a,i,e.aliases,t))):this.applyMiddlewareAndGetResult(l,o,h.innerArgv,a,i,h.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,i,r,o,a){const c=t.builder;let l=n;if(je(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(fe(h))return h.then((s=>{var a;return l=(a=s)&&"function"==typeof a.getInternalMethods?s:n,this.parseAndUpdateUsage(e,t,l,i,r,o)}))}else(function(e){return"object"==typeof e})(c)&&(n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((e=>{l.option(e,c[e])})));return this.parseAndUpdateUsage(e,t,l,i,r,o)}parseAndUpdateUsage(e,t,n,s,i,r){e&&n.getInternalMethods().getUsageInstance().unfreeze(!0),this.shouldUpdateUsage(n)&&n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);const o=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,i,r);return fe(o)?o.then((e=>({aliases:n.parsed.aliases,innerArgv:e}))):{aliases:n.parsed.aliases,innerArgv:o}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&0===e.getInternalMethods().getUsageInstance().getUsage().length}usageFromParentCommandsCommandHandler(e,t){const n=Ee.test(t.original)?t.original.replace(Ee,"").trim():t.original,s=e.filter((e=>!Ee.test(e)));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,i,r,o,a){if(!r.getInternalMethods().getHasOutput()){const t=r.getInternalMethods().runValidation(i,a,r.parsed.error,e);n=Oe(n,(e=>(t(e),e)))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();const s=!!r.getOptions().configuration["populate--"];r.getInternalMethods().postProcess(n,s,!1,!1),n=Oe(n=we(n,r,o,!1),(e=>{const n=t.handler(e);return fe(n)?n.then((()=>e)):e})),e||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),fe(n)&&!r.getInternalMethods().hasParseCallback()&&n.catch((e=>{try{r.getInternalMethods().getUsageInstance().fail(null,e)}catch(e){}}))}return e||(s.commands.pop(),s.fullCommands.pop()),n}applyMiddlewareAndGetResult(e,t,n,s,i,r,o){let a={};if(i)return n;o.getInternalMethods().getHasOutput()||(a=this.populatePositionals(t,n,s,o));const c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=we(n,o,c,!0);return fe(l)?l.then((n=>this.handleValidationAndGetResult(e,t,n,s,r,o,c,a))):this.handleValidationAndGetResult(e,t,l,s,r,o,c,a)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);const i=e.demanded.slice(0),r=e.optional.slice(0),o={};for(this.validation.positionalCount(i.length,t._.length);i.length;){const e=i.shift();this.populatePositional(e,t,o)}for(;r.length;){const e=r.shift();this.populatePositional(e,t,o)}return t._=n.commands.concat(t._.map((e=>""+e))),this.postProcessPositionals(t,o,this.cmdToParseOptions(e.original),s),o}populatePositional(e,t,n){const s=e.cmd[0];e.variadic?n[s]=t._.splice(0).map(String):t._.length&&(n[s]=[String(t._.shift())])}cmdToParseOptions(e){const t={array:[],default:{},alias:{},demand:{}},n=pe(e);return n.demanded.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s,t.demand[n]=!0})),n.optional.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s})),t}postProcessPositionals(e,t,n,s){const i=Object.assign({},s.getOptions());i.default=Object.assign(n.default,i.default);for(const e of Object.keys(n.alias))i.alias[e]=(i.alias[e]||[]).concat(n.alias[e]);i.array=i.array.concat(n.array),i.config={};const r=[];if(Object.keys(t).forEach((e=>{t[e].map((t=>{i.configuration["unknown-options-as-args"]&&(i.key[e]=!0),r.push(`--${e}`),r.push(t)}))})),!r.length)return;const o=Object.assign({},i.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},i,{configuration:o}));if(a.error)s.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{const n=Object.keys(t);Object.keys(t).forEach((e=>{n.push(...a.aliases[e])})),Object.keys(a.argv).forEach((i=>{n.includes(i)&&(t[i]||(t[i]=a.argv[i]),!this.isInConfigs(s,i)&&!this.isDefaulted(s,i)&&Object.prototype.hasOwnProperty.call(e,i)&&Object.prototype.hasOwnProperty.call(a.argv,i)&&(Array.isArray(e[i])||Array.isArray(a.argv[i]))?e[i]=[].concat(e[i],a.argv[i]):e[i]=a.argv[i])}))}}isDefaulted(e,t){const{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){const{configObjects:n}=e.getOptions();return n.some((e=>Object.prototype.hasOwnProperty.call(e,t)))||n.some((e=>Object.prototype.hasOwnProperty.call(e,this.shim.Parser.camelCase(t))))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){const t=Ee.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(t,this.defaultCommand.description)}const t=this.defaultCommand.builder;if(je(t))return t(e,!0);Ae(t)||Object.keys(t).forEach((n=>{e.option(n,t[n])}))}moduleName(e){const t=function(e){if("undefined"==typeof require)return null;for(let t,n=0,s=Object.keys(require.cache);n<s.length;n++)if(t=require.cache[s[n]],t.exports===e)return t;return null}(e);if(!t)throw new Error(`No command name given for module: ${this.shim.inspect(e)}`);return this.commandFromFilename(t.filename)}commandFromFilename(e){return this.shim.path.basename(e,this.shim.path.extname(e))}extractDesc({describe:e,description:t,desc:n}){for(const s of[e,t,n]){if("string"==typeof s||!1===s)return s;he(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){const e=this.frozens.pop();he(e,void 0,this.shim),({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e)}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function Ae(e){return"object"==typeof e&&!!e.builder&&"function"==typeof e.handler}function je(e){return"function"==typeof e}function $e(e={},t=()=>!0){const n={};return ue(e).forEach((s=>{t(s,e[s])&&(n[s]=e[s])})),n}function xe(e){"undefined"!=typeof process&&[process.stdout,process.stderr].forEach((t=>{const n=t;n._handle&&n.isTTY&&"function"==typeof n._handle.setBlocking&&n._handle.setBlocking(e)}))}function _e(e){return"boolean"==typeof e}function Ce(e,t){const n=t.y18n.__,s={},i=[];s.failFn=function(e){i.push(e)};let r=null,o=null,a=!0;s.showHelpOnFail=function(t=!0,n){const[i,c]="string"==typeof t?[!0,t]:[t,n];return e.getInternalMethods().isGlobalContext()&&(o=c),r=c,a=i,s};let c=!1;s.fail=function(t,n){const l=e.getInternalMethods().getLoggerInstance();if(!i.length){if(e.getExitProcess()&&xe(!0),!c){c=!0,a&&(e.showHelp("error"),l.error()),(t||n)&&l.error(t||n);const s=r||o;s&&((t||n)&&l.error(""),l.error(s))}if(n=n||new ne(t),e.getExitProcess())return e.exit(1);if(e.getInternalMethods().hasParseCallback())return e.exit(1,n);throw n}for(let e=i.length-1;e>=0;--e){const r=i[e];if(_e(r)){if(n)throw n;if(t)throw Error(t)}else r(t,n,s)}};let l=[],h=!1;s.usage=(e,t)=>null===e?(h=!0,l=[],s):(h=!1,l.push([e,t||""]),s),s.getUsage=()=>l,s.getUsageDisabled=()=>h,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(e,t)=>{d.push([e,t||""])};let u=[];s.command=function(e,t,n,s,i=!1){n&&(u=u.map((e=>(e[2]=!1,e)))),u.push([e,t||"",n,s,i])},s.getCommands=()=>u;let f={};s.describe=function(e,t){Array.isArray(e)?e.forEach((e=>{s.describe(e,t)})):"object"==typeof e?Object.keys(e).forEach((t=>{s.describe(t,e[t])})):f[e]=t},s.getDescriptions=()=>f;let p=[];s.epilog=e=>{p.push(e)};let g,m=!1;s.wrap=e=>{m=!0,g=e},s.getWrap=()=>t.getEnv("YARGS_DISABLE_WRAP")?null:(m||(g=function(){const e=80;return t.process.stdColumns?Math.min(e,t.process.stdColumns):e}(),m=!0),g);const y="__yargsString__:";function b(e,n,s){let i=0;return Array.isArray(e)||(e=Object.values(e).map((e=>[e]))),e.forEach((e=>{i=Math.max(t.stringWidth(s?`${s} ${Ne(e[0])}`:Ne(e[0]))+Pe(e[0]),i)})),n&&(i=Math.min(i,parseInt((.5*n).toString(),10))),i}let v;function w(t){return e.getOptions().hiddenOptions.indexOf(t)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}function O(e,t){let s=`[${n("default:")} `;if(void 0===e&&!t)return null;if(t)s+=t;else switch(typeof e){case"string":s+=`"${e}"`;break;case"object":s+=JSON.stringify(e);break;default:s+=e}return`${s}]`}s.deferY18nLookup=e=>y+e,s.help=function(){if(v)return v;!function(){const t=e.getDemandedOptions(),n=e.getOptions();(Object.keys(n.alias)||[]).forEach((i=>{n.alias[i].forEach((r=>{f[r]&&s.describe(i,f[r]),r in t&&e.demandOption(i,t[r]),n.boolean.includes(r)&&e.boolean(i),n.count.includes(r)&&e.count(i),n.string.includes(r)&&e.string(i),n.normalize.includes(r)&&e.normalize(i),n.array.includes(r)&&e.array(i),n.number.includes(r)&&e.number(i)}))}))}();const i=e.customScriptName?e.$0:t.path.basename(e.$0),r=e.getDemandedOptions(),o=e.getDemandedCommands(),a=e.getDeprecatedOptions(),c=e.getGroups(),g=e.getOptions();let m=[];m=m.concat(Object.keys(f)),m=m.concat(Object.keys(r)),m=m.concat(Object.keys(o)),m=m.concat(Object.keys(g.default)),m=m.filter(w),m=Object.keys(m.reduce(((e,t)=>("_"!==t&&(e[t]=!0),e)),{}));const E=s.getWrap(),k=t.cliui({width:E,wrap:!!E});if(!h)if(l.length)l.forEach((e=>{k.div({text:`${e[0].replace(/\$0/g,i)}`}),e[1]&&k.div({text:`${e[1]}`,padding:[1,0,0,0]})})),k.div();else if(u.length){let e=null;e=o._?`${i} <${n("command")}>\n`:`${i} [${n("command")}]\n`,k.div(`${e}`)}if(u.length>1||1===u.length&&!u[0][2]){k.div(n("Commands:"));const t=e.getInternalMethods().getContext(),s=t.commands.length?`${t.commands.join(" ")} `:"";!0===e.getInternalMethods().getParserConfiguration()["sort-commands"]&&(u=u.sort(((e,t)=>e[0].localeCompare(t[0]))));const r=i?`${i} `:"";u.forEach((e=>{const t=`${r}${s}${e[0].replace(/^\$0 ?/,"")}`;k.span({text:t,padding:[0,2,0,2],width:b(u,E,`${i}${s}`)+4},{text:e[1]});const o=[];e[2]&&o.push(`[${n("default")}]`),e[3]&&e[3].length&&o.push(`[${n("aliases:")} ${e[3].join(", ")}]`),e[4]&&("string"==typeof e[4]?o.push(`[${n("deprecated: %s",e[4])}]`):o.push(`[${n("deprecated")}]`)),o.length?k.div({text:o.join(" "),padding:[0,0,0,2],align:"right"}):k.div()})),k.div()}const A=(Object.keys(g.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);m=m.filter((t=>!e.parsed.newAliases[t]&&A.every((e=>-1===(g.alias[e]||[]).indexOf(t)))));const j=n("Options:");c[j]||(c[j]=[]),function(e,t,n,s){let i=[],r=null;Object.keys(n).forEach((e=>{i=i.concat(n[e])})),e.forEach((e=>{r=[e].concat(t[e]),r.some((e=>-1!==i.indexOf(e)))||n[s].push(e)}))}(m,g.alias,c,j);const $=e=>/^--/.test(Ne(e)),x=Object.keys(c).filter((e=>c[e].length>0)).map((e=>({groupName:e,normalizedKeys:c[e].filter(w).map((e=>{if(A.includes(e))return e;for(let t,n=0;void 0!==(t=A[n]);n++)if((g.alias[t]||[]).includes(e))return t;return e}))}))).filter((({normalizedKeys:e})=>e.length>0)).map((({groupName:e,normalizedKeys:t})=>{const n=t.reduce(((t,n)=>(t[n]=[n].concat(g.alias[n]||[]).map((t=>e===s.getPositionalGroupName()?t:(/^[0-9]$/.test(t)?g.boolean.includes(n)?"-":"--":t.length>1?"--":"-")+t)).sort(((e,t)=>$(e)===$(t)?0:$(e)?1:-1)).join(", "),t)),{});return{groupName:e,normalizedKeys:t,switches:n}}));if(x.filter((({groupName:e})=>e!==s.getPositionalGroupName())).some((({normalizedKeys:e,switches:t})=>!e.every((e=>$(t[e])))))&&x.filter((({groupName:e})=>e!==s.getPositionalGroupName())).forEach((({normalizedKeys:e,switches:t})=>{e.forEach((e=>{var n,s;$(t[e])&&(t[e]=(n=t[e],s=4,Se(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),x.forEach((({groupName:t,normalizedKeys:i,switches:o})=>{k.div(t),i.forEach((t=>{const i=o[t];let c=f[t]||"",l=null;c.includes(y)&&(c=n(c.substring(16))),g.boolean.includes(t)&&(l=`[${n("boolean")}]`),g.count.includes(t)&&(l=`[${n("count")}]`),g.string.includes(t)&&(l=`[${n("string")}]`),g.normalize.includes(t)&&(l=`[${n("string")}]`),g.array.includes(t)&&(l=`[${n("array")}]`),g.number.includes(t)&&(l=`[${n("number")}]`);const h=[t in a?(d=a[t],"string"==typeof d?`[${n("deprecated: %s",d)}]`:`[${n("deprecated")}]`):null,l,t in r?`[${n("required")}]`:null,g.choices&&g.choices[t]?`[${n("choices:")} ${s.stringifiedValues(g.choices[t])}]`:null,O(g.default[t],g.defaultDescription[t])].filter(Boolean).join(" ");var d;k.span({text:Ne(i),padding:[0,2,0,2+Pe(i)],width:b(o,E)+4},c);const u=!0===e.getInternalMethods().getUsageConfiguration()["hide-types"];h&&!u?k.div({text:h,padding:[0,0,0,2],align:"right"}):k.div()})),k.div()})),d.length&&(k.div(n("Examples:")),d.forEach((e=>{e[0]=e[0].replace(/\$0/g,i)})),d.forEach((e=>{""===e[1]?k.div({text:e[0],padding:[0,2,0,2]}):k.div({text:e[0],padding:[0,2,0,2],width:b(d,E)+4},{text:e[1]})})),k.div()),p.length>0){const e=p.map((e=>e.replace(/\$0/g,i))).join("\n");k.div(`${e}\n`)}return k.toString().replace(/\s*$/,"")},s.cacheHelpMessage=function(){v=this.help()},s.clearCachedHelpMessage=function(){v=void 0},s.hasCachedHelpMessage=function(){return!!v},s.showHelp=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(s.help())},s.functionDescription=e=>["(",e.name?t.Parser.decamelize(e.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(e,t){let n="";const s=t||", ",i=[].concat(e);return e&&i.length?(i.forEach((e=>{n.length&&(n+=s),n+=JSON.stringify(e)})),n):n};let E=null;s.version=e=>{E=e},s.showVersion=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(E)},s.reset=function(e){return r=null,c=!1,l=[],h=!1,p=[],d=[],u=[],f=$e(f,(t=>!e[t])),s};const k=[];return s.freeze=function(){k.push({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f})},s.unfreeze=function(e=!1){const t=k.pop();t&&(e?(f={...t.descriptions,...f},u=[...t.commands,...u],l=[...t.usages,...l],d=[...t.examples,...d],p=[...t.epilogs,...p]):({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f}=t))},s}function Se(e){return"object"==typeof e}function Pe(e){return Se(e)?e.indentation:0}function Ne(e){return Se(e)?e.text:e}class Me{constructor(e,t,n,s){var i,r,o;this.yargs=e,this.usage=t,this.command=n,this.shim=s,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=null!==(o=(null===(i=this.shim.getEnv("SHELL"))||void 0===i?void 0:i.includes("zsh"))||(null===(r=this.shim.getEnv("ZSH_NAME"))||void 0===r?void 0:r.includes("zsh")))&&void 0!==o&&o}defaultCompletion(e,t,n,s){const i=this.command.getCommandHandlers();for(let t=0,n=e.length;t<n;++t)if(i[e[t]]&&i[e[t]].builder){const n=i[e[t]].builder;if(je(n)){this.indexAfterLastReset=t+1;const e=this.yargs.getInternalMethods().reset();return n(e,!0),e.argv}}const r=[];this.commandCompletions(r,e,n),this.optionCompletions(r,e,t,n),this.choicesFromOptionsCompletions(r,e,t,n),this.choicesFromPositionalsCompletions(r,e,t,n),s(null,r)}commandCompletions(e,t,n){const s=this.yargs.getInternalMethods().getContext().commands;n.match(/^-/)||s[s.length-1]===n||this.previousArgHasChoices(t)||this.usage.getCommands().forEach((n=>{const s=pe(n[0]).cmd;if(-1===t.indexOf(s))if(this.zshShell){const t=n[1]||"";e.push(s.replace(/:/g,"\\:")+":"+t)}else e.push(s)}))}optionCompletions(e,t,n,s){if((s.match(/^-/)||""===s&&0===e.length)&&!this.previousArgHasChoices(t)){const n=this.yargs.getOptions(),i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(n.key).forEach((r=>{const o=!!n.configuration["boolean-negation"]&&n.boolean.includes(r);i.includes(r)||n.hiddenOptions.includes(r)||this.argsContainKey(t,r,o)||this.completeOptionKey(r,e,s,o&&!!n.default[r])}))}}choicesFromOptionsCompletions(e,t,n,s){if(this.previousArgHasChoices(t)){const n=this.getPreviousArgChoices(t);n&&n.length>0&&e.push(...n.map((e=>e.replace(/:/g,"\\:"))))}}choicesFromPositionalsCompletions(e,t,n,s){if(""===s&&e.length>0&&this.previousArgHasChoices(t))return;const i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],r=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),o=i[n._.length-r-1];if(!o)return;const a=this.yargs.getOptions().choices[o]||[];for(const t of a)t.startsWith(s)&&e.push(t.replace(/:/g,"\\:"))}getPreviousArgChoices(e){if(e.length<1)return;let t=e[e.length-1],n="";if(!t.startsWith("-")&&e.length>1&&(n=t,t=e[e.length-2]),!t.startsWith("-"))return;const s=t.replace(/^-+/,""),i=this.yargs.getOptions(),r=[s,...this.yargs.getAliases()[s]||[]];let o;for(const e of r)if(Object.prototype.hasOwnProperty.call(i.key,e)&&Array.isArray(i.choices[e])){o=i.choices[e];break}return o?o.filter((e=>!n||e.startsWith(n))):void 0}previousArgHasChoices(e){const t=this.getPreviousArgChoices(e);return void 0!==t&&t.length>0}argsContainKey(e,t,n){const s=t=>-1!==e.indexOf((/^[^0-9]$/.test(t)?"-":"--")+t);if(s(t))return!0;if(n&&s(`no-${t}`))return!0;if(this.aliases)for(const e of this.aliases[t])if(s(e))return!0;return!1}completeOptionKey(e,t,n,s){var i,r,o,a;let c=e;if(this.zshShell){const t=this.usage.getDescriptions(),n=null===(r=null===(i=null==this?void 0:this.aliases)||void 0===i?void 0:i[e])||void 0===r?void 0:r.find((e=>{const n=t[e];return"string"==typeof n&&n.length>0})),s=n?t[n]:void 0,l=null!==(a=null!==(o=t[e])&&void 0!==o?o:s)&&void 0!==a?a:"";c=`${e.replace(/:/g,"\\:")}:${l.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}const l=!(e=>/^--/.test(e))(n)&&(e=>/^[^0-9]$/.test(e))(e)?"-":"--";t.push(l+c),s&&t.push(l+"no-"+c)}customCompletion(e,t,n,s){if(he(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const e=this.customCompletionFunction(n,t);return fe(e)?e.then((e=>{this.shim.process.nextTick((()=>{s(null,e)}))})).catch((e=>{this.shim.process.nextTick((()=>{s(e,void 0)}))})):s(null,e)}return function(e){return e.length>3}(this.customCompletionFunction)?this.customCompletionFunction(n,t,((i=s)=>this.defaultCompletion(e,t,n,i)),(e=>{s(null,e)})):this.customCompletionFunction(n,t,(e=>{s(null,e)}))}getCompletion(e,t){const n=e.length?e[e.length-1]:"",s=this.yargs.parse(e,!0),i=this.customCompletionFunction?s=>this.customCompletion(e,s,n,t):s=>this.defaultCompletion(e,s,n,t);return fe(s)?s.then(i):i(s)}generateCompletionScript(e,t){let n=this.zshShell?'#compdef {{app_name}}\n###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc\n# or {{app_path}} {{completion_command}} >> ~/.zprofile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local reply\n local si=$IFS\n IFS=$\'\n\' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "${words[@]}"))\n IFS=$si\n _describe \'values\' reply\n}\ncompdef _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n':'###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc\n# or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local cur_word args type_list\n\n cur_word="${COMP_WORDS[COMP_CWORD]}"\n args=("${COMP_WORDS[@]}")\n\n # ask yargs to generate completions.\n type_list=$({{app_path}} --get-yargs-completions "${args[@]}")\n\n COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )\n\n # if no match was found, fall back to filename completion\n if [ ${#COMPREPLY[@]} -eq 0 ]; then\n COMPREPLY=()\n fi\n\n return 0\n}\ncomplete -o bashdefault -o default -F _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n';const s=this.shim.path.basename(e);return e.match(/\.js$/)&&(e=`./${e}`),n=n.replace(/{{app_name}}/g,s),n=n.replace(/{{completion_command}}/g,t),n.replace(/{{app_path}}/g,e)}registerFunction(e){this.customCompletionFunction=e}setParsed(e){this.aliases=e.aliases}}function De(e,t){if(0===e.length)return t.length;if(0===t.length)return e.length;const n=[];let s,i;for(s=0;s<=t.length;s++)n[s]=[s];for(i=0;i<=e.length;i++)n[0][i]=i;for(s=1;s<=t.length;s++)for(i=1;i<=e.length;i++)t.charAt(s-1)===e.charAt(i-1)?n[s][i]=n[s-1][i-1]:s>1&&i>1&&t.charAt(s-2)===e.charAt(i-1)&&t.charAt(s-1)===e.charAt(i-2)?n[s][i]=n[s-2][i-2]+1:n[s][i]=Math.min(n[s-1][i-1]+1,Math.min(n[s][i-1]+1,n[s-1][i]+1));return n[t.length][e.length]}const Ie=["$0","--","_"];let Re,We=[];function ze(e,t,n,s){Re=s;let i={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if("string"!=typeof e.extends)return i;const s=/\.json|\..*rc$/.test(e.extends);let r=null;if(s)r=function(e,t){return Re.path.resolve(e,t)}(t,e.extends);else try{r=require.resolve(e.extends)}catch(t){return e}!function(e){if(We.indexOf(e)>-1)throw new ne(`Circular extended configurations: '${e}'.`)}(r),We.push(r),i=s?JSON.parse(Re.readFileSync(r,"utf8")):require(e.extends),delete e.extends,i=ze(i,Re.path.dirname(r),n,Re)}return We=[],n?Te(i,e):Object.assign({},i,e)}function Te(e,t){const n={};function s(e){return e&&"object"==typeof e&&!Array.isArray(e)}Object.assign(n,e);for(const i of Object.keys(t))s(t[i])&&s(n[i])?n[i]=Te(e[i],t[i]):n[i]=t[i];return n}var Fe,Be,Le,Ve,Ue,He,Je,Ye,qe,Ge,Ke,Qe,Xe,Ze,et,tt,nt,st,it,rt,ot,at,ct,lt,ht,dt,ut,ft,pt,gt,mt,yt,bt,vt,wt,Ot=function(e,t,n,s,i){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?i.call(e,n):i?i.value=n:t.set(e,n),n},Et=function(e,t,n,s){if("a"===n&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?s:"a"===n?s.call(e):s?s.value:t.get(e)};const kt=Symbol("copyDoubleDash"),At=Symbol("copyDoubleDash"),jt=Symbol("deleteFromParserHintObject"),$t=Symbol("emitWarning"),xt=Symbol("freeze"),_t=Symbol("getDollarZero"),Ct=Symbol("getParserConfiguration"),St=Symbol("getUsageConfiguration"),Pt=Symbol("guessLocale"),Nt=Symbol("guessVersion"),Mt=Symbol("parsePositionalNumbers"),Dt=Symbol("pkgUp"),It=Symbol("populateParserHintArray"),Rt=Symbol("populateParserHintSingleValueDictionary"),Wt=Symbol("populateParserHintArrayDictionary"),zt=Symbol("populateParserHintDictionary"),Tt=Symbol("sanitizeKey"),Ft=Symbol("setKey"),Bt=Symbol("unfreeze"),Lt=Symbol("validateAsync"),Vt=Symbol("getCommandInstance"),Ut=Symbol("getContext"),Ht=Symbol("getHasOutput"),Jt=Symbol("getLoggerInstance"),Yt=Symbol("getParseContext"),qt=Symbol("getUsageInstance"),Gt=Symbol("getValidationInstance"),Kt=Symbol("hasParseCallback"),Qt=Symbol("isGlobalContext"),Xt=Symbol("postProcess"),Zt=Symbol("rebase"),en=Symbol("reset"),tn=Symbol("runYargsParserAndExecuteCommands"),nn=Symbol("runValidation"),sn=Symbol("setHasOutput"),rn=Symbol("kTrackManuallySetKeys");class on{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Fe.set(this,void 0),Be.set(this,void 0),Le.set(this,{commands:[],fullCommands:[]}),Ve.set(this,null),Ue.set(this,null),He.set(this,"show-hidden"),Je.set(this,null),Ye.set(this,!0),qe.set(this,{}),Ge.set(this,!0),Ke.set(this,[]),Qe.set(this,void 0),Xe.set(this,{}),Ze.set(this,!1),et.set(this,null),tt.set(this,!0),nt.set(this,void 0),st.set(this,""),it.set(this,void 0),rt.set(this,void 0),ot.set(this,{}),at.set(this,null),ct.set(this,null),lt.set(this,{}),ht.set(this,{}),dt.set(this,void 0),ut.set(this,!1),ft.set(this,void 0),pt.set(this,!1),gt.set(this,!1),mt.set(this,!1),yt.set(this,void 0),bt.set(this,{}),vt.set(this,null),wt.set(this,void 0),Ot(this,ft,s,"f"),Ot(this,dt,e,"f"),Ot(this,Be,t,"f"),Ot(this,rt,n,"f"),Ot(this,Qe,new ve(this),"f"),this.$0=this[_t](),this[en](),Ot(this,Fe,Et(this,Fe,"f"),"f"),Ot(this,yt,Et(this,yt,"f"),"f"),Ot(this,wt,Et(this,wt,"f"),"f"),Ot(this,it,Et(this,it,"f"),"f"),Et(this,it,"f").showHiddenOpt=Et(this,He,"f"),Ot(this,nt,this[At](),"f")}addHelpOpt(e,t){return me("[string|boolean] [string]",[e,t],arguments.length),Et(this,et,"f")&&(this[jt](Et(this,et,"f")),Ot(this,et,null,"f")),!1===e&&void 0===t||(Ot(this,et,"string"==typeof e?e:"help","f"),this.boolean(Et(this,et,"f")),this.describe(Et(this,et,"f"),t||Et(this,yt,"f").deferY18nLookup("Show help"))),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(me("[string|boolean] [string]",[e,t],arguments.length),!1===e&&void 0===t)return this;const n="string"==typeof e?e:Et(this,He,"f");return this.boolean(n),this.describe(n,t||Et(this,yt,"f").deferY18nLookup("Show hidden options")),Et(this,it,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return me("<object|string|array> [string|array]",[e,t],arguments.length),this[Wt](this.alias.bind(this),"alias",e,t),this}array(e){return me("<array|string>",[e],arguments.length),this[It]("array",e),this[rn](e),this}boolean(e){return me("<array|string>",[e],arguments.length),this[It]("boolean",e),this[rn](e),this}check(e,t){return me("<function> [boolean]",[e,t],arguments.length),this.middleware(((t,n)=>Oe((()=>e(t,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&Et(this,yt,"f").fail(n.toString(),n):Et(this,yt,"f").fail(Et(this,ft,"f").y18n.__("Argument check failed: %s",e.toString())),t)),(e=>(Et(this,yt,"f").fail(e.message?e.message:e.toString(),e),t)))),!1,t),this}choices(e,t){return me("<object|string|array> [string|array]",[e,t],arguments.length),this[Wt](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(me("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new ne("coerce callback must be provided");for(const n of e)this.coerce(n,t);return this}if("object"==typeof e){for(const t of Object.keys(e))this.coerce(t,e[t]);return this}if(!t)throw new ne("coerce callback must be provided");return Et(this,it,"f").key[e]=!0,Et(this,Qe,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,e)?Oe((()=>(i=s.getAliases(),t(n[e]))),(t=>{n[e]=t;const r=s.getInternalMethods().getParserConfiguration()["strip-aliased"];if(i[e]&&!0!==r)for(const s of i[e])n[s]=t;return n}),(e=>{throw new ne(e.message)})):n}),e),this}conflicts(e,t){return me("<string|object> [string|array]",[e,t],arguments.length),Et(this,wt,"f").conflicts(e,t),this}config(e="config",t,n){return me("[object|string] [string|function] [function]",[e,t,n],arguments.length),"object"!=typeof e||Array.isArray(e)?("function"==typeof t&&(n=t,t=void 0),this.describe(e,t||Et(this,yt,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((e=>{Et(this,it,"f").config[e]=n||!0})),this):(e=ze(e,Et(this,Be,"f"),this[Ct]()["deep-merge-config"]||!1,Et(this,ft,"f")),Et(this,it,"f").configObjects=(Et(this,it,"f").configObjects||[]).concat(e),this)}completion(e,t,n){return me("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),"function"==typeof t&&(n=t,t=void 0),Ot(this,Ue,e||Et(this,Ue,"f")||"completion","f"),t||!1===t||(t="generate completion script"),this.command(Et(this,Ue,"f"),t),n&&Et(this,Ve,"f").registerFunction(n),this}command(e,t,n,s,i,r){return me("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,i,r],arguments.length),Et(this,Fe,"f").addHandler(e,t,n,s,i,r),this}commands(e,t,n,s,i,r){return this.command(e,t,n,s,i,r)}commandDir(e,t){me("<string> [object]",[e,t],arguments.length);const n=Et(this,rt,"f")||Et(this,ft,"f").require;return Et(this,Fe,"f").addDirectory(e,n,Et(this,ft,"f").getCallerFile(),t),this}count(e){return me("<array|string>",[e],arguments.length),this[It]("count",e),this[rn](e),this}default(e,t,n){return me("<object|string|array> [*] [string]",[e,t,n],arguments.length),n&&(de(e,Et(this,ft,"f")),Et(this,it,"f").defaultDescription[e]=n),"function"==typeof t&&(de(e,Et(this,ft,"f")),Et(this,it,"f").defaultDescription[e]||(Et(this,it,"f").defaultDescription[e]=Et(this,yt,"f").functionDescription(t)),t=t.call()),this[Rt](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){return me("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),"number"!=typeof t&&(n=t,t=1/0),this.global("_",!1),Et(this,it,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){return Array.isArray(t)?(t.forEach((e=>{he(n,!0,Et(this,ft,"f")),this.demandOption(e,n)})),t=1/0):"number"!=typeof t&&(n=t,t=1/0),"number"==typeof e?(he(n,!0,Et(this,ft,"f")),this.demandCommand(e,t,n,n)):Array.isArray(e)?e.forEach((e=>{he(n,!0,Et(this,ft,"f")),this.demandOption(e,n)})):"string"==typeof n?this.demandOption(e,n):!0!==n&&void 0!==n||this.demandOption(e),this}demandOption(e,t){return me("<object|string|array> [string]",[e,t],arguments.length),this[Rt](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return me("<string> [string|boolean]",[e,t],arguments.length),Et(this,it,"f").deprecatedOptions[e]=t,this}describe(e,t){return me("<object|string|array> [string]",[e,t],arguments.length),this[Ft](e,!0),Et(this,yt,"f").describe(e,t),this}detectLocale(e){return me("<boolean>",[e],arguments.length),Ot(this,Ye,e,"f"),this}env(e){return me("[string|boolean]",[e],arguments.length),!1===e?delete Et(this,it,"f").envPrefix:Et(this,it,"f").envPrefix=e||"",this}epilogue(e){return me("<string>",[e],arguments.length),Et(this,yt,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){return me("<string|array> [string]",[e,t],arguments.length),Array.isArray(e)?e.forEach((e=>this.example(...e))):Et(this,yt,"f").example(e,t),this}exit(e,t){Ot(this,Ze,!0,"f"),Ot(this,Je,t,"f"),Et(this,Ge,"f")&&Et(this,ft,"f").process.exit(e)}exitProcess(e=!0){return me("[boolean]",[e],arguments.length),Ot(this,Ge,e,"f"),this}fail(e){if(me("<function|boolean>",[e],arguments.length),"boolean"==typeof e&&!1!==e)throw new ne("Invalid first argument. Expected function or boolean 'false'");return Et(this,yt,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){return me("<array> [function]",[e,t],arguments.length),t?Et(this,Ve,"f").getCompletion(e,t):new Promise(((t,n)=>{Et(this,Ve,"f").getCompletion(e,((e,s)=>{e?n(e):t(s)}))}))}getDemandedOptions(){return me([],0),Et(this,it,"f").demandedOptions}getDemandedCommands(){return me([],0),Et(this,it,"f").demandedCommands}getDeprecatedOptions(){return me([],0),Et(this,it,"f").deprecatedOptions}getDetectLocale(){return Et(this,Ye,"f")}getExitProcess(){return Et(this,Ge,"f")}getGroups(){return Object.assign({},Et(this,Xe,"f"),Et(this,ht,"f"))}getHelp(){if(Ot(this,Ze,!0,"f"),!Et(this,yt,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[tn](Et(this,dt,"f"),void 0,void 0,0,!0);if(fe(e))return e.then((()=>Et(this,yt,"f").help()))}const e=Et(this,Fe,"f").runDefaultBuilderOn(this);if(fe(e))return e.then((()=>Et(this,yt,"f").help()))}return Promise.resolve(Et(this,yt,"f").help())}getOptions(){return Et(this,it,"f")}getStrict(){return Et(this,pt,"f")}getStrictCommands(){return Et(this,gt,"f")}getStrictOptions(){return Et(this,mt,"f")}global(e,t){return me("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),!1!==t?Et(this,it,"f").local=Et(this,it,"f").local.filter((t=>-1===e.indexOf(t))):e.forEach((e=>{Et(this,it,"f").local.includes(e)||Et(this,it,"f").local.push(e)})),this}group(e,t){me("<string|array> <string>",[e,t],arguments.length);const n=Et(this,ht,"f")[t]||Et(this,Xe,"f")[t];Et(this,ht,"f")[t]&&delete Et(this,ht,"f")[t];const s={};return Et(this,Xe,"f")[t]=(n||[]).concat(e).filter((e=>!s[e]&&(s[e]=!0))),this}hide(e){return me("<string>",[e],arguments.length),Et(this,it,"f").hiddenOptions.push(e),this}implies(e,t){return me("<string|object> [number|string|array]",[e,t],arguments.length),Et(this,wt,"f").implies(e,t),this}locale(e){return me("[string]",[e],arguments.length),void 0===e?(this[Pt](),Et(this,ft,"f").y18n.getLocale()):(Ot(this,Ye,!1,"f"),Et(this,ft,"f").y18n.setLocale(e),this)}middleware(e,t,n){return Et(this,Qe,"f").addMiddleware(e,!!t,n)}nargs(e,t){return me("<string|object|array> [number]",[e,t],arguments.length),this[Rt](this.nargs.bind(this),"narg",e,t),this}normalize(e){return me("<array|string>",[e],arguments.length),this[It]("normalize",e),this}number(e){return me("<array|string>",[e],arguments.length),this[It]("number",e),this[rn](e),this}option(e,t){if(me("<string|object> [object]",[e,t],arguments.length),"object"==typeof e)Object.keys(e).forEach((t=>{this.options(t,e[t])}));else{"object"!=typeof t&&(t={}),this[rn](e),!Et(this,vt,"f")||"version"!==e&&"version"!==(null==t?void 0:t.alias)||this[$t](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join("\n"),void 0,"versionWarning"),Et(this,it,"f").key[e]=!0,t.alias&&this.alias(e,t.alias);const n=t.deprecate||t.deprecated;n&&this.deprecateOption(e,n);const s=t.demand||t.required||t.require;s&&this.demand(e,s),t.demandOption&&this.demandOption(e,"string"==typeof t.demandOption?t.demandOption:void 0),t.conflicts&&this.conflicts(e,t.conflicts),"default"in t&&this.default(e,t.default),void 0!==t.implies&&this.implies(e,t.implies),void 0!==t.nargs&&this.nargs(e,t.nargs),t.config&&this.config(e,t.configParser),t.normalize&&this.normalize(e),t.choices&&this.choices(e,t.choices),t.coerce&&this.coerce(e,t.coerce),t.group&&this.group(e,t.group),(t.boolean||"boolean"===t.type)&&(this.boolean(e),t.alias&&this.boolean(t.alias)),(t.array||"array"===t.type)&&(this.array(e),t.alias&&this.array(t.alias)),(t.number||"number"===t.type)&&(this.number(e),t.alias&&this.number(t.alias)),(t.string||"string"===t.type)&&(this.string(e),t.alias&&this.string(t.alias)),(t.count||"count"===t.type)&&this.count(e),"boolean"==typeof t.global&&this.global(e,t.global),t.defaultDescription&&(Et(this,it,"f").defaultDescription[e]=t.defaultDescription),t.skipValidation&&this.skipValidation(e);const i=t.describe||t.description||t.desc,r=Et(this,yt,"f").getDescriptions();Object.prototype.hasOwnProperty.call(r,e)&&"string"!=typeof i||this.describe(e,i),t.hidden&&this.hide(e),t.requiresArg&&this.requiresArg(e)}return this}options(e,t){return this.option(e,t)}parse(e,t,n){me("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[xt](),void 0===e&&(e=Et(this,dt,"f")),"object"==typeof t&&(Ot(this,ct,t,"f"),t=n),"function"==typeof t&&(Ot(this,at,t,"f"),t=!1),t||Ot(this,dt,e,"f"),Et(this,at,"f")&&Ot(this,Ge,!1,"f");const s=this[tn](e,!!t),i=this.parsed;return Et(this,Ve,"f").setParsed(this.parsed),fe(s)?s.then((e=>(Et(this,at,"f")&&Et(this,at,"f").call(this,Et(this,Je,"f"),e,Et(this,st,"f")),e))).catch((e=>{throw Et(this,at,"f")&&Et(this,at,"f")(e,this.parsed.argv,Et(this,st,"f")),e})).finally((()=>{this[Bt](),this.parsed=i})):(Et(this,at,"f")&&Et(this,at,"f").call(this,Et(this,Je,"f"),s,Et(this,st,"f")),this[Bt](),this.parsed=i,s)}parseAsync(e,t,n){const s=this.parse(e,t,n);return fe(s)?s:Promise.resolve(s)}parseSync(e,t,n){const s=this.parse(e,t,n);if(fe(s))throw new ne(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return me("<object>",[e],arguments.length),Ot(this,ot,e,"f"),this}pkgConf(e,t){me("<string> [string]",[e,t],arguments.length);let n=null;const s=this[Dt](t||Et(this,Be,"f"));return s[e]&&"object"==typeof s[e]&&(n=ze(s[e],t||Et(this,Be,"f"),this[Ct]()["deep-merge-config"]||!1,Et(this,ft,"f")),Et(this,it,"f").configObjects=(Et(this,it,"f").configObjects||[]).concat(n)),this}positional(e,t){me("<string> <object>",[e,t],arguments.length);const n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=$e(t,((e,t)=>!("type"===e&&!["string","number","boolean"].includes(t))&&n.includes(e)));const s=Et(this,Le,"f").fullCommands[Et(this,Le,"f").fullCommands.length-1],i=s?Et(this,Fe,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return ue(i).forEach((n=>{const s=i[n];Array.isArray(s)?-1!==s.indexOf(e)&&(t[n]=!0):s[e]&&!(n in t)&&(t[n]=s[e])})),this.group(e,Et(this,yt,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return me("[boolean]",[e],arguments.length),Ot(this,ut,e,"f"),this}required(e,t,n){return this.demand(e,t,n)}require(e,t,n){return this.demand(e,t,n)}requiresArg(e){return me("<array|string|object> [number]",[e],arguments.length),"string"==typeof e&&Et(this,it,"f").narg[e]||this[Rt](this.requiresArg.bind(this),"narg",e,NaN),this}showCompletionScript(e,t){return me("[string] [string]",[e,t],arguments.length),e=e||this.$0,Et(this,nt,"f").log(Et(this,Ve,"f").generateCompletionScript(e,t||Et(this,Ue,"f")||"completion")),this}showHelp(e){if(me("[string|function]",[e],arguments.length),Ot(this,Ze,!0,"f"),!Et(this,yt,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[tn](Et(this,dt,"f"),void 0,void 0,0,!0);if(fe(t))return t.then((()=>{Et(this,yt,"f").showHelp(e)})),this}const t=Et(this,Fe,"f").runDefaultBuilderOn(this);if(fe(t))return t.then((()=>{Et(this,yt,"f").showHelp(e)})),this}return Et(this,yt,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return me("[boolean|string] [string]",[e,t],arguments.length),Et(this,yt,"f").showHelpOnFail(e,t),this}showVersion(e){return me("[string|function]",[e],arguments.length),Et(this,yt,"f").showVersion(e),this}skipValidation(e){return me("<array|string>",[e],arguments.length),this[It]("skipValidation",e),this}strict(e){return me("[boolean]",[e],arguments.length),Ot(this,pt,!1!==e,"f"),this}strictCommands(e){return me("[boolean]",[e],arguments.length),Ot(this,gt,!1!==e,"f"),this}strictOptions(e){return me("[boolean]",[e],arguments.length),Ot(this,mt,!1!==e,"f"),this}string(e){return me("<array|string>",[e],arguments.length),this[It]("string",e),this[rn](e),this}terminalWidth(){return me([],0),Et(this,ft,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return me("<object>",[e],arguments.length),Ot(this,Ye,!1,"f"),Et(this,ft,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(me("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),void 0!==t){if(he(e,null,Et(this,ft,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);throw new ne(".usage() description must start with $0 if being used as alias for .command()")}return Et(this,yt,"f").usage(e),this}usageConfiguration(e){return me("<object>",[e],arguments.length),Ot(this,bt,e,"f"),this}version(e,t,n){const s="version";if(me("[boolean|string] [string] [string]",[e,t,n],arguments.length),Et(this,vt,"f")&&(this[jt](Et(this,vt,"f")),Et(this,yt,"f").version(void 0),Ot(this,vt,null,"f")),0===arguments.length)n=this[Nt](),e=s;else if(1===arguments.length){if(!1===e)return this;n=e,e=s}else 2===arguments.length&&(n=t,t=void 0);return Ot(this,vt,"string"==typeof e?e:s,"f"),t=t||Et(this,yt,"f").deferY18nLookup("Show version number"),Et(this,yt,"f").version(n||void 0),this.boolean(Et(this,vt,"f")),this.describe(Et(this,vt,"f"),t),this}wrap(e){return me("<number|null|undefined>",[e],arguments.length),Et(this,yt,"f").wrap(e),this}[(Fe=new WeakMap,Be=new WeakMap,Le=new WeakMap,Ve=new WeakMap,Ue=new WeakMap,He=new WeakMap,Je=new WeakMap,Ye=new WeakMap,qe=new WeakMap,Ge=new WeakMap,Ke=new WeakMap,Qe=new WeakMap,Xe=new WeakMap,Ze=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,st=new WeakMap,it=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap,ct=new WeakMap,lt=new WeakMap,ht=new WeakMap,dt=new WeakMap,ut=new WeakMap,ft=new WeakMap,pt=new WeakMap,gt=new WeakMap,mt=new WeakMap,yt=new WeakMap,bt=new WeakMap,vt=new WeakMap,wt=new WeakMap,kt)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(e){}return e}[At](){return{log:(...e)=>{this[Kt]()||console.log(...e),Ot(this,Ze,!0,"f"),Et(this,st,"f").length&&Ot(this,st,Et(this,st,"f")+"\n","f"),Ot(this,st,Et(this,st,"f")+e.join(" "),"f")},error:(...e)=>{this[Kt]()||console.error(...e),Ot(this,Ze,!0,"f"),Et(this,st,"f").length&&Ot(this,st,Et(this,st,"f")+"\n","f"),Ot(this,st,Et(this,st,"f")+e.join(" "),"f")}}}[jt](e){ue(Et(this,it,"f")).forEach((t=>{if("configObjects"===t)return;const n=Et(this,it,"f")[t];Array.isArray(n)?n.includes(e)&&n.splice(n.indexOf(e),1):"object"==typeof n&&delete n[e]})),delete Et(this,yt,"f").getDescriptions()[e]}[$t](e,t,n){Et(this,qe,"f")[n]||(Et(this,ft,"f").process.emitWarning(e,t),Et(this,qe,"f")[n]=!0)}[xt](){Et(this,Ke,"f").push({options:Et(this,it,"f"),configObjects:Et(this,it,"f").configObjects.slice(0),exitProcess:Et(this,Ge,"f"),groups:Et(this,Xe,"f"),strict:Et(this,pt,"f"),strictCommands:Et(this,gt,"f"),strictOptions:Et(this,mt,"f"),completionCommand:Et(this,Ue,"f"),output:Et(this,st,"f"),exitError:Et(this,Je,"f"),hasOutput:Et(this,Ze,"f"),parsed:this.parsed,parseFn:Et(this,at,"f"),parseContext:Et(this,ct,"f")}),Et(this,yt,"f").freeze(),Et(this,wt,"f").freeze(),Et(this,Fe,"f").freeze(),Et(this,Qe,"f").freeze()}[_t](){let e,t="";return e=/\b(node|iojs|electron)(\.exe)?$/.test(Et(this,ft,"f").process.argv()[0])?Et(this,ft,"f").process.argv().slice(1,2):Et(this,ft,"f").process.argv().slice(0,1),t=e.map((e=>{const t=this[Zt](Et(this,Be,"f"),e);return e.match(/^(\/|([a-zA-Z]:)?\\)/)&&t.length<e.length?t:e})).join(" ").trim(),Et(this,ft,"f").getEnv("_")&&Et(this,ft,"f").getProcessArgvBin()===Et(this,ft,"f").getEnv("_")&&(t=Et(this,ft,"f").getEnv("_").replace(`${Et(this,ft,"f").path.dirname(Et(this,ft,"f").process.execPath())}/`,"")),t}[Ct](){return Et(this,ot,"f")}[St](){return Et(this,bt,"f")}[Pt](){if(!Et(this,Ye,"f"))return;const e=Et(this,ft,"f").getEnv("LC_ALL")||Et(this,ft,"f").getEnv("LC_MESSAGES")||Et(this,ft,"f").getEnv("LANG")||Et(this,ft,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Nt](){return this[Dt]().version||"unknown"}[Mt](e){const t=e["--"]?e["--"]:e._;for(let e,n=0;void 0!==(e=t[n]);n++)Et(this,ft,"f").Parser.looksLikeNumber(e)&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))&&(t[n]=Number(e));return e}[Dt](e){const t=e||"*";if(Et(this,lt,"f")[t])return Et(this,lt,"f")[t];let n={};try{let t=e||Et(this,ft,"f").mainFilename;!e&&Et(this,ft,"f").path.extname(t)&&(t=Et(this,ft,"f").path.dirname(t));const s=Et(this,ft,"f").findUp(t,((e,t)=>t.includes("package.json")?"package.json":void 0));he(s,void 0,Et(this,ft,"f")),n=JSON.parse(Et(this,ft,"f").readFileSync(s,"utf8"))}catch(e){}return Et(this,lt,"f")[t]=n||{},Et(this,lt,"f")[t]}[It](e,t){(t=[].concat(t)).forEach((t=>{t=this[Tt](t),Et(this,it,"f")[e].push(t)}))}[Rt](e,t,n,s){this[zt](e,t,n,s,((e,t,n)=>{Et(this,it,"f")[e][t]=n}))}[Wt](e,t,n,s){this[zt](e,t,n,s,((e,t,n)=>{Et(this,it,"f")[e][t]=(Et(this,it,"f")[e][t]||[]).concat(n)}))}[zt](e,t,n,s,i){if(Array.isArray(n))n.forEach((t=>{e(t,s)}));else if((e=>"object"==typeof e)(n))for(const t of ue(n))e(t,n[t]);else i(t,this[Tt](n),s)}[Tt](e){return"__proto__"===e?"___proto___":e}[Ft](e,t){return this[Rt](this[Ft].bind(this),"key",e,t),this}[Bt](){var e,t,n,s,i,r,o,a,c,l,h,d;const u=Et(this,Ke,"f").pop();let f;he(u,void 0,Et(this,ft,"f")),e=this,t=this,n=this,s=this,i=this,r=this,o=this,a=this,c=this,l=this,h=this,d=this,({options:{set value(t){Ot(e,it,t,"f")}}.value,configObjects:f,exitProcess:{set value(e){Ot(t,Ge,e,"f")}}.value,groups:{set value(e){Ot(n,Xe,e,"f")}}.value,output:{set value(e){Ot(s,st,e,"f")}}.value,exitError:{set value(e){Ot(i,Je,e,"f")}}.value,hasOutput:{set value(e){Ot(r,Ze,e,"f")}}.value,parsed:this.parsed,strict:{set value(e){Ot(o,pt,e,"f")}}.value,strictCommands:{set value(e){Ot(a,gt,e,"f")}}.value,strictOptions:{set value(e){Ot(c,mt,e,"f")}}.value,completionCommand:{set value(e){Ot(l,Ue,e,"f")}}.value,parseFn:{set value(e){Ot(h,at,e,"f")}}.value,parseContext:{set value(e){Ot(d,ct,e,"f")}}.value}=u),Et(this,it,"f").configObjects=f,Et(this,yt,"f").unfreeze(),Et(this,wt,"f").unfreeze(),Et(this,Fe,"f").unfreeze(),Et(this,Qe,"f").unfreeze()}[Lt](e,t){return Oe(t,(t=>(e(t),t)))}getInternalMethods(){return{getCommandInstance:this[Vt].bind(this),getContext:this[Ut].bind(this),getHasOutput:this[Ht].bind(this),getLoggerInstance:this[Jt].bind(this),getParseContext:this[Yt].bind(this),getParserConfiguration:this[Ct].bind(this),getUsageConfiguration:this[St].bind(this),getUsageInstance:this[qt].bind(this),getValidationInstance:this[Gt].bind(this),hasParseCallback:this[Kt].bind(this),isGlobalContext:this[Qt].bind(this),postProcess:this[Xt].bind(this),reset:this[en].bind(this),runValidation:this[nn].bind(this),runYargsParserAndExecuteCommands:this[tn].bind(this),setHasOutput:this[sn].bind(this)}}[Vt](){return Et(this,Fe,"f")}[Ut](){return Et(this,Le,"f")}[Ht](){return Et(this,Ze,"f")}[Jt](){return Et(this,nt,"f")}[Yt](){return Et(this,ct,"f")||{}}[qt](){return Et(this,yt,"f")}[Gt](){return Et(this,wt,"f")}[Kt](){return!!Et(this,at,"f")}[Qt](){return Et(this,tt,"f")}[Xt](e,t,n,s){if(n)return e;if(fe(e))return e;t||(e=this[kt](e));return(this[Ct]()["parse-positional-numbers"]||void 0===this[Ct]()["parse-positional-numbers"])&&(e=this[Mt](e)),s&&(e=we(e,this,Et(this,Qe,"f").getMiddleware(),!1)),e}[en](e={}){Ot(this,it,Et(this,it,"f")||{},"f");const t={};t.local=Et(this,it,"f").local||[],t.configObjects=Et(this,it,"f").configObjects||[];const n={};t.local.forEach((t=>{n[t]=!0,(e[t]||[]).forEach((e=>{n[e]=!0}))})),Object.assign(Et(this,ht,"f"),Object.keys(Et(this,Xe,"f")).reduce(((e,t)=>{const s=Et(this,Xe,"f")[t].filter((e=>!(e in n)));return s.length>0&&(e[t]=s),e}),{})),Ot(this,Xe,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((e=>{t[e]=(Et(this,it,"f")[e]||[]).filter((e=>!n[e]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((e=>{t[e]=$e(Et(this,it,"f")[e],(e=>!n[e]))})),t.envPrefix=Et(this,it,"f").envPrefix,Ot(this,it,t,"f"),Ot(this,yt,Et(this,yt,"f")?Et(this,yt,"f").reset(n):Ce(this,Et(this,ft,"f")),"f"),Ot(this,wt,Et(this,wt,"f")?Et(this,wt,"f").reset(n):function(e,t,n){const s=n.y18n.__,i=n.y18n.__n,r={nonOptionCount:function(n){const s=e.getDemandedCommands(),r=n._.length+(n["--"]?n["--"].length:0)-e.getInternalMethods().getContext().commands.length;s._&&(r<s._.min||r>s._.max)&&(r<s._.min?void 0!==s._.minMsg?t.fail(s._.minMsg?s._.minMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.min.toString()):null):t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",r,r.toString(),s._.min.toString())):r>s._.max&&(void 0!==s._.maxMsg?t.fail(s._.maxMsg?s._.maxMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.max.toString()):null):t.fail(i("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",r,r.toString(),s._.max.toString()))))},positionalCount:function(e,n){n<e&&t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",n,n+"",e+""))},requiredArguments:function(e,n){let s=null;for(const t of Object.keys(n))Object.prototype.hasOwnProperty.call(e,t)&&void 0!==e[t]||(s=s||{},s[t]=n[t]);if(s){const e=[];for(const t of Object.keys(s)){const n=s[t];n&&e.indexOf(n)<0&&e.push(n)}const n=e.length?`\n${e.join("\n")}`:"";t.fail(i("Missing required argument: %s","Missing required arguments: %s",Object.keys(s).length,Object.keys(s).join(", ")+n))}},unknownArguments:function(n,s,o,a,c=!0){var l;const h=e.getInternalMethods().getCommandInstance().getCommands(),d=[],u=e.getInternalMethods().getContext();if(Object.keys(n).forEach((t=>{Ie.includes(t)||Object.prototype.hasOwnProperty.call(o,t)||Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),t)||r.isValidAndSomeAliasIsNotNew(t,s)||d.push(t)})),c&&(u.commands.length>0||h.length>0||a)&&n._.slice(u.commands.length).forEach((e=>{h.includes(""+e)||d.push(""+e)})),c){const t=(null===(l=e.getDemandedCommands()._)||void 0===l?void 0:l.max)||0,s=u.commands.length+t;s<n._.length&&n._.slice(s).forEach((e=>{e=String(e),u.commands.includes(e)||d.includes(e)||d.push(e)}))}d.length&&t.fail(i("Unknown argument: %s","Unknown arguments: %s",d.length,d.map((e=>e.trim()?e:`"${e}"`)).join(", ")))},unknownCommands:function(n){const s=e.getInternalMethods().getCommandInstance().getCommands(),r=[],o=e.getInternalMethods().getContext();return(o.commands.length>0||s.length>0)&&n._.slice(o.commands.length).forEach((e=>{s.includes(""+e)||r.push(""+e)})),r.length>0&&(t.fail(i("Unknown command: %s","Unknown commands: %s",r.length,r.join(", "))),!0)},isValidAndSomeAliasIsNotNew:function(t,n){if(!Object.prototype.hasOwnProperty.call(n,t))return!1;const s=e.parsed.newAliases;return[t,...n[t]].some((e=>!Object.prototype.hasOwnProperty.call(s,e)||!s[t]))},limitedChoices:function(n){const i=e.getOptions(),r={};if(!Object.keys(i.choices).length)return;Object.keys(n).forEach((e=>{-1===Ie.indexOf(e)&&Object.prototype.hasOwnProperty.call(i.choices,e)&&[].concat(n[e]).forEach((t=>{-1===i.choices[e].indexOf(t)&&void 0!==t&&(r[e]=(r[e]||[]).concat(t))}))}));const o=Object.keys(r);if(!o.length)return;let a=s("Invalid values:");o.forEach((e=>{a+=`\n ${s("Argument: %s, Given: %s, Choices: %s",e,t.stringifiedValues(r[e]),t.stringifiedValues(i.choices[e]))}`})),t.fail(a)}};let o={};function a(e,t){const n=Number(t);return"number"==typeof(t=isNaN(n)?t:n)?t=e._.length>=t:t.match(/^--no-.+/)?(t=t.match(/^--no-(.+)/)[1],t=!Object.prototype.hasOwnProperty.call(e,t)):t=Object.prototype.hasOwnProperty.call(e,t),t}r.implies=function(t,s){me("<string|object> [array|number|string]",[t,s],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.implies(e,t[e])})):(e.global(t),o[t]||(o[t]=[]),Array.isArray(s)?s.forEach((e=>r.implies(t,e))):(he(s,void 0,n),o[t].push(s)))},r.getImplied=function(){return o},r.implications=function(e){const n=[];if(Object.keys(o).forEach((t=>{const s=t;(o[t]||[]).forEach((t=>{let i=s;const r=t;i=a(e,i),t=a(e,t),i&&!t&&n.push(` ${s} -> ${r}`)}))})),n.length){let e=`${s("Implications failed:")}\n`;n.forEach((t=>{e+=t})),t.fail(e)}};let c={};r.conflicts=function(t,n){me("<string|object> [array|string]",[t,n],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.conflicts(e,t[e])})):(e.global(t),c[t]||(c[t]=[]),Array.isArray(n)?n.forEach((e=>r.conflicts(t,e))):c[t].push(n))},r.getConflicting=()=>c,r.conflicting=function(i){Object.keys(i).forEach((e=>{c[e]&&c[e].forEach((n=>{n&&void 0!==i[e]&&void 0!==i[n]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,n))}))})),e.getInternalMethods().getParserConfiguration()["strip-dashed"]&&Object.keys(c).forEach((e=>{c[e].forEach((r=>{r&&void 0!==i[n.Parser.camelCase(e)]&&void 0!==i[n.Parser.camelCase(r)]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,r))}))}))},r.recommendCommands=function(e,n){n=n.sort(((e,t)=>t.length-e.length));let i=null,r=1/0;for(let t,s=0;void 0!==(t=n[s]);s++){const n=De(e,t);n<=3&&n<r&&(r=n,i=t)}i&&t.fail(s("Did you mean %s?",i))},r.reset=function(e){return o=$e(o,(t=>!e[t])),c=$e(c,(t=>!e[t])),r};const l=[];return r.freeze=function(){l.push({implied:o,conflicting:c})},r.unfreeze=function(){const e=l.pop();he(e,void 0,n),({implied:o,conflicting:c}=e)},r}(this,Et(this,yt,"f"),Et(this,ft,"f")),"f"),Ot(this,Fe,Et(this,Fe,"f")?Et(this,Fe,"f").reset():function(e,t,n,s){return new ke(e,t,n,s)}(Et(this,yt,"f"),Et(this,wt,"f"),Et(this,Qe,"f"),Et(this,ft,"f")),"f"),Et(this,Ve,"f")||Ot(this,Ve,function(e,t,n,s){return new Me(e,t,n,s)}(this,Et(this,yt,"f"),Et(this,Fe,"f"),Et(this,ft,"f")),"f"),Et(this,Qe,"f").reset(),Ot(this,Ue,null,"f"),Ot(this,st,"","f"),Ot(this,Je,null,"f"),Ot(this,Ze,!1,"f"),this.parsed=!1,this}[Zt](e,t){return Et(this,ft,"f").path.relative(e,t)}[tn](e,t,n,s=0,i=!1){let r=!!n||i;e=e||Et(this,dt,"f"),Et(this,it,"f").__=Et(this,ft,"f").y18n.__,Et(this,it,"f").configuration=this[Ct]();const o=!!Et(this,it,"f").configuration["populate--"],a=Object.assign({},Et(this,it,"f").configuration,{"populate--":!0}),c=Et(this,ft,"f").Parser.detailed(e,Object.assign({},Et(this,it,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,Et(this,ct,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((e=>{e===Et(this,et,"f")&&l[e]?u=!0:e===Et(this,vt,"f")&&l[e]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&Et(this,yt,"f").clearCachedHelpMessage();try{if(this[Pt](),t)return this[Xt](l,o,!!n,!1);if(Et(this,et,"f")){[Et(this,et,"f")].concat(d[Et(this,et,"f")]||[]).filter((e=>e.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Ot(this,tt,!1,"f");const a=Et(this,Fe,"f").getCommands(),p=Et(this,Ve,"f").completionKey in l,g=u||p||i;if(l._.length){if(a.length){let e;for(let t,r=s||0;void 0!==l._[r];r++){if(t=String(l._[r]),a.includes(t)&&t!==Et(this,Ue,"f")){const e=Et(this,Fe,"f").runCommand(t,this,c,r+1,i,u||f||i);return this[Xt](e,o,!!n,!1)}if(!e&&t!==Et(this,Ue,"f")){e=t;break}}!Et(this,Fe,"f").hasDefaultCommand()&&Et(this,ut,"f")&&e&&!g&&Et(this,wt,"f").recommendCommands(e,a)}Et(this,Ue,"f")&&l._.includes(Et(this,Ue,"f"))&&!p&&(Et(this,Ge,"f")&&xe(!0),this.showCompletionScript(),this.exit(0))}if(Et(this,Fe,"f").hasDefaultCommand()&&!g){const e=Et(this,Fe,"f").runCommand(null,this,c,0,i,u||f||i);return this[Xt](e,o,!!n,!1)}if(p){Et(this,Ge,"f")&&xe(!0);const t=(e=[].concat(e)).slice(e.indexOf(`--${Et(this,Ve,"f").completionKey}`)+1);return Et(this,Ve,"f").getCompletion(t,((e,t)=>{if(e)throw new ne(e.message);(t||[]).forEach((e=>{Et(this,nt,"f").log(e)})),this.exit(0)})),this[Xt](l,!o,!!n,!1)}if(Et(this,Ze,"f")||(u?(Et(this,Ge,"f")&&xe(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(Et(this,Ge,"f")&&xe(!0),r=!0,Et(this,yt,"f").showVersion("log"),this.exit(0))),!r&&Et(this,it,"f").skipValidation.length>0&&(r=Object.keys(l).some((e=>Et(this,it,"f").skipValidation.indexOf(e)>=0&&!0===l[e]))),!r){if(c.error)throw new ne(c.error.message);if(!p){const e=this[nn](d,{},c.error);n||(h=we(l,this,Et(this,Qe,"f").getMiddleware(),!0)),h=this[Lt](e,null!=h?h:l),fe(h)&&!n&&(h=h.then((()=>we(l,this,Et(this,Qe,"f").getMiddleware(),!1))))}}}catch(e){if(!(e instanceof ne))throw e;Et(this,yt,"f").fail(e.message,e)}return this[Xt](null!=h?h:l,o,!!n,!0)}[nn](e,t,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new ne(n.message);Et(this,wt,"f").nonOptionCount(r),Et(this,wt,"f").requiredArguments(r,i);let o=!1;Et(this,gt,"f")&&(o=Et(this,wt,"f").unknownCommands(r)),Et(this,pt,"f")&&!o?Et(this,wt,"f").unknownArguments(r,e,t,!!s):Et(this,mt,"f")&&Et(this,wt,"f").unknownArguments(r,e,{},!1,!1),Et(this,wt,"f").limitedChoices(r),Et(this,wt,"f").implications(r),Et(this,wt,"f").conflicting(r)}}[sn](){Ot(this,Ze,!0,"f")}[rn](e){if("string"==typeof e)Et(this,it,"f").key[e]=!0;else for(const t of e)Et(this,it,"f").key[t]=!0}}const an=(cn=le,(e=[],t=cn.process.cwd(),n)=>{const s=new on(e,t,n,cn);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var cn;function ln(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function hn(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function dn(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}const un=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),fn=un?"bun --bun run":"node",pn=un?"bun":"yarn",gn=un?"bun --bun run":"yarn";let mn;const yn=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=e=>function(e,t=0){const[n,s]=function(e,t=0){let n=3735928559^t,s=1103547991^t;for(let t,i=0;i<e.length;i++)t=e.codePointAt(i),n=Math.imul(n^t,2654435761),s=Math.imul(s^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(n^n>>>13,3266489909),[s>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+s.toString(36).padStart(7,"0")}(JSON.stringify(e)),maxCachedArgsSize:s=100,maxCachedThisSize:i=10}={}){return function(r,o){if("getter"===o?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[s,i]=n.get(this);if(t-i<=e)return s}const s=r.call(this);if(n.size>=i){const e=n.keys().next().value;n.delete(e)}return n.set(this,[s,t]),s}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let l=a.get(this);const h=Date.now();if(l){if(l.has(c)){const[t,n]=l.get(c);if(h-n<=e)return t}}else{if(l=new Map,a.size>=i){const e=a.keys().next().value;a.delete(e)}a.set(this,l)}const d=o?r.call(this,...t):r(...t);if(l.size>=s){const e=l.keys().next().value;l.delete(e)}return l.set(c,[d,h]),d}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class bn{static{[mn]=function(e,t,n,s,i){var r,o,a,c,l,h,d,u=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,p=Object.create,g=[p(null),p(null)],m=t.length;function y(t,n,s){return function(i,r){n&&(r=i,i=e);for(var o=0;o<t.length;o++)r=t[o].apply(i,s?[r]:[]);return s?r:i}}function b(e,t,n,s){if("function"!=typeof e&&(s||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(s?"":" or undefined"));return e}function v(e,t,n,s,i,a,c,l,h,d,u){function p(e){if(!u(e))throw new TypeError("Attempted to access private element on non-instance")}var m=[].concat(t[0]),v=t[3],w=!c,O=1===i,E=3===i,k=4===i,A=2===i;function j(t,n,s){return function(i,r){return n&&(r=i,i=e),s&&s(i),$[t].call(i,r)}}if(!w){var $={},x=[],_=E?"get":k||O?"set":"value";if(h?(d||O?$={get:hn((function(){return v(this)}),s,"get"),set:function(e){t[4](this,e)}}:$[_]=v,d||hn($[_],s,A?"":_)):d||($=Object.getOwnPropertyDescriptor(e,s)),!d&&!h){if((o=g[+l][s])&&7!=(o^i))throw Error("Decorating two elements with the same name ("+$[_].name+") is not supported yet");g[+l][s]=i<3?1:i}}for(var C=e,S=m.length-1;S>=0;S-=n?2:1){var P=b(m[S],"A decorator","be",!0),N=n?m[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:r,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),a.push(t)}.bind(null,M)};if(w)o=P.call(N,C,D),M.v=1,b(o,"class decorators","return")&&(C=o);else if(D.static=l,D.private=h,o=D.access={has:h?u.bind():function(e){return s in e}},k||(o.get=h?A?function(e){return p(e),$.value}:j("get",0,p):function(e){return e[s]}),A||E||(o.set=h?j("set",0,p):function(e,t){e[s]=t}),C=P.call(N,O?{get:$.get,set:$.set}:$[_],D),M.v=1,O){if("object"==typeof C&&C)(o=b(C.get,"accessor.get"))&&($.get=o),(o=b(C.set,"accessor.set"))&&($.set=o),(o=b(C.init,"accessor.init"))&&x.unshift(o);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(C,(d?"field":"method")+" decorators","return")&&(d?x.unshift(C):$[_]=C)}return i<2&&c.push(y(x,l,1),y(a,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[_]:b.call.bind($[_])):f(e,s,$)),C}function w(e){return f(e,u,{configurable:!0,enumerable:!0,value:r})}return r=p(null==r?null:r),l=[],h=function(e){e&&l.push(y(e))},d=function(t,s){for(var r=0;r<n.length;r++){var o=n[r],h=o[1],d=7&h;if((8&h)==t&&!d==s){var u=o[2],f=!!o[3],p=16&h;v(t?e:e.prototype,o,p,f?"#"+u:dn(u),d,d<2?[]:t?c=c||[]:a=a||[],l,!!t,f,s,t&&f?function(t){return ln(t)===e}:i)}}},d(8,0),d(0,0),d(8,1),d(0,1),h(a),h(c),o=l,m||w(e),{e:o,get c(){var n=[];return m&&[w(e=v(e,[t],s,e.name,5,n)),y(n,1)]}}}(this,[],[[yn,3,"isBunAvailable"],[yn,3,"buildCommand"],[yn,3,"rootDirPath"],[yn,3,"dockerfile"],[yn,3,"hasDockerfile"],[yn,3,"hasSourceCode"],[yn,3,"name"],[yn,3,"dockerImageName"],[yn,3,"env"],[yn,3,"packageJson"],[yn,3,"packageJsonPath"],[yn,3,"hasPrisma"],[yn,3,"dockerPackageJson"],[yn,3,"binExists"]]).e}argv=void mn(this);pathByName=new Map;constructor(t,n,s){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=s}get isBunAvailable(){try{return/(^|\n)bun\s/.test(l.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return un?"true":this.packageJson.scripts?.build?.includes("buildIfNeeded")?"yarn build":"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":"")}get dirPath(){return this._dirPath}get rootDirPath(){return l.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return l.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return l.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){return this.loadEnv?{...C(this.argv,this.dirPath),...process.env}:process.env}get packageJson(){return JSON.parse(l.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(l.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const s=e.join(n,"node_modules",".bin");if(l.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,t=!0),l.existsSync(e.join(n,".git")))break;const i=e.dirname(n);if(n===i)break;n=i}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>l.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function vn(t,n=!0,s){if(s??=process.cwd(),l.existsSync(e.join(s,"package.json")))return new bn(s,t,n)}async function wn(t,n=!0,s){const i=function(t,n=!0,s){if(s??=process.cwd(),!l.existsSync(e.join(s,"package.json")))return;const i=new bn(s,t,n);let r=i;if(!i.packageJson.workspaces&&e.dirname(s).endsWith("/packages")){const i=e.resolve(s,"..","..");l.existsSync(e.join(i,"package.json"))&&(r=new bn(i,t,n))}return{root:r,self:i}}(t,n,s);if(i)return{...i,descendants:i.root===i.self?await On(t,i.root,n):[i.self]}}async function On(t,n,s){const i=[n],r=n.packageJson.workspaces;if(!Array.isArray(r))return i;const o=[],a=[];for(const t of r.map((t=>e.join(n.dirPath,t))))l.existsSync(t)?a.push(t):o.push(t);a.push(...await E(o,{dot:!0,onlyDirectories:!0}));for(const n of a)l.existsSync(e.join(n,"package.json"))&&i.push(new bn(n,t,s));return i}const En={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command",type:"string",default:"yarn build",alias:"c"}},async handler(t){await async function(t,n){const s=await vn(t,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(e.join(s.rootDirPath,".git")))return kn(s,t),!0;const[i,r,o]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),i=e.resolve(s,"last-build");await l.promises.mkdir(s,{recursive:!0});const r=w("sha256"),o=y.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();r.update(o);const a=JSON.stringify(Object.entries(t.env).filter((([e])=>!An.has(e))).sort((([e],[t])=>e.localeCompare(t))));r.update(a),await async function(e,t,n){return new Promise((s=>{const i=y.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(jn.some((t=>e.includes(t)))||$n.some((t=>e.endsWith(t))))&&!xn.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${i.join(", ")}`);const r=y.spawn("git",["diff","--",...i],{cwd:e.rootDirPath});r.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),r.on("close",(()=>{s()}))}))}(t,n,r);const c=r.digest("hex"),h=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>l.promises.readFile(i,"utf8")));return[h===c,i,c]}(s,t);if(i)return console.info(O.green(`Skip to run '${t.command}' 💫`)),!1;if(!kn(s,t))return;t.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(t)}};function kn(e,t){if(console.info(O.green(`Run '${t.command}'`)),!t.dryRun){const n=y.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const An=new Set(["CI","PWDEBUG","TMPDIR"]);const jn=["src/","public/"],$n=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],xn=["test/","tests/","__tests__/","test-fixtures/"];const _n=new Set;async function Cn(e){try{await A(e)}catch{}}const Sn=new j,Pn={exitIfFailed:!0};async function Nn(e,t,n,s=Pn){const[i,r]=Dn(e,t);if(In(i,t),n.verbose&&In(r,t,"Start (raw)",!0),n.dryRun)return Rn(i,0,s),0;const o=r.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(e){await Cn(e);const t=async()=>{_n.has(e)||(_n.add(e),await Cn(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(o));const a=await N(r,void 0,{cwd:t.dirPath,env:Wn(t.env,s),shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Rn(i,a.status,s),a.status??1}function Mn(e,t,n,s=Pn){return Sn.runAndWaitForReturnValue((async()=>{const[i,r]=Dn(e,t);if(In(i,t,"Start (parallel)",!0),n.dryRun)return In(i,t,"Started (log)"),n.verbose&&In(r,t,"Started (raw)",!0),Rn(i,0,s),0;const o=await N(r,void 0,{cwd:t.dirPath,env:Wn(t.env,s),shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});In(i,t,"Started (log)"),n.verbose&&In(r,t,"Started (raw)",!0);const a=o.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),Rn(i,o.status,s),o.status??1}))}function Dn(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ");return un&&(n=n.replaceAll("build-ts run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(YARN )?vitest run/g,"bun test").replaceAll(" --color --passWithNoTests --allowOnly","")),n=n.trim(),[n.replaceAll("YARN ",`${gn} `),n.replaceAll("YARN ",!un&&t.binExists?"":`${gn} `)]}function In(e,t,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),e)+O.gray(` at ${t.dirPath}`))}function Rn(e,t,n){0===t?console.info(O.green(O.bold("Finished:"),e)):(console.info(O.red(O.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function Wn(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}const zn=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),Tn=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Fn=new Set([...Tn].filter((e=>!zn.has(e)))),Bn={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){un||(console.error(O.red("This command is only available on Bun.")),process.exit(1));const n=await wn(t,!1);n||(console.error(O.red("No project found.")),process.exit(1));const s=t.files??[];let i,r,o;if(s.length>0){const t=[],n=[],a=[];for(const i of s){const s=e.resolve(String(i));if(s.endsWith("/test-fixtures")||s.includes("/test-fixtures/"))continue;const r=e.extname(s).slice(1);s.endsWith("/package.json")?a.push(s):zn.has(r)?t.push(s):Tn.has(r)&&n.push(s)}i=t.map((e=>`"${e}"`)).join(" "),r=n.map((e=>`"${e}"`)).join(" "),o=a.map((e=>`"${e}"`)).join(" ")}else i="",r=`"**/{.*/,}*.{${[...Fn].join(",")}" "!**/test-fixtures/**"`,o=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let c;(i||0===s.length)&&(c=Mn(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${i}`,n.self,t,{forceColor:!0})),t.format&&(r&&Mn(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${r}`,n.self,t,{forceColor:!0}),o&&(await c,Mn(`bun --bun sort-package-json ${o}`,n.self,t,{forceColor:!0})))}};function*Ln(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Vn={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of Ln("optimizeForDockerBuild",n.descendants)){const n=s.packageJson,i=["dependencies","devDependencies"];for(const e of i){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Un(t,n),Hn(n),Jn(n),t.dryRun)continue;const r=t.outside?e.join(s.dirPath,"dist"):s.dirPath;await l.promises.mkdir(r,{recursive:!0}),await l.promises.writeFile(e.join(r,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||y.spawnSync("yarn",{stdio:"inherit"})}};function Un(e,t){if(!e.outside)return void delete t.devDependencies;const n=t.devDependencies||{},s=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"];for(const t of Object.keys(n))(s.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&delete n[t]}function Hn(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],s=e.scripts||{};for(const[e,i]of Object.entries(s))(t.some((t=>e.includes(t)))||n.some((e=>i.includes(e)||i.trim()===e.trim())))&&delete s[e]}function Jn(e){delete e.private,delete e.publishConfig,delete e.prettier}const Yn=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${fn} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),s=`DATABASE_URL=file://${t} `}return`${s}PRISMA studio`}},qn={},Gn={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Kn).command(Xn).command(Zn).command(es).command(ts).command(ns).command(ss).command(is).command(rs).command(os).demandCommand(),handler(){}},Kn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:qn,async handler(e){const t=await as(e);for(const n of Ln("prisma deploy",t))await Nn(Yn.deploy(n),n,e)}},Qn={...qn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Xn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Qn,async handler(e){const t=await as(e);for(const n of Ln("prisma deploy-force",t))await Nn(Yn.deployForce(n,e.backupPath),n,e)}},Zn={command:"litestream",describe:"Setup DB for Litestream",builder:qn,async handler(e){const t=await as(e);for(const n of Ln("prisma litestream",t))await Nn(Yn.litestream(n),n,e)}},es={command:"migrate",describe:"Apply migration to DB with initializing it",builder:qn,async handler(e){const t=await as(e);for(const n of Ln("prisma migrate",t))await Nn(Yn.migrate(n),n,e)}},ts={command:"migrate-dev",describe:"Create a migration file",builder:qn,async handler(e){const t=await as(e);for(const n of Ln("prisma migrate-dev",t))await Nn(Yn.migrateDev(n),n,e)}},ns={command:"reset",describe:"Reset DB",builder:qn,async handler(e){const t=await as(e);for(const n of Ln("prisma reset",t))await Nn(Yn.reset(n),n,e)}},ss={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Qn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await as(e);for(const n of Ln("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await Nn(Yn.restore(n,e.backupPath,t),n,e)}}},is={command:"seed",describe:"Populate DB with seed data",builder:{...qn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await as(e);for(const n of Ln("prisma seed",t))await Nn(Yn.seed(n,e.file),n,e)}},rs={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...qn,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await as(e);for(const n of Ln("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await Nn(Yn.studio(n,t),n,e)}}},os={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await as(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const s of Ln(`prisma ${n}`,t))await Nn(`PRISMA ${n}`,s,e)}};async function as(e){const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(O.red("No prisma project found.")),process.exit(1)),n}const cs={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=vn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let s=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${O.yellow(`#${i} Retrying: ${n.join(" ")}`)}`),s=await Nn(n.join(" "),t,e,{exitIfFailed:!1}),0===s)return;process.exit(s)}},ls=["express","fastify","elysia"],hs={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await wn(e,!1,t);n||(console.error(O.red("No project found.")),process.exit(1));for(const t of Ln("setup",n.descendants)){const s=await x.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===_.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Mn(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await Nn("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Mn("poetry config virtualenvs.in-project true",t,e),await Mn("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Mn(`poetry env use ${n}`,t,e),await Sn.promiseAll(),await Nn("poetry run pip install --upgrade pip",t,e),await Nn("poetry install --ansi",t,e)}const i=t.packageJson.dependencies??{},r=t.packageJson.devDependencies||{},o=t.packageJson.scripts??{},a=[];let c=[];i.blitz||i.next||r["@remix-run/dev"]?(a.push("pm2"),c.push("concurrently","open-cli","vitest","wait-on")):ls.some((e=>i[e]))&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),un&&(c=c.filter((e=>"vitest"!==e))),a.length>0&&await Nn(`${pn} add ${a.join(" ")}`,t,e),c.length>0&&await Nn(`${pn} add -D ${c.join(" ")}`,t,e),o["gen-code"]&&await Nn(`${gn} gen-code`,t,e)}}(e)}};const ds=new class{buildDevImage(t,n){const s=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${s}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",s=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,s)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(_n.has(e))return;_n.add(e),In(e,t);const{status:n}=v(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Rn(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class us{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return ds.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${ds.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:s,startCommand:i}){const r=e.env.WB_ENV;return`WB_ENV=${r} NEXT_PUBLIC_WB_ENV=${r} APP_ENV=${r} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${s}/mount && ${i} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:s}){const i=e.env.WB_ENV;return`WB_ENV=${i} NEXT_PUBLIC_WB_ENV=${i} APP_ENV=${i} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const fs=new class extends us{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Yn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Yn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const ps=new class extends us{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${ds.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${fn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction(e,t)})`}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testE2EDev(e,t,{startCommand:n}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const gs=new class extends us{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[Yn.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[Yn.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const ms=new class extends us{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${ds.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${fn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const ys=new class extends us{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Yn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${Yn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},bs={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(t.blitz)i=fs;else if(t.next)i=gs;else if(s["@remix-run/dev"])i=ys;else if(ls.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=ps;else{if(!t["build-ts"]&&!s["build-ts"])continue;i=ms}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const s=vs(t,"development");await Nn(`${s}${ws(i.start(n,e))}`,n,e);break}case"staging":{const s=vs(t,"staging");await Nn(`${s}${ws(i.startProduction(n,e,8080))}`,n,e);break}case"docker":{const s=vs(t,"staging");await Nn(`${s}${ws(i.startDocker(n,e))}`,n,e);break}case"docker-debug":{const s=vs(t,"staging");e.normalizedArgsText="'/bin/bash'",await Nn(`${s}${ws(i.startDocker(n,e))}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function vs(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}function ws(e){return e.includes("next dev")?e.replaceAll("bun --bun","bun"):e}const Os={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=!t.e2e&&void 0===t.start&&void 0===t.unit;for(const i of n.descendants){const n=i.packageJson.dependencies||{},r=i.packageJson.devDependencies||{};let o;o=n.blitz?fs:n.next?gs:r["@remix-run/dev"]?ys:ls.some((e=>n[e]))&&!n["firebase-functions"]?ps:ms,s&&(t={...t,e2e:l.existsSync(e.join(i.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:l.existsSync(e.join(i.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${i.name} ...`);const a=[];if(!t.ci){switch(t.unit&&a.push(Nn(o.testUnit(i,t),i,t,{timeout:t.unitTimeout})),t.start&&a.push(Nn(o.testStart(i,t),i,t)),await Promise.all(a),t.e2e){case void 0:case"none":continue;case"":case"headless":await Nn(o.testE2E(i,t,{}),i,t);continue;case"headless-dev":await Nn(o.testE2EDev(i,t,{}),i,t);continue;case"docker":await Es(i,t,o);continue;case"docker-debug":await Es(i,t,o,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||r["@remix-run/dev"])switch(t.e2e){case"headed":await Nn(o.testE2E(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),i,t);continue;case"headed-dev":await Nn(o.testE2EDev(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),i,t);continue;case"debug":await Nn(o.testE2E(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),i,t);continue;case"generate":await Nn(o.testE2E(i,t,{playwrightArgs:"codegen http://localhost:8080"}),i,t);continue;case"trace":await Nn("BUN playwright show-trace",i,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await Mn(ds.stopAll(),i,t),t.unit&&await Mn(o.testUnit(i,t).replaceAll(" --allowOnly",""),i,t,{timeout:t.unitTimeout}),t.start&&await Mn(o.testStart(i,t),i,t),await Sn.promiseAll(),"none"!==t.e2e){i.hasDockerfile&&await Nn(`${o.buildDocker(i,"test")}`,i,t);const e=i.hasDockerfile?{startCommand:ds.stopAndStart(i,!0)}:{};process.exitCode=await Nn(o.testE2E(i,t,e).replaceAll(" --allowOnly",""),i,t,{exitIfFailed:!1}),await Nn(ds.stop(i),i,t)}}}(t)}};async function Es(e,t,n,s){await Nn(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await Nn(`${n.testE2E(e,t,{playwrightArgs:s,startCommand:ds.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await Nn(ds.stop(e),e,t)}const ks={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await wn(e,!1);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const s=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&s.push("YARN pyright")),s.length>0)return Mn(s.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),s=await Promise.all(n);let i=0;for(const[e,n]of s.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=n}i&&process.exit(i)}},As={...ks,command:"tc"},js={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};var $s;await an(($s=process.argv,$s.slice(te()+1))).scriptName("wb").options(js).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(En).command(Bn).command(Vn).command(Gn).command(cs).command(hs).command(bs).command(Os).command(ks).command(As).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvbGliL3N0cmluZy11dGlscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3N0cmluZy11dGlscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci10eXBlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvdG9rZW5pemUtYXJnLXN0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi95ZXJyb3IuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9saWIvcGxhdGZvcm0tc2hpbXMvZXNtLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZXNjYWxhZGUvc3luYy9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9pcy1wcm9taXNlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9wYXJzZS1jb21tYW5kLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9hcmdzZXJ0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9taWRkbGV3YXJlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9tYXliZS1hc3luYy1yZXN1bHQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL2NvbW1hbmQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3lhcmdzLWZhY3RvcnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL3doaWNoLW1vZHVsZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvb2JqLWZpbHRlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvc2V0LWJsb2NraW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91c2FnZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tcGxldGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tcGxldGlvbi10ZW1wbGF0ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2xldmVuc2h0ZWluLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi92YWxpZGF0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9hcHBseS1leHRlbmRzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2luZGV4Lm1qcyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2hhc2guanMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgY2FjaGVFbmFibGVkID0gdHJ1ZVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMpO1xuICB9XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qgb3JnRW52VmFycyA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgZW52VmFycyA9IHsgLi4ucmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCksIGNhY2hlRW5hYmxlZCksIC4uLmVudlZhcnMgfTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgICBpZiAob3JnRW52VmFyc1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBvcmdFbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlczpgLCBlbnZQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudiksIGNhY2hlRW5hYmxlZCkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIGNhY2hlRW5hYmxlZCA9IHRydWVcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbnZWYXJzID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCwgY2FjaGVFbmFibGVkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNhY2hlRW5hYmxlZCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVFbmFibGVkICYmIGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5leHBvcnQgdmFyIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5O1xuKGZ1bmN0aW9uIChEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSkge1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQk9PTEVBTlwiXSA9IFwiYm9vbGVhblwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiU1RSSU5HXCJdID0gXCJzdHJpbmdcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIk5VTUJFUlwiXSA9IFwibnVtYmVyXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJBUlJBWVwiXSA9IFwiYXJyYXlcIjtcbn0pKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5IHx8IChEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSA9IHt9KSk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5pbXBvcnQgeyB0b2tlbml6ZUFyZ1N0cmluZyB9IGZyb20gJy4vdG9rZW5pemUtYXJnLXN0cmluZy5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB9IGZyb20gJy4veWFyZ3MtcGFyc2VyLXR5cGVzLmpzJztcbmltcG9ydCB7IGNhbWVsQ2FzZSwgZGVjYW1lbGl6ZSwgbG9va3NMaWtlTnVtYmVyIH0gZnJvbSAnLi9zdHJpbmctdXRpbHMuanMnO1xubGV0IG1peGluO1xuZXhwb3J0IGNsYXNzIFlhcmdzUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihfbWl4aW4pIHtcbiAgICAgICAgbWl4aW4gPSBfbWl4aW47XG4gICAgfVxuICAgIHBhcnNlKGFyZ3NJbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJyYXk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvb2xlYW46IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29lcmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb3VudDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW52UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuYXJnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBub3JtYWxpemU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0cmluZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbnVtYmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBfXzogdW5kZWZpbmVkLFxuICAgICAgICAgICAga2V5OiB1bmRlZmluZWRcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIGFsbG93IGEgc3RyaW5nIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCBpbiByYXRoZXJcbiAgICAgICAgLy8gdGhhbiBhbiBhcmd2IGFycmF5LlxuICAgICAgICBjb25zdCBhcmdzID0gdG9rZW5pemVBcmdTdHJpbmcoYXJnc0lucHV0KTtcbiAgICAgICAgLy8gdG9rZW5pemVBcmdTdHJpbmcgYWRkcyBleHRyYSBxdW90ZXMgdG8gYXJncyBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgLy8gb25seSBzdHJpcCB0aG9zZSBleHRyYSBxdW90ZXMgaW4gcHJvY2Vzc1ZhbHVlIGlmIGFyZ3NJbnB1dCBpcyBhIHN0cmluZ1xuICAgICAgICBjb25zdCBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGFyZ3NJbnB1dCA9PT0gJ3N0cmluZyc7XG4gICAgICAgIC8vIGFsaWFzZXMgbWlnaHQgaGF2ZSB0cmFuc2l0aXZlIHJlbGF0aW9uc2hpcHMsIG5vcm1hbGl6ZSB0aGlzLlxuICAgICAgICBjb25zdCBhbGlhc2VzID0gY29tYmluZUFsaWFzZXMoT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBvcHRzLmFsaWFzKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICdib29sZWFuLW5lZ2F0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdjYW1lbC1jYXNlLWV4cGFuc2lvbic6IHRydWUsXG4gICAgICAgICAgICAnY29tYmluZS1hcnJheXMnOiBmYWxzZSxcbiAgICAgICAgICAgICdkb3Qtbm90YXRpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2R1cGxpY2F0ZS1hcmd1bWVudHMtYXJyYXknOiB0cnVlLFxuICAgICAgICAgICAgJ2ZsYXR0ZW4tZHVwbGljYXRlLWFycmF5cyc6IHRydWUsXG4gICAgICAgICAgICAnZ3JlZWR5LWFycmF5cyc6IHRydWUsXG4gICAgICAgICAgICAnaGFsdC1hdC1ub24tb3B0aW9uJzogZmFsc2UsXG4gICAgICAgICAgICAnbmFyZ3MtZWF0cy1vcHRpb25zJzogZmFsc2UsXG4gICAgICAgICAgICAnbmVnYXRpb24tcHJlZml4JzogJ25vLScsXG4gICAgICAgICAgICAncGFyc2UtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJzogdHJ1ZSxcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogZmFsc2UsXG4gICAgICAgICAgICAnc2V0LXBsYWNlaG9sZGVyLWtleSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3Nob3J0LW9wdGlvbi1ncm91cHMnOiB0cnVlLFxuICAgICAgICAgICAgJ3N0cmlwLWFsaWFzZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICdzdHJpcC1kYXNoZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IGZhbHNlXG4gICAgICAgIH0sIG9wdHMuY29uZmlndXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBvcHRzLmRlZmF1bHQpO1xuICAgICAgICBjb25zdCBjb25maWdPYmplY3RzID0gb3B0cy5jb25maWdPYmplY3RzIHx8IFtdO1xuICAgICAgICBjb25zdCBlbnZQcmVmaXggPSBvcHRzLmVudlByZWZpeDtcbiAgICAgICAgY29uc3Qgbm90RmxhZ3NPcHRpb24gPSBjb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzQXJndiA9IG5vdEZsYWdzT3B0aW9uID8gJy0tJyA6ICdfJztcbiAgICAgICAgY29uc3QgbmV3QWxpYXNlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIGFsbG93IGEgaTE4biBoYW5kbGVyIHRvIGJlIHBhc3NlZCBpbiwgZGVmYXVsdCB0byBhIGZha2Ugb25lICh1dGlsLmZvcm1hdCkuXG4gICAgICAgIGNvbnN0IF9fID0gb3B0cy5fXyB8fCBtaXhpbi5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGZsYWdzID0ge1xuICAgICAgICAgICAgYWxpYXNlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIGFycmF5czogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIGJvb2xzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgc3RyaW5nczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG51bWJlcnM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb3VudHM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBub3JtYWxpemU6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb25maWdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbmFyZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb2VyY2lvbnM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBrZXlzOiBbXVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZWdhdGl2ZSA9IC9eLShbMC05XSsoXFwuWzAtOV0rKT98XFwuWzAtOV0rKSQvO1xuICAgICAgICBjb25zdCBuZWdhdGVkQm9vbGVhbiA9IG5ldyBSZWdFeHAoJ14tLScgKyBjb25maWd1cmF0aW9uWyduZWdhdGlvbi1wcmVmaXgnXSArICcoLispJyk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmFycmF5IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JyA/IG9wdC5rZXkgOiBvcHQ7XG4gICAgICAgICAgICAvLyBhc3NpZ24gdG8gZmxhZ3NbYm9vbHN8c3RyaW5nc3xudW1iZXJzXVxuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICAvLyBhc3NpZ24ga2V5IHRvIGJlIGNvZXJjZWRcbiAgICAgICAgICAgIGlmIChhc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3NbYXNzaWdubWVudF1ba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmbGFncy5hcnJheXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmJvb2xlYW4gfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLmJvb2xzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5zdHJpbmcgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLnN0cmluZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm51bWJlciB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3MubnVtYmVyc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuY291bnQgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLmNvdW50c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMubm9ybWFsaXplIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ub3JtYWxpemVba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5uYXJnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5uYXJnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5uYXJnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5jb2VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRzLmNvZXJjZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb2VyY2lvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5jb25maWcpIHx8IHR5cGVvZiBvcHRzLmNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIGxvb2t1cCB0YWJsZSB0aGF0IHRha2VzIGludG8gYWNjb3VudCBhbGxcbiAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIGFsaWFzZXM6IHtmOiBbJ2ZvbyddLCBmb286IFsnZiddfVxuICAgICAgICBleHRlbmRBbGlhc2VzKG9wdHMua2V5LCBhbGlhc2VzLCBvcHRzLmRlZmF1bHQsIGZsYWdzLmFycmF5cyk7XG4gICAgICAgIC8vIGFwcGx5IGRlZmF1bHQgdmFsdWVzIHRvIGFsbCBhbGlhc2VzLlxuICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzW2FsaWFzXSA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbigpO1xuICAgICAgICBsZXQgbm90RmxhZ3MgPSBbXTtcbiAgICAgICAgY29uc3QgYXJndiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgeyBfOiBbXSB9KTtcbiAgICAgICAgLy8gVE9ETyhiY29lKTogZm9yIHRoZSBmaXJzdCBwYXNzIGF0IHJlbW92aW5nIG9iamVjdCBwcm90b3R5cGUgIHdlIGRpZG4ndFxuICAgICAgICAvLyByZW1vdmUgYWxsIHByb3RvdHlwZXMgZnJvbSBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgQVBJLCB3ZSBtaWdodCB3YW50XG4gICAgICAgIC8vIHRvIGdyYWR1YWxseSBtb3ZlIHRvd2FyZHMgZG9pbmcgc28uXG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gYW55IHVua25vd24gb3B0aW9uIChleGNlcHQgZm9yIGVuZC1vZi1vcHRpb25zLCBcIi0tXCIpXG4gICAgICAgICAgICBpZiAoYXJnICE9PSAnLS0nICYmIC9eLS8udGVzdChhcmcpICYmIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykpIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgICAgIC8vIC0tLSwgLS0tPSwgLS0tLSwgZXRjLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHJ1bmNhdGVkQXJnLm1hdGNoKC9eLS0tKyg9fCQpLykpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zIHdpdGhvdXQga2V5IG5hbWUgYXJlIGludmFsaWQuXG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyAtLSBzZXBhcmF0ZWQgYnkgPVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKz0vKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tLis9LykpKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNpbmcgW1xcc1xcU10gaW5zdGVhZCBvZiAuIGJlY2F1c2UganMgZG9lc24ndCBzdXBwb3J0IHRoZVxuICAgICAgICAgICAgICAgIC8vICdkb3RhbGwnIHJlZ2V4IG1vZGlmaWVyLiBTZWU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTA2ODMwOC8xMzIxNlxuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIC8vIGFycmF5cyBmb3JtYXQgPSAnLS1mPWEgYiBjJ1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZj1tb25rZXkgd2FzaGluZyBjYXQnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2gobmVnYXRlZEJvb2xlYW4pICYmIGNvbmZpZ3VyYXRpb25bJ2Jvb2xlYW4tbmVnYXRpb24nXSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2gobmVnYXRlZEJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpID8gW2ZhbHNlXSA6IGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5IHNwYWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBmb3JtYXQgPSAnLS1mb28gYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLS1mb28gYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdHJ1dGh5IGV2ZW4gaWY6IGZsYWdzLm5hcmdzW2tleV0gPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAoIW5leHQubWF0Y2goL14tLykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG90LW5vdGF0aW9uIGZsYWcgc2VwYXJhdGVkIGJ5ICc9Jy5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLis9LykpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLShbXj1dKyk9KFtcXHNcXFNdKikkLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEFyZyhtWzFdLCBtWzJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG90LW5vdGF0aW9uIGZsYWcgc2VwYXJhdGVkIGJ5IHNwYWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKC5cXC4uKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAhbmV4dC5tYXRjaCgvXi0vKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVteLV0rLykgJiYgIWFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBsZXR0ZXJzID0gYXJnLnNsaWNlKDEsIC0xKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICAgICAgYnJva2VuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0gPT09ICc9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhcmcuc2xpY2UoaiArIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gbGV0dGVyc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mPWEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGxldHRlciBpcyBhbiBhbHBoYWJldGljIGNoYXJhY3RlciBhbmQgbmV4dCB2YWx1ZSBpcyBhIG51bWJlclxuICAgICAgICAgICAgICAgICAgICBpZiAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKG5leHQsIGZsYWdzLmJvb2xzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhsZXR0ZXJzW2pdLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgZGVmYXVsdFZhbHVlKGxldHRlcnNbal0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoLTEpWzBdO1xuICAgICAgICAgICAgICAgIGlmICghYnJva2VuICYmIGtleSAhPT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBmb3JtYXQgPSAnLWYgYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLWYgYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdHJ1dGh5IGV2ZW4gaWY6IGZsYWdzLm5hcmdzW2tleV0gPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAoIS9eKC18LS0pW14tXS8udGVzdChuZXh0KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubWF0Y2gobmVnYXRpdmUpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bMC05XSQvKSAmJlxuICAgICAgICAgICAgICAgIGFyZy5tYXRjaChuZWdhdGl2ZSkgJiZcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoYXJnLnNsaWNlKDEpLCBmbGFncy5ib29scykpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUtZGlnaXQgYm9vbGVhbiBhbGlhcywgZS5nOiB4YXJncyAtMFxuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG9yZGVyIG9mIHByZWNlZGVuY2U6XG4gICAgICAgIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdcbiAgICAgICAgLy8gMi4gdmFsdWUgZnJvbSBlbnYgdmFyXG4gICAgICAgIC8vIDMuIHZhbHVlIGZyb20gY29uZmlnIGZpbGVcbiAgICAgICAgLy8gNC4gdmFsdWUgZnJvbSBjb25maWcgb2JqZWN0c1xuICAgICAgICAvLyA1LiBjb25maWd1cmVkIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIHRydWUpOyAvLyBzcGVjaWFsIGNhc2U6IGNoZWNrIGVudiB2YXJzIHRoYXQgcG9pbnQgdG8gY29uZmlnIGZpbGVcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIC8vIGZvciBhbnkgY291bnRzIGVpdGhlciBub3QgaW4gYXJncyBvciB3aXRob3V0IGFuIGV4cGxpY2l0IGRlZmF1bHQsIHNldCB0byAwXG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyAnLS0nIGRlZmF1bHRzIHRvIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKG5vdEZsYWdzT3B0aW9uICYmIG5vdEZsYWdzLmxlbmd0aClcbiAgICAgICAgICAgIGFyZ3Zbbm90RmxhZ3NBcmd2XSA9IFtdO1xuICAgICAgICBub3RGbGFncy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGFyZ3Zbbm90RmxhZ3NBcmd2XS5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSAmJiBjb25maWd1cmF0aW9uWydzdHJpcC1kYXNoZWQnXSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZmlsdGVyKGtleSA9PiBrZXkgIT09ICctLScgJiYga2V5LmluY2x1ZGVzKCctJykpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgYXJndltrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWFsaWFzZWQnXSkge1xuICAgICAgICAgICAgO1xuICAgICAgICAgICAgW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKGFsaWFzZXMpLm1hcChrID0+IGFsaWFzZXNba10pKS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSAmJiBhbGlhcy5pbmNsdWRlcygnLScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzLnNwbGl0KCcuJykubWFwKHByb3AgPT4gY2FtZWxDYXNlKHByb3ApKS5qb2luKCcuJyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhc107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQdXNoIGFyZ3VtZW50IGludG8gcG9zaXRpb25hbCBhcnJheSwgYXBwbHlpbmcgbnVtZXJpYyBjb2VyY2lvbjpcbiAgICAgICAgZnVuY3Rpb24gcHVzaFBvc2l0aW9uYWwoYXJnKSB7XG4gICAgICAgICAgICBjb25zdCBtYXliZUNvZXJjZWROdW1iZXIgPSBtYXliZUNvZXJjZU51bWJlcignXycsIGFyZyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1heWJlQ29lcmNlZE51bWJlciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG1heWJlQ29lcmNlZE51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBhcmd2Ll8ucHVzaChtYXliZUNvZXJjZWROdW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhvdyBtYW55IGFyZ3VtZW50cyBzaG91bGQgd2UgY29uc3VtZSwgYmFzZWRcbiAgICAgICAgLy8gb24gdGhlIG5hcmdzIG9wdGlvbj9cbiAgICAgICAgZnVuY3Rpb24gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCBhcmdBZnRlckVxdWFsU2lnbikge1xuICAgICAgICAgICAgbGV0IGlpO1xuICAgICAgICAgICAgbGV0IHRvRWF0ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgLy8gTmFOIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIGFycmF5IHR5cGUsIGluZGljYXRpbmcgdGhhdCBvbmUgb3JcbiAgICAgICAgICAgIC8vIG1vcmUgdmFsdWVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICAgIHRvRWF0ID0gdHlwZW9mIHRvRWF0ICE9PSAnbnVtYmVyJyB8fCBpc05hTih0b0VhdCkgPyAxIDogdG9FYXQ7XG4gICAgICAgICAgICBpZiAodG9FYXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdBcmd1bWVudCB1bmV4cGVjdGVkIGZvcjogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZSA9IGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSA/IDAgOiAxO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ25hcmdzLWVhdHMtb3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xhc3NpYyBiZWhhdmlvciwgeWFyZ3MgZWF0cyBwb3NpdGlvbmFsIGFuZCBkYXNoIGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAoaSArIDEpICsgYXZhaWxhYmxlIDwgdG9FYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0b0VhdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5hcmdzIHdpbGwgbm90IGNvbnN1bWUgZmxhZyBhcmd1bWVudHMsIGUuZy4sIC1hYmMsIC0tZm9vLFxuICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGVzIHdoZW4gb25lIGlzIG9ic2VydmVkLlxuICAgICAgICAgICAgICAgIGZvciAoaWkgPSBpICsgMTsgaWkgPCBhcmdzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3NbaWldLm1hdGNoKC9eLVteMC05XS8pIHx8IGFyZ3NbaWldLm1hdGNoKG5lZ2F0aXZlKSB8fCBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmdzW2lpXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUrKztcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCB0b0VhdClcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvbnN1bWVkID0gTWF0aC5taW4oYXZhaWxhYmxlLCB0b0VhdCk7XG4gICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiBjb25zdW1lZCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdBZnRlckVxdWFsU2lnbik7XG4gICAgICAgICAgICAgICAgY29uc3VtZWQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaWkgPSBpICsgMTsgaWkgPCAoY29uc3VtZWQgKyBpICsgMSk7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzW2lpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGkgKyBjb25zdW1lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIGFuIGFycmF5LCBlYXQgYWxsIG5vbi1oeXBoZW5hdGVkIGFyZ3VtZW50c1xuICAgICAgICAvLyBmb2xsb3dpbmcgaXQuLi4gWVVNIVxuICAgICAgICAvLyBlLmcuLCAtLWZvbyBhcHBsZSBiYW5hbmEgY2F0IGJlY29tZXMgW1wiYXBwbGVcIiwgXCJiYW5hbmFcIiwgXCJjYXRcIl1cbiAgICAgICAgZnVuY3Rpb24gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCBhcmdBZnRlckVxdWFsU2lnbikge1xuICAgICAgICAgICAgbGV0IGFyZ3NUb1NldCA9IFtdO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBhcmdBZnRlckVxdWFsU2lnbiB8fCBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgIC8vIElmIGJvdGggYXJyYXkgYW5kIG5hcmdzIGFyZSBjb25maWd1cmVkLCBlbmZvcmNlIHRoZSBuYXJncyBjb3VudDpcbiAgICAgICAgICAgIGNvbnN0IG5hcmdzQ291bnQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICEoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSkge1xuICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNVbmRlZmluZWQobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAoaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIC9eLS8udGVzdChuZXh0KSAmJiAhbmVnYXRpdmUudGVzdChuZXh0KSAmJiAhaXNVbmtub3duT3B0aW9uQXNBcmcobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGtleXMgd2l0aG91dCB2YWx1ZSA9PT4gYXJnc1RvU2V0IHJlbWFpbnMgYW4gZW1wdHkgW11cbiAgICAgICAgICAgICAgICAvLyBzZXQgdXNlciBkZWZhdWx0IHZhbHVlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHZhbHVlIGluIC0tb3B0aW9uPXZhbHVlIGlzIGVhdGVuIGFzIGlzXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2gocHJvY2Vzc1ZhbHVlKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24sIHRydWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhcmdzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFjb25maWd1cmF0aW9uWydncmVlZHktYXJyYXlzJ10gJiYgYXJnc1RvU2V0Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobmFyZ3NDb3VudCAmJiB0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgYXJnc1RvU2V0Lmxlbmd0aCA+PSBuYXJnc0NvdW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBpaTtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2gocHJvY2Vzc1ZhbHVlKGtleSwgbmV4dCwgaW5wdXRJc1N0cmluZykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGJvdGggYXJyYXkgYW5kIG5hcmdzIGFyZSBjb25maWd1cmVkLCBjcmVhdGUgYW4gZXJyb3IgaWYgbGVzcyB0aGFuXG4gICAgICAgICAgICAvLyBuYXJncyBwb3NpdGlvbmFscyB3ZXJlIGZvdW5kLiBOYU4gaGFzIHNwZWNpYWwgbWVhbmluZywgaW5kaWNhdGluZ1xuICAgICAgICAgICAgLy8gdGhhdCBhdCBsZWFzdCBvbmUgdmFsdWUgaXMgcmVxdWlyZWQgKG1vcmUgYXJlIG9rYXkpLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXJnc0NvdW50ID09PSAnbnVtYmVyJyAmJiAoKG5hcmdzQ291bnQgJiYgYXJnc1RvU2V0Lmxlbmd0aCA8IG5hcmdzQ291bnQpIHx8XG4gICAgICAgICAgICAgICAgKGlzTmFOKG5hcmdzQ291bnQpICYmIGFyZ3NUb1NldC5sZW5ndGggPT09IDApKSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NUb1NldCk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRBcmcoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzID0gaW5wdXRJc1N0cmluZykge1xuICAgICAgICAgICAgaWYgKC8tLy50ZXN0KGtleSkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0ga2V5LnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1lbENhc2UocHJvcCk7XG4gICAgICAgICAgICAgICAgfSkuam9pbignLicpO1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzVmFsdWUoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0S2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBzZXRLZXkoYXJndiwgc3BsaXRLZXksIHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBwb3B1bGF0aW5nIGFsaWFzZXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSBwb3B1bGF0aW5nIGFsaWFzZXMgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGRvdC1ub3RhdGlvbiBrZXlcbiAgICAgICAgICAgIGlmIChzcGxpdEtleS5sZW5ndGggPiAxICYmIGNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwYW5kIGFsaWFzIHdpdGggbmVzdGVkIG9iamVjdHMgaW4ga2V5XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBbXS5jb25jYXQoc3BsaXRLZXkpO1xuICAgICAgICAgICAgICAgICAgICBhLnNoaWZ0KCk7IC8vIG51a2UgdGhlIG9sZCBrZXkuXG4gICAgICAgICAgICAgICAgICAgIGtleVByb3BlcnRpZXMgPSBrZXlQcm9wZXJ0aWVzLmNvbmNhdChhKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgYWxpYXMgb25seSBpZiBpcyBub3QgYWxyZWFkeSBhbiBhbGlhcyBvZiB0aGUgZnVsbCBrZXlcbiAgICAgICAgICAgICAgICAgICAgLy8gKGFscmVhZHkgcG9wdWxhdGVkIGFib3ZlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IG5vcm1hbGl6ZSBnZXR0ZXIgYW5kIHNldHRlciB3aGVuIGtleSBpcyBpbiAnbm9ybWFsaXplJyBidXQgaXNuJ3QgYW4gYXJyYXlcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ub3JtYWxpemUpICYmICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pO1xuICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcmd2UmV0dXJuLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbWl4aW4ubm9ybWFsaXplKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhZGROZXdBbGlhcyhrZXksIGFsaWFzKSB7XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gJiYgZmxhZ3MuYWxpYXNlc1trZXldLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbYWxpYXNdO1xuICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbYWxpYXNdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNbYWxpYXNdICYmIGZsYWdzLmFsaWFzZXNbYWxpYXNdLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhhbGlhcywga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzVmFsdWUoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzKSB7XG4gICAgICAgICAgICAvLyBzdHJpbmdzIG1heSBiZSBxdW90ZWQsIGNsZWFuIHRoaXMgdXAgYXMgd2UgYXNzaWduIHZhbHVlcy5cbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcGFyc2luZyBib29sZWFuIGFyZ3VtZW50cyAtLWZvbz10cnVlIC0tYmFyIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSB8fCBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgPT09ICd0cnVlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsKVxuICAgICAgICAgICAgICAgID8gdmFsLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2KTsgfSlcbiAgICAgICAgICAgICAgICA6IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsKTtcbiAgICAgICAgICAgIC8vIGluY3JlbWVudCBhIGNvdW50IGdpdmVuIGFzIGFyZyAoZWl0aGVyIG5vIHZhbHVlIG9yIHZhbHVlIHBhcnNlZCBhcyBib29sZWFuKVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IG5vcm1hbGl6ZWQgdmFsdWUgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYW5kIGluICdhcnJheXMnXG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWwubWFwKCh2YWwpID0+IHsgcmV0dXJuIG1peGluLm5vcm1hbGl6ZSh2YWwpOyB9KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWl4aW4ubm9ybWFsaXplKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnXSAmJiBrZXkgPT09ICdfJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpICYmICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ29lcmNlTnVtYmVyID0gbG9va3NMaWtlTnVtYmVyKHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydwYXJzZS1udW1iZXJzJ10gJiYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKE1hdGguZmxvb3IocGFyc2VGbG9hdChgJHt2YWx1ZX1gKSkpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ29lcmNlTnVtYmVyIHx8ICghaXNVbmRlZmluZWQodmFsdWUpICYmIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnLmpzb24gZmlsZSwgdGhpcyBzaG91bGQgYmVcbiAgICAgICAgLy8gYXBwbGllZCBsYXN0IHNvIHRoYXQgZGVmYXVsdHMgY2FuIGJlIGFwcGxpZWQuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZyhhcmd2KSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgLy8gZXhwYW5kIGRlZmF1bHRzL2FsaWFzZXMsIGluLWNhc2UgYW55IGhhcHBlbiB0byByZWZlcmVuY2VcbiAgICAgICAgICAgIC8vIHRoZSBjb25maWcuanNvbiBmaWxlLlxuICAgICAgICAgICAgYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMoY29uZmlnTG9va3VwLCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb25maWdzKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdLZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWdQYXRoID0gYXJndltjb25maWdLZXldIHx8IGNvbmZpZ0xvb2t1cFtjb25maWdLZXldO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnUGF0aCA9IG1peGluLnJlc29sdmUobWl4aW4uY3dkKCksIGNvbmZpZ1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZUNvbmZpZyA9IGZsYWdzLmNvbmZpZ3NbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZUNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHJlc29sdmVDb25maWcocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWl4aW4ucmVxdWlyZShyZXNvbHZlZENvbmZpZ1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZW5vIHdpbGwgcmVjZWl2ZSBhIFBlcm1pc3Npb25EZW5pZWQgZXJyb3IgaWYgYW4gYXR0ZW1wdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFkZSB0byBsb2FkIGNvbmZpZyB3aXRob3V0IHRoZSAtLWFsbG93LXJlYWQgZmxhZzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleC5uYW1lID09PSAnUGVybWlzc2lvbkRlbmllZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3ZbY29uZmlnS2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIEpTT04gY29uZmlnIGZpbGU6ICVzJywgY29uZmlnUGF0aCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGFyZ3MgZnJvbSBjb25maWcgb2JqZWN0LlxuICAgICAgICAvLyBpdCByZWN1cnNpdmVseSBjaGVja3MgbmVzdGVkIG9iamVjdHMuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdChjb25maWcsIHByZXYpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxsS2V5ID0gcHJldiA/IHByZXYgKyAnLicgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIGlubmVyIG9iamVjdCBhbmQgd2UgaGF2ZSBkb3Qtbm90YXRpb25cbiAgICAgICAgICAgICAgICAvLyBlbmFibGVkLCB0cmVhdCBpbm5lciBvYmplY3RzIGluIGNvbmZpZyB0aGUgc2FtZSBhc1xuICAgICAgICAgICAgICAgIC8vIGhlYXZpbHkgbmVzdGVkIGRvdCBub3RhdGlvbnMgKGZvby5iYXIuYXBwbGUpLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IGJ1dCBub3QgYW4gYXJyYXksIGNoZWNrIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgYXJndW1lbnRzIHZpYSBDTEkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyB3aXRoaW4gdGhlIGNvbmZpZyBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBmdWxsS2V5LnNwbGl0KCcuJykpIHx8IChjaGVja0FsbEFsaWFzZXMoZnVsbEtleSwgZmxhZ3MuYXJyYXlzKSAmJiBjb25maWd1cmF0aW9uWydjb21iaW5lLWFycmF5cyddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGZ1bGxLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhbGwgY29uZmlnIG9iamVjdHMgcGFzc2VkIGluIG9wdHNcbiAgICAgICAgZnVuY3Rpb24gc2V0Q29uZmlnT2JqZWN0cygpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnT2JqZWN0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb25maWdPYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGNvbmZpZ09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QoY29uZmlnT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUVudlZhcnMoYXJndiwgY29uZmlnT25seSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnZQcmVmaXggPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHR5cGVvZiBlbnZQcmVmaXggPT09ICdzdHJpbmcnID8gZW52UHJlZml4IDogJyc7XG4gICAgICAgICAgICBjb25zdCBlbnYgPSBtaXhpbi5lbnYoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChmdW5jdGlvbiAoZW52VmFyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycgfHwgZW52VmFyLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGFycmF5IG9mIG5lc3RlZCBrZXlzIGFuZCBjb252ZXJ0IHRoZW0gdG8gY2FtZWwgY2FzZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkgeyAvLyBJZiB3ZSBoYXZlbid0IGFscmVhZHkgY29lcmNlZCB0aGlzIG9wdGlvbiB2aWEgb25lIG9mIGl0cyBhbGlhc2VzXG4gICAgICAgICAgICAgICAgICAgIGNvZXJjZSA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvZXJjaW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29lcmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCBjb2VyY2UoYXJndltrZXldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSkpLmZvckVhY2goYWxpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZC5hZGQoYWxpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlthbGldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlcktleXMoYXJndikge1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgcGxhY2Vob2xkZXIga2V5cyBmb3IgZG90IG5vdGF0aW9uIG9wdGlvbnMgJ2Zvby5iYXInLlxuICAgICAgICAgICAgICAgIGlmICh+a2V5LmluZGV4T2YoJy4nKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndltrZXldID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICAgICAgYXJndltrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhvYmosIGFsaWFzZXMsIGRlZmF1bHRzLCBjYW5Mb2cgPSBmYWxzZSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KG9iaiwga2V5LnNwbGl0KCcuJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIGtleS5zcGxpdCgnLicpLCBkZWZhdWx0c1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkxvZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRlZFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgKGFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0tleShvYmosIHguc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwgeC5zcGxpdCgnLicpLCBkZWZhdWx0c1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzS2V5KG9iaiwga2V5cykge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgbyA9IChvW2tleV0gfHwge30pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5IGluIG87XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0S2V5KG9iaiwga2V5cywgdmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8oYmNvZSk6IGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgeWFyZ3MsIHN3aXRjaCB0b1xuICAgICAgICAgICAgICAgIC8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbiAgICAgICAgICAgICAgICBrZXkgPSBzYW5pdGl6ZUtleShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgb1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgb1trZXldIGlzIGFuIGFycmF5LCBhbmQgdGhhdCB0aGUgbGFzdCBpdGVtIGlzIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trZXldLnB1c2goe30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trZXldID0gW29ba2V5XSwge31dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBlbXB0eSBvYmplY3QgYXQgdGhlIGVuZCBvZiB0aGUgb1trZXldIGFycmF5LCBzbyBzZXQgbyB0byB0aGF0IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNhbml0aXplS2V5KGtleXNba2V5cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBjb25zdCBpc1R5cGVBcnJheSA9IGNoZWNrQWxsQWxpYXNlcyhrZXlzLmpvaW4oJy4nKSwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsdWVBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgbGV0IGR1cGxpY2F0ZSA9IGNvbmZpZ3VyYXRpb25bJ2R1cGxpY2F0ZS1hcmd1bWVudHMtYXJyYXknXTtcbiAgICAgICAgICAgIC8vIG5hcmdzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBkdXBsaWNhdGVcbiAgICAgICAgICAgIGlmICghZHVwbGljYXRlICYmIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCghaXNVbmRlZmluZWQob1trZXldKSAmJiBmbGFncy5uYXJnc1trZXldID09PSAxKSB8fCAoQXJyYXkuaXNBcnJheShvW2tleV0pICYmIG9ba2V5XS5sZW5ndGggPT09IGZsYWdzLm5hcmdzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGluY3JlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaW5jcmVtZW50KG9ba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlICYmIGlzVHlwZUFycmF5ICYmIGlzVmFsdWVBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBjb25maWd1cmF0aW9uWydmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnXSA/IG9ba2V5XS5jb25jYXQodmFsdWUpIDogKEFycmF5LmlzQXJyYXkob1trZXldWzBdKSA/IG9ba2V5XSA6IFtvW2tleV1dKS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFkdXBsaWNhdGUgJiYgQm9vbGVhbihpc1R5cGVBcnJheSkgPT09IEJvb2xlYW4oaXNWYWx1ZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IG9ba2V5XS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob1trZXldID09PSB1bmRlZmluZWQgJiYgaXNUeXBlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBvW2tleV0gPSBpc1ZhbHVlQXJyYXkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkdXBsaWNhdGUgJiYgIShvW2tleV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpKSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gW29ba2V5XSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXh0ZW5kIHRoZSBhbGlhc2VzIGxpc3Qgd2l0aCBpbmZlcnJlZCBhbGlhc2VzLlxuICAgICAgICBmdW5jdGlvbiBleHRlbmRBbGlhc2VzKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqIHx8IHt9KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGEga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBhbGlhc2VzIGFycmF5LCBmb3IgZXhhbXBsZSBpdCBtaWdodFxuICAgICAgICAgICAgICAgICAgICAvLyBleGlzdCBpbiBib3RoICdvcHRzLmRlZmF1bHQnIGFuZCAnb3B0cy5rZXknLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFwiLS1vcHRpb24tbmFtZVwiLCBhbHNvIHNldCBhcmd2Lm9wdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFwiLS1vcHRpb25OYW1lXCIsIGFsc28gc2V0IGFyZ3ZbJ29wdGlvbi1uYW1lJ11cbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJhc2VkIG9uIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBzaG9ydCBmbGFnIGdyb3VwIHBhcnNpbmcgbG9naWNcbiAgICAgICAgZnVuY3Rpb24gaGFzQWxsU2hvcnRGbGFncyhhcmcpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIsIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHNpbmdsZSBoeXBoZW4sIGl0J3Mgbm90IGEgc2hvcnQgZmxhZyBncm91cFxuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkgfHwgIWFyZy5tYXRjaCgvXi1bXi1dKy8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGhhc0FsbEZsYWdzID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgY29uc3QgbGV0dGVycyA9IGFyZy5zbGljZSgxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxldHRlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0FueUZsYWcobGV0dGVyc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQWxsRmxhZ3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0gPT09ICc9JykgfHxcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9PT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgICAgICgvW0EtWmEtel0vLnRlc3QobGV0dGVyc1tqXSkgJiYgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXS5tYXRjaCgvXFxXLykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNBbGxGbGFncztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uWyd1bmtub3duLW9wdGlvbnMtYXMtYXJncyddICYmIGlzVW5rbm93bk9wdGlvbihhcmcpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbihhcmcpIHtcbiAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0nKTtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBuZWdhdGl2ZSBudW1iZXJzXG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzaG9ydCBvcHRpb24gZ3JvdXAgYW5kIGFsbCBvZiB0aGVtIGFyZSBjb25maWd1cmVkLCBpdCBpc24ndCB1bmtub3duXG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZS5nLiAnLS1jb3VudD0yJ1xuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYScgb3IgJy0tYXJnJ1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsRmxhZyA9IC9eLSsoW149XSs/KSQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEtJ1xuICAgICAgICAgICAgY29uc3QgZmxhZ0VuZGluZ0luSHlwaGVuID0gL14tKyhbXj1dKz8pLSQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWFiYzEyMydcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkRpZ2l0cyA9IC9eLSsoW149XSs/XFxkKykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hL3Vzci9sb2NhbCdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbk5vbldvcmRDaGFyYWN0ZXJzID0gL14tKyhbXj1dKz8pXFxXKy4qJC87XG4gICAgICAgICAgICAvLyBjaGVjayB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGZsYWcgc3R5bGVzLCBpbmNsdWRpbmcgbmVnYXRlZEJvb2xlYW4sIGEgcGF0dGVybiBkZWZpbmVkIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBtZXRob2RcbiAgICAgICAgICAgIHJldHVybiAhaGFzRmxhZ3NNYXRjaGluZyhhcmcsIGZsYWdXaXRoRXF1YWxzLCBuZWdhdGVkQm9vbGVhbiwgbm9ybWFsRmxhZywgZmxhZ0VuZGluZ0luSHlwaGVuLCBmbGFnRW5kaW5nSW5EaWdpdHMsIGZsYWdFbmRpbmdJbk5vbldvcmRDaGFyYWN0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcGljayBhIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgLy8gZm9yIGFuIG9wdGlvbiBiYXNlZCBvbiBuYW1lIGFuZCB0eXBlLlxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0VmFsdWUoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmXG4gICAgICAgICAgICAgICAgYCR7a2V5fWAgaW4gZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Rm9yVHlwZShndWVzc1R5cGUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSwgZ2l2ZW4gdGhlIHR5cGUgb2YgYSBmbGFnLixcbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdEZvclR5cGUodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgZGVmID0ge1xuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuU1RSSU5HXTogJycsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5Lk5VTUJFUl06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVldOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBkZWZbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2l2ZW4gYSBmbGFnLCBlbmZvcmNlIGEgZGVmYXVsdCB0eXBlLlxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHVzZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgaW5jb25zaXN0ZW5jaWVzXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGNvdW50IGtleXMgc2hvdWxkIG5vdCBiZSBzZXQgYXMgYXJyYXkvbmFyZ1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY291bnRzKS5maW5kKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBjb25maWd1cmF0aW9uOiAlcywgb3B0cy5jb3VudCBleGNsdWRlcyBvcHRzLmFycmF5LicsIGtleSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5uYXJnLicsIGtleSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLmFsaWFzZXMpLFxuICAgICAgICAgICAgYXJndjogT2JqZWN0LmFzc2lnbihhcmd2UmV0dXJuLCBhcmd2KSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBkZWZhdWx0ZWQ6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRlZCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICBuZXdBbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBuZXdBbGlhc2VzKVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIGlmIGFueSBhbGlhc2VzIHJlZmVyZW5jZSBlYWNoIG90aGVyLCB3ZSBzaG91bGRcbi8vIG1lcmdlIHRoZW0gdG9nZXRoZXIuXG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgLy8gdHVybiBhbGlhcyBsb29rdXAgaGFzaCB7a2V5OiBbJ2FsaWFzMScsICdhbGlhczInXX0gaW50b1xuICAgIC8vIGEgc2ltcGxlIGFycmF5IFsna2V5JywgJ2FsaWFzMScsICdhbGlhczInXVxuICAgIE9iamVjdC5rZXlzKGFsaWFzZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBhbGlhc0FycmF5cy5wdXNoKFtdLmNvbmNhdChhbGlhc2VzW2tleV0sIGtleSkpO1xuICAgIH0pO1xuICAgIC8vIGNvbWJpbmUgYXJyYXlzIHVudGlsIHplcm8gY2hhbmdlcyBhcmVcbiAgICAvLyBtYWRlIGluIGFuIGl0ZXJhdGlvbi5cbiAgICB3aGlsZSAoY2hhbmdlKSB7XG4gICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsaWFzQXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpaSA9IGkgKyAxOyBpaSA8IGFsaWFzQXJyYXlzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9IGFsaWFzQXJyYXlzW2ldLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNBcnJheXNbaWldLmluZGV4T2YodikgIT09IC0xO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzQXJyYXlzW2ldID0gYWxpYXNBcnJheXNbaV0uY29uY2F0KGFsaWFzQXJyYXlzW2lpXSk7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzQXJyYXlzLnNwbGljZShpaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtYXAgYXJyYXlzIGJhY2sgdG8gdGhlIGhhc2gtbG9va3VwIChkZS1kdXBlIHdoaWxlXG4gICAgLy8gd2UncmUgYXQgaXQpLlxuICAgIGFsaWFzQXJyYXlzLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzQXJyYXkpIHtcbiAgICAgICAgYWxpYXNBcnJheSA9IGFsaWFzQXJyYXkuZmlsdGVyKGZ1bmN0aW9uICh2LCBpLCBzZWxmKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKHYpID09PSBpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbGFzdEFsaWFzID0gYWxpYXNBcnJheS5wb3AoKTtcbiAgICAgICAgaWYgKGxhc3RBbGlhcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsYXN0QWxpYXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb21iaW5lZFtsYXN0QWxpYXNdID0gYWxpYXNBcnJheTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb21iaW5lZDtcbn1cbi8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYSBjb3VudCBpcyBnaXZlbiBhcyBhbiBhcmdcbi8vIGl0IGlzIE5PVCBjYWxsZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZVxuLy8gdGh1cyB3ZSBjYW4gc3RhcnQgdGhlIGNvdW50IGF0IDEgaW5zdGVhZCBvZiAwXG5mdW5jdGlvbiBpbmNyZW1lbnQob3JpZykge1xuICAgIHJldHVybiBvcmlnICE9PSB1bmRlZmluZWQgPyBvcmlnICsgMSA6IDE7XG59XG4vLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbi8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbmZ1bmN0aW9uIHNhbml0aXplS2V5KGtleSkge1xuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nKVxuICAgICAgICByZXR1cm4gJ19fX3Byb3RvX19fJztcbiAgICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gc3RyaXBRdW90ZXModmFsKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAodmFsWzBdID09PSBcIidcIiB8fCB2YWxbMF0gPT09ICdcIicpICYmXG4gICAgICAgIHZhbFt2YWwubGVuZ3RoIC0gMV0gPT09IHZhbFswXSlcbiAgICAgICAgPyB2YWwuc3Vic3RyaW5nKDEsIHZhbC5sZW5ndGggLSAxKVxuICAgICAgICA6IHZhbDtcbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbi8vIHRha2UgYW4gdW4tc3BsaXQgYXJndiBzdHJpbmcgYW5kIHRva2VuaXplIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplQXJnU3RyaW5nKGFyZ1N0cmluZykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ1N0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1N0cmluZy5tYXAoZSA9PiB0eXBlb2YgZSAhPT0gJ3N0cmluZycgPyBlICsgJycgOiBlKTtcbiAgICB9XG4gICAgYXJnU3RyaW5nID0gYXJnU3RyaW5nLnRyaW0oKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHByZXZDID0gbnVsbDtcbiAgICBsZXQgYyA9IG51bGw7XG4gICAgbGV0IG9wZW5pbmcgPSBudWxsO1xuICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgYXJnU3RyaW5nLmxlbmd0aDsgaWkrKykge1xuICAgICAgICBwcmV2QyA9IGM7XG4gICAgICAgIGMgPSBhcmdTdHJpbmcuY2hhckF0KGlpKTtcbiAgICAgICAgLy8gc3BsaXQgb24gc3BhY2VzIHVubGVzcyB3ZSdyZSBpbiBxdW90ZXMuXG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG9uJ3Qgc3BsaXQgdGhlIHN0cmluZyBpZiB3ZSdyZSBpbiBtYXRjaGluZ1xuICAgICAgICAvLyBvcGVuaW5nIG9yIGNsb3Npbmcgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGMgPT09IFwiJ1wiIHx8IGMgPT09ICdcIicpICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZ3NbaV0pXG4gICAgICAgICAgICBhcmdzW2ldID0gJyc7XG4gICAgICAgIGFyZ3NbaV0gKz0gYztcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG59XG4iLCJmdW5jdGlvbiBnZXRQcm9jZXNzQXJndkJpbkluZGV4KCkge1xuICAgIGlmIChpc0J1bmRsZWRFbGVjdHJvbkFwcCgpKVxuICAgICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGlzQnVuZGxlZEVsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiBpc0VsZWN0cm9uQXBwKCkgJiYgIXByb2Nlc3MuZGVmYXVsdEFwcDtcbn1cbmZ1bmN0aW9uIGlzRWxlY3Ryb25BcHAoKSB7XG4gICAgcmV0dXJuICEhcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoaWRlQmluKGFyZ3YpIHtcbiAgICByZXR1cm4gYXJndi5zbGljZShnZXRQcm9jZXNzQXJndkJpbkluZGV4KCkgKyAxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9jZXNzQXJndkJpbigpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5hcmd2W2dldFByb2Nlc3NBcmd2QmluSW5kZXgoKV07XG59XG4iLCJleHBvcnQgY2xhc3MgWUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1zZykge1xuICAgICAgICBzdXBlcihtc2cgfHwgJ3lhcmdzIGVycm9yJyk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdZRXJyb3InO1xuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFlFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJsZXQgc2hpbTtcbmNsYXNzIFkxOE4ge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgLy8gY29uZmlndXJhYmxlIG9wdGlvbnMuXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IG9wdHMuZGlyZWN0b3J5IHx8ICcuL2xvY2FsZXMnO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzID0gdHlwZW9mIG9wdHMudXBkYXRlRmlsZXMgPT09ICdib29sZWFuJyA/IG9wdHMudXBkYXRlRmlsZXMgOiB0cnVlO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IG9wdHMubG9jYWxlIHx8ICdlbic7XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUb0xhbmd1YWdlID0gdHlwZW9mIG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlID09PSAnYm9vbGVhbicgPyBvcHRzLmZhbGxiYWNrVG9MYW5ndWFnZSA6IHRydWU7XG4gICAgICAgIC8vIGludGVybmFsIHN0dWZmLlxuICAgICAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy53cml0ZVF1ZXVlID0gW107XG4gICAgfVxuICAgIF9fKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFnZ2VkTGl0ZXJhbChhcmd1bWVudHNbMF0sIC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBsZXQgY2IgPSBmdW5jdGlvbiAoKSB7IH07IC8vIHN0YXJ0IHdpdGggbm9vcC5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkgeyB9OyAvLyBub29wLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgLy8gd2UndmUgb2JzZXJ2ZWQgYSBuZXcgc3RyaW5nLCB1cGRhdGUgdGhlIGxhbmd1YWdlIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdID0gc3RyO1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hpbS5mb3JtYXQuYXBwbHkoc2hpbS5mb3JtYXQsIFt0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdIHx8IHN0cl0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gICAgX19uKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3Qgc2luZ3VsYXIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGNvbnN0IHBsdXJhbCA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIGxldCBzdHIgPSBxdWFudGl0eSA9PT0gMSA/IHNpbmd1bGFyIDogcGx1cmFsO1xuICAgICAgICBpZiAodGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXTtcbiAgICAgICAgICAgIHN0ciA9IGVudHJ5W3F1YW50aXR5ID09PSAxID8gJ29uZScgOiAnb3RoZXInXTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gJiYgdGhpcy51cGRhdGVGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdID0ge1xuICAgICAgICAgICAgICAgIG9uZTogc2luZ3VsYXIsXG4gICAgICAgICAgICAgICAgb3RoZXI6IHBsdXJhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2NhbGUsXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgY291bGQgY2hhbmdlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIHdyaXRlIGlzIHBlcmZvcm1lZC5cbiAgICAgICAgICAgIHRoaXMuX2VucXVldWVXcml0ZSh7XG4gICAgICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYSAlZCBwbGFjZWhvbGRlciBpcyBwcm92aWRlZCwgYWRkIHF1YW50aXR5XG4gICAgICAgIC8vIHRvIHRoZSBhcmd1bWVudHMgZXhwYW5kZWQgYnkgdXRpbC5mb3JtYXQuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtzdHJdO1xuICAgICAgICBpZiAofnN0ci5pbmRleE9mKCclZCcpKVxuICAgICAgICAgICAgdmFsdWVzLnB1c2gocXVhbnRpdHkpO1xuICAgICAgICByZXR1cm4gc2hpbS5mb3JtYXQuYXBwbHkoc2hpbS5mb3JtYXQsIHZhbHVlcy5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgIH1cbiAgICBnZXRMb2NhbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgICB9XG4gICAgdXBkYXRlTG9jYWxlKG9iaikge1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFnZ2VkTGl0ZXJhbChwYXJ0cywgLi4uYXJncykge1xuICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQsIGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgc3RyICs9IHBhcnQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyVzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fLmFwcGx5KHRoaXMsIFtzdHJdLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3MsIDEpKSk7XG4gICAgfVxuICAgIF9lbnF1ZXVlV3JpdGUod29yaykge1xuICAgICAgICB0aGlzLndyaXRlUXVldWUucHVzaCh3b3JrKTtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVRdWV1ZS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzV3JpdGVRdWV1ZSgpO1xuICAgIH1cbiAgICBfcHJvY2Vzc1dyaXRlUXVldWUoKSB7XG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgd29yayA9IHRoaXMud3JpdGVRdWV1ZVswXTtcbiAgICAgICAgLy8gZGVzdHJ1Y3R1cmUgdGhlIGVucXVldWVkIHdvcmsuXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IHdvcmsuZGlyZWN0b3J5O1xuICAgICAgICBjb25zdCBsb2NhbGUgPSB3b3JrLmxvY2FsZTtcbiAgICAgICAgY29uc3QgY2IgPSB3b3JrLmNiO1xuICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSB0aGlzLl9yZXNvbHZlTG9jYWxlRmlsZShkaXJlY3RvcnksIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRMb2NhbGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNhY2hlW2xvY2FsZV0sIG51bGwsIDIpO1xuICAgICAgICBzaGltLmZzLndyaXRlRmlsZShsYW5ndWFnZUZpbGUsIHNlcmlhbGl6ZWRMb2NhbGUsICd1dGYtOCcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIF90aGlzLndyaXRlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChfdGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgX3RoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlYWRMb2NhbGVGaWxlKCkge1xuICAgICAgICBsZXQgbG9jYWxlTG9va3VwID0ge307XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGEgYnVuZGxlciBzdWNoIGFzIHdlYnBhY2ssIHJlYWRGaWxlU3luYyBtYXkgbm90IGJlIGRlZmluZWQ6XG4gICAgICAgICAgICBpZiAoc2hpbS5mcy5yZWFkRmlsZVN5bmMpIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVMb29rdXAgPSBKU09OLnBhcnNlKHNoaW0uZnMucmVhZEZpbGVTeW5jKGxhbmd1YWdlRmlsZSwgJ3V0Zi04JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID0gJ3N5bnRheCBlcnJvciBpbiAnICsgbGFuZ3VhZ2VGaWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJylcbiAgICAgICAgICAgICAgICBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0gPSBsb2NhbGVMb29rdXA7XG4gICAgfVxuICAgIF9yZXNvbHZlTG9jYWxlRmlsZShkaXJlY3RvcnksIGxvY2FsZSkge1xuICAgICAgICBsZXQgZmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZSArICcuanNvbicpO1xuICAgICAgICBpZiAodGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgJiYgIXRoaXMuX2ZpbGVFeGlzdHNTeW5jKGZpbGUpICYmIH5sb2NhbGUubGFzdEluZGV4T2YoJ18nKSkge1xuICAgICAgICAgICAgLy8gYXR0ZW1wdCBmYWxsYmFjayB0byBsYW5ndWFnZSBvbmx5XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSBzaGltLnJlc29sdmUoZGlyZWN0b3J5LCAnLi8nLCBsb2NhbGUuc3BsaXQoJ18nKVswXSArICcuanNvbicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeGlzdHNTeW5jKGxhbmd1YWdlRmlsZSkpXG4gICAgICAgICAgICAgICAgZmlsZSA9IGxhbmd1YWdlRmlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gICAgX2ZpbGVFeGlzdHNTeW5jKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHNoaW0uZXhpc3RzKGZpbGUpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB5MThuKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuIiwiaW1wb3J0IHNoaW0gZnJvbSAnLi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcydcbmltcG9ydCB7IHkxOG4gYXMgX3kxOG4gfSBmcm9tICcuL2J1aWxkL2xpYi9pbmRleC5qcydcblxuY29uc3QgeTE4biA9IChvcHRzKSA9PiB7XG4gIHJldHVybiBfeTE4bihvcHRzLCBzaGltKVxufVxuXG5leHBvcnQgZGVmYXVsdCB5MThuXG4iLCIndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgbm90U3RyaWN0RXF1YWwsIHN0cmljdEVxdWFsIH0gZnJvbSAnYXNzZXJ0J1xuaW1wb3J0IGNsaXVpIGZyb20gJ2NsaXVpJ1xuaW1wb3J0IGVzY2FsYWRlIGZyb20gJ2VzY2FsYWRlL3N5bmMnXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCdcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJ3lhcmdzLXBhcnNlcidcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBnZXRQcm9jZXNzQXJndkJpbiB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMnXG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi8uLi9idWlsZC9saWIveWVycm9yLmpzJ1xuaW1wb3J0IHkxOG4gZnJvbSAneTE4bidcblxuY29uc3QgUkVRVUlSRV9FUlJPUiA9ICdyZXF1aXJlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRVNNJ1xuY29uc3QgUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IgPSAnbG9hZGluZyBhIGRpcmVjdG9yeSBvZiBjb21tYW5kcyBpcyBub3Qgc3VwcG9ydGVkIHlldCBmb3IgRVNNJ1xuXG5sZXQgX19kaXJuYW1lO1xudHJ5IHtcbiAgX19kaXJuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xufSBjYXRjaCAoZSkge1xuICBfX2Rpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuY29uc3QgbWFpbkZpbGVuYW1lID0gX19kaXJuYW1lLnN1YnN0cmluZygwLCBfX2Rpcm5hbWUubGFzdEluZGV4T2YoJ25vZGVfbW9kdWxlcycpKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnQ6IHtcbiAgICBub3RTdHJpY3RFcXVhbCxcbiAgICBzdHJpY3RFcXVhbFxuICB9LFxuICBjbGl1aSxcbiAgZmluZFVwOiBlc2NhbGFkZSxcbiAgZ2V0RW52OiAoa2V5KSA9PiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2tleV1cbiAgfSxcbiAgaW5zcGVjdCxcbiAgZ2V0Q2FsbGVyRmlsZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIGdldFByb2Nlc3NBcmd2QmluLFxuICBtYWluRmlsZW5hbWU6IG1haW5GaWxlbmFtZSB8fCBwcm9jZXNzLmN3ZCgpLFxuICBQYXJzZXIsXG4gIHBhdGg6IHtcbiAgICBiYXNlbmFtZSxcbiAgICBkaXJuYW1lLFxuICAgIGV4dG5hbWUsXG4gICAgcmVsYXRpdmUsXG4gICAgcmVzb2x2ZVxuICB9LFxuICBwcm9jZXNzOiB7XG4gICAgYXJndjogKCkgPT4gcHJvY2Vzcy5hcmd2LFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QsXG4gICAgZW1pdFdhcm5pbmc6ICh3YXJuaW5nLCB0eXBlKSA9PiBwcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcsIHR5cGUpLFxuICAgIGV4ZWNQYXRoOiAoKSA9PiBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIGV4aXQ6IHByb2Nlc3MuZXhpdCxcbiAgICBuZXh0VGljazogcHJvY2Vzcy5uZXh0VGljayxcbiAgICBzdGRDb2x1bW5zOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogbnVsbFxuICB9LFxuICByZWFkRmlsZVN5bmMsXG4gIHJlcXVpcmU6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRVJST1IpXG4gIH0sXG4gIHJlcXVpcmVEaXJlY3Rvcnk6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SKVxuICB9LFxuICBzdHJpbmdXaWR0aDogKHN0cikgPT4ge1xuICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgfSxcbiAgeTE4bjogeTE4bih7XG4gICAgZGlyZWN0b3J5OiByZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uLy4uL2xvY2FsZXMnKSxcbiAgICB1cGRhdGVGaWxlczogZmFsc2VcbiAgfSlcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGFydCwgY2FsbGJhY2spIHtcblx0bGV0IGRpciA9IHJlc29sdmUoJy4nLCBzdGFydCk7XG5cdGxldCB0bXAsIHN0YXRzID0gc3RhdFN5bmMoZGlyKTtcblxuXHRpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcblx0XHRkaXIgPSBkaXJuYW1lKGRpcik7XG5cdH1cblxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdHRtcCA9IGNhbGxiYWNrKGRpciwgcmVhZGRpclN5bmMoZGlyKSk7XG5cdFx0aWYgKHRtcCkgcmV0dXJuIHJlc29sdmUoZGlyLCB0bXApO1xuXHRcdGRpciA9IGRpcm5hbWUodG1wID0gZGlyKTtcblx0XHRpZiAodG1wID09PSBkaXIpIGJyZWFrO1xuXHR9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgc2hpbSwgbWVzc2FnZSkge1xuICAgIHNoaW0uYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNpbmdsZUtleShhY3R1YWwsIHNoaW0pIHtcbiAgICBzaGltLmFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgYWN0dWFsLCAnc3RyaW5nJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0S2V5cyhvYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gICAgcmV0dXJuICghIW1heWJlUHJvbWlzZSAmJlxuICAgICAgICAhIW1heWJlUHJvbWlzZS50aGVuICYmXG4gICAgICAgIHR5cGVvZiBtYXliZVByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcGFyc2VDb21tYW5kKGNtZCkge1xuICAgIGNvbnN0IGV4dHJhU3BhY2VzU3RyaXBwZWRDb21tYW5kID0gY21kLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKTtcbiAgICBjb25zdCBzcGxpdENvbW1hbmQgPSBleHRyYVNwYWNlc1N0cmlwcGVkQ29tbWFuZC5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLyk7XG4gICAgY29uc3QgYnJlZ2V4ID0gL1xcLipbXFxdWzw+XS9nO1xuICAgIGNvbnN0IGZpcnN0Q29tbWFuZCA9IHNwbGl0Q29tbWFuZC5zaGlmdCgpO1xuICAgIGlmICghZmlyc3RDb21tYW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1hbmQgZm91bmQgaW46ICR7Y21kfWApO1xuICAgIGNvbnN0IHBhcnNlZENvbW1hbmQgPSB7XG4gICAgICAgIGNtZDogZmlyc3RDb21tYW5kLnJlcGxhY2UoYnJlZ2V4LCAnJyksXG4gICAgICAgIGRlbWFuZGVkOiBbXSxcbiAgICAgICAgb3B0aW9uYWw6IFtdLFxuICAgIH07XG4gICAgc3BsaXRDb21tYW5kLmZvckVhY2goKGNtZCwgaSkgPT4ge1xuICAgICAgICBsZXQgdmFyaWFkaWMgPSBmYWxzZTtcbiAgICAgICAgY21kID0gY21kLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICAgIGlmICgvXFwuK1tcXF0+XS8udGVzdChjbWQpICYmIGkgPT09IHNwbGl0Q29tbWFuZC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgdmFyaWFkaWMgPSB0cnVlO1xuICAgICAgICBpZiAoL15cXFsvLnRlc3QoY21kKSkge1xuICAgICAgICAgICAgcGFyc2VkQ29tbWFuZC5vcHRpb25hbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBjbWQ6IGNtZC5yZXBsYWNlKGJyZWdleCwgJycpLnNwbGl0KCd8JyksXG4gICAgICAgICAgICAgICAgdmFyaWFkaWMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlZENvbW1hbmQuZGVtYW5kZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgY21kOiBjbWQucmVwbGFjZShicmVnZXgsICcnKS5zcGxpdCgnfCcpLFxuICAgICAgICAgICAgICAgIHZhcmlhZGljLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkQ29tbWFuZDtcbn1cbiIsImltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4veWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbWFuZCB9IGZyb20gJy4vcGFyc2UtY29tbWFuZC5qcyc7XG5jb25zdCBwb3NpdGlvbk5hbWUgPSBbJ2ZpcnN0JywgJ3NlY29uZCcsICd0aGlyZCcsICdmb3VydGgnLCAnZmlmdGgnLCAnc2l4dGgnXTtcbmV4cG9ydCBmdW5jdGlvbiBhcmdzZXJ0KGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZUFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgID8gW3sgZGVtYW5kZWQ6IFtdLCBvcHRpb25hbDogW10gfSwgYXJnMSwgYXJnMl1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHBhcnNlQ29tbWFuZChgY21kICR7YXJnMX1gKSxcbiAgICAgICAgICAgICAgICBhcmcyLFxuICAgICAgICAgICAgICAgIGFyZzMsXG4gICAgICAgICAgICBdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgICBjb25zdCBbcGFyc2VkLCBjYWxsZXJBcmd1bWVudHMsIF9sZW5ndGhdID0gcGFyc2VBcmdzKCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXS5zbGljZS5jYWxsKGNhbGxlckFyZ3VtZW50cyk7XG4gICAgICAgIHdoaWxlIChhcmdzLmxlbmd0aCAmJiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IF9sZW5ndGggfHwgYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBwYXJzZWQuZGVtYW5kZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBOb3QgZW5vdWdoIGFyZ3VtZW50cyBwcm92aWRlZC4gRXhwZWN0ZWQgJHtwYXJzZWQuZGVtYW5kZWQubGVuZ3RofSBidXQgcmVjZWl2ZWQgJHthcmdzLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxDb21tYW5kcyA9IHBhcnNlZC5kZW1hbmRlZC5sZW5ndGggKyBwYXJzZWQub3B0aW9uYWwubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoID4gdG90YWxDb21tYW5kcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt0b3RhbENvbW1hbmRzfSBidXQgcmVjZWl2ZWQgJHtsZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlZC5kZW1hbmRlZC5mb3JFYWNoKGRlbWFuZGVkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVkVHlwZSA9IGd1ZXNzVHlwZShhcmcpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdUeXBlcyA9IGRlbWFuZGVkLmNtZC5maWx0ZXIodHlwZSA9PiB0eXBlID09PSBvYnNlcnZlZFR5cGUgfHwgdHlwZSA9PT0gJyonKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1R5cGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICBhcmd1bWVudFR5cGVFcnJvcihvYnNlcnZlZFR5cGUsIGRlbWFuZGVkLmNtZCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgcG9zaXRpb24gKz0gMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC5vcHRpb25hbC5mb3JFYWNoKG9wdGlvbmFsID0+IHtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlZFR5cGUgPSBndWVzc1R5cGUoYXJnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZXMgPSBvcHRpb25hbC5jbWQuZmlsdGVyKHR5cGUgPT4gdHlwZSA9PT0gb2JzZXJ2ZWRUeXBlIHx8IHR5cGUgPT09ICcqJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBvcHRpb25hbC5jbWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDE7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2spO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGd1ZXNzVHlwZShhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBhcmc7XG59XG5mdW5jdGlvbiBhcmd1bWVudFR5cGVFcnJvcihvYnNlcnZlZFR5cGUsIGFsbG93ZWRUeXBlcywgcG9zaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKGBJbnZhbGlkICR7cG9zaXRpb25OYW1lW3Bvc2l0aW9uXSB8fCAnbWFueWl0aCd9IGFyZ3VtZW50LiBFeHBlY3RlZCAke2FsbG93ZWRUeXBlcy5qb2luKCcgb3IgJyl9IGJ1dCByZWNlaXZlZCAke29ic2VydmVkVHlwZX0uYCk7XG59XG4iLCJpbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5leHBvcnQgY2xhc3MgR2xvYmFsTWlkZGxld2FyZSB7XG4gICAgY29uc3RydWN0b3IoeWFyZ3MpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxNaWRkbGV3YXJlID0gW107XG4gICAgICAgIHRoaXMuZnJvemVucyA9IFtdO1xuICAgICAgICB0aGlzLnlhcmdzID0geWFyZ3M7XG4gICAgfVxuICAgIGFkZE1pZGRsZXdhcmUoY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsID0gdHJ1ZSwgbXV0YXRlcyA9IGZhbHNlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxmdW5jdGlvbj4gW2Jvb2xlYW5dIFtib29sZWFuXSBbYm9vbGVhbl0nLCBbY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFjay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2tbaV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ21pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBjYWxsYmFja1tpXTtcbiAgICAgICAgICAgICAgICBtLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiA9IGFwcGx5QmVmb3JlVmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICBtLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZ2xvYmFsTWlkZGxld2FyZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgbSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgbS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBhcHBseUJlZm9yZVZhbGlkYXRpb247XG4gICAgICAgICAgICBtLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgICAgIG0ubXV0YXRlcyA9IG11dGF0ZXM7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMueWFyZ3M7XG4gICAgfVxuICAgIGFkZENvZXJjZU1pZGRsZXdhcmUoY2FsbGJhY2ssIG9wdGlvbikge1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gdGhpcy55YXJncy5nZXRBbGlhc2VzKCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIobSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gWy4uLihhbGlhc2VzW29wdGlvbl0gfHwgW10pLCBvcHRpb25dO1xuICAgICAgICAgICAgaWYgKCFtLm9wdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gIXRvQ2hlY2suaW5jbHVkZXMobS5vcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZTtcbiAgICB9XG4gICAgZnJlZXplKCkge1xuICAgICAgICB0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSk7XG4gICAgfVxuICAgIHVuZnJlZXplKCkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSB0aGlzLmZyb3plbnMucG9wKCk7XG4gICAgICAgIGlmIChmcm96ZW4gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IGZyb3plbjtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIobSA9PiBtLmdsb2JhbCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeShjb21tYW5kTWlkZGxld2FyZSkge1xuICAgIGlmICghY29tbWFuZE1pZGRsZXdhcmUpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gY29tbWFuZE1pZGRsZXdhcmUubWFwKG1pZGRsZXdhcmUgPT4ge1xuICAgICAgICBtaWRkbGV3YXJlLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoYXJndiwgeWFyZ3MsIG1pZGRsZXdhcmVzLCBiZWZvcmVWYWxpZGF0aW9uKSB7XG4gICAgcmV0dXJuIG1pZGRsZXdhcmVzLnJlZHVjZSgoYWNjLCBtaWRkbGV3YXJlKSA9PiB7XG4gICAgICAgIGlmIChtaWRkbGV3YXJlLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiAhPT0gYmVmb3JlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlkZGxld2FyZS5tdXRhdGVzKSB7XG4gICAgICAgICAgICBpZiAobWlkZGxld2FyZS5hcHBsaWVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICBtaWRkbGV3YXJlLmFwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoYWNjKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgICAgICAgIC50aGVuKGluaXRpYWxPYmogPT4gUHJvbWlzZS5hbGwoW2luaXRpYWxPYmosIG1pZGRsZXdhcmUoaW5pdGlhbE9iaiwgeWFyZ3MpXSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKFtpbml0aWFsT2JqLCBtaWRkbGV3YXJlT2JqXSkgPT4gT2JqZWN0LmFzc2lnbihpbml0aWFsT2JqLCBtaWRkbGV3YXJlT2JqKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBtaWRkbGV3YXJlKGFjYywgeWFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgPyByZXN1bHQudGhlbihtaWRkbGV3YXJlT2JqID0+IE9iamVjdC5hc3NpZ24oYWNjLCBtaWRkbGV3YXJlT2JqKSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5hc3NpZ24oYWNjLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfSwgYXJndik7XG59XG4iLCJpbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL2lzLXByb21pc2UuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heWJlQXN5bmNSZXN1bHQoZ2V0UmVzdWx0LCByZXN1bHRIYW5kbGVyLCBlcnJvckhhbmRsZXIgPSAoZXJyKSA9PiB7XG4gICAgdGhyb3cgZXJyO1xufSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRnVuY3Rpb24oZ2V0UmVzdWx0KSA/IGdldFJlc3VsdCgpIDogZ2V0UmVzdWx0O1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKHJlc3VsdClcbiAgICAgICAgICAgID8gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0SGFuZGxlcihyZXN1bHQpKVxuICAgICAgICAgICAgOiByZXN1bHRIYW5kbGVyKHJlc3VsdCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcihlcnIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG4iLCJpbXBvcnQgeyBhc3NlcnROb3RTdHJpY3RFcXVhbCwgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeSwgfSBmcm9tICcuL21pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kIH0gZnJvbSAnLi9wYXJzZS1jb21tYW5kLmpzJztcbmltcG9ydCB7IGlzWWFyZ3NJbnN0YW5jZSwgfSBmcm9tICcuL3lhcmdzLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgbWF5YmVBc3luY1Jlc3VsdCB9IGZyb20gJy4vdXRpbHMvbWF5YmUtYXN5bmMtcmVzdWx0LmpzJztcbmltcG9ydCB3aGljaE1vZHVsZSBmcm9tICcuL3V0aWxzL3doaWNoLW1vZHVsZS5qcyc7XG5jb25zdCBERUZBVUxUX01BUktFUiA9IC8oXlxcKil8KF5cXCQwKS87XG5leHBvcnQgY2xhc3MgQ29tbWFuZEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih1c2FnZSwgdmFsaWRhdGlvbiwgZ2xvYmFsTWlkZGxld2FyZSwgc2hpbSkge1xuICAgICAgICB0aGlzLnJlcXVpcmVDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLmFsaWFzTWFwID0ge307XG4gICAgICAgIHRoaXMuZnJvemVucyA9IFtdO1xuICAgICAgICB0aGlzLnNoaW0gPSBzaGltO1xuICAgICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IGdsb2JhbE1pZGRsZXdhcmU7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IHZhbGlkYXRpb247XG4gICAgfVxuICAgIGFkZERpcmVjdG9yeShkaXIsIHJlcSwgY2FsbGVyRmlsZSwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLnJlY3Vyc2UgIT09ICdib29sZWFuJylcbiAgICAgICAgICAgIG9wdHMucmVjdXJzZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy5leHRlbnNpb25zKSlcbiAgICAgICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IFsnanMnXTtcbiAgICAgICAgY29uc3QgcGFyZW50VmlzaXQgPSB0eXBlb2Ygb3B0cy52aXNpdCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMudmlzaXQgOiAobykgPT4gbztcbiAgICAgICAgb3B0cy52aXNpdCA9IChvYmosIGpvaW5lZCwgZmlsZW5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWQgPSBwYXJlbnRWaXNpdChvYmosIGpvaW5lZCwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGpvaW5lZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdGVkO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUuYWRkKGpvaW5lZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKHZpc2l0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0ZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHsgcmVxdWlyZTogcmVxLCBmaWxlbmFtZTogY2FsbGVyRmlsZSB9LCBkaXIsIG9wdHMpO1xuICAgIH1cbiAgICBhZGRIYW5kbGVyKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIGNvbW1hbmRNaWRkbGV3YXJlLCBkZXByZWNhdGVkKSB7XG4gICAgICAgIGxldCBhbGlhc2VzID0gW107XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVzID0gY29tbWFuZE1pZGRsZXdhcmVGYWN0b3J5KGNvbW1hbmRNaWRkbGV3YXJlKTtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXIgfHwgKCgpID0+IHsgfSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNtZCkpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbW1hbmRBbmRBbGlhc2VzKGNtZCkpIHtcbiAgICAgICAgICAgICAgICBbY21kLCAuLi5hbGlhc2VzXSA9IGNtZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBjbWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbihjbWQpKSB7XG4gICAgICAgICAgICBsZXQgY29tbWFuZCA9IEFycmF5LmlzQXJyYXkoY21kLmNvbW1hbmQpIHx8IHR5cGVvZiBjbWQuY29tbWFuZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGNtZC5jb21tYW5kXG4gICAgICAgICAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUoY21kKTtcbiAgICAgICAgICAgIGlmIChjbWQuYWxpYXNlcylcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gW10uY29uY2F0KGNvbW1hbmQpLmNvbmNhdChjbWQuYWxpYXNlcyk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIoY29tbWFuZCwgdGhpcy5leHRyYWN0RGVzYyhjbWQpLCBjbWQuYnVpbGRlciwgY21kLmhhbmRsZXIsIGNtZC5taWRkbGV3YXJlcywgY21kLmRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIoW2NtZF0uY29uY2F0KGFsaWFzZXMpLCBkZXNjcmlwdGlvbiwgYnVpbGRlci5idWlsZGVyLCBidWlsZGVyLmhhbmRsZXIsIGJ1aWxkZXIubWlkZGxld2FyZXMsIGJ1aWxkZXIuZGVwcmVjYXRlZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjbWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRDb21tYW5kID0gcGFyc2VDb21tYW5kKGNtZCk7XG4gICAgICAgICAgICBhbGlhc2VzID0gYWxpYXNlcy5tYXAoYWxpYXMgPT4gcGFyc2VDb21tYW5kKGFsaWFzKS5jbWQpO1xuICAgICAgICAgICAgbGV0IGlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQWxpYXNlcyA9IFtwYXJzZWRDb21tYW5kLmNtZF0uY29uY2F0KGFsaWFzZXMpLmZpbHRlcihjID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoREVGQVVMVF9NQVJLRVIudGVzdChjKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkQWxpYXNlcy5sZW5ndGggPT09IDAgJiYgaXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIHBhcnNlZEFsaWFzZXMucHVzaCgnJDAnKTtcbiAgICAgICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRDb21tYW5kLmNtZCA9IHBhcnNlZEFsaWFzZXNbMF07XG4gICAgICAgICAgICAgICAgYWxpYXNlcyA9IHBhcnNlZEFsaWFzZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgY21kID0gY21kLnJlcGxhY2UoREVGQVVMVF9NQVJLRVIsIHBhcnNlZENvbW1hbmQuY21kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsaWFzZXMuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGlhc01hcFthbGlhc10gPSBwYXJzZWRDb21tYW5kLmNtZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNhZ2UuY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc1twYXJzZWRDb21tYW5kLmNtZF0gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IGNtZCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJ1aWxkZXI6IGJ1aWxkZXIgfHwge30sXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICBkZW1hbmRlZDogcGFyc2VkQ29tbWFuZC5kZW1hbmRlZCxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogcGFyc2VkQ29tbWFuZC5vcHRpb25hbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbW1hbmQgPSB0aGlzLmhhbmRsZXJzW3BhcnNlZENvbW1hbmQuY21kXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb21tYW5kSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xuICAgIH1cbiAgICBnZXRDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSk7XG4gICAgfVxuICAgIGhhc0RlZmF1bHRDb21tYW5kKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmRlZmF1bHRDb21tYW5kO1xuICAgIH1cbiAgICBydW5Db21tYW5kKGNvbW1hbmQsIHlhcmdzLCBwYXJzZWQsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZEhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW2NvbW1hbmRdIHx8XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbY29tbWFuZF1dIHx8XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpc0RlZmF1bHRDb21tYW5kID0gIWNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuZnVsbENvbW1hbmRzLnB1c2goY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXJSZXN1bHQgPSB0aGlzLmFwcGx5QnVpbGRlclVwZGF0ZVVzYWdlQW5kUGFyc2UoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHlhcmdzLCBwYXJzZWQuYWxpYXNlcywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGJ1aWxkZXJSZXN1bHQpXG4gICAgICAgICAgICA/IGJ1aWxkZXJSZXN1bHQudGhlbihyZXN1bHQgPT4gdGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHJlc3VsdC5pbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBoZWxwT25seSwgcmVzdWx0LmFsaWFzZXMsIHlhcmdzKSlcbiAgICAgICAgICAgIDogdGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGJ1aWxkZXJSZXN1bHQuaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIGJ1aWxkZXJSZXN1bHQuYWxpYXNlcywgeWFyZ3MpO1xuICAgIH1cbiAgICBhcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCB5YXJncywgYWxpYXNlcywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNvbW1hbmRIYW5kbGVyLmJ1aWxkZXI7XG4gICAgICAgIGxldCBpbm5lcllhcmdzID0geWFyZ3M7XG4gICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mcmVlemUoKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXJPdXRwdXQgPSBidWlsZGVyKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KGFsaWFzZXMpLCBoZWxwT3JWZXJzaW9uU2V0KTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlck91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlck91dHB1dC50aGVuKG91dHB1dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyWWFyZ3MgPSBpc1lhcmdzSW5zdGFuY2Uob3V0cHV0KSA/IG91dHB1dCA6IHlhcmdzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lcllhcmdzLCBwYXJlbnRDb21tYW5kcywgY29tbWFuZEluZGV4LCBoZWxwT25seSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb21tYW5kQnVpbGRlck9wdGlvbkRlZmluaXRpb25zKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7XG4gICAgICAgICAgICBpbm5lcllhcmdzID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoYWxpYXNlcyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb21tYW5kSGFuZGxlci5idWlsZGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaW5uZXJZYXJncy5vcHRpb24oa2V5LCBidWlsZGVyW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgIH1cbiAgICBwYXJzZUFuZFVwZGF0ZVVzYWdlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lcllhcmdzLCBwYXJlbnRDb21tYW5kcywgY29tbWFuZEluZGV4LCBoZWxwT25seSkge1xuICAgICAgICBpZiAoaXNEZWZhdWx0Q29tbWFuZClcbiAgICAgICAgICAgIGlubmVyWWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLnVuZnJlZXplKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGVVc2FnZShpbm5lcllhcmdzKSkge1xuICAgICAgICAgICAgaW5uZXJZYXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKHBhcmVudENvbW1hbmRzLCBjb21tYW5kSGFuZGxlciksIGNvbW1hbmRIYW5kbGVyLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbm5lckFyZ3YgPSBpbm5lcllhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5ydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcyhudWxsLCB1bmRlZmluZWQsIHRydWUsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGlubmVyQXJndilcbiAgICAgICAgICAgID8gaW5uZXJBcmd2LnRoZW4oYXJndiA9PiAoe1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IGlubmVyWWFyZ3MucGFyc2VkLmFsaWFzZXMsXG4gICAgICAgICAgICAgICAgaW5uZXJBcmd2OiBhcmd2LFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBpbm5lcllhcmdzLnBhcnNlZC5hbGlhc2VzLFxuICAgICAgICAgICAgICAgIGlubmVyQXJndjogaW5uZXJBcmd2LFxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgc2hvdWxkVXBkYXRlVXNhZ2UoeWFyZ3MpIHtcbiAgICAgICAgcmV0dXJuICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSAmJlxuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RoID09PSAwKTtcbiAgICB9XG4gICAgdXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlcihwYXJlbnRDb21tYW5kcywgY29tbWFuZEhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgYyA9IERFRkFVTFRfTUFSS0VSLnRlc3QoY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpXG4gICAgICAgICAgICA/IGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsLnJlcGxhY2UoREVGQVVMVF9NQVJLRVIsICcnKS50cmltKClcbiAgICAgICAgICAgIDogY29tbWFuZEhhbmRsZXIub3JpZ2luYWw7XG4gICAgICAgIGNvbnN0IHBjID0gcGFyZW50Q29tbWFuZHMuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFERUZBVUxUX01BUktFUi50ZXN0KGMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGMucHVzaChjKTtcbiAgICAgICAgcmV0dXJuIGAkMCAke3BjLmpvaW4oJyAnKX1gO1xuICAgIH1cbiAgICBoYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApIHtcbiAgICAgICAgaWYgKCF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHlhcmdzXG4gICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgLnJ1blZhbGlkYXRpb24oYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgeWFyZ3MucGFyc2VkLmVycm9yLCBpc0RlZmF1bHRDb21tYW5kKTtcbiAgICAgICAgICAgIGlubmVyQXJndiA9IG1heWJlQXN5bmNSZXN1bHQoaW5uZXJBcmd2LCByZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1hbmRIYW5kbGVyLmhhbmRsZXIgJiYgIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcHVsYXRlRG91YmxlRGFzaCA9ICEheWFyZ3MuZ2V0T3B0aW9ucygpLmNvbmZpZ3VyYXRpb25bJ3BvcHVsYXRlLS0nXTtcbiAgICAgICAgICAgIHlhcmdzXG4gICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgLnBvc3RQcm9jZXNzKGlubmVyQXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgaW5uZXJBcmd2ID0gYXBwbHlNaWRkbGV3YXJlKGlubmVyQXJndiwgeWFyZ3MsIG1pZGRsZXdhcmVzLCBmYWxzZSk7XG4gICAgICAgICAgICBpbm5lckFyZ3YgPSBtYXliZUFzeW5jUmVzdWx0KGlubmVyQXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyUmVzdWx0ID0gY29tbWFuZEhhbmRsZXIuaGFuZGxlcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1Byb21pc2UoaGFuZGxlclJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgPyBoYW5kbGVyUmVzdWx0LnRoZW4oKCkgPT4gcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICA6IHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFpc0RlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmNhY2hlSGVscE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXJBcmd2KSAmJlxuICAgICAgICAgICAgICAgICF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpIHtcbiAgICAgICAgICAgICAgICBpbm5lckFyZ3YuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZhaWwobnVsbCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLnBvcCgpO1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuZnVsbENvbW1hbmRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbm5lckFyZ3Y7XG4gICAgfVxuICAgIGFwcGx5TWlkZGxld2FyZUFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIGFsaWFzZXMsIHlhcmdzKSB7XG4gICAgICAgIGxldCBwb3NpdGlvbmFsTWFwID0ge307XG4gICAgICAgIGlmIChoZWxwT25seSlcbiAgICAgICAgICAgIHJldHVybiBpbm5lckFyZ3Y7XG4gICAgICAgIGlmICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0SGFzT3V0cHV0KCkpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXAgPSB0aGlzLnBvcHVsYXRlUG9zaXRpb25hbHMoY29tbWFuZEhhbmRsZXIsIGlubmVyQXJndiwgY3VycmVudENvbnRleHQsIHlhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaWRkbGV3YXJlcyA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZVxuICAgICAgICAgICAgLmdldE1pZGRsZXdhcmUoKVxuICAgICAgICAgICAgLnNsaWNlKDApXG4gICAgICAgICAgICAuY29uY2F0KGNvbW1hbmRIYW5kbGVyLm1pZGRsZXdhcmVzKTtcbiAgICAgICAgY29uc3QgbWF5YmVQcm9taXNlQXJndiA9IGFwcGx5TWlkZGxld2FyZShpbm5lckFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpc1Byb21pc2UobWF5YmVQcm9taXNlQXJndilcbiAgICAgICAgICAgID8gbWF5YmVQcm9taXNlQXJndi50aGVuKHJlc29sdmVkSW5uZXJBcmd2ID0+IHRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgcmVzb2x2ZWRJbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApKVxuICAgICAgICAgICAgOiB0aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIG1heWJlUHJvbWlzZUFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApO1xuICAgIH1cbiAgICBwb3B1bGF0ZVBvc2l0aW9uYWxzKGNvbW1hbmRIYW5kbGVyLCBhcmd2LCBjb250ZXh0LCB5YXJncykge1xuICAgICAgICBhcmd2Ll8gPSBhcmd2Ll8uc2xpY2UoY29udGV4dC5jb21tYW5kcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkZW1hbmRlZCA9IGNvbW1hbmRIYW5kbGVyLmRlbWFuZGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBvcHRpb25hbCA9IGNvbW1hbmRIYW5kbGVyLm9wdGlvbmFsLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsTWFwID0ge307XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbi5wb3NpdGlvbmFsQ291bnQoZGVtYW5kZWQubGVuZ3RoLCBhcmd2Ll8ubGVuZ3RoKTtcbiAgICAgICAgd2hpbGUgKGRlbWFuZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVtYW5kID0gZGVtYW5kZWQuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVQb3NpdGlvbmFsKGRlbWFuZCwgYXJndiwgcG9zaXRpb25hbE1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG9wdGlvbmFsLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF5YmUgPSBvcHRpb25hbC5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwobWF5YmUsIGFyZ3YsIHBvc2l0aW9uYWxNYXApO1xuICAgICAgICB9XG4gICAgICAgIGFyZ3YuXyA9IGNvbnRleHQuY29tbWFuZHMuY29uY2F0KGFyZ3YuXy5tYXAoYSA9PiAnJyArIGEpKTtcbiAgICAgICAgdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGFyZ3YsIHBvc2l0aW9uYWxNYXAsIHRoaXMuY21kVG9QYXJzZU9wdGlvbnMoY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpLCB5YXJncyk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbmFsTWFwO1xuICAgIH1cbiAgICBwb3B1bGF0ZVBvc2l0aW9uYWwocG9zaXRpb25hbCwgYXJndiwgcG9zaXRpb25hbE1hcCkge1xuICAgICAgICBjb25zdCBjbWQgPSBwb3NpdGlvbmFsLmNtZFswXTtcbiAgICAgICAgaWYgKHBvc2l0aW9uYWwudmFyaWFkaWMpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBbY21kXSA9IGFyZ3YuXy5zcGxpY2UoMCkubWFwKFN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoYXJndi5fLmxlbmd0aClcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2NtZF0gPSBbU3RyaW5nKGFyZ3YuXy5zaGlmdCgpKV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY21kVG9QYXJzZU9wdGlvbnMoY21kU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFycmF5OiBbXSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgICAgICAgYWxpYXM6IHt9LFxuICAgICAgICAgICAgZGVtYW5kOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VDb21tYW5kKGNtZFN0cmluZyk7XG4gICAgICAgIHBhcnNlZC5kZW1hbmRlZC5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYWxpYXNlc10gPSBkLmNtZDtcbiAgICAgICAgICAgIGlmIChkLnZhcmlhZGljKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFycmF5LnB1c2goY21kKTtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVmYXVsdFtjbWRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuYWxpYXNbY21kXSA9IGFsaWFzZXM7XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVtYW5kW2NtZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFyc2VkLm9wdGlvbmFsLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBjb25zdCBbY21kLCAuLi5hbGlhc2VzXSA9IG8uY21kO1xuICAgICAgICAgICAgaWYgKG8udmFyaWFkaWMpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuYXJyYXkucHVzaChjbWQpO1xuICAgICAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5kZWZhdWx0W2NtZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5hbGlhc1tjbWRdID0gYWxpYXNlcztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJzZU9wdGlvbnM7XG4gICAgfVxuICAgIHBvc3RQcm9jZXNzUG9zaXRpb25hbHMoYXJndiwgcG9zaXRpb25hbE1hcCwgcGFyc2VPcHRpb25zLCB5YXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgeWFyZ3MuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0ID0gT2JqZWN0LmFzc2lnbihwYXJzZU9wdGlvbnMuZGVmYXVsdCwgb3B0aW9ucy5kZWZhdWx0KTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyc2VPcHRpb25zLmFsaWFzKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5hbGlhc1trZXldID0gKG9wdGlvbnMuYWxpYXNba2V5XSB8fCBbXSkuY29uY2F0KHBhcnNlT3B0aW9ucy5hbGlhc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmFycmF5ID0gb3B0aW9ucy5hcnJheS5jb25jYXQocGFyc2VPcHRpb25zLmFycmF5KTtcbiAgICAgICAgb3B0aW9ucy5jb25maWcgPSB7fTtcbiAgICAgICAgY29uc3QgdW5wYXJzZWQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25hbE1hcFtrZXldLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSlcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5rZXlba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdW5wYXJzZWQucHVzaChgLS0ke2tleX1gKTtcbiAgICAgICAgICAgICAgICB1bnBhcnNlZC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1bnBhcnNlZC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZmlndXJhdGlvbiwge1xuICAgICAgICAgICAgJ3BvcHVsYXRlLS0nOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuc2hpbS5QYXJzZXIuZGV0YWlsZWQodW5wYXJzZWQsIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZyxcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAocGFyc2VkLmVycm9yKSB7XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAuZmFpbChwYXJzZWQuZXJyb3IubWVzc2FnZSwgcGFyc2VkLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uYWxLZXlzID0gT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwb3NpdGlvbmFsTWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25hbEtleXMucHVzaCguLi5wYXJzZWQuYWxpYXNlc1trZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyc2VkLmFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25hbEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uYWxNYXBba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBba2V5XSA9IHBhcnNlZC5hcmd2W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0luQ29uZmlncyh5YXJncywga2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNEZWZhdWx0ZWQoeWFyZ3MsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLmFyZ3YsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGFyZ3Zba2V5XSkgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQuYXJndltrZXldKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IFtdLmNvbmNhdChhcmd2W2tleV0sIHBhcnNlZC5hcmd2W2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltrZXldID0gcGFyc2VkLmFyZ3Zba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzRGVmYXVsdGVkKHlhcmdzLCBrZXkpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBkZWZhdWx0cyB9ID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0cywga2V5KSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHRzLCB0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShrZXkpKSk7XG4gICAgfVxuICAgIGlzSW5Db25maWdzKHlhcmdzLCBrZXkpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWdPYmplY3RzIH0gPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiAoY29uZmlnT2JqZWN0cy5zb21lKGMgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsIGtleSkpIHx8XG4gICAgICAgICAgICBjb25maWdPYmplY3RzLnNvbWUoYyA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYywgdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KSkpKTtcbiAgICB9XG4gICAgcnVuRGVmYXVsdEJ1aWxkZXJPbih5YXJncykge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdENvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFVwZGF0ZVVzYWdlKHlhcmdzKSkge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZFN0cmluZyA9IERFRkFVTFRfTUFSS0VSLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbClcbiAgICAgICAgICAgICAgICA/IHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWwucmVwbGFjZSgvXlteW1xcXTw+XSovLCAnJDAgJyk7XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAudXNhZ2UoY29tbWFuZFN0cmluZywgdGhpcy5kZWZhdWx0Q29tbWFuZC5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZGVmYXVsdENvbW1hbmQuYnVpbGRlcjtcbiAgICAgICAgaWYgKGlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc0NvbW1hbmRCdWlsZGVyRGVmaW5pdGlvbihidWlsZGVyKSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYnVpbGRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHlhcmdzLm9wdGlvbihrZXksIGJ1aWxkZXJba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBtb2R1bGVOYW1lKG9iaikge1xuICAgICAgICBjb25zdCBtb2QgPSB3aGljaE1vZHVsZShvYmopO1xuICAgICAgICBpZiAoIW1vZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBuYW1lIGdpdmVuIGZvciBtb2R1bGU6ICR7dGhpcy5zaGltLmluc3BlY3Qob2JqKX1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZEZyb21GaWxlbmFtZShtb2QuZmlsZW5hbWUpO1xuICAgIH1cbiAgICBjb21tYW5kRnJvbUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoaW0ucGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgdGhpcy5zaGltLnBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuICAgIH1cbiAgICBleHRyYWN0RGVzYyh7IGRlc2NyaWJlLCBkZXNjcmlwdGlvbiwgZGVzYyB9KSB7XG4gICAgICAgIGZvciAoY29uc3QgdGVzdCBvZiBbZGVzY3JpYmUsIGRlc2NyaXB0aW9uLCBkZXNjXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJyB8fCB0ZXN0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHRlc3QsIHRydWUsIHRoaXMuc2hpbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmcmVlemUoKSB7XG4gICAgICAgIHRoaXMuZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgICAgICAgICAgYWxpYXNNYXA6IHRoaXMuYWxpYXNNYXAsXG4gICAgICAgICAgICBkZWZhdWx0Q29tbWFuZDogdGhpcy5kZWZhdWx0Q29tbWFuZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuZnJlZXplKCkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSB0aGlzLmZyb3plbnMucG9wKCk7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKGZyb3plbiwgdW5kZWZpbmVkLCB0aGlzLnNoaW0pO1xuICAgICAgICAoe1xuICAgICAgICAgICAgaGFuZGxlcnM6IHRoaXMuaGFuZGxlcnMsXG4gICAgICAgICAgICBhbGlhc01hcDogdGhpcy5hbGlhc01hcCxcbiAgICAgICAgICAgIGRlZmF1bHRDb21tYW5kOiB0aGlzLmRlZmF1bHRDb21tYW5kLFxuICAgICAgICB9ID0gZnJvemVuKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5hbGlhc01hcCA9IHt9O1xuICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlcXVpcmVDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmQodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmRJbnN0YW5jZSh1c2FnZSwgdmFsaWRhdGlvbiwgZ2xvYmFsTWlkZGxld2FyZSwgc2hpbSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24oYnVpbGRlcikge1xuICAgIHJldHVybiAodHlwZW9mIGJ1aWxkZXIgPT09ICdvYmplY3QnICYmXG4gICAgICAgICEhYnVpbGRlci5idWlsZGVyICYmXG4gICAgICAgIHR5cGVvZiBidWlsZGVyLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpO1xufVxuZnVuY3Rpb24gaXNDb21tYW5kQW5kQWxpYXNlcyhjbWQpIHtcbiAgICByZXR1cm4gY21kLmV2ZXJ5KGMgPT4gdHlwZW9mIGMgPT09ICdzdHJpbmcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikge1xuICAgIHJldHVybiB0eXBlb2YgYnVpbGRlciA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyhidWlsZGVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBidWlsZGVyID09PSAnb2JqZWN0Jztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbihjbWQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNtZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY21kKTtcbn1cbiIsInZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn07XG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9ICh0aGlzICYmIHRoaXMuX19jbGFzc1ByaXZhdGVGaWVsZEdldCkgfHwgZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufTtcbnZhciBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIF9ZYXJnc0luc3RhbmNlX2Zyb3plbnMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgX1lhcmdzSW5zdGFuY2VfcGtncywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbjtcbmltcG9ydCB7IGNvbW1hbmQgYXMgQ29tbWFuZCwgfSBmcm9tICcuL2NvbW1hbmQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIGFzc2VydFNpbmdsZUtleSwgb2JqZWN0S2V5cywgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4veWVycm9yLmpzJztcbmltcG9ydCB7IHVzYWdlIGFzIFVzYWdlIH0gZnJvbSAnLi91c2FnZS5qcyc7XG5pbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGNvbXBsZXRpb24gYXMgQ29tcGxldGlvbiwgfSBmcm9tICcuL2NvbXBsZXRpb24uanMnO1xuaW1wb3J0IHsgdmFsaWRhdGlvbiBhcyBWYWxpZGF0aW9uLCB9IGZyb20gJy4vdmFsaWRhdGlvbi5qcyc7XG5pbXBvcnQgeyBvYmpGaWx0ZXIgfSBmcm9tICcuL3V0aWxzL29iai1maWx0ZXIuanMnO1xuaW1wb3J0IHsgYXBwbHlFeHRlbmRzIH0gZnJvbSAnLi91dGlscy9hcHBseS1leHRlbmRzLmpzJztcbmltcG9ydCB7IGFwcGx5TWlkZGxld2FyZSwgR2xvYmFsTWlkZGxld2FyZSwgfSBmcm9tICcuL21pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi91dGlscy9pcy1wcm9taXNlLmpzJztcbmltcG9ydCB7IG1heWJlQXN5bmNSZXN1bHQgfSBmcm9tICcuL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyc7XG5pbXBvcnQgc2V0QmxvY2tpbmcgZnJvbSAnLi91dGlscy9zZXQtYmxvY2tpbmcuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIFlhcmdzRmFjdG9yeShfc2hpbSkge1xuICAgIHJldHVybiAocHJvY2Vzc0FyZ3MgPSBbXSwgY3dkID0gX3NoaW0ucHJvY2Vzcy5jd2QoKSwgcGFyZW50UmVxdWlyZSkgPT4ge1xuICAgICAgICBjb25zdCB5YXJncyA9IG5ldyBZYXJnc0luc3RhbmNlKHByb2Nlc3NBcmdzLCBjd2QsIHBhcmVudFJlcXVpcmUsIF9zaGltKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHlhcmdzLCAnYXJndicsIHtcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5wYXJzZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB5YXJncy5oZWxwKCk7XG4gICAgICAgIHlhcmdzLnZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHlhcmdzO1xuICAgIH07XG59XG5jb25zdCBrQ29weURvdWJsZURhc2ggPSBTeW1ib2woJ2NvcHlEb3VibGVEYXNoJyk7XG5jb25zdCBrQ3JlYXRlTG9nZ2VyID0gU3ltYm9sKCdjb3B5RG91YmxlRGFzaCcpO1xuY29uc3Qga0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0ID0gU3ltYm9sKCdkZWxldGVGcm9tUGFyc2VySGludE9iamVjdCcpO1xuY29uc3Qga0VtaXRXYXJuaW5nID0gU3ltYm9sKCdlbWl0V2FybmluZycpO1xuY29uc3Qga0ZyZWV6ZSA9IFN5bWJvbCgnZnJlZXplJyk7XG5jb25zdCBrR2V0RG9sbGFyWmVybyA9IFN5bWJvbCgnZ2V0RG9sbGFyWmVybycpO1xuY29uc3Qga0dldFBhcnNlckNvbmZpZ3VyYXRpb24gPSBTeW1ib2woJ2dldFBhcnNlckNvbmZpZ3VyYXRpb24nKTtcbmNvbnN0IGtHZXRVc2FnZUNvbmZpZ3VyYXRpb24gPSBTeW1ib2woJ2dldFVzYWdlQ29uZmlndXJhdGlvbicpO1xuY29uc3Qga0d1ZXNzTG9jYWxlID0gU3ltYm9sKCdndWVzc0xvY2FsZScpO1xuY29uc3Qga0d1ZXNzVmVyc2lvbiA9IFN5bWJvbCgnZ3Vlc3NWZXJzaW9uJyk7XG5jb25zdCBrUGFyc2VQb3NpdGlvbmFsTnVtYmVycyA9IFN5bWJvbCgncGFyc2VQb3NpdGlvbmFsTnVtYmVycycpO1xuY29uc3Qga1BrZ1VwID0gU3ltYm9sKCdwa2dVcCcpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludEFycmF5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnRBcnJheScpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5Jyk7XG5jb25zdCBrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnRBcnJheURpY3Rpb25hcnknKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5Jyk7XG5jb25zdCBrU2FuaXRpemVLZXkgPSBTeW1ib2woJ3Nhbml0aXplS2V5Jyk7XG5jb25zdCBrU2V0S2V5ID0gU3ltYm9sKCdzZXRLZXknKTtcbmNvbnN0IGtVbmZyZWV6ZSA9IFN5bWJvbCgndW5mcmVlemUnKTtcbmNvbnN0IGtWYWxpZGF0ZUFzeW5jID0gU3ltYm9sKCd2YWxpZGF0ZUFzeW5jJyk7XG5jb25zdCBrR2V0Q29tbWFuZEluc3RhbmNlID0gU3ltYm9sKCdnZXRDb21tYW5kSW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRDb250ZXh0ID0gU3ltYm9sKCdnZXRDb250ZXh0Jyk7XG5jb25zdCBrR2V0SGFzT3V0cHV0ID0gU3ltYm9sKCdnZXRIYXNPdXRwdXQnKTtcbmNvbnN0IGtHZXRMb2dnZXJJbnN0YW5jZSA9IFN5bWJvbCgnZ2V0TG9nZ2VySW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRQYXJzZUNvbnRleHQgPSBTeW1ib2woJ2dldFBhcnNlQ29udGV4dCcpO1xuY29uc3Qga0dldFVzYWdlSW5zdGFuY2UgPSBTeW1ib2woJ2dldFVzYWdlSW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRWYWxpZGF0aW9uSW5zdGFuY2UgPSBTeW1ib2woJ2dldFZhbGlkYXRpb25JbnN0YW5jZScpO1xuY29uc3Qga0hhc1BhcnNlQ2FsbGJhY2sgPSBTeW1ib2woJ2hhc1BhcnNlQ2FsbGJhY2snKTtcbmNvbnN0IGtJc0dsb2JhbENvbnRleHQgPSBTeW1ib2woJ2lzR2xvYmFsQ29udGV4dCcpO1xuY29uc3Qga1Bvc3RQcm9jZXNzID0gU3ltYm9sKCdwb3N0UHJvY2VzcycpO1xuY29uc3Qga1JlYmFzZSA9IFN5bWJvbCgncmViYXNlJyk7XG5jb25zdCBrUmVzZXQgPSBTeW1ib2woJ3Jlc2V0Jyk7XG5jb25zdCBrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMgPSBTeW1ib2woJ3J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzJyk7XG5jb25zdCBrUnVuVmFsaWRhdGlvbiA9IFN5bWJvbCgncnVuVmFsaWRhdGlvbicpO1xuY29uc3Qga1NldEhhc091dHB1dCA9IFN5bWJvbCgnc2V0SGFzT3V0cHV0Jyk7XG5jb25zdCBrVHJhY2tNYW51YWxseVNldEtleXMgPSBTeW1ib2woJ2tUcmFja01hbnVhbGx5U2V0S2V5cycpO1xuZXhwb3J0IGNsYXNzIFlhcmdzSW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb2Nlc3NBcmdzID0gW10sIGN3ZCwgcGFyZW50UmVxdWlyZSwgc2hpbSkge1xuICAgICAgICB0aGlzLmN1c3RvbVNjcmlwdE5hbWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29tbWFuZC5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY3dkLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LnNldCh0aGlzLCB7IGNvbW1hbmRzOiBbXSwgZnVsbENvbW1hbmRzOiBbXSB9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbi5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQuc2V0KHRoaXMsICdzaG93LWhpZGRlbicpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3Iuc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUuc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3Muc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3Muc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLnNldCh0aGlzLCBbXSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2dyb3Vwcy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQuc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfaGVscE9wdC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2lzR2xvYmFsQ29udGV4dC5zZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2xvZ2dlci5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LnNldCh0aGlzLCAnJyk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGtncy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3Muc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3NoaW0uc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3N0cmljdC5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3VzYWdlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbi5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBzaGltLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIHByb2Nlc3NBcmdzLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBjd2QsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBwYXJlbnRSZXF1aXJlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgbmV3IEdsb2JhbE1pZGRsZXdhcmUodGhpcyksIFwiZlwiKTtcbiAgICAgICAgdGhpcy4kMCA9IHRoaXNba0dldERvbGxhclplcm9dKCk7XG4gICAgICAgIHRoaXNba1Jlc2V0XSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIiksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2hvd0hpZGRlbk9wdCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIHRoaXNba0NyZWF0ZUxvZ2dlcl0oKSwgXCJmXCIpO1xuICAgIH1cbiAgICBhZGRIZWxwT3B0KG9wdCwgbXNnKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRIZWxwT3B0ID0gJ2hlbHAnO1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddJywgW29wdCwgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgdGhpc1trRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHQgPT09IGZhbHNlICYmIG1zZyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBkZWZhdWx0SGVscE9wdCwgXCJmXCIpO1xuICAgICAgICB0aGlzLmJvb2xlYW4oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpLCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyBoZWxwJykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaGVscChvcHQsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRIZWxwT3B0KG9wdCwgbXNnKTtcbiAgICB9XG4gICAgYWRkU2hvd0hpZGRlbk9wdChvcHQsIG1zZykge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddJywgW29wdCwgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChvcHQgPT09IGZhbHNlICYmIG1zZyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGNvbnN0IHNob3dIaWRkZW5PcHQgPSB0eXBlb2Ygb3B0ID09PSAnc3RyaW5nJyA/IG9wdCA6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIFwiZlwiKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKHNob3dIaWRkZW5PcHQpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlKHNob3dIaWRkZW5PcHQsIG1zZyB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVmZXJZMThuTG9va3VwKCdTaG93IGhpZGRlbiBvcHRpb25zJykpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5zaG93SGlkZGVuT3B0ID0gc2hvd0hpZGRlbk9wdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dIaWRkZW4ob3B0LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkU2hvd0hpZGRlbk9wdChvcHQsIG1zZyk7XG4gICAgfVxuICAgIGFsaWFzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5XSh0aGlzLmFsaWFzLmJpbmQodGhpcyksICdhbGlhcycsIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXJyYXkoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnYXJyYXknLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYm9vbGVhbihrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdib29sZWFuJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNoZWNrKGYsIGdsb2JhbCkge1xuICAgICAgICBhcmdzZXJ0KCc8ZnVuY3Rpb24+IFtib29sZWFuXScsIFtmLCBnbG9iYWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlKChhcmd2LCBfeWFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZihhcmd2LCBfeWFyZ3MuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgICAgIH0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLl9fKCdBcmd1bWVudCBjaGVjayBmYWlsZWQ6ICVzJywgZi50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsKHJlc3VsdC50b1N0cmluZygpLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogZXJyLnRvU3RyaW5nKCksIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZmFsc2UsIGdsb2JhbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjaG9pY2VzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSwgJ2Nob2ljZXMnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvZXJjZShrZXlzLCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0fHN0cmluZ3xhcnJheT4gW2Z1bmN0aW9uXScsIFtrZXlzLCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJ2NvZXJjZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2VyY2Uoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGtleXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2VyY2Uoa2V5LCBrZXlzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcignY29lcmNlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5c10gPSB0cnVlO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5hZGRDb2VyY2VNaWRkbGV3YXJlKChhcmd2LCB5YXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IGFsaWFzZXM7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRDb2VyY2UgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwga2V5cyk7XG4gICAgICAgICAgICBpZiAoIXNob3VsZENvZXJjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1heWJlQXN5bmNSZXN1bHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFsaWFzZXMgPSB5YXJncy5nZXRBbGlhc2VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGFyZ3Zba2V5c10pO1xuICAgICAgICAgICAgfSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGFyZ3Zba2V5c10gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBBbGlhc2VkID0geWFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbJ3N0cmlwLWFsaWFzZWQnXTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXNlc1trZXlzXSAmJiBzdHJpcEFsaWFzZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzW2tleXNdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W2FsaWFzXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbmZsaWN0cyhrZXkxLCBrZXkyKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbc3RyaW5nfGFycmF5XScsIFtrZXkxLCBrZXkyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmNvbmZsaWN0cyhrZXkxLCBrZXkyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbmZpZyhrZXkgPSAnY29uZmlnJywgbXNnLCBwYXJzZUZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dJywgW2tleSwgbXNnLCBwYXJzZUZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICBrZXkgPSBhcHBseUV4dGVuZHMoa2V5LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydkZWVwLW1lcmdlLWNvbmZpZyddIHx8IGZhbHNlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzID0gKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgfHwgW10pLmNvbmNhdChrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHBhcnNlRm4gPSBtc2c7XG4gICAgICAgICAgICBtc2cgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXNjcmliZShrZXksIG1zZyB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVmZXJZMThuTG9va3VwKCdQYXRoIHRvIEpTT04gY29uZmlnIGZpbGUnKSk7XG4gICAgICAgIChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ1trXSA9IHBhcnNlRm4gfHwgdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb21wbGV0aW9uKGNtZCwgZGVzYywgZm4pIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10gW3N0cmluZ3xib29sZWFufGZ1bmN0aW9uXSBbZnVuY3Rpb25dJywgW2NtZCwgZGVzYywgZm5dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBmbiA9IGRlc2M7XG4gICAgICAgICAgICBkZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIGNtZCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikgfHwgJ2NvbXBsZXRpb24nLCBcImZcIik7XG4gICAgICAgIGlmICghZGVzYyAmJiBkZXNjICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVzYyA9ICdnZW5lcmF0ZSBjb21wbGV0aW9uIHNjcmlwdCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSwgZGVzYyk7XG4gICAgICAgIGlmIChmbilcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24oZm4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfGFycmF5fG9iamVjdD4gW3N0cmluZ3xib29sZWFuXSBbZnVuY3Rpb258b2JqZWN0XSBbZnVuY3Rpb25dIFthcnJheV0gW2Jvb2xlYW58c3RyaW5nXScsIFtjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5hZGRIYW5kbGVyKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbW1hbmRzKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgICBjb21tYW5kRGlyKGRpciwgb3B0cykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiBbb2JqZWN0XScsIFtkaXIsIG9wdHNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVxID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBcImZcIikgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucmVxdWlyZTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuYWRkRGlyZWN0b3J5KGRpciwgcmVxLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRDYWxsZXJGaWxlKCksIG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY291bnQoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnY291bnQnLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVmYXVsdChrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFsqXSBbc3RyaW5nXScsIFtrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb25dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKGRlZmF1bHREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgYXNzZXJ0U2luZ2xlS2V5KGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPSBkZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXNzZXJ0U2luZ2xlS2V5KGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSlcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSA9XG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mdW5jdGlvbkRlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuY2FsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5kZWZhdWx0LmJpbmQodGhpcyksICdkZWZhdWx0Jywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWZhdWx0cyhrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdChrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICBkZW1hbmRDb21tYW5kKG1pbiA9IDEsIG1heCwgbWluTXNnLCBtYXhNc2cpIHtcbiAgICAgICAgYXJnc2VydCgnW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdJywgW21pbiwgbWF4LCBtaW5Nc2csIG1heE1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIG1heCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG1pbk1zZyA9IG1heDtcbiAgICAgICAgICAgIG1heCA9IEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2xvYmFsKCdfJywgZmFsc2UpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl8gPSB7XG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXgsXG4gICAgICAgICAgICBtaW5Nc2csXG4gICAgICAgICAgICBtYXhNc2csXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZW1hbmQoa2V5cywgbWF4LCBtc2cpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF4KSkge1xuICAgICAgICAgICAgbWF4LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIG1zZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1heCA9IEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBtYXggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtc2cgPSBtYXg7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIHRoaXMuZGVtYW5kQ29tbWFuZChrZXlzLCBtYXgsIG1zZywgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIG1zZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVtYW5kT3B0aW9uKGtleXMsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtc2cgPT09IHRydWUgfHwgdHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVtYW5kT3B0aW9uKGtleXMsIG1zZykge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ10nLCBba2V5cywgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5kZW1hbmRPcHRpb24uYmluZCh0aGlzKSwgJ2RlbWFuZGVkT3B0aW9ucycsIGtleXMsIG1zZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXByZWNhdGVPcHRpb24ob3B0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+IFtzdHJpbmd8Ym9vbGVhbl0nLCBbb3B0aW9uLCBtZXNzYWdlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zW29wdGlvbl0gPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVzY3JpYmUoa2V5cywgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2tleXMsIGRlc2NyaXB0aW9uXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1NldEtleV0oa2V5cywgdHJ1ZSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZXNjcmliZShrZXlzLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXRlY3RMb2NhbGUoZGV0ZWN0KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxib29sZWFuPicsIFtkZXRlY3RdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGRldGVjdCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZW52KHByZWZpeCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dJywgW3ByZWZpeF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAocHJlZml4ID09PSBmYWxzZSlcbiAgICAgICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXg7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmVudlByZWZpeCA9IHByZWZpeCB8fCAnJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVwaWxvZ3VlKG1zZykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPicsIFttc2ddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmVwaWxvZyhtc2cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXBpbG9nKG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lcGlsb2d1ZShtc2cpO1xuICAgIH1cbiAgICBleGFtcGxlKGNtZCwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheT4gW3N0cmluZ10nLCBbY21kLCBkZXNjcmlwdGlvbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbWQpKSB7XG4gICAgICAgICAgICBjbWQuZm9yRWFjaChleGFtcGxlUGFyYW1zID0+IHRoaXMuZXhhbXBsZSguLi5leGFtcGxlUGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZXhhbXBsZShjbWQsIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXhpdChjb2RlLCBlcnIpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIGVyciwgXCJmXCIpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgIH1cbiAgICBleGl0UHJvY2VzcyhlbmFibGVkID0gdHJ1ZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBlbmFibGVkLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmYWlsKGYpIHtcbiAgICAgICAgYXJnc2VydCgnPGZ1bmN0aW9ufGJvb2xlYW4+JywgW2ZdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnYm9vbGVhbicgJiYgZiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWxGbihmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldEFsaWFzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlZCA/IHRoaXMucGFyc2VkLmFsaWFzZXMgOiB7fTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0Q29tcGxldGlvbihhcmdzLCBkb25lKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheT4gW2Z1bmN0aW9uXScsIFthcmdzLCBkb25lXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICghZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZXRDb21wbGV0aW9uKGFyZ3MsIChlcnIsIGNvbXBsZXRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZXRDb21wbGV0aW9uKGFyZ3MsIGRvbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldERlbWFuZGVkT3B0aW9ucygpIHtcbiAgICAgICAgYXJnc2VydChbXSwgMCk7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZW1hbmRlZE9wdGlvbnM7XG4gICAgfVxuICAgIGdldERlbWFuZGVkQ29tbWFuZHMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRDb21tYW5kcztcbiAgICB9XG4gICAgZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVwcmVjYXRlZE9wdGlvbnM7XG4gICAgfVxuICAgIGdldERldGVjdExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBcImZcIik7XG4gICAgfVxuICAgIGdldEV4aXRQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRHcm91cHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpKTtcbiAgICB9XG4gICAgZ2V0SGVscCgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGFzQ2FjaGVkSGVscE1lc3NhZ2UoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlID0gdGhpc1trUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UocGFyc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyUmVzcG9uc2UgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShidWlsZGVyUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJSZXNwb25zZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5oZWxwKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpKTtcbiAgICB9XG4gICAgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRTdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRTdHJpY3RDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpO1xuICAgIH1cbiAgICBnbG9iYWwoZ2xvYmFscywgZ2xvYmFsKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IFtib29sZWFuXScsIFtnbG9iYWxzLCBnbG9iYWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgZ2xvYmFscyA9IFtdLmNvbmNhdChnbG9iYWxzKTtcbiAgICAgICAgaWYgKGdsb2JhbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwuZmlsdGVyKGwgPT4gZ2xvYmFscy5pbmRleE9mKGwpID09PSAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxzLmZvckVhY2goZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbC5pbmNsdWRlcyhnKSlcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwucHVzaChnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBncm91cChvcHRzLCBncm91cE5hbWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheT4gPHN0cmluZz4nLCBbb3B0cywgZ3JvdXBOYW1lXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKVtncm91cE5hbWVdIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSkge1xuICAgICAgICAgICAgZGVsZXRlIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVuID0ge307XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSA9IChleGlzdGluZyB8fCBbXSkuY29uY2F0KG9wdHMpLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlZW5ba2V5XSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gKHNlZW5ba2V5XSA9IHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGhpZGUoa2V5KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+JywgW2tleV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2goa2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGltcGxpZXMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuaW1wbGllcyhrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGxvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10nLCBbbG9jYWxlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChsb2NhbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1trR3Vlc3NMb2NhbGVdKCk7XG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5nZXRMb2NhbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5zZXRMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1pZGRsZXdhcmUoY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5hZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCAhIWFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsKTtcbiAgICB9XG4gICAgbmFyZ3Moa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdHxhcnJheT4gW251bWJlcl0nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMubmFyZ3MuYmluZCh0aGlzKSwgJ25hcmcnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG5vcm1hbGl6ZShrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdub3JtYWxpemUnLCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG51bWJlcihrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdudW1iZXInLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9uKGtleSwgb3B0KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbb2JqZWN0XScsIFtrZXksIG9wdF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgb3B0ID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5KTtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSAmJiAoa2V5ID09PSAndmVyc2lvbicgfHwgKG9wdCA9PT0gbnVsbCB8fCBvcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdC5hbGlhcykgPT09ICd2ZXJzaW9uJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tFbWl0V2FybmluZ10oW1xuICAgICAgICAgICAgICAgICAgICAnXCJ2ZXJzaW9uXCIgaXMgYSByZXNlcnZlZCB3b3JkLicsXG4gICAgICAgICAgICAgICAgICAgICdQbGVhc2UgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6JyxcbiAgICAgICAgICAgICAgICAgICAgJy0gRGlzYWJsZSB2ZXJzaW9uIHdpdGggYHlhcmdzLnZlcnNpb24oZmFsc2UpYCBpZiB1c2luZyBcInZlcnNpb25cIiBhcyBhbiBvcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnLSBVc2UgdGhlIGJ1aWx0LWluIGB5YXJncy52ZXJzaW9uYCBtZXRob2QgaW5zdGVhZCAoaWYgYXBwbGljYWJsZSknLFxuICAgICAgICAgICAgICAgICAgICAnLSBVc2UgYSBkaWZmZXJlbnQgb3B0aW9uIGtleScsXG4gICAgICAgICAgICAgICAgICAgICdodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksIHVuZGVmaW5lZCwgJ3ZlcnNpb25XYXJuaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWxpYXMoa2V5LCBvcHQuYWxpYXMpO1xuICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlID0gb3B0LmRlcHJlY2F0ZSB8fCBvcHQuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgIGlmIChkZXByZWNhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcHJlY2F0ZU9wdGlvbihrZXksIGRlcHJlY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZW1hbmQgPSBvcHQuZGVtYW5kIHx8IG9wdC5yZXF1aXJlZCB8fCBvcHQucmVxdWlyZTtcbiAgICAgICAgICAgIGlmIChkZW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZChrZXksIGRlbWFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmRlbWFuZE9wdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVtYW5kT3B0aW9uKGtleSwgdHlwZW9mIG9wdC5kZW1hbmRPcHRpb24gPT09ICdzdHJpbmcnID8gb3B0LmRlbWFuZE9wdGlvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvbmZsaWN0cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmxpY3RzKGtleSwgb3B0LmNvbmZsaWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIG9wdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdChrZXksIG9wdC5kZWZhdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuaW1wbGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBsaWVzKGtleSwgb3B0LmltcGxpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5uYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXJncyhrZXksIG9wdC5uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnKGtleSwgb3B0LmNvbmZpZ1BhcnNlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNob2ljZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNob2ljZXMoa2V5LCBvcHQuY2hvaWNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvZXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwgb3B0LmNvZXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cChrZXksIG9wdC5ncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmJvb2xlYW4gfHwgb3B0LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbihvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5hcnJheSB8fCBvcHQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFycmF5KG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lm51bWJlciB8fCBvcHQudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bWJlcihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyKG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LnN0cmluZyB8fCBvcHQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nKG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvdW50IHx8IG9wdC50eXBlID09PSAnY291bnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHQuZ2xvYmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbChrZXksIG9wdC5nbG9iYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5kZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSA9IG9wdC5kZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LnNraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbihrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVzYyA9IG9wdC5kZXNjcmliZSB8fCBvcHQuZGVzY3JpcHRpb24gfHwgb3B0LmRlc2M7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZ2V0RGVzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZXNjcmlwdGlvbnMsIGtleSkgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGVzYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaWJlKGtleSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5yZXF1aXJlc0FyZykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZXNBcmcoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9ucyhrZXksIG9wdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb24oa2V5LCBvcHQpO1xuICAgIH1cbiAgICBwYXJzZShhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmd8YXJyYXldIFtmdW5jdGlvbnxib29sZWFufG9iamVjdF0gW2Z1bmN0aW9uXScsIFthcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba0ZyZWV6ZV0oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgYXJncyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNob3J0Q2lyY3VpdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBzaG9ydENpcmN1aXQsIFwiZlwiKTtcbiAgICAgICAgICAgIHNob3J0Q2lyY3VpdCA9IF9wYXJzZUZuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvcnRDaXJjdWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIHNob3J0Q2lyY3VpdCwgXCJmXCIpO1xuICAgICAgICAgICAgc2hvcnRDaXJjdWl0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaG9ydENpcmN1aXQpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBhcmdzLCBcImZcIik7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShhcmdzLCAhIXNob3J0Q2lyY3VpdCk7XG4gICAgICAgIGNvbnN0IHRtcFBhcnNlZCA9IHRoaXMucGFyc2VkO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgICAgICAgICAudGhlbihhcmd2ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpLmNhbGwodGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSwgYXJndiwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKShlcnIsIHRoaXMucGFyc2VkLmFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzW2tVbmZyZWV6ZV0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZCA9IHRtcFBhcnNlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpKVxuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpLmNhbGwodGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSwgcGFyc2VkLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpKTtcbiAgICAgICAgICAgIHRoaXNba1VuZnJlZXplXSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0bXBQYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gICAgcGFyc2VBc3luYyhhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKSB7XG4gICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHRoaXMucGFyc2UoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbik7XG4gICAgICAgIHJldHVybiAhaXNQcm9taXNlKG1heWJlUHJvbWlzZSlcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSlcbiAgICAgICAgICAgIDogbWF5YmVQcm9taXNlO1xuICAgIH1cbiAgICBwYXJzZVN5bmMoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLnBhcnNlKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pO1xuICAgICAgICBpZiAoaXNQcm9taXNlKG1heWJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJy5wYXJzZVN5bmMoKSBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYXN5bmNocm9ub3VzIGJ1aWxkZXJzLCBoYW5kbGVycywgb3IgbWlkZGxld2FyZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZVByb21pc2U7XG4gICAgfVxuICAgIHBhcnNlckNvbmZpZ3VyYXRpb24oY29uZmlnKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3Q+JywgW2NvbmZpZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZywgY29uZmlnLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwa2dDb25mKGtleSwgcm9vdFBhdGgpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gW3N0cmluZ10nLCBba2V5LCByb290UGF0aF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBsZXQgY29uZiA9IG51bGw7XG4gICAgICAgIGNvbnN0IG9iaiA9IHRoaXNba1BrZ1VwXShyb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpKTtcbiAgICAgICAgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbmYgPSBhcHBseUV4dGVuZHMob2JqW2tleV0sIHJvb3RQYXRoIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBcImZcIiksIHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ2RlZXAtbWVyZ2UtY29uZmlnJ10gfHwgZmFsc2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyB8fCBbXSkuY29uY2F0KGNvbmYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwb3NpdGlvbmFsKGtleSwgb3B0cykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiA8b2JqZWN0PicsIFtrZXksIG9wdHNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkT3B0cyA9IFtcbiAgICAgICAgICAgICdkZWZhdWx0JyxcbiAgICAgICAgICAgICdkZWZhdWx0RGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2ltcGxpZXMnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnY2hvaWNlcycsXG4gICAgICAgICAgICAnY29uZmxpY3RzJyxcbiAgICAgICAgICAgICdjb2VyY2UnLFxuICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICAgJ2Rlc2NyaWJlJyxcbiAgICAgICAgICAgICdkZXNjJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAnYWxpYXMnLFxuICAgICAgICBdO1xuICAgICAgICBvcHRzID0gb2JqRmlsdGVyKG9wdHMsIChrLCB2KSA9PiB7XG4gICAgICAgICAgICBpZiAoayA9PT0gJ3R5cGUnICYmICFbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRzLmluY2x1ZGVzKGspO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZnVsbENvbW1hbmQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIFwiZlwiKS5mdWxsQ29tbWFuZHNbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBcImZcIikuZnVsbENvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBwYXJzZU9wdGlvbnMgPSBmdWxsQ29tbWFuZFxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhmdWxsQ29tbWFuZClcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGFycmF5OiBbXSxcbiAgICAgICAgICAgICAgICBhbGlhczoge30sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge30sXG4gICAgICAgICAgICAgICAgZGVtYW5kOiB7fSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIG9iamVjdEtleXMocGFyc2VPcHRpb25zKS5mb3JFYWNoKHBrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlT3B0aW9uID0gcGFyc2VPcHRpb25zW3BrXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlT3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZU9wdGlvbi5pbmRleE9mKGtleSkgIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBvcHRzW3BrXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VPcHRpb25ba2V5XSAmJiAhKHBrIGluIG9wdHMpKVxuICAgICAgICAgICAgICAgICAgICBvcHRzW3BrXSA9IHBhcnNlT3B0aW9uW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyb3VwKGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbihrZXksIG9wdHMpO1xuICAgIH1cbiAgICByZWNvbW1lbmRDb21tYW5kcyhyZWNvbW1lbmQgPSB0cnVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtyZWNvbW1lbmRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcywgcmVjb21tZW5kLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXF1aXJlZChrZXlzLCBtYXgsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW1hbmQoa2V5cywgbWF4LCBtc2cpO1xuICAgIH1cbiAgICByZXF1aXJlKGtleXMsIG1heCwgbXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbWFuZChrZXlzLCBtYXgsIG1zZyk7XG4gICAgfVxuICAgIHJlcXVpcmVzQXJnKGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZ3xvYmplY3Q+IFtudW1iZXJdJywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJyAmJiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5uYXJnW2tleXNdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLCAnbmFyZycsIGtleXMsIE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dDb21wbGV0aW9uU2NyaXB0KCQwLCBjbWQpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10gW3N0cmluZ10nLCBbJDAsIGNtZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICAkMCA9ICQwIHx8IHRoaXMuJDA7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCBcImZcIikubG9nKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLmdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCgkMCwgY21kIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSB8fCAnY29tcGxldGlvbicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dIZWxwKGxldmVsKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmd8ZnVuY3Rpb25dJywgW2xldmVsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZSA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5zaG93SGVscChsZXZlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyUmVzcG9uc2UgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShidWlsZGVyUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgYnVpbGRlclJlc3BvbnNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5zaG93SGVscChsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzY3JpcHROYW1lKHNjcmlwdE5hbWUpIHtcbiAgICAgICAgdGhpcy5jdXN0b21TY3JpcHROYW1lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4kMCA9IHNjcmlwdE5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGVscE9uRmFpbChlbmFibGVkLCBtZXNzYWdlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFufHN0cmluZ10gW3N0cmluZ10nLCBbZW5hYmxlZCwgbWVzc2FnZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHBPbkZhaWwoZW5hYmxlZCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93VmVyc2lvbihsZXZlbCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGZ1bmN0aW9uXScsIFtsZXZlbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd1ZlcnNpb24obGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2tpcFZhbGlkYXRpb24oa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnc2tpcFZhbGlkYXRpb24nLCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdChlbmFibGVkKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtlbmFibGVkXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBlbmFibGVkICE9PSBmYWxzZSwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RyaWN0Q29tbWFuZHMoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBlbmFibGVkICE9PSBmYWxzZSwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RyaWN0T3B0aW9ucyhlbmFibGVkKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtlbmFibGVkXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmluZyhrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdzdHJpbmcnLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGVybWluYWxXaWR0aCgpIHtcbiAgICAgICAgYXJnc2VydChbXSwgMCk7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnM7XG4gICAgfVxuICAgIHVwZGF0ZUxvY2FsZShvYmopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RyaW5ncyhvYmopO1xuICAgIH1cbiAgICB1cGRhdGVTdHJpbmdzKG9iaikge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0PicsIFtvYmpdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKG9iaik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1c2FnZShtc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXScsIFttc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIG51bGwsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIGlmICgobXNnIHx8ICcnKS5tYXRjaCgvXlxcJDAoIHwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZChtc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJy51c2FnZSgpIGRlc2NyaXB0aW9uIG11c3Qgc3RhcnQgd2l0aCAkMCBpZiBiZWluZyB1c2VkIGFzIGFsaWFzIGZvciAuY29tbWFuZCgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudXNhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVzYWdlQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdD4nLCBbY29uZmlnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIGNvbmZpZywgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmVyc2lvbihvcHQsIG1zZywgdmVyKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWZXJzaW9uT3B0ID0gJ3ZlcnNpb24nO1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddJywgW29wdCwgbXNnLCB2ZXJdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKSB7XG4gICAgICAgICAgICB0aGlzW2tEZWxldGVGcm9tUGFyc2VySGludE9iamVjdF0oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnZlcnNpb24odW5kZWZpbmVkKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB2ZXIgPSB0aGlzW2tHdWVzc1ZlcnNpb25dKCk7XG4gICAgICAgICAgICBvcHQgPSBkZWZhdWx0VmVyc2lvbk9wdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAob3B0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVyID0gb3B0O1xuICAgICAgICAgICAgb3B0ID0gZGVmYXVsdFZlcnNpb25PcHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdmVyID0gbXNnO1xuICAgICAgICAgICAgbXNnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBkZWZhdWx0VmVyc2lvbk9wdCwgXCJmXCIpO1xuICAgICAgICBtc2cgPSBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyB2ZXJzaW9uIG51bWJlcicpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudmVyc2lvbih2ZXIgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSwgbXNnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHdyYXAoY29scykge1xuICAgICAgICBhcmdzZXJ0KCc8bnVtYmVyfG51bGx8dW5kZWZpbmVkPicsIFtjb2xzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS53cmFwKGNvbHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgWyhfWWFyZ3NJbnN0YW5jZV9jb21tYW5kID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY3dkID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY29udGV4dCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2dyb3VwcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wa2dzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3NoaW0gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24gPSBuZXcgV2Vha01hcCgpLCBrQ29weURvdWJsZURhc2gpXShhcmd2KSB7XG4gICAgICAgIGlmICghYXJndi5fIHx8ICFhcmd2WyctLSddKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIGFyZ3YuXy5wdXNoLmFwcGx5KGFyZ3YuXywgYXJndlsnLS0nXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgYXJndlsnLS0nXTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2VycikgeyB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba0NyZWF0ZUxvZ2dlcl0oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2c6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzW2tIYXNQYXJzZUNhbGxiYWNrXSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikgKyAnXFxuJywgXCJmXCIpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgYXJncy5qb2luKCcgJyksIFwiZlwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNba0hhc1BhcnNlQ2FsbGJhY2tdKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgJ1xcbicsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArIGFyZ3Muam9pbignICcpLCBcImZcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBba0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0XShvcHRpb25LZXkpIHtcbiAgICAgICAgb2JqZWN0S2V5cyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSkuZm9yRWFjaCgoaGludEtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCgoa2V5KSA9PiBrZXkgPT09ICdjb25maWdPYmplY3RzJykoaGludEtleSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaGludCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW2hpbnRLZXldO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGludCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGludC5pbmNsdWRlcyhvcHRpb25LZXkpKVxuICAgICAgICAgICAgICAgICAgICBoaW50LnNwbGljZShoaW50LmluZGV4T2Yob3B0aW9uS2V5KSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgaGludCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGludFtvcHRpb25LZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKVtvcHRpb25LZXldO1xuICAgIH1cbiAgICBba0VtaXRXYXJuaW5nXSh3YXJuaW5nLCB0eXBlLCBkZWR1cGxpY2F0aW9uSWQpIHtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgXCJmXCIpW2RlZHVwbGljYXRpb25JZF0pIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgXCJmXCIpW2RlZHVwbGljYXRpb25JZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtrRnJlZXplXSgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLCBcImZcIikucHVzaCh7XG4gICAgICAgICAgICBvcHRpb25zOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMuc2xpY2UoMCksXG4gICAgICAgICAgICBleGl0UHJvY2VzczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpLFxuICAgICAgICAgICAgZ3JvdXBzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpLFxuICAgICAgICAgICAgc3RyaWN0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpLFxuICAgICAgICAgICAgc3RyaWN0Q29tbWFuZHM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdE9wdGlvbnM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpLFxuICAgICAgICAgICAgY29tcGxldGlvbkNvbW1hbmQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSxcbiAgICAgICAgICAgIG91dHB1dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSxcbiAgICAgICAgICAgIGV4aXRFcnJvcjogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSxcbiAgICAgICAgICAgIGhhc091dHB1dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKSxcbiAgICAgICAgICAgIHBhcnNlZDogdGhpcy5wYXJzZWQsXG4gICAgICAgICAgICBwYXJzZUZuOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSxcbiAgICAgICAgICAgIHBhcnNlQ29udGV4dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQsIFwiZlwiKSxcbiAgICAgICAgfSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuZnJlZXplKCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5mcmVlemUoKTtcbiAgICB9XG4gICAgW2tHZXREb2xsYXJaZXJvXSgpIHtcbiAgICAgICAgbGV0ICQwID0gJyc7XG4gICAgICAgIGxldCBkZWZhdWx0JDA7XG4gICAgICAgIGlmICgvXFxiKG5vZGV8aW9qc3xlbGVjdHJvbikoXFwuZXhlKT8kLy50ZXN0KF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuYXJndigpWzBdKSkge1xuICAgICAgICAgICAgZGVmYXVsdCQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMSwgMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0JDAgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgwLCAxKTtcbiAgICAgICAgfVxuICAgICAgICAkMCA9IGRlZmF1bHQkMFxuICAgICAgICAgICAgLm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzW2tSZWJhc2VdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBcImZcIiksIHgpO1xuICAgICAgICAgICAgcmV0dXJuIHgubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykgJiYgYi5sZW5ndGggPCB4Lmxlbmd0aCA/IGIgOiB4O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmdldEVudignXycpICYmXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRQcm9jZXNzQXJndkJpbigpID09PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ18nKSkge1xuICAgICAgICAgICAgJDAgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5nZXRFbnYoJ18nKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAke19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZGlybmFtZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmV4ZWNQYXRoKCkpfS9gLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQwO1xuICAgIH1cbiAgICBba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRVc2FnZUNvbmZpZ3VyYXRpb25dKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZywgXCJmXCIpO1xuICAgIH1cbiAgICBba0d1ZXNzTG9jYWxlXSgpIHtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgXCJmXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBsb2NhbGUgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xDX0FMTCcpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xDX01FU1NBR0VTJykgfHxcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmdldEVudignTEFORycpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xBTkdVQUdFJykgfHxcbiAgICAgICAgICAgICdlbl9VUyc7XG4gICAgICAgIHRoaXMubG9jYWxlKGxvY2FsZS5yZXBsYWNlKC9bLjpdLiovLCAnJykpO1xuICAgIH1cbiAgICBba0d1ZXNzVmVyc2lvbl0oKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHRoaXNba1BrZ1VwXSgpO1xuICAgICAgICByZXR1cm4gb2JqLnZlcnNpb24gfHwgJ3Vua25vd24nO1xuICAgIH1cbiAgICBba1BhcnNlUG9zaXRpb25hbE51bWJlcnNdKGFyZ3YpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3ZbJy0tJ10gPyBhcmd2WyctLSddIDogYXJndi5fO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYXJnOyAoYXJnID0gYXJnc1tpXSkgIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuUGFyc2VyLmxvb2tzTGlrZU51bWJlcihhcmcpICYmXG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoTWF0aC5mbG9vcihwYXJzZUZsb2F0KGAke2FyZ31gKSkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tpXSA9IE51bWJlcihhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba1BrZ1VwXShyb290UGF0aCkge1xuICAgICAgICBjb25zdCBucGF0aCA9IHJvb3RQYXRoIHx8ICcqJztcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGtncywgXCJmXCIpW25wYXRoXSlcbiAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF07XG4gICAgICAgIGxldCBvYmogPSB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzdGFydERpciA9IHJvb3RQYXRoIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLm1haW5GaWxlbmFtZTtcbiAgICAgICAgICAgIGlmICghcm9vdFBhdGggJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5leHRuYW1lKHN0YXJ0RGlyKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGlyID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5kaXJuYW1lKHN0YXJ0RGlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZmluZFVwKHN0YXJ0RGlyLCAoZGlyLCBuYW1lcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lcy5pbmNsdWRlcygncGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdwYWNrYWdlLmpzb24nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHBrZ0pzb25QYXRoLCB1bmRlZmluZWQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucmVhZEZpbGVTeW5jKHBrZ0pzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX25vb3ApIHsgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF0gPSBvYmogfHwge307XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF07XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKHR5cGUsIGtleXMpIHtcbiAgICAgICAga2V5cyA9IFtdLmNvbmNhdChrZXlzKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBrZXkgPSB0aGlzW2tTYW5pdGl6ZUtleV0oa2V5KTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW3R5cGVdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludERpY3Rpb25hcnldKGJ1aWxkZXIsIHR5cGUsIGtleSwgdmFsdWUsICh0eXBlLCBrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCAodHlwZSwga2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXVtrZXldIHx8IFtdKS5jb25jYXQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCBzaW5nbGVLZXlIYW5kbGVyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIGtleS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIoaywgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKChrZXkpID0+IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKShrZXkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2Ygb2JqZWN0S2V5cyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgYnVpbGRlcihrLCBrZXlba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2luZ2xlS2V5SGFuZGxlcih0eXBlLCB0aGlzW2tTYW5pdGl6ZUtleV0oa2V5KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtrU2FuaXRpemVLZXldKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICBba1NldEtleV0oa2V5LCBzZXQpIHtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XSh0aGlzW2tTZXRLZXldLmJpbmQodGhpcyksICdrZXknLCBrZXksIHNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBba1VuZnJlZXplXSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZnJvemVucywgXCJmXCIpLnBvcCgpO1xuICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChmcm96ZW4sIHVuZGVmaW5lZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICBsZXQgY29uZmlnT2JqZWN0cztcbiAgICAgICAgKF9hID0gdGhpcywgX2IgPSB0aGlzLCBfYyA9IHRoaXMsIF9kID0gdGhpcywgX2UgPSB0aGlzLCBfZiA9IHRoaXMsIF9nID0gdGhpcywgX2ggPSB0aGlzLCBfaiA9IHRoaXMsIF9rID0gdGhpcywgX2wgPSB0aGlzLCBfbSA9IHRoaXMsIHtcbiAgICAgICAgICAgIG9wdGlvbnM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9hLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0cyxcbiAgICAgICAgICAgIGV4aXRQcm9jZXNzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYiwgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBncm91cHM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9jLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBvdXRwdXQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9kLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBleGl0RXJyb3I6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9lLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBoYXNPdXRwdXQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9mLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBwYXJzZWQ6IHRoaXMucGFyc2VkLFxuICAgICAgICAgICAgc3RyaWN0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgc3RyaWN0Q29tbWFuZHM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9oLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHN0cmljdE9wdGlvbnM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9qLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgY29tcGxldGlvbkNvbW1hbmQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9rLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHBhcnNlRm46ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9sLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgcGFyc2VDb250ZXh0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfbSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICB9ID0gZnJvemVuKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyA9IGNvbmZpZ09iamVjdHM7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgIH1cbiAgICBba1ZhbGlkYXRlQXN5bmNdKHZhbGlkYXRpb24sIGFyZ3YpIHtcbiAgICAgICAgcmV0dXJuIG1heWJlQXN5bmNSZXN1bHQoYXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRJbnRlcm5hbE1ldGhvZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXRDb21tYW5kSW5zdGFuY2U6IHRoaXNba0dldENvbW1hbmRJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldENvbnRleHQ6IHRoaXNba0dldENvbnRleHRdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRIYXNPdXRwdXQ6IHRoaXNba0dldEhhc091dHB1dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldExvZ2dlckluc3RhbmNlOiB0aGlzW2tHZXRMb2dnZXJJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFBhcnNlQ29udGV4dDogdGhpc1trR2V0UGFyc2VDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0UGFyc2VyQ29uZmlndXJhdGlvbjogdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFVzYWdlQ29uZmlndXJhdGlvbjogdGhpc1trR2V0VXNhZ2VDb25maWd1cmF0aW9uXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0VXNhZ2VJbnN0YW5jZTogdGhpc1trR2V0VXNhZ2VJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFZhbGlkYXRpb25JbnN0YW5jZTogdGhpc1trR2V0VmFsaWRhdGlvbkluc3RhbmNlXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgaGFzUGFyc2VDYWxsYmFjazogdGhpc1trSGFzUGFyc2VDYWxsYmFja10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGlzR2xvYmFsQ29udGV4dDogdGhpc1trSXNHbG9iYWxDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcG9zdFByb2Nlc3M6IHRoaXNba1Bvc3RQcm9jZXNzXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVzZXQ6IHRoaXNba1Jlc2V0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcnVuVmFsaWRhdGlvbjogdGhpc1trUnVuVmFsaWRhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOiB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHNldEhhc091dHB1dDogdGhpc1trU2V0SGFzT3V0cHV0XS5iaW5kKHRoaXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBba0dldENvbW1hbmRJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29udGV4dCwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldEhhc091dHB1dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldExvZ2dlckluc3RhbmNlXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0UGFyc2VDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIikgfHwge307XG4gICAgfVxuICAgIFtrR2V0VXNhZ2VJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0VmFsaWRhdGlvbkluc3RhbmNlXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpO1xuICAgIH1cbiAgICBba0hhc1BhcnNlQ2FsbGJhY2tdKCkge1xuICAgICAgICByZXR1cm4gISFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKTtcbiAgICB9XG4gICAgW2tJc0dsb2JhbENvbnRleHRdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tQb3N0UHJvY2Vzc10oYXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCBjYWxsZWRGcm9tQ29tbWFuZCwgcnVuR2xvYmFsTWlkZGxld2FyZSkge1xuICAgICAgICBpZiAoY2FsbGVkRnJvbUNvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShhcmd2KSlcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICBpZiAoIXBvcHVsYXRlRG91YmxlRGFzaCkge1xuICAgICAgICAgICAgYXJndiA9IHRoaXNba0NvcHlEb3VibGVEYXNoXShhcmd2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZVBvc2l0aW9uYWxOdW1iZXJzID0gdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKVsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gfHxcbiAgICAgICAgICAgIHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyddID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwYXJzZVBvc2l0aW9uYWxOdW1iZXJzKSB7XG4gICAgICAgICAgICBhcmd2ID0gdGhpc1trUGFyc2VQb3NpdGlvbmFsTnVtYmVyc10oYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bkdsb2JhbE1pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGFyZ3YgPSBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgfVxuICAgIFtrUmVzZXRdKGFsaWFzZXMgPSB7fSkge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpIHx8IHt9LCBcImZcIik7XG4gICAgICAgIGNvbnN0IHRtcE9wdGlvbnMgPSB7fTtcbiAgICAgICAgdG1wT3B0aW9ucy5sb2NhbCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsIHx8IFtdO1xuICAgICAgICB0bXBPcHRpb25zLmNvbmZpZ09iamVjdHMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzIHx8IFtdO1xuICAgICAgICBjb25zdCBsb2NhbExvb2t1cCA9IHt9O1xuICAgICAgICB0bXBPcHRpb25zLmxvY2FsLmZvckVhY2gobCA9PiB7XG4gICAgICAgICAgICBsb2NhbExvb2t1cFtsXSA9IHRydWU7XG4gICAgICAgICAgICAoYWxpYXNlc1tsXSB8fCBbXSkuZm9yRWFjaChhID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbExvb2t1cFthXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKSwgT2JqZWN0LmtleXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSkucmVkdWNlKChhY2MsIGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXS5maWx0ZXIoa2V5ID0+ICEoa2V5IGluIGxvY2FsTG9va3VwKSk7XG4gICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYWNjW2dyb3VwTmFtZV0gPSBrZXlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIHt9LCBcImZcIik7XG4gICAgICAgIGNvbnN0IGFycmF5T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICdhcnJheScsXG4gICAgICAgICAgICAnYm9vbGVhbicsXG4gICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgICdza2lwVmFsaWRhdGlvbicsXG4gICAgICAgICAgICAnY291bnQnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdoaWRkZW5PcHRpb25zJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgb2JqZWN0T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICduYXJnJyxcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2FsaWFzJyxcbiAgICAgICAgICAgICdkZWZhdWx0JyxcbiAgICAgICAgICAgICdkZWZhdWx0RGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICAgICAnY2hvaWNlcycsXG4gICAgICAgICAgICAnZGVtYW5kZWRPcHRpb25zJyxcbiAgICAgICAgICAgICdkZW1hbmRlZENvbW1hbmRzJyxcbiAgICAgICAgICAgICdkZXByZWNhdGVkT3B0aW9ucycsXG4gICAgICAgIF07XG4gICAgICAgIGFycmF5T3B0aW9ucy5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgdG1wT3B0aW9uc1trXSA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtrXSB8fCBbXSkuZmlsdGVyKChrKSA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JqZWN0T3B0aW9ucy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICB0bXBPcHRpb25zW2tdID0gb2JqRmlsdGVyKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW2tdLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0bXBPcHRpb25zLmVudlByZWZpeCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmVudlByZWZpeDtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCB0bXBPcHRpb25zLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKVxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikucmVzZXQobG9jYWxMb29rdXApXG4gICAgICAgICAgICA6IFVzYWdlKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpXG4gICAgICAgICAgICA/IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlc2V0KGxvY2FsTG9va3VwKVxuICAgICAgICAgICAgOiBWYWxpZGF0aW9uKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIilcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucmVzZXQoKVxuICAgICAgICAgICAgOiBDb21tYW5kKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgQ29tcGxldGlvbih0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikucmVzZXQoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgJycsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIHRoaXMucGFyc2VkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBba1JlYmFzZV0oYmFzZSwgZGlyKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wYXRoLnJlbGF0aXZlKGJhc2UsIGRpcik7XG4gICAgfVxuICAgIFtrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdKGFyZ3MsIHNob3J0Q2lyY3VpdCwgY2FsbGVkRnJvbUNvbW1hbmQsIGNvbW1hbmRJbmRleCA9IDAsIGhlbHBPbmx5ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHNraXBWYWxpZGF0aW9uID0gISFjYWxsZWRGcm9tQ29tbWFuZCB8fCBoZWxwT25seTtcbiAgICAgICAgYXJncyA9IGFyZ3MgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5fXyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uX187XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb24gPSB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpO1xuICAgICAgICBjb25zdCBwb3B1bGF0ZURvdWJsZURhc2ggPSAhIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb25bJ3BvcHVsYXRlLS0nXTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlndXJhdGlvbiwge1xuICAgICAgICAgICAgJ3BvcHVsYXRlLS0nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuUGFyc2VyLmRldGFpbGVkKGFyZ3MsIE9iamVjdC5hc3NpZ24oe30sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLCB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7ICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSwgLi4uY29uZmlnIH0sXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgYXJndiA9IE9iamVjdC5hc3NpZ24ocGFyc2VkLmFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIikpO1xuICAgICAgICBsZXQgYXJndlByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBwYXJzZWQuYWxpYXNlcztcbiAgICAgICAgbGV0IGhlbHBPcHRTZXQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZlcnNpb25PcHRTZXQgPSBmYWxzZTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikgJiYgYXJndltrZXldKSB7XG4gICAgICAgICAgICAgICAgaGVscE9wdFNldCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpICYmIGFyZ3Zba2V5XSkge1xuICAgICAgICAgICAgICAgIHZlcnNpb25PcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXJndi4kMCA9IHRoaXMuJDA7XG4gICAgICAgIHRoaXMucGFyc2VkID0gcGFyc2VkO1xuICAgICAgICBpZiAoY29tbWFuZEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzW2tHdWVzc0xvY2FsZV0oKTtcbiAgICAgICAgICAgIGlmIChzaG9ydENpcmN1aXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVscENtZHMgPSBbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIildXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQoYWxpYXNlc1tfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKV0gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoayA9PiBrLmxlbmd0aCA+IDEpO1xuICAgICAgICAgICAgICAgIGlmIChoZWxwQ21kcy5pbmNsdWRlcygnJyArIGFyZ3YuX1thcmd2Ll8ubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3YuXy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaGVscE9wdFNldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIGZhbHNlLCBcImZcIik7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyS2V5cyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmdldENvbW1hbmRzKCk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Q29tcGxldGlvbnMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5jb21wbGV0aW9uS2V5IGluIGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBza2lwUmVjb21tZW5kYXRpb24gPSBoZWxwT3B0U2V0IHx8IHJlcXVlc3RDb21wbGV0aW9ucyB8fCBoZWxwT25seTtcbiAgICAgICAgICAgIGlmIChhcmd2Ll8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RVbmtub3duQ29tbWFuZDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbW1hbmRJbmRleCB8fCAwLCBjbWQ7IGFyZ3YuX1tpXSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IFN0cmluZyhhcmd2Ll9baV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJLZXlzLmluY2x1ZGVzKGNtZCkgJiYgY21kICE9PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckFyZ3YgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5Db21tYW5kKGNtZCwgdGhpcywgcGFyc2VkLCBpICsgMSwgaGVscE9ubHksIGhlbHBPcHRTZXQgfHwgdmVyc2lvbk9wdFNldCB8fCBoZWxwT25seSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShpbm5lckFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0VW5rbm93bkNvbW1hbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgIT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VW5rbm93bkNvbW1hbmQgPSBjbWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5oYXNEZWZhdWx0Q29tbWFuZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLCBcImZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VW5rbm93bkNvbW1hbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFza2lwUmVjb21tZW5kYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlY29tbWVuZENvbW1hbmRzKGZpcnN0VW5rbm93bkNvbW1hbmQsIGhhbmRsZXJLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGFyZ3YuXy5pbmNsdWRlcyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXF1ZXN0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJsb2NraW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDb21wbGV0aW9uU2NyaXB0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSAmJiAhc2tpcFJlY29tbWVuZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuQ29tbWFuZChudWxsLCB0aGlzLCBwYXJzZWQsIDAsIGhlbHBPbmx5LCBoZWxwT3B0U2V0IHx8IHZlcnNpb25PcHRTZXQgfHwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oaW5uZXJBcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICBhcmdzID0gW10uY29uY2F0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRpb25BcmdzID0gYXJncy5zbGljZShhcmdzLmluZGV4T2YoYC0tJHtfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5jb21wbGV0aW9uS2V5fWApICsgMSk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihjb21wbGV0aW9uQXJncywgKGVyciwgY29tcGxldGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGlvbnMgfHwgW10pLmZvckVhY2goY29tcGxldGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpLmxvZyhjb21wbGV0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3YsICFwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGlmIChoZWxwT3B0U2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dIZWxwKCdsb2cnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2ZXJzaW9uT3B0U2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd1ZlcnNpb24oJ2xvZycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbiAmJiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSBPYmplY3Qua2V5cyhhcmd2KS5zb21lKGtleSA9PiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKGtleSkgPj0gMCAmJiBhcmd2W2tleV0gPT09IHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IocGFyc2VkLmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzW2tSdW5WYWxpZGF0aW9uXShhbGlhc2VzLCB7fSwgcGFyc2VkLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRGcm9tQ29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndlByb21pc2UgPSBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmd2UHJvbWlzZSA9IHRoaXNba1ZhbGlkYXRlQXN5bmNdKHZhbGlkYXRpb24sIGFyZ3ZQcm9taXNlICE9PSBudWxsICYmIGFyZ3ZQcm9taXNlICE9PSB2b2lkIDAgPyBhcmd2UHJvbWlzZSA6IGFyZ3YpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGFyZ3ZQcm9taXNlKSAmJiAhY2FsbGVkRnJvbUNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZQcm9taXNlID0gYXJndlByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5TWlkZGxld2FyZShhcmd2LCB0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBZRXJyb3IpXG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoZXJyLm1lc3NhZ2UsIGVycik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oYXJndlByb21pc2UgIT09IG51bGwgJiYgYXJndlByb21pc2UgIT09IHZvaWQgMCA/IGFyZ3ZQcm9taXNlIDogYXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCB0cnVlKTtcbiAgICB9XG4gICAgW2tSdW5WYWxpZGF0aW9uXShhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCBwYXJzZUVycm9ycywgaXNEZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICBjb25zdCBkZW1hbmRlZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ2V0RGVtYW5kZWRPcHRpb25zKCkgfTtcbiAgICAgICAgcmV0dXJuIChhcmd2KSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyc2VFcnJvcnMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihwYXJzZUVycm9ycy5tZXNzYWdlKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLm5vbk9wdGlvbkNvdW50KGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikucmVxdWlyZWRBcmd1bWVudHMoYXJndiwgZGVtYW5kZWRPcHRpb25zKTtcbiAgICAgICAgICAgIGxldCBmYWlsZWRTdHJpY3RDb21tYW5kcyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZFN0cmljdENvbW1hbmRzID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkNvbW1hbmRzKGFyZ3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBcImZcIikgJiYgIWZhaWxlZFN0cmljdENvbW1hbmRzKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCAhIWlzRGVmYXVsdENvbW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS51bmtub3duQXJndW1lbnRzKGFyZ3YsIGFsaWFzZXMsIHt9LCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikubGltaXRlZENob2ljZXMoYXJndik7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5pbXBsaWNhdGlvbnMoYXJndik7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5jb25mbGljdGluZyhhcmd2KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tTZXRIYXNPdXRwdXRdKCkge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgIH1cbiAgICBba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmtleVtrZXlzXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmtleVtrXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNZYXJnc0luc3RhbmNlKHkpIHtcbiAgICByZXR1cm4gISF5ICYmIHR5cGVvZiB5LmdldEludGVybmFsTWV0aG9kcyA9PT0gJ2Z1bmN0aW9uJztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdoaWNoTW9kdWxlKGV4cG9ydGVkKSB7XG4gICAgaWYgKHR5cGVvZiByZXF1aXJlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDAsIGZpbGVzID0gT2JqZWN0LmtleXMocmVxdWlyZS5jYWNoZSksIG1vZDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vZCA9IHJlcXVpcmUuY2FjaGVbZmlsZXNbaV1dO1xuICAgICAgICBpZiAobW9kLmV4cG9ydHMgPT09IGV4cG9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgeyBvYmplY3RLZXlzIH0gZnJvbSAnLi4vdHlwaW5ncy9jb21tb24tdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIG9iakZpbHRlcihvcmlnaW5hbCA9IHt9LCBmaWx0ZXIgPSAoKSA9PiB0cnVlKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgb2JqZWN0S2V5cyhvcmlnaW5hbCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyKGtleSwgb3JpZ2luYWxba2V5XSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gb3JpZ2luYWxba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRCbG9ja2luZyhibG9ja2luZykge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybjtcbiAgICBbcHJvY2Vzcy5zdGRvdXQsIHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKF9zdHJlYW0gPT4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBfc3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiZcbiAgICAgICAgICAgIHN0cmVhbS5pc1RUWSAmJlxuICAgICAgICAgICAgdHlwZW9mIHN0cmVhbS5faGFuZGxlLnNldEJsb2NraW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2hhbmRsZS5zZXRCbG9ja2luZyhibG9ja2luZyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IG9iakZpbHRlciB9IGZyb20gJy4vdXRpbHMvb2JqLWZpbHRlci5qcyc7XG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgc2V0QmxvY2tpbmcgZnJvbSAnLi91dGlscy9zZXQtYmxvY2tpbmcuanMnO1xuZnVuY3Rpb24gaXNCb29sZWFuKGZhaWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIGZhaWwgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2FnZSh5YXJncywgc2hpbSkge1xuICAgIGNvbnN0IF9fID0gc2hpbS55MThuLl9fO1xuICAgIGNvbnN0IHNlbGYgPSB7fTtcbiAgICBjb25zdCBmYWlscyA9IFtdO1xuICAgIHNlbGYuZmFpbEZuID0gZnVuY3Rpb24gZmFpbEZuKGYpIHtcbiAgICAgICAgZmFpbHMucHVzaChmKTtcbiAgICB9O1xuICAgIGxldCBmYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgbGV0IGdsb2JhbEZhaWxNZXNzYWdlID0gbnVsbDtcbiAgICBsZXQgc2hvd0hlbHBPbkZhaWwgPSB0cnVlO1xuICAgIHNlbGYuc2hvd0hlbHBPbkZhaWwgPSBmdW5jdGlvbiBzaG93SGVscE9uRmFpbEZuKGFyZzEgPSB0cnVlLCBhcmcyKSB7XG4gICAgICAgIGNvbnN0IFtlbmFibGVkLCBtZXNzYWdlXSA9IHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyA/IFt0cnVlLCBhcmcxXSA6IFthcmcxLCBhcmcyXTtcbiAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpKSB7XG4gICAgICAgICAgICBnbG9iYWxGYWlsTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgZmFpbE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBzaG93SGVscE9uRmFpbCA9IGVuYWJsZWQ7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgbGV0IGZhaWx1cmVPdXRwdXQgPSBmYWxzZTtcbiAgICBzZWxmLmZhaWwgPSBmdW5jdGlvbiBmYWlsKG1zZywgZXJyKSB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmIChmYWlscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBmYWlscy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWwgPSBmYWlsc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNCb29sZWFuKGZhaWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1zZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKG1zZywgZXJyLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0RXhpdFByb2Nlc3MoKSlcbiAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgIGlmICghZmFpbHVyZU91dHB1dCkge1xuICAgICAgICAgICAgICAgIGZhaWx1cmVPdXRwdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChzaG93SGVscE9uRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICB5YXJncy5zaG93SGVscCgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtc2cgfHwgZXJyKVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobXNnIHx8IGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UgPSBmYWlsTWVzc2FnZSB8fCBnbG9iYWxGYWlsTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyB8fCBlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJycpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVyciA9IGVyciB8fCBuZXcgWUVycm9yKG1zZyk7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0RXhpdFByb2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuaGFzUGFyc2VDYWxsYmFjaygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlhcmdzLmV4aXQoMSwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHVzYWdlcyA9IFtdO1xuICAgIGxldCB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgc2VsZi51c2FnZSA9IChtc2csIGRlc2NyaXB0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtc2cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdXNhZ2VzID0gW107XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuICAgICAgICB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHVzYWdlcy5wdXNoKFttc2csIGRlc2NyaXB0aW9uIHx8ICcnXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgc2VsZi5nZXRVc2FnZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVzYWdlcztcbiAgICB9O1xuICAgIHNlbGYuZ2V0VXNhZ2VEaXNhYmxlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVzYWdlRGlzYWJsZWQ7XG4gICAgfTtcbiAgICBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBfXygnUG9zaXRpb25hbHM6Jyk7XG4gICAgfTtcbiAgICBsZXQgZXhhbXBsZXMgPSBbXTtcbiAgICBzZWxmLmV4YW1wbGUgPSAoY21kLCBkZXNjcmlwdGlvbikgPT4ge1xuICAgICAgICBleGFtcGxlcy5wdXNoKFtjbWQsIGRlc2NyaXB0aW9uIHx8ICcnXSk7XG4gICAgfTtcbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcbiAgICBzZWxmLmNvbW1hbmQgPSBmdW5jdGlvbiBjb21tYW5kKGNtZCwgZGVzY3JpcHRpb24sIGlzRGVmYXVsdCwgYWxpYXNlcywgZGVwcmVjYXRlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMubWFwKGNtZEFycmF5ID0+IHtcbiAgICAgICAgICAgICAgICBjbWRBcnJheVsyXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbWRBcnJheTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1hbmRzLnB1c2goW2NtZCwgZGVzY3JpcHRpb24gfHwgJycsIGlzRGVmYXVsdCwgYWxpYXNlcywgZGVwcmVjYXRlZF0pO1xuICAgIH07XG4gICAgc2VsZi5nZXRDb21tYW5kcyA9ICgpID0+IGNvbW1hbmRzO1xuICAgIGxldCBkZXNjcmlwdGlvbnMgPSB7fTtcbiAgICBzZWxmLmRlc2NyaWJlID0gZnVuY3Rpb24gZGVzY3JpYmUoa2V5T3JLZXlzLCBkZXNjKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleU9yS2V5cykpIHtcbiAgICAgICAgICAgIGtleU9yS2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoaywgZGVzYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5T3JLZXlzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoa2V5T3JLZXlzKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoaywga2V5T3JLZXlzW2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25zW2tleU9yS2V5c10gPSBkZXNjO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLmdldERlc2NyaXB0aW9ucyA9ICgpID0+IGRlc2NyaXB0aW9ucztcbiAgICBsZXQgZXBpbG9ncyA9IFtdO1xuICAgIHNlbGYuZXBpbG9nID0gbXNnID0+IHtcbiAgICAgICAgZXBpbG9ncy5wdXNoKG1zZyk7XG4gICAgfTtcbiAgICBsZXQgd3JhcFNldCA9IGZhbHNlO1xuICAgIGxldCB3cmFwO1xuICAgIHNlbGYud3JhcCA9IGNvbHMgPT4ge1xuICAgICAgICB3cmFwU2V0ID0gdHJ1ZTtcbiAgICAgICAgd3JhcCA9IGNvbHM7XG4gICAgfTtcbiAgICBzZWxmLmdldFdyYXAgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzaGltLmdldEVudignWUFSR1NfRElTQUJMRV9XUkFQJykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghd3JhcFNldCkge1xuICAgICAgICAgICAgd3JhcCA9IHdpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgICB3cmFwU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcDtcbiAgICB9O1xuICAgIGNvbnN0IGRlZmVyWTE4bkxvb2t1cFByZWZpeCA9ICdfX3lhcmdzU3RyaW5nX186JztcbiAgICBzZWxmLmRlZmVyWTE4bkxvb2t1cCA9IHN0ciA9PiBkZWZlclkxOG5Mb29rdXBQcmVmaXggKyBzdHI7XG4gICAgc2VsZi5oZWxwID0gZnVuY3Rpb24gaGVscCgpIHtcbiAgICAgICAgaWYgKGNhY2hlZEhlbHBNZXNzYWdlKVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEhlbHBNZXNzYWdlO1xuICAgICAgICBub3JtYWxpemVBbGlhc2VzKCk7XG4gICAgICAgIGNvbnN0IGJhc2UkMCA9IHlhcmdzLmN1c3RvbVNjcmlwdE5hbWVcbiAgICAgICAgICAgID8geWFyZ3MuJDBcbiAgICAgICAgICAgIDogc2hpbS5wYXRoLmJhc2VuYW1lKHlhcmdzLiQwKTtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRPcHRpb25zID0geWFyZ3MuZ2V0RGVtYW5kZWRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkQ29tbWFuZHMgPSB5YXJncy5nZXREZW1hbmRlZENvbW1hbmRzKCk7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRPcHRpb25zID0geWFyZ3MuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0geWFyZ3MuZ2V0R3JvdXBzKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGxldCBrZXlzID0gW107XG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChPYmplY3Qua2V5cyhkZXNjcmlwdGlvbnMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKGRlbWFuZGVkT3B0aW9ucykpO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMoZGVtYW5kZWRDb21tYW5kcykpO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMob3B0aW9ucy5kZWZhdWx0KSk7XG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihmaWx0ZXJIaWRkZW5PcHRpb25zKTtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ18nKVxuICAgICAgICAgICAgICAgIGFjY1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KSk7XG4gICAgICAgIGNvbnN0IHRoZVdyYXAgPSBzZWxmLmdldFdyYXAoKTtcbiAgICAgICAgY29uc3QgdWkgPSBzaGltLmNsaXVpKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGVXcmFwLFxuICAgICAgICAgICAgd3JhcDogISF0aGVXcmFwLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1c2FnZURpc2FibGVkKSB7XG4gICAgICAgICAgICBpZiAodXNhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHVzYWdlcy5mb3JFYWNoKHVzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHsgdGV4dDogYCR7dXNhZ2VbMF0ucmVwbGFjZSgvXFwkMC9nLCBiYXNlJDApfWAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHsgdGV4dDogYCR7dXNhZ2VbMV19YCwgcGFkZGluZzogWzEsIDAsIDAsIDBdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRlbWFuZGVkQ29tbWFuZHMuXykge1xuICAgICAgICAgICAgICAgICAgICB1ID0gYCR7YmFzZSQwfSA8JHtfXygnY29tbWFuZCcpfT5cXG5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdSA9IGAke2Jhc2UkMH0gWyR7X18oJ2NvbW1hbmQnKX1dXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdWkuZGl2KGAke3V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDEgfHwgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMSAmJiAhY29tbWFuZHNbMF1bMl0pKSB7XG4gICAgICAgICAgICB1aS5kaXYoX18oJ0NvbW1hbmRzOicpKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21tYW5kcyA9IGNvbnRleHQuY29tbWFuZHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBgJHtjb250ZXh0LmNvbW1hbmRzLmpvaW4oJyAnKX0gYFxuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpWydzb3J0LWNvbW1hbmRzJ10gPT09XG4gICAgICAgICAgICAgICAgdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGJhc2UkMCA/IGAke2Jhc2UkMH0gYCA6ICcnO1xuICAgICAgICAgICAgY29tbWFuZHMuZm9yRWFjaChjb21tYW5kID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kU3RyaW5nID0gYCR7cHJlZml4fSR7cGFyZW50Q29tbWFuZHN9JHtjb21tYW5kWzBdLnJlcGxhY2UoL15cXCQwID8vLCAnJyl9YDtcbiAgICAgICAgICAgICAgICB1aS5zcGFuKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY29tbWFuZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoY29tbWFuZHMsIHRoZVdyYXAsIGAke2Jhc2UkMH0ke3BhcmVudENvbW1hbmRzfWApICsgNCxcbiAgICAgICAgICAgICAgICB9LCB7IHRleHQ6IGNvbW1hbmRbMV0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZFsyXSlcbiAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlZmF1bHQnKX1dYCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbM10gJiYgY29tbWFuZFszXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2FsaWFzZXM6Jyl9ICR7Y29tbWFuZFszXS5qb2luKCcsICcpfV1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbNF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kWzRdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlcHJlY2F0ZWQ6ICVzJywgY29tbWFuZFs0XSl9XWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlcHJlY2F0ZWQnKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhpbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogaGludHMuam9pbignICcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDAsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGlhc0tleXMgPSAoT2JqZWN0LmtleXMob3B0aW9ucy5hbGlhcykgfHwgW10pLmNvbmNhdChPYmplY3Qua2V5cyh5YXJncy5wYXJzZWQubmV3QWxpYXNlcykgfHwgW10pO1xuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+ICF5YXJncy5wYXJzZWQubmV3QWxpYXNlc1trZXldICYmXG4gICAgICAgICAgICBhbGlhc0tleXMuZXZlcnkoYWxpYXMgPT4gKG9wdGlvbnMuYWxpYXNbYWxpYXNdIHx8IFtdKS5pbmRleE9mKGtleSkgPT09IC0xKSk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRHcm91cCA9IF9fKCdPcHRpb25zOicpO1xuICAgICAgICBpZiAoIWdyb3Vwc1tkZWZhdWx0R3JvdXBdKVxuICAgICAgICAgICAgZ3JvdXBzW2RlZmF1bHRHcm91cF0gPSBbXTtcbiAgICAgICAgYWRkVW5ncm91cGVkS2V5cyhrZXlzLCBvcHRpb25zLmFsaWFzLCBncm91cHMsIGRlZmF1bHRHcm91cCk7XG4gICAgICAgIGNvbnN0IGlzTG9uZ1N3aXRjaCA9IChzdykgPT4gL14tLS8udGVzdChnZXRUZXh0KHN3KSk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXllZEdyb3VwcyA9IE9iamVjdC5rZXlzKGdyb3VwcylcbiAgICAgICAgICAgIC5maWx0ZXIoZ3JvdXBOYW1lID0+IGdyb3Vwc1tncm91cE5hbWVdLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5cyA9IGdyb3Vwc1tncm91cE5hbWVdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmaWx0ZXJIaWRkZW5PcHRpb25zKVxuICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXNLZXlzLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGFsaWFzS2V5OyAoYWxpYXNLZXkgPSBhbGlhc0tleXNbaV0pICE9PSB1bmRlZmluZWQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbnMuYWxpYXNbYWxpYXNLZXldIHx8IFtdKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzS2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzIH07XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5vcm1hbGl6ZWRLZXlzIH0pID0+IG5vcm1hbGl6ZWRLZXlzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKCh7IGdyb3VwTmFtZSwgbm9ybWFsaXplZEtleXMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3dpdGNoZXMgPSBub3JtYWxpemVkS2V5cy5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBba2V5XVxuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KG9wdGlvbnMuYWxpYXNba2V5XSB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChzdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cE5hbWUgPT09IHNlbGYuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3O1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKC9eWzAtOV0kLy50ZXN0KHN3KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLS0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJy0tJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICctJykgKyBzdyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoc3cxLCBzdzIpID0+IGlzTG9uZ1N3aXRjaChzdzEpID09PSBpc0xvbmdTd2l0Y2goc3cyKVxuICAgICAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICAgICAgOiBpc0xvbmdTd2l0Y2goc3cxKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IC0xKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNob3J0U3dpdGNoZXNVc2VkID0gZGlzcGxheWVkR3JvdXBzXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGdyb3VwTmFtZSB9KSA9PiBncm91cE5hbWUgIT09IHNlbGYuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKVxuICAgICAgICAgICAgLnNvbWUoKHsgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH0pID0+ICFub3JtYWxpemVkS2V5cy5ldmVyeShrZXkgPT4gaXNMb25nU3dpdGNoKHN3aXRjaGVzW2tleV0pKSk7XG4gICAgICAgIGlmIChzaG9ydFN3aXRjaGVzVXNlZCkge1xuICAgICAgICAgICAgZGlzcGxheWVkR3JvdXBzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBncm91cE5hbWUgfSkgPT4gZ3JvdXBOYW1lICE9PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoeyBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9uZ1N3aXRjaChzd2l0Y2hlc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZXNba2V5XSA9IGFkZEluZGVudGF0aW9uKHN3aXRjaGVzW2tleV0sICcteCwgJy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwbGF5ZWRHcm91cHMuZm9yRWFjaCgoeyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzLCBzd2l0Y2hlcyB9KSA9PiB7XG4gICAgICAgICAgICB1aS5kaXYoZ3JvdXBOYW1lKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrc3dpdGNoID0gc3dpdGNoZXNba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGRlc2NyaXB0aW9uc1trZXldIHx8ICcnO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZGVzYy5pbmNsdWRlcyhkZWZlclkxOG5Mb29rdXBQcmVmaXgpKVxuICAgICAgICAgICAgICAgICAgICBkZXNjID0gX18oZGVzYy5zdWJzdHJpbmcoZGVmZXJZMThuTG9va3VwUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnYm9vbGVhbicpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvdW50LmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ2NvdW50Jyl9XWA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RyaW5nLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ3N0cmluZycpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm5vcm1hbGl6ZS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdzdHJpbmcnKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hcnJheS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdhcnJheScpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm51bWJlci5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdudW1iZXInKX1dYDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkRXh0cmEgPSAoZGVwcmVjYXRlZCkgPT4gdHlwZW9mIGRlcHJlY2F0ZWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gYFske19fKCdkZXByZWNhdGVkOiAlcycsIGRlcHJlY2F0ZWQpfV1gXG4gICAgICAgICAgICAgICAgICAgIDogYFske19fKCdkZXByZWNhdGVkJyl9XWA7XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmEgPSBbXG4gICAgICAgICAgICAgICAgICAgIGtleSBpbiBkZXByZWNhdGVkT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXByZWNhdGVkRXh0cmEoZGVwcmVjYXRlZE9wdGlvbnNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5IGluIGRlbWFuZGVkT3B0aW9ucyA/IGBbJHtfXygncmVxdWlyZWQnKX1dYCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2hvaWNlcyAmJiBvcHRpb25zLmNob2ljZXNba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgWyR7X18oJ2Nob2ljZXM6Jyl9ICR7c2VsZi5zdHJpbmdpZmllZFZhbHVlcyhvcHRpb25zLmNob2ljZXNba2V5XSl9XWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN0cmluZyhvcHRpb25zLmRlZmF1bHRba2V5XSwgb3B0aW9ucy5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgdWkuc3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGdldFRleHQoa3N3aXRjaCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAyLCAwLCAyICsgZ2V0SW5kZW50YXRpb24oa3N3aXRjaCldLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoc3dpdGNoZXMsIHRoZVdyYXApICsgNCxcbiAgICAgICAgICAgICAgICB9LCBkZXNjKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRIaWRlT3B0aW9uRXh0cmFzID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VDb25maWd1cmF0aW9uKClbJ2hpZGUtdHlwZXMnXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEgJiYgIXNob3VsZEhpZGVPcHRpb25FeHRyYXMpXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGV4dHJhLCBwYWRkaW5nOiBbMCwgMCwgMCwgMl0sIGFsaWduOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGV4YW1wbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdWkuZGl2KF9fKCdFeGFtcGxlczonKSk7XG4gICAgICAgICAgICBleGFtcGxlcy5mb3JFYWNoKGV4YW1wbGUgPT4ge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVbMF0gPSBleGFtcGxlWzBdLnJlcGxhY2UoL1xcJDAvZywgYmFzZSQwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhhbXBsZXMuZm9yRWFjaChleGFtcGxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhhbXBsZVsxXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMl0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoZXhhbXBsZXMsIHRoZVdyYXApICsgNCxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXhhbXBsZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXBpbG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZXBpbG9nc1xuICAgICAgICAgICAgICAgIC5tYXAoZXBpbG9nID0+IGVwaWxvZy5yZXBsYWNlKC9cXCQwL2csIGJhc2UkMCkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgdWkuZGl2KGAke2V9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBtYXhXaWR0aCh0YWJsZSwgdGhlV3JhcCwgbW9kaWZpZXIpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gMDtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhYmxlKSkge1xuICAgICAgICAgICAgdGFibGUgPSBPYmplY3QudmFsdWVzKHRhYmxlKS5tYXAodiA9PiBbdl0pO1xuICAgICAgICB9XG4gICAgICAgIHRhYmxlLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHNoaW0uc3RyaW5nV2lkdGgobW9kaWZpZXIgPyBgJHttb2RpZmllcn0gJHtnZXRUZXh0KHZbMF0pfWAgOiBnZXRUZXh0KHZbMF0pKSArIGdldEluZGVudGF0aW9uKHZbMF0pLCB3aWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhlV3JhcClcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHBhcnNlSW50KCh0aGVXcmFwICogMC41KS50b1N0cmluZygpLCAxMCkpO1xuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUFsaWFzZXMoKSB7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkT3B0aW9ucyA9IHlhcmdzLmdldERlbWFuZGVkT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICAoT2JqZWN0LmtleXMob3B0aW9ucy5hbGlhcykgfHwgW10pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxpYXNba2V5XS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2FsaWFzXSlcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZShrZXksIGRlc2NyaXB0aW9uc1thbGlhc10pO1xuICAgICAgICAgICAgICAgIGlmIChhbGlhcyBpbiBkZW1hbmRlZE9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLmRlbWFuZE9wdGlvbihrZXksIGRlbWFuZGVkT3B0aW9uc1thbGlhc10pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5ib29sZWFuKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY291bnQuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5jb3VudChrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZy5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLnN0cmluZyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm5vcm1hbGl6ZS5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLm5vcm1hbGl6ZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFycmF5LmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuYXJyYXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5udW1iZXIuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5udW1iZXIoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNhY2hlZEhlbHBNZXNzYWdlO1xuICAgIHNlbGYuY2FjaGVIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FjaGVkSGVscE1lc3NhZ2UgPSB0aGlzLmhlbHAoKTtcbiAgICB9O1xuICAgIHNlbGYuY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FjaGVkSGVscE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBzZWxmLmhhc0NhY2hlZEhlbHBNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISFjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGFkZFVuZ3JvdXBlZEtleXMoa2V5cywgYWxpYXNlcywgZ3JvdXBzLCBkZWZhdWx0R3JvdXApIHtcbiAgICAgICAgbGV0IGdyb3VwZWRLZXlzID0gW107XG4gICAgICAgIGxldCB0b0NoZWNrID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBzKS5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGdyb3VwZWRLZXlzID0gZ3JvdXBlZEtleXMuY29uY2F0KGdyb3Vwc1tncm91cF0pO1xuICAgICAgICB9KTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB0b0NoZWNrID0gW2tleV0uY29uY2F0KGFsaWFzZXNba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXRvQ2hlY2suc29tZShrID0+IGdyb3VwZWRLZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwc1tkZWZhdWx0R3JvdXBdLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cGVkS2V5cztcbiAgICB9XG4gICAgZnVuY3Rpb24gZmlsdGVySGlkZGVuT3B0aW9ucyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICh5YXJncy5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGtleSkgPCAwIHx8XG4gICAgICAgICAgICB5YXJncy5wYXJzZWQuYXJndlt5YXJncy5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF0pO1xuICAgIH1cbiAgICBzZWxmLnNob3dIZWxwID0gKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmICghbGV2ZWwpXG4gICAgICAgICAgICBsZXZlbCA9ICdlcnJvcic7XG4gICAgICAgIGNvbnN0IGVtaXQgPSB0eXBlb2YgbGV2ZWwgPT09ICdmdW5jdGlvbicgPyBsZXZlbCA6IGxvZ2dlcltsZXZlbF07XG4gICAgICAgIGVtaXQoc2VsZi5oZWxwKCkpO1xuICAgIH07XG4gICAgc2VsZi5mdW5jdGlvbkRlc2NyaXB0aW9uID0gZm4gPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGZuLm5hbWVcbiAgICAgICAgICAgID8gc2hpbS5QYXJzZXIuZGVjYW1lbGl6ZShmbi5uYW1lLCAnLScpXG4gICAgICAgICAgICA6IF9fKCdnZW5lcmF0ZWQtdmFsdWUnKTtcbiAgICAgICAgcmV0dXJuIFsnKCcsIGRlc2NyaXB0aW9uLCAnKSddLmpvaW4oJycpO1xuICAgIH07XG4gICAgc2VsZi5zdHJpbmdpZmllZFZhbHVlcyA9IGZ1bmN0aW9uIHN0cmluZ2lmaWVkVmFsdWVzKHZhbHVlcywgc2VwYXJhdG9yKSB7XG4gICAgICAgIGxldCBzdHJpbmcgPSAnJztcbiAgICAgICAgY29uc3Qgc2VwID0gc2VwYXJhdG9yIHx8ICcsICc7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gW10uY29uY2F0KHZhbHVlcyk7XG4gICAgICAgIGlmICghdmFsdWVzIHx8ICFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICBhcnJheS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBzZXA7XG4gICAgICAgICAgICBzdHJpbmcgKz0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRTdHJpbmcodmFsdWUsIGRlZmF1bHREZXNjcmlwdGlvbikge1xuICAgICAgICBsZXQgc3RyaW5nID0gYFske19fKCdkZWZhdWx0OicpfSBgO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhZGVmYXVsdERlc2NyaXB0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN0cmluZyArPSBkZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtzdHJpbmd9XWA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdpbmRvd1dpZHRoKCkge1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IDgwO1xuICAgICAgICBpZiAoc2hpbS5wcm9jZXNzLnN0ZENvbHVtbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihtYXhXaWR0aCwgc2hpbS5wcm9jZXNzLnN0ZENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICBzZWxmLnZlcnNpb24gPSB2ZXIgPT4ge1xuICAgICAgICB2ZXJzaW9uID0gdmVyO1xuICAgIH07XG4gICAgc2VsZi5zaG93VmVyc2lvbiA9IGxldmVsID0+IHtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtcbiAgICAgICAgaWYgKCFsZXZlbClcbiAgICAgICAgICAgIGxldmVsID0gJ2Vycm9yJztcbiAgICAgICAgY29uc3QgZW1pdCA9IHR5cGVvZiBsZXZlbCA9PT0gJ2Z1bmN0aW9uJyA/IGxldmVsIDogbG9nZ2VyW2xldmVsXTtcbiAgICAgICAgZW1pdCh2ZXJzaW9uKTtcbiAgICB9O1xuICAgIHNlbGYucmVzZXQgPSBmdW5jdGlvbiByZXNldChsb2NhbExvb2t1cCkge1xuICAgICAgICBmYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGZhaWx1cmVPdXRwdXQgPSBmYWxzZTtcbiAgICAgICAgdXNhZ2VzID0gW107XG4gICAgICAgIHVzYWdlRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgZXBpbG9ncyA9IFtdO1xuICAgICAgICBleGFtcGxlcyA9IFtdO1xuICAgICAgICBjb21tYW5kcyA9IFtdO1xuICAgICAgICBkZXNjcmlwdGlvbnMgPSBvYmpGaWx0ZXIoZGVzY3JpcHRpb25zLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgY29uc3QgZnJvemVucyA9IFtdO1xuICAgIHNlbGYuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKCkge1xuICAgICAgICBmcm96ZW5zLnB1c2goe1xuICAgICAgICAgICAgZmFpbE1lc3NhZ2UsXG4gICAgICAgICAgICBmYWlsdXJlT3V0cHV0LFxuICAgICAgICAgICAgdXNhZ2VzLFxuICAgICAgICAgICAgdXNhZ2VEaXNhYmxlZCxcbiAgICAgICAgICAgIGVwaWxvZ3MsXG4gICAgICAgICAgICBleGFtcGxlcyxcbiAgICAgICAgICAgIGNvbW1hbmRzLFxuICAgICAgICAgICAgZGVzY3JpcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHNlbGYudW5mcmVlemUgPSBmdW5jdGlvbiB1bmZyZWV6ZShkZWZhdWx0Q29tbWFuZCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IGZyb3plbnMucG9wKCk7XG4gICAgICAgIGlmICghZnJvemVuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9ucyA9IHsgLi4uZnJvemVuLmRlc2NyaXB0aW9ucywgLi4uZGVzY3JpcHRpb25zIH07XG4gICAgICAgICAgICBjb21tYW5kcyA9IFsuLi5mcm96ZW4uY29tbWFuZHMsIC4uLmNvbW1hbmRzXTtcbiAgICAgICAgICAgIHVzYWdlcyA9IFsuLi5mcm96ZW4udXNhZ2VzLCAuLi51c2FnZXNdO1xuICAgICAgICAgICAgZXhhbXBsZXMgPSBbLi4uZnJvemVuLmV4YW1wbGVzLCAuLi5leGFtcGxlc107XG4gICAgICAgICAgICBlcGlsb2dzID0gWy4uLmZyb3plbi5lcGlsb2dzLCAuLi5lcGlsb2dzXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgZmFpbE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgZmFpbHVyZU91dHB1dCxcbiAgICAgICAgICAgICAgICB1c2FnZXMsXG4gICAgICAgICAgICAgICAgdXNhZ2VEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBlcGlsb2dzLFxuICAgICAgICAgICAgICAgIGV4YW1wbGVzLFxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9ucyxcbiAgICAgICAgICAgIH0gPSBmcm96ZW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbmZ1bmN0aW9uIGlzSW5kZW50ZWRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRleHQgPT09ICdvYmplY3QnO1xufVxuZnVuY3Rpb24gYWRkSW5kZW50YXRpb24odGV4dCwgaW5kZW50KSB7XG4gICAgcmV0dXJuIGlzSW5kZW50ZWRUZXh0KHRleHQpXG4gICAgICAgID8geyB0ZXh0OiB0ZXh0LnRleHQsIGluZGVudGF0aW9uOiB0ZXh0LmluZGVudGF0aW9uICsgaW5kZW50IH1cbiAgICAgICAgOiB7IHRleHQsIGluZGVudGF0aW9uOiBpbmRlbnQgfTtcbn1cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKHRleHQpIHtcbiAgICByZXR1cm4gaXNJbmRlbnRlZFRleHQodGV4dCkgPyB0ZXh0LmluZGVudGF0aW9uIDogMDtcbn1cbmZ1bmN0aW9uIGdldFRleHQodGV4dCkge1xuICAgIHJldHVybiBpc0luZGVudGVkVGV4dCh0ZXh0KSA/IHRleHQudGV4dCA6IHRleHQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2sgfSBmcm9tICcuL2NvbW1hbmQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCAqIGFzIHRlbXBsYXRlcyBmcm9tICcuL2NvbXBsZXRpb24tdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1hbmQgfSBmcm9tICcuL3BhcnNlLWNvbW1hbmQuanMnO1xuZXhwb3J0IGNsYXNzIENvbXBsZXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHlhcmdzLCB1c2FnZSwgY29tbWFuZCwgc2hpbSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy55YXJncyA9IHlhcmdzO1xuICAgICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgICAgIHRoaXMuc2hpbSA9IHNoaW07XG4gICAgICAgIHRoaXMuY29tcGxldGlvbktleSA9ICdnZXQteWFyZ3MtY29tcGxldGlvbnMnO1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldCA9IDA7XG4gICAgICAgIHRoaXMuenNoU2hlbGwgPVxuICAgICAgICAgICAgKF9jID0gKCgoX2EgPSB0aGlzLnNoaW0uZ2V0RW52KCdTSEVMTCcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ3pzaCcpKSB8fFxuICAgICAgICAgICAgICAgICgoX2IgPSB0aGlzLnNoaW0uZ2V0RW52KCdaU0hfTkFNRScpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoJ3pzaCcpKSkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlO1xuICAgIH1cbiAgICBkZWZhdWx0Q29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBkb25lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBhcmdzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyc1thcmdzW2ldXSAmJiBoYW5kbGVyc1thcmdzW2ldXS5idWlsZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IGhhbmRsZXJzW2FyZ3NbaV1dLmJ1aWxkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlcih5LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkuYXJndjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGxldGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb21tYW5kQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGN1cnJlbnQpO1xuICAgICAgICB0aGlzLm9wdGlvbkNvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KTtcbiAgICAgICAgdGhpcy5jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KTtcbiAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgfVxuICAgIGNvbW1hbmRDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgY3VycmVudCkge1xuICAgICAgICBjb25zdCBwYXJlbnRDb21tYW5kcyA9IHRoaXMueWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbnRleHQoKS5jb21tYW5kcztcbiAgICAgICAgaWYgKCFjdXJyZW50Lm1hdGNoKC9eLS8pICYmXG4gICAgICAgICAgICBwYXJlbnRDb21tYW5kc1twYXJlbnRDb21tYW5kcy5sZW5ndGggLSAxXSAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgIXRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICB0aGlzLnVzYWdlLmdldENvbW1hbmRzKCkuZm9yRWFjaCh1c2FnZUNvbW1hbmQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gcGFyc2VDb21tYW5kKHVzYWdlQ29tbWFuZFswXSkuY21kO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2YoY29tbWFuZE5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuenNoU2hlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY29tbWFuZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IHVzYWdlQ29tbWFuZFsxXSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY29tbWFuZE5hbWUucmVwbGFjZSgvOi9nLCAnXFxcXDonKSArICc6JyArIGRlc2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9uQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKChjdXJyZW50Lm1hdGNoKC9eLS8pIHx8IChjdXJyZW50ID09PSAnJyAmJiBjb21wbGV0aW9ucy5sZW5ndGggPT09IDApKSAmJlxuICAgICAgICAgICAgIXRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IHRoaXMueWFyZ3MuZ2V0R3JvdXBzKClbdGhpcy51c2FnZS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCldIHx8IFtdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5rZXkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWdhYmxlID0gISFvcHRpb25zLmNvbmZpZ3VyYXRpb25bJ2Jvb2xlYW4tbmVnYXRpb24nXSAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Bvc2l0aW9uYWxLZXkgPSBwb3NpdGlvbmFsS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaXNQb3NpdGlvbmFsS2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICFvcHRpb25zLmhpZGRlbk9wdGlvbnMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5hcmdzQ29udGFpbktleShhcmdzLCBrZXksIG5lZ2FibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVPcHRpb25LZXkoa2V5LCBjb21wbGV0aW9ucywgY3VycmVudCwgbmVnYWJsZSAmJiAhIW9wdGlvbnMuZGVmYXVsdFtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCkge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKTtcbiAgICAgICAgICAgIGlmIChjaG9pY2VzICYmIGNob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goLi4uY2hvaWNlcy5tYXAoYyA9PiBjLnJlcGxhY2UoLzovZywgJ1xcXFw6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcnICYmXG4gICAgICAgICAgICBjb21wbGV0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uYWxLZXlzID0gdGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV0gfHwgW107XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldCwgdGhpcy55YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCkuY29tbWFuZHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5ID0gcG9zaXRpb25hbEtleXNbYXJndi5fLmxlbmd0aCAtIG9mZnNldCAtIDFdO1xuICAgICAgICBpZiAoIXBvc2l0aW9uYWxLZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCkuY2hvaWNlc1twb3NpdGlvbmFsS2V5XSB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2YgY2hvaWNlcykge1xuICAgICAgICAgICAgaWYgKGNob2ljZS5zdGFydHNXaXRoKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGlvbnMucHVzaChjaG9pY2UucmVwbGFjZSgvOi9nLCAnXFxcXDonKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UHJldmlvdXNBcmdDaG9pY2VzKGFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZpb3VzQXJnID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgZmlsdGVyID0gJyc7XG4gICAgICAgIGlmICghcHJldmlvdXNBcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZmlsdGVyID0gcHJldmlvdXNBcmc7XG4gICAgICAgICAgICBwcmV2aW91c0FyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByZXZpb3VzQXJnLnN0YXJ0c1dpdGgoJy0nKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcHJldmlvdXNBcmdLZXkgPSBwcmV2aW91c0FyZy5yZXBsYWNlKC9eLSsvLCAnJyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgcG9zc2libGVBbGlhc2VzID0gW1xuICAgICAgICAgICAgcHJldmlvdXNBcmdLZXksXG4gICAgICAgICAgICAuLi4odGhpcy55YXJncy5nZXRBbGlhc2VzKClbcHJldmlvdXNBcmdLZXldIHx8IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IGNob2ljZXM7XG4gICAgICAgIGZvciAoY29uc3QgcG9zc2libGVBbGlhcyBvZiBwb3NzaWJsZUFsaWFzZXMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5rZXksIHBvc3NpYmxlQWxpYXMpICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNob2ljZXNbcG9zc2libGVBbGlhc10pKSB7XG4gICAgICAgICAgICAgICAgY2hvaWNlcyA9IG9wdGlvbnMuY2hvaWNlc1twb3NzaWJsZUFsaWFzXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hvaWNlcykge1xuICAgICAgICAgICAgcmV0dXJuIGNob2ljZXMuZmlsdGVyKGNob2ljZSA9PiAhZmlsdGVyIHx8IGNob2ljZS5zdGFydHNXaXRoKGZpbHRlcikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGNob2ljZXMgIT09IHVuZGVmaW5lZCAmJiBjaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGFyZ3NDb250YWluS2V5KGFyZ3MsIGtleSwgbmVnYWJsZSkge1xuICAgICAgICBjb25zdCBhcmdzQ29udGFpbnMgPSAocykgPT4gYXJncy5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QocykgPyAnLScgOiAnLS0nKSArIHMpICE9PSAtMTtcbiAgICAgICAgaWYgKGFyZ3NDb250YWlucyhrZXkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChuZWdhYmxlICYmIGFyZ3NDb250YWlucyhgbm8tJHtrZXl9YCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYWxpYXNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiB0aGlzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzQ29udGFpbnMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbXBsZXRlT3B0aW9uS2V5KGtleSwgY29tcGxldGlvbnMsIGN1cnJlbnQsIG5lZ2FibGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBsZXQga2V5V2l0aERlc2MgPSBrZXk7XG4gICAgICAgIGlmICh0aGlzLnpzaFNoZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcyA9IHRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBhbGlhc0tleSA9IChfYiA9IChfYSA9IHRoaXMgPT09IG51bGwgfHwgdGhpcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGhpcy5hbGlhc2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Fba2V5XSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbmQoYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBkZXNjc1thbGlhc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZXNjID09PSAnc3RyaW5nJyAmJiBkZXNjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NGcm9tQWxpYXMgPSBhbGlhc0tleSA/IGRlc2NzW2FsaWFzS2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGRlc2MgPSAoX2QgPSAoX2MgPSBkZXNjc1trZXldKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZXNjRnJvbUFsaWFzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJztcbiAgICAgICAgICAgIGtleVdpdGhEZXNjID0gYCR7a2V5LnJlcGxhY2UoLzovZywgJ1xcXFw6Jyl9OiR7ZGVzY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdfX3lhcmdzU3RyaW5nX186JywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICcgJyl9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydHNCeVR3b0Rhc2hlcyA9IChzKSA9PiAvXi0tLy50ZXN0KHMpO1xuICAgICAgICBjb25zdCBpc1Nob3J0T3B0aW9uID0gKHMpID0+IC9eW14wLTldJC8udGVzdChzKTtcbiAgICAgICAgY29uc3QgZGFzaGVzID0gIXN0YXJ0c0J5VHdvRGFzaGVzKGN1cnJlbnQpICYmIGlzU2hvcnRPcHRpb24oa2V5KSA/ICctJyA6ICctLSc7XG4gICAgICAgIGNvbXBsZXRpb25zLnB1c2goZGFzaGVzICsga2V5V2l0aERlc2MpO1xuICAgICAgICBpZiAobmVnYWJsZSkge1xuICAgICAgICAgICAgY29tcGxldGlvbnMucHVzaChkYXNoZXMgKyAnbm8tJyArIGtleVdpdGhEZXNjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdXN0b21Db21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpIHtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwodGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24sIG51bGwsIHRoaXMuc2hpbSk7XG4gICAgICAgIGlmIChpc1N5bmNDb21wbGV0aW9uRnVuY3Rpb24odGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihjdXJyZW50LCBhcmd2KTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4obGlzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgbGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW0ucHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGVyciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wbGV0aW9uRnVuY3Rpb24odGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24oY3VycmVudCwgYXJndiwgKG9uQ29tcGxldGVkID0gZG9uZSkgPT4gdGhpcy5kZWZhdWx0Q29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBvbkNvbXBsZXRlZCksIGNvbXBsZXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGNvbXBsZXRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKGN1cnJlbnQsIGFyZ3YsIGNvbXBsZXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGNvbXBsZXRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbXBsZXRpb24oYXJncywgZG9uZSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gYXJncy5sZW5ndGggPyBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gOiAnJztcbiAgICAgICAgY29uc3QgYXJndiA9IHRoaXMueWFyZ3MucGFyc2UoYXJncywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25GdW5jdGlvbiA9IHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICA/IChhcmd2KSA9PiB0aGlzLmN1c3RvbUNvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSlcbiAgICAgICAgICAgIDogKGFyZ3YpID0+IHRoaXMuZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSk7XG4gICAgICAgIHJldHVybiBpc1Byb21pc2UoYXJndilcbiAgICAgICAgICAgID8gYXJndi50aGVuKGNvbXBsZXRpb25GdW5jdGlvbilcbiAgICAgICAgICAgIDogY29tcGxldGlvbkZ1bmN0aW9uKGFyZ3YpO1xuICAgIH1cbiAgICBnZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQoJDAsIGNtZCkge1xuICAgICAgICBsZXQgc2NyaXB0ID0gdGhpcy56c2hTaGVsbFxuICAgICAgICAgICAgPyB0ZW1wbGF0ZXMuY29tcGxldGlvblpzaFRlbXBsYXRlXG4gICAgICAgICAgICA6IHRlbXBsYXRlcy5jb21wbGV0aW9uU2hUZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKCQwKTtcbiAgICAgICAgaWYgKCQwLm1hdGNoKC9cXC5qcyQvKSlcbiAgICAgICAgICAgICQwID0gYC4vJHskMH1gO1xuICAgICAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgve3thcHBfbmFtZX19L2csIG5hbWUpO1xuICAgICAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLCBjbWQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0LnJlcGxhY2UoL3t7YXBwX3BhdGh9fS9nLCAkMCk7XG4gICAgfVxuICAgIHJlZ2lzdGVyRnVuY3Rpb24oZm4pIHtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24gPSBmbjtcbiAgICB9XG4gICAgc2V0UGFyc2VkKHBhcnNlZCkge1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBwYXJzZWQuYWxpYXNlcztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGlvbih5YXJncywgdXNhZ2UsIGNvbW1hbmQsIHNoaW0pIHtcbiAgICByZXR1cm4gbmV3IENvbXBsZXRpb24oeWFyZ3MsIHVzYWdlLCBjb21tYW5kLCBzaGltKTtcbn1cbmZ1bmN0aW9uIGlzU3luY0NvbXBsZXRpb25GdW5jdGlvbihjb21wbGV0aW9uRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gY29tcGxldGlvbkZ1bmN0aW9uLmxlbmd0aCA8IDM7XG59XG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcGxldGlvbkZ1bmN0aW9uKGNvbXBsZXRpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBjb21wbGV0aW9uRnVuY3Rpb24ubGVuZ3RoID4gMztcbn1cbiIsImV4cG9ydCBjb25zdCBjb21wbGV0aW9uU2hUZW1wbGF0ZSA9IGAjIyMtYmVnaW4te3thcHBfbmFtZX19LWNvbXBsZXRpb25zLSMjI1xuI1xuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XG4jXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uYmFzaHJjXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXG4jXG5fe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zKClcbntcbiAgICBsb2NhbCBjdXJfd29yZCBhcmdzIHR5cGVfbGlzdFxuXG4gICAgY3VyX3dvcmQ9XCJcXCR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX1cIlxuICAgIGFyZ3M9KFwiXFwke0NPTVBfV09SRFNbQF19XCIpXG5cbiAgICAjIGFzayB5YXJncyB0byBnZW5lcmF0ZSBjb21wbGV0aW9ucy5cbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCJcXCR7YXJnc1tAXX1cIilcblxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIlxcJHt0eXBlX2xpc3R9XCIgLS0gXFwke2N1cl93b3JkfSkgKVxuXG4gICAgIyBpZiBubyBtYXRjaCB3YXMgZm91bmQsIGZhbGwgYmFjayB0byBmaWxlbmFtZSBjb21wbGV0aW9uXG4gICAgaWYgWyBcXCR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxuICAgICAgQ09NUFJFUExZPSgpXG4gICAgZmlcblxuICAgIHJldHVybiAwXG59XG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XG4jIyMtZW5kLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbmA7XG5leHBvcnQgY29uc3QgY29tcGxldGlvblpzaFRlbXBsYXRlID0gYCNjb21wZGVmIHt7YXBwX25hbWV9fVxuIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbiNcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxuI1xuIyBJbnN0YWxsYXRpb246IHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpzaHJjXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cbiNcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxue1xuICBsb2NhbCByZXBseVxuICBsb2NhbCBzaT0kSUZTXG4gIElGUz0kJ1xcbicgcmVwbHk9KCQoQ09NUF9DV09SRD1cIiQoKENVUlJFTlQtMSkpXCIgQ09NUF9MSU5FPVwiJEJVRkZFUlwiIENPTVBfUE9JTlQ9XCIkQ1VSU09SXCIge3thcHBfcGF0aH19IC0tZ2V0LXlhcmdzLWNvbXBsZXRpb25zIFwiXFwke3dvcmRzW0BdfVwiKSlcbiAgSUZTPSRzaVxuICBfZGVzY3JpYmUgJ3ZhbHVlcycgcmVwbHlcbn1cbmNvbXBkZWYgX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucyB7e2FwcF9uYW1lfX1cbiMjIy1lbmQte3thcHBfbmFtZX19LWNvbXBsZXRpb25zLSMjI1xuYDtcbiIsImV4cG9ydCBmdW5jdGlvbiBsZXZlbnNodGVpbihhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gYi5sZW5ndGg7XG4gICAgaWYgKGIubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gYS5sZW5ndGg7XG4gICAgY29uc3QgbWF0cml4ID0gW107XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8PSBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hdHJpeFtpXSA9IFtpXTtcbiAgICB9XG4gICAgbGV0IGo7XG4gICAgZm9yIChqID0gMDsgaiA8PSBhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIG1hdHJpeFswXVtqXSA9IGo7XG4gICAgfVxuICAgIGZvciAoaSA9IDE7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGogPSAxOyBqIDw9IGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChiLmNoYXJBdChpIC0gMSkgPT09IGEuY2hhckF0KGogLSAxKSkge1xuICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMV1baiAtIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIGogPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIGIuY2hhckF0KGkgLSAyKSA9PT0gYS5jaGFyQXQoaiAtIDEpICYmXG4gICAgICAgICAgICAgICAgICAgIGIuY2hhckF0KGkgLSAxKSA9PT0gYS5jaGFyQXQoaiAtIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMl1baiAtIDJdICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IE1hdGgubWluKG1hdHJpeFtpIC0gMV1baiAtIDFdICsgMSwgTWF0aC5taW4obWF0cml4W2ldW2ogLSAxXSArIDEsIG1hdHJpeFtpIC0gMV1bal0gKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXhbYi5sZW5ndGhdW2EubGVuZ3RoXTtcbn1cbiIsImltcG9ydCB7IGFyZ3NlcnQgfSBmcm9tICcuL2FyZ3NlcnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBsZXZlbnNodGVpbiBhcyBkaXN0YW5jZSB9IGZyb20gJy4vdXRpbHMvbGV2ZW5zaHRlaW4uanMnO1xuaW1wb3J0IHsgb2JqRmlsdGVyIH0gZnJvbSAnLi91dGlscy9vYmotZmlsdGVyLmpzJztcbmNvbnN0IHNwZWNpYWxLZXlzID0gWyckMCcsICctLScsICdfJ107XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGlvbih5YXJncywgdXNhZ2UsIHNoaW0pIHtcbiAgICBjb25zdCBfXyA9IHNoaW0ueTE4bi5fXztcbiAgICBjb25zdCBfX24gPSBzaGltLnkxOG4uX19uO1xuICAgIGNvbnN0IHNlbGYgPSB7fTtcbiAgICBzZWxmLm5vbk9wdGlvbkNvdW50ID0gZnVuY3Rpb24gbm9uT3B0aW9uQ291bnQoYXJndikge1xuICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsQ291bnQgPSBhcmd2Ll8ubGVuZ3RoICsgKGFyZ3ZbJy0tJ10gPyBhcmd2WyctLSddLmxlbmd0aCA6IDApO1xuICAgICAgICBjb25zdCBfcyA9IHBvc2l0aW9uYWxDb3VudCAtIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcy5sZW5ndGg7XG4gICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8gJiZcbiAgICAgICAgICAgIChfcyA8IGRlbWFuZGVkQ29tbWFuZHMuXy5taW4gfHwgX3MgPiBkZW1hbmRlZENvbW1hbmRzLl8ubWF4KSkge1xuICAgICAgICAgICAgaWYgKF9zIDwgZGVtYW5kZWRDb21tYW5kcy5fLm1pbikge1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2UuZmFpbChkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlbWFuZGVkQ29tbWFuZHMuXy5taW5Nc2dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMC9nLCBfcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCQxLywgZGVtYW5kZWRDb21tYW5kcy5fLm1pbi50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXMnLCAnTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgX3MsIF9zLnRvU3RyaW5nKCksIGRlbWFuZGVkQ29tbWFuZHMuXy5taW4udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKF9zID4gZGVtYW5kZWRDb21tYW5kcy5fLm1heCkge1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2UuZmFpbChkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlbWFuZGVkQ29tbWFuZHMuXy5tYXhNc2dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMC9nLCBfcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCQxLywgZGVtYW5kZWRDb21tYW5kcy5fLm1heC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdUb28gbWFueSBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBtYXhpbXVtIG9mICVzJywgJ1RvbyBtYW55IG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG1heGltdW0gb2YgJXMnLCBfcywgX3MudG9TdHJpbmcoKSwgZGVtYW5kZWRDb21tYW5kcy5fLm1heC50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnBvc2l0aW9uYWxDb3VudCA9IGZ1bmN0aW9uIHBvc2l0aW9uYWxDb3VudChyZXF1aXJlZCwgb2JzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKG9ic2VydmVkIDwgcmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXMnLCAnTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgb2JzZXJ2ZWQsIG9ic2VydmVkICsgJycsIHJlcXVpcmVkICsgJycpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5yZXF1aXJlZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIHJlcXVpcmVkQXJndW1lbnRzKGFyZ3YsIGRlbWFuZGVkT3B0aW9ucykge1xuICAgICAgICBsZXQgbWlzc2luZyA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRlbWFuZGVkT3B0aW9ucykpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIGtleSkgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgYXJndltrZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG1pc3NpbmcgPSBtaXNzaW5nIHx8IHt9O1xuICAgICAgICAgICAgICAgIG1pc3Npbmdba2V5XSA9IGRlbWFuZGVkT3B0aW9uc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Nc2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtaXNzaW5nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IG1pc3Npbmdba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAobXNnICYmIGN1c3RvbU1zZ3MuaW5kZXhPZihtc2cpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21Nc2dzLnB1c2gobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Nc2cgPSBjdXN0b21Nc2dzLmxlbmd0aCA/IGBcXG4ke2N1c3RvbU1zZ3Muam9pbignXFxuJyl9YCA6ICcnO1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQ6ICVzJywgJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlcycsIE9iamVjdC5rZXlzKG1pc3NpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobWlzc2luZykuam9pbignLCAnKSArIGN1c3RvbU1zZykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnVua25vd25Bcmd1bWVudHMgPSBmdW5jdGlvbiB1bmtub3duQXJndW1lbnRzKGFyZ3YsIGFsaWFzZXMsIHBvc2l0aW9uYWxNYXAsIGlzRGVmYXVsdENvbW1hbmQsIGNoZWNrUG9zaXRpb25hbHMgPSB0cnVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY29tbWFuZEtleXMgPSB5YXJnc1xuICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZEluc3RhbmNlKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCB1bmtub3duID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpO1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNwZWNpYWxLZXlzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBvc2l0aW9uYWxNYXAsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIXNlbGYuaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3KGtleSwgYWxpYXNlcykpIHtcbiAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uYWxzICYmXG4gICAgICAgICAgICAoY3VycmVudENvbnRleHQuY29tbWFuZHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIGNvbW1hbmRLZXlzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBpc0RlZmF1bHRDb21tYW5kKSkge1xuICAgICAgICAgICAgYXJndi5fLnNsaWNlKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZEtleXMuaW5jbHVkZXMoJycgKyBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVua25vd24ucHVzaCgnJyArIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrUG9zaXRpb25hbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbWFuZGVkQ29tbWFuZHMgPSB5YXJncy5nZXREZW1hbmRlZENvbW1hbmRzKCk7XG4gICAgICAgICAgICBjb25zdCBtYXhOb25PcHREZW1hbmRlZCA9ICgoX2EgPSBkZW1hbmRlZENvbW1hbmRzLl8pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXgpIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCArIG1heE5vbk9wdERlbWFuZGVkO1xuICAgICAgICAgICAgaWYgKGV4cGVjdGVkIDwgYXJndi5fLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFyZ3YuXy5zbGljZShleHBlY3RlZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q29udGV4dC5jb21tYW5kcy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdW5rbm93bi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1bmtub3duLmxlbmd0aCkge1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ1Vua25vd24gYXJndW1lbnQ6ICVzJywgJ1Vua25vd24gYXJndW1lbnRzOiAlcycsIHVua25vd24ubGVuZ3RoLCB1bmtub3duLm1hcChzID0+IChzLnRyaW0oKSA/IHMgOiBgXCIke3N9XCJgKSkuam9pbignLCAnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnVua25vd25Db21tYW5kcyA9IGZ1bmN0aW9uIHVua25vd25Db21tYW5kcyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRLZXlzID0geWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRJbnN0YW5jZSgpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgdW5rbm93biA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCA+IDAgfHwgY29tbWFuZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXJndi5fLnNsaWNlKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZEtleXMuaW5jbHVkZXMoJycgKyBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVua25vd24ucHVzaCgnJyArIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ1Vua25vd24gY29tbWFuZDogJXMnLCAnVW5rbm93biBjb21tYW5kczogJXMnLCB1bmtub3duLmxlbmd0aCwgdW5rbm93bi5qb2luKCcsICcpKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5pc1ZhbGlkQW5kU29tZUFsaWFzSXNOb3ROZXcgPSBmdW5jdGlvbiBpc1ZhbGlkQW5kU29tZUFsaWFzSXNOb3ROZXcoa2V5LCBhbGlhc2VzKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsaWFzZXMsIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBbGlhc2VzID0geWFyZ3MucGFyc2VkLm5ld0FsaWFzZXM7XG4gICAgICAgIHJldHVybiBba2V5LCAuLi5hbGlhc2VzW2tleV1dLnNvbWUoYSA9PiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0FsaWFzZXMsIGEpIHx8ICFuZXdBbGlhc2VzW2tleV0pO1xuICAgIH07XG4gICAgc2VsZi5saW1pdGVkQ2hvaWNlcyA9IGZ1bmN0aW9uIGxpbWl0ZWRDaG9pY2VzKGFyZ3YpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgaW52YWxpZCA9IHt9O1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG9wdGlvbnMuY2hvaWNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoc3BlY2lhbEtleXMuaW5kZXhPZihrZXkpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLmNob2ljZXMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBbXS5jb25jYXQoYXJndltrZXldKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hvaWNlc1trZXldLmluZGV4T2YodmFsdWUpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFtrZXldID0gKGludmFsaWRba2V5XSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhpbnZhbGlkKTtcbiAgICAgICAgaWYgKCFpbnZhbGlkS2V5cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtc2cgPSBfXygnSW52YWxpZCB2YWx1ZXM6Jyk7XG4gICAgICAgIGludmFsaWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIG1zZyArPSBgXFxuICAke19fKCdBcmd1bWVudDogJXMsIEdpdmVuOiAlcywgQ2hvaWNlczogJXMnLCBrZXksIHVzYWdlLnN0cmluZ2lmaWVkVmFsdWVzKGludmFsaWRba2V5XSksIHVzYWdlLnN0cmluZ2lmaWVkVmFsdWVzKG9wdGlvbnMuY2hvaWNlc1trZXldKSl9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHVzYWdlLmZhaWwobXNnKTtcbiAgICB9O1xuICAgIGxldCBpbXBsaWVkID0ge307XG4gICAgc2VsZi5pbXBsaWVzID0gZnVuY3Rpb24gaW1wbGllcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ10nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmltcGxpZXMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWFyZ3MuZ2xvYmFsKGtleSk7XG4gICAgICAgICAgICBpZiAoIWltcGxpZWRba2V5XSkge1xuICAgICAgICAgICAgICAgIGltcGxpZWRba2V5XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChpID0+IHNlbGYuaW1wbGllcyhrZXksIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHZhbHVlLCB1bmRlZmluZWQsIHNoaW0pO1xuICAgICAgICAgICAgICAgIGltcGxpZWRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5nZXRJbXBsaWVkID0gZnVuY3Rpb24gZ2V0SW1wbGllZCgpIHtcbiAgICAgICAgcmV0dXJuIGltcGxpZWQ7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBrZXlFeGlzdHMoYXJndiwgdmFsKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgICAgICB2YWwgPSBpc05hTihudW0pID8gdmFsIDogbnVtO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbCA9IGFyZ3YuXy5sZW5ndGggPj0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbC5tYXRjaCgvXi0tbm8tLisvKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLm1hdGNoKC9eLS1uby0oLispLylbMV07XG4gICAgICAgICAgICB2YWwgPSAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWwgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBzZWxmLmltcGxpY2F0aW9ucyA9IGZ1bmN0aW9uIGltcGxpY2F0aW9ucyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IGltcGx5RmFpbCA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhpbXBsaWVkKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcmlnS2V5ID0ga2V5O1xuICAgICAgICAgICAgKGltcGxpZWRba2V5XSB8fCBbXSkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IG9yaWdLZXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5RXhpc3RzKGFyZ3YsIGtleSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBrZXlFeGlzdHMoYXJndiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGltcGx5RmFpbC5wdXNoKGAgJHtvcmlnS2V5fSAtPiAke29yaWdWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbXBseUZhaWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYCR7X18oJ0ltcGxpY2F0aW9ucyBmYWlsZWQ6Jyl9XFxuYDtcbiAgICAgICAgICAgIGltcGx5RmFpbC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwobXNnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IGNvbmZsaWN0aW5nID0ge307XG4gICAgc2VsZi5jb25mbGljdHMgPSBmdW5jdGlvbiBjb25mbGljdHMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW2FycmF5fHN0cmluZ10nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0cyhrLCBrZXlba10pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5YXJncy5nbG9iYWwoa2V5KTtcbiAgICAgICAgICAgIGlmICghY29uZmxpY3Rpbmdba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goaSA9PiBzZWxmLmNvbmZsaWN0cyhrZXksIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuZ2V0Q29uZmxpY3RpbmcgPSAoKSA9PiBjb25mbGljdGluZztcbiAgICBzZWxmLmNvbmZsaWN0aW5nID0gZnVuY3Rpb24gY29uZmxpY3RpbmdGbihhcmd2KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChjb25mbGljdGluZ1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3Rpbmdba2V5XS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIGFyZ3Zba2V5XSAhPT0gdW5kZWZpbmVkICYmIGFyZ3ZbdmFsdWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0FyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScsIGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZsaWN0aW5nKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3Rpbmdba2V5XS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W3NoaW0uUGFyc2VyLmNhbWVsQ2FzZShrZXkpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W3NoaW0uUGFyc2VyLmNhbWVsQ2FzZSh2YWx1ZSldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0FyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScsIGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYucmVjb21tZW5kQ29tbWFuZHMgPSBmdW5jdGlvbiByZWNvbW1lbmRDb21tYW5kcyhjbWQsIHBvdGVudGlhbENvbW1hbmRzKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDM7XG4gICAgICAgIHBvdGVudGlhbENvbW1hbmRzID0gcG90ZW50aWFsQ29tbWFuZHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG4gICAgICAgIGxldCByZWNvbW1lbmRlZCA9IG51bGw7XG4gICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNhbmRpZGF0ZTsgKGNhbmRpZGF0ZSA9IHBvdGVudGlhbENvbW1hbmRzW2ldKSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZShjbWQsIGNhbmRpZGF0ZSk7XG4gICAgICAgICAgICBpZiAoZCA8PSB0aHJlc2hvbGQgJiYgZCA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGQ7XG4gICAgICAgICAgICAgICAgcmVjb21tZW5kZWQgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY29tbWVuZGVkKVxuICAgICAgICAgICAgdXNhZ2UuZmFpbChfXygnRGlkIHlvdSBtZWFuICVzPycsIHJlY29tbWVuZGVkKSk7XG4gICAgfTtcbiAgICBzZWxmLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQobG9jYWxMb29rdXApIHtcbiAgICAgICAgaW1wbGllZCA9IG9iakZpbHRlcihpbXBsaWVkLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIGNvbmZsaWN0aW5nID0gb2JqRmlsdGVyKGNvbmZsaWN0aW5nLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgY29uc3QgZnJvemVucyA9IFtdO1xuICAgIHNlbGYuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKCkge1xuICAgICAgICBmcm96ZW5zLnB1c2goe1xuICAgICAgICAgICAgaW1wbGllZCxcbiAgICAgICAgICAgIGNvbmZsaWN0aW5nLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHNlbGYudW5mcmVlemUgPSBmdW5jdGlvbiB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gZnJvemVucy5wb3AoKTtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwoZnJvemVuLCB1bmRlZmluZWQsIHNoaW0pO1xuICAgICAgICAoeyBpbXBsaWVkLCBjb25mbGljdGluZyB9ID0gZnJvemVuKTtcbiAgICB9O1xuICAgIHJldHVybiBzZWxmO1xufVxuIiwiaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi4veWVycm9yLmpzJztcbmxldCBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MgPSBbXTtcbmxldCBzaGltO1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RXh0ZW5kcyhjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzLCBfc2hpbSkge1xuICAgIHNoaW0gPSBfc2hpbTtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHt9O1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmV4dGVuZHMgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25maWc7XG4gICAgICAgIGNvbnN0IGlzUGF0aCA9IC9cXC5qc29ufFxcLi4qcmMkLy50ZXN0KGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgbGV0IHBhdGhUb0RlZmF1bHQgPSBudWxsO1xuICAgICAgICBpZiAoIWlzUGF0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9EZWZhdWx0ID0gcmVxdWlyZS5yZXNvbHZlKGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MucHVzaChwYXRoVG9EZWZhdWx0KTtcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGlzUGF0aFxuICAgICAgICAgICAgPyBKU09OLnBhcnNlKHNoaW0ucmVhZEZpbGVTeW5jKHBhdGhUb0RlZmF1bHQsICd1dGY4JykpXG4gICAgICAgICAgICA6IHJlcXVpcmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBkZWxldGUgY29uZmlnLmV4dGVuZHM7XG4gICAgICAgIGRlZmF1bHRDb25maWcgPSBhcHBseUV4dGVuZHMoZGVmYXVsdENvbmZpZywgc2hpbS5wYXRoLmRpcm5hbWUocGF0aFRvRGVmYXVsdCksIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG4gICAgfVxuICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xuICAgIHJldHVybiBtZXJnZUV4dGVuZHNcbiAgICAgICAgPyBtZXJnZURlZXAoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgICAgICA6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG59XG5mdW5jdGlvbiBjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyhjZmdQYXRoKSB7XG4gICAgaWYgKHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5pbmRleE9mKGNmZ1BhdGgpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgQ2lyY3VsYXIgZXh0ZW5kZWQgY29uZmlndXJhdGlvbnM6ICcke2NmZ1BhdGh9Jy5gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgcGF0aFRvRXh0ZW5kKSB7XG4gICAgcmV0dXJuIHNoaW0ucGF0aC5yZXNvbHZlKGN3ZCwgcGF0aFRvRXh0ZW5kKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRGVlcChjb25maWcxLCBjb25maWcyKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIGNvbmZpZzEpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZzIpKSB7XG4gICAgICAgIGlmIChpc09iamVjdChjb25maWcyW2tleV0pICYmIGlzT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZURlZXAoY29uZmlnMVtrZXldLCBjb25maWcyW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBjb25maWcyW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gQm9vdHN0cmFwcyB5YXJncyBmb3IgRVNNOlxuaW1wb3J0IGVzbVBsYXRmb3JtU2hpbSBmcm9tICcuL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcbmltcG9ydCB7WWFyZ3NGYWN0b3J5fSBmcm9tICcuL2J1aWxkL2xpYi95YXJncy1mYWN0b3J5LmpzJztcblxuY29uc3QgWWFyZ3MgPSBZYXJnc0ZhY3RvcnkoZXNtUGxhdGZvcm1TaGltKTtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJykgfHwgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZUZhY3RvcnkgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBtZW1vaXplID0gbWVtb2l6ZUZhY3RvcnkoeyBtYXhDYWNoZWRUaGlzU2l6ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIG1heENhY2hlZEFyZ3NTaXplOiAxIH0pO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXNSdW5uaW5nT25CdW5cbiAgICAgID8gJ3RydWUnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgICAgPyAneWFybiBidWlsZCdcbiAgICAgICAgOiBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWA7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkRW52ID8geyAuLi5yZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpLCAuLi5wcm9jZXNzLmVudiB9IDogcHJvY2Vzcy5lbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImltcG9ydHtjeXJiNjRIYXNoV2l0aExlbmd0aCBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2NvbnN0IHQ9cygpO2Z1bmN0aW9uIHMoe2NhY2hlRHVyYXRpb246dD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksY2FjaGVzOnMsY2FsY0tleTpuPSh0PT5lKEpTT04uc3RyaW5naWZ5KHQpKSksbWF4Q2FjaGVkQXJnc1NpemU6aT0xMDAsbWF4Q2FjaGVkVGhpc1NpemU6Yz0xMH09e30pe3JldHVybiBmdW5jdGlvbihlLG8pe2lmKFwiZ2V0dGVyXCI9PT1vPy5raW5kKXtjb25zdCBuPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gobiksZnVuY3Rpb24oKXtjb25zdCBzPURhdGUubm93KCk7aWYobi5oYXModGhpcykpe2NvbnN0W2UsaV09bi5nZXQodGhpcyk7aWYocy1pPD10KXJldHVybiBlfWNvbnN0IGk9ZS5jYWxsKHRoaXMpO2lmKG4uc2l6ZT49Yyl7Y29uc3QgZT1uLmtleXMoKS5uZXh0KCkudmFsdWU7bi5kZWxldGUoZSl9cmV0dXJuIG4uc2V0KHRoaXMsW2ksc10pLGl9fXtjb25zdCByPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gociksZnVuY3Rpb24oLi4ucyl7Y29uc3QgYT1uKHMpO2xldCBoPXIuZ2V0KHRoaXMpO2NvbnN0IHU9RGF0ZS5ub3coKTtpZihoKXtpZihoLmhhcyhhKSl7Y29uc3RbZSxzXT1oLmdldChhKTtpZih1LXM8PXQpcmV0dXJuIGV9fWVsc2V7aWYoaD1uZXcgTWFwLHIuc2l6ZT49Yyl7Y29uc3QgZT1yLmtleXMoKS5uZXh0KCkudmFsdWU7ci5kZWxldGUoZSl9ci5zZXQodGhpcyxoKX1jb25zdCBmPW8/ZS5jYWxsKHRoaXMsLi4ucyk6ZSguLi5zKTtpZihoLnNpemU+PWkpe2NvbnN0IGU9aC5rZXlzKCkubmV4dCgpLnZhbHVlO2guZGVsZXRlKGUpfXJldHVybiBoLnNldChhLFtmLHVdKSxmfX19fWV4cG9ydHt0IGFzIG1lbW9pemUscyBhcyBtZW1vaXplRmFjdG9yeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplLmpzLm1hcFxuIiwiZnVuY3Rpb24gdCh0LG49MCl7Y29uc3RbaSxyXT1mdW5jdGlvbih0LG49MCl7bGV0IGk9MzczNTkyODU1OV5uLHI9MTEwMzU0Nzk5MV5uO2ZvcihsZXQgbixhPTA7YTx0Lmxlbmd0aDthKyspbj10LmNvZGVQb2ludEF0KGEpLGk9TWF0aC5pbXVsKGlebiwyNjU0NDM1NzYxKSxyPU1hdGguaW11bChyXm4sMTU5NzMzNDY3Nyk7cmV0dXJuIGk9TWF0aC5pbXVsKGleaT4+PjE2LDIyNDY4MjI1MDcpLGlePU1hdGguaW11bChyXnI+Pj4xMywzMjY2NDg5OTA5KSxyPU1hdGguaW11bChyXnI+Pj4xNiwyMjQ2ODIyNTA3KSxyXj1NYXRoLmltdWwoaV5pPj4+MTMsMzI2NjQ4OTkwOSksW3I+Pj4wLGk+Pj4wXX0odCxuKTtyZXR1cm4gdC5sZW5ndGgudG9TdHJpbmcoMzYpK2kudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpK3IudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpfWV4cG9ydHt0IGFzIGN5cmI2NEhhc2hXaXRoTGVuZ3RofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ3lhcm4gYnVpbGQnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ2J1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKFlBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAucmVwbGFjZUFsbCgnIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHknLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApLFxuICAgIG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsICFpc1J1bm5pbmdPbkJ1biAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfVwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPSBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCd5YXJuJywge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAoIWFyZ3Yub3V0c2lkZSAmJiBuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUFJJU01BIG1pZ3JhdGUgZGVwbG95JztcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXZgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICAgIC8vIEknbSBub3Qgc3VyZSB3aHkgd2UgbmVlZCB0byByZW1vdmUgYWxsIHNxbGl0ZSBmaWxlcywgc28gSSBjb21tZW50ZWQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZS5cbiAgICAvLyByZXR1cm4gYHRydWUgJChybSAtUmYgZGIvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgdHJ1ZSAkKHJtIC1SZiBwcmlzbWEvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZCgpfWA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L3Jlc3RvcmVkLnNxbGl0ZTM7IEdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUz1nY3Atc2Eta2V5Lmpzb24gbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7b3V0cHV0UGF0aH0gJHtiYWNrdXBQYXRofWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddKVxuICAgICAgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuICdCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50cyc7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKF86IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhkYlVybE9yUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD1maWxlOi8vJHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpb2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKCk7XG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgfHxcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J11cbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGAke2FyZ3YuYXJncz8uam9pbignICcpID8/ICcnfWAudHJpbUVuZCgpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke3NjcmlwdH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7c2NyaXB0fWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYSddO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4sIHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMucHJlZmVyLWFjdGl2ZS1weXRob24gdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3Qgc2NyaXB0cyA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBuZXdEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXdEZXZEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ29wZW4tY2xpJywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfVxuICAgIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgbmV3RGV2RGVwcyA9IG5ld0RldkRlcHMuZmlsdGVyKChkZXApID0+IGRlcCAhPT0gJ3ZpdGVzdCcpO1xuICAgIH1cbiAgICBpZiAobmV3RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJ9IGFkZCAke25ld0RlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAobmV3RGV2RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJ9IGFkZCAtRCAke25ld0RldkRlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZERldkltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICd5YXJuIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIGFtZDY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gLWl0IC1wIDgwODA6ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIC8vICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJ1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbiAgc3RhcnRDb21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIGV4dGVuZHMgVGVzdEUyRURldk9wdGlvbnMge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCkge31cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uID0gJ2RldmVsb3BtZW50Jyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGREZXZJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIGFic3RyYWN0IHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZztcblxuICBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIDgwODApfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdHMvZTJlJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBCYXNpY2FsbHksIGBwbGF5d3JpZ2h0YCAobm90IGB5YXJuIHBsYXl3cmlnaHRgKSBzaG91bGQgd29yayxcbiAgICAvLyBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgLy8gU28gd2UgdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluc3RlYWQgb2YgYHBsYXl3cmlnaHRgIGhlcmUuXG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCJybSAtUmYgJHtwcmlzbWFEaXJlY3Rvcnl9L21vdW50ICYmICR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0cy9lMmUnICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9XCJgO1xuICB9XG5cbiAgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0cy9lMmUnICYmIGFyZ3YudGFyZ2V0ID8gcGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQpIDogcGxheXdyaWdodEFyZ3N9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvdW5pdCd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQsXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ2JsaXR6IGRldiAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biBzcmMvaW5kZXgudHMgJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgc3RhcnRDb21tYW5kID0gYGlmIFsgLWUgXCJwcmlzbWFcIiBdOyB0aGVuIHByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlOyBmaSAmJiAoJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwICYmIHZpdGVzdCBydW4gJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCB8fCB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJibyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF0uam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gJ25leHQgZGV2IC0tdHVyYm8gLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib1wiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ3JlbWl4IGRldicgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7Zml4QnVuQ29tbWFuZChzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke2ZpeEJ1bkNvbW1hbmQoc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgODA4MCkpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtmaXhCdW5Db21tYW5kKHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndikpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7Zml4QnVuQ29tbWFuZChzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKSA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjaToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdGVzdHMgb24gQ0knLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBydW4gZTJlIHRlc3RzLiBZb3UgbWF5IHBhc3MgbW9kZSBhcyBhcmd1bWVudDogbm9uZSB8IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBzdGFydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gc3RhcnQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdW5pdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG4gIHRhcmdldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0JyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gIWFyZ3YuZTJlICYmIGFyZ3Yuc3RhcnQgPT09IHVuZGVmaW5lZCAmJiBhcmd2LnVuaXQgPT09IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUnVuQWxsVGVzdHMpIHtcbiAgICAgIGFyZ3YgPSB7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIGUyZTpcbiAgICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICdlMmUnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL3VuaXQvJylcbiAgICAgICAgICAgID8gJ2hlYWRsZXNzJ1xuICAgICAgICAgICAgOiAnbm9uZScsXG4gICAgICAgIHN0YXJ0OiB0cnVlLFxuICAgICAgICB1bml0OiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICd1bml0JykpICYmICFhcmd2LnRhcmdldD8uaW5jbHVkZXMoJy9lMmUvJyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgIGlmIChhcmd2LmNpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgdGltZW91dDogYXJndi51bml0VGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJndi5zdGFydCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChhcmd2LmUyZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgb3B0aW9ucykucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi51bml0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSkpO1xuICAgIH1cbiAgICBpZiAoYXJndi5zdGFydCkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSAnbm9uZSc6IHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICcnOlxuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzLCBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwc1snYmxpdHonXSB8fCBkZXBzWyduZXh0J10gfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBlMmUgbW9kZTogJHthcmd2LmUyZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYCR7c2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICB9KX1gLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluYWxFeGl0Q29kZSkgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xufVxuIl0sIm5hbWVzIjpbInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsImFyZ3YiLCJjd2QiLCJjYWNoZUVuYWJsZWQiLCJlbnZQYXRocyIsImVudiIsIm1hcCIsImVudlBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsInRvU3RyaW5nIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsInByb2Nlc3MiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwiZmxhdE1hcCIsInJlbGF0aXZlIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiZW52VmFycyIsIm9yZ0VudlZhcnMiLCJyZWFkRW52RmlsZSIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJmaWx0ZXIiLCJFcnJvciIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJtZXJnZU91dEFuZEVycm9yIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwid3JpdGUiLCJlbmQiLCJhbGlnbiIsInJpZ2h0Iiwic3RyIiwid2lkdGgiLCJ0cmltIiwic3RyV2lkdGgiLCJtaXhpbiIsInN0cmluZ1dpZHRoIiwicmVwZWF0IiwiY2VudGVyIiwiVUkiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJfYSIsInRoaXMiLCJ3cmFwIiwicm93cyIsInNwYW4iLCJkaXYiLCJyZXNldE91dHB1dCIsInNob3VsZEFwcGx5TGF5b3V0RFNMIiwiYXBwbHlMYXlvdXREU0wiLCJjb2xzIiwiYXJnIiwiY29sRnJvbVN0cmluZyIsInRlc3QiLCJzcGxpdCIsInJvdyIsImxlZnRDb2x1bW5XaWR0aCIsImZvckVhY2giLCJjb2x1bW5zIiwiTWF0aCIsIm1pbiIsImZsb29yIiwiciIsImkiLCJ0ZXh0IiwicGFkZGluZyIsIm1lYXN1cmVQYWRkaW5nIiwibm9BbnNpIiwic3RyaXBBbnNpIiwibWF0Y2giLCJsaW5lcyIsInJvd1RvU3RyaW5nIiwibGluZSIsImhpZGRlbiIsInJhc3Rlcml6ZSIsInJyb3ciLCJjb2wiLCJjIiwid3JhcFdpZHRoIiwibmVnYXRlUGFkZGluZyIsInRzIiwiZm4iLCJhZGRCb3JkZXIiLCJyZW5kZXJJbmxpbmUiLCJyZXBsYWNlIiwic291cmNlIiwicHJldmlvdXNMaW5lIiwibGVhZGluZ1doaXRlc3BhY2UiLCJ0YXJnZXQiLCJ0YXJnZXRUZXh0V2lkdGgiLCJ0cmltUmlnaHQiLCJ0cmltTGVmdCIsInJyb3dzIiwid2lkdGhzIiwiY29sdW1uV2lkdGhzIiwid3JhcHBlZCIsImhhcmQiLCJib3JkZXIiLCJ1bnNoaWZ0IiwiQXJyYXkiLCJmaWxsIiwidW5zZXQiLCJyZW1haW5pbmdXaWR0aCIsInVuc2V0V2lkdGgiLCJ3IiwibWF4IiwibWluV2lkdGgiLCJfbWluV2lkdGgiLCJzdHlsZSIsImFuc2kiLCJSZWdFeHAiLCJzdGFydCIsImNoYXJBdCIsImNhbWVsQ2FzZSIsInRvTG93ZXJDYXNlIiwidG9VcHBlckNhc2UiLCJpbmRleE9mIiwiY2FtZWxjYXNlIiwibmV4dENoclVwcGVyIiwibGVhZGluZ0h5cGhlbnMiLCJjaHIiLCJkZWNhbWVsaXplIiwiam9pblN0cmluZyIsImxvd2VyY2FzZSIsIm5vdENhbWVsY2FzZSIsImNockxvd2VyIiwiY2hyU3RyaW5nIiwibG9va3NMaWtlTnVtYmVyIiwieCIsIkRlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5IiwiaW5jcmVtZW50Iiwib3JpZyIsInNhbml0aXplS2V5IiwiX2IiLCJfYyIsIm1pbk5vZGVWZXJzaW9uIiwiWUFSR1NfTUlOX05PREVfVkVSU0lPTiIsIk51bWJlciIsIm5vZGVWZXJzaW9uIiwidmVyc2lvbnMiLCJub2RlIiwidmVyc2lvbiIsInNsaWNlIiwicGFyc2VyIiwiX21peGluIiwicGFyc2UiLCJhcmdzSW5wdXQiLCJhc3NpZ24iLCJhbGlhcyIsImFycmF5IiwiYm9vbGVhbiIsImNvbmZpZ09iamVjdHMiLCJjb25maWd1cmF0aW9uIiwiY29lcmNlIiwiZGVmYXVsdCIsImVudlByZWZpeCIsIm5hcmciLCJub3JtYWxpemUiLCJzdHJpbmciLCJudW1iZXIiLCJfXyIsImFyZ1N0cmluZyIsImlzQXJyYXkiLCJlIiwicHJldkMiLCJvcGVuaW5nIiwiaWkiLCJ0b2tlbml6ZUFyZ1N0cmluZyIsImlucHV0SXNTdHJpbmciLCJhbGlhc2VzIiwiYWxpYXNBcnJheXMiLCJjb21iaW5lZCIsImNyZWF0ZSIsImNoYW5nZSIsImNvbmNhdCIsInYiLCJzcGxpY2UiLCJhbGlhc0FycmF5IiwibGFzdEFsaWFzIiwic2VsZiIsInBvcCIsImNvbWJpbmVBbGlhc2VzIiwiZGVmYXVsdHMiLCJub3RGbGFnc09wdGlvbiIsIm5vdEZsYWdzQXJndiIsIm5ld0FsaWFzZXMiLCJkZWZhdWx0ZWQiLCJmb3JtYXQiLCJmbGFncyIsImFycmF5cyIsImJvb2xzIiwic3RyaW5ncyIsIm51bWJlcnMiLCJjb3VudHMiLCJjb25maWdzIiwibmFyZ3MiLCJjb2VyY2lvbnMiLCJuZWdhdGl2ZSIsIm5lZ2F0ZWRCb29sZWFuIiwiQm9vbGVhbiIsIm9wdCIsImFzc2lnbm1lbnQiLCJvYmoiLCJ5IiwiZXh0ZW5kQWxpYXNlcyIsImZpbmQiLCJjaGVja0FsbEFsaWFzZXMiLCJub3RGbGFncyIsIl8iLCJhcmd2UmV0dXJuIiwidHJ1bmNhdGVkQXJnIiwiYnJva2VuIiwibGV0dGVycyIsIm0iLCJuZXh0IiwiaXNVbmtub3duT3B0aW9uQXNBcmciLCJwdXNoUG9zaXRpb25hbCIsImVhdEFycmF5IiwiZWF0TmFyZ3MiLCJzZXRBcmciLCJkZWZhdWx0VmFsdWUiLCJqIiwibWF5YmVDb2VyY2VkTnVtYmVyIiwibWF5YmVDb2VyY2VOdW1iZXIiLCJhcmdBZnRlckVxdWFsU2lnbiIsInRvRWF0IiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImF2YWlsYWJsZSIsImNvbnN1bWVkIiwiYXJnc1RvU2V0IiwibmFyZ3NDb3VudCIsImRlZlZhbCIsInByb2Nlc3NWYWx1ZSIsInZhbCIsInNob3VsZFN0cmlwUXVvdGVzIiwicHJvcCIsImFkZE5ld0FsaWFzIiwic3BsaXRLZXkiLCJzZXRLZXkiLCJrZXlQcm9wZXJ0aWVzIiwiYSIsInNoaWZ0IiwiaW5jbHVkZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJzdWJzdHJpbmciLCJzdHJpcFF1b3RlcyIsImlzU2FmZUludGVnZXIiLCJwYXJzZUZsb2F0Iiwic2V0Q29uZmlnT2JqZWN0IiwicHJldiIsImZ1bGxLZXkiLCJoYXNLZXkiLCJhcHBseUVudlZhcnMiLCJjb25maWdPbmx5IiwicHJlZml4IiwiZW52VmFyIiwibGFzdEluZGV4T2YiLCJhcHBseURlZmF1bHRzQW5kQWxpYXNlcyIsImNhbkxvZyIsIm8iLCJpc1R5cGVBcnJheSIsImlzVmFsdWVBcnJheSIsImR1cGxpY2F0ZSIsImZsYWciLCJ0b0NoZWNrIiwic2V0QWxpYXMiLCJoYXNBbnlGbGFnIiwiZmxhZ3NLZXlzIiwiayIsInNvbWUiLCJoYXNBbGxGbGFncyIsImhhc0FsbFNob3J0RmxhZ3MiLCJwYXR0ZXJucyIsInBhdHRlcm4iLCJoYXNGbGFnc01hdGNoaW5nIiwiaXNVbmtub3duT3B0aW9uIiwidHlwZSIsIkJPT0xFQU4iLCJTVFJJTkciLCJOVU1CRVIiLCJBUlJBWSIsImd1ZXNzVHlwZSIsIm51bSIsImNvbmZpZ0xvb2t1cCIsImNvbmZpZ0tleSIsImNvbmZpZ1BhdGgiLCJyZXNvbHZlZENvbmZpZ1BhdGgiLCJyZXNvbHZlQ29uZmlnIiwicmVxdWlyZSIsImV4IiwibmFtZSIsInNldENvbmZpZyIsImNvbmZpZ09iamVjdCIsImFwcGxpZWQiLCJTZXQiLCJoYXMiLCJhbGkiLCJhZGQiLCJlcnIiLCJhcHBseUNvZXJjaW9ucyIsInNldFBsYWNlaG9sZGVyS2V5cyIsIkpTT04iLCJyZWFkRmlsZVN5bmMiLCJ5YXJnc1BhcnNlciIsImdldFByb2Nlc3NBcmd2QmluSW5kZXgiLCJlbGVjdHJvbiIsImRlZmF1bHRBcHAiLCJkZXRhaWxlZCIsIllFcnJvciIsIm1zZyIsInN1cGVyIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJzaGltJDMiLCJ3cml0ZUZpbGUiLCJleGlzdHMiLCJmaWxlIiwic3RhdFN5bmMiLCJpc0ZpbGUiLCJzaGltIiwiWTE4TiIsImRpcmVjdG9yeSIsInVwZGF0ZUZpbGVzIiwibG9jYWxlIiwiZmFsbGJhY2tUb0xhbmd1YWdlIiwiY2FjaGUiLCJ3cml0ZVF1ZXVlIiwiYXJndW1lbnRzIiwiX3RhZ2dlZExpdGVyYWwiLCJjYiIsIl9yZWFkTG9jYWxlRmlsZSIsIl9lbnF1ZXVlV3JpdGUiLCJhcHBseSIsIl9fbiIsInByb3RvdHlwZSIsImNhbGwiLCJzaW5ndWxhciIsInBsdXJhbCIsInF1YW50aXR5Iiwib25lIiwib3RoZXIiLCJ2YWx1ZXMiLCJzZXRMb2NhbGUiLCJnZXRMb2NhbGUiLCJ1cGRhdGVMb2NhbGUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhcnRzIiwicGFydCIsIndvcmsiLCJfcHJvY2Vzc1dyaXRlUXVldWUiLCJfdGhpcyIsImxhbmd1YWdlRmlsZSIsIl9yZXNvbHZlTG9jYWxlRmlsZSIsInNlcmlhbGl6ZWRMb2NhbGUiLCJzdHJpbmdpZnkiLCJsb2NhbGVMb29rdXAiLCJTeW50YXhFcnJvciIsIm1lc3NhZ2UiLCJfZmlsZUV4aXN0c1N5bmMiLCJSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiIsIl9fZGlybmFtZSIsImZpbGVVUkxUb1BhdGgiLCJ1cmwiLCJzaGltJDEiLCJhc3NlcnQiLCJub3RTdHJpY3RFcXVhbCIsInN0cmljdEVxdWFsIiwiY2xpdWkiLCJmaW5kVXAiLCJjYWxsYmFjayIsInRtcCIsImRpciIsImlzRGlyZWN0b3J5IiwiZGlybmFtZSIsInJlYWRkaXJTeW5jIiwiZ2V0RW52IiwiaW5zcGVjdCIsImdldENhbGxlckZpbGUiLCJnZXRQcm9jZXNzQXJndkJpbiIsIm1haW5GaWxlbmFtZSIsIlBhcnNlciIsImJhc2VuYW1lIiwiZXh0bmFtZSIsImVtaXRXYXJuaW5nIiwid2FybmluZyIsImV4ZWNQYXRoIiwiZXhpdCIsIm5leHRUaWNrIiwic3RkQ29sdW1ucyIsInJlcXVpcmVEaXJlY3RvcnkiLCJ5MThuIiwiX3NoaW0iLCJiaW5kIiwiX3kxOG4iLCJhc3NlcnROb3RTdHJpY3RFcXVhbCIsImFjdHVhbCIsImV4cGVjdGVkIiwiYXNzZXJ0U2luZ2xlS2V5Iiwib2JqZWN0S2V5cyIsIm9iamVjdCIsImlzUHJvbWlzZSIsIm1heWJlUHJvbWlzZSIsInRoZW4iLCJwYXJzZUNvbW1hbmQiLCJjbWQiLCJzcGxpdENvbW1hbmQiLCJicmVnZXgiLCJmaXJzdENvbW1hbmQiLCJwYXJzZWRDb21tYW5kIiwiZGVtYW5kZWQiLCJvcHRpb25hbCIsInZhcmlhZGljIiwicG9zaXRpb25OYW1lIiwiYXJnc2VydCIsImFyZzEiLCJhcmcyIiwiYXJnMyIsInBvc2l0aW9uIiwiY2FsbGVyQXJndW1lbnRzIiwiX2xlbmd0aCIsInRvdGFsQ29tbWFuZHMiLCJvYnNlcnZlZFR5cGUiLCJhcmd1bWVudFR5cGVFcnJvciIsIndhcm4iLCJzdGFjayIsImFsbG93ZWRUeXBlcyIsIkdsb2JhbE1pZGRsZXdhcmUiLCJ5YXJncyIsImdsb2JhbE1pZGRsZXdhcmUiLCJmcm96ZW5zIiwiYWRkTWlkZGxld2FyZSIsImFwcGx5QmVmb3JlVmFsaWRhdGlvbiIsImdsb2JhbCIsIm11dGF0ZXMiLCJhZGRDb2VyY2VNaWRkbGV3YXJlIiwib3B0aW9uIiwiZ2V0QWxpYXNlcyIsImdldE1pZGRsZXdhcmUiLCJmcmVlemUiLCJ1bmZyZWV6ZSIsImZyb3plbiIsInJlc2V0IiwiYXBwbHlNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJiZWZvcmVWYWxpZGF0aW9uIiwicmVkdWNlIiwiYWNjIiwibWlkZGxld2FyZSIsImluaXRpYWxPYmoiLCJhbGwiLCJtaWRkbGV3YXJlT2JqIiwicmVzdWx0IiwibWF5YmVBc3luY1Jlc3VsdCIsImdldFJlc3VsdCIsInJlc3VsdEhhbmRsZXIiLCJlcnJvckhhbmRsZXIiLCJERUZBVUxUX01BUktFUiIsIkNvbW1hbmRJbnN0YW5jZSIsInVzYWdlIiwidmFsaWRhdGlvbiIsInJlcXVpcmVDYWNoZSIsImhhbmRsZXJzIiwiYWxpYXNNYXAiLCJhZGREaXJlY3RvcnkiLCJyZXEiLCJjYWxsZXJGaWxlIiwicmVjdXJzZSIsImV4dGVuc2lvbnMiLCJwYXJlbnRWaXNpdCIsInZpc2l0Iiwiam9pbmVkIiwiZmlsZW5hbWUiLCJ2aXNpdGVkIiwiYWRkSGFuZGxlciIsImRlc2NyaXB0aW9uIiwiYnVpbGRlciIsImhhbmRsZXIiLCJjb21tYW5kTWlkZGxld2FyZSIsImRlcHJlY2F0ZWQiLCJjb21tYW5kTWlkZGxld2FyZUZhY3RvcnkiLCJldmVyeSIsImlzQ29tbWFuZEFuZEFsaWFzZXMiLCJpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbiIsIm1vZHVsZU5hbWUiLCJleHRyYWN0RGVzYyIsImlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uIiwiaXNEZWZhdWx0IiwicGFyc2VkQWxpYXNlcyIsIm9yaWdpbmFsIiwiZGVmYXVsdENvbW1hbmQiLCJnZXRDb21tYW5kSGFuZGxlcnMiLCJnZXRDb21tYW5kcyIsImhhc0RlZmF1bHRDb21tYW5kIiwicnVuQ29tbWFuZCIsImNvbW1hbmRJbmRleCIsImhlbHBPbmx5IiwiaGVscE9yVmVyc2lvblNldCIsImNvbW1hbmRIYW5kbGVyIiwiY3VycmVudENvbnRleHQiLCJnZXRJbnRlcm5hbE1ldGhvZHMiLCJnZXRDb250ZXh0IiwicGFyZW50Q29tbWFuZHMiLCJjb21tYW5kcyIsImlzRGVmYXVsdENvbW1hbmQiLCJmdWxsQ29tbWFuZHMiLCJidWlsZGVyUmVzdWx0IiwiYXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSIsImFwcGx5TWlkZGxld2FyZUFuZEdldFJlc3VsdCIsImlubmVyQXJndiIsImlubmVyWWFyZ3MiLCJpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2siLCJnZXRVc2FnZUluc3RhbmNlIiwiYnVpbGRlck91dHB1dCIsIm91dHB1dCIsInBhcnNlQW5kVXBkYXRlVXNhZ2UiLCJpc0NvbW1hbmRCdWlsZGVyT3B0aW9uRGVmaW5pdGlvbnMiLCJzaG91bGRVcGRhdGVVc2FnZSIsInVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIiLCJydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcyIsImdldFVzYWdlRGlzYWJsZWQiLCJnZXRVc2FnZSIsInBjIiwiaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCIsInBvc2l0aW9uYWxNYXAiLCJnZXRIYXNPdXRwdXQiLCJydW5WYWxpZGF0aW9uIiwic2V0SGFzT3V0cHV0IiwicG9wdWxhdGVEb3VibGVEYXNoIiwiZ2V0T3B0aW9ucyIsInBvc3RQcm9jZXNzIiwiaGFuZGxlclJlc3VsdCIsImNhY2hlSGVscE1lc3NhZ2UiLCJoYXNQYXJzZUNhbGxiYWNrIiwiY2F0Y2giLCJmYWlsIiwiX2VyciIsInBvcHVsYXRlUG9zaXRpb25hbHMiLCJtYXliZVByb21pc2VBcmd2IiwicmVzb2x2ZWRJbm5lckFyZ3YiLCJjb250ZXh0IiwicG9zaXRpb25hbENvdW50IiwiZGVtYW5kIiwicG9wdWxhdGVQb3NpdGlvbmFsIiwibWF5YmUiLCJwb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzIiwiY21kVG9QYXJzZU9wdGlvbnMiLCJwb3NpdGlvbmFsIiwiU3RyaW5nIiwiY21kU3RyaW5nIiwicGFyc2VPcHRpb25zIiwiZCIsInVucGFyc2VkIiwicG9zaXRpb25hbEtleXMiLCJpc0luQ29uZmlncyIsImlzRGVmYXVsdGVkIiwicnVuRGVmYXVsdEJ1aWxkZXJPbiIsImNvbW1hbmRTdHJpbmciLCJtb2QiLCJleHBvcnRlZCIsImZpbGVzIiwiZXhwb3J0cyIsIndoaWNoTW9kdWxlIiwiY29tbWFuZEZyb21GaWxlbmFtZSIsImRlc2NyaWJlIiwiZGVzYyIsIm9iakZpbHRlciIsInNldEJsb2NraW5nIiwiYmxvY2tpbmciLCJfc3RyZWFtIiwic3RyZWFtIiwiX2hhbmRsZSIsImlzVFRZIiwiaXNCb29sZWFuIiwiZmFpbHMiLCJmYWlsRm4iLCJmIiwiZmFpbE1lc3NhZ2UiLCJnbG9iYWxGYWlsTWVzc2FnZSIsInNob3dIZWxwT25GYWlsIiwiZW5hYmxlZCIsImlzR2xvYmFsQ29udGV4dCIsImZhaWx1cmVPdXRwdXQiLCJsb2dnZXIiLCJnZXRMb2dnZXJJbnN0YW5jZSIsImdldEV4aXRQcm9jZXNzIiwic2hvd0hlbHAiLCJnbG9iYWxPckNvbW1hbmRGYWlsTWVzc2FnZSIsInVzYWdlcyIsInVzYWdlRGlzYWJsZWQiLCJnZXRQb3NpdGlvbmFsR3JvdXBOYW1lIiwiZXhhbXBsZXMiLCJleGFtcGxlIiwiY21kQXJyYXkiLCJkZXNjcmlwdGlvbnMiLCJrZXlPcktleXMiLCJnZXREZXNjcmlwdGlvbnMiLCJlcGlsb2dzIiwiZXBpbG9nIiwid3JhcFNldCIsImdldFdyYXAiLCJtYXhXaWR0aCIsIndpbmRvd1dpZHRoIiwiZGVmZXJZMThuTG9va3VwUHJlZml4IiwidGFibGUiLCJ0aGVXcmFwIiwibW9kaWZpZXIiLCJnZXRUZXh0IiwiZ2V0SW5kZW50YXRpb24iLCJwYXJzZUludCIsImNhY2hlZEhlbHBNZXNzYWdlIiwiZmlsdGVySGlkZGVuT3B0aW9ucyIsImhpZGRlbk9wdGlvbnMiLCJzaG93SGlkZGVuT3B0IiwiZGVmYXVsdFN0cmluZyIsImRlZmF1bHREZXNjcmlwdGlvbiIsImRlZmVyWTE4bkxvb2t1cCIsImhlbHAiLCJkZW1hbmRlZE9wdGlvbnMiLCJnZXREZW1hbmRlZE9wdGlvbnMiLCJkZW1hbmRPcHRpb24iLCJub3JtYWxpemVBbGlhc2VzIiwiYmFzZSQwIiwiY3VzdG9tU2NyaXB0TmFtZSIsIiQwIiwiZGVtYW5kZWRDb21tYW5kcyIsImdldERlbWFuZGVkQ29tbWFuZHMiLCJkZXByZWNhdGVkT3B0aW9ucyIsImdldERlcHJlY2F0ZWRPcHRpb25zIiwiZ3JvdXBzIiwiZ2V0R3JvdXBzIiwidWkiLCJ1IiwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvbiIsInNvcnQiLCJiIiwibG9jYWxlQ29tcGFyZSIsImhpbnRzIiwiYWxpYXNLZXlzIiwiZGVmYXVsdEdyb3VwIiwiZ3JvdXBlZEtleXMiLCJncm91cCIsImFkZFVuZ3JvdXBlZEtleXMiLCJpc0xvbmdTd2l0Y2giLCJzdyIsImRpc3BsYXllZEdyb3VwcyIsImdyb3VwTmFtZSIsIm5vcm1hbGl6ZWRLZXlzIiwiYWxpYXNLZXkiLCJzd2l0Y2hlcyIsInN3MSIsInN3MiIsImluZGVudCIsImlzSW5kZW50ZWRUZXh0IiwiaW5kZW50YXRpb24iLCJrc3dpdGNoIiwiZXh0cmEiLCJjaG9pY2VzIiwic3RyaW5naWZpZWRWYWx1ZXMiLCJzaG91bGRIaWRlT3B0aW9uRXh0cmFzIiwiZ2V0VXNhZ2VDb25maWd1cmF0aW9uIiwiY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSIsImhhc0NhY2hlZEhlbHBNZXNzYWdlIiwibGV2ZWwiLCJmdW5jdGlvbkRlc2NyaXB0aW9uIiwic2VwYXJhdG9yIiwic2VwIiwidmVyIiwic2hvd1ZlcnNpb24iLCJsb2NhbExvb2t1cCIsIkNvbXBsZXRpb24iLCJjb21wbGV0aW9uS2V5IiwiY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uIiwiaW5kZXhBZnRlckxhc3RSZXNldCIsInpzaFNoZWxsIiwiZGVmYXVsdENvbXBsZXRpb24iLCJjdXJyZW50IiwiZG9uZSIsImNvbXBsZXRpb25zIiwiY29tbWFuZENvbXBsZXRpb25zIiwib3B0aW9uQ29tcGxldGlvbnMiLCJjaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyIsImNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyIsInByZXZpb3VzQXJnSGFzQ2hvaWNlcyIsInVzYWdlQ29tbWFuZCIsImNvbW1hbmROYW1lIiwibmVnYWJsZSIsImFyZ3NDb250YWluS2V5IiwiY29tcGxldGVPcHRpb25LZXkiLCJnZXRQcmV2aW91c0FyZ0Nob2ljZXMiLCJvZmZzZXQiLCJwb3NpdGlvbmFsS2V5IiwiY2hvaWNlIiwic3RhcnRzV2l0aCIsInByZXZpb3VzQXJnIiwicHJldmlvdXNBcmdLZXkiLCJwb3NzaWJsZUFsaWFzZXMiLCJwb3NzaWJsZUFsaWFzIiwiYXJnc0NvbnRhaW5zIiwicyIsIl9kIiwia2V5V2l0aERlc2MiLCJkZXNjcyIsImRlc2NGcm9tQWxpYXMiLCJkYXNoZXMiLCJzdGFydHNCeVR3b0Rhc2hlcyIsImlzU2hvcnRPcHRpb24iLCJjdXN0b21Db21wbGV0aW9uIiwibGlzdCIsImNvbXBsZXRpb25GdW5jdGlvbiIsImlzRmFsbGJhY2tDb21wbGV0aW9uRnVuY3Rpb24iLCJvbkNvbXBsZXRlZCIsImdldENvbXBsZXRpb24iLCJnZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQiLCJzY3JpcHQiLCJyZWdpc3RlckZ1bmN0aW9uIiwic2V0UGFyc2VkIiwibGV2ZW5zaHRlaW4iLCJtYXRyaXgiLCJzcGVjaWFsS2V5cyIsInByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyIsImFwcGx5RXh0ZW5kcyIsIm1lcmdlRXh0ZW5kcyIsImRlZmF1bHRDb25maWciLCJleHRlbmRzIiwiaXNQYXRoIiwicGF0aFRvRGVmYXVsdCIsInBhdGhUb0V4dGVuZCIsImdldFBhdGhUb0RlZmF1bHRDb25maWciLCJjZmdQYXRoIiwiY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMiLCJtZXJnZURlZXAiLCJjb25maWcxIiwiY29uZmlnMiIsImlzT2JqZWN0IiwiX1lhcmdzSW5zdGFuY2VfY29tbWFuZCIsIl9ZYXJnc0luc3RhbmNlX2N3ZCIsIl9ZYXJnc0luc3RhbmNlX2NvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uIiwiX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQiLCJfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCIsIl9ZYXJnc0luc3RhbmNlX2V4aXRFcnJvciIsIl9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSIsIl9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncyIsIl9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzIiwiX1lhcmdzSW5zdGFuY2VfZnJvemVucyIsIl9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUiLCJfWWFyZ3NJbnN0YW5jZV9ncm91cHMiLCJfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQiLCJfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0IiwiX1lhcmdzSW5zdGFuY2VfaXNHbG9iYWxDb250ZXh0IiwiX1lhcmdzSW5zdGFuY2VfbG9nZ2VyIiwiX1lhcmdzSW5zdGFuY2Vfb3V0cHV0IiwiX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucyIsIl9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUiLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWciLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuIiwiX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0IiwiX1lhcmdzSW5zdGFuY2VfcGtncyIsIl9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcyIsIl9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzIiwiX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMiLCJfWWFyZ3NJbnN0YW5jZV9zaGltIiwiX1lhcmdzSW5zdGFuY2Vfc3RyaWN0IiwiX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMiLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zIiwiX1lhcmdzSW5zdGFuY2VfdXNhZ2UiLCJfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZyIsIl9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQiLCJfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uIiwiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsInJlY2VpdmVyIiwic3RhdGUiLCJraW5kIiwiVHlwZUVycm9yIiwiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsImtDb3B5RG91YmxlRGFzaCIsIlN5bWJvbCIsImtDcmVhdGVMb2dnZXIiLCJrRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3QiLCJrRW1pdFdhcm5pbmciLCJrRnJlZXplIiwia0dldERvbGxhclplcm8iLCJrR2V0UGFyc2VyQ29uZmlndXJhdGlvbiIsImtHZXRVc2FnZUNvbmZpZ3VyYXRpb24iLCJrR3Vlc3NMb2NhbGUiLCJrR3Vlc3NWZXJzaW9uIiwia1BhcnNlUG9zaXRpb25hbE51bWJlcnMiLCJrUGtnVXAiLCJrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXkiLCJrUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5Iiwia1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeSIsImtQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5Iiwia1Nhbml0aXplS2V5Iiwia1NldEtleSIsImtVbmZyZWV6ZSIsImtWYWxpZGF0ZUFzeW5jIiwia0dldENvbW1hbmRJbnN0YW5jZSIsImtHZXRDb250ZXh0Iiwia0dldEhhc091dHB1dCIsImtHZXRMb2dnZXJJbnN0YW5jZSIsImtHZXRQYXJzZUNvbnRleHQiLCJrR2V0VXNhZ2VJbnN0YW5jZSIsImtHZXRWYWxpZGF0aW9uSW5zdGFuY2UiLCJrSGFzUGFyc2VDYWxsYmFjayIsImtJc0dsb2JhbENvbnRleHQiLCJrUG9zdFByb2Nlc3MiLCJrUmViYXNlIiwia1Jlc2V0Iiwia1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzIiwia1J1blZhbGlkYXRpb24iLCJrU2V0SGFzT3V0cHV0Iiwia1RyYWNrTWFudWFsbHlTZXRLZXlzIiwiWWFyZ3NJbnN0YW5jZSIsInByb2Nlc3NBcmdzIiwicGFyZW50UmVxdWlyZSIsImFkZEhlbHBPcHQiLCJhZGRTaG93SGlkZGVuT3B0Iiwic2hvd0hpZGRlbiIsImNoZWNrIiwiX3lhcmdzIiwic3RyaXBBbGlhc2VkIiwiY29uZmxpY3RzIiwia2V5MSIsImtleTIiLCJwYXJzZUZuIiwiY29tcGxldGlvbiIsImNvbW1hbmREaXIiLCJkZW1hbmRDb21tYW5kIiwibWluTXNnIiwibWF4TXNnIiwiSW5maW5pdHkiLCJkZXByZWNhdGVPcHRpb24iLCJkZXRlY3RMb2NhbGUiLCJkZXRlY3QiLCJlcGlsb2d1ZSIsImV4YW1wbGVQYXJhbXMiLCJleGl0UHJvY2VzcyIsImdldERldGVjdExvY2FsZSIsImdldEhlbHAiLCJidWlsZGVyUmVzcG9uc2UiLCJnZXRTdHJpY3QiLCJnZXRTdHJpY3RDb21tYW5kcyIsImdldFN0cmljdE9wdGlvbnMiLCJnbG9iYWxzIiwibG9jYWwiLCJsIiwiZyIsImV4aXN0aW5nIiwic2VlbiIsImhpZGUiLCJpbXBsaWVzIiwiZGVwcmVjYXRlIiwicmVxdWlyZWQiLCJjb25maWdQYXJzZXIiLCJza2lwVmFsaWRhdGlvbiIsInJlcXVpcmVzQXJnIiwic2hvcnRDaXJjdWl0IiwiX3BhcnNlRm4iLCJ0bXBQYXJzZWQiLCJmaW5hbGx5IiwicGFyc2VBc3luYyIsInBhcnNlU3luYyIsInBhcnNlckNvbmZpZ3VyYXRpb24iLCJwa2dDb25mIiwiY29uZiIsInN1cHBvcnRlZE9wdHMiLCJmdWxsQ29tbWFuZCIsInBrIiwicGFyc2VPcHRpb24iLCJyZWNvbW1lbmRDb21tYW5kcyIsInJlY29tbWVuZCIsIk5hTiIsInNob3dDb21wbGV0aW9uU2NyaXB0IiwibG9nIiwic2NyaXB0TmFtZSIsInN0cmljdCIsInN0cmljdENvbW1hbmRzIiwic3RyaWN0T3B0aW9ucyIsInRlcm1pbmFsV2lkdGgiLCJ1cGRhdGVTdHJpbmdzIiwidXNhZ2VDb25maWd1cmF0aW9uIiwiZGVmYXVsdFZlcnNpb25PcHQiLCJXZWFrTWFwIiwib3B0aW9uS2V5IiwiaGludEtleSIsImhpbnQiLCJkZWR1cGxpY2F0aW9uSWQiLCJjb21wbGV0aW9uQ29tbWFuZCIsImV4aXRFcnJvciIsImhhc091dHB1dCIsInBhcnNlQ29udGV4dCIsImRlZmF1bHQkMCIsIm5wYXRoIiwic3RhcnREaXIiLCJwa2dKc29uUGF0aCIsIm5hbWVzIiwiX25vb3AiLCJzaW5nbGVLZXlIYW5kbGVyIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJfaiIsIl9rIiwiX2wiLCJfbSIsIl9vIiwiZ2V0Q29tbWFuZEluc3RhbmNlIiwiZ2V0UGFyc2VDb250ZXh0IiwiZ2V0VmFsaWRhdGlvbkluc3RhbmNlIiwiY2FsbGVkRnJvbUNvbW1hbmQiLCJydW5HbG9iYWxNaWRkbGV3YXJlIiwidG1wT3B0aW9ucyIsIlVzYWdlIiwiX3MiLCJvYnNlcnZlZCIsIm1pc3NpbmciLCJjdXN0b21Nc2dzIiwiY3VzdG9tTXNnIiwiY2hlY2tQb3NpdGlvbmFscyIsImNvbW1hbmRLZXlzIiwidW5rbm93biIsImlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyIsIm1heE5vbk9wdERlbWFuZGVkIiwiaW52YWxpZCIsImludmFsaWRLZXlzIiwiaW1wbGllZCIsImtleUV4aXN0cyIsImdldEltcGxpZWQiLCJpbXBsaWNhdGlvbnMiLCJpbXBseUZhaWwiLCJvcmlnS2V5Iiwib3JpZ1ZhbHVlIiwiY29uZmxpY3RpbmciLCJnZXRDb25mbGljdGluZyIsInBvdGVudGlhbENvbW1hbmRzIiwicmVjb21tZW5kZWQiLCJiZXN0RGlzdGFuY2UiLCJjYW5kaWRhdGUiLCJkaXN0YW5jZSIsIlZhbGlkYXRpb24iLCJDb21tYW5kIiwiYmFzZSIsImFyZ3ZQcm9taXNlIiwiaGVscE9wdFNldCIsInZlcnNpb25PcHRTZXQiLCJoYW5kbGVyS2V5cyIsInJlcXVlc3RDb21wbGV0aW9ucyIsInNraXBSZWNvbW1lbmRhdGlvbiIsImZpcnN0VW5rbm93bkNvbW1hbmQiLCJjb21wbGV0aW9uQXJncyIsInBhcnNlRXJyb3JzIiwibm9uT3B0aW9uQ291bnQiLCJyZXF1aXJlZEFyZ3VtZW50cyIsImZhaWxlZFN0cmljdENvbW1hbmRzIiwidW5rbm93bkNvbW1hbmRzIiwidW5rbm93bkFyZ3VtZW50cyIsImxpbWl0ZWRDaG9pY2VzIiwiWWFyZ3MiLCJlc21QbGF0Zm9ybVNoaW0iLCJpc1J1bm5pbmdPbkJ1biIsImVuZHNXaXRoIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJtZW1vaXplIiwiY2FjaGVEdXJhdGlvbiIsInQiLCJQT1NJVElWRV9JTkZJTklUWSIsImNhY2hlcyIsImNhbGNLZXkiLCJuIiwiY29kZVBvaW50QXQiLCJpbXVsIiwicGFkU3RhcnQiLCJtYXhDYWNoZWRBcmdzU2l6ZSIsIm1heENhY2hlZFRoaXNTaXplIiwiRGF0ZSIsIm5vdyIsInNpemUiLCJkZWxldGUiLCJoIiwibWVtb2l6ZUZhY3RvcnkiLCJNQVhfU0FGRV9JTlRFR0VSIiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsInAiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwicm9vdCIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZGVzY2VuZGFudHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ1cGRhdGUiLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwiaW5jbHVkZVBhdHRlcm5zIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJleHRlbnNpb24iLCJiaW9tZUNvbW1hbmQiLCJiaW9tZVByb21pc2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiVVJMIiwiYWJzb2x1dGVQYXRoIiwicHJpc21hQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwicmVzdG9yZWQiLCJ0cmltRW5kIiwiZmlsdGVyZWQiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93IiwiaHR0cFNlcnZlclBhY2thZ2VzIiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwicHJvbWlzZUFsbCIsIm5ld0RlcHMiLCJuZXdEZXZEZXBzIiwiZGVwIiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3RhcnRQcm9kdWN0aW9uIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJmaXhCdW5Db21tYW5kIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsInVuaXQiLCJDSSIsIkZPUkNFX0NPTE9SIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJ1bml0VGltZW91dCIsInRlc3RPbkRvY2tlciIsInR5cGVDaGVja0NvbW1hbmQiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyJdLCJtYXBwaW5ncyI6ImtyQkErQ08sU0FBU0EsRUFDZEMsRUFDQUMsRUFDQUMsR0FBZSxHQUVmLElBQUlDLEdBQVlILEVBQUtJLEtBQU8sSUFBSUMsS0FBS0MsR0FBWUMsRUFBS0MsUUFBUVAsRUFBS0ssRUFBUUcsY0FDM0UsTUFBTUMsRUFDSlYsRUFBS1csYUFDSlgsRUFBS1ksZUFDRkMsUUFBUVQsSUFBSVUsVUFBWSxjQUN4QmQsRUFBS2UsZUFDSEYsUUFBUVQsSUFBSVksUUFBVUgsUUFBUVQsSUFBSVUsVUFBWSxtQkFDOUNHLEdBQ1IsR0FBdUIsaUJBQVpQLEVBQXNCLENBQy9CLEdBQXdCLElBQXBCUCxFQUFTZSxTQUNYZixFQUFTZ0IsS0FBS1osRUFBS2EsS0FBS25CLEVBQUssU0FDekJELEVBQUtxQixnQkFBZ0IsQ0FDdkIsTUFBTUMsRUFBV2YsRUFBS0MsUUFBUVAsRUFBSyxLQUFNLE1BQ3JDc0IsRUFBR0MsV0FBV2pCLEVBQUthLEtBQUtFLEVBQVUsa0JBQ3BDbkIsRUFBU2dC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UUFBUTJ0QyxJQUNSN3hCLFlBQVl0ZixJQUNYLE1BQU1veEMsRUFBYXB4QyxFQUFLLGVBQ3hCLEdBQUlveEMsRUFBWSxDQUNkLE1BQU1oUSxFQUFVN2dDLEVBQUtDLFFBQVE0d0MsR0FDN0J2d0MsUUFBUXd3QyxNQUFNalEsRUFDaEIsRWhFZ0hHLFNBQThDdC9CLEdBRS9DQSxFQUFROGdDLE1BQVE5Z0MsRUFBUXd2QyxtQkFDMUJ4dkMsRUFBUThnQyxLQUFPOWdDLEVBQVE4Z0MsS0FBS2w2QixRQUFRLEdBQUc1RyxFQUFRd3ZDLG9CQUFxQixJQUVqRXBQLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNaGdDLEtBQU9FLE9BQU9JLEtBQUtWLEdBQVUsQ0FDdEMsTUFBTXl2QyxFQUFXcnZDLEVBQUl1SSxlQUVuQjhtQyxFQUFTNWlCLFdBQVcsU0FDcEI0aUIsRUFBUzVpQixXQUFXLFVBQ3BCNGlCLEVBQVM1aUIsV0FBVyxXQUNQLGdCQUFiNGlCLEdBQ2EsYUFBYkEsV0FFT3p2QyxFQUFRSSxFQUVuQixDQUNGLENnRXBJSXN2QyxDQUFxQzN3QyxRQUFRVCxJQUFJLElBRWxEa0QsUUFBUThnQyxJQUNSOWdDLFFBQVF5bEMsSUFDUnpsQyxRQUFRcW1DLElBQ1JybUMsUUFBUXNvQyxJQUNSdG9DLFFBQVFzcEMsSUFDUnRwQyxRQUFRNHBDLElBQ1I1cEMsUUFBUTRyQyxJQUNSNXJDLFFBQVErc0MsSUFDUi9zQyxRQUFRdXRDLElBQ1J2dEMsUUFBUTR0QyxJQUNSaGEsZ0JBQ0FnRCxTQUNBblEsT0FBTy9wQixLQUVWLElBQUssTUFBTTRFLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekMvRCxRQUFRbUQsR0FBR1ksR0FBUSxJQUFNL0QsUUFBUTRhIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNywzOF19
|
|
33
|
+
var Y,q,G;const K=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,Q=null!==(q=null===(Y=null===process||void 0===process?void 0:process.versions)||void 0===Y?void 0:Y.node)&&void 0!==q?q:null===(G=null===process||void 0===process?void 0:process.version)||void 0===G?void 0:G.slice(1);if(Q){if(Number(Q.match(/^([^.]+)/)[1])<K)throw Error(`yargs parser supports a minimum Node.js version of ${K}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const X=process?process.env:{},Z=new class{constructor(e){U=e}parse(e,t){const n=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},t),s=function(e){if(Array.isArray(e))return e.map((e=>"string"!=typeof e?e+"":e));e=e.trim();let t=0,n=null,s=null,i=null;const r=[];for(let o=0;o<e.length;o++)n=s,s=e.charAt(o)," "!==s||i?(s===i?i=null:"'"!==s&&'"'!==s||i||(i=s),r[t]||(r[t]=""),r[t]+=s):" "!==n&&t++;return r}(e),i="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let s=!0;Object.keys(e).forEach((function(n){t.push([].concat(e[n],n))}));for(;s;){s=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter((function(e){return-1!==t[n].indexOf(e)})).length){t[e]=t[e].concat(t[n]),t.splice(n,1),s=!0;break}}}return t.forEach((function(e){const t=(e=e.filter((function(e,t,n){return n.indexOf(e)===t}))).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)})),n}(Object.assign(Object.create(null),n.alias)),o=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},n.configuration),a=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,h=o["populate--"],d=h?"--":"_",u=Object.create(null),f=Object.create(null),p=n.__||U.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},m=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,y=new RegExp("^--"+o["negation-prefix"]+"(.+)");[].concat(n.array||[]).filter(Boolean).forEach((function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map((function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]})).filter(Boolean).pop();n&&(g[n][t]=!0),g.arrays[t]=!0,g.keys.push(t)})),[].concat(n.boolean||[]).filter(Boolean).forEach((function(e){g.bools[e]=!0,g.keys.push(e)})),[].concat(n.string||[]).filter(Boolean).forEach((function(e){g.strings[e]=!0,g.keys.push(e)})),[].concat(n.number||[]).filter(Boolean).forEach((function(e){g.numbers[e]=!0,g.keys.push(e)})),[].concat(n.count||[]).filter(Boolean).forEach((function(e){g.counts[e]=!0,g.keys.push(e)})),[].concat(n.normalize||[]).filter(Boolean).forEach((function(e){g.normalize[e]=!0,g.keys.push(e)})),"object"==typeof n.narg&&Object.entries(n.narg).forEach((([e,t])=>{"number"==typeof t&&(g.nargs[e]=t,g.keys.push(e))})),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach((([e,t])=>{"function"==typeof t&&(g.coercions[e]=t,g.keys.push(e))})),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach((function(e){g.configs[e]=!0})):"object"==typeof n.config&&Object.entries(n.config).forEach((([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(g.configs[e]=t)}))),function(...e){e.forEach((function(e){Object.keys(e||{}).forEach((function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach((function(t){if(/-/.test(t)&&o["camel-case-expansion"]){const n=F(t);n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].concat(e).forEach((function(t){if(t.length>1&&/[A-Z]/.test(t)&&o["camel-case-expansion"]){const n=B(t,"-");n!==e&&-1===g.aliases[e].indexOf(n)&&(g.aliases[e].push(n),u[n]=!0)}})),g.aliases[e].forEach((function(t){g.aliases[t]=[e].concat(g.aliases[e].filter((function(e){return t!==e})))})))}))}))}(n.key,r,n.default,g.arrays),Object.keys(a).forEach((function(e){(g.aliases[e]||[]).forEach((function(t){a[t]=a[e]}))}));let b=null;Object.keys(g.counts).find((e=>D(e,g.arrays)?(b=Error(p("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!D(e,g.nargs)&&(b=Error(p("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0)));let v=[];const w=Object.assign(Object.create(null),{_:[]}),O={};for(let e=0;e<s.length;e++){const t=s[e],n=t.replace(/^-{3,}/,"---");let i,r,a,c,l,h;if("--"!==t&&/^-/.test(t)&&R(t))E(t);else{if(n.match(/^---+(=|$)/)){E(t);continue}if(t.match(/^--.+=/)||!o["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(D(c[1],g.arrays)?e=A(e,c[1],s,c[2]):!1!==D(c[1],g.nargs)?e=k(e,c[1],s,c[2]):j(c[1],c[2],!0));else if(t.match(y)&&o["boolean-negation"])c=t.match(y),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],j(r,!!D(r,g.arrays)&&[!1]));else if(t.match(/^--.+/)||!o["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||l.match(/^-/)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&j(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(m))l=s[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||D(r,g.bools)||D(r,g.counts)?j(r,W(r)):(j(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(m)){a=t.slice(1,-1).split(""),i=!1;for(let n=0;n<a.length;n++){if(l=t.slice(n+2),a[n+1]&&"="===a[n+1]){h=t.slice(n+3),r=a[n],D(r,g.arrays)?e=A(e,r,s,h):!1!==D(r,g.nargs)?e=k(e,r,s,h):j(r,h),i=!0;break}if("-"!==l){if(/[A-Za-z]/.test(a[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===D(l,g.bools)){j(a[n],l),i=!0;break}if(a[n+1]&&a[n+1].match(/\W/)){j(a[n],l),i=!0;break}j(a[n],W(a[n]))}else j(a[n],l)}r=t.slice(-1)[0],i||"-"===r||(D(r,g.arrays)?e=A(e,r,s):!1!==D(r,g.nargs)?e=k(e,r,s):(l=s[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),e++):j(r,W(r)):(j(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(m)&&D(t.slice(1),g.bools))r=t.slice(1),j(r,W(r));else{if("--"===t){v=s.slice(e+1);break}if(o["halt-at-non-option"]){v=s.slice(e);break}E(t)}}}function E(e){const t=_("_",e);"string"!=typeof t&&"number"!=typeof t||w._.push(t)}function k(e,t,n,s){let i,r=D(t,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return z(s)||(b=Error(p("Argument unexpected for: %s",t))),j(t,W(t)),e;let a=z(s)?0:1;if(o["nargs-eats-options"])n.length-(e+1)+a<r&&(b=Error(p("Not enough arguments following: %s",t))),a=r;else{for(i=e+1;i<n.length&&(!n[i].match(/^-[^0-9]/)||n[i].match(m)||R(n[i]));i++)a++;a<r&&(b=Error(p("Not enough arguments following: %s",t)))}let c=Math.min(a,r);for(!z(s)&&c>0&&(j(t,s),c--),i=e+1;i<c+e+1;i++)j(t,n[i]);return e+c}function A(e,t,n,s){let r=[],c=s||n[e+1];const l=D(t,g.nargs);if(D(t,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(z(c)||z(s)&&/^-/.test(c)&&!m.test(c)&&!R(c)){if(void 0!==a[t]){const e=a[t];r=Array.isArray(e)?e:[e]}}else{z(s)||r.push(x(t,s,!0));for(let s=e+1;s<n.length&&!(!o["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[s],!/^-/.test(c)||m.test(c)||R(c));s++)e=s,r.push(x(t,c,i))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(p("Not enough arguments following: %s",t))),j(t,r),e}function j(e,t,n=i){if(/-/.test(e)&&o["camel-case-expansion"]){const t=e.split(".").map((function(e){return F(e)})).join(".");$(e,t)}const s=x(e,t,n),r=e.split(".");if(M(w,r,s),g.aliases[e]&&g.aliases[e].forEach((function(e){const t=e.split(".");M(w,t,s)})),r.length>1&&o["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(t){let n=t.split(".");const i=[].concat(r);i.shift(),n=n.concat(i),(g.aliases[e]||[]).includes(n.join("."))||M(w,n,s)})),D(e,g.normalize)&&!D(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach((function(e){Object.defineProperty(O,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?U.normalize(e):e}})}))}}function $(e,t){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[t],u[t]=!0),g.aliases[t]&&g.aliases[t].length||$(t,e)}function x(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(D(e,g.bools)||D(e,g.counts))&&"string"==typeof t&&(t="true"===t);let s=Array.isArray(t)?t.map((function(t){return _(e,t)})):_(e,t);return D(e,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=H()),D(e,g.normalize)&&D(e,g.arrays)&&(s=Array.isArray(t)?t.map((e=>U.normalize(e))):U.normalize(t)),s}function _(e,t){if(!o["parse-positional-numbers"]&&"_"===e)return t;if(!D(e,g.strings)&&!D(e,g.bools)&&!Array.isArray(t)){(L(t)&&o["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!z(t)&&D(e,g.numbers))&&(t=Number(t))}return t}function C(e,t){Object.keys(e).forEach((function(n){const s=e[n],i=t?t+"."+n:n;"object"==typeof s&&null!==s&&!Array.isArray(s)&&o["dot-notation"]?C(s,i):(!N(w,i.split("."))||D(i,g.arrays)&&o["combine-arrays"])&&j(i,s)}))}function S(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",s=U.env();Object.keys(s).forEach((function(i){if(""===n||0===i.lastIndexOf(n,0)){const r=i.split("__").map((function(e,t){return 0===t&&(e=e.substring(n.length)),F(e)}));(t&&g.configs[r.join(".")]||!t)&&!N(e,r)&&j(r.join("."),s[i])}}))}function P(e,t,n,s=!1){Object.keys(n).forEach((function(i){N(e,i.split("."))||(M(e,i.split("."),n[i]),s&&(f[i]=!0),(t[i]||[]).forEach((function(t){N(e,t.split("."))||M(e,t.split("."),n[i])})))}))}function N(e,t){let n=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){n=n[e]||{}}));const s=t[t.length-1];return"object"==typeof n&&s in n}function M(e,t,n){let s=e;o["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach((function(e){e=J(e),"object"==typeof s&&void 0===s[e]&&(s[e]={}),"object"!=typeof s[e]||Array.isArray(s[e])?(Array.isArray(s[e])?s[e].push({}):s[e]=[s[e],{}],s=s[e][s[e].length-1]):s=s[e]}));const i=J(t[t.length-1]),r=D(t.join("."),g.arrays),a=Array.isArray(n);let c=o["duplicate-arguments-array"];!c&&D(i,g.nargs)&&(c=!0,(!z(s[i])&&1===g.nargs[i]||Array.isArray(s[i])&&s[i].length===g.nargs[i])&&(s[i]=void 0)),n===H()?s[i]=H(s[i]):Array.isArray(s[i])?c&&r&&a?s[i]=o["flatten-duplicate-arrays"]?s[i].concat(n):(Array.isArray(s[i][0])?s[i]:[s[i]]).concat([n]):c||Boolean(r)!==Boolean(a)?s[i]=s[i].concat([n]):s[i]=n:void 0===s[i]&&r?s[i]=a?n:[n]:!c||void 0===s[i]||D(i,g.counts)||D(i,g.bools)?s[i]=n:s[i]=[s[i],n]}function D(e,t){const n=[].concat(g.aliases[e]||[],e),s=Object.keys(t),i=n.find((e=>s.includes(e)));return!!i&&t[i]}function I(e){const t=Object.keys(g);return[].concat(t.map((e=>g[e]))).some((function(t){return Array.isArray(t)?t.includes(e):t[e]}))}function R(e){return o["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(m))return!1;if(function(e){if(e.match(m)||!e.match(/^-[^-]+/))return!1;let t,n=!0;const s=e.slice(1).split("");for(let i=0;i<s.length;i++){if(t=e.slice(i+2),!I(s[i])){n=!1;break}if(s[i+1]&&"="===s[i+1]||"-"===t||/[A-Za-z]/.test(s[i])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||s[i+1]&&s[i+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some((function(t){const n=e.match(t);return n&&I(n[1])}))}(e,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function W(e){return D(e,g.bools)||D(e,g.counts)||!(`${e}`in a)?(t=function(e){let t=V.BOOLEAN;return D(e,g.strings)?t=V.STRING:D(e,g.numbers)?t=V.NUMBER:D(e,g.bools)?t=V.BOOLEAN:D(e,g.arrays)&&(t=V.ARRAY),t}(e),{[V.BOOLEAN]:!0,[V.STRING]:"",[V.NUMBER]:void 0,[V.ARRAY]:[]}[t]):a[e];var t}function z(e){return void 0===e}return S(w,!0),S(w,!1),function(e){const t=Object.create(null);P(t,g.aliases,a),Object.keys(g.configs).forEach((function(n){const s=e[n]||t[n];if(s)try{let e=null;const t=U.resolve(U.cwd(),s),i=g.configs[n];if("function"==typeof i){try{e=i(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=U.require(t);C(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(p("Invalid JSON config file: %s",s)))}}))}(w),void 0!==c&&c.forEach((function(e){C(e)})),P(w,g.aliases,a,!0),function(e){let t;const n=new Set;Object.keys(e).forEach((function(s){if(!n.has(s)&&(t=D(s,g.coercions),"function"==typeof t))try{const i=_(s,t(e[s]));[].concat(g.aliases[s]||[],s).forEach((t=>{n.add(t),e[t]=i}))}catch(e){b=e}}))}(w),o["set-placeholder-key"]&&function(e){g.keys.forEach((t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)}))}(w),Object.keys(g.counts).forEach((function(e){N(w,e.split("."))||j(e,0)})),h&&v.length&&(w[d]=[]),v.forEach((function(e){w[d].push(e)})),o["camel-case-expansion"]&&o["strip-dashed"]&&Object.keys(w).filter((e=>"--"!==e&&e.includes("-"))).forEach((e=>{delete w[e]})),o["strip-aliased"]&&[].concat(...Object.keys(r).map((e=>r[e]))).forEach((e=>{o["camel-case-expansion"]&&e.includes("-")&&delete w[e.split(".").map((e=>F(e))).join(".")],delete w[e]})),{aliases:Object.assign({},g.aliases),argv:Object.assign(O,w),configuration:o,defaulted:Object.assign({},f),error:b,newAliases:Object.assign({},u)}}}({cwd:process.cwd,env:()=>X,format:p,normalize:s,resolve:t,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(u(e,"utf8"));throw Error("only .json config files are supported in ESM")}}),ee=function(e,t){return Z.parse(e.slice(),t).argv};function te(){return process.versions.electron&&!process.defaultApp?0:1}ee.detailed=function(e,t){return Z.parse(e.slice(),t)},ee.camelCase=F,ee.decamelize=B,ee.looksLikeNumber=L;class ne extends Error{constructor(e){super(e||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,ne)}}var se={fs:{readFileSync:u,writeFile:f},format:p,resolve:t,exists:e=>{try{return h(e).isFile()}catch(e){return!1}}};let ie;class re{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),ie.format.apply(ie.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=e.shift(),s=e.shift();let i=function(){};"function"==typeof e[e.length-1]&&(i=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===s?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===s?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:i})):i();const o=[r];return~r.indexOf("%d")&&o.push(s),ie.format.apply(ie.format,o.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach((function(e,s){const i=t[s+1];n+=e,void 0!==i&&(n+="%s")})),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,s=t.locale,i=t.cb,r=this._resolveLocaleFile(n,s),o=JSON.stringify(this.cache[s],null,2);ie.fs.writeFile(r,o,"utf-8",(function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),i(t)}))}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{ie.fs.readFileSync&&(e=JSON.parse(ie.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=ie.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const s=ie.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(e){return ie.exists(e)}}const oe="loading a directory of commands is not supported yet for ESM";let ae;try{ae=m(import.meta.url)}catch(e){ae=process.cwd()}var ce,le={assert:{notStrictEqual:a,strictEqual:c},cliui:function(e){return function(e,t){return R=t,new D({width:(null==e?void 0:e.width)||("object"==typeof process&&process.stdout&&process.stdout.columns?process.stdout.columns:80),wrap:null==e?void 0:e.wrap})}(e,{stringWidth:e=>[...e].length,stripAnsi:z,wrap:T})},findUp:function(e,s){let i,r=t(".",e);for(h(r).isDirectory()||(r=n(r));;){if(i=s(r,d(r)),i)return t(r,i);if(r=n(i=r),i===r)break}},getEnv:e=>process.env[e],inspect:g,getCallerFile:()=>{throw new ne(oe)},getProcessArgvBin:function(){return process.argv[te()]},mainFilename:ae.substring(0,ae.lastIndexOf("node_modules"))||process.cwd(),Parser:ee,path:{basename:i,dirname:n,extname:r,relative:o,resolve:t},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(e,t)=>process.emitWarning(e,t),execPath:()=>process.execPath,exit:process.exit,nextTick:process.nextTick,stdColumns:void 0!==process.stdout.columns?process.stdout.columns:null},readFileSync:u,require:()=>{throw new ne("require is not supported by ESM")},requireDirectory:()=>{throw new ne(oe)},stringWidth:e=>[...e].length,y18n:(ce={directory:t(ae,"../../../locales"),updateFiles:!1},function(e,t){ie=t;const n=new re(e);return{__:n.__.bind(n),__n:n.__n.bind(n),setLocale:n.setLocale.bind(n),getLocale:n.getLocale.bind(n),updateLocale:n.updateLocale.bind(n),locale:n.locale}}(ce,se))};function he(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function de(e,t){t.assert.strictEqual(typeof e,"string")}function ue(e){return Object.keys(e)}function fe(e){return!!e&&!!e.then&&"function"==typeof e.then}function pe(e){const t=e.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),n=/\.*[\][<>]/g,s=t.shift();if(!s)throw new Error(`No command found in: ${e}`);const i={cmd:s.replace(n,""),demanded:[],optional:[]};return t.forEach(((e,s)=>{let r=!1;e=e.replace(/\s/g,""),/\.+[\]>]/.test(e)&&s===t.length-1&&(r=!0),/^\[/.test(e)?i.optional.push({cmd:e.replace(n,"").split("|"),variadic:r}):i.demanded.push({cmd:e.replace(n,"").split("|"),variadic:r})})),i}const ge=["first","second","third","fourth","fifth","sixth"];function me(e,t,n){try{let s=0;const[i,r,o]="object"==typeof e?[{demanded:[],optional:[]},e,t]:[pe(`cmd ${e}`),t,n],a=[].slice.call(r);for(;a.length&&void 0===a[a.length-1];)a.pop();const c=o||a.length;if(c<i.demanded.length)throw new ne(`Not enough arguments provided. Expected ${i.demanded.length} but received ${a.length}.`);const l=i.demanded.length+i.optional.length;if(c>l)throw new ne(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((e=>{const t=ye(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&be(t,e.cmd,s),s+=1})),i.optional.forEach((e=>{if(0===a.length)return;const t=ye(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&be(t,e.cmd,s),s+=1}))}catch(e){console.warn(e.stack)}}function ye(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function be(e,t,n){throw new ne(`Invalid ${ge[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class ve{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(me("<array|function> [boolean] [boolean] [boolean]",[e,t,n],arguments.length),Array.isArray(e)){for(let s=0;s<e.length;s++){if("function"!=typeof e[s])throw Error("middleware must be a function");const i=e[s];i.applyBeforeValidation=t,i.global=n}Array.prototype.push.apply(this.globalMiddleware,e)}else if("function"==typeof e){const i=e;i.applyBeforeValidation=t,i.global=n,i.mutates=s,this.globalMiddleware.push(e)}return this.yargs}addCoerceMiddleware(e,t){const n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((e=>{const s=[...n[t]||[],t];return!e.option||!s.includes(e.option)})),e.option=t,this.addMiddleware(e,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){const e=this.frozens.pop();void 0!==e&&(this.globalMiddleware=e)}reset(){this.globalMiddleware=this.globalMiddleware.filter((e=>e.global))}}function we(e,t,n,s){return n.reduce(((e,n)=>{if(n.applyBeforeValidation!==s)return e;if(n.mutates){if(n.applied)return e;n.applied=!0}if(fe(e))return e.then((e=>Promise.all([e,n(e,t)]))).then((([e,t])=>Object.assign(e,t)));{const s=n(e,t);return fe(s)?s.then((t=>Object.assign(e,t))):Object.assign(e,s)}}),e)}function Oe(e,t,n=e=>{throw e}){try{const n="function"==typeof e?e():e;return fe(n)?n.then((e=>t(e))):t(n)}catch(e){return n(e)}}const Ee=/(^\*)|(^\$0)/;class ke{constructor(e,t,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=e,this.globalMiddleware=n,this.validation=t}addDirectory(e,t,n,s){"boolean"!=typeof(s=s||{}).recurse&&(s.recurse=!1),Array.isArray(s.extensions)||(s.extensions=["js"]);const i="function"==typeof s.visit?s.visit:e=>e;s.visit=(e,t,n)=>{const s=i(e,t,n);if(s){if(this.requireCache.has(t))return s;this.requireCache.add(t),this.addHandler(s)}return s},this.shim.requireDirectory({require:t,filename:n},e,s)}addHandler(e,t,n,s,i,r){let o=[];const a=function(e){return e?e.map((e=>(e.applyBeforeValidation=!1,e))):[]}(i);if(s=s||(()=>{}),Array.isArray(e))if(function(e){return e.every((e=>"string"==typeof e))}(e))[e,...o]=e;else for(const t of e)this.addHandler(t);else{if(function(e){return"object"==typeof e&&!Array.isArray(e)}(e)){let t=Array.isArray(e.command)||"string"==typeof e.command?e.command:this.moduleName(e);return e.aliases&&(t=[].concat(t).concat(e.aliases)),void this.addHandler(t,this.extractDesc(e),e.builder,e.handler,e.middlewares,e.deprecated)}if(Ae(n))return void this.addHandler([e].concat(o),t,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof e){const i=pe(e);o=o.map((e=>pe(e).cmd));let c=!1;const l=[i.cmd].concat(o).filter((e=>!Ee.test(e)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),e=e.replace(Ee,i.cmd)),o.forEach((e=>{this.aliasMap[e]=i.cmd})),!1!==t&&this.usage.command(e,t,c,o,r),this.handlers[i.cmd]={original:e,description:t,handler:s,builder:n||{},middlewares:a,deprecated:r,demanded:i.demanded,optional:i.optional},c&&(this.defaultCommand=this.handlers[i.cmd])}}getCommandHandlers(){return this.handlers}getCommands(){return Object.keys(this.handlers).concat(Object.keys(this.aliasMap))}hasDefaultCommand(){return!!this.defaultCommand}runCommand(e,t,n,s,i,r){const o=this.handlers[e]||this.handlers[this.aliasMap[e]]||this.defaultCommand,a=t.getInternalMethods().getContext(),c=a.commands.slice(),l=!e;e&&(a.commands.push(e),a.fullCommands.push(o.original));const h=this.applyBuilderUpdateUsageAndParse(l,o,t,n.aliases,c,s,i,r);return fe(h)?h.then((e=>this.applyMiddlewareAndGetResult(l,o,e.innerArgv,a,i,e.aliases,t))):this.applyMiddlewareAndGetResult(l,o,h.innerArgv,a,i,h.aliases,t)}applyBuilderUpdateUsageAndParse(e,t,n,s,i,r,o,a){const c=t.builder;let l=n;if(je(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(fe(h))return h.then((s=>{var a;return l=(a=s)&&"function"==typeof a.getInternalMethods?s:n,this.parseAndUpdateUsage(e,t,l,i,r,o)}))}else(function(e){return"object"==typeof e})(c)&&(n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(s),Object.keys(t.builder).forEach((e=>{l.option(e,c[e])})));return this.parseAndUpdateUsage(e,t,l,i,r,o)}parseAndUpdateUsage(e,t,n,s,i,r){e&&n.getInternalMethods().getUsageInstance().unfreeze(!0),this.shouldUpdateUsage(n)&&n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,t),t.description);const o=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,i,r);return fe(o)?o.then((e=>({aliases:n.parsed.aliases,innerArgv:e}))):{aliases:n.parsed.aliases,innerArgv:o}}shouldUpdateUsage(e){return!e.getInternalMethods().getUsageInstance().getUsageDisabled()&&0===e.getInternalMethods().getUsageInstance().getUsage().length}usageFromParentCommandsCommandHandler(e,t){const n=Ee.test(t.original)?t.original.replace(Ee,"").trim():t.original,s=e.filter((e=>!Ee.test(e)));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(e,t,n,s,i,r,o,a){if(!r.getInternalMethods().getHasOutput()){const t=r.getInternalMethods().runValidation(i,a,r.parsed.error,e);n=Oe(n,(e=>(t(e),e)))}if(t.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();const s=!!r.getOptions().configuration["populate--"];r.getInternalMethods().postProcess(n,s,!1,!1),n=Oe(n=we(n,r,o,!1),(e=>{const n=t.handler(e);return fe(n)?n.then((()=>e)):e})),e||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),fe(n)&&!r.getInternalMethods().hasParseCallback()&&n.catch((e=>{try{r.getInternalMethods().getUsageInstance().fail(null,e)}catch(e){}}))}return e||(s.commands.pop(),s.fullCommands.pop()),n}applyMiddlewareAndGetResult(e,t,n,s,i,r,o){let a={};if(i)return n;o.getInternalMethods().getHasOutput()||(a=this.populatePositionals(t,n,s,o));const c=this.globalMiddleware.getMiddleware().slice(0).concat(t.middlewares),l=we(n,o,c,!0);return fe(l)?l.then((n=>this.handleValidationAndGetResult(e,t,n,s,r,o,c,a))):this.handleValidationAndGetResult(e,t,l,s,r,o,c,a)}populatePositionals(e,t,n,s){t._=t._.slice(n.commands.length);const i=e.demanded.slice(0),r=e.optional.slice(0),o={};for(this.validation.positionalCount(i.length,t._.length);i.length;){const e=i.shift();this.populatePositional(e,t,o)}for(;r.length;){const e=r.shift();this.populatePositional(e,t,o)}return t._=n.commands.concat(t._.map((e=>""+e))),this.postProcessPositionals(t,o,this.cmdToParseOptions(e.original),s),o}populatePositional(e,t,n){const s=e.cmd[0];e.variadic?n[s]=t._.splice(0).map(String):t._.length&&(n[s]=[String(t._.shift())])}cmdToParseOptions(e){const t={array:[],default:{},alias:{},demand:{}},n=pe(e);return n.demanded.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s,t.demand[n]=!0})),n.optional.forEach((e=>{const[n,...s]=e.cmd;e.variadic&&(t.array.push(n),t.default[n]=[]),t.alias[n]=s})),t}postProcessPositionals(e,t,n,s){const i=Object.assign({},s.getOptions());i.default=Object.assign(n.default,i.default);for(const e of Object.keys(n.alias))i.alias[e]=(i.alias[e]||[]).concat(n.alias[e]);i.array=i.array.concat(n.array),i.config={};const r=[];if(Object.keys(t).forEach((e=>{t[e].map((t=>{i.configuration["unknown-options-as-args"]&&(i.key[e]=!0),r.push(`--${e}`),r.push(t)}))})),!r.length)return;const o=Object.assign({},i.configuration,{"populate--":!1}),a=this.shim.Parser.detailed(r,Object.assign({},i,{configuration:o}));if(a.error)s.getInternalMethods().getUsageInstance().fail(a.error.message,a.error);else{const n=Object.keys(t);Object.keys(t).forEach((e=>{n.push(...a.aliases[e])})),Object.keys(a.argv).forEach((i=>{n.includes(i)&&(t[i]||(t[i]=a.argv[i]),!this.isInConfigs(s,i)&&!this.isDefaulted(s,i)&&Object.prototype.hasOwnProperty.call(e,i)&&Object.prototype.hasOwnProperty.call(a.argv,i)&&(Array.isArray(e[i])||Array.isArray(a.argv[i]))?e[i]=[].concat(e[i],a.argv[i]):e[i]=a.argv[i])}))}}isDefaulted(e,t){const{default:n}=e.getOptions();return Object.prototype.hasOwnProperty.call(n,t)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(t))}isInConfigs(e,t){const{configObjects:n}=e.getOptions();return n.some((e=>Object.prototype.hasOwnProperty.call(e,t)))||n.some((e=>Object.prototype.hasOwnProperty.call(e,this.shim.Parser.camelCase(t))))}runDefaultBuilderOn(e){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(e)){const t=Ee.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");e.getInternalMethods().getUsageInstance().usage(t,this.defaultCommand.description)}const t=this.defaultCommand.builder;if(je(t))return t(e,!0);Ae(t)||Object.keys(t).forEach((n=>{e.option(n,t[n])}))}moduleName(e){const t=function(e){if("undefined"==typeof require)return null;for(let t,n=0,s=Object.keys(require.cache);n<s.length;n++)if(t=require.cache[s[n]],t.exports===e)return t;return null}(e);if(!t)throw new Error(`No command name given for module: ${this.shim.inspect(e)}`);return this.commandFromFilename(t.filename)}commandFromFilename(e){return this.shim.path.basename(e,this.shim.path.extname(e))}extractDesc({describe:e,description:t,desc:n}){for(const s of[e,t,n]){if("string"==typeof s||!1===s)return s;he(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){const e=this.frozens.pop();he(e,void 0,this.shim),({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=e)}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function Ae(e){return"object"==typeof e&&!!e.builder&&"function"==typeof e.handler}function je(e){return"function"==typeof e}function $e(e={},t=()=>!0){const n={};return ue(e).forEach((s=>{t(s,e[s])&&(n[s]=e[s])})),n}function xe(e){"undefined"!=typeof process&&[process.stdout,process.stderr].forEach((t=>{const n=t;n._handle&&n.isTTY&&"function"==typeof n._handle.setBlocking&&n._handle.setBlocking(e)}))}function _e(e){return"boolean"==typeof e}function Ce(e,t){const n=t.y18n.__,s={},i=[];s.failFn=function(e){i.push(e)};let r=null,o=null,a=!0;s.showHelpOnFail=function(t=!0,n){const[i,c]="string"==typeof t?[!0,t]:[t,n];return e.getInternalMethods().isGlobalContext()&&(o=c),r=c,a=i,s};let c=!1;s.fail=function(t,n){const l=e.getInternalMethods().getLoggerInstance();if(!i.length){if(e.getExitProcess()&&xe(!0),!c){c=!0,a&&(e.showHelp("error"),l.error()),(t||n)&&l.error(t||n);const s=r||o;s&&((t||n)&&l.error(""),l.error(s))}if(n=n||new ne(t),e.getExitProcess())return e.exit(1);if(e.getInternalMethods().hasParseCallback())return e.exit(1,n);throw n}for(let e=i.length-1;e>=0;--e){const r=i[e];if(_e(r)){if(n)throw n;if(t)throw Error(t)}else r(t,n,s)}};let l=[],h=!1;s.usage=(e,t)=>null===e?(h=!0,l=[],s):(h=!1,l.push([e,t||""]),s),s.getUsage=()=>l,s.getUsageDisabled=()=>h,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(e,t)=>{d.push([e,t||""])};let u=[];s.command=function(e,t,n,s,i=!1){n&&(u=u.map((e=>(e[2]=!1,e)))),u.push([e,t||"",n,s,i])},s.getCommands=()=>u;let f={};s.describe=function(e,t){Array.isArray(e)?e.forEach((e=>{s.describe(e,t)})):"object"==typeof e?Object.keys(e).forEach((t=>{s.describe(t,e[t])})):f[e]=t},s.getDescriptions=()=>f;let p=[];s.epilog=e=>{p.push(e)};let g,m=!1;s.wrap=e=>{m=!0,g=e},s.getWrap=()=>t.getEnv("YARGS_DISABLE_WRAP")?null:(m||(g=function(){const e=80;return t.process.stdColumns?Math.min(e,t.process.stdColumns):e}(),m=!0),g);const y="__yargsString__:";function b(e,n,s){let i=0;return Array.isArray(e)||(e=Object.values(e).map((e=>[e]))),e.forEach((e=>{i=Math.max(t.stringWidth(s?`${s} ${Ne(e[0])}`:Ne(e[0]))+Pe(e[0]),i)})),n&&(i=Math.min(i,parseInt((.5*n).toString(),10))),i}let v;function w(t){return e.getOptions().hiddenOptions.indexOf(t)<0||e.parsed.argv[e.getOptions().showHiddenOpt]}function O(e,t){let s=`[${n("default:")} `;if(void 0===e&&!t)return null;if(t)s+=t;else switch(typeof e){case"string":s+=`"${e}"`;break;case"object":s+=JSON.stringify(e);break;default:s+=e}return`${s}]`}s.deferY18nLookup=e=>y+e,s.help=function(){if(v)return v;!function(){const t=e.getDemandedOptions(),n=e.getOptions();(Object.keys(n.alias)||[]).forEach((i=>{n.alias[i].forEach((r=>{f[r]&&s.describe(i,f[r]),r in t&&e.demandOption(i,t[r]),n.boolean.includes(r)&&e.boolean(i),n.count.includes(r)&&e.count(i),n.string.includes(r)&&e.string(i),n.normalize.includes(r)&&e.normalize(i),n.array.includes(r)&&e.array(i),n.number.includes(r)&&e.number(i)}))}))}();const i=e.customScriptName?e.$0:t.path.basename(e.$0),r=e.getDemandedOptions(),o=e.getDemandedCommands(),a=e.getDeprecatedOptions(),c=e.getGroups(),g=e.getOptions();let m=[];m=m.concat(Object.keys(f)),m=m.concat(Object.keys(r)),m=m.concat(Object.keys(o)),m=m.concat(Object.keys(g.default)),m=m.filter(w),m=Object.keys(m.reduce(((e,t)=>("_"!==t&&(e[t]=!0),e)),{}));const E=s.getWrap(),k=t.cliui({width:E,wrap:!!E});if(!h)if(l.length)l.forEach((e=>{k.div({text:`${e[0].replace(/\$0/g,i)}`}),e[1]&&k.div({text:`${e[1]}`,padding:[1,0,0,0]})})),k.div();else if(u.length){let e=null;e=o._?`${i} <${n("command")}>\n`:`${i} [${n("command")}]\n`,k.div(`${e}`)}if(u.length>1||1===u.length&&!u[0][2]){k.div(n("Commands:"));const t=e.getInternalMethods().getContext(),s=t.commands.length?`${t.commands.join(" ")} `:"";!0===e.getInternalMethods().getParserConfiguration()["sort-commands"]&&(u=u.sort(((e,t)=>e[0].localeCompare(t[0]))));const r=i?`${i} `:"";u.forEach((e=>{const t=`${r}${s}${e[0].replace(/^\$0 ?/,"")}`;k.span({text:t,padding:[0,2,0,2],width:b(u,E,`${i}${s}`)+4},{text:e[1]});const o=[];e[2]&&o.push(`[${n("default")}]`),e[3]&&e[3].length&&o.push(`[${n("aliases:")} ${e[3].join(", ")}]`),e[4]&&("string"==typeof e[4]?o.push(`[${n("deprecated: %s",e[4])}]`):o.push(`[${n("deprecated")}]`)),o.length?k.div({text:o.join(" "),padding:[0,0,0,2],align:"right"}):k.div()})),k.div()}const A=(Object.keys(g.alias)||[]).concat(Object.keys(e.parsed.newAliases)||[]);m=m.filter((t=>!e.parsed.newAliases[t]&&A.every((e=>-1===(g.alias[e]||[]).indexOf(t)))));const j=n("Options:");c[j]||(c[j]=[]),function(e,t,n,s){let i=[],r=null;Object.keys(n).forEach((e=>{i=i.concat(n[e])})),e.forEach((e=>{r=[e].concat(t[e]),r.some((e=>-1!==i.indexOf(e)))||n[s].push(e)}))}(m,g.alias,c,j);const $=e=>/^--/.test(Ne(e)),x=Object.keys(c).filter((e=>c[e].length>0)).map((e=>({groupName:e,normalizedKeys:c[e].filter(w).map((e=>{if(A.includes(e))return e;for(let t,n=0;void 0!==(t=A[n]);n++)if((g.alias[t]||[]).includes(e))return t;return e}))}))).filter((({normalizedKeys:e})=>e.length>0)).map((({groupName:e,normalizedKeys:t})=>{const n=t.reduce(((t,n)=>(t[n]=[n].concat(g.alias[n]||[]).map((t=>e===s.getPositionalGroupName()?t:(/^[0-9]$/.test(t)?g.boolean.includes(n)?"-":"--":t.length>1?"--":"-")+t)).sort(((e,t)=>$(e)===$(t)?0:$(e)?1:-1)).join(", "),t)),{});return{groupName:e,normalizedKeys:t,switches:n}}));if(x.filter((({groupName:e})=>e!==s.getPositionalGroupName())).some((({normalizedKeys:e,switches:t})=>!e.every((e=>$(t[e])))))&&x.filter((({groupName:e})=>e!==s.getPositionalGroupName())).forEach((({normalizedKeys:e,switches:t})=>{e.forEach((e=>{var n,s;$(t[e])&&(t[e]=(n=t[e],s=4,Se(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),x.forEach((({groupName:t,normalizedKeys:i,switches:o})=>{k.div(t),i.forEach((t=>{const i=o[t];let c=f[t]||"",l=null;c.includes(y)&&(c=n(c.substring(16))),g.boolean.includes(t)&&(l=`[${n("boolean")}]`),g.count.includes(t)&&(l=`[${n("count")}]`),g.string.includes(t)&&(l=`[${n("string")}]`),g.normalize.includes(t)&&(l=`[${n("string")}]`),g.array.includes(t)&&(l=`[${n("array")}]`),g.number.includes(t)&&(l=`[${n("number")}]`);const h=[t in a?(d=a[t],"string"==typeof d?`[${n("deprecated: %s",d)}]`:`[${n("deprecated")}]`):null,l,t in r?`[${n("required")}]`:null,g.choices&&g.choices[t]?`[${n("choices:")} ${s.stringifiedValues(g.choices[t])}]`:null,O(g.default[t],g.defaultDescription[t])].filter(Boolean).join(" ");var d;k.span({text:Ne(i),padding:[0,2,0,2+Pe(i)],width:b(o,E)+4},c);const u=!0===e.getInternalMethods().getUsageConfiguration()["hide-types"];h&&!u?k.div({text:h,padding:[0,0,0,2],align:"right"}):k.div()})),k.div()})),d.length&&(k.div(n("Examples:")),d.forEach((e=>{e[0]=e[0].replace(/\$0/g,i)})),d.forEach((e=>{""===e[1]?k.div({text:e[0],padding:[0,2,0,2]}):k.div({text:e[0],padding:[0,2,0,2],width:b(d,E)+4},{text:e[1]})})),k.div()),p.length>0){const e=p.map((e=>e.replace(/\$0/g,i))).join("\n");k.div(`${e}\n`)}return k.toString().replace(/\s*$/,"")},s.cacheHelpMessage=function(){v=this.help()},s.clearCachedHelpMessage=function(){v=void 0},s.hasCachedHelpMessage=function(){return!!v},s.showHelp=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(s.help())},s.functionDescription=e=>["(",e.name?t.Parser.decamelize(e.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(e,t){let n="";const s=t||", ",i=[].concat(e);return e&&i.length?(i.forEach((e=>{n.length&&(n+=s),n+=JSON.stringify(e)})),n):n};let E=null;s.version=e=>{E=e},s.showVersion=t=>{const n=e.getInternalMethods().getLoggerInstance();t||(t="error");("function"==typeof t?t:n[t])(E)},s.reset=function(e){return r=null,c=!1,l=[],h=!1,p=[],d=[],u=[],f=$e(f,(t=>!e[t])),s};const k=[];return s.freeze=function(){k.push({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f})},s.unfreeze=function(e=!1){const t=k.pop();t&&(e?(f={...t.descriptions,...f},u=[...t.commands,...u],l=[...t.usages,...l],d=[...t.examples,...d],p=[...t.epilogs,...p]):({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f}=t))},s}function Se(e){return"object"==typeof e}function Pe(e){return Se(e)?e.indentation:0}function Ne(e){return Se(e)?e.text:e}class Me{constructor(e,t,n,s){var i,r,o;this.yargs=e,this.usage=t,this.command=n,this.shim=s,this.completionKey="get-yargs-completions",this.aliases=null,this.customCompletionFunction=null,this.indexAfterLastReset=0,this.zshShell=null!==(o=(null===(i=this.shim.getEnv("SHELL"))||void 0===i?void 0:i.includes("zsh"))||(null===(r=this.shim.getEnv("ZSH_NAME"))||void 0===r?void 0:r.includes("zsh")))&&void 0!==o&&o}defaultCompletion(e,t,n,s){const i=this.command.getCommandHandlers();for(let t=0,n=e.length;t<n;++t)if(i[e[t]]&&i[e[t]].builder){const n=i[e[t]].builder;if(je(n)){this.indexAfterLastReset=t+1;const e=this.yargs.getInternalMethods().reset();return n(e,!0),e.argv}}const r=[];this.commandCompletions(r,e,n),this.optionCompletions(r,e,t,n),this.choicesFromOptionsCompletions(r,e,t,n),this.choicesFromPositionalsCompletions(r,e,t,n),s(null,r)}commandCompletions(e,t,n){const s=this.yargs.getInternalMethods().getContext().commands;n.match(/^-/)||s[s.length-1]===n||this.previousArgHasChoices(t)||this.usage.getCommands().forEach((n=>{const s=pe(n[0]).cmd;if(-1===t.indexOf(s))if(this.zshShell){const t=n[1]||"";e.push(s.replace(/:/g,"\\:")+":"+t)}else e.push(s)}))}optionCompletions(e,t,n,s){if((s.match(/^-/)||""===s&&0===e.length)&&!this.previousArgHasChoices(t)){const n=this.yargs.getOptions(),i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[];Object.keys(n.key).forEach((r=>{const o=!!n.configuration["boolean-negation"]&&n.boolean.includes(r);i.includes(r)||n.hiddenOptions.includes(r)||this.argsContainKey(t,r,o)||this.completeOptionKey(r,e,s,o&&!!n.default[r])}))}}choicesFromOptionsCompletions(e,t,n,s){if(this.previousArgHasChoices(t)){const n=this.getPreviousArgChoices(t);n&&n.length>0&&e.push(...n.map((e=>e.replace(/:/g,"\\:"))))}}choicesFromPositionalsCompletions(e,t,n,s){if(""===s&&e.length>0&&this.previousArgHasChoices(t))return;const i=this.yargs.getGroups()[this.usage.getPositionalGroupName()]||[],r=Math.max(this.indexAfterLastReset,this.yargs.getInternalMethods().getContext().commands.length+1),o=i[n._.length-r-1];if(!o)return;const a=this.yargs.getOptions().choices[o]||[];for(const t of a)t.startsWith(s)&&e.push(t.replace(/:/g,"\\:"))}getPreviousArgChoices(e){if(e.length<1)return;let t=e[e.length-1],n="";if(!t.startsWith("-")&&e.length>1&&(n=t,t=e[e.length-2]),!t.startsWith("-"))return;const s=t.replace(/^-+/,""),i=this.yargs.getOptions(),r=[s,...this.yargs.getAliases()[s]||[]];let o;for(const e of r)if(Object.prototype.hasOwnProperty.call(i.key,e)&&Array.isArray(i.choices[e])){o=i.choices[e];break}return o?o.filter((e=>!n||e.startsWith(n))):void 0}previousArgHasChoices(e){const t=this.getPreviousArgChoices(e);return void 0!==t&&t.length>0}argsContainKey(e,t,n){const s=t=>-1!==e.indexOf((/^[^0-9]$/.test(t)?"-":"--")+t);if(s(t))return!0;if(n&&s(`no-${t}`))return!0;if(this.aliases)for(const e of this.aliases[t])if(s(e))return!0;return!1}completeOptionKey(e,t,n,s){var i,r,o,a;let c=e;if(this.zshShell){const t=this.usage.getDescriptions(),n=null===(r=null===(i=null==this?void 0:this.aliases)||void 0===i?void 0:i[e])||void 0===r?void 0:r.find((e=>{const n=t[e];return"string"==typeof n&&n.length>0})),s=n?t[n]:void 0,l=null!==(a=null!==(o=t[e])&&void 0!==o?o:s)&&void 0!==a?a:"";c=`${e.replace(/:/g,"\\:")}:${l.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}const l=!(e=>/^--/.test(e))(n)&&(e=>/^[^0-9]$/.test(e))(e)?"-":"--";t.push(l+c),s&&t.push(l+"no-"+c)}customCompletion(e,t,n,s){if(he(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const e=this.customCompletionFunction(n,t);return fe(e)?e.then((e=>{this.shim.process.nextTick((()=>{s(null,e)}))})).catch((e=>{this.shim.process.nextTick((()=>{s(e,void 0)}))})):s(null,e)}return function(e){return e.length>3}(this.customCompletionFunction)?this.customCompletionFunction(n,t,((i=s)=>this.defaultCompletion(e,t,n,i)),(e=>{s(null,e)})):this.customCompletionFunction(n,t,(e=>{s(null,e)}))}getCompletion(e,t){const n=e.length?e[e.length-1]:"",s=this.yargs.parse(e,!0),i=this.customCompletionFunction?s=>this.customCompletion(e,s,n,t):s=>this.defaultCompletion(e,s,n,t);return fe(s)?s.then(i):i(s)}generateCompletionScript(e,t){let n=this.zshShell?'#compdef {{app_name}}\n###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc\n# or {{app_path}} {{completion_command}} >> ~/.zprofile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local reply\n local si=$IFS\n IFS=$\'\n\' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "${words[@]}"))\n IFS=$si\n _describe \'values\' reply\n}\ncompdef _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n':'###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc\n# or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n local cur_word args type_list\n\n cur_word="${COMP_WORDS[COMP_CWORD]}"\n args=("${COMP_WORDS[@]}")\n\n # ask yargs to generate completions.\n type_list=$({{app_path}} --get-yargs-completions "${args[@]}")\n\n COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )\n\n # if no match was found, fall back to filename completion\n if [ ${#COMPREPLY[@]} -eq 0 ]; then\n COMPREPLY=()\n fi\n\n return 0\n}\ncomplete -o bashdefault -o default -F _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n';const s=this.shim.path.basename(e);return e.match(/\.js$/)&&(e=`./${e}`),n=n.replace(/{{app_name}}/g,s),n=n.replace(/{{completion_command}}/g,t),n.replace(/{{app_path}}/g,e)}registerFunction(e){this.customCompletionFunction=e}setParsed(e){this.aliases=e.aliases}}function De(e,t){if(0===e.length)return t.length;if(0===t.length)return e.length;const n=[];let s,i;for(s=0;s<=t.length;s++)n[s]=[s];for(i=0;i<=e.length;i++)n[0][i]=i;for(s=1;s<=t.length;s++)for(i=1;i<=e.length;i++)t.charAt(s-1)===e.charAt(i-1)?n[s][i]=n[s-1][i-1]:s>1&&i>1&&t.charAt(s-2)===e.charAt(i-1)&&t.charAt(s-1)===e.charAt(i-2)?n[s][i]=n[s-2][i-2]+1:n[s][i]=Math.min(n[s-1][i-1]+1,Math.min(n[s][i-1]+1,n[s-1][i]+1));return n[t.length][e.length]}const Ie=["$0","--","_"];let Re,We=[];function ze(e,t,n,s){Re=s;let i={};if(Object.prototype.hasOwnProperty.call(e,"extends")){if("string"!=typeof e.extends)return i;const s=/\.json|\..*rc$/.test(e.extends);let r=null;if(s)r=function(e,t){return Re.path.resolve(e,t)}(t,e.extends);else try{r=require.resolve(e.extends)}catch(t){return e}!function(e){if(We.indexOf(e)>-1)throw new ne(`Circular extended configurations: '${e}'.`)}(r),We.push(r),i=s?JSON.parse(Re.readFileSync(r,"utf8")):require(e.extends),delete e.extends,i=ze(i,Re.path.dirname(r),n,Re)}return We=[],n?Te(i,e):Object.assign({},i,e)}function Te(e,t){const n={};function s(e){return e&&"object"==typeof e&&!Array.isArray(e)}Object.assign(n,e);for(const i of Object.keys(t))s(t[i])&&s(n[i])?n[i]=Te(e[i],t[i]):n[i]=t[i];return n}var Fe,Be,Le,Ve,Ue,He,Je,Ye,qe,Ge,Ke,Qe,Xe,Ze,et,tt,nt,st,it,rt,ot,at,ct,lt,ht,dt,ut,ft,pt,gt,mt,yt,bt,vt,wt,Ot=function(e,t,n,s,i){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?i.call(e,n):i?i.value=n:t.set(e,n),n},Et=function(e,t,n,s){if("a"===n&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?s:"a"===n?s.call(e):s?s.value:t.get(e)};const kt=Symbol("copyDoubleDash"),At=Symbol("copyDoubleDash"),jt=Symbol("deleteFromParserHintObject"),$t=Symbol("emitWarning"),xt=Symbol("freeze"),_t=Symbol("getDollarZero"),Ct=Symbol("getParserConfiguration"),St=Symbol("getUsageConfiguration"),Pt=Symbol("guessLocale"),Nt=Symbol("guessVersion"),Mt=Symbol("parsePositionalNumbers"),Dt=Symbol("pkgUp"),It=Symbol("populateParserHintArray"),Rt=Symbol("populateParserHintSingleValueDictionary"),Wt=Symbol("populateParserHintArrayDictionary"),zt=Symbol("populateParserHintDictionary"),Tt=Symbol("sanitizeKey"),Ft=Symbol("setKey"),Bt=Symbol("unfreeze"),Lt=Symbol("validateAsync"),Vt=Symbol("getCommandInstance"),Ut=Symbol("getContext"),Ht=Symbol("getHasOutput"),Jt=Symbol("getLoggerInstance"),Yt=Symbol("getParseContext"),qt=Symbol("getUsageInstance"),Gt=Symbol("getValidationInstance"),Kt=Symbol("hasParseCallback"),Qt=Symbol("isGlobalContext"),Xt=Symbol("postProcess"),Zt=Symbol("rebase"),en=Symbol("reset"),tn=Symbol("runYargsParserAndExecuteCommands"),nn=Symbol("runValidation"),sn=Symbol("setHasOutput"),rn=Symbol("kTrackManuallySetKeys");class on{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Fe.set(this,void 0),Be.set(this,void 0),Le.set(this,{commands:[],fullCommands:[]}),Ve.set(this,null),Ue.set(this,null),He.set(this,"show-hidden"),Je.set(this,null),Ye.set(this,!0),qe.set(this,{}),Ge.set(this,!0),Ke.set(this,[]),Qe.set(this,void 0),Xe.set(this,{}),Ze.set(this,!1),et.set(this,null),tt.set(this,!0),nt.set(this,void 0),st.set(this,""),it.set(this,void 0),rt.set(this,void 0),ot.set(this,{}),at.set(this,null),ct.set(this,null),lt.set(this,{}),ht.set(this,{}),dt.set(this,void 0),ut.set(this,!1),ft.set(this,void 0),pt.set(this,!1),gt.set(this,!1),mt.set(this,!1),yt.set(this,void 0),bt.set(this,{}),vt.set(this,null),wt.set(this,void 0),Ot(this,ft,s,"f"),Ot(this,dt,e,"f"),Ot(this,Be,t,"f"),Ot(this,rt,n,"f"),Ot(this,Qe,new ve(this),"f"),this.$0=this[_t](),this[en](),Ot(this,Fe,Et(this,Fe,"f"),"f"),Ot(this,yt,Et(this,yt,"f"),"f"),Ot(this,wt,Et(this,wt,"f"),"f"),Ot(this,it,Et(this,it,"f"),"f"),Et(this,it,"f").showHiddenOpt=Et(this,He,"f"),Ot(this,nt,this[At](),"f")}addHelpOpt(e,t){return me("[string|boolean] [string]",[e,t],arguments.length),Et(this,et,"f")&&(this[jt](Et(this,et,"f")),Ot(this,et,null,"f")),!1===e&&void 0===t||(Ot(this,et,"string"==typeof e?e:"help","f"),this.boolean(Et(this,et,"f")),this.describe(Et(this,et,"f"),t||Et(this,yt,"f").deferY18nLookup("Show help"))),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(me("[string|boolean] [string]",[e,t],arguments.length),!1===e&&void 0===t)return this;const n="string"==typeof e?e:Et(this,He,"f");return this.boolean(n),this.describe(n,t||Et(this,yt,"f").deferY18nLookup("Show hidden options")),Et(this,it,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return me("<object|string|array> [string|array]",[e,t],arguments.length),this[Wt](this.alias.bind(this),"alias",e,t),this}array(e){return me("<array|string>",[e],arguments.length),this[It]("array",e),this[rn](e),this}boolean(e){return me("<array|string>",[e],arguments.length),this[It]("boolean",e),this[rn](e),this}check(e,t){return me("<function> [boolean]",[e,t],arguments.length),this.middleware(((t,n)=>Oe((()=>e(t,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&Et(this,yt,"f").fail(n.toString(),n):Et(this,yt,"f").fail(Et(this,ft,"f").y18n.__("Argument check failed: %s",e.toString())),t)),(e=>(Et(this,yt,"f").fail(e.message?e.message:e.toString(),e),t)))),!1,t),this}choices(e,t){return me("<object|string|array> [string|array]",[e,t],arguments.length),this[Wt](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(me("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new ne("coerce callback must be provided");for(const n of e)this.coerce(n,t);return this}if("object"==typeof e){for(const t of Object.keys(e))this.coerce(t,e[t]);return this}if(!t)throw new ne("coerce callback must be provided");return Et(this,it,"f").key[e]=!0,Et(this,Qe,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,e)?Oe((()=>(i=s.getAliases(),t(n[e]))),(t=>{n[e]=t;const r=s.getInternalMethods().getParserConfiguration()["strip-aliased"];if(i[e]&&!0!==r)for(const s of i[e])n[s]=t;return n}),(e=>{throw new ne(e.message)})):n}),e),this}conflicts(e,t){return me("<string|object> [string|array]",[e,t],arguments.length),Et(this,wt,"f").conflicts(e,t),this}config(e="config",t,n){return me("[object|string] [string|function] [function]",[e,t,n],arguments.length),"object"!=typeof e||Array.isArray(e)?("function"==typeof t&&(n=t,t=void 0),this.describe(e,t||Et(this,yt,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((e=>{Et(this,it,"f").config[e]=n||!0})),this):(e=ze(e,Et(this,Be,"f"),this[Ct]()["deep-merge-config"]||!1,Et(this,ft,"f")),Et(this,it,"f").configObjects=(Et(this,it,"f").configObjects||[]).concat(e),this)}completion(e,t,n){return me("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),"function"==typeof t&&(n=t,t=void 0),Ot(this,Ue,e||Et(this,Ue,"f")||"completion","f"),t||!1===t||(t="generate completion script"),this.command(Et(this,Ue,"f"),t),n&&Et(this,Ve,"f").registerFunction(n),this}command(e,t,n,s,i,r){return me("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,i,r],arguments.length),Et(this,Fe,"f").addHandler(e,t,n,s,i,r),this}commands(e,t,n,s,i,r){return this.command(e,t,n,s,i,r)}commandDir(e,t){me("<string> [object]",[e,t],arguments.length);const n=Et(this,rt,"f")||Et(this,ft,"f").require;return Et(this,Fe,"f").addDirectory(e,n,Et(this,ft,"f").getCallerFile(),t),this}count(e){return me("<array|string>",[e],arguments.length),this[It]("count",e),this[rn](e),this}default(e,t,n){return me("<object|string|array> [*] [string]",[e,t,n],arguments.length),n&&(de(e,Et(this,ft,"f")),Et(this,it,"f").defaultDescription[e]=n),"function"==typeof t&&(de(e,Et(this,ft,"f")),Et(this,it,"f").defaultDescription[e]||(Et(this,it,"f").defaultDescription[e]=Et(this,yt,"f").functionDescription(t)),t=t.call()),this[Rt](this.default.bind(this),"default",e,t),this}defaults(e,t,n){return this.default(e,t,n)}demandCommand(e=1,t,n,s){return me("[number] [number|string] [string|null|undefined] [string|null|undefined]",[e,t,n,s],arguments.length),"number"!=typeof t&&(n=t,t=1/0),this.global("_",!1),Et(this,it,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){return Array.isArray(t)?(t.forEach((e=>{he(n,!0,Et(this,ft,"f")),this.demandOption(e,n)})),t=1/0):"number"!=typeof t&&(n=t,t=1/0),"number"==typeof e?(he(n,!0,Et(this,ft,"f")),this.demandCommand(e,t,n,n)):Array.isArray(e)?e.forEach((e=>{he(n,!0,Et(this,ft,"f")),this.demandOption(e,n)})):"string"==typeof n?this.demandOption(e,n):!0!==n&&void 0!==n||this.demandOption(e),this}demandOption(e,t){return me("<object|string|array> [string]",[e,t],arguments.length),this[Rt](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return me("<string> [string|boolean]",[e,t],arguments.length),Et(this,it,"f").deprecatedOptions[e]=t,this}describe(e,t){return me("<object|string|array> [string]",[e,t],arguments.length),this[Ft](e,!0),Et(this,yt,"f").describe(e,t),this}detectLocale(e){return me("<boolean>",[e],arguments.length),Ot(this,Ye,e,"f"),this}env(e){return me("[string|boolean]",[e],arguments.length),!1===e?delete Et(this,it,"f").envPrefix:Et(this,it,"f").envPrefix=e||"",this}epilogue(e){return me("<string>",[e],arguments.length),Et(this,yt,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){return me("<string|array> [string]",[e,t],arguments.length),Array.isArray(e)?e.forEach((e=>this.example(...e))):Et(this,yt,"f").example(e,t),this}exit(e,t){Ot(this,Ze,!0,"f"),Ot(this,Je,t,"f"),Et(this,Ge,"f")&&Et(this,ft,"f").process.exit(e)}exitProcess(e=!0){return me("[boolean]",[e],arguments.length),Ot(this,Ge,e,"f"),this}fail(e){if(me("<function|boolean>",[e],arguments.length),"boolean"==typeof e&&!1!==e)throw new ne("Invalid first argument. Expected function or boolean 'false'");return Et(this,yt,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){return me("<array> [function]",[e,t],arguments.length),t?Et(this,Ve,"f").getCompletion(e,t):new Promise(((t,n)=>{Et(this,Ve,"f").getCompletion(e,((e,s)=>{e?n(e):t(s)}))}))}getDemandedOptions(){return me([],0),Et(this,it,"f").demandedOptions}getDemandedCommands(){return me([],0),Et(this,it,"f").demandedCommands}getDeprecatedOptions(){return me([],0),Et(this,it,"f").deprecatedOptions}getDetectLocale(){return Et(this,Ye,"f")}getExitProcess(){return Et(this,Ge,"f")}getGroups(){return Object.assign({},Et(this,Xe,"f"),Et(this,ht,"f"))}getHelp(){if(Ot(this,Ze,!0,"f"),!Et(this,yt,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[tn](Et(this,dt,"f"),void 0,void 0,0,!0);if(fe(e))return e.then((()=>Et(this,yt,"f").help()))}const e=Et(this,Fe,"f").runDefaultBuilderOn(this);if(fe(e))return e.then((()=>Et(this,yt,"f").help()))}return Promise.resolve(Et(this,yt,"f").help())}getOptions(){return Et(this,it,"f")}getStrict(){return Et(this,pt,"f")}getStrictCommands(){return Et(this,gt,"f")}getStrictOptions(){return Et(this,mt,"f")}global(e,t){return me("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),!1!==t?Et(this,it,"f").local=Et(this,it,"f").local.filter((t=>-1===e.indexOf(t))):e.forEach((e=>{Et(this,it,"f").local.includes(e)||Et(this,it,"f").local.push(e)})),this}group(e,t){me("<string|array> <string>",[e,t],arguments.length);const n=Et(this,ht,"f")[t]||Et(this,Xe,"f")[t];Et(this,ht,"f")[t]&&delete Et(this,ht,"f")[t];const s={};return Et(this,Xe,"f")[t]=(n||[]).concat(e).filter((e=>!s[e]&&(s[e]=!0))),this}hide(e){return me("<string>",[e],arguments.length),Et(this,it,"f").hiddenOptions.push(e),this}implies(e,t){return me("<string|object> [number|string|array]",[e,t],arguments.length),Et(this,wt,"f").implies(e,t),this}locale(e){return me("[string]",[e],arguments.length),void 0===e?(this[Pt](),Et(this,ft,"f").y18n.getLocale()):(Ot(this,Ye,!1,"f"),Et(this,ft,"f").y18n.setLocale(e),this)}middleware(e,t,n){return Et(this,Qe,"f").addMiddleware(e,!!t,n)}nargs(e,t){return me("<string|object|array> [number]",[e,t],arguments.length),this[Rt](this.nargs.bind(this),"narg",e,t),this}normalize(e){return me("<array|string>",[e],arguments.length),this[It]("normalize",e),this}number(e){return me("<array|string>",[e],arguments.length),this[It]("number",e),this[rn](e),this}option(e,t){if(me("<string|object> [object]",[e,t],arguments.length),"object"==typeof e)Object.keys(e).forEach((t=>{this.options(t,e[t])}));else{"object"!=typeof t&&(t={}),this[rn](e),!Et(this,vt,"f")||"version"!==e&&"version"!==(null==t?void 0:t.alias)||this[$t](['"version" is a reserved word.',"Please do one of the following:",'- Disable version with `yargs.version(false)` if using "version" as an option',"- Use the built-in `yargs.version` method instead (if applicable)","- Use a different option key","https://yargs.js.org/docs/#api-reference-version"].join("\n"),void 0,"versionWarning"),Et(this,it,"f").key[e]=!0,t.alias&&this.alias(e,t.alias);const n=t.deprecate||t.deprecated;n&&this.deprecateOption(e,n);const s=t.demand||t.required||t.require;s&&this.demand(e,s),t.demandOption&&this.demandOption(e,"string"==typeof t.demandOption?t.demandOption:void 0),t.conflicts&&this.conflicts(e,t.conflicts),"default"in t&&this.default(e,t.default),void 0!==t.implies&&this.implies(e,t.implies),void 0!==t.nargs&&this.nargs(e,t.nargs),t.config&&this.config(e,t.configParser),t.normalize&&this.normalize(e),t.choices&&this.choices(e,t.choices),t.coerce&&this.coerce(e,t.coerce),t.group&&this.group(e,t.group),(t.boolean||"boolean"===t.type)&&(this.boolean(e),t.alias&&this.boolean(t.alias)),(t.array||"array"===t.type)&&(this.array(e),t.alias&&this.array(t.alias)),(t.number||"number"===t.type)&&(this.number(e),t.alias&&this.number(t.alias)),(t.string||"string"===t.type)&&(this.string(e),t.alias&&this.string(t.alias)),(t.count||"count"===t.type)&&this.count(e),"boolean"==typeof t.global&&this.global(e,t.global),t.defaultDescription&&(Et(this,it,"f").defaultDescription[e]=t.defaultDescription),t.skipValidation&&this.skipValidation(e);const i=t.describe||t.description||t.desc,r=Et(this,yt,"f").getDescriptions();Object.prototype.hasOwnProperty.call(r,e)&&"string"!=typeof i||this.describe(e,i),t.hidden&&this.hide(e),t.requiresArg&&this.requiresArg(e)}return this}options(e,t){return this.option(e,t)}parse(e,t,n){me("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[xt](),void 0===e&&(e=Et(this,dt,"f")),"object"==typeof t&&(Ot(this,ct,t,"f"),t=n),"function"==typeof t&&(Ot(this,at,t,"f"),t=!1),t||Ot(this,dt,e,"f"),Et(this,at,"f")&&Ot(this,Ge,!1,"f");const s=this[tn](e,!!t),i=this.parsed;return Et(this,Ve,"f").setParsed(this.parsed),fe(s)?s.then((e=>(Et(this,at,"f")&&Et(this,at,"f").call(this,Et(this,Je,"f"),e,Et(this,st,"f")),e))).catch((e=>{throw Et(this,at,"f")&&Et(this,at,"f")(e,this.parsed.argv,Et(this,st,"f")),e})).finally((()=>{this[Bt](),this.parsed=i})):(Et(this,at,"f")&&Et(this,at,"f").call(this,Et(this,Je,"f"),s,Et(this,st,"f")),this[Bt](),this.parsed=i,s)}parseAsync(e,t,n){const s=this.parse(e,t,n);return fe(s)?s:Promise.resolve(s)}parseSync(e,t,n){const s=this.parse(e,t,n);if(fe(s))throw new ne(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return me("<object>",[e],arguments.length),Ot(this,ot,e,"f"),this}pkgConf(e,t){me("<string> [string]",[e,t],arguments.length);let n=null;const s=this[Dt](t||Et(this,Be,"f"));return s[e]&&"object"==typeof s[e]&&(n=ze(s[e],t||Et(this,Be,"f"),this[Ct]()["deep-merge-config"]||!1,Et(this,ft,"f")),Et(this,it,"f").configObjects=(Et(this,it,"f").configObjects||[]).concat(n)),this}positional(e,t){me("<string> <object>",[e,t],arguments.length);const n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];t=$e(t,((e,t)=>!("type"===e&&!["string","number","boolean"].includes(t))&&n.includes(e)));const s=Et(this,Le,"f").fullCommands[Et(this,Le,"f").fullCommands.length-1],i=s?Et(this,Fe,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return ue(i).forEach((n=>{const s=i[n];Array.isArray(s)?-1!==s.indexOf(e)&&(t[n]=!0):s[e]&&!(n in t)&&(t[n]=s[e])})),this.group(e,Et(this,yt,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return me("[boolean]",[e],arguments.length),Ot(this,ut,e,"f"),this}required(e,t,n){return this.demand(e,t,n)}require(e,t,n){return this.demand(e,t,n)}requiresArg(e){return me("<array|string|object> [number]",[e],arguments.length),"string"==typeof e&&Et(this,it,"f").narg[e]||this[Rt](this.requiresArg.bind(this),"narg",e,NaN),this}showCompletionScript(e,t){return me("[string] [string]",[e,t],arguments.length),e=e||this.$0,Et(this,nt,"f").log(Et(this,Ve,"f").generateCompletionScript(e,t||Et(this,Ue,"f")||"completion")),this}showHelp(e){if(me("[string|function]",[e],arguments.length),Ot(this,Ze,!0,"f"),!Et(this,yt,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[tn](Et(this,dt,"f"),void 0,void 0,0,!0);if(fe(t))return t.then((()=>{Et(this,yt,"f").showHelp(e)})),this}const t=Et(this,Fe,"f").runDefaultBuilderOn(this);if(fe(t))return t.then((()=>{Et(this,yt,"f").showHelp(e)})),this}return Et(this,yt,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return me("[boolean|string] [string]",[e,t],arguments.length),Et(this,yt,"f").showHelpOnFail(e,t),this}showVersion(e){return me("[string|function]",[e],arguments.length),Et(this,yt,"f").showVersion(e),this}skipValidation(e){return me("<array|string>",[e],arguments.length),this[It]("skipValidation",e),this}strict(e){return me("[boolean]",[e],arguments.length),Ot(this,pt,!1!==e,"f"),this}strictCommands(e){return me("[boolean]",[e],arguments.length),Ot(this,gt,!1!==e,"f"),this}strictOptions(e){return me("[boolean]",[e],arguments.length),Ot(this,mt,!1!==e,"f"),this}string(e){return me("<array|string>",[e],arguments.length),this[It]("string",e),this[rn](e),this}terminalWidth(){return me([],0),Et(this,ft,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return me("<object>",[e],arguments.length),Ot(this,Ye,!1,"f"),Et(this,ft,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(me("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),void 0!==t){if(he(e,null,Et(this,ft,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);throw new ne(".usage() description must start with $0 if being used as alias for .command()")}return Et(this,yt,"f").usage(e),this}usageConfiguration(e){return me("<object>",[e],arguments.length),Ot(this,bt,e,"f"),this}version(e,t,n){const s="version";if(me("[boolean|string] [string] [string]",[e,t,n],arguments.length),Et(this,vt,"f")&&(this[jt](Et(this,vt,"f")),Et(this,yt,"f").version(void 0),Ot(this,vt,null,"f")),0===arguments.length)n=this[Nt](),e=s;else if(1===arguments.length){if(!1===e)return this;n=e,e=s}else 2===arguments.length&&(n=t,t=void 0);return Ot(this,vt,"string"==typeof e?e:s,"f"),t=t||Et(this,yt,"f").deferY18nLookup("Show version number"),Et(this,yt,"f").version(n||void 0),this.boolean(Et(this,vt,"f")),this.describe(Et(this,vt,"f"),t),this}wrap(e){return me("<number|null|undefined>",[e],arguments.length),Et(this,yt,"f").wrap(e),this}[(Fe=new WeakMap,Be=new WeakMap,Le=new WeakMap,Ve=new WeakMap,Ue=new WeakMap,He=new WeakMap,Je=new WeakMap,Ye=new WeakMap,qe=new WeakMap,Ge=new WeakMap,Ke=new WeakMap,Qe=new WeakMap,Xe=new WeakMap,Ze=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,st=new WeakMap,it=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap,ct=new WeakMap,lt=new WeakMap,ht=new WeakMap,dt=new WeakMap,ut=new WeakMap,ft=new WeakMap,pt=new WeakMap,gt=new WeakMap,mt=new WeakMap,yt=new WeakMap,bt=new WeakMap,vt=new WeakMap,wt=new WeakMap,kt)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(e){}return e}[At](){return{log:(...e)=>{this[Kt]()||console.log(...e),Ot(this,Ze,!0,"f"),Et(this,st,"f").length&&Ot(this,st,Et(this,st,"f")+"\n","f"),Ot(this,st,Et(this,st,"f")+e.join(" "),"f")},error:(...e)=>{this[Kt]()||console.error(...e),Ot(this,Ze,!0,"f"),Et(this,st,"f").length&&Ot(this,st,Et(this,st,"f")+"\n","f"),Ot(this,st,Et(this,st,"f")+e.join(" "),"f")}}}[jt](e){ue(Et(this,it,"f")).forEach((t=>{if("configObjects"===t)return;const n=Et(this,it,"f")[t];Array.isArray(n)?n.includes(e)&&n.splice(n.indexOf(e),1):"object"==typeof n&&delete n[e]})),delete Et(this,yt,"f").getDescriptions()[e]}[$t](e,t,n){Et(this,qe,"f")[n]||(Et(this,ft,"f").process.emitWarning(e,t),Et(this,qe,"f")[n]=!0)}[xt](){Et(this,Ke,"f").push({options:Et(this,it,"f"),configObjects:Et(this,it,"f").configObjects.slice(0),exitProcess:Et(this,Ge,"f"),groups:Et(this,Xe,"f"),strict:Et(this,pt,"f"),strictCommands:Et(this,gt,"f"),strictOptions:Et(this,mt,"f"),completionCommand:Et(this,Ue,"f"),output:Et(this,st,"f"),exitError:Et(this,Je,"f"),hasOutput:Et(this,Ze,"f"),parsed:this.parsed,parseFn:Et(this,at,"f"),parseContext:Et(this,ct,"f")}),Et(this,yt,"f").freeze(),Et(this,wt,"f").freeze(),Et(this,Fe,"f").freeze(),Et(this,Qe,"f").freeze()}[_t](){let e,t="";return e=/\b(node|iojs|electron)(\.exe)?$/.test(Et(this,ft,"f").process.argv()[0])?Et(this,ft,"f").process.argv().slice(1,2):Et(this,ft,"f").process.argv().slice(0,1),t=e.map((e=>{const t=this[Zt](Et(this,Be,"f"),e);return e.match(/^(\/|([a-zA-Z]:)?\\)/)&&t.length<e.length?t:e})).join(" ").trim(),Et(this,ft,"f").getEnv("_")&&Et(this,ft,"f").getProcessArgvBin()===Et(this,ft,"f").getEnv("_")&&(t=Et(this,ft,"f").getEnv("_").replace(`${Et(this,ft,"f").path.dirname(Et(this,ft,"f").process.execPath())}/`,"")),t}[Ct](){return Et(this,ot,"f")}[St](){return Et(this,bt,"f")}[Pt](){if(!Et(this,Ye,"f"))return;const e=Et(this,ft,"f").getEnv("LC_ALL")||Et(this,ft,"f").getEnv("LC_MESSAGES")||Et(this,ft,"f").getEnv("LANG")||Et(this,ft,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Nt](){return this[Dt]().version||"unknown"}[Mt](e){const t=e["--"]?e["--"]:e._;for(let e,n=0;void 0!==(e=t[n]);n++)Et(this,ft,"f").Parser.looksLikeNumber(e)&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))&&(t[n]=Number(e));return e}[Dt](e){const t=e||"*";if(Et(this,lt,"f")[t])return Et(this,lt,"f")[t];let n={};try{let t=e||Et(this,ft,"f").mainFilename;!e&&Et(this,ft,"f").path.extname(t)&&(t=Et(this,ft,"f").path.dirname(t));const s=Et(this,ft,"f").findUp(t,((e,t)=>t.includes("package.json")?"package.json":void 0));he(s,void 0,Et(this,ft,"f")),n=JSON.parse(Et(this,ft,"f").readFileSync(s,"utf8"))}catch(e){}return Et(this,lt,"f")[t]=n||{},Et(this,lt,"f")[t]}[It](e,t){(t=[].concat(t)).forEach((t=>{t=this[Tt](t),Et(this,it,"f")[e].push(t)}))}[Rt](e,t,n,s){this[zt](e,t,n,s,((e,t,n)=>{Et(this,it,"f")[e][t]=n}))}[Wt](e,t,n,s){this[zt](e,t,n,s,((e,t,n)=>{Et(this,it,"f")[e][t]=(Et(this,it,"f")[e][t]||[]).concat(n)}))}[zt](e,t,n,s,i){if(Array.isArray(n))n.forEach((t=>{e(t,s)}));else if((e=>"object"==typeof e)(n))for(const t of ue(n))e(t,n[t]);else i(t,this[Tt](n),s)}[Tt](e){return"__proto__"===e?"___proto___":e}[Ft](e,t){return this[Rt](this[Ft].bind(this),"key",e,t),this}[Bt](){var e,t,n,s,i,r,o,a,c,l,h,d;const u=Et(this,Ke,"f").pop();let f;he(u,void 0,Et(this,ft,"f")),e=this,t=this,n=this,s=this,i=this,r=this,o=this,a=this,c=this,l=this,h=this,d=this,({options:{set value(t){Ot(e,it,t,"f")}}.value,configObjects:f,exitProcess:{set value(e){Ot(t,Ge,e,"f")}}.value,groups:{set value(e){Ot(n,Xe,e,"f")}}.value,output:{set value(e){Ot(s,st,e,"f")}}.value,exitError:{set value(e){Ot(i,Je,e,"f")}}.value,hasOutput:{set value(e){Ot(r,Ze,e,"f")}}.value,parsed:this.parsed,strict:{set value(e){Ot(o,pt,e,"f")}}.value,strictCommands:{set value(e){Ot(a,gt,e,"f")}}.value,strictOptions:{set value(e){Ot(c,mt,e,"f")}}.value,completionCommand:{set value(e){Ot(l,Ue,e,"f")}}.value,parseFn:{set value(e){Ot(h,at,e,"f")}}.value,parseContext:{set value(e){Ot(d,ct,e,"f")}}.value}=u),Et(this,it,"f").configObjects=f,Et(this,yt,"f").unfreeze(),Et(this,wt,"f").unfreeze(),Et(this,Fe,"f").unfreeze(),Et(this,Qe,"f").unfreeze()}[Lt](e,t){return Oe(t,(t=>(e(t),t)))}getInternalMethods(){return{getCommandInstance:this[Vt].bind(this),getContext:this[Ut].bind(this),getHasOutput:this[Ht].bind(this),getLoggerInstance:this[Jt].bind(this),getParseContext:this[Yt].bind(this),getParserConfiguration:this[Ct].bind(this),getUsageConfiguration:this[St].bind(this),getUsageInstance:this[qt].bind(this),getValidationInstance:this[Gt].bind(this),hasParseCallback:this[Kt].bind(this),isGlobalContext:this[Qt].bind(this),postProcess:this[Xt].bind(this),reset:this[en].bind(this),runValidation:this[nn].bind(this),runYargsParserAndExecuteCommands:this[tn].bind(this),setHasOutput:this[sn].bind(this)}}[Vt](){return Et(this,Fe,"f")}[Ut](){return Et(this,Le,"f")}[Ht](){return Et(this,Ze,"f")}[Jt](){return Et(this,nt,"f")}[Yt](){return Et(this,ct,"f")||{}}[qt](){return Et(this,yt,"f")}[Gt](){return Et(this,wt,"f")}[Kt](){return!!Et(this,at,"f")}[Qt](){return Et(this,tt,"f")}[Xt](e,t,n,s){if(n)return e;if(fe(e))return e;t||(e=this[kt](e));return(this[Ct]()["parse-positional-numbers"]||void 0===this[Ct]()["parse-positional-numbers"])&&(e=this[Mt](e)),s&&(e=we(e,this,Et(this,Qe,"f").getMiddleware(),!1)),e}[en](e={}){Ot(this,it,Et(this,it,"f")||{},"f");const t={};t.local=Et(this,it,"f").local||[],t.configObjects=Et(this,it,"f").configObjects||[];const n={};t.local.forEach((t=>{n[t]=!0,(e[t]||[]).forEach((e=>{n[e]=!0}))})),Object.assign(Et(this,ht,"f"),Object.keys(Et(this,Xe,"f")).reduce(((e,t)=>{const s=Et(this,Xe,"f")[t].filter((e=>!(e in n)));return s.length>0&&(e[t]=s),e}),{})),Ot(this,Xe,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((e=>{t[e]=(Et(this,it,"f")[e]||[]).filter((e=>!n[e]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((e=>{t[e]=$e(Et(this,it,"f")[e],(e=>!n[e]))})),t.envPrefix=Et(this,it,"f").envPrefix,Ot(this,it,t,"f"),Ot(this,yt,Et(this,yt,"f")?Et(this,yt,"f").reset(n):Ce(this,Et(this,ft,"f")),"f"),Ot(this,wt,Et(this,wt,"f")?Et(this,wt,"f").reset(n):function(e,t,n){const s=n.y18n.__,i=n.y18n.__n,r={nonOptionCount:function(n){const s=e.getDemandedCommands(),r=n._.length+(n["--"]?n["--"].length:0)-e.getInternalMethods().getContext().commands.length;s._&&(r<s._.min||r>s._.max)&&(r<s._.min?void 0!==s._.minMsg?t.fail(s._.minMsg?s._.minMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.min.toString()):null):t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",r,r.toString(),s._.min.toString())):r>s._.max&&(void 0!==s._.maxMsg?t.fail(s._.maxMsg?s._.maxMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.max.toString()):null):t.fail(i("Too many non-option arguments: got %s, maximum of %s","Too many non-option arguments: got %s, maximum of %s",r,r.toString(),s._.max.toString()))))},positionalCount:function(e,n){n<e&&t.fail(i("Not enough non-option arguments: got %s, need at least %s","Not enough non-option arguments: got %s, need at least %s",n,n+"",e+""))},requiredArguments:function(e,n){let s=null;for(const t of Object.keys(n))Object.prototype.hasOwnProperty.call(e,t)&&void 0!==e[t]||(s=s||{},s[t]=n[t]);if(s){const e=[];for(const t of Object.keys(s)){const n=s[t];n&&e.indexOf(n)<0&&e.push(n)}const n=e.length?`\n${e.join("\n")}`:"";t.fail(i("Missing required argument: %s","Missing required arguments: %s",Object.keys(s).length,Object.keys(s).join(", ")+n))}},unknownArguments:function(n,s,o,a,c=!0){var l;const h=e.getInternalMethods().getCommandInstance().getCommands(),d=[],u=e.getInternalMethods().getContext();if(Object.keys(n).forEach((t=>{Ie.includes(t)||Object.prototype.hasOwnProperty.call(o,t)||Object.prototype.hasOwnProperty.call(e.getInternalMethods().getParseContext(),t)||r.isValidAndSomeAliasIsNotNew(t,s)||d.push(t)})),c&&(u.commands.length>0||h.length>0||a)&&n._.slice(u.commands.length).forEach((e=>{h.includes(""+e)||d.push(""+e)})),c){const t=(null===(l=e.getDemandedCommands()._)||void 0===l?void 0:l.max)||0,s=u.commands.length+t;s<n._.length&&n._.slice(s).forEach((e=>{e=String(e),u.commands.includes(e)||d.includes(e)||d.push(e)}))}d.length&&t.fail(i("Unknown argument: %s","Unknown arguments: %s",d.length,d.map((e=>e.trim()?e:`"${e}"`)).join(", ")))},unknownCommands:function(n){const s=e.getInternalMethods().getCommandInstance().getCommands(),r=[],o=e.getInternalMethods().getContext();return(o.commands.length>0||s.length>0)&&n._.slice(o.commands.length).forEach((e=>{s.includes(""+e)||r.push(""+e)})),r.length>0&&(t.fail(i("Unknown command: %s","Unknown commands: %s",r.length,r.join(", "))),!0)},isValidAndSomeAliasIsNotNew:function(t,n){if(!Object.prototype.hasOwnProperty.call(n,t))return!1;const s=e.parsed.newAliases;return[t,...n[t]].some((e=>!Object.prototype.hasOwnProperty.call(s,e)||!s[t]))},limitedChoices:function(n){const i=e.getOptions(),r={};if(!Object.keys(i.choices).length)return;Object.keys(n).forEach((e=>{-1===Ie.indexOf(e)&&Object.prototype.hasOwnProperty.call(i.choices,e)&&[].concat(n[e]).forEach((t=>{-1===i.choices[e].indexOf(t)&&void 0!==t&&(r[e]=(r[e]||[]).concat(t))}))}));const o=Object.keys(r);if(!o.length)return;let a=s("Invalid values:");o.forEach((e=>{a+=`\n ${s("Argument: %s, Given: %s, Choices: %s",e,t.stringifiedValues(r[e]),t.stringifiedValues(i.choices[e]))}`})),t.fail(a)}};let o={};function a(e,t){const n=Number(t);return"number"==typeof(t=isNaN(n)?t:n)?t=e._.length>=t:t.match(/^--no-.+/)?(t=t.match(/^--no-(.+)/)[1],t=!Object.prototype.hasOwnProperty.call(e,t)):t=Object.prototype.hasOwnProperty.call(e,t),t}r.implies=function(t,s){me("<string|object> [array|number|string]",[t,s],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.implies(e,t[e])})):(e.global(t),o[t]||(o[t]=[]),Array.isArray(s)?s.forEach((e=>r.implies(t,e))):(he(s,void 0,n),o[t].push(s)))},r.getImplied=function(){return o},r.implications=function(e){const n=[];if(Object.keys(o).forEach((t=>{const s=t;(o[t]||[]).forEach((t=>{let i=s;const r=t;i=a(e,i),t=a(e,t),i&&!t&&n.push(` ${s} -> ${r}`)}))})),n.length){let e=`${s("Implications failed:")}\n`;n.forEach((t=>{e+=t})),t.fail(e)}};let c={};r.conflicts=function(t,n){me("<string|object> [array|string]",[t,n],arguments.length),"object"==typeof t?Object.keys(t).forEach((e=>{r.conflicts(e,t[e])})):(e.global(t),c[t]||(c[t]=[]),Array.isArray(n)?n.forEach((e=>r.conflicts(t,e))):c[t].push(n))},r.getConflicting=()=>c,r.conflicting=function(i){Object.keys(i).forEach((e=>{c[e]&&c[e].forEach((n=>{n&&void 0!==i[e]&&void 0!==i[n]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,n))}))})),e.getInternalMethods().getParserConfiguration()["strip-dashed"]&&Object.keys(c).forEach((e=>{c[e].forEach((r=>{r&&void 0!==i[n.Parser.camelCase(e)]&&void 0!==i[n.Parser.camelCase(r)]&&t.fail(s("Arguments %s and %s are mutually exclusive",e,r))}))}))},r.recommendCommands=function(e,n){n=n.sort(((e,t)=>t.length-e.length));let i=null,r=1/0;for(let t,s=0;void 0!==(t=n[s]);s++){const n=De(e,t);n<=3&&n<r&&(r=n,i=t)}i&&t.fail(s("Did you mean %s?",i))},r.reset=function(e){return o=$e(o,(t=>!e[t])),c=$e(c,(t=>!e[t])),r};const l=[];return r.freeze=function(){l.push({implied:o,conflicting:c})},r.unfreeze=function(){const e=l.pop();he(e,void 0,n),({implied:o,conflicting:c}=e)},r}(this,Et(this,yt,"f"),Et(this,ft,"f")),"f"),Ot(this,Fe,Et(this,Fe,"f")?Et(this,Fe,"f").reset():function(e,t,n,s){return new ke(e,t,n,s)}(Et(this,yt,"f"),Et(this,wt,"f"),Et(this,Qe,"f"),Et(this,ft,"f")),"f"),Et(this,Ve,"f")||Ot(this,Ve,function(e,t,n,s){return new Me(e,t,n,s)}(this,Et(this,yt,"f"),Et(this,Fe,"f"),Et(this,ft,"f")),"f"),Et(this,Qe,"f").reset(),Ot(this,Ue,null,"f"),Ot(this,st,"","f"),Ot(this,Je,null,"f"),Ot(this,Ze,!1,"f"),this.parsed=!1,this}[Zt](e,t){return Et(this,ft,"f").path.relative(e,t)}[tn](e,t,n,s=0,i=!1){let r=!!n||i;e=e||Et(this,dt,"f"),Et(this,it,"f").__=Et(this,ft,"f").y18n.__,Et(this,it,"f").configuration=this[Ct]();const o=!!Et(this,it,"f").configuration["populate--"],a=Object.assign({},Et(this,it,"f").configuration,{"populate--":!0}),c=Et(this,ft,"f").Parser.detailed(e,Object.assign({},Et(this,it,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,Et(this,ct,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((e=>{e===Et(this,et,"f")&&l[e]?u=!0:e===Et(this,vt,"f")&&l[e]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&Et(this,yt,"f").clearCachedHelpMessage();try{if(this[Pt](),t)return this[Xt](l,o,!!n,!1);if(Et(this,et,"f")){[Et(this,et,"f")].concat(d[Et(this,et,"f")]||[]).filter((e=>e.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Ot(this,tt,!1,"f");const a=Et(this,Fe,"f").getCommands(),p=Et(this,Ve,"f").completionKey in l,g=u||p||i;if(l._.length){if(a.length){let e;for(let t,r=s||0;void 0!==l._[r];r++){if(t=String(l._[r]),a.includes(t)&&t!==Et(this,Ue,"f")){const e=Et(this,Fe,"f").runCommand(t,this,c,r+1,i,u||f||i);return this[Xt](e,o,!!n,!1)}if(!e&&t!==Et(this,Ue,"f")){e=t;break}}!Et(this,Fe,"f").hasDefaultCommand()&&Et(this,ut,"f")&&e&&!g&&Et(this,wt,"f").recommendCommands(e,a)}Et(this,Ue,"f")&&l._.includes(Et(this,Ue,"f"))&&!p&&(Et(this,Ge,"f")&&xe(!0),this.showCompletionScript(),this.exit(0))}if(Et(this,Fe,"f").hasDefaultCommand()&&!g){const e=Et(this,Fe,"f").runCommand(null,this,c,0,i,u||f||i);return this[Xt](e,o,!!n,!1)}if(p){Et(this,Ge,"f")&&xe(!0);const t=(e=[].concat(e)).slice(e.indexOf(`--${Et(this,Ve,"f").completionKey}`)+1);return Et(this,Ve,"f").getCompletion(t,((e,t)=>{if(e)throw new ne(e.message);(t||[]).forEach((e=>{Et(this,nt,"f").log(e)})),this.exit(0)})),this[Xt](l,!o,!!n,!1)}if(Et(this,Ze,"f")||(u?(Et(this,Ge,"f")&&xe(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(Et(this,Ge,"f")&&xe(!0),r=!0,Et(this,yt,"f").showVersion("log"),this.exit(0))),!r&&Et(this,it,"f").skipValidation.length>0&&(r=Object.keys(l).some((e=>Et(this,it,"f").skipValidation.indexOf(e)>=0&&!0===l[e]))),!r){if(c.error)throw new ne(c.error.message);if(!p){const e=this[nn](d,{},c.error);n||(h=we(l,this,Et(this,Qe,"f").getMiddleware(),!0)),h=this[Lt](e,null!=h?h:l),fe(h)&&!n&&(h=h.then((()=>we(l,this,Et(this,Qe,"f").getMiddleware(),!1))))}}}catch(e){if(!(e instanceof ne))throw e;Et(this,yt,"f").fail(e.message,e)}return this[Xt](null!=h?h:l,o,!!n,!0)}[nn](e,t,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new ne(n.message);Et(this,wt,"f").nonOptionCount(r),Et(this,wt,"f").requiredArguments(r,i);let o=!1;Et(this,gt,"f")&&(o=Et(this,wt,"f").unknownCommands(r)),Et(this,pt,"f")&&!o?Et(this,wt,"f").unknownArguments(r,e,t,!!s):Et(this,mt,"f")&&Et(this,wt,"f").unknownArguments(r,e,{},!1,!1),Et(this,wt,"f").limitedChoices(r),Et(this,wt,"f").implications(r),Et(this,wt,"f").conflicting(r)}}[sn](){Ot(this,Ze,!0,"f")}[rn](e){if("string"==typeof e)Et(this,it,"f").key[e]=!0;else for(const t of e)Et(this,it,"f").key[t]=!0}}const an=(cn=le,(e=[],t=cn.process.cwd(),n)=>{const s=new on(e,t,n,cn);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var cn;function ln(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function hn(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function dn(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}const un=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),fn=un?"bun --bun run":"node",pn=un?"bun":"yarn",gn=un?"bun --bun run":"yarn";let mn;const yn=function({cacheDuration:e=Number.POSITIVE_INFINITY,caches:t,calcKey:n=e=>function(e,t=0){const[n,s]=function(e,t=0){let n=3735928559^t,s=1103547991^t;for(let t,i=0;i<e.length;i++)t=e.codePointAt(i),n=Math.imul(n^t,2654435761),s=Math.imul(s^t,1597334677);return n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(n^n>>>13,3266489909),[s>>>0,n>>>0]}(e,t);return e.length.toString(36)+n.toString(36).padStart(7,"0")+s.toString(36).padStart(7,"0")}(JSON.stringify(e)),maxCachedArgsSize:s=100,maxCachedThisSize:i=10}={}){return function(r,o){if("getter"===o?.kind){const n=new Map;return t?.push(n),function(){const t=Date.now();if(n.has(this)){const[s,i]=n.get(this);if(t-i<=e)return s}const s=r.call(this);if(n.size>=i){const e=n.keys().next().value;n.delete(e)}return n.set(this,[s,t]),s}}{const a=new Map;return t?.push(a),function(...t){const c=n(t);let l=a.get(this);const h=Date.now();if(l){if(l.has(c)){const[t,n]=l.get(c);if(h-n<=e)return t}}else{if(l=new Map,a.size>=i){const e=a.keys().next().value;a.delete(e)}a.set(this,l)}const d=o?r.call(this,...t):r(...t);if(l.size>=s){const e=l.keys().next().value;l.delete(e)}return l.set(c,[d,h]),d}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class bn{static{[mn]=function(e,t,n,s,i){var r,o,a,c,l,h,d,u=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,p=Object.create,g=[p(null),p(null)],m=t.length;function y(t,n,s){return function(i,r){n&&(r=i,i=e);for(var o=0;o<t.length;o++)r=t[o].apply(i,s?[r]:[]);return s?r:i}}function b(e,t,n,s){if("function"!=typeof e&&(s||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(s?"":" or undefined"));return e}function v(e,t,n,s,i,a,c,l,h,d,u){function p(e){if(!u(e))throw new TypeError("Attempted to access private element on non-instance")}var m=[].concat(t[0]),v=t[3],w=!c,O=1===i,E=3===i,k=4===i,A=2===i;function j(t,n,s){return function(i,r){return n&&(r=i,i=e),s&&s(i),$[t].call(i,r)}}if(!w){var $={},x=[],_=E?"get":k||O?"set":"value";if(h?(d||O?$={get:hn((function(){return v(this)}),s,"get"),set:function(e){t[4](this,e)}}:$[_]=v,d||hn($[_],s,A?"":_)):d||($=Object.getOwnPropertyDescriptor(e,s)),!d&&!h){if((o=g[+l][s])&&7!=(o^i))throw Error("Decorating two elements with the same name ("+$[_].name+") is not supported yet");g[+l][s]=i<3?1:i}}for(var C=e,S=m.length-1;S>=0;S-=n?2:1){var P=b(m[S],"A decorator","be",!0),N=n?m[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:r,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),a.push(t)}.bind(null,M)};if(w)o=P.call(N,C,D),M.v=1,b(o,"class decorators","return")&&(C=o);else if(D.static=l,D.private=h,o=D.access={has:h?u.bind():function(e){return s in e}},k||(o.get=h?A?function(e){return p(e),$.value}:j("get",0,p):function(e){return e[s]}),A||E||(o.set=h?j("set",0,p):function(e,t){e[s]=t}),C=P.call(N,O?{get:$.get,set:$.set}:$[_],D),M.v=1,O){if("object"==typeof C&&C)(o=b(C.get,"accessor.get"))&&($.get=o),(o=b(C.set,"accessor.set"))&&($.set=o),(o=b(C.init,"accessor.init"))&&x.unshift(o);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(C,(d?"field":"method")+" decorators","return")&&(d?x.unshift(C):$[_]=C)}return i<2&&c.push(y(x,l,1),y(a,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[_]:b.call.bind($[_])):f(e,s,$)),C}function w(e){return f(e,u,{configurable:!0,enumerable:!0,value:r})}return r=p(null==r?null:r),l=[],h=function(e){e&&l.push(y(e))},d=function(t,s){for(var r=0;r<n.length;r++){var o=n[r],h=o[1],d=7&h;if((8&h)==t&&!d==s){var u=o[2],f=!!o[3],p=16&h;v(t?e:e.prototype,o,p,f?"#"+u:dn(u),d,d<2?[]:t?c=c||[]:a=a||[],l,!!t,f,s,t&&f?function(t){return ln(t)===e}:i)}}},d(8,0),d(0,0),d(8,1),d(0,1),h(a),h(c),o=l,m||w(e),{e:o,get c(){var n=[];return m&&[w(e=v(e,[t],s,e.name,5,n)),y(n,1)]}}}(this,[],[[yn,3,"isBunAvailable"],[yn,3,"buildCommand"],[yn,3,"rootDirPath"],[yn,3,"dockerfile"],[yn,3,"hasDockerfile"],[yn,3,"hasSourceCode"],[yn,3,"name"],[yn,3,"dockerImageName"],[yn,3,"env"],[yn,3,"packageJson"],[yn,3,"packageJsonPath"],[yn,3,"hasPrisma"],[yn,3,"dockerPackageJson"],[yn,3,"binExists"]]).e}argv=void mn(this);pathByName=new Map;constructor(t,n,s){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=s}get isBunAvailable(){try{return/(^|\n)bun\s/.test(l.readFileSync(e.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return un?"true":this.packageJson.scripts?.build?.includes("buildIfNeeded")?"yarn build":"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":"")}get dirPath(){return this._dirPath}get rootDirPath(){return l.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return l.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return l.existsSync(e.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){return this.loadEnv?{...C(this.argv,this.dirPath),...process.env}:process.env}get packageJson(){return JSON.parse(l.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(l.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const s=e.join(n,"node_modules",".bin");if(l.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,t=!0),l.existsSync(e.join(n,".git")))break;const i=e.dirname(n);if(n===i)break;n=i}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>l.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function vn(t,n=!0,s){if(s??=process.cwd(),l.existsSync(e.join(s,"package.json")))return new bn(s,t,n)}async function wn(t,n=!0,s){const i=function(t,n=!0,s){if(s??=process.cwd(),!l.existsSync(e.join(s,"package.json")))return;const i=new bn(s,t,n);let r=i;if(!i.packageJson.workspaces&&e.dirname(s).endsWith("/packages")){const i=e.resolve(s,"..","..");l.existsSync(e.join(i,"package.json"))&&(r=new bn(i,t,n))}return{root:r,self:i}}(t,n,s);if(i)return{...i,descendants:i.root===i.self?await On(t,i.root,n):[i.self]}}async function On(t,n,s){const i=[n],r=n.packageJson.workspaces;if(!Array.isArray(r))return i;const o=[],a=[];for(const t of r.map((t=>e.join(n.dirPath,t))))l.existsSync(t)?a.push(t):o.push(t);a.push(...await E(o,{dot:!0,onlyDirectories:!0}));for(const n of a)l.existsSync(e.join(n,"package.json"))&&i.push(new bn(n,t,s));return i}const En={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command",type:"string",default:"yarn build",alias:"c"}},async handler(t){await async function(t,n){const s=await vn(t,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(e.join(s.rootDirPath,".git")))return kn(s,t),!0;const[i,r,o]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),i=e.resolve(s,"last-build");await l.promises.mkdir(s,{recursive:!0});const r=w("sha256"),o=y.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();r.update(o);const a=JSON.stringify(Object.entries(t.env).filter((([e])=>!An.has(e))).sort((([e],[t])=>e.localeCompare(t))));r.update(a),await async function(e,t,n){return new Promise((s=>{const i=y.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(jn.some((t=>e.includes(t)))||$n.some((t=>e.endsWith(t))))&&!xn.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${i.join(", ")}`);const r=y.spawn("git",["diff","--",...i],{cwd:e.rootDirPath});r.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),r.on("close",(()=>{s()}))}))}(t,n,r);const c=r.digest("hex"),h=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}((()=>l.promises.readFile(i,"utf8")));return[h===c,i,c]}(s,t);if(i)return console.info(O.green(`Skip to run '${t.command}' 💫`)),!1;if(!kn(s,t))return;t.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(t)}};function kn(e,t){if(console.info(O.green(`Run '${t.command}'`)),!t.dryRun){const n=y.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const An=new Set(["CI","PWDEBUG","TMPDIR"]);const jn=["src/","public/"],$n=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],xn=["test/","tests/","__tests__/","test-fixtures/"];const _n=new Set;async function Cn(e){try{await A(e)}catch{}}const Sn=new j,Pn={exitIfFailed:!0};async function Nn(e,t,n,s=Pn){const[i,r]=Dn(e,t);if(In(i,t),n.verbose&&In(r,t,"Start (raw)",!0),n.dryRun)return Rn(i,0,s),0;const o=r.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(e){await Cn(e);const t=async()=>{_n.has(e)||(_n.add(e),await Cn(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(o));const a=await N(r,void 0,{cwd:t.dirPath,env:Wn(t.env,s),shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Rn(i,a.status,s),a.status??1}function Mn(e,t,n,s=Pn){return Sn.runAndWaitForReturnValue((async()=>{const[i,r]=Dn(e,t);if(In(i,t,"Start (parallel)",!0),n.dryRun)return In(i,t,"Started (log)"),n.verbose&&In(r,t,"Started (raw)",!0),Rn(i,0,s),0;const o=await N(r,void 0,{cwd:t.dirPath,env:Wn(t.env,s),shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});In(i,t,"Started (log)"),n.verbose&&In(r,t,"Started (raw)",!0);const a=o.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),Rn(i,o.status,s),o.status??1}))}function Dn(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ");return un&&(n=n.replaceAll("build-ts run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(YARN )?vitest run/g,"bun test").replaceAll(" --color --passWithNoTests --allowOnly","")),n=n.trim(),[zn(n.replaceAll("YARN ",`${gn} `)),zn(n.replaceAll("YARN ",!un&&t.binExists?"":`${gn} `))]}function In(e,t,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),e)+O.gray(` at ${t.dirPath}`))}function Rn(e,t,n){0===t?console.info(O.green(O.bold("Finished:"),e)):(console.info(O.red(O.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function Wn(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function zn(e){return e.includes("next dev")?e.replaceAll("bun --bun","bun"):e}const Tn=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),Fn=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Bn=new Set([...Fn].filter((e=>!Tn.has(e)))),Ln={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){un||(console.error(O.red("This command is only available on Bun.")),process.exit(1));const n=await wn(t,!1);n||(console.error(O.red("No project found.")),process.exit(1));const s=t.files??[];let i,r,o;if(s.length>0){const t=[],n=[],a=[];for(const i of s){const s=e.resolve(String(i));if(s.endsWith("/test-fixtures")||s.includes("/test-fixtures/"))continue;const r=e.extname(s).slice(1);s.endsWith("/package.json")?a.push(s):Tn.has(r)?t.push(s):Fn.has(r)&&n.push(s)}i=t.map((e=>`"${e}"`)).join(" "),r=n.map((e=>`"${e}"`)).join(" "),o=a.map((e=>`"${e}"`)).join(" ")}else i="",r=`"**/{.*/,}*.{${[...Bn].join(",")}" "!**/test-fixtures/**"`,o=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let c;(i||0===s.length)&&(c=Mn(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${i}`,n.self,t,{forceColor:!0})),t.format&&(r&&Mn(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${r}`,n.self,t,{forceColor:!0}),o&&(await c,Mn(`bun --bun sort-package-json ${o}`,n.self,t,{forceColor:!0})))}};function*Vn(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Un={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of Vn("optimizeForDockerBuild",n.descendants)){const n=s.packageJson,i=["dependencies","devDependencies"];for(const e of i){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Hn(t,n),Jn(n),Yn(n),t.dryRun)continue;const r=t.outside?e.join(s.dirPath,"dist"):s.dirPath;await l.promises.mkdir(r,{recursive:!0}),await l.promises.writeFile(e.join(r,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||y.spawnSync("yarn",{stdio:"inherit"})}};function Hn(e,t){if(!e.outside)return void delete t.devDependencies;const n=t.devDependencies||{},s=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"];for(const t of Object.keys(n))(s.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&delete n[t]}function Jn(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],s=e.scripts||{};for(const[e,i]of Object.entries(s))(t.some((t=>e.includes(t)))||n.some((e=>i.includes(e)||i.trim()===e.trim())))&&delete s[e]}function Yn(e){delete e.private,delete e.publishConfig,delete e.prettier}const qn=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${fn} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?"BUN build-ts run prisma/seeds.ts":e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const t=e.resolve(n);console.info(n,t),s=`DATABASE_URL=file://${t} `}return`${s}PRISMA studio`}},Gn={},Kn={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Qn).command(Zn).command(es).command(ts).command(ns).command(ss).command(is).command(rs).command(os).command(as).demandCommand(),handler(){}},Qn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Gn,async handler(e){const t=await cs(e);for(const n of Vn("prisma deploy",t))await Nn(qn.deploy(n),n,e)}},Xn={...Gn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Zn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Xn,async handler(e){const t=await cs(e);for(const n of Vn("prisma deploy-force",t))await Nn(qn.deployForce(n,e.backupPath),n,e)}},es={command:"litestream",describe:"Setup DB for Litestream",builder:Gn,async handler(e){const t=await cs(e);for(const n of Vn("prisma litestream",t))await Nn(qn.litestream(n),n,e)}},ts={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Gn,async handler(e){const t=await cs(e);for(const n of Vn("prisma migrate",t))await Nn(qn.migrate(n),n,e)}},ns={command:"migrate-dev",describe:"Create a migration file",builder:Gn,async handler(e){const t=await cs(e);for(const n of Vn("prisma migrate-dev",t))await Nn(qn.migrateDev(n),n,e)}},ss={command:"reset",describe:"Reset DB",builder:Gn,async handler(e){const t=await cs(e);for(const n of Vn("prisma reset",t))await Nn(qn.reset(n),n,e)}},is={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Xn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await cs(e);for(const n of Vn("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await Nn(qn.restore(n,e.backupPath,t),n,e)}}},rs={command:"seed",describe:"Populate DB with seed data",builder:{...Gn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await cs(e);for(const n of Vn("prisma seed",t))await Nn(qn.seed(n,e.file),n,e)}},os={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Gn,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await cs(e);for(const n of Vn("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await Nn(qn.studio(n,t),n,e)}}},as={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await cs(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const s of Vn(`prisma ${n}`,t))await Nn(`PRISMA ${n}`,s,e)}};async function cs(e){const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(O.red("No prisma project found.")),process.exit(1)),n}const ls={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=vn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let s=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${O.yellow(`#${i} Retrying: ${n.join(" ")}`)}`),s=await Nn(n.join(" "),t,e,{exitIfFailed:!1}),0===s)return;process.exit(s)}},hs=["express","fastify","elysia"],ds={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await wn(e,!1,t);n||(console.error(O.red("No project found.")),process.exit(1));for(const t of Vn("setup",n.descendants)){const s=await x.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===_.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Mn(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await Nn("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Mn("poetry config virtualenvs.in-project true",t,e),await Mn("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Mn(`poetry env use ${n}`,t,e),await Sn.promiseAll(),await Nn("poetry run pip install --upgrade pip",t,e),await Nn("poetry install --ansi",t,e)}const i=t.packageJson.dependencies??{},r=t.packageJson.devDependencies||{},o=t.packageJson.scripts??{},a=[];let c=[];i.blitz||i.next||r["@remix-run/dev"]?(a.push("pm2"),c.push("concurrently","open-cli","vitest","wait-on")):hs.some((e=>i[e]))&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),un&&(c=c.filter((e=>"vitest"!==e))),a.length>0&&await Nn(`${pn} add ${a.join(" ")}`,t,e),c.length>0&&await Nn(`${pn} add -D ${c.join(" ")}`,t,e),o["gen-code"]&&await Nn(`${gn} gen-code`,t,e)}}(e)}};const us=new class{buildDevImage(t,n){const s=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${s}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",s=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,s)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(_n.has(e))return;_n.add(e),In(e,t);const{status:n}=v(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Rn(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class fs{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return us.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${us.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:s,startCommand:i}){const r=e.env.WB_ENV;return`WB_ENV=${r} NEXT_PUBLIC_WB_ENV=${r} APP_ENV=${r} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${s}/mount && ${i} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:s}){const i=e.env.WB_ENV;return`WB_ENV=${i} NEXT_PUBLIC_WB_ENV=${i} APP_ENV=${i} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${s} && exit 1"\n "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const ps=new class extends fs{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${qn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${qn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const gs=new class extends fs{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${us.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${fn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction(e,t)})`}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testE2EDev(e,t,{startCommand:n}){return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const ms=new class extends fs{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[qn.reset(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[qn.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(e,t)}"`}};const ys=new class extends fs{constructor(){super()}start(e,t){return`YARN build-ts run src/index.ts ${t.watch?"--watch":""} -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${us.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${fn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const bs=new class extends fs{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${qn.reset(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:s=`${qn.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:s})}testE2EDev(e,t,{playwrightArgs:n,startCommand:s="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:s})}testStart(e,t){return`YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},vs={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await wn(e);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(t.blitz)i=ps;else if(t.next)i=ms;else if(s["@remix-run/dev"])i=bs;else if(hs.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=gs;else{if(!t["build-ts"]&&!s["build-ts"])continue;i=ys}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const s=ws(t,"development");await Nn(`${s}${i.start(n,e)}`,n,e);break}case"staging":{const s=ws(t,"staging");await Nn(`${s}${i.startProduction(n,e,8080)}`,n,e);break}case"docker":{const s=ws(t,"staging");await Nn(`${s}${i.startDocker(n,e)}`,n,e);break}case"docker-debug":{const s=ws(t,"staging");e.normalizedArgsText="'/bin/bash'",await Nn(`${s}${i.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function ws(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const Os={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await wn(t);n||(console.error(O.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=!t.e2e&&void 0===t.start&&void 0===t.unit;for(const i of n.descendants){const n=i.packageJson.dependencies||{},r=i.packageJson.devDependencies||{};let o;o=n.blitz?ps:n.next?ms:r["@remix-run/dev"]?bs:hs.some((e=>n[e]))&&!n["firebase-functions"]?gs:ys,s&&(t={...t,e2e:l.existsSync(e.join(i.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:l.existsSync(e.join(i.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${i.name} ...`);const a=[];if(!t.ci){switch(t.unit&&a.push(Nn(o.testUnit(i,t),i,t,{timeout:t.unitTimeout})),t.start&&a.push(Nn(o.testStart(i,t),i,t)),await Promise.all(a),t.e2e){case void 0:case"none":continue;case"":case"headless":await Nn(o.testE2E(i,t,{}),i,t);continue;case"headless-dev":await Nn(o.testE2EDev(i,t,{}),i,t);continue;case"docker":await Es(i,t,o);continue;case"docker-debug":await Es(i,t,o,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||r["@remix-run/dev"])switch(t.e2e){case"headed":await Nn(o.testE2E(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),i,t);continue;case"headed-dev":await Nn(o.testE2EDev(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),i,t);continue;case"debug":await Nn(o.testE2E(i,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),i,t);continue;case"generate":await Nn(o.testE2E(i,t,{playwrightArgs:"codegen http://localhost:8080"}),i,t);continue;case"trace":await Nn("BUN playwright show-trace",i,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await Mn(us.stopAll(),i,t),t.unit&&await Mn(o.testUnit(i,t).replaceAll(" --allowOnly",""),i,t,{timeout:t.unitTimeout}),t.start&&await Mn(o.testStart(i,t),i,t),await Sn.promiseAll(),"none"!==t.e2e){i.hasDockerfile&&await Nn(`${o.buildDocker(i,"test")}`,i,t);const e=i.hasDockerfile?{startCommand:us.stopAndStart(i,!0)}:{};process.exitCode=await Nn(o.testE2E(i,t,e).replaceAll(" --allowOnly",""),i,t,{exitIfFailed:!1}),await Nn(us.stop(i),i,t)}}}(t)}};async function Es(e,t,n,s){await Nn(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await Nn(`${n.testE2E(e,t,{playwrightArgs:s,startCommand:us.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await Nn(us.stop(e),e,t)}const ks={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await wn(e,!1);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const s=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&s.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&s.push("YARN pyright")),s.length>0)return Mn(s.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),s=await Promise.all(n);let i=0;for(const[e,n]of s.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=n}i&&process.exit(i)}},As={...ks,command:"tc"},js={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};var $s;await an(($s=process.argv,$s.slice(te()+1))).scriptName("wb").options(js).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(En).command(Ln).command(Un).command(Kn).command(ls).command(ds).command(vs).command(Os).command(ks).command(As).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvbGliL3N0cmluZy11dGlscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3N0cmluZy11dGlscy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci10eXBlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvdG9rZW5pemUtYXJnLXN0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi95ZXJyb3IuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9saWIvcGxhdGZvcm0tc2hpbXMvZXNtLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZXNjYWxhZGUvc3luYy9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9pcy1wcm9taXNlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9wYXJzZS1jb21tYW5kLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9hcmdzZXJ0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9taWRkbGV3YXJlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9tYXliZS1hc3luYy1yZXN1bHQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL2NvbW1hbmQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3lhcmdzLWZhY3RvcnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL3doaWNoLW1vZHVsZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvb2JqLWZpbHRlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvc2V0LWJsb2NraW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91c2FnZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tcGxldGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tcGxldGlvbi10ZW1wbGF0ZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2xldmVuc2h0ZWluLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi92YWxpZGF0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9hcHBseS1leHRlbmRzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2luZGV4Lm1qcyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2hhc2guanMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgY2FjaGVFbmFibGVkID0gdHJ1ZVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMpO1xuICB9XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qgb3JnRW52VmFycyA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgZW52VmFycyA9IHsgLi4ucmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCksIGNhY2hlRW5hYmxlZCksIC4uLmVudlZhcnMgfTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgICBpZiAob3JnRW52VmFyc1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBvcmdFbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlczpgLCBlbnZQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudiksIGNhY2hlRW5hYmxlZCkgfHwge30pO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIGNhY2hlRW5hYmxlZCA9IHRydWVcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbnZWYXJzID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCwgY2FjaGVFbmFibGVkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNhY2hlRW5hYmxlZCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVFbmFibGVkICYmIGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5leHBvcnQgdmFyIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5O1xuKGZ1bmN0aW9uIChEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSkge1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQk9PTEVBTlwiXSA9IFwiYm9vbGVhblwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiU1RSSU5HXCJdID0gXCJzdHJpbmdcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIk5VTUJFUlwiXSA9IFwibnVtYmVyXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJBUlJBWVwiXSA9IFwiYXJyYXlcIjtcbn0pKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5IHx8IChEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSA9IHt9KSk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG5pbXBvcnQgeyB0b2tlbml6ZUFyZ1N0cmluZyB9IGZyb20gJy4vdG9rZW5pemUtYXJnLXN0cmluZy5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB9IGZyb20gJy4veWFyZ3MtcGFyc2VyLXR5cGVzLmpzJztcbmltcG9ydCB7IGNhbWVsQ2FzZSwgZGVjYW1lbGl6ZSwgbG9va3NMaWtlTnVtYmVyIH0gZnJvbSAnLi9zdHJpbmctdXRpbHMuanMnO1xubGV0IG1peGluO1xuZXhwb3J0IGNsYXNzIFlhcmdzUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihfbWl4aW4pIHtcbiAgICAgICAgbWl4aW4gPSBfbWl4aW47XG4gICAgfVxuICAgIHBhcnNlKGFyZ3NJbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJyYXk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvb2xlYW46IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29lcmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb3VudDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW52UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuYXJnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBub3JtYWxpemU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0cmluZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbnVtYmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBfXzogdW5kZWZpbmVkLFxuICAgICAgICAgICAga2V5OiB1bmRlZmluZWRcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIGFsbG93IGEgc3RyaW5nIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCBpbiByYXRoZXJcbiAgICAgICAgLy8gdGhhbiBhbiBhcmd2IGFycmF5LlxuICAgICAgICBjb25zdCBhcmdzID0gdG9rZW5pemVBcmdTdHJpbmcoYXJnc0lucHV0KTtcbiAgICAgICAgLy8gdG9rZW5pemVBcmdTdHJpbmcgYWRkcyBleHRyYSBxdW90ZXMgdG8gYXJncyBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgLy8gb25seSBzdHJpcCB0aG9zZSBleHRyYSBxdW90ZXMgaW4gcHJvY2Vzc1ZhbHVlIGlmIGFyZ3NJbnB1dCBpcyBhIHN0cmluZ1xuICAgICAgICBjb25zdCBpbnB1dElzU3RyaW5nID0gdHlwZW9mIGFyZ3NJbnB1dCA9PT0gJ3N0cmluZyc7XG4gICAgICAgIC8vIGFsaWFzZXMgbWlnaHQgaGF2ZSB0cmFuc2l0aXZlIHJlbGF0aW9uc2hpcHMsIG5vcm1hbGl6ZSB0aGlzLlxuICAgICAgICBjb25zdCBhbGlhc2VzID0gY29tYmluZUFsaWFzZXMoT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBvcHRzLmFsaWFzKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICdib29sZWFuLW5lZ2F0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdjYW1lbC1jYXNlLWV4cGFuc2lvbic6IHRydWUsXG4gICAgICAgICAgICAnY29tYmluZS1hcnJheXMnOiBmYWxzZSxcbiAgICAgICAgICAgICdkb3Qtbm90YXRpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2R1cGxpY2F0ZS1hcmd1bWVudHMtYXJyYXknOiB0cnVlLFxuICAgICAgICAgICAgJ2ZsYXR0ZW4tZHVwbGljYXRlLWFycmF5cyc6IHRydWUsXG4gICAgICAgICAgICAnZ3JlZWR5LWFycmF5cyc6IHRydWUsXG4gICAgICAgICAgICAnaGFsdC1hdC1ub24tb3B0aW9uJzogZmFsc2UsXG4gICAgICAgICAgICAnbmFyZ3MtZWF0cy1vcHRpb25zJzogZmFsc2UsXG4gICAgICAgICAgICAnbmVnYXRpb24tcHJlZml4JzogJ25vLScsXG4gICAgICAgICAgICAncGFyc2UtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJzogdHJ1ZSxcbiAgICAgICAgICAgICdwb3B1bGF0ZS0tJzogZmFsc2UsXG4gICAgICAgICAgICAnc2V0LXBsYWNlaG9sZGVyLWtleSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3Nob3J0LW9wdGlvbi1ncm91cHMnOiB0cnVlLFxuICAgICAgICAgICAgJ3N0cmlwLWFsaWFzZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICdzdHJpcC1kYXNoZWQnOiBmYWxzZSxcbiAgICAgICAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IGZhbHNlXG4gICAgICAgIH0sIG9wdHMuY29uZmlndXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBvcHRzLmRlZmF1bHQpO1xuICAgICAgICBjb25zdCBjb25maWdPYmplY3RzID0gb3B0cy5jb25maWdPYmplY3RzIHx8IFtdO1xuICAgICAgICBjb25zdCBlbnZQcmVmaXggPSBvcHRzLmVudlByZWZpeDtcbiAgICAgICAgY29uc3Qgbm90RmxhZ3NPcHRpb24gPSBjb25maWd1cmF0aW9uWydwb3B1bGF0ZS0tJ107XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzQXJndiA9IG5vdEZsYWdzT3B0aW9uID8gJy0tJyA6ICdfJztcbiAgICAgICAgY29uc3QgbmV3QWxpYXNlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIGFsbG93IGEgaTE4biBoYW5kbGVyIHRvIGJlIHBhc3NlZCBpbiwgZGVmYXVsdCB0byBhIGZha2Ugb25lICh1dGlsLmZvcm1hdCkuXG4gICAgICAgIGNvbnN0IF9fID0gb3B0cy5fXyB8fCBtaXhpbi5mb3JtYXQ7XG4gICAgICAgIGNvbnN0IGZsYWdzID0ge1xuICAgICAgICAgICAgYWxpYXNlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIGFycmF5czogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIGJvb2xzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgc3RyaW5nczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG51bWJlcnM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb3VudHM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBub3JtYWxpemU6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb25maWdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbmFyZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBjb2VyY2lvbnM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBrZXlzOiBbXVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZWdhdGl2ZSA9IC9eLShbMC05XSsoXFwuWzAtOV0rKT98XFwuWzAtOV0rKSQvO1xuICAgICAgICBjb25zdCBuZWdhdGVkQm9vbGVhbiA9IG5ldyBSZWdFeHAoJ14tLScgKyBjb25maWd1cmF0aW9uWyduZWdhdGlvbi1wcmVmaXgnXSArICcoLispJyk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmFycmF5IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JyA/IG9wdC5rZXkgOiBvcHQ7XG4gICAgICAgICAgICAvLyBhc3NpZ24gdG8gZmxhZ3NbYm9vbHN8c3RyaW5nc3xudW1iZXJzXVxuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICAvLyBhc3NpZ24ga2V5IHRvIGJlIGNvZXJjZWRcbiAgICAgICAgICAgIGlmIChhc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3NbYXNzaWdubWVudF1ba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmbGFncy5hcnJheXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmJvb2xlYW4gfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLmJvb2xzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5zdHJpbmcgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLnN0cmluZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm51bWJlciB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3MubnVtYmVyc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuY291bnQgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLmNvdW50c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMubm9ybWFsaXplIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ub3JtYWxpemVba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5uYXJnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5uYXJnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5uYXJnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0cy5jb2VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRzLmNvZXJjZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb2VyY2lvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cy5jb25maWcpIHx8IHR5cGVvZiBvcHRzLmNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIGxvb2t1cCB0YWJsZSB0aGF0IHRha2VzIGludG8gYWNjb3VudCBhbGxcbiAgICAgICAgLy8gY29tYmluYXRpb25zIG9mIGFsaWFzZXM6IHtmOiBbJ2ZvbyddLCBmb286IFsnZiddfVxuICAgICAgICBleHRlbmRBbGlhc2VzKG9wdHMua2V5LCBhbGlhc2VzLCBvcHRzLmRlZmF1bHQsIGZsYWdzLmFycmF5cyk7XG4gICAgICAgIC8vIGFwcGx5IGRlZmF1bHQgdmFsdWVzIHRvIGFsbCBhbGlhc2VzLlxuICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzW2FsaWFzXSA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbigpO1xuICAgICAgICBsZXQgbm90RmxhZ3MgPSBbXTtcbiAgICAgICAgY29uc3QgYXJndiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgeyBfOiBbXSB9KTtcbiAgICAgICAgLy8gVE9ETyhiY29lKTogZm9yIHRoZSBmaXJzdCBwYXNzIGF0IHJlbW92aW5nIG9iamVjdCBwcm90b3R5cGUgIHdlIGRpZG4ndFxuICAgICAgICAvLyByZW1vdmUgYWxsIHByb3RvdHlwZXMgZnJvbSBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgQVBJLCB3ZSBtaWdodCB3YW50XG4gICAgICAgIC8vIHRvIGdyYWR1YWxseSBtb3ZlIHRvd2FyZHMgZG9pbmcgc28uXG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gYW55IHVua25vd24gb3B0aW9uIChleGNlcHQgZm9yIGVuZC1vZi1vcHRpb25zLCBcIi0tXCIpXG4gICAgICAgICAgICBpZiAoYXJnICE9PSAnLS0nICYmIC9eLS8udGVzdChhcmcpICYmIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykpIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgICAgIC8vIC0tLSwgLS0tPSwgLS0tLSwgZXRjLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHJ1bmNhdGVkQXJnLm1hdGNoKC9eLS0tKyg9fCQpLykpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zIHdpdGhvdXQga2V5IG5hbWUgYXJlIGludmFsaWQuXG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyAtLSBzZXBhcmF0ZWQgYnkgPVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKz0vKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tLis9LykpKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNpbmcgW1xcc1xcU10gaW5zdGVhZCBvZiAuIGJlY2F1c2UganMgZG9lc24ndCBzdXBwb3J0IHRoZVxuICAgICAgICAgICAgICAgIC8vICdkb3RhbGwnIHJlZ2V4IG1vZGlmaWVyLiBTZWU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTA2ODMwOC8xMzIxNlxuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIC8vIGFycmF5cyBmb3JtYXQgPSAnLS1mPWEgYiBjJ1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZj1tb25rZXkgd2FzaGluZyBjYXQnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2gobmVnYXRlZEJvb2xlYW4pICYmIGNvbmZpZ3VyYXRpb25bJ2Jvb2xlYW4tbmVnYXRpb24nXSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2gobmVnYXRlZEJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpID8gW2ZhbHNlXSA6IGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5IHNwYWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBmb3JtYXQgPSAnLS1mb28gYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLS1mb28gYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdHJ1dGh5IGV2ZW4gaWY6IGZsYWdzLm5hcmdzW2tleV0gPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAoIW5leHQubWF0Y2goL14tLykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG90LW5vdGF0aW9uIGZsYWcgc2VwYXJhdGVkIGJ5ICc9Jy5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLis9LykpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLShbXj1dKyk9KFtcXHNcXFNdKikkLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEFyZyhtWzFdLCBtWzJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG90LW5vdGF0aW9uIGZsYWcgc2VwYXJhdGVkIGJ5IHNwYWNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKC5cXC4uKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAhbmV4dC5tYXRjaCgvXi0vKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVteLV0rLykgJiYgIWFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBsZXR0ZXJzID0gYXJnLnNsaWNlKDEsIC0xKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICAgICAgYnJva2VuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0gPT09ICc9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhcmcuc2xpY2UoaiArIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gbGV0dGVyc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mPWEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGxldHRlciBpcyBhbiBhbHBoYWJldGljIGNoYXJhY3RlciBhbmQgbmV4dCB2YWx1ZSBpcyBhIG51bWJlclxuICAgICAgICAgICAgICAgICAgICBpZiAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKG5leHQsIGZsYWdzLmJvb2xzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhsZXR0ZXJzW2pdLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgZGVmYXVsdFZhbHVlKGxldHRlcnNbal0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoLTEpWzBdO1xuICAgICAgICAgICAgICAgIGlmICghYnJva2VuICYmIGtleSAhPT0gJy0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBmb3JtYXQgPSAnLWYgYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXJncyBmb3JtYXQgPSAnLWYgYSBiIGMnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdHJ1dGh5IGV2ZW4gaWY6IGZsYWdzLm5hcmdzW2tleV0gPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXROYXJncyhpLCBrZXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiAoIS9eKC18LS0pW14tXS8udGVzdChuZXh0KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubWF0Y2gobmVnYXRpdmUpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bMC05XSQvKSAmJlxuICAgICAgICAgICAgICAgIGFyZy5tYXRjaChuZWdhdGl2ZSkgJiZcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoYXJnLnNsaWNlKDEpLCBmbGFncy5ib29scykpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUtZGlnaXQgYm9vbGVhbiBhbGlhcywgZS5nOiB4YXJncyAtMFxuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG9yZGVyIG9mIHByZWNlZGVuY2U6XG4gICAgICAgIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdcbiAgICAgICAgLy8gMi4gdmFsdWUgZnJvbSBlbnYgdmFyXG4gICAgICAgIC8vIDMuIHZhbHVlIGZyb20gY29uZmlnIGZpbGVcbiAgICAgICAgLy8gNC4gdmFsdWUgZnJvbSBjb25maWcgb2JqZWN0c1xuICAgICAgICAvLyA1LiBjb25maWd1cmVkIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIHRydWUpOyAvLyBzcGVjaWFsIGNhc2U6IGNoZWNrIGVudiB2YXJzIHRoYXQgcG9pbnQgdG8gY29uZmlnIGZpbGVcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIC8vIGZvciBhbnkgY291bnRzIGVpdGhlciBub3QgaW4gYXJncyBvciB3aXRob3V0IGFuIGV4cGxpY2l0IGRlZmF1bHQsIHNldCB0byAwXG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyAnLS0nIGRlZmF1bHRzIHRvIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKG5vdEZsYWdzT3B0aW9uICYmIG5vdEZsYWdzLmxlbmd0aClcbiAgICAgICAgICAgIGFyZ3Zbbm90RmxhZ3NBcmd2XSA9IFtdO1xuICAgICAgICBub3RGbGFncy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGFyZ3Zbbm90RmxhZ3NBcmd2XS5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSAmJiBjb25maWd1cmF0aW9uWydzdHJpcC1kYXNoZWQnXSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZmlsdGVyKGtleSA9PiBrZXkgIT09ICctLScgJiYga2V5LmluY2x1ZGVzKCctJykpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgYXJndltrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWFsaWFzZWQnXSkge1xuICAgICAgICAgICAgO1xuICAgICAgICAgICAgW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKGFsaWFzZXMpLm1hcChrID0+IGFsaWFzZXNba10pKS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSAmJiBhbGlhcy5pbmNsdWRlcygnLScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzLnNwbGl0KCcuJykubWFwKHByb3AgPT4gY2FtZWxDYXNlKHByb3ApKS5qb2luKCcuJyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhc107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQdXNoIGFyZ3VtZW50IGludG8gcG9zaXRpb25hbCBhcnJheSwgYXBwbHlpbmcgbnVtZXJpYyBjb2VyY2lvbjpcbiAgICAgICAgZnVuY3Rpb24gcHVzaFBvc2l0aW9uYWwoYXJnKSB7XG4gICAgICAgICAgICBjb25zdCBtYXliZUNvZXJjZWROdW1iZXIgPSBtYXliZUNvZXJjZU51bWJlcignXycsIGFyZyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1heWJlQ29lcmNlZE51bWJlciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG1heWJlQ29lcmNlZE51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBhcmd2Ll8ucHVzaChtYXliZUNvZXJjZWROdW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhvdyBtYW55IGFyZ3VtZW50cyBzaG91bGQgd2UgY29uc3VtZSwgYmFzZWRcbiAgICAgICAgLy8gb24gdGhlIG5hcmdzIG9wdGlvbj9cbiAgICAgICAgZnVuY3Rpb24gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCBhcmdBZnRlckVxdWFsU2lnbikge1xuICAgICAgICAgICAgbGV0IGlpO1xuICAgICAgICAgICAgbGV0IHRvRWF0ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgLy8gTmFOIGhhcyBhIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIGFycmF5IHR5cGUsIGluZGljYXRpbmcgdGhhdCBvbmUgb3JcbiAgICAgICAgICAgIC8vIG1vcmUgdmFsdWVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICAgIHRvRWF0ID0gdHlwZW9mIHRvRWF0ICE9PSAnbnVtYmVyJyB8fCBpc05hTih0b0VhdCkgPyAxIDogdG9FYXQ7XG4gICAgICAgICAgICBpZiAodG9FYXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdBcmd1bWVudCB1bmV4cGVjdGVkIGZvcjogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZSA9IGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSA/IDAgOiAxO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ25hcmdzLWVhdHMtb3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xhc3NpYyBiZWhhdmlvciwgeWFyZ3MgZWF0cyBwb3NpdGlvbmFsIGFuZCBkYXNoIGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAoaSArIDEpICsgYXZhaWxhYmxlIDwgdG9FYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0b0VhdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5hcmdzIHdpbGwgbm90IGNvbnN1bWUgZmxhZyBhcmd1bWVudHMsIGUuZy4sIC1hYmMsIC0tZm9vLFxuICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXJtaW5hdGVzIHdoZW4gb25lIGlzIG9ic2VydmVkLlxuICAgICAgICAgICAgICAgIGZvciAoaWkgPSBpICsgMTsgaWkgPCBhcmdzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3NbaWldLm1hdGNoKC9eLVteMC05XS8pIHx8IGFyZ3NbaWldLm1hdGNoKG5lZ2F0aXZlKSB8fCBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmdzW2lpXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUrKztcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCB0b0VhdClcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvbnN1bWVkID0gTWF0aC5taW4oYXZhaWxhYmxlLCB0b0VhdCk7XG4gICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiBjb25zdW1lZCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdBZnRlckVxdWFsU2lnbik7XG4gICAgICAgICAgICAgICAgY29uc3VtZWQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaWkgPSBpICsgMTsgaWkgPCAoY29uc3VtZWQgKyBpICsgMSk7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzW2lpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGkgKyBjb25zdW1lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW4gb3B0aW9uIGlzIGFuIGFycmF5LCBlYXQgYWxsIG5vbi1oeXBoZW5hdGVkIGFyZ3VtZW50c1xuICAgICAgICAvLyBmb2xsb3dpbmcgaXQuLi4gWVVNIVxuICAgICAgICAvLyBlLmcuLCAtLWZvbyBhcHBsZSBiYW5hbmEgY2F0IGJlY29tZXMgW1wiYXBwbGVcIiwgXCJiYW5hbmFcIiwgXCJjYXRcIl1cbiAgICAgICAgZnVuY3Rpb24gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCBhcmdBZnRlckVxdWFsU2lnbikge1xuICAgICAgICAgICAgbGV0IGFyZ3NUb1NldCA9IFtdO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBhcmdBZnRlckVxdWFsU2lnbiB8fCBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgIC8vIElmIGJvdGggYXJyYXkgYW5kIG5hcmdzIGFyZSBjb25maWd1cmVkLCBlbmZvcmNlIHRoZSBuYXJncyBjb3VudDpcbiAgICAgICAgICAgIGNvbnN0IG5hcmdzQ291bnQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICEoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSkge1xuICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNVbmRlZmluZWQobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAoaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIC9eLS8udGVzdChuZXh0KSAmJiAhbmVnYXRpdmUudGVzdChuZXh0KSAmJiAhaXNVbmtub3duT3B0aW9uQXNBcmcobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGtleXMgd2l0aG91dCB2YWx1ZSA9PT4gYXJnc1RvU2V0IHJlbWFpbnMgYW4gZW1wdHkgW11cbiAgICAgICAgICAgICAgICAvLyBzZXQgdXNlciBkZWZhdWx0IHZhbHVlLCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHZhbHVlIGluIC0tb3B0aW9uPXZhbHVlIGlzIGVhdGVuIGFzIGlzXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2gocHJvY2Vzc1ZhbHVlKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24sIHRydWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhcmdzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFjb25maWd1cmF0aW9uWydncmVlZHktYXJyYXlzJ10gJiYgYXJnc1RvU2V0Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobmFyZ3NDb3VudCAmJiB0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgYXJnc1RvU2V0Lmxlbmd0aCA+PSBuYXJnc0NvdW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBpaTtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2gocHJvY2Vzc1ZhbHVlKGtleSwgbmV4dCwgaW5wdXRJc1N0cmluZykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGJvdGggYXJyYXkgYW5kIG5hcmdzIGFyZSBjb25maWd1cmVkLCBjcmVhdGUgYW4gZXJyb3IgaWYgbGVzcyB0aGFuXG4gICAgICAgICAgICAvLyBuYXJncyBwb3NpdGlvbmFscyB3ZXJlIGZvdW5kLiBOYU4gaGFzIHNwZWNpYWwgbWVhbmluZywgaW5kaWNhdGluZ1xuICAgICAgICAgICAgLy8gdGhhdCBhdCBsZWFzdCBvbmUgdmFsdWUgaXMgcmVxdWlyZWQgKG1vcmUgYXJlIG9rYXkpLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXJnc0NvdW50ID09PSAnbnVtYmVyJyAmJiAoKG5hcmdzQ291bnQgJiYgYXJnc1RvU2V0Lmxlbmd0aCA8IG5hcmdzQ291bnQpIHx8XG4gICAgICAgICAgICAgICAgKGlzTmFOKG5hcmdzQ291bnQpICYmIGFyZ3NUb1NldC5sZW5ndGggPT09IDApKSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NUb1NldCk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRBcmcoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzID0gaW5wdXRJc1N0cmluZykge1xuICAgICAgICAgICAgaWYgKC8tLy50ZXN0KGtleSkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0ga2V5LnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1lbENhc2UocHJvcCk7XG4gICAgICAgICAgICAgICAgfSkuam9pbignLicpO1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzVmFsdWUoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0S2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBzZXRLZXkoYXJndiwgc3BsaXRLZXksIHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBwb3B1bGF0aW5nIGFsaWFzZXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSBwb3B1bGF0aW5nIGFsaWFzZXMgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGRvdC1ub3RhdGlvbiBrZXlcbiAgICAgICAgICAgIGlmIChzcGxpdEtleS5sZW5ndGggPiAxICYmIGNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwYW5kIGFsaWFzIHdpdGggbmVzdGVkIG9iamVjdHMgaW4ga2V5XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBbXS5jb25jYXQoc3BsaXRLZXkpO1xuICAgICAgICAgICAgICAgICAgICBhLnNoaWZ0KCk7IC8vIG51a2UgdGhlIG9sZCBrZXkuXG4gICAgICAgICAgICAgICAgICAgIGtleVByb3BlcnRpZXMgPSBrZXlQcm9wZXJ0aWVzLmNvbmNhdChhKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgYWxpYXMgb25seSBpZiBpcyBub3QgYWxyZWFkeSBhbiBhbGlhcyBvZiB0aGUgZnVsbCBrZXlcbiAgICAgICAgICAgICAgICAgICAgLy8gKGFscmVhZHkgcG9wdWxhdGVkIGFib3ZlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IG5vcm1hbGl6ZSBnZXR0ZXIgYW5kIHNldHRlciB3aGVuIGtleSBpcyBpbiAnbm9ybWFsaXplJyBidXQgaXNuJ3QgYW4gYXJyYXlcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ub3JtYWxpemUpICYmICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pO1xuICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcmd2UmV0dXJuLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbWl4aW4ubm9ybWFsaXplKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhZGROZXdBbGlhcyhrZXksIGFsaWFzKSB7XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gJiYgZmxhZ3MuYWxpYXNlc1trZXldLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbYWxpYXNdO1xuICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbYWxpYXNdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNbYWxpYXNdICYmIGZsYWdzLmFsaWFzZXNbYWxpYXNdLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhhbGlhcywga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzVmFsdWUoa2V5LCB2YWwsIHNob3VsZFN0cmlwUXVvdGVzKSB7XG4gICAgICAgICAgICAvLyBzdHJpbmdzIG1heSBiZSBxdW90ZWQsIGNsZWFuIHRoaXMgdXAgYXMgd2UgYXNzaWduIHZhbHVlcy5cbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcGFyc2luZyBib29sZWFuIGFyZ3VtZW50cyAtLWZvbz10cnVlIC0tYmFyIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSB8fCBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgPT09ICd0cnVlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsKVxuICAgICAgICAgICAgICAgID8gdmFsLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2KTsgfSlcbiAgICAgICAgICAgICAgICA6IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsKTtcbiAgICAgICAgICAgIC8vIGluY3JlbWVudCBhIGNvdW50IGdpdmVuIGFzIGFyZyAoZWl0aGVyIG5vIHZhbHVlIG9yIHZhbHVlIHBhcnNlZCBhcyBib29sZWFuKVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IG5vcm1hbGl6ZWQgdmFsdWUgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYW5kIGluICdhcnJheXMnXG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWwubWFwKCh2YWwpID0+IHsgcmV0dXJuIG1peGluLm5vcm1hbGl6ZSh2YWwpOyB9KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWl4aW4ubm9ybWFsaXplKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnXSAmJiBrZXkgPT09ICdfJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpICYmICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ29lcmNlTnVtYmVyID0gbG9va3NMaWtlTnVtYmVyKHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydwYXJzZS1udW1iZXJzJ10gJiYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKE1hdGguZmxvb3IocGFyc2VGbG9hdChgJHt2YWx1ZX1gKSkpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ29lcmNlTnVtYmVyIHx8ICghaXNVbmRlZmluZWQodmFsdWUpICYmIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnLmpzb24gZmlsZSwgdGhpcyBzaG91bGQgYmVcbiAgICAgICAgLy8gYXBwbGllZCBsYXN0IHNvIHRoYXQgZGVmYXVsdHMgY2FuIGJlIGFwcGxpZWQuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZyhhcmd2KSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdMb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgLy8gZXhwYW5kIGRlZmF1bHRzL2FsaWFzZXMsIGluLWNhc2UgYW55IGhhcHBlbiB0byByZWZlcmVuY2VcbiAgICAgICAgICAgIC8vIHRoZSBjb25maWcuanNvbiBmaWxlLlxuICAgICAgICAgICAgYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMoY29uZmlnTG9va3VwLCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb25maWdzKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdLZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWdQYXRoID0gYXJndltjb25maWdLZXldIHx8IGNvbmZpZ0xvb2t1cFtjb25maWdLZXldO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnUGF0aCA9IG1peGluLnJlc29sdmUobWl4aW4uY3dkKCksIGNvbmZpZ1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZUNvbmZpZyA9IGZsYWdzLmNvbmZpZ3NbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZUNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHJlc29sdmVDb25maWcocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWl4aW4ucmVxdWlyZShyZXNvbHZlZENvbmZpZ1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZW5vIHdpbGwgcmVjZWl2ZSBhIFBlcm1pc3Npb25EZW5pZWQgZXJyb3IgaWYgYW4gYXR0ZW1wdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFkZSB0byBsb2FkIGNvbmZpZyB3aXRob3V0IHRoZSAtLWFsbG93LXJlYWQgZmxhZzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleC5uYW1lID09PSAnUGVybWlzc2lvbkRlbmllZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3ZbY29uZmlnS2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIEpTT04gY29uZmlnIGZpbGU6ICVzJywgY29uZmlnUGF0aCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGFyZ3MgZnJvbSBjb25maWcgb2JqZWN0LlxuICAgICAgICAvLyBpdCByZWN1cnNpdmVseSBjaGVja3MgbmVzdGVkIG9iamVjdHMuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdChjb25maWcsIHByZXYpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBmdWxsS2V5ID0gcHJldiA/IHByZXYgKyAnLicgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIGlubmVyIG9iamVjdCBhbmQgd2UgaGF2ZSBkb3Qtbm90YXRpb25cbiAgICAgICAgICAgICAgICAvLyBlbmFibGVkLCB0cmVhdCBpbm5lciBvYmplY3RzIGluIGNvbmZpZyB0aGUgc2FtZSBhc1xuICAgICAgICAgICAgICAgIC8vIGhlYXZpbHkgbmVzdGVkIGRvdCBub3RhdGlvbnMgKGZvby5iYXIuYXBwbGUpLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IGJ1dCBub3QgYW4gYXJyYXksIGNoZWNrIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgYXJndW1lbnRzIHZpYSBDTEkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyB3aXRoaW4gdGhlIGNvbmZpZyBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBmdWxsS2V5LnNwbGl0KCcuJykpIHx8IChjaGVja0FsbEFsaWFzZXMoZnVsbEtleSwgZmxhZ3MuYXJyYXlzKSAmJiBjb25maWd1cmF0aW9uWydjb21iaW5lLWFycmF5cyddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGZ1bGxLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhbGwgY29uZmlnIG9iamVjdHMgcGFzc2VkIGluIG9wdHNcbiAgICAgICAgZnVuY3Rpb24gc2V0Q29uZmlnT2JqZWN0cygpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnT2JqZWN0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb25maWdPYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGNvbmZpZ09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QoY29uZmlnT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUVudlZhcnMoYXJndiwgY29uZmlnT25seSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnZQcmVmaXggPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHR5cGVvZiBlbnZQcmVmaXggPT09ICdzdHJpbmcnID8gZW52UHJlZml4IDogJyc7XG4gICAgICAgICAgICBjb25zdCBlbnYgPSBtaXhpbi5lbnYoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChmdW5jdGlvbiAoZW52VmFyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycgfHwgZW52VmFyLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGFycmF5IG9mIG5lc3RlZCBrZXlzIGFuZCBjb252ZXJ0IHRoZW0gdG8gY2FtZWwgY2FzZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkgeyAvLyBJZiB3ZSBoYXZlbid0IGFscmVhZHkgY29lcmNlZCB0aGlzIG9wdGlvbiB2aWEgb25lIG9mIGl0cyBhbGlhc2VzXG4gICAgICAgICAgICAgICAgICAgIGNvZXJjZSA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvZXJjaW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29lcmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCBjb2VyY2UoYXJndltrZXldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSkpLmZvckVhY2goYWxpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZC5hZGQoYWxpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlthbGldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlcktleXMoYXJndikge1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgcGxhY2Vob2xkZXIga2V5cyBmb3IgZG90IG5vdGF0aW9uIG9wdGlvbnMgJ2Zvby5iYXInLlxuICAgICAgICAgICAgICAgIGlmICh+a2V5LmluZGV4T2YoJy4nKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndltrZXldID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICAgICAgYXJndltrZXldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhvYmosIGFsaWFzZXMsIGRlZmF1bHRzLCBjYW5Mb2cgPSBmYWxzZSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KG9iaiwga2V5LnNwbGl0KCcuJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIGtleS5zcGxpdCgnLicpLCBkZWZhdWx0c1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkxvZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRlZFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgKGFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0tleShvYmosIHguc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwgeC5zcGxpdCgnLicpLCBkZWZhdWx0c1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzS2V5KG9iaiwga2V5cykge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgbyA9IChvW2tleV0gfHwge30pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5IGluIG87XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0S2V5KG9iaiwga2V5cywgdmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8oYmNvZSk6IGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgeWFyZ3MsIHN3aXRjaCB0b1xuICAgICAgICAgICAgICAgIC8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbiAgICAgICAgICAgICAgICBrZXkgPSBzYW5pdGl6ZUtleShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgb1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgb1trZXldIGlzIGFuIGFycmF5LCBhbmQgdGhhdCB0aGUgbGFzdCBpdGVtIGlzIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trZXldLnB1c2goe30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trZXldID0gW29ba2V5XSwge31dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBlbXB0eSBvYmplY3QgYXQgdGhlIGVuZCBvZiB0aGUgb1trZXldIGFycmF5LCBzbyBzZXQgbyB0byB0aGF0IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNhbml0aXplS2V5KGtleXNba2V5cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBjb25zdCBpc1R5cGVBcnJheSA9IGNoZWNrQWxsQWxpYXNlcyhrZXlzLmpvaW4oJy4nKSwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsdWVBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgbGV0IGR1cGxpY2F0ZSA9IGNvbmZpZ3VyYXRpb25bJ2R1cGxpY2F0ZS1hcmd1bWVudHMtYXJyYXknXTtcbiAgICAgICAgICAgIC8vIG5hcmdzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBkdXBsaWNhdGVcbiAgICAgICAgICAgIGlmICghZHVwbGljYXRlICYmIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCghaXNVbmRlZmluZWQob1trZXldKSAmJiBmbGFncy5uYXJnc1trZXldID09PSAxKSB8fCAoQXJyYXkuaXNBcnJheShvW2tleV0pICYmIG9ba2V5XS5sZW5ndGggPT09IGZsYWdzLm5hcmdzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGluY3JlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaW5jcmVtZW50KG9ba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlICYmIGlzVHlwZUFycmF5ICYmIGlzVmFsdWVBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBjb25maWd1cmF0aW9uWydmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnXSA/IG9ba2V5XS5jb25jYXQodmFsdWUpIDogKEFycmF5LmlzQXJyYXkob1trZXldWzBdKSA/IG9ba2V5XSA6IFtvW2tleV1dKS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFkdXBsaWNhdGUgJiYgQm9vbGVhbihpc1R5cGVBcnJheSkgPT09IEJvb2xlYW4oaXNWYWx1ZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IG9ba2V5XS5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob1trZXldID09PSB1bmRlZmluZWQgJiYgaXNUeXBlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBvW2tleV0gPSBpc1ZhbHVlQXJyYXkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkdXBsaWNhdGUgJiYgIShvW2tleV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpKSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gW29ba2V5XSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXh0ZW5kIHRoZSBhbGlhc2VzIGxpc3Qgd2l0aCBpbmZlcnJlZCBhbGlhc2VzLlxuICAgICAgICBmdW5jdGlvbiBleHRlbmRBbGlhc2VzKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqIHx8IHt9KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGEga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBhbGlhc2VzIGFycmF5LCBmb3IgZXhhbXBsZSBpdCBtaWdodFxuICAgICAgICAgICAgICAgICAgICAvLyBleGlzdCBpbiBib3RoICdvcHRzLmRlZmF1bHQnIGFuZCAnb3B0cy5rZXknLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFwiLS1vcHRpb24tbmFtZVwiLCBhbHNvIHNldCBhcmd2Lm9wdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIFwiLS1vcHRpb25OYW1lXCIsIGFsc28gc2V0IGFyZ3ZbJ29wdGlvbi1uYW1lJ11cbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJhc2VkIG9uIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBzaG9ydCBmbGFnIGdyb3VwIHBhcnNpbmcgbG9naWNcbiAgICAgICAgZnVuY3Rpb24gaGFzQWxsU2hvcnRGbGFncyhhcmcpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIsIG9yIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHNpbmdsZSBoeXBoZW4sIGl0J3Mgbm90IGEgc2hvcnQgZmxhZyBncm91cFxuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkgfHwgIWFyZy5tYXRjaCgvXi1bXi1dKy8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGhhc0FsbEZsYWdzID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgY29uc3QgbGV0dGVycyA9IGFyZy5zbGljZSgxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxldHRlcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0FueUZsYWcobGV0dGVyc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQWxsRmxhZ3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0gPT09ICc9JykgfHxcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9PT0gJy0nIHx8XG4gICAgICAgICAgICAgICAgICAgICgvW0EtWmEtel0vLnRlc3QobGV0dGVyc1tqXSkgJiYgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXS5tYXRjaCgvXFxXLykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNBbGxGbGFncztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uWyd1bmtub3duLW9wdGlvbnMtYXMtYXJncyddICYmIGlzVW5rbm93bk9wdGlvbihhcmcpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbihhcmcpIHtcbiAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0nKTtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBuZWdhdGl2ZSBudW1iZXJzXG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzaG9ydCBvcHRpb24gZ3JvdXAgYW5kIGFsbCBvZiB0aGVtIGFyZSBjb25maWd1cmVkLCBpdCBpc24ndCB1bmtub3duXG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZS5nLiAnLS1jb3VudD0yJ1xuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYScgb3IgJy0tYXJnJ1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsRmxhZyA9IC9eLSsoW149XSs/KSQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEtJ1xuICAgICAgICAgICAgY29uc3QgZmxhZ0VuZGluZ0luSHlwaGVuID0gL14tKyhbXj1dKz8pLSQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWFiYzEyMydcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkRpZ2l0cyA9IC9eLSsoW149XSs/XFxkKykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hL3Vzci9sb2NhbCdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbk5vbldvcmRDaGFyYWN0ZXJzID0gL14tKyhbXj1dKz8pXFxXKy4qJC87XG4gICAgICAgICAgICAvLyBjaGVjayB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGZsYWcgc3R5bGVzLCBpbmNsdWRpbmcgbmVnYXRlZEJvb2xlYW4sIGEgcGF0dGVybiBkZWZpbmVkIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBtZXRob2RcbiAgICAgICAgICAgIHJldHVybiAhaGFzRmxhZ3NNYXRjaGluZyhhcmcsIGZsYWdXaXRoRXF1YWxzLCBuZWdhdGVkQm9vbGVhbiwgbm9ybWFsRmxhZywgZmxhZ0VuZGluZ0luSHlwaGVuLCBmbGFnRW5kaW5nSW5EaWdpdHMsIGZsYWdFbmRpbmdJbk5vbldvcmRDaGFyYWN0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcGljayBhIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgLy8gZm9yIGFuIG9wdGlvbiBiYXNlZCBvbiBuYW1lIGFuZCB0eXBlLlxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0VmFsdWUoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmXG4gICAgICAgICAgICAgICAgYCR7a2V5fWAgaW4gZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Rm9yVHlwZShndWVzc1R5cGUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZSwgZ2l2ZW4gdGhlIHR5cGUgb2YgYSBmbGFnLixcbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdEZvclR5cGUodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgZGVmID0ge1xuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuU1RSSU5HXTogJycsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5Lk5VTUJFUl06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVldOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBkZWZbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2l2ZW4gYSBmbGFnLCBlbmZvcmNlIGEgZGVmYXVsdCB0eXBlLlxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHVzZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgaW5jb25zaXN0ZW5jaWVzXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGNvdW50IGtleXMgc2hvdWxkIG5vdCBiZSBzZXQgYXMgYXJyYXkvbmFyZ1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY291bnRzKS5maW5kKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBjb25maWd1cmF0aW9uOiAlcywgb3B0cy5jb3VudCBleGNsdWRlcyBvcHRzLmFycmF5LicsIGtleSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5uYXJnLicsIGtleSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5hc3NpZ24oe30sIGZsYWdzLmFsaWFzZXMpLFxuICAgICAgICAgICAgYXJndjogT2JqZWN0LmFzc2lnbihhcmd2UmV0dXJuLCBhcmd2KSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBkZWZhdWx0ZWQ6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRlZCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICBuZXdBbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBuZXdBbGlhc2VzKVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIGlmIGFueSBhbGlhc2VzIHJlZmVyZW5jZSBlYWNoIG90aGVyLCB3ZSBzaG91bGRcbi8vIG1lcmdlIHRoZW0gdG9nZXRoZXIuXG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgLy8gdHVybiBhbGlhcyBsb29rdXAgaGFzaCB7a2V5OiBbJ2FsaWFzMScsICdhbGlhczInXX0gaW50b1xuICAgIC8vIGEgc2ltcGxlIGFycmF5IFsna2V5JywgJ2FsaWFzMScsICdhbGlhczInXVxuICAgIE9iamVjdC5rZXlzKGFsaWFzZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBhbGlhc0FycmF5cy5wdXNoKFtdLmNvbmNhdChhbGlhc2VzW2tleV0sIGtleSkpO1xuICAgIH0pO1xuICAgIC8vIGNvbWJpbmUgYXJyYXlzIHVudGlsIHplcm8gY2hhbmdlcyBhcmVcbiAgICAvLyBtYWRlIGluIGFuIGl0ZXJhdGlvbi5cbiAgICB3aGlsZSAoY2hhbmdlKSB7XG4gICAgICAgIGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsaWFzQXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpaSA9IGkgKyAxOyBpaSA8IGFsaWFzQXJyYXlzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9IGFsaWFzQXJyYXlzW2ldLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNBcnJheXNbaWldLmluZGV4T2YodikgIT09IC0xO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzQXJyYXlzW2ldID0gYWxpYXNBcnJheXNbaV0uY29uY2F0KGFsaWFzQXJyYXlzW2lpXSk7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzQXJyYXlzLnNwbGljZShpaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtYXAgYXJyYXlzIGJhY2sgdG8gdGhlIGhhc2gtbG9va3VwIChkZS1kdXBlIHdoaWxlXG4gICAgLy8gd2UncmUgYXQgaXQpLlxuICAgIGFsaWFzQXJyYXlzLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzQXJyYXkpIHtcbiAgICAgICAgYWxpYXNBcnJheSA9IGFsaWFzQXJyYXkuZmlsdGVyKGZ1bmN0aW9uICh2LCBpLCBzZWxmKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKHYpID09PSBpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbGFzdEFsaWFzID0gYWxpYXNBcnJheS5wb3AoKTtcbiAgICAgICAgaWYgKGxhc3RBbGlhcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsYXN0QWxpYXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb21iaW5lZFtsYXN0QWxpYXNdID0gYWxpYXNBcnJheTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb21iaW5lZDtcbn1cbi8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYSBjb3VudCBpcyBnaXZlbiBhcyBhbiBhcmdcbi8vIGl0IGlzIE5PVCBjYWxsZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZVxuLy8gdGh1cyB3ZSBjYW4gc3RhcnQgdGhlIGNvdW50IGF0IDEgaW5zdGVhZCBvZiAwXG5mdW5jdGlvbiBpbmNyZW1lbnQob3JpZykge1xuICAgIHJldHVybiBvcmlnICE9PSB1bmRlZmluZWQgPyBvcmlnICsgMSA6IDE7XG59XG4vLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbi8vIE9iamVjdC5jcmVhdGUobnVsbCkgZm9yIGRvdCBub3RhdGlvbjpcbmZ1bmN0aW9uIHNhbml0aXplS2V5KGtleSkge1xuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nKVxuICAgICAgICByZXR1cm4gJ19fX3Byb3RvX19fJztcbiAgICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gc3RyaXBRdW90ZXModmFsKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAodmFsWzBdID09PSBcIidcIiB8fCB2YWxbMF0gPT09ICdcIicpICYmXG4gICAgICAgIHZhbFt2YWwubGVuZ3RoIC0gMV0gPT09IHZhbFswXSlcbiAgICAgICAgPyB2YWwuc3Vic3RyaW5nKDEsIHZhbC5sZW5ndGggLSAxKVxuICAgICAgICA6IHZhbDtcbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbi8vIHRha2UgYW4gdW4tc3BsaXQgYXJndiBzdHJpbmcgYW5kIHRva2VuaXplIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplQXJnU3RyaW5nKGFyZ1N0cmluZykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ1N0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1N0cmluZy5tYXAoZSA9PiB0eXBlb2YgZSAhPT0gJ3N0cmluZycgPyBlICsgJycgOiBlKTtcbiAgICB9XG4gICAgYXJnU3RyaW5nID0gYXJnU3RyaW5nLnRyaW0oKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHByZXZDID0gbnVsbDtcbiAgICBsZXQgYyA9IG51bGw7XG4gICAgbGV0IG9wZW5pbmcgPSBudWxsO1xuICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgYXJnU3RyaW5nLmxlbmd0aDsgaWkrKykge1xuICAgICAgICBwcmV2QyA9IGM7XG4gICAgICAgIGMgPSBhcmdTdHJpbmcuY2hhckF0KGlpKTtcbiAgICAgICAgLy8gc3BsaXQgb24gc3BhY2VzIHVubGVzcyB3ZSdyZSBpbiBxdW90ZXMuXG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG9uJ3Qgc3BsaXQgdGhlIHN0cmluZyBpZiB3ZSdyZSBpbiBtYXRjaGluZ1xuICAgICAgICAvLyBvcGVuaW5nIG9yIGNsb3Npbmcgc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGMgPT09IFwiJ1wiIHx8IGMgPT09ICdcIicpICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZ3NbaV0pXG4gICAgICAgICAgICBhcmdzW2ldID0gJyc7XG4gICAgICAgIGFyZ3NbaV0gKz0gYztcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG59XG4iLCJmdW5jdGlvbiBnZXRQcm9jZXNzQXJndkJpbkluZGV4KCkge1xuICAgIGlmIChpc0J1bmRsZWRFbGVjdHJvbkFwcCgpKVxuICAgICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGlzQnVuZGxlZEVsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiBpc0VsZWN0cm9uQXBwKCkgJiYgIXByb2Nlc3MuZGVmYXVsdEFwcDtcbn1cbmZ1bmN0aW9uIGlzRWxlY3Ryb25BcHAoKSB7XG4gICAgcmV0dXJuICEhcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoaWRlQmluKGFyZ3YpIHtcbiAgICByZXR1cm4gYXJndi5zbGljZShnZXRQcm9jZXNzQXJndkJpbkluZGV4KCkgKyAxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9jZXNzQXJndkJpbigpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5hcmd2W2dldFByb2Nlc3NBcmd2QmluSW5kZXgoKV07XG59XG4iLCJleHBvcnQgY2xhc3MgWUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1zZykge1xuICAgICAgICBzdXBlcihtc2cgfHwgJ3lhcmdzIGVycm9yJyk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdZRXJyb3InO1xuICAgICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFlFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJsZXQgc2hpbTtcbmNsYXNzIFkxOE4ge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgLy8gY29uZmlndXJhYmxlIG9wdGlvbnMuXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IG9wdHMuZGlyZWN0b3J5IHx8ICcuL2xvY2FsZXMnO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzID0gdHlwZW9mIG9wdHMudXBkYXRlRmlsZXMgPT09ICdib29sZWFuJyA/IG9wdHMudXBkYXRlRmlsZXMgOiB0cnVlO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IG9wdHMubG9jYWxlIHx8ICdlbic7XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUb0xhbmd1YWdlID0gdHlwZW9mIG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlID09PSAnYm9vbGVhbicgPyBvcHRzLmZhbGxiYWNrVG9MYW5ndWFnZSA6IHRydWU7XG4gICAgICAgIC8vIGludGVybmFsIHN0dWZmLlxuICAgICAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy53cml0ZVF1ZXVlID0gW107XG4gICAgfVxuICAgIF9fKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFnZ2VkTGl0ZXJhbChhcmd1bWVudHNbMF0sIC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBsZXQgY2IgPSBmdW5jdGlvbiAoKSB7IH07IC8vIHN0YXJ0IHdpdGggbm9vcC5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYiA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkgeyB9OyAvLyBub29wLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgLy8gd2UndmUgb2JzZXJ2ZWQgYSBuZXcgc3RyaW5nLCB1cGRhdGUgdGhlIGxhbmd1YWdlIGZpbGUuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc3RyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdID0gc3RyO1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hpbS5mb3JtYXQuYXBwbHkoc2hpbS5mb3JtYXQsIFt0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdIHx8IHN0cl0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gICAgX19uKCkge1xuICAgICAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgY29uc3Qgc2luZ3VsYXIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGNvbnN0IHBsdXJhbCA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSlcbiAgICAgICAgICAgIHRoaXMuX3JlYWRMb2NhbGVGaWxlKCk7XG4gICAgICAgIGxldCBzdHIgPSBxdWFudGl0eSA9PT0gMSA/IHNpbmd1bGFyIDogcGx1cmFsO1xuICAgICAgICBpZiAodGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXTtcbiAgICAgICAgICAgIHN0ciA9IGVudHJ5W3F1YW50aXR5ID09PSAxID8gJ29uZScgOiAnb3RoZXInXTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gJiYgdGhpcy51cGRhdGVGaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdID0ge1xuICAgICAgICAgICAgICAgIG9uZTogc2luZ3VsYXIsXG4gICAgICAgICAgICAgICAgb3RoZXI6IHBsdXJhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2NhbGUsXG4gICAgICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgY291bGQgY2hhbmdlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIHdyaXRlIGlzIHBlcmZvcm1lZC5cbiAgICAgICAgICAgIHRoaXMuX2VucXVldWVXcml0ZSh7XG4gICAgICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmRpcmVjdG9yeSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYSAlZCBwbGFjZWhvbGRlciBpcyBwcm92aWRlZCwgYWRkIHF1YW50aXR5XG4gICAgICAgIC8vIHRvIHRoZSBhcmd1bWVudHMgZXhwYW5kZWQgYnkgdXRpbC5mb3JtYXQuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtzdHJdO1xuICAgICAgICBpZiAofnN0ci5pbmRleE9mKCclZCcpKVxuICAgICAgICAgICAgdmFsdWVzLnB1c2gocXVhbnRpdHkpO1xuICAgICAgICByZXR1cm4gc2hpbS5mb3JtYXQuYXBwbHkoc2hpbS5mb3JtYXQsIHZhbHVlcy5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBzZXRMb2NhbGUobG9jYWxlKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgIH1cbiAgICBnZXRMb2NhbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgICB9XG4gICAgdXBkYXRlTG9jYWxlKG9iaikge1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFnZ2VkTGl0ZXJhbChwYXJ0cywgLi4uYXJncykge1xuICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQsIGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgc3RyICs9IHBhcnQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyVzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9fLmFwcGx5KHRoaXMsIFtzdHJdLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3MsIDEpKSk7XG4gICAgfVxuICAgIF9lbnF1ZXVlV3JpdGUod29yaykge1xuICAgICAgICB0aGlzLndyaXRlUXVldWUucHVzaCh3b3JrKTtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVRdWV1ZS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzV3JpdGVRdWV1ZSgpO1xuICAgIH1cbiAgICBfcHJvY2Vzc1dyaXRlUXVldWUoKSB7XG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgd29yayA9IHRoaXMud3JpdGVRdWV1ZVswXTtcbiAgICAgICAgLy8gZGVzdHJ1Y3R1cmUgdGhlIGVucXVldWVkIHdvcmsuXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IHdvcmsuZGlyZWN0b3J5O1xuICAgICAgICBjb25zdCBsb2NhbGUgPSB3b3JrLmxvY2FsZTtcbiAgICAgICAgY29uc3QgY2IgPSB3b3JrLmNiO1xuICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSB0aGlzLl9yZXNvbHZlTG9jYWxlRmlsZShkaXJlY3RvcnksIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRMb2NhbGUgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNhY2hlW2xvY2FsZV0sIG51bGwsIDIpO1xuICAgICAgICBzaGltLmZzLndyaXRlRmlsZShsYW5ndWFnZUZpbGUsIHNlcmlhbGl6ZWRMb2NhbGUsICd1dGYtOCcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIF90aGlzLndyaXRlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChfdGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgX3RoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlYWRMb2NhbGVGaWxlKCkge1xuICAgICAgICBsZXQgbG9jYWxlTG9va3VwID0ge307XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGEgYnVuZGxlciBzdWNoIGFzIHdlYnBhY2ssIHJlYWRGaWxlU3luYyBtYXkgbm90IGJlIGRlZmluZWQ6XG4gICAgICAgICAgICBpZiAoc2hpbS5mcy5yZWFkRmlsZVN5bmMpIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVMb29rdXAgPSBKU09OLnBhcnNlKHNoaW0uZnMucmVhZEZpbGVTeW5jKGxhbmd1YWdlRmlsZSwgJ3V0Zi04JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlID0gJ3N5bnRheCBlcnJvciBpbiAnICsgbGFuZ3VhZ2VGaWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJylcbiAgICAgICAgICAgICAgICBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0gPSBsb2NhbGVMb29rdXA7XG4gICAgfVxuICAgIF9yZXNvbHZlTG9jYWxlRmlsZShkaXJlY3RvcnksIGxvY2FsZSkge1xuICAgICAgICBsZXQgZmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZSArICcuanNvbicpO1xuICAgICAgICBpZiAodGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgJiYgIXRoaXMuX2ZpbGVFeGlzdHNTeW5jKGZpbGUpICYmIH5sb2NhbGUubGFzdEluZGV4T2YoJ18nKSkge1xuICAgICAgICAgICAgLy8gYXR0ZW1wdCBmYWxsYmFjayB0byBsYW5ndWFnZSBvbmx5XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZUZpbGUgPSBzaGltLnJlc29sdmUoZGlyZWN0b3J5LCAnLi8nLCBsb2NhbGUuc3BsaXQoJ18nKVswXSArICcuanNvbicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbGVFeGlzdHNTeW5jKGxhbmd1YWdlRmlsZSkpXG4gICAgICAgICAgICAgICAgZmlsZSA9IGxhbmd1YWdlRmlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gICAgX2ZpbGVFeGlzdHNTeW5jKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHNoaW0uZXhpc3RzKGZpbGUpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB5MThuKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuIiwiaW1wb3J0IHNoaW0gZnJvbSAnLi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcydcbmltcG9ydCB7IHkxOG4gYXMgX3kxOG4gfSBmcm9tICcuL2J1aWxkL2xpYi9pbmRleC5qcydcblxuY29uc3QgeTE4biA9IChvcHRzKSA9PiB7XG4gIHJldHVybiBfeTE4bihvcHRzLCBzaGltKVxufVxuXG5leHBvcnQgZGVmYXVsdCB5MThuXG4iLCIndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgbm90U3RyaWN0RXF1YWwsIHN0cmljdEVxdWFsIH0gZnJvbSAnYXNzZXJ0J1xuaW1wb3J0IGNsaXVpIGZyb20gJ2NsaXVpJ1xuaW1wb3J0IGVzY2FsYWRlIGZyb20gJ2VzY2FsYWRlL3N5bmMnXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCdcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgUGFyc2VyIGZyb20gJ3lhcmdzLXBhcnNlcidcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBnZXRQcm9jZXNzQXJndkJpbiB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMnXG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi8uLi9idWlsZC9saWIveWVycm9yLmpzJ1xuaW1wb3J0IHkxOG4gZnJvbSAneTE4bidcblxuY29uc3QgUkVRVUlSRV9FUlJPUiA9ICdyZXF1aXJlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRVNNJ1xuY29uc3QgUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IgPSAnbG9hZGluZyBhIGRpcmVjdG9yeSBvZiBjb21tYW5kcyBpcyBub3Qgc3VwcG9ydGVkIHlldCBmb3IgRVNNJ1xuXG5sZXQgX19kaXJuYW1lO1xudHJ5IHtcbiAgX19kaXJuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xufSBjYXRjaCAoZSkge1xuICBfX2Rpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuY29uc3QgbWFpbkZpbGVuYW1lID0gX19kaXJuYW1lLnN1YnN0cmluZygwLCBfX2Rpcm5hbWUubGFzdEluZGV4T2YoJ25vZGVfbW9kdWxlcycpKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnQ6IHtcbiAgICBub3RTdHJpY3RFcXVhbCxcbiAgICBzdHJpY3RFcXVhbFxuICB9LFxuICBjbGl1aSxcbiAgZmluZFVwOiBlc2NhbGFkZSxcbiAgZ2V0RW52OiAoa2V5KSA9PiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2tleV1cbiAgfSxcbiAgaW5zcGVjdCxcbiAgZ2V0Q2FsbGVyRmlsZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIGdldFByb2Nlc3NBcmd2QmluLFxuICBtYWluRmlsZW5hbWU6IG1haW5GaWxlbmFtZSB8fCBwcm9jZXNzLmN3ZCgpLFxuICBQYXJzZXIsXG4gIHBhdGg6IHtcbiAgICBiYXNlbmFtZSxcbiAgICBkaXJuYW1lLFxuICAgIGV4dG5hbWUsXG4gICAgcmVsYXRpdmUsXG4gICAgcmVzb2x2ZVxuICB9LFxuICBwcm9jZXNzOiB7XG4gICAgYXJndjogKCkgPT4gcHJvY2Vzcy5hcmd2LFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QsXG4gICAgZW1pdFdhcm5pbmc6ICh3YXJuaW5nLCB0eXBlKSA9PiBwcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcsIHR5cGUpLFxuICAgIGV4ZWNQYXRoOiAoKSA9PiBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIGV4aXQ6IHByb2Nlc3MuZXhpdCxcbiAgICBuZXh0VGljazogcHJvY2Vzcy5uZXh0VGljayxcbiAgICBzdGRDb2x1bW5zOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogbnVsbFxuICB9LFxuICByZWFkRmlsZVN5bmMsXG4gIHJlcXVpcmU6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRVJST1IpXG4gIH0sXG4gIHJlcXVpcmVEaXJlY3Rvcnk6ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKFJFUVVJUkVfRElSRUNUT1JZX0VSUk9SKVxuICB9LFxuICBzdHJpbmdXaWR0aDogKHN0cikgPT4ge1xuICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgfSxcbiAgeTE4bjogeTE4bih7XG4gICAgZGlyZWN0b3J5OiByZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uLy4uL2xvY2FsZXMnKSxcbiAgICB1cGRhdGVGaWxlczogZmFsc2VcbiAgfSlcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGFydCwgY2FsbGJhY2spIHtcblx0bGV0IGRpciA9IHJlc29sdmUoJy4nLCBzdGFydCk7XG5cdGxldCB0bXAsIHN0YXRzID0gc3RhdFN5bmMoZGlyKTtcblxuXHRpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcblx0XHRkaXIgPSBkaXJuYW1lKGRpcik7XG5cdH1cblxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdHRtcCA9IGNhbGxiYWNrKGRpciwgcmVhZGRpclN5bmMoZGlyKSk7XG5cdFx0aWYgKHRtcCkgcmV0dXJuIHJlc29sdmUoZGlyLCB0bXApO1xuXHRcdGRpciA9IGRpcm5hbWUodG1wID0gZGlyKTtcblx0XHRpZiAodG1wID09PSBkaXIpIGJyZWFrO1xuXHR9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgc2hpbSwgbWVzc2FnZSkge1xuICAgIHNoaW0uYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNpbmdsZUtleShhY3R1YWwsIHNoaW0pIHtcbiAgICBzaGltLmFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgYWN0dWFsLCAnc3RyaW5nJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0S2V5cyhvYmplY3QpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gICAgcmV0dXJuICghIW1heWJlUHJvbWlzZSAmJlxuICAgICAgICAhIW1heWJlUHJvbWlzZS50aGVuICYmXG4gICAgICAgIHR5cGVvZiBtYXliZVByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcGFyc2VDb21tYW5kKGNtZCkge1xuICAgIGNvbnN0IGV4dHJhU3BhY2VzU3RyaXBwZWRDb21tYW5kID0gY21kLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKTtcbiAgICBjb25zdCBzcGxpdENvbW1hbmQgPSBleHRyYVNwYWNlc1N0cmlwcGVkQ29tbWFuZC5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLyk7XG4gICAgY29uc3QgYnJlZ2V4ID0gL1xcLipbXFxdWzw+XS9nO1xuICAgIGNvbnN0IGZpcnN0Q29tbWFuZCA9IHNwbGl0Q29tbWFuZC5zaGlmdCgpO1xuICAgIGlmICghZmlyc3RDb21tYW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1hbmQgZm91bmQgaW46ICR7Y21kfWApO1xuICAgIGNvbnN0IHBhcnNlZENvbW1hbmQgPSB7XG4gICAgICAgIGNtZDogZmlyc3RDb21tYW5kLnJlcGxhY2UoYnJlZ2V4LCAnJyksXG4gICAgICAgIGRlbWFuZGVkOiBbXSxcbiAgICAgICAgb3B0aW9uYWw6IFtdLFxuICAgIH07XG4gICAgc3BsaXRDb21tYW5kLmZvckVhY2goKGNtZCwgaSkgPT4ge1xuICAgICAgICBsZXQgdmFyaWFkaWMgPSBmYWxzZTtcbiAgICAgICAgY21kID0gY21kLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICAgIGlmICgvXFwuK1tcXF0+XS8udGVzdChjbWQpICYmIGkgPT09IHNwbGl0Q29tbWFuZC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgdmFyaWFkaWMgPSB0cnVlO1xuICAgICAgICBpZiAoL15cXFsvLnRlc3QoY21kKSkge1xuICAgICAgICAgICAgcGFyc2VkQ29tbWFuZC5vcHRpb25hbC5wdXNoKHtcbiAgICAgICAgICAgICAgICBjbWQ6IGNtZC5yZXBsYWNlKGJyZWdleCwgJycpLnNwbGl0KCd8JyksXG4gICAgICAgICAgICAgICAgdmFyaWFkaWMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlZENvbW1hbmQuZGVtYW5kZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgY21kOiBjbWQucmVwbGFjZShicmVnZXgsICcnKS5zcGxpdCgnfCcpLFxuICAgICAgICAgICAgICAgIHZhcmlhZGljLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGFyc2VkQ29tbWFuZDtcbn1cbiIsImltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4veWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbWFuZCB9IGZyb20gJy4vcGFyc2UtY29tbWFuZC5qcyc7XG5jb25zdCBwb3NpdGlvbk5hbWUgPSBbJ2ZpcnN0JywgJ3NlY29uZCcsICd0aGlyZCcsICdmb3VydGgnLCAnZmlmdGgnLCAnc2l4dGgnXTtcbmV4cG9ydCBmdW5jdGlvbiBhcmdzZXJ0KGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZUFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgID8gW3sgZGVtYW5kZWQ6IFtdLCBvcHRpb25hbDogW10gfSwgYXJnMSwgYXJnMl1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHBhcnNlQ29tbWFuZChgY21kICR7YXJnMX1gKSxcbiAgICAgICAgICAgICAgICBhcmcyLFxuICAgICAgICAgICAgICAgIGFyZzMsXG4gICAgICAgICAgICBdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgICBjb25zdCBbcGFyc2VkLCBjYWxsZXJBcmd1bWVudHMsIF9sZW5ndGhdID0gcGFyc2VBcmdzKCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXS5zbGljZS5jYWxsKGNhbGxlckFyZ3VtZW50cyk7XG4gICAgICAgIHdoaWxlIChhcmdzLmxlbmd0aCAmJiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IF9sZW5ndGggfHwgYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBwYXJzZWQuZGVtYW5kZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBOb3QgZW5vdWdoIGFyZ3VtZW50cyBwcm92aWRlZC4gRXhwZWN0ZWQgJHtwYXJzZWQuZGVtYW5kZWQubGVuZ3RofSBidXQgcmVjZWl2ZWQgJHthcmdzLmxlbmd0aH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxDb21tYW5kcyA9IHBhcnNlZC5kZW1hbmRlZC5sZW5ndGggKyBwYXJzZWQub3B0aW9uYWwubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoID4gdG90YWxDb21tYW5kcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt0b3RhbENvbW1hbmRzfSBidXQgcmVjZWl2ZWQgJHtsZW5ndGh9LmApO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlZC5kZW1hbmRlZC5mb3JFYWNoKGRlbWFuZGVkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVkVHlwZSA9IGd1ZXNzVHlwZShhcmcpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdUeXBlcyA9IGRlbWFuZGVkLmNtZC5maWx0ZXIodHlwZSA9PiB0eXBlID09PSBvYnNlcnZlZFR5cGUgfHwgdHlwZSA9PT0gJyonKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1R5cGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICBhcmd1bWVudFR5cGVFcnJvcihvYnNlcnZlZFR5cGUsIGRlbWFuZGVkLmNtZCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgcG9zaXRpb24gKz0gMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC5vcHRpb25hbC5mb3JFYWNoKG9wdGlvbmFsID0+IHtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlZFR5cGUgPSBndWVzc1R5cGUoYXJnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVHlwZXMgPSBvcHRpb25hbC5jbWQuZmlsdGVyKHR5cGUgPT4gdHlwZSA9PT0gb2JzZXJ2ZWRUeXBlIHx8IHR5cGUgPT09ICcqJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUeXBlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlRXJyb3Iob2JzZXJ2ZWRUeXBlLCBvcHRpb25hbC5jbWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IDE7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnIuc3RhY2spO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGd1ZXNzVHlwZShhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBhcmc7XG59XG5mdW5jdGlvbiBhcmd1bWVudFR5cGVFcnJvcihvYnNlcnZlZFR5cGUsIGFsbG93ZWRUeXBlcywgcG9zaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgWUVycm9yKGBJbnZhbGlkICR7cG9zaXRpb25OYW1lW3Bvc2l0aW9uXSB8fCAnbWFueWl0aCd9IGFyZ3VtZW50LiBFeHBlY3RlZCAke2FsbG93ZWRUeXBlcy5qb2luKCcgb3IgJyl9IGJ1dCByZWNlaXZlZCAke29ic2VydmVkVHlwZX0uYCk7XG59XG4iLCJpbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5leHBvcnQgY2xhc3MgR2xvYmFsTWlkZGxld2FyZSB7XG4gICAgY29uc3RydWN0b3IoeWFyZ3MpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxNaWRkbGV3YXJlID0gW107XG4gICAgICAgIHRoaXMuZnJvemVucyA9IFtdO1xuICAgICAgICB0aGlzLnlhcmdzID0geWFyZ3M7XG4gICAgfVxuICAgIGFkZE1pZGRsZXdhcmUoY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsID0gdHJ1ZSwgbXV0YXRlcyA9IGZhbHNlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxmdW5jdGlvbj4gW2Jvb2xlYW5dIFtib29sZWFuXSBbYm9vbGVhbl0nLCBbY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFjay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2tbaV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ21pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBjYWxsYmFja1tpXTtcbiAgICAgICAgICAgICAgICBtLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiA9IGFwcGx5QmVmb3JlVmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICBtLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZ2xvYmFsTWlkZGxld2FyZSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgbSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgbS5hcHBseUJlZm9yZVZhbGlkYXRpb24gPSBhcHBseUJlZm9yZVZhbGlkYXRpb247XG4gICAgICAgICAgICBtLmdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgICAgIG0ubXV0YXRlcyA9IG11dGF0ZXM7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMueWFyZ3M7XG4gICAgfVxuICAgIGFkZENvZXJjZU1pZGRsZXdhcmUoY2FsbGJhY2ssIG9wdGlvbikge1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gdGhpcy55YXJncy5nZXRBbGlhc2VzKCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIobSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gWy4uLihhbGlhc2VzW29wdGlvbl0gfHwgW10pLCBvcHRpb25dO1xuICAgICAgICAgICAgaWYgKCFtLm9wdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gIXRvQ2hlY2suaW5jbHVkZXMobS5vcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZTtcbiAgICB9XG4gICAgZnJlZXplKCkge1xuICAgICAgICB0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSk7XG4gICAgfVxuICAgIHVuZnJlZXplKCkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSB0aGlzLmZyb3plbnMucG9wKCk7XG4gICAgICAgIGlmIChmcm96ZW4gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IGZyb3plbjtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIobSA9PiBtLmdsb2JhbCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeShjb21tYW5kTWlkZGxld2FyZSkge1xuICAgIGlmICghY29tbWFuZE1pZGRsZXdhcmUpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gY29tbWFuZE1pZGRsZXdhcmUubWFwKG1pZGRsZXdhcmUgPT4ge1xuICAgICAgICBtaWRkbGV3YXJlLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoYXJndiwgeWFyZ3MsIG1pZGRsZXdhcmVzLCBiZWZvcmVWYWxpZGF0aW9uKSB7XG4gICAgcmV0dXJuIG1pZGRsZXdhcmVzLnJlZHVjZSgoYWNjLCBtaWRkbGV3YXJlKSA9PiB7XG4gICAgICAgIGlmIChtaWRkbGV3YXJlLmFwcGx5QmVmb3JlVmFsaWRhdGlvbiAhPT0gYmVmb3JlVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlkZGxld2FyZS5tdXRhdGVzKSB7XG4gICAgICAgICAgICBpZiAobWlkZGxld2FyZS5hcHBsaWVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICBtaWRkbGV3YXJlLmFwcGxpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoYWNjKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgICAgICAgIC50aGVuKGluaXRpYWxPYmogPT4gUHJvbWlzZS5hbGwoW2luaXRpYWxPYmosIG1pZGRsZXdhcmUoaW5pdGlhbE9iaiwgeWFyZ3MpXSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKFtpbml0aWFsT2JqLCBtaWRkbGV3YXJlT2JqXSkgPT4gT2JqZWN0LmFzc2lnbihpbml0aWFsT2JqLCBtaWRkbGV3YXJlT2JqKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBtaWRkbGV3YXJlKGFjYywgeWFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgPyByZXN1bHQudGhlbihtaWRkbGV3YXJlT2JqID0+IE9iamVjdC5hc3NpZ24oYWNjLCBtaWRkbGV3YXJlT2JqKSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5hc3NpZ24oYWNjLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfSwgYXJndik7XG59XG4iLCJpbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuL2lzLXByb21pc2UuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1heWJlQXN5bmNSZXN1bHQoZ2V0UmVzdWx0LCByZXN1bHRIYW5kbGVyLCBlcnJvckhhbmRsZXIgPSAoZXJyKSA9PiB7XG4gICAgdGhyb3cgZXJyO1xufSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzRnVuY3Rpb24oZ2V0UmVzdWx0KSA/IGdldFJlc3VsdCgpIDogZ2V0UmVzdWx0O1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKHJlc3VsdClcbiAgICAgICAgICAgID8gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0SGFuZGxlcihyZXN1bHQpKVxuICAgICAgICAgICAgOiByZXN1bHRIYW5kbGVyKHJlc3VsdCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlcihlcnIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG4iLCJpbXBvcnQgeyBhc3NlcnROb3RTdHJpY3RFcXVhbCwgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIGNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeSwgfSBmcm9tICcuL21pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kIH0gZnJvbSAnLi9wYXJzZS1jb21tYW5kLmpzJztcbmltcG9ydCB7IGlzWWFyZ3NJbnN0YW5jZSwgfSBmcm9tICcuL3lhcmdzLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgbWF5YmVBc3luY1Jlc3VsdCB9IGZyb20gJy4vdXRpbHMvbWF5YmUtYXN5bmMtcmVzdWx0LmpzJztcbmltcG9ydCB3aGljaE1vZHVsZSBmcm9tICcuL3V0aWxzL3doaWNoLW1vZHVsZS5qcyc7XG5jb25zdCBERUZBVUxUX01BUktFUiA9IC8oXlxcKil8KF5cXCQwKS87XG5leHBvcnQgY2xhc3MgQ29tbWFuZEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih1c2FnZSwgdmFsaWRhdGlvbiwgZ2xvYmFsTWlkZGxld2FyZSwgc2hpbSkge1xuICAgICAgICB0aGlzLnJlcXVpcmVDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLmFsaWFzTWFwID0ge307XG4gICAgICAgIHRoaXMuZnJvemVucyA9IFtdO1xuICAgICAgICB0aGlzLnNoaW0gPSBzaGltO1xuICAgICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7XG4gICAgICAgIHRoaXMuZ2xvYmFsTWlkZGxld2FyZSA9IGdsb2JhbE1pZGRsZXdhcmU7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IHZhbGlkYXRpb247XG4gICAgfVxuICAgIGFkZERpcmVjdG9yeShkaXIsIHJlcSwgY2FsbGVyRmlsZSwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLnJlY3Vyc2UgIT09ICdib29sZWFuJylcbiAgICAgICAgICAgIG9wdHMucmVjdXJzZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3B0cy5leHRlbnNpb25zKSlcbiAgICAgICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IFsnanMnXTtcbiAgICAgICAgY29uc3QgcGFyZW50VmlzaXQgPSB0eXBlb2Ygb3B0cy52aXNpdCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMudmlzaXQgOiAobykgPT4gbztcbiAgICAgICAgb3B0cy52aXNpdCA9IChvYmosIGpvaW5lZCwgZmlsZW5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWQgPSBwYXJlbnRWaXNpdChvYmosIGpvaW5lZCwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgaWYgKHZpc2l0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGpvaW5lZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdGVkO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlQ2FjaGUuYWRkKGpvaW5lZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKHZpc2l0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZpc2l0ZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHsgcmVxdWlyZTogcmVxLCBmaWxlbmFtZTogY2FsbGVyRmlsZSB9LCBkaXIsIG9wdHMpO1xuICAgIH1cbiAgICBhZGRIYW5kbGVyKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIGNvbW1hbmRNaWRkbGV3YXJlLCBkZXByZWNhdGVkKSB7XG4gICAgICAgIGxldCBhbGlhc2VzID0gW107XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVzID0gY29tbWFuZE1pZGRsZXdhcmVGYWN0b3J5KGNvbW1hbmRNaWRkbGV3YXJlKTtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXIgfHwgKCgpID0+IHsgfSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNtZCkpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbW1hbmRBbmRBbGlhc2VzKGNtZCkpIHtcbiAgICAgICAgICAgICAgICBbY21kLCAuLi5hbGlhc2VzXSA9IGNtZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tbWFuZCBvZiBjbWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbihjbWQpKSB7XG4gICAgICAgICAgICBsZXQgY29tbWFuZCA9IEFycmF5LmlzQXJyYXkoY21kLmNvbW1hbmQpIHx8IHR5cGVvZiBjbWQuY29tbWFuZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGNtZC5jb21tYW5kXG4gICAgICAgICAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUoY21kKTtcbiAgICAgICAgICAgIGlmIChjbWQuYWxpYXNlcylcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gW10uY29uY2F0KGNvbW1hbmQpLmNvbmNhdChjbWQuYWxpYXNlcyk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIoY29tbWFuZCwgdGhpcy5leHRyYWN0RGVzYyhjbWQpLCBjbWQuYnVpbGRlciwgY21kLmhhbmRsZXIsIGNtZC5taWRkbGV3YXJlcywgY21kLmRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ29tbWFuZEJ1aWxkZXJEZWZpbml0aW9uKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIoW2NtZF0uY29uY2F0KGFsaWFzZXMpLCBkZXNjcmlwdGlvbiwgYnVpbGRlci5idWlsZGVyLCBidWlsZGVyLmhhbmRsZXIsIGJ1aWxkZXIubWlkZGxld2FyZXMsIGJ1aWxkZXIuZGVwcmVjYXRlZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjbWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRDb21tYW5kID0gcGFyc2VDb21tYW5kKGNtZCk7XG4gICAgICAgICAgICBhbGlhc2VzID0gYWxpYXNlcy5tYXAoYWxpYXMgPT4gcGFyc2VDb21tYW5kKGFsaWFzKS5jbWQpO1xuICAgICAgICAgICAgbGV0IGlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQWxpYXNlcyA9IFtwYXJzZWRDb21tYW5kLmNtZF0uY29uY2F0KGFsaWFzZXMpLmZpbHRlcihjID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoREVGQVVMVF9NQVJLRVIudGVzdChjKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkQWxpYXNlcy5sZW5ndGggPT09IDAgJiYgaXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIHBhcnNlZEFsaWFzZXMucHVzaCgnJDAnKTtcbiAgICAgICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRDb21tYW5kLmNtZCA9IHBhcnNlZEFsaWFzZXNbMF07XG4gICAgICAgICAgICAgICAgYWxpYXNlcyA9IHBhcnNlZEFsaWFzZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgY21kID0gY21kLnJlcGxhY2UoREVGQVVMVF9NQVJLRVIsIHBhcnNlZENvbW1hbmQuY21kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsaWFzZXMuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGlhc01hcFthbGlhc10gPSBwYXJzZWRDb21tYW5kLmNtZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNhZ2UuY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBpc0RlZmF1bHQsIGFsaWFzZXMsIGRlcHJlY2F0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc1twYXJzZWRDb21tYW5kLmNtZF0gPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IGNtZCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgICAgIGJ1aWxkZXI6IGJ1aWxkZXIgfHwge30sXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICBkZW1hbmRlZDogcGFyc2VkQ29tbWFuZC5kZW1hbmRlZCxcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogcGFyc2VkQ29tbWFuZC5vcHRpb25hbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbW1hbmQgPSB0aGlzLmhhbmRsZXJzW3BhcnNlZENvbW1hbmQuY21kXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb21tYW5kSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xuICAgIH1cbiAgICBnZXRDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSk7XG4gICAgfVxuICAgIGhhc0RlZmF1bHRDb21tYW5kKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmRlZmF1bHRDb21tYW5kO1xuICAgIH1cbiAgICBydW5Db21tYW5kKGNvbW1hbmQsIHlhcmdzLCBwYXJzZWQsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZEhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW2NvbW1hbmRdIHx8XG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbY29tbWFuZF1dIHx8XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgY29uc3QgcGFyZW50Q29tbWFuZHMgPSBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpc0RlZmF1bHRDb21tYW5kID0gIWNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dC5jb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuZnVsbENvbW1hbmRzLnB1c2goY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1aWxkZXJSZXN1bHQgPSB0aGlzLmFwcGx5QnVpbGRlclVwZGF0ZVVzYWdlQW5kUGFyc2UoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHlhcmdzLCBwYXJzZWQuYWxpYXNlcywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGJ1aWxkZXJSZXN1bHQpXG4gICAgICAgICAgICA/IGJ1aWxkZXJSZXN1bHQudGhlbihyZXN1bHQgPT4gdGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIHJlc3VsdC5pbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBoZWxwT25seSwgcmVzdWx0LmFsaWFzZXMsIHlhcmdzKSlcbiAgICAgICAgICAgIDogdGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIGJ1aWxkZXJSZXN1bHQuaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIGJ1aWxkZXJSZXN1bHQuYWxpYXNlcywgeWFyZ3MpO1xuICAgIH1cbiAgICBhcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCB5YXJncywgYWxpYXNlcywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHksIGhlbHBPclZlcnNpb25TZXQpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNvbW1hbmRIYW5kbGVyLmJ1aWxkZXI7XG4gICAgICAgIGxldCBpbm5lcllhcmdzID0geWFyZ3M7XG4gICAgICAgIGlmIChpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikpIHtcbiAgICAgICAgICAgIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mcmVlemUoKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXJPdXRwdXQgPSBidWlsZGVyKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KGFsaWFzZXMpLCBoZWxwT3JWZXJzaW9uU2V0KTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoYnVpbGRlck91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlck91dHB1dC50aGVuKG91dHB1dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyWWFyZ3MgPSBpc1lhcmdzSW5zdGFuY2Uob3V0cHV0KSA/IG91dHB1dCA6IHlhcmdzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lcllhcmdzLCBwYXJlbnRDb21tYW5kcywgY29tbWFuZEluZGV4LCBoZWxwT25seSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb21tYW5kQnVpbGRlck9wdGlvbkRlZmluaXRpb25zKGJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7XG4gICAgICAgICAgICBpbm5lcllhcmdzID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoYWxpYXNlcyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb21tYW5kSGFuZGxlci5idWlsZGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaW5uZXJZYXJncy5vcHRpb24oa2V5LCBidWlsZGVyW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBbmRVcGRhdGVVc2FnZShpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJZYXJncywgcGFyZW50Q29tbWFuZHMsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgIH1cbiAgICBwYXJzZUFuZFVwZGF0ZVVzYWdlKGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lcllhcmdzLCBwYXJlbnRDb21tYW5kcywgY29tbWFuZEluZGV4LCBoZWxwT25seSkge1xuICAgICAgICBpZiAoaXNEZWZhdWx0Q29tbWFuZClcbiAgICAgICAgICAgIGlubmVyWWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLnVuZnJlZXplKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGVVc2FnZShpbm5lcllhcmdzKSkge1xuICAgICAgICAgICAgaW5uZXJZYXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKHBhcmVudENvbW1hbmRzLCBjb21tYW5kSGFuZGxlciksIGNvbW1hbmRIYW5kbGVyLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbm5lckFyZ3YgPSBpbm5lcllhcmdzXG4gICAgICAgICAgICAuZ2V0SW50ZXJuYWxNZXRob2RzKClcbiAgICAgICAgICAgIC5ydW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcyhudWxsLCB1bmRlZmluZWQsIHRydWUsIGNvbW1hbmRJbmRleCwgaGVscE9ubHkpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKGlubmVyQXJndilcbiAgICAgICAgICAgID8gaW5uZXJBcmd2LnRoZW4oYXJndiA9PiAoe1xuICAgICAgICAgICAgICAgIGFsaWFzZXM6IGlubmVyWWFyZ3MucGFyc2VkLmFsaWFzZXMsXG4gICAgICAgICAgICAgICAgaW5uZXJBcmd2OiBhcmd2LFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBpbm5lcllhcmdzLnBhcnNlZC5hbGlhc2VzLFxuICAgICAgICAgICAgICAgIGlubmVyQXJndjogaW5uZXJBcmd2LFxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgc2hvdWxkVXBkYXRlVXNhZ2UoeWFyZ3MpIHtcbiAgICAgICAgcmV0dXJuICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSAmJlxuICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RoID09PSAwKTtcbiAgICB9XG4gICAgdXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlcihwYXJlbnRDb21tYW5kcywgY29tbWFuZEhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgYyA9IERFRkFVTFRfTUFSS0VSLnRlc3QoY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpXG4gICAgICAgICAgICA/IGNvbW1hbmRIYW5kbGVyLm9yaWdpbmFsLnJlcGxhY2UoREVGQVVMVF9NQVJLRVIsICcnKS50cmltKClcbiAgICAgICAgICAgIDogY29tbWFuZEhhbmRsZXIub3JpZ2luYWw7XG4gICAgICAgIGNvbnN0IHBjID0gcGFyZW50Q29tbWFuZHMuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFERUZBVUxUX01BUktFUi50ZXN0KGMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGMucHVzaChjKTtcbiAgICAgICAgcmV0dXJuIGAkMCAke3BjLmpvaW4oJyAnKX1gO1xuICAgIH1cbiAgICBoYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0KGlzRGVmYXVsdENvbW1hbmQsIGNvbW1hbmRIYW5kbGVyLCBpbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApIHtcbiAgICAgICAgaWYgKCF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHlhcmdzXG4gICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgLnJ1blZhbGlkYXRpb24oYWxpYXNlcywgcG9zaXRpb25hbE1hcCwgeWFyZ3MucGFyc2VkLmVycm9yLCBpc0RlZmF1bHRDb21tYW5kKTtcbiAgICAgICAgICAgIGlubmVyQXJndiA9IG1heWJlQXN5bmNSZXN1bHQoaW5uZXJBcmd2LCByZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1hbmRIYW5kbGVyLmhhbmRsZXIgJiYgIXlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKSB7XG4gICAgICAgICAgICB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcHVsYXRlRG91YmxlRGFzaCA9ICEheWFyZ3MuZ2V0T3B0aW9ucygpLmNvbmZpZ3VyYXRpb25bJ3BvcHVsYXRlLS0nXTtcbiAgICAgICAgICAgIHlhcmdzXG4gICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgLnBvc3RQcm9jZXNzKGlubmVyQXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgaW5uZXJBcmd2ID0gYXBwbHlNaWRkbGV3YXJlKGlubmVyQXJndiwgeWFyZ3MsIG1pZGRsZXdhcmVzLCBmYWxzZSk7XG4gICAgICAgICAgICBpbm5lckFyZ3YgPSBtYXliZUFzeW5jUmVzdWx0KGlubmVyQXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyUmVzdWx0ID0gY29tbWFuZEhhbmRsZXIuaGFuZGxlcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1Byb21pc2UoaGFuZGxlclJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgPyBoYW5kbGVyUmVzdWx0LnRoZW4oKCkgPT4gcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICA6IHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFpc0RlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmNhY2hlSGVscE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXJBcmd2KSAmJlxuICAgICAgICAgICAgICAgICF5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpIHtcbiAgICAgICAgICAgICAgICBpbm5lckFyZ3YuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZhaWwobnVsbCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLnBvcCgpO1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQuZnVsbENvbW1hbmRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbm5lckFyZ3Y7XG4gICAgfVxuICAgIGFwcGx5TWlkZGxld2FyZUFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgaW5uZXJBcmd2LCBjdXJyZW50Q29udGV4dCwgaGVscE9ubHksIGFsaWFzZXMsIHlhcmdzKSB7XG4gICAgICAgIGxldCBwb3NpdGlvbmFsTWFwID0ge307XG4gICAgICAgIGlmIChoZWxwT25seSlcbiAgICAgICAgICAgIHJldHVybiBpbm5lckFyZ3Y7XG4gICAgICAgIGlmICgheWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0SGFzT3V0cHV0KCkpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXAgPSB0aGlzLnBvcHVsYXRlUG9zaXRpb25hbHMoY29tbWFuZEhhbmRsZXIsIGlubmVyQXJndiwgY3VycmVudENvbnRleHQsIHlhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaWRkbGV3YXJlcyA9IHRoaXMuZ2xvYmFsTWlkZGxld2FyZVxuICAgICAgICAgICAgLmdldE1pZGRsZXdhcmUoKVxuICAgICAgICAgICAgLnNsaWNlKDApXG4gICAgICAgICAgICAuY29uY2F0KGNvbW1hbmRIYW5kbGVyLm1pZGRsZXdhcmVzKTtcbiAgICAgICAgY29uc3QgbWF5YmVQcm9taXNlQXJndiA9IGFwcGx5TWlkZGxld2FyZShpbm5lckFyZ3YsIHlhcmdzLCBtaWRkbGV3YXJlcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpc1Byb21pc2UobWF5YmVQcm9taXNlQXJndilcbiAgICAgICAgICAgID8gbWF5YmVQcm9taXNlQXJndi50aGVuKHJlc29sdmVkSW5uZXJBcmd2ID0+IHRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdChpc0RlZmF1bHRDb21tYW5kLCBjb21tYW5kSGFuZGxlciwgcmVzb2x2ZWRJbm5lckFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApKVxuICAgICAgICAgICAgOiB0aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQoaXNEZWZhdWx0Q29tbWFuZCwgY29tbWFuZEhhbmRsZXIsIG1heWJlUHJvbWlzZUFyZ3YsIGN1cnJlbnRDb250ZXh0LCBhbGlhc2VzLCB5YXJncywgbWlkZGxld2FyZXMsIHBvc2l0aW9uYWxNYXApO1xuICAgIH1cbiAgICBwb3B1bGF0ZVBvc2l0aW9uYWxzKGNvbW1hbmRIYW5kbGVyLCBhcmd2LCBjb250ZXh0LCB5YXJncykge1xuICAgICAgICBhcmd2Ll8gPSBhcmd2Ll8uc2xpY2UoY29udGV4dC5jb21tYW5kcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBkZW1hbmRlZCA9IGNvbW1hbmRIYW5kbGVyLmRlbWFuZGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBvcHRpb25hbCA9IGNvbW1hbmRIYW5kbGVyLm9wdGlvbmFsLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsTWFwID0ge307XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbi5wb3NpdGlvbmFsQ291bnQoZGVtYW5kZWQubGVuZ3RoLCBhcmd2Ll8ubGVuZ3RoKTtcbiAgICAgICAgd2hpbGUgKGRlbWFuZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVtYW5kID0gZGVtYW5kZWQuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVQb3NpdGlvbmFsKGRlbWFuZCwgYXJndiwgcG9zaXRpb25hbE1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG9wdGlvbmFsLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF5YmUgPSBvcHRpb25hbC5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwobWF5YmUsIGFyZ3YsIHBvc2l0aW9uYWxNYXApO1xuICAgICAgICB9XG4gICAgICAgIGFyZ3YuXyA9IGNvbnRleHQuY29tbWFuZHMuY29uY2F0KGFyZ3YuXy5tYXAoYSA9PiAnJyArIGEpKTtcbiAgICAgICAgdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGFyZ3YsIHBvc2l0aW9uYWxNYXAsIHRoaXMuY21kVG9QYXJzZU9wdGlvbnMoY29tbWFuZEhhbmRsZXIub3JpZ2luYWwpLCB5YXJncyk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbmFsTWFwO1xuICAgIH1cbiAgICBwb3B1bGF0ZVBvc2l0aW9uYWwocG9zaXRpb25hbCwgYXJndiwgcG9zaXRpb25hbE1hcCkge1xuICAgICAgICBjb25zdCBjbWQgPSBwb3NpdGlvbmFsLmNtZFswXTtcbiAgICAgICAgaWYgKHBvc2l0aW9uYWwudmFyaWFkaWMpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBbY21kXSA9IGFyZ3YuXy5zcGxpY2UoMCkubWFwKFN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoYXJndi5fLmxlbmd0aClcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmFsTWFwW2NtZF0gPSBbU3RyaW5nKGFyZ3YuXy5zaGlmdCgpKV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY21kVG9QYXJzZU9wdGlvbnMoY21kU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFycmF5OiBbXSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgICAgICAgYWxpYXM6IHt9LFxuICAgICAgICAgICAgZGVtYW5kOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VDb21tYW5kKGNtZFN0cmluZyk7XG4gICAgICAgIHBhcnNlZC5kZW1hbmRlZC5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYWxpYXNlc10gPSBkLmNtZDtcbiAgICAgICAgICAgIGlmIChkLnZhcmlhZGljKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VPcHRpb25zLmFycmF5LnB1c2goY21kKTtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVmYXVsdFtjbWRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuYWxpYXNbY21kXSA9IGFsaWFzZXM7XG4gICAgICAgICAgICBwYXJzZU9wdGlvbnMuZGVtYW5kW2NtZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFyc2VkLm9wdGlvbmFsLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBjb25zdCBbY21kLCAuLi5hbGlhc2VzXSA9IG8uY21kO1xuICAgICAgICAgICAgaWYgKG8udmFyaWFkaWMpIHtcbiAgICAgICAgICAgICAgICBwYXJzZU9wdGlvbnMuYXJyYXkucHVzaChjbWQpO1xuICAgICAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5kZWZhdWx0W2NtZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlT3B0aW9ucy5hbGlhc1tjbWRdID0gYWxpYXNlcztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJzZU9wdGlvbnM7XG4gICAgfVxuICAgIHBvc3RQcm9jZXNzUG9zaXRpb25hbHMoYXJndiwgcG9zaXRpb25hbE1hcCwgcGFyc2VPcHRpb25zLCB5YXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgeWFyZ3MuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0ID0gT2JqZWN0LmFzc2lnbihwYXJzZU9wdGlvbnMuZGVmYXVsdCwgb3B0aW9ucy5kZWZhdWx0KTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyc2VPcHRpb25zLmFsaWFzKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5hbGlhc1trZXldID0gKG9wdGlvbnMuYWxpYXNba2V5XSB8fCBbXSkuY29uY2F0KHBhcnNlT3B0aW9ucy5hbGlhc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmFycmF5ID0gb3B0aW9ucy5hcnJheS5jb25jYXQocGFyc2VPcHRpb25zLmFycmF5KTtcbiAgICAgICAgb3B0aW9ucy5jb25maWcgPSB7fTtcbiAgICAgICAgY29uc3QgdW5wYXJzZWQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25hbE1hcFtrZXldLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSlcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5rZXlba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdW5wYXJzZWQucHVzaChgLS0ke2tleX1gKTtcbiAgICAgICAgICAgICAgICB1bnBhcnNlZC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1bnBhcnNlZC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZmlndXJhdGlvbiwge1xuICAgICAgICAgICAgJ3BvcHVsYXRlLS0nOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuc2hpbS5QYXJzZXIuZGV0YWlsZWQodW5wYXJzZWQsIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZyxcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAocGFyc2VkLmVycm9yKSB7XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAuZmFpbChwYXJzZWQuZXJyb3IubWVzc2FnZSwgcGFyc2VkLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uYWxLZXlzID0gT2JqZWN0LmtleXMocG9zaXRpb25hbE1hcCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwb3NpdGlvbmFsTWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25hbEtleXMucHVzaCguLi5wYXJzZWQuYWxpYXNlc1trZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyc2VkLmFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25hbEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uYWxNYXBba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxNYXBba2V5XSA9IHBhcnNlZC5hcmd2W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0luQ29uZmlncyh5YXJncywga2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNEZWZhdWx0ZWQoeWFyZ3MsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd2LCBrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyc2VkLmFyZ3YsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGFyZ3Zba2V5XSkgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQuYXJndltrZXldKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IFtdLmNvbmNhdChhcmd2W2tleV0sIHBhcnNlZC5hcmd2W2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndltrZXldID0gcGFyc2VkLmFyZ3Zba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzRGVmYXVsdGVkKHlhcmdzLCBrZXkpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBkZWZhdWx0cyB9ID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0cywga2V5KSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHRzLCB0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShrZXkpKSk7XG4gICAgfVxuICAgIGlzSW5Db25maWdzKHlhcmdzLCBrZXkpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWdPYmplY3RzIH0gPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiAoY29uZmlnT2JqZWN0cy5zb21lKGMgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsIGtleSkpIHx8XG4gICAgICAgICAgICBjb25maWdPYmplY3RzLnNvbWUoYyA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYywgdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2Uoa2V5KSkpKTtcbiAgICB9XG4gICAgcnVuRGVmYXVsdEJ1aWxkZXJPbih5YXJncykge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdENvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFVwZGF0ZVVzYWdlKHlhcmdzKSkge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZFN0cmluZyA9IERFRkFVTFRfTUFSS0VSLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbClcbiAgICAgICAgICAgICAgICA/IHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGVmYXVsdENvbW1hbmQub3JpZ2luYWwucmVwbGFjZSgvXlteW1xcXTw+XSovLCAnJDAgJyk7XG4gICAgICAgICAgICB5YXJnc1xuICAgICAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgICAgIC5nZXRVc2FnZUluc3RhbmNlKClcbiAgICAgICAgICAgICAgICAudXNhZ2UoY29tbWFuZFN0cmluZywgdGhpcy5kZWZhdWx0Q29tbWFuZC5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVpbGRlciA9IHRoaXMuZGVmYXVsdENvbW1hbmQuYnVpbGRlcjtcbiAgICAgICAgaWYgKGlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc0NvbW1hbmRCdWlsZGVyRGVmaW5pdGlvbihidWlsZGVyKSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYnVpbGRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIHlhcmdzLm9wdGlvbihrZXksIGJ1aWxkZXJba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBtb2R1bGVOYW1lKG9iaikge1xuICAgICAgICBjb25zdCBtb2QgPSB3aGljaE1vZHVsZShvYmopO1xuICAgICAgICBpZiAoIW1vZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBuYW1lIGdpdmVuIGZvciBtb2R1bGU6ICR7dGhpcy5zaGltLmluc3BlY3Qob2JqKX1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZEZyb21GaWxlbmFtZShtb2QuZmlsZW5hbWUpO1xuICAgIH1cbiAgICBjb21tYW5kRnJvbUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoaW0ucGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgdGhpcy5zaGltLnBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuICAgIH1cbiAgICBleHRyYWN0RGVzYyh7IGRlc2NyaWJlLCBkZXNjcmlwdGlvbiwgZGVzYyB9KSB7XG4gICAgICAgIGZvciAoY29uc3QgdGVzdCBvZiBbZGVzY3JpYmUsIGRlc2NyaXB0aW9uLCBkZXNjXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJyB8fCB0ZXN0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHRlc3QsIHRydWUsIHRoaXMuc2hpbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmcmVlemUoKSB7XG4gICAgICAgIHRoaXMuZnJvemVucy5wdXNoKHtcbiAgICAgICAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgICAgICAgICAgYWxpYXNNYXA6IHRoaXMuYWxpYXNNYXAsXG4gICAgICAgICAgICBkZWZhdWx0Q29tbWFuZDogdGhpcy5kZWZhdWx0Q29tbWFuZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuZnJlZXplKCkge1xuICAgICAgICBjb25zdCBmcm96ZW4gPSB0aGlzLmZyb3plbnMucG9wKCk7XG4gICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKGZyb3plbiwgdW5kZWZpbmVkLCB0aGlzLnNoaW0pO1xuICAgICAgICAoe1xuICAgICAgICAgICAgaGFuZGxlcnM6IHRoaXMuaGFuZGxlcnMsXG4gICAgICAgICAgICBhbGlhc01hcDogdGhpcy5hbGlhc01hcCxcbiAgICAgICAgICAgIGRlZmF1bHRDb21tYW5kOiB0aGlzLmRlZmF1bHRDb21tYW5kLFxuICAgICAgICB9ID0gZnJvemVuKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5hbGlhc01hcCA9IHt9O1xuICAgICAgICB0aGlzLmRlZmF1bHRDb21tYW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlcXVpcmVDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmQodXNhZ2UsIHZhbGlkYXRpb24sIGdsb2JhbE1pZGRsZXdhcmUsIHNoaW0pIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmRJbnN0YW5jZSh1c2FnZSwgdmFsaWRhdGlvbiwgZ2xvYmFsTWlkZGxld2FyZSwgc2hpbSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24oYnVpbGRlcikge1xuICAgIHJldHVybiAodHlwZW9mIGJ1aWxkZXIgPT09ICdvYmplY3QnICYmXG4gICAgICAgICEhYnVpbGRlci5idWlsZGVyICYmXG4gICAgICAgIHR5cGVvZiBidWlsZGVyLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpO1xufVxuZnVuY3Rpb24gaXNDb21tYW5kQW5kQWxpYXNlcyhjbWQpIHtcbiAgICByZXR1cm4gY21kLmV2ZXJ5KGMgPT4gdHlwZW9mIGMgPT09ICdzdHJpbmcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2soYnVpbGRlcikge1xuICAgIHJldHVybiB0eXBlb2YgYnVpbGRlciA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyhidWlsZGVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBidWlsZGVyID09PSAnb2JqZWN0Jztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRIYW5kbGVyRGVmaW5pdGlvbihjbWQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNtZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY21kKTtcbn1cbiIsInZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn07XG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9ICh0aGlzICYmIHRoaXMuX19jbGFzc1ByaXZhdGVGaWVsZEdldCkgfHwgZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufTtcbnZhciBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBfWWFyZ3NJbnN0YW5jZV9jd2QsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBfWWFyZ3NJbnN0YW5jZV9kZWZhdWx0U2hvd0hpZGRlbk9wdCwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIF9ZYXJnc0luc3RhbmNlX2Zyb3plbnMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIF9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCwgX1lhcmdzSW5zdGFuY2VfcGtncywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgX1lhcmdzSW5zdGFuY2VfcmVjb21tZW5kQ29tbWFuZHMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbjtcbmltcG9ydCB7IGNvbW1hbmQgYXMgQ29tbWFuZCwgfSBmcm9tICcuL2NvbW1hbmQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIGFzc2VydFNpbmdsZUtleSwgb2JqZWN0S2V5cywgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4veWVycm9yLmpzJztcbmltcG9ydCB7IHVzYWdlIGFzIFVzYWdlIH0gZnJvbSAnLi91c2FnZS5qcyc7XG5pbXBvcnQgeyBhcmdzZXJ0IH0gZnJvbSAnLi9hcmdzZXJ0LmpzJztcbmltcG9ydCB7IGNvbXBsZXRpb24gYXMgQ29tcGxldGlvbiwgfSBmcm9tICcuL2NvbXBsZXRpb24uanMnO1xuaW1wb3J0IHsgdmFsaWRhdGlvbiBhcyBWYWxpZGF0aW9uLCB9IGZyb20gJy4vdmFsaWRhdGlvbi5qcyc7XG5pbXBvcnQgeyBvYmpGaWx0ZXIgfSBmcm9tICcuL3V0aWxzL29iai1maWx0ZXIuanMnO1xuaW1wb3J0IHsgYXBwbHlFeHRlbmRzIH0gZnJvbSAnLi91dGlscy9hcHBseS1leHRlbmRzLmpzJztcbmltcG9ydCB7IGFwcGx5TWlkZGxld2FyZSwgR2xvYmFsTWlkZGxld2FyZSwgfSBmcm9tICcuL21pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi91dGlscy9pcy1wcm9taXNlLmpzJztcbmltcG9ydCB7IG1heWJlQXN5bmNSZXN1bHQgfSBmcm9tICcuL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyc7XG5pbXBvcnQgc2V0QmxvY2tpbmcgZnJvbSAnLi91dGlscy9zZXQtYmxvY2tpbmcuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIFlhcmdzRmFjdG9yeShfc2hpbSkge1xuICAgIHJldHVybiAocHJvY2Vzc0FyZ3MgPSBbXSwgY3dkID0gX3NoaW0ucHJvY2Vzcy5jd2QoKSwgcGFyZW50UmVxdWlyZSkgPT4ge1xuICAgICAgICBjb25zdCB5YXJncyA9IG5ldyBZYXJnc0luc3RhbmNlKHByb2Nlc3NBcmdzLCBjd2QsIHBhcmVudFJlcXVpcmUsIF9zaGltKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHlhcmdzLCAnYXJndicsIHtcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5wYXJzZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB5YXJncy5oZWxwKCk7XG4gICAgICAgIHlhcmdzLnZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHlhcmdzO1xuICAgIH07XG59XG5jb25zdCBrQ29weURvdWJsZURhc2ggPSBTeW1ib2woJ2NvcHlEb3VibGVEYXNoJyk7XG5jb25zdCBrQ3JlYXRlTG9nZ2VyID0gU3ltYm9sKCdjb3B5RG91YmxlRGFzaCcpO1xuY29uc3Qga0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0ID0gU3ltYm9sKCdkZWxldGVGcm9tUGFyc2VySGludE9iamVjdCcpO1xuY29uc3Qga0VtaXRXYXJuaW5nID0gU3ltYm9sKCdlbWl0V2FybmluZycpO1xuY29uc3Qga0ZyZWV6ZSA9IFN5bWJvbCgnZnJlZXplJyk7XG5jb25zdCBrR2V0RG9sbGFyWmVybyA9IFN5bWJvbCgnZ2V0RG9sbGFyWmVybycpO1xuY29uc3Qga0dldFBhcnNlckNvbmZpZ3VyYXRpb24gPSBTeW1ib2woJ2dldFBhcnNlckNvbmZpZ3VyYXRpb24nKTtcbmNvbnN0IGtHZXRVc2FnZUNvbmZpZ3VyYXRpb24gPSBTeW1ib2woJ2dldFVzYWdlQ29uZmlndXJhdGlvbicpO1xuY29uc3Qga0d1ZXNzTG9jYWxlID0gU3ltYm9sKCdndWVzc0xvY2FsZScpO1xuY29uc3Qga0d1ZXNzVmVyc2lvbiA9IFN5bWJvbCgnZ3Vlc3NWZXJzaW9uJyk7XG5jb25zdCBrUGFyc2VQb3NpdGlvbmFsTnVtYmVycyA9IFN5bWJvbCgncGFyc2VQb3NpdGlvbmFsTnVtYmVycycpO1xuY29uc3Qga1BrZ1VwID0gU3ltYm9sKCdwa2dVcCcpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludEFycmF5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnRBcnJheScpO1xuY29uc3Qga1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeSA9IFN5bWJvbCgncG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5Jyk7XG5jb25zdCBrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnRBcnJheURpY3Rpb25hcnknKTtcbmNvbnN0IGtQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5ID0gU3ltYm9sKCdwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5Jyk7XG5jb25zdCBrU2FuaXRpemVLZXkgPSBTeW1ib2woJ3Nhbml0aXplS2V5Jyk7XG5jb25zdCBrU2V0S2V5ID0gU3ltYm9sKCdzZXRLZXknKTtcbmNvbnN0IGtVbmZyZWV6ZSA9IFN5bWJvbCgndW5mcmVlemUnKTtcbmNvbnN0IGtWYWxpZGF0ZUFzeW5jID0gU3ltYm9sKCd2YWxpZGF0ZUFzeW5jJyk7XG5jb25zdCBrR2V0Q29tbWFuZEluc3RhbmNlID0gU3ltYm9sKCdnZXRDb21tYW5kSW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRDb250ZXh0ID0gU3ltYm9sKCdnZXRDb250ZXh0Jyk7XG5jb25zdCBrR2V0SGFzT3V0cHV0ID0gU3ltYm9sKCdnZXRIYXNPdXRwdXQnKTtcbmNvbnN0IGtHZXRMb2dnZXJJbnN0YW5jZSA9IFN5bWJvbCgnZ2V0TG9nZ2VySW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRQYXJzZUNvbnRleHQgPSBTeW1ib2woJ2dldFBhcnNlQ29udGV4dCcpO1xuY29uc3Qga0dldFVzYWdlSW5zdGFuY2UgPSBTeW1ib2woJ2dldFVzYWdlSW5zdGFuY2UnKTtcbmNvbnN0IGtHZXRWYWxpZGF0aW9uSW5zdGFuY2UgPSBTeW1ib2woJ2dldFZhbGlkYXRpb25JbnN0YW5jZScpO1xuY29uc3Qga0hhc1BhcnNlQ2FsbGJhY2sgPSBTeW1ib2woJ2hhc1BhcnNlQ2FsbGJhY2snKTtcbmNvbnN0IGtJc0dsb2JhbENvbnRleHQgPSBTeW1ib2woJ2lzR2xvYmFsQ29udGV4dCcpO1xuY29uc3Qga1Bvc3RQcm9jZXNzID0gU3ltYm9sKCdwb3N0UHJvY2VzcycpO1xuY29uc3Qga1JlYmFzZSA9IFN5bWJvbCgncmViYXNlJyk7XG5jb25zdCBrUmVzZXQgPSBTeW1ib2woJ3Jlc2V0Jyk7XG5jb25zdCBrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMgPSBTeW1ib2woJ3J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzJyk7XG5jb25zdCBrUnVuVmFsaWRhdGlvbiA9IFN5bWJvbCgncnVuVmFsaWRhdGlvbicpO1xuY29uc3Qga1NldEhhc091dHB1dCA9IFN5bWJvbCgnc2V0SGFzT3V0cHV0Jyk7XG5jb25zdCBrVHJhY2tNYW51YWxseVNldEtleXMgPSBTeW1ib2woJ2tUcmFja01hbnVhbGx5U2V0S2V5cycpO1xuZXhwb3J0IGNsYXNzIFlhcmdzSW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb2Nlc3NBcmdzID0gW10sIGN3ZCwgcGFyZW50UmVxdWlyZSwgc2hpbSkge1xuICAgICAgICB0aGlzLmN1c3RvbVNjcmlwdE5hbWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29tbWFuZC5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY3dkLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LnNldCh0aGlzLCB7IGNvbW1hbmRzOiBbXSwgZnVsbENvbW1hbmRzOiBbXSB9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbi5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQuc2V0KHRoaXMsICdzaG93LWhpZGRlbicpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3Iuc2V0KHRoaXMsIG51bGwpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUuc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3Muc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3Muc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLnNldCh0aGlzLCBbXSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2dyb3Vwcy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQuc2V0KHRoaXMsIGZhbHNlKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfaGVscE9wdC5zZXQodGhpcywgbnVsbCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2lzR2xvYmFsQ29udGV4dC5zZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX2xvZ2dlci5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LnNldCh0aGlzLCAnJyk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcmVudFJlcXVpcmUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcGtncy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMuc2V0KHRoaXMsIHt9KTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3Muc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3NoaW0uc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3N0cmljdC5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcy5zZXQodGhpcywgZmFsc2UpO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLnNldCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIF9ZYXJnc0luc3RhbmNlX3VzYWdlLnNldCh0aGlzLCB2b2lkIDApO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZy5zZXQodGhpcywge30pO1xuICAgICAgICBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LnNldCh0aGlzLCBudWxsKTtcbiAgICAgICAgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbi5zZXQodGhpcywgdm9pZCAwKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBzaGltLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIHByb2Nlc3NBcmdzLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBjd2QsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBwYXJlbnRSZXF1aXJlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgbmV3IEdsb2JhbE1pZGRsZXdhcmUodGhpcyksIFwiZlwiKTtcbiAgICAgICAgdGhpcy4kMCA9IHRoaXNba0dldERvbGxhclplcm9dKCk7XG4gICAgICAgIHRoaXNba1Jlc2V0XSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIiksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuc2hvd0hpZGRlbk9wdCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIsIHRoaXNba0NyZWF0ZUxvZ2dlcl0oKSwgXCJmXCIpO1xuICAgIH1cbiAgICBhZGRIZWxwT3B0KG9wdCwgbXNnKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRIZWxwT3B0ID0gJ2hlbHAnO1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddJywgW29wdCwgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKSkge1xuICAgICAgICAgICAgdGhpc1trRGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHQgPT09IGZhbHNlICYmIG1zZyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBkZWZhdWx0SGVscE9wdCwgXCJmXCIpO1xuICAgICAgICB0aGlzLmJvb2xlYW4oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpLCBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyBoZWxwJykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaGVscChvcHQsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRIZWxwT3B0KG9wdCwgbXNnKTtcbiAgICB9XG4gICAgYWRkU2hvd0hpZGRlbk9wdChvcHQsIG1zZykge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddJywgW29wdCwgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChvcHQgPT09IGZhbHNlICYmIG1zZyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGNvbnN0IHNob3dIaWRkZW5PcHQgPSB0eXBlb2Ygb3B0ID09PSAnc3RyaW5nJyA/IG9wdCA6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQsIFwiZlwiKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKHNob3dIaWRkZW5PcHQpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlKHNob3dIaWRkZW5PcHQsIG1zZyB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVmZXJZMThuTG9va3VwKCdTaG93IGhpZGRlbiBvcHRpb25zJykpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5zaG93SGlkZGVuT3B0ID0gc2hvd0hpZGRlbk9wdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dIaWRkZW4ob3B0LCBtc2cpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkU2hvd0hpZGRlbk9wdChvcHQsIG1zZyk7XG4gICAgfVxuICAgIGFsaWFzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5XSh0aGlzLmFsaWFzLmJpbmQodGhpcyksICdhbGlhcycsIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXJyYXkoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnYXJyYXknLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYm9vbGVhbihrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdib29sZWFuJywga2V5cyk7XG4gICAgICAgIHRoaXNba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNoZWNrKGYsIGdsb2JhbCkge1xuICAgICAgICBhcmdzZXJ0KCc8ZnVuY3Rpb24+IFtib29sZWFuXScsIFtmLCBnbG9iYWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlKChhcmd2LCBfeWFyZ3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXliZUFzeW5jUmVzdWx0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZihhcmd2LCBfeWFyZ3MuZ2V0T3B0aW9ucygpKTtcbiAgICAgICAgICAgIH0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS55MThuLl9fKCdBcmd1bWVudCBjaGVjayBmYWlsZWQ6ICVzJywgZi50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mYWlsKHJlc3VsdC50b1N0cmluZygpLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZmFpbChlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogZXJyLnRvU3RyaW5nKCksIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZmFsc2UsIGdsb2JhbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjaG9pY2VzKGtleSwgdmFsdWUpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSwgJ2Nob2ljZXMnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvZXJjZShrZXlzLCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0fHN0cmluZ3xhcnJheT4gW2Z1bmN0aW9uXScsIFtrZXlzLCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJ2NvZXJjZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2VyY2Uoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGtleXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2VyY2Uoa2V5LCBrZXlzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcignY29lcmNlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5c10gPSB0cnVlO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5hZGRDb2VyY2VNaWRkbGV3YXJlKChhcmd2LCB5YXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IGFsaWFzZXM7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRDb2VyY2UgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwga2V5cyk7XG4gICAgICAgICAgICBpZiAoIXNob3VsZENvZXJjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1heWJlQXN5bmNSZXN1bHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFsaWFzZXMgPSB5YXJncy5nZXRBbGlhc2VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGFyZ3Zba2V5c10pO1xuICAgICAgICAgICAgfSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGFyZ3Zba2V5c10gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBBbGlhc2VkID0geWFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbJ3N0cmlwLWFsaWFzZWQnXTtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXNlc1trZXlzXSAmJiBzdHJpcEFsaWFzZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzW2tleXNdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W2FsaWFzXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbmZsaWN0cyhrZXkxLCBrZXkyKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbc3RyaW5nfGFycmF5XScsIFtrZXkxLCBrZXkyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLmNvbmZsaWN0cyhrZXkxLCBrZXkyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbmZpZyhrZXkgPSAnY29uZmlnJywgbXNnLCBwYXJzZUZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dJywgW2tleSwgbXNnLCBwYXJzZUZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICBrZXkgPSBhcHBseUV4dGVuZHMoa2V5LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpLCB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpWydkZWVwLW1lcmdlLWNvbmZpZyddIHx8IGZhbHNlLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzID0gKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgfHwgW10pLmNvbmNhdChrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHBhcnNlRm4gPSBtc2c7XG4gICAgICAgICAgICBtc2cgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXNjcmliZShrZXksIG1zZyB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZGVmZXJZMThuTG9va3VwKCdQYXRoIHRvIEpTT04gY29uZmlnIGZpbGUnKSk7XG4gICAgICAgIChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ1trXSA9IHBhcnNlRm4gfHwgdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjb21wbGV0aW9uKGNtZCwgZGVzYywgZm4pIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10gW3N0cmluZ3xib29sZWFufGZ1bmN0aW9uXSBbZnVuY3Rpb25dJywgW2NtZCwgZGVzYywgZm5dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBmbiA9IGRlc2M7XG4gICAgICAgICAgICBkZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIGNtZCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikgfHwgJ2NvbXBsZXRpb24nLCBcImZcIik7XG4gICAgICAgIGlmICghZGVzYyAmJiBkZXNjICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVzYyA9ICdnZW5lcmF0ZSBjb21wbGV0aW9uIHNjcmlwdCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSwgZGVzYyk7XG4gICAgICAgIGlmIChmbilcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24oZm4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY29tbWFuZChjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZCkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfGFycmF5fG9iamVjdD4gW3N0cmluZ3xib29sZWFuXSBbZnVuY3Rpb258b2JqZWN0XSBbZnVuY3Rpb25dIFthcnJheV0gW2Jvb2xlYW58c3RyaW5nXScsIFtjbWQsIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyLCBtaWRkbGV3YXJlcywgZGVwcmVjYXRlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5hZGRIYW5kbGVyKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbW1hbmRzKGNtZCwgZGVzY3JpcHRpb24sIGJ1aWxkZXIsIGhhbmRsZXIsIG1pZGRsZXdhcmVzLCBkZXByZWNhdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmQoY21kLCBkZXNjcmlwdGlvbiwgYnVpbGRlciwgaGFuZGxlciwgbWlkZGxld2FyZXMsIGRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgICBjb21tYW5kRGlyKGRpciwgb3B0cykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiBbb2JqZWN0XScsIFtkaXIsIG9wdHNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVxID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlLCBcImZcIikgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucmVxdWlyZTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuYWRkRGlyZWN0b3J5KGRpciwgcmVxLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRDYWxsZXJGaWxlKCksIG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY291bnQoa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnY291bnQnLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVmYXVsdChrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFsqXSBbc3RyaW5nXScsIFtrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb25dLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKGRlZmF1bHREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgYXNzZXJ0U2luZ2xlS2V5KGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW2tleV0gPSBkZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXNzZXJ0U2luZ2xlS2V5KGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSlcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSA9XG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mdW5jdGlvbkRlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuY2FsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5kZWZhdWx0LmJpbmQodGhpcyksICdkZWZhdWx0Jywga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZWZhdWx0cyhrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdChrZXksIHZhbHVlLCBkZWZhdWx0RGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICBkZW1hbmRDb21tYW5kKG1pbiA9IDEsIG1heCwgbWluTXNnLCBtYXhNc2cpIHtcbiAgICAgICAgYXJnc2VydCgnW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdJywgW21pbiwgbWF4LCBtaW5Nc2csIG1heE1zZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIG1heCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG1pbk1zZyA9IG1heDtcbiAgICAgICAgICAgIG1heCA9IEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2xvYmFsKCdfJywgZmFsc2UpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl8gPSB7XG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXgsXG4gICAgICAgICAgICBtaW5Nc2csXG4gICAgICAgICAgICBtYXhNc2csXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZW1hbmQoa2V5cywgbWF4LCBtc2cpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF4KSkge1xuICAgICAgICAgICAgbWF4LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIG1zZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1heCA9IEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBtYXggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtc2cgPSBtYXg7XG4gICAgICAgICAgICBtYXggPSBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIHRoaXMuZGVtYW5kQ29tbWFuZChrZXlzLCBtYXgsIG1zZywgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIHRydWUsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXksIG1zZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVtYW5kT3B0aW9uKGtleXMsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtc2cgPT09IHRydWUgfHwgdHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZE9wdGlvbihrZXlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVtYW5kT3B0aW9uKGtleXMsIG1zZykge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ10nLCBba2V5cywgbXNnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5kZW1hbmRPcHRpb24uYmluZCh0aGlzKSwgJ2RlbWFuZGVkT3B0aW9ucycsIGtleXMsIG1zZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXByZWNhdGVPcHRpb24ob3B0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+IFtzdHJpbmd8Ym9vbGVhbl0nLCBbb3B0aW9uLCBtZXNzYWdlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zW29wdGlvbl0gPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVzY3JpYmUoa2V5cywgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdHxzdHJpbmd8YXJyYXk+IFtzdHJpbmddJywgW2tleXMsIGRlc2NyaXB0aW9uXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1NldEtleV0oa2V5cywgdHJ1ZSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5kZXNjcmliZShrZXlzLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXRlY3RMb2NhbGUoZGV0ZWN0KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxib29sZWFuPicsIFtkZXRlY3RdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGRldGVjdCwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZW52KHByZWZpeCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGJvb2xlYW5dJywgW3ByZWZpeF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAocHJlZml4ID09PSBmYWxzZSlcbiAgICAgICAgICAgIGRlbGV0ZSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5lbnZQcmVmaXg7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmVudlByZWZpeCA9IHByZWZpeCB8fCAnJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGVwaWxvZ3VlKG1zZykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPicsIFttc2ddLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmVwaWxvZyhtc2cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXBpbG9nKG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5lcGlsb2d1ZShtc2cpO1xuICAgIH1cbiAgICBleGFtcGxlKGNtZCwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheT4gW3N0cmluZ10nLCBbY21kLCBkZXNjcmlwdGlvbl0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbWQpKSB7XG4gICAgICAgICAgICBjbWQuZm9yRWFjaChleGFtcGxlUGFyYW1zID0+IHRoaXMuZXhhbXBsZSguLi5leGFtcGxlUGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZXhhbXBsZShjbWQsIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXhpdChjb2RlLCBlcnIpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIGVyciwgXCJmXCIpO1xuICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgIH1cbiAgICBleGl0UHJvY2VzcyhlbmFibGVkID0gdHJ1ZSkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBlbmFibGVkLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmYWlsKGYpIHtcbiAgICAgICAgYXJnc2VydCgnPGZ1bmN0aW9ufGJvb2xlYW4+JywgW2ZdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnYm9vbGVhbicgJiYgZiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7XG4gICAgICAgIH1cbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWxGbihmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldEFsaWFzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlZCA/IHRoaXMucGFyc2VkLmFsaWFzZXMgOiB7fTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0Q29tcGxldGlvbihhcmdzLCBkb25lKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheT4gW2Z1bmN0aW9uXScsIFthcmdzLCBkb25lXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmICghZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZXRDb21wbGV0aW9uKGFyZ3MsIChlcnIsIGNvbXBsZXRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wbGV0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5nZXRDb21wbGV0aW9uKGFyZ3MsIGRvbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldERlbWFuZGVkT3B0aW9ucygpIHtcbiAgICAgICAgYXJnc2VydChbXSwgMCk7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZW1hbmRlZE9wdGlvbnM7XG4gICAgfVxuICAgIGdldERlbWFuZGVkQ29tbWFuZHMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVtYW5kZWRDb21tYW5kcztcbiAgICB9XG4gICAgZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSB7XG4gICAgICAgIGFyZ3NlcnQoW10sIDApO1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuZGVwcmVjYXRlZE9wdGlvbnM7XG4gICAgfVxuICAgIGdldERldGVjdExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlLCBcImZcIik7XG4gICAgfVxuICAgIGdldEV4aXRQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRHcm91cHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ByZXNlcnZlZEdyb3VwcywgXCJmXCIpKTtcbiAgICB9XG4gICAgZ2V0SGVscCgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGFzQ2FjaGVkSGVscE1lc3NhZ2UoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlID0gdGhpc1trUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UocGFyc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyUmVzcG9uc2UgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShidWlsZGVyUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJSZXNwb25zZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5oZWxwKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuaGVscCgpKTtcbiAgICB9XG4gICAgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRTdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpO1xuICAgIH1cbiAgICBnZXRTdHJpY3RDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKTtcbiAgICB9XG4gICAgZ2V0U3RyaWN0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpO1xuICAgIH1cbiAgICBnbG9iYWwoZ2xvYmFscywgZ2xvYmFsKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8YXJyYXk+IFtib29sZWFuXScsIFtnbG9iYWxzLCBnbG9iYWxdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgZ2xvYmFscyA9IFtdLmNvbmNhdChnbG9iYWxzKTtcbiAgICAgICAgaWYgKGdsb2JhbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwuZmlsdGVyKGwgPT4gZ2xvYmFscy5pbmRleE9mKGwpID09PSAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxzLmZvckVhY2goZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5sb2NhbC5pbmNsdWRlcyhnKSlcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikubG9jYWwucHVzaChnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBncm91cChvcHRzLCBncm91cE5hbWUpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZ3xhcnJheT4gPHN0cmluZz4nLCBbb3B0cywgZ3JvdXBOYW1lXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKVtncm91cE5hbWVdIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSkge1xuICAgICAgICAgICAgZGVsZXRlIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWVuID0ge307XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXSA9IChleGlzdGluZyB8fCBbXSkuY29uY2F0KG9wdHMpLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlZW5ba2V5XSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gKHNlZW5ba2V5XSA9IHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGhpZGUoa2V5KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmc+JywgW2tleV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2goa2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGltcGxpZXMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldJywgW2tleSwgdmFsdWVdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuaW1wbGllcyhrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGxvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10nLCBbbG9jYWxlXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChsb2NhbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1trR3Vlc3NMb2NhbGVdKCk7XG4gICAgICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5nZXRMb2NhbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikueTE4bi5zZXRMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1pZGRsZXdhcmUoY2FsbGJhY2ssIGFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5hZGRNaWRkbGV3YXJlKGNhbGxiYWNrLCAhIWFwcGx5QmVmb3JlVmFsaWRhdGlvbiwgZ2xvYmFsKTtcbiAgICB9XG4gICAgbmFyZ3Moa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdHxhcnJheT4gW251bWJlcl0nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnldKHRoaXMubmFyZ3MuYmluZCh0aGlzKSwgJ25hcmcnLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG5vcm1hbGl6ZShrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdub3JtYWxpemUnLCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG51bWJlcihrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdudW1iZXInLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9uKGtleSwgb3B0KSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbb2JqZWN0XScsIFtrZXksIG9wdF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgb3B0ID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW2tUcmFja01hbnVhbGx5U2V0S2V5c10oa2V5KTtcbiAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSAmJiAoa2V5ID09PSAndmVyc2lvbicgfHwgKG9wdCA9PT0gbnVsbCB8fCBvcHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdC5hbGlhcykgPT09ICd2ZXJzaW9uJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tFbWl0V2FybmluZ10oW1xuICAgICAgICAgICAgICAgICAgICAnXCJ2ZXJzaW9uXCIgaXMgYSByZXNlcnZlZCB3b3JkLicsXG4gICAgICAgICAgICAgICAgICAgICdQbGVhc2UgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6JyxcbiAgICAgICAgICAgICAgICAgICAgJy0gRGlzYWJsZSB2ZXJzaW9uIHdpdGggYHlhcmdzLnZlcnNpb24oZmFsc2UpYCBpZiB1c2luZyBcInZlcnNpb25cIiBhcyBhbiBvcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnLSBVc2UgdGhlIGJ1aWx0LWluIGB5YXJncy52ZXJzaW9uYCBtZXRob2QgaW5zdGVhZCAoaWYgYXBwbGljYWJsZSknLFxuICAgICAgICAgICAgICAgICAgICAnLSBVc2UgYSBkaWZmZXJlbnQgb3B0aW9uIGtleScsXG4gICAgICAgICAgICAgICAgICAgICdodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksIHVuZGVmaW5lZCwgJ3ZlcnNpb25XYXJuaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5rZXlba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWxpYXMoa2V5LCBvcHQuYWxpYXMpO1xuICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlID0gb3B0LmRlcHJlY2F0ZSB8fCBvcHQuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgIGlmIChkZXByZWNhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcHJlY2F0ZU9wdGlvbihrZXksIGRlcHJlY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZW1hbmQgPSBvcHQuZGVtYW5kIHx8IG9wdC5yZXF1aXJlZCB8fCBvcHQucmVxdWlyZTtcbiAgICAgICAgICAgIGlmIChkZW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbWFuZChrZXksIGRlbWFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmRlbWFuZE9wdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVtYW5kT3B0aW9uKGtleSwgdHlwZW9mIG9wdC5kZW1hbmRPcHRpb24gPT09ICdzdHJpbmcnID8gb3B0LmRlbWFuZE9wdGlvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvbmZsaWN0cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmxpY3RzKGtleSwgb3B0LmNvbmZsaWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIG9wdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdChrZXksIG9wdC5kZWZhdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuaW1wbGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBsaWVzKGtleSwgb3B0LmltcGxpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5uYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXJncyhrZXksIG9wdC5uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvbmZpZykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnKGtleSwgb3B0LmNvbmZpZ1BhcnNlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNob2ljZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNob2ljZXMoa2V5LCBvcHQuY2hvaWNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvZXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29lcmNlKGtleSwgb3B0LmNvZXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cChrZXksIG9wdC5ncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmJvb2xlYW4gfHwgb3B0LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbihvcHQuYWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5hcnJheSB8fCBvcHQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0LmFsaWFzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFycmF5KG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0Lm51bWJlciB8fCBvcHQudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm51bWJlcihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyKG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LnN0cmluZyB8fCBvcHQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHQuYWxpYXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyaW5nKG9wdC5hbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmNvdW50IHx8IG9wdC50eXBlID09PSAnY291bnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHQuZ2xvYmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbChrZXksIG9wdC5nbG9iYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5kZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSA9IG9wdC5kZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LnNraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwVmFsaWRhdGlvbihrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVzYyA9IG9wdC5kZXNjcmliZSB8fCBvcHQuZGVzY3JpcHRpb24gfHwgb3B0LmRlc2M7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuZ2V0RGVzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZXNjcmlwdGlvbnMsIGtleSkgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGVzYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaWJlKGtleSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5yZXF1aXJlc0FyZykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZXNBcmcoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgb3B0aW9ucyhrZXksIG9wdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb24oa2V5LCBvcHQpO1xuICAgIH1cbiAgICBwYXJzZShhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmd8YXJyYXldIFtmdW5jdGlvbnxib29sZWFufG9iamVjdF0gW2Z1bmN0aW9uXScsIFthcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba0ZyZWV6ZV0oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgYXJncyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MsIFwiZlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNob3J0Q2lyY3VpdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBzaG9ydENpcmN1aXQsIFwiZlwiKTtcbiAgICAgICAgICAgIHNob3J0Q2lyY3VpdCA9IF9wYXJzZUZuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvcnRDaXJjdWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIHNob3J0Q2lyY3VpdCwgXCJmXCIpO1xuICAgICAgICAgICAgc2hvcnRDaXJjdWl0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaG9ydENpcmN1aXQpXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBhcmdzLCBcImZcIik7XG4gICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShhcmdzLCAhIXNob3J0Q2lyY3VpdCk7XG4gICAgICAgIGNvbnN0IHRtcFBhcnNlZCA9IHRoaXMucGFyc2VkO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWRcbiAgICAgICAgICAgICAgICAudGhlbihhcmd2ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpLmNhbGwodGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSwgYXJndiwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKShlcnIsIHRoaXMucGFyc2VkLmFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzW2tVbmZyZWV6ZV0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZCA9IHRtcFBhcnNlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpKVxuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiwgXCJmXCIpLmNhbGwodGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSwgcGFyc2VkLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpKTtcbiAgICAgICAgICAgIHRoaXNba1VuZnJlZXplXSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0bXBQYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gICAgcGFyc2VBc3luYyhhcmdzLCBzaG9ydENpcmN1aXQsIF9wYXJzZUZuKSB7XG4gICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHRoaXMucGFyc2UoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbik7XG4gICAgICAgIHJldHVybiAhaXNQcm9taXNlKG1heWJlUHJvbWlzZSlcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSlcbiAgICAgICAgICAgIDogbWF5YmVQcm9taXNlO1xuICAgIH1cbiAgICBwYXJzZVN5bmMoYXJncywgc2hvcnRDaXJjdWl0LCBfcGFyc2VGbikge1xuICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLnBhcnNlKGFyZ3MsIHNob3J0Q2lyY3VpdCwgX3BhcnNlRm4pO1xuICAgICAgICBpZiAoaXNQcm9taXNlKG1heWJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJy5wYXJzZVN5bmMoKSBtdXN0IG5vdCBiZSB1c2VkIHdpdGggYXN5bmNocm9ub3VzIGJ1aWxkZXJzLCBoYW5kbGVycywgb3IgbWlkZGxld2FyZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZVByb21pc2U7XG4gICAgfVxuICAgIHBhcnNlckNvbmZpZ3VyYXRpb24oY29uZmlnKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxvYmplY3Q+JywgW2NvbmZpZ10sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZywgY29uZmlnLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwa2dDb25mKGtleSwgcm9vdFBhdGgpIHtcbiAgICAgICAgYXJnc2VydCgnPHN0cmluZz4gW3N0cmluZ10nLCBba2V5LCByb290UGF0aF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBsZXQgY29uZiA9IG51bGw7XG4gICAgICAgIGNvbnN0IG9iaiA9IHRoaXNba1BrZ1VwXShyb290UGF0aCB8fCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2N3ZCwgXCJmXCIpKTtcbiAgICAgICAgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbmYgPSBhcHBseUV4dGVuZHMob2JqW2tleV0sIHJvb3RQYXRoIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBcImZcIiksIHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ2RlZXAtbWVyZ2UtY29uZmlnJ10gfHwgZmFsc2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMgPSAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyB8fCBbXSkuY29uY2F0KGNvbmYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwb3NpdGlvbmFsKGtleSwgb3B0cykge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nPiA8b2JqZWN0PicsIFtrZXksIG9wdHNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkT3B0cyA9IFtcbiAgICAgICAgICAgICdkZWZhdWx0JyxcbiAgICAgICAgICAgICdkZWZhdWx0RGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2ltcGxpZXMnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnY2hvaWNlcycsXG4gICAgICAgICAgICAnY29uZmxpY3RzJyxcbiAgICAgICAgICAgICdjb2VyY2UnLFxuICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICAgJ2Rlc2NyaWJlJyxcbiAgICAgICAgICAgICdkZXNjJyxcbiAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAnYWxpYXMnLFxuICAgICAgICBdO1xuICAgICAgICBvcHRzID0gb2JqRmlsdGVyKG9wdHMsIChrLCB2KSA9PiB7XG4gICAgICAgICAgICBpZiAoayA9PT0gJ3R5cGUnICYmICFbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddLmluY2x1ZGVzKHYpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRPcHRzLmluY2x1ZGVzKGspO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZnVsbENvbW1hbmQgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbnRleHQsIFwiZlwiKS5mdWxsQ29tbWFuZHNbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb250ZXh0LCBcImZcIikuZnVsbENvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBwYXJzZU9wdGlvbnMgPSBmdWxsQ29tbWFuZFxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhmdWxsQ29tbWFuZClcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGFycmF5OiBbXSxcbiAgICAgICAgICAgICAgICBhbGlhczoge30sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge30sXG4gICAgICAgICAgICAgICAgZGVtYW5kOiB7fSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIG9iamVjdEtleXMocGFyc2VPcHRpb25zKS5mb3JFYWNoKHBrID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlT3B0aW9uID0gcGFyc2VPcHRpb25zW3BrXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlT3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZU9wdGlvbi5pbmRleE9mKGtleSkgIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBvcHRzW3BrXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VPcHRpb25ba2V5XSAmJiAhKHBrIGluIG9wdHMpKVxuICAgICAgICAgICAgICAgICAgICBvcHRzW3BrXSA9IHBhcnNlT3B0aW9uW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyb3VwKGtleSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbihrZXksIG9wdHMpO1xuICAgIH1cbiAgICByZWNvbW1lbmRDb21tYW5kcyhyZWNvbW1lbmQgPSB0cnVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtyZWNvbW1lbmRdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcywgcmVjb21tZW5kLCBcImZcIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXF1aXJlZChrZXlzLCBtYXgsIG1zZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW1hbmQoa2V5cywgbWF4LCBtc2cpO1xuICAgIH1cbiAgICByZXF1aXJlKGtleXMsIG1heCwgbXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbWFuZChrZXlzLCBtYXgsIG1zZyk7XG4gICAgfVxuICAgIHJlcXVpcmVzQXJnKGtleXMpIHtcbiAgICAgICAgYXJnc2VydCgnPGFycmF5fHN0cmluZ3xvYmplY3Q+IFtudW1iZXJdJywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJyAmJiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5uYXJnW2tleXNdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeV0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLCAnbmFyZycsIGtleXMsIE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dDb21wbGV0aW9uU2NyaXB0KCQwLCBjbWQpIHtcbiAgICAgICAgYXJnc2VydCgnW3N0cmluZ10gW3N0cmluZ10nLCBbJDAsIGNtZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICAkMCA9ICQwIHx8IHRoaXMuJDA7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCBcImZcIikubG9nKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgXCJmXCIpLmdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCgkMCwgY21kIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSB8fCAnY29tcGxldGlvbicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNob3dIZWxwKGxldmVsKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tzdHJpbmd8ZnVuY3Rpb25dJywgW2xldmVsXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0LCB0cnVlLCBcImZcIik7XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZSA9IHRoaXNba1J1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3Byb2Nlc3NBcmdzLCBcImZcIiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHBhcnNlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5zaG93SGVscChsZXZlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWlsZGVyUmVzcG9uc2UgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShidWlsZGVyUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgYnVpbGRlclJlc3BvbnNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHAobGV2ZWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5zaG93SGVscChsZXZlbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzY3JpcHROYW1lKHNjcmlwdE5hbWUpIHtcbiAgICAgICAgdGhpcy5jdXN0b21TY3JpcHROYW1lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4kMCA9IHNjcmlwdE5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93SGVscE9uRmFpbChlbmFibGVkLCBtZXNzYWdlKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFufHN0cmluZ10gW3N0cmluZ10nLCBbZW5hYmxlZCwgbWVzc2FnZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd0hlbHBPbkZhaWwoZW5hYmxlZCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzaG93VmVyc2lvbihsZXZlbCkge1xuICAgICAgICBhcmdzZXJ0KCdbc3RyaW5nfGZ1bmN0aW9uXScsIFtsZXZlbF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd1ZlcnNpb24obGV2ZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2tpcFZhbGlkYXRpb24oa2V5cykge1xuICAgICAgICBhcmdzZXJ0KCc8YXJyYXl8c3RyaW5nPicsIFtrZXlzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludEFycmF5XSgnc2tpcFZhbGlkYXRpb24nLCBrZXlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmljdChlbmFibGVkKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtlbmFibGVkXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBlbmFibGVkICE9PSBmYWxzZSwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RyaWN0Q29tbWFuZHMoZW5hYmxlZCkge1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbl0nLCBbZW5hYmxlZF0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzLCBlbmFibGVkICE9PSBmYWxzZSwgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RyaWN0T3B0aW9ucyhlbmFibGVkKSB7XG4gICAgICAgIGFyZ3NlcnQoJ1tib29sZWFuXScsIFtlbmFibGVkXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgZW5hYmxlZCAhPT0gZmFsc2UsIFwiZlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0cmluZyhrZXlzKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxhcnJheXxzdHJpbmc+JywgW2tleXNdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKCdzdHJpbmcnLCBrZXlzKTtcbiAgICAgICAgdGhpc1trVHJhY2tNYW51YWxseVNldEtleXNdKGtleXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGVybWluYWxXaWR0aCgpIHtcbiAgICAgICAgYXJnc2VydChbXSwgMCk7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnM7XG4gICAgfVxuICAgIHVwZGF0ZUxvY2FsZShvYmopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RyaW5ncyhvYmopO1xuICAgIH1cbiAgICB1cGRhdGVTdHJpbmdzKG9iaikge1xuICAgICAgICBhcmdzZXJ0KCc8b2JqZWN0PicsIFtvYmpdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKG9iaik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1c2FnZShtc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXScsIFttc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChtc2csIG51bGwsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIGlmICgobXNnIHx8ICcnKS5tYXRjaCgvXlxcJDAoIHwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZChtc2csIGRlc2NyaXB0aW9uLCBidWlsZGVyLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoJy51c2FnZSgpIGRlc2NyaXB0aW9uIG11c3Qgc3RhcnQgd2l0aCAkMCBpZiBiZWluZyB1c2VkIGFzIGFsaWFzIGZvciAuY29tbWFuZCgpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudXNhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVzYWdlQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICAgICAgYXJnc2VydCgnPG9iamVjdD4nLCBbY29uZmlnXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWcsIGNvbmZpZywgXCJmXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmVyc2lvbihvcHQsIG1zZywgdmVyKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWZXJzaW9uT3B0ID0gJ3ZlcnNpb24nO1xuICAgICAgICBhcmdzZXJ0KCdbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddJywgW29wdCwgbXNnLCB2ZXJdLCBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKSB7XG4gICAgICAgICAgICB0aGlzW2tEZWxldGVGcm9tUGFyc2VySGludE9iamVjdF0oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0LCBcImZcIikpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLnZlcnNpb24odW5kZWZpbmVkKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB2ZXIgPSB0aGlzW2tHdWVzc1ZlcnNpb25dKCk7XG4gICAgICAgICAgICBvcHQgPSBkZWZhdWx0VmVyc2lvbk9wdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAob3B0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmVyID0gb3B0O1xuICAgICAgICAgICAgb3B0ID0gZGVmYXVsdFZlcnNpb25PcHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdmVyID0gbXNnO1xuICAgICAgICAgICAgbXNnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBkZWZhdWx0VmVyc2lvbk9wdCwgXCJmXCIpO1xuICAgICAgICBtc2cgPSBtc2cgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmRlZmVyWTE4bkxvb2t1cCgnU2hvdyB2ZXJzaW9uIG51bWJlcicpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikudmVyc2lvbih2ZXIgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5ib29sZWFuKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZlcnNpb25PcHQsIFwiZlwiKSwgbXNnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHdyYXAoY29scykge1xuICAgICAgICBhcmdzZXJ0KCc8bnVtYmVyfG51bGx8dW5kZWZpbmVkPicsIFtjb2xzXSwgYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS53cmFwKGNvbHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgWyhfWWFyZ3NJbnN0YW5jZV9jb21tYW5kID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY3dkID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfY29udGV4dCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0ID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2dyb3VwcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9sb2dnZXIgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9wa2dzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3NoaW0gPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3QgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcyA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMgPSBuZXcgV2Vha01hcCgpLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnID0gbmV3IFdlYWtNYXAoKSwgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCA9IG5ldyBXZWFrTWFwKCksIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24gPSBuZXcgV2Vha01hcCgpLCBrQ29weURvdWJsZURhc2gpXShhcmd2KSB7XG4gICAgICAgIGlmICghYXJndi5fIHx8ICFhcmd2WyctLSddKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIGFyZ3YuXy5wdXNoLmFwcGx5KGFyZ3YuXywgYXJndlsnLS0nXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgYXJndlsnLS0nXTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2VycikgeyB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba0NyZWF0ZUxvZ2dlcl0oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2c6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzW2tIYXNQYXJzZUNhbGxiYWNrXSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBcImZcIikgKyAnXFxuJywgXCJmXCIpO1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgYXJncy5qb2luKCcgJyksIFwiZlwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNba0hhc1BhcnNlQ2FsbGJhY2tdKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIHRydWUsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3V0cHV0LCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgXCJmXCIpICsgJ1xcbicsIFwiZlwiKTtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSArIGFyZ3Muam9pbignICcpLCBcImZcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBba0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0XShvcHRpb25LZXkpIHtcbiAgICAgICAgb2JqZWN0S2V5cyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSkuZm9yRWFjaCgoaGludEtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCgoa2V5KSA9PiBrZXkgPT09ICdjb25maWdPYmplY3RzJykoaGludEtleSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaGludCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW2hpbnRLZXldO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGludCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGludC5pbmNsdWRlcyhvcHRpb25LZXkpKVxuICAgICAgICAgICAgICAgICAgICBoaW50LnNwbGljZShoaW50LmluZGV4T2Yob3B0aW9uS2V5KSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgaGludCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGludFtvcHRpb25LZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKVtvcHRpb25LZXldO1xuICAgIH1cbiAgICBba0VtaXRXYXJuaW5nXSh3YXJuaW5nLCB0eXBlLCBkZWR1cGxpY2F0aW9uSWQpIHtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgXCJmXCIpW2RlZHVwbGljYXRpb25JZF0pIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSk7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2VtaXR0ZWRXYXJuaW5ncywgXCJmXCIpW2RlZHVwbGljYXRpb25JZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtrRnJlZXplXSgpIHtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zLCBcImZcIikucHVzaCh7XG4gICAgICAgICAgICBvcHRpb25zOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKSxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ09iamVjdHMuc2xpY2UoMCksXG4gICAgICAgICAgICBleGl0UHJvY2VzczogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpLFxuICAgICAgICAgICAgZ3JvdXBzOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dyb3VwcywgXCJmXCIpLFxuICAgICAgICAgICAgc3RyaWN0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3N0cmljdCwgXCJmXCIpLFxuICAgICAgICAgICAgc3RyaWN0Q29tbWFuZHM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKSxcbiAgICAgICAgICAgIHN0cmljdE9wdGlvbnM6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucywgXCJmXCIpLFxuICAgICAgICAgICAgY29tcGxldGlvbkNvbW1hbmQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSxcbiAgICAgICAgICAgIG91dHB1dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIFwiZlwiKSxcbiAgICAgICAgICAgIGV4aXRFcnJvcjogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIFwiZlwiKSxcbiAgICAgICAgICAgIGhhc091dHB1dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKSxcbiAgICAgICAgICAgIHBhcnNlZDogdGhpcy5wYXJzZWQsXG4gICAgICAgICAgICBwYXJzZUZuOiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKSxcbiAgICAgICAgICAgIHBhcnNlQ29udGV4dDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQsIFwiZlwiKSxcbiAgICAgICAgfSk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS5mcmVlemUoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikuZnJlZXplKCk7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5mcmVlemUoKTtcbiAgICB9XG4gICAgW2tHZXREb2xsYXJaZXJvXSgpIHtcbiAgICAgICAgbGV0ICQwID0gJyc7XG4gICAgICAgIGxldCBkZWZhdWx0JDA7XG4gICAgICAgIGlmICgvXFxiKG5vZGV8aW9qc3xlbGVjdHJvbikoXFwuZXhlKT8kLy50ZXN0KF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnByb2Nlc3MuYXJndigpWzBdKSkge1xuICAgICAgICAgICAgZGVmYXVsdCQwID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMSwgMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0JDAgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgwLCAxKTtcbiAgICAgICAgfVxuICAgICAgICAkMCA9IGRlZmF1bHQkMFxuICAgICAgICAgICAgLm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzW2tSZWJhc2VdKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY3dkLCBcImZcIiksIHgpO1xuICAgICAgICAgICAgcmV0dXJuIHgubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykgJiYgYi5sZW5ndGggPCB4Lmxlbmd0aCA/IGIgOiB4O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmdldEVudignXycpICYmXG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRQcm9jZXNzQXJndkJpbigpID09PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ18nKSkge1xuICAgICAgICAgICAgJDAgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5nZXRFbnYoJ18nKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAke19fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnBhdGguZGlybmFtZShfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wcm9jZXNzLmV4ZWNQYXRoKCkpfS9gLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQwO1xuICAgIH1cbiAgICBba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZXJDb25maWcsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRVc2FnZUNvbmZpZ3VyYXRpb25dKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZUNvbmZpZywgXCJmXCIpO1xuICAgIH1cbiAgICBba0d1ZXNzTG9jYWxlXSgpIHtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2RldGVjdExvY2FsZSwgXCJmXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBsb2NhbGUgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xDX0FMTCcpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xDX01FU1NBR0VTJykgfHxcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLmdldEVudignTEFORycpIHx8XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5nZXRFbnYoJ0xBTkdVQUdFJykgfHxcbiAgICAgICAgICAgICdlbl9VUyc7XG4gICAgICAgIHRoaXMubG9jYWxlKGxvY2FsZS5yZXBsYWNlKC9bLjpdLiovLCAnJykpO1xuICAgIH1cbiAgICBba0d1ZXNzVmVyc2lvbl0oKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHRoaXNba1BrZ1VwXSgpO1xuICAgICAgICByZXR1cm4gb2JqLnZlcnNpb24gfHwgJ3Vua25vd24nO1xuICAgIH1cbiAgICBba1BhcnNlUG9zaXRpb25hbE51bWJlcnNdKGFyZ3YpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3ZbJy0tJ10gPyBhcmd2WyctLSddIDogYXJndi5fO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYXJnOyAoYXJnID0gYXJnc1tpXSkgIT09IHVuZGVmaW5lZDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuUGFyc2VyLmxvb2tzTGlrZU51bWJlcihhcmcpICYmXG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoTWF0aC5mbG9vcihwYXJzZUZsb2F0KGAke2FyZ31gKSkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tpXSA9IE51bWJlcihhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmd2O1xuICAgIH1cbiAgICBba1BrZ1VwXShyb290UGF0aCkge1xuICAgICAgICBjb25zdCBucGF0aCA9IHJvb3RQYXRoIHx8ICcqJztcbiAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGtncywgXCJmXCIpW25wYXRoXSlcbiAgICAgICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF07XG4gICAgICAgIGxldCBvYmogPSB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzdGFydERpciA9IHJvb3RQYXRoIHx8IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLm1haW5GaWxlbmFtZTtcbiAgICAgICAgICAgIGlmICghcm9vdFBhdGggJiYgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5leHRuYW1lKHN0YXJ0RGlyKSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGlyID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucGF0aC5kaXJuYW1lKHN0YXJ0RGlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuZmluZFVwKHN0YXJ0RGlyLCAoZGlyLCBuYW1lcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lcy5pbmNsdWRlcygncGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdwYWNrYWdlLmpzb24nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHBrZ0pzb25QYXRoLCB1bmRlZmluZWQsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKTtcbiAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikucmVhZEZpbGVTeW5jKHBrZ0pzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX25vb3ApIHsgfVxuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF0gPSBvYmogfHwge307XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BrZ3MsIFwiZlwiKVtucGF0aF07XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXldKHR5cGUsIGtleXMpIHtcbiAgICAgICAga2V5cyA9IFtdLmNvbmNhdChrZXlzKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBrZXkgPSB0aGlzW2tTYW5pdGl6ZUtleV0oa2V5KTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW3R5cGVdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFtrUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXNba1BvcHVsYXRlUGFyc2VySGludERpY3Rpb25hcnldKGJ1aWxkZXIsIHR5cGUsIGtleSwgdmFsdWUsICh0eXBlLCBrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBba1BvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeV0oYnVpbGRlciwgdHlwZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCAodHlwZSwga2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIilbdHlwZV1ba2V5XSA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVt0eXBlXVtrZXldIHx8IFtdKS5jb25jYXQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgW2tQb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XShidWlsZGVyLCB0eXBlLCBrZXksIHZhbHVlLCBzaW5nbGVLZXlIYW5kbGVyKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIGtleS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIoaywgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKChrZXkpID0+IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKShrZXkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2Ygb2JqZWN0S2V5cyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgYnVpbGRlcihrLCBrZXlba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2luZ2xlS2V5SGFuZGxlcih0eXBlLCB0aGlzW2tTYW5pdGl6ZUtleV0oa2V5KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtrU2FuaXRpemVLZXldKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICBba1NldEtleV0oa2V5LCBzZXQpIHtcbiAgICAgICAgdGhpc1trUG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XSh0aGlzW2tTZXRLZXldLmJpbmQodGhpcyksICdrZXknLCBrZXksIHNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBba1VuZnJlZXplXSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZnJvemVucywgXCJmXCIpLnBvcCgpO1xuICAgICAgICBhc3NlcnROb3RTdHJpY3RFcXVhbChmcm96ZW4sIHVuZGVmaW5lZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpO1xuICAgICAgICBsZXQgY29uZmlnT2JqZWN0cztcbiAgICAgICAgKF9hID0gdGhpcywgX2IgPSB0aGlzLCBfYyA9IHRoaXMsIF9kID0gdGhpcywgX2UgPSB0aGlzLCBfZiA9IHRoaXMsIF9nID0gdGhpcywgX2ggPSB0aGlzLCBfaiA9IHRoaXMsIF9rID0gdGhpcywgX2wgPSB0aGlzLCBfbSA9IHRoaXMsIHtcbiAgICAgICAgICAgIG9wdGlvbnM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9hLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgY29uZmlnT2JqZWN0cyxcbiAgICAgICAgICAgIGV4aXRQcm9jZXNzOiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfYiwgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBncm91cHM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9jLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBvdXRwdXQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9kLCBfWWFyZ3NJbnN0YW5jZV9vdXRwdXQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBleGl0RXJyb3I6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9lLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBoYXNPdXRwdXQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9mLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIF9vLCBcImZcIik7IH0gfSkudmFsdWUsXG4gICAgICAgICAgICBwYXJzZWQ6IHRoaXMucGFyc2VkLFxuICAgICAgICAgICAgc3RyaWN0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfZywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgc3RyaWN0Q29tbWFuZHM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9oLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcywgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHN0cmljdE9wdGlvbnM6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9qLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgY29tcGxldGlvbkNvbW1hbmQ6ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9rLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgX28sIFwiZlwiKTsgfSB9KS52YWx1ZSxcbiAgICAgICAgICAgIHBhcnNlRm46ICh7IHNldCB2YWx1ZShfbykgeyBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KF9sLCBfWWFyZ3NJbnN0YW5jZV9wYXJzZUZuLCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICAgICAgcGFyc2VDb250ZXh0OiAoeyBzZXQgdmFsdWUoX28pIHsgX19jbGFzc1ByaXZhdGVGaWVsZFNldChfbSwgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBfbywgXCJmXCIpOyB9IH0pLnZhbHVlLFxuICAgICAgICB9ID0gZnJvemVuKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlnT2JqZWN0cyA9IGNvbmZpZ09iamVjdHM7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS51bmZyZWV6ZSgpO1xuICAgIH1cbiAgICBba1ZhbGlkYXRlQXN5bmNdKHZhbGlkYXRpb24sIGFyZ3YpIHtcbiAgICAgICAgcmV0dXJuIG1heWJlQXN5bmNSZXN1bHQoYXJndiwgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRJbnRlcm5hbE1ldGhvZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXRDb21tYW5kSW5zdGFuY2U6IHRoaXNba0dldENvbW1hbmRJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldENvbnRleHQ6IHRoaXNba0dldENvbnRleHRdLmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRIYXNPdXRwdXQ6IHRoaXNba0dldEhhc091dHB1dF0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldExvZ2dlckluc3RhbmNlOiB0aGlzW2tHZXRMb2dnZXJJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFBhcnNlQ29udGV4dDogdGhpc1trR2V0UGFyc2VDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0UGFyc2VyQ29uZmlndXJhdGlvbjogdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFVzYWdlQ29uZmlndXJhdGlvbjogdGhpc1trR2V0VXNhZ2VDb25maWd1cmF0aW9uXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0VXNhZ2VJbnN0YW5jZTogdGhpc1trR2V0VXNhZ2VJbnN0YW5jZV0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldFZhbGlkYXRpb25JbnN0YW5jZTogdGhpc1trR2V0VmFsaWRhdGlvbkluc3RhbmNlXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgaGFzUGFyc2VDYWxsYmFjazogdGhpc1trSGFzUGFyc2VDYWxsYmFja10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGlzR2xvYmFsQ29udGV4dDogdGhpc1trSXNHbG9iYWxDb250ZXh0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcG9zdFByb2Nlc3M6IHRoaXNba1Bvc3RQcm9jZXNzXS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVzZXQ6IHRoaXNba1Jlc2V0XS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcnVuVmFsaWRhdGlvbjogdGhpc1trUnVuVmFsaWRhdGlvbl0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOiB0aGlzW2tSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kc10uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHNldEhhc091dHB1dDogdGhpc1trU2V0SGFzT3V0cHV0XS5iaW5kKHRoaXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBba0dldENvbW1hbmRJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tHZXRDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29udGV4dCwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldEhhc091dHB1dF0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgXCJmXCIpO1xuICAgIH1cbiAgICBba0dldExvZ2dlckluc3RhbmNlXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfbG9nZ2VyLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0UGFyc2VDb250ZXh0XSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIikgfHwge307XG4gICAgfVxuICAgIFtrR2V0VXNhZ2VJbnN0YW5jZV0oKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIik7XG4gICAgfVxuICAgIFtrR2V0VmFsaWRhdGlvbkluc3RhbmNlXSgpIHtcbiAgICAgICAgcmV0dXJuIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpO1xuICAgIH1cbiAgICBba0hhc1BhcnNlQ2FsbGJhY2tdKCkge1xuICAgICAgICByZXR1cm4gISFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3BhcnNlRm4sIFwiZlwiKTtcbiAgICB9XG4gICAgW2tJc0dsb2JhbENvbnRleHRdKCkge1xuICAgICAgICByZXR1cm4gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIFwiZlwiKTtcbiAgICB9XG4gICAgW2tQb3N0UHJvY2Vzc10oYXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCBjYWxsZWRGcm9tQ29tbWFuZCwgcnVuR2xvYmFsTWlkZGxld2FyZSkge1xuICAgICAgICBpZiAoY2FsbGVkRnJvbUNvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm4gYXJndjtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShhcmd2KSlcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICBpZiAoIXBvcHVsYXRlRG91YmxlRGFzaCkge1xuICAgICAgICAgICAgYXJndiA9IHRoaXNba0NvcHlEb3VibGVEYXNoXShhcmd2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZVBvc2l0aW9uYWxOdW1iZXJzID0gdGhpc1trR2V0UGFyc2VyQ29uZmlndXJhdGlvbl0oKVsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gfHxcbiAgICAgICAgICAgIHRoaXNba0dldFBhcnNlckNvbmZpZ3VyYXRpb25dKClbJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyddID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwYXJzZVBvc2l0aW9uYWxOdW1iZXJzKSB7XG4gICAgICAgICAgICBhcmd2ID0gdGhpc1trUGFyc2VQb3NpdGlvbmFsTnVtYmVyc10oYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bkdsb2JhbE1pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGFyZ3YgPSBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgfVxuICAgIFtrUmVzZXRdKGFsaWFzZXMgPSB7fSkge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpIHx8IHt9LCBcImZcIik7XG4gICAgICAgIGNvbnN0IHRtcE9wdGlvbnMgPSB7fTtcbiAgICAgICAgdG1wT3B0aW9ucy5sb2NhbCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmxvY2FsIHx8IFtdO1xuICAgICAgICB0bXBPcHRpb25zLmNvbmZpZ09iamVjdHMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5jb25maWdPYmplY3RzIHx8IFtdO1xuICAgICAgICBjb25zdCBsb2NhbExvb2t1cCA9IHt9O1xuICAgICAgICB0bXBPcHRpb25zLmxvY2FsLmZvckVhY2gobCA9PiB7XG4gICAgICAgICAgICBsb2NhbExvb2t1cFtsXSA9IHRydWU7XG4gICAgICAgICAgICAoYWxpYXNlc1tsXSB8fCBbXSkuZm9yRWFjaChhID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbExvb2t1cFthXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMsIFwiZlwiKSwgT2JqZWN0LmtleXMoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIFwiZlwiKSkucmVkdWNlKChhY2MsIGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ3JvdXBzLCBcImZcIilbZ3JvdXBOYW1lXS5maWx0ZXIoa2V5ID0+ICEoa2V5IGluIGxvY2FsTG9va3VwKSk7XG4gICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYWNjW2dyb3VwTmFtZV0gPSBrZXlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9ncm91cHMsIHt9LCBcImZcIik7XG4gICAgICAgIGNvbnN0IGFycmF5T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICdhcnJheScsXG4gICAgICAgICAgICAnYm9vbGVhbicsXG4gICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgICdza2lwVmFsaWRhdGlvbicsXG4gICAgICAgICAgICAnY291bnQnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICAgICdoaWRkZW5PcHRpb25zJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgb2JqZWN0T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICduYXJnJyxcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2FsaWFzJyxcbiAgICAgICAgICAgICdkZWZhdWx0JyxcbiAgICAgICAgICAgICdkZWZhdWx0RGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICAgICAnY2hvaWNlcycsXG4gICAgICAgICAgICAnZGVtYW5kZWRPcHRpb25zJyxcbiAgICAgICAgICAgICdkZW1hbmRlZENvbW1hbmRzJyxcbiAgICAgICAgICAgICdkZXByZWNhdGVkT3B0aW9ucycsXG4gICAgICAgIF07XG4gICAgICAgIGFycmF5T3B0aW9ucy5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgdG1wT3B0aW9uc1trXSA9IChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKVtrXSB8fCBbXSkuZmlsdGVyKChrKSA9PiAhbG9jYWxMb29rdXBba10pO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JqZWN0T3B0aW9ucy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICB0bXBPcHRpb25zW2tdID0gb2JqRmlsdGVyKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpW2tdLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0bXBPcHRpb25zLmVudlByZWZpeCA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmVudlByZWZpeDtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCB0bXBPcHRpb25zLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKVxuICAgICAgICAgICAgPyBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikucmVzZXQobG9jYWxMb29rdXApXG4gICAgICAgICAgICA6IFVzYWdlKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpKSwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpXG4gICAgICAgICAgICA/IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlc2V0KGxvY2FsTG9va3VwKVxuICAgICAgICAgICAgOiBWYWxpZGF0aW9uKHRoaXMsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikpLCBcImZcIik7XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIilcbiAgICAgICAgICAgID8gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucmVzZXQoKVxuICAgICAgICAgICAgOiBDb21tYW5kKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdXNhZ2UsIFwiZlwiKSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKSlcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiwgQ29tcGxldGlvbih0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIiksIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKSksIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikucmVzZXQoKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgbnVsbCwgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX291dHB1dCwgJycsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IsIG51bGwsIFwiZlwiKTtcbiAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIGZhbHNlLCBcImZcIik7XG4gICAgICAgIHRoaXMucGFyc2VkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBba1JlYmFzZV0oYmFzZSwgZGlyKSB7XG4gICAgICAgIHJldHVybiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3NoaW0sIFwiZlwiKS5wYXRoLnJlbGF0aXZlKGJhc2UsIGRpcik7XG4gICAgfVxuICAgIFtrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHNdKGFyZ3MsIHNob3J0Q2lyY3VpdCwgY2FsbGVkRnJvbUNvbW1hbmQsIGNvbW1hbmRJbmRleCA9IDAsIGhlbHBPbmx5ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHNraXBWYWxpZGF0aW9uID0gISFjYWxsZWRGcm9tQ29tbWFuZCB8fCBoZWxwT25seTtcbiAgICAgICAgYXJncyA9IGFyZ3MgfHwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncywgXCJmXCIpO1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5fXyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc2hpbSwgXCJmXCIpLnkxOG4uX187XG4gICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb24gPSB0aGlzW2tHZXRQYXJzZXJDb25maWd1cmF0aW9uXSgpO1xuICAgICAgICBjb25zdCBwb3B1bGF0ZURvdWJsZURhc2ggPSAhIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmNvbmZpZ3VyYXRpb25bJ3BvcHVsYXRlLS0nXTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9vcHRpb25zLCBcImZcIikuY29uZmlndXJhdGlvbiwge1xuICAgICAgICAgICAgJ3BvcHVsYXRlLS0nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zaGltLCBcImZcIikuUGFyc2VyLmRldGFpbGVkKGFyZ3MsIE9iamVjdC5hc3NpZ24oe30sIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLCB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7ICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSwgLi4uY29uZmlnIH0sXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgYXJndiA9IE9iamVjdC5hc3NpZ24ocGFyc2VkLmFyZ3YsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfcGFyc2VDb250ZXh0LCBcImZcIikpO1xuICAgICAgICBsZXQgYXJndlByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBwYXJzZWQuYWxpYXNlcztcbiAgICAgICAgbGV0IGhlbHBPcHRTZXQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZlcnNpb25PcHRTZXQgPSBmYWxzZTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXJndikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIikgJiYgYXJndltrZXldKSB7XG4gICAgICAgICAgICAgICAgaGVscE9wdFNldCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCwgXCJmXCIpICYmIGFyZ3Zba2V5XSkge1xuICAgICAgICAgICAgICAgIHZlcnNpb25PcHRTZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXJndi4kMCA9IHRoaXMuJDA7XG4gICAgICAgIHRoaXMucGFyc2VkID0gcGFyc2VkO1xuICAgICAgICBpZiAoY29tbWFuZEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzW2tHdWVzc0xvY2FsZV0oKTtcbiAgICAgICAgICAgIGlmIChzaG9ydENpcmN1aXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfaGVscE9wdCwgXCJmXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVscENtZHMgPSBbX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oZWxwT3B0LCBcImZcIildXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQoYWxpYXNlc1tfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hlbHBPcHQsIFwiZlwiKV0gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoayA9PiBrLmxlbmd0aCA+IDEpO1xuICAgICAgICAgICAgICAgIGlmIChoZWxwQ21kcy5pbmNsdWRlcygnJyArIGFyZ3YuX1thcmd2Ll8ubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3YuXy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaGVscE9wdFNldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQsIGZhbHNlLCBcImZcIik7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyS2V5cyA9IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tbWFuZCwgXCJmXCIpLmdldENvbW1hbmRzKCk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Q29tcGxldGlvbnMgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5jb21wbGV0aW9uS2V5IGluIGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBza2lwUmVjb21tZW5kYXRpb24gPSBoZWxwT3B0U2V0IHx8IHJlcXVlc3RDb21wbGV0aW9ucyB8fCBoZWxwT25seTtcbiAgICAgICAgICAgIGlmIChhcmd2Ll8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RVbmtub3duQ29tbWFuZDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbW1hbmRJbmRleCB8fCAwLCBjbWQ7IGFyZ3YuX1tpXSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IFN0cmluZyhhcmd2Ll9baV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJLZXlzLmluY2x1ZGVzKGNtZCkgJiYgY21kICE9PSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckFyZ3YgPSBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5ydW5Db21tYW5kKGNtZCwgdGhpcywgcGFyc2VkLCBpICsgMSwgaGVscE9ubHksIGhlbHBPcHRTZXQgfHwgdmVyc2lvbk9wdFNldCB8fCBoZWxwT25seSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba1Bvc3RQcm9jZXNzXShpbm5lckFyZ3YsIHBvcHVsYXRlRG91YmxlRGFzaCwgISFjYWxsZWRGcm9tQ29tbWFuZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0VW5rbm93bkNvbW1hbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgIT09IF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbkNvbW1hbmQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VW5rbm93bkNvbW1hbmQgPSBjbWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbW1hbmQsIFwiZlwiKS5oYXNEZWZhdWx0Q29tbWFuZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzLCBcImZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VW5rbm93bkNvbW1hbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFza2lwUmVjb21tZW5kYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLnJlY29tbWVuZENvbW1hbmRzKGZpcnN0VW5rbm93bkNvbW1hbmQsIGhhbmRsZXJLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCwgXCJmXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGFyZ3YuXy5pbmNsdWRlcyhfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kLCBcImZcIikpICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXF1ZXN0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MsIFwiZlwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJsb2NraW5nKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDb21wbGV0aW9uU2NyaXB0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSAmJiAhc2tpcFJlY29tbWVuZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJBcmd2ID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21tYW5kLCBcImZcIikucnVuQ29tbWFuZChudWxsLCB0aGlzLCBwYXJzZWQsIDAsIGhlbHBPbmx5LCBoZWxwT3B0U2V0IHx8IHZlcnNpb25PcHRTZXQgfHwgaGVscE9ubHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oaW5uZXJBcmd2LCBwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcywgXCJmXCIpKVxuICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICBhcmdzID0gW10uY29uY2F0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRpb25BcmdzID0gYXJncy5zbGljZShhcmdzLmluZGV4T2YoYC0tJHtfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24sIFwiZlwiKS5jb21wbGV0aW9uS2V5fWApICsgMSk7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uLCBcImZcIikuZ2V0Q29tcGxldGlvbihjb21wbGV0aW9uQXJncywgKGVyciwgY29tcGxldGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGlvbnMgfHwgW10pLmZvckVhY2goY29tcGxldGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2xvZ2dlciwgXCJmXCIpLmxvZyhjb21wbGV0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trUG9zdFByb2Nlc3NdKGFyZ3YsICFwb3B1bGF0ZURvdWJsZURhc2gsICEhY2FsbGVkRnJvbUNvbW1hbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9oYXNPdXRwdXQsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGlmIChoZWxwT3B0U2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dIZWxwKCdsb2cnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2ZXJzaW9uT3B0U2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2V4aXRQcm9jZXNzLCBcImZcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3VzYWdlLCBcImZcIikuc2hvd1ZlcnNpb24oJ2xvZycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbiAmJiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSBPYmplY3Qua2V5cyhhcmd2KS5zb21lKGtleSA9PiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX29wdGlvbnMsIFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKGtleSkgPj0gMCAmJiBhcmd2W2tleV0gPT09IHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFza2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBZRXJyb3IocGFyc2VkLmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzW2tSdW5WYWxpZGF0aW9uXShhbGlhc2VzLCB7fSwgcGFyc2VkLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRGcm9tQ29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndlByb21pc2UgPSBhcHBseU1pZGRsZXdhcmUoYXJndiwgdGhpcywgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlLCBcImZcIikuZ2V0TWlkZGxld2FyZSgpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmd2UHJvbWlzZSA9IHRoaXNba1ZhbGlkYXRlQXN5bmNdKHZhbGlkYXRpb24sIGFyZ3ZQcm9taXNlICE9PSBudWxsICYmIGFyZ3ZQcm9taXNlICE9PSB2b2lkIDAgPyBhcmd2UHJvbWlzZSA6IGFyZ3YpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGFyZ3ZQcm9taXNlKSAmJiAhY2FsbGVkRnJvbUNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZQcm9taXNlID0gYXJndlByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5TWlkZGxld2FyZShhcmd2LCB0aGlzLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2dsb2JhbE1pZGRsZXdhcmUsIFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBZRXJyb3IpXG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV91c2FnZSwgXCJmXCIpLmZhaWwoZXJyLm1lc3NhZ2UsIGVycik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tQb3N0UHJvY2Vzc10oYXJndlByb21pc2UgIT09IG51bGwgJiYgYXJndlByb21pc2UgIT09IHZvaWQgMCA/IGFyZ3ZQcm9taXNlIDogYXJndiwgcG9wdWxhdGVEb3VibGVEYXNoLCAhIWNhbGxlZEZyb21Db21tYW5kLCB0cnVlKTtcbiAgICB9XG4gICAgW2tSdW5WYWxpZGF0aW9uXShhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCBwYXJzZUVycm9ycywgaXNEZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICBjb25zdCBkZW1hbmRlZE9wdGlvbnMgPSB7IC4uLnRoaXMuZ2V0RGVtYW5kZWRPcHRpb25zKCkgfTtcbiAgICAgICAgcmV0dXJuIChhcmd2KSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyc2VFcnJvcnMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihwYXJzZUVycm9ycy5tZXNzYWdlKTtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiwgXCJmXCIpLm5vbk9wdGlvbkNvdW50KGFyZ3YpO1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikucmVxdWlyZWRBcmd1bWVudHMoYXJndiwgZGVtYW5kZWRPcHRpb25zKTtcbiAgICAgICAgICAgIGxldCBmYWlsZWRTdHJpY3RDb21tYW5kcyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0Q29tbWFuZHMsIFwiZlwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZFN0cmljdENvbW1hbmRzID0gX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkNvbW1hbmRzKGFyZ3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfc3RyaWN0LCBcImZcIikgJiYgIWZhaWxlZFN0cmljdENvbW1hbmRzKSB7XG4gICAgICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikudW5rbm93bkFyZ3VtZW50cyhhcmd2LCBhbGlhc2VzLCBwb3NpdGlvbmFsTWFwLCAhIWlzRGVmYXVsdENvbW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV9zdHJpY3RPcHRpb25zLCBcImZcIikpIHtcbiAgICAgICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS51bmtub3duQXJndW1lbnRzKGFyZ3YsIGFsaWFzZXMsIHt9LCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWWFyZ3NJbnN0YW5jZV92YWxpZGF0aW9uLCBcImZcIikubGltaXRlZENob2ljZXMoYXJndik7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5pbXBsaWNhdGlvbnMoYXJndik7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24sIFwiZlwiKS5jb25mbGljdGluZyhhcmd2KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgW2tTZXRIYXNPdXRwdXRdKCkge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCwgdHJ1ZSwgXCJmXCIpO1xuICAgIH1cbiAgICBba1RyYWNrTWFudWFsbHlTZXRLZXlzXShrZXlzKSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmtleVtrZXlzXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1lhcmdzSW5zdGFuY2Vfb3B0aW9ucywgXCJmXCIpLmtleVtrXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNZYXJnc0luc3RhbmNlKHkpIHtcbiAgICByZXR1cm4gISF5ICYmIHR5cGVvZiB5LmdldEludGVybmFsTWV0aG9kcyA9PT0gJ2Z1bmN0aW9uJztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdoaWNoTW9kdWxlKGV4cG9ydGVkKSB7XG4gICAgaWYgKHR5cGVvZiByZXF1aXJlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDAsIGZpbGVzID0gT2JqZWN0LmtleXMocmVxdWlyZS5jYWNoZSksIG1vZDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vZCA9IHJlcXVpcmUuY2FjaGVbZmlsZXNbaV1dO1xuICAgICAgICBpZiAobW9kLmV4cG9ydHMgPT09IGV4cG9ydGVkKVxuICAgICAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgeyBvYmplY3RLZXlzIH0gZnJvbSAnLi4vdHlwaW5ncy9jb21tb24tdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIG9iakZpbHRlcihvcmlnaW5hbCA9IHt9LCBmaWx0ZXIgPSAoKSA9PiB0cnVlKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgb2JqZWN0S2V5cyhvcmlnaW5hbCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyKGtleSwgb3JpZ2luYWxba2V5XSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gb3JpZ2luYWxba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRCbG9ja2luZyhibG9ja2luZykge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybjtcbiAgICBbcHJvY2Vzcy5zdGRvdXQsIHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKF9zdHJlYW0gPT4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBfc3RyZWFtO1xuICAgICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiZcbiAgICAgICAgICAgIHN0cmVhbS5pc1RUWSAmJlxuICAgICAgICAgICAgdHlwZW9mIHN0cmVhbS5faGFuZGxlLnNldEJsb2NraW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdHJlYW0uX2hhbmRsZS5zZXRCbG9ja2luZyhibG9ja2luZyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCB7IG9iakZpbHRlciB9IGZyb20gJy4vdXRpbHMvb2JqLWZpbHRlci5qcyc7XG5pbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuL3llcnJvci5qcyc7XG5pbXBvcnQgc2V0QmxvY2tpbmcgZnJvbSAnLi91dGlscy9zZXQtYmxvY2tpbmcuanMnO1xuZnVuY3Rpb24gaXNCb29sZWFuKGZhaWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIGZhaWwgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2FnZSh5YXJncywgc2hpbSkge1xuICAgIGNvbnN0IF9fID0gc2hpbS55MThuLl9fO1xuICAgIGNvbnN0IHNlbGYgPSB7fTtcbiAgICBjb25zdCBmYWlscyA9IFtdO1xuICAgIHNlbGYuZmFpbEZuID0gZnVuY3Rpb24gZmFpbEZuKGYpIHtcbiAgICAgICAgZmFpbHMucHVzaChmKTtcbiAgICB9O1xuICAgIGxldCBmYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgbGV0IGdsb2JhbEZhaWxNZXNzYWdlID0gbnVsbDtcbiAgICBsZXQgc2hvd0hlbHBPbkZhaWwgPSB0cnVlO1xuICAgIHNlbGYuc2hvd0hlbHBPbkZhaWwgPSBmdW5jdGlvbiBzaG93SGVscE9uRmFpbEZuKGFyZzEgPSB0cnVlLCBhcmcyKSB7XG4gICAgICAgIGNvbnN0IFtlbmFibGVkLCBtZXNzYWdlXSA9IHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJyA/IFt0cnVlLCBhcmcxXSA6IFthcmcxLCBhcmcyXTtcbiAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpKSB7XG4gICAgICAgICAgICBnbG9iYWxGYWlsTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgZmFpbE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBzaG93SGVscE9uRmFpbCA9IGVuYWJsZWQ7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgbGV0IGZhaWx1cmVPdXRwdXQgPSBmYWxzZTtcbiAgICBzZWxmLmZhaWwgPSBmdW5jdGlvbiBmYWlsKG1zZywgZXJyKSB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmIChmYWlscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBmYWlscy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWwgPSBmYWlsc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNCb29sZWFuKGZhaWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1zZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKG1zZywgZXJyLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0RXhpdFByb2Nlc3MoKSlcbiAgICAgICAgICAgICAgICBzZXRCbG9ja2luZyh0cnVlKTtcbiAgICAgICAgICAgIGlmICghZmFpbHVyZU91dHB1dCkge1xuICAgICAgICAgICAgICAgIGZhaWx1cmVPdXRwdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChzaG93SGVscE9uRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICB5YXJncy5zaG93SGVscCgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtc2cgfHwgZXJyKVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobXNnIHx8IGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UgPSBmYWlsTWVzc2FnZSB8fCBnbG9iYWxGYWlsTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyB8fCBlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJycpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVyciA9IGVyciB8fCBuZXcgWUVycm9yKG1zZyk7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0RXhpdFByb2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5YXJncy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuaGFzUGFyc2VDYWxsYmFjaygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlhcmdzLmV4aXQoMSwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHVzYWdlcyA9IFtdO1xuICAgIGxldCB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgc2VsZi51c2FnZSA9IChtc2csIGRlc2NyaXB0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtc2cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHVzYWdlRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdXNhZ2VzID0gW107XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuICAgICAgICB1c2FnZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHVzYWdlcy5wdXNoKFttc2csIGRlc2NyaXB0aW9uIHx8ICcnXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgc2VsZi5nZXRVc2FnZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVzYWdlcztcbiAgICB9O1xuICAgIHNlbGYuZ2V0VXNhZ2VEaXNhYmxlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVzYWdlRGlzYWJsZWQ7XG4gICAgfTtcbiAgICBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBfXygnUG9zaXRpb25hbHM6Jyk7XG4gICAgfTtcbiAgICBsZXQgZXhhbXBsZXMgPSBbXTtcbiAgICBzZWxmLmV4YW1wbGUgPSAoY21kLCBkZXNjcmlwdGlvbikgPT4ge1xuICAgICAgICBleGFtcGxlcy5wdXNoKFtjbWQsIGRlc2NyaXB0aW9uIHx8ICcnXSk7XG4gICAgfTtcbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcbiAgICBzZWxmLmNvbW1hbmQgPSBmdW5jdGlvbiBjb21tYW5kKGNtZCwgZGVzY3JpcHRpb24sIGlzRGVmYXVsdCwgYWxpYXNlcywgZGVwcmVjYXRlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMubWFwKGNtZEFycmF5ID0+IHtcbiAgICAgICAgICAgICAgICBjbWRBcnJheVsyXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbWRBcnJheTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1hbmRzLnB1c2goW2NtZCwgZGVzY3JpcHRpb24gfHwgJycsIGlzRGVmYXVsdCwgYWxpYXNlcywgZGVwcmVjYXRlZF0pO1xuICAgIH07XG4gICAgc2VsZi5nZXRDb21tYW5kcyA9ICgpID0+IGNvbW1hbmRzO1xuICAgIGxldCBkZXNjcmlwdGlvbnMgPSB7fTtcbiAgICBzZWxmLmRlc2NyaWJlID0gZnVuY3Rpb24gZGVzY3JpYmUoa2V5T3JLZXlzLCBkZXNjKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleU9yS2V5cykpIHtcbiAgICAgICAgICAgIGtleU9yS2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoaywgZGVzYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5T3JLZXlzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoa2V5T3JLZXlzKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmUoaywga2V5T3JLZXlzW2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25zW2tleU9yS2V5c10gPSBkZXNjO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLmdldERlc2NyaXB0aW9ucyA9ICgpID0+IGRlc2NyaXB0aW9ucztcbiAgICBsZXQgZXBpbG9ncyA9IFtdO1xuICAgIHNlbGYuZXBpbG9nID0gbXNnID0+IHtcbiAgICAgICAgZXBpbG9ncy5wdXNoKG1zZyk7XG4gICAgfTtcbiAgICBsZXQgd3JhcFNldCA9IGZhbHNlO1xuICAgIGxldCB3cmFwO1xuICAgIHNlbGYud3JhcCA9IGNvbHMgPT4ge1xuICAgICAgICB3cmFwU2V0ID0gdHJ1ZTtcbiAgICAgICAgd3JhcCA9IGNvbHM7XG4gICAgfTtcbiAgICBzZWxmLmdldFdyYXAgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzaGltLmdldEVudignWUFSR1NfRElTQUJMRV9XUkFQJykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghd3JhcFNldCkge1xuICAgICAgICAgICAgd3JhcCA9IHdpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgICB3cmFwU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcDtcbiAgICB9O1xuICAgIGNvbnN0IGRlZmVyWTE4bkxvb2t1cFByZWZpeCA9ICdfX3lhcmdzU3RyaW5nX186JztcbiAgICBzZWxmLmRlZmVyWTE4bkxvb2t1cCA9IHN0ciA9PiBkZWZlclkxOG5Mb29rdXBQcmVmaXggKyBzdHI7XG4gICAgc2VsZi5oZWxwID0gZnVuY3Rpb24gaGVscCgpIHtcbiAgICAgICAgaWYgKGNhY2hlZEhlbHBNZXNzYWdlKVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEhlbHBNZXNzYWdlO1xuICAgICAgICBub3JtYWxpemVBbGlhc2VzKCk7XG4gICAgICAgIGNvbnN0IGJhc2UkMCA9IHlhcmdzLmN1c3RvbVNjcmlwdE5hbWVcbiAgICAgICAgICAgID8geWFyZ3MuJDBcbiAgICAgICAgICAgIDogc2hpbS5wYXRoLmJhc2VuYW1lKHlhcmdzLiQwKTtcbiAgICAgICAgY29uc3QgZGVtYW5kZWRPcHRpb25zID0geWFyZ3MuZ2V0RGVtYW5kZWRPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkQ29tbWFuZHMgPSB5YXJncy5nZXREZW1hbmRlZENvbW1hbmRzKCk7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRPcHRpb25zID0geWFyZ3MuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0geWFyZ3MuZ2V0R3JvdXBzKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB5YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGxldCBrZXlzID0gW107XG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChPYmplY3Qua2V5cyhkZXNjcmlwdGlvbnMpKTtcbiAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKGRlbWFuZGVkT3B0aW9ucykpO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMoZGVtYW5kZWRDb21tYW5kcykpO1xuICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmtleXMob3B0aW9ucy5kZWZhdWx0KSk7XG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihmaWx0ZXJIaWRkZW5PcHRpb25zKTtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ18nKVxuICAgICAgICAgICAgICAgIGFjY1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KSk7XG4gICAgICAgIGNvbnN0IHRoZVdyYXAgPSBzZWxmLmdldFdyYXAoKTtcbiAgICAgICAgY29uc3QgdWkgPSBzaGltLmNsaXVpKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGVXcmFwLFxuICAgICAgICAgICAgd3JhcDogISF0aGVXcmFwLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF1c2FnZURpc2FibGVkKSB7XG4gICAgICAgICAgICBpZiAodXNhZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHVzYWdlcy5mb3JFYWNoKHVzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHsgdGV4dDogYCR7dXNhZ2VbMF0ucmVwbGFjZSgvXFwkMC9nLCBiYXNlJDApfWAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2FnZVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHsgdGV4dDogYCR7dXNhZ2VbMV19YCwgcGFkZGluZzogWzEsIDAsIDAsIDBdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRlbWFuZGVkQ29tbWFuZHMuXykge1xuICAgICAgICAgICAgICAgICAgICB1ID0gYCR7YmFzZSQwfSA8JHtfXygnY29tbWFuZCcpfT5cXG5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdSA9IGAke2Jhc2UkMH0gWyR7X18oJ2NvbW1hbmQnKX1dXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdWkuZGl2KGAke3V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDEgfHwgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMSAmJiAhY29tbWFuZHNbMF1bMl0pKSB7XG4gICAgICAgICAgICB1aS5kaXYoX18oJ0NvbW1hbmRzOicpKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB5YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21tYW5kcyA9IGNvbnRleHQuY29tbWFuZHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBgJHtjb250ZXh0LmNvbW1hbmRzLmpvaW4oJyAnKX0gYFxuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICBpZiAoeWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpWydzb3J0LWNvbW1hbmRzJ10gPT09XG4gICAgICAgICAgICAgICAgdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGJhc2UkMCA/IGAke2Jhc2UkMH0gYCA6ICcnO1xuICAgICAgICAgICAgY29tbWFuZHMuZm9yRWFjaChjb21tYW5kID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kU3RyaW5nID0gYCR7cHJlZml4fSR7cGFyZW50Q29tbWFuZHN9JHtjb21tYW5kWzBdLnJlcGxhY2UoL15cXCQwID8vLCAnJyl9YDtcbiAgICAgICAgICAgICAgICB1aS5zcGFuKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY29tbWFuZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDIsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoY29tbWFuZHMsIHRoZVdyYXAsIGAke2Jhc2UkMH0ke3BhcmVudENvbW1hbmRzfWApICsgNCxcbiAgICAgICAgICAgICAgICB9LCB7IHRleHQ6IGNvbW1hbmRbMV0gfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZFsyXSlcbiAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlZmF1bHQnKX1dYCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbM10gJiYgY29tbWFuZFszXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2FsaWFzZXM6Jyl9ICR7Y29tbWFuZFszXS5qb2luKCcsICcpfV1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRbNF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kWzRdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlcHJlY2F0ZWQ6ICVzJywgY29tbWFuZFs0XSl9XWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGludHMucHVzaChgWyR7X18oJ2RlcHJlY2F0ZWQnKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhpbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB1aS5kaXYoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogaGludHMuam9pbignICcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWzAsIDAsIDAsIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGlhc0tleXMgPSAoT2JqZWN0LmtleXMob3B0aW9ucy5hbGlhcykgfHwgW10pLmNvbmNhdChPYmplY3Qua2V5cyh5YXJncy5wYXJzZWQubmV3QWxpYXNlcykgfHwgW10pO1xuICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoa2V5ID0+ICF5YXJncy5wYXJzZWQubmV3QWxpYXNlc1trZXldICYmXG4gICAgICAgICAgICBhbGlhc0tleXMuZXZlcnkoYWxpYXMgPT4gKG9wdGlvbnMuYWxpYXNbYWxpYXNdIHx8IFtdKS5pbmRleE9mKGtleSkgPT09IC0xKSk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRHcm91cCA9IF9fKCdPcHRpb25zOicpO1xuICAgICAgICBpZiAoIWdyb3Vwc1tkZWZhdWx0R3JvdXBdKVxuICAgICAgICAgICAgZ3JvdXBzW2RlZmF1bHRHcm91cF0gPSBbXTtcbiAgICAgICAgYWRkVW5ncm91cGVkS2V5cyhrZXlzLCBvcHRpb25zLmFsaWFzLCBncm91cHMsIGRlZmF1bHRHcm91cCk7XG4gICAgICAgIGNvbnN0IGlzTG9uZ1N3aXRjaCA9IChzdykgPT4gL14tLS8udGVzdChnZXRUZXh0KHN3KSk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXllZEdyb3VwcyA9IE9iamVjdC5rZXlzKGdyb3VwcylcbiAgICAgICAgICAgIC5maWx0ZXIoZ3JvdXBOYW1lID0+IGdyb3Vwc1tncm91cE5hbWVdLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5cyA9IGdyb3Vwc1tncm91cE5hbWVdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmaWx0ZXJIaWRkZW5PcHRpb25zKVxuICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWxpYXNLZXlzLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGFsaWFzS2V5OyAoYWxpYXNLZXkgPSBhbGlhc0tleXNbaV0pICE9PSB1bmRlZmluZWQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbnMuYWxpYXNbYWxpYXNLZXldIHx8IFtdKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzS2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzIH07XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5vcm1hbGl6ZWRLZXlzIH0pID0+IG5vcm1hbGl6ZWRLZXlzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKCh7IGdyb3VwTmFtZSwgbm9ybWFsaXplZEtleXMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3dpdGNoZXMgPSBub3JtYWxpemVkS2V5cy5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSBba2V5XVxuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KG9wdGlvbnMuYWxpYXNba2V5XSB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChzdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cE5hbWUgPT09IHNlbGYuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3O1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKC9eWzAtOV0kLy50ZXN0KHN3KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5ib29sZWFuLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnLS0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJy0tJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICctJykgKyBzdyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoc3cxLCBzdzIpID0+IGlzTG9uZ1N3aXRjaChzdzEpID09PSBpc0xvbmdTd2l0Y2goc3cyKVxuICAgICAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICAgICAgOiBpc0xvbmdTd2l0Y2goc3cxKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IC0xKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZ3JvdXBOYW1lLCBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNob3J0U3dpdGNoZXNVc2VkID0gZGlzcGxheWVkR3JvdXBzXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGdyb3VwTmFtZSB9KSA9PiBncm91cE5hbWUgIT09IHNlbGYuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKVxuICAgICAgICAgICAgLnNvbWUoKHsgbm9ybWFsaXplZEtleXMsIHN3aXRjaGVzIH0pID0+ICFub3JtYWxpemVkS2V5cy5ldmVyeShrZXkgPT4gaXNMb25nU3dpdGNoKHN3aXRjaGVzW2tleV0pKSk7XG4gICAgICAgIGlmIChzaG9ydFN3aXRjaGVzVXNlZCkge1xuICAgICAgICAgICAgZGlzcGxheWVkR3JvdXBzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBncm91cE5hbWUgfSkgPT4gZ3JvdXBOYW1lICE9PSBzZWxmLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSlcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoeyBub3JtYWxpemVkS2V5cywgc3dpdGNoZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9uZ1N3aXRjaChzd2l0Y2hlc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZXNba2V5XSA9IGFkZEluZGVudGF0aW9uKHN3aXRjaGVzW2tleV0sICcteCwgJy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwbGF5ZWRHcm91cHMuZm9yRWFjaCgoeyBncm91cE5hbWUsIG5vcm1hbGl6ZWRLZXlzLCBzd2l0Y2hlcyB9KSA9PiB7XG4gICAgICAgICAgICB1aS5kaXYoZ3JvdXBOYW1lKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrc3dpdGNoID0gc3dpdGNoZXNba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGRlc2NyaXB0aW9uc1trZXldIHx8ICcnO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZGVzYy5pbmNsdWRlcyhkZWZlclkxOG5Mb29rdXBQcmVmaXgpKVxuICAgICAgICAgICAgICAgICAgICBkZXNjID0gX18oZGVzYy5zdWJzdHJpbmcoZGVmZXJZMThuTG9va3VwUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGBbJHtfXygnYm9vbGVhbicpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvdW50LmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ2NvdW50Jyl9XWA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RyaW5nLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBgWyR7X18oJ3N0cmluZycpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm5vcm1hbGl6ZS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdzdHJpbmcnKX1dYDtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hcnJheS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdhcnJheScpfV1gO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm51bWJlci5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gYFske19fKCdudW1iZXInKX1dYDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkRXh0cmEgPSAoZGVwcmVjYXRlZCkgPT4gdHlwZW9mIGRlcHJlY2F0ZWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gYFske19fKCdkZXByZWNhdGVkOiAlcycsIGRlcHJlY2F0ZWQpfV1gXG4gICAgICAgICAgICAgICAgICAgIDogYFske19fKCdkZXByZWNhdGVkJyl9XWA7XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0cmEgPSBbXG4gICAgICAgICAgICAgICAgICAgIGtleSBpbiBkZXByZWNhdGVkT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXByZWNhdGVkRXh0cmEoZGVwcmVjYXRlZE9wdGlvbnNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5IGluIGRlbWFuZGVkT3B0aW9ucyA/IGBbJHtfXygncmVxdWlyZWQnKX1dYCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2hvaWNlcyAmJiBvcHRpb25zLmNob2ljZXNba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgWyR7X18oJ2Nob2ljZXM6Jyl9ICR7c2VsZi5zdHJpbmdpZmllZFZhbHVlcyhvcHRpb25zLmNob2ljZXNba2V5XSl9XWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN0cmluZyhvcHRpb25zLmRlZmF1bHRba2V5XSwgb3B0aW9ucy5kZWZhdWx0RGVzY3JpcHRpb25ba2V5XSksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgdWkuc3Bhbih7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGdldFRleHQoa3N3aXRjaCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFswLCAyLCAwLCAyICsgZ2V0SW5kZW50YXRpb24oa3N3aXRjaCldLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoc3dpdGNoZXMsIHRoZVdyYXApICsgNCxcbiAgICAgICAgICAgICAgICB9LCBkZXNjKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRIaWRlT3B0aW9uRXh0cmFzID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VDb25maWd1cmF0aW9uKClbJ2hpZGUtdHlwZXMnXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEgJiYgIXNob3VsZEhpZGVPcHRpb25FeHRyYXMpXG4gICAgICAgICAgICAgICAgICAgIHVpLmRpdih7IHRleHQ6IGV4dHJhLCBwYWRkaW5nOiBbMCwgMCwgMCwgMl0sIGFsaWduOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVpLmRpdigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGV4YW1wbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdWkuZGl2KF9fKCdFeGFtcGxlczonKSk7XG4gICAgICAgICAgICBleGFtcGxlcy5mb3JFYWNoKGV4YW1wbGUgPT4ge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVbMF0gPSBleGFtcGxlWzBdLnJlcGxhY2UoL1xcJDAvZywgYmFzZSQwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhhbXBsZXMuZm9yRWFjaChleGFtcGxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhhbXBsZVsxXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMl0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWkuZGl2KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGV4YW1wbGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbMCwgMiwgMCwgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbWF4V2lkdGgoZXhhbXBsZXMsIHRoZVdyYXApICsgNCxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZXhhbXBsZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1aS5kaXYoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXBpbG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZXBpbG9nc1xuICAgICAgICAgICAgICAgIC5tYXAoZXBpbG9nID0+IGVwaWxvZy5yZXBsYWNlKC9cXCQwL2csIGJhc2UkMCkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgdWkuZGl2KGAke2V9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBtYXhXaWR0aCh0YWJsZSwgdGhlV3JhcCwgbW9kaWZpZXIpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gMDtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhYmxlKSkge1xuICAgICAgICAgICAgdGFibGUgPSBPYmplY3QudmFsdWVzKHRhYmxlKS5tYXAodiA9PiBbdl0pO1xuICAgICAgICB9XG4gICAgICAgIHRhYmxlLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHNoaW0uc3RyaW5nV2lkdGgobW9kaWZpZXIgPyBgJHttb2RpZmllcn0gJHtnZXRUZXh0KHZbMF0pfWAgOiBnZXRUZXh0KHZbMF0pKSArIGdldEluZGVudGF0aW9uKHZbMF0pLCB3aWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhlV3JhcClcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHBhcnNlSW50KCh0aGVXcmFwICogMC41KS50b1N0cmluZygpLCAxMCkpO1xuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUFsaWFzZXMoKSB7XG4gICAgICAgIGNvbnN0IGRlbWFuZGVkT3B0aW9ucyA9IHlhcmdzLmdldERlbWFuZGVkT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0geWFyZ3MuZ2V0T3B0aW9ucygpO1xuICAgICAgICAoT2JqZWN0LmtleXMob3B0aW9ucy5hbGlhcykgfHwgW10pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxpYXNba2V5XS5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2FsaWFzXSlcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZShrZXksIGRlc2NyaXB0aW9uc1thbGlhc10pO1xuICAgICAgICAgICAgICAgIGlmIChhbGlhcyBpbiBkZW1hbmRlZE9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLmRlbWFuZE9wdGlvbihrZXksIGRlbWFuZGVkT3B0aW9uc1thbGlhc10pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5ib29sZWFuKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY291bnQuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5jb3VudChrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmluZy5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLnN0cmluZyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm5vcm1hbGl6ZS5pbmNsdWRlcyhhbGlhcykpXG4gICAgICAgICAgICAgICAgICAgIHlhcmdzLm5vcm1hbGl6ZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFycmF5LmluY2x1ZGVzKGFsaWFzKSlcbiAgICAgICAgICAgICAgICAgICAgeWFyZ3MuYXJyYXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5udW1iZXIuaW5jbHVkZXMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICB5YXJncy5udW1iZXIoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNhY2hlZEhlbHBNZXNzYWdlO1xuICAgIHNlbGYuY2FjaGVIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FjaGVkSGVscE1lc3NhZ2UgPSB0aGlzLmhlbHAoKTtcbiAgICB9O1xuICAgIHNlbGYuY2xlYXJDYWNoZWRIZWxwTWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FjaGVkSGVscE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBzZWxmLmhhc0NhY2hlZEhlbHBNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISFjYWNoZWRIZWxwTWVzc2FnZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGFkZFVuZ3JvdXBlZEtleXMoa2V5cywgYWxpYXNlcywgZ3JvdXBzLCBkZWZhdWx0R3JvdXApIHtcbiAgICAgICAgbGV0IGdyb3VwZWRLZXlzID0gW107XG4gICAgICAgIGxldCB0b0NoZWNrID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBzKS5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGdyb3VwZWRLZXlzID0gZ3JvdXBlZEtleXMuY29uY2F0KGdyb3Vwc1tncm91cF0pO1xuICAgICAgICB9KTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB0b0NoZWNrID0gW2tleV0uY29uY2F0KGFsaWFzZXNba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXRvQ2hlY2suc29tZShrID0+IGdyb3VwZWRLZXlzLmluZGV4T2YoaykgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwc1tkZWZhdWx0R3JvdXBdLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cGVkS2V5cztcbiAgICB9XG4gICAgZnVuY3Rpb24gZmlsdGVySGlkZGVuT3B0aW9ucyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICh5YXJncy5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGtleSkgPCAwIHx8XG4gICAgICAgICAgICB5YXJncy5wYXJzZWQuYXJndlt5YXJncy5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF0pO1xuICAgIH1cbiAgICBzZWxmLnNob3dIZWxwID0gKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldExvZ2dlckluc3RhbmNlKCk7XG4gICAgICAgIGlmICghbGV2ZWwpXG4gICAgICAgICAgICBsZXZlbCA9ICdlcnJvcic7XG4gICAgICAgIGNvbnN0IGVtaXQgPSB0eXBlb2YgbGV2ZWwgPT09ICdmdW5jdGlvbicgPyBsZXZlbCA6IGxvZ2dlcltsZXZlbF07XG4gICAgICAgIGVtaXQoc2VsZi5oZWxwKCkpO1xuICAgIH07XG4gICAgc2VsZi5mdW5jdGlvbkRlc2NyaXB0aW9uID0gZm4gPT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGZuLm5hbWVcbiAgICAgICAgICAgID8gc2hpbS5QYXJzZXIuZGVjYW1lbGl6ZShmbi5uYW1lLCAnLScpXG4gICAgICAgICAgICA6IF9fKCdnZW5lcmF0ZWQtdmFsdWUnKTtcbiAgICAgICAgcmV0dXJuIFsnKCcsIGRlc2NyaXB0aW9uLCAnKSddLmpvaW4oJycpO1xuICAgIH07XG4gICAgc2VsZi5zdHJpbmdpZmllZFZhbHVlcyA9IGZ1bmN0aW9uIHN0cmluZ2lmaWVkVmFsdWVzKHZhbHVlcywgc2VwYXJhdG9yKSB7XG4gICAgICAgIGxldCBzdHJpbmcgPSAnJztcbiAgICAgICAgY29uc3Qgc2VwID0gc2VwYXJhdG9yIHx8ICcsICc7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gW10uY29uY2F0KHZhbHVlcyk7XG4gICAgICAgIGlmICghdmFsdWVzIHx8ICFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICBhcnJheS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBzZXA7XG4gICAgICAgICAgICBzdHJpbmcgKz0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRTdHJpbmcodmFsdWUsIGRlZmF1bHREZXNjcmlwdGlvbikge1xuICAgICAgICBsZXQgc3RyaW5nID0gYFske19fKCdkZWZhdWx0OicpfSBgO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhZGVmYXVsdERlc2NyaXB0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZWZhdWx0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN0cmluZyArPSBkZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtzdHJpbmd9XWA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdpbmRvd1dpZHRoKCkge1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IDgwO1xuICAgICAgICBpZiAoc2hpbS5wcm9jZXNzLnN0ZENvbHVtbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihtYXhXaWR0aCwgc2hpbS5wcm9jZXNzLnN0ZENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgICBzZWxmLnZlcnNpb24gPSB2ZXIgPT4ge1xuICAgICAgICB2ZXJzaW9uID0gdmVyO1xuICAgIH07XG4gICAgc2VsZi5zaG93VmVyc2lvbiA9IGxldmVsID0+IHtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtcbiAgICAgICAgaWYgKCFsZXZlbClcbiAgICAgICAgICAgIGxldmVsID0gJ2Vycm9yJztcbiAgICAgICAgY29uc3QgZW1pdCA9IHR5cGVvZiBsZXZlbCA9PT0gJ2Z1bmN0aW9uJyA/IGxldmVsIDogbG9nZ2VyW2xldmVsXTtcbiAgICAgICAgZW1pdCh2ZXJzaW9uKTtcbiAgICB9O1xuICAgIHNlbGYucmVzZXQgPSBmdW5jdGlvbiByZXNldChsb2NhbExvb2t1cCkge1xuICAgICAgICBmYWlsTWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGZhaWx1cmVPdXRwdXQgPSBmYWxzZTtcbiAgICAgICAgdXNhZ2VzID0gW107XG4gICAgICAgIHVzYWdlRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgZXBpbG9ncyA9IFtdO1xuICAgICAgICBleGFtcGxlcyA9IFtdO1xuICAgICAgICBjb21tYW5kcyA9IFtdO1xuICAgICAgICBkZXNjcmlwdGlvbnMgPSBvYmpGaWx0ZXIoZGVzY3JpcHRpb25zLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgY29uc3QgZnJvemVucyA9IFtdO1xuICAgIHNlbGYuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKCkge1xuICAgICAgICBmcm96ZW5zLnB1c2goe1xuICAgICAgICAgICAgZmFpbE1lc3NhZ2UsXG4gICAgICAgICAgICBmYWlsdXJlT3V0cHV0LFxuICAgICAgICAgICAgdXNhZ2VzLFxuICAgICAgICAgICAgdXNhZ2VEaXNhYmxlZCxcbiAgICAgICAgICAgIGVwaWxvZ3MsXG4gICAgICAgICAgICBleGFtcGxlcyxcbiAgICAgICAgICAgIGNvbW1hbmRzLFxuICAgICAgICAgICAgZGVzY3JpcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHNlbGYudW5mcmVlemUgPSBmdW5jdGlvbiB1bmZyZWV6ZShkZWZhdWx0Q29tbWFuZCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZyb3plbiA9IGZyb3plbnMucG9wKCk7XG4gICAgICAgIGlmICghZnJvemVuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZGVmYXVsdENvbW1hbmQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9ucyA9IHsgLi4uZnJvemVuLmRlc2NyaXB0aW9ucywgLi4uZGVzY3JpcHRpb25zIH07XG4gICAgICAgICAgICBjb21tYW5kcyA9IFsuLi5mcm96ZW4uY29tbWFuZHMsIC4uLmNvbW1hbmRzXTtcbiAgICAgICAgICAgIHVzYWdlcyA9IFsuLi5mcm96ZW4udXNhZ2VzLCAuLi51c2FnZXNdO1xuICAgICAgICAgICAgZXhhbXBsZXMgPSBbLi4uZnJvemVuLmV4YW1wbGVzLCAuLi5leGFtcGxlc107XG4gICAgICAgICAgICBlcGlsb2dzID0gWy4uLmZyb3plbi5lcGlsb2dzLCAuLi5lcGlsb2dzXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgZmFpbE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgZmFpbHVyZU91dHB1dCxcbiAgICAgICAgICAgICAgICB1c2FnZXMsXG4gICAgICAgICAgICAgICAgdXNhZ2VEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBlcGlsb2dzLFxuICAgICAgICAgICAgICAgIGV4YW1wbGVzLFxuICAgICAgICAgICAgICAgIGNvbW1hbmRzLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9ucyxcbiAgICAgICAgICAgIH0gPSBmcm96ZW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbmZ1bmN0aW9uIGlzSW5kZW50ZWRUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRleHQgPT09ICdvYmplY3QnO1xufVxuZnVuY3Rpb24gYWRkSW5kZW50YXRpb24odGV4dCwgaW5kZW50KSB7XG4gICAgcmV0dXJuIGlzSW5kZW50ZWRUZXh0KHRleHQpXG4gICAgICAgID8geyB0ZXh0OiB0ZXh0LnRleHQsIGluZGVudGF0aW9uOiB0ZXh0LmluZGVudGF0aW9uICsgaW5kZW50IH1cbiAgICAgICAgOiB7IHRleHQsIGluZGVudGF0aW9uOiBpbmRlbnQgfTtcbn1cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKHRleHQpIHtcbiAgICByZXR1cm4gaXNJbmRlbnRlZFRleHQodGV4dCkgPyB0ZXh0LmluZGVudGF0aW9uIDogMDtcbn1cbmZ1bmN0aW9uIGdldFRleHQodGV4dCkge1xuICAgIHJldHVybiBpc0luZGVudGVkVGV4dCh0ZXh0KSA/IHRleHQudGV4dCA6IHRleHQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbW1hbmRCdWlsZGVyQ2FsbGJhY2sgfSBmcm9tICcuL2NvbW1hbmQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwgfSBmcm9tICcuL3R5cGluZ3MvY29tbW9uLXR5cGVzLmpzJztcbmltcG9ydCAqIGFzIHRlbXBsYXRlcyBmcm9tICcuL2NvbXBsZXRpb24tdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vdXRpbHMvaXMtcHJvbWlzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1hbmQgfSBmcm9tICcuL3BhcnNlLWNvbW1hbmQuanMnO1xuZXhwb3J0IGNsYXNzIENvbXBsZXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHlhcmdzLCB1c2FnZSwgY29tbWFuZCwgc2hpbSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy55YXJncyA9IHlhcmdzO1xuICAgICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgICAgIHRoaXMuc2hpbSA9IHNoaW07XG4gICAgICAgIHRoaXMuY29tcGxldGlvbktleSA9ICdnZXQteWFyZ3MtY29tcGxldGlvbnMnO1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldCA9IDA7XG4gICAgICAgIHRoaXMuenNoU2hlbGwgPVxuICAgICAgICAgICAgKF9jID0gKCgoX2EgPSB0aGlzLnNoaW0uZ2V0RW52KCdTSEVMTCcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ3pzaCcpKSB8fFxuICAgICAgICAgICAgICAgICgoX2IgPSB0aGlzLnNoaW0uZ2V0RW52KCdaU0hfTkFNRScpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoJ3pzaCcpKSkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlO1xuICAgIH1cbiAgICBkZWZhdWx0Q29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBkb25lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBhcmdzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyc1thcmdzW2ldXSAmJiBoYW5kbGVyc1thcmdzW2ldXS5idWlsZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IGhhbmRsZXJzW2FyZ3NbaV1dLmJ1aWxkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QWZ0ZXJMYXN0UmVzZXQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlcih5LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkuYXJndjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGxldGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb21tYW5kQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGN1cnJlbnQpO1xuICAgICAgICB0aGlzLm9wdGlvbkNvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KTtcbiAgICAgICAgdGhpcy5jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCk7XG4gICAgICAgIHRoaXMuY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zKGNvbXBsZXRpb25zLCBhcmdzLCBhcmd2LCBjdXJyZW50KTtcbiAgICAgICAgZG9uZShudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgfVxuICAgIGNvbW1hbmRDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgY3VycmVudCkge1xuICAgICAgICBjb25zdCBwYXJlbnRDb21tYW5kcyA9IHRoaXMueWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbnRleHQoKS5jb21tYW5kcztcbiAgICAgICAgaWYgKCFjdXJyZW50Lm1hdGNoKC9eLS8pICYmXG4gICAgICAgICAgICBwYXJlbnRDb21tYW5kc1twYXJlbnRDb21tYW5kcy5sZW5ndGggLSAxXSAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgIXRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICB0aGlzLnVzYWdlLmdldENvbW1hbmRzKCkuZm9yRWFjaCh1c2FnZUNvbW1hbmQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gcGFyc2VDb21tYW5kKHVzYWdlQ29tbWFuZFswXSkuY21kO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmluZGV4T2YoY29tbWFuZE5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuenNoU2hlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY29tbWFuZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IHVzYWdlQ29tbWFuZFsxXSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goY29tbWFuZE5hbWUucmVwbGFjZSgvOi9nLCAnXFxcXDonKSArICc6JyArIGRlc2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9uQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKChjdXJyZW50Lm1hdGNoKC9eLS8pIHx8IChjdXJyZW50ID09PSAnJyAmJiBjb21wbGV0aW9ucy5sZW5ndGggPT09IDApKSAmJlxuICAgICAgICAgICAgIXRoaXMucHJldmlvdXNBcmdIYXNDaG9pY2VzKGFyZ3MpKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5cyA9IHRoaXMueWFyZ3MuZ2V0R3JvdXBzKClbdGhpcy51c2FnZS5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCldIHx8IFtdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5rZXkpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWdhYmxlID0gISFvcHRpb25zLmNvbmZpZ3VyYXRpb25bJ2Jvb2xlYW4tbmVnYXRpb24nXSAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJvb2xlYW4uaW5jbHVkZXMoa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Bvc2l0aW9uYWxLZXkgPSBwb3NpdGlvbmFsS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaXNQb3NpdGlvbmFsS2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICFvcHRpb25zLmhpZGRlbk9wdGlvbnMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5hcmdzQ29udGFpbktleShhcmdzLCBrZXksIG5lZ2FibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVPcHRpb25LZXkoa2V5LCBjb21wbGV0aW9ucywgY3VycmVudCwgbmVnYWJsZSAmJiAhIW9wdGlvbnMuZGVmYXVsdFtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyhjb21wbGV0aW9ucywgYXJncywgYXJndiwgY3VycmVudCkge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoYXJncykpIHtcbiAgICAgICAgICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKTtcbiAgICAgICAgICAgIGlmIChjaG9pY2VzICYmIGNob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLnB1c2goLi4uY2hvaWNlcy5tYXAoYyA9PiBjLnJlcGxhY2UoLzovZywgJ1xcXFw6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMoY29tcGxldGlvbnMsIGFyZ3MsIGFyZ3YsIGN1cnJlbnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcnICYmXG4gICAgICAgICAgICBjb21wbGV0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uYWxLZXlzID0gdGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV0gfHwgW107XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldCwgdGhpcy55YXJncy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCkuY29tbWFuZHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsS2V5ID0gcG9zaXRpb25hbEtleXNbYXJndi5fLmxlbmd0aCAtIG9mZnNldCAtIDFdO1xuICAgICAgICBpZiAoIXBvc2l0aW9uYWxLZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy55YXJncy5nZXRPcHRpb25zKCkuY2hvaWNlc1twb3NpdGlvbmFsS2V5XSB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaG9pY2Ugb2YgY2hvaWNlcykge1xuICAgICAgICAgICAgaWYgKGNob2ljZS5zdGFydHNXaXRoKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGlvbnMucHVzaChjaG9pY2UucmVwbGFjZSgvOi9nLCAnXFxcXDonKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UHJldmlvdXNBcmdDaG9pY2VzKGFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZpb3VzQXJnID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgZmlsdGVyID0gJyc7XG4gICAgICAgIGlmICghcHJldmlvdXNBcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZmlsdGVyID0gcHJldmlvdXNBcmc7XG4gICAgICAgICAgICBwcmV2aW91c0FyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByZXZpb3VzQXJnLnN0YXJ0c1dpdGgoJy0nKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcHJldmlvdXNBcmdLZXkgPSBwcmV2aW91c0FyZy5yZXBsYWNlKC9eLSsvLCAnJyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgcG9zc2libGVBbGlhc2VzID0gW1xuICAgICAgICAgICAgcHJldmlvdXNBcmdLZXksXG4gICAgICAgICAgICAuLi4odGhpcy55YXJncy5nZXRBbGlhc2VzKClbcHJldmlvdXNBcmdLZXldIHx8IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IGNob2ljZXM7XG4gICAgICAgIGZvciAoY29uc3QgcG9zc2libGVBbGlhcyBvZiBwb3NzaWJsZUFsaWFzZXMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5rZXksIHBvc3NpYmxlQWxpYXMpICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNob2ljZXNbcG9zc2libGVBbGlhc10pKSB7XG4gICAgICAgICAgICAgICAgY2hvaWNlcyA9IG9wdGlvbnMuY2hvaWNlc1twb3NzaWJsZUFsaWFzXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hvaWNlcykge1xuICAgICAgICAgICAgcmV0dXJuIGNob2ljZXMuZmlsdGVyKGNob2ljZSA9PiAhZmlsdGVyIHx8IGNob2ljZS5zdGFydHNXaXRoKGZpbHRlcikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXZpb3VzQXJnSGFzQ2hvaWNlcyhhcmdzKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhhcmdzKTtcbiAgICAgICAgcmV0dXJuIGNob2ljZXMgIT09IHVuZGVmaW5lZCAmJiBjaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGFyZ3NDb250YWluS2V5KGFyZ3MsIGtleSwgbmVnYWJsZSkge1xuICAgICAgICBjb25zdCBhcmdzQ29udGFpbnMgPSAocykgPT4gYXJncy5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QocykgPyAnLScgOiAnLS0nKSArIHMpICE9PSAtMTtcbiAgICAgICAgaWYgKGFyZ3NDb250YWlucyhrZXkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChuZWdhYmxlICYmIGFyZ3NDb250YWlucyhgbm8tJHtrZXl9YCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYWxpYXNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiB0aGlzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzQ29udGFpbnMoYWxpYXMpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbXBsZXRlT3B0aW9uS2V5KGtleSwgY29tcGxldGlvbnMsIGN1cnJlbnQsIG5lZ2FibGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBsZXQga2V5V2l0aERlc2MgPSBrZXk7XG4gICAgICAgIGlmICh0aGlzLnpzaFNoZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcyA9IHRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBhbGlhc0tleSA9IChfYiA9IChfYSA9IHRoaXMgPT09IG51bGwgfHwgdGhpcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGhpcy5hbGlhc2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Fba2V5XSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbmQoYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBkZXNjc1thbGlhc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkZXNjID09PSAnc3RyaW5nJyAmJiBkZXNjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NGcm9tQWxpYXMgPSBhbGlhc0tleSA/IGRlc2NzW2FsaWFzS2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGRlc2MgPSAoX2QgPSAoX2MgPSBkZXNjc1trZXldKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZXNjRnJvbUFsaWFzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJztcbiAgICAgICAgICAgIGtleVdpdGhEZXNjID0gYCR7a2V5LnJlcGxhY2UoLzovZywgJ1xcXFw6Jyl9OiR7ZGVzY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdfX3lhcmdzU3RyaW5nX186JywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICcgJyl9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydHNCeVR3b0Rhc2hlcyA9IChzKSA9PiAvXi0tLy50ZXN0KHMpO1xuICAgICAgICBjb25zdCBpc1Nob3J0T3B0aW9uID0gKHMpID0+IC9eW14wLTldJC8udGVzdChzKTtcbiAgICAgICAgY29uc3QgZGFzaGVzID0gIXN0YXJ0c0J5VHdvRGFzaGVzKGN1cnJlbnQpICYmIGlzU2hvcnRPcHRpb24oa2V5KSA/ICctJyA6ICctLSc7XG4gICAgICAgIGNvbXBsZXRpb25zLnB1c2goZGFzaGVzICsga2V5V2l0aERlc2MpO1xuICAgICAgICBpZiAobmVnYWJsZSkge1xuICAgICAgICAgICAgY29tcGxldGlvbnMucHVzaChkYXNoZXMgKyAnbm8tJyArIGtleVdpdGhEZXNjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjdXN0b21Db21wbGV0aW9uKGFyZ3MsIGFyZ3YsIGN1cnJlbnQsIGRvbmUpIHtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwodGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24sIG51bGwsIHRoaXMuc2hpbSk7XG4gICAgICAgIGlmIChpc1N5bmNDb21wbGV0aW9uRnVuY3Rpb24odGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihjdXJyZW50LCBhcmd2KTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4obGlzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgbGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW0ucHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGVyciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wbGV0aW9uRnVuY3Rpb24odGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24oY3VycmVudCwgYXJndiwgKG9uQ29tcGxldGVkID0gZG9uZSkgPT4gdGhpcy5kZWZhdWx0Q29tcGxldGlvbihhcmdzLCBhcmd2LCBjdXJyZW50LCBvbkNvbXBsZXRlZCksIGNvbXBsZXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGNvbXBsZXRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKGN1cnJlbnQsIGFyZ3YsIGNvbXBsZXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGNvbXBsZXRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENvbXBsZXRpb24oYXJncywgZG9uZSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gYXJncy5sZW5ndGggPyBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gOiAnJztcbiAgICAgICAgY29uc3QgYXJndiA9IHRoaXMueWFyZ3MucGFyc2UoYXJncywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRpb25GdW5jdGlvbiA9IHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICA/IChhcmd2KSA9PiB0aGlzLmN1c3RvbUNvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSlcbiAgICAgICAgICAgIDogKGFyZ3YpID0+IHRoaXMuZGVmYXVsdENvbXBsZXRpb24oYXJncywgYXJndiwgY3VycmVudCwgZG9uZSk7XG4gICAgICAgIHJldHVybiBpc1Byb21pc2UoYXJndilcbiAgICAgICAgICAgID8gYXJndi50aGVuKGNvbXBsZXRpb25GdW5jdGlvbilcbiAgICAgICAgICAgIDogY29tcGxldGlvbkZ1bmN0aW9uKGFyZ3YpO1xuICAgIH1cbiAgICBnZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQoJDAsIGNtZCkge1xuICAgICAgICBsZXQgc2NyaXB0ID0gdGhpcy56c2hTaGVsbFxuICAgICAgICAgICAgPyB0ZW1wbGF0ZXMuY29tcGxldGlvblpzaFRlbXBsYXRlXG4gICAgICAgICAgICA6IHRlbXBsYXRlcy5jb21wbGV0aW9uU2hUZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKCQwKTtcbiAgICAgICAgaWYgKCQwLm1hdGNoKC9cXC5qcyQvKSlcbiAgICAgICAgICAgICQwID0gYC4vJHskMH1gO1xuICAgICAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgve3thcHBfbmFtZX19L2csIG5hbWUpO1xuICAgICAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLCBjbWQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0LnJlcGxhY2UoL3t7YXBwX3BhdGh9fS9nLCAkMCk7XG4gICAgfVxuICAgIHJlZ2lzdGVyRnVuY3Rpb24oZm4pIHtcbiAgICAgICAgdGhpcy5jdXN0b21Db21wbGV0aW9uRnVuY3Rpb24gPSBmbjtcbiAgICB9XG4gICAgc2V0UGFyc2VkKHBhcnNlZCkge1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBwYXJzZWQuYWxpYXNlcztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGlvbih5YXJncywgdXNhZ2UsIGNvbW1hbmQsIHNoaW0pIHtcbiAgICByZXR1cm4gbmV3IENvbXBsZXRpb24oeWFyZ3MsIHVzYWdlLCBjb21tYW5kLCBzaGltKTtcbn1cbmZ1bmN0aW9uIGlzU3luY0NvbXBsZXRpb25GdW5jdGlvbihjb21wbGV0aW9uRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gY29tcGxldGlvbkZ1bmN0aW9uLmxlbmd0aCA8IDM7XG59XG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcGxldGlvbkZ1bmN0aW9uKGNvbXBsZXRpb25GdW5jdGlvbikge1xuICAgIHJldHVybiBjb21wbGV0aW9uRnVuY3Rpb24ubGVuZ3RoID4gMztcbn1cbiIsImV4cG9ydCBjb25zdCBjb21wbGV0aW9uU2hUZW1wbGF0ZSA9IGAjIyMtYmVnaW4te3thcHBfbmFtZX19LWNvbXBsZXRpb25zLSMjI1xuI1xuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XG4jXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uYmFzaHJjXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXG4jXG5fe3thcHBfbmFtZX19X3lhcmdzX2NvbXBsZXRpb25zKClcbntcbiAgICBsb2NhbCBjdXJfd29yZCBhcmdzIHR5cGVfbGlzdFxuXG4gICAgY3VyX3dvcmQ9XCJcXCR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX1cIlxuICAgIGFyZ3M9KFwiXFwke0NPTVBfV09SRFNbQF19XCIpXG5cbiAgICAjIGFzayB5YXJncyB0byBnZW5lcmF0ZSBjb21wbGV0aW9ucy5cbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCJcXCR7YXJnc1tAXX1cIilcblxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIlxcJHt0eXBlX2xpc3R9XCIgLS0gXFwke2N1cl93b3JkfSkgKVxuXG4gICAgIyBpZiBubyBtYXRjaCB3YXMgZm91bmQsIGZhbGwgYmFjayB0byBmaWxlbmFtZSBjb21wbGV0aW9uXG4gICAgaWYgWyBcXCR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxuICAgICAgQ09NUFJFUExZPSgpXG4gICAgZmlcblxuICAgIHJldHVybiAwXG59XG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XG4jIyMtZW5kLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbmA7XG5leHBvcnQgY29uc3QgY29tcGxldGlvblpzaFRlbXBsYXRlID0gYCNjb21wZGVmIHt7YXBwX25hbWV9fVxuIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcbiNcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxuI1xuIyBJbnN0YWxsYXRpb246IHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpzaHJjXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cbiNcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxue1xuICBsb2NhbCByZXBseVxuICBsb2NhbCBzaT0kSUZTXG4gIElGUz0kJ1xcbicgcmVwbHk9KCQoQ09NUF9DV09SRD1cIiQoKENVUlJFTlQtMSkpXCIgQ09NUF9MSU5FPVwiJEJVRkZFUlwiIENPTVBfUE9JTlQ9XCIkQ1VSU09SXCIge3thcHBfcGF0aH19IC0tZ2V0LXlhcmdzLWNvbXBsZXRpb25zIFwiXFwke3dvcmRzW0BdfVwiKSlcbiAgSUZTPSRzaVxuICBfZGVzY3JpYmUgJ3ZhbHVlcycgcmVwbHlcbn1cbmNvbXBkZWYgX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucyB7e2FwcF9uYW1lfX1cbiMjIy1lbmQte3thcHBfbmFtZX19LWNvbXBsZXRpb25zLSMjI1xuYDtcbiIsImV4cG9ydCBmdW5jdGlvbiBsZXZlbnNodGVpbihhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gYi5sZW5ndGg7XG4gICAgaWYgKGIubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gYS5sZW5ndGg7XG4gICAgY29uc3QgbWF0cml4ID0gW107XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8PSBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hdHJpeFtpXSA9IFtpXTtcbiAgICB9XG4gICAgbGV0IGo7XG4gICAgZm9yIChqID0gMDsgaiA8PSBhLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIG1hdHJpeFswXVtqXSA9IGo7XG4gICAgfVxuICAgIGZvciAoaSA9IDE7IGkgPD0gYi5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGogPSAxOyBqIDw9IGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChiLmNoYXJBdChpIC0gMSkgPT09IGEuY2hhckF0KGogLSAxKSkge1xuICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMV1baiAtIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIGogPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIGIuY2hhckF0KGkgLSAyKSA9PT0gYS5jaGFyQXQoaiAtIDEpICYmXG4gICAgICAgICAgICAgICAgICAgIGIuY2hhckF0KGkgLSAxKSA9PT0gYS5jaGFyQXQoaiAtIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMl1baiAtIDJdICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IE1hdGgubWluKG1hdHJpeFtpIC0gMV1baiAtIDFdICsgMSwgTWF0aC5taW4obWF0cml4W2ldW2ogLSAxXSArIDEsIG1hdHJpeFtpIC0gMV1bal0gKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXhbYi5sZW5ndGhdW2EubGVuZ3RoXTtcbn1cbiIsImltcG9ydCB7IGFyZ3NlcnQgfSBmcm9tICcuL2FyZ3NlcnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90U3RyaWN0RXF1YWwsIH0gZnJvbSAnLi90eXBpbmdzL2NvbW1vbi10eXBlcy5qcyc7XG5pbXBvcnQgeyBsZXZlbnNodGVpbiBhcyBkaXN0YW5jZSB9IGZyb20gJy4vdXRpbHMvbGV2ZW5zaHRlaW4uanMnO1xuaW1wb3J0IHsgb2JqRmlsdGVyIH0gZnJvbSAnLi91dGlscy9vYmotZmlsdGVyLmpzJztcbmNvbnN0IHNwZWNpYWxLZXlzID0gWyckMCcsICctLScsICdfJ107XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGlvbih5YXJncywgdXNhZ2UsIHNoaW0pIHtcbiAgICBjb25zdCBfXyA9IHNoaW0ueTE4bi5fXztcbiAgICBjb25zdCBfX24gPSBzaGltLnkxOG4uX19uO1xuICAgIGNvbnN0IHNlbGYgPSB7fTtcbiAgICBzZWxmLm5vbk9wdGlvbkNvdW50ID0gZnVuY3Rpb24gbm9uT3B0aW9uQ291bnQoYXJndikge1xuICAgICAgICBjb25zdCBkZW1hbmRlZENvbW1hbmRzID0geWFyZ3MuZ2V0RGVtYW5kZWRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFsQ291bnQgPSBhcmd2Ll8ubGVuZ3RoICsgKGFyZ3ZbJy0tJ10gPyBhcmd2WyctLSddLmxlbmd0aCA6IDApO1xuICAgICAgICBjb25zdCBfcyA9IHBvc2l0aW9uYWxDb3VudCAtIHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcy5sZW5ndGg7XG4gICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8gJiZcbiAgICAgICAgICAgIChfcyA8IGRlbWFuZGVkQ29tbWFuZHMuXy5taW4gfHwgX3MgPiBkZW1hbmRlZENvbW1hbmRzLl8ubWF4KSkge1xuICAgICAgICAgICAgaWYgKF9zIDwgZGVtYW5kZWRDb21tYW5kcy5fLm1pbikge1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2UuZmFpbChkZW1hbmRlZENvbW1hbmRzLl8ubWluTXNnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlbWFuZGVkQ29tbWFuZHMuXy5taW5Nc2dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMC9nLCBfcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCQxLywgZGVtYW5kZWRDb21tYW5kcy5fLm1pbi50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXMnLCAnTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgX3MsIF9zLnRvU3RyaW5nKCksIGRlbWFuZGVkQ29tbWFuZHMuXy5taW4udG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKF9zID4gZGVtYW5kZWRDb21tYW5kcy5fLm1heCkge1xuICAgICAgICAgICAgICAgIGlmIChkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2UuZmFpbChkZW1hbmRlZENvbW1hbmRzLl8ubWF4TXNnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlbWFuZGVkQ29tbWFuZHMuXy5tYXhNc2dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwkMC9nLCBfcy50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCQxLywgZGVtYW5kZWRDb21tYW5kcy5fLm1heC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdUb28gbWFueSBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBtYXhpbXVtIG9mICVzJywgJ1RvbyBtYW55IG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG1heGltdW0gb2YgJXMnLCBfcywgX3MudG9TdHJpbmcoKSwgZGVtYW5kZWRDb21tYW5kcy5fLm1heC50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnBvc2l0aW9uYWxDb3VudCA9IGZ1bmN0aW9uIHBvc2l0aW9uYWxDb3VudChyZXF1aXJlZCwgb2JzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKG9ic2VydmVkIDwgcmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwoX19uKCdOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXMnLCAnTm90IGVub3VnaCBub24tb3B0aW9uIGFyZ3VtZW50czogZ290ICVzLCBuZWVkIGF0IGxlYXN0ICVzJywgb2JzZXJ2ZWQsIG9ic2VydmVkICsgJycsIHJlcXVpcmVkICsgJycpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5yZXF1aXJlZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIHJlcXVpcmVkQXJndW1lbnRzKGFyZ3YsIGRlbWFuZGVkT3B0aW9ucykge1xuICAgICAgICBsZXQgbWlzc2luZyA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRlbWFuZGVkT3B0aW9ucykpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIGtleSkgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgYXJndltrZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG1pc3NpbmcgPSBtaXNzaW5nIHx8IHt9O1xuICAgICAgICAgICAgICAgIG1pc3Npbmdba2V5XSA9IGRlbWFuZGVkT3B0aW9uc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Nc2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtaXNzaW5nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IG1pc3Npbmdba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAobXNnICYmIGN1c3RvbU1zZ3MuaW5kZXhPZihtc2cpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21Nc2dzLnB1c2gobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Nc2cgPSBjdXN0b21Nc2dzLmxlbmd0aCA/IGBcXG4ke2N1c3RvbU1zZ3Muam9pbignXFxuJyl9YCA6ICcnO1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQ6ICVzJywgJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlcycsIE9iamVjdC5rZXlzKG1pc3NpbmcpLmxlbmd0aCwgT2JqZWN0LmtleXMobWlzc2luZykuam9pbignLCAnKSArIGN1c3RvbU1zZykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnVua25vd25Bcmd1bWVudHMgPSBmdW5jdGlvbiB1bmtub3duQXJndW1lbnRzKGFyZ3YsIGFsaWFzZXMsIHBvc2l0aW9uYWxNYXAsIGlzRGVmYXVsdENvbW1hbmQsIGNoZWNrUG9zaXRpb25hbHMgPSB0cnVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY29tbWFuZEtleXMgPSB5YXJnc1xuICAgICAgICAgICAgLmdldEludGVybmFsTWV0aG9kcygpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZEluc3RhbmNlKClcbiAgICAgICAgICAgIC5nZXRDb21tYW5kcygpO1xuICAgICAgICBjb25zdCB1bmtub3duID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0geWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpO1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNwZWNpYWxLZXlzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBvc2l0aW9uYWxNYXAsIGtleSkgJiZcbiAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLCBrZXkpICYmXG4gICAgICAgICAgICAgICAgIXNlbGYuaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3KGtleSwgYWxpYXNlcykpIHtcbiAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjaGVja1Bvc2l0aW9uYWxzICYmXG4gICAgICAgICAgICAoY3VycmVudENvbnRleHQuY29tbWFuZHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIGNvbW1hbmRLZXlzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICBpc0RlZmF1bHRDb21tYW5kKSkge1xuICAgICAgICAgICAgYXJndi5fLnNsaWNlKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZEtleXMuaW5jbHVkZXMoJycgKyBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVua25vd24ucHVzaCgnJyArIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrUG9zaXRpb25hbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbWFuZGVkQ29tbWFuZHMgPSB5YXJncy5nZXREZW1hbmRlZENvbW1hbmRzKCk7XG4gICAgICAgICAgICBjb25zdCBtYXhOb25PcHREZW1hbmRlZCA9ICgoX2EgPSBkZW1hbmRlZENvbW1hbmRzLl8pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXgpIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCArIG1heE5vbk9wdERlbWFuZGVkO1xuICAgICAgICAgICAgaWYgKGV4cGVjdGVkIDwgYXJndi5fLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFyZ3YuXy5zbGljZShleHBlY3RlZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q29udGV4dC5jb21tYW5kcy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdW5rbm93bi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1bmtub3duLmxlbmd0aCkge1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ1Vua25vd24gYXJndW1lbnQ6ICVzJywgJ1Vua25vd24gYXJndW1lbnRzOiAlcycsIHVua25vd24ubGVuZ3RoLCB1bmtub3duLm1hcChzID0+IChzLnRyaW0oKSA/IHMgOiBgXCIke3N9XCJgKSkuam9pbignLCAnKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBzZWxmLnVua25vd25Db21tYW5kcyA9IGZ1bmN0aW9uIHVua25vd25Db21tYW5kcyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRLZXlzID0geWFyZ3NcbiAgICAgICAgICAgIC5nZXRJbnRlcm5hbE1ldGhvZHMoKVxuICAgICAgICAgICAgLmdldENvbW1hbmRJbnN0YW5jZSgpXG4gICAgICAgICAgICAuZ2V0Q29tbWFuZHMoKTtcbiAgICAgICAgY29uc3QgdW5rbm93biA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCA+IDAgfHwgY29tbWFuZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXJndi5fLnNsaWNlKGN1cnJlbnRDb250ZXh0LmNvbW1hbmRzLmxlbmd0aCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29tbWFuZEtleXMuaW5jbHVkZXMoJycgKyBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVua25vd24ucHVzaCgnJyArIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdXNhZ2UuZmFpbChfX24oJ1Vua25vd24gY29tbWFuZDogJXMnLCAnVW5rbm93biBjb21tYW5kczogJXMnLCB1bmtub3duLmxlbmd0aCwgdW5rbm93bi5qb2luKCcsICcpKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5pc1ZhbGlkQW5kU29tZUFsaWFzSXNOb3ROZXcgPSBmdW5jdGlvbiBpc1ZhbGlkQW5kU29tZUFsaWFzSXNOb3ROZXcoa2V5LCBhbGlhc2VzKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsaWFzZXMsIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBbGlhc2VzID0geWFyZ3MucGFyc2VkLm5ld0FsaWFzZXM7XG4gICAgICAgIHJldHVybiBba2V5LCAuLi5hbGlhc2VzW2tleV1dLnNvbWUoYSA9PiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0FsaWFzZXMsIGEpIHx8ICFuZXdBbGlhc2VzW2tleV0pO1xuICAgIH07XG4gICAgc2VsZi5saW1pdGVkQ2hvaWNlcyA9IGZ1bmN0aW9uIGxpbWl0ZWRDaG9pY2VzKGFyZ3YpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHlhcmdzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgaW52YWxpZCA9IHt9O1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG9wdGlvbnMuY2hvaWNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoc3BlY2lhbEtleXMuaW5kZXhPZihrZXkpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLmNob2ljZXMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBbXS5jb25jYXQoYXJndltrZXldKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hvaWNlc1trZXldLmluZGV4T2YodmFsdWUpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFtrZXldID0gKGludmFsaWRba2V5XSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhpbnZhbGlkKTtcbiAgICAgICAgaWYgKCFpbnZhbGlkS2V5cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtc2cgPSBfXygnSW52YWxpZCB2YWx1ZXM6Jyk7XG4gICAgICAgIGludmFsaWRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIG1zZyArPSBgXFxuICAke19fKCdBcmd1bWVudDogJXMsIEdpdmVuOiAlcywgQ2hvaWNlczogJXMnLCBrZXksIHVzYWdlLnN0cmluZ2lmaWVkVmFsdWVzKGludmFsaWRba2V5XSksIHVzYWdlLnN0cmluZ2lmaWVkVmFsdWVzKG9wdGlvbnMuY2hvaWNlc1trZXldKSl9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHVzYWdlLmZhaWwobXNnKTtcbiAgICB9O1xuICAgIGxldCBpbXBsaWVkID0ge307XG4gICAgc2VsZi5pbXBsaWVzID0gZnVuY3Rpb24gaW1wbGllcyhrZXksIHZhbHVlKSB7XG4gICAgICAgIGFyZ3NlcnQoJzxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ10nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmltcGxpZXMoaywga2V5W2tdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWFyZ3MuZ2xvYmFsKGtleSk7XG4gICAgICAgICAgICBpZiAoIWltcGxpZWRba2V5XSkge1xuICAgICAgICAgICAgICAgIGltcGxpZWRba2V5XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChpID0+IHNlbGYuaW1wbGllcyhrZXksIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydE5vdFN0cmljdEVxdWFsKHZhbHVlLCB1bmRlZmluZWQsIHNoaW0pO1xuICAgICAgICAgICAgICAgIGltcGxpZWRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgc2VsZi5nZXRJbXBsaWVkID0gZnVuY3Rpb24gZ2V0SW1wbGllZCgpIHtcbiAgICAgICAgcmV0dXJuIGltcGxpZWQ7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBrZXlFeGlzdHMoYXJndiwgdmFsKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgICAgICB2YWwgPSBpc05hTihudW0pID8gdmFsIDogbnVtO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbCA9IGFyZ3YuXy5sZW5ndGggPj0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbC5tYXRjaCgvXi0tbm8tLisvKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLm1hdGNoKC9eLS1uby0oLispLylbMV07XG4gICAgICAgICAgICB2YWwgPSAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3YsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWwgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndiwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBzZWxmLmltcGxpY2F0aW9ucyA9IGZ1bmN0aW9uIGltcGxpY2F0aW9ucyhhcmd2KSB7XG4gICAgICAgIGNvbnN0IGltcGx5RmFpbCA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhpbXBsaWVkKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcmlnS2V5ID0ga2V5O1xuICAgICAgICAgICAgKGltcGxpZWRba2V5XSB8fCBbXSkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IG9yaWdLZXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5RXhpc3RzKGFyZ3YsIGtleSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBrZXlFeGlzdHMoYXJndiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGltcGx5RmFpbC5wdXNoKGAgJHtvcmlnS2V5fSAtPiAke29yaWdWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbXBseUZhaWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYCR7X18oJ0ltcGxpY2F0aW9ucyBmYWlsZWQ6Jyl9XFxuYDtcbiAgICAgICAgICAgIGltcGx5RmFpbC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVzYWdlLmZhaWwobXNnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IGNvbmZsaWN0aW5nID0ge307XG4gICAgc2VsZi5jb25mbGljdHMgPSBmdW5jdGlvbiBjb25mbGljdHMoa2V5LCB2YWx1ZSkge1xuICAgICAgICBhcmdzZXJ0KCc8c3RyaW5nfG9iamVjdD4gW2FycmF5fHN0cmluZ10nLCBba2V5LCB2YWx1ZV0sIGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGtleSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0cyhrLCBrZXlba10pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5YXJncy5nbG9iYWwoa2V5KTtcbiAgICAgICAgICAgIGlmICghY29uZmxpY3Rpbmdba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goaSA9PiBzZWxmLmNvbmZsaWN0cyhrZXksIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYuZ2V0Q29uZmxpY3RpbmcgPSAoKSA9PiBjb25mbGljdGluZztcbiAgICBzZWxmLmNvbmZsaWN0aW5nID0gZnVuY3Rpb24gY29uZmxpY3RpbmdGbihhcmd2KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChjb25mbGljdGluZ1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3Rpbmdba2V5XS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIGFyZ3Zba2V5XSAhPT0gdW5kZWZpbmVkICYmIGFyZ3ZbdmFsdWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0FyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScsIGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZsaWN0aW5nKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3Rpbmdba2V5XS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W3NoaW0uUGFyc2VyLmNhbWVsQ2FzZShrZXkpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd2W3NoaW0uUGFyc2VyLmNhbWVsQ2FzZSh2YWx1ZSldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLmZhaWwoX18oJ0FyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZScsIGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHNlbGYucmVjb21tZW5kQ29tbWFuZHMgPSBmdW5jdGlvbiByZWNvbW1lbmRDb21tYW5kcyhjbWQsIHBvdGVudGlhbENvbW1hbmRzKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDM7XG4gICAgICAgIHBvdGVudGlhbENvbW1hbmRzID0gcG90ZW50aWFsQ29tbWFuZHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG4gICAgICAgIGxldCByZWNvbW1lbmRlZCA9IG51bGw7XG4gICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNhbmRpZGF0ZTsgKGNhbmRpZGF0ZSA9IHBvdGVudGlhbENvbW1hbmRzW2ldKSAhPT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZShjbWQsIGNhbmRpZGF0ZSk7XG4gICAgICAgICAgICBpZiAoZCA8PSB0aHJlc2hvbGQgJiYgZCA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGQ7XG4gICAgICAgICAgICAgICAgcmVjb21tZW5kZWQgPSBjYW5kaWRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY29tbWVuZGVkKVxuICAgICAgICAgICAgdXNhZ2UuZmFpbChfXygnRGlkIHlvdSBtZWFuICVzPycsIHJlY29tbWVuZGVkKSk7XG4gICAgfTtcbiAgICBzZWxmLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQobG9jYWxMb29rdXApIHtcbiAgICAgICAgaW1wbGllZCA9IG9iakZpbHRlcihpbXBsaWVkLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIGNvbmZsaWN0aW5nID0gb2JqRmlsdGVyKGNvbmZsaWN0aW5nLCBrID0+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgY29uc3QgZnJvemVucyA9IFtdO1xuICAgIHNlbGYuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKCkge1xuICAgICAgICBmcm96ZW5zLnB1c2goe1xuICAgICAgICAgICAgaW1wbGllZCxcbiAgICAgICAgICAgIGNvbmZsaWN0aW5nLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHNlbGYudW5mcmVlemUgPSBmdW5jdGlvbiB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gZnJvemVucy5wb3AoKTtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwoZnJvemVuLCB1bmRlZmluZWQsIHNoaW0pO1xuICAgICAgICAoeyBpbXBsaWVkLCBjb25mbGljdGluZyB9ID0gZnJvemVuKTtcbiAgICB9O1xuICAgIHJldHVybiBzZWxmO1xufVxuIiwiaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi4veWVycm9yLmpzJztcbmxldCBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MgPSBbXTtcbmxldCBzaGltO1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RXh0ZW5kcyhjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzLCBfc2hpbSkge1xuICAgIHNoaW0gPSBfc2hpbTtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHt9O1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmV4dGVuZHMgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25maWc7XG4gICAgICAgIGNvbnN0IGlzUGF0aCA9IC9cXC5qc29ufFxcLi4qcmMkLy50ZXN0KGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgbGV0IHBhdGhUb0RlZmF1bHQgPSBudWxsO1xuICAgICAgICBpZiAoIWlzUGF0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9EZWZhdWx0ID0gcmVxdWlyZS5yZXNvbHZlKGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MucHVzaChwYXRoVG9EZWZhdWx0KTtcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGlzUGF0aFxuICAgICAgICAgICAgPyBKU09OLnBhcnNlKHNoaW0ucmVhZEZpbGVTeW5jKHBhdGhUb0RlZmF1bHQsICd1dGY4JykpXG4gICAgICAgICAgICA6IHJlcXVpcmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBkZWxldGUgY29uZmlnLmV4dGVuZHM7XG4gICAgICAgIGRlZmF1bHRDb25maWcgPSBhcHBseUV4dGVuZHMoZGVmYXVsdENvbmZpZywgc2hpbS5wYXRoLmRpcm5hbWUocGF0aFRvRGVmYXVsdCksIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG4gICAgfVxuICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xuICAgIHJldHVybiBtZXJnZUV4dGVuZHNcbiAgICAgICAgPyBtZXJnZURlZXAoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgICAgICA6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG59XG5mdW5jdGlvbiBjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyhjZmdQYXRoKSB7XG4gICAgaWYgKHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5pbmRleE9mKGNmZ1BhdGgpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgQ2lyY3VsYXIgZXh0ZW5kZWQgY29uZmlndXJhdGlvbnM6ICcke2NmZ1BhdGh9Jy5gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgcGF0aFRvRXh0ZW5kKSB7XG4gICAgcmV0dXJuIHNoaW0ucGF0aC5yZXNvbHZlKGN3ZCwgcGF0aFRvRXh0ZW5kKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRGVlcChjb25maWcxLCBjb25maWcyKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIGNvbmZpZzEpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZzIpKSB7XG4gICAgICAgIGlmIChpc09iamVjdChjb25maWcyW2tleV0pICYmIGlzT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZURlZXAoY29uZmlnMVtrZXldLCBjb25maWcyW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBjb25maWcyW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gQm9vdHN0cmFwcyB5YXJncyBmb3IgRVNNOlxuaW1wb3J0IGVzbVBsYXRmb3JtU2hpbSBmcm9tICcuL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcbmltcG9ydCB7WWFyZ3NGYWN0b3J5fSBmcm9tICcuL2J1aWxkL2xpYi95YXJncy1mYWN0b3J5LmpzJztcblxuY29uc3QgWWFyZ3MgPSBZYXJnc0ZhY3RvcnkoZXNtUGxhdGZvcm1TaGltKTtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJykgfHwgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZUZhY3RvcnkgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBtZW1vaXplID0gbWVtb2l6ZUZhY3RvcnkoeyBtYXhDYWNoZWRUaGlzU2l6ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIG1heENhY2hlZEFyZ3NTaXplOiAxIH0pO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXNSdW5uaW5nT25CdW5cbiAgICAgID8gJ3RydWUnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgICAgPyAneWFybiBidWlsZCdcbiAgICAgICAgOiBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWA7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkRW52ID8geyAuLi5yZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpLCAuLi5wcm9jZXNzLmVudiB9IDogcHJvY2Vzcy5lbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddKTtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImltcG9ydHtjeXJiNjRIYXNoV2l0aExlbmd0aCBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2NvbnN0IHQ9cygpO2Z1bmN0aW9uIHMoe2NhY2hlRHVyYXRpb246dD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksY2FjaGVzOnMsY2FsY0tleTpuPSh0PT5lKEpTT04uc3RyaW5naWZ5KHQpKSksbWF4Q2FjaGVkQXJnc1NpemU6aT0xMDAsbWF4Q2FjaGVkVGhpc1NpemU6Yz0xMH09e30pe3JldHVybiBmdW5jdGlvbihlLG8pe2lmKFwiZ2V0dGVyXCI9PT1vPy5raW5kKXtjb25zdCBuPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gobiksZnVuY3Rpb24oKXtjb25zdCBzPURhdGUubm93KCk7aWYobi5oYXModGhpcykpe2NvbnN0W2UsaV09bi5nZXQodGhpcyk7aWYocy1pPD10KXJldHVybiBlfWNvbnN0IGk9ZS5jYWxsKHRoaXMpO2lmKG4uc2l6ZT49Yyl7Y29uc3QgZT1uLmtleXMoKS5uZXh0KCkudmFsdWU7bi5kZWxldGUoZSl9cmV0dXJuIG4uc2V0KHRoaXMsW2ksc10pLGl9fXtjb25zdCByPW5ldyBNYXA7cmV0dXJuIHM/LnB1c2gociksZnVuY3Rpb24oLi4ucyl7Y29uc3QgYT1uKHMpO2xldCBoPXIuZ2V0KHRoaXMpO2NvbnN0IHU9RGF0ZS5ub3coKTtpZihoKXtpZihoLmhhcyhhKSl7Y29uc3RbZSxzXT1oLmdldChhKTtpZih1LXM8PXQpcmV0dXJuIGV9fWVsc2V7aWYoaD1uZXcgTWFwLHIuc2l6ZT49Yyl7Y29uc3QgZT1yLmtleXMoKS5uZXh0KCkudmFsdWU7ci5kZWxldGUoZSl9ci5zZXQodGhpcyxoKX1jb25zdCBmPW8/ZS5jYWxsKHRoaXMsLi4ucyk6ZSguLi5zKTtpZihoLnNpemU+PWkpe2NvbnN0IGU9aC5rZXlzKCkubmV4dCgpLnZhbHVlO2guZGVsZXRlKGUpfXJldHVybiBoLnNldChhLFtmLHVdKSxmfX19fWV4cG9ydHt0IGFzIG1lbW9pemUscyBhcyBtZW1vaXplRmFjdG9yeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplLmpzLm1hcFxuIiwiZnVuY3Rpb24gdCh0LG49MCl7Y29uc3RbaSxyXT1mdW5jdGlvbih0LG49MCl7bGV0IGk9MzczNTkyODU1OV5uLHI9MTEwMzU0Nzk5MV5uO2ZvcihsZXQgbixhPTA7YTx0Lmxlbmd0aDthKyspbj10LmNvZGVQb2ludEF0KGEpLGk9TWF0aC5pbXVsKGlebiwyNjU0NDM1NzYxKSxyPU1hdGguaW11bChyXm4sMTU5NzMzNDY3Nyk7cmV0dXJuIGk9TWF0aC5pbXVsKGleaT4+PjE2LDIyNDY4MjI1MDcpLGlePU1hdGguaW11bChyXnI+Pj4xMywzMjY2NDg5OTA5KSxyPU1hdGguaW11bChyXnI+Pj4xNiwyMjQ2ODIyNTA3KSxyXj1NYXRoLmltdWwoaV5pPj4+MTMsMzI2NjQ4OTkwOSksW3I+Pj4wLGk+Pj4wXX0odCxuKTtyZXR1cm4gdC5sZW5ndGgudG9TdHJpbmcoMzYpK2kudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpK3IudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDcsXCIwXCIpfWV4cG9ydHt0IGFzIGN5cmI2NEhhc2hXaXRoTGVuZ3RofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ3lhcm4gYnVpbGQnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgeyBiZWZvcmVSZXRyeSwgaGFuZGxlRXJyb3IsIHJldHJ5Q291bnQgPSAzLCByZXRyeUxvZ2dlciwgc2xlZXBNaWxsaXNlY29uZHMgPSAwIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8pPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ2J1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKFlBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAucmVwbGFjZUFsbCgnIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHknLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgcmV0dXJuIFtcbiAgICBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpLFxuICAgIGZpeEJ1bkNvbW1hbmQoXG4gICAgICBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgICApLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0VudlsnQ0knXSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52WydGT1JDRV9DT0xPUiddID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKSA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZSBvbiBCdW4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoIWlzUnVubmluZ09uQnVuKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEJ1bi4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhcmd2LmZpbGVzID8/IFtdO1xuICAgIGxldCBiaW9tZUFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHByZXR0aWVyQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnc1RleHQ6IHN0cmluZztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXI6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9XCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9IGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0ID8gJ2NoZWNrIC0tZml4JyA6IGFyZ3YuZml4ID8gJ2xpbnQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3lhcm4nLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgICghYXJndi5vdXRzaWRlICYmIG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdQUklTTUEgbWlncmF0ZSBkZXBsb3knO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldmA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gICAgLy8gSSdtIG5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgc3FsaXRlIGZpbGVzLCBzbyBJIGNvbW1lbnRlZCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lLlxuICAgIC8vIHJldHVybiBgdHJ1ZSAkKHJtIC1SZiBkYi8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiB0cnVlICQocm0gLVJmIHByaXNtYS8qKi8qLnNxbGl0ZSogMj4gL2Rldi9udWxsKSAmJiBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7dGhpcy5zZWVkKCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10pXG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gJ0JVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzJztcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8oXzogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGRiVXJsT3JQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPWZpbGU6Ly8ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKTtcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCB8fFxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXVxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gYCR7YXJndi5hcmdzPy5qb2luKCcgJykgPz8gJyd9YC50cmltRW5kKCk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7c2NyaXB0fWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtzY3JpcHR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJ107XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biwgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5wcmVmZXItYWN0aXZlLXB5dGhvbiB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IG5ld0RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5ld0RldkRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIG5ld0RlcHMucHVzaCgncG0yJyk7XG4gICAgICBuZXdEZXZEZXBzLnB1c2goJ2NvbmN1cnJlbnRseScsICdvcGVuLWNsaScsICd2aXRlc3QnLCAnd2FpdC1vbicpO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9XG4gICAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgICBuZXdEZXZEZXBzID0gbmV3RGV2RGVwcy5maWx0ZXIoKGRlcCkgPT4gZGVwICE9PSAndml0ZXN0Jyk7XG4gICAgfVxuICAgIGlmIChuZXdEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcn0gYWRkICR7bmV3RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChuZXdEZXZEZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcn0gYWRkIC1EICR7bmV3RGV2RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChzY3JpcHRzWydnZW4tY29kZSddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ3lhcm4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8gYW1kNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgODA4MDo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMgZXh0ZW5kcyBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIHByaXNtYURpcmVjdG9yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwKSB7fVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgODA4MCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0cy9lMmUnLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIC8vIEJhc2ljYWxseSwgYHBsYXl3cmlnaHRgIChub3QgYHlhcm4gcGxheXdyaWdodGApIHNob3VsZCB3b3JrLFxuICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAvLyBTbyB3ZSB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW5zdGVhZCBvZiBgcGxheXdyaWdodGAgaGVyZS5cbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcImNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzLW9uLWZhaWwgLS1yYXcgJ3dhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCcgJ0JVTiBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc31cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcImNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzLW9uLWZhaWwgLS1yYXcgJ3dhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCcgJ0JVTiBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc31cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy91bml0J30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fVlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAnYmxpdHogZGV2IC1wIDgwODAnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgaWYgWyAtZSBcInByaXNtYVwiIF07IHRoZW4gcHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGU7IGZpICYmICgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kIHx8IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlcImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIiR7dGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJuZXh0IGRldiAtLXR1cmJvICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXS5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBzdGFydENvbW1hbmQgPSAnbmV4dCBkZXYgLS10dXJibyAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvXCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gc3JjL2luZGV4LnRzICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAncmVtaXggZGV2JyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwicmVtaXggZGV2XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlIHx8ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdkZXZlbG9wbWVudCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgODA4MCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LCB3YkVudjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSB3YkVudjtcbiAgbGV0IHByZWZpeCA9IGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gICAgcHJlZml4ICs9IGBORVhUX1BVQkxJQ19XQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNpOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB0ZXN0cyBvbiBDSScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIHJ1biBlMmUgdGVzdHMuIFlvdSBtYXkgcGFzcyBtb2RlIGFzIGFyZ3VtZW50OiBub25lIHwgaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHN0YXJ0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biBzdGFydCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB1bml0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbiAgdGFyZ2V0OiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd0JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QnLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSAhYXJndi5lMmUgJiYgYXJndi5zdGFydCA9PT0gdW5kZWZpbmVkICYmIGFyZ3YudW5pdCA9PT0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5BbGxUZXN0cykge1xuICAgICAgYXJndiA9IHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgZTJlOlxuICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ2UyZScpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvdW5pdC8nKVxuICAgICAgICAgICAgPyAnaGVhZGxlc3MnXG4gICAgICAgICAgICA6ICdub25lJyxcbiAgICAgICAgc3RhcnQ6IHRydWUsXG4gICAgICAgIHVuaXQ6IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ3VuaXQnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL2UyZS8nKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgJHtzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgIH0pfWAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXS5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiYXJndiIsImN3ZCIsImNhY2hlRW5hYmxlZCIsImVudlBhdGhzIiwiZW52IiwibWFwIiwiZW52UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwidG9TdHJpbmciLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwicHJvY2VzcyIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJwdXNoIiwiam9pbiIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJmbGF0TWFwIiwicmVsYXRpdmUiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJlbnZWYXJzIiwib3JnRW52VmFycyIsInJlYWRFbnZGaWxlIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsImZpbHRlciIsIkVycm9yIiwiY2FjaGVkRW52VmFycyIsIk1hcCIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJ3cml0ZSIsImVuZCIsImFsaWduIiwicmlnaHQiLCJzdHIiLCJ3aWR0aCIsInRyaW0iLCJzdHJXaWR0aCIsIm1peGluIiwic3RyaW5nV2lkdGgiLCJyZXBlYXQiLCJjZW50ZXIiLCJVSSIsImNvbnN0cnVjdG9yIiwib3B0cyIsIl9hIiwidGhpcyIsIndyYXAiLCJyb3dzIiwic3BhbiIsImRpdiIsInJlc2V0T3V0cHV0Iiwic2hvdWxkQXBwbHlMYXlvdXREU0wiLCJhcHBseUxheW91dERTTCIsImNvbHMiLCJhcmciLCJjb2xGcm9tU3RyaW5nIiwidGVzdCIsInNwbGl0Iiwicm93IiwibGVmdENvbHVtbldpZHRoIiwiZm9yRWFjaCIsImNvbHVtbnMiLCJNYXRoIiwibWluIiwiZmxvb3IiLCJyIiwiaSIsInRleHQiLCJwYWRkaW5nIiwibWVhc3VyZVBhZGRpbmciLCJub0Fuc2kiLCJzdHJpcEFuc2kiLCJtYXRjaCIsImxpbmVzIiwicm93VG9TdHJpbmciLCJsaW5lIiwiaGlkZGVuIiwicmFzdGVyaXplIiwicnJvdyIsImNvbCIsImMiLCJ3cmFwV2lkdGgiLCJuZWdhdGVQYWRkaW5nIiwidHMiLCJmbiIsImFkZEJvcmRlciIsInJlbmRlcklubGluZSIsInJlcGxhY2UiLCJzb3VyY2UiLCJwcmV2aW91c0xpbmUiLCJsZWFkaW5nV2hpdGVzcGFjZSIsInRhcmdldCIsInRhcmdldFRleHRXaWR0aCIsInRyaW1SaWdodCIsInRyaW1MZWZ0IiwicnJvd3MiLCJ3aWR0aHMiLCJjb2x1bW5XaWR0aHMiLCJ3cmFwcGVkIiwiaGFyZCIsImJvcmRlciIsInVuc2hpZnQiLCJBcnJheSIsImZpbGwiLCJ1bnNldCIsInJlbWFpbmluZ1dpZHRoIiwidW5zZXRXaWR0aCIsInciLCJtYXgiLCJtaW5XaWR0aCIsIl9taW5XaWR0aCIsInN0eWxlIiwiYW5zaSIsIlJlZ0V4cCIsInN0YXJ0IiwiY2hhckF0IiwiY2FtZWxDYXNlIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImluZGV4T2YiLCJjYW1lbGNhc2UiLCJuZXh0Q2hyVXBwZXIiLCJsZWFkaW5nSHlwaGVucyIsImNociIsImRlY2FtZWxpemUiLCJqb2luU3RyaW5nIiwibG93ZXJjYXNlIiwibm90Q2FtZWxjYXNlIiwiY2hyTG93ZXIiLCJjaHJTdHJpbmciLCJsb29rc0xpa2VOdW1iZXIiLCJ4IiwiRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkiLCJpbmNyZW1lbnQiLCJvcmlnIiwic2FuaXRpemVLZXkiLCJfYiIsIl9jIiwibWluTm9kZVZlcnNpb24iLCJZQVJHU19NSU5fTk9ERV9WRVJTSU9OIiwiTnVtYmVyIiwibm9kZVZlcnNpb24iLCJ2ZXJzaW9ucyIsIm5vZGUiLCJ2ZXJzaW9uIiwic2xpY2UiLCJwYXJzZXIiLCJfbWl4aW4iLCJwYXJzZSIsImFyZ3NJbnB1dCIsImFzc2lnbiIsImFsaWFzIiwiYXJyYXkiLCJib29sZWFuIiwiY29uZmlnT2JqZWN0cyIsImNvbmZpZ3VyYXRpb24iLCJjb2VyY2UiLCJkZWZhdWx0IiwiZW52UHJlZml4IiwibmFyZyIsIm5vcm1hbGl6ZSIsInN0cmluZyIsIm51bWJlciIsIl9fIiwiYXJnU3RyaW5nIiwiaXNBcnJheSIsImUiLCJwcmV2QyIsIm9wZW5pbmciLCJpaSIsInRva2VuaXplQXJnU3RyaW5nIiwiaW5wdXRJc1N0cmluZyIsImFsaWFzZXMiLCJhbGlhc0FycmF5cyIsImNvbWJpbmVkIiwiY3JlYXRlIiwiY2hhbmdlIiwiY29uY2F0IiwidiIsInNwbGljZSIsImFsaWFzQXJyYXkiLCJsYXN0QWxpYXMiLCJzZWxmIiwicG9wIiwiY29tYmluZUFsaWFzZXMiLCJkZWZhdWx0cyIsIm5vdEZsYWdzT3B0aW9uIiwibm90RmxhZ3NBcmd2IiwibmV3QWxpYXNlcyIsImRlZmF1bHRlZCIsImZvcm1hdCIsImZsYWdzIiwiYXJyYXlzIiwiYm9vbHMiLCJzdHJpbmdzIiwibnVtYmVycyIsImNvdW50cyIsImNvbmZpZ3MiLCJuYXJncyIsImNvZXJjaW9ucyIsIm5lZ2F0aXZlIiwibmVnYXRlZEJvb2xlYW4iLCJCb29sZWFuIiwib3B0IiwiYXNzaWdubWVudCIsIm9iaiIsInkiLCJleHRlbmRBbGlhc2VzIiwiZmluZCIsImNoZWNrQWxsQWxpYXNlcyIsIm5vdEZsYWdzIiwiXyIsImFyZ3ZSZXR1cm4iLCJ0cnVuY2F0ZWRBcmciLCJicm9rZW4iLCJsZXR0ZXJzIiwibSIsIm5leHQiLCJpc1Vua25vd25PcHRpb25Bc0FyZyIsInB1c2hQb3NpdGlvbmFsIiwiZWF0QXJyYXkiLCJlYXROYXJncyIsInNldEFyZyIsImRlZmF1bHRWYWx1ZSIsImoiLCJtYXliZUNvZXJjZWROdW1iZXIiLCJtYXliZUNvZXJjZU51bWJlciIsImFyZ0FmdGVyRXF1YWxTaWduIiwidG9FYXQiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiYXZhaWxhYmxlIiwiY29uc3VtZWQiLCJhcmdzVG9TZXQiLCJuYXJnc0NvdW50IiwiZGVmVmFsIiwicHJvY2Vzc1ZhbHVlIiwidmFsIiwic2hvdWxkU3RyaXBRdW90ZXMiLCJwcm9wIiwiYWRkTmV3QWxpYXMiLCJzcGxpdEtleSIsInNldEtleSIsImtleVByb3BlcnRpZXMiLCJhIiwic2hpZnQiLCJpbmNsdWRlcyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsInN1YnN0cmluZyIsInN0cmlwUXVvdGVzIiwiaXNTYWZlSW50ZWdlciIsInBhcnNlRmxvYXQiLCJzZXRDb25maWdPYmplY3QiLCJwcmV2IiwiZnVsbEtleSIsImhhc0tleSIsImFwcGx5RW52VmFycyIsImNvbmZpZ09ubHkiLCJwcmVmaXgiLCJlbnZWYXIiLCJsYXN0SW5kZXhPZiIsImFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzIiwiY2FuTG9nIiwibyIsImlzVHlwZUFycmF5IiwiaXNWYWx1ZUFycmF5IiwiZHVwbGljYXRlIiwiZmxhZyIsInRvQ2hlY2siLCJzZXRBbGlhcyIsImhhc0FueUZsYWciLCJmbGFnc0tleXMiLCJrIiwic29tZSIsImhhc0FsbEZsYWdzIiwiaGFzQWxsU2hvcnRGbGFncyIsInBhdHRlcm5zIiwicGF0dGVybiIsImhhc0ZsYWdzTWF0Y2hpbmciLCJpc1Vua25vd25PcHRpb24iLCJ0eXBlIiwiQk9PTEVBTiIsIlNUUklORyIsIk5VTUJFUiIsIkFSUkFZIiwiZ3Vlc3NUeXBlIiwibnVtIiwiY29uZmlnTG9va3VwIiwiY29uZmlnS2V5IiwiY29uZmlnUGF0aCIsInJlc29sdmVkQ29uZmlnUGF0aCIsInJlc29sdmVDb25maWciLCJyZXF1aXJlIiwiZXgiLCJuYW1lIiwic2V0Q29uZmlnIiwiY29uZmlnT2JqZWN0IiwiYXBwbGllZCIsIlNldCIsImhhcyIsImFsaSIsImFkZCIsImVyciIsImFwcGx5Q29lcmNpb25zIiwic2V0UGxhY2Vob2xkZXJLZXlzIiwiSlNPTiIsInJlYWRGaWxlU3luYyIsInlhcmdzUGFyc2VyIiwiZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCIsImVsZWN0cm9uIiwiZGVmYXVsdEFwcCIsImRldGFpbGVkIiwiWUVycm9yIiwibXNnIiwic3VwZXIiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInNoaW0kMyIsIndyaXRlRmlsZSIsImV4aXN0cyIsImZpbGUiLCJzdGF0U3luYyIsImlzRmlsZSIsInNoaW0iLCJZMThOIiwiZGlyZWN0b3J5IiwidXBkYXRlRmlsZXMiLCJsb2NhbGUiLCJmYWxsYmFja1RvTGFuZ3VhZ2UiLCJjYWNoZSIsIndyaXRlUXVldWUiLCJhcmd1bWVudHMiLCJfdGFnZ2VkTGl0ZXJhbCIsImNiIiwiX3JlYWRMb2NhbGVGaWxlIiwiX2VucXVldWVXcml0ZSIsImFwcGx5IiwiX19uIiwicHJvdG90eXBlIiwiY2FsbCIsInNpbmd1bGFyIiwicGx1cmFsIiwicXVhbnRpdHkiLCJvbmUiLCJvdGhlciIsInZhbHVlcyIsInNldExvY2FsZSIsImdldExvY2FsZSIsInVwZGF0ZUxvY2FsZSIsImhhc093blByb3BlcnR5IiwicGFydHMiLCJwYXJ0Iiwid29yayIsIl9wcm9jZXNzV3JpdGVRdWV1ZSIsIl90aGlzIiwibGFuZ3VhZ2VGaWxlIiwiX3Jlc29sdmVMb2NhbGVGaWxlIiwic2VyaWFsaXplZExvY2FsZSIsInN0cmluZ2lmeSIsImxvY2FsZUxvb2t1cCIsIlN5bnRheEVycm9yIiwibWVzc2FnZSIsIl9maWxlRXhpc3RzU3luYyIsIlJFUVVJUkVfRElSRUNUT1JZX0VSUk9SIiwiX19kaXJuYW1lIiwiZmlsZVVSTFRvUGF0aCIsInVybCIsInNoaW0kMSIsImFzc2VydCIsIm5vdFN0cmljdEVxdWFsIiwic3RyaWN0RXF1YWwiLCJjbGl1aSIsImZpbmRVcCIsImNhbGxiYWNrIiwidG1wIiwiZGlyIiwiaXNEaXJlY3RvcnkiLCJkaXJuYW1lIiwicmVhZGRpclN5bmMiLCJnZXRFbnYiLCJpbnNwZWN0IiwiZ2V0Q2FsbGVyRmlsZSIsImdldFByb2Nlc3NBcmd2QmluIiwibWFpbkZpbGVuYW1lIiwiUGFyc2VyIiwiYmFzZW5hbWUiLCJleHRuYW1lIiwiZW1pdFdhcm5pbmciLCJ3YXJuaW5nIiwiZXhlY1BhdGgiLCJleGl0IiwibmV4dFRpY2siLCJzdGRDb2x1bW5zIiwicmVxdWlyZURpcmVjdG9yeSIsInkxOG4iLCJfc2hpbSIsImJpbmQiLCJfeTE4biIsImFzc2VydE5vdFN0cmljdEVxdWFsIiwiYWN0dWFsIiwiZXhwZWN0ZWQiLCJhc3NlcnRTaW5nbGVLZXkiLCJvYmplY3RLZXlzIiwib2JqZWN0IiwiaXNQcm9taXNlIiwibWF5YmVQcm9taXNlIiwidGhlbiIsInBhcnNlQ29tbWFuZCIsImNtZCIsInNwbGl0Q29tbWFuZCIsImJyZWdleCIsImZpcnN0Q29tbWFuZCIsInBhcnNlZENvbW1hbmQiLCJkZW1hbmRlZCIsIm9wdGlvbmFsIiwidmFyaWFkaWMiLCJwb3NpdGlvbk5hbWUiLCJhcmdzZXJ0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwicG9zaXRpb24iLCJjYWxsZXJBcmd1bWVudHMiLCJfbGVuZ3RoIiwidG90YWxDb21tYW5kcyIsIm9ic2VydmVkVHlwZSIsImFyZ3VtZW50VHlwZUVycm9yIiwid2FybiIsInN0YWNrIiwiYWxsb3dlZFR5cGVzIiwiR2xvYmFsTWlkZGxld2FyZSIsInlhcmdzIiwiZ2xvYmFsTWlkZGxld2FyZSIsImZyb3plbnMiLCJhZGRNaWRkbGV3YXJlIiwiYXBwbHlCZWZvcmVWYWxpZGF0aW9uIiwiZ2xvYmFsIiwibXV0YXRlcyIsImFkZENvZXJjZU1pZGRsZXdhcmUiLCJvcHRpb24iLCJnZXRBbGlhc2VzIiwiZ2V0TWlkZGxld2FyZSIsImZyZWV6ZSIsInVuZnJlZXplIiwiZnJvemVuIiwicmVzZXQiLCJhcHBseU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlcyIsImJlZm9yZVZhbGlkYXRpb24iLCJyZWR1Y2UiLCJhY2MiLCJtaWRkbGV3YXJlIiwiaW5pdGlhbE9iaiIsImFsbCIsIm1pZGRsZXdhcmVPYmoiLCJyZXN1bHQiLCJtYXliZUFzeW5jUmVzdWx0IiwiZ2V0UmVzdWx0IiwicmVzdWx0SGFuZGxlciIsImVycm9ySGFuZGxlciIsIkRFRkFVTFRfTUFSS0VSIiwiQ29tbWFuZEluc3RhbmNlIiwidXNhZ2UiLCJ2YWxpZGF0aW9uIiwicmVxdWlyZUNhY2hlIiwiaGFuZGxlcnMiLCJhbGlhc01hcCIsImFkZERpcmVjdG9yeSIsInJlcSIsImNhbGxlckZpbGUiLCJyZWN1cnNlIiwiZXh0ZW5zaW9ucyIsInBhcmVudFZpc2l0IiwidmlzaXQiLCJqb2luZWQiLCJmaWxlbmFtZSIsInZpc2l0ZWQiLCJhZGRIYW5kbGVyIiwiZGVzY3JpcHRpb24iLCJidWlsZGVyIiwiaGFuZGxlciIsImNvbW1hbmRNaWRkbGV3YXJlIiwiZGVwcmVjYXRlZCIsImNvbW1hbmRNaWRkbGV3YXJlRmFjdG9yeSIsImV2ZXJ5IiwiaXNDb21tYW5kQW5kQWxpYXNlcyIsImlzQ29tbWFuZEhhbmRsZXJEZWZpbml0aW9uIiwibW9kdWxlTmFtZSIsImV4dHJhY3REZXNjIiwiaXNDb21tYW5kQnVpbGRlckRlZmluaXRpb24iLCJpc0RlZmF1bHQiLCJwYXJzZWRBbGlhc2VzIiwib3JpZ2luYWwiLCJkZWZhdWx0Q29tbWFuZCIsImdldENvbW1hbmRIYW5kbGVycyIsImdldENvbW1hbmRzIiwiaGFzRGVmYXVsdENvbW1hbmQiLCJydW5Db21tYW5kIiwiY29tbWFuZEluZGV4IiwiaGVscE9ubHkiLCJoZWxwT3JWZXJzaW9uU2V0IiwiY29tbWFuZEhhbmRsZXIiLCJjdXJyZW50Q29udGV4dCIsImdldEludGVybmFsTWV0aG9kcyIsImdldENvbnRleHQiLCJwYXJlbnRDb21tYW5kcyIsImNvbW1hbmRzIiwiaXNEZWZhdWx0Q29tbWFuZCIsImZ1bGxDb21tYW5kcyIsImJ1aWxkZXJSZXN1bHQiLCJhcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlIiwiYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0IiwiaW5uZXJBcmd2IiwiaW5uZXJZYXJncyIsImlzQ29tbWFuZEJ1aWxkZXJDYWxsYmFjayIsImdldFVzYWdlSW5zdGFuY2UiLCJidWlsZGVyT3V0cHV0Iiwib3V0cHV0IiwicGFyc2VBbmRVcGRhdGVVc2FnZSIsImlzQ29tbWFuZEJ1aWxkZXJPcHRpb25EZWZpbml0aW9ucyIsInNob3VsZFVwZGF0ZVVzYWdlIiwidXNhZ2VGcm9tUGFyZW50Q29tbWFuZHNDb21tYW5kSGFuZGxlciIsInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzIiwiZ2V0VXNhZ2VEaXNhYmxlZCIsImdldFVzYWdlIiwicGMiLCJoYW5kbGVWYWxpZGF0aW9uQW5kR2V0UmVzdWx0IiwicG9zaXRpb25hbE1hcCIsImdldEhhc091dHB1dCIsInJ1blZhbGlkYXRpb24iLCJzZXRIYXNPdXRwdXQiLCJwb3B1bGF0ZURvdWJsZURhc2giLCJnZXRPcHRpb25zIiwicG9zdFByb2Nlc3MiLCJoYW5kbGVyUmVzdWx0IiwiY2FjaGVIZWxwTWVzc2FnZSIsImhhc1BhcnNlQ2FsbGJhY2siLCJjYXRjaCIsImZhaWwiLCJfZXJyIiwicG9wdWxhdGVQb3NpdGlvbmFscyIsIm1heWJlUHJvbWlzZUFyZ3YiLCJyZXNvbHZlZElubmVyQXJndiIsImNvbnRleHQiLCJwb3NpdGlvbmFsQ291bnQiLCJkZW1hbmQiLCJwb3B1bGF0ZVBvc2l0aW9uYWwiLCJtYXliZSIsInBvc3RQcm9jZXNzUG9zaXRpb25hbHMiLCJjbWRUb1BhcnNlT3B0aW9ucyIsInBvc2l0aW9uYWwiLCJTdHJpbmciLCJjbWRTdHJpbmciLCJwYXJzZU9wdGlvbnMiLCJkIiwidW5wYXJzZWQiLCJwb3NpdGlvbmFsS2V5cyIsImlzSW5Db25maWdzIiwiaXNEZWZhdWx0ZWQiLCJydW5EZWZhdWx0QnVpbGRlck9uIiwiY29tbWFuZFN0cmluZyIsIm1vZCIsImV4cG9ydGVkIiwiZmlsZXMiLCJleHBvcnRzIiwid2hpY2hNb2R1bGUiLCJjb21tYW5kRnJvbUZpbGVuYW1lIiwiZGVzY3JpYmUiLCJkZXNjIiwib2JqRmlsdGVyIiwic2V0QmxvY2tpbmciLCJibG9ja2luZyIsIl9zdHJlYW0iLCJzdHJlYW0iLCJfaGFuZGxlIiwiaXNUVFkiLCJpc0Jvb2xlYW4iLCJmYWlscyIsImZhaWxGbiIsImYiLCJmYWlsTWVzc2FnZSIsImdsb2JhbEZhaWxNZXNzYWdlIiwic2hvd0hlbHBPbkZhaWwiLCJlbmFibGVkIiwiaXNHbG9iYWxDb250ZXh0IiwiZmFpbHVyZU91dHB1dCIsImxvZ2dlciIsImdldExvZ2dlckluc3RhbmNlIiwiZ2V0RXhpdFByb2Nlc3MiLCJzaG93SGVscCIsImdsb2JhbE9yQ29tbWFuZEZhaWxNZXNzYWdlIiwidXNhZ2VzIiwidXNhZ2VEaXNhYmxlZCIsImdldFBvc2l0aW9uYWxHcm91cE5hbWUiLCJleGFtcGxlcyIsImV4YW1wbGUiLCJjbWRBcnJheSIsImRlc2NyaXB0aW9ucyIsImtleU9yS2V5cyIsImdldERlc2NyaXB0aW9ucyIsImVwaWxvZ3MiLCJlcGlsb2ciLCJ3cmFwU2V0IiwiZ2V0V3JhcCIsIm1heFdpZHRoIiwid2luZG93V2lkdGgiLCJkZWZlclkxOG5Mb29rdXBQcmVmaXgiLCJ0YWJsZSIsInRoZVdyYXAiLCJtb2RpZmllciIsImdldFRleHQiLCJnZXRJbmRlbnRhdGlvbiIsInBhcnNlSW50IiwiY2FjaGVkSGVscE1lc3NhZ2UiLCJmaWx0ZXJIaWRkZW5PcHRpb25zIiwiaGlkZGVuT3B0aW9ucyIsInNob3dIaWRkZW5PcHQiLCJkZWZhdWx0U3RyaW5nIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwiZGVmZXJZMThuTG9va3VwIiwiaGVscCIsImRlbWFuZGVkT3B0aW9ucyIsImdldERlbWFuZGVkT3B0aW9ucyIsImRlbWFuZE9wdGlvbiIsIm5vcm1hbGl6ZUFsaWFzZXMiLCJiYXNlJDAiLCJjdXN0b21TY3JpcHROYW1lIiwiJDAiLCJkZW1hbmRlZENvbW1hbmRzIiwiZ2V0RGVtYW5kZWRDb21tYW5kcyIsImRlcHJlY2F0ZWRPcHRpb25zIiwiZ2V0RGVwcmVjYXRlZE9wdGlvbnMiLCJncm91cHMiLCJnZXRHcm91cHMiLCJ1aSIsInUiLCJnZXRQYXJzZXJDb25maWd1cmF0aW9uIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwiaGludHMiLCJhbGlhc0tleXMiLCJkZWZhdWx0R3JvdXAiLCJncm91cGVkS2V5cyIsImdyb3VwIiwiYWRkVW5ncm91cGVkS2V5cyIsImlzTG9uZ1N3aXRjaCIsInN3IiwiZGlzcGxheWVkR3JvdXBzIiwiZ3JvdXBOYW1lIiwibm9ybWFsaXplZEtleXMiLCJhbGlhc0tleSIsInN3aXRjaGVzIiwic3cxIiwic3cyIiwiaW5kZW50IiwiaXNJbmRlbnRlZFRleHQiLCJpbmRlbnRhdGlvbiIsImtzd2l0Y2giLCJleHRyYSIsImNob2ljZXMiLCJzdHJpbmdpZmllZFZhbHVlcyIsInNob3VsZEhpZGVPcHRpb25FeHRyYXMiLCJnZXRVc2FnZUNvbmZpZ3VyYXRpb24iLCJjbGVhckNhY2hlZEhlbHBNZXNzYWdlIiwiaGFzQ2FjaGVkSGVscE1lc3NhZ2UiLCJsZXZlbCIsImZ1bmN0aW9uRGVzY3JpcHRpb24iLCJzZXBhcmF0b3IiLCJzZXAiLCJ2ZXIiLCJzaG93VmVyc2lvbiIsImxvY2FsTG9va3VwIiwiQ29tcGxldGlvbiIsImNvbXBsZXRpb25LZXkiLCJjdXN0b21Db21wbGV0aW9uRnVuY3Rpb24iLCJpbmRleEFmdGVyTGFzdFJlc2V0IiwienNoU2hlbGwiLCJkZWZhdWx0Q29tcGxldGlvbiIsImN1cnJlbnQiLCJkb25lIiwiY29tcGxldGlvbnMiLCJjb21tYW5kQ29tcGxldGlvbnMiLCJvcHRpb25Db21wbGV0aW9ucyIsImNob2ljZXNGcm9tT3B0aW9uc0NvbXBsZXRpb25zIiwiY2hvaWNlc0Zyb21Qb3NpdGlvbmFsc0NvbXBsZXRpb25zIiwicHJldmlvdXNBcmdIYXNDaG9pY2VzIiwidXNhZ2VDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJuZWdhYmxlIiwiYXJnc0NvbnRhaW5LZXkiLCJjb21wbGV0ZU9wdGlvbktleSIsImdldFByZXZpb3VzQXJnQ2hvaWNlcyIsIm9mZnNldCIsInBvc2l0aW9uYWxLZXkiLCJjaG9pY2UiLCJzdGFydHNXaXRoIiwicHJldmlvdXNBcmciLCJwcmV2aW91c0FyZ0tleSIsInBvc3NpYmxlQWxpYXNlcyIsInBvc3NpYmxlQWxpYXMiLCJhcmdzQ29udGFpbnMiLCJzIiwiX2QiLCJrZXlXaXRoRGVzYyIsImRlc2NzIiwiZGVzY0Zyb21BbGlhcyIsImRhc2hlcyIsInN0YXJ0c0J5VHdvRGFzaGVzIiwiaXNTaG9ydE9wdGlvbiIsImN1c3RvbUNvbXBsZXRpb24iLCJsaXN0IiwiY29tcGxldGlvbkZ1bmN0aW9uIiwiaXNGYWxsYmFja0NvbXBsZXRpb25GdW5jdGlvbiIsIm9uQ29tcGxldGVkIiwiZ2V0Q29tcGxldGlvbiIsImdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCIsInNjcmlwdCIsInJlZ2lzdGVyRnVuY3Rpb24iLCJzZXRQYXJzZWQiLCJsZXZlbnNodGVpbiIsIm1hdHJpeCIsInNwZWNpYWxLZXlzIiwicHJldmlvdXNseVZpc2l0ZWRDb25maWdzIiwiYXBwbHlFeHRlbmRzIiwibWVyZ2VFeHRlbmRzIiwiZGVmYXVsdENvbmZpZyIsImV4dGVuZHMiLCJpc1BhdGgiLCJwYXRoVG9EZWZhdWx0IiwicGF0aFRvRXh0ZW5kIiwiZ2V0UGF0aFRvRGVmYXVsdENvbmZpZyIsImNmZ1BhdGgiLCJjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyIsIm1lcmdlRGVlcCIsImNvbmZpZzEiLCJjb25maWcyIiwiaXNPYmplY3QiLCJfWWFyZ3NJbnN0YW5jZV9jb21tYW5kIiwiX1lhcmdzSW5zdGFuY2VfY3dkIiwiX1lhcmdzSW5zdGFuY2VfY29udGV4dCIsIl9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb24iLCJfWWFyZ3NJbnN0YW5jZV9jb21wbGV0aW9uQ29tbWFuZCIsIl9ZYXJnc0luc3RhbmNlX2RlZmF1bHRTaG93SGlkZGVuT3B0IiwiX1lhcmdzSW5zdGFuY2VfZXhpdEVycm9yIiwiX1lhcmdzSW5zdGFuY2VfZGV0ZWN0TG9jYWxlIiwiX1lhcmdzSW5zdGFuY2VfZW1pdHRlZFdhcm5pbmdzIiwiX1lhcmdzSW5zdGFuY2VfZXhpdFByb2Nlc3MiLCJfWWFyZ3NJbnN0YW5jZV9mcm96ZW5zIiwiX1lhcmdzSW5zdGFuY2VfZ2xvYmFsTWlkZGxld2FyZSIsIl9ZYXJnc0luc3RhbmNlX2dyb3VwcyIsIl9ZYXJnc0luc3RhbmNlX2hhc091dHB1dCIsIl9ZYXJnc0luc3RhbmNlX2hlbHBPcHQiLCJfWWFyZ3NJbnN0YW5jZV9pc0dsb2JhbENvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9sb2dnZXIiLCJfWWFyZ3NJbnN0YW5jZV9vdXRwdXQiLCJfWWFyZ3NJbnN0YW5jZV9vcHRpb25zIiwiX1lhcmdzSW5zdGFuY2VfcGFyZW50UmVxdWlyZSIsIl9ZYXJnc0luc3RhbmNlX3BhcnNlckNvbmZpZyIsIl9ZYXJnc0luc3RhbmNlX3BhcnNlRm4iLCJfWWFyZ3NJbnN0YW5jZV9wYXJzZUNvbnRleHQiLCJfWWFyZ3NJbnN0YW5jZV9wa2dzIiwiX1lhcmdzSW5zdGFuY2VfcHJlc2VydmVkR3JvdXBzIiwiX1lhcmdzSW5zdGFuY2VfcHJvY2Vzc0FyZ3MiLCJfWWFyZ3NJbnN0YW5jZV9yZWNvbW1lbmRDb21tYW5kcyIsIl9ZYXJnc0luc3RhbmNlX3NoaW0iLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3QiLCJfWWFyZ3NJbnN0YW5jZV9zdHJpY3RDb21tYW5kcyIsIl9ZYXJnc0luc3RhbmNlX3N0cmljdE9wdGlvbnMiLCJfWWFyZ3NJbnN0YW5jZV91c2FnZSIsIl9ZYXJnc0luc3RhbmNlX3VzYWdlQ29uZmlnIiwiX1lhcmdzSW5zdGFuY2VfdmVyc2lvbk9wdCIsIl9ZYXJnc0luc3RhbmNlX3ZhbGlkYXRpb24iLCJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwicmVjZWl2ZXIiLCJzdGF0ZSIsImtpbmQiLCJUeXBlRXJyb3IiLCJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0Iiwia0NvcHlEb3VibGVEYXNoIiwiU3ltYm9sIiwia0NyZWF0ZUxvZ2dlciIsImtEZWxldGVGcm9tUGFyc2VySGludE9iamVjdCIsImtFbWl0V2FybmluZyIsImtGcmVlemUiLCJrR2V0RG9sbGFyWmVybyIsImtHZXRQYXJzZXJDb25maWd1cmF0aW9uIiwia0dldFVzYWdlQ29uZmlndXJhdGlvbiIsImtHdWVzc0xvY2FsZSIsImtHdWVzc1ZlcnNpb24iLCJrUGFyc2VQb3NpdGlvbmFsTnVtYmVycyIsImtQa2dVcCIsImtQb3B1bGF0ZVBhcnNlckhpbnRBcnJheSIsImtQb3B1bGF0ZVBhcnNlckhpbnRTaW5nbGVWYWx1ZURpY3Rpb25hcnkiLCJrUG9wdWxhdGVQYXJzZXJIaW50QXJyYXlEaWN0aW9uYXJ5Iiwia1BvcHVsYXRlUGFyc2VySGludERpY3Rpb25hcnkiLCJrU2FuaXRpemVLZXkiLCJrU2V0S2V5Iiwia1VuZnJlZXplIiwia1ZhbGlkYXRlQXN5bmMiLCJrR2V0Q29tbWFuZEluc3RhbmNlIiwia0dldENvbnRleHQiLCJrR2V0SGFzT3V0cHV0Iiwia0dldExvZ2dlckluc3RhbmNlIiwia0dldFBhcnNlQ29udGV4dCIsImtHZXRVc2FnZUluc3RhbmNlIiwia0dldFZhbGlkYXRpb25JbnN0YW5jZSIsImtIYXNQYXJzZUNhbGxiYWNrIiwia0lzR2xvYmFsQ29udGV4dCIsImtQb3N0UHJvY2VzcyIsImtSZWJhc2UiLCJrUmVzZXQiLCJrUnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMiLCJrUnVuVmFsaWRhdGlvbiIsImtTZXRIYXNPdXRwdXQiLCJrVHJhY2tNYW51YWxseVNldEtleXMiLCJZYXJnc0luc3RhbmNlIiwicHJvY2Vzc0FyZ3MiLCJwYXJlbnRSZXF1aXJlIiwiYWRkSGVscE9wdCIsImFkZFNob3dIaWRkZW5PcHQiLCJzaG93SGlkZGVuIiwiY2hlY2siLCJfeWFyZ3MiLCJzdHJpcEFsaWFzZWQiLCJjb25mbGljdHMiLCJrZXkxIiwia2V5MiIsInBhcnNlRm4iLCJjb21wbGV0aW9uIiwiY29tbWFuZERpciIsImRlbWFuZENvbW1hbmQiLCJtaW5Nc2ciLCJtYXhNc2ciLCJJbmZpbml0eSIsImRlcHJlY2F0ZU9wdGlvbiIsImRldGVjdExvY2FsZSIsImRldGVjdCIsImVwaWxvZ3VlIiwiZXhhbXBsZVBhcmFtcyIsImV4aXRQcm9jZXNzIiwiZ2V0RGV0ZWN0TG9jYWxlIiwiZ2V0SGVscCIsImJ1aWxkZXJSZXNwb25zZSIsImdldFN0cmljdCIsImdldFN0cmljdENvbW1hbmRzIiwiZ2V0U3RyaWN0T3B0aW9ucyIsImdsb2JhbHMiLCJsb2NhbCIsImwiLCJnIiwiZXhpc3RpbmciLCJzZWVuIiwiaGlkZSIsImltcGxpZXMiLCJkZXByZWNhdGUiLCJyZXF1aXJlZCIsImNvbmZpZ1BhcnNlciIsInNraXBWYWxpZGF0aW9uIiwicmVxdWlyZXNBcmciLCJzaG9ydENpcmN1aXQiLCJfcGFyc2VGbiIsInRtcFBhcnNlZCIsImZpbmFsbHkiLCJwYXJzZUFzeW5jIiwicGFyc2VTeW5jIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsInBrZ0NvbmYiLCJjb25mIiwic3VwcG9ydGVkT3B0cyIsImZ1bGxDb21tYW5kIiwicGsiLCJwYXJzZU9wdGlvbiIsInJlY29tbWVuZENvbW1hbmRzIiwicmVjb21tZW5kIiwiTmFOIiwic2hvd0NvbXBsZXRpb25TY3JpcHQiLCJsb2ciLCJzY3JpcHROYW1lIiwic3RyaWN0Iiwic3RyaWN0Q29tbWFuZHMiLCJzdHJpY3RPcHRpb25zIiwidGVybWluYWxXaWR0aCIsInVwZGF0ZVN0cmluZ3MiLCJ1c2FnZUNvbmZpZ3VyYXRpb24iLCJkZWZhdWx0VmVyc2lvbk9wdCIsIldlYWtNYXAiLCJvcHRpb25LZXkiLCJoaW50S2V5IiwiaGludCIsImRlZHVwbGljYXRpb25JZCIsImNvbXBsZXRpb25Db21tYW5kIiwiZXhpdEVycm9yIiwiaGFzT3V0cHV0IiwicGFyc2VDb250ZXh0IiwiZGVmYXVsdCQwIiwibnBhdGgiLCJzdGFydERpciIsInBrZ0pzb25QYXRoIiwibmFtZXMiLCJfbm9vcCIsInNpbmdsZUtleUhhbmRsZXIiLCJfZSIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJfbCIsIl9tIiwiX28iLCJnZXRDb21tYW5kSW5zdGFuY2UiLCJnZXRQYXJzZUNvbnRleHQiLCJnZXRWYWxpZGF0aW9uSW5zdGFuY2UiLCJjYWxsZWRGcm9tQ29tbWFuZCIsInJ1bkdsb2JhbE1pZGRsZXdhcmUiLCJ0bXBPcHRpb25zIiwiVXNhZ2UiLCJfcyIsIm9ic2VydmVkIiwibWlzc2luZyIsImN1c3RvbU1zZ3MiLCJjdXN0b21Nc2ciLCJjaGVja1Bvc2l0aW9uYWxzIiwiY29tbWFuZEtleXMiLCJ1bmtub3duIiwiaXNWYWxpZEFuZFNvbWVBbGlhc0lzTm90TmV3IiwibWF4Tm9uT3B0RGVtYW5kZWQiLCJpbnZhbGlkIiwiaW52YWxpZEtleXMiLCJpbXBsaWVkIiwia2V5RXhpc3RzIiwiZ2V0SW1wbGllZCIsImltcGxpY2F0aW9ucyIsImltcGx5RmFpbCIsIm9yaWdLZXkiLCJvcmlnVmFsdWUiLCJjb25mbGljdGluZyIsImdldENvbmZsaWN0aW5nIiwicG90ZW50aWFsQ29tbWFuZHMiLCJyZWNvbW1lbmRlZCIsImJlc3REaXN0YW5jZSIsImNhbmRpZGF0ZSIsImRpc3RhbmNlIiwiVmFsaWRhdGlvbiIsIkNvbW1hbmQiLCJiYXNlIiwiYXJndlByb21pc2UiLCJoZWxwT3B0U2V0IiwidmVyc2lvbk9wdFNldCIsImhhbmRsZXJLZXlzIiwicmVxdWVzdENvbXBsZXRpb25zIiwic2tpcFJlY29tbWVuZGF0aW9uIiwiZmlyc3RVbmtub3duQ29tbWFuZCIsImNvbXBsZXRpb25BcmdzIiwicGFyc2VFcnJvcnMiLCJub25PcHRpb25Db3VudCIsInJlcXVpcmVkQXJndW1lbnRzIiwiZmFpbGVkU3RyaWN0Q29tbWFuZHMiLCJ1bmtub3duQ29tbWFuZHMiLCJ1bmtub3duQXJndW1lbnRzIiwibGltaXRlZENob2ljZXMiLCJZYXJncyIsImVzbVBsYXRmb3JtU2hpbSIsImlzUnVubmluZ09uQnVuIiwiZW5kc1dpdGgiLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsIm1lbW9pemUiLCJjYWNoZUR1cmF0aW9uIiwidCIsIlBPU0lUSVZFX0lORklOSVRZIiwiY2FjaGVzIiwiY2FsY0tleSIsIm4iLCJjb2RlUG9pbnRBdCIsImltdWwiLCJwYWRTdGFydCIsIm1heENhY2hlZEFyZ3NTaXplIiwibWF4Q2FjaGVkVGhpc1NpemUiLCJEYXRlIiwibm93Iiwic2l6ZSIsImRlbGV0ZSIsImgiLCJtZW1vaXplRmFjdG9yeSIsIk1BWF9TQUZFX0lOVEVHRVIiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImRvY2tlclBhY2thZ2VKc29uIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwicCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJyb290IiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInVwZGF0ZSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJpbmNsdWRlUGF0dGVybnMiLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJwcmludGFibGVTY3JpcHQiLCJydW5uYWJsZVNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJleHRlbnNpb24iLCJiaW9tZUNvbW1hbmQiLCJiaW9tZVByb21pc2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiVVJMIiwiYWJzb2x1dGVQYXRoIiwicHJpc21hQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwicmVzdG9yZWQiLCJ0cmltRW5kIiwiZmlsdGVyZWQiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93IiwiaHR0cFNlcnZlclBhY2thZ2VzIiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwicHJvbWlzZUFsbCIsIm5ld0RlcHMiLCJuZXdEZXZEZXBzIiwiZGVwIiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3RhcnRQcm9kdWN0aW9uIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwidW5pdCIsIkNJIiwiRk9SQ0VfQ09MT1IiLCJzaG91bGRSdW5BbGxUZXN0cyIsInVuaXRUaW1lb3V0IiwidGVzdE9uRG9ja2VyIiwidHlwZUNoZWNrQ29tbWFuZCIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIl0sIm1hcHBpbmdzIjoia3JCQStDTyxTQUFTQSxFQUNkQyxFQUNBQyxFQUNBQyxHQUFlLEdBRWYsSUFBSUMsR0FBWUgsRUFBS0ksS0FBTyxJQUFJQyxLQUFLQyxHQUFZQyxFQUFLQyxRQUFRUCxFQUFLSyxFQUFRRyxjQUMzRSxNQUFNQyxFQUNKVixFQUFLVyxhQUNKWCxFQUFLWSxlQUNGQyxRQUFRVCxJQUFJVSxVQUFZLGNBQ3hCZCxFQUFLZSxlQUNIRixRQUFRVCxJQUFJWSxRQUFVSCxRQUFRVCxJQUFJVSxVQUFZLG1CQUM5Q0csR0FDUixHQUF1QixpQkFBWlAsRUFBc0IsQ0FDL0IsR0FBd0IsSUFBcEJQLEVBQVNlLFNBQ1hmLEVBQVNnQixLQUFLWixFQUFLYSxLQUFLbkIsRUFBSyxTQUN6QkQsRUFBS3FCLGdCQUFnQixDQUN2QixNQUFNQyxFQUFXZixFQUFLQyxRQUFRUCxFQUFLLEtBQU0sTUFDckNzQixFQUFHQyxXQUFXakIsRUFBS2EsS0FBS0UsRUFBVSxrQkFDcENuQixFQUFTZ0IsS0FBS1osRUFBS2EsS0FB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b3hDLEVBQWFweEMsRUFBSyxlQUN4QixHQUFJb3hDLEVBQVksQ0FDZCxNQUFNaFEsRUFBVTdnQyxFQUFLQyxRQUFRNHdDLEdBQzdCdndDLFFBQVF3d0MsTUFBTWpRLEVBQ2hCLEVoRWdIRyxTQUE4Q3QvQixHQUUvQ0EsRUFBUThnQyxNQUFROWdDLEVBQVF3dkMsbUJBQzFCeHZDLEVBQVE4Z0MsS0FBTzlnQyxFQUFROGdDLEtBQUtsNkIsUUFBUSxHQUFHNUcsRUFBUXd2QyxvQkFBcUIsSUFFakVwUCxXQUFXLG1DQUFvQyxJQUUvQ0EsV0FBVyxzQkFBdUIsSUFDbENBLFdBQVcsaUJBQWtCLEtBRWxDLElBQUssTUFBTWhnQyxLQUFPRSxPQUFPSSxLQUFLVixHQUFVLENBQ3RDLE1BQU15dkMsRUFBV3J2QyxFQUFJdUksZUFFbkI4bUMsRUFBUzVpQixXQUFXLFNBQ3BCNGlCLEVBQVM1aUIsV0FBVyxVQUNwQjRpQixFQUFTNWlCLFdBQVcsV0FDUCxnQkFBYjRpQixHQUNhLGFBQWJBLFdBRU96dkMsRUFBUUksRUFFbkIsQ0FDRixDZ0VwSUlzdkMsQ0FBcUMzd0MsUUFBUVQsSUFBSSxJQUVsRGtELFFBQVE4Z0MsSUFDUjlnQyxRQUFRMGxDLElBQ1IxbEMsUUFBUXNtQyxJQUNSdG1DLFFBQVF1b0MsSUFDUnZvQyxRQUFRdXBDLElBQ1J2cEMsUUFBUTZwQyxJQUNSN3BDLFFBQVE2ckMsSUFDUjdyQyxRQUFRK3NDLElBQ1Ivc0MsUUFBUXV0QyxJQUNSdnRDLFFBQVE0dEMsSUFDUmhhLGdCQUNBZ0QsU0FDQW5RLE9BQU8vcEIsS0FFVixJQUFLLE1BQU00RSxJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDL0QsUUFBUW1ELEdBQUdZLEdBQVEsSUFBTS9ELFFBQVE0YSIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzcsMzhdfQ==
|