@willbooster/wb 7.6.4 → 7.6.5

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 CHANGED
@@ -1,10 +1,10 @@
1
- import t,{resolve as e,dirname as n,normalize as s,basename as i,extname as r,relative as o}from"node:path";import{notStrictEqual as a,strictEqual as c}from"node:assert";import l,{statSync as h,readdirSync as d,readFileSync as u,writeFile as f}from"node:fs";import{format as p,inspect as g}from"node:util";import{fileURLToPath as m}from"node:url";import y,{spawn as b,spawnSync as v}from"node:child_process";import{createHash as w}from"node:crypto";import O from"chalk";import{globby as E}from"globby";import{config as k}from"dotenv";import A from"kill-port";import{PromisePool as j}from"minimal-promise-pool";import $ from"tree-kill";import _ from"node:fs/promises";import x from"node:os";function C(e,n,s=!0){let i=(e.env??[]).map((e=>t.resolve(n,e.toString())));const r=e.cascadeEnv??(e.cascadeNodeEnv?process.env.NODE_ENV||"development":e.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof r){if(0===i.length&&(i.push(t.join(n,".env")),e.includeRootEnv)){const e=t.resolve(n,"..","..");l.existsSync(t.join(e,"package.json"))&&i.push(t.join(e,".env"))}i=i.flatMap((t=>r?[`${t}.${r}.local`,`${t}.local`,`${t}.${r}`,t]:[`${t}.local`,t]))}i=i.map((e=>t.relative(n,e))),e.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",i));let o={};const a={...process.env};for(const e of i){o={...P(t.join(n,e),s),...o};let i=0;for(const[t,e]of Object.entries(o))a[t]!==e&&(a[t]=e,i++);i>0&&console.info(`Read ${i} environment variables:`,e)}if(e.checkEnv){const r=Object.keys(P(t.join(n,e.checkEnv),s)||{}).filter((t=>!(t in o)));if(r.length>0)throw new Error(`Missing environment variables in [${i.join(", ")}]: [${r.join(", ")}]`)}return o}const S=new Map;function P(e,n=!0){const s=n&&S.get(e);if(s)return s;const i=k({path:t.resolve(e),processEnv:{}}).parsed??{};return n&&S.set(e,i),i}function N(t){return new Promise((e=>{l.access(t,l.constants.F_OK,(t=>{e(!t)}))}))}async function M(t,e,n){return new Promise(((s,i)=>{try{const r=b(t,e??[],n??{});r.stdout?.setEncoding?.("utf8"),r.stderr?.setEncoding?.("utf8");let o="",a="";n?.input&&(r.stdin?.write(n.input),r.stdin?.end()),r.stdout?.on("data",(t=>{o+=t})),r.stderr?.on("data",(t=>{n?.mergeOutAndError?o+=t:a+=t}));let c=!1;const l=()=>{!c&&r.pid&&(c=!0,n?.verbose&&console.info(`treeKill(${r.pid})`),$(r.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),r.on("error",(t=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),r.removeAllListeners("close"),i(t)})),r.on("close",((t,e)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===r.pid?i(new Error("Process has no pid.")):s({pid:r.pid,stdout:o,stderr:a,status:t,signal:e})}))}catch(t){i(t)}}))}const D={right:function(t,e){t=t.trim();const n=W.stringWidth(t);if(n<e)return" ".repeat(e-n)+t;return t},center:function(t,e){t=t.trim();const n=W.stringWidth(t);if(n>=e)return t;return" ".repeat(e-n>>1)+t}};class I{constructor(t){var e;this.width=t.width,this.wrap=null===(e=t.wrap)||void 0===e||e,this.rows=[]}span(...t){this.div(...t).span=!0}resetOutput(){this.rows=[]}div(...t){if(0===t.length&&this.div(""),this.wrap&&this.shouldApplyLayoutDSL(...t)&&"string"==typeof t[0])return this.applyLayoutDSL(t[0]);const e=t.map((t=>"string"==typeof t?this.colFromString(t):t));return this.rows.push(e),e}shouldApplyLayoutDSL(...t){return 1===t.length&&"string"==typeof t[0]&&/[\t\n]/.test(t[0])}applyLayoutDSL(t){const e=t.split("\n").map((t=>t.split("\t")));let n=0;return e.forEach((t=>{t.length>1&&W.stringWidth(t[0])>n&&(n=Math.min(Math.floor(.5*this.width),W.stringWidth(t[0])))})),e.forEach((t=>{this.div(...t.map(((e,s)=>({text:e.trim(),padding:this.measurePadding(e),width:0===s&&t.length>1?n:void 0}))))})),this.rows[this.rows.length-1]}colFromString(t){return{text:t,padding:this.measurePadding(t)}}measurePadding(t){const e=W.stripAnsi(t);return[0,e.match(/\s*$/)[0].length,0,e.match(/^\s*/)[0].length]}toString(){const t=[];return this.rows.forEach((e=>{this.rowToString(e,t)})),t.filter((t=>!t.hidden)).map((t=>t.text)).join("\n")}rowToString(t,e){return this.rasterize(t).forEach(((n,s)=>{let i="";n.forEach(((n,r)=>{const{width:o}=t[r],a=this.negatePadding(t[r]);let c=n;if(a>W.stringWidth(n)&&(c+=" ".repeat(a-W.stringWidth(n))),t[r].align&&"left"!==t[r].align&&this.wrap){c=(0,D[t[r].align])(c,a),W.stringWidth(c)<a&&(c+=" ".repeat((o||0)-W.stringWidth(c)-1))}const l=t[r].padding||[0,0,0,0];l[3]&&(i+=" ".repeat(l[3])),i+=R(t[r],c,"| "),i+=c,i+=R(t[r],c," |"),l[1]&&(i+=" ".repeat(l[1])),0===s&&e.length>0&&(i=this.renderInline(i,e[e.length-1]))})),e.push({text:i.replace(/ +$/,""),span:t.span})})),e}renderInline(t,e){const n=t.match(/^ */),s=n?n[0].length:0,i=e.text,r=W.stringWidth(i.trimRight());return e.span?this.wrap?s<r?t:(e.hidden=!0,i.trimRight()+" ".repeat(s-r)+t.trimLeft()):(e.hidden=!0,i+t):t}rasterize(t){const e=[],n=this.columnWidths(t);let s;return t.forEach(((t,i)=>{t.width=n[i],s=this.wrap?W.wrap(t.text,this.negatePadding(t),{hard:!0}).split("\n"):t.text.split("\n"),t.border&&(s.unshift("."+"-".repeat(this.negatePadding(t)+2)+"."),s.push("'"+"-".repeat(this.negatePadding(t)+2)+"'")),t.padding&&(s.unshift(...new Array(t.padding[0]||0).fill("")),s.push(...new Array(t.padding[2]||0).fill(""))),s.forEach(((t,n)=>{e[n]||e.push([]);const s=e[n];for(let t=0;t<i;t++)void 0===s[t]&&s.push("");s.push(t)}))})),e}negatePadding(t){let e=t.width||0;return t.padding&&(e-=(t.padding[3]||0)+(t.padding[1]||0)),t.border&&(e-=4),e}columnWidths(t){if(!this.wrap)return t.map((t=>t.width||W.stringWidth(t.text)));let e=t.length,n=this.width;const s=t.map((t=>{if(t.width)return e--,n-=t.width,t.width})),i=e?Math.floor(n/e):0;return s.map(((e,n)=>void 0===e?Math.max(i,function(t){const e=t.padding||[],n=1+(e[3]||0)+(e[1]||0);if(t.border)return n+4;return n}(t[n])):e))}}function R(t,e,n){return t.border?/[.']-+[.']/.test(e)?"":0!==e.trim().length?n:" ":""}let W;const z=new RegExp("(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)","g");function T(t){return t.replace(z,"")}function F(t,e){const[n,s]=t.match(z)||["",""];t=T(t);let i="";for(let n=0;n<t.length;n++)0!==n&&n%e==0&&(i+="\n"),i+=t.charAt(n);return n&&s&&(i=`${n}${i}${s}`),i}
1
+ import e,{resolve as t,dirname as n,normalize as s,basename as i,extname as r,relative as o}from"node:path";import{notStrictEqual as a,strictEqual as c}from"node:assert";import l,{statSync as h,readdirSync as d,readFileSync as u,writeFile as f}from"node:fs";import{format as p,inspect as g}from"node:util";import{fileURLToPath as m}from"node:url";import y,{spawn as b,spawnSync as v}from"node:child_process";import{createHash as w}from"node:crypto";import O from"chalk";import{globby as E}from"globby";import{config as k}from"dotenv";import A from"kill-port";import{PromisePool as j}from"minimal-promise-pool";import $ from"tree-kill";import _ from"node:fs/promises";import x from"node:os";function C(t,n,s=!0){let i=(t.env??[]).map((t=>e.resolve(n,t.toString())));const r=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof r){if(0===i.length&&(i.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");l.existsSync(e.join(t,"package.json"))&&i.push(e.join(t,".env"))}i=i.flatMap((e=>r?[`${e}.${r}.local`,`${e}.local`,`${e}.${r}`,e]:[`${e}.local`,e]))}i=i.map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",i));let o={};const a={...process.env};for(const t of i){o={...P(e.join(n,t),s),...o};let i=0;for(const[e,t]of Object.entries(o))a[e]!==t&&(a[e]=t,i++);i>0&&console.info(`Read ${i} environment variables:`,t)}if(t.checkEnv){const r=Object.keys(P(e.join(n,t.checkEnv),s)||{}).filter((e=>!(e in o)));if(r.length>0)throw new Error(`Missing environment variables in [${i.join(", ")}]: [${r.join(", ")}]`)}return o}const S=new Map;function P(t,n=!0){const s=n&&S.get(t);if(s)return s;const i=k({path:e.resolve(t),processEnv:{}}).parsed??{};return n&&S.set(t,i),i}function N(e){return new Promise((t=>{l.access(e,l.constants.F_OK,(e=>{t(!e)}))}))}async function M(e,t,n){return new Promise(((s,i)=>{try{const r=b(e,t??[],n??{});r.stdout?.setEncoding?.("utf8"),r.stderr?.setEncoding?.("utf8");let o="",a="";r.stdout?.on("data",(e=>{o+=e})),r.stderr?.on("data",(e=>{n?.mergeOutAndError?o+=e:a+=e}));let c=!1;const l=()=>{!c&&r.pid&&(c=!0,n?.verbose&&console.info(`treeKill(${r.pid})`),$(r.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),r.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),r.removeAllListeners("close"),i(e)})),r.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===r.pid?i(new Error("Process has no pid.")):s({pid:r.pid,stdout:o,stderr:a,status:e,signal:t})})),n?.input&&(r.stdin?.write(n.input),r.stdin?.end())}catch(e){i(e)}}))}const D={right:function(e,t){e=e.trim();const n=W.stringWidth(e);if(n<t)return" ".repeat(t-n)+e;return e},center:function(e,t){e=e.trim();const n=W.stringWidth(e);if(n>=t)return e;return" ".repeat(t-n>>1)+e}};class I{constructor(e){var t;this.width=e.width,this.wrap=null===(t=e.wrap)||void 0===t||t,this.rows=[]}span(...e){this.div(...e).span=!0}resetOutput(){this.rows=[]}div(...e){if(0===e.length&&this.div(""),this.wrap&&this.shouldApplyLayoutDSL(...e)&&"string"==typeof e[0])return this.applyLayoutDSL(e[0]);const t=e.map((e=>"string"==typeof e?this.colFromString(e):e));return this.rows.push(t),t}shouldApplyLayoutDSL(...e){return 1===e.length&&"string"==typeof e[0]&&/[\t\n]/.test(e[0])}applyLayoutDSL(e){const t=e.split("\n").map((e=>e.split("\t")));let n=0;return t.forEach((e=>{e.length>1&&W.stringWidth(e[0])>n&&(n=Math.min(Math.floor(.5*this.width),W.stringWidth(e[0])))})),t.forEach((e=>{this.div(...e.map(((t,s)=>({text:t.trim(),padding:this.measurePadding(t),width:0===s&&e.length>1?n:void 0}))))})),this.rows[this.rows.length-1]}colFromString(e){return{text:e,padding:this.measurePadding(e)}}measurePadding(e){const t=W.stripAnsi(e);return[0,t.match(/\s*$/)[0].length,0,t.match(/^\s*/)[0].length]}toString(){const e=[];return this.rows.forEach((t=>{this.rowToString(t,e)})),e.filter((e=>!e.hidden)).map((e=>e.text)).join("\n")}rowToString(e,t){return this.rasterize(e).forEach(((n,s)=>{let i="";n.forEach(((n,r)=>{const{width:o}=e[r],a=this.negatePadding(e[r]);let c=n;if(a>W.stringWidth(n)&&(c+=" ".repeat(a-W.stringWidth(n))),e[r].align&&"left"!==e[r].align&&this.wrap){c=(0,D[e[r].align])(c,a),W.stringWidth(c)<a&&(c+=" ".repeat((o||0)-W.stringWidth(c)-1))}const l=e[r].padding||[0,0,0,0];l[3]&&(i+=" ".repeat(l[3])),i+=R(e[r],c,"| "),i+=c,i+=R(e[r],c," |"),l[1]&&(i+=" ".repeat(l[1])),0===s&&t.length>0&&(i=this.renderInline(i,t[t.length-1]))})),t.push({text:i.replace(/ +$/,""),span:e.span})})),t}renderInline(e,t){const n=e.match(/^ */),s=n?n[0].length:0,i=t.text,r=W.stringWidth(i.trimRight());return t.span?this.wrap?s<r?e:(t.hidden=!0,i.trimRight()+" ".repeat(s-r)+e.trimLeft()):(t.hidden=!0,i+e):e}rasterize(e){const t=[],n=this.columnWidths(e);let s;return e.forEach(((e,i)=>{e.width=n[i],s=this.wrap?W.wrap(e.text,this.negatePadding(e),{hard:!0}).split("\n"):e.text.split("\n"),e.border&&(s.unshift("."+"-".repeat(this.negatePadding(e)+2)+"."),s.push("'"+"-".repeat(this.negatePadding(e)+2)+"'")),e.padding&&(s.unshift(...new Array(e.padding[0]||0).fill("")),s.push(...new Array(e.padding[2]||0).fill(""))),s.forEach(((e,n)=>{t[n]||t.push([]);const s=t[n];for(let e=0;e<i;e++)void 0===s[e]&&s.push("");s.push(e)}))})),t}negatePadding(e){let t=e.width||0;return e.padding&&(t-=(e.padding[3]||0)+(e.padding[1]||0)),e.border&&(t-=4),t}columnWidths(e){if(!this.wrap)return e.map((e=>e.width||W.stringWidth(e.text)));let t=e.length,n=this.width;const s=e.map((e=>{if(e.width)return t--,n-=e.width,e.width})),i=t?Math.floor(n/t):0;return s.map(((t,n)=>void 0===t?Math.max(i,function(e){const t=e.padding||[],n=1+(t[3]||0)+(t[1]||0);if(e.border)return n+4;return n}(e[n])):t))}}function R(e,t,n){return e.border?/[.']-+[.']/.test(t)?"":0!==t.trim().length?n:" ":""}let W;const z=new RegExp("(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)","g");function T(e){return e.replace(z,"")}function F(e,t){const[n,s]=e.match(z)||["",""];e=T(e);let i="";for(let n=0;n<e.length;n++)0!==n&&n%t==0&&(i+="\n"),i+=e.charAt(n);return n&&s&&(i=`${n}${i}${s}`),i}
2
2
  /**
3
3
  * @license
4
4
  * Copyright (c) 2016, Contributors
5
5
  * SPDX-License-Identifier: ISC
6
6
  */
7
- function B(t){if(t!==t.toLowerCase()&&t!==t.toUpperCase()||(t=t.toLowerCase()),-1===t.indexOf("-")&&-1===t.indexOf("_"))return t;{let e="",n=!1;const s=t.match(/^-+/);for(let i=s?s[0].length:0;i<t.length;i++){let s=t.charAt(i);n&&(n=!1,s=s.toUpperCase()),0===i||"-"!==s&&"_"!==s?"-"!==s&&"_"!==s&&(e+=s):n=!0}return e}}function L(t,e){const n=t.toLowerCase();e=e||"-";let s="";for(let i=0;i<t.length;i++){const r=n.charAt(i),o=t.charAt(i);s+=r!==o&&i>0?`${e}${n.charAt(i)}`:o}return s}function V(t){return null!=t&&("number"==typeof t||(!!/^0x[0-9a-f]+$/i.test(t)||!/^0[^.]/.test(t)&&/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(t)))}
7
+ function B(e){if(e!==e.toLowerCase()&&e!==e.toUpperCase()||(e=e.toLowerCase()),-1===e.indexOf("-")&&-1===e.indexOf("_"))return e;{let t="",n=!1;const s=e.match(/^-+/);for(let i=s?s[0].length:0;i<e.length;i++){let s=e.charAt(i);n&&(n=!1,s=s.toUpperCase()),0===i||"-"!==s&&"_"!==s?"-"!==s&&"_"!==s&&(t+=s):n=!0}return t}}function L(e,t){const n=e.toLowerCase();t=t||"-";let s="";for(let i=0;i<e.length;i++){const r=n.charAt(i),o=e.charAt(i);s+=r!==o&&i>0?`${t}${n.charAt(i)}`:o}return s}function V(e){return null!=e&&("number"==typeof e||(!!/^0x[0-9a-f]+$/i.test(e)||!/^0[^.]/.test(e)&&/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)))}
8
8
  /**
9
9
  * @license
10
10
  * Copyright (c) 2016, Contributors
@@ -21,7 +21,7 @@ var U;
21
21
  * Copyright (c) 2016, Contributors
22
22
  * SPDX-License-Identifier: ISC
23
23
  */
24
- let H;!function(t){t.BOOLEAN="boolean",t.STRING="string",t.NUMBER="number",t.ARRAY="array"}(U||(U={}));function Y(t){return void 0!==t?t+1:1}function q(t){return"__proto__"===t?"___proto___":t}
24
+ let H;!function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"}(U||(U={}));function Y(e){return void 0!==e?e+1:1}function q(e){return"__proto__"===e?"___proto___":e}
25
25
  /**
26
26
  * @fileoverview Main entrypoint for libraries using yargs-parser in Node.js
27
27
  * CJS and ESM environments.
@@ -30,5 +30,5 @@ let H;!function(t){t.BOOLEAN="boolean",t.STRING="string",t.NUMBER="number",t.ARR
30
30
  * Copyright (c) 2016, Contributors
31
31
  * SPDX-License-Identifier: ISC
32
32
  */
33
- var J,G,K;const Q=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,X=null!==(G=null===(J=null===process||void 0===process?void 0:process.versions)||void 0===J?void 0:J.node)&&void 0!==G?G:null===(K=null===process||void 0===process?void 0:process.version)||void 0===K?void 0:K.slice(1);if(X){if(Number(X.match(/^([^.]+)/)[1])<Q)throw Error(`yargs parser supports a minimum Node.js version of ${Q}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const Z=process?process.env:{},tt=new class{constructor(t){H=t}parse(t,e){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},e),s=function(t){if(Array.isArray(t))return t.map((t=>"string"!=typeof t?t+"":t));t=t.trim();let e=0,n=null,s=null,i=null;const r=[];for(let o=0;o<t.length;o++)n=s,s=t.charAt(o)," "!==s||i?(s===i?i=null:"'"!==s&&'"'!==s||i||(i=s),r[e]||(r[e]=""),r[e]+=s):" "!==n&&e++;return r}(t),i="string"==typeof t,r=function(t){const e=[],n=Object.create(null);let s=!0;Object.keys(t).forEach((function(n){e.push([].concat(t[n],n))}));for(;s;){s=!1;for(let t=0;t<e.length;t++)for(let n=t+1;n<e.length;n++){if(e[t].filter((function(t){return-1!==e[n].indexOf(t)})).length){e[t]=e[t].concat(e[n]),e.splice(n,1),s=!0;break}}}return e.forEach((function(t){const e=(t=t.filter((function(t,e,n){return n.indexOf(t)===e}))).pop();void 0!==e&&"string"==typeof e&&(n[e]=t)})),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.__||H.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(t){const e="object"==typeof t?t.key:t,n=Object.keys(t).map((function(t){return{boolean:"bools",string:"strings",number:"numbers"}[t]})).filter(Boolean).pop();n&&(g[n][e]=!0),g.arrays[e]=!0,g.keys.push(e)})),[].concat(n.boolean||[]).filter(Boolean).forEach((function(t){g.bools[t]=!0,g.keys.push(t)})),[].concat(n.string||[]).filter(Boolean).forEach((function(t){g.strings[t]=!0,g.keys.push(t)})),[].concat(n.number||[]).filter(Boolean).forEach((function(t){g.numbers[t]=!0,g.keys.push(t)})),[].concat(n.count||[]).filter(Boolean).forEach((function(t){g.counts[t]=!0,g.keys.push(t)})),[].concat(n.normalize||[]).filter(Boolean).forEach((function(t){g.normalize[t]=!0,g.keys.push(t)})),"object"==typeof n.narg&&Object.entries(n.narg).forEach((([t,e])=>{"number"==typeof e&&(g.nargs[t]=e,g.keys.push(t))})),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach((([t,e])=>{"function"==typeof e&&(g.coercions[t]=e,g.keys.push(t))})),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach((function(t){g.configs[t]=!0})):"object"==typeof n.config&&Object.entries(n.config).forEach((([t,e])=>{"boolean"!=typeof e&&"function"!=typeof e||(g.configs[t]=e)}))),function(...t){t.forEach((function(t){Object.keys(t||{}).forEach((function(t){g.aliases[t]||(g.aliases[t]=[].concat(r[t]||[]),g.aliases[t].concat(t).forEach((function(e){if(/-/.test(e)&&o["camel-case-expansion"]){const n=B(e);n!==t&&-1===g.aliases[t].indexOf(n)&&(g.aliases[t].push(n),u[n]=!0)}})),g.aliases[t].concat(t).forEach((function(e){if(e.length>1&&/[A-Z]/.test(e)&&o["camel-case-expansion"]){const n=L(e,"-");n!==t&&-1===g.aliases[t].indexOf(n)&&(g.aliases[t].push(n),u[n]=!0)}})),g.aliases[t].forEach((function(e){g.aliases[e]=[t].concat(g.aliases[t].filter((function(t){return e!==t})))})))}))}))}(n.key,r,n.default,g.arrays),Object.keys(a).forEach((function(t){(g.aliases[t]||[]).forEach((function(e){a[e]=a[t]}))}));let b=null;Object.keys(g.counts).find((t=>D(t,g.arrays)?(b=Error(p("Invalid configuration: %s, opts.count excludes opts.array.",t)),!0):!!D(t,g.nargs)&&(b=Error(p("Invalid configuration: %s, opts.count excludes opts.narg.",t)),!0)));let v=[];const w=Object.assign(Object.create(null),{_:[]}),O={};for(let t=0;t<s.length;t++){const e=s[t],n=e.replace(/^-{3,}/,"---");let i,r,a,c,l,h;if("--"!==e&&/^-/.test(e)&&R(e))E(e);else{if(n.match(/^---+(=|$)/)){E(e);continue}if(e.match(/^--.+=/)||!o["short-option-groups"]&&e.match(/^-.+=/))c=e.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(D(c[1],g.arrays)?t=A(t,c[1],s,c[2]):!1!==D(c[1],g.nargs)?t=k(t,c[1],s,c[2]):j(c[1],c[2],!0));else if(e.match(y)&&o["boolean-negation"])c=e.match(y),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],j(r,!!D(r,g.arrays)&&[!1]));else if(e.match(/^--.+/)||!o["short-option-groups"]&&e.match(/^-[^-]+/))c=e.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],D(r,g.arrays)?t=A(t,r,s):!1!==D(r,g.nargs)?t=k(t,r,s):(l=s[t+1],void 0===l||l.match(/^-/)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),t++):j(r,W(r)):(j(r,l),t++)));else if(e.match(/^-.\..+=/))c=e.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&j(c[1],c[2]);else if(e.match(/^-.\..+/)&&!e.match(m))l=s[t+1],c=e.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),t++));else if(e.match(/^-[^-]+/)&&!e.match(m)){a=e.slice(1,-1).split(""),i=!1;for(let n=0;n<a.length;n++){if(l=e.slice(n+2),a[n+1]&&"="===a[n+1]){h=e.slice(n+3),r=a[n],D(r,g.arrays)?t=A(t,r,s,h):!1!==D(r,g.nargs)?t=k(t,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=e.slice(-1)[0],i||"-"===r||(D(r,g.arrays)?t=A(t,r,s):!1!==D(r,g.nargs)?t=k(t,r,s):(l=s[t+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(m)||D(r,g.bools)||D(r,g.counts)?/^(true|false)$/.test(l)?(j(r,l),t++):j(r,W(r)):(j(r,l),t++)))}else if(e.match(/^-[0-9]$/)&&e.match(m)&&D(e.slice(1),g.bools))r=e.slice(1),j(r,W(r));else{if("--"===e){v=s.slice(t+1);break}if(o["halt-at-non-option"]){v=s.slice(t);break}E(e)}}}function E(t){const e=x("_",t);"string"!=typeof e&&"number"!=typeof e||w._.push(e)}function k(t,e,n,s){let i,r=D(e,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return z(s)||(b=Error(p("Argument unexpected for: %s",e))),j(e,W(e)),t;let a=z(s)?0:1;if(o["nargs-eats-options"])n.length-(t+1)+a<r&&(b=Error(p("Not enough arguments following: %s",e))),a=r;else{for(i=t+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",e)))}let c=Math.min(a,r);for(!z(s)&&c>0&&(j(e,s),c--),i=t+1;i<c+t+1;i++)j(e,n[i]);return t+c}function A(t,e,n,s){let r=[],c=s||n[t+1];const l=D(e,g.nargs);if(D(e,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[e]){const t=a[e];r=Array.isArray(t)?t:[t]}}else{z(s)||r.push(_(e,s,!0));for(let s=t+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++)t=s,r.push(_(e,c,i))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(p("Not enough arguments following: %s",e))),j(e,r),t}function j(t,e,n=i){if(/-/.test(t)&&o["camel-case-expansion"]){const e=t.split(".").map((function(t){return B(t)})).join(".");$(t,e)}const s=_(t,e,n),r=t.split(".");if(M(w,r,s),g.aliases[t]&&g.aliases[t].forEach((function(t){const e=t.split(".");M(w,e,s)})),r.length>1&&o["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(e){let n=e.split(".");const i=[].concat(r);i.shift(),n=n.concat(i),(g.aliases[t]||[]).includes(n.join("."))||M(w,n,s)})),D(t,g.normalize)&&!D(t,g.arrays)){[t].concat(g.aliases[t]||[]).forEach((function(t){Object.defineProperty(O,t,{enumerable:!0,get:()=>e,set(t){e="string"==typeof t?H.normalize(t):t}})}))}}function $(t,e){g.aliases[t]&&g.aliases[t].length||(g.aliases[t]=[e],u[e]=!0),g.aliases[e]&&g.aliases[e].length||$(e,t)}function _(t,e,n){n&&(e=function(t){return"string"!=typeof t||"'"!==t[0]&&'"'!==t[0]||t[t.length-1]!==t[0]?t:t.substring(1,t.length-1)}(e)),(D(t,g.bools)||D(t,g.counts))&&"string"==typeof e&&(e="true"===e);let s=Array.isArray(e)?e.map((function(e){return x(t,e)})):x(t,e);return D(t,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=Y()),D(t,g.normalize)&&D(t,g.arrays)&&(s=Array.isArray(e)?e.map((t=>H.normalize(t))):H.normalize(e)),s}function x(t,e){if(!o["parse-positional-numbers"]&&"_"===t)return e;if(!D(t,g.strings)&&!D(t,g.bools)&&!Array.isArray(e)){(V(e)&&o["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))||!z(e)&&D(t,g.numbers))&&(e=Number(e))}return e}function C(t,e){Object.keys(t).forEach((function(n){const s=t[n],i=e?e+"."+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(t,e){if(void 0===l)return;const n="string"==typeof l?l:"",s=H.env();Object.keys(s).forEach((function(i){if(""===n||0===i.lastIndexOf(n,0)){const r=i.split("__").map((function(t,e){return 0===e&&(t=t.substring(n.length)),B(t)}));(e&&g.configs[r.join(".")]||!e)&&!N(t,r)&&j(r.join("."),s[i])}}))}function P(t,e,n,s=!1){Object.keys(n).forEach((function(i){N(t,i.split("."))||(M(t,i.split("."),n[i]),s&&(f[i]=!0),(e[i]||[]).forEach((function(e){N(t,e.split("."))||M(t,e.split("."),n[i])})))}))}function N(t,e){let n=t;o["dot-notation"]||(e=[e.join(".")]),e.slice(0,-1).forEach((function(t){n=n[t]||{}}));const s=e[e.length-1];return"object"==typeof n&&s in n}function M(t,e,n){let s=t;o["dot-notation"]||(e=[e.join(".")]),e.slice(0,-1).forEach((function(t){t=q(t),"object"==typeof s&&void 0===s[t]&&(s[t]={}),"object"!=typeof s[t]||Array.isArray(s[t])?(Array.isArray(s[t])?s[t].push({}):s[t]=[s[t],{}],s=s[t][s[t].length-1]):s=s[t]}));const i=q(e[e.length-1]),r=D(e.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===Y()?s[i]=Y(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(t,e){const n=[].concat(g.aliases[t]||[],t),s=Object.keys(e),i=n.find((t=>s.includes(t)));return!!i&&e[i]}function I(t){const e=Object.keys(g);return[].concat(e.map((t=>g[t]))).some((function(e){return Array.isArray(e)?e.includes(t):e[t]}))}function R(t){return o["unknown-options-as-args"]&&function(t){if(t=t.replace(/^-{3,}/,"--"),t.match(m))return!1;if(function(t){if(t.match(m)||!t.match(/^-[^-]+/))return!1;let e,n=!0;const s=t.slice(1).split("");for(let i=0;i<s.length;i++){if(e=t.slice(i+2),!I(s[i])){n=!1;break}if(s[i+1]&&"="===s[i+1]||"-"===e||/[A-Za-z]/.test(s[i])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(e)||s[i+1]&&s[i+1].match(/\W/))break}return n}(t))return!1;return!function(t,...e){return[].concat(...e).some((function(e){const n=t.match(e);return n&&I(n[1])}))}(t,/^-+([^=]+?)=[\s\S]*$/,y,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(t)}function W(t){return D(t,g.bools)||D(t,g.counts)||!(`${t}`in a)?(e=function(t){let e=U.BOOLEAN;return D(t,g.strings)?e=U.STRING:D(t,g.numbers)?e=U.NUMBER:D(t,g.bools)?e=U.BOOLEAN:D(t,g.arrays)&&(e=U.ARRAY),e}(t),{[U.BOOLEAN]:!0,[U.STRING]:"",[U.NUMBER]:void 0,[U.ARRAY]:[]}[e]):a[t];var e}function z(t){return void 0===t}return S(w,!0),S(w,!1),function(t){const e=Object.create(null);P(e,g.aliases,a),Object.keys(g.configs).forEach((function(n){const s=t[n]||e[n];if(s)try{let t=null;const e=H.resolve(H.cwd(),s),i=g.configs[n];if("function"==typeof i){try{t=i(e)}catch(e){t=e}if(t instanceof Error)return void(b=t)}else t=H.require(e);C(t)}catch(e){"PermissionDenied"===e.name?b=e:t[n]&&(b=Error(p("Invalid JSON config file: %s",s)))}}))}(w),void 0!==c&&c.forEach((function(t){C(t)})),P(w,g.aliases,a,!0),function(t){let e;const n=new Set;Object.keys(t).forEach((function(s){if(!n.has(s)&&(e=D(s,g.coercions),"function"==typeof e))try{const i=x(s,e(t[s]));[].concat(g.aliases[s]||[],s).forEach((e=>{n.add(e),t[e]=i}))}catch(t){b=t}}))}(w),o["set-placeholder-key"]&&function(t){g.keys.forEach((e=>{~e.indexOf(".")||void 0===t[e]&&(t[e]=void 0)}))}(w),Object.keys(g.counts).forEach((function(t){N(w,t.split("."))||j(t,0)})),h&&v.length&&(w[d]=[]),v.forEach((function(t){w[d].push(t)})),o["camel-case-expansion"]&&o["strip-dashed"]&&Object.keys(w).filter((t=>"--"!==t&&t.includes("-"))).forEach((t=>{delete w[t]})),o["strip-aliased"]&&[].concat(...Object.keys(r).map((t=>r[t]))).forEach((t=>{o["camel-case-expansion"]&&t.includes("-")&&delete w[t.split(".").map((t=>B(t))).join(".")],delete w[t]})),{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:()=>Z,format:p,normalize:s,resolve:e,require:t=>{if("undefined"!=typeof require)return require(t);if(t.match(/\.json$/))return JSON.parse(u(t,"utf8"));throw Error("only .json config files are supported in ESM")}}),et=function(t,e){return tt.parse(t.slice(),e).argv};function nt(){return process.versions.electron&&!process.defaultApp?0:1}et.detailed=function(t,e){return tt.parse(t.slice(),e)},et.camelCase=B,et.decamelize=L,et.looksLikeNumber=V;class st extends Error{constructor(t){super(t||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,st)}}var it={fs:{readFileSync:u,writeFile:f},format:p,resolve:e,exists:t=>{try{return h(t).isFile()}catch(t){return!1}}};let rt;class ot{constructor(t){t=t||{},this.directory=t.directory||"./locales",this.updateFiles="boolean"!=typeof t.updateFiles||t.updateFiles,this.locale=t.locale||"en",this.fallbackToLanguage="boolean"!=typeof t.fallbackToLanguage||t.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...t){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const e=t.shift();let n=function(){};return"function"==typeof t[t.length-1]&&(n=t.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][e]&&this.updateFiles?(this.cache[this.locale][e]=e,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),rt.format.apply(rt.format,[this.cache[this.locale][e]||e].concat(t))}__n(){const t=Array.prototype.slice.call(arguments),e=t.shift(),n=t.shift(),s=t.shift();let i=function(){};"function"==typeof t[t.length-1]&&(i=t.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===s?e:n;if(this.cache[this.locale][e]){r=this.cache[this.locale][e][1===s?"one":"other"]}!this.cache[this.locale][e]&&this.updateFiles?(this.cache[this.locale][e]={one:e,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:i})):i();const o=[r];return~r.indexOf("%d")&&o.push(s),rt.format.apply(rt.format,o.concat(t))}setLocale(t){this.locale=t}getLocale(){return this.locale}updateLocale(t){this.cache[this.locale]||this._readLocaleFile();for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(this.cache[this.locale][e]=t[e])}_taggedLiteral(t,...e){let n="";return t.forEach((function(t,s){const i=e[s+1];n+=t,void 0!==i&&(n+="%s")})),this.__.apply(this,[n].concat([].slice.call(e,1)))}_enqueueWrite(t){this.writeQueue.push(t),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const t=this,e=this.writeQueue[0],n=e.directory,s=e.locale,i=e.cb,r=this._resolveLocaleFile(n,s),o=JSON.stringify(this.cache[s],null,2);rt.fs.writeFile(r,o,"utf-8",(function(e){t.writeQueue.shift(),t.writeQueue.length>0&&t._processWriteQueue(),i(e)}))}_readLocaleFile(){let t={};const e=this._resolveLocaleFile(this.directory,this.locale);try{rt.fs.readFileSync&&(t=JSON.parse(rt.fs.readFileSync(e,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+e),"ENOENT"!==n.code)throw n;t={}}this.cache[this.locale]=t}_resolveLocaleFile(t,e){let n=rt.resolve(t,"./",e+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~e.lastIndexOf("_")){const s=rt.resolve(t,"./",e.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(t){return rt.exists(t)}}const at="loading a directory of commands is not supported yet for ESM";let ct;try{ct=m(import.meta.url)}catch(t){ct=process.cwd()}var lt,ht={assert:{notStrictEqual:a,strictEqual:c},cliui:function(t){return function(t,e){return W=e,new I({width:(null==t?void 0:t.width)||("object"==typeof process&&process.stdout&&process.stdout.columns?process.stdout.columns:80),wrap:null==t?void 0:t.wrap})}(t,{stringWidth:t=>[...t].length,stripAnsi:T,wrap:F})},findUp:function(t,s){let i,r=e(".",t);for(h(r).isDirectory()||(r=n(r));;){if(i=s(r,d(r)),i)return e(r,i);if(r=n(i=r),i===r)break}},getEnv:t=>process.env[t],inspect:g,getCallerFile:()=>{throw new st(at)},getProcessArgvBin:function(){return process.argv[nt()]},mainFilename:ct.substring(0,ct.lastIndexOf("node_modules"))||process.cwd(),Parser:et,path:{basename:i,dirname:n,extname:r,relative:o,resolve:e},process:{argv:()=>process.argv,cwd:process.cwd,emitWarning:(t,e)=>process.emitWarning(t,e),execPath:()=>process.execPath,exit:process.exit,nextTick:process.nextTick,stdColumns:void 0!==process.stdout.columns?process.stdout.columns:null},readFileSync:u,require:()=>{throw new st("require is not supported by ESM")},requireDirectory:()=>{throw new st(at)},stringWidth:t=>[...t].length,y18n:(lt={directory:e(ct,"../../../locales"),updateFiles:!1},function(t,e){rt=e;const n=new ot(t);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}}(lt,it))};function dt(t,e,n,s){n.assert.notStrictEqual(t,e,s)}function ut(t,e){e.assert.strictEqual(typeof t,"string")}function ft(t){return Object.keys(t)}function pt(t){return!!t&&!!t.then&&"function"==typeof t.then}function gt(t){const e=t.replace(/\s{2,}/g," ").split(/\s+(?![^[]*]|[^<]*>)/),n=/\.*[\][<>]/g,s=e.shift();if(!s)throw new Error(`No command found in: ${t}`);const i={cmd:s.replace(n,""),demanded:[],optional:[]};return e.forEach(((t,s)=>{let r=!1;t=t.replace(/\s/g,""),/\.+[\]>]/.test(t)&&s===e.length-1&&(r=!0),/^\[/.test(t)?i.optional.push({cmd:t.replace(n,"").split("|"),variadic:r}):i.demanded.push({cmd:t.replace(n,"").split("|"),variadic:r})})),i}const mt=["first","second","third","fourth","fifth","sixth"];function yt(t,e,n){try{let s=0;const[i,r,o]="object"==typeof t?[{demanded:[],optional:[]},t,e]:[gt(`cmd ${t}`),e,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 st(`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 st(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((t=>{const e=bt(a.shift());0===t.cmd.filter((t=>t===e||"*"===t)).length&&vt(e,t.cmd,s),s+=1})),i.optional.forEach((t=>{if(0===a.length)return;const e=bt(a.shift());0===t.cmd.filter((t=>t===e||"*"===t)).length&&vt(e,t.cmd,s),s+=1}))}catch(t){console.warn(t.stack)}}function bt(t){return Array.isArray(t)?"array":null===t?"null":typeof t}function vt(t,e,n){throw new st(`Invalid ${mt[n]||"manyith"} argument. Expected ${e.join(" or ")} but received ${t}.`)}class wt{constructor(t){this.globalMiddleware=[],this.frozens=[],this.yargs=t}addMiddleware(t,e,n=!0,s=!1){if(yt("<array|function> [boolean] [boolean] [boolean]",[t,e,n],arguments.length),Array.isArray(t)){for(let s=0;s<t.length;s++){if("function"!=typeof t[s])throw Error("middleware must be a function");const i=t[s];i.applyBeforeValidation=e,i.global=n}Array.prototype.push.apply(this.globalMiddleware,t)}else if("function"==typeof t){const i=t;i.applyBeforeValidation=e,i.global=n,i.mutates=s,this.globalMiddleware.push(t)}return this.yargs}addCoerceMiddleware(t,e){const n=this.yargs.getAliases();return this.globalMiddleware=this.globalMiddleware.filter((t=>{const s=[...n[e]||[],e];return!t.option||!s.includes(t.option)})),t.option=e,this.addMiddleware(t,!0,!0,!0)}getMiddleware(){return this.globalMiddleware}freeze(){this.frozens.push([...this.globalMiddleware])}unfreeze(){const t=this.frozens.pop();void 0!==t&&(this.globalMiddleware=t)}reset(){this.globalMiddleware=this.globalMiddleware.filter((t=>t.global))}}function Ot(t,e,n,s){return n.reduce(((t,n)=>{if(n.applyBeforeValidation!==s)return t;if(n.mutates){if(n.applied)return t;n.applied=!0}if(pt(t))return t.then((t=>Promise.all([t,n(t,e)]))).then((([t,e])=>Object.assign(t,e)));{const s=n(t,e);return pt(s)?s.then((e=>Object.assign(t,e))):Object.assign(t,s)}}),t)}function Et(t,e,n=(t=>{throw t})){try{const n="function"==typeof t?t():t;return pt(n)?n.then((t=>e(t))):e(n)}catch(t){return n(t)}}const kt=/(^\*)|(^\$0)/;class At{constructor(t,e,n,s){this.requireCache=new Set,this.handlers={},this.aliasMap={},this.frozens=[],this.shim=s,this.usage=t,this.globalMiddleware=n,this.validation=e}addDirectory(t,e,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:t=>t;s.visit=(t,e,n)=>{const s=i(t,e,n);if(s){if(this.requireCache.has(e))return s;this.requireCache.add(e),this.addHandler(s)}return s},this.shim.requireDirectory({require:e,filename:n},t,s)}addHandler(t,e,n,s,i,r){let o=[];const a=function(t){return t?t.map((t=>(t.applyBeforeValidation=!1,t))):[]}(i);if(s=s||(()=>{}),Array.isArray(t))if(function(t){return t.every((t=>"string"==typeof t))}(t))[t,...o]=t;else for(const e of t)this.addHandler(e);else{if(function(t){return"object"==typeof t&&!Array.isArray(t)}(t)){let e=Array.isArray(t.command)||"string"==typeof t.command?t.command:this.moduleName(t);return t.aliases&&(e=[].concat(e).concat(t.aliases)),void this.addHandler(e,this.extractDesc(t),t.builder,t.handler,t.middlewares,t.deprecated)}if(jt(n))return void this.addHandler([t].concat(o),e,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof t){const i=gt(t);o=o.map((t=>gt(t).cmd));let c=!1;const l=[i.cmd].concat(o).filter((t=>!kt.test(t)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),t=t.replace(kt,i.cmd)),o.forEach((t=>{this.aliasMap[t]=i.cmd})),!1!==e&&this.usage.command(t,e,c,o,r),this.handlers[i.cmd]={original:t,description:e,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(t,e,n,s,i,r){const o=this.handlers[t]||this.handlers[this.aliasMap[t]]||this.defaultCommand,a=e.getInternalMethods().getContext(),c=a.commands.slice(),l=!t;t&&(a.commands.push(t),a.fullCommands.push(o.original));const h=this.applyBuilderUpdateUsageAndParse(l,o,e,n.aliases,c,s,i,r);return pt(h)?h.then((t=>this.applyMiddlewareAndGetResult(l,o,t.innerArgv,a,i,t.aliases,e))):this.applyMiddlewareAndGetResult(l,o,h.innerArgv,a,i,h.aliases,e)}applyBuilderUpdateUsageAndParse(t,e,n,s,i,r,o,a){const c=e.builder;let l=n;if($t(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(pt(h))return h.then((s=>{var a;return l=(a=s)&&"function"==typeof a.getInternalMethods?s:n,this.parseAndUpdateUsage(t,e,l,i,r,o)}))}else(function(t){return"object"==typeof t})(c)&&(n.getInternalMethods().getUsageInstance().freeze(),l=n.getInternalMethods().reset(s),Object.keys(e.builder).forEach((t=>{l.option(t,c[t])})));return this.parseAndUpdateUsage(t,e,l,i,r,o)}parseAndUpdateUsage(t,e,n,s,i,r){t&&n.getInternalMethods().getUsageInstance().unfreeze(!0),this.shouldUpdateUsage(n)&&n.getInternalMethods().getUsageInstance().usage(this.usageFromParentCommandsCommandHandler(s,e),e.description);const o=n.getInternalMethods().runYargsParserAndExecuteCommands(null,void 0,!0,i,r);return pt(o)?o.then((t=>({aliases:n.parsed.aliases,innerArgv:t}))):{aliases:n.parsed.aliases,innerArgv:o}}shouldUpdateUsage(t){return!t.getInternalMethods().getUsageInstance().getUsageDisabled()&&0===t.getInternalMethods().getUsageInstance().getUsage().length}usageFromParentCommandsCommandHandler(t,e){const n=kt.test(e.original)?e.original.replace(kt,"").trim():e.original,s=t.filter((t=>!kt.test(t)));return s.push(n),`$0 ${s.join(" ")}`}handleValidationAndGetResult(t,e,n,s,i,r,o,a){if(!r.getInternalMethods().getHasOutput()){const e=r.getInternalMethods().runValidation(i,a,r.parsed.error,t);n=Et(n,(t=>(e(t),t)))}if(e.handler&&!r.getInternalMethods().getHasOutput()){r.getInternalMethods().setHasOutput();const s=!!r.getOptions().configuration["populate--"];r.getInternalMethods().postProcess(n,s,!1,!1),n=Et(n=Ot(n,r,o,!1),(t=>{const n=e.handler(t);return pt(n)?n.then((()=>t)):t})),t||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),pt(n)&&!r.getInternalMethods().hasParseCallback()&&n.catch((t=>{try{r.getInternalMethods().getUsageInstance().fail(null,t)}catch(t){}}))}return t||(s.commands.pop(),s.fullCommands.pop()),n}applyMiddlewareAndGetResult(t,e,n,s,i,r,o){let a={};if(i)return n;o.getInternalMethods().getHasOutput()||(a=this.populatePositionals(e,n,s,o));const c=this.globalMiddleware.getMiddleware().slice(0).concat(e.middlewares),l=Ot(n,o,c,!0);return pt(l)?l.then((n=>this.handleValidationAndGetResult(t,e,n,s,r,o,c,a))):this.handleValidationAndGetResult(t,e,l,s,r,o,c,a)}populatePositionals(t,e,n,s){e._=e._.slice(n.commands.length);const i=t.demanded.slice(0),r=t.optional.slice(0),o={};for(this.validation.positionalCount(i.length,e._.length);i.length;){const t=i.shift();this.populatePositional(t,e,o)}for(;r.length;){const t=r.shift();this.populatePositional(t,e,o)}return e._=n.commands.concat(e._.map((t=>""+t))),this.postProcessPositionals(e,o,this.cmdToParseOptions(t.original),s),o}populatePositional(t,e,n){const s=t.cmd[0];t.variadic?n[s]=e._.splice(0).map(String):e._.length&&(n[s]=[String(e._.shift())])}cmdToParseOptions(t){const e={array:[],default:{},alias:{},demand:{}},n=gt(t);return n.demanded.forEach((t=>{const[n,...s]=t.cmd;t.variadic&&(e.array.push(n),e.default[n]=[]),e.alias[n]=s,e.demand[n]=!0})),n.optional.forEach((t=>{const[n,...s]=t.cmd;t.variadic&&(e.array.push(n),e.default[n]=[]),e.alias[n]=s})),e}postProcessPositionals(t,e,n,s){const i=Object.assign({},s.getOptions());i.default=Object.assign(n.default,i.default);for(const t of Object.keys(n.alias))i.alias[t]=(i.alias[t]||[]).concat(n.alias[t]);i.array=i.array.concat(n.array),i.config={};const r=[];if(Object.keys(e).forEach((t=>{e[t].map((e=>{i.configuration["unknown-options-as-args"]&&(i.key[t]=!0),r.push(`--${t}`),r.push(e)}))})),!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(e);Object.keys(e).forEach((t=>{n.push(...a.aliases[t])})),Object.keys(a.argv).forEach((i=>{n.includes(i)&&(e[i]||(e[i]=a.argv[i]),!this.isInConfigs(s,i)&&!this.isDefaulted(s,i)&&Object.prototype.hasOwnProperty.call(t,i)&&Object.prototype.hasOwnProperty.call(a.argv,i)&&(Array.isArray(t[i])||Array.isArray(a.argv[i]))?t[i]=[].concat(t[i],a.argv[i]):t[i]=a.argv[i])}))}}isDefaulted(t,e){const{default:n}=t.getOptions();return Object.prototype.hasOwnProperty.call(n,e)||Object.prototype.hasOwnProperty.call(n,this.shim.Parser.camelCase(e))}isInConfigs(t,e){const{configObjects:n}=t.getOptions();return n.some((t=>Object.prototype.hasOwnProperty.call(t,e)))||n.some((t=>Object.prototype.hasOwnProperty.call(t,this.shim.Parser.camelCase(e))))}runDefaultBuilderOn(t){if(!this.defaultCommand)return;if(this.shouldUpdateUsage(t)){const e=kt.test(this.defaultCommand.original)?this.defaultCommand.original:this.defaultCommand.original.replace(/^[^[\]<>]*/,"$0 ");t.getInternalMethods().getUsageInstance().usage(e,this.defaultCommand.description)}const e=this.defaultCommand.builder;if($t(e))return e(t,!0);jt(e)||Object.keys(e).forEach((n=>{t.option(n,e[n])}))}moduleName(t){const e=function(t){if("undefined"==typeof require)return null;for(let e,n=0,s=Object.keys(require.cache);n<s.length;n++)if(e=require.cache[s[n]],e.exports===t)return e;return null}(t);if(!e)throw new Error(`No command name given for module: ${this.shim.inspect(t)}`);return this.commandFromFilename(e.filename)}commandFromFilename(t){return this.shim.path.basename(t,this.shim.path.extname(t))}extractDesc({describe:t,description:e,desc:n}){for(const s of[t,e,n]){if("string"==typeof s||!1===s)return s;dt(s,!0,this.shim)}return!1}freeze(){this.frozens.push({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand})}unfreeze(){const t=this.frozens.pop();dt(t,void 0,this.shim),({handlers:this.handlers,aliasMap:this.aliasMap,defaultCommand:this.defaultCommand}=t)}reset(){return this.handlers={},this.aliasMap={},this.defaultCommand=void 0,this.requireCache=new Set,this}}function jt(t){return"object"==typeof t&&!!t.builder&&"function"==typeof t.handler}function $t(t){return"function"==typeof t}function _t(t={},e=(()=>!0)){const n={};return ft(t).forEach((s=>{e(s,t[s])&&(n[s]=t[s])})),n}function xt(t){"undefined"!=typeof process&&[process.stdout,process.stderr].forEach((e=>{const n=e;n._handle&&n.isTTY&&"function"==typeof n._handle.setBlocking&&n._handle.setBlocking(t)}))}function Ct(t){return"boolean"==typeof t}function St(t,e){const n=e.y18n.__,s={},i=[];s.failFn=function(t){i.push(t)};let r=null,o=null,a=!0;s.showHelpOnFail=function(e=!0,n){const[i,c]="string"==typeof e?[!0,e]:[e,n];return t.getInternalMethods().isGlobalContext()&&(o=c),r=c,a=i,s};let c=!1;s.fail=function(e,n){const l=t.getInternalMethods().getLoggerInstance();if(!i.length){if(t.getExitProcess()&&xt(!0),!c){c=!0,a&&(t.showHelp("error"),l.error()),(e||n)&&l.error(e||n);const s=r||o;s&&((e||n)&&l.error(""),l.error(s))}if(n=n||new st(e),t.getExitProcess())return t.exit(1);if(t.getInternalMethods().hasParseCallback())return t.exit(1,n);throw n}for(let t=i.length-1;t>=0;--t){const r=i[t];if(Ct(r)){if(n)throw n;if(e)throw Error(e)}else r(e,n,s)}};let l=[],h=!1;s.usage=(t,e)=>null===t?(h=!0,l=[],s):(h=!1,l.push([t,e||""]),s),s.getUsage=()=>l,s.getUsageDisabled=()=>h,s.getPositionalGroupName=()=>n("Positionals:");let d=[];s.example=(t,e)=>{d.push([t,e||""])};let u=[];s.command=function(t,e,n,s,i=!1){n&&(u=u.map((t=>(t[2]=!1,t)))),u.push([t,e||"",n,s,i])},s.getCommands=()=>u;let f={};s.describe=function(t,e){Array.isArray(t)?t.forEach((t=>{s.describe(t,e)})):"object"==typeof t?Object.keys(t).forEach((e=>{s.describe(e,t[e])})):f[t]=e},s.getDescriptions=()=>f;let p=[];s.epilog=t=>{p.push(t)};let g,m=!1;s.wrap=t=>{m=!0,g=t},s.getWrap=()=>e.getEnv("YARGS_DISABLE_WRAP")?null:(m||(g=function(){const t=80;return e.process.stdColumns?Math.min(t,e.process.stdColumns):t}(),m=!0),g);const y="__yargsString__:";function b(t,n,s){let i=0;return Array.isArray(t)||(t=Object.values(t).map((t=>[t]))),t.forEach((t=>{i=Math.max(e.stringWidth(s?`${s} ${Mt(t[0])}`:Mt(t[0]))+Nt(t[0]),i)})),n&&(i=Math.min(i,parseInt((.5*n).toString(),10))),i}let v;function w(e){return t.getOptions().hiddenOptions.indexOf(e)<0||t.parsed.argv[t.getOptions().showHiddenOpt]}function O(t,e){let s=`[${n("default:")} `;if(void 0===t&&!e)return null;if(e)s+=e;else switch(typeof t){case"string":s+=`"${t}"`;break;case"object":s+=JSON.stringify(t);break;default:s+=t}return`${s}]`}s.deferY18nLookup=t=>y+t,s.help=function(){if(v)return v;!function(){const e=t.getDemandedOptions(),n=t.getOptions();(Object.keys(n.alias)||[]).forEach((i=>{n.alias[i].forEach((r=>{f[r]&&s.describe(i,f[r]),r in e&&t.demandOption(i,e[r]),n.boolean.includes(r)&&t.boolean(i),n.count.includes(r)&&t.count(i),n.string.includes(r)&&t.string(i),n.normalize.includes(r)&&t.normalize(i),n.array.includes(r)&&t.array(i),n.number.includes(r)&&t.number(i)}))}))}();const i=t.customScriptName?t.$0:e.path.basename(t.$0),r=t.getDemandedOptions(),o=t.getDemandedCommands(),a=t.getDeprecatedOptions(),c=t.getGroups(),g=t.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(((t,e)=>("_"!==e&&(t[e]=!0),t)),{}));const E=s.getWrap(),k=e.cliui({width:E,wrap:!!E});if(!h)if(l.length)l.forEach((t=>{k.div({text:`${t[0].replace(/\$0/g,i)}`}),t[1]&&k.div({text:`${t[1]}`,padding:[1,0,0,0]})})),k.div();else if(u.length){let t=null;t=o._?`${i} <${n("command")}>\n`:`${i} [${n("command")}]\n`,k.div(`${t}`)}if(u.length>1||1===u.length&&!u[0][2]){k.div(n("Commands:"));const e=t.getInternalMethods().getContext(),s=e.commands.length?`${e.commands.join(" ")} `:"";!0===t.getInternalMethods().getParserConfiguration()["sort-commands"]&&(u=u.sort(((t,e)=>t[0].localeCompare(e[0]))));const r=i?`${i} `:"";u.forEach((t=>{const e=`${r}${s}${t[0].replace(/^\$0 ?/,"")}`;k.span({text:e,padding:[0,2,0,2],width:b(u,E,`${i}${s}`)+4},{text:t[1]});const o=[];t[2]&&o.push(`[${n("default")}]`),t[3]&&t[3].length&&o.push(`[${n("aliases:")} ${t[3].join(", ")}]`),t[4]&&("string"==typeof t[4]?o.push(`[${n("deprecated: %s",t[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(t.parsed.newAliases)||[]);m=m.filter((e=>!t.parsed.newAliases[e]&&A.every((t=>-1===(g.alias[t]||[]).indexOf(e)))));const j=n("Options:");c[j]||(c[j]=[]),function(t,e,n,s){let i=[],r=null;Object.keys(n).forEach((t=>{i=i.concat(n[t])})),t.forEach((t=>{r=[t].concat(e[t]),r.some((t=>-1!==i.indexOf(t)))||n[s].push(t)}))}(m,g.alias,c,j);const $=t=>/^--/.test(Mt(t)),_=Object.keys(c).filter((t=>c[t].length>0)).map((t=>({groupName:t,normalizedKeys:c[t].filter(w).map((t=>{if(A.includes(t))return t;for(let e,n=0;void 0!==(e=A[n]);n++)if((g.alias[e]||[]).includes(t))return e;return t}))}))).filter((({normalizedKeys:t})=>t.length>0)).map((({groupName:t,normalizedKeys:e})=>{const n=e.reduce(((e,n)=>(e[n]=[n].concat(g.alias[n]||[]).map((e=>t===s.getPositionalGroupName()?e:(/^[0-9]$/.test(e)?g.boolean.includes(n)?"-":"--":e.length>1?"--":"-")+e)).sort(((t,e)=>$(t)===$(e)?0:$(t)?1:-1)).join(", "),e)),{});return{groupName:t,normalizedKeys:e,switches:n}}));if(_.filter((({groupName:t})=>t!==s.getPositionalGroupName())).some((({normalizedKeys:t,switches:e})=>!t.every((t=>$(e[t])))))&&_.filter((({groupName:t})=>t!==s.getPositionalGroupName())).forEach((({normalizedKeys:t,switches:e})=>{t.forEach((t=>{var n,s;$(e[t])&&(e[t]=(n=e[t],s=4,Pt(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),_.forEach((({groupName:e,normalizedKeys:i,switches:o})=>{k.div(e),i.forEach((e=>{const i=o[e];let c=f[e]||"",l=null;c.includes(y)&&(c=n(c.substring(16))),g.boolean.includes(e)&&(l=`[${n("boolean")}]`),g.count.includes(e)&&(l=`[${n("count")}]`),g.string.includes(e)&&(l=`[${n("string")}]`),g.normalize.includes(e)&&(l=`[${n("string")}]`),g.array.includes(e)&&(l=`[${n("array")}]`),g.number.includes(e)&&(l=`[${n("number")}]`);const h=[e in a?(d=a[e],"string"==typeof d?`[${n("deprecated: %s",d)}]`:`[${n("deprecated")}]`):null,l,e in r?`[${n("required")}]`:null,g.choices&&g.choices[e]?`[${n("choices:")} ${s.stringifiedValues(g.choices[e])}]`:null,O(g.default[e],g.defaultDescription[e])].filter(Boolean).join(" ");var d;k.span({text:Mt(i),padding:[0,2,0,2+Nt(i)],width:b(o,E)+4},c);const u=!0===t.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((t=>{t[0]=t[0].replace(/\$0/g,i)})),d.forEach((t=>{""===t[1]?k.div({text:t[0],padding:[0,2,0,2]}):k.div({text:t[0],padding:[0,2,0,2],width:b(d,E)+4},{text:t[1]})})),k.div()),p.length>0){const t=p.map((t=>t.replace(/\$0/g,i))).join("\n");k.div(`${t}\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=e=>{const n=t.getInternalMethods().getLoggerInstance();e||(e="error");("function"==typeof e?e:n[e])(s.help())},s.functionDescription=t=>["(",t.name?e.Parser.decamelize(t.name,"-"):n("generated-value"),")"].join(""),s.stringifiedValues=function(t,e){let n="";const s=e||", ",i=[].concat(t);return t&&i.length?(i.forEach((t=>{n.length&&(n+=s),n+=JSON.stringify(t)})),n):n};let E=null;s.version=t=>{E=t},s.showVersion=e=>{const n=t.getInternalMethods().getLoggerInstance();e||(e="error");("function"==typeof e?e:n[e])(E)},s.reset=function(t){return r=null,c=!1,l=[],h=!1,p=[],d=[],u=[],f=_t(f,(e=>!t[e])),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(t=!1){const e=k.pop();e&&(t?(f={...e.descriptions,...f},u=[...e.commands,...u],l=[...e.usages,...l],d=[...e.examples,...d],p=[...e.epilogs,...p]):({failMessage:r,failureOutput:c,usages:l,usageDisabled:h,epilogs:p,examples:d,commands:u,descriptions:f}=e))},s}function Pt(t){return"object"==typeof t}function Nt(t){return Pt(t)?t.indentation:0}function Mt(t){return Pt(t)?t.text:t}class Dt{constructor(t,e,n,s){var i,r,o;this.yargs=t,this.usage=e,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(t,e,n,s){const i=this.command.getCommandHandlers();for(let e=0,n=t.length;e<n;++e)if(i[t[e]]&&i[t[e]].builder){const n=i[t[e]].builder;if($t(n)){this.indexAfterLastReset=e+1;const t=this.yargs.getInternalMethods().reset();return n(t,!0),t.argv}}const r=[];this.commandCompletions(r,t,n),this.optionCompletions(r,t,e,n),this.choicesFromOptionsCompletions(r,t,e,n),this.choicesFromPositionalsCompletions(r,t,e,n),s(null,r)}commandCompletions(t,e,n){const s=this.yargs.getInternalMethods().getContext().commands;n.match(/^-/)||s[s.length-1]===n||this.previousArgHasChoices(e)||this.usage.getCommands().forEach((n=>{const s=gt(n[0]).cmd;if(-1===e.indexOf(s))if(this.zshShell){const e=n[1]||"";t.push(s.replace(/:/g,"\\:")+":"+e)}else t.push(s)}))}optionCompletions(t,e,n,s){if((s.match(/^-/)||""===s&&0===t.length)&&!this.previousArgHasChoices(e)){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(e,r,o)||this.completeOptionKey(r,t,s,o&&!!n.default[r])}))}}choicesFromOptionsCompletions(t,e,n,s){if(this.previousArgHasChoices(e)){const n=this.getPreviousArgChoices(e);n&&n.length>0&&t.push(...n.map((t=>t.replace(/:/g,"\\:"))))}}choicesFromPositionalsCompletions(t,e,n,s){if(""===s&&t.length>0&&this.previousArgHasChoices(e))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 e of a)e.startsWith(s)&&t.push(e.replace(/:/g,"\\:"))}getPreviousArgChoices(t){if(t.length<1)return;let e=t[t.length-1],n="";if(!e.startsWith("-")&&t.length>1&&(n=e,e=t[t.length-2]),!e.startsWith("-"))return;const s=e.replace(/^-+/,""),i=this.yargs.getOptions(),r=[s,...this.yargs.getAliases()[s]||[]];let o;for(const t of r)if(Object.prototype.hasOwnProperty.call(i.key,t)&&Array.isArray(i.choices[t])){o=i.choices[t];break}return o?o.filter((t=>!n||t.startsWith(n))):void 0}previousArgHasChoices(t){const e=this.getPreviousArgChoices(t);return void 0!==e&&e.length>0}argsContainKey(t,e,n){const s=e=>-1!==t.indexOf((/^[^0-9]$/.test(e)?"-":"--")+e);if(s(e))return!0;if(n&&s(`no-${e}`))return!0;if(this.aliases)for(const t of this.aliases[e])if(s(t))return!0;return!1}completeOptionKey(t,e,n,s){var i,r,o,a;let c=t;if(this.zshShell){const e=this.usage.getDescriptions(),n=null===(r=null===(i=null==this?void 0:this.aliases)||void 0===i?void 0:i[t])||void 0===r?void 0:r.find((t=>{const n=e[t];return"string"==typeof n&&n.length>0})),s=n?e[n]:void 0,l=null!==(a=null!==(o=e[t])&&void 0!==o?o:s)&&void 0!==a?a:"";c=`${t.replace(/:/g,"\\:")}:${l.replace("__yargsString__:","").replace(/(\r\n|\n|\r)/gm," ")}`}const l=!(t=>/^--/.test(t))(n)&&(t=>/^[^0-9]$/.test(t))(t)?"-":"--";e.push(l+c),s&&e.push(l+"no-"+c)}customCompletion(t,e,n,s){if(dt(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const t=this.customCompletionFunction(n,e);return pt(t)?t.then((t=>{this.shim.process.nextTick((()=>{s(null,t)}))})).catch((t=>{this.shim.process.nextTick((()=>{s(t,void 0)}))})):s(null,t)}return function(t){return t.length>3}(this.customCompletionFunction)?this.customCompletionFunction(n,e,((i=s)=>this.defaultCompletion(t,e,n,i)),(t=>{s(null,t)})):this.customCompletionFunction(n,e,(t=>{s(null,t)}))}getCompletion(t,e){const n=t.length?t[t.length-1]:"",s=this.yargs.parse(t,!0),i=this.customCompletionFunction?s=>this.customCompletion(t,s,n,e):s=>this.defaultCompletion(t,s,n,e);return pt(s)?s.then(i):i(s)}generateCompletionScript(t,e){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(t);return t.match(/\.js$/)&&(t=`./${t}`),n=n.replace(/{{app_name}}/g,s),n=n.replace(/{{completion_command}}/g,e),n.replace(/{{app_path}}/g,t)}registerFunction(t){this.customCompletionFunction=t}setParsed(t){this.aliases=t.aliases}}function It(t,e){if(0===t.length)return e.length;if(0===e.length)return t.length;const n=[];let s,i;for(s=0;s<=e.length;s++)n[s]=[s];for(i=0;i<=t.length;i++)n[0][i]=i;for(s=1;s<=e.length;s++)for(i=1;i<=t.length;i++)e.charAt(s-1)===t.charAt(i-1)?n[s][i]=n[s-1][i-1]:s>1&&i>1&&e.charAt(s-2)===t.charAt(i-1)&&e.charAt(s-1)===t.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[e.length][t.length]}const Rt=["$0","--","_"];let Wt,zt=[];function Tt(t,e,n,s){Wt=s;let i={};if(Object.prototype.hasOwnProperty.call(t,"extends")){if("string"!=typeof t.extends)return i;const s=/\.json|\..*rc$/.test(t.extends);let r=null;if(s)r=function(t,e){return Wt.path.resolve(t,e)}(e,t.extends);else try{r=require.resolve(t.extends)}catch(e){return t}!function(t){if(zt.indexOf(t)>-1)throw new st(`Circular extended configurations: '${t}'.`)}(r),zt.push(r),i=s?JSON.parse(Wt.readFileSync(r,"utf8")):require(t.extends),delete t.extends,i=Tt(i,Wt.path.dirname(r),n,Wt)}return zt=[],n?Ft(i,t):Object.assign({},i,t)}function Ft(t,e){const n={};function s(t){return t&&"object"==typeof t&&!Array.isArray(t)}Object.assign(n,t);for(const i of Object.keys(e))s(e[i])&&s(n[i])?n[i]=Ft(t[i],e[i]):n[i]=e[i];return n}var Bt,Lt,Vt,Ut,Ht,Yt,qt,Jt,Gt,Kt,Qt,Xt,Zt,te,ee,ne,se,ie,re,oe,ae,ce,le,he,de,ue,fe,pe,ge,me,ye,be,ve,we,Oe,Ee=function(t,e,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 e?t!==e||!i:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?i.call(t,n):i?i.value=n:e.set(t,n),n},ke=function(t,e,n,s){if("a"===n&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?s:"a"===n?s.call(t):s?s.value:e.get(t)};const Ae=Symbol("copyDoubleDash"),je=Symbol("copyDoubleDash"),$e=Symbol("deleteFromParserHintObject"),_e=Symbol("emitWarning"),xe=Symbol("freeze"),Ce=Symbol("getDollarZero"),Se=Symbol("getParserConfiguration"),Pe=Symbol("getUsageConfiguration"),Ne=Symbol("guessLocale"),Me=Symbol("guessVersion"),De=Symbol("parsePositionalNumbers"),Ie=Symbol("pkgUp"),Re=Symbol("populateParserHintArray"),We=Symbol("populateParserHintSingleValueDictionary"),ze=Symbol("populateParserHintArrayDictionary"),Te=Symbol("populateParserHintDictionary"),Fe=Symbol("sanitizeKey"),Be=Symbol("setKey"),Le=Symbol("unfreeze"),Ve=Symbol("validateAsync"),Ue=Symbol("getCommandInstance"),He=Symbol("getContext"),Ye=Symbol("getHasOutput"),qe=Symbol("getLoggerInstance"),Je=Symbol("getParseContext"),Ge=Symbol("getUsageInstance"),Ke=Symbol("getValidationInstance"),Qe=Symbol("hasParseCallback"),Xe=Symbol("isGlobalContext"),Ze=Symbol("postProcess"),tn=Symbol("rebase"),en=Symbol("reset"),nn=Symbol("runYargsParserAndExecuteCommands"),sn=Symbol("runValidation"),rn=Symbol("setHasOutput"),on=Symbol("kTrackManuallySetKeys");class an{constructor(t=[],e,n,s){this.customScriptName=!1,this.parsed=!1,Bt.set(this,void 0),Lt.set(this,void 0),Vt.set(this,{commands:[],fullCommands:[]}),Ut.set(this,null),Ht.set(this,null),Yt.set(this,"show-hidden"),qt.set(this,null),Jt.set(this,!0),Gt.set(this,{}),Kt.set(this,!0),Qt.set(this,[]),Xt.set(this,void 0),Zt.set(this,{}),te.set(this,!1),ee.set(this,null),ne.set(this,!0),se.set(this,void 0),ie.set(this,""),re.set(this,void 0),oe.set(this,void 0),ae.set(this,{}),ce.set(this,null),le.set(this,null),he.set(this,{}),de.set(this,{}),ue.set(this,void 0),fe.set(this,!1),pe.set(this,void 0),ge.set(this,!1),me.set(this,!1),ye.set(this,!1),be.set(this,void 0),ve.set(this,{}),we.set(this,null),Oe.set(this,void 0),Ee(this,pe,s,"f"),Ee(this,ue,t,"f"),Ee(this,Lt,e,"f"),Ee(this,oe,n,"f"),Ee(this,Xt,new wt(this),"f"),this.$0=this[Ce](),this[en](),Ee(this,Bt,ke(this,Bt,"f"),"f"),Ee(this,be,ke(this,be,"f"),"f"),Ee(this,Oe,ke(this,Oe,"f"),"f"),Ee(this,re,ke(this,re,"f"),"f"),ke(this,re,"f").showHiddenOpt=ke(this,Yt,"f"),Ee(this,se,this[je](),"f")}addHelpOpt(t,e){return yt("[string|boolean] [string]",[t,e],arguments.length),ke(this,ee,"f")&&(this[$e](ke(this,ee,"f")),Ee(this,ee,null,"f")),!1===t&&void 0===e||(Ee(this,ee,"string"==typeof t?t:"help","f"),this.boolean(ke(this,ee,"f")),this.describe(ke(this,ee,"f"),e||ke(this,be,"f").deferY18nLookup("Show help"))),this}help(t,e){return this.addHelpOpt(t,e)}addShowHiddenOpt(t,e){if(yt("[string|boolean] [string]",[t,e],arguments.length),!1===t&&void 0===e)return this;const n="string"==typeof t?t:ke(this,Yt,"f");return this.boolean(n),this.describe(n,e||ke(this,be,"f").deferY18nLookup("Show hidden options")),ke(this,re,"f").showHiddenOpt=n,this}showHidden(t,e){return this.addShowHiddenOpt(t,e)}alias(t,e){return yt("<object|string|array> [string|array]",[t,e],arguments.length),this[ze](this.alias.bind(this),"alias",t,e),this}array(t){return yt("<array|string>",[t],arguments.length),this[Re]("array",t),this[on](t),this}boolean(t){return yt("<array|string>",[t],arguments.length),this[Re]("boolean",t),this[on](t),this}check(t,e){return yt("<function> [boolean]",[t,e],arguments.length),this.middleware(((e,n)=>Et((()=>t(e,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&ke(this,be,"f").fail(n.toString(),n):ke(this,be,"f").fail(ke(this,pe,"f").y18n.__("Argument check failed: %s",t.toString())),e)),(t=>(ke(this,be,"f").fail(t.message?t.message:t.toString(),t),e)))),!1,e),this}choices(t,e){return yt("<object|string|array> [string|array]",[t,e],arguments.length),this[ze](this.choices.bind(this),"choices",t,e),this}coerce(t,e){if(yt("<object|string|array> [function]",[t,e],arguments.length),Array.isArray(t)){if(!e)throw new st("coerce callback must be provided");for(const n of t)this.coerce(n,e);return this}if("object"==typeof t){for(const e of Object.keys(t))this.coerce(e,t[e]);return this}if(!e)throw new st("coerce callback must be provided");return ke(this,re,"f").key[t]=!0,ke(this,Xt,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,t)?Et((()=>(i=s.getAliases(),e(n[t]))),(e=>{n[t]=e;const r=s.getInternalMethods().getParserConfiguration()["strip-aliased"];if(i[t]&&!0!==r)for(const s of i[t])n[s]=e;return n}),(t=>{throw new st(t.message)})):n}),t),this}conflicts(t,e){return yt("<string|object> [string|array]",[t,e],arguments.length),ke(this,Oe,"f").conflicts(t,e),this}config(t="config",e,n){return yt("[object|string] [string|function] [function]",[t,e,n],arguments.length),"object"!=typeof t||Array.isArray(t)?("function"==typeof e&&(n=e,e=void 0),this.describe(t,e||ke(this,be,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(t)?t:[t]).forEach((t=>{ke(this,re,"f").config[t]=n||!0})),this):(t=Tt(t,ke(this,Lt,"f"),this[Se]()["deep-merge-config"]||!1,ke(this,pe,"f")),ke(this,re,"f").configObjects=(ke(this,re,"f").configObjects||[]).concat(t),this)}completion(t,e,n){return yt("[string] [string|boolean|function] [function]",[t,e,n],arguments.length),"function"==typeof e&&(n=e,e=void 0),Ee(this,Ht,t||ke(this,Ht,"f")||"completion","f"),e||!1===e||(e="generate completion script"),this.command(ke(this,Ht,"f"),e),n&&ke(this,Ut,"f").registerFunction(n),this}command(t,e,n,s,i,r){return yt("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[t,e,n,s,i,r],arguments.length),ke(this,Bt,"f").addHandler(t,e,n,s,i,r),this}commands(t,e,n,s,i,r){return this.command(t,e,n,s,i,r)}commandDir(t,e){yt("<string> [object]",[t,e],arguments.length);const n=ke(this,oe,"f")||ke(this,pe,"f").require;return ke(this,Bt,"f").addDirectory(t,n,ke(this,pe,"f").getCallerFile(),e),this}count(t){return yt("<array|string>",[t],arguments.length),this[Re]("count",t),this[on](t),this}default(t,e,n){return yt("<object|string|array> [*] [string]",[t,e,n],arguments.length),n&&(ut(t,ke(this,pe,"f")),ke(this,re,"f").defaultDescription[t]=n),"function"==typeof e&&(ut(t,ke(this,pe,"f")),ke(this,re,"f").defaultDescription[t]||(ke(this,re,"f").defaultDescription[t]=ke(this,be,"f").functionDescription(e)),e=e.call()),this[We](this.default.bind(this),"default",t,e),this}defaults(t,e,n){return this.default(t,e,n)}demandCommand(t=1,e,n,s){return yt("[number] [number|string] [string|null|undefined] [string|null|undefined]",[t,e,n,s],arguments.length),"number"!=typeof e&&(n=e,e=1/0),this.global("_",!1),ke(this,re,"f").demandedCommands._={min:t,max:e,minMsg:n,maxMsg:s},this}demand(t,e,n){return Array.isArray(e)?(e.forEach((t=>{dt(n,!0,ke(this,pe,"f")),this.demandOption(t,n)})),e=1/0):"number"!=typeof e&&(n=e,e=1/0),"number"==typeof t?(dt(n,!0,ke(this,pe,"f")),this.demandCommand(t,e,n,n)):Array.isArray(t)?t.forEach((t=>{dt(n,!0,ke(this,pe,"f")),this.demandOption(t,n)})):"string"==typeof n?this.demandOption(t,n):!0!==n&&void 0!==n||this.demandOption(t),this}demandOption(t,e){return yt("<object|string|array> [string]",[t,e],arguments.length),this[We](this.demandOption.bind(this),"demandedOptions",t,e),this}deprecateOption(t,e){return yt("<string> [string|boolean]",[t,e],arguments.length),ke(this,re,"f").deprecatedOptions[t]=e,this}describe(t,e){return yt("<object|string|array> [string]",[t,e],arguments.length),this[Be](t,!0),ke(this,be,"f").describe(t,e),this}detectLocale(t){return yt("<boolean>",[t],arguments.length),Ee(this,Jt,t,"f"),this}env(t){return yt("[string|boolean]",[t],arguments.length),!1===t?delete ke(this,re,"f").envPrefix:ke(this,re,"f").envPrefix=t||"",this}epilogue(t){return yt("<string>",[t],arguments.length),ke(this,be,"f").epilog(t),this}epilog(t){return this.epilogue(t)}example(t,e){return yt("<string|array> [string]",[t,e],arguments.length),Array.isArray(t)?t.forEach((t=>this.example(...t))):ke(this,be,"f").example(t,e),this}exit(t,e){Ee(this,te,!0,"f"),Ee(this,qt,e,"f"),ke(this,Kt,"f")&&ke(this,pe,"f").process.exit(t)}exitProcess(t=!0){return yt("[boolean]",[t],arguments.length),Ee(this,Kt,t,"f"),this}fail(t){if(yt("<function|boolean>",[t],arguments.length),"boolean"==typeof t&&!1!==t)throw new st("Invalid first argument. Expected function or boolean 'false'");return ke(this,be,"f").failFn(t),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(t,e){return yt("<array> [function]",[t,e],arguments.length),e?ke(this,Ut,"f").getCompletion(t,e):new Promise(((e,n)=>{ke(this,Ut,"f").getCompletion(t,((t,s)=>{t?n(t):e(s)}))}))}getDemandedOptions(){return yt([],0),ke(this,re,"f").demandedOptions}getDemandedCommands(){return yt([],0),ke(this,re,"f").demandedCommands}getDeprecatedOptions(){return yt([],0),ke(this,re,"f").deprecatedOptions}getDetectLocale(){return ke(this,Jt,"f")}getExitProcess(){return ke(this,Kt,"f")}getGroups(){return Object.assign({},ke(this,Zt,"f"),ke(this,de,"f"))}getHelp(){if(Ee(this,te,!0,"f"),!ke(this,be,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[nn](ke(this,ue,"f"),void 0,void 0,0,!0);if(pt(t))return t.then((()=>ke(this,be,"f").help()))}const t=ke(this,Bt,"f").runDefaultBuilderOn(this);if(pt(t))return t.then((()=>ke(this,be,"f").help()))}return Promise.resolve(ke(this,be,"f").help())}getOptions(){return ke(this,re,"f")}getStrict(){return ke(this,ge,"f")}getStrictCommands(){return ke(this,me,"f")}getStrictOptions(){return ke(this,ye,"f")}global(t,e){return yt("<string|array> [boolean]",[t,e],arguments.length),t=[].concat(t),!1!==e?ke(this,re,"f").local=ke(this,re,"f").local.filter((e=>-1===t.indexOf(e))):t.forEach((t=>{ke(this,re,"f").local.includes(t)||ke(this,re,"f").local.push(t)})),this}group(t,e){yt("<string|array> <string>",[t,e],arguments.length);const n=ke(this,de,"f")[e]||ke(this,Zt,"f")[e];ke(this,de,"f")[e]&&delete ke(this,de,"f")[e];const s={};return ke(this,Zt,"f")[e]=(n||[]).concat(t).filter((t=>!s[t]&&(s[t]=!0))),this}hide(t){return yt("<string>",[t],arguments.length),ke(this,re,"f").hiddenOptions.push(t),this}implies(t,e){return yt("<string|object> [number|string|array]",[t,e],arguments.length),ke(this,Oe,"f").implies(t,e),this}locale(t){return yt("[string]",[t],arguments.length),void 0===t?(this[Ne](),ke(this,pe,"f").y18n.getLocale()):(Ee(this,Jt,!1,"f"),ke(this,pe,"f").y18n.setLocale(t),this)}middleware(t,e,n){return ke(this,Xt,"f").addMiddleware(t,!!e,n)}nargs(t,e){return yt("<string|object|array> [number]",[t,e],arguments.length),this[We](this.nargs.bind(this),"narg",t,e),this}normalize(t){return yt("<array|string>",[t],arguments.length),this[Re]("normalize",t),this}number(t){return yt("<array|string>",[t],arguments.length),this[Re]("number",t),this[on](t),this}option(t,e){if(yt("<string|object> [object]",[t,e],arguments.length),"object"==typeof t)Object.keys(t).forEach((e=>{this.options(e,t[e])}));else{"object"!=typeof e&&(e={}),this[on](t),!ke(this,we,"f")||"version"!==t&&"version"!==(null==e?void 0:e.alias)||this[_e](['"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"),ke(this,re,"f").key[t]=!0,e.alias&&this.alias(t,e.alias);const n=e.deprecate||e.deprecated;n&&this.deprecateOption(t,n);const s=e.demand||e.required||e.require;s&&this.demand(t,s),e.demandOption&&this.demandOption(t,"string"==typeof e.demandOption?e.demandOption:void 0),e.conflicts&&this.conflicts(t,e.conflicts),"default"in e&&this.default(t,e.default),void 0!==e.implies&&this.implies(t,e.implies),void 0!==e.nargs&&this.nargs(t,e.nargs),e.config&&this.config(t,e.configParser),e.normalize&&this.normalize(t),e.choices&&this.choices(t,e.choices),e.coerce&&this.coerce(t,e.coerce),e.group&&this.group(t,e.group),(e.boolean||"boolean"===e.type)&&(this.boolean(t),e.alias&&this.boolean(e.alias)),(e.array||"array"===e.type)&&(this.array(t),e.alias&&this.array(e.alias)),(e.number||"number"===e.type)&&(this.number(t),e.alias&&this.number(e.alias)),(e.string||"string"===e.type)&&(this.string(t),e.alias&&this.string(e.alias)),(e.count||"count"===e.type)&&this.count(t),"boolean"==typeof e.global&&this.global(t,e.global),e.defaultDescription&&(ke(this,re,"f").defaultDescription[t]=e.defaultDescription),e.skipValidation&&this.skipValidation(t);const i=e.describe||e.description||e.desc,r=ke(this,be,"f").getDescriptions();Object.prototype.hasOwnProperty.call(r,t)&&"string"!=typeof i||this.describe(t,i),e.hidden&&this.hide(t),e.requiresArg&&this.requiresArg(t)}return this}options(t,e){return this.option(t,e)}parse(t,e,n){yt("[string|array] [function|boolean|object] [function]",[t,e,n],arguments.length),this[xe](),void 0===t&&(t=ke(this,ue,"f")),"object"==typeof e&&(Ee(this,le,e,"f"),e=n),"function"==typeof e&&(Ee(this,ce,e,"f"),e=!1),e||Ee(this,ue,t,"f"),ke(this,ce,"f")&&Ee(this,Kt,!1,"f");const s=this[nn](t,!!e),i=this.parsed;return ke(this,Ut,"f").setParsed(this.parsed),pt(s)?s.then((t=>(ke(this,ce,"f")&&ke(this,ce,"f").call(this,ke(this,qt,"f"),t,ke(this,ie,"f")),t))).catch((t=>{throw ke(this,ce,"f")&&ke(this,ce,"f")(t,this.parsed.argv,ke(this,ie,"f")),t})).finally((()=>{this[Le](),this.parsed=i})):(ke(this,ce,"f")&&ke(this,ce,"f").call(this,ke(this,qt,"f"),s,ke(this,ie,"f")),this[Le](),this.parsed=i,s)}parseAsync(t,e,n){const s=this.parse(t,e,n);return pt(s)?s:Promise.resolve(s)}parseSync(t,e,n){const s=this.parse(t,e,n);if(pt(s))throw new st(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(t){return yt("<object>",[t],arguments.length),Ee(this,ae,t,"f"),this}pkgConf(t,e){yt("<string> [string]",[t,e],arguments.length);let n=null;const s=this[Ie](e||ke(this,Lt,"f"));return s[t]&&"object"==typeof s[t]&&(n=Tt(s[t],e||ke(this,Lt,"f"),this[Se]()["deep-merge-config"]||!1,ke(this,pe,"f")),ke(this,re,"f").configObjects=(ke(this,re,"f").configObjects||[]).concat(n)),this}positional(t,e){yt("<string> <object>",[t,e],arguments.length);const n=["default","defaultDescription","implies","normalize","choices","conflicts","coerce","type","describe","desc","description","alias"];e=_t(e,((t,e)=>!("type"===t&&!["string","number","boolean"].includes(e))&&n.includes(t)));const s=ke(this,Vt,"f").fullCommands[ke(this,Vt,"f").fullCommands.length-1],i=s?ke(this,Bt,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return ft(i).forEach((n=>{const s=i[n];Array.isArray(s)?-1!==s.indexOf(t)&&(e[n]=!0):s[t]&&!(n in e)&&(e[n]=s[t])})),this.group(t,ke(this,be,"f").getPositionalGroupName()),this.option(t,e)}recommendCommands(t=!0){return yt("[boolean]",[t],arguments.length),Ee(this,fe,t,"f"),this}required(t,e,n){return this.demand(t,e,n)}require(t,e,n){return this.demand(t,e,n)}requiresArg(t){return yt("<array|string|object> [number]",[t],arguments.length),"string"==typeof t&&ke(this,re,"f").narg[t]||this[We](this.requiresArg.bind(this),"narg",t,NaN),this}showCompletionScript(t,e){return yt("[string] [string]",[t,e],arguments.length),t=t||this.$0,ke(this,se,"f").log(ke(this,Ut,"f").generateCompletionScript(t,e||ke(this,Ht,"f")||"completion")),this}showHelp(t){if(yt("[string|function]",[t],arguments.length),Ee(this,te,!0,"f"),!ke(this,be,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[nn](ke(this,ue,"f"),void 0,void 0,0,!0);if(pt(e))return e.then((()=>{ke(this,be,"f").showHelp(t)})),this}const e=ke(this,Bt,"f").runDefaultBuilderOn(this);if(pt(e))return e.then((()=>{ke(this,be,"f").showHelp(t)})),this}return ke(this,be,"f").showHelp(t),this}scriptName(t){return this.customScriptName=!0,this.$0=t,this}showHelpOnFail(t,e){return yt("[boolean|string] [string]",[t,e],arguments.length),ke(this,be,"f").showHelpOnFail(t,e),this}showVersion(t){return yt("[string|function]",[t],arguments.length),ke(this,be,"f").showVersion(t),this}skipValidation(t){return yt("<array|string>",[t],arguments.length),this[Re]("skipValidation",t),this}strict(t){return yt("[boolean]",[t],arguments.length),Ee(this,ge,!1!==t,"f"),this}strictCommands(t){return yt("[boolean]",[t],arguments.length),Ee(this,me,!1!==t,"f"),this}strictOptions(t){return yt("[boolean]",[t],arguments.length),Ee(this,ye,!1!==t,"f"),this}string(t){return yt("<array|string>",[t],arguments.length),this[Re]("string",t),this[on](t),this}terminalWidth(){return yt([],0),ke(this,pe,"f").process.stdColumns}updateLocale(t){return this.updateStrings(t)}updateStrings(t){return yt("<object>",[t],arguments.length),Ee(this,Jt,!1,"f"),ke(this,pe,"f").y18n.updateLocale(t),this}usage(t,e,n,s){if(yt("<string|null|undefined> [string|boolean] [function|object] [function]",[t,e,n,s],arguments.length),void 0!==e){if(dt(t,null,ke(this,pe,"f")),(t||"").match(/^\$0( |$)/))return this.command(t,e,n,s);throw new st(".usage() description must start with $0 if being used as alias for .command()")}return ke(this,be,"f").usage(t),this}usageConfiguration(t){return yt("<object>",[t],arguments.length),Ee(this,ve,t,"f"),this}version(t,e,n){const s="version";if(yt("[boolean|string] [string] [string]",[t,e,n],arguments.length),ke(this,we,"f")&&(this[$e](ke(this,we,"f")),ke(this,be,"f").version(void 0),Ee(this,we,null,"f")),0===arguments.length)n=this[Me](),t=s;else if(1===arguments.length){if(!1===t)return this;n=t,t=s}else 2===arguments.length&&(n=e,e=void 0);return Ee(this,we,"string"==typeof t?t:s,"f"),e=e||ke(this,be,"f").deferY18nLookup("Show version number"),ke(this,be,"f").version(n||void 0),this.boolean(ke(this,we,"f")),this.describe(ke(this,we,"f"),e),this}wrap(t){return yt("<number|null|undefined>",[t],arguments.length),ke(this,be,"f").wrap(t),this}[(Bt=new WeakMap,Lt=new WeakMap,Vt=new WeakMap,Ut=new WeakMap,Ht=new WeakMap,Yt=new WeakMap,qt=new WeakMap,Jt=new WeakMap,Gt=new WeakMap,Kt=new WeakMap,Qt=new WeakMap,Xt=new WeakMap,Zt=new WeakMap,te=new WeakMap,ee=new WeakMap,ne=new WeakMap,se=new WeakMap,ie=new WeakMap,re=new WeakMap,oe=new WeakMap,ae=new WeakMap,ce=new WeakMap,le=new WeakMap,he=new WeakMap,de=new WeakMap,ue=new WeakMap,fe=new WeakMap,pe=new WeakMap,ge=new WeakMap,me=new WeakMap,ye=new WeakMap,be=new WeakMap,ve=new WeakMap,we=new WeakMap,Oe=new WeakMap,Ae)](t){if(!t._||!t["--"])return t;t._.push.apply(t._,t["--"]);try{delete t["--"]}catch(t){}return t}[je](){return{log:(...t)=>{this[Qe]()||console.log(...t),Ee(this,te,!0,"f"),ke(this,ie,"f").length&&Ee(this,ie,ke(this,ie,"f")+"\n","f"),Ee(this,ie,ke(this,ie,"f")+t.join(" "),"f")},error:(...t)=>{this[Qe]()||console.error(...t),Ee(this,te,!0,"f"),ke(this,ie,"f").length&&Ee(this,ie,ke(this,ie,"f")+"\n","f"),Ee(this,ie,ke(this,ie,"f")+t.join(" "),"f")}}}[$e](t){ft(ke(this,re,"f")).forEach((e=>{if("configObjects"===e)return;const n=ke(this,re,"f")[e];Array.isArray(n)?n.includes(t)&&n.splice(n.indexOf(t),1):"object"==typeof n&&delete n[t]})),delete ke(this,be,"f").getDescriptions()[t]}[_e](t,e,n){ke(this,Gt,"f")[n]||(ke(this,pe,"f").process.emitWarning(t,e),ke(this,Gt,"f")[n]=!0)}[xe](){ke(this,Qt,"f").push({options:ke(this,re,"f"),configObjects:ke(this,re,"f").configObjects.slice(0),exitProcess:ke(this,Kt,"f"),groups:ke(this,Zt,"f"),strict:ke(this,ge,"f"),strictCommands:ke(this,me,"f"),strictOptions:ke(this,ye,"f"),completionCommand:ke(this,Ht,"f"),output:ke(this,ie,"f"),exitError:ke(this,qt,"f"),hasOutput:ke(this,te,"f"),parsed:this.parsed,parseFn:ke(this,ce,"f"),parseContext:ke(this,le,"f")}),ke(this,be,"f").freeze(),ke(this,Oe,"f").freeze(),ke(this,Bt,"f").freeze(),ke(this,Xt,"f").freeze()}[Ce](){let t,e="";return t=/\b(node|iojs|electron)(\.exe)?$/.test(ke(this,pe,"f").process.argv()[0])?ke(this,pe,"f").process.argv().slice(1,2):ke(this,pe,"f").process.argv().slice(0,1),e=t.map((t=>{const e=this[tn](ke(this,Lt,"f"),t);return t.match(/^(\/|([a-zA-Z]:)?\\)/)&&e.length<t.length?e:t})).join(" ").trim(),ke(this,pe,"f").getEnv("_")&&ke(this,pe,"f").getProcessArgvBin()===ke(this,pe,"f").getEnv("_")&&(e=ke(this,pe,"f").getEnv("_").replace(`${ke(this,pe,"f").path.dirname(ke(this,pe,"f").process.execPath())}/`,"")),e}[Se](){return ke(this,ae,"f")}[Pe](){return ke(this,ve,"f")}[Ne](){if(!ke(this,Jt,"f"))return;const t=ke(this,pe,"f").getEnv("LC_ALL")||ke(this,pe,"f").getEnv("LC_MESSAGES")||ke(this,pe,"f").getEnv("LANG")||ke(this,pe,"f").getEnv("LANGUAGE")||"en_US";this.locale(t.replace(/[.:].*/,""))}[Me](){return this[Ie]().version||"unknown"}[De](t){const e=t["--"]?t["--"]:t._;for(let t,n=0;void 0!==(t=e[n]);n++)ke(this,pe,"f").Parser.looksLikeNumber(t)&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))&&(e[n]=Number(t));return t}[Ie](t){const e=t||"*";if(ke(this,he,"f")[e])return ke(this,he,"f")[e];let n={};try{let e=t||ke(this,pe,"f").mainFilename;!t&&ke(this,pe,"f").path.extname(e)&&(e=ke(this,pe,"f").path.dirname(e));const s=ke(this,pe,"f").findUp(e,((t,e)=>e.includes("package.json")?"package.json":void 0));dt(s,void 0,ke(this,pe,"f")),n=JSON.parse(ke(this,pe,"f").readFileSync(s,"utf8"))}catch(t){}return ke(this,he,"f")[e]=n||{},ke(this,he,"f")[e]}[Re](t,e){(e=[].concat(e)).forEach((e=>{e=this[Fe](e),ke(this,re,"f")[t].push(e)}))}[We](t,e,n,s){this[Te](t,e,n,s,((t,e,n)=>{ke(this,re,"f")[t][e]=n}))}[ze](t,e,n,s){this[Te](t,e,n,s,((t,e,n)=>{ke(this,re,"f")[t][e]=(ke(this,re,"f")[t][e]||[]).concat(n)}))}[Te](t,e,n,s,i){if(Array.isArray(n))n.forEach((e=>{t(e,s)}));else if((t=>"object"==typeof t)(n))for(const e of ft(n))t(e,n[e]);else i(e,this[Fe](n),s)}[Fe](t){return"__proto__"===t?"___proto___":t}[Be](t,e){return this[We](this[Be].bind(this),"key",t,e),this}[Le](){var t,e,n,s,i,r,o,a,c,l,h,d;const u=ke(this,Qt,"f").pop();let f;dt(u,void 0,ke(this,pe,"f")),t=this,e=this,n=this,s=this,i=this,r=this,o=this,a=this,c=this,l=this,h=this,d=this,({options:{set value(e){Ee(t,re,e,"f")}}.value,configObjects:f,exitProcess:{set value(t){Ee(e,Kt,t,"f")}}.value,groups:{set value(t){Ee(n,Zt,t,"f")}}.value,output:{set value(t){Ee(s,ie,t,"f")}}.value,exitError:{set value(t){Ee(i,qt,t,"f")}}.value,hasOutput:{set value(t){Ee(r,te,t,"f")}}.value,parsed:this.parsed,strict:{set value(t){Ee(o,ge,t,"f")}}.value,strictCommands:{set value(t){Ee(a,me,t,"f")}}.value,strictOptions:{set value(t){Ee(c,ye,t,"f")}}.value,completionCommand:{set value(t){Ee(l,Ht,t,"f")}}.value,parseFn:{set value(t){Ee(h,ce,t,"f")}}.value,parseContext:{set value(t){Ee(d,le,t,"f")}}.value}=u),ke(this,re,"f").configObjects=f,ke(this,be,"f").unfreeze(),ke(this,Oe,"f").unfreeze(),ke(this,Bt,"f").unfreeze(),ke(this,Xt,"f").unfreeze()}[Ve](t,e){return Et(e,(e=>(t(e),e)))}getInternalMethods(){return{getCommandInstance:this[Ue].bind(this),getContext:this[He].bind(this),getHasOutput:this[Ye].bind(this),getLoggerInstance:this[qe].bind(this),getParseContext:this[Je].bind(this),getParserConfiguration:this[Se].bind(this),getUsageConfiguration:this[Pe].bind(this),getUsageInstance:this[Ge].bind(this),getValidationInstance:this[Ke].bind(this),hasParseCallback:this[Qe].bind(this),isGlobalContext:this[Xe].bind(this),postProcess:this[Ze].bind(this),reset:this[en].bind(this),runValidation:this[sn].bind(this),runYargsParserAndExecuteCommands:this[nn].bind(this),setHasOutput:this[rn].bind(this)}}[Ue](){return ke(this,Bt,"f")}[He](){return ke(this,Vt,"f")}[Ye](){return ke(this,te,"f")}[qe](){return ke(this,se,"f")}[Je](){return ke(this,le,"f")||{}}[Ge](){return ke(this,be,"f")}[Ke](){return ke(this,Oe,"f")}[Qe](){return!!ke(this,ce,"f")}[Xe](){return ke(this,ne,"f")}[Ze](t,e,n,s){if(n)return t;if(pt(t))return t;e||(t=this[Ae](t));return(this[Se]()["parse-positional-numbers"]||void 0===this[Se]()["parse-positional-numbers"])&&(t=this[De](t)),s&&(t=Ot(t,this,ke(this,Xt,"f").getMiddleware(),!1)),t}[en](t={}){Ee(this,re,ke(this,re,"f")||{},"f");const e={};e.local=ke(this,re,"f").local||[],e.configObjects=ke(this,re,"f").configObjects||[];const n={};e.local.forEach((e=>{n[e]=!0,(t[e]||[]).forEach((t=>{n[t]=!0}))})),Object.assign(ke(this,de,"f"),Object.keys(ke(this,Zt,"f")).reduce(((t,e)=>{const s=ke(this,Zt,"f")[e].filter((t=>!(t in n)));return s.length>0&&(t[e]=s),t}),{})),Ee(this,Zt,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((t=>{e[t]=(ke(this,re,"f")[t]||[]).filter((t=>!n[t]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((t=>{e[t]=_t(ke(this,re,"f")[t],(t=>!n[t]))})),e.envPrefix=ke(this,re,"f").envPrefix,Ee(this,re,e,"f"),Ee(this,be,ke(this,be,"f")?ke(this,be,"f").reset(n):St(this,ke(this,pe,"f")),"f"),Ee(this,Oe,ke(this,Oe,"f")?ke(this,Oe,"f").reset(n):function(t,e,n){const s=n.y18n.__,i=n.y18n.__n,r={nonOptionCount:function(n){const s=t.getDemandedCommands(),r=n._.length+(n["--"]?n["--"].length:0)-t.getInternalMethods().getContext().commands.length;s._&&(r<s._.min||r>s._.max)&&(r<s._.min?void 0!==s._.minMsg?e.fail(s._.minMsg?s._.minMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.min.toString()):null):e.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?e.fail(s._.maxMsg?s._.maxMsg.replace(/\$0/g,r.toString()).replace(/\$1/,s._.max.toString()):null):e.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(t,n){n<t&&e.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+"",t+""))},requiredArguments:function(t,n){let s=null;for(const e of Object.keys(n))Object.prototype.hasOwnProperty.call(t,e)&&void 0!==t[e]||(s=s||{},s[e]=n[e]);if(s){const t=[];for(const e of Object.keys(s)){const n=s[e];n&&t.indexOf(n)<0&&t.push(n)}const n=t.length?`\n${t.join("\n")}`:"";e.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=t.getInternalMethods().getCommandInstance().getCommands(),d=[],u=t.getInternalMethods().getContext();if(Object.keys(n).forEach((e=>{Rt.includes(e)||Object.prototype.hasOwnProperty.call(o,e)||Object.prototype.hasOwnProperty.call(t.getInternalMethods().getParseContext(),e)||r.isValidAndSomeAliasIsNotNew(e,s)||d.push(e)})),c&&(u.commands.length>0||h.length>0||a)&&n._.slice(u.commands.length).forEach((t=>{h.includes(""+t)||d.push(""+t)})),c){const e=(null===(l=t.getDemandedCommands()._)||void 0===l?void 0:l.max)||0,s=u.commands.length+e;s<n._.length&&n._.slice(s).forEach((t=>{t=String(t),u.commands.includes(t)||d.includes(t)||d.push(t)}))}d.length&&e.fail(i("Unknown argument: %s","Unknown arguments: %s",d.length,d.map((t=>t.trim()?t:`"${t}"`)).join(", ")))},unknownCommands:function(n){const s=t.getInternalMethods().getCommandInstance().getCommands(),r=[],o=t.getInternalMethods().getContext();return(o.commands.length>0||s.length>0)&&n._.slice(o.commands.length).forEach((t=>{s.includes(""+t)||r.push(""+t)})),r.length>0&&(e.fail(i("Unknown command: %s","Unknown commands: %s",r.length,r.join(", "))),!0)},isValidAndSomeAliasIsNotNew:function(e,n){if(!Object.prototype.hasOwnProperty.call(n,e))return!1;const s=t.parsed.newAliases;return[e,...n[e]].some((t=>!Object.prototype.hasOwnProperty.call(s,t)||!s[e]))},limitedChoices:function(n){const i=t.getOptions(),r={};if(!Object.keys(i.choices).length)return;Object.keys(n).forEach((t=>{-1===Rt.indexOf(t)&&Object.prototype.hasOwnProperty.call(i.choices,t)&&[].concat(n[t]).forEach((e=>{-1===i.choices[t].indexOf(e)&&void 0!==e&&(r[t]=(r[t]||[]).concat(e))}))}));const o=Object.keys(r);if(!o.length)return;let a=s("Invalid values:");o.forEach((t=>{a+=`\n ${s("Argument: %s, Given: %s, Choices: %s",t,e.stringifiedValues(r[t]),e.stringifiedValues(i.choices[t]))}`})),e.fail(a)}};let o={};function a(t,e){const n=Number(e);return"number"==typeof(e=isNaN(n)?e:n)?e=t._.length>=e:e.match(/^--no-.+/)?(e=e.match(/^--no-(.+)/)[1],e=!Object.prototype.hasOwnProperty.call(t,e)):e=Object.prototype.hasOwnProperty.call(t,e),e}r.implies=function(e,s){yt("<string|object> [array|number|string]",[e,s],arguments.length),"object"==typeof e?Object.keys(e).forEach((t=>{r.implies(t,e[t])})):(t.global(e),o[e]||(o[e]=[]),Array.isArray(s)?s.forEach((t=>r.implies(e,t))):(dt(s,void 0,n),o[e].push(s)))},r.getImplied=function(){return o},r.implications=function(t){const n=[];if(Object.keys(o).forEach((e=>{const s=e;(o[e]||[]).forEach((e=>{let i=s;const r=e;i=a(t,i),e=a(t,e),i&&!e&&n.push(` ${s} -> ${r}`)}))})),n.length){let t=`${s("Implications failed:")}\n`;n.forEach((e=>{t+=e})),e.fail(t)}};let c={};r.conflicts=function(e,n){yt("<string|object> [array|string]",[e,n],arguments.length),"object"==typeof e?Object.keys(e).forEach((t=>{r.conflicts(t,e[t])})):(t.global(e),c[e]||(c[e]=[]),Array.isArray(n)?n.forEach((t=>r.conflicts(e,t))):c[e].push(n))},r.getConflicting=()=>c,r.conflicting=function(i){Object.keys(i).forEach((t=>{c[t]&&c[t].forEach((n=>{n&&void 0!==i[t]&&void 0!==i[n]&&e.fail(s("Arguments %s and %s are mutually exclusive",t,n))}))})),t.getInternalMethods().getParserConfiguration()["strip-dashed"]&&Object.keys(c).forEach((t=>{c[t].forEach((r=>{r&&void 0!==i[n.Parser.camelCase(t)]&&void 0!==i[n.Parser.camelCase(r)]&&e.fail(s("Arguments %s and %s are mutually exclusive",t,r))}))}))},r.recommendCommands=function(t,n){n=n.sort(((t,e)=>e.length-t.length));let i=null,r=1/0;for(let e,s=0;void 0!==(e=n[s]);s++){const n=It(t,e);n<=3&&n<r&&(r=n,i=e)}i&&e.fail(s("Did you mean %s?",i))},r.reset=function(t){return o=_t(o,(e=>!t[e])),c=_t(c,(e=>!t[e])),r};const l=[];return r.freeze=function(){l.push({implied:o,conflicting:c})},r.unfreeze=function(){const t=l.pop();dt(t,void 0,n),({implied:o,conflicting:c}=t)},r}(this,ke(this,be,"f"),ke(this,pe,"f")),"f"),Ee(this,Bt,ke(this,Bt,"f")?ke(this,Bt,"f").reset():function(t,e,n,s){return new At(t,e,n,s)}(ke(this,be,"f"),ke(this,Oe,"f"),ke(this,Xt,"f"),ke(this,pe,"f")),"f"),ke(this,Ut,"f")||Ee(this,Ut,function(t,e,n,s){return new Dt(t,e,n,s)}(this,ke(this,be,"f"),ke(this,Bt,"f"),ke(this,pe,"f")),"f"),ke(this,Xt,"f").reset(),Ee(this,Ht,null,"f"),Ee(this,ie,"","f"),Ee(this,qt,null,"f"),Ee(this,te,!1,"f"),this.parsed=!1,this}[tn](t,e){return ke(this,pe,"f").path.relative(t,e)}[nn](t,e,n,s=0,i=!1){let r=!!n||i;t=t||ke(this,ue,"f"),ke(this,re,"f").__=ke(this,pe,"f").y18n.__,ke(this,re,"f").configuration=this[Se]();const o=!!ke(this,re,"f").configuration["populate--"],a=Object.assign({},ke(this,re,"f").configuration,{"populate--":!0}),c=ke(this,pe,"f").Parser.detailed(t,Object.assign({},ke(this,re,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,ke(this,le,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((t=>{t===ke(this,ee,"f")&&l[t]?u=!0:t===ke(this,we,"f")&&l[t]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&ke(this,be,"f").clearCachedHelpMessage();try{if(this[Ne](),e)return this[Ze](l,o,!!n,!1);if(ke(this,ee,"f")){[ke(this,ee,"f")].concat(d[ke(this,ee,"f")]||[]).filter((t=>t.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Ee(this,ne,!1,"f");const a=ke(this,Bt,"f").getCommands(),p=ke(this,Ut,"f").completionKey in l,g=u||p||i;if(l._.length){if(a.length){let t;for(let e,r=s||0;void 0!==l._[r];r++){if(e=String(l._[r]),a.includes(e)&&e!==ke(this,Ht,"f")){const t=ke(this,Bt,"f").runCommand(e,this,c,r+1,i,u||f||i);return this[Ze](t,o,!!n,!1)}if(!t&&e!==ke(this,Ht,"f")){t=e;break}}!ke(this,Bt,"f").hasDefaultCommand()&&ke(this,fe,"f")&&t&&!g&&ke(this,Oe,"f").recommendCommands(t,a)}ke(this,Ht,"f")&&l._.includes(ke(this,Ht,"f"))&&!p&&(ke(this,Kt,"f")&&xt(!0),this.showCompletionScript(),this.exit(0))}if(ke(this,Bt,"f").hasDefaultCommand()&&!g){const t=ke(this,Bt,"f").runCommand(null,this,c,0,i,u||f||i);return this[Ze](t,o,!!n,!1)}if(p){ke(this,Kt,"f")&&xt(!0);const e=(t=[].concat(t)).slice(t.indexOf(`--${ke(this,Ut,"f").completionKey}`)+1);return ke(this,Ut,"f").getCompletion(e,((t,e)=>{if(t)throw new st(t.message);(e||[]).forEach((t=>{ke(this,se,"f").log(t)})),this.exit(0)})),this[Ze](l,!o,!!n,!1)}if(ke(this,te,"f")||(u?(ke(this,Kt,"f")&&xt(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(ke(this,Kt,"f")&&xt(!0),r=!0,ke(this,be,"f").showVersion("log"),this.exit(0))),!r&&ke(this,re,"f").skipValidation.length>0&&(r=Object.keys(l).some((t=>ke(this,re,"f").skipValidation.indexOf(t)>=0&&!0===l[t]))),!r){if(c.error)throw new st(c.error.message);if(!p){const t=this[sn](d,{},c.error);n||(h=Ot(l,this,ke(this,Xt,"f").getMiddleware(),!0)),h=this[Ve](t,null!=h?h:l),pt(h)&&!n&&(h=h.then((()=>Ot(l,this,ke(this,Xt,"f").getMiddleware(),!1))))}}}catch(t){if(!(t instanceof st))throw t;ke(this,be,"f").fail(t.message,t)}return this[Ze](null!=h?h:l,o,!!n,!0)}[sn](t,e,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new st(n.message);ke(this,Oe,"f").nonOptionCount(r),ke(this,Oe,"f").requiredArguments(r,i);let o=!1;ke(this,me,"f")&&(o=ke(this,Oe,"f").unknownCommands(r)),ke(this,ge,"f")&&!o?ke(this,Oe,"f").unknownArguments(r,t,e,!!s):ke(this,ye,"f")&&ke(this,Oe,"f").unknownArguments(r,t,{},!1,!1),ke(this,Oe,"f").limitedChoices(r),ke(this,Oe,"f").implications(r),ke(this,Oe,"f").conflicting(r)}}[rn](){Ee(this,te,!0,"f")}[on](t){if("string"==typeof t)ke(this,re,"f").key[t]=!0;else for(const e of t)ke(this,re,"f").key[e]=!0}}const cn=(ln=ht,(t=[],e=ln.process.cwd(),n)=>{const s=new an(t,e,n,ln);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var ln;function hn(t){if(Object(t)!==t)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==t?typeof t:"null"));return t}function dn(t,e,n){"symbol"==typeof e&&(e=(e=e.description)?"["+e+"]":"");try{Object.defineProperty(t,"name",{configurable:!0,value:n?n+" "+e:e})}catch(t){}return t}function un(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var s=n.call(t,e||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}let fn;const pn=function({cacheDuration:t=Number.POSITIVE_INFINITY,caches:e,calcKey:n=(t=>function(t,e=0){const[n,s]=function(t,e=0){let n=3735928559^e,s=1103547991^e;for(let e,i=0;i<t.length;i++)e=t.codePointAt(i),n=Math.imul(n^e,2654435761),s=Math.imul(s^e,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]}(t,e);return t.length.toString(36)+n.toString(36).padStart(7,"0")+s.toString(36).padStart(7,"0")}(JSON.stringify(t))),maxCachedArgsSize:s=100,maxCachedThisSize:i=10}={}){return function(r,o){if("getter"===o?.kind){const n=new Map;return e?.push(n),function(){const e=Date.now();if(n.has(this)){const[s,i]=n.get(this);if(e-i<=t)return s}const s=r.call(this);if(n.size>=i){const t=n.keys().next().value;n.delete(t)}return n.set(this,[s,e]),s}}{const a=new Map;return e?.push(a),function(...e){const c=n(e);let l=a.get(this);const h=Date.now();if(l){if(l.has(c)){const[e,n]=l.get(c);if(h-n<=t)return e}}else{if(l=new Map,a.size>=i){const t=a.keys().next().value;a.delete(t)}a.set(this,l)}const d=o?r.call(this,...e):r(...e);if(l.size>=s){const t=l.keys().next().value;l.delete(t)}return l.set(c,[d,h]),d}}}}({maxCachedThisSize:Number.MAX_SAFE_INTEGER,maxCachedArgsSize:1});class gn{static{[fn]=function(t,e,n,s,i,r){var o,a,c,l,h,d,u,f=Symbol.metadata||Symbol.for("Symbol.metadata"),p=Object.defineProperty,g=Object.create,m=[g(null),g(null)],y=e.length;function b(e,n,s){return function(i,r){n&&(r=i,i=t);for(var o=0;o<e.length;o++)r=e[o].apply(i,s?[r]:[]);return s?r:i}}function v(t,e,n,s){if("function"!=typeof t&&(s||void 0!==t))throw new TypeError(e+" must "+(n||"be")+" a function"+(s?"":" or undefined"));return t}function w(t,e,n,s,i,r,c,l,h,d,u){function f(t){if(!u(t))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(e[0]),y=e[3],w=!c,O=1===i,E=3===i,k=4===i,A=2===i;function j(e,n,s){return function(i,r){return n&&(r=i,i=t),s&&s(i),$[e].call(i,r)}}if(!w){var $={},_=[],x=E?"get":k||O?"set":"value";if(h?(d||O?$={get:dn((function(){return y(this)}),s,"get"),set:function(t){e[4](this,t)}}:$[x]=y,d||dn($[x],s,A?"":x)):d||($=Object.getOwnPropertyDescriptor(t,s)),!d&&!h){if((a=m[+l][s])&&7!=(a^i))throw Error("Decorating two elements with the same name ("+$[x].name+") is not supported yet");m[+l][s]=i<3?1:i}}for(var C=t,S=g.length-1;S>=0;S-=n?2:1){var P=v(g[S],"A decorator","be",!0),N=n?g[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:o,addInitializer:function(t,e){if(t.v)throw Error("attempted to call addInitializer after decoration was finished");v(e,"An initializer","be",!0),r.push(e)}.bind(null,M)};if(w)a=P.call(N,C,D),M.v=1,v(a,"class decorators","return")&&(C=a);else if(D.static=l,D.private=h,a=D.access={has:h?u.bind():function(t){return s in t}},k||(a.get=h?A?function(t){return f(t),$.value}:j("get",0,f):function(t){return t[s]}),A||E||(a.set=h?j("set",0,f):function(t,e){t[s]=e}),C=P.call(N,O?{get:$.get,set:$.set}:$[x],D),M.v=1,O){if("object"==typeof C&&C)(a=v(C.get,"accessor.get"))&&($.get=a),(a=v(C.set,"accessor.set"))&&($.set=a),(a=v(C.init,"accessor.init"))&&_.unshift(a);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(C,(d?"field":"method")+" decorators","return")&&(d?_.unshift(C):$[x]=C)}return i<2&&c.push(b(_,l,1),b(r,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[x]:v.call.bind($[x])):p(t,s,$)),C}function O(t){return p(t,f,{configurable:!0,enumerable:!0,value:o})}return o=g(null==o?null:o),h=[],d=function(t){t&&h.push(b(t))},u=function(e,s){for(var r=0;r<n.length;r++){var o=n[r],a=o[1],d=7&a;if((8&a)==e&&!d==s){var u=o[2],f=!!o[3],p=16&a;w(e?t:t.prototype,o,p,f?"#"+u:un(u),d,d<2?[]:e?l=l||[]:c=c||[],h,!!e,f,s,e&&f?function(e){return hn(e)===t}:i)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(c),d(l),a=h,y||O(t),{e:a,get c(){var n=[];return y&&[O(t=w(t,[e],s,t.name,5,n)),b(n,1)]}}}(this,[],[[pn,3,"isBunProject"],[pn,3,"isBunAvailable"],[pn,3,"buildCommand"],[pn,3,"rootDirPath"],[pn,3,"dockerfile"],[pn,3,"hasDockerfile"],[pn,3,"hasSourceCode"],[pn,3,"name"],[pn,3,"dockerImageName"],[pn,3,"env"],[pn,3,"packageJson"],[pn,3,"hasPrisma"],[pn,3,"dockerPackageJson"],[pn,3,"binExists"]]).e}argv=void fn(this);pathByName=new Map;constructor(e,n,s){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=s}get isBunProject(){return l.existsSync(t.join(this.rootDirPath,"bunfig.toml"))}get isBunAvailable(){try{return/(^|\n)bun\s/.test(l.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return 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(t.join(this.dirPath,"..","..","package.json"))?t.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(t.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(t.join(this.dirPath,"package.json"),"utf8"))}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(l.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let e=!1,n=this.dirPath;for(;;){const s=t.join(n,"node_modules",".bin");if(l.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,e=!0),l.existsSync(t.join(n,".git")))break;const i=t.dirname(n);if(n===i)break;n=i}return e}findFile(e){let n=this.pathByName.get(e);if(n)return n;if(n=[e,t.join("..","..",e)].map((e=>t.resolve(this.dirPath,e))).find((t=>l.existsSync(t))),!n)throw new Error(`File not found: ${e}`);return this.pathByName.set(e,n),n}}function mn(e,n=!0,s){if(s??=process.cwd(),l.existsSync(t.join(s,"package.json")))return new gn(s,e,n)}async function yn(e,n=!0,s){const i=function(e,n=!0,s){if(s??=process.cwd(),!l.existsSync(t.join(s,"package.json")))return;const i=new gn(s,e,n);let r=i;if(!i.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const i=t.resolve(s,"..","..");l.existsSync(t.join(i,"package.json"))&&(r=new gn(i,e,n))}return{root:r,self:i}}(e,n,s);if(i)return{...i,all:i.root===i.self?await bn(e,i.root,n):[i.self]}}async function bn(e,n,s){const i=[n],r=n.packageJson.workspaces;if(!Array.isArray(r))return i;const o=[],a=[];for(const e of r.map((e=>t.join(n.dirPath,e))))l.existsSync(e)?a.push(e):o.push(e);a.push(...await E(o,{dot:!0,onlyDirectories:!0}));for(const n of a)l.existsSync(t.join(n,"package.json"))&&i.push(new gn(n,e,s));return i}const vn={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command",type:"string",default:"yarn build",alias:"c"}},async handler(e){await async function(e,n){const s=await mn(e,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(t.join(s.rootDirPath,".git")))return wn(s,e),!0;const[i,r,o]=await async function(e,n){const s=t.resolve(e.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await l.promises.mkdir(s,{recursive:!0});const r=w("sha256"),o=y.execSync("git rev-parse HEAD",{cwd:e.dirPath}).toString().trim();r.update(o);const a=JSON.stringify(Object.entries(e.env).filter((([t])=>!On.has(t))).sort((([t],[e])=>t.localeCompare(e))));r.update(a),await async function(t,e,n){return new Promise((s=>{const i=y.spawnSync("git",["diff","--name-only"],{cwd:t.dirPath,env:t.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((e=>"test"===t.env.WB_ENV?e.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):e)).filter((t=>(En.some((e=>t.includes(e)))||kn.some((e=>t.endsWith(e))))&&!An.some((e=>t.includes(e)))));e.verbose&&console.info(`Changed files: ${i.join(", ")}`);const r=y.spawn("git",["diff","--",...i],{cwd:t.rootDirPath});r.stdout?.on("data",(t=>{n.update(t),e.verbose&&(console.info(t.toString()),console.info("Hash:",n.copy().digest("hex")))})),r.on("close",(()=>{s()}))}))}(e,n,r);const c=r.digest("hex"),h=await async function(t){try{return await t()}catch(t){if("object"==typeof t&&t&&"code"in t&&"ENOENT"===t.code)return;throw t}}((()=>l.promises.readFile(i,"utf8")));return[h===c,i,c]}(s,e);if(i)return console.info(O.green(`Skip to run '${e.command}' 💫`)),!1;if(!wn(s,e))return;e.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(e)}};function wn(t,e){if(console.info(O.green(`Run '${e.command}'`)),!e.dryRun){const n=y.spawnSync(e.command??"",{cwd:t.dirPath,env:t.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const On=new Set(["CI","PWDEBUG","TMPDIR"]);const En=["src/","public/"],kn=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],An=["test/","tests/","__tests__/","test-fixtures/"];function*jn(t,e){for(const n of e)console.info(`Running "${t}" for ${n.name} ...`),yield n}const $n={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(e){const n=await yn(e);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of jn("optimizeForDockerBuild",n.all)){const n=s.packageJson,i=["dependencies","devDependencies"];for(const t of i){const e=n[t]||{};for(const[t,n]of Object.entries(e))n?.startsWith("git@github.com:")&&(e[t]=`./${t}`)}if(_n(e,n),xn(n),Cn(n),e.dryRun)continue;const r=e.outside?t.join(s.dirPath,"dist"):s.dirPath;await l.promises.mkdir(r,{recursive:!0}),await l.promises.writeFile(t.join(r,"package.json"),JSON.stringify(n),"utf8")}e.dryRun||e.outside||y.spawnSync("yarn",{stdio:"inherit"})}};function _n(t,e){if(!t.outside)return void delete e.devDependencies;const n=e.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 e of Object.keys(n))(s.some((t=>e.includes(t)))||!t.outside&&e.includes("willbooster")&&e.includes("config"))&&delete n[e]}function xn(t){const e=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],s=t.scripts||{};for(const[t,i]of Object.entries(s))(e.some((e=>t.includes(e)))||n.some((t=>i.includes(t)||i.trim()===t.trim())))&&delete s[t]}function Cn(t){delete t.private,delete t.publishConfig,delete t.prettier}const Sn=process.argv[0].endsWith("/bun"),Pn=Sn?"bun --bun":"node",Nn=Sn?"bun --bun":"yarn";const Mn=new class{deploy(t){return"PRISMA migrate deploy"}deployForce(t,e){const n=t.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 ${e} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(t){return`${Pn} -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(t){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(t)}`}migrateDev(t){return"PRISMA migrate dev"}reset(t){return`PRISMA migrate reset --force --skip-seed && ${this.seed(t)}`}restore(t,e,n){return`rm -Rf ${t.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${e}`}seed(t,e){return t.packageJson.dependencies?.blitz?"YARN blitz db seed"+(e?` -f ${e}`:""):e?"BUN build-ts run prisma/seeds.ts":t.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);console.info(n,e),s=`DATABASE_URL=file://${e} `}return`${s}PRISMA studio`}},Dn=new Set;async function In(t){try{await A(t)}catch{}}const Rn=new j,Wn={exitIfFailed:!0};async function zn(t,e,n,s=Wn){const[i,r]=Fn(t,e);if(Bn(i,e),n.verbose&&Bn(r,e,"Start (raw)",!0),n.dryRun)return Ln(i,0,s),0;const o=r.match(/http:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(t){await In(t);const e=async()=>{Dn.has(t)||(Dn.add(t),await In(t))};for(const t of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(t,e)}(Number(o));const a=await M(r,void 0,{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Ln(i,a.status,s),a.status??1}function Tn(t,e,n,s=Wn){return Rn.run((async()=>{const[i,r]=Fn(t,e);if(Bn(i,e,"Start (parallel)",!0),n.dryRun)return Bn(i,e,"Started (log)"),n.verbose&&Bn(r,e,"Started (raw)",!0),void Ln(i,0,s);const o=await M(r,void 0,{cwd:e.dirPath,env:e.env,shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});Bn(i,e,"Started (log)"),n.verbose&&Bn(r,e,"Started (raw)",!0);const a=o.stdout.trim();a&&console.info(a),Ln(i,o.status,s)}))}function Fn(t,e){const n=t.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",e.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",e.isBunAvailable?"bun --bun ":"YARN ").trim();return[n.replaceAll("YARN ",`${Nn} `),n.replaceAll("YARN ",!Sn&&e.binExists?"":`${Nn} `)]}function Bn(t,e,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),t)+O.gray(` at ${e.dirPath}`))}function Ln(t,e,n){0===e?console.info(O.green(O.bold("Finished:"),t)):(console.info(O.red(O.bold(`Failed (exit code ${e}): `),t)),!1!==n.exitIfFailed&&process.exit(e??1))}const Vn={},Un={command:"prisma",describe:"Run prisma commands",builder:t=>t.command(Hn).command(qn).command(Jn).command(Gn).command(Kn).command(Qn).command(Xn).command(Zn).command(ts).command(es).demandCommand(),handler(){}},Hn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Vn,async handler(t){const e=await ns(t);for(const n of jn("prisma deploy",e))await zn(Mn.deploy(n),n,t)}},Yn={...Vn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},qn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Yn,async handler(t){const e=await ns(t);for(const n of jn("prisma deploy-force",e))await zn(Mn.deployForce(n,t.backupPath),n,t)}},Jn={command:"litestream",describe:"Setup DB for Litestream",builder:Vn,async handler(t){const e=await ns(t);for(const n of jn("prisma litestream",e))await zn(Mn.litestream(n),n,t)}},Gn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Vn,async handler(t){const e=await ns(t);for(const n of jn("prisma migrate",e))await zn(Mn.migrate(n),n,t)}},Kn={command:"migrate-dev",describe:"Create a migration file",builder:Vn,async handler(t){const e=await ns(t);for(const n of jn("prisma migrate-dev",e))await zn(Mn.migrateDev(n),n,t)}},Qn={command:"reset",describe:"Reset DB",builder:Vn,async handler(t){const e=await ns(t);for(const n of jn("prisma reset",e))await zn(Mn.reset(n),n,t)}},Xn={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Yn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(t){const e=await ns(t);for(const n of jn("prisma restore",e)){const e=t.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await zn(Mn.restore(n,t.backupPath,e),n,t)}}},Zn={command:"seed",describe:"Populate DB with seed data",builder:{...Vn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(t){const e=await ns(t);for(const n of jn("prisma seed",e))await zn(Mn.seed(n,t.file),n,t)}},ts={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Vn,"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(t){if(t.restored&&t.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const e=await ns(t);for(const n of jn("prisma studio",e)){const e=t.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":t.dbUrlOrPath?.toString();await zn(Mn.studio(n,e),n,t)}}},es={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(t){const e=await ns(t),n=`${t.args?.join(" ")??""}`.trimEnd();for(const s of jn(`prisma ${n}`,e))await zn(`PRISMA ${n}`,s,t)}};async function ns(t){const e=await yn(t);e||(console.error(O.red("No project found.")),process.exit(1));const n=e.all.filter((t=>t.packageJson.dependencies?.prisma||t.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(O.red("No prisma project found.")),process.exit(1)),n}const ss={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(t){const e=mn(t);e||(console.error(O.red("No project found.")),process.exit(1));const n=[t.command,...t.args??[],...t._.slice(1)].filter(Boolean);let s=0;for(let i=0;i<t.retry;i++)if(i>0&&console.info(`\n${O.yellow(`#${i} Retrying: ${n.join(" ")}`)}`),s=await zn(n.join(" "),e,t,{exitIfFailed:!1}),0===s)return;process.exit(s)}},is={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(t){await async function(t,e){const n=await yn(t,!1,e);n||(console.error(O.red("No project found.")),process.exit(1));for(const e of jn("setup",n.all)){const s=await _.readdir(e.dirPath,{withFileTypes:!0});if(e===n.root){if("darwin"===x.platform()){const n=["pstree"];e.hasDockerfile&&n.push("expect"),await Tn(`brew install ${n.join(" ")}`,e,t)}s.some((t=>t.isFile()&&t.name.includes("-version")))&&await zn("asdf install",e,t)}if(s.some((t=>t.isFile()&&"pyproject.toml"===t.name))){await Tn("poetry config virtualenvs.in-project true",e,t),await Tn("poetry config virtualenvs.prefer-active-python true",e,t);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Tn(`poetry env use ${n}`,e,t),await Rn.promiseAll(),await zn("poetry run pip install --upgrade pip",e,t),await zn("poetry install --ansi",e,t)}const i=e.packageJson.dependencies??{},r=e.packageJson.devDependencies||{},o=e.packageJson.scripts??{},a=[],c=[];i.blitz||i.next||r["@remix-run/dev"]?(a.push("pm2"),c.push("concurrently","open-cli","vitest","wait-on")):(i.express||i.fastify)&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),a.length>0&&await zn(`yarn add ${a.join(" ")}`,e,t),c.length>0&&await zn(`yarn add -D ${c.join(" ")}`,e,t),o["gen-code"]&&await zn("yarn gen-code",e,t)}}(t)}};const rs=new class{buildDevImage(e,n){const s=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${s}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(t,e=!1,n="",s=""){return`${this.stop(t)} && ${e?"unbuffer ":""}${this.start(t,n,s)}`}start(t,e="",n=""){return function(t,e){const n=async()=>{if(Dn.has(t))return;Dn.add(t),Bn(t,e);const{status:n}=v(t,{cwd:e.dirPath,shell:!0,stdio:"inherit"});Ln(t,n,{})};for(const t of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(t,n)}(this.stop(t),t),`docker run --rm -it -p 8080:8080 --name ${t.dockerImageName} ${e} ${t.dockerImageName} ${n}`}stop(t){return`true $(docker rm -f $(docker container ls -q -f name=${t.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class os{constructor(t=Number(process.env.PORT)||3e3){this.defaultPort=t}buildDocker(t,e="development"){return rs.buildDevImage(t,e)}startDocker(t,e){return`${this.buildDocker(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${rs.stopAndStart(t,!1,e.normalizedDockerOptionsText??"",e.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(t,e,8080)}"`}testE2E(t,e,{playwrightArgs:n="test tests/e2e",prismaDirectory:s,startCommand:i}){const r=t.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://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",e.target||"tests/e2e")}"`}testE2EDev(t,e,{playwrightArgs:n="test tests/e2e",startCommand:s}){const i=t.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://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",e.target||"tests/e2e")}"`}testUnit(t,e){return`WB_ENV=${t.env.WB_ENV} YARN vitest run ${e.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(t,e,n=this.defaultPort){return`wait-on -t 10000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http://127.0.0.1:${n}`}waitAndOpenApp(t,e,n=this.defaultPort){return`${this.waitApp(t,e,n)} || wait-on http://127.0.0.1:${n} && open-cli "http://\${HOST:-localhost}:${n}"`}}const as=new class extends os{constructor(){super()}start(t,e){return`${t.env.WB_ENV?`APP_ENV=${t.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${e.normalizedArgsText??""}"\n "${this.waitAndOpenApp(t,e)}"`}startProduction(t,e,n){return`${t.env.WB_ENV?`APP_ENV=${t.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(t)} && ${t.buildCommand} && PORT=${n} pm2-runtime start ${t.findFile("ecosystem.config.cjs")} ${e.normalizedArgsText??""}"\n "${this.waitAndOpenApp(t,e,n)}"`}testE2E(t,e,{playwrightArgs:n,startCommand:s=`${Mn.reset(t)} && ${t.buildCommand} && pm2-runtime start ${t.findFile("ecosystem.config.cjs")}`}){return super.testE2E(t,e,{playwrightArgs:n,prismaDirectory:"db",startCommand:s})}testE2EDev(t,e,{playwrightArgs:n,startCommand:s="blitz dev -p 8080"}){return super.testE2EDev(t,e,{playwrightArgs:n,startCommand:s})}testStart(t,e){return`YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(t,e)}"`}};const cs=new class extends os{constructor(){super()}start(t,e){return`YARN build-ts run src/index.ts ${e.watch?"--watch":""} -- ${e.normalizedArgsText??""}`}startDocker(t,e){return`${this.buildDocker(t)} && ${rs.stopAndStart(t,!1,e.normalizedDockerOptionsText??"",e.normalizedArgsText??"")}`}startProduction(t,e,n=8080){return`NODE_ENV=production ${t.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${Pn} dist/index.js ${e.normalizedArgsText??""}`}testE2E(t,e,{startCommand:n=`if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction(t,e)})`}){return`NODE_ENV=production WB_ENV=${t.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http://127.0.0.1:8080 && vitest run ${e.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testE2EDev(t,e,{startCommand:n}){return`NODE_ENV=production WB_ENV=${t.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(t,e)} && exit 1"\n "wait-on -t 600000 -i 2000 http://127.0.0.1:8080 && vitest run ${e.target||"tests/e2e"} --color --passWithNoTests --allowOnly"`}testStart(t,e){return`YARN concurrently --kill-others --raw --success first "${this.start(t,e)}" "${this.waitApp(t,e)}"`}};const ls=new class extends os{constructor(){super()}start(t,e){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbo ${e.normalizedArgsText??""}"\n "${this.waitAndOpenApp(t,e)}"`}startProduction(t,e,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...t.hasPrisma?[Mn.reset(t)]:[],t.buildCommand,`PORT=${n} pm2-runtime start ${t.findFile("ecosystem.config.cjs")} ${e.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(t,e,n)}"`}testE2E(t,e,n){return super.testE2E(t,e,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...t.hasPrisma?[Mn.reset(t)]:[],t.buildCommand,`pm2-runtime start ${t.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(t,e,{startCommand:n="next dev --turbo -p 8080"}){return super.testE2EDev(t,e,{startCommand:n})}testStart(t,e){return`YARN concurrently --kill-others --raw --success first "next dev --turbo" "${this.waitApp(t,e)}"`}};const hs=new class extends os{constructor(){super()}start(t,e){return`YARN build-ts run src/index.ts ${e.watch?"--watch":""} -- ${e.normalizedArgsText??""}`}startDocker(t,e){return`${this.buildDocker(t)} && ${rs.stopAndStart(t,!1,e.normalizedDockerOptionsText??"",e.normalizedArgsText??"")}`}startProduction(t,e){return`NODE_ENV=production ${t.buildCommand} && NODE_ENV=production ${Pn} dist/index.js ${e.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const ds=new class extends os{constructor(){super()}start(t,e){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${e.normalizedArgsText??""}"\n "${this.waitAndOpenApp(t,e)}"`}startProduction(t,e,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${Mn.reset(t)} && ${t.buildCommand} && PORT=${n} pm2-runtime start ${t.findFile("ecosystem.config.cjs")} ${e.normalizedArgsText??""}"\n "${this.waitAndOpenApp(t,e,n)}"`}testE2E(t,e,{playwrightArgs:n,startCommand:s=`${Mn.reset(t)} && ${t.buildCommand} && pm2-runtime start ${t.findFile("ecosystem.config.cjs")}`}){return super.testE2E(t,e,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:s})}testE2EDev(t,e,{playwrightArgs:n,startCommand:s="remix dev"}){return super.testE2EDev(t,e,{playwrightArgs:n,startCommand:s})}testStart(t,e){return`YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(t,e)}"`}},us={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(t){!function(t){t.normalizedArgsText=[...t.args??[],...t._?.slice(1)??[]].map((t=>`'${t}'`)).join(" "),t.normalizedDockerOptionsText=(t.dockerOptions??[]).map((t=>`'${t}'`)).join(" ")}(t);const e=await yn(t);e||(console.error(O.red("No project found.")),process.exit(1));for(const n of e.all){const e=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(e.blitz)i=as;else if(e.next)i=ls;else if(s["@remix-run/dev"])i=ds;else if((e.express||e.fastify)&&!e["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=cs;else{if(!e["build-ts"]&&!s["build-ts"])continue;i=hs}switch(console.info(`Running "start" for ${n.name} ...`),t.mode||"dev"){case"dev":case"development":{const s=fs(e,"development");await zn(`${s}${i.start(n,t)}`,n,t);break}case"staging":{const s=fs(e,"staging");await zn(`${s}${i.startProduction(n,t,8080)}`,n,t);break}case"docker":{const s=fs(e,"staging");await zn(`${s}${i.startDocker(n,t)}`,n,t);break}case"docker-debug":{const s=fs(e,"staging");t.normalizedArgsText="'/bin/bash'",await zn(`${s}${i.startDocker(n,t)}`,n,t);break}default:throw new Error(`Unknown start mode: ${t.mode}`)}}}};function fs(t,e){process.env.WB_ENV||=e;let n=`WB_ENV=${process.env.WB_ENV} `;return t.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const ps={command:"test",describe:"Test project",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(e){await async function(e){const n=await yn(e);n||(console.error(O.red("No project found.")),process.exit(1));n.all.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of n.all){const n=s.packageJson.dependencies||{},i=s.packageJson.devDependencies||{};let r;r=n.blitz?as:n.next?ls:i["@remix-run/dev"]?ds:!n.express&&!n.fastify||n["firebase-functions"]?hs:cs,console.info(`Running "test" for ${s.name} ...`);const o=[];if(!e.ci){switch((e.unit||!e.start&&void 0===e.e2e)&&o.push(zn(r.testUnit(s,e),s,e,{timeout:e.unitTimeout})),e.start&&o.push(zn(r.testStart(s,e),s,e)),await Promise.all(o),e.e2e){case void 0:case"none":continue;case"":case"headless":await zn(r.testE2E(s,e,{}),s,e);continue;case"headless-dev":await zn(r.testE2EDev(s,e,{}),s,e);continue;case"docker":await gs(s,e,r);continue;case"docker-debug":await gs(s,e,r,`test ${e.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||i["@remix-run/dev"])switch(e.e2e){case"headed":await zn(r.testE2E(s,e,{playwrightArgs:`test ${e.target||"tests/e2e"} --headed`}),s,e);continue;case"headed-dev":await zn(r.testE2EDev(s,e,{playwrightArgs:`test ${e.target||"tests/e2e"} --headed`}),s,e);continue;case"debug":await zn(r.testE2E(s,e,{playwrightArgs:`test ${e.target||"tests/e2e"} --debug`}),s,e);continue;case"generate":await zn(r.testE2E(s,e,{playwrightArgs:"codegen http://localhost:8080"}),s,e);continue;case"trace":await zn("BUN playwright show-trace",s,e);continue}throw new Error(`Unknown e2e mode: ${e.e2e}`)}{const n=N(t.join(s.dirPath,"tests","unit")),i=N(t.join(s.dirPath,"tests","e2e"));if(await Tn(rs.stopAll(),s,e),!1!==e.unit&&await n&&await Tn(r.testUnit(s,e).replaceAll(" --allowOnly",""),s,e,{timeout:e.unitTimeout}),!1!==e.start&&await Tn(r.testStart(s,e),s,e),await Rn.promiseAll(),"none"!==e.e2e&&await i){s.hasDockerfile&&await zn(`${r.buildDocker(s,"test")}`,s,e);const t=s.hasDockerfile?{startCommand:rs.stopAndStart(s,!0)}:{};process.exitCode=await zn(r.testE2E(s,e,t).replaceAll(" --allowOnly",""),s,e,{exitIfFailed:!1}),await zn(rs.stop(s),s,e)}}}}(e)}};async function gs(t,e,n,s){await zn(`${n.buildDocker(t,"test")}`,t,e),process.exitCode=await zn(`${n.testE2E(t,e,{playwrightArgs:s,startCommand:rs.stopAndStart(t,!0)})}`,t,e,{exitIfFailed:!1}),await zn(rs.stop(t),t,e)}const ms={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(t){const e=await yn(t,!1);e||(console.error(O.red("No project found.")),process.exit(1));for(const n of e.all){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")),0===s.length)continue;console.info(`Running "typecheck" for ${n.name} ...`),e.all.length>1&&(n.env.CI="1"),n.env.FORCE_COLOR||="3";if(0!==await zn(s.join(" && "),n,t)){(JSON.parse(await _.readFile("package.json","utf8")).dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.'))}}}},ys={...ms,command:"tc"},bs={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:"d"}};var vs;await cn((vs=process.argv,vs.slice(nt()+1))).scriptName("wb").options(bs).middleware((e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(t){t.PATH&&t.BERRY_BIN_FOLDER&&(t.PATH=t.PATH.replace(`${t.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const e of Object.keys(t)){const n=e.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete t[e]}}(process.env)})).command(vn).command($n).command(Un).command(ss).command(is).command(us).command(ps).command(ms).command(ys).demandCommand().strict().help().argv;for(const t of["SIGINT","SIGTERM","SIGQUIT"])process.on(t,(()=>process.exit()));
34
- //# sourceMappingURL=index.js.map
33
+ var J,G,K;const Q=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12,X=null!==(G=null===(J=null===process||void 0===process?void 0:process.versions)||void 0===J?void 0:J.node)&&void 0!==G?G:null===(K=null===process||void 0===process?void 0:process.version)||void 0===K?void 0:K.slice(1);if(X){if(Number(X.match(/^([^.]+)/)[1])<Q)throw Error(`yargs parser supports a minimum Node.js version of ${Q}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const Z=process?process.env:{},ee=new class{constructor(e){H=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.__||H.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=B(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=L(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=x("_",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(_(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(_(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 B(e)})).join(".");$(e,t)}const s=_(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?H.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 _(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 x(e,t)})):x(e,t);return D(e,g.counts)&&(z(s)||"boolean"==typeof s)&&(s=Y()),D(e,g.normalize)&&D(e,g.arrays)&&(s=Array.isArray(t)?t.map((e=>H.normalize(e))):H.normalize(t)),s}function x(e,t){if(!o["parse-positional-numbers"]&&"_"===e)return t;if(!D(e,g.strings)&&!D(e,g.bools)&&!Array.isArray(t)){(V(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=H.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)),B(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=q(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=q(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===Y()?s[i]=Y(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=U.BOOLEAN;return D(e,g.strings)?t=U.STRING:D(e,g.numbers)?t=U.NUMBER:D(e,g.bools)?t=U.BOOLEAN:D(e,g.arrays)&&(t=U.ARRAY),t}(e),{[U.BOOLEAN]:!0,[U.STRING]:"",[U.NUMBER]:void 0,[U.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=H.resolve(H.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=H.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=x(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=>B(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:()=>Z,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")}}),te=function(e,t){return ee.parse(e.slice(),t).argv};function ne(){return process.versions.electron&&!process.defaultApp?0:1}te.detailed=function(e,t){return ee.parse(e.slice(),t)},te.camelCase=B,te.decamelize=L,te.looksLikeNumber=V;class se extends Error{constructor(e){super(e||"yargs error"),this.name="YError",Error.captureStackTrace&&Error.captureStackTrace(this,se)}}var ie={fs:{readFileSync:u,writeFile:f},format:p,resolve:t,exists:e=>{try{return h(e).isFile()}catch(e){return!1}}};let re;class oe{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(),re.format.apply(re.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),re.format.apply(re.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);re.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{re.fs.readFileSync&&(e=JSON.parse(re.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=re.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const s=re.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(s)&&(n=s)}return n}_fileExistsSync(e){return re.exists(e)}}const ae="loading a directory of commands is not supported yet for ESM";let ce;try{ce=m(import.meta.url)}catch(e){ce=process.cwd()}var le,he={assert:{notStrictEqual:a,strictEqual:c},cliui:function(e){return function(e,t){return W=t,new I({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:T,wrap:F})},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 se(ae)},getProcessArgvBin:function(){return process.argv[ne()]},mainFilename:ce.substring(0,ce.lastIndexOf("node_modules"))||process.cwd(),Parser:te,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 se("require is not supported by ESM")},requireDirectory:()=>{throw new se(ae)},stringWidth:e=>[...e].length,y18n:(le={directory:t(ce,"../../../locales"),updateFiles:!1},function(e,t){re=t;const n=new oe(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}}(le,ie))};function de(e,t,n,s){n.assert.notStrictEqual(e,t,s)}function ue(e,t){t.assert.strictEqual(typeof e,"string")}function fe(e){return Object.keys(e)}function pe(e){return!!e&&!!e.then&&"function"==typeof e.then}function ge(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 me=["first","second","third","fourth","fifth","sixth"];function ye(e,t,n){try{let s=0;const[i,r,o]="object"==typeof e?[{demanded:[],optional:[]},e,t]:[ge(`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 se(`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 se(`Too many arguments provided. Expected max ${l} but received ${c}.`);i.demanded.forEach((e=>{const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1})),i.optional.forEach((e=>{if(0===a.length)return;const t=be(a.shift());0===e.cmd.filter((e=>e===t||"*"===e)).length&&ve(t,e.cmd,s),s+=1}))}catch(e){console.warn(e.stack)}}function be(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function ve(e,t,n){throw new se(`Invalid ${me[n]||"manyith"} argument. Expected ${t.join(" or ")} but received ${e}.`)}class we{constructor(e){this.globalMiddleware=[],this.frozens=[],this.yargs=e}addMiddleware(e,t,n=!0,s=!1){if(ye("<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 Oe(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(pe(e))return e.then((e=>Promise.all([e,n(e,t)]))).then((([e,t])=>Object.assign(e,t)));{const s=n(e,t);return pe(s)?s.then((t=>Object.assign(e,t))):Object.assign(e,s)}}),e)}function Ee(e,t,n=(e=>{throw e})){try{const n="function"==typeof e?e():e;return pe(n)?n.then((e=>t(e))):t(n)}catch(e){return n(e)}}const ke=/(^\*)|(^\$0)/;class Ae{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(je(n))return void this.addHandler([e].concat(o),t,n.builder,n.handler,n.middlewares,n.deprecated)}if("string"==typeof e){const i=ge(e);o=o.map((e=>ge(e).cmd));let c=!1;const l=[i.cmd].concat(o).filter((e=>!ke.test(e)||(c=!0,!1)));0===l.length&&c&&l.push("$0"),c&&(i.cmd=l[0],o=l.slice(1),e=e.replace(ke,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 pe(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($e(c)){n.getInternalMethods().getUsageInstance().freeze();const h=c(n.getInternalMethods().reset(s),a);if(pe(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 pe(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=ke.test(t.original)?t.original.replace(ke,"").trim():t.original,s=e.filter((e=>!ke.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=Ee(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=Ee(n=Oe(n,r,o,!1),(e=>{const n=t.handler(e);return pe(n)?n.then((()=>e)):e})),e||r.getInternalMethods().getUsageInstance().cacheHelpMessage(),pe(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=Oe(n,o,c,!0);return pe(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=ge(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=ke.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($e(t))return t(e,!0);je(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;de(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();de(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 je(e){return"object"==typeof e&&!!e.builder&&"function"==typeof e.handler}function $e(e){return"function"==typeof e}function _e(e={},t=(()=>!0)){const n={};return fe(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 Ce(e){return"boolean"==typeof e}function Se(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 se(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(Ce(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} ${Me(e[0])}`:Me(e[0]))+Ne(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(Me(e)),_=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(_.filter((({groupName:e})=>e!==s.getPositionalGroupName())).some((({normalizedKeys:e,switches:t})=>!e.every((e=>$(t[e])))))&&_.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,Pe(n)?{text:n.text,indentation:n.indentation+s}:{text:n,indentation:s}))}))})),_.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:Me(i),padding:[0,2,0,2+Ne(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 Pe(e){return"object"==typeof e}function Ne(e){return Pe(e)?e.indentation:0}function Me(e){return Pe(e)?e.text:e}class De{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($e(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=ge(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(de(this.customCompletionFunction,null,this.shim),this.customCompletionFunction.length<3){const e=this.customCompletionFunction(n,t);return pe(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 pe(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 Ie(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 Re=["$0","--","_"];let We,ze=[];function Te(e,t,n,s){We=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 We.path.resolve(e,t)}(t,e.extends);else try{r=require.resolve(e.extends)}catch(t){return e}!function(e){if(ze.indexOf(e)>-1)throw new se(`Circular extended configurations: '${e}'.`)}(r),ze.push(r),i=s?JSON.parse(We.readFileSync(r,"utf8")):require(e.extends),delete e.extends,i=Te(i,We.path.dirname(r),n,We)}return ze=[],n?Fe(i,e):Object.assign({},i,e)}function Fe(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]=Fe(e[i],t[i]):n[i]=t[i];return n}var Be,Le,Ve,Ue,He,Ye,qe,Je,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,Et=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},kt=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 At=Symbol("copyDoubleDash"),jt=Symbol("copyDoubleDash"),$t=Symbol("deleteFromParserHintObject"),_t=Symbol("emitWarning"),xt=Symbol("freeze"),Ct=Symbol("getDollarZero"),St=Symbol("getParserConfiguration"),Pt=Symbol("getUsageConfiguration"),Nt=Symbol("guessLocale"),Mt=Symbol("guessVersion"),Dt=Symbol("parsePositionalNumbers"),It=Symbol("pkgUp"),Rt=Symbol("populateParserHintArray"),Wt=Symbol("populateParserHintSingleValueDictionary"),zt=Symbol("populateParserHintArrayDictionary"),Tt=Symbol("populateParserHintDictionary"),Ft=Symbol("sanitizeKey"),Bt=Symbol("setKey"),Lt=Symbol("unfreeze"),Vt=Symbol("validateAsync"),Ut=Symbol("getCommandInstance"),Ht=Symbol("getContext"),Yt=Symbol("getHasOutput"),qt=Symbol("getLoggerInstance"),Jt=Symbol("getParseContext"),Gt=Symbol("getUsageInstance"),Kt=Symbol("getValidationInstance"),Qt=Symbol("hasParseCallback"),Xt=Symbol("isGlobalContext"),Zt=Symbol("postProcess"),en=Symbol("rebase"),tn=Symbol("reset"),nn=Symbol("runYargsParserAndExecuteCommands"),sn=Symbol("runValidation"),rn=Symbol("setHasOutput"),on=Symbol("kTrackManuallySetKeys");class an{constructor(e=[],t,n,s){this.customScriptName=!1,this.parsed=!1,Be.set(this,void 0),Le.set(this,void 0),Ve.set(this,{commands:[],fullCommands:[]}),Ue.set(this,null),He.set(this,null),Ye.set(this,"show-hidden"),qe.set(this,null),Je.set(this,!0),Ge.set(this,{}),Ke.set(this,!0),Qe.set(this,[]),Xe.set(this,void 0),Ze.set(this,{}),et.set(this,!1),tt.set(this,null),nt.set(this,!0),st.set(this,void 0),it.set(this,""),rt.set(this,void 0),ot.set(this,void 0),at.set(this,{}),ct.set(this,null),lt.set(this,null),ht.set(this,{}),dt.set(this,{}),ut.set(this,void 0),ft.set(this,!1),pt.set(this,void 0),gt.set(this,!1),mt.set(this,!1),yt.set(this,!1),bt.set(this,void 0),vt.set(this,{}),wt.set(this,null),Ot.set(this,void 0),Et(this,pt,s,"f"),Et(this,ut,e,"f"),Et(this,Le,t,"f"),Et(this,ot,n,"f"),Et(this,Xe,new we(this),"f"),this.$0=this[Ct](),this[tn](),Et(this,Be,kt(this,Be,"f"),"f"),Et(this,bt,kt(this,bt,"f"),"f"),Et(this,Ot,kt(this,Ot,"f"),"f"),Et(this,rt,kt(this,rt,"f"),"f"),kt(this,rt,"f").showHiddenOpt=kt(this,Ye,"f"),Et(this,st,this[jt](),"f")}addHelpOpt(e,t){return ye("[string|boolean] [string]",[e,t],arguments.length),kt(this,tt,"f")&&(this[$t](kt(this,tt,"f")),Et(this,tt,null,"f")),!1===e&&void 0===t||(Et(this,tt,"string"==typeof e?e:"help","f"),this.boolean(kt(this,tt,"f")),this.describe(kt(this,tt,"f"),t||kt(this,bt,"f").deferY18nLookup("Show help"))),this}help(e,t){return this.addHelpOpt(e,t)}addShowHiddenOpt(e,t){if(ye("[string|boolean] [string]",[e,t],arguments.length),!1===e&&void 0===t)return this;const n="string"==typeof e?e:kt(this,Ye,"f");return this.boolean(n),this.describe(n,t||kt(this,bt,"f").deferY18nLookup("Show hidden options")),kt(this,rt,"f").showHiddenOpt=n,this}showHidden(e,t){return this.addShowHiddenOpt(e,t)}alias(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.alias.bind(this),"alias",e,t),this}array(e){return ye("<array|string>",[e],arguments.length),this[Rt]("array",e),this[on](e),this}boolean(e){return ye("<array|string>",[e],arguments.length),this[Rt]("boolean",e),this[on](e),this}check(e,t){return ye("<function> [boolean]",[e,t],arguments.length),this.middleware(((t,n)=>Ee((()=>e(t,n.getOptions())),(n=>(n?("string"==typeof n||n instanceof Error)&&kt(this,bt,"f").fail(n.toString(),n):kt(this,bt,"f").fail(kt(this,pt,"f").y18n.__("Argument check failed: %s",e.toString())),t)),(e=>(kt(this,bt,"f").fail(e.message?e.message:e.toString(),e),t)))),!1,t),this}choices(e,t){return ye("<object|string|array> [string|array]",[e,t],arguments.length),this[zt](this.choices.bind(this),"choices",e,t),this}coerce(e,t){if(ye("<object|string|array> [function]",[e,t],arguments.length),Array.isArray(e)){if(!t)throw new se("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 se("coerce callback must be provided");return kt(this,rt,"f").key[e]=!0,kt(this,Xe,"f").addCoerceMiddleware(((n,s)=>{let i;return Object.prototype.hasOwnProperty.call(n,e)?Ee((()=>(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 se(e.message)})):n}),e),this}conflicts(e,t){return ye("<string|object> [string|array]",[e,t],arguments.length),kt(this,Ot,"f").conflicts(e,t),this}config(e="config",t,n){return ye("[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||kt(this,bt,"f").deferY18nLookup("Path to JSON config file")),(Array.isArray(e)?e:[e]).forEach((e=>{kt(this,rt,"f").config[e]=n||!0})),this):(e=Te(e,kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(e),this)}completion(e,t,n){return ye("[string] [string|boolean|function] [function]",[e,t,n],arguments.length),"function"==typeof t&&(n=t,t=void 0),Et(this,He,e||kt(this,He,"f")||"completion","f"),t||!1===t||(t="generate completion script"),this.command(kt(this,He,"f"),t),n&&kt(this,Ue,"f").registerFunction(n),this}command(e,t,n,s,i,r){return ye("<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]",[e,t,n,s,i,r],arguments.length),kt(this,Be,"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){ye("<string> [object]",[e,t],arguments.length);const n=kt(this,ot,"f")||kt(this,pt,"f").require;return kt(this,Be,"f").addDirectory(e,n,kt(this,pt,"f").getCallerFile(),t),this}count(e){return ye("<array|string>",[e],arguments.length),this[Rt]("count",e),this[on](e),this}default(e,t,n){return ye("<object|string|array> [*] [string]",[e,t,n],arguments.length),n&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]=n),"function"==typeof t&&(ue(e,kt(this,pt,"f")),kt(this,rt,"f").defaultDescription[e]||(kt(this,rt,"f").defaultDescription[e]=kt(this,bt,"f").functionDescription(t)),t=t.call()),this[Wt](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 ye("[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),kt(this,rt,"f").demandedCommands._={min:e,max:t,minMsg:n,maxMsg:s},this}demand(e,t,n){return Array.isArray(t)?(t.forEach((e=>{de(n,!0,kt(this,pt,"f")),this.demandOption(e,n)})),t=1/0):"number"!=typeof t&&(n=t,t=1/0),"number"==typeof e?(de(n,!0,kt(this,pt,"f")),this.demandCommand(e,t,n,n)):Array.isArray(e)?e.forEach((e=>{de(n,!0,kt(this,pt,"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 ye("<object|string|array> [string]",[e,t],arguments.length),this[Wt](this.demandOption.bind(this),"demandedOptions",e,t),this}deprecateOption(e,t){return ye("<string> [string|boolean]",[e,t],arguments.length),kt(this,rt,"f").deprecatedOptions[e]=t,this}describe(e,t){return ye("<object|string|array> [string]",[e,t],arguments.length),this[Bt](e,!0),kt(this,bt,"f").describe(e,t),this}detectLocale(e){return ye("<boolean>",[e],arguments.length),Et(this,Je,e,"f"),this}env(e){return ye("[string|boolean]",[e],arguments.length),!1===e?delete kt(this,rt,"f").envPrefix:kt(this,rt,"f").envPrefix=e||"",this}epilogue(e){return ye("<string>",[e],arguments.length),kt(this,bt,"f").epilog(e),this}epilog(e){return this.epilogue(e)}example(e,t){return ye("<string|array> [string]",[e,t],arguments.length),Array.isArray(e)?e.forEach((e=>this.example(...e))):kt(this,bt,"f").example(e,t),this}exit(e,t){Et(this,et,!0,"f"),Et(this,qe,t,"f"),kt(this,Ke,"f")&&kt(this,pt,"f").process.exit(e)}exitProcess(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,Ke,e,"f"),this}fail(e){if(ye("<function|boolean>",[e],arguments.length),"boolean"==typeof e&&!1!==e)throw new se("Invalid first argument. Expected function or boolean 'false'");return kt(this,bt,"f").failFn(e),this}getAliases(){return this.parsed?this.parsed.aliases:{}}async getCompletion(e,t){return ye("<array> [function]",[e,t],arguments.length),t?kt(this,Ue,"f").getCompletion(e,t):new Promise(((t,n)=>{kt(this,Ue,"f").getCompletion(e,((e,s)=>{e?n(e):t(s)}))}))}getDemandedOptions(){return ye([],0),kt(this,rt,"f").demandedOptions}getDemandedCommands(){return ye([],0),kt(this,rt,"f").demandedCommands}getDeprecatedOptions(){return ye([],0),kt(this,rt,"f").deprecatedOptions}getDetectLocale(){return kt(this,Je,"f")}getExitProcess(){return kt(this,Ke,"f")}getGroups(){return Object.assign({},kt(this,Ze,"f"),kt(this,dt,"f"))}getHelp(){if(Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const e=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}const e=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(e))return e.then((()=>kt(this,bt,"f").help()))}return Promise.resolve(kt(this,bt,"f").help())}getOptions(){return kt(this,rt,"f")}getStrict(){return kt(this,gt,"f")}getStrictCommands(){return kt(this,mt,"f")}getStrictOptions(){return kt(this,yt,"f")}global(e,t){return ye("<string|array> [boolean]",[e,t],arguments.length),e=[].concat(e),!1!==t?kt(this,rt,"f").local=kt(this,rt,"f").local.filter((t=>-1===e.indexOf(t))):e.forEach((e=>{kt(this,rt,"f").local.includes(e)||kt(this,rt,"f").local.push(e)})),this}group(e,t){ye("<string|array> <string>",[e,t],arguments.length);const n=kt(this,dt,"f")[t]||kt(this,Ze,"f")[t];kt(this,dt,"f")[t]&&delete kt(this,dt,"f")[t];const s={};return kt(this,Ze,"f")[t]=(n||[]).concat(e).filter((e=>!s[e]&&(s[e]=!0))),this}hide(e){return ye("<string>",[e],arguments.length),kt(this,rt,"f").hiddenOptions.push(e),this}implies(e,t){return ye("<string|object> [number|string|array]",[e,t],arguments.length),kt(this,Ot,"f").implies(e,t),this}locale(e){return ye("[string]",[e],arguments.length),void 0===e?(this[Nt](),kt(this,pt,"f").y18n.getLocale()):(Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.setLocale(e),this)}middleware(e,t,n){return kt(this,Xe,"f").addMiddleware(e,!!t,n)}nargs(e,t){return ye("<string|object|array> [number]",[e,t],arguments.length),this[Wt](this.nargs.bind(this),"narg",e,t),this}normalize(e){return ye("<array|string>",[e],arguments.length),this[Rt]("normalize",e),this}number(e){return ye("<array|string>",[e],arguments.length),this[Rt]("number",e),this[on](e),this}option(e,t){if(ye("<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[on](e),!kt(this,wt,"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"),kt(this,rt,"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&&(kt(this,rt,"f").defaultDescription[e]=t.defaultDescription),t.skipValidation&&this.skipValidation(e);const i=t.describe||t.description||t.desc,r=kt(this,bt,"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){ye("[string|array] [function|boolean|object] [function]",[e,t,n],arguments.length),this[xt](),void 0===e&&(e=kt(this,ut,"f")),"object"==typeof t&&(Et(this,lt,t,"f"),t=n),"function"==typeof t&&(Et(this,ct,t,"f"),t=!1),t||Et(this,ut,e,"f"),kt(this,ct,"f")&&Et(this,Ke,!1,"f");const s=this[nn](e,!!t),i=this.parsed;return kt(this,Ue,"f").setParsed(this.parsed),pe(s)?s.then((e=>(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),e,kt(this,it,"f")),e))).catch((e=>{throw kt(this,ct,"f")&&kt(this,ct,"f")(e,this.parsed.argv,kt(this,it,"f")),e})).finally((()=>{this[Lt](),this.parsed=i})):(kt(this,ct,"f")&&kt(this,ct,"f").call(this,kt(this,qe,"f"),s,kt(this,it,"f")),this[Lt](),this.parsed=i,s)}parseAsync(e,t,n){const s=this.parse(e,t,n);return pe(s)?s:Promise.resolve(s)}parseSync(e,t,n){const s=this.parse(e,t,n);if(pe(s))throw new se(".parseSync() must not be used with asynchronous builders, handlers, or middleware");return s}parserConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,at,e,"f"),this}pkgConf(e,t){ye("<string> [string]",[e,t],arguments.length);let n=null;const s=this[It](t||kt(this,Le,"f"));return s[e]&&"object"==typeof s[e]&&(n=Te(s[e],t||kt(this,Le,"f"),this[St]()["deep-merge-config"]||!1,kt(this,pt,"f")),kt(this,rt,"f").configObjects=(kt(this,rt,"f").configObjects||[]).concat(n)),this}positional(e,t){ye("<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=kt(this,Ve,"f").fullCommands[kt(this,Ve,"f").fullCommands.length-1],i=s?kt(this,Be,"f").cmdToParseOptions(s):{array:[],alias:{},default:{},demand:{}};return fe(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,kt(this,bt,"f").getPositionalGroupName()),this.option(e,t)}recommendCommands(e=!0){return ye("[boolean]",[e],arguments.length),Et(this,ft,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 ye("<array|string|object> [number]",[e],arguments.length),"string"==typeof e&&kt(this,rt,"f").narg[e]||this[Wt](this.requiresArg.bind(this),"narg",e,NaN),this}showCompletionScript(e,t){return ye("[string] [string]",[e,t],arguments.length),e=e||this.$0,kt(this,st,"f").log(kt(this,Ue,"f").generateCompletionScript(e,t||kt(this,He,"f")||"completion")),this}showHelp(e){if(ye("[string|function]",[e],arguments.length),Et(this,et,!0,"f"),!kt(this,bt,"f").hasCachedHelpMessage()){if(!this.parsed){const t=this[nn](kt(this,ut,"f"),void 0,void 0,0,!0);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}const t=kt(this,Be,"f").runDefaultBuilderOn(this);if(pe(t))return t.then((()=>{kt(this,bt,"f").showHelp(e)})),this}return kt(this,bt,"f").showHelp(e),this}scriptName(e){return this.customScriptName=!0,this.$0=e,this}showHelpOnFail(e,t){return ye("[boolean|string] [string]",[e,t],arguments.length),kt(this,bt,"f").showHelpOnFail(e,t),this}showVersion(e){return ye("[string|function]",[e],arguments.length),kt(this,bt,"f").showVersion(e),this}skipValidation(e){return ye("<array|string>",[e],arguments.length),this[Rt]("skipValidation",e),this}strict(e){return ye("[boolean]",[e],arguments.length),Et(this,gt,!1!==e,"f"),this}strictCommands(e){return ye("[boolean]",[e],arguments.length),Et(this,mt,!1!==e,"f"),this}strictOptions(e){return ye("[boolean]",[e],arguments.length),Et(this,yt,!1!==e,"f"),this}string(e){return ye("<array|string>",[e],arguments.length),this[Rt]("string",e),this[on](e),this}terminalWidth(){return ye([],0),kt(this,pt,"f").process.stdColumns}updateLocale(e){return this.updateStrings(e)}updateStrings(e){return ye("<object>",[e],arguments.length),Et(this,Je,!1,"f"),kt(this,pt,"f").y18n.updateLocale(e),this}usage(e,t,n,s){if(ye("<string|null|undefined> [string|boolean] [function|object] [function]",[e,t,n,s],arguments.length),void 0!==t){if(de(e,null,kt(this,pt,"f")),(e||"").match(/^\$0( |$)/))return this.command(e,t,n,s);throw new se(".usage() description must start with $0 if being used as alias for .command()")}return kt(this,bt,"f").usage(e),this}usageConfiguration(e){return ye("<object>",[e],arguments.length),Et(this,vt,e,"f"),this}version(e,t,n){const s="version";if(ye("[boolean|string] [string] [string]",[e,t,n],arguments.length),kt(this,wt,"f")&&(this[$t](kt(this,wt,"f")),kt(this,bt,"f").version(void 0),Et(this,wt,null,"f")),0===arguments.length)n=this[Mt](),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 Et(this,wt,"string"==typeof e?e:s,"f"),t=t||kt(this,bt,"f").deferY18nLookup("Show version number"),kt(this,bt,"f").version(n||void 0),this.boolean(kt(this,wt,"f")),this.describe(kt(this,wt,"f"),t),this}wrap(e){return ye("<number|null|undefined>",[e],arguments.length),kt(this,bt,"f").wrap(e),this}[(Be=new WeakMap,Le=new WeakMap,Ve=new WeakMap,Ue=new WeakMap,He=new WeakMap,Ye=new WeakMap,qe=new WeakMap,Je=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,Ot=new WeakMap,At)](e){if(!e._||!e["--"])return e;e._.push.apply(e._,e["--"]);try{delete e["--"]}catch(e){}return e}[jt](){return{log:(...e)=>{this[Qt]()||console.log(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")},error:(...e)=>{this[Qt]()||console.error(...e),Et(this,et,!0,"f"),kt(this,it,"f").length&&Et(this,it,kt(this,it,"f")+"\n","f"),Et(this,it,kt(this,it,"f")+e.join(" "),"f")}}}[$t](e){fe(kt(this,rt,"f")).forEach((t=>{if("configObjects"===t)return;const n=kt(this,rt,"f")[t];Array.isArray(n)?n.includes(e)&&n.splice(n.indexOf(e),1):"object"==typeof n&&delete n[e]})),delete kt(this,bt,"f").getDescriptions()[e]}[_t](e,t,n){kt(this,Ge,"f")[n]||(kt(this,pt,"f").process.emitWarning(e,t),kt(this,Ge,"f")[n]=!0)}[xt](){kt(this,Qe,"f").push({options:kt(this,rt,"f"),configObjects:kt(this,rt,"f").configObjects.slice(0),exitProcess:kt(this,Ke,"f"),groups:kt(this,Ze,"f"),strict:kt(this,gt,"f"),strictCommands:kt(this,mt,"f"),strictOptions:kt(this,yt,"f"),completionCommand:kt(this,He,"f"),output:kt(this,it,"f"),exitError:kt(this,qe,"f"),hasOutput:kt(this,et,"f"),parsed:this.parsed,parseFn:kt(this,ct,"f"),parseContext:kt(this,lt,"f")}),kt(this,bt,"f").freeze(),kt(this,Ot,"f").freeze(),kt(this,Be,"f").freeze(),kt(this,Xe,"f").freeze()}[Ct](){let e,t="";return e=/\b(node|iojs|electron)(\.exe)?$/.test(kt(this,pt,"f").process.argv()[0])?kt(this,pt,"f").process.argv().slice(1,2):kt(this,pt,"f").process.argv().slice(0,1),t=e.map((e=>{const t=this[en](kt(this,Le,"f"),e);return e.match(/^(\/|([a-zA-Z]:)?\\)/)&&t.length<e.length?t:e})).join(" ").trim(),kt(this,pt,"f").getEnv("_")&&kt(this,pt,"f").getProcessArgvBin()===kt(this,pt,"f").getEnv("_")&&(t=kt(this,pt,"f").getEnv("_").replace(`${kt(this,pt,"f").path.dirname(kt(this,pt,"f").process.execPath())}/`,"")),t}[St](){return kt(this,at,"f")}[Pt](){return kt(this,vt,"f")}[Nt](){if(!kt(this,Je,"f"))return;const e=kt(this,pt,"f").getEnv("LC_ALL")||kt(this,pt,"f").getEnv("LC_MESSAGES")||kt(this,pt,"f").getEnv("LANG")||kt(this,pt,"f").getEnv("LANGUAGE")||"en_US";this.locale(e.replace(/[.:].*/,""))}[Mt](){return this[It]().version||"unknown"}[Dt](e){const t=e["--"]?e["--"]:e._;for(let e,n=0;void 0!==(e=t[n]);n++)kt(this,pt,"f").Parser.looksLikeNumber(e)&&Number.isSafeInteger(Math.floor(parseFloat(`${e}`)))&&(t[n]=Number(e));return e}[It](e){const t=e||"*";if(kt(this,ht,"f")[t])return kt(this,ht,"f")[t];let n={};try{let t=e||kt(this,pt,"f").mainFilename;!e&&kt(this,pt,"f").path.extname(t)&&(t=kt(this,pt,"f").path.dirname(t));const s=kt(this,pt,"f").findUp(t,((e,t)=>t.includes("package.json")?"package.json":void 0));de(s,void 0,kt(this,pt,"f")),n=JSON.parse(kt(this,pt,"f").readFileSync(s,"utf8"))}catch(e){}return kt(this,ht,"f")[t]=n||{},kt(this,ht,"f")[t]}[Rt](e,t){(t=[].concat(t)).forEach((t=>{t=this[Ft](t),kt(this,rt,"f")[e].push(t)}))}[Wt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=n}))}[zt](e,t,n,s){this[Tt](e,t,n,s,((e,t,n)=>{kt(this,rt,"f")[e][t]=(kt(this,rt,"f")[e][t]||[]).concat(n)}))}[Tt](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 fe(n))e(t,n[t]);else i(t,this[Ft](n),s)}[Ft](e){return"__proto__"===e?"___proto___":e}[Bt](e,t){return this[Wt](this[Bt].bind(this),"key",e,t),this}[Lt](){var e,t,n,s,i,r,o,a,c,l,h,d;const u=kt(this,Qe,"f").pop();let f;de(u,void 0,kt(this,pt,"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){Et(e,rt,t,"f")}}.value,configObjects:f,exitProcess:{set value(e){Et(t,Ke,e,"f")}}.value,groups:{set value(e){Et(n,Ze,e,"f")}}.value,output:{set value(e){Et(s,it,e,"f")}}.value,exitError:{set value(e){Et(i,qe,e,"f")}}.value,hasOutput:{set value(e){Et(r,et,e,"f")}}.value,parsed:this.parsed,strict:{set value(e){Et(o,gt,e,"f")}}.value,strictCommands:{set value(e){Et(a,mt,e,"f")}}.value,strictOptions:{set value(e){Et(c,yt,e,"f")}}.value,completionCommand:{set value(e){Et(l,He,e,"f")}}.value,parseFn:{set value(e){Et(h,ct,e,"f")}}.value,parseContext:{set value(e){Et(d,lt,e,"f")}}.value}=u),kt(this,rt,"f").configObjects=f,kt(this,bt,"f").unfreeze(),kt(this,Ot,"f").unfreeze(),kt(this,Be,"f").unfreeze(),kt(this,Xe,"f").unfreeze()}[Vt](e,t){return Ee(t,(t=>(e(t),t)))}getInternalMethods(){return{getCommandInstance:this[Ut].bind(this),getContext:this[Ht].bind(this),getHasOutput:this[Yt].bind(this),getLoggerInstance:this[qt].bind(this),getParseContext:this[Jt].bind(this),getParserConfiguration:this[St].bind(this),getUsageConfiguration:this[Pt].bind(this),getUsageInstance:this[Gt].bind(this),getValidationInstance:this[Kt].bind(this),hasParseCallback:this[Qt].bind(this),isGlobalContext:this[Xt].bind(this),postProcess:this[Zt].bind(this),reset:this[tn].bind(this),runValidation:this[sn].bind(this),runYargsParserAndExecuteCommands:this[nn].bind(this),setHasOutput:this[rn].bind(this)}}[Ut](){return kt(this,Be,"f")}[Ht](){return kt(this,Ve,"f")}[Yt](){return kt(this,et,"f")}[qt](){return kt(this,st,"f")}[Jt](){return kt(this,lt,"f")||{}}[Gt](){return kt(this,bt,"f")}[Kt](){return kt(this,Ot,"f")}[Qt](){return!!kt(this,ct,"f")}[Xt](){return kt(this,nt,"f")}[Zt](e,t,n,s){if(n)return e;if(pe(e))return e;t||(e=this[At](e));return(this[St]()["parse-positional-numbers"]||void 0===this[St]()["parse-positional-numbers"])&&(e=this[Dt](e)),s&&(e=Oe(e,this,kt(this,Xe,"f").getMiddleware(),!1)),e}[tn](e={}){Et(this,rt,kt(this,rt,"f")||{},"f");const t={};t.local=kt(this,rt,"f").local||[],t.configObjects=kt(this,rt,"f").configObjects||[];const n={};t.local.forEach((t=>{n[t]=!0,(e[t]||[]).forEach((e=>{n[e]=!0}))})),Object.assign(kt(this,dt,"f"),Object.keys(kt(this,Ze,"f")).reduce(((e,t)=>{const s=kt(this,Ze,"f")[t].filter((e=>!(e in n)));return s.length>0&&(e[t]=s),e}),{})),Et(this,Ze,{},"f");return["array","boolean","string","skipValidation","count","normalize","number","hiddenOptions"].forEach((e=>{t[e]=(kt(this,rt,"f")[e]||[]).filter((e=>!n[e]))})),["narg","key","alias","default","defaultDescription","config","choices","demandedOptions","demandedCommands","deprecatedOptions"].forEach((e=>{t[e]=_e(kt(this,rt,"f")[e],(e=>!n[e]))})),t.envPrefix=kt(this,rt,"f").envPrefix,Et(this,rt,t,"f"),Et(this,bt,kt(this,bt,"f")?kt(this,bt,"f").reset(n):Se(this,kt(this,pt,"f")),"f"),Et(this,Ot,kt(this,Ot,"f")?kt(this,Ot,"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=>{Re.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===Re.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){ye("<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))):(de(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){ye("<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=Ie(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();de(e,void 0,n),({implied:o,conflicting:c}=e)},r}(this,kt(this,bt,"f"),kt(this,pt,"f")),"f"),Et(this,Be,kt(this,Be,"f")?kt(this,Be,"f").reset():function(e,t,n,s){return new Ae(e,t,n,s)}(kt(this,bt,"f"),kt(this,Ot,"f"),kt(this,Xe,"f"),kt(this,pt,"f")),"f"),kt(this,Ue,"f")||Et(this,Ue,function(e,t,n,s){return new De(e,t,n,s)}(this,kt(this,bt,"f"),kt(this,Be,"f"),kt(this,pt,"f")),"f"),kt(this,Xe,"f").reset(),Et(this,He,null,"f"),Et(this,it,"","f"),Et(this,qe,null,"f"),Et(this,et,!1,"f"),this.parsed=!1,this}[en](e,t){return kt(this,pt,"f").path.relative(e,t)}[nn](e,t,n,s=0,i=!1){let r=!!n||i;e=e||kt(this,ut,"f"),kt(this,rt,"f").__=kt(this,pt,"f").y18n.__,kt(this,rt,"f").configuration=this[St]();const o=!!kt(this,rt,"f").configuration["populate--"],a=Object.assign({},kt(this,rt,"f").configuration,{"populate--":!0}),c=kt(this,pt,"f").Parser.detailed(e,Object.assign({},kt(this,rt,"f"),{configuration:{"parse-positional-numbers":!1,...a}})),l=Object.assign(c.argv,kt(this,lt,"f"));let h;const d=c.aliases;let u=!1,f=!1;Object.keys(l).forEach((e=>{e===kt(this,tt,"f")&&l[e]?u=!0:e===kt(this,wt,"f")&&l[e]&&(f=!0)})),l.$0=this.$0,this.parsed=c,0===s&&kt(this,bt,"f").clearCachedHelpMessage();try{if(this[Nt](),t)return this[Zt](l,o,!!n,!1);if(kt(this,tt,"f")){[kt(this,tt,"f")].concat(d[kt(this,tt,"f")]||[]).filter((e=>e.length>1)).includes(""+l._[l._.length-1])&&(l._.pop(),u=!0)}Et(this,nt,!1,"f");const a=kt(this,Be,"f").getCommands(),p=kt(this,Ue,"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!==kt(this,He,"f")){const e=kt(this,Be,"f").runCommand(t,this,c,r+1,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(!e&&t!==kt(this,He,"f")){e=t;break}}!kt(this,Be,"f").hasDefaultCommand()&&kt(this,ft,"f")&&e&&!g&&kt(this,Ot,"f").recommendCommands(e,a)}kt(this,He,"f")&&l._.includes(kt(this,He,"f"))&&!p&&(kt(this,Ke,"f")&&xe(!0),this.showCompletionScript(),this.exit(0))}if(kt(this,Be,"f").hasDefaultCommand()&&!g){const e=kt(this,Be,"f").runCommand(null,this,c,0,i,u||f||i);return this[Zt](e,o,!!n,!1)}if(p){kt(this,Ke,"f")&&xe(!0);const t=(e=[].concat(e)).slice(e.indexOf(`--${kt(this,Ue,"f").completionKey}`)+1);return kt(this,Ue,"f").getCompletion(t,((e,t)=>{if(e)throw new se(e.message);(t||[]).forEach((e=>{kt(this,st,"f").log(e)})),this.exit(0)})),this[Zt](l,!o,!!n,!1)}if(kt(this,et,"f")||(u?(kt(this,Ke,"f")&&xe(!0),r=!0,this.showHelp("log"),this.exit(0)):f&&(kt(this,Ke,"f")&&xe(!0),r=!0,kt(this,bt,"f").showVersion("log"),this.exit(0))),!r&&kt(this,rt,"f").skipValidation.length>0&&(r=Object.keys(l).some((e=>kt(this,rt,"f").skipValidation.indexOf(e)>=0&&!0===l[e]))),!r){if(c.error)throw new se(c.error.message);if(!p){const e=this[sn](d,{},c.error);n||(h=Oe(l,this,kt(this,Xe,"f").getMiddleware(),!0)),h=this[Vt](e,null!=h?h:l),pe(h)&&!n&&(h=h.then((()=>Oe(l,this,kt(this,Xe,"f").getMiddleware(),!1))))}}}catch(e){if(!(e instanceof se))throw e;kt(this,bt,"f").fail(e.message,e)}return this[Zt](null!=h?h:l,o,!!n,!0)}[sn](e,t,n,s){const i={...this.getDemandedOptions()};return r=>{if(n)throw new se(n.message);kt(this,Ot,"f").nonOptionCount(r),kt(this,Ot,"f").requiredArguments(r,i);let o=!1;kt(this,mt,"f")&&(o=kt(this,Ot,"f").unknownCommands(r)),kt(this,gt,"f")&&!o?kt(this,Ot,"f").unknownArguments(r,e,t,!!s):kt(this,yt,"f")&&kt(this,Ot,"f").unknownArguments(r,e,{},!1,!1),kt(this,Ot,"f").limitedChoices(r),kt(this,Ot,"f").implications(r),kt(this,Ot,"f").conflicting(r)}}[rn](){Et(this,et,!0,"f")}[on](e){if("string"==typeof e)kt(this,rt,"f").key[e]=!0;else for(const t of e)kt(this,rt,"f").key[t]=!0}}const cn=(ln=he,(e=[],t=ln.process.cwd(),n)=>{const s=new an(e,t,n,ln);return Object.defineProperty(s,"argv",{get:()=>s.parse(),enumerable:!0}),s.help(),s.version(),s});var ln;function hn(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 dn(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 un(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+""}let fn;const pn=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 gn{static{[fn]=function(e,t,n,s,i,r){var o,a,c,l,h,d,u,f=Symbol.metadata||Symbol.for("Symbol.metadata"),p=Object.defineProperty,g=Object.create,m=[g(null),g(null)],y=t.length;function b(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 v(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 w(e,t,n,s,i,r,c,l,h,d,u){function f(e){if(!u(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=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:dn((function(){return y(this)}),s,"get"),set:function(e){t[4](this,e)}}:$[x]=y,d||dn($[x],s,A?"":x)):d||($=Object.getOwnPropertyDescriptor(e,s)),!d&&!h){if((a=m[+l][s])&&7!=(a^i))throw Error("Decorating two elements with the same name ("+$[x].name+") is not supported yet");m[+l][s]=i<3?1:i}}for(var C=e,S=g.length-1;S>=0;S-=n?2:1){var P=v(g[S],"A decorator","be",!0),N=n?g[S-1]:void 0,M={},D={kind:["field","accessor","method","getter","setter","class"][i],name:s,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");v(t,"An initializer","be",!0),r.push(t)}.bind(null,M)};if(w)a=P.call(N,C,D),M.v=1,v(a,"class decorators","return")&&(C=a);else if(D.static=l,D.private=h,a=D.access={has:h?u.bind():function(e){return s in e}},k||(a.get=h?A?function(e){return f(e),$.value}:j("get",0,f):function(e){return e[s]}),A||E||(a.set=h?j("set",0,f):function(e,t){e[s]=t}),C=P.call(N,O?{get:$.get,set:$.set}:$[x],D),M.v=1,O){if("object"==typeof C&&C)(a=v(C.get,"accessor.get"))&&($.get=a),(a=v(C.set,"accessor.set"))&&($.set=a),(a=v(C.init,"accessor.init"))&&_.unshift(a);else if(void 0!==C)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(C,(d?"field":"method")+" decorators","return")&&(d?_.unshift(C):$[x]=C)}return i<2&&c.push(b(_,l,1),b(r,l,0)),d||w||(h?O?c.splice(-1,0,j("get",l),j("set",l)):c.push(A?$[x]:v.call.bind($[x])):p(e,s,$)),C}function O(e){return p(e,f,{configurable:!0,enumerable:!0,value:o})}return o=g(null==o?null:o),h=[],d=function(e){e&&h.push(b(e))},u=function(t,s){for(var r=0;r<n.length;r++){var o=n[r],a=o[1],d=7&a;if((8&a)==t&&!d==s){var u=o[2],f=!!o[3],p=16&a;w(t?e:e.prototype,o,p,f?"#"+u:un(u),d,d<2?[]:t?l=l||[]:c=c||[],h,!!t,f,s,t&&f?function(t){return hn(t)===e}:i)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(c),d(l),a=h,y||O(e),{e:a,get c(){var n=[];return y&&[O(e=w(e,[t],s,e.name,5,n)),b(n,1)]}}}(this,[],[[pn,3,"isBunAvailable"],[pn,3,"buildCommand"],[pn,3,"rootDirPath"],[pn,3,"dockerfile"],[pn,3,"hasDockerfile"],[pn,3,"hasSourceCode"],[pn,3,"name"],[pn,3,"dockerImageName"],[pn,3,"env"],[pn,3,"packageJson"],[pn,3,"hasPrisma"],[pn,3,"dockerPackageJson"],[pn,3,"binExists"]]).e}argv=void fn(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 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(e.join(this.dirPath,"package.json"),"utf8"))}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 mn(t,n=!0,s){if(s??=process.cwd(),l.existsSync(e.join(s,"package.json")))return new gn(s,t,n)}async function yn(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 gn(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 gn(i,t,n))}return{root:r,self:i}}(t,n,s);if(i)return{...i,all:i.root===i.self?await bn(t,i.root,n):[i.self]}}async function bn(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 gn(n,t,s));return i}const vn={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 mn(t,!0,n);if(!s)return console.error(O.red("No project found.")),!0;if(!l.existsSync(e.join(s.rootDirPath,".git")))return wn(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])=>!On.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=>(En.some((t=>e.includes(t)))||kn.some((t=>e.endsWith(t))))&&!An.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(!wn(s,t))return;t.dryRun||await l.promises.writeFile(r,o,"utf8");return!0}(t)}};function wn(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 On=new Set(["CI","PWDEBUG","TMPDIR"]);const En=["src/","public/"],kn=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],An=["test/","tests/","__tests__/","test-fixtures/"];function*jn(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const $n={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 yn(t);n||(console.error(O.red("No project found.")),process.exit(1));for(const s of jn("optimizeForDockerBuild",n.all)){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(_n(t,n),xn(n),Cn(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 _n(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 xn(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 Cn(e){delete e.private,delete e.publishConfig,delete e.prettier}const Sn=process.argv[0].endsWith("/bun"),Pn=Sn?"bun --bun":"node",Nn=Sn?"bun --bun":"yarn";const Mn=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`${Pn} -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`}},Dn=new Set;async function In(e){try{await A(e)}catch{}}const Rn=new j,Wn={exitIfFailed:!0};async function zn(e,t,n,s=Wn){const[i,r]=Fn(e,t);if(Bn(i,t),n.verbose&&Bn(r,t,"Start (raw)",!0),n.dryRun)return Ln(i,0,s),0;const o=r.match(/http:\/\/127.0.0.1:(\d+)/)?.[1];r.includes("wait-on")&&o&&!r.includes("docker run")&&await async function(e){await In(e);const t=async()=>{Dn.has(e)||(Dn.add(e),await In(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(o));const a=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"inherit",timeout:s?.timeout,killOnExit:!0,verbose:n.verbose});return Ln(i,a.status,s),a.status??1}function Tn(e,t,n,s=Wn){return Rn.run((async()=>{const[i,r]=Fn(e,t);if(Bn(i,t,"Start (parallel)",!0),n.dryRun)return Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0),void Ln(i,0,s);const o=await M(r,void 0,{cwd:t.dirPath,env:t.env,shell:!0,stdio:"pipe",timeout:s?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});Bn(i,t,"Started (log)"),n.verbose&&Bn(r,t,"Started (raw)",!0);const a=o.stdout.trim();a&&console.info(a),Ln(i,o.status,s)}))}function Fn(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 ":"YARN ");return Sn&&(n=n.replaceAll(/(YARN )?vitest run/g,"bun test").replaceAll(" --color --passWithNoTests --allowOnly","")),n=n.trim(),[n.replaceAll("YARN ",`${Nn} `),n.replaceAll("YARN ",!Sn&&t.binExists?"":`${Nn} `)]}function Bn(e,t,n="Start",s=!1){console.info("\n"+(s?O.gray:O.cyan)(O.bold(`${n}:`),e)+O.gray(` at ${t.dirPath}`))}function Ln(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))}const Vn={},Un={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Hn).command(qn).command(Jn).command(Gn).command(Kn).command(Qn).command(Xn).command(Zn).command(es).command(ts).demandCommand(),handler(){}},Hn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of jn("prisma deploy",t))await zn(Mn.deploy(n),n,e)}},Yn={...Vn,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},qn={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Yn,async handler(e){const t=await ns(e);for(const n of jn("prisma deploy-force",t))await zn(Mn.deployForce(n,e.backupPath),n,e)}},Jn={command:"litestream",describe:"Setup DB for Litestream",builder:Vn,async handler(e){const t=await ns(e);for(const n of jn("prisma litestream",t))await zn(Mn.litestream(n),n,e)}},Gn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Vn,async handler(e){const t=await ns(e);for(const n of jn("prisma migrate",t))await zn(Mn.migrate(n),n,e)}},Kn={command:"migrate-dev",describe:"Create a migration file",builder:Vn,async handler(e){const t=await ns(e);for(const n of jn("prisma migrate-dev",t))await zn(Mn.migrateDev(n),n,e)}},Qn={command:"reset",describe:"Reset DB",builder:Vn,async handler(e){const t=await ns(e);for(const n of jn("prisma reset",t))await zn(Mn.reset(n),n,e)}},Xn={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Yn,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ns(e);for(const n of jn("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await zn(Mn.restore(n,e.backupPath,t),n,e)}}},Zn={command:"seed",describe:"Populate DB with seed data",builder:{...Vn,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ns(e);for(const n of jn("prisma seed",t))await zn(Mn.seed(n,e.file),n,e)}},es={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Vn,"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 ns(e);for(const n of jn("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await zn(Mn.studio(n,t),n,e)}}},ts={command:"$0 [args..]",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await ns(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const s of jn(`prisma ${n}`,t))await zn(`PRISMA ${n}`,s,e)}};async function ns(e){const t=await yn(e);t||(console.error(O.red("No project found.")),process.exit(1));const n=t.all.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 ss={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=mn(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 zn(n.join(" "),t,e,{exitIfFailed:!1}),0===s)return;process.exit(s)}},is={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await yn(e,!1,t);n||(console.error(O.red("No project found.")),process.exit(1));for(const t of jn("setup",n.all)){const s=await _.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===x.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await Tn(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await zn("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await Tn("poetry config virtualenvs.in-project true",t,e),await Tn("poetry config virtualenvs.prefer-active-python true",t,e);const[,n]=y.execSync("asdf current python").toString().trim().split(/\s+/);await Tn(`poetry env use ${n}`,t,e),await Rn.promiseAll(),await zn("poetry run pip install --upgrade pip",t,e),await zn("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")):(i.express||i.fastify)&&(a.push("pm2"),c.push("concurrently","vitest","wait-on")),Sn&&(c=c.filter((e=>"vitest"!==e))),a.length>0&&await zn(`yarn add ${a.join(" ")}`,t,e),c.length>0&&await zn(`yarn add -D ${c.join(" ")}`,t,e),o["gen-code"]&&await zn("yarn gen-code",t,e)}}(e)}};const rs=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(Dn.has(e))return;Dn.add(e),Bn(e,t);const{status:n}=v(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ln(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 os{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return rs.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${rs.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://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}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://127.0.0.1:8080' 'BUN playwright install --with-deps'\n && BUN playwright ${n.replace("tests/e2e",t.target||"tests/e2e")}"`}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://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http://127.0.0.1:${n} && open-cli "http://\${HOST:-localhost}:${n}"`}}const as=new class extends os{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 "${Mn.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=`${Mn.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 cs=new class extends os{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)} && ${rs.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${Pn} 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://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://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 ls=new class extends os{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?[Mn.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?[Mn.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 hs=new class extends os{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)} && ${rs.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${Pn} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const ds=new class extends os{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 "${Mn.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=`${Mn.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)}"`}},us={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 yn(e);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){const t=n.packageJson.dependencies||{},s=n.packageJson.devDependencies||{};let i;if(t.blitz)i=as;else if(t.next)i=ls;else if(s["@remix-run/dev"])i=ds;else if((t.express||t.fastify)&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=cs;else{if(!t["build-ts"]&&!s["build-ts"])continue;i=hs}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const s=fs(t,"development");await zn(`${s}${i.start(n,e)}`,n,e);break}case"staging":{const s=fs(t,"staging");await zn(`${s}${i.startProduction(n,e,8080)}`,n,e);break}case"docker":{const s=fs(t,"staging");await zn(`${s}${i.startDocker(n,e)}`,n,e);break}case"docker-debug":{const s=fs(t,"staging");e.normalizedArgsText="'/bin/bash'",await zn(`${s}${i.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function fs(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 ps={command:"test",describe:"Test project",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 yn(t);n||(console.error(O.red("No project found.")),process.exit(1));n.all.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of n.all){const n=s.packageJson.dependencies||{},i=s.packageJson.devDependencies||{};let r;r=n.blitz?as:n.next?ls:i["@remix-run/dev"]?ds:!n.express&&!n.fastify||n["firebase-functions"]?hs:cs,console.info(`Running "test" for ${s.name} ...`);const o=[];if(!t.ci){switch((t.unit||!t.start&&void 0===t.e2e)&&o.push(zn(r.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&o.push(zn(r.testStart(s,t),s,t)),await Promise.all(o),t.e2e){case void 0:case"none":continue;case"":case"headless":await zn(r.testE2E(s,t,{}),s,t);continue;case"headless-dev":await zn(r.testE2EDev(s,t,{}),s,t);continue;case"docker":await gs(s,t,r);continue;case"docker-debug":await gs(s,t,r,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||i["@remix-run/dev"])switch(t.e2e){case"headed":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await zn(r.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await zn(r.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await zn(r.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await zn("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}{const n=N(e.join(s.dirPath,"tests","unit")),i=N(e.join(s.dirPath,"tests","e2e"));if(await Tn(rs.stopAll(),s,t),!1!==t.unit&&await n&&await Tn(r.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),!1!==t.start&&await Tn(r.testStart(s,t),s,t),await Rn.promiseAll(),"none"!==t.e2e&&await i){s.hasDockerfile&&await zn(`${r.buildDocker(s,"test")}`,s,t);const e=s.hasDockerfile?{startCommand:rs.stopAndStart(s,!0)}:{};process.exitCode=await zn(r.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await zn(rs.stop(s),s,t)}}}}(t)}};async function gs(e,t,n,s){await zn(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await zn(`${n.testE2E(e,t,{playwrightArgs:s,startCommand:rs.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await zn(rs.stop(e),e,t)}const ms={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await yn(e,!1);t||(console.error(O.red("No project found.")),process.exit(1));for(const n of t.all){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")),0===s.length)continue;console.info(`Running "typecheck" for ${n.name} ...`),t.all.length>1&&(n.env.CI="1"),n.env.FORCE_COLOR||="3";if(0!==await zn(s.join(" && "),n,e)){(JSON.parse(await _.readFile("package.json","utf8")).dependencies||{}).blitz&&console.info(O.yellow('Please try "yarn gen-code" if you face unknown type errors.'))}}}},ys={...ms,command:"tc"},bs={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:"d"}};var vs;await cn((vs=process.argv,vs.slice(ne()+1))).scriptName("wb").options(bs).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(vn).command($n).command(Un).command(ss).command(is).command(us).command(ps).command(ms).command(ys).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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9leGlzdHMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3NwYXduLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2xpYi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLXR5cGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi90b2tlbml6ZS1hcmctc3RyaW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3llcnJvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vYnVpbGQvbGliL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3kxOG4vaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NsaXVpL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdHlwaW5ncy9jb21tb24tdHlwZXMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2lzLXByb21pc2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3BhcnNlLWNvbW1hbmQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL2FyZ3NlcnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL21pZGRsZXdhcmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL21heWJlLWFzeW5jLXJlc3VsdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvY29tbWFuZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIveWFyZ3MtZmFjdG9yeS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvd2hpY2gtbW9kdWxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9vYmotZmlsdGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9zZXQtYmxvY2tpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3VzYWdlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi9jb21wbGV0aW9uLXRlbXBsYXRlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvbGV2ZW5zaHRlaW4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3ZhbGlkYXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFyZ3MvaW5kZXgubWpzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2hhc2guanMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy4gTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nLFxuICBjYWNoZUVuYWJsZWQgPSB0cnVlXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocyk7XG4gIH1cblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBvcmdFbnZWYXJzID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBlbnZWYXJzID0geyAuLi5yZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSwgY2FjaGVFbmFibGVkKSwgLi4uZW52VmFycyB9O1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAgIGlmIChvcmdFbnZWYXJzW2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgIG9yZ0VudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzOmAsIGVudlBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSwgY2FjaGVFbmFibGVkKSB8fCB7fSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgY2FjaGVFbmFibGVkID0gdHJ1ZVxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGVudlZhcnMgPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkLCBjYWNoZUVuYWJsZWQpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZywgY2FjaGVFbmFibGVkID0gdHJ1ZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZUVuYWJsZWQgJiYgY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyB7fTtcbiAgaWYgKGNhY2hlRW5hYmxlZCkge1xuICAgIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHNBc3luYyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGZzLmFjY2VzcyhmaWxlUGF0aCwgZnMuY29uc3RhbnRzLkZfT0ssIChlcnIpID0+IHtcbiAgICAgIHJlc29sdmUoIWVycik7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+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+ICFsb2NhbExvb2t1cFtrXSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgY29uc3QgZnJvemVucyA9IFtdO1xuICAgIHNlbGYuZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKCkge1xuICAgICAgICBmcm96ZW5zLnB1c2goe1xuICAgICAgICAgICAgaW1wbGllZCxcbiAgICAgICAgICAgIGNvbmZsaWN0aW5nLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHNlbGYudW5mcmVlemUgPSBmdW5jdGlvbiB1bmZyZWV6ZSgpIHtcbiAgICAgICAgY29uc3QgZnJvemVuID0gZnJvemVucy5wb3AoKTtcbiAgICAgICAgYXNzZXJ0Tm90U3RyaWN0RXF1YWwoZnJvemVuLCB1bmRlZmluZWQsIHNoaW0pO1xuICAgICAgICAoeyBpbXBsaWVkLCBjb25mbGljdGluZyB9ID0gZnJvemVuKTtcbiAgICB9O1xuICAgIHJldHVybiBzZWxmO1xufVxuIiwiaW1wb3J0IHsgWUVycm9yIH0gZnJvbSAnLi4veWVycm9yLmpzJztcbmxldCBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MgPSBbXTtcbmxldCBzaGltO1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RXh0ZW5kcyhjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzLCBfc2hpbSkge1xuICAgIHNoaW0gPSBfc2hpbTtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHt9O1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAnZXh0ZW5kcycpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmV4dGVuZHMgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25maWc7XG4gICAgICAgIGNvbnN0IGlzUGF0aCA9IC9cXC5qc29ufFxcLi4qcmMkLy50ZXN0KGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgbGV0IHBhdGhUb0RlZmF1bHQgPSBudWxsO1xuICAgICAgICBpZiAoIWlzUGF0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9EZWZhdWx0ID0gcmVxdWlyZS5yZXNvbHZlKGNvbmZpZy5leHRlbmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MucHVzaChwYXRoVG9EZWZhdWx0KTtcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGlzUGF0aFxuICAgICAgICAgICAgPyBKU09OLnBhcnNlKHNoaW0ucmVhZEZpbGVTeW5jKHBhdGhUb0RlZmF1bHQsICd1dGY4JykpXG4gICAgICAgICAgICA6IHJlcXVpcmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBkZWxldGUgY29uZmlnLmV4dGVuZHM7XG4gICAgICAgIGRlZmF1bHRDb25maWcgPSBhcHBseUV4dGVuZHMoZGVmYXVsdENvbmZpZywgc2hpbS5wYXRoLmRpcm5hbWUocGF0aFRvRGVmYXVsdCksIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG4gICAgfVxuICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xuICAgIHJldHVybiBtZXJnZUV4dGVuZHNcbiAgICAgICAgPyBtZXJnZURlZXAoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgICAgICA6IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG59XG5mdW5jdGlvbiBjaGVja0ZvckNpcmN1bGFyRXh0ZW5kcyhjZmdQYXRoKSB7XG4gICAgaWYgKHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5pbmRleE9mKGNmZ1BhdGgpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFlFcnJvcihgQ2lyY3VsYXIgZXh0ZW5kZWQgY29uZmlndXJhdGlvbnM6ICcke2NmZ1BhdGh9Jy5gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQYXRoVG9EZWZhdWx0Q29uZmlnKGN3ZCwgcGF0aFRvRXh0ZW5kKSB7XG4gICAgcmV0dXJuIHNoaW0ucGF0aC5yZXNvbHZlKGN3ZCwgcGF0aFRvRXh0ZW5kKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRGVlcChjb25maWcxLCBjb25maWcyKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0ge307XG4gICAgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIGNvbmZpZzEpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZzIpKSB7XG4gICAgICAgIGlmIChpc09iamVjdChjb25maWcyW2tleV0pICYmIGlzT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZURlZXAoY29uZmlnMVtrZXldLCBjb25maWcyW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBjb25maWcyW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gQm9vdHN0cmFwcyB5YXJncyBmb3IgRVNNOlxuaW1wb3J0IGVzbVBsYXRmb3JtU2hpbSBmcm9tICcuL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcbmltcG9ydCB7WWFyZ3NGYWN0b3J5fSBmcm9tICcuL2J1aWxkL2xpYi95YXJncy1mYWN0b3J5LmpzJztcblxuY29uc3QgWWFyZ3MgPSBZYXJnc0ZhY3RvcnkoZXNtUGxhdGZvcm1TaGltKTtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZUZhY3RvcnkgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuY29uc3QgbWVtb2l6ZSA9IG1lbW9pemVGYWN0b3J5KHsgbWF4Q2FjaGVkVGhpc1NpemU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBtYXhDYWNoZWRBcmdzU2l6ZTogMSB9KTtcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ3lhcm4gYnVpbGQnXG4gICAgICA6IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YDtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRFbnYgPyB7IC4uLnJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCksIC4uLnByb2Nlc3MuZW52IH0gOiBwcm9jZXNzLmVudjtcbiAgfVxuXG4gIEBtZW1vaXplXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSB8fCB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uWydwcmlzbWEnXSk7XG4gIH1cblxuICBAbWVtb2l6ZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpO1xuICB9XG5cbiAgQG1lbW9pemVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBhbGw6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQWxsUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgYWxsOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2FsbCc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIHJvb3RQcm9qZWN0OiBQcm9qZWN0LCBsb2FkRW52OiBib29sZWFuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgYWxsUHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gYWxsUHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIGFsbFByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gYWxsUHJvamVjdHM7XG59XG4iLCJpbXBvcnR7Y3lyYjY0SGFzaFdpdGhMZW5ndGggYXMgZX1mcm9tXCIuL2hhc2guanNcIjtjb25zdCB0PXMoKTtmdW5jdGlvbiBzKHtjYWNoZUR1cmF0aW9uOnQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGNhY2hlczpzLGNhbGNLZXk6bj0odD0+ZShKU09OLnN0cmluZ2lmeSh0KSkpLG1heENhY2hlZEFyZ3NTaXplOmk9MTAwLG1heENhY2hlZFRoaXNTaXplOmM9MTB9PXt9KXtyZXR1cm4gZnVuY3Rpb24oZSxvKXtpZihcImdldHRlclwiPT09bz8ua2luZCl7Y29uc3Qgbj1uZXcgTWFwO3JldHVybiBzPy5wdXNoKG4pLGZ1bmN0aW9uKCl7Y29uc3Qgcz1EYXRlLm5vdygpO2lmKG4uaGFzKHRoaXMpKXtjb25zdFtlLGldPW4uZ2V0KHRoaXMpO2lmKHMtaTw9dClyZXR1cm4gZX1jb25zdCBpPWUuY2FsbCh0aGlzKTtpZihuLnNpemU+PWMpe2NvbnN0IGU9bi5rZXlzKCkubmV4dCgpLnZhbHVlO24uZGVsZXRlKGUpfXJldHVybiBuLnNldCh0aGlzLFtpLHNdKSxpfX17Y29uc3Qgcj1uZXcgTWFwO3JldHVybiBzPy5wdXNoKHIpLGZ1bmN0aW9uKC4uLnMpe2NvbnN0IGE9bihzKTtsZXQgaD1yLmdldCh0aGlzKTtjb25zdCB1PURhdGUubm93KCk7aWYoaCl7aWYoaC5oYXMoYSkpe2NvbnN0W2Usc109aC5nZXQoYSk7aWYodS1zPD10KXJldHVybiBlfX1lbHNle2lmKGg9bmV3IE1hcCxyLnNpemU+PWMpe2NvbnN0IGU9ci5rZXlzKCkubmV4dCgpLnZhbHVlO3IuZGVsZXRlKGUpfXIuc2V0KHRoaXMsaCl9Y29uc3QgZj1vP2UuY2FsbCh0aGlzLC4uLnMpOmUoLi4ucyk7aWYoaC5zaXplPj1pKXtjb25zdCBlPWgua2V5cygpLm5leHQoKS52YWx1ZTtoLmRlbGV0ZShlKX1yZXR1cm4gaC5zZXQoYSxbZix1XSksZn19fX1leHBvcnR7dCBhcyBtZW1vaXplLHMgYXMgbWVtb2l6ZUZhY3Rvcnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZS5qcy5tYXBcbiIsImZ1bmN0aW9uIHQodCxuPTApe2NvbnN0W2kscl09ZnVuY3Rpb24odCxuPTApe2xldCBpPTM3MzU5Mjg1NTlebixyPTExMDM1NDc5OTFebjtmb3IobGV0IG4sYT0wO2E8dC5sZW5ndGg7YSsrKW49dC5jb2RlUG9pbnRBdChhKSxpPU1hdGguaW11bChpXm4sMjY1NDQzNTc2MSkscj1NYXRoLmltdWwocl5uLDE1OTczMzQ2NzcpO3JldHVybiBpPU1hdGguaW11bChpXmk+Pj4xNiwyMjQ2ODIyNTA3KSxpXj1NYXRoLmltdWwocl5yPj4+MTMsMzI2NjQ4OTkwOSkscj1NYXRoLmltdWwocl5yPj4+MTYsMjI0NjgyMjUwNykscl49TWF0aC5pbXVsKGleaT4+PjEzLDMyNjY0ODk5MDkpLFtyPj4+MCxpPj4+MF19KHQsbik7cmV0dXJuIHQubGVuZ3RoLnRvU3RyaW5nKDM2KStpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg3LFwiMFwiKStyLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg3LFwiMFwiKX1leHBvcnR7dCBhcyBjeXJiNjRIYXNoV2l0aExlbmd0aH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICd5YXJuIGJ1aWxkJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGF3YWl0IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydkaWZmJywgJy0tbmFtZS1vbmx5J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvc2NyaXB0c1xcL3Rlc3QtZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gIHsgYmVmb3JlUmV0cnksIGhhbmRsZUVycm9yLCByZXRyeUNvdW50ID0gMywgcmV0cnlMb2dnZXIsIHNsZWVwTWlsbGlzZWNvbmRzID0gMCB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IGVycm9yfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRBbGxQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuYWxsKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCd5YXJuJywge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAoIWFyZ3Yub3V0c2lkZSAmJiBuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy5hcmd2WzBdLmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUFJJU01BIG1pZ3JhdGUgZGVwbG95JztcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXZgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICAgIC8vIEknbSBub3Qgc3VyZSB3aHkgd2UgbmVlZCB0byByZW1vdmUgYWxsIHNxbGl0ZSBmaWxlcywgc28gSSBjb21tZW50ZWQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZS5cbiAgICAvLyByZXR1cm4gYHRydWUgJChybSAtUmYgZGIvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgdHJ1ZSAkKHJtIC1SZiBwcmlzbWEvKiovKi5zcWxpdGUqIDI+IC9kZXYvbnVsbCkgJiYgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZCgpfWA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L3Jlc3RvcmVkLnNxbGl0ZTM7IEdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUz1nY3Atc2Eta2V5Lmpzb24gbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7b3V0cHV0UGF0aH0gJHtiYWNrdXBQYXRofWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddKVxuICAgICAgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuICdCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50cyc7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uWydzZWVkJ10pIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKF86IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhkYlVybE9yUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD1maWxlOi8vJHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpb2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSBydW5uYWJsZVNjcmlwdC5tYXRjaCgvaHR0cDpcXC9cXC8xMjcuMC4wLjE6KFxcZCspLyk/LlsxXTtcbiAgaWYgKHJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCd3YWl0LW9uJykgJiYgcG9ydCAmJiAhcnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ2RvY2tlciBydW4nKSkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KE51bWJlcihwb3J0KSk7XG4gIH1cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkgY29uc29sZS5pbmZvKG91dCk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biAnIDogJ1lBUk4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoLyhZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLnJlcGxhY2VBbGwoJyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoQXJnc30gYCksXG4gICAgbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhBcmdzfSBgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBbGxQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpO1xuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3kocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0IHx8XG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydibGl0eiddXG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSBgJHthcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJ31gLnRyaW1FbmQoKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtzY3JpcHR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke3NjcmlwdH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuYWxsLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsncHJpc21hJ10gfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LlsncHJpc21hJ11cbiAgKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcmlzbWEgcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kQWxsUHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5hbGwpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMucHJlZmVyLWFjdGl2ZS1weXRob24gdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3Qgc2NyaXB0cyA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBuZXdEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXdEZXZEZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSkge1xuICAgICAgbmV3RGVwcy5wdXNoKCdwbTInKTtcbiAgICAgIG5ld0RldkRlcHMucHVzaCgnY29uY3VycmVudGx5JywgJ29wZW4tY2xpJywgJ3ZpdGVzdCcsICd3YWl0LW9uJyk7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBuZXdEZXBzLnB1c2goJ3BtMicpO1xuICAgICAgbmV3RGV2RGVwcy5wdXNoKCdjb25jdXJyZW50bHknLCAnb3Blbi1jbGknLCAndml0ZXN0JywgJ3dhaXQtb24nKTtcbiAgICB9IGVsc2UgaWYgKGRlcHNbJ2V4cHJlc3MnXSB8fCBkZXBzWydmYXN0aWZ5J10pIHtcbiAgICAgIG5ld0RlcHMucHVzaCgncG0yJyk7XG4gICAgICBuZXdEZXZEZXBzLnB1c2goJ2NvbmN1cnJlbnRseScsICd2aXRlc3QnLCAnd2FpdC1vbicpO1xuICAgIH1cbiAgICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIG5ld0RldkRlcHMgPSBuZXdEZXZEZXBzLmZpbHRlcigoZGVwKSA9PiBkZXAgIT09ICd2aXRlc3QnKTtcbiAgICB9XG4gICAgaWYgKG5ld0RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGB5YXJuIGFkZCAke25ld0RlcHMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAobmV3RGV2RGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYHlhcm4gYWRkIC1EICR7bmV3RGV2RGVwcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChzY3JpcHRzWydnZW4tY29kZSddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3lhcm4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZERldkltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICd5YXJuIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIGFtZDY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gLWl0IC1wIDgwODA6ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIC8vICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJ1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbiAgc3RhcnRDb21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIGV4dGVuZHMgVGVzdEUyRURldk9wdGlvbnMge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCkge31cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uID0gJ2RldmVsb3BtZW50Jyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGREZXZJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIGFic3RyYWN0IHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZztcblxuICBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIDgwODApfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdHMvZTJlJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBCYXNpY2FsbHksIGBwbGF5d3JpZ2h0YCAobm90IGB5YXJuIHBsYXl3cmlnaHRgKSBzaG91bGQgd29yayxcbiAgICAvLyBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgLy8gU28gd2UgdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluc3RlYWQgb2YgYHBsYXl3cmlnaHRgIGhlcmUuXG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCJybSAtUmYgJHtwcmlzbWFEaXJlY3Rvcnl9L21vdW50ICYmICR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJjb25jdXJyZW50bHkgLS1raWxsLW90aGVycy1vbi1mYWlsIC0tcmF3ICd3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MCcgJ0JVTiBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MucmVwbGFjZSgndGVzdHMvZTJlJywgYXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZScpfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdHMvZTJlJywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwiY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMtb24tZmFpbCAtLXJhdyAnd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwOi8vMTI3LjAuMC4xOjgwODAnICdCVU4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJ1xuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnKX1cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy91bml0J30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgXCJodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fVwiYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fVlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAnYmxpdHogZGV2IC1wIDgwODAnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgaWYgWyAtZSBcInByaXNtYVwiIF07IHRoZW4gcHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGU7IGZpICYmICgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlcImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgfHwgdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwOi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJibyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF0uam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgc3RhcnRDb21tYW5kID0gJ25leHQgZGV2IC0tdHVyYm8gLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib1wiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuIHNyYy9pbmRleC50cyAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ3JlbWl4IGRldicgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmFsbCkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKChkZXBzWydleHByZXNzJ10gfHwgZGVwc1snZmFzdGlmeSddKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXhpc3RzQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEFsbFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNpOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB0ZXN0cyBvbiBDSScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdXaGV0aGVyIHRvIHJ1biBlMmUgdGVzdHMuIFlvdSBtYXkgcGFzcyBtb2RlIGFzIGFyZ3VtZW50OiBub25lIHwgaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHN0YXJ0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biBzdGFydCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB1bml0OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHJ1biB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbiAgdGFyZ2V0OiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd0JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QnLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZEFsbFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5hbGwubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5hbGwpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKChkZXBzWydleHByZXNzJ10gfHwgZGVwc1snZmFzdGlmeSddKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICBpZiAoYXJndi5jaSkge1xuICAgICAgY29uc3QgdW5pdFRlc3RzRXhpc3RQcm9taXNlID0gZXhpc3RzQXN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ3VuaXQnKSk7XG4gICAgICBjb25zdCBlMmVUZXN0c0V4aXN0UHJvbWlzZSA9IGV4aXN0c0FzeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0cycsICdlMmUnKSk7XG5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCAhPT0gZmFsc2UgJiYgKGF3YWl0IHVuaXRUZXN0c0V4aXN0UHJvbWlzZSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3Yuc3RhcnQgIT09IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgLy8gQ2hlY2sgcGxheXdyaWdodCBpbnN0YWxsYXRpb24gYmVjYXVzZSAtLWNpIGluY2x1ZGVzIC0tZTJlIGltcGxpY2l0bHlcbiAgICAgIGlmIChhcmd2LmUyZSAhPT0gJ25vbmUnICYmIChhd2FpdCBlMmVUZXN0c0V4aXN0UHJvbWlzZSkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YudW5pdCB8fCAoIWFyZ3Yuc3RhcnQgJiYgYXJndi5lMmUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgLy8gRG9uJ3QgY2hlY2sgcGxheXdyaWdodCBpbnN0YWxsYXRpb24gYmVjYXVzZSAtLWUyZSBpcyBzZXQgZXhwbGljaXRseVxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSAnbm9uZSc6IHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICcnOlxuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBhcmd2LCBzY3JpcHRzLCBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwc1snYmxpdHonXSB8fCBkZXBzWyduZXh0J10gfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBlMmUgbW9kZTogJHthcmd2LmUyZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYCR7c2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICB9KX1gLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kQWxsUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmRBbGxQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5hbGwpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0eXBlY2hlY2tcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBpZiAocHJvamVjdHMuYWxsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIHByb2plY3QuZW52WydDSSddID0gJzEnO1xuICAgICAgfVxuICAgICAgcHJvamVjdC5lbnZbJ0ZPUkNFX0NPTE9SJ10gfHw9ICczJztcblxuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoJ3BhY2thZ2UuanNvbicsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ2QnLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHByb2Nlc3MuZXhpdCgpKTtcbn1cbiJdLCJuYW1lcyI6WyJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJhcmd2IiwiY3dkIiwiY2FjaGVFbmFibGVkIiwiZW52UGF0aHMiLCJlbnYiLCJtYXAiLCJlbnZQYXRoIiwicGF0aCIsInJlc29sdmUiLCJ0b1N0cmluZyIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJwcm9jZXNzIiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsInVuZGVmaW5lZCIsImxlbmd0aCIsInB1c2giLCJqb2luIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZzIiwiZXhpc3RzU3luYyIsImZsYXRNYXAiLCJyZWxhdGl2ZSIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsImVudlZhcnMiLCJvcmdFbnZWYXJzIiwicmVhZEVudkZpbGUiLCJjb3VudCIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJrZXlzIiwiZmlsdGVyIiwiRXJyb3IiLCJjYWNoZWRFbnZWYXJzIiwiTWFwIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwcm9jZXNzRW52Iiwic2V0IiwiZXhpc3RzQXN5bmMiLCJQcm9taXNlIiwiYWNjZXNzIiwiY29uc3RhbnRzIiwiRl9PSyIsImVyciIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwibWVyZ2VPdXRBbmRFcnJvciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsIndyaXRlIiwiZW5kIiwiYWxpZ24iLCJyaWdodCIsInN0ciIsIndpZHRoIiwidHJpbSIsInN0cldpZHRoIiwibWl4aW4iLCJzdHJpbmdXaWR0aCIsInJlcGVhdCIsImNlbnRlciIsIlVJIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2EiLCJ0aGlzIiwid3JhcCIsInJvd3MiLCJzcGFuIiwiZGl2IiwicmVzZXRPdXRwdXQiLCJzaG91bGRBcHBseUxheW91dERTTCIsImFwcGx5TGF5b3V0RFNMIiwiY29scyIsImFyZyIsImNvbEZyb21TdHJpbmciLCJ0ZXN0Iiwic3BsaXQiLCJyb3ciLCJsZWZ0Q29sdW1uV2lkdGgiLCJmb3JFYWNoIiwiY29sdW1ucyIsIk1hdGgiLCJtaW4iLCJmbG9vciIsInIiLCJpIiwidGV4dCIsInBhZGRpbmciLCJtZWFzdXJlUGFkZGluZyIsIm5vQW5zaSIsInN0cmlwQW5zaSIsIm1hdGNoIiwibGluZXMiLCJyb3dUb1N0cmluZyIsImxpbmUiLCJoaWRkZW4iLCJyYXN0ZXJpemUiLCJycm93IiwiY29sIiwiYyIsIndyYXBXaWR0aCIsIm5lZ2F0ZVBhZGRpbmciLCJ0cyIsImZuIiwiYWRkQm9yZGVyIiwicmVuZGVySW5saW5lIiwicmVwbGFjZSIsInNvdXJjZSIsInByZXZpb3VzTGluZSIsImxlYWRpbmdXaGl0ZXNwYWNlIiwidGFyZ2V0IiwidGFyZ2V0VGV4dFdpZHRoIiwidHJpbVJpZ2h0IiwidHJpbUxlZnQiLCJycm93cyIsIndpZHRocyIsImNvbHVtbldpZHRocyIsIndyYXBwZWQiLCJoYXJkIiwiYm9yZGVyIiwidW5zaGlmdCIsIkFycmF5IiwiZmlsbCIsInVuc2V0IiwicmVtYWluaW5nV2lkdGgiLCJ1bnNldFdpZHRoIiwidyIsIm1heCIsIm1pbldpZHRoIiwiX21pbldpZHRoIiwic3R5bGUiLCJhbnNpIiwiUmVnRXhwIiwic3RhcnQiLCJjaGFyQXQiLCJjYW1lbENhc2UiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaW5kZXhPZiIsImNhbWVsY2FzZSIsIm5leHRDaHJVcHBlciIsImxlYWRpbmdIeXBoZW5zIiwiY2hyIiwiZGVjYW1lbGl6ZSIsImpvaW5TdHJpbmciLCJsb3dlcmNhc2UiLCJub3RDYW1lbGNhc2UiLCJjaHJMb3dlciIsImNoclN0cmluZyIsImxvb2tzTGlrZU51bWJlciIsIngiLCJEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSIsImluY3JlbWVudCIsIm9yaWciLCJzYW5pdGl6ZUtleSIsIl9iIiwiX2MiLCJtaW5Ob2RlVmVyc2lvbiIsIllBUkdTX01JTl9OT0RFX1ZFUlNJT04iLCJOdW1iZXIiLCJub2RlVmVyc2lvbiIsInZlcnNpb25zIiwibm9kZSIsInZlcnNpb24iLCJzbGljZSIsInBhcnNlciIsIl9taXhpbiIsInBhcnNlIiwiYXJnc0lucHV0IiwiYXNzaWduIiwiYWxpYXMiLCJhcnJheSIsImJvb2xlYW4iLCJjb25maWdPYmplY3RzIiwiY29uZmlndXJhdGlvbiIsImNvZXJjZSIsImRlZmF1bHQiLCJlbnZQcmVmaXgiLCJuYXJnIiwibm9ybWFsaXplIiwic3RyaW5nIiwibnVtYmVyIiwiX18iLCJhcmdTdHJpbmciLCJpc0FycmF5IiwiZSIsInByZXZDIiwib3BlbmluZyIsImlpIiwidG9rZW5pemVBcmdTdHJpbmciLCJpbnB1dElzU3RyaW5nIiwiYWxpYXNlcyIsImFsaWFzQXJyYXlzIiwiY29tYmluZWQiLCJjcmVhdGUiLCJjaGFuZ2UiLCJjb25jYXQiLCJ2Iiwic3BsaWNlIiwiYWxpYXNBcnJheSIsImxhc3RBbGlhcyIsInNlbGYiLCJwb3AiLCJjb21iaW5lQWxpYXNlcyIsImRlZmF1bHRzIiwibm90RmxhZ3NPcHRpb24iLCJub3RGbGFnc0FyZ3YiLCJuZXdBbGlhc2VzIiwiZGVmYXVsdGVkIiwiZm9ybWF0IiwiZmxhZ3MiLCJhcnJheXMiLCJib29scyIsInN0cmluZ3MiLCJudW1iZXJzIiwiY291bnRzIiwiY29uZmlncyIsIm5hcmdzIiwiY29lcmNpb25zIiwibmVnYXRpdmUiLCJuZWdhdGVkQm9vbGVhbiIsIkJvb2xlYW4iLCJvcHQiLCJhc3NpZ25tZW50Iiwib2JqIiwieSIsImV4dGVuZEFsaWFzZXMiLCJmaW5kIiwiY2hlY2tBbGxBbGlhc2VzIiwibm90RmxhZ3MiLCJfIiwiYXJndlJldHVybiIsInRydW5jYXRlZEFyZyIsImJyb2tlbiIsImxldHRlcnMiLCJtIiwibmV4dCIsImlzVW5rbm93bk9wdGlvbkFzQXJnIiwicHVzaFBvc2l0aW9uYWwiLCJlYXRBcnJheSIsImVhdE5hcmdzIiwic2V0QXJnIiwiZGVmYXVsdFZhbHVlIiwiaiIsIm1heWJlQ29lcmNlZE51bWJlciIsIm1heWJlQ29lcmNlTnVtYmVyIiwiYXJnQWZ0ZXJFcXVhbFNpZ24iLCJ0b0VhdCIsImlzTmFOIiwiaXNVbmRlZmluZWQiLCJhdmFpbGFibGUiLCJjb25zdW1lZCIsImFyZ3NUb1NldCIsIm5hcmdzQ291bnQiLCJkZWZWYWwiLCJwcm9jZXNzVmFsdWUiLCJ2YWwiLCJzaG91bGRTdHJpcFF1b3RlcyIsInByb3AiLCJhZGROZXdBbGlhcyIsInNwbGl0S2V5Iiwic2V0S2V5Iiwia2V5UHJvcGVydGllcyIsImEiLCJzaGlmdCIsImluY2x1ZGVzIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwic3Vic3RyaW5nIiwic3RyaXBRdW90ZXMiLCJpc1NhZmVJbnRlZ2VyIiwicGFyc2VGbG9hdCIsInNldENvbmZpZ09iamVjdCIsInByZXYiLCJmdWxsS2V5IiwiaGFzS2V5IiwiYXBwbHlFbnZWYXJzIiwiY29uZmlnT25seSIsInByZWZpeCIsImVudlZhciIsImxhc3RJbmRleE9mIiwiYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMiLCJjYW5Mb2ciLCJvIiwiaXNUeXBlQXJyYXkiLCJpc1ZhbHVlQXJyYXkiLCJkdXBsaWNhdGUiLCJmbGFnIiwidG9DaGVjayIsInNldEFsaWFzIiwiaGFzQW55RmxhZyIsImZsYWdzS2V5cyIsImsiLCJzb21lIiwiaGFzQWxsRmxhZ3MiLCJoYXNBbGxTaG9ydEZsYWdzIiwicGF0dGVybnMiLCJwYXR0ZXJuIiwiaGFzRmxhZ3NNYXRjaGluZyIsImlzVW5rbm93bk9wdGlvbiIsInR5cGUiLCJCT09MRUFOIiwiU1RSSU5HIiwiTlVNQkVSIiwiQVJSQVkiLCJndWVzc1R5cGUiLCJudW0iLCJjb25maWdMb29rdXAiLCJjb25maWdLZXkiLCJjb25maWdQYXRoIiwicmVzb2x2ZWRDb25maWdQYXRoIiwicmVzb2x2ZUNvbmZpZyIsInJlcXVpcmUiLCJleCIsIm5hbWUiLCJzZXRDb25maWciLCJjb25maWdPYmplY3QiLCJhcHBsaWVkIiwiU2V0IiwiaGFzIiwiYWxpIiwiYWRkIiwiYXBwbHlDb2VyY2lvbnMiLCJzZXRQbGFjZWhvbGRlcktleXMiLCJKU09OIiwicmVhZEZpbGVTeW5jIiwieWFyZ3NQYXJzZXIiLCJnZXRQcm9jZXNzQXJndkJpbkluZGV4IiwiZWxlY3Ryb24iLCJkZWZhdWx0QXBwIiwiZGV0YWlsZWQiLCJZRXJyb3IiLCJtc2ciLCJzdXBlciIsImNhcHR1cmVTdGFja1RyYWNlIiwic2hpbSQzIiwid3JpdGVGaWxlIiwiZXhpc3RzIiwiZmlsZSIsInN0YXRTeW5jIiwiaXNGaWxlIiwic2hpbSIsIlkxOE4iLCJkaXJlY3RvcnkiLCJ1cGRhdGVGaWxlcyIsImxvY2FsZSIsImZhbGxiYWNrVG9MYW5ndWFnZSIsImNhY2hlIiwid3JpdGVRdWV1ZSIsImFyZ3VtZW50cyIsIl90YWdnZWRMaXRlcmFsIiwiY2IiLCJfcmVhZExvY2FsZUZpbGUiLCJfZW5xdWV1ZVdyaXRlIiwiYXBwbHkiLCJfX24iLCJwcm90b3R5cGUiLCJjYWxsIiwic2luZ3VsYXIiLCJwbHVyYWwiLCJxdWFudGl0eSIsIm9uZSIsIm90aGVyIiwidmFsdWVzIiwic2V0TG9jYWxlIiwiZ2V0TG9jYWxlIiwidXBkYXRlTG9jYWxlIiwiaGFzT3duUHJvcGVydHkiLCJwYXJ0cyIsInBhcnQiLCJ3b3JrIiwiX3Byb2Nlc3NXcml0ZVF1ZXVlIiwiX3RoaXMiLCJsYW5ndWFnZUZpbGUiLCJfcmVzb2x2ZUxvY2FsZUZpbGUiLCJzZXJpYWxpemVkTG9jYWxlIiwic3RyaW5naWZ5IiwibG9jYWxlTG9va3VwIiwiU3ludGF4RXJyb3IiLCJtZXNzYWdlIiwiX2ZpbGVFeGlzdHNTeW5jIiwiUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IiLCJfX2Rpcm5hbWUiLCJmaWxlVVJMVG9QYXRoIiwidXJsIiwic2hpbSQxIiwiYXNzZXJ0Iiwibm90U3RyaWN0RXF1YWwiLCJzdHJpY3RFcXVhbCIsImNsaXVpIiwiZmluZFVwIiwiY2FsbGJhY2siLCJ0bXAiLCJkaXIiLCJpc0RpcmVjdG9yeSIsImRpcm5hbWUiLCJyZWFkZGlyU3luYyIsImdldEVudiIsImluc3BlY3QiLCJnZXRDYWxsZXJGaWxlIiwiZ2V0UHJvY2Vzc0FyZ3ZCaW4iLCJtYWluRmlsZW5hbWUiLCJQYXJzZXIiLCJiYXNlbmFtZSIsImV4dG5hbWUiLCJlbWl0V2FybmluZyIsIndhcm5pbmciLCJleGVjUGF0aCIsImV4aXQiLCJuZXh0VGljayIsInN0ZENvbHVtbnMiLCJyZXF1aXJlRGlyZWN0b3J5IiwieTE4biIsIl9zaGltIiwiYmluZCIsIl95MThuIiwiYXNzZXJ0Tm90U3RyaWN0RXF1YWwiLCJhY3R1YWwiLCJleHBlY3RlZCIsImFzc2VydFNpbmdsZUtleSIsIm9iamVjdEtleXMiLCJvYmplY3QiLCJpc1Byb21pc2UiLCJtYXliZVByb21pc2UiLCJ0aGVuIiwicGFyc2VDb21tYW5kIiwiY21kIiwic3BsaXRDb21tYW5kIiwiYnJlZ2V4IiwiZmlyc3RDb21tYW5kIiwicGFyc2VkQ29tbWFuZCIsImRlbWFuZGVkIiwib3B0aW9uYWwiLCJ2YXJpYWRpYyIsInBvc2l0aW9uTmFtZSIsImFyZ3NlcnQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJwb3NpdGlvbiIsImNhbGxlckFyZ3VtZW50cyIsIl9sZW5ndGgiLCJ0b3RhbENvbW1hbmRzIiwib2JzZXJ2ZWRUeXBlIiwiYXJndW1lbnRUeXBlRXJyb3IiLCJ3YXJuIiwic3RhY2siLCJhbGxvd2VkVHlwZXMiLCJHbG9iYWxNaWRkbGV3YXJlIiwieWFyZ3MiLCJnbG9iYWxNaWRkbGV3YXJlIiwiZnJvemVucyIsImFkZE1pZGRsZXdhcmUiLCJhcHBseUJlZm9yZVZhbGlkYXRpb24iLCJnbG9iYWwiLCJtdXRhdGVzIiwiYWRkQ29lcmNlTWlkZGxld2FyZSIsIm9wdGlvbiIsImdldEFsaWFzZXMiLCJnZXRNaWRkbGV3YXJlIiwiZnJlZXplIiwidW5mcmVlemUiLCJmcm96ZW4iLCJyZXNldCIsImFwcGx5TWlkZGxld2FyZSIsIm1pZGRsZXdhcmVzIiwiYmVmb3JlVmFsaWRhdGlvbiIsInJlZHVjZSIsImFjYyIsIm1pZGRsZXdhcmUiLCJpbml0aWFsT2JqIiwiYWxsIiwibWlkZGxld2FyZU9iaiIsInJlc3VsdCIsIm1heWJlQXN5bmNSZXN1bHQiLCJnZXRSZXN1bHQiLCJyZXN1bHRIYW5kbGVyIiwiZXJyb3JIYW5kbGVyIiwiREVGQVVMVF9NQVJLRVIiLCJDb21tYW5kSW5zdGFuY2UiLCJ1c2FnZSIsInZhbGlkYXRpb24iLCJyZXF1aXJlQ2FjaGUiLCJoYW5kbGVycyIsImFsaWFzTWFwIiwiYWRkRGlyZWN0b3J5IiwicmVxIiwiY2FsbGVyRmlsZSIsInJlY3Vyc2UiLCJleHRlbnNpb25zIiwicGFyZW50VmlzaXQiLCJ2aXNpdCIsImpvaW5lZCIsImZpbGVuYW1lIiwidmlzaXRlZCIsImFkZEhhbmRsZXIiLCJkZXNjcmlwdGlvbiIsImJ1aWxkZXIiLCJoYW5kbGVyIiwiY29tbWFuZE1pZGRsZXdhcmUiLCJkZXByZWNhdGVkIiwiY29tbWFuZE1pZGRsZXdhcmVGYWN0b3J5IiwiZXZlcnkiLCJpc0NvbW1hbmRBbmRBbGlhc2VzIiwiaXNDb21tYW5kSGFuZGxlckRlZmluaXRpb24iLCJtb2R1bGVOYW1lIiwiZXh0cmFjdERlc2MiLCJpc0NvbW1hbmRCdWlsZGVyRGVmaW5pdGlvbiIsImlzRGVmYXVsdCIsInBhcnNlZEFsaWFzZXMiLCJvcmlnaW5hbCIsImRlZmF1bHRDb21tYW5kIiwiZ2V0Q29tbWFuZEhhbmRsZXJzIiwiZ2V0Q29tbWFuZHMiLCJoYXNEZWZhdWx0Q29tbWFuZCIsInJ1bkNvbW1hbmQiLCJjb21tYW5kSW5kZXgiLCJoZWxwT25seSIsImhlbHBPclZlcnNpb25TZXQiLCJjb21tYW5kSGFuZGxlciIsImN1cnJlbnRDb250ZXh0IiwiZ2V0SW50ZXJuYWxNZXRob2RzIiwiZ2V0Q29udGV4dCIsInBhcmVudENvbW1hbmRzIiwiY29tbWFuZHMiLCJpc0RlZmF1bHRDb21tYW5kIiwiZnVsbENvbW1hbmRzIiwiYnVpbGRlclJlc3VsdCIsImFwcGx5QnVpbGRlclVwZGF0ZVVzYWdlQW5kUGFyc2UiLCJhcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQiLCJpbm5lckFyZ3YiLCJpbm5lcllhcmdzIiwiaXNDb21tYW5kQnVpbGRlckNhbGxiYWNrIiwiZ2V0VXNhZ2VJbnN0YW5jZSIsImJ1aWxkZXJPdXRwdXQiLCJvdXRwdXQiLCJwYXJzZUFuZFVwZGF0ZVVzYWdlIiwiaXNDb21tYW5kQnVpbGRlck9wdGlvbkRlZmluaXRpb25zIiwic2hvdWxkVXBkYXRlVXNhZ2UiLCJ1c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyIiwicnVuWWFyZ3NQYXJzZXJBbmRFeGVjdXRlQ29tbWFuZHMiLCJnZXRVc2FnZURpc2FibGVkIiwiZ2V0VXNhZ2UiLCJwYyIsImhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQiLCJwb3NpdGlvbmFsTWFwIiwiZ2V0SGFzT3V0cHV0IiwicnVuVmFsaWRhdGlvbiIsInNldEhhc091dHB1dCIsInBvcHVsYXRlRG91YmxlRGFzaCIsImdldE9wdGlvbnMiLCJwb3N0UHJvY2VzcyIsImhhbmRsZXJSZXN1bHQiLCJjYWNoZUhlbHBNZXNzYWdlIiwiaGFzUGFyc2VDYWxsYmFjayIsImNhdGNoIiwiZmFpbCIsIl9lcnIiLCJwb3B1bGF0ZVBvc2l0aW9uYWxzIiwibWF5YmVQcm9taXNlQXJndiIsInJlc29sdmVkSW5uZXJBcmd2IiwiY29udGV4dCIsInBvc2l0aW9uYWxDb3VudCIsImRlbWFuZCIsInBvcHVsYXRlUG9zaXRpb25hbCIsIm1heWJlIiwicG9zdFByb2Nlc3NQb3NpdGlvbmFscyIsImNtZFRvUGFyc2VPcHRpb25zIiwicG9zaXRpb25hbCIsIlN0cmluZyIsImNtZFN0cmluZyIsInBhcnNlT3B0aW9ucyIsImQiLCJ1bnBhcnNlZCIsInBvc2l0aW9uYWxLZXlzIiwiaXNJbkNvbmZpZ3MiLCJpc0RlZmF1bHRlZCIsInJ1bkRlZmF1bHRCdWlsZGVyT24iLCJjb21tYW5kU3RyaW5nIiwibW9kIiwiZXhwb3J0ZWQiLCJmaWxlcyIsImV4cG9ydHMiLCJ3aGljaE1vZHVsZSIsImNvbW1hbmRGcm9tRmlsZW5hbWUiLCJkZXNjcmliZSIsImRlc2MiLCJvYmpGaWx0ZXIiLCJzZXRCbG9ja2luZyIsImJsb2NraW5nIiwiX3N0cmVhbSIsInN0cmVhbSIsIl9oYW5kbGUiLCJpc1RUWSIsImlzQm9vbGVhbiIsImZhaWxzIiwiZmFpbEZuIiwiZiIsImZhaWxNZXNzYWdlIiwiZ2xvYmFsRmFpbE1lc3NhZ2UiLCJzaG93SGVscE9uRmFpbCIsImVuYWJsZWQiLCJpc0dsb2JhbENvbnRleHQiLCJmYWlsdXJlT3V0cHV0IiwibG9nZ2VyIiwiZ2V0TG9nZ2VySW5zdGFuY2UiLCJnZXRFeGl0UHJvY2VzcyIsInNob3dIZWxwIiwiZ2xvYmFsT3JDb21tYW5kRmFpbE1lc3NhZ2UiLCJ1c2FnZXMiLCJ1c2FnZURpc2FibGVkIiwiZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSIsImV4YW1wbGVzIiwiZXhhbXBsZSIsImNtZEFycmF5IiwiZGVzY3JpcHRpb25zIiwia2V5T3JLZXlzIiwiZ2V0RGVzY3JpcHRpb25zIiwiZXBpbG9ncyIsImVwaWxvZyIsIndyYXBTZXQiLCJnZXRXcmFwIiwibWF4V2lkdGgiLCJ3aW5kb3dXaWR0aCIsImRlZmVyWTE4bkxvb2t1cFByZWZpeCIsInRhYmxlIiwidGhlV3JhcCIsIm1vZGlmaWVyIiwiZ2V0VGV4dCIsImdldEluZGVudGF0aW9uIiwicGFyc2VJbnQiLCJjYWNoZWRIZWxwTWVzc2FnZSIsImZpbHRlckhpZGRlbk9wdGlvbnMiLCJoaWRkZW5PcHRpb25zIiwic2hvd0hpZGRlbk9wdCIsImRlZmF1bHRTdHJpbmciLCJkZWZhdWx0RGVzY3JpcHRpb24iLCJkZWZlclkxOG5Mb29rdXAiLCJoZWxwIiwiZGVtYW5kZWRPcHRpb25zIiwiZ2V0RGVtYW5kZWRPcHRpb25zIiwiZGVtYW5kT3B0aW9uIiwibm9ybWFsaXplQWxpYXNlcyIsImJhc2UkMCIsImN1c3RvbVNjcmlwdE5hbWUiLCIkMCIsImRlbWFuZGVkQ29tbWFuZHMiLCJnZXREZW1hbmRlZENvbW1hbmRzIiwiZGVwcmVjYXRlZE9wdGlvbnMiLCJnZXREZXByZWNhdGVkT3B0aW9ucyIsImdyb3VwcyIsImdldEdyb3VwcyIsInVpIiwidSIsImdldFBhcnNlckNvbmZpZ3VyYXRpb24iLCJzb3J0IiwiYiIsImxvY2FsZUNvbXBhcmUiLCJoaW50cyIsImFsaWFzS2V5cyIsImRlZmF1bHRHcm91cCIsImdyb3VwZWRLZXlzIiwiZ3JvdXAiLCJhZGRVbmdyb3VwZWRLZXlzIiwiaXNMb25nU3dpdGNoIiwic3ciLCJkaXNwbGF5ZWRHcm91cHMiLCJncm91cE5hbWUiLCJub3JtYWxpemVkS2V5cyIsImFsaWFzS2V5Iiwic3dpdGNoZXMiLCJzdzEiLCJzdzIiLCJpbmRlbnQiLCJpc0luZGVudGVkVGV4dCIsImluZGVudGF0aW9uIiwia3N3aXRjaCIsImV4dHJhIiwiY2hvaWNlcyIsInN0cmluZ2lmaWVkVmFsdWVzIiwic2hvdWxkSGlkZU9wdGlvbkV4dHJhcyIsImdldFVzYWdlQ29uZmlndXJhdGlvbiIsImNsZWFyQ2FjaGVkSGVscE1lc3NhZ2UiLCJoYXNDYWNoZWRIZWxwTWVzc2FnZSIsImxldmVsIiwiZnVuY3Rpb25EZXNjcmlwdGlvbiIsInNlcGFyYXRvciIsInNlcCIsInZlciIsInNob3dWZXJzaW9uIiwibG9jYWxMb29rdXAiLCJDb21wbGV0aW9uIiwiY29tcGxldGlvbktleSIsImN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbiIsImluZGV4QWZ0ZXJMYXN0UmVzZXQiLCJ6c2hTaGVsbCIsImRlZmF1bHRDb21wbGV0aW9uIiwiY3VycmVudCIsImRvbmUiLCJjb21wbGV0aW9ucyIsImNvbW1hbmRDb21wbGV0aW9ucyIsIm9wdGlvbkNvbXBsZXRpb25zIiwiY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMiLCJjaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMiLCJwcmV2aW91c0FyZ0hhc0Nob2ljZXMiLCJ1c2FnZUNvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm5lZ2FibGUiLCJhcmdzQ29udGFpbktleSIsImNvbXBsZXRlT3B0aW9uS2V5IiwiZ2V0UHJldmlvdXNBcmdDaG9pY2VzIiwib2Zmc2V0IiwicG9zaXRpb25hbEtleSIsImNob2ljZSIsInN0YXJ0c1dpdGgiLCJwcmV2aW91c0FyZyIsInByZXZpb3VzQXJnS2V5IiwicG9zc2libGVBbGlhc2VzIiwicG9zc2libGVBbGlhcyIsImFyZ3NDb250YWlucyIsInMiLCJfZCIsImtleVdpdGhEZXNjIiwiZGVzY3MiLCJkZXNjRnJvbUFsaWFzIiwiZGFzaGVzIiwic3RhcnRzQnlUd29EYXNoZXMiLCJpc1Nob3J0T3B0aW9uIiwiY3VzdG9tQ29tcGxldGlvbiIsImxpc3QiLCJjb21wbGV0aW9uRnVuY3Rpb24iLCJpc0ZhbGxiYWNrQ29tcGxldGlvbkZ1bmN0aW9uIiwib25Db21wbGV0ZWQiLCJnZXRDb21wbGV0aW9uIiwiZ2VuZXJhdGVDb21wbGV0aW9uU2NyaXB0Iiwic2NyaXB0IiwicmVnaXN0ZXJGdW5jdGlvbiIsInNldFBhcnNlZCIsImxldmVuc2h0ZWluIiwibWF0cml4Iiwic3BlY2lhbEtleXMiLCJwcmV2aW91c2x5VmlzaXRlZENvbmZpZ3MiLCJhcHBseUV4dGVuZHMiLCJtZXJnZUV4dGVuZHMiLCJkZWZhdWx0Q29uZmlnIiwiZXh0ZW5kcyIsImlzUGF0aCIsInBhdGhUb0RlZmF1bHQiLCJwYXRoVG9FeHRlbmQiLCJnZXRQYXRoVG9EZWZhdWx0Q29uZmlnIiwiY2ZnUGF0aCIsImNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzIiwibWVyZ2VEZWVwIiwiY29uZmlnMSIsImNvbmZpZzIiLCJpc09iamVjdCIsIl9ZYXJnc0luc3RhbmNlX2NvbW1hbmQiLCJfWWFyZ3NJbnN0YW5jZV9jd2QiLCJfWWFyZ3NJbnN0YW5jZV9jb250ZXh0IiwiX1lhcmdzSW5zdGFuY2VfY29tcGxldGlvbiIsIl9ZYXJnc0luc3RhbmNlX2NvbXBsZXRpb25Db21tYW5kIiwiX1lhcmdzSW5zdGFuY2VfZGVmYXVsdFNob3dIaWRkZW5PcHQiLCJfWWFyZ3NJbnN0YW5jZV9leGl0RXJyb3IiLCJfWWFyZ3NJbnN0YW5jZV9kZXRlY3RMb2NhbGUiLCJfWWFyZ3NJbnN0YW5jZV9lbWl0dGVkV2FybmluZ3MiLCJfWWFyZ3NJbnN0YW5jZV9leGl0UHJvY2VzcyIsIl9ZYXJnc0luc3RhbmNlX2Zyb3plbnMiLCJfWWFyZ3NJbnN0YW5jZV9nbG9iYWxNaWRkbGV3YXJlIiwiX1lhcmdzSW5zdGFuY2VfZ3JvdXBzIiwiX1lhcmdzSW5zdGFuY2VfaGFzT3V0cHV0IiwiX1lhcmdzSW5zdGFuY2VfaGVscE9wdCIsIl9ZYXJnc0luc3RhbmNlX2lzR2xvYmFsQ29udGV4dCIsIl9ZYXJnc0luc3RhbmNlX2xvZ2dlciIsIl9ZYXJnc0luc3RhbmNlX291dHB1dCIsIl9ZYXJnc0luc3RhbmNlX29wdGlvbnMiLCJfWWFyZ3NJbnN0YW5jZV9wYXJlbnRSZXF1aXJlIiwiX1lhcmdzSW5zdGFuY2VfcGFyc2VyQ29uZmlnIiwiX1lhcmdzSW5zdGFuY2VfcGFyc2VGbiIsIl9ZYXJnc0luc3RhbmNlX3BhcnNlQ29udGV4dCIsIl9ZYXJnc0luc3RhbmNlX3BrZ3MiLCJfWWFyZ3NJbnN0YW5jZV9wcmVzZXJ2ZWRHcm91cHMiLCJfWWFyZ3NJbnN0YW5jZV9wcm9jZXNzQXJncyIsIl9ZYXJnc0luc3RhbmNlX3JlY29tbWVuZENvbW1hbmRzIiwiX1lhcmdzSW5zdGFuY2Vfc2hpbSIsIl9ZYXJnc0luc3RhbmNlX3N0cmljdCIsIl9ZYXJnc0luc3RhbmNlX3N0cmljdENvbW1hbmRzIiwiX1lhcmdzSW5zdGFuY2Vfc3RyaWN0T3B0aW9ucyIsIl9ZYXJnc0luc3RhbmNlX3VzYWdlIiwiX1lhcmdzSW5zdGFuY2VfdXNhZ2VDb25maWciLCJfWWFyZ3NJbnN0YW5jZV92ZXJzaW9uT3B0IiwiX1lhcmdzSW5zdGFuY2VfdmFsaWRhdGlvbiIsIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCJyZWNlaXZlciIsInN0YXRlIiwia2luZCIsIlR5cGVFcnJvciIsIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCJrQ29weURvdWJsZURhc2giLCJTeW1ib2wiLCJrQ3JlYXRlTG9nZ2VyIiwia0RlbGV0ZUZyb21QYXJzZXJIaW50T2JqZWN0Iiwia0VtaXRXYXJuaW5nIiwia0ZyZWV6ZSIsImtHZXREb2xsYXJaZXJvIiwia0dldFBhcnNlckNvbmZpZ3VyYXRpb24iLCJrR2V0VXNhZ2VDb25maWd1cmF0aW9uIiwia0d1ZXNzTG9jYWxlIiwia0d1ZXNzVmVyc2lvbiIsImtQYXJzZVBvc2l0aW9uYWxOdW1iZXJzIiwia1BrZ1VwIiwia1BvcHVsYXRlUGFyc2VySGludEFycmF5Iiwia1BvcHVsYXRlUGFyc2VySGludFNpbmdsZVZhbHVlRGljdGlvbmFyeSIsImtQb3B1bGF0ZVBhcnNlckhpbnRBcnJheURpY3Rpb25hcnkiLCJrUG9wdWxhdGVQYXJzZXJIaW50RGljdGlvbmFyeSIsImtTYW5pdGl6ZUtleSIsImtTZXRLZXkiLCJrVW5mcmVlemUiLCJrVmFsaWRhdGVBc3luYyIsImtHZXRDb21tYW5kSW5zdGFuY2UiLCJrR2V0Q29udGV4dCIsImtHZXRIYXNPdXRwdXQiLCJrR2V0TG9nZ2VySW5zdGFuY2UiLCJrR2V0UGFyc2VDb250ZXh0Iiwia0dldFVzYWdlSW5zdGFuY2UiLCJrR2V0VmFsaWRhdGlvbkluc3RhbmNlIiwia0hhc1BhcnNlQ2FsbGJhY2siLCJrSXNHbG9iYWxDb250ZXh0Iiwia1Bvc3RQcm9jZXNzIiwia1JlYmFzZSIsImtSZXNldCIsImtSdW5ZYXJnc1BhcnNlckFuZEV4ZWN1dGVDb21tYW5kcyIsImtSdW5WYWxpZGF0aW9uIiwia1NldEhhc091dHB1dCIsImtUcmFja01hbnVhbGx5U2V0S2V5cyIsIllhcmdzSW5zdGFuY2UiLCJwcm9jZXNzQXJncyIsInBhcmVudFJlcXVpcmUiLCJhZGRIZWxwT3B0IiwiYWRkU2hvd0hpZGRlbk9wdCIsInNob3dIaWRkZW4iLCJjaGVjayIsIl95YXJncyIsInN0cmlwQWxpYXNlZCIsImNvbmZsaWN0cyIsImtleTEiLCJrZXkyIiwicGFyc2VGbiIsImNvbXBsZXRpb24iLCJjb21tYW5kRGlyIiwiZGVtYW5kQ29tbWFuZCIsIm1pbk1zZyIsIm1heE1zZyIsIkluZmluaXR5IiwiZGVwcmVjYXRlT3B0aW9uIiwiZGV0ZWN0TG9jYWxlIiwiZGV0ZWN0IiwiZXBpbG9ndWUiLCJleGFtcGxlUGFyYW1zIiwiZXhpdFByb2Nlc3MiLCJnZXREZXRlY3RMb2NhbGUiLCJnZXRIZWxwIiwiYnVpbGRlclJlc3BvbnNlIiwiZ2V0U3RyaWN0IiwiZ2V0U3RyaWN0Q29tbWFuZHMiLCJnZXRTdHJpY3RPcHRpb25zIiwiZ2xvYmFscyIsImxvY2FsIiwibCIsImciLCJleGlzdGluZyIsInNlZW4iLCJoaWRlIiwiaW1wbGllcyIsImRlcHJlY2F0ZSIsInJlcXVpcmVkIiwiY29uZmlnUGFyc2VyIiwic2tpcFZhbGlkYXRpb24iLCJyZXF1aXJlc0FyZyIsInNob3J0Q2lyY3VpdCIsIl9wYXJzZUZuIiwidG1wUGFyc2VkIiwiZmluYWxseSIsInBhcnNlQXN5bmMiLCJwYXJzZVN5bmMiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwicGtnQ29uZiIsImNvbmYiLCJzdXBwb3J0ZWRPcHRzIiwiZnVsbENvbW1hbmQiLCJwayIsInBhcnNlT3B0aW9uIiwicmVjb21tZW5kQ29tbWFuZHMiLCJyZWNvbW1lbmQiLCJOYU4iLCJzaG93Q29tcGxldGlvblNjcmlwdCIsImxvZyIsInNjcmlwdE5hbWUiLCJzdHJpY3QiLCJzdHJpY3RDb21tYW5kcyIsInN0cmljdE9wdGlvbnMiLCJ0ZXJtaW5hbFdpZHRoIiwidXBkYXRlU3RyaW5ncyIsInVzYWdlQ29uZmlndXJhdGlvbiIsImRlZmF1bHRWZXJzaW9uT3B0IiwiV2Vha01hcCIsIm9wdGlvbktleSIsImhpbnRLZXkiLCJoaW50IiwiZGVkdXBsaWNhdGlvbklkIiwiY29tcGxldGlvbkNvbW1hbmQiLCJleGl0RXJyb3IiLCJoYXNPdXRwdXQiLCJwYXJzZUNvbnRleHQiLCJkZWZhdWx0JDAiLCJucGF0aCIsInN0YXJ0RGlyIiwicGtnSnNvblBhdGgiLCJuYW1lcyIsIl9ub29wIiwic2luZ2xlS2V5SGFuZGxlciIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsIl9sIiwiX20iLCJfbyIsImdldENvbW1hbmRJbnN0YW5jZSIsImdldFBhcnNlQ29udGV4dCIsImdldFZhbGlkYXRpb25JbnN0YW5jZSIsImNhbGxlZEZyb21Db21tYW5kIiwicnVuR2xvYmFsTWlkZGxld2FyZSIsInRtcE9wdGlvbnMiLCJVc2FnZSIsIl9zIiwib2JzZXJ2ZWQiLCJtaXNzaW5nIiwiY3VzdG9tTXNncyIsImN1c3RvbU1zZyIsImNoZWNrUG9zaXRpb25hbHMiLCJjb21tYW5kS2V5cyIsInVua25vd24iLCJpc1ZhbGlkQW5kU29tZUFsaWFzSXNOb3ROZXciLCJtYXhOb25PcHREZW1hbmRlZCIsImludmFsaWQiLCJpbnZhbGlkS2V5cyIsImltcGxpZWQiLCJrZXlFeGlzdHMiLCJnZXRJbXBsaWVkIiwiaW1wbGljYXRpb25zIiwiaW1wbHlGYWlsIiwib3JpZ0tleSIsIm9yaWdWYWx1ZSIsImNvbmZsaWN0aW5nIiwiZ2V0Q29uZmxpY3RpbmciLCJwb3RlbnRpYWxDb21tYW5kcyIsInJlY29tbWVuZGVkIiwiYmVzdERpc3RhbmNlIiwiY2FuZGlkYXRlIiwiZGlzdGFuY2UiLCJWYWxpZGF0aW9uIiwiQ29tbWFuZCIsImJhc2UiLCJhcmd2UHJvbWlzZSIsImhlbHBPcHRTZXQiLCJ2ZXJzaW9uT3B0U2V0IiwiaGFuZGxlcktleXMiLCJyZXF1ZXN0Q29tcGxldGlvbnMiLCJza2lwUmVjb21tZW5kYXRpb24iLCJmaXJzdFVua25vd25Db21tYW5kIiwiY29tcGxldGlvbkFyZ3MiLCJwYXJzZUVycm9ycyIsIm5vbk9wdGlvbkNvdW50IiwicmVxdWlyZWRBcmd1bWVudHMiLCJmYWlsZWRTdHJpY3RDb21tYW5kcyIsInVua25vd25Db21tYW5kcyIsInVua25vd25Bcmd1bWVudHMiLCJsaW1pdGVkQ2hvaWNlcyIsIllhcmdzIiwiZXNtUGxhdGZvcm1TaGltIiwibWVtb2l6ZSIsImNhY2hlRHVyYXRpb24iLCJ0IiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJjYWNoZXMiLCJjYWxjS2V5IiwibiIsImNvZGVQb2ludEF0IiwiaW11bCIsInBhZFN0YXJ0IiwibWF4Q2FjaGVkQXJnc1NpemUiLCJtYXhDYWNoZWRUaGlzU2l6ZSIsIkRhdGUiLCJub3ciLCJzaXplIiwiZGVsZXRlIiwiaCIsIm1lbW9pemVGYWN0b3J5IiwiTUFYX1NBRkVfSU5URUdFUiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiZG9ja2VyUGFja2FnZUpzb24iLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJwIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZEFsbFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290IiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJnZXRBbGxQcm9qZWN0cyIsImFsbFByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInVwZGF0ZSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJpbmNsdWRlUGF0dGVybnMiLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJwcm9qZWN0cyIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJ3b3JkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwiaXNSdW5uaW5nT25CdW4iLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlcldpdGhBcmdzIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJVUkwiLCJhYnNvbHV0ZVBhdGgiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJwcmludGFibGVTY3JpcHQiLCJydW5uYWJsZVNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuIiwib3V0IiwibmV3U2NyaXB0Iiwibm9ybWFsaXplZFNjcmlwdCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJwcmlzbWFDb21tYW5kIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpdGVzdHJlYW1Db21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZmluZFByaXNtYVByb2plY3RzIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwicmVzdG9yZWQiLCJ0cmltRW5kIiwiZmlsdGVyZWQiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwicHJvbWlzZUFsbCIsIm5ld0RlcHMiLCJuZXdEZXZEZXBzIiwiZGVwIiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3RhcnRQcm9kdWN0aW9uIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiY2kiLCJlMmUiLCJ1bml0IiwiQ0kiLCJGT1JDRV9DT0xPUiIsInVuaXRUaW1lb3V0IiwidGVzdE9uRG9ja2VyIiwidW5pdFRlc3RzRXhpc3RQcm9taXNlIiwiZTJlVGVzdHNFeGlzdFByb21pc2UiLCJ0eXBlQ2hlY2tDb21tYW5kIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJ0Y0NvbW1hbmQiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyJdLCJtYXBwaW5ncyI6ImtyQkErQ08sU0FBU0EsRUFDZEMsRUFDQUMsRUFDQUMsR0FBZSxHQUVmLElBQUlDLEdBQVlILEVBQUtJLEtBQU8sSUFBSUMsS0FBS0MsR0FBWUMsRUFBS0MsUUFBUVAsRUFBS0ssRUFBUUcsY0FDM0UsTUFBTUMsRUFDSlYsRUFBS1csYUFDSlgsRUFBS1ksZUFDRkMsUUFBUVQsSUFBSVUsVUFBWSxjQUN4QmQsRUFBS2UsZUFDSEYsUUFBUVQsSUFBSVksUUFBVUgsUUFBUVQsSUFBSVUsVUFBWSxtQkFDOUNHLEdBQ1IsR0FBdUIsaUJBQVpQLEVBQXNCLENBQy9CLEdBQXdCLElBQXBCUCxFQUFTZSxTQUNYZixFQUFTZ0IsS0FBS1osRUFBS2EsS0FBS25CLEVBQUssU0FDekJELEVBQUtxQixnQkFBZ0IsQ0FDdkIsTUFBTUMsRUFBV2YsRUFBS0MsUUFBUVAsRUFBSyxLQUFNLE1BQ3JDc0IsRUFBR0MsV0FBV2pCLEVBQUthLEtBQUtFLEVBQVUsa0JBQ3BDbkIsRUFBU2dCLEtBQUtaLEVBQUthLEtBQUtFLEVBQVUsUUFFdEMsQ0FFRm5CLEVBQVdBLEVBQVNzQixTQUFTbkIsR0FDM0JJLEVBQ0ksQ0FBQyxHQUFHSixLQUFXSSxVQUFpQixHQUFHSixVQUFpQixHQUFHQSxLQUFX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MGYsWUFBYSxzQ0FDYnBNLEtBQU0sVUFDTmxJLE1BQU8sSzhEakNULGNBQWUsQ0FDYnNVLFlBQWEsc0JBQ2JwTSxLQUFNLFNBQ05sSSxNQUFPLEtBRVQsVUFBVyxDQUNUc1UsWUFBYSwyQ0FDYnBNLEtBQU0sVUFDTmxJLE1BQU8sTXBERkosSUFBaUIvTSxTcURLbEJzZSxJckRMa0J0ZSxHcURLSmEsUUFBUWIsS3JESmpCQSxHQUFLeU0sTUFBTW1LLEtBQTJCLEtxREs5Q3lqQixXQUFXLE1BQ1h2MkIsUUFBUWdzQyxJQUNScHdCLFlBQVkxZixJQUNYLE1BQU0rdkMsRUFBYS92QyxFQUFLLGVBQ3hCLEdBQUkrdkMsRUFBWSxDQUNkLE1BQU03TyxFQUFVM2dDLEVBQUtDLFFBQVF1dkMsR0FDN0JsdkMsUUFBUW12QyxNQUFNOU8sRUFDaEIsRS9EaUhHLFNBQThDcC9CLEdBRS9DQSxFQUFRMmdDLE1BQVEzZ0MsRUFBUW11QyxtQkFDMUJudUMsRUFBUTJnQyxLQUFPM2dDLEVBQVEyZ0MsS0FBSzE1QixRQUFRLEdBQUdqSCxFQUFRbXVDLG9CQUFxQixJQUVqRWpPLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNOS9CLEtBQU9FLE9BQU9JLEtBQUtWLEdBQVUsQ0FDdEMsTUFBTW91QyxFQUFXaHVDLEVBQUk0SSxlQUVuQm9sQyxFQUFTbmhCLFdBQVcsU0FDcEJtaEIsRUFBU25oQixXQUFXLFVBQ3BCbWhCLEVBQVNuaEIsV0FBVyxXQUNQLGdCQUFibWhCLEdBQ2EsYUFBYkEsV0FFT3B1QyxFQUFRSSxFQUVuQixDQUNGLEMrRHJJSWl1QyxDQUFxQ3R2QyxRQUFRVCxJQUFJLElBRWxEd0QsUUFBUXFnQyxJQUNScmdDLFFBQVFnakMsSUFDUmhqQyxRQUFROG1DLElBQ1I5bUMsUUFBUTZuQyxJQUNSN25DLFFBQVFrb0MsSUFDUmxvQyxRQUFRa3FDLElBQ1JscUMsUUFBUW9yQyxJQUNScHJDLFFBQVE4ckMsSUFDUjlyQyxRQUFRaXNDLElBQ1J2WSxnQkFDQWdELFNBQ0FuUSxPQUFPbnFCLEtBRVYsSUFBSyxNQUFNaUYsSUFBVSxDQUFDLFNBQVUsVUFBVyxXQUN6Q3BFLFFBQVF3RCxHQUFHWSxHQUFRLElBQU1wRSxRQUFRZ2IiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNywzOF19