@willbooster/wb 8.0.33 → 8.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";const g=new Map;function b(t){const n=g.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return g.set(t,r),r}async function y(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function w(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 v(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 k(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:path";import t from"yargs";import{hideBin as n}from"yargs/helpers";import r,{spawn as s,spawnSync as o}from"node:child_process";import{createHash as i}from"node:crypto";import a from"node:fs";import c from"chalk";import{globby as d}from"globby";import{config as l}from"dotenv";import u from"kill-port";import{PromisePool as p}from"minimal-promise-pool";import m from"tree-kill";import f from"node:fs/promises";import h from"node:os";const g=new Map;function b(t){const n=g.get(t);if(n)return n;const r=l({path:e.resolve(t),processEnv:{}}).parsed??{};return g.set(t,r),r}async function y(e,t,n){return new Promise(((r,o)=>{try{const i=s(e,t??[],n??{});i.stdout?.setEncoding?.("utf8"),i.stderr?.setEncoding?.("utf8");let a="",c="";i.stdout?.on("data",(e=>{a+=e})),i.stderr?.on("data",(e=>{n?.mergeOutAndError?a+=e:c+=e}));let d=!1;const l=()=>{!d&&i.pid&&(d=!0,n?.verbose&&console.info(`treeKill(${i.pid})`),m(i.pid))};n?.killOnExit&&(process.on("beforeExit",l),process.on("SIGINT",l)),i.on("error",(e=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),i.removeAllListeners("close"),o(e)})),i.on("close",((e,t)=>{process.removeListener("beforeExit",l),process.removeListener("SIGINT",l),void 0===i.pid?o(new Error("Process has no pid.")):r({pid:i.pid,stdout:a,stderr:c,status:e,signal:t})})),n?.input&&(i.stdin?.write(n.input),i.stdin?.end())}catch(e){o(e)}}))}function v(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 w(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 k(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:path";import t from"yargs";import{hideBin as n}from"yargs/hel
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const $=[..."0123456789abcdef"],E=[6,1536,393216,100663296],A=[0,8,16,24],N=[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 x=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class P{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,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+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<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),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];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=$[s>>4&15]+$[15&s]+$[s>>12&15]+$[s>>8&15]+$[s>>20&15]+$[s>>16&15]+$[s>>28&15]+$[s>>24&15];i%e==0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=$[s>>4&15]+$[15&s],r>1&&(a+=$[s>>12&15]+$[s>>8&15]),r>2&&(a+=$[s>>20&15]+$[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,w,v,k,$,E,A,x,P,j,R,D,S,_,O,B,T,I,C,W,V,z,J,F,Y,U,L,M,G,q,H,X,K,Q,Z,ee,te,ne,re,se,oe,ie,ae,ce,de,le;for(r=0;r<48;r+=2)s=e[0]^e[10]^e[20]^e[30]^e[40],o=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],m=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=m^(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=s^(c<<1|d>>>31),n=o^(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|m>>>31),n=d^(m<<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^(s<<1|o>>>31),n=u^(o<<1|s>>>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,f=e[0],h=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,D=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,U=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,I=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,X=e[23]<<10|e[22]>>>22,S=e[33]<<13|e[32]>>>19,_=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,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,K=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,O=e[45]<<29|e[44]>>>3,B=e[44]<<29|e[45]>>>3,A=e[6]<<28|e[7]>>>4,x=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=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,L=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,P=e[18]<<20|e[19]>>>12,j=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,F=e[39]<<8|e[38]>>>24,$=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&w,e[10]=A^~P&R,e[11]=x^~j&D,e[20]=T^~C&V,e[21]=I^~W&z,e[30]=L^~G&H,e[31]=M^~q&X,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&v,e[3]=b^~w&k,e[12]=P^~R&S,e[13]=j^~D&_,e[22]=C^~V&J,e[23]=W^~z&F,e[32]=G^~H&K,e[33]=q^~X&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~v&$,e[5]=w^~k&E,e[14]=R^~S&O,e[15]=D^~_&B,e[24]=V^~J&Y,e[25]=z^~F&U,e[34]=H^~K&Z,e[35]=X^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=v^~$&f,e[7]=k^~E&h,e[16]=S^~O&A,e[17]=_^~B&x,e[26]=J^~Y&T,e[27]=F^~U&I,e[36]=K^~Z&L,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=$^~f&g,e[9]=E^~h&b,e[18]=O^~A&P,e[19]=B^~x&j,e[28]=Y^~T&C,e[29]=U^~I&W,e[38]=Z^~L&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=N[r],e[1]^=N[r+1]},R=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,s])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==s&&(e.cause=s)}},t={instance:Uint8Array,from:e=>[btoa(S.decode(e))],create:([e])=>D.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)}},s={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},o={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)},a=new Map,c=[e,t,n,r,s,o,i];for(const e of c)a.set(e.instance.name,e);return a}(),D=new TextEncoder,S=new TextDecoder("utf8");function _(e=void 0,t=R){return JSON.stringify(T(e,t))}function O(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 B=[];function T(e,t=R){const n=O(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=O(n);if(null!==o)return o;let i=s.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,s.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],s.set(n,i);break;case"object":if(null===n)r[i]=n,s.set(n,i);else if(Array.isArray(n)){const t=function(e){if(B.length<e){const t=B.length;B.length=e,B.fill(-2,t,e)}return B.slice(0,e)}(n.length);r[i]=t,s.set(n,i);for(const r in n)t[r]=e(n[r])}else{const[o,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,s=t.get(r);if(void 0!==s)return[r,s.from(e)]}const r=Object.entries(e),s=r.length,o=Array.from({length:s+s});for(let e=0;e<s;e++){const t=r[e],n=e+e;o[n]=t[0],o[n+1]=t[1]}return["",o]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=o,r[i]=d,s.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function I(e,t){return function(e){return new P(512,E,512).update(e).hex()}(_([e,t]))}const C=function({cacheDuration:e=Number.POSITIVE_INFINITY,calcHash:t=I}={}){return function(n,r){let s,o,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-o>e)&&(i=r,s=n.call(this),o=a),s}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-o>e)&&(i=c,s=r?n.call(this,...a):n(...a),o=d),s}}}({calcHash:I});let W;class V{static{[W]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}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 $(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),w=t[3],k=!c,$=1===s,E=3===s,A=4===s,N=2===s;function x(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!k){var P={},j=[],R=E?"get":A||$?"set":"value";if(l?(u||$?P={get:v((function(){return w(this)}),r,"get"),set:function(e){t[4](this,e)}}:P[R]=w,u||v(P[R],r,N?"":R)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+P[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var D=e,S=g.length-1;S>=0;S-=n?2:1){var _=y(g[S],"A decorator","be",!0),O=n?g[S-1]:void 0,B={},T={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,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,B)};if(k)i=_.call(O,D,T),B.v=1,y(i,"class decorators","return")&&(D=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:x("get",0,f):function(e){return e[r]}),N||E||(i.set=l?x("set",0,f):function(e,t){e[r]=t}),D=_.call(O,$?{get:P.get,set:P.set}:P[R],T),B.v=1,$){if("object"==typeof D&&D)(i=y(D.get,"accessor.get"))&&(P.get=i),(i=y(D.set,"accessor.set"))&&(P.set=i),(i=y(D.init,"accessor.init"))&&j.unshift(i);else if(void 0!==D)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(D,(u?"field":"method")+" decorators","return")&&(u?j.unshift(D):P[R]=D)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||k||(l?$?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[R]:y.call.bind(P[R])):m(e,r,P)),D}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;$(t?e:e.prototype,i,f,m?"#"+p:k(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return w(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=$(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[C,3,"isBunAvailable"],[C,3,"buildCommand"],[C,3,"rootDirPath"],[C,3,"dockerfile"],[C,3,"hasDockerfile"],[C,3,"hasSourceCode"],[C,3,"name"],[C,3,"dockerImageName"],[C,3,"env"],[C,3,"packageJson"],[C,3,"packageJsonPath"],[C,3,"hasPrisma"],[C,3,"dockerPackageJson"],[C,3,"binExists"]]).e}argv=void W(this);pathByName=new Map;constructor(t,n,r){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(a.readFileSync(e.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 a.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return a.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return a.existsSync(e.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[t,n]=function(t,n){let r=(t.env??[]).map((t=>e.resolve(n,t.toString())));const s=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===r.length&&(r.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");a.existsSync(e.join(t,"package.json"))&&r.push(e.join(t,".env"))}r=r.flatMap((e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e]))}r=r.filter((e=>a.existsSync(e))).map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",r.join(", ")));const o=[],i={};for(const s of r){let r=0;for(const[t,o]of Object.entries(b(e.join(n,s))))t in i||(i[t]=o,r++);o.push([s,r]),t.verbose&&r>0&&console.info(`Read ${r} environment variables from ${s}`)}if(t.checkEnv){const s=Object.keys(b(e.join(n,t.checkEnv))||{}).filter((e=>!(e in i)));if(s.length>0)throw new Error(`Missing environment variables in [${r.join(", ")}]: [${s.join(", ")}]`)}return[i,o]}(this.argv,this.dirPath);for(const[e,t]of n)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...t}}get packageJson(){return JSON.parse(a.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(a.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const r=e.join(n,"node_modules",".bin");if(a.existsSync(r)&&(this.env.PATH=`${r}:${this.env.PATH}`,t=!0),a.existsSync(e.join(n,".git")))break;const s=e.dirname(n);if(n===s)break;n=s}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>a.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function z(t,n=!0,r){if(r??=process.cwd(),a.existsSync(e.join(r,"package.json")))return new V(r,t,n)}async function J(t,n=!0,r){const s=function(t,n=!0,r){if(r??=process.cwd(),!a.existsSync(e.join(r,"package.json")))return;const s=new V(r,t,n);let o=s;if(!s.packageJson.workspaces&&e.dirname(r).endsWith("/packages")){const s=e.resolve(r,"..","..");a.existsSync(e.join(s,"package.json"))&&(o=new V(s,t,n))}return{root:o,self:s}}(t,n,r);if(s)return{...s,descendants:s.root===s.self?await F(t,s.root,n):[s.self]}}async function F(t,n,r){const s=[n],o=n.packageJson.workspaces;if(!Array.isArray(o))return s;const i=[],c=[];for(const t of o.map((t=>e.join(n.dirPath,t))))a.existsSync(t)?c.push(t):i.push(t);c.push(...await d(i,{dot:!0,onlyDirectories:!0}));for(const n of c)a.existsSync(e.join(n,"package.json"))&&s.push(new V(n,t,r));return s}const Y=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),U=Y?"bun --bun run":"node",L=Y?"bun":"yarn",M=Y?"bun --bun run":"yarn",G={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(t){await async function(t,n){const s=z(t,!0,n);if(!s)return console.error(c.red("No project found.")),!0;if(t={...t,command:t.command??(Y?"bun run build":"yarn build")},!a.existsSync(e.join(s.rootDirPath,".git")))return q(s,t),!0;const[o,d,l]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),o=e.resolve(s,"last-build");await a.promises.mkdir(s,{recursive:!0});const c=i("sha256"),d=r.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(t.env).filter((([e])=>!H.has(e))).sort((([e],[t])=>e.localeCompare(t))));c.update(l),await async function(e,t,n){return new Promise((s=>{const o=r.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(X.some((t=>e.includes(t)))||K.some((t=>e.endsWith(t))))&&!Q.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=r.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),i.on("close",(()=>{s()}))}))}(t,n,c);const u=c.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}}((()=>a.promises.readFile(o,"utf8")));return[p===u,o,u]}(s,t);if(o)return console.info(c.green(`Skip to run '${t.command}' 💫`)),!1;if(!q(s,t))return;t.dryRun||await a.promises.writeFile(d,l,"utf8");return!0}(t)}};function q(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=r.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 H=new Set(["CI","PWDEBUG","TMPDIR"]);const X=["src/","public/"],K=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Q=["test/","tests/","__tests__/","test-fixtures/"];const Z=new Set;async function ee(e){try{await u(e)}catch{}}const te=new p,ne={exitIfFailed:!0};async function re(e,t,n,r=ne){const[s,o]=oe(e,t);if(ie(s,t),n.verbose&&ie(o,t,"Start (raw)",!0),n.dryRun)return ae(s,0,r),0;const i=o.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await ee(e);const t=async()=>{Z.has(e)||(Z.add(e),await ee(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await y(o,void 0,{cwd:t.dirPath,env:ce(t.env,r),shell:!0,stdio:"inherit",timeout:r?.timeout,killOnExit:!0,verbose:n.verbose});return ae(s,a.status,r),a.status??1}function se(e,t,n,r=ne){return te.runAndWaitForReturnValue((async()=>{const[s,o]=oe(e,t);if(ie(s,t,"Start (parallel)",!0),n.dryRun)return ie(s,t,"Started (log)"),n.verbose&&ie(o,t,"Started (raw)",!0),ae(s,0,r),0;const i=await y(o,void 0,{cwd:t.dirPath,env:ce(t.env,r),shell:!0,stdio:"pipe",timeout:r?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});ie(s,t,"Started (log)"),n.verbose&&ie(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ae(s,i.status,r),i.status??1}))}function oe(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",t.isBunAvailable?"bun --bun run ":"yarn run ");return Y&&(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(),[de(n.replaceAll("YARN ",`${M} `)),de(n.replaceAll("YARN playwright ",`${M} playwright `).replaceAll("YARN ",!Y&&t.binExists?"":`${M} `))]}function ie(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function ae(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function ce(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function de(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const le=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),ue=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),pe=new Set([...ue].filter((e=>!le.has(e)))),me={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){Y||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await J(t,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=t.files??[];let s,o,i;if(r.length>0){const t=[],n=[],a=[];for(const s of r){const r=e.resolve(String(s));if(r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=e.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):le.has(o)?t.push(r):ue.has(o)&&n.push(r)}s=t.map((e=>`"${e}"`)).join(" "),o=n.map((e=>`"${e}"`)).join(" "),i=a.map((e=>`"${e}"`)).join(" ")}else s="",o=`"**/{.*/,}*.{${[...pe].join(",")}" "!**/test-fixtures/**"`,i=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let d;(s||0===r.length)&&(d=se(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,t,{forceColor:!0})),t.format&&(o&&se(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,t,{forceColor:!0}),i&&(await d,se(`bun --bun sort-package-json ${i}`,n.self,t,{forceColor:!0})))}};function*fe(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const he={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await J(t);n||(console.error(c.red("No project found.")),process.exit(1));for(const r of fe("optimizeForDockerBuild",n.descendants)){const n=r.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ge(t,n),be(n),ye(n),t.dryRun)continue;const o=t.outside?e.join(r.dirPath,"dist"):r.dirPath;await a.promises.mkdir(o,{recursive:!0}),await a.promises.writeFile(e.join(o,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||(r.spawnSync(L,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ge(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies||{},r=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"],s=[];for(const t of Object.keys(n))(r.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&(delete n[t],s.push(t));console.info("Removed devDependencies:",s.join(", ")||"none")}function be(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts||{},s=[];for(const[e,o]of Object.entries(r))(t.some((t=>e.includes(t)))||n.some((e=>o.includes(e)||o.trim()===e.trim())))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function ye(e){delete e.private,delete e.publishConfig,delete e.prettier}const we=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${U} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){const r="file:";let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{s=`DATABASE_URL=${r}${e.resolve(n)} `}else if(t.env.DATABASE_URL?.startsWith(r)){const n=[{schemaPath:e.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:e.join("prisma","schema"),dbPath:e.join("prisma","schema")},{schemaPath:e.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:o,schemaPath:i}of n)if(a.existsSync(e.resolve(t.dirPath,i))){s=`DATABASE_URL=${r}${e.resolve(t.dirPath,o,t.env.DATABASE_URL.slice(5))} `;break}}return`${s}PRISMA studio`}},ve={},ke={command:"prisma",describe:"Run prisma commands",builder:e=>e.command($e).command(Ae).command(Ne).command(xe).command(Pe).command(je).command(Re).command(De).command(Se).command(_e).demandCommand(),handler(){}},$e={command:"deploy",describe:"Apply migration to DB without initializing it",builder:ve,async handler(e){const t=await Oe(e);for(const n of fe("prisma deploy",t))await re(we.deploy(n),n,e)}},Ee={...ve,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Ae={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ee,async handler(e){const t=await Oe(e);for(const n of fe("prisma deploy-force",t))await re(we.deployForce(n,e.backupPath),n,e)}},Ne={command:"litestream",describe:"Setup DB for Litestream",builder:ve,async handler(e){const t=await Oe(e);for(const n of fe("prisma litestream",t))await re(we.litestream(n),n,e)}},xe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:ve,async handler(e){const t=await Oe(e);for(const n of fe("prisma migrate",t))await re(we.migrate(n),n,e)}},Pe={command:"migrate-dev",describe:"Create a migration file",builder:ve,async handler(e){const t=await Oe(e);for(const n of fe("prisma migrate-dev",t))await re(we.migrateDev(n),n,e)}},je={command:"reset",describe:"Reset DB",builder:ve,async handler(e){const t=await Oe(e);for(const n of fe("prisma reset",t))await re(we.reset(n),n,e)}},Re={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ee,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Oe(e);for(const n of fe("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await re(we.restore(n,e.backupPath,t),n,e)}}},De={command:"seed",describe:"Populate DB with seed data",builder:{...ve,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Oe(e);for(const n of fe("prisma seed",t))await re(we.seed(n,e.file),n,e)}},Se={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...ve,"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 Oe(e);for(const n of fe("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await re(we.studio(n,t),n,e)}}},_e={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Oe(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const r of fe(`prisma ${n}`,t))await re(`PRISMA ${n}`,r,e)}};async function Oe(e){const t=await J(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(c.red("No prisma project found.")),process.exit(1)),n}const Be={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=z(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await re(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Te={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await J(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of fe("setup",n.descendants)){const s=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await se(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await re("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await se("poetry config virtualenvs.in-project true",t,e);const[,n]=r.execSync("asdf current python").toString().trim().split(/\s+/);await se(`poetry env use ${n}`,t,e),await te.promiseAll(),await re("poetry run pip install --upgrade pip",t,e),await re("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await re(`${M} gen-code`,t,e)}const s=n.descendants.find((e=>e.packageJson.devDependencies?.playwright));s&&await re(`${M} playwright install --with-deps`,s,e)}(e)}};const Ie=new class{buildDevImage(t,n){const r=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(Z.has(e))return;Z.add(e),ie(e,t);const{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ce{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Ie.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${o}"`}testUnit(e,t){return`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const We=new class extends Ce{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${we.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${we.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const Ve=new class extends Ce{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${U} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const ze=new class extends Ce{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[we.migrate(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[we.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbopack -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack" "${this.waitApp(e,t)}"`}};const Je=new class extends Ce{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${U} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Fe=new class extends Ce{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${we.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${we.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},Ye=["express","fastify","elysia"],Ue={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await J(e);t||(console.error(c.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},r=n.packageJson.devDependencies||{};let s;if(t.blitz)s=We;else if(t.next)s=ze;else if(r["@remix-run/dev"])s=Fe;else if(Ye.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ve;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Je}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=Le(t,"development");await re(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Le(t,"staging");await re(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=Le(t,"staging");await re(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Le(t,"staging");e.normalizedArgsText="'/bin/bash'",await re(`${r}${s.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Le(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const Me={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await J(t);n||(console.error(c.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const r=void 0===t.e2e&&void 0===t.start&&void 0===t.unit;for(const s of n.descendants){const n=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;i=n.blitz?We:n.next?ze:o["@remix-run/dev"]?Fe:Ye.some((e=>n[e]))&&!n["firebase-functions"]?Ve:Je,r&&(t={...t,e2e:a.existsSync(e.join(s.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:a.existsSync(e.join(s.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${s.name} ...`);const c=[];if(!t.ci){switch(t.unit&&c.push(re(i.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&c.push(re(i.testStart(s,t),s,t)),await Promise.all(c),t.e2e){case void 0:case"none":continue;case"":case"headless":await re(i.testE2E(s,t,{}),s,t);continue;case"headless-dev":await re(i.testE2EDev(s,t,{}),s,t);continue;case"docker":await Ge(s,t,i);continue;case"docker-debug":await Ge(s,t,i,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||o["@remix-run/dev"])switch(t.e2e){case"headed":await re(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await re(i.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await re(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await re(i.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await re("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await se(Ie.stopAll(),s,t),t.unit&&await se(i.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),t.start&&await se(i.testStart(s,t),s,t),await te.promiseAll(),"none"!==t.e2e){s.hasDockerfile&&(process.env.WB_DOCKER||="1",await re(`${i.buildDocker(s,"test")}`,s,t));const e=s.hasDockerfile?{startCommand:Ie.stopAndStart(s,!0)}:{};process.exitCode=await re(i.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await re(Ie.stop(s),s,t)}}}(t)}};async function Ge(e,t,n,r){process.env.WB_DOCKER||="1",await re(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await re(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:Ie.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await re(Ie.stop(e),e,t)}const qe={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await J(e,!1);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const r=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&r.push("YARN pyright")),r.length>0)return se(r.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),r=await Promise.all(n);let s=0;for(const[e,n]of r.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),s=n}s&&process.exit(s)}},He={...qe,command:"tc"},Xe={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};await t(n(process.argv)).scriptName("wb").options(Xe).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(G).command(me).command(he).command(ke).command(Be).command(Te).command(Ue).command(Me).command(qe).command(He).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9jYWNsSGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpIHx8IHt9KTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9LGY9bmV3IE1hcCxpPVtlLHQscyxvLHIsYyxkXTtmb3IoY29uc3QgZSBvZiBpKWYuc2V0KGUuaW5zdGFuY2UubmFtZSxlKTtyZXR1cm4gZn0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdCByIGluIGUpbltyXT10KGVbcl0pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG99ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG4obix0KXtyZXR1cm4gcihvKFtuLHRdKSl9ZnVuY3Rpb24gdCgpe3JldHVyblwiXCJ9ZXhwb3J0e3QgYXMgY2FsY0VtcHR5SGFzaCxuIGFzIGNhbGNIYXNoV2l0aENvbnRleHR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjbEhhc2guanMubWFwXG4iLCJpbXBvcnR7Y2FsY0hhc2hXaXRoQ29udGV4dCBhcyB0LGNhbGNFbXB0eUhhc2ggYXMgY31mcm9tXCIuL2NhY2xIYXNoLmpzXCI7Y29uc3Qgbj1yKHtjYWxjSGFzaDp0fSksYT1yKHtjYWxjSGFzaDpjfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjpjPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxjYWxjSGFzaDpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxhKXtsZXQgcixvLGU7cmV0dXJuXCJnZXR0ZXJcIj09PWE/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBhPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihlIT09YXx8cy1vPmMpJiYoZT1hLHI9dC5jYWxsKHRoaXMpLG89cykscn06ZnVuY3Rpb24oLi4ucyl7Y29uc3QgaT1uKHRoaXMscyksdT1EYXRlLm5vdygpO3JldHVybihlIT09aXx8dS1vPmMpJiYoZT1pLHI9YT90LmNhbGwodGhpcywuLi5zKTp0KC4uLnMpLG89dSkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxhIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV2ZW4gdGhvdWdoIHRoaXMgYmVoYXZpb3IgaXMgbm9uLXN0YW5kYXJkXG4gICAgLy8gYmVjYXVzZSBgYnVuIHdiIC4uLmAgd2lsbCBsb2FkIC5lbnYgYW5kIC5lbnYubG9jYWwgYmVmb3JlIGB3YmAgbG9hZHMgb3RoZXIgdmFyaWFibGVzLlxuICAgIHJldHVybiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MuYXJndlswXS5lbmRzV2l0aCgnL2J1bicpIHx8IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHsgYmVmb3JlUmV0cnksIGhhbmRsZUVycm9yLCByZXRyeUNvdW50ID0gMywgcmV0cnlMb2dnZXIsIHNsZWVwTWlsbGlzZWNvbmRzID0gMCB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyBlcnJvci5zdGFjayA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gcnVubmFibGVTY3JpcHQubWF0Y2goL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvKT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0ICYmICFydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cz8udGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKSxcbiAgICBmaXhCdW5Db21tYW5kKFxuICAgICAgbmV3U2NyaXB0XG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICAgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fCBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID0gYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAoIWFyZ3Yub3V0c2lkZSAmJiBuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUFJJU01BIG1pZ3JhdGUgZGVwbG95JztcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXZgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSlcbiAgICAgIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgUE9TU0lCTEVfUEFUSFMgPSBbXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCB7IGRiUGF0aCwgc2NoZW1hUGF0aCB9IG9mIFBPU1NJQkxFX1BBVEhTKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGRiUGF0aCxcbiAgICAgICAgICAgIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKTtcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCB8fFxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXVxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gYCR7YXJndi5hcmdzPy5qb2luKCcgJykgPz8gJyd9YC50cmltRW5kKCk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7c2NyaXB0fWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtzY3JpcHR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAneWFybiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCA4MDgwOjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHt9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9XG4gICAgICAmJiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgICAgXCIke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICAgKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCA4MDgwKX1cImA7XG4gIH1cblxuICB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHByaXNtYURpcmVjdG9yeSwgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwicm0gLVJmICR7cHJpc21hRGlyZWN0b3J5fS9tb3VudCAmJiAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODBcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdHMvZTJlJyAmJiBhcmd2LnRhcmdldCA/IHBsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0KSA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL3VuaXQnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSB0aGlzLmRlZmF1bHRQb3J0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndixcbiAgICAgIHBvcnRcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQsXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gJ2JsaXR6IGRldiAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9ODA4MCBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCB8fCB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODAgJiYgdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIiR7dGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCldIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXS5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBzdGFydENvbW1hbmQgPSAnbmV4dCBkZXYgLS10dXJib3BhY2sgLXAgODA4MCcgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvcGFja1wiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpfSAmJiAke1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgICAgfSAmJiBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAncmVtaXggZGV2JyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXZcIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYSddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgfHwgJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCA4MDgwKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHNbJ25leHQnXSkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY2k6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHRlc3RzIG9uIENJJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1doZXRoZXIgdG8gcnVuIGUyZSB0ZXN0cy4gWW91IG1heSBwYXNzIG1vZGUgYXMgYXJndW1lbnQ6IG5vbmUgfCBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgc3RhcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHN0YXJ0IHRlc3RzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHVuaXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gcnVuIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxuICB0YXJnZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3QnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAndGVzdCcsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IGFyZ3YuZTJlID09PSB1bmRlZmluZWQgJiYgYXJndi5zdGFydCA9PT0gdW5kZWZpbmVkICYmIGFyZ3YudW5pdCA9PT0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5BbGxUZXN0cykge1xuICAgICAgYXJndiA9IHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgZTJlOlxuICAgICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ2UyZScpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvdW5pdC8nKVxuICAgICAgICAgICAgPyAnaGVhZGxlc3MnXG4gICAgICAgICAgICA6ICdub25lJyxcbiAgICAgICAgc3RhcnQ6IHRydWUsXG4gICAgICAgIHVuaXQ6IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3RzJywgJ3VuaXQnKSkgJiYgIWFyZ3YudGFyZ2V0Py5pbmNsdWRlcygnL2UyZS8nKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgaWYgKGFyZ3YuY2kpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGFyZ3YuZTJlICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge307XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmd2LnVuaXQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KSk7XG4gICAgfVxuICAgIGlmIChhcmd2LnN0YXJ0KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndikpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub25lJzoge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzWydibGl0eiddIHx8IGRlcHNbJ25leHQnXSB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6ICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGUyZSBtb2RlOiAke2FyZ3YuZTJlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYCR7c2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICB9KX1gLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgICBpZiAoZGVwc1snYmxpdHonXSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluYWxFeGl0Q29kZSkgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwibWVyZ2VPdXRBbmRFcnJvciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsInByb2Nlc3MiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInVuZGVmaW5lZCIsIkVycm9yIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsIndyaXRlIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJjYWxjSGFzaCIsImtpbmQiLCJub3ciLCJjYWxsIiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsIm1hcCIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImhhbmRsZXIiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwic29ydCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsIm1hdGNoIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwiZXhpdCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInByaXNtYSIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJidWlsZGVyIiwicHJpc21hQ29tbWFuZCIsInlhcmdzIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpdGVzdHJlYW1Db21tYW5kIiwibWlncmF0ZUNvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc2V0Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJzdHVkaW9Db21tYW5kIiwiZGVmYXVsdENvbW1hbmQiLCJkZW1hbmRDb21tYW5kIiwiYWxsUHJvamVjdHMiLCJmaW5kUHJpc21hUHJvamVjdHMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiZGVmYXVsdCIsImNtZEFuZEFyZ3MiLCJCb29sZWFuIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxPcHRpb25zIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0Iiwic3RvcEFsbCIsIkJhc2VTY3JpcHRzIiwiZGVmYXVsdFBvcnQiLCJQT1JUIiwiYnVpbGREb2NrZXIiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwidGFyZ2V0IiwidGVzdEUyRURldiIsInRlc3RVbml0Iiwid2FpdEFwcCIsImJsaXR6U2NyaXB0cyIsInN1cGVyIiwic3RhcnRQcm9kdWN0aW9uIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwidW5pdCIsIkNJIiwiRk9SQ0VfQ09MT1IiLCJzaG91bGRSdW5BbGxUZXN0cyIsInVuaXRUaW1lb3V0IiwiYWxsIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwidHlwZUNoZWNrQ29tbWFuZCIsImNvbW1hbmRzIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInN0cmljdCIsImhlbHAiXSwibWFwcGluZ3MiOiJvY0F5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUUs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LEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdxQixHQUFHLEVBQUVDLElBQUksSUFBSXhCLEVBQUVJLEdBQUdvQixHQUFHLEVBQUVELElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJOUIsRUFBRXNCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJL0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUloQyxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUlqQyxFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUU4QixHQUFHM0IsR0FBRyxFQUFFRSxJQUFJLElBQUlKLEVBQUU4QixHQUFHMUIsR0FBRyxFQUFFRixJQUFJLElBQUlKLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVE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
9
+ */const $=[..."0123456789abcdef"],E=[6,1536,393216,100663296],A=[0,8,16,24],N=[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 x=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class P{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,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+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<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(o),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];j(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=$[s>>4&15]+$[15&s]+$[s>>12&15]+$[s>>8&15]+$[s>>20&15]+$[s>>16&15]+$[s>>28&15]+$[s>>24&15];i%e==0&&(t=x(t),j(t),o=0)}return r&&(s=t[o],a+=$[s>>4&15]+$[15&s],r>1&&(a+=$[s>>12&15]+$[s>>8&15]),r>2&&(a+=$[s>>20&15]+$[s>>16&15])),a}}const j=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,v,w,k,$,E,A,x,P,j,R,D,S,_,B,O,T,I,C,W,V,J,z,F,Y,U,L,M,G,q,H,X,K,Q,Z,ee,te,ne,re,se,oe,ie,ae,ce,de,le;for(r=0;r<48;r+=2)s=e[0]^e[10]^e[20]^e[30]^e[40],o=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],m=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=m^(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=s^(c<<1|d>>>31),n=o^(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|m>>>31),n=d^(m<<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^(s<<1|o>>>31),n=u^(o<<1|s>>>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,f=e[0],h=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,D=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,U=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,I=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,X=e[23]<<10|e[22]>>>22,S=e[33]<<13|e[32]>>>19,_=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,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,v=e[24]<<11|e[25]>>>21,K=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,B=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,A=e[6]<<28|e[7]>>>4,x=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,w=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,L=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,P=e[18]<<20|e[19]>>>12,j=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,F=e[39]<<8|e[38]>>>24,$=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&v,e[10]=A^~P&R,e[11]=x^~j&D,e[20]=T^~C&V,e[21]=I^~W&J,e[30]=L^~G&H,e[31]=M^~q&X,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&k,e[12]=P^~R&S,e[13]=j^~D&_,e[22]=C^~V&z,e[23]=W^~J&F,e[32]=G^~H&K,e[33]=q^~X&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&$,e[5]=v^~k&E,e[14]=R^~S&B,e[15]=D^~_&O,e[24]=V^~z&Y,e[25]=J^~F&U,e[34]=H^~K&Z,e[35]=X^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~$&f,e[7]=k^~E&h,e[16]=S^~B&A,e[17]=_^~O&x,e[26]=z^~Y&T,e[27]=F^~U&I,e[36]=K^~Z&L,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=$^~f&g,e[9]=E^~h&b,e[18]=B^~A&P,e[19]=O^~x&j,e[28]=Y^~T&C,e[29]=U^~I&W,e[38]=Z^~L&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=N[r],e[1]^=N[r+1]},R=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,s])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==s&&(e.cause=s)}},t={instance:Uint8Array,from:e=>[btoa(S.decode(e))],create:([e])=>D.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)}},s={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},o={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)},a=new Map,c=[e,t,n,r,s,o,i];for(const e of c)a.set(e.instance.name,e);return a}(),D=new TextEncoder,S=new TextDecoder("utf8");function _(e=void 0,t=R){return JSON.stringify(T(e,t))}function B(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 O=[];function T(e,t=R){const n=B(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=B(n);if(null!==o)return o;let i=s.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,s.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],s.set(n,i);break;case"object":if(null===n)r[i]=n,s.set(n,i);else if(Array.isArray(n)){const t=function(e){if(O.length<e){const t=O.length;O.length=e,O.fill(-2,t,e)}return O.slice(0,e)}(n.length);r[i]=t,s.set(n,i);for(const r in n)t[r]=e(n[r])}else{const[o,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,s=t.get(r);if(void 0!==s)return[r,s.from(e)]}const r=Object.entries(e),s=r.length,o=Array.from({length:s+s});for(let e=0;e<s;e++){const t=r[e],n=e+e;o[n]=t[0],o[n+1]=t[1]}return["",o]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=o,r[i]=d,s.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function I(e,t){return function(e){return new P(512,E,512).update(e).hex()}(_([e,t]))}const C=function({cacheDuration:e=Number.POSITIVE_INFINITY,calcHash:t=I}={}){return function(n,r){let s,o,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-o>e)&&(i=r,s=n.call(this),o=a),s}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-o>e)&&(i=c,s=r?n.call(this,...a):n(...a),o=d),s}}}({calcHash:I});let W;class V{static{[W]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}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 $(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),v=t[3],k=!c,$=1===s,E=3===s,A=4===s,N=2===s;function x(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!k){var P={},j=[],R=E?"get":A||$?"set":"value";if(l?(u||$?P={get:w((function(){return v(this)}),r,"get"),set:function(e){t[4](this,e)}}:P[R]=v,u||w(P[R],r,N?"":R)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!=(i^s))throw Error("Decorating two elements with the same name ("+P[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var D=e,S=g.length-1;S>=0;S-=n?2:1){var _=y(g[S],"A decorator","be",!0),B=n?g[S-1]:void 0,O={},T={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,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,O)};if(k)i=_.call(B,D,T),O.v=1,y(i,"class decorators","return")&&(D=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:x("get",0,f):function(e){return e[r]}),N||E||(i.set=l?x("set",0,f):function(e,t){e[r]=t}),D=_.call(B,$?{get:P.get,set:P.set}:P[R],T),O.v=1,$){if("object"==typeof D&&D)(i=y(D.get,"accessor.get"))&&(P.get=i),(i=y(D.set,"accessor.set"))&&(P.set=i),(i=y(D.init,"accessor.init"))&&j.unshift(i);else if(void 0!==D)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(D,(u?"field":"method")+" decorators","return")&&(u?j.unshift(D):P[R]=D)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||k||(l?$?c.splice(-1,0,x("get",d),x("set",d)):c.push(N?P[R]:y.call.bind(P[R])):m(e,r,P)),D}function E(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;$(t?e:e.prototype,i,f,m?"#"+p:k(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return v(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||E(e),{e:i,get c(){var n=[];return g&&[E(e=$(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[C,3,"isBunAvailable"],[C,3,"buildCommand"],[C,3,"rootDirPath"],[C,3,"dockerfile"],[C,3,"hasDockerfile"],[C,3,"hasSourceCode"],[C,3,"name"],[C,3,"dockerImageName"],[C,3,"env"],[C,3,"packageJson"],[C,3,"packageJsonPath"],[C,3,"hasPrisma"],[C,3,"hasVitest"],[C,3,"dockerPackageJson"],[C,3,"binExists"]]).e}argv=void W(this);pathByName=new Map;constructor(t,n,r){this._dirPath=e.resolve(t),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(a.readFileSync(e.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 a.existsSync(e.join(this.dirPath,"..","..","package.json"))?e.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return a.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return a.existsSync(e.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[t,n]=function(t,n){let r=(t.env??[]).map((t=>e.resolve(n,t.toString())));const s=t.cascadeEnv??(t.cascadeNodeEnv?process.env.NODE_ENV||"development":t.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===r.length&&(r.push(e.join(n,".env")),t.includeRootEnv)){const t=e.resolve(n,"..","..");a.existsSync(e.join(t,"package.json"))&&r.push(e.join(t,".env"))}r=r.flatMap((e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e]))}r=r.filter((e=>a.existsSync(e))).map((t=>e.relative(n,t))),t.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",r.join(", ")));const o=[],i={};for(const s of r){let r=0;for(const[t,o]of Object.entries(b(e.join(n,s))))t in i||(i[t]=o,r++);o.push([s,r]),t.verbose&&r>0&&console.info(`Read ${r} environment variables from ${s}`)}if(t.checkEnv){const s=Object.keys(b(e.join(n,t.checkEnv))||{}).filter((e=>!(e in i)));if(s.length>0)throw new Error(`Missing environment variables in [${r.join(", ")}]: [${s.join(", ")}]`)}return[i,o]}(this.argv,this.dirPath);for(const[e,t]of n)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...t}}get packageJson(){return JSON.parse(a.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return e.join(this.dirPath,"package.json")}get hasPrisma(){return!(!this.packageJson.dependencies?.prisma&&!this.packageJson.devDependencies?.prisma)}get hasVitest(){return!(!this.packageJson.dependencies?.vitest&&!this.packageJson.devDependencies?.vitest)}get dockerPackageJson(){return e.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(a.readFileSync(e.join(e.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let t=!1,n=this.dirPath;for(;;){const r=e.join(n,"node_modules",".bin");if(a.existsSync(r)&&(this.env.PATH=`${r}:${this.env.PATH}`,t=!0),a.existsSync(e.join(n,".git")))break;const s=e.dirname(n);if(n===s)break;n=s}return t}findFile(t){let n=this.pathByName.get(t);if(n)return n;if(n=[t,e.join("..","..",t)].map((t=>e.resolve(this.dirPath,t))).find((e=>a.existsSync(e))),!n)throw new Error(`File not found: ${t}`);return this.pathByName.set(t,n),n}}function J(t,n=!0,r){if(r??=process.cwd(),a.existsSync(e.join(r,"package.json")))return new V(r,t,n)}async function z(t,n=!0,r){const s=function(t,n=!0,r){if(r??=process.cwd(),!a.existsSync(e.join(r,"package.json")))return;const s=new V(r,t,n);let o=s;if(!s.packageJson.workspaces&&e.dirname(r).endsWith("/packages")){const s=e.resolve(r,"..","..");a.existsSync(e.join(s,"package.json"))&&(o=new V(s,t,n))}return{root:o,self:s}}(t,n,r);if(s)return{...s,descendants:s.root===s.self?await F(t,s.root,n):[s.self]}}async function F(t,n,r){const s=[n],o=n.packageJson.workspaces;if(!Array.isArray(o))return s;const i=[],c=[];for(const t of o.map((t=>e.join(n.dirPath,t))))a.existsSync(t)?c.push(t):i.push(t);c.push(...await d(i,{dot:!0,onlyDirectories:!0}));for(const n of c)a.existsSync(e.join(n,"package.json"))&&s.push(new V(n,t,r));return s}const Y=process.argv[0].endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),U=Y?"bun --bun run":"node",L=Y?"bun":"yarn",M=Y?"bun --bun run":"yarn",G={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(t){await async function(t,n){const s=J(t,!0,n);if(!s)return console.error(c.red("No project found.")),!0;if(t={...t,command:t.command??(Y?"bun run build":"yarn build")},!a.existsSync(e.join(s.rootDirPath,".git")))return q(s,t),!0;const[o,d,l]=await async function(t,n){const s=e.resolve(t.dirPath,"node_modules",".cache","build"),o=e.resolve(s,"last-build");await a.promises.mkdir(s,{recursive:!0});const c=i("sha256"),d=r.execSync("git rev-parse HEAD",{cwd:t.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(t.env).filter((([e])=>!H.has(e))).sort((([e],[t])=>e.localeCompare(t))));c.update(l),await async function(e,t,n){return new Promise((s=>{const o=r.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map((t=>"test"===e.env.WB_ENV?t.replace(/packages\/scripts\/test-fixtures\/[^/]+\//,""):t)).filter((e=>(X.some((t=>e.includes(t)))||K.some((t=>e.endsWith(t))))&&!Q.some((t=>e.includes(t)))));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=r.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout?.on("data",(e=>{n.update(e),t.verbose&&(console.info(e.toString()),console.info("Hash:",n.copy().digest("hex")))})),i.on("close",(()=>{s()}))}))}(t,n,c);const u=c.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}}((()=>a.promises.readFile(o,"utf8")));return[p===u,o,u]}(s,t);if(o)return console.info(c.green(`Skip to run '${t.command}' 💫`)),!1;if(!q(s,t))return;t.dryRun||await a.promises.writeFile(d,l,"utf8");return!0}(t)}};function q(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=r.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 H=new Set(["CI","PWDEBUG","TMPDIR"]);const X=["src/","public/"],K=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Q=["test/","tests/","__tests__/","test-fixtures/"];const Z=new Set;async function ee(e){try{await u(e)}catch{}}const te=new p,ne={exitIfFailed:!0};async function re(e,t,n,r=ne){const[s,o]=oe(e,t);if(ie(s,t),n.verbose&&ie(o,t,"Start (raw)",!0),n.dryRun)return ae(s,0,r),0;const i=o.match(/http-get:\/\/127.0.0.1:(\d+)/)?.[1];o.includes("wait-on")&&i&&!o.includes("docker run")&&await async function(e){await ee(e);const t=async()=>{Z.has(e)||(Z.add(e),await ee(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i));const a=await y(o,void 0,{cwd:t.dirPath,env:ce(t.env,r),shell:!0,stdio:"inherit",timeout:r?.timeout,killOnExit:!0,verbose:n.verbose});return ae(s,a.status,r),a.status??1}function se(e,t,n,r=ne){return te.runAndWaitForReturnValue((async()=>{const[s,o]=oe(e,t);if(ie(s,t,"Start (parallel)",!0),n.dryRun)return ie(s,t,"Started (log)"),n.verbose&&ie(o,t,"Started (raw)",!0),ae(s,0,r),0;const i=await y(o,void 0,{cwd:t.dirPath,env:ce(t.env,r),shell:!0,stdio:"pipe",timeout:r?.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});ie(s,t,"Started (log)"),n.verbose&&ie(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ae(s,i.status,r),i.status??1}))}function oe(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",t.isBunAvailable?"bun --bun run ":"yarn run ");return Y&&(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(),[de(n.replaceAll("YARN ",`${M} `)),de(n.replaceAll("YARN playwright ",`${M} playwright `).replaceAll("YARN ",!Y&&t.binExists?"":`${M} `))]}function ie(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function ae(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function ce(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function de(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const le=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),ue=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),pe=new Set([...ue].filter((e=>!le.has(e)))),me={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(t){Y||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await z(t,!1);n||(console.error(c.red("No project found.")),process.exit(1));const r=t.files??[];let s,o,i;if(r.length>0){const t=[],n=[],a=[];for(const s of r){const r=e.resolve(String(s));if(r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=e.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):le.has(o)?t.push(r):ue.has(o)&&n.push(r)}s=t.map((e=>`"${e}"`)).join(" "),o=n.map((e=>`"${e}"`)).join(" "),i=a.map((e=>`"${e}"`)).join(" ")}else s="",o=`"**/{.*/,}*.{${[...pe].join(",")}" "!**/test-fixtures/**"`,i=n.descendants.map((e=>`"${e.packageJsonPath}"`)).join(" ");const a=t.fix&&t.format?"check --fix":t.fix?"lint --fix":"lint";let d;(s||0===r.length)&&(d=se(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,t,{forceColor:!0})),t.format&&(o&&se(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,t,{forceColor:!0}),i&&(await d,se(`bun --bun sort-package-json ${i}`,n.self,t,{forceColor:!0})))}};function*fe(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const he={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(t){const n=await z(t);n||(console.error(c.red("No project found.")),process.exit(1));for(const r of fe("optimizeForDockerBuild",n.descendants)){const n=r.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=n[e]||{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(ge(t,n),be(n),ye(n),t.dryRun)continue;const o=t.outside?e.join(r.dirPath,"dist"):r.dirPath;await a.promises.mkdir(o,{recursive:!0}),await a.promises.writeFile(e.join(o,"package.json"),JSON.stringify(n),"utf8")}t.dryRun||t.outside||(r.spawnSync(L,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function ge(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies||{},r=["artillery","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","sort-package-json","wait-on","semantic-release","vitest"],s=[];for(const t of Object.keys(n))(r.some((e=>t.includes(e)))||!e.outside&&t.includes("willbooster")&&t.includes("config"))&&(delete n[t],s.push(t));console.info("Removed devDependencies:",s.join(", ")||"none")}function be(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts||{},s=[];for(const[e,o]of Object.entries(r))(t.some((t=>e.includes(t)))||n.some((e=>o.includes(e)||o.trim()===e.trim())))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function ye(e){delete e.private,delete e.publishConfig,delete e.prettier}const ve=new class{deploy(e){return"PRISMA migrate deploy"}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${U} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e){return`PRISMA migrate deploy && PRISMA generate && ${this.seed(e)}`}migrateDev(e){return"PRISMA migrate dev"}reset(e){return`PRISMA migrate reset --force --skip-seed && ${this.seed(e)}`}restore(e,t,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(t,n){const r="file:";let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{s=`DATABASE_URL=${r}${e.resolve(n)} `}else if(t.env.DATABASE_URL?.startsWith(r)){const n=[{schemaPath:e.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:e.join("prisma","schema"),dbPath:e.join("prisma","schema")},{schemaPath:e.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:o,schemaPath:i}of n)if(a.existsSync(e.resolve(t.dirPath,i))){s=`DATABASE_URL=${r}${e.resolve(t.dirPath,o,t.env.DATABASE_URL.slice(5))} `;break}}return`${s}PRISMA studio`}},we={},ke={command:"prisma",describe:"Run prisma commands",builder:e=>e.command($e).command(Ae).command(Ne).command(xe).command(Pe).command(je).command(Re).command(De).command(Se).command(_e).demandCommand(),handler(){}},$e={command:"deploy",describe:"Apply migration to DB without initializing it",builder:we,async handler(e){const t=await Be(e);for(const n of fe("prisma deploy",t))await re(ve.deploy(n),n,e)}},Ee={...we,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Ae={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ee,async handler(e){const t=await Be(e);for(const n of fe("prisma deploy-force",t))await re(ve.deployForce(n,e.backupPath),n,e)}},Ne={command:"litestream",describe:"Setup DB for Litestream",builder:we,async handler(e){const t=await Be(e);for(const n of fe("prisma litestream",t))await re(ve.litestream(n),n,e)}},xe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:we,async handler(e){const t=await Be(e);for(const n of fe("prisma migrate",t))await re(ve.migrate(n),n,e)}},Pe={command:"migrate-dev",describe:"Create a migration file",builder:we,async handler(e){const t=await Be(e);for(const n of fe("prisma migrate-dev",t))await re(ve.migrateDev(n),n,e)}},je={command:"reset",describe:"Reset DB",builder:we,async handler(e){const t=await Be(e);for(const n of fe("prisma reset",t))await re(ve.reset(n),n,e)}},Re={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ee,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Be(e);for(const n of fe("prisma restore",t)){const t=e.output||(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await re(ve.restore(n,e.backupPath,t),n,e)}}},De={command:"seed",describe:"Populate DB with seed data",builder:{...we,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Be(e);for(const n of fe("prisma seed",t))await re(ve.seed(n,e.file),n,e)}},Se={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...we,"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 Be(e);for(const n of fe("prisma studio",t)){const t=e.restored?n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await re(ve.studio(n,t),n,e)}}},_e={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Be(e),n=`${e.args?.join(" ")??""}`.trimEnd();for(const r of fe(`prisma ${n}`,t))await re(`PRISMA ${n}`,r,e)}};async function Be(e){const t=await z(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.filter((e=>e.packageJson.dependencies?.prisma||e.packageJson.devDependencies?.prisma));return 0===n.length&&(console.error(c.red("No prisma project found.")),process.exit(1)),n}const Oe={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=J(e);t||(console.error(c.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await re(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Te={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await z(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of fe("setup",n.descendants)){const s=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await se(`brew install ${n.join(" ")}`,t,e)}s.some((e=>e.isFile()&&e.name.includes("-version")))&&await re("asdf install",t,e)}if(s.some((e=>e.isFile()&&"pyproject.toml"===e.name))){await se("poetry config virtualenvs.in-project true",t,e);const[,n]=r.execSync("asdf current python").toString().trim().split(/\s+/);await se(`poetry env use ${n}`,t,e),await te.promiseAll(),await re("poetry run pip install --upgrade pip",t,e),await re("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await re(`${M} gen-code`,t,e)}const s=n.descendants.find((e=>e.packageJson.devDependencies?.playwright));s&&await re(`${M} playwright install --with-deps`,s,e)}(e)}};const Ie=new class{buildDevImage(t,n){const r=t.dockerPackageJson.scripts?.["docker/build/prepare"]?"yarn run docker/build/prepare && ":"";return`cd ${e.dirname(t.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${t.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64)\n --build-arg WB_ENV=${t.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=async()=>{if(Z.has(e))return;Z.add(e),ie(e,t);const{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p 8080:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ce{constructor(e=Number(process.env.PORT)||3e3){this.defaultPort=e}buildDocker(e,t="development"){return Ie.buildDevImage(e,t)}startDocker(e,t){return`${this.buildDocker(e)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,8080)}"`}testE2E(e,t,{playwrightArgs:n="test tests/e2e",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=8080 YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${i}"`}testE2EDev(e,t,{playwrightArgs:n="test tests/e2e",startCommand:r}){const s=e.env.WB_ENV,o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080\n && BUN playwright ${"test tests/e2e"===n&&t.target?n.replace("tests/e2e",t.target):n}${o}"`}testUnit(e,t){return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${t.target||"tests/unit"} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${t.target||"tests/unit"}`:'echo "No tests."'}waitApp(e,t,n=this.defaultPort){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=this.defaultPort){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}const We=new class extends Ce{constructor(){super()}start(e,t){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}YARN concurrently --raw --kill-others-on-fail\n "blitz dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${ve.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${ve.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"db",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="blitz dev -p 8080"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(e,t)}"`}};const Ve=new class extends Ce{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production PORT=\${PORT:-${n}} ${U} dist/index.js ${t.normalizedArgsText??""}`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testE2EDev(e,t,{startCommand:n}){const r=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first\n "${n||this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:8080 && vitest run ${t.target||"tests/e2e"} --color --passWithNoTests --allowOnly${r}"`}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t)}"`}};const Je=new class extends Ce{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[ve.migrate(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?[ve.reset(e)]:[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].join(" && ")})}testE2EDev(e,t,{startCommand:n="next dev --turbopack -p 8080"}){return super.testE2EDev(e,t,{startCommand:n})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack" "${this.waitApp(e,t)}"`}};const ze=new class extends Ce{constructor(){super()}start(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)} && ${Ie.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${U} dist/index.js ${t.normalizedArgsText??""}`}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return"echo 'do nothing.'"}};const Fe=new class extends Ce{constructor(){super()}start(e,t){return`YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${ve.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n,startCommand:r=`${ve.reset(e)} && ${e.buildCommand} && pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`}){return super.testE2E(e,t,{playwrightArgs:n,prismaDirectory:"prisma",startCommand:r})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r="remix dev"}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}testStart(e,t){return`WB_ENV=${process.env.WB_ENV} YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(e,t)}"`}},Ye=["express","fastify","elysia"],Ue={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map((e=>`'${e}'`)).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map((e=>`'${e}'`)).join(" ")}(e);const t=await z(e);t||(console.error(c.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies||{},r=n.packageJson.devDependencies||{};let s;if(t.blitz)s=We;else if(t.next)s=Je;else if(r["@remix-run/dev"])s=Fe;else if(Ye.some((e=>t[e]))&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ve;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=ze}switch(console.info(`Running "start" for ${n.name} ...`),e.mode||"dev"){case"dev":case"development":{const r=Le(t,"development");await re(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Le(t,"staging");await re(`${r}${s.startProduction(n,e,8080)}`,n,e);break}case"docker":{const r=Le(t,"staging");await re(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Le(t,"staging");e.normalizedArgsText="'/bin/bash'",await re(`${r}${s.startDocker(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Le(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const Me={command:"test",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{ci:{description:"Whether to run tests on CI",type:"boolean"},e2e:{description:"Whether to run e2e tests. You may pass mode as argument: none | headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string"},start:{description:"Whether to run start tests",type:"boolean"},unit:{description:"Whether to run unit tests",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},target:{description:"Test target",type:"string",alias:"t"}},async handler(t){await async function(t){const n=await z(t);n||(console.error(c.red("No project found.")),process.exit(1));n.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const r=void 0===t.e2e&&void 0===t.start&&void 0===t.unit;for(const s of n.descendants){const n=s.packageJson.dependencies||{},o=s.packageJson.devDependencies||{};let i;i=n.blitz?We:n.next?Je:o["@remix-run/dev"]?Fe:Ye.some((e=>n[e]))&&!n["firebase-functions"]?Ve:ze,r&&(t={...t,e2e:a.existsSync(e.join(s.dirPath,"tests","e2e"))&&!t.target?.includes("/unit/")?"headless":"none",start:!0,unit:a.existsSync(e.join(s.dirPath,"tests","unit"))&&!t.target?.includes("/e2e/")}),console.info(`Running "test" for ${s.name} ...`);const c=[];if(!t.ci){switch(t.unit&&c.push(re(i.testUnit(s,t),s,t,{timeout:t.unitTimeout})),t.start&&c.push(re(i.testStart(s,t),s,t)),await Promise.all(c),t.e2e){case void 0:case"none":continue;case"":case"headless":await re(i.testE2E(s,t,{}),s,t);continue;case"headless-dev":await re(i.testE2EDev(s,t,{}),s,t);continue;case"docker":await Ge(s,t,i);continue;case"docker-debug":await Ge(s,t,i,`test ${t.target||"tests/e2e"} --debug`);continue}if(n.blitz||n.next||o["@remix-run/dev"])switch(t.e2e){case"headed":await re(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"headed-dev":await re(i.testE2EDev(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --headed`}),s,t);continue;case"debug":await re(i.testE2E(s,t,{playwrightArgs:`test ${t.target||"tests/e2e"} --debug`}),s,t);continue;case"generate":await re(i.testE2E(s,t,{playwrightArgs:"codegen http://localhost:8080"}),s,t);continue;case"trace":await re("BUN playwright show-trace",s,t);continue}throw new Error(`Unknown e2e mode: ${t.e2e}`)}if(await se(Ie.stopAll(),s,t),t.unit&&await se(i.testUnit(s,t).replaceAll(" --allowOnly",""),s,t,{timeout:t.unitTimeout}),t.start&&await se(i.testStart(s,t),s,t),await te.promiseAll(),"none"!==t.e2e){s.hasDockerfile&&(process.env.WB_DOCKER||="1",await re(`${i.buildDocker(s,"test")}`,s,t));const e=s.hasDockerfile?{startCommand:Ie.stopAndStart(s,!0)}:{};process.exitCode=await re(i.testE2E(s,t,e).replaceAll(" --allowOnly",""),s,t,{exitIfFailed:!1}),await re(Ie.stop(s),s,t)}}}(t)}};async function Ge(e,t,n,r){process.env.WB_DOCKER||="1",await re(`${n.buildDocker(e,"test")}`,e,t),process.exitCode=await re(`${n.testE2E(e,t,{playwrightArgs:r,startCommand:Ie.stopAndStart(e,!0)})}`,e,t,{exitIfFailed:!1}),await re(Ie.stop(e),e,t)}const qe={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){const t=await z(e,!1);t||(console.error(c.red("No project found.")),process.exit(1));const n=t.descendants.map((n=>{const r=[];if(n.packageJson.workspaces?n.hasSourceCode&&(n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"):((n.packageJson.dependencies?.typescript||n.packageJson.devDependencies?.typescript)&&r.push("BUN tsc --noEmit --Pretty"),n.packageJson.devDependencies?.pyright&&r.push("YARN pyright")),r.length>0)return se(r.join(" && "),n,e,{ci:t.descendants.length>1,forceColor:!0})})),r=await Promise.all(n);let s=0;for(const[e,n]of r.entries())if(n){(t.descendants[e].packageJson.dependencies||{}).blitz&&console.info(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),s=n}s&&process.exit(s)}},He={...qe,command:"tc"},Xe={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};await t(n(process.argv)).scriptName("wb").options(Xe).middleware((t=>{const n=t["working-dir"];if(n){const t=e.resolve(n);process.chdir(t)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)})).command(G).command(me).command(he).command(ke).command(Oe).command(Te).command(Ue).command(Me).command(qe).command(He).demandCommand().strict().help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,(()=>process.exit()));
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9jYWNsSGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25zdGFudHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpIHx8IHt9KTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9LGY9bmV3IE1hcCxpPVtlLHQscyxvLHIsYyxkXTtmb3IoY29uc3QgZSBvZiBpKWYuc2V0KGUuaW5zdGFuY2UubmFtZSxlKTtyZXR1cm4gZn0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdCByIGluIGUpbltyXT10KGVbcl0pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG99ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG4obix0KXtyZXR1cm4gcihvKFtuLHRdKSl9ZnVuY3Rpb24gdCgpe3JldHVyblwiXCJ9ZXhwb3J0e3QgYXMgY2FsY0VtcHR5SGFzaCxuIGFzIGNhbGNIYXNoV2l0aENvbnRleHR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjbEhhc2guanMubWFwXG4iLCJpbXBvcnR7Y2FsY0hhc2hXaXRoQ29udGV4dCBhcyB0LGNhbGNFbXB0eUhhc2ggYXMgY31mcm9tXCIuL2NhY2xIYXNoLmpzXCI7Y29uc3Qgbj1yKHtjYWxjSGFzaDp0fSksYT1yKHtjYWxjSGFzaDpjfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjpjPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxjYWxjSGFzaDpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxhKXtsZXQgcixvLGU7cmV0dXJuXCJnZXR0ZXJcIj09PWE/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBhPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihlIT09YXx8cy1vPmMpJiYoZT1hLHI9dC5jYWxsKHRoaXMpLG89cykscn06ZnVuY3Rpb24oLi4ucyl7Y29uc3QgaT1uKHRoaXMscyksdT1EYXRlLm5vdygpO3JldHVybihlIT09aXx8dS1vPmMpJiYoZT1pLHI9YT90LmNhbGwodGhpcywuLi5zKTp0KC4uLnMpLG89dSkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxhIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV2ZW4gdGhvdWdoIHRoaXMgYmVoYXZpb3IgaXMgbm9uLXN0YW5kYXJkXG4gICAgLy8gYmVjYXVzZSBgYnVuIHdiIC4uLmAgd2lsbCBsb2FkIC5lbnYgYW5kIC5lbnYubG9jYWwgYmVmb3JlIGB3YmAgbG9hZHMgb3RoZXIgdmFyaWFibGVzLlxuICAgIHJldHVybiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ZpdGVzdCddIHx8IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ZpdGVzdCddKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MuYXJndlswXS5lbmRzV2l0aCgnL2J1bicpIHx8IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ2RpZmYnLCAnLS1uYW1lLW9ubHknXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC9zY3JpcHRzXFwvdGVzdC1maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHsgYmVmb3JlUmV0cnksIGhhbmRsZUVycm9yLCByZXRyeUNvdW50ID0gMywgcmV0cnlMb2dnZXIsIHNsZWVwTWlsbGlzZWNvbmRzID0gMCB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyBlcnJvci5zdGFjayA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gcnVubmFibGVTY3JpcHQubWF0Y2goL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvKT8uWzFdO1xuICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ3dhaXQtb24nKSAmJiBwb3J0ICYmICFydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzPy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cz8udGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIHJldHVybiBbXG4gICAgZml4QnVuQ29tbWFuZChuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKSxcbiAgICBmaXhCdW5Db21tYW5kKFxuICAgICAgbmV3U2NyaXB0XG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICAgKSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnZbJ0NJJ10gPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0VudlsnRk9SQ0VfQ09MT1InXSA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fCBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX1cIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID0gYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAoIWFyZ3Yub3V0c2lkZSAmJiBuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUFJJU01BIG1pZ3JhdGUgZGVwbG95JztcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXZgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ2JsaXR6J10gPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSlcbiAgICAgIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bJ3NlZWQnXSkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgUE9TU0lCTEVfUEFUSFMgPSBbXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCB7IGRiUGF0aCwgc2NoZW1hUGF0aCB9IG9mIFBPU1NJQkxFX1BBVEhTKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGRiUGF0aCxcbiAgICAgICAgICAgIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKTtcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCB8fFxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXSA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnYmxpdHonXVxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gYCR7YXJndi5hcmdzPy5qb2luKCcgJykgPz8gJyd9YC50cmltRW5kKCk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7c2NyaXB0fWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtzY3JpcHR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddIHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bJ3ByaXNtYSddXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAneWFybiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyBhbWQ2NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCA4MDgwOjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRURldk9wdGlvbnMge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyBleHRlbmRzIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDApIHt9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9XG4gICAgICAmJiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgICAgXCIke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICAgKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCA4MDgwKX1cImA7XG4gIH1cblxuICB0ZXN0RTJFKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHByaXNtYURpcmVjdG9yeSwgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwicm0gLVJmICR7cHJpc21hRGlyZWN0b3J5fS9tb3VudCAmJiAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMTo4MDgwXG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3RzL2UyZScgJiYgYXJndi50YXJnZXQgPyBwbGF5d3JpZ2h0QXJncy5yZXBsYWNlKCd0ZXN0cy9lMmUnLCBhcmd2LnRhcmdldCkgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3RzL2UyZScsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOjgwODBcbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdHMvZTJlJyAmJiBhcmd2LnRhcmdldCA/IHBsYXl3cmlnaHRBcmdzLnJlcGxhY2UoJ3Rlc3RzL2UyZScsIGFyZ3YudGFyZ2V0KSA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy91bml0J30gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYnVuIHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvdW5pdCd9YDtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHRoaXMuZGVmYXVsdFBvcnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gdGhpcy5kZWZhdWx0UG9ydCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KX0gJiYgJHtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICAgIH0gJiYgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZCxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSAnYmxpdHogZGV2IC1wIDgwODAnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IDgwODApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICB9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gUE9SVD1cXCR7UE9SVDotJHtwb3J0fX0gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPTgwODAgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD04MDgwIFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kIHx8IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6ODA4MCAmJiB2aXRlc3QgcnVuICR7YXJndi50YXJnZXQgfHwgJ3Rlc3RzL2UyZSd9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHN0YXJ0Q29tbWFuZCA9ICduZXh0IGRldiAtLXR1cmJvcGFjayAtcCA4MDgwJyB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9wYWNrXCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3ByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCl9ICYmICR7XG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgICB9ICYmIHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9ICdyZW1peCBkZXYnIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldlwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndil9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSB8fCAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIDgwODApfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwc1snbmV4dCddKSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjaToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdGVzdHMgb24gQ0knLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnV2hldGhlciB0byBydW4gZTJlIHRlc3RzLiBZb3UgbWF5IHBhc3MgbW9kZSBhcyBhcmd1bWVudDogbm9uZSB8IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBzdGFydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gc3RhcnQgdGVzdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdW5pdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBydW4gdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG4gIHRhcmdldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0JyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gYXJndi5lMmUgPT09IHVuZGVmaW5lZCAmJiBhcmd2LnN0YXJ0ID09PSB1bmRlZmluZWQgJiYgYXJndi51bml0ID09PSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10pIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzWyduZXh0J10pIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkFsbFRlc3RzKSB7XG4gICAgICBhcmd2ID0ge1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBlMmU6XG4gICAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAnZTJlJykpICYmICFhcmd2LnRhcmdldD8uaW5jbHVkZXMoJy91bml0LycpXG4gICAgICAgICAgICA/ICdoZWFkbGVzcydcbiAgICAgICAgICAgIDogJ25vbmUnLFxuICAgICAgICBzdGFydDogdHJ1ZSxcbiAgICAgICAgdW5pdDogZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdHMnLCAndW5pdCcpKSAmJiAhYXJndi50YXJnZXQ/LmluY2x1ZGVzKCcvZTJlLycpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICBpZiAoYXJndi5jaSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoYXJndi51bml0KSB7XG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3Yuc3RhcnQpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoYXJndi5lMmUgIT09ICdub25lJykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YudW5pdCkge1xuICAgICAgcHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pKTtcbiAgICB9XG4gICAgaWYgKGFyZ3Yuc3RhcnQpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vbmUnOiB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnJzpcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgYXJndiwgc2NyaXB0cywgYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1kZWJ1Z2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHNbJ2JsaXR6J10gfHwgZGVwc1snbmV4dCddIHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHthcmd2LnRhcmdldCB8fCAndGVzdHMvZTJlJ30gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2FyZ3YudGFyZ2V0IHx8ICd0ZXN0cy9lMmUnfSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJnczogJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZTJlIG1vZGU6ICR7YXJndi5lMmV9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBgJHtzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgIH0pfWAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXS5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge307XG4gICAgICAgIGlmIChkZXBzWydibGl0eiddKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJtZXJnZU91dEFuZEVycm9yIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwicHJvY2VzcyIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwid3JpdGUiLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsImNvbnN0cnVjdG9yIiwidGhpcyIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibGVuZ3RoIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJwdXNoIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk51bWJlciIsImlzTmFOIiwiaXNGaW5pdGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImNhbGNIYXNoIiwia2luZCIsIm5vdyIsImNhbGwiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwibWFwIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJrZXlzIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNWaXRlc3QiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImRlc2NlbmRhbnRzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJzb3J0Iiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwic3BsaXQiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJwcmludGFibGVTY3JpcHQiLCJydW5uYWJsZVNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwibWF0Y2giLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiY29uZmlndXJlRW52IiwidGltZW91dCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwibm9ybWFsaXplZFNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJiaW9tZUFyZ3NUZXh0IiwicHJldHRpZXJBcmdzVGV4dCIsInNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0IiwiZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lIiwiZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsImZpbGUiLCJTdHJpbmciLCJleHRlbnNpb24iLCJleHRuYW1lIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJGSUxFX1NDSEVNQSIsIkRBVEFCQVNFX1VSTCIsIlBPU1NJQkxFX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImJ1aWxkZXIiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImRlcGxveUZvcmNlQnVpbGRlciIsImRlbWFuZE9wdGlvbiIsIm91dHB1dCIsInJlc3RvcmVkIiwidHJpbUVuZCIsImZpbHRlcmVkIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJkZWZhdWx0IiwiY21kQW5kQXJncyIsIkJvb2xlYW4iLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJkZWZhdWx0UG9ydCIsIlBPUlQiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0YXJnZXQiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwic3VwZXIiLCJzdGFydFByb2R1Y3Rpb24iLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyIsIndiRW52IiwiTkVYVF9QVUJMSUNfV0JfRU5WIiwidGVzdENvbW1hbmQiLCJlMmUiLCJ1bml0IiwiQ0kiLCJGT1JDRV9DT0xPUiIsInNob3VsZFJ1bkFsbFRlc3RzIiwidW5pdFRpbWVvdXQiLCJhbGwiLCJ0ZXN0T25Eb2NrZXIiLCJXQl9ET0NLRVIiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwic3RyaWN0IiwiaGVscCJdLCJtYXBwaW5ncyI6Im9jQXlIQSxNQUFNQSxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBRSxFQUVwRixPQURBTixFQUFjVyxJQUFJUixFQUFVRyxHQUNyQkEsQ0FDVCxDQ2xFT00sZUFBZUMsRUFDcEJDLEVBQ0FDLEVBQ0FDLEdBRUEsT0FBTyxJQUFJQyxTQUFRLENBQUNSLEVBQVNTLEtBQzNCLElBQ0UsTUFBTUMsRUFBT0MsRUFBTU4sRUFBU0MsR0FBUSxHQUFJQyxHQUFXLElBRW5ERyxFQUFLRSxRQUFRQyxjQUFjLFFBQzNCSCxFQUFLSSxRQUFRRCxjQUFjLFFBRTNCLElBQUlELEVBQVMsR0FDVEUsRUFBUyxHQUNiSixFQUFLRSxRQUFRRyxHQUFHLFFBQVNDLElBQ3ZCSixHQUFVSSxDQUFJLElBRWhCTixFQUFLSSxRQUFRQyxHQUFHLFFBQVNDLElBQ25CVCxHQUFTVSxpQkFDWEwsR0FBVUksRUFFVkYsR0FBVUUsQ0FDWixJQUdGLElBQUlFLEdBQVUsRUFDZCxNQUFNQyxFQUFjQSxNQUNkRCxHQUFZUixFQUFLVSxNQUVyQkYsR0FBVSxFQUNOWCxHQUFTYyxTQUNYQyxRQUFRQyxLQUFLLFlBQVliLEVBQUtVLFFBRWhDSSxFQUFTZCxFQUFLVSxLQUFJLEVBRWhCYixHQUFTa0IsYUFDWEMsUUFBUVgsR0FBRyxhQUFjSSxHQUN6Qk8s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QUMsRUFBRSxNQUFNRSxFQUFFLFNBQVM1QixHQUFHLElBQUlDLEVBQUVDLEVBQUVvQixFQUFFbEIsRUFBRUUsRUFBRXNCLEVBQUVKLEVBQUVDLEVBQUVDLEVBQUVLLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTlELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVsQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl3QixFQUFFeEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkwQixFQUFFMUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkrQixFQUFFL0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlnQyxFQUFF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TSxDQUNsQixDQUVFb00sR0FBZTFlLFFBQVF1VSxLQUFLbUssRUFDbEMsR0FHV0MsR0FBdUcsSUFDL0dOLEdBQ0gxZixRQUFTLE1DN0RFaWdCLEdBQXVCLENqQ0tsQ25VLElBQUssQ0FDSHVFLFlBQWEsMkJBQ2JDLEtBQU0sU0FFUixjQUFlLENBQ2JELFlBQ0Usd0xBQ0ZDLEtBQU0sVUFFUixtQkFBb0IsQ0FDbEJELFlBQWEsMEZBQ2JDLEtBQU0sV0FFUixtQkFBb0IsQ0FDbEJELFlBQWEsaUVBQ2JDLEtBQU0sVUFDTitLLFNBQVMsR0FFWCxtQkFBb0IsQ0FDbEJoTCxZQUFhLHFHQUNiQyxLQUFNLFVBQ04rSyxTQUFTLEdBRVgsWUFBYSxDQUNYaEwsWUFBYSxxRkFDYkMsS0FBTSxTQUNOK0ssUUFBUyxnQkFFWHJhLFFBQVMsQ0FDUHFQLFlBQWEsc0NBQ2JDLEtBQU0sVUFDTkMsTUFBTyxLaUNqQ1QsY0FBZSxDQUNiRixZQUFhLHNCQUNiQyxLQUFNLFNBQ05DLE1BQU8sS0FFVCxVQUFXLENBQ1RGLFlBQWEsMkNBQ2JDLEtBQU0sVUFDTkMsTUFBTyxDQUFDLE1BQU8sYUNJYndKLEVBQU1tRyxFQUFRN2UsUUFBUWtKLE9BQ3pCNFYsV0FBVyxNQUNYamdCLFFBQVErZixJQUNSRyxZQUFZN1YsSUFDWCxNQUFNOFYsRUFBYTlWLEVBQUssZUFDeEIsR0FBSThWLEVBQVksQ0FDZCxNQUFNNVYsRUFBVS9LLEVBQUtDLFFBQVEwZ0IsR0FDN0JoZixRQUFRaWYsTUFBTTdWLEVBQ2hCLEVsQzhHRyxTQUE4Q3NCLEdBRS9DQSxFQUFRcUMsTUFBUXJDLEVBQVF3VSxtQkFDMUJ4VSxFQUFRcUMsS0FBT3JDLEVBQVFxQyxLQUFLa0UsUUFBUSxHQUFHdkcsRUFBUXdVLG9CQUFxQixJQUVqRTFVLFdBQVcsbUNBQW9DLElBRS9DQSxXQUFXLHNCQUF1QixJQUNsQ0EsV0FBVyxpQkFBa0IsS0FFbEMsSUFBSyxNQUFNcUIsS0FBT3RELE9BQU8wRCxLQUFLdkIsR0FBVSxDQUN0QyxNQUFNeVUsRUFBV3RULEVBQUl1VCxlQUVuQkQsRUFBUy9JLFdBQVcsU0FDcEIrSSxFQUFTL0ksV0FBVyxVQUNwQitJLEVBQVMvSSxXQUFXLFdBQ1AsZ0JBQWIrSSxHQUNhLGFBQWJBLFdBRU96VSxFQUFRbUIsRUFFbkIsQ0FDRixDa0NsSUl3VCxDQUFxQ3JmLFFBQVF5SyxJQUFJLElBRWxEOUwsUUFBUW1RLEdBQ1JuUSxRQUFRb1csSUFDUnBXLFFBQVFzWCxJQUNSdFgsUUFBUThaLElBQ1I5WixRQUFRbWIsSUFDUm5iLFFBQVEwYixJQUNSMWIsUUFBUTBkLElBQ1IxZCxRQUFRZ2YsSUFDUmhmLFFBQVEwZixJQUNSMWYsUUFBUWdnQixJQUNSdEYsZ0JBQ0FpRyxTQUNBQyxPQUFPclcsS0FFVixJQUFLLE1BQU03SSxJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDTCxRQUFRWCxHQUFHZ0IsR0FBUSxJQUFNTCxRQUFRdVUiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMiwzLDQsNSw2XX0=