@willbooster/wb 13.12.16 → 13.12.18

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.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import l from"chalk";import{globby as d}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import w from"node:fs/promises";import{createServer as y}from"node:net";import{distance as b}from"fastest-levenshtein";const v={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"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function k(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const A=new Map;function E(e){const n=A.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return A.set(e,r),r}function P(e){return e instanceof Error&&"code"in e}function S(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{x("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(R(e))return;throw e}}(e);const n=function(e){const{stdout:t}=x("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)$(e,t)}function $(e,t){try{process.kill(e,t)}catch(e){if(R(e))return;throw e}}function x(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new j(e,t,r,function(e){if(P(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function R(e){return!(!P(e)||"ESRCH"!==e.code)||e instanceof j&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class j extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function O(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";const l=N(process.stdout,n?.omitBlankLinesWhilePrinting),d=N(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&l.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&d.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{S(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),l.flush(),d.flush(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}const D=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function N(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)T(t)||e.write(`${t}\n`)},flush:()=>{T(n)||e.write(n),n=""}}}function T(e){return 0===e.replaceAll(D,"").trim().length}function I(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 _(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 C(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import l from"chalk";import{globby as d}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import w from"node:fs/promises";import{createServer as y}from"node:net";import{distance as b}from"fastest-levenshtein";const v={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"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function k(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const A=new Map;function E(e){const n=A.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return A.set(e,r),r}function P(e){return e instanceof Error&&"code"in e}function S(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{$("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(R(e))return;throw e}}(e);const n=function(e){const{stdout:t}=$("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)x(e,t)}function x(e,t){try{process.kill(e,t)}catch(e){if(R(e))return;throw e}}function $(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new j(e,t,r,function(e){if(P(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function R(e){return!(!P(e)||"ESRCH"!==e.code)||e instanceof j&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class j extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function O(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";const l=N(process.stdout,n?.omitBlankLinesWhilePrinting),d=N(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&l.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&d.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{S(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),l.flush(),d.flush(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}const D=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function N(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)I(t)||e.write(`${t}\n`)},flush:()=>{I(n)||e.write(n),n=""}}}function I(e){return 0===e.replaceAll(D,"").trim().length}function T(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 _(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 C(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const B=[..."0123456789abcdef"],L=[6,1536,393216,100663296],M=[0,8,16,24],F=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const z=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class U{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<M[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<M[3&i++],t[i>>2]|=(128|63&a)<<M[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<M[3&i++],t[i>>2]|=(128|a>>6&63)<<M[3&i++],t[i>>2]|=(128|63&a)<<M[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<M[3&i++],t[i>>2]|=(128|a>>12&63)<<M[3&i++],t[i>>2]|=(128|a>>6&63)<<M[3&i++],t[i>>2]|=(128|63&a)<<M[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];W(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];W(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=B[o>>4&15]+B[15&o]+B[o>>12&15]+B[o>>8&15]+B[o>>20&15]+B[o>>16&15]+B[o>>28&15]+B[o>>24&15];i%e===0&&(t=z(t),W(t),s=0)}return r&&(o=t[s],a+=B[o>>4&15]+B[15&o],r>1&&(a+=B[o>>12&15]+B[o>>8&15]),r>2&&(a+=B[o>>20&15]+B[o>>16&15])),a}}const W=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,w,y,b,v,k,A,E,P,S,$,x,R,j,O,D,N,T,I,_,C,B,L,M,z,U,W,J,Y,V,q,G,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,J=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,T=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,L=e[26]<<25|e[27]>>>7,M=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,$=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,U=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~$&R,e[11]=S^~x&j,e[20]=I^~C&L,e[21]=_^~B&M,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=$^~R&O,e[13]=x^~j&D,e[22]=C^~L&z,e[23]=B^~M&U,e[32]=q^~K&Q,e[33]=G^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&A,e[5]=b^~k&E,e[14]=R^~O&N,e[15]=j^~D&T,e[24]=L^~z&W,e[25]=M^~U&J,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~T&S,e[26]=z^~W&I,e[27]=U^~J&_,e[36]=Q^~X&Y,e[37]=Z^~ee&V,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=A^~h&g,e[9]=E^~m&w,e[18]=N^~P&$,e[19]=T^~S&x,e[28]=W^~I&C,e[29]=J^~_&B,e[38]=X^~Y&q,e[39]=ee^~V&G,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=F[r],e[1]^=F[r+1]},J=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(V.decode(e))],create:([e])=>Y.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),Y=new TextEncoder,V=new TextDecoder("utf-8");function q(e,t=J){return JSON.stringify(H(e,t))}function G(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const K=[];function H(e,t=J){const n=G(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=G(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(K.length<e){const t=K.length;K.length=e,K.fill(-2,t,e)}return K.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,l=Array.from({length:c+1});l[0]=s,r[i]=l,o.set(n,i);for(let t=0;t<c;t++)l[t+1]=e(a[t])}}return i}(e),r}function Q(e,t){return function(e){return new U(512,L,512).update(e).hex()}(q([e,t]))}const Z=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=Q}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),l=Date.now();return(i!==c||l-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=l),o}}}({getCacheKey:Q});function X(e){return!!e&&"0"!==e&&"false"!==e}let ee;class te{static{[ee]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===o,A=3===o,E=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),$[t].call(o,s)}}if(!v){var $={},x=[],R=A?"get":E||k?"set":"value";if(d?(u||k?$={get:_(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:$[R]=b,u||_($[R],r,P?"":R)):u||($=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+$[R].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var j=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,T={},I={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,T)};if(v)i=D.call(N,j,I),T.v=1,y(i,"class decorators","return")&&(j=i);else if(I.static=l,I.private=d,i=I.access={has:d?p.bind():function(e){return r in e}},E||(i.get=d?P?function(e){return h(e),$.value}:S("get",0,h):function(e){return e[r]}),P||A||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=D.call(N,k?{get:$.get,set:$.set}:$[R],I),T.v=1,k){if("object"==typeof j&&j)(i=y(j.get,"accessor.get"))&&($.get=i),(i=y(j.set,"accessor.set"))&&($.set=i),(i=y(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):$[R]=j)}return o<2&&c.push(w(x,l,1),w(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?$[R]:y.call.bind($[R])):f(e,r,$)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(w(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;b(t?e:e.prototype,i,h,f?"#"+p:C(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return I(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[Z,3,"isBunAvailable"],[Z,3,"usesBunPackageManager"],[Z,3,"buildCommand"],[Z,3,"rootDirPath"],[Z,3,"dockerfile"],[Z,3,"hasDockerfile"],[Z,3,"hasSourceCode"],[Z,3,"name"],[Z,3,"dockerImageName"],[Z,3,"env"],[Z,3,"packageJson"],[Z,3,"packageJsonPath"],[Z,3,"hasPrisma"],[Z,3,"hasDrizzle"],[Z,3,"databaseOrm"],[Z,3,"hasVitest"],[Z,3,"hasOxlint"],[Z,3,"hasOxfmt"],[Z,3,"hasPrettier"],[Z,3,"hasPoetryLock"],[Z,3,"hasPubspecYaml"],[Z,3,"preferredLinter"],[Z,3,"hasPlaywrightConfig"],[Z,3,"skipLaunchingServerForPlaywright"],[Z,3,"dockerPackageJson"],[Z,3,"binExists"],[Z,3,"rootPackageJson"]]).e}argv=void ee(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const i=k(n);n.verbose&&!i&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const a=[],c={};for(const e of o){const o=[];for(const[n,s]of Object.entries(E(t.join(r,e))))n in c||n in process.env||(c[n]=s,o.push(n));a.push([e,o]),n.verbose&&!i&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||i||console.info(`Read env files: ${a.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(E(t.join(r,n.checkEnv))).filter(e=>!(e in c)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:c,processEnv:{}}).parsed??c,a]}(this.argv,this.dirPath);if(!k(this.argv))for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(X(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function ne(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new te(o,n,r)}async function re(e,t=!0,n){const r=oe(e,t,n);if(r)return{...r,descendants:r.root===r.self?await se(e,r.root,t):[r.self]}}function oe(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new te(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new te(s,n,r))}return{root:i,self:s}}async function se(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new te(r,n,o));return s}const ie=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ae=ie?"bun --bun run":"node",ce=ie?"bun":"yarn",le=ie?"bun --bun run":"yarn",de={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=ne(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?ie?"bun run build":"yarn build":void 0);if(!i)return console.info(l.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return ue(s,n),!0;const[a,d,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),l=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(l);const d=JSON.stringify(Object.entries(n.env).filter(([e])=>!pe.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(d),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(fe.some(t=>e.includes(t))||he.some(t=>e.endsWith(t)))&&!me.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!ue(s,n))return;n.dryRun||await e.promises.writeFile(d,u,"utf8");return!0}(n)}};function ue(e,t){if(console.info(l.green(`Run '${t.command}'`)),!t.dryRun){const n=o.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 pe=new Set(["CI","PWDEBUG","TMPDIR"]);const fe=["src/","public/"],he=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],me=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ge=new m,we={exitIfFailed:!0};async function ye(e,t,n,r=we){const o=ve(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||ke(o.printable,t,n.silent?"Command":"Start"),n.verbose&&ke(o.runnable,t,"Start (raw)",!0),n.dryRun)return Ae(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),d=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==d)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===d&&r.silentSuccessMessage&&console.info(l.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Ae(o.printable,d,r,{silentSuccess:n.silent}),d}function be(e,t,n,r=we){return ge.runAndWaitForReturnValue(async()=>{const o=ve(e,t);if(ke(o.printable,t,"Start (parallel)",!0),n.dryRun)return ke(o.printable,t,"Started (log)"),n.verbose&&ke(o.runnable,t,"Started (raw)",!0),Ae(o.printable,0,r),0;const s=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),ke(o.printable,t,"Started (log)"),n.verbose&&ke(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),Ae(o.printable,s.status,r),s.status??1})}function ve(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts")),r=r.trim();const o=Pe(r.replaceAll("YARN ",`${n} `)),s=Pe(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function ke(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function Ae(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(l.green(l.bold("Finished:"),e))}else console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function Ee(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function Pe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const Se={...v,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function $e(e){const t=[];for(const n of Object.keys(v)){const r=xe(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return!0===e.silent&&void 0===xe(e,"quiet-env")&&t.push("--quiet-env"),t}function xe(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Re={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...Se,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const t=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(l.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(ve(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Ee(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),l=t.map((n,o)=>new Promise(l=>{let d=!1;const u=n=>{d||(d=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Oe(t,"SIGTERM"))),l())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(je(e??void 0,t??void 0))})})),d=e=>{n??=e,i||(i=!0,a.push(Oe(t,e)))},u=()=>{d("SIGINT")},p=()=>{d("SIGTERM")},f=()=>{d("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(l),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return je(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(l.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function je(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Oe(e,t){const n=De(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Ne))return!1;await Te(Math.min(100,t-Date.now()))}return!0}(n)&&De(n,"SIGKILL")}function De(e,t){const n=[];for(const r of e)try{if(!Ie(r,t))continue;n.push(r),S(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function Ne(e){try{return process.kill(-e,0),!1}catch(e){return!!_e(e)}}async function Te(e){await new Promise(t=>setTimeout(t,e))}function Ie(e,t){try{return process.kill(-e,t),!0}catch(e){if(_e(e))return!1;throw e}}function _e(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const Ce={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));if(X(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(l.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Be(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(Le(t))}(e,t))return;const n=function(e){return Le(e).trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Le(e){return e.replaceAll(/\(node:\d+\) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set\.\n\(Use `node --trace-warnings \.\.\.` to show where the warning was created\)\n?/g,"")}function Me(e){return e.map(e=>Fe(e)).join(" ")}function Fe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const ze=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),Ue=new Set(["py"]),We=new Set(["dart"]),Je=new Set([...ze,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Ye=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ve=new Set([...Ye].filter(e=>!Je.has(e))),qe="!**/test{-,/}fixtures/**",Ge={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await Ke(e);t&&process.exit(t)}};async function Ke(e){if("win32"===process.platform)return console.error(l.red("This command is not supported on Windows.")),1;const n=await re(e,!1);if(!n)return console.error(l.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],d=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...lt(n.descendants,u,r));for(const{lintPath:t,project:d}of dt(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||Ue.has(p))){const e=i.get(d)??[];if(e.push(t),i.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||We.has(p))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if("directory"===r||pt(d,p)){const n=o.get(d)??[];if(n.push(t),o.set(d,n),e.format)if("directory"===r&&d.hasOxfmt){const e=s.get(d)??[];e.push(t),s.set(d,e),c.push(ct(t),qe)}else for(const e of at(d,t,r,p))if(d.hasOxfmt){const t=s.get(d)??[];t.push(e),s.set(d,t)}else c.push(e)}else if(e.format&&(Ye.has(p)||Je.has(p)))if(d.hasOxfmt&&Je.has(p)){const e=s.get(d)??[];e.push(t),s.set(d,e)}else Ye.has(p)&&c.push(t);else ut(p)&&!d.preferredLinter&&(console.error(l.red(`No linter found for ${d.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ve].join(",")}}`,qe]);for(const o of n){if(!ft(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Ye].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,forceColor:!e.printAllOutput},y=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=tt(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:ot(e,n),project:t}),y&&h.push({command:rt(n),project:t});for(const[e,t]of a)b&&m.push({command:it(t),project:e}),y&&h.push({command:st(t),project:e});if(y)for(const[e,t]of s)h.push({command:nt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=tt(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:ot(e),project:t}),t.hasPubspecYaml&&m.push({command:it(),project:t})}y&&(t.hasOxfmt&&h.push({command:nt(),project:t}),t.hasPoetryLock&&h.push({command:rt(),project:t}),t.hasPubspecYaml&&h.push({command:st(),project:t}))}const v=[];if(y){const t=await He(h,e,g);if(Ze(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(y){if(u.length>0&&n.self.hasPrettier){const t=await Qe(Me(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);Ze([t],e),v.push(t.exitCode)}if(p.length>0){const t=await Qe(Me(["YARN","sort-package-json","--",...p]),n.self,e,g);Ze([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await He(m,e,g);Ze(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function He(e,t,n){return Promise.all(e.map(({command:e,project:r})=>Qe(e,r,t,n)))}function Qe(e,t,n,r){if(n.silent){const o=ve(e,t);return function(e,t,n,r=we){return ge.runAndWaitForReturnValue(async()=>{const o=ve(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return be(e,t,n,r).then(e=>({exitCode:e}))}function Ze(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?Xe(e):(t.silent&&et(e.command,e.cwd),Be(e.exitCode,e.output)))}function Xe(e){if(et(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(l.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function et(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}function tt(e,t,n){if("oxlint"===e.preferredLinter)return Me(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function nt(e){return Me(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function rt(e){const t=e&&e.length>0?e:["."];return[Me(["poetry","run","isort","--profile","black","--filter-files",...t]),Me(["poetry","run","black",...t])].join(" && ")}function ot(e,t){const n=t&&t.length>0?t:["."];return Me(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function st(e){return Me(["dart","format",...e&&e.length>0?e:["."]])}function it(e){return Me(["dart","analyze",...e&&e.length>0?e:["."]])}function at(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&ft(e)?[t,qe]:function(e,t){return e.hasOxfmt?Je.has(t):!!ft(e)||Ve.has(t)}(e,r)?[t]:[]}function ct(e){return t.join(e,`**/{.*/,}*.{${[...Ve].join(",")}}`)}function lt(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function dt(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function ut(e){return ze.has(e)||Ue.has(e)||We.has(e)}function pt(e,t){return"oxlint"===e.preferredLinter&&ze.has(t)}function ft(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}function*ht(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const mt=["@willbooster/wb","build-ts"],gt={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(n){const r=await re(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of ht("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(wt(n,r),yt(r),bt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(ce,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function wt(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of mt){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function yt(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function bt(e){delete e.private,delete e.publishConfig,delete e.prettier}const vt="file:";const kt=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(vt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},At="file:",Et=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Pt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function St(n){return Et.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const $t=new class{cleanUpLitestream(e){const t=Pt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${At}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Pt(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Pt(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(At))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=St(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Pt(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${At}${e} `}else if(e.env.DATABASE_URL?.startsWith(At)){const n=St(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${At}${r} `}}return`${o}PRISMA studio ${r}`}},xt={},Rt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(jt).command(Ot).command(Dt).command(Nt).command(Tt).command(It).command(_t).command(Ct).command(Bt).command(Lt).command(Mt).command(Ft).demandCommand().strict(!1),handler(){}},jt={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:xt,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma cleanup-litestream",t))await ye($t.cleanUpLitestream(n),n,e)}},Ot={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:xt,async handler(e){const t=await Ut(e,"prisma");for(const{project:e}of Jt("prisma create-litestream-config",t))zt(e)}},Dt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:xt,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db deploy",t))await ye(Wt(r).deploy(o,n),o,e)}},Nt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:xt,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma deploy-force",t))await ye($t.deployForce(n),n,e)}},Tt={command:"list-backups",describe:"List Litestream backups",builder:xt,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma list-backups",t))await ye($t.listBackups(n),n,e)}},It={command:"migrate",describe:"Apply migration to DB with initializing it",builder:xt,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db migrate",t))await ye(Wt(r).migrate(o,n),o,e)}},_t={command:"migrate-dev",describe:"Create a migration file",builder:xt,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db migrate-dev",t))await ye(Wt(r).migrateDev(o,n),o,e)}},Ct={command:"reset",describe:"Reset DB",builder:xt,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db reset",t))await ye(Wt(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of Jt("WB_ENV=test db reset",await Ut(e)))await ye(Wt(t).reset(r,n),r,e)}}},Bt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...xt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ye($t.restore(n,t),n,e)}}},Lt={command:"seed",describe:"Populate DB with seed data",builder:{...xt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Ut(e);for(const{orm:n,project:r}of Jt("db seed",t))await ye(Wt(n).seed(r,e.file),r,e)}},Mt={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...xt,"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 Ut(e),n=Yt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of Jt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ye(Wt(r).studio(o,t,n),o,e)}}},Ft={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await Ut(e),n=[(e.args?.join(" ")??"").trimEnd(),Yt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of Jt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await ye(t,o,e)}}};function zt(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function Ut(e,t){const n=await re(e);n||(console.error(l.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(l.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function Wt(e){return"prisma"===e?$t:kt}function*Jt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of ht(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Yt(e,t=[]){const n=[],r=Object.keys(Se),o=Object.values(Se).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Me([...n,...i])}const Vt={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=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${l.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await ye(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},qt={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await re(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of ht("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await be(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ye("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await be("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await be(`poetry env use ${n}`,t,e),await ge.promiseAll(),await ye("poetry run pip install --upgrade pip",t,e),await ye("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ye(`${le} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ye(`${le} playwright install --with-deps`,r,e)}(e)}};function Gt(e){return e.silent?" > /dev/null":""}const Kt=new Set;async function Ht(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Xt(t,e))return!1}return!0}(e);n||await Qt(e,t);const r=async()=>{Kt.has(e)||(Kt.add(e),await Qt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Qt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await O("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await O("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Zt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ht(n,t),n}async function Xt(e,t){return new Promise(n=>{const r=y();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const en=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(Kt.has(e))return;Kt.add(e),ke(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--publish ${e.env.PORT}: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 tn{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return en.buildImage(e,t)}async startDev(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?Me(["YARN","wb","concurrently",...$e(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?Me(["YARN","wb","concurrently",...$e(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Zt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Me(["YARN","wb","concurrently",...$e(t),"--kill-others-on-fail",en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...[...e.hasPrisma?[$t.migrate(e)]:[],...e.hasDrizzle?[kt.migrate(e)]:[]].flatMap(e=>e.split("&&")),...r].filter(Boolean).map(e=>`${e} ${Gt(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,en.stopAndStart(e),n)}async testStart(e,t){return await Zt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Fe(r)}`} ${Me(["YARN","wb","concurrently",...$e(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Zt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return nn([...o,...e,...r],n);const i=e.slice(1),a=rn(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return nn([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Me(["YARN","wb","concurrently",...$e(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Me(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Me(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function nn(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Me(e):Me([...e,"--max-failures=1"]):Me(e)}function rn(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;on.has(o)?t="required":sn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&an.has(e)&&(t="required");continue}n.push(r)}}return n}const on=new Set(["--browser","--config","--grep","--grep-invert","--global-timeout","--max-failures","--output","--project","--repeat-each","--reporter","--retries","--shard","--test-list","--test-list-invert","--timeout","--trace","--tsconfig","--ui-host","--ui-port","--ui-title","--workers"]),sn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),an=new Set(["-c","-g","-j"]);const cn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const ln=new class extends tn{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const o=await Zt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return Me(["YARN","wb","concurrently",...$e(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const dn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const un=new class extends tn{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${ae} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const pn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const fn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},hn=["express","fastify","elysia","hono"],mn={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 | test",type:"string",alias:"m"}},gn={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(mn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Fe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Fe(String(e))).join(" ")}(e);const t=await re(e);t||(console.error(l.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=cn;else if(t.next)o=dn;else if(r["@remix-run/dev"])o=pn;else if(r.vite)o=fn;else if(hn.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=ln;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=un}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ye(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ye(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ye(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ye(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ye(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},wn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),yn={e2e:{description:"How to run E2E tests",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},bail:{description:"Stop tests after the first failure",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"}},bn={array:!0,description:"Unit or E2E test target paths",type:"string"},vn={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options(yn).positional("targets",bn),async handler(e){await kn(e)}};async function kn(n){const r=await re(n);r||(console.error(l.red("No project found.")),process.exit(1)),process.env.FORCE_COLOR||="3",delete process.env.NO_COLOR,process.env.WB_ENV||="test";const o=n.targets??[],s=n["--"]??[],{shouldRunE2e:i,shouldRunUnit:a}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(o,s);for(const c of r.descendants){const r=c.packageJson.dependencies??{},l=c.packageJson.devDependencies??{};let d;d=r.blitz?cn:r.next?dn:l["@remix-run/dev"]?pn:l.vite?fn:hn.some(e=>r[e])&&!r["firebase-functions"]?ln:un,console.info(`Running "test" for ${c.name} ...`);const u=An(c);if(a&&!1!==u){const e=o.filter(e=>e.includes("/unit")),t=e.length>0?e:u.length>0?u:void 0,r={...n,targets:t};await Sn(d.testUnit(c,r),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const p=o.filter(e=>e.includes("/e2e")),f={...n,targets:p.length>0?p:void 0};switch(n.e2e){case"headless":await Pn(await d.testE2EProduction(c,f,{playwrightArgs:On(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await Pn(await d.testE2EDev(c,f,{playwrightArgs:On(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await En(c,f,d,On(p,s),s);continue;case"docker-debug":await En(c,f,d,On(p,s,["--debug"]),s);continue}if(r.blitz||r.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":await Pn(await d.testE2EProduction(c,f,{playwrightArgs:On(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await Pn(await d.testE2EDev(c,f,{playwrightArgs:On(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await Pn(await d.testE2EProduction(c,f,{playwrightArgs:On(p,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await Pn(await d.testE2EProduction(c,f,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await Pn("BUN playwright show-trace",c,n)}}}function An(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function En(e,t,n,r,o){e.env.WB_DOCKER||="1",await ye(`${n.buildDocker(e,"test")}${Gt(t)}`,e,t),process.exitCode=await Pn(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await ye(en.stop(e),e,t)}function Pn(e,t,n,r={}){return ye(e,t,n,{...r,processSilentOutput:$n})}function Sn(e,t,n,r={}){return ye(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function $n(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Rn(o);n.has(e)||(t.some(t=>jn(t,e))||(xn(t,n,e),r.push(o)))}return r.join("\n")}function xn(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Rn(e){return e.replaceAll(wn,"").trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,"").replaceAll(/\(node:\d+\)/g,"(node:<number>)").replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,"<timestamp>").replaceAll(/([?&]cache=)\d+/g,"$1<number>")}function jn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&b(e,t)/n<=.05}function On(e,t=[],n=[]){const r=rn(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const Dn={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await re(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?cn:r.next?dn:s["@remix-run/dev"]?pn:s.vite?fn:hn.some(e=>r[e])&&!r["firebase-functions"]?ln:un,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await be(en.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await be(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await be(await i.testStart(o,n),o,n),await ge.promiseAll(),a&&(o.env.WB_DOCKER||="1",await ye(`${i.buildDocker(o,"test")}${Gt(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ye(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await ye(en.stop(o),o,n)}}}(n)}};const Nn={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);S(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Tn={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await re(n,!1);if(!r)return console.error(l.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await be(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(l.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(l.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(l.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const In={...Tn,command:"tc"},_n={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=oe(n,!1);r||(console.error(l.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let d=!1,u=!1;process.stdout.write=Ln(process.stdout.fd,i),process.stderr.write=Ln(process.stderr.fd,i),console.info(l.cyan(l.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${d?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=d?l.green(n):l.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{d=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{d=!0}}}(n);try{await Cn(n,r),await async function(e,t){await kn({...t,_:["test"],e2e:"headless",silent:!0})}(0,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):Cn(r.self,n))}};async function Cn(e,t){await Bn(`${ce} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await Bn(`${ce} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+l.cyan(l.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>Ke({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function Bn(e,t,n,r={}){if(function(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await O(e,void 0,{cwd:t.dirPath,env:Ee(t.env,{forceColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${ce} install`||e===`${ce} gen-code`))return void console.info(l.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(l.red(l.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function Ln(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(Se).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!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(_n).command(de).command(Re).command(Ce).command(Ge).command(gt).command(Rt).command(Vt).command(qt).command(gn).command(vn).command(Dn).command(Nn).command(Tn).command(In).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;let Mn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!Mn){Mn=!0;try{S(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG91dHB1dE9wdGlvbnMgPSBhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHF1aWV0RW52PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9O1xuICByZXR1cm4gb3V0cHV0T3B0aW9ucy5xdWlldEVudiA9PT0gdHJ1ZSB8fCAob3V0cHV0T3B0aW9ucy5xdWlldEVudiAhPT0gZmFsc2UgJiYgb3V0cHV0T3B0aW9ucy5zaWxlbnQgPT09IHRydWUpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGlzRXJybm9FeGNlcHRpb24gfSBmcm9tICcuL2Vycm5vLmpzJztcbmltcG9ydCB7IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCwgY29sbGVjdERlc2NlbmRhbnRQaWRzIGFzIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAgfSBmcm9tICcuL3Byb2Nlc3NUcmVlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVLaWxsKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwaWQpIHx8IHBpZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBpZDogJHtwaWR9YCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGtpbGxUcmVlT25XaW5kb3dzKHBpZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzY2VuZGFudHMgPSBjb2xsZWN0RGVzY2VuZGFudFBpZHMocGlkKTtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkLCBkZXNjZW5kYW50cyk7XG4gIGZvciAoY29uc3QgdGFyZ2V0UGlkIG9mIHRhcmdldFBpZHMpIHtcbiAgICBraWxsSWZOZWVkZWQodGFyZ2V0UGlkLCBzaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxJZk5lZWRlZChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIHNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsVHJlZU9uV2luZG93cyhwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJ1bkNvbW1hbmQoJ3Rhc2traWxsJywgWycvUElEJywgU3RyaW5nKHBpZCksICcvVCcsICcvRiddLCB7XG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBydW5Db21tYW5kKFxuICAgICdwcycsXG4gICAgWyctQW8nLCAncGlkPSxwcGlkPSddLFxuICAgIC8vIEtlZXAgY29tbWFuZCBib3VuZGVkIHNvIHdhdGNoLW1vZGUga2lsbCBsb29wcyBjYW5ub3QgaGFuZyB0aGlzIHBhdGguXG4gICAgeyBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LCB0aW1lb3V0OiAyMDAwIH1cbiAgKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChzdGRvdXQpO1xuICByZXR1cm4gY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcChyb290UGlkLCBjaGlsZHJlbkJ5UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQ6IG51bWJlciwgZGVzY2VuZGFudHM6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB0YXJnZXRQaWRzID0gZGVzY2VuZGFudHMudG9SZXZlcnNlZCgpO1xuICB0YXJnZXRQaWRzLnB1c2gocGlkKTtcbiAgcmV0dXJuIHRhcmdldFBpZHM7XG59XG5cbmZ1bmN0aW9uIHJ1bkNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiB7IHRpbWVvdXQ6IG51bWJlcjsgbWF4QnVmZmVyOiBudW1iZXIgfVxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogb3B0aW9ucz8ubWF4QnVmZmVyLFxuICAgICAgdGltZW91dDogb3B0aW9ucz8udGltZW91dCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVycjogJycgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBzdGRlcnIgPSBleHRyYWN0U3RkZXJyKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIGFyZ3MsIHN0ZGVyciwgdG9FeGl0Q29kZShlcnJvcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tYW5kRXhlY3V0aW9uRXJyb3IpIHtcbiAgICByZXR1cm4gL25vIHN1Y2ggcHJvY2Vzc3xub3QgZm91bmR8bm90IHJlY29nbml6ZWR8dGhlcmUgaXMgbm8gcnVubmluZyBpbnN0YW5jZS9pLnRlc3QoZXJyb3Iuc3RkZXJyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRvRXhpdENvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3RkZXJyKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgZXJyb3IgPT09IG51bGwgfHwgISgnc3RkZXJyJyBpbiBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzdGRlcnIgPSAoZXJyb3IgYXMgUmVjb3JkPCdzdGRlcnInLCB1bmtub3duPikuc3RkZXJyO1xuICBpZiAodHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RkZXJyO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RkZXJyKSkge1xuICAgIHJldHVybiBzdGRlcnIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBzdGRlcnI6IHN0cmluZywgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoYENvbW1hbmQgZmFpbGVkOiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbW1hbmRFeGVjdXRpb25FcnJvcic7XG4gICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChwc091dHB1dDogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyW10+IHtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHBzT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSAvXlxccyooXFxkKylcXHMrKFxcZCspXFxzKiQvLmV4ZWMobGluZSk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFBpZCA9IE51bWJlcihtYXRjaGVkWzFdKTtcbiAgICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIobWF0Y2hlZFsyXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50LmdldChwYXJlbnRQaWQpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZFBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHBhcmVudFBpZCwgW2NoaWxkUGlkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbkJ5UGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlciwgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgbnVtYmVyW10+KTogbnVtYmVyW10ge1xuICBjb25zdCBkZXNjZW5kYW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcXVldWUgPSBbLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHJvb3RQaWQpID8/IFtdKV07XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHBpZCA9IHF1ZXVlW2luZGV4XSBhcyBudW1iZXI7XG4gICAgaW5kZXggKz0gMTtcbiAgICBkZXNjZW5kYW50cy5wdXNoKHBpZCk7XG4gICAgcXVldWUucHVzaCguLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocGlkKSA/PyBbXSkpO1xuICB9XG4gIHJldHVybiBkZXNjZW5kYW50cztcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG4sZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuVG9vbFZlcnNpb24oKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGZtdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGZtdCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByZXR0aWVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSkgPz8gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnJvb3RQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5wYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFja2FnZUpzb24pIHJldHVybjtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoXG4gICAgICAgICdZQVJOICcsXG4gICAgICAgICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYFxuICAgICAgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICAgIGZvcmNlQ29sb3I6IHR5cGVvZiBhcmd2LmZvcmNlQ29sb3IgPT09ICdib29sZWFuJyA/IGFyZ3YuZm9yY2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpLCBmb3JjZUNvbG9yOiBvcHRpb25zLmZvcmNlQ29sb3IgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZSwgb3V0cHV0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQpO1xuICBpZiAobm9ybWFsaXplZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhpdENvZGUgIT09IDAgfHwgaGFzV2FybmluZ091dHB1dChyZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbW92ZU5vQ29sb3JXYXJuaW5nKG91dHB1dCkudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vQ29sb3JXYXJuaW5nKG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC5yZXBsYWNlQWxsKFxuICAgIC9cXChub2RlOlxcZCtcXCkgV2FybmluZzogVGhlICdOT19DT0xPUicgZW52IGlzIGlnbm9yZWQgZHVlIHRvIHRoZSAnRk9SQ0VfQ09MT1InIGVudiBiZWluZyBzZXRcXC5cXG5cXChVc2UgYG5vZGUgLS10cmFjZS13YXJuaW5ncyBcXC5cXC5cXC5gIHRvIHNob3cgd2hlcmUgdGhlIHdhcm5pbmcgd2FzIGNyZWF0ZWRcXClcXG4/L2csXG4gICAgJydcbiAgKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXQgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUgIT09IDApIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuLy8gVGhlc2UgdG9vbHMgYXJlIGRlY2xhcmVkIGFzIGRldkRlcGVuZGVuY2llcyBpbiBzb3VyY2UgcmVwb3MsIGJ1dCBvcHRpbWl6ZWQgRG9ja2VyXG4vLyBwYWNrYWdlLmpzb24gZmlsZXMgc3RpbGwgbmVlZCB0aGVtIGZvciBpbi1pbWFnZSBjb2RlZ2VuL2J1aWxkIHN0ZXBzLlxuY29uc3QgcnVudGltZURldkRlcGVuZGVuY2llcyA9IFsnQHdpbGxib29zdGVyL3diJywgJ2J1aWxkLXRzJ107XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLlxuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uKTtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBwYWNrYWdlcyBmb3IgdGhhdCBsYXRlciBpbi1pbWFnZSBidWlsZCBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIG1pZ3JhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBEQVRBQkFTRV9QQVRIIG9yIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGBZQVJOIGRyaXp6bGUta2l0ICR7ZnVsbENvbW1hbmR9YDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9XG4gICAgICBlY29zeXN0ZW1Db25maWdQYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7YXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gLnRyaW0oKSxcbiAgICAgICAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXTtcblxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgIF07XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKVxuICAgICAgLnBvc2l0aW9uYWwoJ3RhcmdldHMnLCBhcmd1bWVudHNCdWlsZGVyLnRhcmdldHMpIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIGRlbGV0ZSBwcm9jZXNzLmVudi5OT19DT0xPUjtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gYXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzIH07XG4gICAgICBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JykpKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpID8gWyd0ZXN0JywgJy0tZXhjbHVkZScsICd0ZXN0L2UyZS8qKiddIDogWyd0ZXN0J107XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBwcm9jZXNzU2lsZW50T3V0cHV0OiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5Vbml0VGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZU5vaXN5VGVzdE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVkdXBlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlcmF0ZUxpbmVzKG91dHB1dCkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGluZSA9IG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmUpO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZVNldC5oYXMobm9ybWFsaXplZExpbmUpKSBjb250aW51ZTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVzLnNvbWUoKHByaW50ZWRMaW5lKSA9PiBhcmVMaW5lc1NpbWlsYXIocHJpbnRlZExpbmUsIG5vcm1hbGl6ZWRMaW5lKSkpIGNvbnRpbnVlO1xuXG4gICAgcHVzaFJlY2VudFByaW50ZWRMaW5lKHJlY2VudFByaW50ZWRMaW5lcywgcmVjZW50UHJpbnRlZExpbmVTZXQsIG5vcm1hbGl6ZWRMaW5lKTtcbiAgICBkZWR1cGVkTGluZXMucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gZGVkdXBlZExpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiogaXRlcmF0ZUxpbmVzKG91dHB1dDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgbGluZVN0YXJ0SW5kZXggPSAwO1xuICB3aGlsZSAobGluZVN0YXJ0SW5kZXggPD0gb3V0cHV0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IG91dHB1dC5pbmRleE9mKCdcXG4nLCBsaW5lU3RhcnRJbmRleCk7XG4gICAgaWYgKGxpbmVFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgpO1xuICAgIGxpbmVTdGFydEluZGV4ID0gbGluZUVuZEluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoUmVjZW50UHJpbnRlZExpbmUobGluZXM6IHN0cmluZ1tdLCBsaW5lU2V0OiBTZXQ8c3RyaW5nPiwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGxpbmVzLnB1c2gobGluZSk7XG4gIGxpbmVTZXQuYWRkKGxpbmUpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlbW92ZWRMaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgaWYgKHJlbW92ZWRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaW5lU2V0LmRlbGV0ZShyZW1vdmVkTGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVcbiAgICAucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlQWxsKC9eKD86XFxbW15cXF1dK1xcXVxccyopKy9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFwobm9kZTpcXGQrXFwpL2csICcobm9kZTo8bnVtYmVyPiknKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1o/XFxiL2csICc8dGltZXN0YW1wPicpXG4gICAgLnJlcGxhY2VBbGwoLyhbPyZdY2FjaGU9KVxcZCsvZywgJyQxPG51bWJlcj4nKTtcbn1cblxuZnVuY3Rpb24gYXJlTGluZXNTaW1pbGFyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhMZW5ndGggKiBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRpc3RhbmNlKGEsIGIpIC8gbWF4TGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5DSSB8fD0gJzEnO1xuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICB9XG4gICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgfVxuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNnbyAtLW5vRW1pdCddO1xuICB9XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZ1bGw6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgZGVzY3JpYmU6ICdSdW4gdGVzdHMgYWZ0ZXIgdmVyaWZ5aW5nIHByb2plY3QgY29kZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnknLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgKGFyZ3YuZnVsbCA/IHZlcmlmeUNvZGVGdWxseShwcm9qZWN0cy5zZWxmLCBhcmd2KSA6IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvcnRlciA9IHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcnVuUHJvamVjdFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgcmVwb3J0ZXIuc3VjY2VlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydGVyLmZhaWwoZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlcG9ydGVyLmZpbmlzaCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGUocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCwgcHJvamVjdCwgYXJndik7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGF3YWl0IHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gICAgJ2NsZWFudXAnLFxuICAgICgpID0+XG4gICAgICBsaW50KHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgXzogWydsaW50J10sXG4gICAgICAgIGZpeDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiB0cnVlLFxuICAgICAgICBwcmludEFsbE91dHB1dDogdHJ1ZSxcbiAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRlc3QoeyAuLi5hcmd2LCBfOiBbJ3Rlc3QnXSwgZTJlOiAnaGVhZGxlc3MnLCBzaWxlbnQ6IHRydWUgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBmb3JjZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIChjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfHwgY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3Rkb3V0LmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUocHJvY2Vzcy5zdGRlcnIuZmQsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG91dHB1dEZpbGU6IG51bWJlciwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICBmcy53cml0ZVN5bmMob3V0cHV0RmlsZSwgYnVmZmVyKTtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZW5jb2RpbmdPckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrPy4oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsInNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQiLCJhcmd2Iiwib3V0cHV0T3B0aW9ucyIsInF1aWV0RW52Iiwic2lsZW50IiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJxdWlldCIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsInN0ZG91dFByaW50ZXIiLCJjcmVhdGVSZWFsdGltZVByaW50ZXIiLCJvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmciLCJzdGRlcnJQcmludGVyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZmx1c2giLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwiQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAiLCJSZWdFeHAiLCJmcm9tQ29kZVBvaW50Iiwic3RyZWFtIiwib21pdEJsYW5rTGluZXMiLCJwZW5kaW5nIiwibGluZXMiLCJwb3AiLCJpc0JsYW5rTGluZSIsInJlcGxhY2VBbGwiLCJ0cmltIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImhhc0J1blRvb2xWZXJzaW9uIiwidXNlc0J1blBhY2thZ2VNYW5hZ2VyIiwiaGFzQnVuTG9ja2ZpbGUiLCJoYXNCdW5QYWNrYWdlTWFuYWdlciIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJzb21lIiwiZmlsZU5hbWUiLCJleGlzdHNTeW5jIiwicGFja2FnZU1hbmFnZXIiLCJyb290UGFja2FnZUpzb24iLCJwYWNrYWdlSnNvbiIsInN0YXJ0c1dpdGgiLCJidWlsZENvbW1hbmQiLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwic2hvdWxkU3VwcHJlc3NPdXRwdXQiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmluZCIsImdldERlcGVuZGVuY3lWZXJzaW9uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0Iiwib21pdFNpbGVudFN0YXJ0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkiLCJ3cm90ZVNpbGVudFByb2dyZXNzIiwicHJvZ3Jlc3NUaW1lciIsInNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcyIsInNldEludGVydmFsIiwiY29uZmlndXJlRW52IiwiZmluYWxseSIsImNsZWFySW50ZXJ2YWwiLCJvdXRwdXQiLCJzaWxlbnRTdWNjZXNzTWVzc2FnZSIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsInByaW50UmF3T3V0cHV0Iiwib3V0IiwicHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsInByaW50T3B0aW9ucyIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsImZvcmNlS2lsbFByb21pc2VzIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJlc3VsdCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJmb3JjZUtpbGxQaWRzIiwic2lnbmFsUGlkcyIsInRvQ2hpbGRQaWRzIiwicGlkcyIsImRlYWRsaW5lIiwiZXZlcnkiLCJpc1Byb2Nlc3NHcm91cEdvbmUiLCJzbGVlcCIsIk1hdGgiLCJtaW4iLCJ3YWl0Rm9yRm9yY2VLaWxsIiwic2lnbmFsZWRQaWRzIiwia2lsbFByb2Nlc3NHcm91cCIsIm1zIiwic2V0VGltZW91dCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJwcmludEJ1ZmZlcmVkT3V0cHV0IiwiaGFzV2FybmluZ091dHB1dCIsInJlbW92ZU5vQ29sb3JXYXJuaW5nIiwic2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCIsIm5vcm1hbGl6ZWRPdXRwdXQiLCJub3JtYWxpemVCdWZmZXJlZE91dHB1dCIsImJ1aWxkU2hlbGxDb21tYW5kIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwibGludCIsImZpbGVzIiwibGludFRhcmdldHMiLCJnZXRMaW50VGFyZ2V0RmlsZXMiLCJsaW50RmlsZVBhdGhzQnlQcm9qZWN0Iiwib3hmbXRGaWxlUGF0aHNCeVByb2plY3QiLCJweXRob25GaWxlUGF0aHNCeVByb2plY3QiLCJkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0IiwicHJldHRpZXJGaWxlUGF0aHMiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsInByZXR0aWVyQXJncyIsInNvcnRQYWNrYWdlSnNvbkFyZ3MiLCJtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIiwiZmlsZSIsImZpbGVLaW5kIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0TGludFRhcmdldEZpbGVLaW5kIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyIsImxpbnRQYXRoIiwiZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyIsInB5dGhvbkZpbGVQYXRocyIsImRhcnRGaWxlUGF0aHMiLCJzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24iLCJsaW50RmlsZVBhdGhzIiwib3hmbXRGaWxlUGF0aHMiLCJidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4iLCJmb3JtYXR0ZXJQYXRoIiwiYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MiLCJpc1BvdGVudGlhbExpbnRUYXJnZXQiLCJzZWxmRGlyUGF0aCIsIm5lZWRzUHJldHRpZXIiLCJwcm9qZWN0UGF0dGVybiIsImJ1aWxkUHJldHRpZXJBcmdzIiwiZm9ybWF0dGVyQ29tbWFuZHMiLCJsaW50ZXJDb21tYW5kcyIsImxpbnRSdW5PcHRpb25zIiwicHJpbnRBbGxPdXRwdXQiLCJzaG91bGRSdW5Gb3JtYXR0ZXJzIiwic2hvdWxkUnVuTGludGVycyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZFBvZXRyeUxpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kIiwiYnVpbGREYXJ0TGludENvbW1hbmQiLCJidWlsZERhcnRGb3JtYXRDb21tYW5kIiwiYnVpbGRPeGZtdENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiZm9ybWF0dGVyUmVzdWx0cyIsInJ1bkxpbnRDb21tYW5kcyIsInByaW50U2lsZW50TGludE91dHB1dHMiLCJwcmV0dGllclJlc3VsdCIsInJ1bkxpbnRDb21tYW5kIiwic29ydFBhY2thZ2VKc29uUmVzdWx0IiwibGludGVyUmVzdWx0cyIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCIsInRoZW4iLCJwcmludGFibGVSZXN1bHRzIiwicHJpbnRDb21tYW5kT3V0cHV0IiwicHJpbnRDb21tYW5kSGVhZGVyIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsImRlc2NlbmRhbnRQcm9qZWN0cyIsIm93bmluZ1Byb2plY3QiLCJmaW5kT3duaW5nUHJvamVjdCIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwicnVudGltZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwicHJvbW90ZWREZXBzIiwidmVyc2lvbiIsInByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJyZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwiRklMRV9TQ0hFTUEiLCJkcml6emxlU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwibWlncmF0ZSIsIl9wcm9qZWN0IiwibWlncmF0ZURldiIsInJlbW92ZUNvbW1hbmQiLCJkYlBhdGgiLCJEQVRBQkFTRV9QQVRIIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwic2VlZCIsInNjcmlwdFBhdGgiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsIlBPU1NJQkxFX1BSSVNNQV9QQVRIUyIsInNjaGVtYVBhdGgiLCJnZXREYXRhYmFzZURpclBhdGgiLCJnZXRQcmlzbWFCYXNlRGlyIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJiYXNlRGlyIiwiY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInByaXNtYSIsInByaXNtYUNvbW1hbmQiLCJhbGlhc2VzIiwieWFyZ3MiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyIsInByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwib3JtIiwiZ2V0RGF0YWJhc2VPcm1TY3JpcHRzIiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsIm9ybVByb2plY3RCeVByb2plY3QiLCJvcm1Qcm9qZWN0Iiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwicGFzc3Rocm91Z2hBcmdzIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJhdmFpbGFibGUiLCJob3N0IiwicHJvYmVQb3J0IiwiaXNQb3J0QXZhaWxhYmxlIiwia2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzIiwia2lsbEZ1bmMiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJlcnIiLCJjbG9zZSIsImxpc3RlbiIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwibWlzZUFnZUtleVNlY3JldE9wdGlvbiIsIk1JU0VfQUdFX0tFWSIsInN0b3BBbmRTdGFydCIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsIkJhc2VTY3JpcHRzIiwic2hvdWxkV2FpdEFuZE9wZW5BcHAiLCJidWlsZERvY2tlciIsInN0YXJ0RGV2Iiwic3RhcnREZXZQcm90ZWN0ZWQiLCJ3YWl0QW5kT3BlbkFwcCIsInN0YXJ0UHJvZHVjdGlvbiIsInN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZCIsInN0YXJ0VGVzdCIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0IiwiZWNvc3lzdGVtQ29uZmlnUGF0aCIsImZpbmRFY29zeXN0ZW1Db25maWdQYXRoIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJ0ZXN0Q29tbWFuZCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwiYXJyYXkiLCJwb3NpdGlvbmFsIiwiTk9fQ09MT1IiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsImRlZmF1bHRVbml0VGFyZ2V0cyIsImdldERlZmF1bHRVbml0VGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJydW5Vbml0VGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwiZGVkdXBlTm9pc3lUZXN0T3V0cHV0IiwicmVjZW50UHJpbnRlZExpbmVzIiwicmVjZW50UHJpbnRlZExpbmVTZXQiLCJkZWR1cGVkTGluZXMiLCJsaW5lU3RhcnRJbmRleCIsImxpbmVFbmRJbmRleCIsIml0ZXJhdGVMaW5lcyIsIm5vcm1hbGl6ZWRMaW5lIiwibm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkiLCJwcmludGVkTGluZSIsImFyZUxpbmVzU2ltaWxhciIsInB1c2hSZWNlbnRQcmludGVkTGluZSIsImxpbmVTZXQiLCJyZW1vdmVkTGluZSIsInNoaWZ0IiwiZGVsZXRlIiwibWF4TGVuZ3RoIiwibWF4IiwiYWJzIiwiZGlzdGFuY2UiLCJoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyIsInRlc3RPbkNpQ29tbWFuZCIsInRlc3RPbkNpIiwidHJlZUtpbGxDb21tYW5kIiwiZGVtYW5kT3B0aW9uIiwidHlwZUNoZWNrQ29tbWFuZCIsInJlbW92ZWROZXh0RGlyIiwiYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMiLCJuZXh0RGlyUGF0aCIsInJtU3luYyIsImZvcmNlIiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInR5cGVDaGVjayIsInRjQ29tbWFuZCIsInZlcmlmeUNvZGVDb21tYW5kIiwiZnVsbCIsInJlcG9ydGVyIiwic3RhcnRlZEF0Iiwid2JEaXJQYXRoIiwibWtkaXJTeW5jIiwibG9nRmlsZVBhdGgiLCJsb2dGaWxlIiwib3BlblN5bmMiLCJvcmlnaW5hbFN0ZG91dFdyaXRlIiwiYmluZCIsIm9yaWdpbmFsU3RkZXJyV3JpdGUiLCJzdWNjZWVkZWQiLCJmaW5pc2hlZCIsInRlZVdyaXRlIiwiZmQiLCJmaW5pc2giLCJlbGFwc2VkVGltZSIsIm1pbGxpc2Vjb25kcyIsInNlY29uZHMiLCJyb3VuZCIsIm1pbnV0ZXMiLCJmbG9vciIsInJlbWFpbmluZ1NlY29uZHMiLCJmb3JtYXRFbGFwc2VkVGltZSIsInN1bW1hcnkiLCJjb2xvcmVkU3VtbWFyeSIsIndyaXRlU3luYyIsImNsb3NlU3luYyIsImZhaWwiLCJzdWNjZWVkIiwic3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIiLCJ2ZXJpZnlDb2RlIiwicnVuUHJvamVjdFRlc3QiLCJ2ZXJpZnlDb2RlRnVsbHkiLCJydW5QYWNrYWdlQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsInJ1bkluUHJvY2Vzc0NvbW1hbmQiLCJwcmludENvbW1hbmQiLCJ0cmltbWVkT3V0cHV0IiwicHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dCIsIm91dHB1dEZpbGUiLCJjaHVuayIsImVuY29kaW5nT3JDYWxsYmFjayIsImNhbGxiYWNrIiwiYnVmZmVyIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwicGFja2FnZUpzb25EaXIiLCJ1cmwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJoZWxwIiwic2h1dHRpbmdEb3duIl0sIm1hcHBpbmdzIjoiMmtCQU9PLE1BQU1BLEVBQTRCLENBQ3ZDQyxJQUFLLENBQ0hDLFlBQWEsMkJBQ2JDLEtBQU0sU0FFUixjQUFlLENBQ2JELFlBQ0Usd0xBQ0ZDLEtBQU0sVUFFUixtQkFBb0IsQ0FDbEJELFlBQWEsMEZBQ2JDLEtBQU0sV0FFUixtQkFBb0IsQ0FDbEJELFlBQWEsaUVBQ2JDLEtBQU0sVUFDTkMsU0FBUyxHQUVYLG1CQUFvQixDQUNsQkYsWUFBYSxxR0FDYkMsS0FBTSxVQUNOQyxTQUFT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RUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJN0QsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWhCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXFCLEVBQUVyQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXNCLEVBQUV0QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXVCLEVBQUV2QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTZCLEVBQUU3QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSThCLEVBQUU5QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRTZCLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJbkIsRUFBRTZCLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHa0IsR0FBRyxFQUFFQyxJQUFJLElBQUlyQixFQUFFSSxHQUFHaUIsR0FBRyxFQUFFRCxJQUFJLElBQUl0QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTNCLEVBQUVtQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJN0IsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJOUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFB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QWdCaXRCLEtBQUtDLFVBQzNELE1BQVEvcUIsRUFBR0ssV0FBV2pRLEVBQUtnRSxLQUFLeTJCLEVBQWdCLGtCQUM5Q0EsRUFBaUJ6NkIsRUFBS2lVLFFBQVF3bUIsR0FLaEMsT0FIb0Izc0IsS0FBSzJFLE1BQU03QyxFQUFHQyxhQUFhN1AsRUFBS2dFLEtBQUt5MkIsRUFBZ0IsZ0JBQWlCLFNBR3ZFbFUsT0FDckIsQ0FaV3FVLElBQ1JDLE9BQU96N0IsS0FhVixJQUFJMDdCLElBQWUsRUFDbkIsSUFBSyxNQUFNcDZCLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekNHLFFBQVFpRSxHQUFHcEUsRUFBUSxLQUNqQixJQUFJbzZCLEdBQUosQ0FFQUEsSUFBZSxFQUNmLElBQ0V0NkIsRUFBU0ssUUFBUUosSUFDbkIsQ0FBRSxNQUFPSCxHQUNQZ0YsUUFBUUUsS0FBSyxzQkFBc0IzRSxRQUFRSix3QkFBeUJILEVBQ3RFLENBQ0FPLFFBQVF1YixNQVJVIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzUsNiw3LDgsOV19
9
+ */const F=[..."0123456789abcdef"],B=[6,1536,393216,100663296],L=[0,8,16,24],M=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const z=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class U{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<L[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<L[3&i++],t[i>>2]|=(128|a>>6&63)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<L[3&i++],t[i>>2]|=(128|a>>12&63)<<L[3&i++],t[i>>2]|=(128|a>>6&63)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];W(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];W(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=F[o>>4&15]+F[15&o]+F[o>>12&15]+F[o>>8&15]+F[o>>20&15]+F[o>>16&15]+F[o>>28&15]+F[o>>24&15];i%e===0&&(t=z(t),W(t),s=0)}return r&&(o=t[s],a+=F[o>>4&15]+F[15&o],r>1&&(a+=F[o>>12&15]+F[o>>8&15]),r>2&&(a+=F[o>>20&15]+F[o>>16&15])),a}}const W=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,w,y,b,v,k,A,E,P,S,x,$,R,j,O,D,N,I,T,_,C,F,B,L,z,U,W,J,Y,V,q,G,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,J=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,F=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,B=e[26]<<25|e[27]>>>7,L=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,U=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~x&R,e[11]=S^~$&j,e[20]=T^~C&B,e[21]=_^~F&L,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=x^~R&O,e[13]=$^~j&D,e[22]=C^~B&z,e[23]=F^~L&U,e[32]=q^~K&Q,e[33]=G^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&A,e[5]=b^~k&E,e[14]=R^~O&N,e[15]=j^~D&I,e[24]=B^~z&W,e[25]=L^~U&J,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~I&S,e[26]=z^~W&T,e[27]=U^~J&_,e[36]=Q^~X&Y,e[37]=Z^~ee&V,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=A^~h&g,e[9]=E^~m&w,e[18]=N^~P&x,e[19]=I^~S&$,e[28]=W^~T&C,e[29]=J^~_&F,e[38]=X^~Y&q,e[39]=ee^~V&G,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=M[r],e[1]^=M[r+1]},J=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(V.decode(e))],create:([e])=>Y.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),Y=new TextEncoder,V=new TextDecoder("utf-8");function q(e,t=J){return JSON.stringify(H(e,t))}function G(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const K=[];function H(e,t=J){const n=G(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=G(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(K.length<e){const t=K.length;K.length=e,K.fill(-2,t,e)}return K.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,l=Array.from({length:c+1});l[0]=s,r[i]=l,o.set(n,i);for(let t=0;t<c;t++)l[t+1]=e(a[t])}}return i}(e),r}function Q(e,t){return function(e){return new U(512,B,512).update(e).hex()}(q([e,t]))}const Z=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=Q}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),l=Date.now();return(i!==c||l-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=l),o}}}({getCacheKey:Q});function X(e){return!!e&&"0"!==e&&"false"!==e}let ee;class te{static{[ee]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===o,A=3===o,E=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],R=A?"get":E||k?"set":"value";if(d?(u||k?x={get:_(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=b,u||_(x[R],r,P?"":R)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[R].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var j=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},T={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,j,T),I.v=1,y(i,"class decorators","return")&&(j=i);else if(T.static=l,T.private=d,i=T.access={has:d?p.bind():function(e){return r in e}},E||(i.get=d?P?function(e){return h(e),x.value}:S("get",0,h):function(e){return e[r]}),P||A||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=D.call(N,k?{get:x.get,set:x.set}:x[R],T),I.v=1,k){if("object"==typeof j&&j)(i=y(j.get,"accessor.get"))&&(x.get=i),(i=y(j.set,"accessor.set"))&&(x.set=i),(i=y(j.init,"accessor.init"))&&$.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(j,(u?"field":"method")+" decorators","return")&&(u?$.unshift(j):x[R]=j)}return o<2&&c.push(w($,l,1),w(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?x[R]:y.call.bind(x[R])):f(e,r,x)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(w(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;b(t?e:e.prototype,i,h,f?"#"+p:C(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return T(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[Z,3,"isBunAvailable"],[Z,3,"usesBunPackageManager"],[Z,3,"buildCommand"],[Z,3,"rootDirPath"],[Z,3,"dockerfile"],[Z,3,"hasDockerfile"],[Z,3,"hasSourceCode"],[Z,3,"name"],[Z,3,"dockerImageName"],[Z,3,"env"],[Z,3,"packageJson"],[Z,3,"packageJsonPath"],[Z,3,"hasPrisma"],[Z,3,"hasDrizzle"],[Z,3,"databaseOrm"],[Z,3,"hasVitest"],[Z,3,"hasOxlint"],[Z,3,"hasOxfmt"],[Z,3,"hasPrettier"],[Z,3,"hasPoetryLock"],[Z,3,"hasPubspecYaml"],[Z,3,"preferredLinter"],[Z,3,"hasPlaywrightConfig"],[Z,3,"skipLaunchingServerForPlaywright"],[Z,3,"dockerPackageJson"],[Z,3,"binExists"],[Z,3,"rootPackageJson"]]).e}argv=void ee(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const i=k(n);n.verbose&&!i&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const a=[],c={};for(const e of o){const o=[];for(const[n,s]of Object.entries(E(t.join(r,e))))n in c||n in process.env||(c[n]=s,o.push(n));a.push([e,o]),n.verbose&&!i&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||i||console.info(`Read env files: ${a.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(E(t.join(r,n.checkEnv))).filter(e=>!(e in c)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:c,processEnv:{}}).parsed??c,a]}(this.argv,this.dirPath);if(!k(this.argv))for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(X(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function ne(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new te(o,n,r)}async function re(e,t=!0,n){const r=oe(e,t,n);if(r)return{...r,descendants:r.root===r.self?await se(e,r.root,t):[r.self]}}function oe(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new te(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new te(s,n,r))}return{root:i,self:s}}async function se(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new te(r,n,o));return s}const ie=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ae=ie?"bun --bun run":"node",ce=ie?"bun":"yarn",le=ie?"bun --bun run":"yarn",de={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=ne(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?ie?"bun run build":"yarn build":void 0);if(!i)return console.info(l.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return ue(s,n),!0;const[a,d,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),l=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(l);const d=JSON.stringify(Object.entries(n.env).filter(([e])=>!pe.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(d),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(fe.some(t=>e.includes(t))||he.some(t=>e.endsWith(t)))&&!me.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!ue(s,n))return;n.dryRun||await e.promises.writeFile(d,u,"utf8");return!0}(n)}};function ue(e,t){if(console.info(l.green(`Run '${t.command}'`)),!t.dryRun){const n=o.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 pe=new Set(["CI","PWDEBUG","TMPDIR"]);const fe=["src/","public/"],he=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],me=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ge=new m,we={exitIfFailed:!0};async function ye(e,t,n,r=we){const o=ve(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||ke(o.printable,t,n.silent?"Command":"Start"),n.verbose&&ke(o.runnable,t,"Start (raw)",!0),n.dryRun)return Ae(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),d=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==d)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===d&&r.silentSuccessMessage&&console.info(l.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Ae(o.printable,d,r,{silentSuccess:n.silent}),d}function be(e,t,n,r=we){return ge.runAndWaitForReturnValue(async()=>{const o=ve(e,t);if(ke(o.printable,t,"Start (parallel)",!0),n.dryRun)return ke(o.printable,t,"Started (log)"),n.verbose&&ke(o.runnable,t,"Started (raw)",!0),Ae(o.printable,0,r),0;const s=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),ke(o.printable,t,"Started (log)"),n.verbose&&ke(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),Ae(o.printable,s.status,r),s.status??1})}function ve(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts")),r=r.trim();const o=Pe(r.replaceAll("YARN ",`${n} `)),s=Pe(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function ke(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function Ae(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(l.green(l.bold("Finished:"),e))}else console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function Ee(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function Pe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const Se={...v,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function xe(e){const t=[];for(const n of Object.keys(v)){const r=$e(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return!0===e.silent&&void 0===$e(e,"quiet-env")&&t.push("--quiet-env"),t}function $e(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Re={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...Se,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const t=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(l.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(ve(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Ee(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),l=t.map((n,o)=>new Promise(l=>{let d=!1;const u=n=>{d||(d=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Oe(t,"SIGTERM"))),l())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(je(e??void 0,t??void 0))})})),d=e=>{n??=e,i||(i=!0,a.push(Oe(t,e)))},u=()=>{d("SIGINT")},p=()=>{d("SIGTERM")},f=()=>{d("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(l),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return je(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(l.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function je(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Oe(e,t){const n=De(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Ne))return!1;await Ie(Math.min(100,t-Date.now()))}return!0}(n)&&De(n,"SIGKILL")}function De(e,t){const n=[];for(const r of e)try{if(!Te(r,t))continue;n.push(r),S(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function Ne(e){try{return process.kill(-e,0),!1}catch(e){return!!_e(e)}}async function Ie(e){await new Promise(t=>setTimeout(t,e))}function Te(e,t){try{return process.kill(-e,t),!0}catch(e){if(_e(e))return!1;throw e}}function _e(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const Ce={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));if(X(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(l.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Fe(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(Be(t))}(e,t))return;const n=function(e){return Be(e).trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Be(e){return e.replaceAll(/\(node:\d+\) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set\.\n\(Use `node --trace-warnings \.\.\.` to show where the warning was created\)\n?/g,"")}function Le(e){return e.map(e=>Me(e)).join(" ")}function Me(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const ze=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),Ue=new Set(["py"]),We=new Set(["dart"]),Je=new Set([...ze,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Ye=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ve=new Set([...Ye].filter(e=>!Je.has(e))),qe="!**/test{-,/}fixtures/**",Ge={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await Ke(e);t&&process.exit(t)}};async function Ke(e){if("win32"===process.platform)return console.error(l.red("This command is not supported on Windows.")),1;const n=await re(e,!1);if(!n)return console.error(l.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],d=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...lt(n.descendants,u,r));for(const{lintPath:t,project:d}of dt(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||Ue.has(p))){const e=i.get(d)??[];if(e.push(t),i.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||We.has(p))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if("directory"===r||pt(d,p)){const n=o.get(d)??[];if(n.push(t),o.set(d,n),e.format)if("directory"===r&&d.hasOxfmt){const e=s.get(d)??[];e.push(t),s.set(d,e),c.push(ct(t),qe)}else for(const e of at(d,t,r,p))if(d.hasOxfmt){const t=s.get(d)??[];t.push(e),s.set(d,t)}else c.push(e)}else if(e.format&&(Ye.has(p)||Je.has(p)))if(d.hasOxfmt&&Je.has(p)){const e=s.get(d)??[];e.push(t),s.set(d,e)}else Ye.has(p)&&c.push(t);else ut(p)&&!d.preferredLinter&&(console.error(l.red(`No linter found for ${d.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ve].join(",")}}`,qe]);for(const o of n){if(!ft(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Ye].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,forceColor:!e.printAllOutput},y=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=tt(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:ot(e,n),project:t}),y&&h.push({command:rt(n),project:t});for(const[e,t]of a)b&&m.push({command:it(t),project:e}),y&&h.push({command:st(t),project:e});if(y)for(const[e,t]of s)h.push({command:nt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=tt(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:ot(e),project:t}),t.hasPubspecYaml&&m.push({command:it(),project:t})}y&&(t.hasOxfmt&&h.push({command:nt(),project:t}),t.hasPoetryLock&&h.push({command:rt(),project:t}),t.hasPubspecYaml&&h.push({command:st(),project:t}))}const v=[];if(y){const t=await He(h,e,g);if(Ze(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(y){if(u.length>0&&n.self.hasPrettier){const t=await Qe(Le(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);Ze([t],e),v.push(t.exitCode)}if(p.length>0){const t=await Qe(Le(["YARN","sort-package-json","--",...p]),n.self,e,g);Ze([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await He(m,e,g);Ze(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function He(e,t,n){return Promise.all(e.map(({command:e,project:r})=>Qe(e,r,t,n)))}function Qe(e,t,n,r){if(n.silent){const o=ve(e,t);return function(e,t,n,r=we){return ge.runAndWaitForReturnValue(async()=>{const o=ve(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await O(o.runnable,void 0,{cwd:t.dirPath,env:Ee(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return be(e,t,n,r).then(e=>({exitCode:e}))}function Ze(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?Xe(e):(t.silent&&et(e.command,e.cwd),Fe(e.exitCode,e.output)))}function Xe(e){if(et(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(l.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function et(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}function tt(e,t,n){if("oxlint"===e.preferredLinter)return Le(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function nt(e){return Le(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function rt(e){const t=e&&e.length>0?e:["."];return[Le(["poetry","run","isort","--profile","black","--filter-files",...t]),Le(["poetry","run","black",...t])].join(" && ")}function ot(e,t){const n=t&&t.length>0?t:["."];return Le(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function st(e){return Le(["dart","format",...e&&e.length>0?e:["."]])}function it(e){return Le(["dart","analyze",...e&&e.length>0?e:["."]])}function at(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&ft(e)?[t,qe]:function(e,t){return e.hasOxfmt?Je.has(t):!!ft(e)||Ve.has(t)}(e,r)?[t]:[]}function ct(e){return t.join(e,`**/{.*/,}*.{${[...Ve].join(",")}}`)}function lt(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function dt(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function ut(e){return ze.has(e)||Ue.has(e)||We.has(e)}function pt(e,t){return"oxlint"===e.preferredLinter&&ze.has(t)}function ft(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}function*ht(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const mt=["@willbooster/wb","build-ts"],gt={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(n){const r=await re(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of ht("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(wt(n,r),yt(r),bt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(ce,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function wt(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of mt){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function yt(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function bt(e){delete e.private,delete e.publishConfig,delete e.prettier}const vt="file:";const kt=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(vt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},At="file:",Et=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Pt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function St(n){return Et.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const xt=new class{cleanUpLitestream(e){const t=Pt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${At}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Pt(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Pt(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(At))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=St(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Pt(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${At}${e} `}else if(e.env.DATABASE_URL?.startsWith(At)){const n=St(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${At}${r} `}}return`${o}PRISMA studio ${r}`}},$t={},Rt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(jt).command(Ot).command(Dt).command(Nt).command(It).command(Tt).command(_t).command(Ct).command(Ft).command(Bt).command(Lt).command(Mt).demandCommand().strict(!1),handler(){}},jt={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:$t,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma cleanup-litestream",t))await ye(xt.cleanUpLitestream(n),n,e)}},Ot={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:$t,async handler(e){const t=await Ut(e,"prisma");for(const{project:e}of Jt("prisma create-litestream-config",t))zt(e)}},Dt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:$t,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db deploy",t))await ye(Wt(r).deploy(o,n),o,e)}},Nt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:$t,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma deploy-force",t))await ye(xt.deployForce(n),n,e)}},It={command:"list-backups",describe:"List Litestream backups",builder:$t,async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma list-backups",t))await ye(xt.listBackups(n),n,e)}},Tt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:$t,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db migrate",t))await ye(Wt(r).migrate(o,n),o,e)}},_t={command:"migrate-dev",describe:"Create a migration file",builder:$t,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db migrate-dev",t))await ye(Wt(r).migrateDev(o,n),o,e)}},Ct={command:"reset",describe:"Reset DB",builder:$t,async handler(e){const t=await Ut(e),n=Yt(e);for(const{orm:r,project:o}of Jt("db reset",t))await ye(Wt(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of Jt("WB_ENV=test db reset",await Ut(e)))await ye(Wt(t).reset(r,n),r,e)}}},Ft={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...$t,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Ut(e,"prisma");for(const{project:n}of Jt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ye(xt.restore(n,t),n,e)}}},Bt={command:"seed",describe:"Populate DB with seed data",builder:{...$t,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Ut(e);for(const{orm:n,project:r}of Jt("db seed",t))await ye(Wt(n).seed(r,e.file),r,e)}},Lt={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...$t,"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 Ut(e),n=Yt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of Jt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ye(Wt(r).studio(o,t,n),o,e)}}},Mt={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await Ut(e),n=[(e.args?.join(" ")??"").trimEnd(),Yt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of Jt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await ye(t,o,e)}}};function zt(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function Ut(e,t){const n=await re(e);n||(console.error(l.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(l.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function Wt(e){return"prisma"===e?xt:kt}function*Jt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of ht(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Yt(e,t=[]){const n=[],r=Object.keys(Se),o=Object.values(Se).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Le([...n,...i])}const Vt={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=ne(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${l.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await ye(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},qt={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await re(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of ht("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await be(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ye("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await be("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await be(`poetry env use ${n}`,t,e),await ge.promiseAll(),await ye("poetry run pip install --upgrade pip",t,e),await ye("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ye(`${le} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ye(`${le} playwright install --with-deps`,r,e)}(e)}};function Gt(e){return e.silent?" > /dev/null":""}const Kt=new Set;async function Ht(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Xt(t,e))return!1}return!0}(e);n||await Qt(e,t);const r=async()=>{Kt.has(e)||(Kt.add(e),await Qt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Qt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await O("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await O("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Zt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ht(n,t),n}async function Xt(e,t){return new Promise(n=>{const r=y();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const en=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(Kt.has(e))return;Kt.add(e),ke(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--publish ${e.env.PORT}: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 tn{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return en.buildImage(e,t)}async startDev(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?Le(["YARN","wb","concurrently",...xe(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?Le(["YARN","wb","concurrently",...xe(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Zt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Zt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Le(["YARN","wb","concurrently",...xe(t),"--kill-others-on-fail",en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...[...e.hasPrisma?[xt.migrate(e)]:[],...e.hasDrizzle?[kt.migrate(e)]:[]].flatMap(e=>e.split("&&")),...r].filter(Boolean).map(e=>`${e} ${Gt(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,en.stopAndStart(e),n)}async testStart(e,t){return await Zt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Me(r)}`} ${Le(["YARN","wb","concurrently",...xe(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Zt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return nn([...o,...e,...r],n);const i=e.slice(1),a=rn(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return nn([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Le(["YARN","wb","concurrently",...xe(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Le(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Le(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function nn(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Le(e):Le([...e,"--max-failures=1"]):Le(e)}function rn(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;on.has(o)?t="required":sn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&an.has(e)&&(t="required");continue}n.push(r)}}return n}const on=new Set(["--browser","--config","--grep","--grep-invert","--global-timeout","--max-failures","--output","--project","--repeat-each","--reporter","--retries","--shard","--test-list","--test-list-invert","--timeout","--trace","--tsconfig","--ui-host","--ui-port","--ui-title","--workers"]),sn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),an=new Set(["-c","-g","-j"]);const cn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const ln=new class extends tn{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const o=await Zt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return Le(["YARN","wb","concurrently",...xe(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const dn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const un=new class extends tn{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${ae} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${en.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const pn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const fn=new class extends tn{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},hn=["express","fastify","elysia","hono"],mn={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 | test",type:"string",alias:"m"}},gn={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(mn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Me(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Me(String(e))).join(" ")}(e);const t=await re(e);t||(console.error(l.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=cn;else if(t.next)o=dn;else if(r["@remix-run/dev"])o=pn;else if(r.vite)o=fn;else if(hn.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=ln;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=un}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ye(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ye(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ye(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ye(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ye(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},wn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),yn={e2e:{description:"How to run E2E tests",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},bail:{description:"Stop tests after the first failure",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"}},bn={array:!0,description:"Unit or E2E test target paths",type:"string"},vn={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options(yn).positional("targets",bn),async handler(e){process.exit(await kn(e))}};async function kn(n,r={}){const o=await re(n);if(!o)return console.error(l.red("No project found.")),1;process.env.FORCE_COLOR||="3",delete process.env.NO_COLOR,process.env.WB_ENV||="test";const s=n.targets??[],i=n["--"]??[],{shouldRunE2e:a,shouldRunUnit:c}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(s,i);for(const l of o.descendants){const o=l.packageJson.dependencies??{},d=l.packageJson.devDependencies??{};let u;u=o.blitz?cn:o.next?dn:d["@remix-run/dev"]?pn:d.vite?fn:hn.some(e=>o[e])&&!o["firebase-functions"]?ln:un,console.info(`Running "test" for ${l.name} ...`);const p=An(l);if(c&&!1!==p){const e=s.filter(e=>e.includes("/unit")),t=e.length>0?e:p.length>0?p:void 0,o={...n,targets:t},i=await Sn(u.testUnit(l,o),l,n,{exitIfFailed:r.exitIfFailed,timeout:n.unitTimeout});if(0!==i)return i}if(!a||!e.existsSync(t.join(l.dirPath,"test","e2e")))continue;const f=s.filter(e=>e.includes("/e2e")),h={...n,targets:f.length>0?f:void 0};switch(n.e2e){case"headless":{const e=await Pn(await u.testE2EProduction(l,h,{playwrightArgs:On(f,i),forwardedPlaywrightArgs:i}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"headless-dev":{const e=await Pn(await u.testE2EDev(l,h,{playwrightArgs:On(f,i),forwardedPlaywrightArgs:i}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"docker":{const e=await En(l,h,u,On(f,i),i,r);if(0!==e)return e;continue}case"docker-debug":{const e=await En(l,h,u,On(f,i,["--debug"]),i,r);if(0!==e)return e;continue}}if(o.blitz||o.next||d["@remix-run/dev"]||d.vite)switch(n.e2e){case"headed":{const e=await Pn(await u.testE2EProduction(l,h,{playwrightArgs:On(f,i,["--headed"]),forwardedPlaywrightArgs:i}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"headed-dev":{const e=await Pn(await u.testE2EDev(l,h,{playwrightArgs:On(f,i,["--headed"]),forwardedPlaywrightArgs:i}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"debug":{const e=await Pn(await u.testE2EProduction(l,h,{playwrightArgs:On(f,i,["--debug"]),forwardedPlaywrightArgs:i}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"generate":{const e=await Pn(await u.testE2EProduction(l,h,{playwrightArgs:["codegen",`http://localhost:${l.env.PORT}`]}),l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"trace":{const e=await Pn("BUN playwright show-trace",l,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}}}return 0}function An(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function En(e,t,n,r,o,s={}){e.env.WB_DOCKER||="1";const i=await ye(`${n.buildDocker(e,"test")}${Gt(t)}`,e,t,{exitIfFailed:s.exitIfFailed});if(0!==i)return i;const a=await Pn(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),c=await ye(en.stop(e),e,t,{exitIfFailed:s.exitIfFailed});return 0!==a?a:c}function Pn(e,t,n,r={}){return ye(e,t,n,{...r,processSilentOutput:xn})}function Sn(e,t,n,r={}){return ye(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function xn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Rn(o);n.has(e)||(t.some(t=>jn(t,e))||($n(t,n,e),r.push(o)))}return r.join("\n")}function $n(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Rn(e){return e.replaceAll(wn,"").trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,"").replaceAll(/\(node:\d+\)/g,"(node:<number>)").replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,"<timestamp>").replaceAll(/([?&]cache=)\d+/g,"$1<number>")}function jn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&b(e,t)/n<=.05}function On(e,t=[],n=[]){const r=rn(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const Dn={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await re(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?cn:r.next?dn:s["@remix-run/dev"]?pn:s.vite?fn:hn.some(e=>r[e])&&!r["firebase-functions"]?ln:un,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await be(en.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await be(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await be(await i.testStart(o,n),o,n),await ge.promiseAll(),a&&(o.env.WB_DOCKER||="1",await ye(`${i.buildDocker(o,"test")}${Gt(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ye(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await ye(en.stop(o),o,n)}}}(n)}};const Nn={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);S(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},In={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await re(n,!1);if(!r)return console.error(l.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await be(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(l.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(l.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(l.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const Tn={...In,command:"tc"},_n={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=oe(n,!1);r||(console.error(l.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let d=!1,u=!1;process.stdout.write=Bn(process.stdout.fd,i),process.stderr.write=Bn(process.stderr.fd,i),console.info(l.cyan(l.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${d?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=d?l.green(n):l.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{d=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{d=!0}}}(n);try{await Cn(n,r),await async function(e,t){const n={...t,_:["test"],e2e:"headless",silent:!0},r=await kn(n,{exitIfFailed:!1});if(0===r)return;e.packageJson.scripts?.["db-reset"]||(console.info(l.red(l.bold(`Failed (exit code ${r}):`),"test")),process.exit(r));console.info(l.yellow('Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.')),await Fn(`${ce} db-reset`,e,t,{printRawOutput:!0});const o=await kn(n,{exitIfFailed:!1});0!==o&&(console.info(l.red(l.bold(`Failed (exit code ${o}):`),"test after db-reset retry")),process.exit(o));console.info(l.green("Tests passed after db-reset retry."))}(n,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):Cn(r.self,n))}};async function Cn(e,t){await Fn(`${ce} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await Fn(`${ce} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+l.cyan(l.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>Ke({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function Fn(e,t,n,r={}){if(function(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await O(e,void 0,{cwd:t.dirPath,env:Ee(t.env,{forceColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${ce} install`||e===`${ce} gen-code`))return void console.info(l.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(l.red(l.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function Bn(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(Se).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!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(_n).command(de).command(Re).command(Ce).command(Ge).command(gt).command(Rt).command(Vt).command(qt).command(gn).command(vn).command(Dn).command(Nn).command(In).command(Tn).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;let Ln=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!Ln){Ln=!0;try{S(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG91dHB1dE9wdGlvbnMgPSBhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHF1aWV0RW52PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9O1xuICByZXR1cm4gb3V0cHV0T3B0aW9ucy5xdWlldEVudiA9PT0gdHJ1ZSB8fCAob3V0cHV0T3B0aW9ucy5xdWlldEVudiAhPT0gZmFsc2UgJiYgb3V0cHV0T3B0aW9ucy5zaWxlbnQgPT09IHRydWUpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGlzRXJybm9FeGNlcHRpb24gfSBmcm9tICcuL2Vycm5vLmpzJztcbmltcG9ydCB7IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCwgY29sbGVjdERlc2NlbmRhbnRQaWRzIGFzIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAgfSBmcm9tICcuL3Byb2Nlc3NUcmVlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVLaWxsKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwaWQpIHx8IHBpZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBpZDogJHtwaWR9YCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGtpbGxUcmVlT25XaW5kb3dzKHBpZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzY2VuZGFudHMgPSBjb2xsZWN0RGVzY2VuZGFudFBpZHMocGlkKTtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkLCBkZXNjZW5kYW50cyk7XG4gIGZvciAoY29uc3QgdGFyZ2V0UGlkIG9mIHRhcmdldFBpZHMpIHtcbiAgICBraWxsSWZOZWVkZWQodGFyZ2V0UGlkLCBzaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxJZk5lZWRlZChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIHNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsVHJlZU9uV2luZG93cyhwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJ1bkNvbW1hbmQoJ3Rhc2traWxsJywgWycvUElEJywgU3RyaW5nKHBpZCksICcvVCcsICcvRiddLCB7XG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBydW5Db21tYW5kKFxuICAgICdwcycsXG4gICAgWyctQW8nLCAncGlkPSxwcGlkPSddLFxuICAgIC8vIEtlZXAgY29tbWFuZCBib3VuZGVkIHNvIHdhdGNoLW1vZGUga2lsbCBsb29wcyBjYW5ub3QgaGFuZyB0aGlzIHBhdGguXG4gICAgeyBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LCB0aW1lb3V0OiAyMDAwIH1cbiAgKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChzdGRvdXQpO1xuICByZXR1cm4gY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcChyb290UGlkLCBjaGlsZHJlbkJ5UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQ6IG51bWJlciwgZGVzY2VuZGFudHM6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB0YXJnZXRQaWRzID0gZGVzY2VuZGFudHMudG9SZXZlcnNlZCgpO1xuICB0YXJnZXRQaWRzLnB1c2gocGlkKTtcbiAgcmV0dXJuIHRhcmdldFBpZHM7XG59XG5cbmZ1bmN0aW9uIHJ1bkNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiB7IHRpbWVvdXQ6IG51bWJlcjsgbWF4QnVmZmVyOiBudW1iZXIgfVxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogb3B0aW9ucz8ubWF4QnVmZmVyLFxuICAgICAgdGltZW91dDogb3B0aW9ucz8udGltZW91dCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVycjogJycgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBzdGRlcnIgPSBleHRyYWN0U3RkZXJyKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIGFyZ3MsIHN0ZGVyciwgdG9FeGl0Q29kZShlcnJvcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tYW5kRXhlY3V0aW9uRXJyb3IpIHtcbiAgICByZXR1cm4gL25vIHN1Y2ggcHJvY2Vzc3xub3QgZm91bmR8bm90IHJlY29nbml6ZWR8dGhlcmUgaXMgbm8gcnVubmluZyBpbnN0YW5jZS9pLnRlc3QoZXJyb3Iuc3RkZXJyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRvRXhpdENvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3RkZXJyKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgZXJyb3IgPT09IG51bGwgfHwgISgnc3RkZXJyJyBpbiBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzdGRlcnIgPSAoZXJyb3IgYXMgUmVjb3JkPCdzdGRlcnInLCB1bmtub3duPikuc3RkZXJyO1xuICBpZiAodHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RkZXJyO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RkZXJyKSkge1xuICAgIHJldHVybiBzdGRlcnIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBzdGRlcnI6IHN0cmluZywgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoYENvbW1hbmQgZmFpbGVkOiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbW1hbmRFeGVjdXRpb25FcnJvcic7XG4gICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChwc091dHB1dDogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyW10+IHtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHBzT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSAvXlxccyooXFxkKylcXHMrKFxcZCspXFxzKiQvLmV4ZWMobGluZSk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFBpZCA9IE51bWJlcihtYXRjaGVkWzFdKTtcbiAgICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIobWF0Y2hlZFsyXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50LmdldChwYXJlbnRQaWQpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZFBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHBhcmVudFBpZCwgW2NoaWxkUGlkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbkJ5UGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlciwgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgbnVtYmVyW10+KTogbnVtYmVyW10ge1xuICBjb25zdCBkZXNjZW5kYW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcXVldWUgPSBbLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHJvb3RQaWQpID8/IFtdKV07XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHBpZCA9IHF1ZXVlW2luZGV4XSBhcyBudW1iZXI7XG4gICAgaW5kZXggKz0gMTtcbiAgICBkZXNjZW5kYW50cy5wdXNoKHBpZCk7XG4gICAgcXVldWUucHVzaCguLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocGlkKSA/PyBbXSkpO1xuICB9XG4gIHJldHVybiBkZXNjZW5kYW50cztcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG4sZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuVG9vbFZlcnNpb24oKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGZtdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGZtdCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByZXR0aWVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSkgPz8gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnJvb3RQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5wYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFja2FnZUpzb24pIHJldHVybjtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoXG4gICAgICAgICdZQVJOICcsXG4gICAgICAgICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYFxuICAgICAgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICAgIGZvcmNlQ29sb3I6IHR5cGVvZiBhcmd2LmZvcmNlQ29sb3IgPT09ICdib29sZWFuJyA/IGFyZ3YuZm9yY2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpLCBmb3JjZUNvbG9yOiBvcHRpb25zLmZvcmNlQ29sb3IgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZSwgb3V0cHV0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQpO1xuICBpZiAobm9ybWFsaXplZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhpdENvZGUgIT09IDAgfHwgaGFzV2FybmluZ091dHB1dChyZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbW92ZU5vQ29sb3JXYXJuaW5nKG91dHB1dCkudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vQ29sb3JXYXJuaW5nKG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC5yZXBsYWNlQWxsKFxuICAgIC9cXChub2RlOlxcZCtcXCkgV2FybmluZzogVGhlICdOT19DT0xPUicgZW52IGlzIGlnbm9yZWQgZHVlIHRvIHRoZSAnRk9SQ0VfQ09MT1InIGVudiBiZWluZyBzZXRcXC5cXG5cXChVc2UgYG5vZGUgLS10cmFjZS13YXJuaW5ncyBcXC5cXC5cXC5gIHRvIHNob3cgd2hlcmUgdGhlIHdhcm5pbmcgd2FzIGNyZWF0ZWRcXClcXG4/L2csXG4gICAgJydcbiAgKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXQgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUgIT09IDApIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuLy8gVGhlc2UgdG9vbHMgYXJlIGRlY2xhcmVkIGFzIGRldkRlcGVuZGVuY2llcyBpbiBzb3VyY2UgcmVwb3MsIGJ1dCBvcHRpbWl6ZWQgRG9ja2VyXG4vLyBwYWNrYWdlLmpzb24gZmlsZXMgc3RpbGwgbmVlZCB0aGVtIGZvciBpbi1pbWFnZSBjb2RlZ2VuL2J1aWxkIHN0ZXBzLlxuY29uc3QgcnVudGltZURldkRlcGVuZGVuY2llcyA9IFsnQHdpbGxib29zdGVyL3diJywgJ2J1aWxkLXRzJ107XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLlxuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uKTtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBwYWNrYWdlcyBmb3IgdGhhdCBsYXRlciBpbi1pbWFnZSBidWlsZCBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIG1pZ3JhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBEQVRBQkFTRV9QQVRIIG9yIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGBZQVJOIGRyaXp6bGUta2l0ICR7ZnVsbENvbW1hbmR9YDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9XG4gICAgICBlY29zeXN0ZW1Db25maWdQYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7YXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gLnRyaW0oKSxcbiAgICAgICAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXTtcblxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgIF07XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBkZWxldGUgcHJvY2Vzcy5lbnYuTk9fQ09MT1I7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IGFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogYXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IGhhc0RvY2tlcmZpbGUgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGU7XG4gICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBDb25maXJtIGRldiBzZXJ2ZXIgc3RhcnR1cCBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIHByb2plY3RzIHdpdGggRTJFIHRlc3RzLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IGhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gICAgfVxuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICB9XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgfVxuICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldycpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzZ28gLS1ub0VtaXQnXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IChhcmd2LmZ1bGwgPyB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndikgOiB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YpO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdjbGVhbnVwJyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgcHJpbnRBbGxPdXRwdXQ6IHRydWUsXG4gICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHsgLi4uYXJndiwgXzogWyd0ZXN0J10sIGUyZTogJ2hlYWRsZXNzJywgc2lsZW50OiB0cnVlIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3Y7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGRiLXJlc2V0YCwgcHJvamVjdCwgYXJndiwgeyBwcmludFJhd091dHB1dDogdHJ1ZSB9KTtcblxuICBjb25zdCByZXRyeUV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAocmV0cnlFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtyZXRyeUV4aXRDb2RlfSk6YCksICd0ZXN0IGFmdGVyIGRiLXJlc2V0IHJldHJ5JykpO1xuICAgIHByb2Nlc3MuZXhpdChyZXRyeUV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1Rlc3RzIHBhc3NlZCBhZnRlciBkYi1yZXNldCByZXRyeS4nKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBmb3JjZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIChjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfHwgY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3Rkb3V0LmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUocHJvY2Vzcy5zdGRlcnIuZmQsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG91dHB1dEZpbGU6IG51bWJlciwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICBmcy53cml0ZVN5bmMob3V0cHV0RmlsZSwgYnVmZmVyKTtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZW5jb2RpbmdPckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrPy4oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsInNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQiLCJhcmd2Iiwib3V0cHV0T3B0aW9ucyIsInF1aWV0RW52Iiwic2lsZW50IiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJxdWlldCIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsInN0ZG91dFByaW50ZXIiLCJjcmVhdGVSZWFsdGltZVByaW50ZXIiLCJvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmciLCJzdGRlcnJQcmludGVyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZmx1c2giLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwiQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAiLCJSZWdFeHAiLCJmcm9tQ29kZVBvaW50Iiwic3RyZWFtIiwib21pdEJsYW5rTGluZXMiLCJwZW5kaW5nIiwibGluZXMiLCJwb3AiLCJpc0JsYW5rTGluZSIsInJlcGxhY2VBbGwiLCJ0cmltIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImhhc0J1blRvb2xWZXJzaW9uIiwidXNlc0J1blBhY2thZ2VNYW5hZ2VyIiwiaGFzQnVuTG9ja2ZpbGUiLCJoYXNCdW5QYWNrYWdlTWFuYWdlciIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJzb21lIiwiZmlsZU5hbWUiLCJleGlzdHNTeW5jIiwicGFja2FnZU1hbmFnZXIiLCJyb290UGFja2FnZUpzb24iLCJwYWNrYWdlSnNvbiIsInN0YXJ0c1dpdGgiLCJidWlsZENvbW1hbmQiLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwic2hvdWxkU3VwcHJlc3NPdXRwdXQiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmluZCIsImdldERlcGVuZGVuY3lWZXJzaW9uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0Iiwib21pdFNpbGVudFN0YXJ0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkiLCJ3cm90ZVNpbGVudFByb2dyZXNzIiwicHJvZ3Jlc3NUaW1lciIsInNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcyIsInNldEludGVydmFsIiwiY29uZmlndXJlRW52IiwiZmluYWxseSIsImNsZWFySW50ZXJ2YWwiLCJvdXRwdXQiLCJzaWxlbnRTdWNjZXNzTWVzc2FnZSIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsInByaW50UmF3T3V0cHV0Iiwib3V0IiwicHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsInByaW50T3B0aW9ucyIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsImZvcmNlS2lsbFByb21pc2VzIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJlc3VsdCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJmb3JjZUtpbGxQaWRzIiwic2lnbmFsUGlkcyIsInRvQ2hpbGRQaWRzIiwicGlkcyIsImRlYWRsaW5lIiwiZXZlcnkiLCJpc1Byb2Nlc3NHcm91cEdvbmUiLCJzbGVlcCIsIk1hdGgiLCJtaW4iLCJ3YWl0Rm9yRm9yY2VLaWxsIiwic2lnbmFsZWRQaWRzIiwia2lsbFByb2Nlc3NHcm91cCIsIm1zIiwic2V0VGltZW91dCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJwcmludEJ1ZmZlcmVkT3V0cHV0IiwiaGFzV2FybmluZ091dHB1dCIsInJlbW92ZU5vQ29sb3JXYXJuaW5nIiwic2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCIsIm5vcm1hbGl6ZWRPdXRwdXQiLCJub3JtYWxpemVCdWZmZXJlZE91dHB1dCIsImJ1aWxkU2hlbGxDb21tYW5kIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwibGludCIsImZpbGVzIiwibGludFRhcmdldHMiLCJnZXRMaW50VGFyZ2V0RmlsZXMiLCJsaW50RmlsZVBhdGhzQnlQcm9qZWN0Iiwib3hmbXRGaWxlUGF0aHNCeVByb2plY3QiLCJweXRob25GaWxlUGF0aHNCeVByb2plY3QiLCJkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0IiwicHJldHRpZXJGaWxlUGF0aHMiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsInByZXR0aWVyQXJncyIsInNvcnRQYWNrYWdlSnNvbkFyZ3MiLCJtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIiwiZmlsZSIsImZpbGVLaW5kIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0TGludFRhcmdldEZpbGVLaW5kIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyIsImxpbnRQYXRoIiwiZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyIsInB5dGhvbkZpbGVQYXRocyIsImRhcnRGaWxlUGF0aHMiLCJzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24iLCJsaW50RmlsZVBhdGhzIiwib3hmbXRGaWxlUGF0aHMiLCJidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4iLCJmb3JtYXR0ZXJQYXRoIiwiYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MiLCJpc1BvdGVudGlhbExpbnRUYXJnZXQiLCJzZWxmRGlyUGF0aCIsIm5lZWRzUHJldHRpZXIiLCJwcm9qZWN0UGF0dGVybiIsImJ1aWxkUHJldHRpZXJBcmdzIiwiZm9ybWF0dGVyQ29tbWFuZHMiLCJsaW50ZXJDb21tYW5kcyIsImxpbnRSdW5PcHRpb25zIiwicHJpbnRBbGxPdXRwdXQiLCJzaG91bGRSdW5Gb3JtYXR0ZXJzIiwic2hvdWxkUnVuTGludGVycyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZFBvZXRyeUxpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kIiwiYnVpbGREYXJ0TGludENvbW1hbmQiLCJidWlsZERhcnRGb3JtYXRDb21tYW5kIiwiYnVpbGRPeGZtdENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiZm9ybWF0dGVyUmVzdWx0cyIsInJ1bkxpbnRDb21tYW5kcyIsInByaW50U2lsZW50TGludE91dHB1dHMiLCJwcmV0dGllclJlc3VsdCIsInJ1bkxpbnRDb21tYW5kIiwic29ydFBhY2thZ2VKc29uUmVzdWx0IiwibGludGVyUmVzdWx0cyIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCIsInRoZW4iLCJwcmludGFibGVSZXN1bHRzIiwicHJpbnRDb21tYW5kT3V0cHV0IiwicHJpbnRDb21tYW5kSGVhZGVyIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsImRlc2NlbmRhbnRQcm9qZWN0cyIsIm93bmluZ1Byb2plY3QiLCJmaW5kT3duaW5nUHJvamVjdCIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwicnVudGltZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwicHJvbW90ZWREZXBzIiwidmVyc2lvbiIsInByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJyZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwiRklMRV9TQ0hFTUEiLCJkcml6emxlU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwibWlncmF0ZSIsIl9wcm9qZWN0IiwibWlncmF0ZURldiIsInJlbW92ZUNvbW1hbmQiLCJkYlBhdGgiLCJEQVRBQkFTRV9QQVRIIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwic2VlZCIsInNjcmlwdFBhdGgiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsIlBPU1NJQkxFX1BSSVNNQV9QQVRIUyIsInNjaGVtYVBhdGgiLCJnZXREYXRhYmFzZURpclBhdGgiLCJnZXRQcmlzbWFCYXNlRGlyIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJiYXNlRGlyIiwiY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInByaXNtYSIsInByaXNtYUNvbW1hbmQiLCJhbGlhc2VzIiwieWFyZ3MiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyIsInByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwib3JtIiwiZ2V0RGF0YWJhc2VPcm1TY3JpcHRzIiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsIm9ybVByb2plY3RCeVByb2plY3QiLCJvcm1Qcm9qZWN0Iiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwicGFzc3Rocm91Z2hBcmdzIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJhdmFpbGFibGUiLCJob3N0IiwicHJvYmVQb3J0IiwiaXNQb3J0QXZhaWxhYmxlIiwia2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzIiwia2lsbEZ1bmMiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJlcnIiLCJjbG9zZSIsImxpc3RlbiIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwibWlzZUFnZUtleVNlY3JldE9wdGlvbiIsIk1JU0VfQUdFX0tFWSIsInN0b3BBbmRTdGFydCIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsIkJhc2VTY3JpcHRzIiwic2hvdWxkV2FpdEFuZE9wZW5BcHAiLCJidWlsZERvY2tlciIsInN0YXJ0RGV2Iiwic3RhcnREZXZQcm90ZWN0ZWQiLCJ3YWl0QW5kT3BlbkFwcCIsInN0YXJ0UHJvZHVjdGlvbiIsInN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZCIsInN0YXJ0VGVzdCIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0IiwiZWNvc3lzdGVtQ29uZmlnUGF0aCIsImZpbmRFY29zeXN0ZW1Db25maWdQYXRoIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJ0ZXN0Q29tbWFuZCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwiYXJyYXkiLCJwb3NpdGlvbmFsIiwiTk9fQ09MT1IiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsImRlZmF1bHRVbml0VGFyZ2V0cyIsImdldERlZmF1bHRVbml0VGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJydW5Vbml0VGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwiYnVpbGRFeGl0Q29kZSIsInRlc3RFeGl0Q29kZSIsInN0b3BFeGl0Q29kZSIsImRlZHVwZU5vaXN5VGVzdE91dHB1dCIsInJlY2VudFByaW50ZWRMaW5lcyIsInJlY2VudFByaW50ZWRMaW5lU2V0IiwiZGVkdXBlZExpbmVzIiwibGluZVN0YXJ0SW5kZXgiLCJsaW5lRW5kSW5kZXgiLCJpdGVyYXRlTGluZXMiLCJub3JtYWxpemVkTGluZSIsIm5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5IiwicHJpbnRlZExpbmUiLCJhcmVMaW5lc1NpbWlsYXIiLCJwdXNoUmVjZW50UHJpbnRlZExpbmUiLCJsaW5lU2V0IiwicmVtb3ZlZExpbmUiLCJzaGlmdCIsImRlbGV0ZSIsIm1heExlbmd0aCIsIm1heCIsImFicyIsImRpc3RhbmNlIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzIiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0eXBlQ2hlY2siLCJ0Y0NvbW1hbmQiLCJ2ZXJpZnlDb2RlQ29tbWFuZCIsImZ1bGwiLCJyZXBvcnRlciIsInN0YXJ0ZWRBdCIsIndiRGlyUGF0aCIsIm1rZGlyU3luYyIsImxvZ0ZpbGVQYXRoIiwibG9nRmlsZSIsIm9wZW5TeW5jIiwib3JpZ2luYWxTdGRvdXRXcml0ZSIsImJpbmQiLCJvcmlnaW5hbFN0ZGVycldyaXRlIiwic3VjY2VlZGVkIiwiZmluaXNoZWQiLCJ0ZWVXcml0ZSIsImZkIiwiZmluaXNoIiwiZWxhcHNlZFRpbWUiLCJtaWxsaXNlY29uZHMiLCJzZWNvbmRzIiwicm91bmQiLCJtaW51dGVzIiwiZmxvb3IiLCJyZW1haW5pbmdTZWNvbmRzIiwiZm9ybWF0RWxhcHNlZFRpbWUiLCJzdW1tYXJ5IiwiY29sb3JlZFN1bW1hcnkiLCJ3cml0ZVN5bmMiLCJjbG9zZVN5bmMiLCJmYWlsIiwic3VjY2VlZCIsInN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyIiwidmVyaWZ5Q29kZSIsInRlc3RBcmd2IiwicnVuUGFja2FnZUNvbW1hbmQiLCJyZXRyeUV4aXRDb2RlIiwicnVuUHJvamVjdFRlc3QiLCJ2ZXJpZnlDb2RlRnVsbHkiLCJhbGxvd0ZhaWx1cmUiLCJydW5JblByb2Nlc3NDb21tYW5kIiwicHJpbnRDb21tYW5kIiwidHJpbW1lZE91dHB1dCIsInByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQiLCJvdXRwdXRGaWxlIiwiY2h1bmsiLCJlbmNvZGluZ09yQ2FsbGJhY2siLCJjYWxsYmFjayIsImJ1ZmZlciIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6IjJrQkFPTyxNQUFNQSxFQUE0QixDQUN2Q0MsSUFBSyxDQUNIQyxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxtQkFBb0IsQ0FDbEJGLFlBQWEscUdBQ2JDLEtBQU0sVUFDTkMsU0FBUyxHQUVYLFlBQWEsQ0FDWEYsWUFBYSxxRkFDYkMsS0FBTSxTQUNOQyxRQUFTLGdCQUVYLFlBQWEsQ0FDWEYsWUFBYSwwQ0FDYkMsS0FBTSxXQUVSRSxRQUFTLENBQ1BILFlBQWEsc0NBQ2JDLEtBQU0sVUFDTkcsTUFBTyxNQTZFSixTQUFTQyxFQUFnQ0MsR0FDOUMsTUFBTUMsRUFBZ0JELEVBQ3RCLE9BQWtDLElBQTNCQyxFQUFjQyxXQUFpRCxJQUEzQkQs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QUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRUcsR0FBR2tCLEdBQUcsRUFBRUMsSUFBSSxJQUFJckIsRUFBRUksR0FBR2lCLEdBQUcsRUFBRUQsSUFBSSxJQUFJdEIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR0csR0FBRyxFQUFFQyxJQUFJLElBQUkzQixFQUFFbUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk1QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVxQixHQUFHUSxHQUFHLEVBQUVDLElBQUksSUFBSTdCLEVBQUVxQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTlCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUd4QixHQUFHLEVBQUVFLElBQUksSUFBSUosRUFBRTJCLEdBQUd2QixHQUFHLEVBQUVGLElBQUksSUFBSUosRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxF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