@willbooster/wb 13.5.1 → 13.5.2

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 +14 -11
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 d from"chalk";import{globby as l}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 b from"node:fs/promises";import{createServer as w}from"node:net";const y={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const v=new Map;function k(e){const n=v.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return v.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function A(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{S("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if($(e))return;throw e}}(e);const n=function(e){const{stdout:t}=S("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)P(e,t)}function P(e,t){try{process.kill(e,t)}catch(e){if($(e))return;throw e}}function S(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 R(e,t,r,function(e){if(E(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 $(e){return!(!E(e)||"ESRCH"!==e.code)||e instanceof R&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class R extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function x(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="";s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let d=!1;const l=()=>{if(!d&&s.pid){d=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{A(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",l);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",l);for(const e of u){const t=()=>{l(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),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)}})}function j(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 N(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 D(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 y from"node:fs/promises";import{createServer as b}from"node:net";const w={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const v=new Map;function k(e){const n=v.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return v.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function A(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{S("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(x(e))return;throw e}}(e);const n=function(e){const{stdout:t}=S("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)P(e,t)}function P(e,t){try{process.kill(e,t)}catch(e){if(x(e))return;throw e}}function S(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 $(e,t,r,function(e){if(E(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 x(e){return!(!E(e)||"ESRCH"!==e.code)||e instanceof $&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class $ extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function R(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="";s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let l=!1;const d=()=>{if(!l&&s.pid){l=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{A(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",d);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",d);for(const e of u){const t=()=>{d(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),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)}})}function j(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 N(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 D(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 T=[..."0123456789abcdef"],I=[6,1536,393216,100663296],O=[0,8,16,24],_=[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 C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class B{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<<O[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<O[3&i++],t[i>>2]|=(128|a>>6&63)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<O[3&i++],t[i>>2]|=(128|a>>12&63)<<O[3&i++],t[i>>2]|=(128|a>>6&63)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[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];L(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];L(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+=T[o>>4&15]+T[15&o]+T[o>>12&15]+T[o>>8&15]+T[o>>20&15]+T[o>>16&15]+T[o>>28&15]+T[o>>24&15];i%e===0&&(t=C(t),L(t),s=0)}return r&&(o=t[s],a+=T[o>>4&15]+T[15&o],r>1&&(a+=T[o>>12&15]+T[o>>8&15]),r>2&&(a+=T[o>>20&15]+T[o>>16&15])),a}}const L=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,b,w,y,v,k,E,A,P,S,$,R,x,j,N,D,T,I,O,C,B,L,F,J,U,W,M,z,Y,V,G,K,q,H,Q,X,Z,ee,te,ne,re,oe,se,ie,ae,ce,de,le;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],d=e[5]^e[15]^e[25]^e[35]^e[45],l=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|d>>>31),n=s^(d<<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^(l<<1|u>>>31),n=a^(u<<1|l>>>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=d^(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=l^(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],G=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,x=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,M=e[40]<<18|e[41]>>>14,z=e[41]<<18|e[40]>>>14,O=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,q=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,w=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=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,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=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,R=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,U=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&w,e[1]=m^~b&y,e[10]=P^~$&x,e[11]=S^~R&j,e[20]=O^~B&F,e[21]=C^~L&J,e[30]=Y^~G&q,e[31]=V^~K&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~w&v,e[3]=b^~y&k,e[12]=$^~x&N,e[13]=R^~j&D,e[22]=B^~F&U,e[23]=L^~J&W,e[32]=G^~q&Q,e[33]=K^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=w^~v&E,e[5]=y^~k&A,e[14]=x^~N&T,e[15]=j^~D&I,e[24]=F^~U&M,e[25]=J^~W&z,e[34]=q^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~E&h,e[7]=k^~A&m,e[16]=N^~T&P,e[17]=D^~I&S,e[26]=U^~M&O,e[27]=W^~z&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~h&g,e[9]=A^~m&b,e[18]=T^~P&$,e[19]=I^~S&R,e[28]=M^~O&B,e[29]=z^~C&L,e[38]=Z^~Y&G,e[39]=ee^~V&K,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=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(U.decode(e))],create:([e])=>J.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]))}(),J=new TextEncoder,U=new TextDecoder("utf-8");function W(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(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 z=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(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(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.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,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function V(e,t){return function(e){return new B(512,I,512).update(e).hex()}(W([e,t]))}const G=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=V}={}){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),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:V});function K(e){return!!e&&"0"!==e&&"false"!==e}let q;class H{static{[q]=function(e,t,n,r,o){var s,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function b(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 w(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 y(e,t,n,r,o,a,c,d,l,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],v=!c,k=1===o,E=3===o,A=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 $={},R=[],x=E?"get":A||k?"set":"value";if(l?(u||k?$={get:N(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:$[x]=y,u||N($[x],r,P?"":x)):u||($=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+$[x].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var T=w(g[D],"A decorator","be",!0),I=n?g[D-1]:void 0,O={},_={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");w(t,"An initializer","be",!0),a.push(t)}.bind(null,O)};if(v)i=T.call(I,j,_),O.v=1,w(i,"class decorators","return")&&(j=i);else if(_.static=d,_.private=l,i=_.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?P?function(e){return h(e),$.value}:S("get",0,h):function(e){return e[r]}),P||E||(i.set=l?S("set",0,h):function(e,t){e[r]=t}),j=T.call(I,k?{get:$.get,set:$.set}:$[x],_),O.v=1,k){if("object"==typeof j&&j)(i=w(j.get,"accessor.get"))&&($.get=i),(i=w(j.set,"accessor.set"))&&($.set=i),(i=w(j.init,"accessor.init"))&&R.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 w(j,(u?"field":"method")+" decorators","return")&&(u?R.unshift(j):$[x]=j)}return o<2&&c.push(b(R,d,1),b(a,d,0)),u||v||(l?k?c.splice(-1,0,S("get",d),S("set",d)):c.push(P?$[x]:w.call.bind($[x])):f(e,r,$)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],h=16&l;y(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return j(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=y(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[G,3,"isBunAvailable"],[G,3,"buildCommand"],[G,3,"rootDirPath"],[G,3,"dockerfile"],[G,3,"hasDockerfile"],[G,3,"hasSourceCode"],[G,3,"name"],[G,3,"dockerImageName"],[G,3,"env"],[G,3,"packageJson"],[G,3,"packageJsonPath"],[G,3,"hasPrisma"],[G,3,"hasVitest"],[G,3,"hasBiome"],[G,3,"hasEslint"],[G,3,"preferredLinter"],[G,3,"hasPlaywrightConfig"],[G,3,"skipLaunchingServerForPlaywright"],[G,3,"dockerPackageJson"],[G,3,"binExists"],[G,3,"rootPackageJson"]]).e}argv=void q(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}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)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);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.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get preferredLinter(){return this.hasBiome?"biome":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(K(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){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}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 Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(n,r=!0,o){const s=function(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(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 H(s,n,r))}return{root:i,self:s}}(n,r,o);if(s)return{...s,descendants:s.root===s.self?await Z(n,s.root,r):[s.self]}}async function Z(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 l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new H(r,n,o));return s}const ee=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),te=ee?"bun --bun run":"node",ne=ee?"bun":"yarn",re=ee?"bun --bun run":"yarn",oe={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=Q(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(ee?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return se(s,n),!0;const[i,a,l]=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"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!ie.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),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=>(ae.some(t=>e.includes(t))||ce.some(t=>e.endsWith(t)))&&!de.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(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!se(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function se(e,t){if(console.info(d.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 ie=new Set(["CI","PWDEBUG","TMPDIR"]);const ae=["src/","public/"],ce=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],de=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const le=new m,ue={exitIfFailed:!0};async function pe(e,t,n,r=ue){const o=he(e,t);if(me(o.printable,t),n.verbose&&me(o.runnable,t,"Start (raw)",!0),n.dryRun)return ge(o.printable,0,r),0;const s=await x(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ge(o.printable,s.status,r),s.status??1}function fe(e,t,n,r=ue){return le.runAndWaitForReturnValue(async()=>{const o=he(e,t);if(me(o.printable,t,"Start (parallel)",!0),n.dryRun)return me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0),ge(o.printable,0,r),0;const s=await x(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ge(o.printable,s.status,r),s.status??1})}function he(e,t){let n=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 ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",ee?"bun --bun run ":"yarn run ");ee&&(n=n.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").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=we(n.replaceAll("YARN ",`${re} `)),o=we(n.replaceAll("YARN playwright ",`${re} playwright `).replaceAll("YARN ",!ee&&t.binExists?"":`${re} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${re} dotenv${s} -- ${r}`,runnable:o}}function me(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ge(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function be(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function we(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ye={...y,"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 ve(e){const t=[];for(const n of Object.keys(y)){const r=ke(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 t}function ke(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ee={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...ye,"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(d.red("This command is not supported on Windows.")),process.exit(1));const t=Q(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(d.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(he(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:be(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=Array.from({length:t.length}),c=t.map((n,o)=>new Promise(c=>{let d=!1;const l=n=>{d||(d=!0,a[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,Pe(t)),c())};n.once("error",e=>{console.error("Failed to start child process:",e),l(1)}),n.once("exit",(e,t)=>{l(Ae(e,t))})})),d=e=>{n??=e,i||(i=!0,Pe(t))},l=()=>{d("SIGINT")},u=()=>{d("SIGTERM")},p=()=>{d("SIGQUIT")};process.on("SIGINT",l),process.on("SIGTERM",u),process.on("SIGQUIT",p);try{await Promise.all(c)}finally{process.removeListener("SIGINT",l),process.removeListener("SIGTERM",u),process.removeListener("SIGQUIT",p)}if(n)return Ae(null,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of a)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(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Ae(e,t){return null!==e?e:t&&t in h.signals?128+h.signals[t]:1}function Pe(e){for(const t of e)if(t.pid)try{Se(t.pid),A(t.pid)}catch(e){console.warn("Failed to kill child process:",e)}}function Se(e){try{process.kill(-e,"SIGTERM")}catch(e){if(function(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}(e))return;throw e}}const $e={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=Q(e);t||(console.error(d.red("No project found.")),process.exit(1));if(K(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(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Re(e){return e.map(e=>xe(e)).join(" ")}function xe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const je=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),Ne=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),De=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Te=new Set([...De].filter(e=>!je.has(e))),Ie="!**/test{-,/}fixtures/**",Oe={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){"win32"===process.platform&&(console.error(d.red("This command is not supported on Windows.")),process.exit(1));const n=await X(e,!1);n||(console.error(d.red("No project found.")),process.exit(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=[],i=[];let a,c,l=!1;if(r.length>0){const e=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await b.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:a}of e){if(a.endsWith("/test/fixtures")||a.includes("/test/fixtures/")||a.endsWith("/test-fixtures")||a.includes("/test-fixtures/"))continue;const e=t.extname(a).slice(1);if(a.endsWith("/package.json"))i.push(a);else{i.push(...Be(n.descendants,a,r));for(const{lintPath:t,project:i}of Le(n.descendants,a,r))if("biome"===i.preferredLinter||"directory"===r||Je(i,e)){const n=o.get(i)??[];n.push(t),o.set(i,n),s.push(...Ce(i,t,r,e))}else De.has(e)?s.push(t):Fe(e)&&!i.preferredLinter&&(console.error(d.red(`No linter found for ${i.name}. Install ESLint or Biome.`)),l=!0)}}a=[...new Set(s)],c=[...new Set(i)]}else a=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Te].join(",")}}`,Ie]);for(const o of n){if(!Ue(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...De].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),c=n.descendants.map(e=>e.packageJsonPath);const u=[],p={exitIfFailed:!1,forceColor:!0};if(r.length>0)for(const[t,n]of o){const r=_e(t,e,n);r&&u.push(fe(r,t,e,p))}else for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=_e(t,e);n&&u.push(fe(n,t,e,p))}const f=await Promise.all(u);(l||f.some(e=>0!==e))&&process.exit(1),e.format&&(a.length>0&&await fe(Re(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...a]),n.self,e,{forceColor:!0}),c.length>0&&await fe(Re(["YARN","sort-package-json","--",...c]),n.self,e,{forceColor:!0}))}};function _e(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],Re(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...n?.length?["--"]:[],...n??[]])}if("eslint"===e.preferredLinter)return Re(["YARN","eslint","--color",...t.fix||t.format?["--fix"]:[],"--",...n??["."]])}function Ce(e,n,r,o){return"directory"===r&&"biome"===e.preferredLinter?[t.join(n,"**/{.*/,}*.{"+[...Te].join(",")+"}"),Ie]:"directory"===r&&Ue(e)?[n,Ie]:function(e,t){return!!Ue(e)||"biome"===e.preferredLinter&&!Je(e,t)&&De.has(t)}(e,o)?[n]:[]}function Be(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 Le(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 Fe(e){return je.has(e)||Ne.has(e)}function Je(e,t){return"biome"===e.preferredLinter?je.has(t):"eslint"===e.preferredLinter&&Ne.has(t)}function Ue(e){return"eslint"===e.preferredLinter}function*We(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Me={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 X(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of We("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(ze(n,r),Ye(r),Ve(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(ne,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ze(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function Ye(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 Ve(e){delete e.private,delete e.publishConfig,delete e.prettier}const Ge="file:",Ke=[{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 qe(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function He(n){return Ke.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const Qe=new class{cleanUpLitestream(e){const t=qe(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${Ge}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=qe(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 ${qe(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(Ge))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=He(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} ${qe(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=${Ge}${e} `}else if(e.env.DATABASE_URL?.startsWith(Ge)){const n=He(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${Ge}${r} `}}return`${o}PRISMA studio ${r}`}},Xe={},Ze={command:"prisma",describe:"Run prisma commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(et).command(tt).command(nt).command(rt).command(ot).command(st).command(it).command(at).command(ct).command(dt).command(lt).command(ut).demandCommand().strict(!1),handler(){}},et={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Xe,async handler(e){const t=await ft(e);for(const n of We("prisma cleanup-litestream",t))await pe(Qe.cleanUpLitestream(n),n,e)}},tt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Xe,async handler(e){const t=await ft(e);for(const e of We("prisma create-litestream-config",t))pt(e)}},nt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Xe,async handler(e){const t=await ft(e),n=ht(e);for(const r of We("prisma deploy",t))await pe(Qe.deploy(r,n),r,e)}},rt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Xe,async handler(e){const t=await ft(e);for(const n of We("prisma deploy-force",t))await pe(Qe.deployForce(n),n,e)}},ot={command:"list-backups",describe:"List Litestream backups",builder:Xe,async handler(e){const t=await ft(e);for(const n of We("prisma list-backups",t))await pe(Qe.listBackups(n),n,e)}},st={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Xe,async handler(e){const t=await ft(e),n=ht(e);for(const r of We("prisma migrate",t))await pe(Qe.migrate(r,n),r,e)}},it={command:"migrate-dev",describe:"Create a migration file",builder:Xe,async handler(e){const t=await ft(e),n=ht(e);for(const r of We("prisma migrate-dev",t))await pe(Qe.migrateDev(r,n),r,e)}},at={command:"reset",describe:"Reset DB",builder:Xe,async handler(e){const t=await ft(e),n=ht(e);for(const r of We("prisma reset",t))await pe(Qe.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of We("WB_ENV=test prisma reset",await ft(e)))await pe(Qe.reset(t,n),t,e)}}},ct={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Xe,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await ft(e);for(const n of We("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await pe(Qe.restore(n,t),n,e)}}},dt={command:"seed",describe:"Populate DB with seed data",builder:{...Xe,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await ft(e);for(const n of We("prisma seed",t))await pe(Qe.seed(n,e.file),n,e)}},lt={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Xe,"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 ft(e),n=ht(e,["db-url-or-path","restored"]);for(const r of We("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await pe(Qe.studio(r,t,n),r,e)}}},ut={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await ft(e),n=[(e.args?.join(" ")??"").trimEnd(),ht(e,["args"])].filter(Boolean).join(" ");for(const r of We(`prisma ${n}`,t))await pe(`PRISMA ${n}`,r,e)}};function pt(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}`)}}async function ft(e){const t=await X(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function ht(e,t=[]){const n=[],r=Object.keys(ye),o=Object.values(ye).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 Re([...n,...i])}const mt={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=Q(e);t||(console.error(d.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${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await pe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},gt={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of We("setup",n.descendants)){const r=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await fe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await pe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await fe("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await fe(`poetry env use ${n}`,t,e),await le.promiseAll(),await pe("poetry run pip install --upgrade pip",t,e),await pe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await pe(`${re} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await pe(`${re} playwright install --with-deps`,r,e)}(e)}};function bt(e){return e.silent?" > /dev/null":""}const wt=new Set;async function yt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Et(t,e))return!1}return!0}(e);n||await vt(e,t);const r=async()=>{wt.has(e)||(wt.add(e),await vt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function vt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await x("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 x("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function kt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await yt(n,t),n}async function Et(e,t){return new Promise(n=>{const r=w();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 At=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";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} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(wt.has(e))return;wt.add(e),me(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ge(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 ":""}--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 Pt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return At.buildImage(e,t)}async startDev(e,t){return await kt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await kt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await kt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await kt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Re(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",At.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${At.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(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?Qe.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${bt(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,At.stopAndStart(e),n)}async testStart(e,t){return await kt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${xe(r)}`} ${Re(["YARN","wb","concurrently",...ve(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 kt(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 St([...o,...e,...r],n);const i=e.slice(1),a=$t(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return St([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Re(["YARN","wb","concurrently",...ve(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?Re(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Re(["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 St(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="))?Re(e):Re([...e,"--max-failures=1"]):Re(e)}function $t(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;Rt.has(o)?t="required":xt.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&jt.has(e)&&(t="required");continue}n.push(r)}}return n}const Rt=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"]),xt=new Set(["--only-changed","--update-snapshots","--update-source-method"]),jt=new Set(["-c","-g","-j"]);const Nt=new class extends Pt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Dt=new class extends Pt{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 kt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Re(["YARN","wb","concurrently",...ve(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Re(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const Tt=new class extends Pt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const It=new class extends Pt{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} && ${te} 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")} && ${At.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 Ot=new class extends Pt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const _t=new class extends Pt{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()}},Ct=["express","fastify","elysia","hono"],Bt={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"}},Lt={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(Bt),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>xe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>xe(String(e))).join(" ")}(e);const t=await X(e);t||(console.error(d.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=Nt;else if(t.next)o=Tt;else if(r["@remix-run/dev"])o=Ot;else if(r.vite)o=_t;else if(Ct.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Dt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=It}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await pe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await pe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await pe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await pe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await pe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Ft={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",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"}},Jt={targets:{description:"Test target paths",type:"array"}},Ut={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({...Ft,...Jt}),async handler(n){await async function(n){const r=await X(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.FORCE_COLOR||="3",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??{},d=c.packageJson.devDependencies??{};let l;if(l=r.blitz?Nt:r.next?Tt:d["@remix-run/dev"]?Ot:d.vite?_t:Ct.some(e=>r[e])&&!r["firebase-functions"]?Dt:It,console.info(`Running "test" for ${c.name} ...`),a&&e.existsSync(t.join(c.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await pe(l.testUnit(c,t),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const u=o.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await pe(await l.testE2EProduction(c,p,{playwrightArgs:Mt(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await pe(await l.testE2EDev(c,p,{playwrightArgs:Mt(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await Wt(c,p,l,Mt(u,s),s);continue;case"docker-debug":await Wt(c,p,l,Mt(u,s,["--debug"]),s);continue}if(r.blitz||r.next||d["@remix-run/dev"]||d.vite)switch(n.e2e){case"headed":await pe(await l.testE2EProduction(c,p,{playwrightArgs:Mt(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await pe(await l.testE2EDev(c,p,{playwrightArgs:Mt(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await pe(await l.testE2EProduction(c,p,{playwrightArgs:Mt(u,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await pe(await l.testE2EProduction(c,p,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await pe("BUN playwright show-trace",c,n)}}}(n)}};async function Wt(e,t,n,r,o){e.env.WB_DOCKER||="1",await pe(`${n.buildDocker(e,"test")}${bt(t)}`,e,t),process.exitCode=await pe(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await pe(At.stop(e),e,t)}function Mt(e,t=[],n=[]){const r=$t(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const zt={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 X(n);r||(console.error(d.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;if(i=r.blitz?Nt:r.next?Tt:s["@remix-run/dev"]?Ot:s.vite?_t:Ct.some(e=>r[e])&&!r["firebase-functions"]?Dt:It,console.info(`Running "test-on-ci" for ${o.name} ...`),await fe(At.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await fe(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await fe(await i.testStart(o,n),o,n),await le.promiseAll(),o.hasDockerfile&&(o.env.WB_DOCKER||="1",await pe(`${i.buildDocker(o,"test")}${bt(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await pe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await pe(At.stop(o),o,n)}}}(n)}};const Yt={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}`);A(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Vt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await X(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await fe(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(d.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(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.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.")),process.exit(a)}},Gt={...Vt,command:"tc"};await n(r(process.argv)).scriptName("wb").options(ye).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(oe).command(Ee).command($e).command(Oe).command(Me).command(Ze).command(mt).command(gt).command(Lt).command(Ut).command(zt).command(Yt).command(Vt).command(Gt).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 Kt=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!Kt){Kt=!0;try{A(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2tleXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQmlvbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnQGJpb21lanMvYmlvbWUnKSB8fCB0aGlzLmhhc0RlcGVuZGVuY3koJ2Jpb21lJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRXNsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ2VzbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHByZWZlcnJlZExpbnRlcigpOiAnYmlvbWUnIHwgJ2VzbGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc0Jpb21lKSByZXR1cm4gJ2Jpb21lJztcbiAgICBpZiAodGhpcy5oYXNFc2xpbnQpIHJldHVybiAnZXNsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbiA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgICAhIShcbiAgICAgICAgcGFja2FnZUpzb24gJiZcbiAgICAgICAgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5wYWNrYWdlSnNvbikgfHwgaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5yb290UGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYke2Nhc2NhZGVPcHRpb259IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudihcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRzOiBPcHRpb25zXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9yY2VDb2xvcjogdHlwZW9mIGFyZ3YuZm9yY2VDb2xvciA9PT0gJ2Jvb2xlYW4nID8gYXJndi5mb3JjZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2ksIGZvcmNlQ29sb3I6IG9wdGlvbnMuZm9yY2VDb2xvciB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSwgc2lnbmFsKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUobnVsbCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGlmICghY2hpbGQucGlkKSBjb250aW51ZTtcblxuICAgIHRyeSB7XG4gICAgICBraWxsUHJvY2Vzc0dyb3VwKGNoaWxkLnBpZCk7XG4gICAgICB0cmVlS2lsbChjaGlsZC5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsICdTSUdURVJNJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnYXN0cm8nLFxuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnZ3FsJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc3ZlbHRlJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBlc2xpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBwcmV0dGllckZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICAgIGxldCBwcmV0dGllckFyZ3M6IHN0cmluZ1tdO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGludFRhcmdldHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgICAgY29uc3QgZmlsZUtpbmQgPSBhd2FpdCBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaCguLi5nZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJyB8fFxuICAgICAgICAgICAgZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8XG4gICAgICAgICAgICBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaCguLi5idWlsZEV4cGxpY2l0UHJldHRpZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTm8gbGludGVyIGZvdW5kIGZvciAke3Byb2plY3QubmFtZX0uIEluc3RhbGwgRVNMaW50IG9yIEJpb21lLmApKTtcbiAgICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBbLi4ubmV3IFNldChwYWNrYWdlSnNvbkZpbGVQYXRocyldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW50UHJvbWlzZXM6IFByb21pc2U8bnVtYmVyPltdID0gW107XG4gICAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6IHRydWUgfSBhcyBjb25zdDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmICFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChsaW50Q29tbWFuZCwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGludEV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKGxpbnRQcm9taXNlcyk7XG5cbiAgICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyB8fCBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgICAnLS0nLFxuICAgICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPFxuICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+LFxuICAgICdmaXgnIHwgJ2Zvcm1hdCdcbiAgPixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSB7XG4gICAgbGV0IGJpb21lQXJnczogc3RyaW5nW107XG4gICAgaWYgKGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2NoZWNrJywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZpeCkge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50JywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgYmlvbWVBcmdzID0gWydmb3JtYXQnLCAnLS1maXgnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50J107XG4gICAgfVxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnQlVOJyxcbiAgICAgICdiaW9tZScsXG4gICAgICAuLi5iaW9tZUFyZ3MsXG4gICAgICAnLS1jb2xvcnM9Zm9yY2UnLFxuICAgICAgJy0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCcsXG4gICAgICAnLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlJyxcbiAgICAgIC4uLihmaWxlcz8ubGVuZ3RoID8gWyctLSddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFtdKSxcbiAgICBdKTtcbiAgfVxuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdlc2xpbnQnLFxuICAgICAgJy0tY29sb3InLFxuICAgICAgLi4uKGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgJy0tJyxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKFxuICBhcmd2OiBQaWNrPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+LCAnZmlsZXMnPiAmIHtcbiAgICAnLS0nPzogdW5rbm93bltdO1xuICAgIF86IHVua25vd25bXTtcbiAgfVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFxuICAgIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnICYmXG4gICAgIXN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pICYmXG4gICAgcHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0UHJldHRpZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykge1xuICAgIHJldHVybiBbXG4gICAgICBwYXRoLmpvaW4oZmlsZVBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9JyksXG4gICAgICBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuLFxuICAgIF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHJldHVybiBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcpIHJldHVybiBlc2xpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50Jztcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4IC1jb25maWcgbGl0ZXN0cmVhbS55bWwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgICBzdGVwcy5wdXNoKHRoaXMuc2VlZChwcm9qZWN0KSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcy5maWx0ZXIoQm9vbGVhbikuam9pbignICYmICcpO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofSo7IGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7b3V0cHV0UGF0aH0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9tb3VudCcgOiAncHJpc21hL21vdW50Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBPU1NJQkxFX1BSSVNNQV9QQVRIUy5maW5kKCh7IHNjaGVtYVBhdGggfSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpXG4gICAgPy5kYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlVybCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1VSTDtcbiAgaWYgKCFkYlVybD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHJldHVybjtcblxuICBjb25zdCByYXdEYlBhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIHByaXNtYSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gIGNvbnN0IGRiUGF0aCA9IGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCByZXRlbnRpb25DaGVja0ludGVydmFsID0gcHJvamVjdC5lbnYuV0JfRU5WID09PSAnc3RhZ2luZycgPyAnNW0nIDogJzFoJztcbiAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZyA9IGBkYnM6XG4gIC0gcGF0aDogJHtkYlBhdGh9XG4gICAgYnVzeS10aW1lb3V0OiA1c1xuICAgIGNoZWNrcG9pbnQtaW50ZXJ2YWw6IDFtXG4gICAgcmVwbGljYTpcbiAgICAgIHR5cGU6IHMzXG4gICAgICBlbmRwb2ludDogaHR0cHM6Ly8ke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRH0ucjIuY2xvdWRmbGFyZXN0b3JhZ2UuY29tXG4gICAgICBidWNrZXQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRX1cbiAgICAgIGFjY2Vzcy1rZXktaWQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEfVxuICAgICAgc2VjcmV0LWFjY2Vzcy1rZXk6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIHNuYXBzaG90LWludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgICAgIHJldGVudGlvbjogNzJoICAgICAgICAgICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbiAgICAgIHJldGVudGlvbi1jaGVjay1pbnRlcnZhbDogJHtyZXRlbnRpb25DaGVja0ludGVydmFsfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5wcmlzbWEgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnByaXNtYVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIHByaXNtYSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9XG4gICAgICBlY29zeXN0ZW1Db25maWdQYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7YXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gLnRyaW0oKSxcbiAgICAgICAgICAgIGBub2RlIGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF07XG5cbiAgICByZXR1cm4gWy4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChcbiAgcGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdLFxuICB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLFxuICBiYWlsPzogYm9vbGVhbixcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBbJ0JVTicsICdwbGF5d3JpZ2h0J107XG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gIGlmIChwbGF5d3JpZ2h0QXJnc1swXSAhPT0gJ3Rlc3QnIHx8ICFub3JtYWxpemVkVGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFsuLi5iYXNlLCAuLi5wbGF5d3JpZ2h0QXJncywgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihcbiAgICBbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCwgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLFxuICAgIGJhaWxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZEFyZ3M6IHN0cmluZ1tdLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbmRleCA9IGNvbW1hbmRBcmdzLmluZGV4T2YoJ3BsYXl3cmlnaHQnKTtcbiAgY29uc3QgaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQgPSBwbGF5d3JpZ2h0SW5kZXggIT09IC0xICYmIGNvbW1hbmRBcmdzW3BsYXl3cmlnaHRJbmRleCArIDFdID09PSAndGVzdCc7XG4gIGlmICghYmFpbCB8fCAhaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIGlmIChjb21tYW5kQXJncy5zb21lKChhcmcpID0+IGFyZyA9PT0gJy0tbWF4LWZhaWx1cmVzJyB8fCBhcmcuc3RhcnRzV2l0aCgnLS1tYXgtZmFpbHVyZXM9JykpKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLmNvbW1hbmRBcmdzLCAnLS1tYXgtZmFpbHVyZXM9MSddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICBsZXQgcGVuZGluZ1ZhbHVlTW9kZTogJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ10gb2YgYXJncy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSkge1xuICAgICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUgPT09ICdyZXF1aXJlZCcgfHwgIWFyZy5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHJldHVybiBbLi4udGFyZ2V0SW5kZXhlcywgLi4uYXJncy5zbGljZShpbmRleCArIDEpLm1hcCgoXywgb2Zmc2V0KSA9PiBpbmRleCArIDEgKyBvZmZzZXQpXTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICBpZiAoYXJnLmluY2x1ZGVzKCc9JykpIGNvbnRpbnVlO1xuICAgICAgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfSBlbHNlIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ29wdGlvbmFsJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgY29uc3Qgc2hvcnRPcHRpb24gPSBhcmcuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMiAmJiBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoc2hvcnRPcHRpb24pKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRhcmdldEluZGV4ZXMucHVzaChpbmRleCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbn1cblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tYnJvd3NlcicsXG4gICctLWNvbmZpZycsXG4gICctLWdyZXAnLFxuICAnLS1ncmVwLWludmVydCcsXG4gICctLWdsb2JhbC10aW1lb3V0JyxcbiAgJy0tbWF4LWZhaWx1cmVzJyxcbiAgJy0tb3V0cHV0JyxcbiAgJy0tcHJvamVjdCcsXG4gICctLXJlcGVhdC1lYWNoJyxcbiAgJy0tcmVwb3J0ZXInLFxuICAnLS1yZXRyaWVzJyxcbiAgJy0tc2hhcmQnLFxuICAnLS10ZXN0LWxpc3QnLFxuICAnLS10ZXN0LWxpc3QtaW52ZXJ0JyxcbiAgJy0tdGltZW91dCcsXG4gICctLXRyYWNlJyxcbiAgJy0tdHNjb25maWcnLFxuICAnLS11aS1ob3N0JyxcbiAgJy0tdWktcG9ydCcsXG4gICctLXVpLXRpdGxlJyxcbiAgJy0td29ya2VycycsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tb25seS1jaGFuZ2VkJyxcbiAgJy0tdXBkYXRlLXNuYXBzaG90cycsXG4gICctLXVwZGF0ZS1zb3VyY2UtbWV0aG9kJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoWyctYycsICctZycsICctaiddKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICd2aXRlc3QnLFxuICAgICAgICAgICdydW4nLFxuICAgICAgICAgIC4uLih0YXJnZXRzICYmIHRhcmdldHMubGVuZ3RoID4gMCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddKSxcbiAgICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICAgIF0pfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ30gfCB0ZWUgJHtTRVJWRVJfTE9HX0ZJTEV9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVEb2NrZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJTdGFydCBhcHAuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gdGhlIHVuZGVybHlpbmcgYXBwIGNvbW1hbmQuIEV4YW1wbGU6IHdiIHN0YXJ0IC0tIC0taG9zdCAwLjAuMC4wXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLm9wdGlvbnMoYnVpbGRlcikgYXMgQXJndjxcbiAgICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4gICAgPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyh7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSkgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gYXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIEF2b2lkIGxhdW5jaGluZyBkZXYgc2VydmVycyBmb3IgYnVpbGQtb25seSBwYWNrYWdlczsgb25seSBzdGFydCBhIHNlcnZlciB3aGVuIEUyRSBuZWVkcyBpdC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJlbnYiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZWZhdWx0IiwidmVyYm9zZSIsImFsaWFzIiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJpc0Vycm5vRXhjZXB0aW9uIiwiZXJyb3IiLCJFcnJvciIsInRyZWVLaWxsIiwicGlkIiwic2lnbmFsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwicHJvY2VzcyIsInBsYXRmb3JtIiwicnVuQ29tbWFuZCIsIlN0cmluZyIsIm1heEJ1ZmZlciIsInRpbWVvdXQiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImtpbGxUcmVlT25XaW5kb3dzIiwiZGVzY2VuZGFudHMiLCJyb290UGlkIiwic3Rkb3V0IiwiY2hpbGRyZW5CeVBhcmVudCIsInBzT3V0cHV0IiwibGluZSIsInNwbGl0IiwibWF0Y2hlZCIsImV4ZWMiLCJjaGlsZFBpZCIsInBhcmVudFBpZCIsImNoaWxkcmVuIiwicHVzaCIsImJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCIsInF1ZXVlIiwiaW5kZXgiLCJsZW5ndGgiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzIiwidGFyZ2V0UGlkcyIsInRvUmV2ZXJzZWQiLCJ0b0NoaWxkcmVuRmlyc3RQaWRzIiwidGFyZ2V0UGlkIiwia2lsbElmTmVlZGVkIiwia2lsbCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImV4ZWNGaWxlU3luYyIsImVuY29kaW5nIiwic3RkaW8iLCJzdGRlcnIiLCJCdWZmZXIiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwiZXh0cmFjdFN0ZGVyciIsIkNvbW1hbmRFeGVjdXRpb25FcnJvciIsImNvZGUiLCJzdGF0dXMiLCJ0b0V4aXRDb2RlIiwidGVzdCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJqb2luIiwidGhpcyIsIm5hbWUiLCJhc3luYyIsInNwYXduQXN5bmMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic2V0RW5jb2RpbmciLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwiY29uc29sZSIsImluZm8iLCJ3YXJuIiwiY2xlYW51cFNpZ25hbHMiLCJzaWduYWxIYW5kbGVycyIsInJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlciIsImNsZWFyIiwia2lsbE9uRXhpdCIsImhhbmRsZVNpZ25hbCIsImxpc3RlbmVyQ291bnQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsIlJlZ0V4cCIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJmcyIsInJlYWRGaWxlU3luYyIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsInByaXNtYSIsImRldkRlcGVuZGVuY2llcyIsImhhc1ZpdGVzdCIsInZpdGVzdCIsImhhc0Jpb21lIiwiaGFzRGVwZW5kZW5jeSIsImhhc0VzbGludCIsInByZWZlcnJlZExpbnRlciIsImhhc1BsYXl3cmlnaHRDb25maWciLCJza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCIsIkNJIiwiY29uZmlnUGF0aCIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJwYWNrYWdlTmFtZSIsImhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwicm9vdFBhY2thZ2VKc29uIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwibm9ybWFsaXplZFNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludGFibGUiLCJydW5uYWJsZSIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJjb25maWd1cmVFbnYiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJibGl0eiIsInByaW50YWJsZVNjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJydW5uYWJsZVNjcmlwdCIsImNhc2NhZGVPcHRpb24iLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwiZXhpdCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MiLCJvcHRpb25OYW1lIiwiZ2V0T3B0aW9uVmFsdWUiLCJpdGVtIiwiY2FtZWxDYXNlT3B0aW9uTmFtZSIsImNoYXJhY3RlciIsInRvVXBwZXJDYXNlIiwiY29uY3VycmVudGx5Q29tbWFuZCIsImJ1aWxkZXIiLCJzdWNjZXNzIiwiY2hvaWNlcyIsImNvbW1hbmRzIiwiQm9vbGVhbiIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsInJlc3VsdHMiLCJ3YWl0Rm9yRXhpdFByb21pc2VzIiwiY2hpbGQiLCJzZXR0bGVkIiwic2V0dGxlIiwia2lsbE90aGVycyIsImtpbGxPdGhlcnNPbkZhaWwiLCJzaG91bGRTdG9wT3RoZXJzIiwidGVybWluYXRlQ2hpbGRyZW4iLCJvbmNlIiwiZ2V0RXhpdENvZGUiLCJzdG9wQWxsIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJhbGwiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwia2lsbFByb2Nlc3NHcm91cCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJiaW9tZUV4dGVuc2lvbnMiLCJlc2xpbnRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwibGludFRhcmdldHMiLCJnZXRMaW50VGFyZ2V0RmlsZXMiLCJsaW50RmlsZVBhdGhzQnlQcm9qZWN0IiwicHJldHRpZXJGaWxlUGF0aHMiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsInByZXR0aWVyQXJncyIsInNvcnRQYWNrYWdlSnNvbkFyZ3MiLCJtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIiwiZmlsZSIsImZpbGVLaW5kIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0TGludFRhcmdldEZpbGVLaW5kIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyIsImxpbnRQYXRoIiwiZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyIsInN1cHBvcnRzTGludGluZ0V4dGVuc2lvbiIsImxpbnRGaWxlUGF0aHMiLCJidWlsZEV4cGxpY2l0UHJldHRpZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImxpbnRQcm9taXNlcyIsImxpbnRSdW5PcHRpb25zIiwiYnVpbGRMaW50Q29tbWFuZCIsImxpbnRFeGl0Q29kZXMiLCJiaW9tZUFyZ3MiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJzdGFydHNXaXRoIiwiZGVzY2VuZGFudFByb2plY3RzIiwib3duaW5nUHJvamVjdCIsImZpbmRPd25pbmdQcm9qZWN0IiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJGSUxFX1NDSEVNQSIsIlBPU1NJQkxFX1BSSVNNQV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJnZXREYXRhYmFzZURpclBhdGgiLCJnZXRQcmlzbWFCYXNlRGlyIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJkZXBsb3lGb3JjZSIsInJlbW92ZURiQ29tbWFuZCIsImxpc3RCYWNrdXBzIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2Iiwic3RlcHMiLCJjbGVhbnVwQ29tbWFuZCIsImRiVXJsIiwiREFUQUJBU0VfVVJMIiwicmF3RGJQYXRoIiwiYmFzZURpciIsImFic29sdXRlUGF0aCIsImlzQWJzb2x1dGUiLCJjbGVhblVwU3FsaXRlRGJJZk5lZWRlZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsImNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpc3RCYWNrdXBzQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImF2YWlsYWJsZSIsImhvc3QiLCJwcm9iZVBvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsInRhcmdldHMiLCJiYWlsIiwiYmFzZSIsIm5vcm1hbGl6ZWRUYXJnZXRzIiwiYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24iLCJyZXN0IiwiZXhwbGljaXRUYXJnZXRJbmRleGVzIiwiZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMiLCJyZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0IiwiYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZCIsInRlc3RVbml0IiwiY29tbWFuZEFyZ3MiLCJwbGF5d3JpZ2h0SW5kZXgiLCJpbmRleE9mIiwiaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQiLCJwZW5kaW5nVmFsdWVNb2RlIiwidGFyZ2V0SW5kZXhlcyIsIm9mZnNldCIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMiLCJzaG9ydE9wdGlvbiIsIlBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiYmxpdHpTY3JpcHRzIiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwidGVzdENvbW1hbmQiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwiYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRSIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsImhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0cmVlS2lsbENvbW1hbmQiLCJwb3NpdGlvbmFsIiwiZGVtYW5kT3B0aW9uIiwidHlwZUNoZWNrQ29tbWFuZCIsInJlbW92ZWROZXh0RGlyIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJuZXh0RGlyUGF0aCIsInJtU3luYyIsImZvcmNlIiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6IjRoQkFPTyxNQUFNQSxFQUE0QixDQUN2Q0MsSUFBSyxDQUNIQyxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxtQkFBb0IsQ0FDbEJGLFlBQWEscUdBQ2JDLEtBQU0sVUFDTkMsU0FBUyxHQUVYLFlBQWEsQ0FDWEYsWUFBYSxxRkFDYkMsS0FBTSxTQUNOQyxRQUFTLGdCQUVYQyxRQUFTLENBQ1BILFlBQWEsc0NBQ2JDLEtBQU0sVUFDTkcsTUFBTyxNQTRGWCxNQUFNQyxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBQSxFQUVsRixP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LEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTdELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVoQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlxQixFQUFFckIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlzQixFQUFFdEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl1QixFQUFFdkIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk2QixFQUFFN0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk4QixFQUFFOUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkrQixFQUFFL0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlDLEVBQUU2QixHQUFHTCxHQUFHLEVBQUVKLElBQUksSUFBSW5CLEVBQUU2QixHQUFHVixHQUFHLEVBQUVJLElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRUcsR0FBR2tCLEdBQUcsRUFBRUMsSUFBSSxJQUFJckIsRUFBRUksR0FBR2lCLEdBQUcsRUFBRUQsSUFBSSxJQUFJdEIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR0csR0FBRyxFQUFFQyxJQUFJLElBQUkzQixFQUFFbUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk1QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVxQixHQUFHUSxHQUFHLEVBQUVDLElBQUksSUFBSTdCLEVBQUVxQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTlCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUd4QixHQUFHLEVBQUVFLElB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
9
+ */const T=[..."0123456789abcdef"],O=[6,1536,393216,100663296],I=[0,8,16,24],_=[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 C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class L{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<<I[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<I[3&i++],t[i>>2]|=(128|a>>12&63)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[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];B(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];B(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+=T[o>>4&15]+T[15&o]+T[o>>12&15]+T[o>>8&15]+T[o>>20&15]+T[o>>16&15]+T[o>>28&15]+T[o>>24&15];i%e===0&&(t=C(t),B(t),s=0)}return r&&(o=t[s],a+=T[o>>4&15]+T[15&o],r>1&&(a+=T[o>>12&15]+T[o>>8&15]),r>2&&(a+=T[o>>20&15]+T[o>>16&15])),a}}const B=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,y,b,w,v,k,E,A,P,S,x,$,R,j,N,D,T,O,I,C,L,B,F,J,U,W,M,z,Y,V,G,K,q,H,Q,X,Z,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],G=e[11]<<4|e[10]>>>28,K=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,M=e[40]<<18|e[41]>>>14,z=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,q=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=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,L=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,b=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,O=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,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=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,U=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&b,e[1]=m^~y&w,e[10]=P^~x&R,e[11]=S^~$&j,e[20]=I^~L&F,e[21]=C^~B&J,e[30]=Y^~G&q,e[31]=V^~K&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~b&v,e[3]=y^~w&k,e[12]=x^~R&N,e[13]=$^~j&D,e[22]=L^~F&U,e[23]=B^~J&W,e[32]=G^~q&Q,e[33]=K^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=b^~v&E,e[5]=w^~k&A,e[14]=R^~N&T,e[15]=j^~D&O,e[24]=F^~U&M,e[25]=J^~W&z,e[34]=q^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~E&h,e[7]=k^~A&m,e[16]=N^~T&P,e[17]=D^~O&S,e[26]=U^~M&I,e[27]=W^~z&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=E^~h&g,e[9]=A^~m&y,e[18]=T^~P&x,e[19]=O^~S&$,e[28]=M^~I&L,e[29]=z^~C&B,e[38]=Z^~Y&G,e[39]=ee^~V&K,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=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(U.decode(e))],create:([e])=>J.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]))}(),J=new TextEncoder,U=new TextDecoder("utf-8");function W(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(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 z=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(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(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.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 V(e,t){return function(e){return new L(512,O,512).update(e).hex()}(W([e,t]))}const G=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=V}={}){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:V});function K(e){return!!e&&"0"!==e&&"false"!==e}let q;class H{static{[q]=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 y(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 b(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 w(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]),w=t[3],v=!c,k=1===o,E=3===o,A=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=E?"get":A||k?"set":"value";if(d?(u||k?x={get:N(function(){return w(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=w,u||N(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,D=g.length-1;D>=0;D-=n?2:1){var T=b(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,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");b(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=T.call(O,j,_),I.v=1,b(i,"class decorators","return")&&(j=i);else if(_.static=l,_.private=d,i=_.access={has:d?p.bind():function(e){return r in e}},A||(i.get=d?P?function(e){return h(e),x.value}:S("get",0,h):function(e){return e[r]}),P||E||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=T.call(O,k?{get:x.get,set:x.set}:x[R],_),I.v=1,k){if("object"==typeof j&&j)(i=b(j.get,"accessor.get"))&&(x.get=i),(i=b(j.set,"accessor.set"))&&(x.set=i),(i=b(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 b(j,(u?"field":"method")+" decorators","return")&&(u?$.unshift(j):x[R]=j)}return o<2&&c.push(y($,l,1),y(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?x[R]:b.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(y(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;w(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return j(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=w(e,[t],r,e.name,5,n)),y(n,1)]}}}(this,[],[[G,3,"isBunAvailable"],[G,3,"buildCommand"],[G,3,"rootDirPath"],[G,3,"dockerfile"],[G,3,"hasDockerfile"],[G,3,"hasSourceCode"],[G,3,"name"],[G,3,"dockerImageName"],[G,3,"env"],[G,3,"packageJson"],[G,3,"packageJsonPath"],[G,3,"hasPrisma"],[G,3,"hasVitest"],[G,3,"hasBiome"],[G,3,"hasEslint"],[G,3,"hasOxlint"],[G,3,"hasOxfmt"],[G,3,"hasPoetryLock"],[G,3,"hasPubspecYaml"],[G,3,"preferredLinter"],[G,3,"hasPlaywrightConfig"],[G,3,"skipLaunchingServerForPlaywright"],[G,3,"dockerPackageJson"],[G,3,"binExists"],[G,3,"rootPackageJson"]]).e}argv=void q(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}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)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);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.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}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(){return this.hasBiome?"biome":this.hasOxlint?"oxlint":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(K(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){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}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 Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(n,r=!0,o){const s=function(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(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 H(s,n,r))}return{root:i,self:s}}(n,r,o);if(s)return{...s,descendants:s.root===s.self?await Z(n,s.root,r):[s.self]}}async function Z(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 H(r,n,o));return s}const ee=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),te=ee?"bun --bun run":"node",ne=ee?"bun":"yarn",re=ee?"bun --bun run":"yarn",oe={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=Q(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;if(n={...n,command:n.command??(ee?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return se(s,n),!0;const[i,a,d]=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])=>!ie.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=>(ae.some(t=>e.includes(t))||ce.some(t=>e.endsWith(t)))&&!le.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(i)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!se(s,n))return;n.dryRun||await e.promises.writeFile(a,d,"utf8");return!0}(n)}};function se(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 ie=new Set(["CI","PWDEBUG","TMPDIR"]);const ae=["src/","public/"],ce=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],le=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const de=new m,ue={exitIfFailed:!0};async function pe(e,t,n,r=ue){const o=he(e,t);if(me(o.printable,t),n.verbose&&me(o.runnable,t,"Start (raw)",!0),n.dryRun)return ge(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ye(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ge(o.printable,s.status,r),s.status??1}function fe(e,t,n,r=ue){return de.runAndWaitForReturnValue(async()=>{const o=he(e,t);if(me(o.printable,t,"Start (parallel)",!0),n.dryRun)return me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0),ge(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ye(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ge(o.printable,s.status,r),s.status??1})}function he(e,t){let n=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 ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",ee?"bun --bun run ":"yarn run ");ee&&(n=n.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").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=be(n.replaceAll("YARN ",`${re} `)),o=be(n.replaceAll("YARN playwright ",`${re} playwright `).replaceAll("YARN ",!ee&&t.binExists?"":`${re} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${re} dotenv${s} -- ${r}`,runnable:o}}function me(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function ge(e,t,n){0===t?console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function ye(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function be(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const we={...w,"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 ve(e){const t=[];for(const n of Object.keys(w)){const r=ke(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 t}function ke(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ee={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...we,"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=Q(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(he(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:ye(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=Array.from({length:t.length}),c=t.map((n,o)=>new Promise(c=>{let l=!1;const d=n=>{l||(l=!0,a[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,Pe(t)),c())};n.once("error",e=>{console.error("Failed to start child process:",e),d(1)}),n.once("exit",(e,t)=>{d(Ae(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,Pe(t))},d=()=>{l("SIGINT")},u=()=>{l("SIGTERM")},p=()=>{l("SIGQUIT")};process.on("SIGINT",d),process.on("SIGTERM",u),process.on("SIGQUIT",p);try{await Promise.all(c)}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",u),process.removeListener("SIGQUIT",p)}if(n)return Ae(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of a)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 Ae(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}function Pe(e){for(const t of e)if(t.pid)try{Se(t.pid),A(t.pid)}catch(e){console.warn("Failed to kill child process:",e)}}function Se(e){try{process.kill(-e,"SIGTERM")}catch(e){if(function(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}(e))return;throw e}}const xe={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=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));if(K(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 $e(e){return e.map(e=>Re(e)).join(" ")}function Re(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const je=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),Ne=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),De=new Set([...Ne,"astro","svelte","vue"]),Te=new Set(["py"]),Oe=new Set(["dart"]),Ie=new Set([...De,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),_e=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ce=new Set([..._e].filter(e=>!je.has(e))),Le="!**/test{-,/}fixtures/**",Be={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const n=await X(e,!1);n||(console.error(l.red("No project found.")),process.exit(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 e=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await y.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of e){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const e=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...ze(n.descendants,u,r));for(const{lintPath:t,project:d}of Ye(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||Te.has(e))){const e=i.get(d)??[];if(e.push(t),i.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||Oe.has(e))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if("biome"===d.preferredLinter||"directory"===r||Ge(d,e)){const n=o.get(d)??[];n.push(t),o.set(d,n);for(const n of Me(d,t,r,e))if(d.hasOxfmt){const e=s.get(d)??[];e.push(n),s.set(d,e)}else c.push(n)}else if(_e.has(e)||Ie.has(e))if(d.hasOxfmt&&Ie.has(e)){const e=s.get(d)??[];e.push(t),s.set(d,e)}else _e.has(e)&&c.push(t);else Ve(e)&&!d.preferredLinter&&(console.error(l.red(`No linter found for ${d.name}. Install ESLint or Biome.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ce].join(",")}}`,Le]);for(const o of n){if(!Ke(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[..._e].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={exitIfFailed:!1,forceColor:!0};if(r.length>0){for(const[t,n]of o){const r=Fe(t,e,n);r&&h.push(fe(r,t,e,m))}for(const[t,n]of s)h.push(fe(Je(n),t,e,m));for(const[t,n]of i)h.push(fe(Ue(e,n),t,e,m));for(const[t,n]of a)h.push(fe(We(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Fe(t,e);n&&h.push(fe(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(fe(Ue(e),t,e,m)),t.hasPubspecYaml&&h.push(fe(We(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(fe(Je(),t,e,m))}const g=await Promise.all(h);(f||g.some(e=>0!==e))&&process.exit(1),e.format&&(u.length>0&&await fe($e(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,{forceColor:!0}),p.length>0&&await fe($e(["YARN","sort-package-json","--",...p]),n.self,e,{forceColor:!0}))}};function Fe(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],$e(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...n?.length?["--"]:[],...n??[]])}return"eslint"===e.preferredLinter?$e(["YARN","eslint","--color",...t.fix||t.format?["--fix"]:[],"--",...n??["."]]):"oxlint"===e.preferredLinter?$e(["YARN","oxlint",...t.fix?["--fix"]:[],...n??["."]]):void 0}function Je(e){return $e(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."]])}function Ue(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[$e(["poetry","run","isort","--profile","black","--filter-files",...n]),$e(["poetry","run","black",...n]),$e(["poetry","run","flake8",...n])]:[$e(["poetry","run","flake8",...n])]).join(" && ")}function We(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push($e(["dart","format",...n])),r.push($e(["dart","analyze",...n])),r.join(" && ")}function Me(e,n,r,o){return"directory"===r&&e.hasOxfmt?[n]:"directory"===r&&"biome"===e.preferredLinter?[t.join(n,"**/{.*/,}*.{"+[...Ce].join(",")+"}"),Le]:"directory"===r&&Ke(e)?[n,Le]:function(e,t){return e.hasOxfmt?Ie.has(t):!!Ke(e)||"biome"===e.preferredLinter&&!Ge(e,t)&&_e.has(t)}(e,o)?[n]:[]}function ze(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 Ye(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 Ve(e){return je.has(e)||De.has(e)||Ne.has(e)||Te.has(e)||Oe.has(e)}function Ge(e,t){return"biome"===e.preferredLinter?je.has(t):"oxlint"===e.preferredLinter?De.has(t):"eslint"===e.preferredLinter&&Ne.has(t)}function Ke(e){return!e.hasOxfmt&&("eslint"===e.preferredLinter||"oxlint"===e.preferredLinter)}function*qe(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const He={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 X(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of qe("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(Qe(n,r),Xe(r),Ze(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(ne,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function Qe(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function Xe(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 Ze(e){delete e.private,delete e.publishConfig,delete e.prettier}const et="file:",tt=[{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 nt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function rt(n){return tt.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const ot=new class{cleanUpLitestream(e){const t=nt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${et}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=nt(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 ${nt(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(et))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=rt(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} ${nt(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=${et}${e} `}else if(e.env.DATABASE_URL?.startsWith(et)){const n=rt(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${et}${r} `}}return`${o}PRISMA studio ${r}`}},st={},it={command:"prisma",describe:"Run prisma commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(at).command(ct).command(lt).command(dt).command(ut).command(pt).command(ft).command(ht).command(mt).command(gt).command(yt).command(bt).demandCommand().strict(!1),handler(){}},at={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:st,async handler(e){const t=await vt(e);for(const n of qe("prisma cleanup-litestream",t))await pe(ot.cleanUpLitestream(n),n,e)}},ct={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:st,async handler(e){const t=await vt(e);for(const e of qe("prisma create-litestream-config",t))wt(e)}},lt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:st,async handler(e){const t=await vt(e),n=kt(e);for(const r of qe("prisma deploy",t))await pe(ot.deploy(r,n),r,e)}},dt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:st,async handler(e){const t=await vt(e);for(const n of qe("prisma deploy-force",t))await pe(ot.deployForce(n),n,e)}},ut={command:"list-backups",describe:"List Litestream backups",builder:st,async handler(e){const t=await vt(e);for(const n of qe("prisma list-backups",t))await pe(ot.listBackups(n),n,e)}},pt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:st,async handler(e){const t=await vt(e),n=kt(e);for(const r of qe("prisma migrate",t))await pe(ot.migrate(r,n),r,e)}},ft={command:"migrate-dev",describe:"Create a migration file",builder:st,async handler(e){const t=await vt(e),n=kt(e);for(const r of qe("prisma migrate-dev",t))await pe(ot.migrateDev(r,n),r,e)}},ht={command:"reset",describe:"Reset DB",builder:st,async handler(e){const t=await vt(e),n=kt(e);for(const r of qe("prisma reset",t))await pe(ot.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of qe("WB_ENV=test prisma reset",await vt(e)))await pe(ot.reset(t,n),t,e)}}},mt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...st,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await vt(e);for(const n of qe("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await pe(ot.restore(n,t),n,e)}}},gt={command:"seed",describe:"Populate DB with seed data",builder:{...st,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await vt(e);for(const n of qe("prisma seed",t))await pe(ot.seed(n,e.file),n,e)}},yt={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...st,"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 vt(e),n=kt(e,["db-url-or-path","restored"]);for(const r of qe("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await pe(ot.studio(r,t,n),r,e)}}},bt={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await vt(e),n=[(e.args?.join(" ")??"").trimEnd(),kt(e,["args"])].filter(Boolean).join(" ");for(const r of qe(`prisma ${n}`,t))await pe(`PRISMA ${n}`,r,e)}};function wt(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 vt(e){const t=await X(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(l.red("No prisma project found.")),process.exit(1)),n}function kt(e,t=[]){const n=[],r=Object.keys(we),o=Object.values(we).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 $e([...n,...i])}const Et={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=Q(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 pe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},At={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of qe("setup",n.descendants)){const r=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await fe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await pe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await fe("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await fe(`poetry env use ${n}`,t,e),await de.promiseAll(),await pe("poetry run pip install --upgrade pip",t,e),await pe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await pe(`${re} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await pe(`${re} playwright install --with-deps`,r,e)}(e)}};function Pt(e){return e.silent?" > /dev/null":""}const St=new Set;async function xt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await jt(t,e))return!1}return!0}(e);n||await $t(e,t);const r=async()=>{St.has(e)||(St.add(e),await $t(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function $t(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("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 R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Rt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await xt(n,t),n}async function jt(e,t){return new Promise(n=>{const r=b();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 Nt=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";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} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(St.has(e))return;St.add(e),me(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ge(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 ":""}--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 Dt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Nt.buildImage(e,t)}async startDev(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?$e(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?$e(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Rt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${$e(["YARN","wb","concurrently",...ve(t),"--kill-others-on-fail",Nt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Nt.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(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?ot.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Pt(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,Nt.stopAndStart(e),n)}async testStart(e,t){return await Rt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Re(r)}`} ${$e(["YARN","wb","concurrently",...ve(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 Rt(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 Tt([...o,...e,...r],n);const i=e.slice(1),a=Ot(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Tt([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:$e(["YARN","wb","concurrently",...ve(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?$e(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?$e(["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 Tt(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="))?$e(e):$e([...e,"--max-failures=1"]):$e(e)}function Ot(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;It.has(o)?t="required":_t.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&Ct.has(e)&&(t="required");continue}n.push(r)}}return n}const It=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"]),_t=new Set(["--only-changed","--update-snapshots","--update-source-method"]),Ct=new Set(["-c","-g","-j"]);const Lt=new class extends Dt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Bt=new class extends Dt{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 Rt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return $e(["YARN","wb","concurrently",...ve(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${$e(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const Ft=new class extends Dt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Jt=new class extends Dt{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} && ${te} 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")} && ${Nt.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 Ut=new class extends Dt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Wt=new class extends Dt{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()}},Mt=["express","fastify","elysia","hono"],zt={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"}},Yt={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(zt),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Re(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Re(String(e))).join(" ")}(e);const t=await X(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=Lt;else if(t.next)o=Ft;else if(r["@remix-run/dev"])o=Ut;else if(r.vite)o=Wt;else if(Mt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Bt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Jt}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await pe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await pe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await pe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await pe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await pe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Vt={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",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"}},Gt={targets:{description:"Test target paths",type:"array"}},Kt={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({...Vt,...Gt}),async handler(n){await async function(n){const r=await X(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.FORCE_COLOR||="3",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;if(d=r.blitz?Lt:r.next?Ft:l["@remix-run/dev"]?Ut:l.vite?Wt:Mt.some(e=>r[e])&&!r["firebase-functions"]?Bt:Jt,console.info(`Running "test" for ${c.name} ...`),a&&e.existsSync(t.join(c.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await pe(d.testUnit(c,t),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const u=o.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await pe(await d.testE2EProduction(c,p,{playwrightArgs:Ht(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await pe(await d.testE2EDev(c,p,{playwrightArgs:Ht(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await qt(c,p,d,Ht(u,s),s);continue;case"docker-debug":await qt(c,p,d,Ht(u,s,["--debug"]),s);continue}if(r.blitz||r.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":await pe(await d.testE2EProduction(c,p,{playwrightArgs:Ht(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await pe(await d.testE2EDev(c,p,{playwrightArgs:Ht(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await pe(await d.testE2EProduction(c,p,{playwrightArgs:Ht(u,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await pe(await d.testE2EProduction(c,p,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await pe("BUN playwright show-trace",c,n)}}}(n)}};async function qt(e,t,n,r,o){e.env.WB_DOCKER||="1",await pe(`${n.buildDocker(e,"test")}${Pt(t)}`,e,t),process.exitCode=await pe(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await pe(Nt.stop(e),e,t)}function Ht(e,t=[],n=[]){const r=Ot(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const Qt={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 X(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;if(i=r.blitz?Lt:r.next?Ft:s["@remix-run/dev"]?Ut:s.vite?Wt:Mt.some(e=>r[e])&&!r["firebase-functions"]?Bt:Jt,console.info(`Running "test-on-ci" for ${o.name} ...`),await fe(Nt.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await fe(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await fe(await i.testStart(o,n),o,n),await de.promiseAll(),o.hasDockerfile&&(o.env.WB_DOCKER||="1",await pe(`${i.buildDocker(o,"test")}${Pt(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await pe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await pe(Nt.stop(o),o,n)}}}(n)}};const Xt={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}`);A(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Zt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await X(n,!1);r||(console.error(l.red("No project found.")),process.exit(1));let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await fe(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.")),process.exit(a)}},en={...Zt,command:"tc"};await n(r(process.argv)).scriptName("wb").options(we).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(oe).command(Ee).command(xe).command(Be).command(He).command(it).command(Et).command(At).command(Yt).command(Kt).command(Qt).command(Xt).command(Zt).command(en).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 tn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!tn){tn=!0;try{A(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2tleXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQmlvbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnQGJpb21lanMvYmlvbWUnKSB8fCB0aGlzLmhhc0RlcGVuZGVuY3koJ2Jpb21lJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRXNsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ2VzbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGZtdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGZtdCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdiaW9tZScgfCAnb3hsaW50JyB8ICdlc2xpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNCaW9tZSkgcmV0dXJuICdiaW9tZSc7XG4gICAgaWYgKHRoaXMuaGFzT3hsaW50KSByZXR1cm4gJ294bGludCc7XG4gICAgaWYgKHRoaXMuaGFzRXNsaW50KSByZXR1cm4gJ2VzbGludCc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24gPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICAgICAgISEoXG4gICAgICAgIHBhY2thZ2VKc29uICYmXG4gICAgICAgIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHxcbiAgICAgICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHxcbiAgICAgICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0pXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uKHRoaXMucGFja2FnZUpzb24pIHx8IGhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uKHRoaXMucm9vdFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgJ1BSSVNNQSBnZW5lcmF0ZSAnLFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZSAnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzICdcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnWUFSTiBibGl0eiBwcmlzbWEgJyA6ICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gLS1idW4gcnVuICcgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmBcbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFpc1J1bm5pbmdPbkJ1biAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICAgIGZvcmNlQ29sb3I6IHR5cGVvZiBhcmd2LmZvcmNlQ29sb3IgPT09ICdib29sZWFuJyA/IGFyZ3YuZm9yY2VDb2xvciA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpLCBmb3JjZUNvbG9yOiBvcHRpb25zLmZvcmNlQ29sb3IgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5mdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKCFjaGlsZC5waWQpIGNvbnRpbnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGtpbGxQcm9jZXNzR3JvdXAoY2hpbGQucGlkKTtcbiAgICAgIHRyZWVLaWxsKGNoaWxkLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgJ1NJR1RFUk0nKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdhc3RybycsXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdncWwnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzdmVsdGUnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IGVzbGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbLi4uZXNsaW50RXh0ZW5zaW9ucywgJ2FzdHJvJywgJ3N2ZWx0ZScsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gICAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnczogc3RyaW5nW107XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4geyBmaWxlS2luZCwgZmlsZVBhdGggfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHsgZmlsZUtpbmQsIGZpbGVQYXRoIH0gb2YgbGludFRhcmdldHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgbGludFBhdGgsIHByb2plY3QgfSBvZiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgcHl0aG9uRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICBkYXJ0RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScgfHxcbiAgICAgICAgICAgIGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fFxuICAgICAgICAgICAgc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTm8gbGludGVyIGZvdW5kIGZvciAke3Byb2plY3QubmFtZX0uIEluc3RhbGwgRVNMaW50IG9yIEJpb21lLmApKTtcbiAgICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBbLi4ubmV3IFNldChwYWNrYWdlSnNvbkZpbGVQYXRocyldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW50UHJvbWlzZXM6IFByb21pc2U8bnVtYmVyPltdID0gW107XG4gICAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6IHRydWUgfSBhcyBjb25zdDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChcbiAgICAgICAgICBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkUG9ldHJ5Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZERhcnRDb21tYW5kKGFyZ3YsIGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiAhcHJvamVjdC5oYXNTb3VyY2VDb2RlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykge1xuICAgICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRQb2V0cnlDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZERhcnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxpbnRFeGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChsaW50UHJvbWlzZXMpO1xuXG4gICAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgfHwgbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICAgJy0tJyxcbiAgICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxcbiAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPixcbiAgICAnZml4JyB8ICdmb3JtYXQnXG4gID4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykge1xuICAgIGxldCBiaW9tZUFyZ3M6IHN0cmluZ1tdO1xuICAgIGlmIChhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCkge1xuICAgICAgYmlvbWVBcmdzID0gWydjaGVjaycsICctLWZpeCddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5maXgpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCcsICctLWZpeCddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnZm9ybWF0JywgJy0tZml4J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCddO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ0JVTicsXG4gICAgICAnYmlvbWUnLFxuICAgICAgLi4uYmlvbWVBcmdzLFxuICAgICAgJy0tY29sb3JzPWZvcmNlJyxcbiAgICAgICctLW5vLWVycm9ycy1vbi11bm1hdGNoZWQnLFxuICAgICAgJy0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZScsXG4gICAgICAuLi4oZmlsZXM/Lmxlbmd0aCA/IFsnLS0nXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbXSksXG4gICAgXSk7XG4gIH1cbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnZXNsaW50JyxcbiAgICAgICctLWNvbG9yJyxcbiAgICAgIC4uLihhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgICctLScsXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ294bGludCcsIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSwgLi4uKGZpbGVzID8/IFsnLiddKV0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ294Zm10JywgJy0td3JpdGUnLCAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsIC4uLihmaWxlcyA/PyBbJy4nXSldKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Q29tbWFuZChcbiAgYXJndjogUGljazxcbiAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPixcbiAgICAnZml4JyB8ICdmb3JtYXQnXG4gID4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgY29uc3QgY29tbWFuZHMgPVxuICAgIGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0XG4gICAgICA/IFtcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4udGFyZ2V0c10pLFxuICAgICAgICBdXG4gICAgICA6IFtidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4udGFyZ2V0c10pXTtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydENvbW1hbmQoXG4gIGFyZ3Y6IFBpY2s8XG4gICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj4sXG4gICAgJ2ZpeCcgfCAnZm9ybWF0J1xuICA+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoYXJndi5maXggfHwgYXJndi5mb3JtYXQpIHtcbiAgICBjb21tYW5kcy5wdXNoKGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50YXJnZXRzXSkpO1xuICB9XG4gIGNvbW1hbmRzLnB1c2goYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50YXJnZXRzXSkpO1xuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhcbiAgYXJndjogUGljazxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPiwgJ2ZpbGVzJz4gJiB7XG4gICAgJy0tJz86IHVua25vd25bXTtcbiAgICBfOiB1bmtub3duW107XG4gIH1cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFxuICAgIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnICYmXG4gICAgIXN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pICYmXG4gICAgcHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHBhdGguam9pbihmaWxlUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKSxcbiAgICAgIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4sXG4gICAgXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8XG4gICAgZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fFxuICAgIHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykgcmV0dXJuIGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcpIHJldHVybiBlc2xpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnIHx8IHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBwcmlzbWEgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UnLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpc3RCYWNrdXBzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXN0LWJhY2t1cHMnLFxuICBkZXNjcmliZTogJ0xpc3QgTGl0ZXN0cmVhbSBiYWNrdXBzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGlzdEJhY2t1cHMocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgLy8gRm9yY2UgdG8gcmVzZXQgdGVzdCBkYXRhYmFzZVxuICAgIGlmIChwcm9jZXNzLmVudi5XQl9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WID0gJ3Rlc3QnO1xuICAgICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnV0JfRU5WPXRlc3QgcHJpc21hIHJlc2V0JywgYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6IFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBXZSBzaG91bGQgc3RvcCBEb2NrZXIgY29udGFpbmVycyBmaXJzdCBiZWNhdXNlIGBraWxsLXBvcnRgIG1heSBmYWlsIHRvIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMuXG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gJHthbGxvY2F0ZVR0eSA/ICctaXQgJyA6ICcnfS0tcHVibGlzaCAke3Byb2plY3QuZW52LlBPUlR9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kLCBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqIFJhdyBQbGF5d3JpZ2h0IGFyZ3MgZm9yd2FyZGVkIGFmdGVyIGB3YiB0ZXN0IC0tIC4uLmAgKi9cbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwID0gc2hvdWxkV2FpdEFuZE9wZW5BcHA7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkSW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICBhc3luYyBzdGFydERldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXN5bmMgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3diJyxcbiAgICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICAgIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyksXG4gICAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgICBdKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID1cbiAgICAgIGVjb3N5c3RlbUNvbmZpZ1BhdGggPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHthcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWAudHJpbSgpLFxuICAgICAgICAgICAgYG5vZGUgZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXTtcblxuICAgIHJldHVybiBbLi4uKHByb2plY3QuaGFzUHJpc21hID8gcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLCAuLi5jb21tYW5kc11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKGNtZCkgPT4gYCR7Y21kfSAke3RvRGV2TnVsbChhcmd2KX1gLnRyaW0oKSlcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVEb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QpLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzIGxpa2UgQmxpdHouanMuXG4gICAgcmV0dXJuIGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgLi4uKHRhcmdldHMgJiYgdGFyZ2V0cy5sZW5ndGggPiAwID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ10pLFxuICAgICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgICAgXSl9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZXN0Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IHR5cGUgVGVzdENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFRlc3RDb21tYW5kT3B0aW9ucz4gJiB7ICctLSc/OiBzdHJpbmdbXSB9O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9KSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndiBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAoYXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBhcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5DSSB8fD0gJzEnO1xuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQXZvaWQgbGF1bmNoaW5nIGRldiBzZXJ2ZXJzIGZvciBidWlsZC1vbmx5IHBhY2thZ2VzOyBvbmx5IHN0YXJ0IGEgc2VydmVyIHdoZW4gRTJFIG5lZWRzIGl0LlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsieWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiIsImVudiIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlZmF1bHQiLCJ2ZXJib3NlIiwiYWxpYXMiLCJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsInVuZGVmaW5lZCIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm1lc3NhZ2UiLCJzdGFjayIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc05hTiIsImlzRmluaXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiaGFzQmlvbWUiLCJoYXNEZXBlbmRlbmN5IiwiaGFzRXNsaW50IiwiaGFzT3hsaW50IiwiaGFzT3hmbXQiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwicGFja2FnZU5hbWUiLCJoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbiIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwicGVlckRlcGVuZGVuY2llcyIsInJvb3RQYWNrYWdlSnNvbiIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiY29uZmlndXJlRW52Iiwib25TaWduYWwiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJwcmludGFibGVTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwicnVubmFibGVTY3JpcHQiLCJjYXNjYWRlT3B0aW9uIiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsIkJvb2xlYW4iLCJkZXRhY2hlZCIsImludGVycnVwdGVkU2lnbmFsIiwiZmlyc3RSZXN1bHQiLCJzdG9wUmVzdWx0Iiwic3RvcHBpbmciLCJyZXN1bHRzIiwid2FpdEZvckV4aXRQcm9taXNlcyIsImNoaWxkIiwic2V0dGxlZCIsInNldHRsZSIsImtpbGxPdGhlcnMiLCJraWxsT3RoZXJzT25GYWlsIiwic2hvdWxkU3RvcE90aGVycyIsInRlcm1pbmF0ZUNoaWxkcmVuIiwib25jZSIsImdldEV4aXRDb2RlIiwic3RvcEFsbCIsInN0b3BPblNpZ2ludCIsInN0b3BPblNpZ3Rlcm0iLCJzdG9wT25TaWdxdWl0IiwiYWxsIiwicmVzdWx0IiwicnVuQ29uY3VycmVudGx5IiwiY29uc3RhbnRzIiwic2lnbmFscyIsImtpbGxQcm9jZXNzR3JvdXAiLCJraWxsUG9ydElmTm9uQ2lDb21tYW5kIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwiYnVpbGRTaGVsbENvbW1hbmQiLCJhcmciLCJzaGVsbEVzY2FwZUFyZ3VtZW50IiwiYmlvbWVFeHRlbnNpb25zIiwiZXNsaW50RXh0ZW5zaW9ucyIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJsaW50VGFyZ2V0cyIsImdldExpbnRUYXJnZXRGaWxlcyIsImxpbnRGaWxlUGF0aHNCeVByb2plY3QiLCJveGZtdEZpbGVQYXRoc0J5UHJvamVjdCIsInB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCIsImRhcnRGaWxlUGF0aHNCeVByb2plY3QiLCJwcmV0dGllckZpbGVQYXRocyIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwicHJldHRpZXJBcmdzIiwic29ydFBhY2thZ2VKc29uQXJncyIsIm1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMiLCJmaWxlIiwiZmlsZUtpbmQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJnZXRMaW50VGFyZ2V0RmlsZUtpbmQiLCJleHRlbnNpb24iLCJleHRuYW1lIiwiZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzIiwibGludFBhdGgiLCJnZXRFeHBsaWNpdExpbnRUYXJnZXRzIiwicHl0aG9uRmlsZVBhdGhzIiwiZGFydEZpbGVQYXRocyIsInN1cHBvcnRzTGludGluZ0V4dGVuc2lvbiIsImxpbnRGaWxlUGF0aHMiLCJmb3JtYXR0ZXJQYXRoIiwiYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MiLCJveGZtdEZpbGVQYXRocyIsImlzUG90ZW50aWFsTGludFRhcmdldCIsInNlbGZEaXJQYXRoIiwibmVlZHNQcmV0dGllciIsInByb2plY3RQYXR0ZXJuIiwiYnVpbGRQcmV0dGllckFyZ3MiLCJsaW50UHJvbWlzZXMiLCJsaW50UnVuT3B0aW9ucyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZE94Zm10Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Q29tbWFuZCIsImJ1aWxkRGFydENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiYmlvbWVBcmdzIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsInN0YXJ0c1dpdGgiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwic3RyaWN0IiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsInJlcXVpcmVkRW52VmFycyIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVkiLCJtaXNzaW5nRW52VmFycyIsInJldGVudGlvbkNoZWNrSW50ZXJ2YWwiLCJsaXRlc3RyZWFtQ29uZmlnIiwid3JpdGVGaWxlU3luYyIsInJlYXNvbiIsImZpbHRlcmVkIiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwicGFzc3Rocm91Z2hBcmdzIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsInNpbGVudCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiYXZhaWxhYmxlIiwiaG9zdCIsInByb2JlUG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImtpbGxGdW5jIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiZXJyIiwiY2xvc2UiLCJsaXN0ZW4iLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGRJbWFnZSIsInN0b3BBbmRTdGFydCIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsIkJhc2VTY3JpcHRzIiwic2hvdWxkV2FpdEFuZE9wZW5BcHAiLCJidWlsZERvY2tlciIsInN0YXJ0RGV2Iiwic3RhcnREZXZQcm90ZWN0ZWQiLCJ3YWl0QW5kT3BlbkFwcCIsInN0YXJ0UHJvZHVjdGlvbiIsInN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZCIsInN0YXJ0VGVzdCIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0IiwiZWNvc3lzdGVtQ29uZmlnUGF0aCIsImZpbmRFY29zeXN0ZW1Db25maWdQYXRoIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsIl8xIiwiXzIiLCJyZW1peFNjcmlwdHMiLCJ2aXRlU2NyaXB0cyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsIm1vZGUiLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsIm5leHQiLCJ2aXRlIiwiZTJlIiwiYXJndW1lbnRzQnVpbGRlciIsInRlc3RDb21tYW5kIiwidGVzdFRhcmdldHMiLCJzaG91bGRSdW5FMmUiLCJzaG91bGRSdW5Vbml0IiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJyZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMiLCJ1bml0VGFyZ2V0cyIsInVuaXRBcmd2IiwidW5pdFRpbWVvdXQiLCJlMmVUYXJnZXRzIiwiZTJlQXJndiIsImJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUiLCJ0ZXN0T25Eb2NrZXIiLCJXQl9ET0NLRVIiLCJoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyIsInRlc3RPbkNpQ29tbWFuZCIsInRlc3RPbkNpIiwidHJlZUtpbGxDb21tYW5kIiwicG9zaXRpb25hbCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiI0aEJBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWEMsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE0RlgsTUFBTUMsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFT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QUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk3RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFaEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJcUIsRUFBRXJCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJc0IsRUFBRXRCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJdUIsRUFBRXZCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNkIsRUFBRTdCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJOEIsRUFBRTlCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJK0IsRUFBRS9CLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFNkIsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUluQixFQUFFNkIsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUl6QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdrQixHQUFHLEVBQUVDLElBQUksSUFBSXJCLEVBQUVJLEdBQUdpQixHQUFHLEVBQUVELElBQUksSUFBSXRCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJM0IsRUFBRW1CLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFcUIsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUk3QixFQUFFcUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk5QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FB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QUM3QnR2QixRQUFRdXZCLE1BQU05aEIsRUFDaEIsRTdDbUhHLFNBQThDbUIsR0FFL0NBLEVBQVFtRCxNQUFRbkQsRUFBUTRnQixtQkFDMUI1Z0IsRUFBUW1ELEtBQU9uRCxFQUFRbUQsS0FBS2lFLFFBQVEsR0FBR3BILEVBQVE0Z0Isb0JBQXFCLElBRWpFN2dCLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNbUIsS0FBT3BELE9BQU9tRCxLQUFLakIsR0FBVSxDQUN0QyxNQUFNNmdCLEVBQVczZixFQUFJaUssZUFFbkIwVixFQUFTdlAsV0FBVyxTQUNwQnVQLEVBQVN2UCxXQUFXLFVBQ3BCdVAsRUFBU3ZQLFdBQVcsV0FDUCxnQkFBYnVQLEdBQ2EsYUFBYkEsV0FHTzdnQixFQUFRa0IsRUFFbkIsQ0FDRixDNkN4SUk0ZixDQUFxQzF2QixRQUFRMUIsT0FFOUMyRCxRQUFRbVMsSUFDUm5TLFFBQVErWCxJQUNSL1gsUUFBUStaLElBQ1IvWixRQUFRa2IsSUFDUmxiLFFBQVF1ZSxJQUNSdmUsUUFBUXdoQixJQUNSeGhCLFFBQVFxa0IsSUFDUnJrQixRQUFRMGtCLElBQ1Ixa0IsUUFBUXVvQixJQUNSdm9CLFFBQVFpckIsSUFDUmpyQixRQUFRbXNCLElBQ1Juc0IsUUFBUXFzQixJQUNScnNCLFFBQVF3c0IsSUFDUnhzQixRQUFRaXRCLElBQ1IzSyxnQkFDQUMsU0FDQTBDLFFBR0gsV0FDRSxJQUFJeUksRUFBaUJ2d0IsRUFBS3NTLFFBQVEsSUFBSTdGLGdCQUFnQitqQixLQUFLQyxVQUMzRCxNQUFRaGlCLEVBQUdRLFdBQVdqUCxFQUFLK0QsS0FBS3dzQixFQUFnQixrQkFDOUNBLEVBQWlCdndCLEVBQUtzUyxRQUFRaWUsR0FLaEMsT0FIb0J6akIsS0FBS21FLE1BQU14QyxFQUFHQyxhQUFhMU8sRUFBSytELEtBQUt3c0IsRUFBZ0IsZ0JBQWlCLFNBR3ZFekksT0FDckIsQ0FaVzRJLElBQ1JDLE9BQU94aUIsS0FhVixJQUFJeWlCLElBQWUsRUFDbkIsSUFBSyxNQUFNbndCLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekNHLFFBQVE2RCxHQUFHaEUsRUFBUSxLQUNqQixJQUFJbXdCLEdBQUosQ0FFQUEsSUFBZSxFQUNmLElBQ0Vyd0IsRUFBU0ssUUFBUUosSUFDbkIsQ0FBRSxNQUFPSCxHQUNQNEUsUUFBUUUsS0FBSyxzQkFBc0J2RSxRQUFRSix3QkFBeUJILEVBQ3RFLENBQ0FPLFFBQVFtWixNQVJVIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzUsNiw3LDgsOV19