@willbooster/wb 13.12.3 → 13.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +2 -1
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
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import l from"chalk";import{globby as d}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import w from"node:fs/promises";import{createServer as y}from"node:net";import{distance as b}from"fastest-levenshtein";const v={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const k=new Map;function A(e){const n=k.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return k.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function P(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{$("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(x(e))return;throw e}}(e);const n=function(e){const{stdout:t}=$("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)S(e,t)}function S(e,t){try{process.kill(e,t)}catch(e){if(x(e))return;throw e}}function $(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new 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 x(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 j(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";const l=D(process.stdout,n?.omitBlankLinesWhilePrinting),d=D(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&l.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&d.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{P(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),l.flush(),d.flush(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}const O=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function D(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)N(t)||e.write(`${t}\n`)},flush:()=>{N(n)||e.write(n),n=""}}}function N(e){return 0===e.replaceAll(O,"").trim().length}function T(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function I(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function C(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
|
|
2
2
|
/**
|
|
3
3
|
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
|
4
4
|
*
|
|
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
|
|
|
6
6
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
7
7
|
* @copyright Chen, Yi-Cyuan 2015-2023
|
|
8
8
|
* @license MIT
|
|
9
|
-
*/const _=[..."0123456789abcdef"],C=[6,1536,393216,100663296],B=[0,8,16,24],L=[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 F=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class z{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<<B[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<B[3&i++],t[i>>2]|=(128|63&a)<<B[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<B[3&i++],t[i>>2]|=(128|a>>6&63)<<B[3&i++],t[i>>2]|=(128|63&a)<<B[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<B[3&i++],t[i>>2]|=(128|a>>12&63)<<B[3&i++],t[i>>2]|=(128|a>>6&63)<<B[3&i++],t[i>>2]|=(128|63&a)<<B[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];W(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];W(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=_[o>>4&15]+_[15&o]+_[o>>12&15]+_[o>>8&15]+_[o>>20&15]+_[o>>16&15]+_[o>>28&15]+_[o>>24&15];i%e===0&&(t=F(t),W(t),s=0)}return r&&(o=t[s],a+=_[o>>4&15]+_[15&o],r>1&&(a+=_[o>>12&15]+_[o>>8&15]),r>2&&(a+=_[o>>20&15]+_[o>>16&15])),a}}const W=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,w,y,b,v,k,A,E,P,S,$,x,R,j,O,D,N,T,I,_,C,B,F,z,W,M,U,J,Y,V,q,G,K,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],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,U=e[40]<<18|e[41]>>>14,J=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,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,C=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,T=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,z=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,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,W=e[38]<<8|e[39]>>>24,M=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~$&R,e[11]=S^~x&j,e[20]=I^~C&F,e[21]=_^~B&z,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=$^~R&O,e[13]=x^~j&D,e[22]=C^~F&W,e[23]=B^~z&M,e[32]=q^~K&Q,e[33]=G^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&A,e[5]=b^~k&E,e[14]=R^~O&N,e[15]=j^~D&T,e[24]=F^~W&U,e[25]=z^~M&J,e[34]=K^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~T&S,e[26]=W^~U&I,e[27]=M^~J&_,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=A^~h&g,e[9]=E^~m&w,e[18]=N^~P&$,e[19]=T^~S&x,e[28]=U^~I&C,e[29]=J^~_&B,e[38]=Z^~Y&q,e[39]=ee^~V&G,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=L[r],e[1]^=L[r+1]},M=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(J.decode(e))],create:([e])=>U.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]))}(),U=new TextEncoder,J=new TextDecoder("utf-8");function Y(e,t=M){return JSON.stringify(G(e,t))}function V(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 q=[];function G(e,t=M){const n=V(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=V(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(q.length<e){const t=q.length;q.length=e,q.fill(-2,t,e)}return q.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 K(e,t){return function(e){return new z(512,C,512).update(e).hex()}(Y([e,t]))}const H=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=K}={}){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:K});function Q(e){return!!e&&"0"!==e&&"false"!==e}let X;class Z{static{[X]=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 w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,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]),b=t[3],v=!c,k=1===o,A=3===o,E=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),$[t].call(o,s)}}if(!v){var $={},x=[],R=A?"get":E||k?"set":"value";if(l?(u||k?$={get:T(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:$[R]=b,u||T($[R],r,P?"":R)):u||($=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+$[R].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var j=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},_={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,j,_),I.v=1,y(i,"class decorators","return")&&(j=i);else if(_.static=d,_.private=l,i=_.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?P?function(e){return h(e),$.value}:S("get",0,h):function(e){return e[r]}),P||A||(i.set=l?S("set",0,h):function(e,t){e[r]=t}),j=D.call(N,k?{get:$.get,set:$.set}:$[R],_),I.v=1,k){if("object"==typeof j&&j)(i=y(j.get,"accessor.get"))&&($.get=i),(i=y(j.set,"accessor.set"))&&($.set=i),(i=y(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):$[R]=j)}return o<2&&c.push(w(x,d,1),w(a,d,0)),u||v||(l?k?c.splice(-1,0,S("get",d),S("set",d)):c.push(P?$[R]:y.call.bind($[R])):f(e,r,$)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(w(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;b(t?e:e.prototype,i,h,f?"#"+p:I(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return N(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=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[H,3,"isBunAvailable"],[H,3,"buildCommand"],[H,3,"rootDirPath"],[H,3,"dockerfile"],[H,3,"hasDockerfile"],[H,3,"hasSourceCode"],[H,3,"name"],[H,3,"dockerImageName"],[H,3,"env"],[H,3,"packageJson"],[H,3,"packageJsonPath"],[H,3,"hasPrisma"],[H,3,"hasDrizzle"],[H,3,"databaseOrm"],[H,3,"hasVitest"],[H,3,"hasOxlint"],[H,3,"hasOxfmt"],[H,3,"hasPrettier"],[H,3,"hasPoetryLock"],[H,3,"hasPubspecYaml"],[H,3,"preferredLinter"],[H,3,"hasPlaywrightConfig"],[H,3,"skipLaunchingServerForPlaywright"],[H,3,"dockerPackageJson"],[H,3,"binExists"],[H,3,"rootPackageJson"]]).e}argv=void X(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.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(Q(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function ee(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new Z(o,n,r)}async function te(e,t=!0,n){const r=ne(e,t,n);if(r)return{...r,descendants:r.root===r.self?await re(e,r.root,t):[r.self]}}function ne(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new Z(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 Z(s,n,r))}return{root:i,self:s}}async function re(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 Z(r,n,o));return s}const oe=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),se=oe?"bun --bun run":"node",ie=oe?"bun":"yarn",ae=oe?"bun --bun run":"yarn",ce={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=ee(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?oe?"bun run build":"yarn build":void 0);if(!i)return console.info(d.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return de(s,n),!0;const[a,l,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),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])=>!le.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=>(ue.some(t=>e.includes(t))||pe.some(t=>e.endsWith(t)))&&!fe.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!de(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function de(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 le=new Set(["CI","PWDEBUG","TMPDIR"]);const ue=["src/","public/"],pe=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],fe=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const he=new m,me={exitIfFailed:!0};async function ge(e,t,n,r=me){const o=ye(e,t);if(be(o.printable,t,n.silent?"Command":"Start"),n.verbose&&be(o.runnable,t,"Start (raw)",!0),n.dryRun)return ve(o.printable,0,r,{silentSuccess:n.silent}),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ke(t.env,r),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,killOnExit:!0,printingStdout:n.silent,printingStderr:n.silent,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose});return r.onSignal?.(s.signal),ve(o.printable,s.status,r,{silentSuccess:n.silent}),s.status??1}function we(e,t,n,r=me){return he.runAndWaitForReturnValue(async()=>{const o=ye(e,t);if(be(o.printable,t,"Start (parallel)",!0),n.dryRun)return be(o.printable,t,"Started (log)"),n.verbose&&be(o.runnable,t,"Started (raw)",!0),ve(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ke(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),be(o.printable,t,"Started (log)"),n.verbose&&be(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),ve(o.printable,s.status,r),s.status??1})}function ye(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 ",oe?"bun --bun run ":"yarn run ");oe&&(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=Ae(n.replaceAll("YARN ",`${ae} `)),o=Ae(n.replaceAll("YARN playwright ",`${ae} playwright `).replaceAll("YARN ",!oe&&t.binExists?"":`${ae} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${ae} dotenv${s} -- ${r}`,runnable:o}}function be(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ve(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(d.green(d.bold("Finished:"),e))}else console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function ke(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function Ae(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const Ee={...b,"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 Pe(e){const t=[];for(const n of Object.keys(b)){const r=Se(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 Se(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const $e={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...Ee,"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=ee(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(ye(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:ke(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),d=t.map((n,o)=>new Promise(d=>{let l=!1;const u=n=>{l||(l=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Re(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(xe(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Re(t,e)))},u=()=>{l("SIGINT")},p=()=>{l("SIGTERM")},f=()=>{l("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(d),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return xe(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function xe(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Re(e,t){const n=je(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Oe))return!1;await De(Math.min(100,t-Date.now()))}return!0}(n)&&je(n,"SIGKILL")}function je(e,t){const n=[];for(const r of e)try{if(!Ne(r,t))continue;n.push(r),E(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function Oe(e){try{return process.kill(-e,0),!1}catch(e){return!!Te(e)}}async function De(e){await new Promise(t=>setTimeout(t,e))}function Ne(e,t){try{return process.kill(-e,t),!0}catch(e){if(Te(e))return!1;throw e}}function Te(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const Ie={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=ee(e);t||(console.error(d.red("No project found.")),process.exit(1));if(Q(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 _e(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(Ce(t))}(e,t))return;const n=function(e){return Ce(e).trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Ce(e){return e.replaceAll(/\(node:\d+\) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set\.\n\(Use `node --trace-warnings \.\.\.` to show where the warning was created\)\n?/g,"")}function Be(e){return e.map(e=>Le(e)).join(" ")}function Le(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const Fe=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),ze=new Set(["py"]),We=new Set(["dart"]),Me=new Set([...Fe,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Ue=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Je=new Set([...Ue].filter(e=>!Me.has(e))),Ye="!**/test{-,/}fixtures/**",Ve={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await qe(e);t&&process.exit(t)}};async function qe(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await te(e,!1);if(!n)return console.error(d.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],l=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...ot(n.descendants,u,r));for(const{lintPath:t,project:l}of st(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||ze.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||We.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||at(l,p)){const n=o.get(l)??[];if(n.push(t),o.set(l,n),e.format)if("directory"===r&&l.hasOxfmt){const e=s.get(l)??[];e.push(t),s.set(l,e),c.push(rt(t),Ye)}else for(const e of nt(l,t,r,p))if(l.hasOxfmt){const t=s.get(l)??[];t.push(e),s.set(l,t)}else c.push(e)}else if(e.format&&(Ue.has(p)||Me.has(p)))if(l.hasOxfmt&&Me.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else Ue.has(p)&&c.push(t);else it(p)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Je].join(",")}}`,Ye]);for(const o of n){if(!ct(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Ue].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:!e.printAllOutput};if(r.length>0){for(const[t,n]of o){const r=Xe(t,e,n);r&&h.push(Ge(r,t,e,m))}if(e.format)for(const[t,n]of s)h.push(Ge(Ze(n),t,e,m));for(const[t,n]of i)h.push(Ge(et(e,n),t,e,m));for(const[t,n]of a)h.push(Ge(tt(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Xe(t,e);n&&h.push(Ge(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(Ge(et(e),t,e,m)),t.hasPubspecYaml&&h.push(Ge(tt(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(Ge(Ze(),t,e,m))}const g=await Promise.all(h);Ke(g,e);const y=g.map(e=>e.exitCode);if(f||y.some(e=>0!==e))return 1;if(e.format){if(u.length>0&&n.self.hasPrettier){const t=await Ge(Be(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,m);Ke([t],e),y.push(t.exitCode)}if(p.length>0){const t=await Ge(Be(["YARN","sort-package-json","--",...p]),n.self,e,m);Ke([t],e),y.push(t.exitCode)}}return y.some(e=>0!==e)?1:0}function Ge(e,t,n,r){if(n.silent){const o=ye(e,t);return Qe(o.printable,t.dirPath),function(e,t,n,r=me){return he.runAndWaitForReturnValue(async()=>{const o=ye(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ke(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,{...r,printRawOutput:!0}).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return we(e,t,n,r).then(e=>({exitCode:e}))}function Ke(e,t){if(!t.silent)for(const n of e)"output"in n&&(t.printAllOutput?He(n):_e(n.exitCode,n.output))}function He(e){if(Qe(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(d.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function Qe(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}function Xe(e,t,n){if("oxlint"===e.preferredLinter)return Be(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function Ze(e){return Be(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function et(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[Be(["poetry","run","isort","--profile","black","--filter-files",...n]),Be(["poetry","run","black",...n]),Be(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[Be(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function tt(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(Be(["dart","format",...n])),r.push(Be(["dart","analyze",...n])),r.join(" && ")}function nt(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&ct(e)?[t,Ye]:function(e,t){return e.hasOxfmt?Me.has(t):!!ct(e)||Je.has(t)}(e,r)?[t]:[]}function rt(e){return t.join(e,`**/{.*/,}*.{${[...Je].join(",")}}`)}function ot(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 st(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 it(e){return Fe.has(e)||ze.has(e)||We.has(e)}function at(e,t){return"oxlint"===e.preferredLinter&&Fe.has(t)}function ct(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}function*dt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const lt=["@willbooster/wb","build-ts"],ut={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 te(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of dt("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(pt(n,r),ft(r),ht(n,r),mt(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(ie,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function pt(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of lt){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function ft(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 ht(e,t){if(!e.outside||"bun"!==ie)return;const n=Object.keys(t.devDependencies??{});if(0===n.length)return;const r=t.scripts??{};r["docker/install/prepare"]=`bun remove ${n.join(" ")}`,t.scripts=r,console.info("Added docker/install/prepare script.")}function mt(e){delete e.private,delete e.publishConfig,delete e.prettier}const gt="file:";const wt=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(gt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},yt="file:",bt=[{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 vt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function kt(n){return bt.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const At=new class{cleanUpLitestream(e){const t=vt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${yt}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=vt(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 ${vt(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(yt))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=kt(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} ${vt(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=${yt}${e} `}else if(e.env.DATABASE_URL?.startsWith(yt)){const n=kt(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${yt}${r} `}}return`${o}PRISMA studio ${r}`}},Et={},Pt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(St).command($t).command(xt).command(Rt).command(jt).command(Ot).command(Dt).command(Nt).command(Tt).command(It).command(_t).command(Ct).demandCommand().strict(!1),handler(){}},St={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma cleanup-litestream",t))await ge(At.cleanUpLitestream(n),n,e)}},$t={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:e}of zt("prisma create-litestream-config",t))Bt(e)}},xt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Et,async handler(e){const t=await Lt(e),n=Wt(e);for(const{orm:r,project:o}of zt("db deploy",t))await ge(Ft(r).deploy(o,n),o,e)}},Rt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma deploy-force",t))await ge(At.deployForce(n),n,e)}},jt={command:"list-backups",describe:"List Litestream backups",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma list-backups",t))await ge(At.listBackups(n),n,e)}},Ot={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Et,async handler(e){const t=await Lt(e),n=Wt(e);for(const{orm:r,project:o}of zt("db migrate",t))await ge(Ft(r).migrate(o,n),o,e)}},Dt={command:"migrate-dev",describe:"Create a migration file",builder:Et,async handler(e){const t=await Lt(e),n=Wt(e);for(const{orm:r,project:o}of zt("db migrate-dev",t))await ge(Ft(r).migrateDev(o,n),o,e)}},Nt={command:"reset",describe:"Reset DB",builder:Et,async handler(e){const t=await Lt(e),n=Wt(e);for(const{orm:r,project:o}of zt("db reset",t))await ge(Ft(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of zt("WB_ENV=test db reset",await Lt(e)))await ge(Ft(t).reset(r,n),r,e)}}},Tt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Et,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ge(At.restore(n,t),n,e)}}},It={command:"seed",describe:"Populate DB with seed data",builder:{...Et,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Lt(e);for(const{orm:n,project:r}of zt("db seed",t))await ge(Ft(n).seed(r,e.file),r,e)}},_t={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...Et,"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 Lt(e),n=Wt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of zt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ge(Ft(r).studio(o,t,n),o,e)}}},Ct={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await Lt(e),n=[(e.args?.join(" ")??"").trimEnd(),Wt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of zt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await ge(t,o,e)}}};function Bt(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 Lt(e,t){const n=await te(e);n||(console.error(d.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(d.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function Ft(e){return"prisma"===e?At:wt}function*zt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of dt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Wt(e,t=[]){const n=[],r=Object.keys(Ee),o=Object.values(Ee).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 Be([...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=ee(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 ge(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Ut={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await te(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of dt("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await we(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ge("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await we("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await we(`poetry env use ${n}`,t,e),await he.promiseAll(),await ge("poetry run pip install --upgrade pip",t,e),await ge("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ge(`${ae} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ge(`${ae} playwright install --with-deps`,r,e)}(e)}};function Jt(e){return e.silent?" > /dev/null":""}const Yt=new Set;async function Vt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Kt(t,e))return!1}return!0}(e);n||await qt(e,t);const r=async()=>{Yt.has(e)||(Yt.add(e),await qt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function qt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await 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 Gt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Vt(n,t),n}async function Kt(e,t){return new Promise(n=>{const r=y();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Ht=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(Yt.has(e))return;Yt.add(e),be(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ve(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 Qt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Ht.buildImage(e,t)}async startDev(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?Be(["YARN","wb","concurrently",...Pe(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?Be(["YARN","wb","concurrently",...Pe(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Gt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Be(["YARN","wb","concurrently",...Pe(t),"--kill-others-on-fail",Ht.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Ht.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?At.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Jt(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,Ht.stopAndStart(e),n)}async testStart(e,t){return await Gt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Le(r)}`} ${Be(["YARN","wb","concurrently",...Pe(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 Gt(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 Xt([...o,...e,...r],n);const i=e.slice(1),a=Zt(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Xt([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Be(["YARN","wb","concurrently",...Pe(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?Be(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Be(["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 Xt(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="))?Be(e):Be([...e,"--max-failures=1"]):Be(e)}function Zt(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;en.has(o)?t="required":tn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&nn.has(e)&&(t="required");continue}n.push(r)}}return n}const en=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"]),tn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),nn=new Set(["-c","-g","-j"]);const rn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const on=new class extends Qt{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 Gt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Be(["YARN","wb","concurrently",...Pe(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Be(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const sn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const an=new class extends Qt{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} && ${se} 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")} && ${Ht.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 cn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const dn=new class extends Qt{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()}},ln=["express","fastify","elysia","hono"],un={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"}},pn={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(un),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Le(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Le(String(e))).join(" ")}(e);const t=await te(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=rn;else if(t.next)o=sn;else if(r["@remix-run/dev"])o=cn;else if(r.vite)o=dn;else if(ln.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=on;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=an}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ge(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ge(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ge(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ge(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ge(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},fn={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"}},hn={targets:{description:"Test target paths",type:"array"}},mn={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({...fn,...hn}),async handler(e){await gn(e)}};async function gn(n){const r=await te(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;l=r.blitz?rn:r.next?sn:d["@remix-run/dev"]?cn:d.vite?dn:ln.some(e=>r[e])&&!r["firebase-functions"]?on:an,console.info(`Running "test" for ${c.name} ...`);const u=wn(c);if(a&&!1!==u){const e=o.filter(e=>e.includes("/unit")),t=e.length>0?e:u.length>0?u:void 0,r={...n,targets:t};await ge(l.testUnit(c,r),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const p=o.filter(e=>e.includes("/e2e")),f={...n,targets:p.length>0?p:void 0};switch(n.e2e){case"headless":await ge(await l.testE2EProduction(c,f,{playwrightArgs:bn(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await ge(await l.testE2EDev(c,f,{playwrightArgs:bn(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await yn(c,f,l,bn(p,s),s);continue;case"docker-debug":await yn(c,f,l,bn(p,s,["--debug"]),s);continue}if(r.blitz||r.next||d["@remix-run/dev"]||d.vite)switch(n.e2e){case"headed":await ge(await l.testE2EProduction(c,f,{playwrightArgs:bn(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await ge(await l.testE2EDev(c,f,{playwrightArgs:bn(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await ge(await l.testE2EProduction(c,f,{playwrightArgs:bn(p,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await ge(await l.testE2EProduction(c,f,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await ge("BUN playwright show-trace",c,n)}}}function wn(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&["test"]}async function yn(e,t,n,r,o){e.env.WB_DOCKER||="1",await ge(`${n.buildDocker(e,"test")}${Jt(t)}`,e,t),process.exitCode=await ge(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await ge(Ht.stop(e),e,t)}function bn(e,t=[],n=[]){const r=Zt(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const vn={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 te(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;i=r.blitz?rn:r.next?sn:s["@remix-run/dev"]?cn:s.vite?dn:ln.some(e=>r[e])&&!r["firebase-functions"]?on:an,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await we(Ht.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await we(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await we(await i.testStart(o,n),o,n),await he.promiseAll(),a&&(o.env.WB_DOCKER||="1",await ge(`${i.buildDocker(o,"test")}${Jt(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ge(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await ge(Ht.stop(o),o,n)}}}(n)}};const kn={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}`);E(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},An={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await te(n,!1);if(!r)return console.error(d.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await we(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."));return a}(n))}};const En={...An,command:"tc"},Pn={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=ne(n,!1);r||(console.error(d.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let l=!1,u=!1;process.stdout.write=Rn(process.stdout.fd,i),process.stderr.write=Rn(process.stderr.fd,i),console.info(d.cyan(d.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${l?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=l?d.green(n):d.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{l=!0}}}(n);try{await Sn(n,r),await async function(e,t){await gn({...t,_:["test"],e2e:"headless",silent:!0})}(0,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):Sn(r.self,n))}};async function Sn(e,t){await xn(`${ie} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await xn(`${ie} gen-code`,e,t),await $n("format",()=>qe({...t,_:["lint"],format:!0,printAllOutput:!0,silent:!0}),{allowFailure:!0,silent:!0}),await $n("lint-fix",()=>qe({...t,_:["lint"],fix:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function $n(e,t,n={}){n.silent||console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?n.silent||console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function xn(e,t,n,r={}){if(function(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await R(e,void 0,{cwd:t.dirPath,env:ke(t.env,{forceColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&e===`${ie} install`)return void console.info(d.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(d.red(d.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function Rn(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(Ee).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(Pn).command(ce).command($e).command(Ie).command(Ve).command(ut).command(Pt).command(Mt).command(Ut).command(pn).command(mn).command(vn).command(kn).command(An).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 jn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!jn){jn=!0;try{E(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGJsYW5rLW9ubHkgbGluZXMgYXJlIHNraXBwZWQgd2hpbGUgcHJpbnRpbmcgc3Rkb3V0L3N0ZGVyciBpbiByZWFsdGltZSAqL1xuICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgY29uc3Qgc3Rkb3V0UHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZG91dCwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIGNvbnN0IHN0ZGVyclByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRlcnIsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBzdGRvdXRQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBzdGRlcnJQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHN0ZG91dFByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgc3RkZXJyUHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGVTdHJlYW0sXG4gIG9taXRCbGFua0xpbmVzID0gZmFsc2Vcbik6IHsgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7IGZsdXNoOiAoKSA9PiB2b2lkIH0ge1xuICBpZiAoIW9taXRCbGFua0xpbmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiAoZGF0YSkgPT4gc3RyZWFtLndyaXRlKGRhdGEpLFxuICAgICAgZmx1c2g6ICgpID0+IHt9LFxuICAgIH07XG4gIH1cblxuICBsZXQgcGVuZGluZyA9ICcnO1xuICByZXR1cm4ge1xuICAgIHdyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZyArPSBkYXRhO1xuICAgICAgY29uc3QgbGluZXMgPSBwZW5kaW5nLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkgPz8gJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFpc0JsYW5rTGluZShsaW5lKSkge1xuICAgICAgICAgIHN0cmVhbS53cml0ZShgJHtsaW5lfVxcbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaDogKCkgPT4ge1xuICAgICAgaWYgKCFpc0JsYW5rTGluZShwZW5kaW5nKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUocGVuZGluZyk7XG4gICAgICB9XG4gICAgICBwZW5kaW5nID0gJyc7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCbGFua0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKS50cmltKCkubGVuZ3RoID09PSAwO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdwcmlzbWEnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEcml6emxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ2RyaXp6bGUtb3JtJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZGF0YWJhc2VPcm0oKTogRGF0YWJhc2VPcm0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc1ByaXNtYSkgcmV0dXJuICdwcmlzbWEnO1xuICAgIGlmICh0aGlzLmhhc0RyaXp6bGUpIHJldHVybiAnZHJpenpsZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/P1xuICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkID8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghYnVpbGRDb21tYW5kKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTa2lwIHRvIGJ1aWxkIGJlY2F1c2Ugbm8gYnVpbGQgY29tbWFuZCBpcyBkZWZpbmVkLicpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYnVpbGRDb21tYW5kIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCBhcmd2LnNpbGVudCA/ICdDb21tYW5kJyA6ICdTdGFydCcpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IGFyZ3Yuc2lsZW50ID8gJ3BpcGUnIDogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgJ1BSSVNNQSBnZW5lcmF0ZSAnLFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZSAnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzICdcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnWUFSTiBibGl0eiBwcmlzbWEgJyA6ICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gLS1idW4gcnVuICcgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmBcbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFpc1J1bm5pbmdPbkJ1biAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb3JjZUNvbG9yOiB0eXBlb2YgYXJndi5mb3JjZUNvbG9yID09PSAnYm9vbGVhbicgPyBhcmd2LmZvcmNlQ29sb3IgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSwgZm9yY2VDb2xvcjogb3B0aW9ucy5mb3JjZUNvbG9yIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQocmVtb3ZlTm9Db2xvcldhcm5pbmcob3V0cHV0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQucmVwbGFjZUFsbChcbiAgICAvXFwobm9kZTpcXGQrXFwpIFdhcm5pbmc6IFRoZSAnTk9fQ09MT1InIGVudiBpcyBpZ25vcmVkIGR1ZSB0byB0aGUgJ0ZPUkNFX0NPTE9SJyBlbnYgYmVpbmcgc2V0XFwuXFxuXFwoVXNlIGBub2RlIC0tdHJhY2Utd2FybmluZ3MgXFwuXFwuXFwuYCB0byBzaG93IHdoZXJlIHRoZSB3YXJuaW5nIHdhcyBjcmVhdGVkXFwpXFxuPy9nLFxuICAgICcnXG4gICk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgbGludFByb21pc2VzOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+W10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bkxpbnRDb21tYW5kKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQoYnVpbGREYXJ0Q29tbWFuZChhcmd2LCBkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmICFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZERhcnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgYXJndi5mb3JtYXQpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQoYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChsaW50UHJvbWlzZXMpO1xuICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRSZXN1bHRzLCBhcmd2KTtcbiAgY29uc3QgbGludEV4aXRDb2RlcyA9IGxpbnRSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpO1xuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIHx8IGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICBwcmludENvbW1hbmRIZWFkZXIobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QuZGlyUGF0aCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCB7IC4uLm9wdGlvbnMsIHByaW50UmF3T3V0cHV0OiB0cnVlIH0pLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiAoe1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQ6IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCk6IHZvaWQge1xuICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuXG4gIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDAgJiYgc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KHJlc3VsdC5jb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0LnRyaW0oKTtcbiAgaWYgKG91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZEhlYWRlcihjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQoY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCcgb3hmbXQgJykgfHwgY29tbWFuZC5pbmNsdWRlcygnIHNvcnQtcGFja2FnZS1qc29uICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMaW50Q29tbWFuZChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlDb21tYW5kKFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgY29uc3QgY29tbWFuZHMgPVxuICAgIGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0XG4gICAgICA/IFtcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKSxcbiAgICAgICAgXVxuICAgICAgOiBbYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSldO1xuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Q29tbWFuZChcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoYXJndi5maXggfHwgYXJndi5mb3JtYXQpIHtcbiAgICBjb21tYW5kcy5wdXNoKGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50YXJnZXRzXSkpO1xuICB9XG4gIGNvbW1hbmRzLnB1c2goYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50YXJnZXRzXSkpO1xuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBydW50aW1lRGV2RGVwZW5kZW5jaWVzID0gWydAd2lsbGJvb3N0ZXIvd2InLCAnYnVpbGQtdHMnXTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplRG9ja2VySW5zdGFsbFByZXBhcmVTY3JpcHQoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBwcm9tb3RlUnVudGltZURldkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbik7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURvY2tlckluc3RhbGxQcmVwYXJlU2NyaXB0KGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUgfHwgcGFja2FnZU1hbmFnZXIgIT09ICdidW4nKSByZXR1cm47XG5cbiAgY29uc3QgZGV2RGVwZW5kZW5jeU5hbWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcbiAgaWYgKGRldkRlcGVuZGVuY3lOYW1lcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAvLyBCdW4gdmFsaWRhdGVzIHRoZSBsb2NrZmlsZSBldmVuIHdpdGggLS1wcm9kdWN0aW9uLiBUaGlzIHNjcmlwdCBsZXRzIERvY2tlciByZXdyaXRlXG4gIC8vIHRoZSBpbWFnZS1sb2NhbCBsb2NrZmlsZSBhZnRlciAtLW91dHNpZGUgcHJ1bmluZywgd2l0aG91dCBoYXJkLWNvZGluZyBwYWNrYWdlcyBpbiBhcHAgRG9ja2VyZmlsZXMuXG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICBzY3JpcHRzWydkb2NrZXIvaW5zdGFsbC9wcmVwYXJlJ10gPSBgYnVuIHJlbW92ZSAke2RldkRlcGVuZGVuY3lOYW1lcy5qb2luKCcgJyl9YDtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gIGNvbnNvbGUuaW5mbygnQWRkZWQgZG9ja2VyL2luc3RhbGwvcHJlcGFyZSBzY3JpcHQuJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNsYXNzIERyaXp6bGVTY3JpcHRzIHtcbiAgZGVwbG95KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgbWlncmF0ZShfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IG1pZ3JhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgbWlncmF0ZURldihfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IGdlbmVyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbW92ZUNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoIXJlbW92ZUNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHJlc2V0IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIERBVEFCQVNFX1BBVEggb3IgZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uc2VlZCkgcmV0dXJuICdZQVJOIHJ1biBzZWVkJztcbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKF9wcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiBzdHVkaW8gZm9yIERyaXp6bGUgZG9lcyBub3Qgc3VwcG9ydCBkYi11cmwtb3ItcGF0aC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9QQVRIID8/IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlVybCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1VSTDtcbiAgaWYgKCFkYlVybD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHJldHVybjtcblxuICBjb25zdCByYXdEYlBhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgcmV0dXJuIHJhd0RiUGF0aDtcbn1cblxuZXhwb3J0IGNvbnN0IGRyaXp6bGVTY3JpcHRzID0gbmV3IERyaXp6bGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4IC1jb25maWcgbGl0ZXN0cmVhbS55bWwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgICBzdGVwcy5wdXNoKHRoaXMuc2VlZChwcm9qZWN0KSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcy5maWx0ZXIoQm9vbGVhbikuam9pbignICYmICcpO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofSo7IGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7b3V0cHV0UGF0aH0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9tb3VudCcgOiAncHJpc21hL21vdW50Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBPU1NJQkxFX1BSSVNNQV9QQVRIUy5maW5kKCh7IHNjaGVtYVBhdGggfSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpXG4gICAgPy5kYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlVybCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1VSTDtcbiAgaWYgKCFkYlVybD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHJldHVybjtcblxuICBjb25zdCByYXdEYlBhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpc3RCYWNrdXBzKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2LCAncHJpc21hJyk7XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYFlBUk4gZHJpenpsZS1raXQgJHtmdWxsQ29tbWFuZH1gO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+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/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBbJ3Rlc3QnXTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnZm9ybWF0JyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHByaW50QWxsT3V0cHV0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KSxcbiAgICB7XG4gICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgfVxuICApO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdsaW50LWZpeCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBwcmludEFsbE91dHB1dDogdHJ1ZSxcbiAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRlc3QoeyAuLi5hcmd2LCBfOiBbJ3Rlc3QnXSwgZTJlOiAnaGVhZGxlc3MnLCBzaWxlbnQ6IHRydWUgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBmb3JjZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiBjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3Rkb3V0LmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUocHJvY2Vzcy5zdGRlcnIuZmQsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG91dHB1dEZpbGU6IG51bWJlciwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICBmcy53cml0ZVN5bmMob3V0cHV0RmlsZSwgYnVmZmVyKTtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZW5jb2RpbmdPckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrPy4oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52IiwicXVpZXQiLCJzZXQiLCJpc0Vycm5vRXhjZXB0aW9uIiwiZXJyb3IiLCJFcnJvciIsInRyZWVLaWxsIiwicGlkIiwic2lnbmFsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwicHJvY2VzcyIsInBsYXRmb3JtIiwicnVuQ29tbWFuZCIsIlN0cmluZyIsIm1heEJ1ZmZlciIsInRpbWVvdXQiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImtpbGxUcmVlT25XaW5kb3dzIiwiZGVzY2VuZGFudHMiLCJyb290UGlkIiwic3Rkb3V0IiwiY2hpbGRyZW5CeVBhcmVudCIsInBzT3V0cHV0IiwibGluZSIsInNwbGl0IiwibWF0Y2hlZCIsImV4ZWMiLCJjaGlsZFBpZCIsInBhcmVudFBpZCIsImNoaWxkcmVuIiwicHVzaCIsImJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCIsInF1ZXVlIiwiaW5kZXgiLCJsZW5ndGgiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzIiwidGFyZ2V0UGlkcyIsInRvUmV2ZXJzZWQiLCJ0b0NoaWxkcmVuRmlyc3RQaWRzIiwidGFyZ2V0UGlkIiwia2lsbElmTmVlZGVkIiwia2lsbCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImV4ZWNGaWxlU3luYyIsImVuY29kaW5nIiwic3RkaW8iLCJzdGRlcnIiLCJCdWZmZXIiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwiZXh0cmFjdFN0ZGVyciIsIkNvbW1hbmRFeGVjdXRpb25FcnJvciIsImNvZGUiLCJzdGF0dXMiLCJ0b0V4aXRDb2RlIiwidGVzdCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJqb2luIiwidGhpcyIsIm5hbWUiLCJhc3luYyIsInNwYXduQXN5bmMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic2V0RW5jb2RpbmciLCJzdGRvdXRQcmludGVyIiwiY3JlYXRlUmVhbHRpbWVQcmludGVyIiwib21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nIiwic3RkZXJyUHJpbnRlciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsImZsdXNoIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsIkFOU0lfRVNDQVBFX0NPREVfUkVHRVhQIiwiUmVnRXhwIiwiZnJvbUNvZGVQb2ludCIsInN0cmVhbSIsIm9taXRCbGFua0xpbmVzIiwicGVuZGluZyIsImxpbmVzIiwicG9wIiwiaXNCbGFua0xpbmUiLCJyZXBsYWNlQWxsIiwidHJpbSIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibWVzc2FnZSIsInN0YWNrIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzTmFOIiwiaXNGaW5pdGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZ2V0RGVwZW5kZW5jeVZlcnNpb24iLCJyb290UGFja2FnZUpzb24iLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwicm9vdCIsInNlbGYiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiZ3JlZW4iLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwic2lsZW50IiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwic2lsZW50U3VjY2VzcyIsImNvbmZpZ3VyZUVudiIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsInByaW50UmF3T3V0cHV0Iiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJwcmludGFibGVTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwicnVubmFibGVTY3JpcHQiLCJjYXNjYWRlT3B0aW9uIiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsInByaW50T3B0aW9ucyIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsIkJvb2xlYW4iLCJkZXRhY2hlZCIsImludGVycnVwdGVkU2lnbmFsIiwiZmlyc3RSZXN1bHQiLCJzdG9wUmVzdWx0Iiwic3RvcHBpbmciLCJmb3JjZUtpbGxQcm9taXNlcyIsInJlc3VsdHMiLCJ3YWl0Rm9yRXhpdFByb21pc2VzIiwiY2hpbGQiLCJzZXR0bGVkIiwic2V0dGxlIiwia2lsbE90aGVycyIsImtpbGxPdGhlcnNPbkZhaWwiLCJzaG91bGRTdG9wT3RoZXJzIiwidGVybWluYXRlQ2hpbGRyZW4iLCJvbmNlIiwiZ2V0RXhpdENvZGUiLCJzdG9wQWxsIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJhbGwiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwiZm9yY2VLaWxsUGlkcyIsInNpZ25hbFBpZHMiLCJ0b0NoaWxkUGlkcyIsInBpZHMiLCJkZWFkbGluZSIsImV2ZXJ5IiwiaXNQcm9jZXNzR3JvdXBHb25lIiwic2xlZXAiLCJNYXRoIiwibWluIiwid2FpdEZvckZvcmNlS2lsbCIsInNpZ25hbGVkUGlkcyIsImtpbGxQcm9jZXNzR3JvdXAiLCJtcyIsInNldFRpbWVvdXQiLCJraWxsUG9ydElmTm9uQ2lDb21tYW5kIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJpbnRCdWZmZXJlZE91dHB1dCIsIm91dHB1dCIsImhhc1dhcm5pbmdPdXRwdXQiLCJyZW1vdmVOb0NvbG9yV2FybmluZyIsInNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQiLCJub3JtYWxpemVkT3V0cHV0Iiwibm9ybWFsaXplQnVmZmVyZWRPdXRwdXQiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJveGxpbnRFeHRlbnNpb25zIiwicHl0aG9uRXh0ZW5zaW9ucyIsImRhcnRFeHRlbnNpb25zIiwib3hmbXRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm94Zm10RmlsZVBhdGhzIiwiYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImxpbnRQcm9taXNlcyIsImxpbnRSdW5PcHRpb25zIiwicHJpbnRBbGxPdXRwdXQiLCJidWlsZExpbnRDb21tYW5kIiwicnVuTGludENvbW1hbmQiLCJidWlsZE94Zm10Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Q29tbWFuZCIsImJ1aWxkRGFydENvbW1hbmQiLCJsaW50UmVzdWx0cyIsInByaW50U2lsZW50TGludE91dHB1dHMiLCJsaW50RXhpdENvZGVzIiwicHJldHRpZXJSZXN1bHQiLCJzb3J0UGFja2FnZUpzb25SZXN1bHQiLCJwcmludENvbW1hbmRIZWFkZXIiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQiLCJ0aGVuIiwicHJpbnRDb21tYW5kT3V0cHV0IiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsInN0YXJ0c1dpdGgiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsInJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZURvY2tlckluc3RhbGxQcmVwYXJlU2NyaXB0Iiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJwcm9tb3RlZERlcHMiLCJ2ZXJzaW9uIiwicHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsInJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsImRldkRlcGVuZGVuY3lOYW1lcyIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJGSUxFX1NDSEVNQSIsImRyaXp6bGVTY3JpcHRzIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJtaWdyYXRlIiwiX3Byb2plY3QiLCJtaWdyYXRlRGV2IiwicmVtb3ZlQ29tbWFuZCIsImRiUGF0aCIsIkRBVEFCQVNFX1BBVEgiLCJkYlVybCIsIkRBVEFCQVNFX1VSTCIsInJhd0RiUGF0aCIsImdldEZpbGVEYXRhYmFzZVVybFBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJpc0Fic29sdXRlIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJzZWVkIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3lGb3JjZSIsInJlbW92ZURiQ29tbWFuZCIsImxpc3RCYWNrdXBzIiwic3RlcHMiLCJjbGVhbnVwQ29tbWFuZCIsImJhc2VEaXIiLCJjbGVhblVwU3FsaXRlRGJJZk5lZWRlZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwicHJpc21hIiwicHJpc21hQ29tbWFuZCIsImFsaWFzZXMiLCJ5YXJncyIsInBhcnNlckNvbmZpZ3VyYXRpb24iLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmREYXRhYmFzZU9ybVByb2plY3RzIiwicHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvcm0iLCJnZXREYXRhYmFzZU9ybVNjcmlwdHMiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsInJlcXVpcmVkRW52VmFycyIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVkiLCJtaXNzaW5nRW52VmFycyIsInJldGVudGlvbkNoZWNrSW50ZXJ2YWwiLCJsaXRlc3RyZWFtQ29uZmlnIiwid3JpdGVGaWxlU3luYyIsInJlYXNvbiIsImZpbHRlcmVkIiwib3JtUHJvamVjdEJ5UHJvamVjdCIsIm9ybVByb2plY3QiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJwYXNzdGhyb3VnaEFyZ3MiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwYWNrYWdlcyIsImlzRmlsZSIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImF2YWlsYWJsZSIsImhvc3QiLCJwcm9iZVBvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyIsInJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJjb21tYW5kQXJncyIsInBsYXl3cmlnaHRJbmRleCIsImluZGV4T2YiLCJpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCIsInBlbmRpbmdWYWx1ZU1vZGUiLCJ0YXJnZXRJbmRleGVzIiwib2Zmc2V0IiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyIsInNob3J0T3B0aW9uIiwiUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsImUyZSIsImFyZ3VtZW50c0J1aWxkZXIiLCJ0ZXN0Q29tbWFuZCIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuRTJlIiwic2hvdWxkUnVuVW5pdCIsImhhc0UyZVRhcmdldHMiLCJ0YXJnZXQiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwicmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzIiwiZGVmYXVsdFVuaXRUYXJnZXRzIiwiZ2V0RGVmYXVsdFVuaXRUYXJnZXRzIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsInBvc2l0aW9uYWwiLCJkZW1hbmRPcHRpb24iLCJ0eXBlQ2hlY2tDb21tYW5kIiwicmVtb3ZlZE5leHREaXIiLCJidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJmdWxsIiwicmVwb3J0ZXIiLCJzdGFydGVkQXQiLCJ3YkRpclBhdGgiLCJta2RpclN5bmMiLCJsb2dGaWxlUGF0aCIsImxvZ0ZpbGUiLCJvcGVuU3luYyIsIm9yaWdpbmFsU3Rkb3V0V3JpdGUiLCJiaW5kIiwib3JpZ2luYWxTdGRlcnJXcml0ZSIsInN1Y2NlZWRlZCIsImZpbmlzaGVkIiwidGVlV3JpdGUiLCJmZCIsImZpbmlzaCIsImVsYXBzZWRUaW1lIiwibWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsInJvdW5kIiwibWludXRlcyIsImZsb29yIiwicmVtYWluaW5nU2Vjb25kcyIsImZvcm1hdEVsYXBzZWRUaW1lIiwic3VtbWFyeSIsImNvbG9yZWRTdW1tYXJ5Iiwid3JpdGVTeW5jIiwiY2xvc2VTeW5jIiwiZmFpbCIsInN1Y2NlZWQiLCJzdGFydFZlcmlmeUZ1bGxSZXBvcnRlciIsInZlcmlmeUNvZGUiLCJydW5Qcm9qZWN0VGVzdCIsInZlcmlmeUNvZGVGdWxseSIsInJ1blBhY2thZ2VDb21tYW5kIiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsInByaW50Q29tbWFuZCIsInRyaW1tZWRPdXRwdXQiLCJwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0Iiwib3V0cHV0RmlsZSIsImNodW5rIiwiZW5jb2RpbmdPckNhbGxiYWNrIiwiY2FsbGJhY2siLCJidWZmZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiI0aEJBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWEMsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE0RlgsTUFBTUMsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FB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ZUFDeEIsR0FBSW1vQixFQUFZLENBQ2QsTUFBTWpvQixFQUFVclAsRUFBS0MsUUFBUXEzQixHQUM3QnoyQixRQUFRMDJCLE1BQU1sb0IsRUFDaEIsRWhEa0hHLFNBQThDa0IsR0FFL0NBLEVBQVFzRCxNQUFRdEQsRUFBUWluQixtQkFDMUJqbkIsRUFBUXNELEtBQU90RCxFQUFRc0QsS0FBS2dFLFFBQVEsR0FBR3RILEVBQVFpbkIsb0JBQXFCLElBRWpFdndCLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNd0ssS0FBT25ELE9BQU9rRCxLQUFLakIsR0FBVSxDQUN0QyxNQUFNa25CLEVBQVdobUIsRUFBSXNLLGVBRW5CMGIsRUFBU3hULFdBQVcsU0FDcEJ3VCxFQUFTeFQsV0FBVyxVQUNwQndULEVBQVN4VCxXQUFXLFdBQ1AsZ0JBQWJ3VCxHQUNhLGFBQWJBLFdBR09sbkIsRUFBUWtCLEVBRW5CLENBQ0YsQ2dEdklJaW1CLENBQXFDNzJCLFFBQVEzQixPQUU5QzRELFFBQVF1eEIsSUFDUnZ4QixRQUFRbVQsSUFDUm5ULFFBQVFrWixJQUNSbFosUUFBUWljLElBQ1JqYyxRQUFReWQsSUFDUnpkLFFBQVEwaEIsSUFDUjFoQixRQUFRd2xCLElBQ1J4bEIsUUFBUTBvQixJQUNSMW9CLFFBQVErb0IsSUFDUi9vQixRQUFRMHNCLElBQ1Ixc0IsUUFBUW92QixJQUNScHZCLFFBQVF3d0IsSUFDUnh3QixRQUFRMHdCLElBQ1Ixd0IsUUFBUTZ3QixJQUNSN3dCLFFBQVFzeEIsSUFDUi9LLGdCQUNBQyxTQUNBcEUsUUFHSCxXQUNFLElBQUl5UyxFQUFpQjMzQixFQUFLd1QsUUFBUSxJQUFJL0YsZ0JBQWdCbXFCLEtBQUtDLFVBQzNELE1BQVFwb0IsRUFBR1EsV0FBV2pRLEVBQUtnRSxLQUFLMnpCLEVBQWdCLGtCQUM5Q0EsRUFBaUIzM0IsRUFBS3dULFFBQVFta0IsR0FLaEMsT0FIb0I3cEIsS0FBS2tFLE1BQU12QyxFQUFHQyxhQUFhMVAsRUFBS2dFLEtBQUsyekIsRUFBZ0IsZ0JBQWlCLFNBR3ZFelMsT0FDckIsQ0FaVzRTLElBQ1JDLE9BQU81b0IsS0FhVixJQUFJNm9CLElBQWUsRUFDbkIsSUFBSyxNQUFNdDNCLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekNHLFFBQVFpRSxHQUFHcEUsRUFBUSxLQUNqQixJQUFJczNCLEdBQUosQ0FFQUEsSUFBZSxFQUNmLElBQ0V4M0IsRUFBU0ssUUFBUUosSUFDbkIsQ0FBRSxNQUFPSCxHQUNQZ0YsUUFBUUUsS0FBSyxzQkFBc0IzRSxRQUFRSix3QkFBeUJILEVBQ3RFLENBQ0FPLFFBQVFzYSxNQVJVIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzUsNiw3LDgsOV19
|
|
9
|
+
*/const _=[..."0123456789abcdef"],B=[6,1536,393216,100663296],L=[0,8,16,24],F=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const z=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class M{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<L[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<L[3&i++],t[i>>2]|=(128|a>>6&63)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<L[3&i++],t[i>>2]|=(128|a>>12&63)<<L[3&i++],t[i>>2]|=(128|a>>6&63)<<L[3&i++],t[i>>2]|=(128|63&a)<<L[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];W(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];W(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=_[o>>4&15]+_[15&o]+_[o>>12&15]+_[o>>8&15]+_[o>>20&15]+_[o>>16&15]+_[o>>28&15]+_[o>>24&15];i%e===0&&(t=z(t),W(t),s=0)}return r&&(o=t[s],a+=_[o>>4&15]+_[15&o],r>1&&(a+=_[o>>12&15]+_[o>>8&15]),r>2&&(a+=_[o>>20&15]+_[o>>16&15])),a}}const W=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,w,y,b,v,k,A,E,P,S,$,x,R,j,O,D,N,T,I,C,_,B,L,z,M,W,U,J,Y,V,q,G,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,U=e[40]<<18|e[41]>>>14,J=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,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,_=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,T=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,L=e[26]<<25|e[27]>>>7,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,$=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,M=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~$&R,e[11]=S^~x&j,e[20]=I^~_&L,e[21]=C^~B&z,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=$^~R&O,e[13]=x^~j&D,e[22]=_^~L&M,e[23]=B^~z&W,e[32]=q^~K&Q,e[33]=G^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&A,e[5]=b^~k&E,e[14]=R^~O&N,e[15]=j^~D&T,e[24]=L^~M&U,e[25]=z^~W&J,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~T&S,e[26]=M^~U&I,e[27]=W^~J&C,e[36]=Q^~X&Y,e[37]=Z^~ee&V,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=A^~h&g,e[9]=E^~m&w,e[18]=N^~P&$,e[19]=T^~S&x,e[28]=U^~I&_,e[29]=J^~C&B,e[38]=X^~Y&q,e[39]=ee^~V&G,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=F[r],e[1]^=F[r+1]},U=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(Y.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,Y=new TextDecoder("utf-8");function V(e,t=U){return JSON.stringify(K(e,t))}function q(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 G=[];function K(e,t=U){const n=q(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=q(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(G.length<e){const t=G.length;G.length=e,G.fill(-2,t,e)}return G.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 H(e,t){return function(e){return new M(512,B,512).update(e).hex()}(V([e,t]))}const Q=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=H}={}){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:H});function Z(e){return!!e&&"0"!==e&&"false"!==e}let X;class ee{static{[X]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===o,A=3===o,E=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),$[t].call(o,s)}}if(!v){var $={},x=[],R=A?"get":E||k?"set":"value";if(d?(u||k?$={get:I(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:$[R]=b,u||I($[R],r,P?"":R)):u||($=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+$[R].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var j=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,T={},C={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,T)};if(v)i=D.call(N,j,C),T.v=1,y(i,"class decorators","return")&&(j=i);else if(C.static=l,C.private=d,i=C.access={has:d?p.bind():function(e){return r in e}},E||(i.get=d?P?function(e){return h(e),$.value}:S("get",0,h):function(e){return e[r]}),P||A||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=D.call(N,k?{get:$.get,set:$.set}:$[R],C),T.v=1,k){if("object"==typeof j&&j)(i=y(j.get,"accessor.get"))&&($.get=i),(i=y(j.set,"accessor.set"))&&($.set=i),(i=y(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):$[R]=j)}return o<2&&c.push(w(x,l,1),w(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?$[R]:y.call.bind($[R])):f(e,r,$)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(w(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;b(t?e:e.prototype,i,h,f?"#"+p:C(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return T(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[Q,3,"isBunAvailable"],[Q,3,"buildCommand"],[Q,3,"rootDirPath"],[Q,3,"dockerfile"],[Q,3,"hasDockerfile"],[Q,3,"hasSourceCode"],[Q,3,"name"],[Q,3,"dockerImageName"],[Q,3,"env"],[Q,3,"packageJson"],[Q,3,"packageJsonPath"],[Q,3,"hasPrisma"],[Q,3,"hasDrizzle"],[Q,3,"databaseOrm"],[Q,3,"hasVitest"],[Q,3,"hasOxlint"],[Q,3,"hasOxfmt"],[Q,3,"hasPrettier"],[Q,3,"hasPoetryLock"],[Q,3,"hasPubspecYaml"],[Q,3,"preferredLinter"],[Q,3,"hasPlaywrightConfig"],[Q,3,"skipLaunchingServerForPlaywright"],[Q,3,"dockerPackageJson"],[Q,3,"binExists"],[Q,3,"rootPackageJson"]]).e}argv=void X(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||(!!this.hasBunLockfile()||this.hasBunPackageManager())}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),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(A(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(A(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.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(Z(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function te(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new ee(o,n,r)}async function ne(e,t=!0,n){const r=re(e,t,n);if(r)return{...r,descendants:r.root===r.self?await oe(e,r.root,t):[r.self]}}function re(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new ee(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 ee(s,n,r))}return{root:i,self:s}}async function oe(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 ee(r,n,o));return s}const se=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ie=se?"bun --bun run":"node",ae=se?"bun":"yarn",ce=se?"bun --bun run":"yarn",le={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=te(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?se?"bun run build":"yarn build":void 0);if(!i)return console.info(l.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return de(s,n),!0;const[a,d,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),l=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(l);const d=JSON.stringify(Object.entries(n.env).filter(([e])=>!ue.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=>(pe.some(t=>e.includes(t))||fe.some(t=>e.endsWith(t)))&&!he.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!de(s,n))return;n.dryRun||await e.promises.writeFile(d,u,"utf8");return!0}(n)}};function de(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 ue=new Set(["CI","PWDEBUG","TMPDIR"]);const pe=["src/","public/"],fe=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],he=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const me=new m,ge={exitIfFailed:!0};async function we(e,t,n,r=ge){const o=be(e,t);if(ve(o.printable,t,n.silent?"Command":"Start"),n.verbose&&ve(o.runnable,t,"Start (raw)",!0),n.dryRun)return ke(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&r.processSilentOutput),i=await j(o.runnable,void 0,{cwd:t.dirPath,env:Ae(t.env,r),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose});if(s){const e=r.processSilentOutput?.(i.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return r.onSignal?.(i.signal),ke(o.printable,i.status,r,{silentSuccess:n.silent}),i.status??1}function ye(e,t,n,r=ge){return me.runAndWaitForReturnValue(async()=>{const o=be(e,t);if(ve(o.printable,t,"Start (parallel)",!0),n.dryRun)return ve(o.printable,t,"Started (log)"),n.verbose&&ve(o.runnable,t,"Started (raw)",!0),ke(o.printable,0,r),0;const s=await j(o.runnable,void 0,{cwd:t.dirPath,env:Ae(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),ve(o.printable,t,"Started (log)"),n.verbose&&ve(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),ke(o.printable,s.status,r),s.status??1})}function be(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 ",se?"bun --bun run ":"yarn run ");se&&(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=Ee(n.replaceAll("YARN ",`${ce} `)),o=Ee(n.replaceAll("YARN playwright ",`${ce} playwright `).replaceAll("YARN ",!se&&t.binExists?"":`${ce} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${ce} dotenv${s} -- ${r}`,runnable:o}}function ve(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function ke(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(l.green(l.bold("Finished:"),e))}else console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function Ae(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function Ee(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const Pe={...v,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function Se(e){const t=[];for(const n of Object.keys(v)){const r=$e(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return t}function $e(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const xe={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...Pe,"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=te(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(be(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Ae(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),l=t.map((n,o)=>new Promise(l=>{let d=!1;const u=n=>{d||(d=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(je(t,"SIGTERM"))),l())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(Re(e??void 0,t??void 0))})})),d=e=>{n??=e,i||(i=!0,a.push(je(t,e)))},u=()=>{d("SIGINT")},p=()=>{d("SIGTERM")},f=()=>{d("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(l),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return Re(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(l.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Re(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function je(e,t){const n=Oe(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(De))return!1;await Ne(Math.min(100,t-Date.now()))}return!0}(n)&&Oe(n,"SIGKILL")}function Oe(e,t){const n=[];for(const r of e)try{if(!Te(r,t))continue;n.push(r),P(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function De(e){try{return process.kill(-e,0),!1}catch(e){return!!Ie(e)}}async function Ne(e){await new Promise(t=>setTimeout(t,e))}function Te(e,t){try{return process.kill(-e,t),!0}catch(e){if(Ie(e))return!1;throw e}}function Ie(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const Ce={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=te(e);t||(console.error(l.red("No project found.")),process.exit(1));if(Z(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,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(Be(t))}(e,t))return;const n=function(e){return Be(e).trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Be(e){return e.replaceAll(/\(node:\d+\) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set\.\n\(Use `node --trace-warnings \.\.\.` to show where the warning was created\)\n?/g,"")}function Le(e){return e.map(e=>Fe(e)).join(" ")}function Fe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const ze=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),Me=new Set(["py"]),We=new Set(["dart"]),Ue=new Set([...ze,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Je=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ye=new Set([...Je].filter(e=>!Ue.has(e))),Ve="!**/test{-,/}fixtures/**",qe={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await Ge(e);t&&process.exit(t)}};async function Ge(e){if("win32"===process.platform)return console.error(l.red("This command is not supported on Windows.")),1;const n=await ne(e,!1);if(!n)return console.error(l.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],d=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...st(n.descendants,u,r));for(const{lintPath:t,project:d}of it(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||Me.has(p))){const e=i.get(d)??[];if(e.push(t),i.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||We.has(p))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if("directory"===r||ct(d,p)){const n=o.get(d)??[];if(n.push(t),o.set(d,n),e.format)if("directory"===r&&d.hasOxfmt){const e=s.get(d)??[];e.push(t),s.set(d,e),c.push(ot(t),Ve)}else for(const e of rt(d,t,r,p))if(d.hasOxfmt){const t=s.get(d)??[];t.push(e),s.set(d,t)}else c.push(e)}else if(e.format&&(Je.has(p)||Ue.has(p)))if(d.hasOxfmt&&Ue.has(p)){const e=s.get(d)??[];e.push(t),s.set(d,e)}else Je.has(p)&&c.push(t);else at(p)&&!d.preferredLinter&&(console.error(l.red(`No linter found for ${d.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ye].join(",")}}`,Ve]);for(const o of n){if(!lt(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Je].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:!e.printAllOutput};if(r.length>0){for(const[t,n]of o){const r=Xe(t,e,n);r&&h.push(Ke(r,t,e,m))}if(e.format)for(const[t,n]of s)h.push(Ke(et(n),t,e,m));for(const[t,n]of i)h.push(Ke(tt(e,n),t,e,m));for(const[t,n]of a)h.push(Ke(nt(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Xe(t,e);n&&h.push(Ke(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(Ke(tt(e),t,e,m)),t.hasPubspecYaml&&h.push(Ke(nt(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(Ke(et(),t,e,m))}const g=await Promise.all(h);He(g,e);const y=g.map(e=>e.exitCode);if(f||y.some(e=>0!==e))return 1;if(e.format){if(u.length>0&&n.self.hasPrettier){const t=await Ke(Le(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,m);He([t],e),y.push(t.exitCode)}if(p.length>0){const t=await Ke(Le(["YARN","sort-package-json","--",...p]),n.self,e,m);He([t],e),y.push(t.exitCode)}}return y.some(e=>0!==e)?1:0}function Ke(e,t,n,r){if(n.silent){const o=be(e,t);return function(e,t,n,r=ge){return me.runAndWaitForReturnValue(async()=>{const o=be(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await j(o.runnable,void 0,{cwd:t.dirPath,env:Ae(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return ye(e,t,n,r).then(e=>({exitCode:e}))}function He(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?Qe(e):(t.silent&&Ze(e.command,e.cwd),_e(e.exitCode,e.output)))}function Qe(e){if(Ze(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(l.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function Ze(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}function Xe(e,t,n){if("oxlint"===e.preferredLinter)return Le(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function et(e){return Le(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function tt(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[Le(["poetry","run","isort","--profile","black","--filter-files",...n]),Le(["poetry","run","black",...n]),Le(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[Le(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function nt(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(Le(["dart","format",...n])),r.push(Le(["dart","analyze",...n])),r.join(" && ")}function rt(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&<(e)?[t,Ve]:function(e,t){return e.hasOxfmt?Ue.has(t):!!lt(e)||Ye.has(t)}(e,r)?[t]:[]}function ot(e){return t.join(e,`**/{.*/,}*.{${[...Ye].join(",")}}`)}function st(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 it(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 at(e){return ze.has(e)||Me.has(e)||We.has(e)}function ct(e,t){return"oxlint"===e.preferredLinter&&ze.has(t)}function lt(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}function*dt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ut=["@willbooster/wb","build-ts"],pt={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 ne(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of dt("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(ft(n,r),ht(r),mt(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(ae,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ft(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of ut){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function ht(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 mt(e){delete e.private,delete e.publishConfig,delete e.prettier}const gt="file:";const wt=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(gt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},yt="file:",bt=[{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 vt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function kt(n){return bt.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const At=new class{cleanUpLitestream(e){const t=vt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${yt}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=vt(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 ${vt(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(yt))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=kt(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} ${vt(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=${yt}${e} `}else if(e.env.DATABASE_URL?.startsWith(yt)){const n=kt(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${yt}${r} `}}return`${o}PRISMA studio ${r}`}},Et={},Pt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(St).command($t).command(xt).command(Rt).command(jt).command(Ot).command(Dt).command(Nt).command(Tt).command(It).command(Ct).command(_t).demandCommand().strict(!1),handler(){}},St={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma cleanup-litestream",t))await we(At.cleanUpLitestream(n),n,e)}},$t={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:e}of zt("prisma create-litestream-config",t))Bt(e)}},xt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Et,async handler(e){const t=await Lt(e),n=Mt(e);for(const{orm:r,project:o}of zt("db deploy",t))await we(Ft(r).deploy(o,n),o,e)}},Rt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma deploy-force",t))await we(At.deployForce(n),n,e)}},jt={command:"list-backups",describe:"List Litestream backups",builder:Et,async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma list-backups",t))await we(At.listBackups(n),n,e)}},Ot={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Et,async handler(e){const t=await Lt(e),n=Mt(e);for(const{orm:r,project:o}of zt("db migrate",t))await we(Ft(r).migrate(o,n),o,e)}},Dt={command:"migrate-dev",describe:"Create a migration file",builder:Et,async handler(e){const t=await Lt(e),n=Mt(e);for(const{orm:r,project:o}of zt("db migrate-dev",t))await we(Ft(r).migrateDev(o,n),o,e)}},Nt={command:"reset",describe:"Reset DB",builder:Et,async handler(e){const t=await Lt(e),n=Mt(e);for(const{orm:r,project:o}of zt("db reset",t))await we(Ft(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of zt("WB_ENV=test db reset",await Lt(e)))await we(Ft(t).reset(r,n),r,e)}}},Tt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Et,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Lt(e,"prisma");for(const{project:n}of zt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await we(At.restore(n,t),n,e)}}},It={command:"seed",describe:"Populate DB with seed data",builder:{...Et,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Lt(e);for(const{orm:n,project:r}of zt("db seed",t))await we(Ft(n).seed(r,e.file),r,e)}},Ct={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...Et,"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 Lt(e),n=Mt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of zt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await we(Ft(r).studio(o,t,n),o,e)}}},_t={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await Lt(e),n=[(e.args?.join(" ")??"").trimEnd(),Mt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of zt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await we(t,o,e)}}};function Bt(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 Lt(e,t){const n=await ne(e);n||(console.error(l.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(l.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function Ft(e){return"prisma"===e?At:wt}function*zt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of dt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Mt(e,t=[]){const n=[],r=Object.keys(Pe),o=Object.values(Pe).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Le([...n,...i])}const Wt={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=te(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 we(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Ut={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await ne(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of dt("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await ye(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await we("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ye("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ye(`poetry env use ${n}`,t,e),await me.promiseAll(),await we("poetry run pip install --upgrade pip",t,e),await we("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await we(`${ce} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await we(`${ce} playwright install --with-deps`,r,e)}(e)}};function Jt(e){return e.silent?" > /dev/null":""}const Yt=new Set;async function Vt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Kt(t,e))return!1}return!0}(e);n||await qt(e,t);const r=async()=>{Yt.has(e)||(Yt.add(e),await qt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function qt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await j("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 j("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Gt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Vt(n,t),n}async function Kt(e,t){return new Promise(n=>{const r=y();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Ht=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(Yt.has(e))return;Yt.add(e),ve(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ke(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 Qt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Ht.buildImage(e,t)}async startDev(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?Le(["YARN","wb","concurrently",...Se(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?Le(["YARN","wb","concurrently",...Se(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Gt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Gt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Le(["YARN","wb","concurrently",...Se(t),"--kill-others-on-fail",Ht.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Ht.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?At.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Jt(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,Ht.stopAndStart(e),n)}async testStart(e,t){return await Gt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Fe(r)}`} ${Le(["YARN","wb","concurrently",...Se(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 Gt(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 Zt([...o,...e,...r],n);const i=e.slice(1),a=Xt(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Zt([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Le(["YARN","wb","concurrently",...Se(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Le(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Le(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function Zt(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Le(e):Le([...e,"--max-failures=1"]):Le(e)}function Xt(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;en.has(o)?t="required":tn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&nn.has(e)&&(t="required");continue}n.push(r)}}return n}const en=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"]),tn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),nn=new Set(["-c","-g","-j"]);const rn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const on=new class extends Qt{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 Gt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Le(["YARN","wb","concurrently",...Se(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Le(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const sn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const an=new class extends Qt{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} && ${ie} 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")} && ${Ht.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 cn=new class extends Qt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const ln=new class extends Qt{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()}},dn=["express","fastify","elysia","hono"],un={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"}},pn={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(un),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Fe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Fe(String(e))).join(" ")}(e);const t=await ne(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=rn;else if(t.next)o=sn;else if(r["@remix-run/dev"])o=cn;else if(r.vite)o=ln;else if(dn.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=on;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=an}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await we(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await we(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await we(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await we(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await we(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},fn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),hn={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"}},mn={targets:{description:"Test target paths",type:"array"}},gn={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({...hn,...mn}),async handler(e){await wn(e)}};async function wn(n){const r=await ne(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;d=r.blitz?rn:r.next?sn:l["@remix-run/dev"]?cn:l.vite?ln:dn.some(e=>r[e])&&!r["firebase-functions"]?on:an,console.info(`Running "test" for ${c.name} ...`);const u=yn(c);if(a&&!1!==u){const e=o.filter(e=>e.includes("/unit")),t=e.length>0?e:u.length>0?u:void 0,r={...n,targets:t};await vn(d.testUnit(c,r),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const p=o.filter(e=>e.includes("/e2e")),f={...n,targets:p.length>0?p:void 0};switch(n.e2e){case"headless":await vn(await d.testE2EProduction(c,f,{playwrightArgs:Sn(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await vn(await d.testE2EDev(c,f,{playwrightArgs:Sn(p,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await bn(c,f,d,Sn(p,s),s);continue;case"docker-debug":await bn(c,f,d,Sn(p,s,["--debug"]),s);continue}if(r.blitz||r.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":await vn(await d.testE2EProduction(c,f,{playwrightArgs:Sn(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await vn(await d.testE2EDev(c,f,{playwrightArgs:Sn(p,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await vn(await d.testE2EProduction(c,f,{playwrightArgs:Sn(p,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await vn(await d.testE2EProduction(c,f,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await vn("BUN playwright show-trace",c,n)}}}function yn(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&["test"]}async function bn(e,t,n,r,o){e.env.WB_DOCKER||="1",await we(`${n.buildDocker(e,"test")}${Jt(t)}`,e,t),process.exitCode=await vn(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await we(Ht.stop(e),e,t)}function vn(e,t,n,r={}){return we(e,t,n,{...r,processSilentOutput:kn})}function kn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=En(o);n.has(e)||(t.some(t=>Pn(t,e))||(An(t,n,e),r.push(o)))}return r.join("\n")}function An(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function En(e){return e.replaceAll(fn,"").trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,"").replaceAll(/\(node:\d+\)/g,"(node:<number>)").replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,"<timestamp>").replaceAll(/([?&]cache=)\d+/g,"$1<number>")}function Pn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&b(e,t)/n<=.05}function Sn(e,t=[],n=[]){const r=Xt(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const $n={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 ne(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?rn:r.next?sn:s["@remix-run/dev"]?cn:s.vite?ln:dn.some(e=>r[e])&&!r["firebase-functions"]?on:an,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await ye(Ht.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await ye(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await ye(await i.testStart(o,n),o,n),await me.promiseAll(),a&&(o.env.WB_DOCKER||="1",await we(`${i.buildDocker(o,"test")}${Jt(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await we(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await we(Ht.stop(o),o,n)}}}(n)}};const xn={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}`);P(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Rn={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await ne(n,!1);if(!r)return console.error(l.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await ye(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(l.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(l.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(l.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const jn={...Rn,command:"tc"},On={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=re(n,!1);r||(console.error(l.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let d=!1,u=!1;process.stdout.write=In(process.stdout.fd,i),process.stderr.write=In(process.stderr.fd,i),console.info(l.cyan(l.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${d?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=d?l.green(n):l.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{d=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{d=!0}}}(n);try{await Dn(n,r),await async function(e,t){await wn({...t,_:["test"],e2e:"headless",silent:!0})}(0,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):Dn(r.self,n))}};async function Dn(e,t){await Tn(`${ae} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await Tn(`${ae} gen-code`,e,t),await Nn("format",()=>Ge({...t,_:["lint"],format:!0,printAllOutput:!0,silent:!0}),{allowFailure:!0,silent:!0}),await Nn("lint-fix",()=>Ge({...t,_:["lint"],fix:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function Nn(e,t,n={}){n.silent||console.info("\n"+l.cyan(l.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?n.silent||console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function Tn(e,t,n,r={}){if(function(e,t){console.info("\n"+l.cyan(l.bold("Command:"),e)+l.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await j(e,void 0,{cwd:t.dirPath,env:Ae(t.env,{forceColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${ae} install`||e===`${ae} gen-code`))return void console.info(l.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(l.red(l.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function In(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(Pe).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(On).command(le).command(xe).command(Ce).command(qe).command(pt).command(Pt).command(Wt).command(Ut).command(pn).command(gn).command($n).command(xn).command(Rn).command(jn).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 Cn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!Cn){Cn=!0;try{P(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGJsYW5rLW9ubHkgbGluZXMgYXJlIHNraXBwZWQgd2hpbGUgcHJpbnRpbmcgc3Rkb3V0L3N0ZGVyciBpbiByZWFsdGltZSAqL1xuICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgY29uc3Qgc3Rkb3V0UHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZG91dCwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIGNvbnN0IHN0ZGVyclByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRlcnIsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBzdGRvdXRQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBzdGRlcnJQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHN0ZG91dFByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgc3RkZXJyUHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGVTdHJlYW0sXG4gIG9taXRCbGFua0xpbmVzID0gZmFsc2Vcbik6IHsgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7IGZsdXNoOiAoKSA9PiB2b2lkIH0ge1xuICBpZiAoIW9taXRCbGFua0xpbmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiAoZGF0YSkgPT4gc3RyZWFtLndyaXRlKGRhdGEpLFxuICAgICAgZmx1c2g6ICgpID0+IHt9LFxuICAgIH07XG4gIH1cblxuICBsZXQgcGVuZGluZyA9ICcnO1xuICByZXR1cm4ge1xuICAgIHdyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZyArPSBkYXRhO1xuICAgICAgY29uc3QgbGluZXMgPSBwZW5kaW5nLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkgPz8gJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFpc0JsYW5rTGluZShsaW5lKSkge1xuICAgICAgICAgIHN0cmVhbS53cml0ZShgJHtsaW5lfVxcbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaDogKCkgPT4ge1xuICAgICAgaWYgKCFpc0JsYW5rTGluZShwZW5kaW5nKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUocGVuZGluZyk7XG4gICAgICB9XG4gICAgICBwZW5kaW5nID0gJyc7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCbGFua0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKS50cmltKCkubGVuZ3RoID09PSAwO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGZtdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGZtdCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByZXR0aWVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSkgPz8gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnJvb3RQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5wYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFja2FnZUpzb24pIHJldHVybjtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKGFyZ3Yuc2lsZW50ICYmIG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCk7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCkge1xuICAgIGNvbnN0IG91dHB1dCA9IG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dD8uKHJldC5zdGRvdXQpLnRyaW0oKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgJ1BSSVNNQSBnZW5lcmF0ZSAnLFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZSAnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzICdcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnWUFSTiBibGl0eiBwcmlzbWEgJyA6ICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gLS1idW4gcnVuICcgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmBcbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1biAnIDogJ3lhcm4gcnVuICcpO1xuICBpZiAoaXNSdW5uaW5nT25CdW4pIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpXG4gICAgICAucmVwbGFjZUFsbCgvKD86WUFSTiApP3ZpdGVzdCBydW4vZywgJ2J1biB0ZXN0JylcbiAgICAgIC8vICctLWFsbG93T25seScgaXMgc29tZXRpbWVzIHJlbW92ZWQuXG4gICAgICAucmVwbGFjZUFsbCgvIC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMoPzogLS1hbGxvd09ubHkpPy9nLCAnJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBgeWFybiBwbGF5d3JpZ2h0YCBpbiBhIHByb2plY3QgZGVwZW5kaW5nIG9uIGBhcnRpbGxlcnktZW5naW5lLXBsYXl3cmlnaHRgLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFpc1J1bm5pbmdPbkJ1biAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb3JjZUNvbG9yOiB0eXBlb2YgYXJndi5mb3JjZUNvbG9yID09PSAnYm9vbGVhbicgPyBhcmd2LmZvcmNlQ29sb3IgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSwgZm9yY2VDb2xvcjogb3B0aW9ucy5mb3JjZUNvbG9yIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQocmVtb3ZlTm9Db2xvcldhcm5pbmcob3V0cHV0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb0NvbG9yV2FybmluZyhvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQucmVwbGFjZUFsbChcbiAgICAvXFwobm9kZTpcXGQrXFwpIFdhcm5pbmc6IFRoZSAnTk9fQ09MT1InIGVudiBpcyBpZ25vcmVkIGR1ZSB0byB0aGUgJ0ZPUkNFX0NPTE9SJyBlbnYgYmVpbmcgc2V0XFwuXFxuXFwoVXNlIGBub2RlIC0tdHJhY2Utd2FybmluZ3MgXFwuXFwuXFwuYCB0byBzaG93IHdoZXJlIHRoZSB3YXJuaW5nIHdhcyBjcmVhdGVkXFwpXFxuPy9nLFxuICAgICcnXG4gICk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgbGludFByb21pc2VzOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+W10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bkxpbnRDb21tYW5kKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQoYnVpbGREYXJ0Q29tbWFuZChhcmd2LCBkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmICFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5MaW50Q29tbWFuZChidWlsZERhcnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgYXJndi5mb3JtYXQpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuTGludENvbW1hbmQoYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChsaW50UHJvbWlzZXMpO1xuICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRSZXN1bHRzLCBhcmd2KTtcbiAgY29uc3QgbGludEV4aXRDb2RlcyA9IGxpbnRSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpO1xuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIHx8IGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dCA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSAhPT0gMCkgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Q29tbWFuZChcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIGNvbnN0IGNvbW1hbmRzID1cbiAgICBhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdFxuICAgICAgPyBbXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSksXG4gICAgICAgIF1cbiAgICAgIDogW2J1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pXTtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydENvbW1hbmQoXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0KSB7XG4gICAgY29tbWFuZHMucHVzaChidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pKTtcbiAgfVxuICBjb21tYW5kcy5wdXNoKGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pKTtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuLy8gVGhlc2UgdG9vbHMgYXJlIGRlY2xhcmVkIGFzIGRldkRlcGVuZGVuY2llcyBpbiBzb3VyY2UgcmVwb3MsIGJ1dCBvcHRpbWl6ZWQgRG9ja2VyXG4vLyBwYWNrYWdlLmpzb24gZmlsZXMgc3RpbGwgbmVlZCB0aGVtIGZvciBpbi1pbWFnZSBjb2RlZ2VuL2J1aWxkIHN0ZXBzLlxuY29uc3QgcnVudGltZURldkRlcGVuZGVuY2llcyA9IFsnQHdpbGxib29zdGVyL3diJywgJ2J1aWxkLXRzJ107XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLlxuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uKTtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBwYWNrYWdlcyBmb3IgdGhhdCBsYXRlciBpbi1pbWFnZSBidWlsZCBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIG1pZ3JhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBEQVRBQkFTRV9QQVRIIG9yIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGBZQVJOIGRyaXp6bGUta2l0ICR7ZnVsbENvbW1hbmR9YDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAuLi4odGFyZ2V0cyAmJiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgICBdKX0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UID0gMjAwO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTyA9IDAuMDU7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0pIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IGFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0cyB9O1xuICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JykpKSB7XG4gICAgcmV0dXJuIFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVkdXBlTm9pc3lUZXN0T3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWR1cGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBpdGVyYXRlTGluZXMob3V0cHV0KSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMaW5lID0gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZSk7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lU2V0Lmhhcyhub3JtYWxpemVkTGluZSkpIGNvbnRpbnVlO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZXMuc29tZSgocHJpbnRlZExpbmUpID0+IGFyZUxpbmVzU2ltaWxhcihwcmludGVkTGluZSwgbm9ybWFsaXplZExpbmUpKSkgY29udGludWU7XG5cbiAgICBwdXNoUmVjZW50UHJpbnRlZExpbmUocmVjZW50UHJpbnRlZExpbmVzLCByZWNlbnRQcmludGVkTGluZVNldCwgbm9ybWFsaXplZExpbmUpO1xuICAgIGRlZHVwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBkZWR1cGVkTGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uKiBpdGVyYXRlTGluZXMob3V0cHV0OiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBsaW5lU3RhcnRJbmRleCA9IDA7XG4gIHdoaWxlIChsaW5lU3RhcnRJbmRleCA8PSBvdXRwdXQubGVuZ3RoKSB7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gb3V0cHV0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydEluZGV4KTtcbiAgICBpZiAobGluZUVuZEluZGV4ID09PSAtMSkge1xuICAgICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG4gICAgbGluZVN0YXJ0SW5kZXggPSBsaW5lRW5kSW5kZXggKyAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hSZWNlbnRQcmludGVkTGluZShsaW5lczogc3RyaW5nW10sIGxpbmVTZXQ6IFNldDxzdHJpbmc+LCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGluZXMucHVzaChsaW5lKTtcbiAgbGluZVNldC5hZGQobGluZSk7XG4gIGlmIChsaW5lcy5sZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UKSByZXR1cm47XG5cbiAgY29uc3QgcmVtb3ZlZExpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICBpZiAocmVtb3ZlZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVTZXQuZGVsZXRlKHJlbW92ZWRMaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZVxuICAgIC5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL14oPzpcXFtbXlxcXV0rXFxdXFxzKikrL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXChub2RlOlxcZCtcXCkvZywgJyhub2RlOjxudW1iZXI+KScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/Wj9cXGIvZywgJzx0aW1lc3RhbXA+JylcbiAgICAucmVwbGFjZUFsbCgvKFs/Jl1jYWNoZT0pXFxkKy9nLCAnJDE8bnVtYmVyPicpO1xufVxuXG5mdW5jdGlvbiBhcmVMaW5lc1NpbWlsYXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgaWYgKG1heExlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heExlbmd0aCAqIFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZGlzdGFuY2UoYSwgYikgLyBtYXhMZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnZm9ybWF0JyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHByaW50QWxsT3V0cHV0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KSxcbiAgICB7XG4gICAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgfVxuICApO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdsaW50LWZpeCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBwcmludEFsbE91dHB1dDogdHJ1ZSxcbiAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRlc3QoeyAuLi5hcmd2LCBfOiBbJ3Rlc3QnXSwgZTJlOiAnaGVhZGxlc3MnLCBzaWxlbnQ6IHRydWUgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBmb3JjZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIChjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfHwgY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3Rkb3V0LmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUocHJvY2Vzcy5zdGRlcnIuZmQsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG91dHB1dEZpbGU6IG51bWJlciwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICBmcy53cml0ZVN5bmMob3V0cHV0RmlsZSwgYnVmZmVyKTtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZW5jb2RpbmdPckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrPy4oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52IiwicXVpZXQiLCJzZXQiLCJpc0Vycm5vRXhjZXB0aW9uIiwiZXJyb3IiLCJFcnJvciIsInRyZWVLaWxsIiwicGlkIiwic2lnbmFsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwicHJvY2VzcyIsInBsYXRmb3JtIiwicnVuQ29tbWFuZCIsIlN0cmluZyIsIm1heEJ1ZmZlciIsInRpbWVvdXQiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImtpbGxUcmVlT25XaW5kb3dzIiwiZGVzY2VuZGFudHMiLCJyb290UGlkIiwic3Rkb3V0IiwiY2hpbGRyZW5CeVBhcmVudCIsInBzT3V0cHV0IiwibGluZSIsInNwbGl0IiwibWF0Y2hlZCIsImV4ZWMiLCJjaGlsZFBpZCIsInBhcmVudFBpZCIsImNoaWxkcmVuIiwicHVzaCIsImJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCIsInF1ZXVlIiwiaW5kZXgiLCJsZW5ndGgiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzIiwidGFyZ2V0UGlkcyIsInRvUmV2ZXJzZWQiLCJ0b0NoaWxkcmVuRmlyc3RQaWRzIiwidGFyZ2V0UGlkIiwia2lsbElmTmVlZGVkIiwia2lsbCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImV4ZWNGaWxlU3luYyIsImVuY29kaW5nIiwic3RkaW8iLCJzdGRlcnIiLCJCdWZmZXIiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwiZXh0cmFjdFN0ZGVyciIsIkNvbW1hbmRFeGVjdXRpb25FcnJvciIsImNvZGUiLCJzdGF0dXMiLCJ0b0V4aXRDb2RlIiwidGVzdCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJqb2luIiwidGhpcyIsIm5hbWUiLCJhc3luYyIsInNwYXduQXN5bmMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic2V0RW5jb2RpbmciLCJzdGRvdXRQcmludGVyIiwiY3JlYXRlUmVhbHRpbWVQcmludGVyIiwib21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nIiwic3RkZXJyUHJpbnRlciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsImZsdXNoIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsIkFOU0lfRVNDQVBFX0NPREVfUkVHRVhQIiwiUmVnRXhwIiwiZnJvbUNvZGVQb2ludCIsInN0cmVhbSIsIm9taXRCbGFua0xpbmVzIiwicGVuZGluZyIsImxpbmVzIiwicG9wIiwiaXNCbGFua0xpbmUiLCJyZXBsYWNlQWxsIiwidHJpbSIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibWVzc2FnZSIsInN0YWNrIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzTmFOIiwiaXNGaW5pdGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwiaGFzQnVuVG9vbFZlcnNpb24iLCJoYXNCdW5Mb2NrZmlsZSIsImhhc0J1blBhY2thZ2VNYW5hZ2VyIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJyb290RGlyUGF0aCIsInNvbWUiLCJmaWxlTmFtZSIsImV4aXN0c1N5bmMiLCJwYWNrYWdlTWFuYWdlciIsInJvb3RQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uIiwic3RhcnRzV2l0aCIsImJ1aWxkQ29tbWFuZCIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmluZCIsImdldERlcGVuZGVuY3lWZXJzaW9uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInNpbGVudCIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJjb25maWd1cmVFbnYiLCJvdXRwdXQiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJwcmludFJhd091dHB1dCIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJwcmludE9wdGlvbnMiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyIsIm9wdGlvbk5hbWUiLCJnZXRPcHRpb25WYWx1ZSIsIml0ZW0iLCJjYW1lbENhc2VPcHRpb25OYW1lIiwiY2hhcmFjdGVyIiwidG9VcHBlckNhc2UiLCJjb25jdXJyZW50bHlDb21tYW5kIiwiYnVpbGRlciIsInN1Y2Nlc3MiLCJjaG9pY2VzIiwiY29tbWFuZHMiLCJkZXRhY2hlZCIsImludGVycnVwdGVkU2lnbmFsIiwiZmlyc3RSZXN1bHQiLCJzdG9wUmVzdWx0Iiwic3RvcHBpbmciLCJmb3JjZUtpbGxQcm9taXNlcyIsInJlc3VsdHMiLCJ3YWl0Rm9yRXhpdFByb21pc2VzIiwiY2hpbGQiLCJzZXR0bGVkIiwic2V0dGxlIiwia2lsbE90aGVycyIsImtpbGxPdGhlcnNPbkZhaWwiLCJzaG91bGRTdG9wT3RoZXJzIiwidGVybWluYXRlQ2hpbGRyZW4iLCJvbmNlIiwiZ2V0RXhpdENvZGUiLCJzdG9wQWxsIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJhbGwiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwiZm9yY2VLaWxsUGlkcyIsInNpZ25hbFBpZHMiLCJ0b0NoaWxkUGlkcyIsInBpZHMiLCJkZWFkbGluZSIsImV2ZXJ5IiwiaXNQcm9jZXNzR3JvdXBHb25lIiwic2xlZXAiLCJNYXRoIiwibWluIiwid2FpdEZvckZvcmNlS2lsbCIsInNpZ25hbGVkUGlkcyIsImtpbGxQcm9jZXNzR3JvdXAiLCJtcyIsInNldFRpbWVvdXQiLCJraWxsUG9ydElmTm9uQ2lDb21tYW5kIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJpbnRCdWZmZXJlZE91dHB1dCIsImhhc1dhcm5pbmdPdXRwdXQiLCJyZW1vdmVOb0NvbG9yV2FybmluZyIsInNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQiLCJub3JtYWxpemVkT3V0cHV0Iiwibm9ybWFsaXplQnVmZmVyZWRPdXRwdXQiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJveGxpbnRFeHRlbnNpb25zIiwicHl0aG9uRXh0ZW5zaW9ucyIsImRhcnRFeHRlbnNpb25zIiwib3hmbXRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm94Zm10RmlsZVBhdGhzIiwiYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImxpbnRQcm9taXNlcyIsImxpbnRSdW5PcHRpb25zIiwicHJpbnRBbGxPdXRwdXQiLCJidWlsZExpbnRDb21tYW5kIiwicnVuTGludENvbW1hbmQiLCJidWlsZE94Zm10Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Q29tbWFuZCIsImJ1aWxkRGFydENvbW1hbmQiLCJsaW50UmVzdWx0cyIsInByaW50U2lsZW50TGludE91dHB1dHMiLCJsaW50RXhpdENvZGVzIiwicHJldHRpZXJSZXN1bHQiLCJzb3J0UGFja2FnZUpzb25SZXN1bHQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQiLCJ0aGVuIiwicHJpbnRhYmxlUmVzdWx0cyIsInByaW50Q29tbWFuZE91dHB1dCIsInByaW50Q29tbWFuZEhlYWRlciIsInRhcmdldHMiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsInJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsInByb21vdGVkRGVwcyIsInZlcnNpb24iLCJwcm9tb3RlUnVudGltZURldkRlcGVuZGVuY2llcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwicmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiZHJpenpsZVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsIm1pZ3JhdGUiLCJfcHJvamVjdCIsIm1pZ3JhdGVEZXYiLCJyZW1vdmVDb21tYW5kIiwiZGJQYXRoIiwiREFUQUJBU0VfUEFUSCIsImRiVXJsIiwiREFUQUJBU0VfVVJMIiwicmF3RGJQYXRoIiwiZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCIsImFic29sdXRlUGF0aCIsImlzQWJzb2x1dGUiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsInNlZWQiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsInByaXNtYVNjcmlwdHMiLCJjbGVhblVwTGl0ZXN0cmVhbSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiYmFzZURpciIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJwcmlzbWEiLCJwcmlzbWFDb21tYW5kIiwiYWxpYXNlcyIsInlhcmdzIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsImNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpc3RCYWNrdXBzQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZERhdGFiYXNlT3JtUHJvamVjdHMiLCJwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm9ybSIsImdldERhdGFiYXNlT3JtU2NyaXB0cyIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJvcm1Qcm9qZWN0QnlQcm9qZWN0Iiwib3JtUHJvamVjdCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBhY2thZ2VzIiwiaXNGaWxlIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiYXZhaWxhYmxlIiwiaG9zdCIsInByb2JlUG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImtpbGxGdW5jIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiZXJyIiwiY2xvc2UiLCJsaXN0ZW4iLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGRJbWFnZSIsInN0b3BBbmRTdGFydCIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsIkJhc2VTY3JpcHRzIiwic2hvdWxkV2FpdEFuZE9wZW5BcHAiLCJidWlsZERvY2tlciIsInN0YXJ0RGV2Iiwic3RhcnREZXZQcm90ZWN0ZWQiLCJ3YWl0QW5kT3BlbkFwcCIsInN0YXJ0UHJvZHVjdGlvbiIsInN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZCIsInN0YXJ0VGVzdCIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0IiwiZWNvc3lzdGVtQ29uZmlnUGF0aCIsImZpbmRFY29zeXN0ZW1Db25maWdQYXRoIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsIl8xIiwiXzIiLCJyZW1peFNjcmlwdHMiLCJ2aXRlU2NyaXB0cyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsIm1vZGUiLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsIm5leHQiLCJ2aXRlIiwiZTJlIiwiYXJndW1lbnRzQnVpbGRlciIsInRlc3RDb21tYW5kIiwidGVzdFRhcmdldHMiLCJzaG91bGRSdW5FMmUiLCJzaG91bGRSdW5Vbml0IiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJyZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMiLCJkZWZhdWx0VW5pdFRhcmdldHMiLCJnZXREZWZhdWx0VW5pdFRhcmdldHMiLCJ1bml0VGFyZ2V0cyIsInVuaXRBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwiYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRSIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsImRlZHVwZU5vaXN5VGVzdE91dHB1dCIsInJlY2VudFByaW50ZWRMaW5lcyIsInJlY2VudFByaW50ZWRMaW5lU2V0IiwiZGVkdXBlZExpbmVzIiwibGluZVN0YXJ0SW5kZXgiLCJsaW5lRW5kSW5kZXgiLCJpdGVyYXRlTGluZXMiLCJub3JtYWxpemVkTGluZSIsIm5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5IiwicHJpbnRlZExpbmUiLCJhcmVMaW5lc1NpbWlsYXIiLCJwdXNoUmVjZW50UHJpbnRlZExpbmUiLCJsaW5lU2V0IiwicmVtb3ZlZExpbmUiLCJzaGlmdCIsImRlbGV0ZSIsIm1heExlbmd0aCIsIm1heCIsImFicyIsImRpc3RhbmNlIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsInBvc2l0aW9uYWwiLCJkZW1hbmRPcHRpb24iLCJ0eXBlQ2hlY2tDb21tYW5kIiwicmVtb3ZlZE5leHREaXIiLCJidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJmdWxsIiwicmVwb3J0ZXIiLCJzdGFydGVkQXQiLCJ3YkRpclBhdGgiLCJta2RpclN5bmMiLCJsb2dGaWxlUGF0aCIsImxvZ0ZpbGUiLCJvcGVuU3luYyIsIm9yaWdpbmFsU3Rkb3V0V3JpdGUiLCJiaW5kIiwib3JpZ2luYWxTdGRlcnJXcml0ZSIsInN1Y2NlZWRlZCIsImZpbmlzaGVkIiwidGVlV3JpdGUiLCJmZCIsImZpbmlzaCIsImVsYXBzZWRUaW1lIiwibWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsInJvdW5kIiwibWludXRlcyIsImZsb29yIiwicmVtYWluaW5nU2Vjb25kcyIsImZvcm1hdEVsYXBzZWRUaW1lIiwic3VtbWFyeSIsImNvbG9yZWRTdW1tYXJ5Iiwid3JpdGVTeW5jIiwiY2xvc2VTeW5jIiwiZmFpbCIsInN1Y2NlZWQiLCJzdGFydFZlcmlmeUZ1bGxSZXBvcnRlciIsInZlcmlmeUNvZGUiLCJydW5Qcm9qZWN0VGVzdCIsInZlcmlmeUNvZGVGdWxseSIsInJ1blBhY2thZ2VDb21tYW5kIiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsInByaW50Q29tbWFuZCIsInRyaW1tZWRPdXRwdXQiLCJwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0Iiwib3V0cHV0RmlsZSIsImNodW5rIiwiZW5jb2RpbmdPckNhbGxiYWNrIiwiY2FsbGJhY2siLCJidWZmZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiIya0JBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdB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RUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJN0QsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWhCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXFCLEVBQUVyQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXNCLEVBQUV0QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXVCLEVBQUV2QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTZCLEVBQUU3QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSThCLEVBQUU5QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRTZCLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJbkIsRUFBRTZCLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHa0IsR0FBRyxFQUFFQyxJQUFJLElBQUlyQixFQUFFSSxHQUFHaUIsR0FBRyxFQUFFRCxJQUFJLElBQUl0QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTNCLEVBQUVtQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJN0IsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJOUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMkIsR0FBR3hCLEdBQUcsRUFBRUUsSUFBSSxJ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TWdRLEVBQVEvM0IsUUFBUXNPLE9BQ3pCMHBCLFdBQVcsTUFDWDcxQixRQUFRZ1osSUFDUjhjLFdBQVkzcEIsSUFDWCxNQUFNNHBCLEVBQWE1cEIsRUFBSyxlQUN4QixHQUFJNHBCLEVBQVksQ0FDZCxNQUFNMXBCLEVBQVVyUCxFQUFLQyxRQUFRODRCLEdBQzdCbDRCLFFBQVFtNEIsTUFBTTNwQixFQUNoQixFaERrSEcsU0FBOEMwQixHQUUvQ0EsRUFBUXNELE1BQVF0RCxFQUFRa29CLG1CQUMxQmxvQixFQUFRc0QsS0FBT3RELEVBQVFzRCxLQUFLNkQsUUFBUSxHQUFHbkgsRUFBUWtvQixvQkFBcUIsSUFFakVoeUIsV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU1nTCxLQUFPM0QsT0FBTzBELEtBQUtqQixHQUFVLENBQ3RDLE1BQU1tb0IsRUFBV2puQixFQUFJc0ssZUFFbkIyYyxFQUFTN29CLFdBQVcsU0FDcEI2b0IsRUFBUzdvQixXQUFXLFVBQ3BCNm9CLEVBQVM3b0IsV0FBVyxXQUNQLGdCQUFiNm9CLEdBQ2EsYUFBYkEsV0FHT25vQixFQUFRa0IsRUFFbkIsQ0FDRixDZ0R2SUlrbkIsQ0FBcUN0NEIsUUFBUTNCLE9BRTlDNEQsUUFBUWd6QixJQUNSaHpCLFFBQVF3VCxJQUNSeFQsUUFBUTBaLElBQ1IxWixRQUFRd2MsSUFDUnhjLFFBQVErZCxJQUNSL2QsUUFBUWdpQixJQUNSaGlCLFFBQVE0bEIsSUFDUjVsQixRQUFROG9CLElBQ1I5b0IsUUFBUW1wQixJQUNSbnBCLFFBQVE4c0IsSUFDUjlzQixRQUFRd3ZCLElBQ1J4dkIsUUFBUWl5QixJQUNSanlCLFFBQVFteUIsSUFDUm55QixRQUFRc3lCLElBQ1J0eUIsUUFBUSt5QixJQUNScE0sZ0JBQ0FDLFNBQ0FuRSxRQUdILFdBQ0UsSUFBSTZULEVBQWlCcDVCLEVBQUtnVSxRQUFRLElBQUl2RyxnQkFBZ0I0ckIsS0FBS0MsVUFDM0QsTUFBUTFwQixFQUFHSyxXQUFXalEsRUFBS2dFLEtBQUtvMUIsRUFBZ0Isa0JBQzlDQSxFQUFpQnA1QixFQUFLZ1UsUUFBUW9sQixHQUtoQyxPQUhvQnRyQixLQUFLMEUsTUFBTTVDLEVBQUdDLGFBQWE3UCxFQUFLZ0UsS0FBS28xQixFQUFnQixnQkFBaUIsU0FHdkU3VCxPQUNyQixDQVpXZ1UsSUFDUkMsT0FBT3JxQixLQWFWLElBQUlzcUIsSUFBZSxFQUNuQixJQUFLLE1BQU0vNEIsSUFBVSxDQUFDLFNBQVUsVUFBVyxXQUN6Q0csUUFBUWlFLEdBQUdwRSxFQUFRLEtBQ2pCLElBQUkrNEIsR0FBSixDQUVBQSxJQUFlLEVBQ2YsSUFDRWo1QixFQUFTSyxRQUFRSixJQUNuQixDQUFFLE1BQU9ILEdBQ1BnRixRQUFRRSxLQUFLLHNCQUFzQjNFLFFBQVFKLHdCQUF5QkgsRUFDdEUsQ0FDQU8sUUFBUThhLE1BUlUiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNSw2LDcsOCw5XX0=
|